From 37d2ebccf71258a279e4f4c872a6ccf30c688367 Mon Sep 17 00:00:00 2001 From: Krisztiaan Date: Tue, 3 Jun 2025 17:07:12 +0200 Subject: [PATCH] fix: modal forms not submitting on Enter key (#9) * fix: add type="button" to modal close buttons to fix Enter key form submission Previously, pressing Enter in modal form inputs would dismiss the modal instead of submitting the form because close buttons defaulted to type="submit". This adds explicit type="button" to all modal close buttons to ensure Enter key properly submits forms. Fixes: - New board creation via Enter key - New workspace creation via Enter key - New card creation via Enter key - New list creation via Enter key - Member invitation via Enter key - Label creation/editing via Enter key - Board URL updates via Enter key - Import boards forms via Enter key * fix: submit forms on enter key submission --------- Co-authored-by: Henry --- apps/web/src/components/FeedbackButton.tsx | 10 ++++++--- apps/web/src/components/Input.tsx | 1 + apps/web/src/components/LabelForm.tsx | 21 +++++++++++++++++-- apps/web/src/components/NewWorkspaceForm.tsx | 7 +++++++ .../views/board/components/NewCardForm.tsx | 19 ++++++++++++++++- .../views/board/components/NewListForm.tsx | 13 +++++++++++- .../board/components/UpdateBoardSlugForm.tsx | 7 +++++++ .../boards/components/ImportBoardsForm.tsx | 1 + .../views/boards/components/NewBoardForm.tsx | 18 ++++++++++++++-- .../views/card/components/NewCommentForm.tsx | 6 ++++++ .../members/components/InviteMemberForm.tsx | 18 ++++++++++++++-- 11 files changed, 110 insertions(+), 11 deletions(-) diff --git a/apps/web/src/components/FeedbackButton.tsx b/apps/web/src/components/FeedbackButton.tsx index 4495cd57..887f7de1 100644 --- a/apps/web/src/components/FeedbackButton.tsx +++ b/apps/web/src/components/FeedbackButton.tsx @@ -98,12 +98,16 @@ const FeedbackButton: React.FC = () => { onChange={(e) => { setValue("feedback", e.target.value); }} - onKeyDown={(e) => { - e.stopPropagation(); - }} value={watch("feedback")} contentEditable className="max-h-[300px] min-h-[100px]" + onKeyDown={async (e) => { + e.stopPropagation(); + if (e.key === "Enter" && e.shiftKey) { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} />
diff --git a/apps/web/src/components/Input.tsx b/apps/web/src/components/Input.tsx index d2712b2e..8a24d212 100644 --- a/apps/web/src/components/Input.tsx +++ b/apps/web/src/components/Input.tsx @@ -69,6 +69,7 @@ const Input = forwardRef( prefix && "rounded-l-none", className && className, )} + onKeyDown={onKeyDown} {...props} /> {type === "password" && ( diff --git a/apps/web/src/components/LabelForm.tsx b/apps/web/src/components/LabelForm.tsx index ef1a5496..5b2d8b41 100644 --- a/apps/web/src/components/LabelForm.tsx +++ b/apps/web/src/components/LabelForm.tsx @@ -1,5 +1,5 @@ import { Listbox, Transition } from "@headlessui/react"; -import { Fragment } from "react"; +import { Fragment, useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { HiChevronUpDown, HiXMark } from "react-icons/hi2"; @@ -103,6 +103,12 @@ export function LabelForm({ } }; + useEffect(() => { + const nameElement: HTMLElement | null = + document.querySelector("#label-name"); + if (nameElement) nameElement.focus(); + }, []); + return (
@@ -111,6 +117,7 @@ export function LabelForm({ {isEdit ? "Edit label" : "New label"}
- + { + if (e.key === "Enter") { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} + />
diff --git a/apps/web/src/views/board/components/NewCardForm.tsx b/apps/web/src/views/board/components/NewCardForm.tsx index ba76f42e..6d028e3a 100644 --- a/apps/web/src/views/board/components/NewCardForm.tsx +++ b/apps/web/src/views/board/components/NewCardForm.tsx @@ -226,6 +226,7 @@ export function NewCardForm({ New card
- + { + if (e.key === "Enter") { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} + />
setValue("description", e.target.value)} value={watch("description")} contentEditable + onKeyDown={async (e) => { + if (e.key === "Enter" && e.shiftKey) { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} />
diff --git a/apps/web/src/views/board/components/NewListForm.tsx b/apps/web/src/views/board/components/NewListForm.tsx index ec642421..b6c64693 100644 --- a/apps/web/src/views/board/components/NewListForm.tsx +++ b/apps/web/src/views/board/components/NewListForm.tsx @@ -111,6 +111,7 @@ export function NewListForm({ New list
- + { + if (e.key === "Enter") { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} + />
diff --git a/apps/web/src/views/boards/components/ImportBoardsForm.tsx b/apps/web/src/views/boards/components/ImportBoardsForm.tsx index a68c595a..d8aab5e1 100644 --- a/apps/web/src/views/boards/components/ImportBoardsForm.tsx +++ b/apps/web/src/views/boards/components/ImportBoardsForm.tsx @@ -251,6 +251,7 @@ export function ImportBoardsForm() {
- { + if (e.key === "Enter") { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} /> diff --git a/apps/web/src/views/card/components/NewCommentForm.tsx b/apps/web/src/views/card/components/NewCommentForm.tsx index b105a11b..128a1ae8 100644 --- a/apps/web/src/views/card/components/NewCommentForm.tsx +++ b/apps/web/src/views/card/components/NewCommentForm.tsx @@ -58,6 +58,12 @@ const NewCommentForm = ({ cardPublicId }: { cardPublicId: string }) => { disabled={false} onChange={(e) => setValue("comment", e.target.value)} className="block w-full border-0 bg-transparent py-1.5 text-light-900 focus-visible:outline-none dark:text-dark-1000 sm:text-sm sm:leading-6" + onKeyDown={async (e) => { + if (e.key === "Enter" && e.shiftKey) { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} />
- { + if (e.key === "Enter") { + e.preventDefault(); + await handleSubmit(onSubmit)(); + } + }} />