From 02ce977ddb469b8200b7aa11b9a9d37a584edfc5 Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Thu, 10 Jul 2025 09:20:42 +0200 Subject: [PATCH 01/12] wip --- assets/js/hooks/KeyHandlers.ts | 48 ++++++++++++++++++++ assets/js/hooks/index.ts | 2 + lib/lightning_web/live/workflow_live/edit.ex | 1 + 3 files changed, 51 insertions(+) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index 750434dffa..f2e18fec09 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -126,6 +126,11 @@ function createKeyCombinationHook( ): PhoenixHook { return { mounted() { + // Debug logging for OpenRunPanelViaCtrlEnter hook + if (action === openRunPanelAction) { + console.log('🔧 OpenRunPanelViaCtrlEnter hook mounted successfully!'); + } + const handler = { hook: this, keyCheck, action, priority, bindingScope }; keyHandlers.add(handler); @@ -134,6 +139,11 @@ function createKeyCombinationHook( this.callback = (e: KeyboardEvent) => { if (!keyCheck(e)) return; + // Debug logging for Ctrl+Enter + if (action === openRunPanelAction && keyCheck === isCtrlOrMetaEnter) { + console.log('⌨️ Ctrl+Enter detected by OpenRunPanelViaCtrlEnter hook'); + } + e.preventDefault(); const target = e.target as HTMLElement; @@ -366,3 +376,41 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( closeAction, PRIORITY.NORMAL ); + +/** + * Navigates to the run panel by clicking the existing run button. + * + * @param e - The keyboard event that triggered the action. + * @param el - The DOM element associated with the hook. + */ +const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { + console.log('🚀 OpenRunPanelViaCtrlEnter action triggered!'); + + // Find the existing run button and click it + const runButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLAnchorElement; + console.log('🔍 Found run button:', runButton); + + if (runButton) { + console.log('✅ Clicking run button with href:', runButton.href); + runButton.click(); + } else { + console.log('❌ No run button found'); + // Let's also check for other run-related buttons + const allRunButtons = document.querySelectorAll('a[href*="workflow_input"], button[type="button"]'); + console.log('📋 All potential run buttons:', allRunButtons); + } +}; + +/** + * Hook to open the Run panel when "Ctrl+Enter" (or "Cmd+Enter" on macOS) is pressed. + * + * This hook listens globally and navigates to the run panel URL, which opens the + * workflow input interface for running the workflow. + * + * Priority: `PRIORITY.HIGH`, ensuring it takes precedence over the default run handlers. + */ +export const OpenRunPanelViaCtrlEnter = createKeyCombinationHook( + isCtrlOrMetaEnter, + openRunPanelAction, + PRIORITY.HIGH +); diff --git a/assets/js/hooks/index.ts b/assets/js/hooks/index.ts index 8ee654e8af..149798c0f2 100644 --- a/assets/js/hooks/index.ts +++ b/assets/js/hooks/index.ts @@ -19,6 +19,7 @@ import { SaveViaCtrlS, InspectorSaveViaCtrlS, OpenSyncModalViaCtrlShiftS, + OpenRunPanelViaCtrlEnter, SendMessageViaCtrlEnter, DefaultRunViaCtrlEnter, AltRunViaCtrlShiftEnter, @@ -40,6 +41,7 @@ export { SaveViaCtrlS, InspectorSaveViaCtrlS, OpenSyncModalViaCtrlShiftS, + OpenRunPanelViaCtrlEnter, SendMessageViaCtrlEnter, DefaultRunViaCtrlEnter, AltRunViaCtrlShiftEnter, diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index a9c3af2d34..77d2da6503 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -215,6 +215,7 @@ defmodule LightningWeb.WorkflowLive.Edit do
<.selected_template_label :if={@selected_template && @show_new_workflow_panel} From fc3e65f93a525794b7d20a3d8bc4c9c0fcdb5a72 Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Thu, 10 Jul 2025 09:36:20 +0200 Subject: [PATCH 02/12] 2 --- assets/js/hooks/KeyHandlers.ts | 62 +++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index f2e18fec09..48b09cbabd 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -126,11 +126,6 @@ function createKeyCombinationHook( ): PhoenixHook { return { mounted() { - // Debug logging for OpenRunPanelViaCtrlEnter hook - if (action === openRunPanelAction) { - console.log('🔧 OpenRunPanelViaCtrlEnter hook mounted successfully!'); - } - const handler = { hook: this, keyCheck, action, priority, bindingScope }; keyHandlers.add(handler); @@ -139,11 +134,6 @@ function createKeyCombinationHook( this.callback = (e: KeyboardEvent) => { if (!keyCheck(e)) return; - // Debug logging for Ctrl+Enter - if (action === openRunPanelAction && keyCheck === isCtrlOrMetaEnter) { - console.log('⌨️ Ctrl+Enter detected by OpenRunPanelViaCtrlEnter hook'); - } - e.preventDefault(); const target = e.target as HTMLElement; @@ -378,26 +368,52 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( ); /** - * Navigates to the run panel by clicking the existing run button. + * Handles Ctrl+Enter to either open run panel or execute workflow. * * @param e - The keyboard event that triggered the action. * @param el - The DOM element associated with the hook. */ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { - console.log('🚀 OpenRunPanelViaCtrlEnter action triggered!'); + // Check if run panel is already open by looking at the URL + const isRunPanelOpen = window.location.href.includes('m=workflow_input'); - // Find the existing run button and click it - const runButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLAnchorElement; - console.log('🔍 Found run button:', runButton); - - if (runButton) { - console.log('✅ Clicking run button with href:', runButton.href); - runButton.click(); + if (isRunPanelOpen) { + // Panel is open, try to click the "Run Workflow Now" button + // Look for various possible selectors for the run button + const selectors = [ + 'button[type="submit"][form*="manual_run"]', + 'button[id*="save-and-run"]', + 'button[phx-click*="manual_run"]', + 'input[type="submit"][form*="manual"]' + ]; + + let foundButton: HTMLElement | null = null; + + // Try CSS selectors first + for (const selector of selectors) { + const element = document.querySelector(selector) as HTMLElement; + if (element && !element.hasAttribute('disabled')) { + foundButton = element; + break; + } + } + + // If no specific selector worked, search for buttons containing "Run" + if (!foundButton) { + const buttons = document.querySelectorAll('button, input[type="submit"]'); + foundButton = Array.from(buttons).find(btn => { + const text = btn.textContent?.toLowerCase() || ''; + return text.includes('run') && !btn.hasAttribute('disabled'); + }) as HTMLElement | undefined || null; + } + + if (foundButton) { + foundButton.click(); + } } else { - console.log('❌ No run button found'); - // Let's also check for other run-related buttons - const allRunButtons = document.querySelectorAll('a[href*="workflow_input"], button[type="button"]'); - console.log('📋 All potential run buttons:', allRunButtons); + // Panel is not open, open it by clicking the run link + const runButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLAnchorElement; + runButton?.click(); } }; From 1b719f954bc08f4cd3dd87b6abec9bd63ae38ab5 Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Thu, 10 Jul 2025 09:59:31 +0200 Subject: [PATCH 03/12] format --- assets/js/hooks/KeyHandlers.ts | 15 ++++++++++++--- lib/lightning_web/live/workflow_live/edit.ex | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index 48b09cbabd..8f183c4aca 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -411,9 +411,18 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { foundButton.click(); } } else { - // Panel is not open, open it by clicking the run link - const runButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLAnchorElement; - runButton?.click(); + // Check if a step is already selected by looking at the URL + const isStepSelected = window.location.href.includes('s='); + + if (isStepSelected) { + // Step is selected, click the "Run" button on the step panel + const stepRunButton = document.querySelector('[id^="run-from-step-"]') as HTMLAnchorElement; + stepRunButton?.click(); + } else { + // No step selected, open it by clicking the run link + const runButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLAnchorElement; + runButton?.click(); + } } }; diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index 77d2da6503..afd8cbbc4b 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -506,6 +506,7 @@ defmodule LightningWeb.WorkflowLive.Edit do patch={"#{@base_url}?s=#{@selected_job.id}&m=workflow_input"} type="button" theme="primary" + id={"run-from-step-#{@selected_job.id}"} > Run From 4d3d316ee5eb194df8960b7c1e3fb9aaafe4e603 Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Thu, 10 Jul 2025 11:27:33 +0200 Subject: [PATCH 04/12] limit scope to preserve previous command-enter keystroke for Inspector --- assets/js/hooks/KeyHandlers.ts | 8 +- lib/lightning_web/live/workflow_live/edit.ex | 4 +- .../live/workflow_live/edit_test.exs | 76 +++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index 8f183c4aca..2dffc257fd 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -429,13 +429,15 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { /** * Hook to open the Run panel when "Ctrl+Enter" (or "Cmd+Enter" on macOS) is pressed. * - * This hook listens globally and navigates to the run panel URL, which opens the + * This hook is scoped to the workflow editor and navigates to the run panel URL, which opens the * workflow input interface for running the workflow. * - * Priority: `PRIORITY.HIGH`, ensuring it takes precedence over the default run handlers. + * Priority: `PRIORITY.HIGH` within its scope, ensuring it takes precedence over other handlers in the workflow editor. + * Scope: `"workflow-editor"`, meaning this hook only applies within the workflow editor context. */ export const OpenRunPanelViaCtrlEnter = createKeyCombinationHook( isCtrlOrMetaEnter, openRunPanelAction, - PRIORITY.HIGH + PRIORITY.HIGH, + 'workflow-editor' ); diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index afd8cbbc4b..32d1ec67c6 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -213,9 +213,11 @@ defmodule LightningWeb.WorkflowLive.Edit do class="transition-all duration-300 ease-in-out" />
<.selected_template_label :if={@selected_template && @show_new_workflow_panel} diff --git a/test/lightning_web/live/workflow_live/edit_test.exs b/test/lightning_web/live/workflow_live/edit_test.exs index 46600c1add..37521f0628 100644 --- a/test/lightning_web/live/workflow_live/edit_test.exs +++ b/test/lightning_web/live/workflow_live/edit_test.exs @@ -3580,6 +3580,82 @@ defmodule LightningWeb.WorkflowLive.EditTest do end end + describe "keyboard shortcuts" do + setup %{project: project} do + workflow = + insert(:simple_workflow, project: project) + |> with_snapshot() + {:ok, workflow: workflow} + end + + test "OpenRunPanelViaCtrlEnter hook is attached to workflow editor", %{ + conn: conn, + project: project, + workflow: workflow + } do + {:ok, view, _html} = + live( + conn, + ~p"/projects/#{project.id}/w/#{workflow.id}", + on_error: :raise + ) + + # Check that the OpenRunPanelViaCtrlEnter hook is present on the workflow container + workflow_container = view |> element("#workflow-edit-#{workflow.id}") + assert has_element?(workflow_container) + assert render(workflow_container) =~ "phx-hook=\"OpenRunPanelViaCtrlEnter\"" + assert render(workflow_container) =~ "data-keybinding-scope=\"workflow-editor\"" + end + + test "OpenRunPanelViaCtrlEnter hook is present with job selected", %{ + conn: conn, + project: project, + workflow: workflow + } do + # Use the first job from the workflow that was created with snapshot + job = workflow.jobs |> List.first() + + {:ok, view, _html} = + live( + conn, + ~p"/projects/#{project.id}/w/#{workflow.id}?s=#{job.id}", + on_error: :raise + ) + + # Hook should still be present when a job is selected + workflow_container = view |> element("#workflow-edit-#{workflow.id}") + assert has_element?(workflow_container) + assert render(workflow_container) =~ "phx-hook=\"OpenRunPanelViaCtrlEnter\"" + assert render(workflow_container) =~ "data-keybinding-scope=\"workflow-editor\"" + + # Run button should be present for step-aware behavior + run_button = view |> element("#run-from-step-#{job.id}") + assert has_element?(run_button) + end + + test "OpenRunPanelViaCtrlEnter hook is present in expand mode", %{ + conn: conn, + project: project, + workflow: workflow + } do + # Use the first job from the workflow that was created with snapshot + job = workflow.jobs |> List.first() + + {:ok, view, _html} = + live( + conn, + ~p"/projects/#{project.id}/w/#{workflow.id}?s=#{job.id}&m=expand", + on_error: :raise + ) + + # Hook should be present even in expand mode + workflow_container = view |> element("#workflow-edit-#{workflow.id}") + assert has_element?(workflow_container) + assert render(workflow_container) =~ "phx-hook=\"OpenRunPanelViaCtrlEnter\"" + assert render(workflow_container) =~ "data-keybinding-scope=\"workflow-editor\"" + end + end + defp log_viewer_selected_level(log_viewer) do log_viewer |> render() From 6f5146eb290aa7bf502848d4bdea4e9fbd332ce0 Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Fri, 11 Jul 2025 15:17:14 +0200 Subject: [PATCH 05/12] mix format --- .../live/workflow_live/edit_test.exs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/test/lightning_web/live/workflow_live/edit_test.exs b/test/lightning_web/live/workflow_live/edit_test.exs index 37521f0628..329cdca240 100644 --- a/test/lightning_web/live/workflow_live/edit_test.exs +++ b/test/lightning_web/live/workflow_live/edit_test.exs @@ -3580,11 +3580,12 @@ defmodule LightningWeb.WorkflowLive.EditTest do end end - describe "keyboard shortcuts" do + describe "keyboard shortcuts" do setup %{project: project} do workflow = insert(:simple_workflow, project: project) |> with_snapshot() + {:ok, workflow: workflow} end @@ -3603,8 +3604,12 @@ defmodule LightningWeb.WorkflowLive.EditTest do # Check that the OpenRunPanelViaCtrlEnter hook is present on the workflow container workflow_container = view |> element("#workflow-edit-#{workflow.id}") assert has_element?(workflow_container) - assert render(workflow_container) =~ "phx-hook=\"OpenRunPanelViaCtrlEnter\"" - assert render(workflow_container) =~ "data-keybinding-scope=\"workflow-editor\"" + + assert render(workflow_container) =~ + "phx-hook=\"OpenRunPanelViaCtrlEnter\"" + + assert render(workflow_container) =~ + "data-keybinding-scope=\"workflow-editor\"" end test "OpenRunPanelViaCtrlEnter hook is present with job selected", %{ @@ -3625,8 +3630,12 @@ defmodule LightningWeb.WorkflowLive.EditTest do # Hook should still be present when a job is selected workflow_container = view |> element("#workflow-edit-#{workflow.id}") assert has_element?(workflow_container) - assert render(workflow_container) =~ "phx-hook=\"OpenRunPanelViaCtrlEnter\"" - assert render(workflow_container) =~ "data-keybinding-scope=\"workflow-editor\"" + + assert render(workflow_container) =~ + "phx-hook=\"OpenRunPanelViaCtrlEnter\"" + + assert render(workflow_container) =~ + "data-keybinding-scope=\"workflow-editor\"" # Run button should be present for step-aware behavior run_button = view |> element("#run-from-step-#{job.id}") @@ -3651,8 +3660,12 @@ defmodule LightningWeb.WorkflowLive.EditTest do # Hook should be present even in expand mode workflow_container = view |> element("#workflow-edit-#{workflow.id}") assert has_element?(workflow_container) - assert render(workflow_container) =~ "phx-hook=\"OpenRunPanelViaCtrlEnter\"" - assert render(workflow_container) =~ "data-keybinding-scope=\"workflow-editor\"" + + assert render(workflow_container) =~ + "phx-hook=\"OpenRunPanelViaCtrlEnter\"" + + assert render(workflow_container) =~ + "data-keybinding-scope=\"workflow-editor\"" end end From 7a7ac8973349f21a6da8b88ad294667e8d88b53d Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Fri, 11 Jul 2025 16:36:06 +0200 Subject: [PATCH 06/12] add CL --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b5467044c..2744b7099d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ and this project adheres to ### Added +- Keystrokes for `⌘+Enter` or `Ctrl+Enter` to run a workflow from the canvas + [3320](https://github.com/OpenFn/lightning/issues/3320) + ### Changed ### Fixed From 828dfaca0c610cc151849dd606fdd6e32dda160c Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Fri, 11 Jul 2025 17:37:05 +0200 Subject: [PATCH 07/12] oj --- assets/js/hooks/KeyHandlers.ts | 50 +++++++++++++------- lib/lightning_web/live/workflow_live/edit.ex | 1 + 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index 2dffc257fd..baf42c2b17 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -370,13 +370,26 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( /** * Handles Ctrl+Enter to either open run panel or execute workflow. * - * @param e - The keyboard event that triggered the action. - * @param el - The DOM element associated with the hook. + * BEHAVIOR: + * 1. If run panel is open (URL contains 'm=workflow_input'): + * → Try to click "Run Workflow Now" button using multiple selector strategies + * 2. If step is selected (URL contains 's=') but no run panel: + * → Click the step's "Run" button to open run panel for that step + * 3. If no step selected and no run panel: + * → Click main "Run" link to open run panel from workflow start + * + * BUTTON FINDING STRATEGY (when run panel is open): + * 1. Try specific CSS selectors for known button patterns + * 2. Fall back to text search for any button containing "run" + * 3. Only click if button is not disabled + * + * @param _e - The keyboard event (unused but required by hook signature) + * @param _el - The DOM element (unused but required by hook signature) */ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { // Check if run panel is already open by looking at the URL const isRunPanelOpen = window.location.href.includes('m=workflow_input'); - + if (isRunPanelOpen) { // Panel is open, try to click the "Run Workflow Now" button // Look for various possible selectors for the run button @@ -384,11 +397,11 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { 'button[type="submit"][form*="manual_run"]', 'button[id*="save-and-run"]', 'button[phx-click*="manual_run"]', - 'input[type="submit"][form*="manual"]' + 'input[type="submit"][form*="manual"]', ]; - + let foundButton: HTMLElement | null = null; - + // Try CSS selectors first for (const selector of selectors) { const element = document.querySelector(selector) as HTMLElement; @@ -397,30 +410,35 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { break; } } - + // If no specific selector worked, search for buttons containing "Run" if (!foundButton) { const buttons = document.querySelectorAll('button, input[type="submit"]'); - foundButton = Array.from(buttons).find(btn => { - const text = btn.textContent?.toLowerCase() || ''; - return text.includes('run') && !btn.hasAttribute('disabled'); - }) as HTMLElement | undefined || null; + foundButton = + (Array.from(buttons).find(btn => { + const text = btn.textContent?.toLowerCase() || ''; + return text.includes('run') && !btn.hasAttribute('disabled'); + }) as HTMLElement | undefined) || null; } - + if (foundButton) { foundButton.click(); } } else { // Check if a step is already selected by looking at the URL const isStepSelected = window.location.href.includes('s='); - + if (isStepSelected) { // Step is selected, click the "Run" button on the step panel - const stepRunButton = document.querySelector('[id^="run-from-step-"]') as HTMLAnchorElement; + const stepRunButton = document.querySelector( + '[id^="run-from-step-"]' + ) as HTMLAnchorElement; stepRunButton?.click(); } else { // No step selected, open it by clicking the run link - const runButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLAnchorElement; + const runButton = document.querySelector( + 'a[href*="m=workflow_input"]' + ) as HTMLAnchorElement; runButton?.click(); } } @@ -429,7 +447,7 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { /** * Hook to open the Run panel when "Ctrl+Enter" (or "Cmd+Enter" on macOS) is pressed. * - * This hook is scoped to the workflow editor and navigates to the run panel URL, which opens the + * This hook is scoped to the workflow editor and navigates to the run panel URL, which opens the * workflow input interface for running the workflow. * * Priority: `PRIORITY.HIGH` within its scope, ensuring it takes precedence over other handlers in the workflow editor. diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index 32d1ec67c6..ae75c4e390 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -218,6 +218,7 @@ defmodule LightningWeb.WorkflowLive.Edit do phx-hook="OpenRunPanelViaCtrlEnter" data-keybinding-scope="workflow-editor" tabindex="0" + phx-mounted={JS.focus()} > <.selected_template_label :if={@selected_template && @show_new_workflow_panel} From ee31c6c49f20a3e71bcf32be51d07f42a1adc9d6 Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Fri, 11 Jul 2025 17:54:06 +0200 Subject: [PATCH 08/12] smoother keyhandlers --- assets/js/hooks/KeyHandlers.ts | 5 +++-- lib/lightning_web/live/workflow_live/edit.ex | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index baf42c2b17..ecc90de0cb 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -371,7 +371,7 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( * Handles Ctrl+Enter to either open run panel or execute workflow. * * BEHAVIOR: - * 1. If run panel is open (URL contains 'm=workflow_input'): + * 1. If run panel is open (URL contains 'm=workflow_input' or 'm=expand'): * → Try to click "Run Workflow Now" button using multiple selector strategies * 2. If step is selected (URL contains 's=') but no run panel: * → Click the step's "Run" button to open run panel for that step @@ -388,7 +388,8 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( */ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { // Check if run panel is already open by looking at the URL - const isRunPanelOpen = window.location.href.includes('m=workflow_input'); + const isRunPanelOpen = window.location.href.includes('m=workflow_input') || + window.location.href.includes('m=expand'); if (isRunPanelOpen) { // Panel is open, try to click the "Run Workflow Now" button diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index ae75c4e390..89c49d8aa9 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -229,13 +229,17 @@ defmodule LightningWeb.WorkflowLive.Edit do
JS.focus(to: "#workflow-edit-#{@workflow.id}")} + data-keybinding-scope="workflow-editor" + tabindex="0" + phx-hook="AutoFocusOnMount" > Date: Sat, 12 Jul 2025 09:38:18 +0200 Subject: [PATCH 09/12] Add IDs --- assets/js/hooks/KeyHandlers.ts | 107 ++++++++----------- assets/js/panel/panels/WorkflowRunPanel.tsx | 1 + lib/lightning_web/live/workflow_live/edit.ex | 4 +- 3 files changed, 49 insertions(+), 63 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index ecc90de0cb..a45b0751e7 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -370,77 +370,60 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( /** * Handles Ctrl+Enter to either open run panel or execute workflow. * - * BEHAVIOR: - * 1. If run panel is open (URL contains 'm=workflow_input' or 'm=expand'): - * → Try to click "Run Workflow Now" button using multiple selector strategies - * 2. If step is selected (URL contains 's=') but no run panel: - * → Click the step's "Run" button to open run panel for that step - * 3. If no step selected and no run panel: + * BEHAVIOR (based purely on URL state): + * 1a. If in inspector (URL contains 'm=expand'): + * → Click #save-and-run button to execute the workflow + * 1b. If in run panel (URL contains 'm=workflow_input'): + * → Click "Run Workflow Now" button to execute the workflow + * 2. If step selected but not in panel (URL contains 's=' but no 'm='): + * → Navigate to run panel while preserving step selection in URL + * 3. If no step selected and no panel: * → Click main "Run" link to open run panel from workflow start * - * BUTTON FINDING STRATEGY (when run panel is open): - * 1. Try specific CSS selectors for known button patterns - * 2. Fall back to text search for any button containing "run" - * 3. Only click if button is not disabled - * * @param _e - The keyboard event (unused but required by hook signature) * @param _el - The DOM element (unused but required by hook signature) */ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { - // Check if run panel is already open by looking at the URL - const isRunPanelOpen = window.location.href.includes('m=workflow_input') || - window.location.href.includes('m=expand'); - - if (isRunPanelOpen) { - // Panel is open, try to click the "Run Workflow Now" button - // Look for various possible selectors for the run button - const selectors = [ - 'button[type="submit"][form*="manual_run"]', - 'button[id*="save-and-run"]', - 'button[phx-click*="manual_run"]', - 'input[type="submit"][form*="manual"]', - ]; - - let foundButton: HTMLElement | null = null; - - // Try CSS selectors first - for (const selector of selectors) { - const element = document.querySelector(selector) as HTMLElement; - if (element && !element.hasAttribute('disabled')) { - foundButton = element; - break; - } - } - - // If no specific selector worked, search for buttons containing "Run" - if (!foundButton) { - const buttons = document.querySelectorAll('button, input[type="submit"]'); - foundButton = - (Array.from(buttons).find(btn => { - const text = btn.textContent?.toLowerCase() || ''; - return text.includes('run') && !btn.hasAttribute('disabled'); - }) as HTMLElement | undefined) || null; + const url = window.location.href; + + // Parse URL state + const hasStepSelected = url.includes('s='); + const isInInspector = url.includes('m=expand'); + const isInRunPanel = url.includes('m=workflow_input'); + + if (isInInspector) { + // Inspector mode - look for the save-and-run button + const runButton = document.querySelector('#save-and-run:not([disabled])') as HTMLElement; + if (runButton) { + runButton.click(); } - - if (foundButton) { - foundButton.click(); + } else if (isInRunPanel) { + // Run panel mode - look for "Run Workflow Now" button or form submission + const runButton = Array.from(document.querySelectorAll('button')).find(btn => + btn.textContent?.includes('Run Workflow Now') + ) as HTMLElement; + + if (runButton && !runButton.hasAttribute('disabled')) { + runButton.click(); + } else { + // Fallback: try to submit manual run form + const form = document.querySelector('form[id*="manual_run"]'); + if (form) { + const submitEvent = new Event('submit', { bubbles: true, cancelable: true }); + form.dispatchEvent(submitEvent); + } } + } else if (hasStepSelected) { + // Step selected but not in panel - navigate to run panel while preserving step selection + const currentUrl = new URL(window.location.href); + currentUrl.searchParams.set('m', 'workflow_input'); + // Keep the existing 's=' parameter to preserve step selection + window.location.href = currentUrl.toString(); } else { - // Check if a step is already selected by looking at the URL - const isStepSelected = window.location.href.includes('s='); - - if (isStepSelected) { - // Step is selected, click the "Run" button on the step panel - const stepRunButton = document.querySelector( - '[id^="run-from-step-"]' - ) as HTMLAnchorElement; - stepRunButton?.click(); - } else { - // No step selected, open it by clicking the run link - const runButton = document.querySelector( - 'a[href*="m=workflow_input"]' - ) as HTMLAnchorElement; - runButton?.click(); + // No step selected - open main run panel + const mainRunButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLElement; + if (mainRunButton) { + mainRunButton.click(); } } }; diff --git a/assets/js/panel/panels/WorkflowRunPanel.tsx b/assets/js/panel/panels/WorkflowRunPanel.tsx index ccd476455a..452fb03814 100644 --- a/assets/js/panel/panels/WorkflowRunPanel.tsx +++ b/assets/js/panel/panels/WorkflowRunPanel.tsx @@ -65,6 +65,7 @@ export const WorkflowRunPanel: WithActionProps = (props) => { className="rounded-md text-sm font-semibold shadow-xs phx-submit-loading:opacity-75 bg-primary-600 hover:bg-primary-500 text-white disabled:bg-primary-300 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-600 px-3 py-2 flex items-center gap-1" disabled={is_edge ? true : runDisabled} onClick={startRun} + id="run-from-input-selector" > Run Workflow Now diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index 89c49d8aa9..f944c0f0da 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -236,7 +236,7 @@ defmodule LightningWeb.WorkflowLive.Edit do "bg-white inset-0 z-30 overflow-hidden drop-shadow-[0_35px_35px_rgba(0,0,0,0.25)] focus:outline-none" ]} phx-mounted={fade_in()} - phx-remove={fade_out() |> JS.focus(to: "#workflow-edit-#{@workflow.id}")} + phx-remove={fade_out()} data-keybinding-scope="workflow-editor" tabindex="0" phx-hook="AutoFocusOnMount" @@ -599,6 +599,7 @@ defmodule LightningWeb.WorkflowLive.Edit do patch={"#{@base_url}?s=#{@selected_trigger.id}&m=workflow_input"} type="button" theme="primary" + id="run-from-trigger" > <.icon name="hero-play-solid" class="w-4 h-4" /> Run @@ -3172,6 +3173,7 @@ defmodule LightningWeb.WorkflowLive.Edit do patch={"#{@base_url}?s=#{@trigger_id}&m=workflow_input"} type="button" theme="primary" + id="run-from-top" > Run From 38e19a2feffc58376dfeec4e78b7515e5bb3679c Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Sat, 12 Jul 2025 09:49:37 +0200 Subject: [PATCH 10/12] use ID --- assets/js/hooks/KeyHandlers.ts | 73 ++++++++++---------- lib/lightning_web/live/workflow_live/edit.ex | 2 +- 2 files changed, 36 insertions(+), 39 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index a45b0751e7..080dc931dd 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -139,7 +139,7 @@ function createKeyCombinationHook( const target = e.target as HTMLElement; const focusedScope = target - ?.closest('[data-keybinding-scope]') + .closest('[data-keybinding-scope]') ?.getAttribute('data-keybinding-scope') || null; const keyMatchingHandlers = Array.from(keyHandlers).filter(h => @@ -259,10 +259,12 @@ const submitAction = (_e: KeyboardEvent, el: HTMLElement) => { /** * Simulates a "close" action, used to close modals, panels, or other UI components. * - * @param e - The keyboard event that triggered the action. + * @param _e - The keyboard event that triggered the action. * @param el - The DOM element associated with the hook. */ -const closeAction = (_e: KeyboardEvent, el: HTMLElement) => el.click(); +const closeAction = (_e: KeyboardEvent, el: HTMLElement) => { + el.click(); +}; /** * Hook to trigger a form submission when "Ctrl+S" (or "Cmd+S" on macOS) is pressed. @@ -368,17 +370,17 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( ); /** - * Handles Ctrl+Enter to either open run panel or execute workflow. - * - * BEHAVIOR (based purely on URL state): - * 1a. If in inspector (URL contains 'm=expand'): - * → Click #save-and-run button to execute the workflow - * 1b. If in run panel (URL contains 'm=workflow_input'): - * → Click "Run Workflow Now" button to execute the workflow - * 2. If step selected but not in panel (URL contains 's=' but no 'm='): - * → Navigate to run panel while preserving step selection in URL - * 3. If no step selected and no panel: - * → Click main "Run" link to open run panel from workflow start + * Handles Ctrl+Enter to directly click the appropriate run button based on URL state. + * + * BEHAVIOR (based purely on URL state): + * 1. If in inspector (URL contains 'm=expand'): + * → Click #save-and-run button to execute the workflow + * 2. If in run panel (URL contains 'm=workflow_input'): + * → Click #run-from-input-selector button to execute the workflow + * 3. If step selected but not in inspector (URL contains 's=' but no 'm=expand'): + * → Click #run-from-step or #run-from-trigger button based on what's available + * 4. If no step selected and no panel: + * → Click #run-from-top button to open run panel from workflow start * * @param _e - The keyboard event (unused but required by hook signature) * @param _el - The DOM element (unused but required by hook signature) @@ -392,37 +394,32 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { const isInRunPanel = url.includes('m=workflow_input'); if (isInInspector) { - // Inspector mode - look for the save-and-run button - const runButton = document.querySelector('#save-and-run:not([disabled])') as HTMLElement; - if (runButton) { + // Inspector mode - click the save-and-run button + const runButton = document.querySelector('#save-and-run:not([disabled])'); + if (runButton instanceof HTMLElement) { runButton.click(); } } else if (isInRunPanel) { - // Run panel mode - look for "Run Workflow Now" button or form submission - const runButton = Array.from(document.querySelectorAll('button')).find(btn => - btn.textContent?.includes('Run Workflow Now') - ) as HTMLElement; - - if (runButton && !runButton.hasAttribute('disabled')) { + // Run panel mode - click the run-from-input-selector button + const runButton = document.querySelector('#run-from-input-selector:not([disabled])'); + if (runButton instanceof HTMLElement) { runButton.click(); - } else { - // Fallback: try to submit manual run form - const form = document.querySelector('form[id*="manual_run"]'); - if (form) { - const submitEvent = new Event('submit', { bubbles: true, cancelable: true }); - form.dispatchEvent(submitEvent); - } } } else if (hasStepSelected) { - // Step selected but not in panel - navigate to run panel while preserving step selection - const currentUrl = new URL(window.location.href); - currentUrl.searchParams.set('m', 'workflow_input'); - // Keep the existing 's=' parameter to preserve step selection - window.location.href = currentUrl.toString(); + // Step selected but not in inspector - click the appropriate run button + const runFromStepButton = document.querySelector('#run-from-step:not([disabled])'); + const runFromTriggerButton = document.querySelector('#run-from-trigger:not([disabled])'); + + // Prefer run-from-step if available, otherwise run-from-trigger + if (runFromStepButton instanceof HTMLElement) { + runFromStepButton.click(); + } else if (runFromTriggerButton instanceof HTMLElement) { + runFromTriggerButton.click(); + } } else { - // No step selected - open main run panel - const mainRunButton = document.querySelector('a[href*="m=workflow_input"]') as HTMLElement; - if (mainRunButton) { + // No step selected - click the main run button + const mainRunButton = document.querySelector('#run-from-top:not([disabled])'); + if (mainRunButton instanceof HTMLElement) { mainRunButton.click(); } } diff --git a/lib/lightning_web/live/workflow_live/edit.ex b/lib/lightning_web/live/workflow_live/edit.ex index f944c0f0da..bdd2237803 100644 --- a/lib/lightning_web/live/workflow_live/edit.ex +++ b/lib/lightning_web/live/workflow_live/edit.ex @@ -513,7 +513,7 @@ defmodule LightningWeb.WorkflowLive.Edit do patch={"#{@base_url}?s=#{@selected_job.id}&m=workflow_input"} type="button" theme="primary" - id={"run-from-step-#{@selected_job.id}"} + id={"run-from-step"} > Run From c392ea99e4a1b6dd462d1c5e58e5b53df7ff474b Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Sat, 12 Jul 2025 09:57:00 +0200 Subject: [PATCH 11/12] altered --- assets/js/hooks/KeyHandlers.ts | 36 ++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index 080dc931dd..ba5d7584ac 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -388,22 +388,38 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { const url = window.location.href; + // Only work on workflow pages + if (!url.includes('/w/')) { + console.log('GlobalWorkflowRunViaCtrlEnter: Not a workflow page, ignoring'); + return; + } + + console.log('GlobalWorkflowRunViaCtrlEnter: Processing Ctrl+Enter on workflow page'); + // Parse URL state const hasStepSelected = url.includes('s='); const isInInspector = url.includes('m=expand'); const isInRunPanel = url.includes('m=workflow_input'); + console.log('GlobalWorkflowRunViaCtrlEnter: URL state:', { hasStepSelected, isInInspector, isInRunPanel }); + if (isInInspector) { // Inspector mode - click the save-and-run button const runButton = document.querySelector('#save-and-run:not([disabled])'); if (runButton instanceof HTMLElement) { + console.log('GlobalWorkflowRunViaCtrlEnter: Clicking save-and-run button'); runButton.click(); + } else { + console.log('GlobalWorkflowRunViaCtrlEnter: save-and-run button not found or disabled'); } } else if (isInRunPanel) { // Run panel mode - click the run-from-input-selector button const runButton = document.querySelector('#run-from-input-selector:not([disabled])'); if (runButton instanceof HTMLElement) { + console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-input-selector button'); runButton.click(); + } else { + console.log('GlobalWorkflowRunViaCtrlEnter: run-from-input-selector button not found or disabled'); } } else if (hasStepSelected) { // Step selected but not in inspector - click the appropriate run button @@ -412,15 +428,22 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { // Prefer run-from-step if available, otherwise run-from-trigger if (runFromStepButton instanceof HTMLElement) { + console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-step button'); runFromStepButton.click(); } else if (runFromTriggerButton instanceof HTMLElement) { + console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-trigger button'); runFromTriggerButton.click(); + } else { + console.log('GlobalWorkflowRunViaCtrlEnter: No run buttons found'); } } else { // No step selected - click the main run button const mainRunButton = document.querySelector('#run-from-top:not([disabled])'); if (mainRunButton instanceof HTMLElement) { + console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-top button'); mainRunButton.click(); + } else { + console.log('GlobalWorkflowRunViaCtrlEnter: run-from-top button not found or disabled'); } } }; @@ -435,8 +458,13 @@ const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { * Scope: `"workflow-editor"`, meaning this hook only applies within the workflow editor context. */ export const OpenRunPanelViaCtrlEnter = createKeyCombinationHook( - isCtrlOrMetaEnter, - openRunPanelAction, - PRIORITY.HIGH, - 'workflow-editor' + (e) => { + console.log('OpenRunPanelViaCtrlEnter: Key check triggered'); + return isCtrlOrMetaEnter(e); + }, + (e, el) => { + console.log('OpenRunPanelViaCtrlEnter: Action triggered'); + openRunPanelAction(e, el); + }, + PRIORITY.HIGH ); From e33d70ad28bd5d2ddae2eaa5905efacb06512c6c Mon Sep 17 00:00:00 2001 From: Taylor Downs Date: Sat, 12 Jul 2025 14:59:37 +0200 Subject: [PATCH 12/12] all but purple line :-( --- assets/js/hooks/KeyHandlers.ts | 53 +++++++++++----------------------- 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/assets/js/hooks/KeyHandlers.ts b/assets/js/hooks/KeyHandlers.ts index ba5d7584ac..45445ce6c9 100644 --- a/assets/js/hooks/KeyHandlers.ts +++ b/assets/js/hooks/KeyHandlers.ts @@ -160,7 +160,7 @@ function createKeyCombinationHook( const maxPriority = Math.max(...matchingHandlers.map(h => h.priority)); const topPriorityHandlers = matchingHandlers.filter( - h => h.priority === maxPriority + h => h.priority === maxPriority as PriorityLevel ); // Take the last handler if there are more than one with the same priority. @@ -370,7 +370,7 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( ); /** - * Handles Ctrl+Enter to directly click the appropriate run button based on URL state. + * Handles Ctrl+Enter to trigger run actions directly based on current state. * * BEHAVIOR (based purely on URL state): * 1. If in inspector (URL contains 'm=expand'): @@ -378,72 +378,52 @@ export const CloseNodePanelViaEscape = createKeyCombinationHook( * 2. If in run panel (URL contains 'm=workflow_input'): * → Click #run-from-input-selector button to execute the workflow * 3. If step selected but not in inspector (URL contains 's=' but no 'm=expand'): - * → Click #run-from-step or #run-from-trigger button based on what's available + * → Click the appropriate run button (#run-from-step or #run-from-trigger) * 4. If no step selected and no panel: - * → Click #run-from-top button to open run panel from workflow start - * - * @param _e - The keyboard event (unused but required by hook signature) - * @param _el - The DOM element (unused but required by hook signature) + * → Click #run-from-top button to run from trigger */ -const openRunPanelAction = (_e: KeyboardEvent, _el: HTMLElement) => { +const openRunPanelAction = () => { const url = window.location.href; // Only work on workflow pages if (!url.includes('/w/')) { - console.log('GlobalWorkflowRunViaCtrlEnter: Not a workflow page, ignoring'); return; } - console.log('GlobalWorkflowRunViaCtrlEnter: Processing Ctrl+Enter on workflow page'); - // Parse URL state const hasStepSelected = url.includes('s='); const isInInspector = url.includes('m=expand'); const isInRunPanel = url.includes('m=workflow_input'); - console.log('GlobalWorkflowRunViaCtrlEnter: URL state:', { hasStepSelected, isInInspector, isInRunPanel }); - if (isInInspector) { // Inspector mode - click the save-and-run button const runButton = document.querySelector('#save-and-run:not([disabled])'); if (runButton instanceof HTMLElement) { - console.log('GlobalWorkflowRunViaCtrlEnter: Clicking save-and-run button'); runButton.click(); - } else { - console.log('GlobalWorkflowRunViaCtrlEnter: save-and-run button not found or disabled'); } } else if (isInRunPanel) { // Run panel mode - click the run-from-input-selector button const runButton = document.querySelector('#run-from-input-selector:not([disabled])'); if (runButton instanceof HTMLElement) { - console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-input-selector button'); runButton.click(); - } else { - console.log('GlobalWorkflowRunViaCtrlEnter: run-from-input-selector button not found or disabled'); } } else if (hasStepSelected) { // Step selected but not in inspector - click the appropriate run button + // Try run-from-step first (for jobs), then run-from-trigger (for triggers) const runFromStepButton = document.querySelector('#run-from-step:not([disabled])'); - const runFromTriggerButton = document.querySelector('#run-from-trigger:not([disabled])'); - - // Prefer run-from-step if available, otherwise run-from-trigger if (runFromStepButton instanceof HTMLElement) { - console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-step button'); runFromStepButton.click(); - } else if (runFromTriggerButton instanceof HTMLElement) { - console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-trigger button'); - runFromTriggerButton.click(); } else { - console.log('GlobalWorkflowRunViaCtrlEnter: No run buttons found'); + const runFromTriggerButton = document.querySelector('#run-from-trigger:not([disabled])'); + if (runFromTriggerButton instanceof HTMLElement) { + runFromTriggerButton.click(); + } } } else { - // No step selected - click the main run button - const mainRunButton = document.querySelector('#run-from-top:not([disabled])'); - if (mainRunButton instanceof HTMLElement) { - console.log('GlobalWorkflowRunViaCtrlEnter: Clicking run-from-top button'); - mainRunButton.click(); - } else { - console.log('GlobalWorkflowRunViaCtrlEnter: run-from-top button not found or disabled'); + // No step selected - trigger the same navigation as the run button + const runButton = document.querySelector('#run-from-top:not([disabled])'); + if (runButton instanceof HTMLElement) { + runButton.click(); } } }; @@ -462,9 +442,10 @@ export const OpenRunPanelViaCtrlEnter = createKeyCombinationHook( console.log('OpenRunPanelViaCtrlEnter: Key check triggered'); return isCtrlOrMetaEnter(e); }, - (e, el) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (_e, _el) => { console.log('OpenRunPanelViaCtrlEnter: Action triggered'); - openRunPanelAction(e, el); + openRunPanelAction(); }, PRIORITY.HIGH );