mabuseif commited on
Commit
74f62c1
·
verified ·
1 Parent(s): 8646796

Update app/internal_loads.py

Browse files
Files changed (1) hide show
  1. 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 (force update) ----------------------
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
- if selected_template != editor_state.get("template", "None"):
 
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", value=editor_state.get("name", ""))
971
- description = st.text_area("Description", value=editor_state.get("description", ""))
 
 
 
 
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.pop(f"weekday_slider_{hour}", None)
1068
- st.session_state.pop(f"weekend_slider_{hour}", None)
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
- st.success(f"Schedule '{saved_schedule}' deleted!")
1103
  st.session_state.schedule_editor = DEFAULT_STATE.copy()
1104
  for hour in range(24):
1105
- st.session_state.pop(f"weekday_slider_{hour}", None)
1106
- st.session_state.pop(f"weekend_slider_{hour}", None)
 
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