From 802cb42684e53a0c6a99060f5898ce29b7ef4e5f Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Tue, 9 Dec 2025 01:04:42 +0000 Subject: [PATCH 1/7] feat: Add cmd+enter to submit tasks immediately MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements cmd+enter (Mac) / ctrl+enter (Windows/Linux) keyboard shortcut for submitting new tasks on the tasks page. Regular enter still creates a new line in the textarea. Fixes #21179 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .../src/modules/tasks/TaskPrompt/TaskPrompt.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 963afaeb61c54..0609639b1202e 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -468,10 +468,27 @@ const PromptTextarea: FC = ({ isSubmitting, ...props }) => { + const handleKeyDown = (e: React.KeyboardEvent) => { + // Submit form on Cmd+Enter (Mac) or Ctrl+Enter (Windows/Linux) + if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + // Trigger form submission by finding the closest form and submitting it + const form = e.currentTarget.closest("form"); + if (form) { + form.requestSubmit(); + } + } + // Call the original onKeyDown if it exists + if (props.onKeyDown) { + props.onKeyDown(e); + } + }; + return (
Date: Tue, 9 Dec 2025 23:00:54 +0000 Subject: [PATCH 2/7] refactor: pass onSubmit as prop instead of using closest As suggested by @aslilac, pass the onSubmit handler directly as a prop rather than querying the DOM with closest('form'). This is more idiomatic React and keeps the logic within React's declarative paradigm. --- site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 0609639b1202e..3c2b77b27a88a 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -259,6 +259,7 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { onChange={(e) => setPrompt(e.target.value)} readOnly={isPromptReadOnly} isSubmitting={createTaskMutation.isPending} + onFormSubmit={onSubmit} />
@@ -462,20 +463,20 @@ async function createTaskWithLatestTemplateVersion( type PromptTextareaProps = TextareaAutosizeProps & { isSubmitting?: boolean; + onFormSubmit?: (e: React.FormEvent) => void; }; const PromptTextarea: FC = ({ isSubmitting, + onFormSubmit, ...props }) => { const handleKeyDown = (e: React.KeyboardEvent) => { // Submit form on Cmd+Enter (Mac) or Ctrl+Enter (Windows/Linux) if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); - // Trigger form submission by finding the closest form and submitting it - const form = e.currentTarget.closest("form"); - if (form) { - form.requestSubmit(); + if (onFormSubmit) { + onFormSubmit(e as unknown as React.FormEvent); } } // Call the original onKeyDown if it exists From 4570bef89128129340431277ead8119e6ac0ea74 Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Wed, 10 Dec 2025 14:57:28 +0000 Subject: [PATCH 3/7] fix: use SyntheticEvent for onFormSubmit to avoid type cast --- site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 3c2b77b27a88a..e6eb7da1f5a55 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -463,7 +463,7 @@ async function createTaskWithLatestTemplateVersion( type PromptTextareaProps = TextareaAutosizeProps & { isSubmitting?: boolean; - onFormSubmit?: (e: React.FormEvent) => void; + onFormSubmit?: (e: React.SyntheticEvent) => void; }; const PromptTextarea: FC = ({ @@ -476,7 +476,7 @@ const PromptTextarea: FC = ({ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); if (onFormSubmit) { - onFormSubmit(e as unknown as React.FormEvent); + onFormSubmit(e); } } // Call the original onKeyDown if it exists From c0490b40307cebca7ba95a64584f769e4f8ac03d Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Wed, 10 Dec 2025 14:59:10 +0000 Subject: [PATCH 4/7] fix: update onSubmit to accept SyntheticEvent --- site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index e6eb7da1f5a55..0ec92abdfc905 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -216,7 +216,7 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { }, }); - const onSubmit = async (e: React.FormEvent) => { + const onSubmit = async (e: React.SyntheticEvent) => { e.preventDefault(); try { From f985e91c7c4fad0c07b1abdf222f14295deabf76 Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Wed, 10 Dec 2025 18:12:14 +0000 Subject: [PATCH 5/7] refactor: move keyboard shortcut to parent via onKeyDown prop - Remove custom onFormSubmit prop from PromptTextarea - Remove duplicate e.preventDefault() call - Use existing onKeyDown prop from TextareaAutosizeProps - Submit form via form.requestSubmit() instead of calling handler directly --- .../modules/tasks/TaskPrompt/TaskPrompt.tsx | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 0ec92abdfc905..139fe6a43dfd0 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -216,7 +216,7 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { }, }); - const onSubmit = async (e: React.SyntheticEvent) => { + const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { @@ -231,6 +231,18 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { } }; + const handleKeyDown = (e: React.KeyboardEvent) => { + // Submit form on Cmd+Enter (Mac) or Ctrl+Enter (Windows/Linux) + if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + // Get the form element and submit it + const form = e.currentTarget.form; + if (form) { + form.requestSubmit(); + } + } + }; + return (
= ({ templates, onSuccess }) => { onChange={(e) => setPrompt(e.target.value)} readOnly={isPromptReadOnly} isSubmitting={createTaskMutation.isPending} - onFormSubmit={onSubmit} + onKeyDown={handleKeyDown} />
@@ -463,33 +475,16 @@ async function createTaskWithLatestTemplateVersion( type PromptTextareaProps = TextareaAutosizeProps & { isSubmitting?: boolean; - onFormSubmit?: (e: React.SyntheticEvent) => void; }; const PromptTextarea: FC = ({ isSubmitting, - onFormSubmit, ...props }) => { - const handleKeyDown = (e: React.KeyboardEvent) => { - // Submit form on Cmd+Enter (Mac) or Ctrl+Enter (Windows/Linux) - if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { - e.preventDefault(); - if (onFormSubmit) { - onFormSubmit(e); - } - } - // Call the original onKeyDown if it exists - if (props.onKeyDown) { - props.onKeyDown(e); - } - }; - return (
Date: Wed, 10 Dec 2025 18:27:13 +0000 Subject: [PATCH 6/7] fix: call onSubmit directly instead of form.requestSubmit() --- site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 139fe6a43dfd0..7b79f4dca86e6 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -216,7 +216,7 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { }, }); - const onSubmit = async (e: React.FormEvent) => { + const onSubmit = async (e: React.SyntheticEvent) => { e.preventDefault(); try { @@ -235,11 +235,7 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { // Submit form on Cmd+Enter (Mac) or Ctrl+Enter (Windows/Linux) if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); - // Get the form element and submit it - const form = e.currentTarget.form; - if (form) { - form.requestSubmit(); - } + onSubmit(e); } }; From 852663e36d23d80f4915a2113bc57d5b2f261ce6 Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Wed, 10 Dec 2025 19:48:46 +0000 Subject: [PATCH 7/7] remove preventDefault --- site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 7b79f4dca86e6..97eda8895529a 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -234,7 +234,6 @@ const CreateTaskForm: FC = ({ templates, onSuccess }) => { const handleKeyDown = (e: React.KeyboardEvent) => { // Submit form on Cmd+Enter (Mac) or Ctrl+Enter (Windows/Linux) if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { - e.preventDefault(); onSubmit(e); } };