From 83778f571f2c2e178832ea68e20524f2eeec69e5 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Thu, 17 Sep 2026 18:06:57 +0200 Subject: [PATCH] feat: close a page item tab from its editor header Co-Authored-By: Claude Opus 5 (1M context) --- .../src/lib/components/ResourceEditorDrawer.svelte | 7 +++++-- frontend/src/lib/components/VariableEditor.svelte | 7 +++++-- .../lib/components/sessions/PageItemEditorView.svelte | 10 +++++++++- .../triggers/amqp/AmqpTriggerEditorInner.svelte | 7 +++++-- .../triggers/azure/AzureTriggerEditorInner.svelte | 7 +++++-- .../triggers/email/EmailTriggerEditorInner.svelte | 5 +++-- .../triggers/gcp/GcpTriggerEditorInner.svelte | 7 +++++-- .../components/triggers/http/RouteEditorInner.svelte | 5 +++-- .../triggers/kafka/KafkaTriggerEditorInner.svelte | 7 +++++-- .../triggers/mqtt/MqttTriggerEditorInner.svelte | 7 +++++-- .../triggers/nats/NatsTriggerEditorInner.svelte | 7 +++++-- .../postgres/PostgresTriggerEditorInner.svelte | 7 +++++-- .../triggers/schedules/ScheduleEditorInner.svelte | 5 +++-- .../triggers/sqs/SqsTriggerEditorInner.svelte | 7 +++++-- .../websocket/WebsocketTriggerEditorInner.svelte | 7 +++++-- 15 files changed, 73 insertions(+), 29 deletions(-) diff --git a/frontend/src/lib/components/ResourceEditorDrawer.svelte b/frontend/src/lib/components/ResourceEditorDrawer.svelte index f7d06f8deb..7259fff633 100644 --- a/frontend/src/lib/components/ResourceEditorDrawer.svelte +++ b/frontend/src/lib/components/ResourceEditorDrawer.svelte @@ -28,6 +28,7 @@ workspace = undefined, disableChatOffset = false, inline = false, + onClose = undefined, onRestored = undefined, onSaved = undefined }: { @@ -39,6 +40,8 @@ * that gives the editor a whole pane. Saving and restoring then leave it open: the * host remounts it on what was written. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void onRestored?: () => void /** Fires after Save has written, for a caller showing state derived from the * resource — `onRestored` only covers restoring an old version. `path` is where the @@ -163,9 +166,9 @@ drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet titleExtra()} {#if mode == 'new' && resource_type} diff --git a/frontend/src/lib/components/VariableEditor.svelte b/frontend/src/lib/components/VariableEditor.svelte index f6f9adf454..4808b113a3 100644 --- a/frontend/src/lib/components/VariableEditor.svelte +++ b/frontend/src/lib/components/VariableEditor.svelte @@ -44,12 +44,15 @@ let { workspace = undefined, inline = false, + onClose = undefined, onSaved = undefined }: { workspace?: string /** Render in place, filling the parent, with no drawer or close button — for a host * that gives the editor a whole pane. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void /** Fires once a save lands, with the path the variable now lives at in `workspace` — * not in the workspace-specific version selected, which can be another's. */ onSaved?: (path: string) => void @@ -340,9 +343,9 @@ drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet banner()} + {:else if item.kind === 'resource'} { if (path !== undefined) onSaved(path) }} @@ -157,6 +164,7 @@ bind:this={triggerEditor} useDrawer inline + onClose={closeTab} onUpdate={(path?: string) => onSaved(path)} /> {/await} diff --git a/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte index 191c935f89..37c9bde8d3 100644 --- a/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/amqp/AmqpTriggerEditorInner.svelte @@ -48,6 +48,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -67,6 +69,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -406,7 +409,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsSnippet()} diff --git a/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte index c1eacc632d..40faa8f2d4 100644 --- a/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte @@ -85,6 +85,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -103,6 +104,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -363,7 +366,7 @@ {#snippet drawerBody()} (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsButtons()} diff --git a/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte index 563f40f40b..9ef5024e6a 100644 --- a/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte @@ -46,6 +46,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, hideTarget = false, description = undefined, isEditor = false, @@ -499,7 +500,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render saveButton()} diff --git a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte index 7dc7f7bddd..fc897ddc09 100644 --- a/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte @@ -95,6 +95,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -113,6 +114,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -418,7 +421,7 @@ {#snippet drawerBody()} (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsButtons()} diff --git a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte index afb3f07780..d4f2347358 100644 --- a/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte +++ b/frontend/src/lib/components/triggers/http/RouteEditorInner.svelte @@ -85,6 +85,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, hideTarget = false, description = undefined, isEditor = false, @@ -1069,11 +1070,11 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render saveButton()} diff --git a/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte index 008bcaa3c8..3c31dd4486 100644 --- a/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte @@ -46,6 +46,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -65,6 +67,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -430,7 +433,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsButtons('sm')} diff --git a/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte index 17a15e3a99..c1ec513d2d 100644 --- a/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte @@ -55,6 +55,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -74,6 +76,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -404,7 +407,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsSnippet()} diff --git a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte index 5f697db95e..a5e268aff1 100644 --- a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte @@ -41,6 +41,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -61,6 +63,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -401,7 +404,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsSnippet()} diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte index 80c39f026d..971e05e3d2 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte @@ -63,6 +63,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean isEditor?: boolean @@ -82,6 +84,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, isEditor = false, @@ -585,7 +588,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()}{@render actionsSnippet()}{/snippet} {#snippet banner()} diff --git a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte index 54f4b6587e..a6a6b5e7a8 100644 --- a/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte +++ b/frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte @@ -56,6 +56,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, hideTarget = false, docDescription = undefined, allowDraft = false, @@ -1425,7 +1426,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()}
diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte index c03ee7540c..17aa3ab467 100644 --- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte @@ -47,6 +47,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -66,6 +68,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -383,7 +386,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsSnippet()} diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte index 0a4daf82da..e813fe26f0 100644 --- a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte @@ -63,6 +63,8 @@ useDrawer?: boolean /** With `useDrawer`, render the drawer's content in place, filling the parent, with no drawer or close button. */ inline?: boolean + /** With `inline`, closes whatever hosts the editor; the header has a close button only when set. */ + onClose?: () => void description?: Snippet | undefined hideTarget?: boolean hideTooltips?: boolean @@ -83,6 +85,7 @@ let { useDrawer = true, inline = false, + onClose = undefined, description = undefined, hideTarget = false, hideTooltips = false, @@ -474,7 +477,7 @@ {#snippet drawerBody()} drawer?.closeDrawer()} + on:close={() => (inline ? onClose?.() : drawer?.closeDrawer())} > {#snippet actions()} {@render actionsButtons()}