mabuseif commited on
Commit
d72b619
·
verified ·
1 Parent(s): 375201a

Update app/internal_loads.py

Browse files
Files changed (1) hide show
  1. app/internal_loads.py +119 -131
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,177 +963,164 @@ 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.session_state.module_rerun_flags["internal_loads"] = True
966
  st.rerun()
967
 
968
- # ---------------------- UI FORM for name/description only ----------------------
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
- submitted = st.form_submit_button("Save Schedule")
973
 
974
- # ---------------------- SLIDERS LAYOUT ----------------------
975
- st.markdown("### Schedule Sliders")
 
 
 
 
 
 
 
976
 
977
- # Table headers
978
- col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
979
- with col_hour:
980
- st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Hour</div>", unsafe_allow_html=True)
981
- with col_wd:
982
- st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekday</div>", unsafe_allow_html=True)
983
- with col_we:
984
- st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekend</div>", unsafe_allow_html=True)
985
-
986
- # Hide slider values, min, and max labels
987
- hide_elements = """
988
- <style>
989
- div[data-testid="stSliderTickBarMin"],
990
- div[data-testid="stSliderTickBarMax"],
991
- div.stSlider > div > div > div > div[data-testid="stTickBar"] > div > div {
992
- display: none;
993
- }
994
- div.stSlider > div > div > div > div > div > div {
995
- visibility: hidden;
996
- }
997
- </style>
998
- """
999
- st.markdown(hide_elements, unsafe_allow_html=True)
1000
-
1001
- weekday_values = []
1002
- weekend_values = []
1003
 
1004
- for hour in range(24):
1005
  col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
1006
-
1007
  with col_hour:
1008
- st.markdown(f"<div style='text-align:center; font-size:12px'>{hour:02d}</div>", unsafe_allow_html=True)
1009
-
1010
  with col_wd:
1011
- val = st.slider(
1012
- label=f"Weekday {hour:02d}",
1013
- key=f"weekday_slider_{hour}",
1014
- min_value=0.0,
1015
- max_value=1.0,
1016
- step=0.1,
1017
- value=st.session_state.get(f"weekday_slider_{hour}", 0.0),
1018
- label_visibility="collapsed",
1019
- format="%.1f"
1020
- )
1021
- weekday_values.append(val)
1022
-
1023
  with col_we:
1024
- val = st.slider(
1025
- label=f"Weekend {hour:02d}",
1026
- key=f"weekend_slider_{hour}",
1027
- min_value=0.0,
1028
- max_value=1.0,
1029
- step=0.1,
1030
- value=st.session_state.get(f"weekend_slider_{hour}", 0.0),
1031
- label_visibility="collapsed",
1032
- format="%.1f"
1033
- )
1034
- weekend_values.append(val)
1035
 
1036
- # ---------------------- Save logic ----------------------
1037
- if submitted:
1038
- if not name.strip():
1039
- st.error("Schedule name is required.")
1040
- elif name in schedules and not editor_state.get("is_edit"):
1041
- st.error("A schedule with this name already exists.")
1042
- else:
1043
- schedules[name] = {
1044
- "description": description,
1045
- "weekday": weekday_values,
1046
- "weekend": weekend_values
1047
- }
1048
- if editor_state.get("is_edit") and editor_state.get("original_name") != name:
1049
- # Remove old schedule name if renamed
1050
- if editor_state.get("original_name") in schedules:
1051
- del schedules[editor_state["original_name"]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1052
  st.session_state.schedule_editor = DEFAULT_STATE.copy()
1053
  for hour in range(24):
1054
  st.session_state.pop(f"weekday_slider_{hour}", None)
1055
  st.session_state.pop(f"weekend_slider_{hour}", None)
1056
- st.success(f"Schedule '{name}' saved successfully.")
1057
  st.session_state.module_rerun_flags["internal_loads"] = True
1058
  st.rerun()
1059
 
1060
  # ---------------------- Show Saved ----------------------
1061
  st.markdown("### Saved Schedules")
1062
  if schedules:
1063
- display_schedules_table(schedules)
1064
- else:
1065
- st.info("No schedules saved yet.")
1066
-
1067
- def display_schedules_table(schedules: Dict[str, Any]):
1068
- """Display schedules in a table format with edit/delete buttons."""
1069
- if not schedules:
1070
- return
1071
-
1072
- # Create table data
1073
- table_data = []
1074
- for name, schedule in schedules.items():
1075
- weekday_peak = max(schedule.get("weekday", [0]))
1076
- weekend_peak = max(schedule.get("weekend", [0]))
1077
-
1078
- table_data.append({
1079
- "Name": name,
1080
- "Description": schedule.get("description", "No description"),
1081
- "Weekday Peak": f"{weekday_peak:.2f}",
1082
- "Weekend Peak": f"{weekend_peak:.2f}",
1083
- "Actions": name
1084
- })
1085
-
1086
- if table_data:
1087
  df = pd.DataFrame(table_data)
1088
-
1089
- # Display table
1090
- st.dataframe(df.drop('Actions', axis=1), use_container_width=True)
1091
-
1092
- # Display action buttons
1093
- st.write("**Actions:**")
1094
  for i, row in enumerate(table_data):
1095
- schedule_name = row["Actions"]
1096
-
1097
- col1, col2, col3 = st.columns([2, 1, 1])
1098
-
1099
  with col1:
1100
  st.write(f"{i+1}. {schedule_name}")
1101
-
1102
  with col2:
1103
  if st.button("Edit", key=f"edit_schedule_{schedule_name}_{i}"):
1104
- # Set up editor for editing
1105
  schedule_data = schedules[schedule_name]
1106
  st.session_state.schedule_editor = {
1107
  "is_edit": True,
1108
  "original_name": schedule_name,
1109
  "name": schedule_name,
1110
  "description": schedule_data.get("description", ""),
1111
- "template": "None",
1112
  "weekday": schedule_data.get("weekday", [0.0] * 24),
1113
- "weekend": schedule_data.get("weekend", [0.0] * 24)
 
1114
  }
1115
- # Initialize sliders with current values
1116
  for hour in range(24):
1117
  st.session_state[f"weekday_slider_{hour}"] = schedule_data.get("weekday", [0.0] * 24)[hour]
1118
  st.session_state[f"weekend_slider_{hour}"] = schedule_data.get("weekend", [0.0] * 24)[hour]
1119
  st.session_state.module_rerun_flags["internal_loads"] = True
1120
  st.rerun()
1121
-
1122
- with col3:
1123
- # Check if schedule is in use or a default template before allowing deletion
1124
- if schedule_name not in DEFAULT_SCHEDULE_TEMPLATES:
1125
- if is_schedule_in_use(schedule_name):
1126
- st.write("(In Use)")
1127
- else:
1128
- if st.button("Delete", key=f"delete_schedule_{schedule_name}_{i}"):
1129
- # Delete schedule
1130
- del schedules[schedule_name]
1131
- st.success(f"Schedule '{schedule_name}' deleted!")
1132
- st.session_state.module_rerun_flags["internal_loads"] = True
1133
- st.rerun()
1134
- else:
1135
- st.write("(Default)")
1136
 
1137
  def is_schedule_in_use(schedule_name: str) -> bool:
1138
  """
 
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", ""), disabled=editor_state.get("is_edit", False))
971
  description = st.text_area("Description", value=editor_state.get("description", ""))
 
972
 
973
+ # Action buttons
974
+ col1, col2, col3 = st.columns(3)
975
+ with col1:
976
+ submit_label = "Update Schedule" if editor_state.get("is_edit", False) else "Save Schedule"
977
+ submit = st.form_submit_button(submit_label)
978
+ with col2:
979
+ cancel = st.form_submit_button("Cancel")
980
+ with col3:
981
+ delete = st.form_submit_button("Delete") if editor_state.get("is_edit", False) and name not in DEFAULT_SCHEDULE_TEMPLATES else None
982
 
983
+ # ---------------------- SLIDERS LAYOUT ----------------------
984
+ st.markdown("### Schedule Sliders")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
985
 
986
+ # Table headers
987
  col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
 
988
  with col_hour:
989
+ st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Hour</div>", unsafe_allow_html=True)
 
990
  with col_wd:
991
+ st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekday</div>", unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
992
  with col_we:
993
+ st.markdown("<div style='text-align:center; font-weight:bold; font-size:18px;'>Weekend</div>", unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
994
 
995
+ hide_elements = """
996
+ <style>
997
+ div[data-testid="stSliderTickBarMin"],
998
+ div[data-testid="stSliderTickBarMax"] {
999
+ display: none;
1000
+ }
1001
+ </style>
1002
+ """
1003
+ st.markdown(hide_elements, unsafe_allow_html=True)
1004
+
1005
+ weekday_values = []
1006
+ weekend_values = []
1007
+
1008
+ for hour in range(24):
1009
+ col_hour, col_wd, col_we = st.columns([0.4, 2.0, 2.0])
1010
+
1011
+ with col_hour:
1012
+ st.markdown(f"<div style='text-align:center; font-size:12px'>{hour:02d}</div>", unsafe_allow_html=True)
1013
+
1014
+ with col_wd:
1015
+ val = st.slider(
1016
+ label=f"Weekday {hour:02d}",
1017
+ key=f"weekday_slider_{hour}",
1018
+ min_value=0.0,
1019
+ max_value=1.0,
1020
+ step=0.1,
1021
+ value=st.session_state.get(f"weekday_slider_{hour}", 0.0),
1022
+ label_visibility="collapsed",
1023
+ format=None
1024
+ )
1025
+ weekday_values.append(val)
1026
+
1027
+ with col_we:
1028
+ val = st.slider(
1029
+ label=f"Weekend {hour:02d}",
1030
+ key=f"weekend_slider_{hour}",
1031
+ min_value=0.0,
1032
+ max_value=1.0,
1033
+ step=0.1,
1034
+ value=st.session_state.get(f"weekend_slider_{hour}", 0.0),
1035
+ label_visibility="collapsed",
1036
+ format=None
1037
+ )
1038
+ weekend_values.append(val)
1039
+
1040
+ # ---------------------- Save/Update logic ----------------------
1041
+ if submit:
1042
+ if not name.strip():
1043
+ st.error("Schedule name is required.")
1044
+ elif name in schedules and not editor_state.get("is_edit", False):
1045
+ st.error("A schedule with this name already exists.")
1046
+ else:
1047
+ schedules[name] = {
1048
+ "description": description,
1049
+ "weekday": weekday_values,
1050
+ "weekend": weekend_values
1051
+ }
1052
+ if editor_state.get("is_edit", False) and editor_state.get("original_name") != name:
1053
+ if editor_state.get("original_name") in schedules:
1054
+ del schedules[editor_state["original_name"]]
1055
+ st.session_state.schedule_editor = DEFAULT_STATE.copy()
1056
+ for hour in range(24):
1057
+ st.session_state.pop(f"weekday_slider_{hour}", None)
1058
+ st.session_state.pop(f"weekend_slider_{hour}", None)
1059
+ st.success(f"Schedule '{name}' {'updated' if editor_state.get('is_edit', False) else 'saved'} successfully.")
1060
+ st.session_state.module_rerun_flags["internal_loads"] = True
1061
+ st.rerun()
1062
+
1063
+ # ---------------------- Delete logic ----------------------
1064
+ if delete and editor_state.get("is_edit", False):
1065
+ if name in DEFAULT_SCHEDULE_TEMPLATES:
1066
+ st.error("Cannot delete default schedule templates.")
1067
+ elif is_schedule_in_use(name):
1068
+ st.error(f"Cannot delete schedule '{name}' because it is in use.")
1069
+ else:
1070
+ del schedules[name]
1071
+ st.session_state.schedule_editor = DEFAULT_STATE.copy()
1072
+ for hour in range(24):
1073
+ st.session_state.pop(f"weekday_slider_{hour}", None)
1074
+ st.session_state.pop(f"weekend_slider_{hour}", None)
1075
+ st.success(f"Schedule '{name}' deleted successfully.")
1076
+ st.session_state.module_rerun_flags["internal_loads"] = True
1077
+ st.rerun()
1078
+
1079
+ # ---------------------- Cancel logic ----------------------
1080
+ if cancel:
1081
  st.session_state.schedule_editor = DEFAULT_STATE.copy()
1082
  for hour in range(24):
1083
  st.session_state.pop(f"weekday_slider_{hour}", None)
1084
  st.session_state.pop(f"weekend_slider_{hour}", None)
 
1085
  st.session_state.module_rerun_flags["internal_loads"] = True
1086
  st.rerun()
1087
 
1088
  # ---------------------- Show Saved ----------------------
1089
  st.markdown("### Saved Schedules")
1090
  if schedules:
1091
+ table_data = [
1092
+ {"Name": name, "Description": schedule.get("description", "No description")}
1093
+ for name, schedule in schedules.items()
1094
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1095
  df = pd.DataFrame(table_data)
1096
+ st.dataframe(df, use_container_width=True)
1097
+
1098
+ # Action buttons for selecting/editing schedules
1099
+ st.write("**Select Schedule to Edit:**")
 
 
1100
  for i, row in enumerate(table_data):
1101
+ schedule_name = row["Name"]
1102
+ col1, col2 = st.columns([2, 1])
 
 
1103
  with col1:
1104
  st.write(f"{i+1}. {schedule_name}")
 
1105
  with col2:
1106
  if st.button("Edit", key=f"edit_schedule_{schedule_name}_{i}"):
 
1107
  schedule_data = schedules[schedule_name]
1108
  st.session_state.schedule_editor = {
1109
  "is_edit": True,
1110
  "original_name": schedule_name,
1111
  "name": schedule_name,
1112
  "description": schedule_data.get("description", ""),
 
1113
  "weekday": schedule_data.get("weekday", [0.0] * 24),
1114
+ "weekend": schedule_data.get("weekend", [0.0] * 24),
1115
+ "template": "None"
1116
  }
 
1117
  for hour in range(24):
1118
  st.session_state[f"weekday_slider_{hour}"] = schedule_data.get("weekday", [0.0] * 24)[hour]
1119
  st.session_state[f"weekend_slider_{hour}"] = schedule_data.get("weekend", [0.0] * 24)[hour]
1120
  st.session_state.module_rerun_flags["internal_loads"] = True
1121
  st.rerun()
1122
+ else:
1123
+ st.info("No schedules saved yet.")
 
 
 
 
 
 
 
 
 
 
 
 
 
1124
 
1125
  def is_schedule_in_use(schedule_name: str) -> bool:
1126
  """