diff --git a/tab_raw.py b/tab_raw.py new file mode 100644 index 0000000..ff8c651 --- /dev/null +++ b/tab_raw.py @@ -0,0 +1,78 @@ +import streamlit as st +import json +import copy +from utils import save_json, get_file_mtime + +def render_raw_editor(data, file_path): + st.subheader(f"💻 Raw Editor: {file_path.name}") + + # Toggle to hide massive history objects + # This is crucial because history trees can get huge and make the text area laggy. + col_ctrl, col_info = st.columns([1, 2]) + with col_ctrl: + hide_history = st.checkbox( + "Hide History (Safe Mode)", + value=True, + help="Hides 'history_tree' and 'prompt_history' to keep the editor fast and prevent accidental deletion of version control." + ) + + # Prepare display data + if hide_history: + display_data = copy.deepcopy(data) + # Safely remove heavy keys for the view only + if "history_tree" in display_data: del display_data["history_tree"] + if "prompt_history" in display_data: del display_data["prompt_history"] + else: + display_data = data + + # Convert to string + # ensure_ascii=False ensures emojis and special chars render correctly + try: + json_str = json.dumps(display_data, indent=4, ensure_ascii=False) + except Exception as e: + st.error(f"Error serializing JSON: {e}") + json_str = "{}" + + # The Text Editor + # We use ui_reset_token in the key to force the text area to reload content on save + new_json_str = st.text_area( + "JSON Content", + value=json_str, + height=650, + key=f"raw_edit_{file_path.name}_{st.session_state.ui_reset_token}" + ) + + st.markdown("---") + + if st.button("💾 Save Raw Changes", type="primary", use_container_width=True): + try: + # 1. Parse the text back to JSON + input_data = json.loads(new_json_str) + + # 2. If we were in Safe Mode, we must merge the hidden history back in + if hide_history: + if "history_tree" in data: + input_data["history_tree"] = data["history_tree"] + if "prompt_history" in data: + input_data["prompt_history"] = data["prompt_history"] + + # 3. Save to Disk + save_json(file_path, input_data) + + # 4. Update Session State + # We clear and update the existing dictionary object so other tabs see the changes + data.clear() + data.update(input_data) + + # 5. Update Metadata to prevent conflict warnings + st.session_state.last_mtime = get_file_mtime(file_path) + st.session_state.ui_reset_token += 1 + + st.toast("Raw JSON Saved Successfully!", icon="✅") + st.rerun() + + except json.JSONDecodeError as e: + st.error(f"❌ Invalid JSON Syntax: {e}") + st.error("Please fix the formatting errors above before saving.") + except Exception as e: + st.error(f"❌ Unexpected Error: {e}") \ No newline at end of file