GEM/DatasetCardForm
9
1import streamlit as st2 3 4# Streamlit widgets with persistence5def is_filled(key_list):6 state_filled_key = "_".join(key_list) + "_filled"7 8 def on_change_action():9 st.session_state.save_state[state_filled_key] = True10 11 return on_change_action12 13 14def update_card_dict(key_list, use_default=None):15 state_key = "_".join(key_list)16 if st.session_state.save_state.get(state_key + "_filled", False) or use_default:17 card_key = key_list[-1]18 current_dict = st.session_state.card_dict19 for key in key_list[:-1]:20 current_dict = current_dict[key]21 current_dict[card_key] = st.session_state.save_state.get(state_key, use_default)22 23 24def make_multiselect(25 key_list, label, options, format_func=lambda x: x, help="", default=None26):27 key = "_".join(key_list)28 if key in st.session_state:29 st.session_state.save_state[key] = st.session_state[key]30 elif default is not None:31 st.session_state.save_state[key] = default32 res = st.multiselect(33 label=label,34 options=options,35 format_func=format_func,36 key=key,37 default=st.session_state.save_state.get(key, []),38 on_change=is_filled(key_list),39 help=help,40 )41 update_card_dict(key_list)42 return res43 44 45def make_selectbox(46 key_list, label, options, format_func=lambda x: x, help="", index=None47):48 key = "_".join(key_list)49 if key in st.session_state:50 st.session_state.save_state[key] = st.session_state[key]51 elif index is not None:52 st.session_state.save_state[key] = options[index]53 res = st.selectbox(54 label=label,55 options=options,56 format_func=format_func,57 key=key,58 index=options.index(59 st.session_state.save_state.get(key, options[0])60 ), # if st.session_state.save_state.get(key, options[0]) in options else 0,61 on_change=is_filled(key_list),62 help=help,63 )64 update_card_dict(65 key_list, use_default=st.session_state.save_state.get(key, options[0])66 ) # use the default value even without interactions67 return res68 69 70def make_radio(key_list, label, options, format_func=lambda x: x, help="", index=None):71 key = "_".join(key_list)72 if key in st.session_state:73 st.session_state.save_state[key] = st.session_state[key]74 elif index is not None:75 st.session_state.save_state[key] = options[index]76 res = st.radio(77 label=label,78 options=options,79 format_func=format_func,80 key=key,81 index=options.index(st.session_state.save_state.get(key, options[0])),82 on_change=is_filled(key_list),83 help=help,84 )85 update_card_dict(86 key_list, use_default=st.session_state.save_state.get(key, options[0])87 ) # use the default value even without interactions88 return res89 90 91def make_text_input(key_list, label, help="", value=None):92 key = "_".join(key_list)93 if key in st.session_state:94 st.session_state.save_state[key] = st.session_state[key]95 elif value is not None:96 st.session_state.save_state[key] = value97 res = st.text_input(98 label=label,99 key=key,100 value=st.session_state.save_state.get(key, ""),101 on_change=is_filled(key_list),102 help=help,103 )104 update_card_dict(key_list)105 return res106 107 108def make_text_area(key_list, label, help="", value=None):109 key = "_".join(key_list)110 if key in st.session_state:111 st.session_state.save_state[key] = st.session_state[key]112 elif value is not None:113 st.session_state.save_state[key] = value114 res = st.text_area(115 label=label,116 key=key,117 value=st.session_state.save_state.get(key, ""),118 on_change=is_filled(key_list),119 help=help,120 )121 update_card_dict(key_list)122 return res123 124 125def make_checkbox(key_list, label, help="", value=None):126 key = "_".join(key_list)127 if key in st.session_state:128 st.session_state.save_state[key] = st.session_state[key]129 elif value is not None:130 st.session_state.save_state[key] = value131 res = st.checkbox(132 label=label,133 key=key,134 value=st.session_state.save_state.get(key, False),135 on_change=is_filled(key_list),136 help=help,137 )138 update_card_dict(key_list)139 return res140 