From e534660fd74eaeba78522527f6b62881b84bd45e Mon Sep 17 00:00:00 2001 From: Ronni Skansing Date: Sat, 29 Nov 2025 10:46:36 +0100 Subject: [PATCH] ctrl+s update keep position Signed-off-by: Ronni Skansing --- frontend/src/lib/components/FormGrid.svelte | 8 +++++--- frontend/src/lib/components/Modal.svelte | 22 +++++++++++++++++++-- frontend/src/routes/api-sender/+page.svelte | 3 ++- frontend/src/routes/email/+page.svelte | 6 ++++-- frontend/src/routes/page/+page.svelte | 3 ++- frontend/src/routes/proxy/+page.svelte | 3 ++- 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/frontend/src/lib/components/FormGrid.svelte b/frontend/src/lib/components/FormGrid.svelte index 8c6b6bb..b55b729 100644 --- a/frontend/src/lib/components/FormGrid.svelte +++ b/frontend/src/lib/components/FormGrid.svelte @@ -15,10 +15,13 @@ function handleKeydown(event) { if (event.ctrlKey && event.key === 's') { - // Only trigger if the form or its descendants have focus and we're in update mode + // only trigger if the form or its descendants have focus and we're in update mode if (modalMode === 'update' && formElement && formElement.contains(document.activeElement)) { event.preventDefault(); - dispatch('submit', { ...event, saveOnly: true }); + event.stopPropagation(); + event.stopImmediatePropagation(); + // dispatch to our event handler, not native form submit + dispatch('submit', { saveOnly: true }); } } } @@ -34,7 +37,6 @@
{ if (e.key === 'Escape') { - close(); + // don't close modal during submission + if (!isSubmitting) { + close(); + } } else if (e.key === 'Tab') { // Check if the focused element is a dropdown option button const focusedElement = document.activeElement; @@ -227,6 +236,11 @@ }; const handleModalOpen = async () => { + // don't manage focus during form submission + if (isSubmitting) { + return; + } + // Store the currently focused element previousActiveElement = document.activeElement; @@ -285,6 +299,10 @@ }); const close = () => { + // prevent closing during submission + if (isSubmitting) { + return; + } visible = false; window.removeEventListener('keydown', keyHandler); // Restore body scrolling when modal is closed diff --git a/frontend/src/routes/api-sender/+page.svelte b/frontend/src/routes/api-sender/+page.svelte index 369ecde..6167051 100644 --- a/frontend/src/routes/api-sender/+page.svelte +++ b/frontend/src/routes/api-sender/+page.svelte @@ -194,8 +194,9 @@ addToast(saveOnly ? 'API sender saved' : 'Updated API sender', 'Success'); if (!saveOnly) { closeEditModal(); + // only refresh the table when actually closing the modal + refreshConfigurations(); } - refreshConfigurations(); } catch (err) { addToast('Failed to update API sender', 'Error'); console.error('failed to update API sender:', err); diff --git a/frontend/src/routes/email/+page.svelte b/frontend/src/routes/email/+page.svelte index 5ec339b..73893d6 100644 --- a/frontend/src/routes/email/+page.svelte +++ b/frontend/src/routes/email/+page.svelte @@ -46,6 +46,7 @@ let contextCompanyID = null; let form = null; let sendTestForm = null; + let formValues = { id: null, name: null, @@ -141,8 +142,8 @@ const onSubmit = async (event) => { try { - isSubmitting = true; const saveOnly = event?.detail?.saveOnly || false; + isSubmitting = true; if (modalMode === 'create' || modalMode === 'copy') { await onClickCreate(); return; @@ -198,8 +199,9 @@ addToast(saveOnly ? 'Email saved' : 'Email updated', 'Success'); if (!saveOnly) { closeModal(); + // only refresh the table when actually closing the modal + refreshEmails(); } - refreshEmails(); } catch (e) { addToast(saveOnly ? 'Failed to save email' : 'Failed to update email', 'Error'); console.error('failed to update email', e); diff --git a/frontend/src/routes/page/+page.svelte b/frontend/src/routes/page/+page.svelte index e56a2e7..0f35cb8 100644 --- a/frontend/src/routes/page/+page.svelte +++ b/frontend/src/routes/page/+page.svelte @@ -189,8 +189,9 @@ addToast(saveOnly ? 'Page saved' : 'Page updated', 'Success'); if (!saveOnly) { closeModal(); + // only refresh the table when actually closing the modal + refreshPages(); } - refreshPages(); } catch (e) { addToast(saveOnly ? 'Failed to save page' : 'Failed to update page', 'Error'); console.error('failed to update page', e); diff --git a/frontend/src/routes/proxy/+page.svelte b/frontend/src/routes/proxy/+page.svelte index 8771c9f..76d4ec7 100644 --- a/frontend/src/routes/proxy/+page.svelte +++ b/frontend/src/routes/proxy/+page.svelte @@ -277,8 +277,9 @@ portal.example.com: addToast(saveOnly ? 'Proxy saved' : 'Proxy updated', 'Success'); if (!saveOnly) { closeModal(); + // only refresh the table when actually closing the modal + refreshProxies(); } - refreshProxies(); } catch (e) { addToast(saveOnly ? 'Failed to save Proxy' : 'Failed to update Proxy', 'Error'); console.error('failed to update Proxy', e);