Add tab_raw.py
This commit is contained in:
78
tab_raw.py
Normal file
78
tab_raw.py
Normal file
@@ -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}")
|
||||
Reference in New Issue
Block a user