diff --git a/backend/managers/file_manager.py b/backend/managers/file_manager.py index 5e23e4c..7cf8207 100644 --- a/backend/managers/file_manager.py +++ b/backend/managers/file_manager.py @@ -134,7 +134,7 @@ class FileManager: return False def delete_file(self, relative_path): - file_path = (relative_path).resolve() + file_path = Path(relative_path).resolve() if not str(file_path).startswith(str(self.base_path.resolve())): st.error(f"Access denied: {relative_path}") diff --git a/frontend/editor.py b/frontend/editor.py index 42a3b39..681c441 100644 --- a/frontend/editor.py +++ b/frontend/editor.py @@ -12,6 +12,64 @@ LANG_MAP = { ".json": "json", ".yaml": "yaml", ".yml": "yaml" } + +# ── Modals ──────────────────────────────────────────────────────────────────── + +@st.dialog("Rename File") +def _rename_dialog(file_path: str): + fm = FileManager() + st.write(f"Current name: **{Path(file_path).name}**") + new_name = st.text_input("New name:", value=Path(file_path).stem) + + col1, col2 = st.columns(2) + with col1: + if st.button("Confirm", type="primary", use_container_width=True): + if not new_name.strip(): + st.warning("Please enter a name.") + elif "/" in new_name or "\\" in new_name: + st.warning("Name must not contain slashes.") + else: + if fm.rename_file(file_path, new_name.strip()): + ext = Path(file_path).suffix + new_file_path = str(Path(file_path).parent / (Path(new_name.strip()).stem + ext)) + i = st.session_state.open_files.index(file_path) + st.session_state.open_files[i] = new_file_path + st.session_state.files_content[new_file_path] = \ + st.session_state.files_content.pop(file_path) + if st.session_state.active_file == file_path: + st.session_state.active_file = new_file_path + st.rerun() + else: + st.error("Rename failed. Check that the file still exists.") + with col2: + if st.button("Cancel", use_container_width=True): + st.rerun() + + +@st.dialog("Delete File") +def _delete_dialog(file_path: str): + fm = FileManager() + st.warning(f"Delete **{Path(file_path).name}**? This cannot be undone.") + + col1, col2 = st.columns(2) + with col1: + if st.button("Delete", type="primary", use_container_width=True): + if fm.delete_file(file_path): + st.session_state.open_files.remove(file_path) + st.session_state.files_content.pop(file_path, None) + if st.session_state.active_file == file_path: + st.session_state.active_file = ( + st.session_state.open_files[0] + if st.session_state.open_files else None + ) + st.rerun() + else: + st.error("Delete failed. Check that the file still exists.") + with col2: + if st.button("Cancel", use_container_width=True): + st.rerun() + + def run_active_file(): active_file = st.session_state.active_file @@ -101,32 +159,11 @@ def render_editor(): with cols[2]: if st.button("Rename File", key=f"rename_{file_path}"): - new_name = st.text_input("New File Name", key=f"new_name_{file_path}") - if "/" in new_name or "\\" in new_name: - st.warning("Do not include slashes in names!") - elif new_name: - try: - fm.rename_file(file_path, new_name) - st.success(f"File renamed to '{new_name}' successfully!") - st.rerun() - except Exception as e: - st.error(f"Error renaming file: {e}") - + _rename_dialog(file_path) + with cols[3]: if st.button("Delete File", key=f"delete_{file_path}"): - try: - fm.delete_file(file_path) - st.success(f"File '{Path(file_path).name}' deleted successfully!") - st.session_state.open_files.remove(file_path) - del st.session_state.files_content[file_path] - st.session_state.active_file = ( - st.session_state.open_files[0] - if st.session_state.open_files - else None - ) - st.rerun() - except Exception as e: - st.error(f"Error deleting file: {e}") + _delete_dialog(file_path) if st.button("▶ Run Code", key="run_code"): result = run_active_file()