Spaces:
Sleeping
Sleeping
Update app/internal_loads.py
Browse files- app/internal_loads.py +69 -45
app/internal_loads.py
CHANGED
@@ -739,6 +739,7 @@ def display_ventilation_infiltration_tab():
|
|
739 |
def display_schedules_tab():
|
740 |
import streamlit as st
|
741 |
import uuid
|
|
|
742 |
|
743 |
st.subheader("Schedules Editor")
|
744 |
|
@@ -846,23 +847,12 @@ def display_schedules_tab():
|
|
846 |
weekend_values.append(val)
|
847 |
|
848 |
# Action Buttons
|
849 |
-
col1, col2
|
850 |
with col1:
|
851 |
submit_label = "Update Schedule" if editor_state.get("is_edit") else "Save Schedule"
|
852 |
submitted = st.form_submit_button(submit_label)
|
853 |
with col2:
|
854 |
-
|
855 |
-
with col3:
|
856 |
-
delete_submitted = st.form_submit_button("Delete Selected Schedule")
|
857 |
-
|
858 |
-
# Saved Schedules Selector
|
859 |
-
st.markdown("### Saved Schedules")
|
860 |
-
saved_schedule = st.selectbox(
|
861 |
-
"Select Saved Schedule",
|
862 |
-
options=list(schedules.keys()),
|
863 |
-
index=list(schedules.keys()).index(editor_state.get("name", list(schedules.keys())[0])) if editor_state.get("name") in schedules and schedules else 0,
|
864 |
-
help="Select a saved schedule to edit or delete."
|
865 |
-
)
|
866 |
|
867 |
# Save logic
|
868 |
if submitted:
|
@@ -888,44 +878,78 @@ def display_schedules_tab():
|
|
888 |
st.session_state.schedule_action = {"action": "save", "id": str(uuid.uuid4())}
|
889 |
st.session_state.internal_loads_rerun_pending = True
|
890 |
|
891 |
-
#
|
892 |
-
if
|
893 |
-
if saved_schedule in DEFAULT_SCHEDULE_TEMPLATES:
|
894 |
-
st.error("Default schedules cannot be edited.")
|
895 |
-
return
|
896 |
-
schedule_data = schedules[saved_schedule]
|
897 |
-
st.session_state.schedule_editor = {
|
898 |
-
"is_edit": True,
|
899 |
-
"original_name": saved_schedule,
|
900 |
-
"name": saved_schedule,
|
901 |
-
"description": schedule_data.get("description", ""),
|
902 |
-
"weekday": schedule_data.get("weekday", [0.0] * 24),
|
903 |
-
"weekend": schedule_data.get("weekend", [0.0] * 24),
|
904 |
-
"template": "None"
|
905 |
-
}
|
906 |
-
for hour in range(24):
|
907 |
-
st.session_state[f"weekday_slider_{hour}_value"] = schedule_data.get("weekday", [0.0] * 24)[hour]
|
908 |
-
st.session_state[f"weekend_slider_{hour}_value"] = schedule_data.get("weekend", [0.0] * 24)[hour]
|
909 |
-
st.session_state.schedule_action = {"action": "edit", "id": str(uuid.uuid4())}
|
910 |
-
st.session_state.internal_loads_rerun_pending = True
|
911 |
-
|
912 |
-
# Delete logic
|
913 |
-
if delete_submitted and saved_schedule:
|
914 |
-
if saved_schedule in DEFAULT_SCHEDULE_TEMPLATES:
|
915 |
-
st.error("Default schedules cannot be deleted.")
|
916 |
-
return
|
917 |
-
if is_schedule_in_use(saved_schedule):
|
918 |
-
st.error(f"Schedule '{saved_schedule}' is in use and cannot be deleted.")
|
919 |
-
return
|
920 |
-
del schedules[saved_schedule]
|
921 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
922 |
for hour in range(24):
|
923 |
st.session_state[f"weekday_slider_{hour}_value"] = 0.0
|
924 |
st.session_state[f"weekend_slider_{hour}_value"] = 0.0
|
925 |
-
st.
|
926 |
-
st.session_state.schedule_action = {"action": "delete", "id": str(uuid.uuid4())}
|
927 |
st.session_state.internal_loads_rerun_pending = True
|
928 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
929 |
def is_schedule_in_use(schedule_name: str) -> bool:
|
930 |
"""
|
931 |
Check if a schedule is in use by any people, lighting, equipment, or ventilation/infiltration systems.
|
|
|
739 |
def display_schedules_tab():
|
740 |
import streamlit as st
|
741 |
import uuid
|
742 |
+
import pandas as pd
|
743 |
|
744 |
st.subheader("Schedules Editor")
|
745 |
|
|
|
847 |
weekend_values.append(val)
|
848 |
|
849 |
# Action Buttons
|
850 |
+
col1, col2 = st.columns(2)
|
851 |
with col1:
|
852 |
submit_label = "Update Schedule" if editor_state.get("is_edit") else "Save Schedule"
|
853 |
submitted = st.form_submit_button(submit_label)
|
854 |
with col2:
|
855 |
+
refresh = st.form_submit_button("Refresh")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
856 |
|
857 |
# Save logic
|
858 |
if submitted:
|
|
|
878 |
st.session_state.schedule_action = {"action": "save", "id": str(uuid.uuid4())}
|
879 |
st.session_state.internal_loads_rerun_pending = True
|
880 |
|
881 |
+
# Refresh logic
|
882 |
+
if refresh:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
883 |
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
884 |
for hour in range(24):
|
885 |
st.session_state[f"weekday_slider_{hour}_value"] = 0.0
|
886 |
st.session_state[f"weekend_slider_{hour}_value"] = 0.0
|
887 |
+
st.session_state.schedule_action = {"action": "refresh", "id": str(uuid.uuid4())}
|
|
|
888 |
st.session_state.internal_loads_rerun_pending = True
|
889 |
|
890 |
+
# Display saved schedules in a table
|
891 |
+
st.subheader("Saved Schedules")
|
892 |
+
if schedules:
|
893 |
+
# Create column headers
|
894 |
+
cols = st.columns([2, 3, 1, 1, 1, 1])
|
895 |
+
cols[0].write("**Name**")
|
896 |
+
cols[1].write("**Description**")
|
897 |
+
cols[2].write("**Weekday Peak**")
|
898 |
+
cols[3].write("**Weekend Peak**")
|
899 |
+
cols[4].write("**Edit**")
|
900 |
+
cols[5].write("**Delete**")
|
901 |
+
|
902 |
+
# Display each schedule
|
903 |
+
for idx, (name, schedule) in enumerate(schedules.items()):
|
904 |
+
cols = st.columns([2, 3, 1, 1, 1, 1])
|
905 |
+
cols[0].write(name)
|
906 |
+
cols[1].write(schedule.get("description", "No description"))
|
907 |
+
cols[2].write(f"{max(schedule.get('weekday', [0])):.2f}")
|
908 |
+
cols[3].write(f"{max(schedule.get('weekend', [0])):.2f}")
|
909 |
+
|
910 |
+
# Edit button
|
911 |
+
edit_key = f"edit_schedule_{name}_{idx}"
|
912 |
+
with cols[4].container():
|
913 |
+
if st.button("Edit", key=edit_key):
|
914 |
+
if name in DEFAULT_SCHEDULE_TEMPLATES:
|
915 |
+
st.error("Default schedules cannot be edited.")
|
916 |
+
else:
|
917 |
+
schedule_data = schedules[name]
|
918 |
+
st.session_state.schedule_editor = {
|
919 |
+
"is_edit": True,
|
920 |
+
"original_name": name,
|
921 |
+
"name": name,
|
922 |
+
"description": schedule_data.get("description", ""),
|
923 |
+
"weekday": schedule_data.get("weekday", [0.0] * 24),
|
924 |
+
"weekend": schedule_data.get("weekend", [0.0] * 24),
|
925 |
+
"template": "None"
|
926 |
+
}
|
927 |
+
for hour in range(24):
|
928 |
+
st.session_state[f"weekday_slider_{hour}_value"] = schedule_data.get("weekday", [0.0] * 24)[hour]
|
929 |
+
st.session_state[f"weekend_slider_{hour}_value"] = schedule_data.get("weekend", [0.0] * 24)[hour]
|
930 |
+
st.session_state.schedule_action = {"action": "edit", "id": str(uuid.uuid4())}
|
931 |
+
st.session_state.internal_loads_rerun_pending = True
|
932 |
+
|
933 |
+
# Delete button
|
934 |
+
delete_key = f"delete_schedule_{name}_{idx}"
|
935 |
+
with cols[5].container():
|
936 |
+
if name in DEFAULT_SCHEDULE_TEMPLATES:
|
937 |
+
cols[5].write("(Default)")
|
938 |
+
elif is_schedule_in_use(name):
|
939 |
+
cols[5].write("(In Use)")
|
940 |
+
else:
|
941 |
+
if st.button("Delete", key=delete_key):
|
942 |
+
del schedules[name]
|
943 |
+
st.session_state.schedule_editor = DEFAULT_STATE.copy()
|
944 |
+
for hour in range(24):
|
945 |
+
st.session_state[f"weekday_slider_{hour}_value"] = 0.0
|
946 |
+
st.session_state[f"weekend_slider_{hour}_value"] = 0.0
|
947 |
+
st.success(f"Schedule '{name}' deleted!")
|
948 |
+
st.session_state.schedule_action = {"action": "delete", "id": str(uuid.uuid4())}
|
949 |
+
st.session_state.internal_loads_rerun_pending = True
|
950 |
+
else:
|
951 |
+
st.write("No schedules defined.")
|
952 |
+
|
953 |
def is_schedule_in_use(schedule_name: str) -> bool:
|
954 |
"""
|
955 |
Check if a schedule is in use by any people, lighting, equipment, or ventilation/infiltration systems.
|