From dc2f9b7c95761d0d87b429a97536b765e354a60c Mon Sep 17 00:00:00 2001 From: Code UX Date: Tue, 14 Jul 2026 01:14:10 +0000 Subject: [PATCH 1/2] feat(task T05): implement via codex --- .../settings/BranchNameSchemeEditor.tsx | 36 +- .../settings/LocalFilePickerField.tsx | 26 +- .../settings/OpenSourceSoftwareModal.tsx | 59 +- .../settings/PrTemplateEditorModal.tsx | 56 +- .../components/settings/SprintKeyEditor.tsx | 10 +- .../OpenSourceSoftwareModal.test.tsx | 35 + .../settings/panels/AutomationPanel.tsx | 22 +- .../v2/components/settings/panels/QAPanel.tsx | 108 +-- .../settings/panels/SettingsBrowserPanel.tsx | 102 +-- .../settings/panels/SettingsDangerPanel.tsx | 107 +-- .../settings/panels/SettingsGeneralPanel.tsx | 293 +++++---- .../settings/panels/SettingsSprintPanel.tsx | 240 ++++--- .../settings/panels/WorkerPanel.tsx | 26 +- .../v2/i18n/messages/settings-operations.ts | 618 ++++++++++++++++++ dashboard/src/v2/lib/open-source-software.ts | 8 + .../src/v2/lib/settings/branch-naming.ts | 37 +- .../dashboard-internationalization.md | 2 + docs/dashboard/internationalization.md | 2 + .../branch-name-scheme-editor.test.tsx | 25 +- .../dashboard/v2/open-source-software.test.ts | 14 + .../v2/settings-browser-panel.test.tsx | 62 ++ .../v2/settings-danger-panel.test.tsx | 34 + .../v2/settings-general-panel.test.tsx | 52 ++ .../v2/settings-sprint-panel.test.tsx | 69 +- 24 files changed, 1544 insertions(+), 499 deletions(-) create mode 100644 dashboard/src/v2/i18n/messages/settings-operations.ts create mode 100644 tests/dashboard/v2/settings-browser-panel.test.tsx diff --git a/dashboard/src/v2/components/settings/BranchNameSchemeEditor.tsx b/dashboard/src/v2/components/settings/BranchNameSchemeEditor.tsx index 08515f105d..f19b0df511 100644 --- a/dashboard/src/v2/components/settings/BranchNameSchemeEditor.tsx +++ b/dashboard/src/v2/components/settings/BranchNameSchemeEditor.tsx @@ -1,6 +1,7 @@ import type { FunctionComponent } from "preact"; import { TextInput } from "./SettingsFormFields.js"; -import { BRANCH_NAME_TOKEN_LABELS, TASK_PR_TITLE_TOKEN_LABELS } from "../../lib/settings-view-models.js"; +import { getBranchNameTokenLabels, getTaskPrTitleTokenLabels } from "../../lib/settings-view-models.js"; +import { useSettingsOperationsTranslations } from "../../i18n/messages/settings-operations.js"; export interface BranchNameSchemeEditorProps { value: string; @@ -26,8 +27,9 @@ const TemplateSchemeEditor: FunctionComponent = ({ ariaLabel, ariaDescription, tokenLabels, -}) => ( -
+}) => { + const { t } = useSettingsOperationsTranslations(); + return
= ({ aria-description={ariaDescription} />
- Placeholders: + {t("Placeholders:")} {Object.keys(tokenLabels).map((token) => ( {`{${token}}`} ))}
-
-); +
; +}; export const BranchNameSchemeEditor: FunctionComponent = ({ value, onChange, disabled, }) => { + const { locale, t } = useSettingsOperationsTranslations(); return ( ); }; @@ -70,14 +73,15 @@ export const TaskPrTitleSchemeEditor: FunctionComponent ( - { + const { locale, t } = useSettingsOperationsTranslations(); + return -); + ariaLabel={t("Task PR title scheme")} + ariaDescription={t("Template used when naming automatically-created task pull requests.")} + tokenLabels={getTaskPrTitleTokenLabels(locale)} + />; +}; diff --git a/dashboard/src/v2/components/settings/LocalFilePickerField.tsx b/dashboard/src/v2/components/settings/LocalFilePickerField.tsx index 414ff01b90..e603ed979f 100644 --- a/dashboard/src/v2/components/settings/LocalFilePickerField.tsx +++ b/dashboard/src/v2/components/settings/LocalFilePickerField.tsx @@ -4,6 +4,7 @@ import { AlertCircle, Check, ChevronUp, FileText, FolderOpen, Home, Loader2, Ref import type { LocalFileBrowserResponse } from "../../types.js"; import { fetchLocalFiles } from "../../lib/project-api.js"; import { TextInput } from "./SettingsFormFields.js"; +import { useSettingsOperationsTranslations } from "../../i18n/messages/settings-operations.js"; export const LocalFilePickerField: FunctionComponent<{ value: string; @@ -12,6 +13,7 @@ export const LocalFilePickerField: FunctionComponent<{ helperText?: string; placeholder?: string; }> = ({ value, onChange, label, helperText, placeholder }) => { + const { t } = useSettingsOperationsTranslations(); const generatedId = useId(); const pickerId = `${generatedId}-picker`; const [isOpen, setIsOpen] = useState(false); @@ -60,7 +62,7 @@ export const LocalFilePickerField: FunctionComponent<{ className="inline-flex shrink-0 items-center justify-center gap-2 rounded-[var(--radius-ui)] border border-[color:var(--border-hairline)] bg-void-900 px-4 py-2.5 text-xs font-black uppercase tracking-[0.14em] text-white transition-[background-color,border-color,color,box-shadow,transform] hover:-translate-y-px hover:bg-void-800 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--accent-focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-white active:scale-[0.98] dark:border-white/[0.08] dark:bg-white/[0.08] dark:text-white dark:hover:bg-white/[0.12] dark:focus-visible:ring-offset-void-900" > {isOpen ?