frontend-plus-react 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +7 -0
- package/README.md +1 -1
- package/dist/index.cjs +1104 -986
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +961 -843
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CLAUDE.md
CHANGED
|
@@ -93,17 +93,24 @@ Son las de `dmencu` (que aplican a todo proyecto compartido de esta carpeta), es
|
|
|
93
93
|
- El menú es un modal de MUI: mientras está abierto el editor pierde el foco y eso **no** guarda (`handleBlur` lo ignora), y al cerrarse el foco se devuelve con un `setTimeout`, porque el modal lo retiene hasta desmontarse.
|
|
94
94
|
- **Una celda que no se edita también se selecciona al hacer clic** (sin editor; `handleCellClick`): `handleCellMouseDown` cancela la selección por defecto y sin selección F9 no le llega a la grilla, así que el visor de solo lectura no se podía abrir.
|
|
95
95
|
- **La lupa** (el icono de `backend-plus` que abre el expander con un clic) es un adorno del editor (`endAdornment` de `InputRenderer`): flecha para los menús, calendario para la fecha y lupa para el texto. Su `onMouseDown` cancela el efecto nativo para que el editor no pierda el foco (perderlo guardaría). En una celda que no se edita no hay lupa: se llega con F9.
|
|
96
|
+
- **Los filtros también tienen expanders** (`TypedField` en modo filtro, con el mismo hook `hooks/grid/useExpander.tsx` que usa el editor de la celda): referencias, booleano (Sí / No), `options` y fecha, con F9, Alt+↓ y la lupa, que solo aparece al enfocar el filtro. Lo elegido se escribe como texto del filtro; la fecha como `AAAA-MM-DD`, que `getBestTypedValue` entiende sea cual sea el formato regional. Sin opción vacía (para eso está el operador `∅`) y, en una FK compuesta, sin acotar por la fila (un filtro no tiene fila: `opcionesDeReferencia` con `null`). El booleano en el filtro es un texto como los demás (se escribe s / n, o se elige; el filtro entiende «sí», «no», «1», «0»), no el `Select` de MUI que sigue usando el formulario. La ventana de texto no sirve para filtrar y no está. El editor vertical (`VerticalEditorPage`, también `TypedField`) todavía no los tiene.
|
|
96
97
|
- Sin hacer todavía: `inheritFieldsMode`.
|
|
97
98
|
|
|
98
99
|
### Parámetros de una tabla (dirección y menú, como `backend-plus`)
|
|
99
100
|
- `wScreens.table` de `my-menu.js` abre una tabla con lo que declara el ítem de menú y, **encima**, lo de la dirección. Acá lo hace `utils/parametrosDeTabla.ts` (`parametrosDeTabla(item, direccion)`) y lo usan `MenuTablePage` (`/menu/:nombre`) y `GenericDataGridPage` (`/table/:nombre`): `ff` (fixedFields, arreglo `[{fieldName, value, ...}]` u objeto `{campo: valor}`), `fc` (filtros iniciales), `td` (cambios a la definición de la tabla, mezclados en profundidad con `fusionar`, como `changing` de `best-globals`), `pf` y `pick` (viajan en `table_data` como `paramfun` y `pick`, solo si vienen) y `label` (nombre de la pestaña).
|
|
100
101
|
- Los parámetros `ff`, `fc`, `td` y `pf` van codificados con `json4all` (`JSON4all.toUrl` / `parse`, que acepta también JSON común). La dirección se lee como `UriSearchToObject` (partir por `&` y por el primer `=`, `decodeURIComponent`), **no** con `URLSearchParams`: ahí un `+` sería un espacio.
|
|
101
102
|
- **`fc` / `filterColumns`** (el de la definición del servidor también): `[{column, operator, value}]` es una fila de filtros; con varias filas (arreglo de arreglos, alternativas) **solo se aplica la primera** y se avisa por consola: la grilla tiene una sola fila de filtros. El `.d.ts` de `MenuInfoTable` dice `fieldName` en vez de `column`; el cliente de BP usa `column` y se aceptan las dos. Antes `menuInicial.ts` ponía `td` y `fc` en la dirección y nadie los leía.
|
|
103
|
+
- **La ruta de un ítem de menú lleva sus grupos: `/menu/<grupo>/.../<nombre>`** (`rutaDeTablaDeMenu`, `gruposDeItem`, `itemDeRuta` en `utils/menuInicial.ts`; la ruta es `/menu/*`). Los `name` se repiten entre grupos: en dmencu «encuestador», «recuperador», «ingresador» y «supervisor» están en asignación (`t_encu_areas`...) y en recepción (`encuestadores_asignados`...), con tablas distintas. Con `/menu/:nombre` se buscaba el primer ítem con ese nombre: recepción abría la tabla de asignación (sin sus detalles ni la columna de acciones, `clientSide` de `tareas_tem_recepcion`) y el menú marcaba los dos ítems. Los segmentos van con `encodeURIComponent`. Una dirección vieja `/menu/<nombre>` cae en la primera tabla con ese nombre. Quien arma la ruta de un ítem tiene que pasarle sus grupos (`SideMenu` los lleva por `MenuListItem`; la pantalla de inicio los calcula con `gruposDeItem`).
|
|
102
104
|
- **fixedFields** (`utils/fixedFields.ts`, igual que `TableConnector`): uno que fija el valor oculta su columna (salvo `show`), no se edita y no se filtra; uno con `range` o `until` es un rango: la columna se ve, se edita y se filtra.
|
|
103
105
|
|
|
104
106
|
### Anchos de columna
|
|
105
107
|
- Como `backend-plus` (`fieldDef.width` en `my-tables.js`, «Width in pixels for the grid» en el `.d.ts`), el `width` que declara el backend para un campo manda sobre el que se calcula con el título y los datos (`calcularAnchosDeColumnas`). Sin `width` se calcula. Las columnas se pueden arrastrar desde el borde del encabezado (`resizable`, con `columnWidths` en el estado de la grilla); en `backend-plus` el `width` también es el mínimo, acá el usuario puede achicarla.
|
|
106
108
|
|
|
109
|
+
### Columnas ocultas (`hiddenColumns`, como `backend-plus`)
|
|
110
|
+
- Una grilla abre con ocultas las `hiddenColumns` de la definición (el servidor suma ahí los campos `isName: 'known'`, `table-def-adapt.js`; `utils/columnasOcultas.ts`, `columnasOcultasIniciales`). **Un campo con `visible: false` es otra cosa: viaja en la definición pero no se dibuja nunca** (`campoDibujable`): no es una columna oculta que el usuario pueda mostrar, así que no está en el diálogo ni se exporta (`backend-plus` lo trata como oculta; acá se decidió que nunca se vea). Si el menú o la dirección pasan `td` con `hiddenColumns`, se aplica porque la definición ya viene mezclada. Antes `useGridColumns` ignoraba `hiddenColumns`.
|
|
111
|
+
- El estado es `columnasOcultas` de `GenericDataGrid` (se guarda en el cache de los detalles). Cambiarlo sí rearma las columnas, pero solo lo cambia el usuario: **Alt+clic en el encabezado** oculta (`defaultColumnHeaderCellRenderer`, en la captura para que react-data-grid no ordene) y **«ocultar o mostrar columnas»** del menú abre `DialogoDeColumnas` (a la izquierda las que se ven, a la derecha las ocultas; un clic cambia de lado). No lista las que oculta un fixedField, que no se pueden mostrar.
|
|
112
|
+
- La exportación no incluye las ocultas salvo la opción `hiddens` (`ExportDialog`). El editor vertical (`VerticalEditorPage`, recibe `columnasOcultas`) tampoco muestra ni los `visible: false` ni las ocultas, como el modo vertical de `backend-plus`. Los detalles desplegados son otra `GenericDataGrid`: cada uno lleva sus propias columnas ocultas.
|
|
113
|
+
|
|
107
114
|
### Sesión y arranque
|
|
108
115
|
- Con el estado todavía sin cargar (`idle`), `PrivateRoute` manda a `/login` guardando la ruta pedida; `InitialRedirectHandler` (montado fuera de las rutas privadas) vuelve a esa ruta cuando la sesión resulta válida. Tiene una guarda para no caer en la pantalla de inicio mientras la ruta guardada se limpia.
|
|
109
116
|
- **No hay `HomePage` ni ruta `/home`: la pantalla de inicio la define el backend, como en `backend-plus`.** `/` (`PantallaInicial`) redirige al ítem de menú con `selectedByDefault` (y, si es un grupo, al que lo declare adentro; `itemInicial`, `rutaDeItemDeMenu` en `utils/menuInicial.ts`, que también arma las rutas del menú lateral). Si el backend no declara ninguno, `/` queda vacía, igual que en `backend-plus`. El login y `InitialRedirectHandler` mandan a `/`. Una aplicación que quiera otra pantalla de inicio la declara en su menú.
|
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ las decisiones de diseño y cómo probar con un backend real.
|
|
|
28
28
|
## La grilla, como la de backend-plus
|
|
29
29
|
|
|
30
30
|
- **Teclado en una celda en edición**: Enter y Tab guardan y pasan a la celda siguiente, Shift+Tab a la anterior, ↑ y ↓ a la de arriba y abajo; ← y → solo salen de la celda al llegar al borde del texto. El clic fuera de la grilla también guarda.
|
|
31
|
-
- **F9 o Alt+↓** (y la lupa junto al editor) abren el selector del tipo de campo: las filas de la tabla referenciada (FK y softFK, con sus campos `isName`), Sí/No, las `options`, un calendario o el contenido completo.
|
|
31
|
+
- **F9 o Alt+↓** (y la lupa junto al editor) abren el selector del tipo de campo: las filas de la tabla referenciada (FK y softFK, con sus campos `isName`), Sí/No, las `options`, un calendario o el contenido completo. Los filtros tienen los mismos selectores (referencias, Sí/No, `options` y fecha). Los filtros tienen los mismos selectores (referencias, Sí/No, `options` y fecha).
|
|
32
32
|
- **Parámetros de la tabla** en la dirección y en el menú, como en backend-plus: `ff` (fixedFields, también con `show`, `range` y `until`), `fc` (filtros iniciales), `td`, `pf`, `pick` y `label`.
|
|
33
33
|
- Un campo con `table` se guarda en esa tabla, y el `width` del campo manda sobre el ancho calculado.
|
|
34
34
|
- Los detalles completos están en `CLAUDE.md`.
|