From e21fb8349bbb288c5c89dbf76d0752c032c8ac72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fiere?= Date: Tue, 11 Aug 2026 20:23:42 +0200 Subject: [PATCH] fix: keep caret in task title fields clamped at the limit (#2529) --- .../app/office/components/new-task-dialog.tsx | 6 +- apps/web/app/office/setup/step-task.tsx | 6 +- .../automation-editor-sections.tsx | 8 +- .../task-create-dialog-selectors.tsx | 6 +- .../task/new-subtask-form-parts.tsx | 6 +- .../components/task/task-rename-dialog.tsx | 8 +- .../components/task/task-top-bar-title.tsx | 6 +- .../task/mobile-task-title-caret.spec.ts | 106 +++++++ .../e2e/tests/task/task-title-caret.spec.ts | 110 +++++++ .../use-task-title-selection-restore.test.tsx | 237 +++++++++++++++ .../hooks/use-task-title-selection-restore.ts | 125 ++++++++ docs/plans/task-title-caret/plan.md | 272 ++++++++++++++++++ .../task-01-regression-e2e.md | 68 +++++ .../task-02-caret-preserving-clamp.md | 67 +++++ .../task-03-rename-edit-dialogs.md | 59 ++++ .../task-04-sibling-title-inputs.md | 77 +++++ docs/specs/tasks/title-length-limit.md | 5 +- 17 files changed, 1152 insertions(+), 20 deletions(-) create mode 100644 apps/web/e2e/tests/task/mobile-task-title-caret.spec.ts create mode 100644 apps/web/e2e/tests/task/task-title-caret.spec.ts create mode 100644 apps/web/hooks/use-task-title-selection-restore.test.tsx create mode 100644 apps/web/hooks/use-task-title-selection-restore.ts create mode 100644 docs/plans/task-title-caret/plan.md create mode 100644 docs/plans/task-title-caret/task-01-regression-e2e.md create mode 100644 docs/plans/task-title-caret/task-02-caret-preserving-clamp.md create mode 100644 docs/plans/task-title-caret/task-03-rename-edit-dialogs.md create mode 100644 docs/plans/task-title-caret/task-04-sibling-title-inputs.md diff --git a/apps/web/app/office/components/new-task-dialog.tsx b/apps/web/app/office/components/new-task-dialog.tsx index b57bd4c3f9..8f2f5594ce 100644 --- a/apps/web/app/office/components/new-task-dialog.tsx +++ b/apps/web/app/office/components/new-task-dialog.tsx @@ -18,7 +18,7 @@ import { EMPTY_STAGES, type StagesDraft, } from "./new-task-stages"; -import { clampTaskTitleInput } from "@/lib/task-title"; +import { useTaskTitleSelectionRestore } from "@/hooks/use-task-title-selection-restore"; import { useTranslation } from "react-i18next"; function buildMetadata(draft: IssueDraft): Record | undefined { @@ -131,6 +131,7 @@ function NewIssueDialogBody({ onCreate: () => void; }) { const { t } = useTranslation(); + const { inputRef, clampChange } = useTaskTitleSelectionRestore(draft.title); return ( <> @@ -150,9 +151,10 @@ function NewIssueDialogBody({