From ceb4eb88c6a7c933bbbc0f04198ff61f81f90f3e Mon Sep 17 00:00:00 2001 From: David Date: Sat, 17 Oct 2026 11:23:46 +0200 Subject: [PATCH] feat: enhance entity row actions with primary action support - Added primary action support to EntityRowActions component, allowing for a main action button with an icon and label. - Updated various components to utilize the new primary action feature, replacing existing action buttons with the new structure. - Introduced EyeIcon for view actions and PencilIcon for edit actions across multiple entity lists. - Improved accessibility by ensuring primary actions have appropriate aria-labels. - Refactored CatalogRowActions to remove direct view action and integrate with the new structure. - Adjusted tests to cover new primary action functionality and ensure proper rendering and behavior. --- docs/componentes-de-interfaz.md | 16 +++++ docs/patron-de-listados-de-entidades.md | 6 +- .../src/web/assets/list/ui/inventory-page.tsx | 15 ++-- .../src/web/brands/list/ui/brands-page.tsx | 19 ++--- .../src/web/catalog/list/ui/catalog-cell.tsx | 11 ++- .../catalog/list/ui/catalog-row-actions.tsx | 3 - .../list/ui/workstations-page.tsx | 13 +++- .../src/web/access/list/ui/access-row.tsx | 14 ++-- .../ui/application-configurations-page.tsx | 15 ++-- .../ui/certificate-configurations-page.tsx | 15 ++-- .../web/companies/list/ui/companies-page.tsx | 14 ++-- .../list/ui/department-section.tsx | 14 ++-- .../list/ui/folder-mappings-page.tsx | 15 ++-- .../list/ui/mail-configurations-page.tsx | 15 ++-- .../web/people/detail/ui/person-details.tsx | 18 ++++- .../src/web/people/list/ui/people-section.tsx | 22 +++--- .../list/ui/printer-configurations-page.tsx | 15 ++-- .../list/ui/process-templates-page.tsx | 12 +++- .../web/processes/list/ui/processes-page.tsx | 14 ++-- .../list/ui/remote-connections-page.tsx | 18 ++--- .../src/web/sites/list/ui/site-section.tsx | 15 ++-- .../list/ui/software-installations-panel.tsx | 16 +++-- .../list/ui/telework-authorizations-page.tsx | 12 +++- .../list/ui/work-profiles-page.tsx | 13 +++- .../src/web/users/list/ui/user-management.tsx | 15 ++-- .../src/web/catalog/list/ui/catalog-cell.tsx | 11 ++- .../catalog/list/ui/catalog-row-actions.tsx | 3 - .../web/resources/list/ui/resources-page.tsx | 15 ++-- .../rdx-ui/src/components/count-badge.tsx | 2 +- .../src/components/entity-list-controls.tsx | 24 +------ .../src/components/entity-row-actions.tsx | 72 +++++++++++++++++++ packages/rdx-ui/src/entity-list.test.tsx | 43 +++++++++++ packages/rdx-ui/src/lib/icons.ts | 1 + 33 files changed, 381 insertions(+), 145 deletions(-) create mode 100644 packages/rdx-ui/src/components/entity-row-actions.tsx diff --git a/docs/componentes-de-interfaz.md b/docs/componentes-de-interfaz.md index 576406b..c70425e 100644 --- a/docs/componentes-de-interfaz.md +++ b/docs/componentes-de-interfaz.md @@ -1010,3 +1010,19 @@ registros que presenta cada listado, incluidos los inactivos, sin aplicar sus fi Los inventarios y perfiles usan `useListQuery` con las claves existentes por compañía: comparten caché e invalidaciones de altas, cambios y bajas, sin nuevas rutas HTTP ni estado remoto duplicado. Antes de cargar la compañía, esas consultas están deshabilitadas. + + +### Acción principal de fila + +`EntityRowActions` dispone de `primaryAction` con `label`, `icon`, `onClick` y +`disabled` opcional. Presenta un botón compacto de icono con tooltip y nombre +accesible antes del desplegable de acciones secundarias. El consumidor aporta +textos traducidos y callbacks; el componente no conoce entidades ni endpoints. +La operación principal no debe repetirse entre los `EntityAction` secundarios. + +Omitir `children` cuando solo exista la principal. Si las acciones secundarias +dependen de condiciones, declarar `menuVisible` con la misma condición para +evitar un menú vacío. Mantener el lápiz para editar y el ojo para abrir o ver. +Los listados de configuraciones conservan deshabilitada la edición de registros +retirados o nunca configurados. Las acciones de baja o eliminación siguen en +el desplegable. Véase el [patrón de listados](patron-de-listados-de-entidades.md). diff --git a/docs/patron-de-listados-de-entidades.md b/docs/patron-de-listados-de-entidades.md index 715a317..9de918d 100644 --- a/docs/patron-de-listados-de-entidades.md +++ b/docs/patron-de-listados-de-entidades.md @@ -40,7 +40,7 @@ El pie opcional está fuera de la tabla y solo aparece cuando existe contenido c - El identificador principal abre la ficha existente si hay una. Usar enlace si existe una ruta real; botón si abre diálogo, detalle en memoria o panel. No inventar rutas. - Representar estados mediante indicador visual y texto, nunca solo color. Mantener los avisos de revisión e información contextual. - Las relaciones son navegables cuando el destino ya ofrece navegación adecuada; no introducir enlaces ficticios ni nuevas rutas. -- Acciones de fila siempre al final, con cabecera y celdas alineadas a la derecha y columna anclada al borde derecho durante el desplazamiento horizontal. La columna actions no se oculta ni se ordena. El disparador muestra únicamente el icono de tres puntos; conserva etiqueta accesible y título, sin repetir «Acciones» en las filas. El menú contextual mantiene las restricciones existentes. No convertir acciones de negocio en acciones masivas. +- Acciones de fila siempre al final, con cabecera y celdas alineadas a la derecha y columna anclada al borde derecho durante el desplazamiento horizontal. La columna actions no se oculta ni se ordena. La acción principal se presenta como botón de icono con tooltip y nombre accesible, antes del menú de tres puntos. Usar el lápiz para Editar y el ojo para Abrir o Ver; elegir la operación según la finalidad de cada listado. La principal no se repite en el menú. Las acciones secundarias, incluidas las destructivas, permanecen en el desplegable, cuyo disparador muestra únicamente los tres puntos y conserva etiqueta accesible y título. Si no hay secundarias, no mostrar el desplegable. Conservar las restricciones y los estados deshabilitados existentes. Reutilizar `EntityRowActions.primaryAction`; el consumidor aporta el icono, el texto traducido y el callback. No convertir acciones de negocio en acciones masivas. - Selección múltiple solo cuando una operación real la necesita. No añadir casillas sin consumidor. Mantener separada la selección del activo para su panel lateral. - Los diálogos `PickerList` mantienen una altura estable mediante `FormDialog layout="picker"` y llenan el área de resultados con `EntityTable layout="fill"`. Buscar, paginar, cargar o quedarse sin resultados no cambia la altura del diálogo. Búsqueda, filtros, paginación y acciones permanecen fuera del desplazamiento de resultados; el cuerpo permite desplazamiento adicional si la ventana es demasiado pequeña. - En diálogos `PickerList`, la selección ocupa siempre la primera columna, con identificador `selection`, sin ordenación ni ocultación y sin anclaje a la derecha. Toda fila disponible permite activar/desactivar su checkbox o seleccionar su radio mediante `onRowClick`. Las filas deshabilitadas no cambian la selección; los controles internos conservan su interacción y el teclado, sin un segundo cambio por propagación del clic. @@ -139,7 +139,9 @@ La primera columna tiene anchura mínima para evitar nombres ilegibles. El despl - No se han creado ni alterado registros de negocio durante la revisión del navegador. -### Ajuste de acciones de fila (7 de octubre de 2026) +### Ajuste inicial de acciones de fila (7 de octubre de 2026) + +La regla vigente de acción principal visible figura en Reglas de interacción; este apartado registra la verificación del ajuste inicial. Disparador solo con icono de tres puntos, etiqueta accesible y título conservados. Columna actions siempre al final, compacta, alineada y anclada a la derecha; no admite ocultación, búsqueda u ordenación. El fondo opaco respeta hover, menú abierto y selección del inventario. diff --git a/modules/assets/src/web/assets/list/ui/inventory-page.tsx b/modules/assets/src/web/assets/list/ui/inventory-page.tsx index bbb6591..47007ad 100644 --- a/modules/assets/src/web/assets/list/ui/inventory-page.tsx +++ b/modules/assets/src/web/assets/list/ui/inventory-page.tsx @@ -4,7 +4,7 @@ import { EntityListHeader, EntityRowActions, } from "@repo/rdx-ui/components/entity-list"; -import { BoxIcon } from "@repo/rdx-ui/lib/icons"; +import { BoxIcon, PencilIcon } from "@repo/rdx-ui/lib/icons"; import { Button } from "@repo/shadcn-ui/components/button"; import { useTranslation } from "react-i18next"; @@ -131,7 +131,15 @@ export function AssetInventoryPage(props: AssetInventoryPageProps) { label: t("actions"), hideable: false, render: (asset) => ( - +