mabuseif commited on
Commit
8646796
·
verified ·
1 Parent(s): 5e350cf

Update app/internal_loads.py

Browse files
Files changed (1) hide show
  1. app/internal_loads.py +131 -78
app/internal_loads.py CHANGED
@@ -934,7 +934,8 @@ def display_schedules_tab():
934
  "template": "None",
935
  "weekday": [0.0] * 24,
936
  "weekend": [0.0] * 24,
937
- "is_edit": False
 
938
  }
939
 
940
  if "schedule_editor" not in st.session_state:
@@ -962,97 +963,149 @@ def display_schedules_tab():
962
  for hour in range(24):
963
  st.session_state[f"weekday_slider_{hour}"] = tpl["weekday"][hour]
964
  st.session_state[f"weekend_slider_{hour}"] = tpl["weekend"][hour]
965
- st.experimental_rerun()
966
 
967
- # ---------------------- UI FORM for name/description only ----------------------
968
  with st.form("schedule_form"):
969
  name = st.text_input("Schedule Name", value=editor_state.get("name", ""))
970
  description = st.text_area("Description", value=editor_state.get("description", ""))
971
- submitted = st.form_submit_button("Save Schedule")
972
 
973
- # ---------------------- SLIDERS LAYOUT ----------------------
974
- st.markdown("### Schedule Sliders")
975
 
976
- # Table headers
977
- col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
978
- with col_hour:
979
- st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Hour</div>", unsafe_allow_html=True)
980
- with col_wd:
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"],
988
- div[data-testid="stSliderTickBarMax"] {
989
- display: none;
990
- }
991
- </style>
992
- """
993
-
994
- st.markdown(hide_elements, unsafe_allow_html=True)
995
 
996
- weekday_values = []
997
- weekend_values = []
998
 
999
- for hour in range(24):
1000
- col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
1001
 
1002
- with col_hour:
1003
- st.markdown(f"<div style='text-align:center; font-size:12px'>{hour:02d}</div>", unsafe_allow_html=True)
1004
 
1005
- with col_wd:
1006
- val = st.slider(
1007
- label=f"Weekday {hour:02d}",
1008
- key=f"weekday_slider_{hour}",
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 # hides value text below slider
1015
- )
1016
- weekday_values.append(val)
1017
 
1018
- with col_we:
1019
- val = st.slider(
1020
- label=f"Weekend {hour:02d}",
1021
- key=f"weekend_slider_{hour}",
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
- )
1029
- weekend_values.append(val)
1030
 
1031
- # ---------------------- Save logic ----------------------
1032
- if submitted:
1033
- if not name.strip():
1034
- st.error("Schedule name is required.")
1035
- elif name in schedules and not editor_state.get("is_edit"):
1036
- st.error("A schedule with this name already exists.")
1037
- else:
1038
- schedules[name] = {
1039
- "description": description,
1040
- "weekday": weekday_values,
1041
- "weekend": weekend_values
1042
- }
1043
 
1044
- st.session_state.schedule_editor = DEFAULT_STATE.copy()
1045
- for hour in range(24):
1046
- st.session_state.pop(f"weekday_slider_{hour}", None)
1047
- st.session_state.pop(f"weekend_slider_{hour}", None)
1048
- st.success(f"Schedule '{name}' saved successfully.")
1049
-
1050
- # ---------------------- Show Saved ----------------------
1051
- st.markdown("### Saved Schedules")
1052
- if schedules:
1053
- display_schedules_table(schedules)
1054
- else:
1055
- st.info("No schedules saved yet.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1056
 
1057
  def is_schedule_in_use(schedule_name: str) -> bool:
1058
  """
 
934
  "template": "None",
935
  "weekday": [0.0] * 24,
936
  "weekend": [0.0] * 24,
937
+ "is_edit": False,
938
+ "original_name": ""
939
  }
940
 
941
  if "schedule_editor" not in st.session_state:
 
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")
975
 
976
+ # Table headers
977
+ col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
978
+ with col_hour:
979
+ st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Hour</div>", unsafe_allow_html=True)
980
+ with col_wd:
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"],
988
+ div[data-testid="stSliderTickBarMax"] {
989
+ display: none;
990
+ }
991
+ </style>
992
+ """
993
+
994
+ st.markdown(hide_elements, unsafe_allow_html=True)
995
 
996
+ weekday_values = []
997
+ weekend_values = []
998
 
999
+ for hour in range(24):
1000
+ col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
1001
 
1002
+ with col_hour:
1003
+ st.markdown(f"<div style='text-align:center; font-size:12px'>{hour:02d}</div>", unsafe_allow_html=True)
1004
 
1005
+ with col_wd:
1006
+ val = st.slider(
1007
+ label=f"Weekday {hour:02d}",
1008
+ key=f"weekday_slider_{hour}",
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
+ )
1016
+ weekday_values.append(val)
1017
 
1018
+ with col_we:
1019
+ val = st.slider(
1020
+ label=f"Weekend {hour:02d}",
1021
+ key=f"weekend_slider_{hour}",
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
+ )
1029
+ weekend_values.append(val)
1030
 
1031
+ # ---------------------- Action Buttons ----------------------
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 ----------------------
1051
+ if submitted:
1052
+ if not name.strip():
1053
+ st.error("Schedule name is required.")
1054
+ elif name in schedules and not editor_state.get("is_edit"):
1055
+ st.error("A schedule with this name already exists.")
1056
+ else:
1057
+ schedules[name] = {
1058
+ "description": description,
1059
+ "weekday": weekday_values,
1060
+ "weekend": weekend_values
1061
+ }
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()
1072
+
1073
+ # ---------------------- Edit logic ----------------------
1074
+ if edit_submitted and saved_schedule:
1075
+ if saved_schedule in DEFAULT_SCHEDULE_TEMPLATES:
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,
1082
+ "name": saved_schedule,
1083
+ "description": schedule_data.get("description", ""),
1084
+ "weekday": schedule_data.get("weekday", [0.0] * 24),
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
+
1094
+ # ---------------------- Delete logic ----------------------
1095
+ if delete_submitted and saved_schedule:
1096
+ if saved_schedule in DEFAULT_SCHEDULE_TEMPLATES:
1097
+ st.error("Default schedules cannot be deleted.")
1098
+ elif is_schedule_in_use(saved_schedule):
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
 
1110
  def is_schedule_in_use(schedule_name: str) -> bool:
1111
  """