Spaces:
Sleeping
Sleeping
Update app/internal_loads.py
Browse files- app/internal_loads.py +38 -22
app/internal_loads.py
CHANGED
@@ -938,13 +938,14 @@ def display_schedules_tab():
|
|
938 |
"original_name": ""
|
939 |
}
|
940 |
|
|
|
941 |
if "schedule_editor" not in st.session_state:
|
942 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
943 |
|
944 |
editor_state = st.session_state.schedule_editor
|
945 |
schedules = st.session_state.project_data["internal_loads"]["schedules"]
|
946 |
|
947 |
-
# ---------------------- Handle template change
|
948 |
template_options = list(DEFAULT_SCHEDULE_TEMPLATES.keys())
|
949 |
selected_template = st.selectbox(
|
950 |
"Select Template",
|
@@ -954,21 +955,32 @@ def display_schedules_tab():
|
|
954 |
help="Choose a base schedule to prefill values."
|
955 |
)
|
956 |
|
957 |
-
|
|
|
958 |
st.session_state.schedule_editor["template"] = selected_template
|
959 |
if selected_template != "None":
|
960 |
tpl = DEFAULT_SCHEDULE_TEMPLATES[selected_template]
|
961 |
st.session_state.schedule_editor["weekday"] = tpl["weekday"]
|
962 |
st.session_state.schedule_editor["weekend"] = tpl["weekend"]
|
|
|
963 |
for hour in range(24):
|
964 |
-
st.session_state[f"weekday_slider_{hour}"] = tpl["weekday"][hour]
|
965 |
-
st.session_state[f"weekend_slider_{hour}"] = tpl["weekend"][hour]
|
|
|
|
|
|
|
|
|
|
|
966 |
st.rerun()
|
967 |
|
968 |
# ---------------------- UI FORM for name/description and actions ----------------------
|
969 |
with st.form("schedule_form"):
|
970 |
-
name = st.text_input("Schedule Name",
|
971 |
-
|
|
|
|
|
|
|
|
|
972 |
|
973 |
# ---------------------- SLIDERS LAYOUT ----------------------
|
974 |
st.markdown("### Schedule Sliders")
|
@@ -981,7 +993,7 @@ def display_schedules_tab():
|
|
981 |
st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekday</div>", unsafe_allow_html=True)
|
982 |
with col_we:
|
983 |
st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekend</div>", unsafe_allow_html=True)
|
984 |
-
|
985 |
hide_elements = """
|
986 |
<style>
|
987 |
div[data-testid="stSliderTickBarMin"],
|
@@ -990,7 +1002,6 @@ def display_schedules_tab():
|
|
990 |
}
|
991 |
</style>
|
992 |
"""
|
993 |
-
|
994 |
st.markdown(hide_elements, unsafe_allow_html=True)
|
995 |
|
996 |
weekday_values = []
|
@@ -1009,7 +1020,7 @@ def display_schedules_tab():
|
|
1009 |
min_value=0.0,
|
1010 |
max_value=1.0,
|
1011 |
step=0.1,
|
1012 |
-
value=st.session_state.get(f"weekday_slider_{hour}", 0.0),
|
1013 |
label_visibility="collapsed",
|
1014 |
format=None
|
1015 |
)
|
@@ -1022,7 +1033,7 @@ def display_schedules_tab():
|
|
1022 |
min_value=0.0,
|
1023 |
max_value=1.0,
|
1024 |
step=0.1,
|
1025 |
-
value=st.session_state.get(f"weekend_slider_{hour}", 0.0),
|
1026 |
label_visibility="collapsed",
|
1027 |
format=None
|
1028 |
)
|
@@ -1032,19 +1043,20 @@ def display_schedules_tab():
|
|
1032 |
col1, col2, col3 = st.columns(3)
|
1033 |
with col1:
|
1034 |
submit_label = "Update Schedule" if editor_state.get("is_edit") else "Save Schedule"
|
1035 |
-
submitted = st.form_submit_button(submit_label)
|
1036 |
with col2:
|
1037 |
-
edit_submitted = st.form_submit_button("Edit Selected Schedule")
|
1038 |
with col3:
|
1039 |
-
delete_submitted = st.form_submit_button("Delete Selected Schedule")
|
1040 |
|
1041 |
# ---------------------- Saved Schedules Selector ----------------------
|
1042 |
st.markdown("### Saved Schedules")
|
1043 |
saved_schedule = st.selectbox(
|
1044 |
"Select Saved Schedule",
|
1045 |
options=list(schedules.keys()),
|
1046 |
-
index=list(schedules.keys()).index(editor_state.get("name", list(schedules.keys())[0])) if editor_state.get("name") in schedules else 0,
|
1047 |
-
help="Select a saved schedule to edit or delete."
|
|
|
1048 |
)
|
1049 |
|
1050 |
# ---------------------- Save logic ----------------------
|
@@ -1062,10 +1074,11 @@ def display_schedules_tab():
|
|
1062 |
if editor_state.get("is_edit") and editor_state.get("original_name") and editor_state.get("original_name") != name:
|
1063 |
if editor_state["original_name"] in schedules:
|
1064 |
del schedules[editor_state["original_name"]]
|
|
|
1065 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
1066 |
for hour in range(24):
|
1067 |
-
st.session_state
|
1068 |
-
st.session_state
|
1069 |
st.success(f"Schedule '{name}' saved successfully.")
|
1070 |
st.session_state.module_rerun_flags["internal_loads"] = True
|
1071 |
st.rerun()
|
@@ -1076,6 +1089,7 @@ def display_schedules_tab():
|
|
1076 |
st.error("Default schedules cannot be edited.")
|
1077 |
else:
|
1078 |
schedule_data = schedules[saved_schedule]
|
|
|
1079 |
st.session_state.schedule_editor = {
|
1080 |
"is_edit": True,
|
1081 |
"original_name": saved_schedule,
|
@@ -1085,9 +1099,10 @@ def display_schedules_tab():
|
|
1085 |
"weekend": schedule_data.get("weekend", [0.0] * 24),
|
1086 |
"template": "None"
|
1087 |
}
|
|
|
1088 |
for hour in range(24):
|
1089 |
-
st.session_state[f"weekday_slider_{hour}"] = schedule_data.get("weekday", [0.0] * 24)[hour]
|
1090 |
-
st.session_state[f"weekend_slider_{hour}"] = schedule_data.get("weekend", [0.0] * 24)[hour]
|
1091 |
st.session_state.module_rerun_flags["internal_loads"] = True
|
1092 |
st.rerun()
|
1093 |
|
@@ -1099,11 +1114,12 @@ def display_schedules_tab():
|
|
1099 |
st.error(f"Schedule '{saved_schedule}' is in use and cannot be deleted.")
|
1100 |
else:
|
1101 |
del schedules[saved_schedule]
|
1102 |
-
|
1103 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
1104 |
for hour in range(24):
|
1105 |
-
st.session_state
|
1106 |
-
st.session_state
|
|
|
1107 |
st.session_state.module_rerun_flags["internal_loads"] = True
|
1108 |
st.rerun()
|
1109 |
|
|
|
938 |
"original_name": ""
|
939 |
}
|
940 |
|
941 |
+
# Initialize schedule_editor if not present
|
942 |
if "schedule_editor" not in st.session_state:
|
943 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
944 |
|
945 |
editor_state = st.session_state.schedule_editor
|
946 |
schedules = st.session_state.project_data["internal_loads"]["schedules"]
|
947 |
|
948 |
+
# ---------------------- Handle template change ----------------------
|
949 |
template_options = list(DEFAULT_SCHEDULE_TEMPLATES.keys())
|
950 |
selected_template = st.selectbox(
|
951 |
"Select Template",
|
|
|
955 |
help="Choose a base schedule to prefill values."
|
956 |
)
|
957 |
|
958 |
+
# Update sliders only if template changes and not in edit mode
|
959 |
+
if selected_template != editor_state.get("template", "None") and not editor_state.get("is_edit"):
|
960 |
st.session_state.schedule_editor["template"] = selected_template
|
961 |
if selected_template != "None":
|
962 |
tpl = DEFAULT_SCHEDULE_TEMPLATES[selected_template]
|
963 |
st.session_state.schedule_editor["weekday"] = tpl["weekday"]
|
964 |
st.session_state.schedule_editor["weekend"] = tpl["weekend"]
|
965 |
+
# Store slider values in session state for preloading
|
966 |
for hour in range(24):
|
967 |
+
st.session_state[f"weekday_slider_{hour}_value"] = tpl["weekday"][hour]
|
968 |
+
st.session_state[f"weekend_slider_{hour}_value"] = tpl["weekend"][hour]
|
969 |
+
else:
|
970 |
+
for hour in range(24):
|
971 |
+
st.session_state[f"weekday_slider_{hour}_value"] = 0.0
|
972 |
+
st.session_state[f"weekend_slider_{hour}_value"] = 0.0
|
973 |
+
st.session_state.module_rerun_flags["internal_loads"] = True
|
974 |
st.rerun()
|
975 |
|
976 |
# ---------------------- UI FORM for name/description and actions ----------------------
|
977 |
with st.form("schedule_form"):
|
978 |
+
name = st.text_input("Schedule Name",
|
979 |
+
value=editor_state.get("name", ""),
|
980 |
+
key="schedule_name_input")
|
981 |
+
description = st.text_area("Description",
|
982 |
+
value=editor_state.get("description", ""),
|
983 |
+
key="schedule_description_input")
|
984 |
|
985 |
# ---------------------- SLIDERS LAYOUT ----------------------
|
986 |
st.markdown("### Schedule Sliders")
|
|
|
993 |
st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekday</div>", unsafe_allow_html=True)
|
994 |
with col_we:
|
995 |
st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekend</div>", unsafe_allow_html=True)
|
996 |
+
|
997 |
hide_elements = """
|
998 |
<style>
|
999 |
div[data-testid="stSliderTickBarMin"],
|
|
|
1002 |
}
|
1003 |
</style>
|
1004 |
"""
|
|
|
1005 |
st.markdown(hide_elements, unsafe_allow_html=True)
|
1006 |
|
1007 |
weekday_values = []
|
|
|
1020 |
min_value=0.0,
|
1021 |
max_value=1.0,
|
1022 |
step=0.1,
|
1023 |
+
value=st.session_state.get(f"weekday_slider_{hour}_value", 0.0),
|
1024 |
label_visibility="collapsed",
|
1025 |
format=None
|
1026 |
)
|
|
|
1033 |
min_value=0.0,
|
1034 |
max_value=1.0,
|
1035 |
step=0.1,
|
1036 |
+
value=st.session_state.get(f"weekend_slider_{hour}_value", 0.0),
|
1037 |
label_visibility="collapsed",
|
1038 |
format=None
|
1039 |
)
|
|
|
1043 |
col1, col2, col3 = st.columns(3)
|
1044 |
with col1:
|
1045 |
submit_label = "Update Schedule" if editor_state.get("is_edit") else "Save Schedule"
|
1046 |
+
submitted = st.form_submit_button(submit_label, key="save_schedule_button")
|
1047 |
with col2:
|
1048 |
+
edit_submitted = st.form_submit_button("Edit Selected Schedule", key="edit_schedule_button")
|
1049 |
with col3:
|
1050 |
+
delete_submitted = st.form_submit_button("Delete Selected Schedule", key="delete_schedule_button")
|
1051 |
|
1052 |
# ---------------------- Saved Schedules Selector ----------------------
|
1053 |
st.markdown("### Saved Schedules")
|
1054 |
saved_schedule = st.selectbox(
|
1055 |
"Select Saved Schedule",
|
1056 |
options=list(schedules.keys()),
|
1057 |
+
index=list(schedules.keys()).index(editor_state.get("name", list(schedules.keys())[0])) if editor_state.get("name") in schedules and schedules else 0,
|
1058 |
+
help="Select a saved schedule to edit or delete.",
|
1059 |
+
key="saved_schedule_select"
|
1060 |
)
|
1061 |
|
1062 |
# ---------------------- Save logic ----------------------
|
|
|
1074 |
if editor_state.get("is_edit") and editor_state.get("original_name") and editor_state.get("original_name") != name:
|
1075 |
if editor_state["original_name"] in schedules:
|
1076 |
del schedules[editor_state["original_name"]]
|
1077 |
+
# Reset editor state and slider values
|
1078 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
1079 |
for hour in range(24):
|
1080 |
+
st.session_state[f"weekday_slider_{hour}_value"] = 0.0
|
1081 |
+
st.session_state[f"weekend_slider_{hour}_value"] = 0.0
|
1082 |
st.success(f"Schedule '{name}' saved successfully.")
|
1083 |
st.session_state.module_rerun_flags["internal_loads"] = True
|
1084 |
st.rerun()
|
|
|
1089 |
st.error("Default schedules cannot be edited.")
|
1090 |
else:
|
1091 |
schedule_data = schedules[saved_schedule]
|
1092 |
+
# Update editor state without modifying slider widgets directly
|
1093 |
st.session_state.schedule_editor = {
|
1094 |
"is_edit": True,
|
1095 |
"original_name": saved_schedule,
|
|
|
1099 |
"weekend": schedule_data.get("weekend", [0.0] * 24),
|
1100 |
"template": "None"
|
1101 |
}
|
1102 |
+
# Preload slider values
|
1103 |
for hour in range(24):
|
1104 |
+
st.session_state[f"weekday_slider_{hour}_value"] = schedule_data.get("weekday", [0.0] * 24)[hour]
|
1105 |
+
st.session_state[f"weekend_slider_{hour}_value"] = schedule_data.get("weekend", [0.0] * 24)[hour]
|
1106 |
st.session_state.module_rerun_flags["internal_loads"] = True
|
1107 |
st.rerun()
|
1108 |
|
|
|
1114 |
st.error(f"Schedule '{saved_schedule}' is in use and cannot be deleted.")
|
1115 |
else:
|
1116 |
del schedules[saved_schedule]
|
1117 |
+
# Reset editor state and slider values
|
1118 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
1119 |
for hour in range(24):
|
1120 |
+
st.session_state[f"weekday_slider_{hour}_value"] = 0.0
|
1121 |
+
st.session_state[f"weekend_slider_{hour}_value"] = 0.0
|
1122 |
+
st.success(f"Schedule '{saved_schedule}' deleted!")
|
1123 |
st.session_state.module_rerun_flags["internal_loads"] = True
|
1124 |
st.rerun()
|
1125 |
|