From a111afc781f3168120be6bf36f66cdbd4fd9dc71 Mon Sep 17 00:00:00 2001 From: RyanVan <150385913+Ryson-32@users.noreply.github.com> Date: Sun, 26 Jul 2026 23:38:51 +0800 Subject: [PATCH 1/2] feat(ui): clarify automatic filter helper --- .../src/components/ui/form-controls.test.ts | 28 +++++++++++++++ packages/ui/src/components/ui/form-field.tsx | 31 +++++++++++----- .../auto-processing-dialog.test.ts | 35 +++++++++++++++---- .../auto-processing-dialog.tsx | 3 +- 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/packages/ui/src/components/ui/form-controls.test.ts b/packages/ui/src/components/ui/form-controls.test.ts index f8a7681..20b5a02 100644 --- a/packages/ui/src/components/ui/form-controls.test.ts +++ b/packages/ui/src/components/ui/form-controls.test.ts @@ -40,6 +40,34 @@ describe("composed form controls", () => { expect(html).toContain('aria-invalid="true"'); expect(html).toContain('aria-required="true"'); expect(html).toContain('role="alert"'); + expect(html.indexOf("账号")).toBeLessThan(html.indexOf(" { + const html = renderToStaticMarkup( + React.createElement( + FormField, + { + id: "exclude-regex", + label: "排除正则", + description: "每行一条,匹配到的节点会被全局排除,关闭后恢复。", + descriptionPlacement: "before-control", + }, + React.createElement(Input) + ) + ); + const labelIndex = html.indexOf("排除正则"); + const descriptionIndex = html.indexOf( + "每行一条,匹配到的节点会被全局排除,关闭后恢复。" + ); + const controlIndex = html.indexOf(" { diff --git a/packages/ui/src/components/ui/form-field.tsx b/packages/ui/src/components/ui/form-field.tsx index 9cfc3b9..96f458a 100644 --- a/packages/ui/src/components/ui/form-field.tsx +++ b/packages/ui/src/components/ui/form-field.tsx @@ -15,6 +15,7 @@ export interface FormFieldProps { id?: string; label: React.ReactNode; description?: React.ReactNode; + descriptionPlacement?: "before-control" | "after-control"; error?: React.ReactNode; required?: boolean; className?: string; @@ -29,6 +30,7 @@ function FormField({ id, label, description, + descriptionPlacement = "after-control", error, required = false, className, @@ -51,19 +53,30 @@ function FormField({ "aria-invalid": error ? true : controlChild.props["aria-invalid"], "aria-required": required || controlChild.props["aria-required"] || undefined, }); + const labelElement = ( + + ); + const descriptionElement = description ? ( +

+ {description} +

+ ) : null; return (
- + {descriptionPlacement === "before-control" && descriptionElement ? ( +
+ {labelElement} + {descriptionElement} +
+ ) : ( + labelElement + )} {control} - {description ? ( -

- {description} -

- ) : null} + {descriptionPlacement === "after-control" ? descriptionElement : null} {error ? (