From e472b2ee8c3a7980efd2db3022e531a2ca9236df Mon Sep 17 00:00:00 2001 From: David Date: Fri, 9 Oct 2026 18:14:21 +0200 Subject: [PATCH] =?UTF-8?q?Mejorar=20la=20ayuda=20en=20los=20di=C3=A1logos?= =?UTF-8?q?=20y=20cambiar=20checkbox=20por=20switch=20donde=20proceda.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/componentes-de-interfaz.md | 20 +++++++++- .../src/web/brands/shared/ui/brand-form.tsx | 11 ++++-- .../shared/ui/catalog-relation-form.tsx | 27 +++++++------ .../shared/ui/catalog-template-form.tsx | 20 +++++----- .../shared/ui/support-form.tsx | 26 +++++++------ .../shared/ui/support-tool-form.tsx | 11 ++++-- .../shared/ui/workstation-form.tsx | 11 ++++-- .../access/shared/ui/access-field-control.tsx | 18 ++++----- .../assignments/shared/ui/assignment-form.tsx | 20 ++++------ .../web/companies/shared/ui/company-form.tsx | 18 ++++----- .../departments/shared/ui/department-form.tsx | 20 ++++------ .../shared/ui/template-form.tsx | 18 ++++----- .../shared/ui/template-step-fields.tsx | 20 +++++----- .../shared/ui/intervention-steps.tsx | 18 ++++----- .../src/web/people/shared/ui/person-form.tsx | 38 ++++++++----------- .../shared/ui/printer-configuration-form.tsx | 16 ++++---- .../shared/ui/process-template-form.tsx | 16 ++++---- .../shared/ui/remote-connection-form.tsx | 16 ++++---- .../shared/ui/telework-authorization-form.tsx | 16 ++++---- .../shared/ui/work-profile-form.tsx | 11 ++++-- .../src/web/users/shared/ui/user-form.tsx | 20 ++++------ .../shared/ui/catalog-template-form.tsx | 20 +++++----- .../rdx-ui/src/components/context-help.tsx | 36 ++++++++++++++---- .../rdx-ui/src/components/switch-field.tsx | 18 +++++++++ 24 files changed, 249 insertions(+), 216 deletions(-) create mode 100644 packages/rdx-ui/src/components/switch-field.tsx diff --git a/docs/componentes-de-interfaz.md b/docs/componentes-de-interfaz.md index 6861ff0..e487a7e 100644 --- a/docs/componentes-de-interfaz.md +++ b/docs/componentes-de-interfaz.md @@ -15,11 +15,13 @@ paquetes genéricos. - Card: bloques de información y estado. - Select: idioma y selección de sistemas, entornos, cuentas, personas y demás relaciones, con navegación por teclado. - Input y Label: credenciales y datos de usuario. -- Checkbox: estado activo de usuarios, compañías, personas y departamentos. +- Checkbox: filtros de listado, selección múltiple y configuración de columnas. +- SwitchField: campos binarios de formularios, como estado activo, VPN, predeterminado o requerido. - Table: listados de usuarios, compañías, personas y departamentos. - Textarea: dirección opcional de las sedes, con varias líneas. - Dialog: primitiva de shadcn/ui, con foco y cierre por teclado. -- RDX UI: FormDialog, FormActions, ContextHelp, SelectWithAction, EntityTable y StatisticCard. +- RDX UI: FormDialog, FormActions, ContextHelp, SelectWithAction, SwitchField, EntityTable y + StatisticCard. ## Convención de navegación @@ -86,6 +88,8 @@ Guías oficiales: [monorepos](https://ui.shadcn.com/docs/monorepo) e [instalaci ContextHelp muestra una explicación breve y permite desplegar ejemplos y recomendaciones mediante teclado. EntityHelp aporta contenido específico en español e inglés para compañías, personas, departamentos, sedes, asignaciones y todas las secciones de cuentas y accesos. Los catálogos explican si la definición es global o exclusiva de la compañía. Los ejemplos son orientativos: nunca se convierten en valores del formulario. +La ayuda se presenta en una tarjeta con icono circular, título y explicación; debajo, una banda desplegable contiene los ejemplos y recomendaciones. ContextHelp admite `icon?: ReactNode` para sustituir el icono informativo predeterminado, por ejemplo `icon={}`. El icono es decorativo y hereda el tamaño y color del contenedor. Se conservan los tokens del tema, los textos aportados por cada módulo y el despliegue nativo por teclado. + El botón Ayuda de Cuentas y accesos y Catálogos informáticos permite consultar la explicación de la sección sin abrir un alta. La misma ayuda aparece dentro de los modales de alta y edición. FormDialog utiliza una variante amplia para personas y formularios con más campos; el número de campos no cambia la navegación a una página propia. La ayuda de los formularios se coloca en su parte inferior, inmediatamente antes de FormActions. Este pie compartido reúne Guardar y Cancelar dentro del formulario, conservando el envío y el cierre accesible del diálogo. Los diálogos de consulta mantienen únicamente Cerrar. @@ -101,6 +105,18 @@ Su contrato recibe id, etiqueta, opciones, placeholder, valor controlado y callb No conoce compañías, HTTP, formularios ni modales: esas responsabilidades pertenecen al consumidor. No contiene textos propios que deban traducirse. +## SwitchField: activación y desactivación + +`SwitchField` vive en `@repo/rdx-ui/components/switch-field`. Compone el Switch de shadcn/ui +con su etiqueta accesible y recibe un valor controlado, `onCheckedChange`, `id`, texto y estado +deshabilitado. No conoce React Hook Form ni ningún DTO: el formulario aporta el valor y actualiza +su fuente de verdad. + +Se usa para cambios binarios que expresan una propiedad o un estado de la entidad, incluidos +activo, requerido, contacto, VPN, predeterminado y relación simétrica. No sustituye Checkbox en +filtros ni en elecciones de varias opciones, donde la casilla comunica correctamente inclusión, +exclusión o selección múltiple. + ### Formularios que permiten alta rápida Sistema permite crear un sistema propio de la compañía mediante un modal adicional. Entorno permite crear un entorno para el sistema activo seleccionado; su acción no aparece antes de elegir un sistema. Los campos fijos en edición no ofrecen alta rápida. Uso y otros valores cerrados tampoco ofrecen altas. diff --git a/modules/assets/src/web/brands/shared/ui/brand-form.tsx b/modules/assets/src/web/brands/shared/ui/brand-form.tsx index 835f893..d399832 100644 --- a/modules/assets/src/web/brands/shared/ui/brand-form.tsx +++ b/modules/assets/src/web/brands/shared/ui/brand-form.tsx @@ -1,5 +1,6 @@ import { ContextHelp } from "@repo/rdx-ui/components/context-help"; import { FormActions } from "@repo/rdx-ui/components/form-dialog"; +import { SwitchField } from "@repo/rdx-ui/components/switch-field"; import { Button } from "@repo/shadcn-ui/components/button"; import { Input } from "@repo/shadcn-ui/components/input"; import { Label } from "@repo/shadcn-ui/components/label"; @@ -48,10 +49,12 @@ export function BrandForm(props: BrandFormProps) { onSelect={selectLogo} /> {!quickCreate && ( - + form.setValue("active", active, { shouldDirty: true })} + /> )} {(mutation.error || form.formState.errors.name || form.formState.errors.active) && ( diff --git a/modules/assets/src/web/catalog-relations/shared/ui/catalog-relation-form.tsx b/modules/assets/src/web/catalog-relations/shared/ui/catalog-relation-form.tsx index 53a2a13..a5a4650 100644 --- a/modules/assets/src/web/catalog-relations/shared/ui/catalog-relation-form.tsx +++ b/modules/assets/src/web/catalog-relations/shared/ui/catalog-relation-form.tsx @@ -1,4 +1,5 @@ import { FormActions } from "@repo/rdx-ui/components/form-dialog"; +import { SwitchField } from "@repo/rdx-ui/components/switch-field"; import { Button } from "@repo/shadcn-ui/components/button"; import { Input } from "@repo/shadcn-ui/components/input"; import { Label } from "@repo/shadcn-ui/components/label"; @@ -33,20 +34,18 @@ export function CatalogRelationForm(props: CatalogRelationFormProps) { }} /> - + { + form.setValue("symmetric", isSymmetric); + if (isSymmetric) { + form.setValue("inverseName", form.getValues("name")); + } + }} + /> {!symmetric && (
diff --git a/modules/assets/src/web/catalog-templates/shared/ui/catalog-template-form.tsx b/modules/assets/src/web/catalog-templates/shared/ui/catalog-template-form.tsx index 811887e..ab20a48 100644 --- a/modules/assets/src/web/catalog-templates/shared/ui/catalog-template-form.tsx +++ b/modules/assets/src/web/catalog-templates/shared/ui/catalog-template-form.tsx @@ -1,7 +1,7 @@ import { FormActions } from "@repo/rdx-ui/components/form-dialog"; import { SelectWithAction } from "@repo/rdx-ui/components/select-with-action"; +import { SwitchField } from "@repo/rdx-ui/components/switch-field"; import { Button } from "@repo/shadcn-ui/components/button"; -import { Checkbox } from "@repo/shadcn-ui/components/checkbox"; import { Input } from "@repo/shadcn-ui/components/input"; import { Label } from "@repo/shadcn-ui/components/label"; import { Textarea } from "@repo/shadcn-ui/components/textarea"; @@ -73,10 +73,19 @@ export function CatalogTemplateForm(props: CatalogTemplateFormProps) { )}
- + {t("required")} + + {": "} + {field?.values.name ?? ""} + + + } onCheckedChange={(checked) => form.setValue( "fields", @@ -89,13 +98,6 @@ export function CatalogTemplateForm(props: CatalogTemplateFormProps) { ) } /> -
- - + form.setValue("requiresVpn", requiresVpn)} + /> + form.setValue("preferred", preferred)} + />