awacke1's picture
Rename app.py to app.v1.py
caabb57 verified
raw
history blame
5.27 kB
import streamlit as st
import streamlit.components.v1 as components
def main():
# Set the page configuration
st.set_page_config(page_title="Decks Sidebar UI from Spec", layout="wide")
# Sidebar: Deck selector and Tips & Settings links
st.sidebar.title("Decks Sidebar")
# Deck selector: simulate multiple decks
decks = ["Deck 1", "Deck 2"]
selected_deck = st.sidebar.selectbox("Select a Deck", decks)
st.sidebar.markdown(f"**Current Deck:** {selected_deck}")
# Tips and settings section in sidebar
st.sidebar.markdown("### Tips and Settings")
st.sidebar.markdown("- [Manage Decks](#)")
st.sidebar.markdown("- [Change Display Settings](#)")
st.sidebar.markdown("- [Discover Keyboard Shortcuts](#)")
st.sidebar.markdown("- [Take the Tour Again](#)")
# Main area: Header and embedded drag-and-drop columns list
st.header(f"Columns in {selected_deck}")
# HTML + JavaScript for a draggable list using SortableJS
html_code = """
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.14.0/Sortable.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 10px;
background-color: #fff;
}
.column-list {
list-style: none;
padding: 0;
}
.column-item {
padding: 10px;
margin: 5px 0;
background-color: #f0f0f0;
border: 1px solid #ccc;
cursor: grab;
position: relative;
}
.drag-handle {
position: absolute;
right: 10px;
top: 10px;
font-size: 16px;
cursor: grab;
}
.context-menu {
display: none;
position: absolute;
left: 10px;
top: 40px;
background: white;
border: 1px solid #ccc;
padding: 5px;
z-index: 100;
}
.column-item:hover .context-menu {
display: block;
}
.context-menu button {
display: block;
width: 100%;
margin: 2px 0;
padding: 4px 8px;
font-size: 12px;
cursor: pointer;
}
</style>
</head>
<body>
<ul id="columnList" class="column-list">
<li class="column-item" data-id="1">
Column 1
<span class="drag-handle">&#9776;</span>
<div class="context-menu">
<button onclick="alert('Change Column Size')">Change Column Size</button>
<button onclick="alert('Delete Column')">Delete</button>
<button onclick="alert('Order by Top')">Order: Top</button>
<button onclick="alert('Order by Latest')">Order: Latest</button>
<button onclick="alert('Advanced Search Tools')">Advanced Search</button>
</div>
</li>
<li class="column-item" data-id="2">
Column 2
<span class="drag-handle">&#9776;</span>
<div class="context-menu">
<button onclick="alert('Change Column Size')">Change Column Size</button>
<button onclick="alert('Delete Column')">Delete</button>
<button onclick="alert('Order by Top')">Order: Top</button>
<button onclick="alert('Order by Latest')">Order: Latest</button>
<button onclick="alert('Advanced Search Tools')">Advanced Search</button>
</div>
</li>
<li class="column-item" data-id="3">
Column 3
<span class="drag-handle">&#9776;</span>
<div class="context-menu">
<button onclick="alert('Change Column Size')">Change Column Size</button>
<button onclick="alert('Delete Column')">Delete</button>
<button onclick="alert('Order by Top')">Order: Top</button>
<button onclick="alert('Order by Latest')">Order: Latest</button>
<button onclick="alert('Advanced Search Tools')">Advanced Search</button>
</div>
</li>
</ul>
<script>
var el = document.getElementById('columnList');
var sortable = Sortable.create(el, {
animation: 150,
onEnd: function (evt) {
// Capture the new order of column IDs
var order = Array.from(el.children).map(function(li) {
return li.getAttribute('data-id');
});
// For demonstration, alert the new order.
alert('New order: ' + order.join(', '));
// In a full implementation, you might send this order to your Streamlit backend via a custom message.
}
});
</script>
</body>
</html>
"""
# Embed the HTML in the main area (adjust height as needed)
components.html(html_code, height=400, scrolling=True)
if __name__ == '__main__':
main()