Schluca / streamlit_tree_select

A simple and elegant checkbox tree for Streamlit.
MIT License
80 stars 9 forks source link

Feature Requests: 1. Configurable single node selection, 2. Use an id property to distinguish nodes (user-supplied or generated silently) #1

Open asehmi opened 1 year ago

asehmi commented 1 year ago

Hi,

I documented feature requests here: https://discuss.streamlit.io/t/new-component-streamlit-tree-select-a-simple-and-elegant-checkbox-tree/30195/10

Thanks, Arvindra

renanxx1 commented 1 year ago

Any news about this solicitation ? I'm trying to figure out a way to select only one node. Is there any workaround ?

jonasrie commented 1 year ago

Possible workaround:

if "selected" not in st.session_state:
    st.session_state.selected = []
if "expanded" not in st.session_state:
    st.session_state.expanded = []

selected = tree_select(tree, checked=st.session_state.selected, expanded=st.session_state.expanded)

if len(selected["checked"]) > 1:
    st.session_state.selected = [x for x in selected["checked"] if x != st.session_state.selected[0]][0:1]
    st.session_state.expanded = selected["expanded"]
    st.experimental_rerun()
else:
    st.session_state.selected = selected["checked"]
    st.session_state.expanded = selected["expanded"]
wgong commented 7 months ago

@jonasrie Thank you for the workaround, it works!

Look forward to use this single select feature in the base package in future

jonaslenz commented 2 months ago

@jonasrie Thank you for your code snippet, it works like a charm. I had a small issue with the app reruning infinetly after expanding tree nodes an then selecting another node, so I added an update of st.session_state.expanded to your work around:

if "selected" not in st.session_state:
    st.session_state.selected = []
if "expanded" not in st.session_state:
    st.session_state.expanded = []

selected = tree_select(tree, checked=st.session_state.selected, expanded=st.session_state.expanded)

if len(selected["checked"]) > 1:
    st.session_state.selected = [x for x in selected["checked"] if x != st.session_state.selected[0]][0:1]
    st.session_state.expanded = selected["expanded"]
    st.rerun()
elif len(selected["expanded"]) != len(st.session_state.expanded):
    st.session_state.expanded = selected["expanded"]
    st.rerun()
else:
    st.session_state.selected = selected["checked"]
    st.session_state.expanded = selected["expanded"]