Track script changes and show modified flag when scripts are edited

This commit is contained in:
vesp 2025-12-31 01:59:49 +01:00
parent f39acaf02e
commit c2778f419a
2 changed files with 55 additions and 4 deletions

View File

@ -37,6 +37,7 @@ class RequestTabWidget(Gtk.Box):
self.response = response
self.modified = False
self.original_request = None
self.original_scripts = None
self.project_id = project_id
self.selected_environment_id = selected_environment_id
self.scripts = scripts
@ -652,6 +653,10 @@ class RequestTabWidget(Gtk.Box):
body_buffer = self.body_sourceview.get_buffer()
body_buffer.connect("changed", self._on_request_changed)
# Setup script change tracking
postprocessing_buffer = self.postprocessing_sourceview.get_buffer()
postprocessing_buffer.connect("changed", self._on_request_changed)
# Setup variable indicator updates (debounced)
if self.project_id:
self.url_entry.connect("changed", lambda w: self._schedule_indicator_update())
@ -680,7 +685,8 @@ class RequestTabWidget(Gtk.Box):
if not self.original_request:
return False
return (
# Check if request changed
request_changed = (
request.method != self.original_request.method or
request.url != self.original_request.url or
request.body != self.original_request.body or
@ -688,6 +694,23 @@ class RequestTabWidget(Gtk.Box):
request.syntax != self.original_request.syntax
)
# Check if scripts changed
current_scripts = self.get_scripts()
scripts_changed = False
if self.original_scripts is None and current_scripts:
# Had no scripts, now has scripts
scripts_changed = (current_scripts.preprocessing.strip() != "" or
current_scripts.postprocessing.strip() != "")
elif self.original_scripts and current_scripts:
# Compare scripts
scripts_changed = (
current_scripts.preprocessing != self.original_scripts.preprocessing or
current_scripts.postprocessing != self.original_scripts.postprocessing
)
return request_changed or scripts_changed
def _load_request(self, request):
"""Load a request into this tab's UI."""
# Set method

View File

@ -315,6 +315,14 @@ class RosterWindow(Adw.ApplicationWindow):
widget.original_request = tab.original_request
widget.project_manager = self.project_manager # Inject project manager
# Set original scripts for change tracking (if this is a saved request)
if saved_request_id and scripts:
from .models import Scripts
widget.original_scripts = Scripts(
preprocessing=scripts.preprocessing,
postprocessing=scripts.postprocessing
)
# Populate environment dropdown if project_id is set
if project_id and hasattr(widget, '_populate_environment_dropdown'):
widget._populate_environment_dropdown()
@ -788,12 +796,12 @@ class RosterWindow(Adw.ApplicationWindow):
self._show_toast(f"Saved as '{name}'")
# Clear modified flag on current tab
self._mark_tab_as_saved(saved_request.id, name, request)
self._mark_tab_as_saved(saved_request.id, name, request, scripts)
dialog.connect("response", on_response)
dialog.present(self)
def _mark_tab_as_saved(self, saved_request_id, name, request):
def _mark_tab_as_saved(self, saved_request_id, name, request, scripts=None):
"""Mark the current tab as saved (clear modified flag)."""
page = self.tab_view.get_selected_page()
if not page:
@ -807,6 +815,7 @@ class RosterWindow(Adw.ApplicationWindow):
tab.saved_request_id = saved_request_id
tab.name = name
tab.modified = False
tab.scripts = scripts
# Update original_request to match saved state
original = HttpRequest(
@ -818,6 +827,17 @@ class RosterWindow(Adw.ApplicationWindow):
)
tab.original_request = original
# Update original_scripts to match saved state
if scripts:
from .models import Scripts
original_scripts = Scripts(
preprocessing=scripts.preprocessing,
postprocessing=scripts.postprocessing
)
widget.original_scripts = original_scripts
else:
widget.original_scripts = None
# Update widget state
widget.original_request = original
widget.modified = False
@ -845,7 +865,7 @@ class RosterWindow(Adw.ApplicationWindow):
self._show_toast(f"Updated '{name}'")
# Clear modified flag on current tab
self._mark_tab_as_saved(existing_request_id, name, request)
self._mark_tab_as_saved(existing_request_id, name, request, scripts)
dialog.connect("response", on_overwrite_response)
dialog.present(self)
@ -951,6 +971,14 @@ class RosterWindow(Adw.ApplicationWindow):
# Load scripts into widget
if scripts:
widget.load_scripts(scripts)
# Set original scripts for change tracking
from .models import Scripts
widget.original_scripts = Scripts(
preprocessing=scripts.preprocessing,
postprocessing=scripts.postprocessing
)
else:
widget.original_scripts = None
if is_copy:
# This is a copy - mark as unsaved