feat(web): value-help reutilizable (lista de valores) con selección única o múltiple

- sbo-value-help: búsqueda por columna con contains(), columnas declarativas
  (texto, número, importe, fecha, format a medida), paginación del servidor
  con total, baseFilter/orderby, Esc/Enter, errores con reintento.
- Selección única (un clic confirma) o múltiple (casillas, seleccionar
  página, Confirmar (n)). Mejoras sobre el sistema anterior: lo marcado se
  conserva entre páginas, el filtro base va entre paréntesis (un "or" ya no
  rompe la precedencia) y las comillas del texto buscado se escapan.
- Cambiar la columna elegida no consulta hasta pulsar Buscar.
- Peticiones con httpResource: las obsoletas se cancelan solas.
- Helpers reutilizables: core/sl/odata (escape, contains, combinar filtros)
  y core/format (importes y fechas sin desfase de zona horaria).
- Verificado en Chrome contra SAP real (253 clientes, 1209 artículos):
  búsqueda por Nombre, paginación, selección múltiple entre páginas y
  tema oscuro.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-13 19:26:27 -05:00
1 parent 4c8c499a72
commit 3d5a81e806
10 files changed
+962

No files matched your search

+34
View File
@@ -39,3 +39,37 @@ Tokens: `--app --shell --shell-ink --shell-quiet --win --panel --line --line-sof
- `core/menu`: `MenuService` carga `GET /api/user/menu` una vez por sesión; el menú visible sale de `MENU` (`@basic-erp/sap-types`) filtrado por permisos.
- `app.routes.ts` genera una ruta por pantalla del menú; las que aún no existen muestran "no disponible" (`ComingSoonPage`). Para construir una pantalla, se reemplaza su `loadComponent`.
- Un 401 en cualquier llamada cierra la sesión local y lleva al login recordando la ruta (`?returnUrl=`, solo rutas internas).
## Componentes compartidos (`src/app/shared`)
### `sbo-value-help` — lista de valores ("elegir de la lista")
Búsqueda por columna sobre un recurso del proxy `/api/sl`, selección única o múltiple y paginación del servidor.
```html
<sbo-value-help
[open]="open()"
title="Socios de negocio"
resource="BusinessPartners"
[columns]="columns"
baseFilter="CardType eq 'cCustomer'"
orderby="CardCode"
selection="single"
(selected)="onPick($event)"
(closed)="open.set(false)" />
```
```ts
columns: VhColumn[] = [
{ key: 'CardCode', title: 'Código', width: '130px', mono: true },
{ key: 'CardName', title: 'Nombre' },
{ key: 'CurrentAccountBalance', title: 'Saldo', type: 'currency' },
];
```
- Agregar una columna = una entrada en `columns`; el `$select` se deriva de ahí.
- Columna activa de búsqueda: clic en el encabezado (solo columnas de texto, o `searchable: true`). Se aplica al pulsar **Buscar**/Enter con `contains()`, combinada con `baseFilter` entre paréntesis y con las comillas escapadas.
- `selection="single"`: un clic en la fila confirma y cierra. `selection="multiple"`: casillas, "seleccionar página" y **Confirmar (n)**; lo marcado se conserva al cambiar de página (`[initialSelection]` precarga filas).
- `type`: `text` (defecto), `number`, `currency` (2 decimales), `date` (dd/MM/yyyy); `format: (row) => string` para algo a medida.
- Teclado: Enter en la búsqueda, Enter sobre una fila, Esc para cerrar.
- Cada apertura reinicia búsqueda, página y selección. Las peticiones obsoletas se cancelan solas (`httpResource`).