sapenlinea-components 0.10.86 → 0.11.88

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/README.md CHANGED
@@ -14,35 +14,36 @@ Componente para gestionar **filtros de fecha y fecha/hora** a partir de una list
14
14
 
15
15
  **Inputs:**
16
16
 
17
- - `filters: FilterItem[]` (requerido)
18
- - Cada `FilterItem` define un filtro disponible:
17
+ - `filters: FilterItem[]` (requerido) – Filtros disponibles. Cada `FilterItem`:
19
18
  - `label: string` – Texto visible en el chip/botón.
20
19
  - `value: string` – Identificador interno del filtro.
21
20
  - `type: 'date' | 'datetime'` – Tipo de filtro.
22
21
  - `placeholder?: string` – Placeholder específico.
23
22
  - `minDate?: Date` / `maxDate?: Date` – Rango permitido.
23
+ - `clearTrigger: number = 0` – Al incrementar este valor desde el padre se limpia el filtro.
24
+ - `initialValue: Date | string | null = null` – Fecha a restaurar al inicializar (útil para volver a una pantalla con filtros previos). Al hacer clic en el botón de limpiar del chip, el valor inicial queda descartado y no se restaura automáticamente.
25
+ - `initialFilterType: string | null = null` – Key (`FilterItem.value`) del filtro activo a restaurar junto con `initialValue`.
24
26
 
25
27
  **Outputs:**
26
28
 
27
29
  - `dateSelected: EventEmitter<DateFilterSelection>` – Emite `{ filter: string; value: Date }` con el filtro activo y la fecha seleccionada.
28
30
  - `dateChange: EventEmitter<Date | null>` – Emite la fecha seleccionada al cambiar (o `null` si se limpia).
31
+ - `enterPressed: EventEmitter<void>` – Emite al presionar Enter.
29
32
 
30
33
  **Uso con formularios reactivos:**
31
34
 
32
35
  ```html
33
36
  <lib-date-time-filter
34
37
  [filters]="dateFilters"
38
+ [clearTrigger]="clearVersion"
39
+ [initialValue]="savedFilters.date"
40
+ [initialFilterType]="'date'"
35
41
  (dateSelected)="onDateSelected($event)"
36
42
  (dateChange)="onDateChange($event)"
37
- formControlName="fechaFiltro"
38
43
  ></lib-date-time-filter>
39
44
  ```
40
45
 
41
46
  ```ts
42
- const form = this.fb.group({
43
- fechaFiltro: [null],
44
- });
45
-
46
47
  dateFilters: FilterItem[] = [
47
48
  { label: 'Fecha inicio', value: 'startDate', type: 'date', placeholder: 'Seleccionar fecha inicio' },
48
49
  { label: 'Fecha fin', value: 'endDate', type: 'date', placeholder: 'Seleccionar fecha fin' },
@@ -293,11 +294,13 @@ Componente de **filtro por texto** con chips de filtros configurables (por ejemp
293
294
 
294
295
  - `filters: FilterItem[]` (requerido) – Filtros disponibles de texto.
295
296
  - `clearTrigger: number = 0` – Al incrementar este valor desde el padre se limpian todos los filtros.
297
+ - `initialValues: Record<string, string> = {}` – Valores a restaurar al inicializar, donde la clave es el `FilterItem.value` y el valor es el texto. Al limpiar un chip individualmente el valor inicial queda descartado y no se restaura automáticamente.
296
298
 
297
299
  **Outputs:**
298
300
 
299
301
  - `filterSelected: EventEmitter<{ filter: string; value: string }>` – Emite el filtro y el valor aplicado.
300
302
  - `valueChange: EventEmitter<string | null>` – Emite el valor actual del filtro de texto.
303
+ - `enterPressed: EventEmitter<void>` – Emite al presionar Enter.
301
304
 
302
305
  **Ejemplo de uso:**
303
306
 
@@ -305,6 +308,7 @@ Componente de **filtro por texto** con chips de filtros configurables (por ejemp
305
308
  <lib-input-text-filter
306
309
  [filters]="textFilters"
307
310
  [clearTrigger]="clearVersion"
311
+ [initialValues]="{ name: 'Juan', email: 'juan@example.com' }"
308
312
  (filterSelected)="onTextFilter($event)"
309
313
  (valueChange)="onTextValueChange($event)"
310
314
  ></lib-input-text-filter>
@@ -322,18 +326,22 @@ Componente de **filtro numérico** con múltiples chips (ej. "monto mínimo", "m
322
326
  **Inputs:**
323
327
 
324
328
  - `filters: FilterItem[]` (requerido) – Filtros numéricos.
325
- - `clearTrigger: number = 0` – Limpia filtros al cambiar.
329
+ - `clearTrigger: number = 0` – Limpia todos los filtros al incrementar.
330
+ - `initialValues: Record<string, string> = {}` – Valores numéricos a restaurar al inicializar, donde la clave es el `FilterItem.value`. Al limpiar un chip individualmente el valor inicial queda descartado y no se restaura automáticamente.
326
331
 
327
332
  **Outputs:**
328
333
 
329
334
  - `filterSelected: EventEmitter<{ filter: string; value: string }>` – Filtro seleccionado y valor.
330
335
  - `valueChange: EventEmitter<string | null>` – Valor numérico aplicado.
336
+ - `enterPressed: EventEmitter<void>` – Emite al presionar Enter.
331
337
 
332
338
  **Ejemplo de uso:**
333
339
 
334
340
  ```html
335
341
  <lib-input-number-filter
336
342
  [filters]="numberFilters"
343
+ [clearTrigger]="clearVersion"
344
+ [initialValues]="{ id: '42' }"
337
345
  (filterSelected)="onNumberFilter($event)"
338
346
  ></lib-input-number-filter>
339
347
  ```
@@ -350,22 +358,28 @@ Componente de **filtro basado en select** con chips. Permite seleccionar una opc
350
358
  **Inputs:**
351
359
 
352
360
  - `filters: FilterItem[]` (requerido) – Deben incluir `options` con `{ label, value }`.
353
- - `clearTrigger: number = 0` – Limpia filtros.
361
+ - `clearTrigger: number = 0` – Limpia todos los filtros al incrementar.
362
+ - `initialValues: Record<string, string> = {}` – Valores a restaurar al inicializar, donde la clave es el `FilterItem.value` y el valor es el **value** de la opción (no el label). El componente busca automáticamente el label correspondiente para mostrarlo en el chip. Al limpiar un chip individualmente el valor inicial queda descartado y no se restaura automáticamente.
354
363
 
355
364
  **Outputs:**
356
365
 
357
366
  - `filterSelected: EventEmitter<{ filter: string; value: string }>` – Filtro e identificador de opción seleccionada.
358
367
  - `valueChange: EventEmitter<string | null>` – Valor del select actual.
368
+ - `enterPressed: EventEmitter<void>` – Emite al presionar Enter.
359
369
 
360
370
  **Ejemplo de uso:**
361
371
 
362
372
  ```html
363
373
  <lib-input-select-filter
364
374
  [filters]="statusFilters"
375
+ [clearTrigger]="clearVersion"
376
+ [initialValues]="{ status: 'ACTIVE' }"
365
377
  (filterSelected)="onStatusFilter($event)"
366
378
  ></lib-input-select-filter>
367
379
  ```
368
380
 
381
+ > `initialValues` recibe el value de la opción (ej. `'ACTIVE'`), no el label (`'Activo'`). El componente resuelve el label buscando en las `options` del filtro correspondiente.
382
+
369
383
  ---
370
384
 
371
385
  ### 8. `lib-select-custom-search` (SelectCustomSearch)
@@ -448,11 +462,23 @@ Componente de **tabla dinámica** con soporte de ordenamiento, acciones por fila
448
462
  - `statusToneMap: StatusToneMap` – Mapa de estado normalizado → tono visual (`success`, `error`, `warning`, `info`, `neutral`).
449
463
  - `statusEnumMap: Record<string, string>` – Traduce el valor crudo del estado (ej. `'ACTIVE'`) a la etiqueta que se muestra (ej. `'Activo'`). La resolución del tono usa la etiqueta traducida.
450
464
 
465
+ **Inputs:**
466
+
467
+ - `columns: TableColumn[]` (requerido) – Definición de columnas.
468
+ - `data: TableRow[]` (requerido) – Datos a mostrar.
469
+ - `actions: TableAction[] | ((row: TableRow) => TableAction[])` – Acciones por fila principal.
470
+ - `showActions: boolean = true` – Muestra/oculta columna de acciones en filas principales.
471
+ - `subColumns: SubColumn[]` – Columnas de las sub-filas expandibles.
472
+ - `subActions: TableAction[] | ((row: TableRow) => TableAction[])` – Acciones por sub-fila. Se muestran con el mismo menú contextual que las filas principales.
473
+ - `showSubActions: boolean = false` – Muestra/oculta la columna de acciones en sub-filas.
474
+ - `statusToneMap: StatusToneMap` – Mapa de estado normalizado → tono visual.
475
+ - `statusEnumMap: Record<string, string>` – Traduce el valor crudo del estado a la etiqueta visible.
476
+
451
477
  **Tipos de columna (`type`):**
452
478
 
453
479
  | Tipo | Descripción |
454
480
  |---|---|
455
- | `text` | Texto plano (default) |
481
+ | `text` | Texto plano (default). Aplica `autoWidth` automáticamente. |
456
482
  | `number` | Número formateado |
457
483
  | `money` | Valor monetario con formato |
458
484
  | `date` | Fecha formateada |
@@ -461,11 +487,52 @@ Componente de **tabla dinámica** con soporte de ordenamiento, acciones por fila
461
487
  | `status` | Chip de estado con color basado en `statusToneMap` |
462
488
  | `grade` | Chip de grado con color semáforo automático (verde ≤0.9, naranja ≤2.9, rojo ≤4, gris >4). Muestra el valor con sufijo `°` |
463
489
  | `icon-button` | Botón con ícono clicable |
464
- | `email` | Email en minúsculas |
490
+ | `email` | Email en minúsculas. Aplica `autoWidth` automáticamente. |
491
+
492
+ **Propiedades de ancho por columna:**
493
+
494
+ | Propiedad | Tipo | Default | Descripción |
495
+ |---|---|---|---|
496
+ | `autoWidth` | `boolean` | `true` para `text`/`email` | Ajusta el ancho al contenido hasta `maxWidth`. Pasar `false` para desactivarlo en tipos `text`/`email`. |
497
+ | `maxWidth` | `number` | `200` | Ancho máximo en px cuando `autoWidth` está activo. |
498
+ | `compact` | `boolean` | `false` | Comprime la columna al mínimo posible, ajustándose exactamente al contenido sin límite de ancho. Útil para columnas de ícono o estado corto. |
499
+
500
+ ```ts
501
+ // Columna que no crece más de 150px
502
+ { key: 'placa', label: 'PLACA', type: 'text', maxWidth: 150 }
503
+
504
+ // Columna de tipo text que NO usa autoWidth (ocupa todo el espacio disponible)
505
+ { key: 'descripcion', label: 'DESCRIPCIÓN', type: 'text', autoWidth: false }
506
+
507
+ // Columna compacta: se ajusta exactamente al contenido
508
+ { key: 'grado', label: 'GRADO', type: 'grade', compact: true }
509
+ ```
465
510
 
466
511
  **Outputs:**
467
512
 
468
- - `optionSelected: EventEmitter<{ action: string; row: TableRow }>` – Emite la acción seleccionada y la fila.
513
+ - `optionSelected: EventEmitter<{ action: string; row: TableRow }>` – Emite la acción seleccionada y la fila principal.
514
+ - `subOptionSelected: EventEmitter<{ action: string; row: TableRow }>` – Emite la acción seleccionada y la sub-fila.
515
+ - `iconAction: EventEmitter<{ action: string; row: TableRow }>` – Emite al hacer clic en un `icon-button`.
516
+
517
+ **Sub-filas con acciones (`subActions` + `showSubActions`):**
518
+
519
+ ```ts
520
+ subActions: TableAction[] = [
521
+ { key: 'view', icon: 'icon-view', label: 'Ver detalle' },
522
+ { key: 'edit', icon: 'icon-edit', label: 'Editar' },
523
+ ];
524
+ ```
525
+
526
+ ```html
527
+ <lib-table
528
+ [columns]="columns"
529
+ [data]="rows"
530
+ [subColumns]="subColumns"
531
+ [subActions]="subActions"
532
+ [showSubActions]="true"
533
+ (subOptionSelected)="onSubAction($event)"
534
+ />
535
+ ```
469
536
 
470
537
  **Ejemplo con columna `grade`:**
471
538
 
@@ -838,9 +905,36 @@ Encabezado de sección con título, botones de acción configurables y grupo de
838
905
  - `exportButtonLabel: string = 'Exportar CSV'`
839
906
  - `exportButtonIcon: string = 'icon-export'`
840
907
  - `showButtonBack: boolean = false`
908
+ - `initialFilters: Record<string, string | number | Date | null> = {}` — estado previo de filtros para restaurar al volver a la pantalla. La estructura es la misma que emite `filtersChange`. Soporta todos los tipos de filtro: texto, número, select (por value) y fecha.
841
909
 
842
910
  > Los botones secundario y de exportación se agrupan automáticamente al final de la fila del título.
843
911
 
912
+ **Restaurar filtros previos (`initialFilters`):**
913
+
914
+ Patrón típico para preservar filtros al navegar entre pantallas:
915
+
916
+ ```ts
917
+ // En el componente padre
918
+ savedFilters = signal<Record<string, string | number | Date | null>>({});
919
+
920
+ onFiltersChange(filters: Record<string, string | number | Date | null>) {
921
+ this.savedFilters.set(filters);
922
+ }
923
+ ```
924
+
925
+ ```html
926
+ <lib-title-filters
927
+ title="Comparendos"
928
+ [filtersConfig]="filtersConfig"
929
+ [initialFilters]="savedFilters()"
930
+ (filtersChange)="onFiltersChange($event)"
931
+ (applyFilters)="onApply()"
932
+ (clearFilters)="savedFilters.set({})"
933
+ />
934
+ ```
935
+
936
+ > Al hacer clic en "Borrar Filtros" todos los filtros se limpian, incluyendo los valores iniciales. Al limpiar un chip individual el valor inicial de ese filtro también queda descartado.
937
+
844
938
  **Outputs:**
845
939
 
846
940
  - `filtersChange: Record<string, string | number | Date | null>`
@@ -857,7 +951,8 @@ Encabezado de sección con título, botones de acción configurables y grupo de
857
951
  |---|---|
858
952
  | `icon-download` | Descargar |
859
953
  | `icon-upload` | Cargar / subir |
860
- | `icon-export` | Exportar tabla |
954
+ | `icon-export` | Exportar tabla / exportar CSV |
955
+ | `icon-add` | Agregar / nuevo registro |
861
956
 
862
957
  **Ejemplo — con botón secundario y botón de exportar:**
863
958
 
@@ -1446,6 +1541,7 @@ Componente de **filtro de hora** con chips configurables y selector AM/PM desple
1446
1541
 
1447
1542
  - `filters: FilterItem[]` (requerido) – Filtros de hora disponibles.
1448
1543
  - `clearTrigger: number = 0` – Al incrementar este valor desde el padre se limpian todos los filtros.
1544
+ - `initialValues: Record<string, string> = {}` – Horas a restaurar al inicializar en formato `HH:mm` (24 h), donde la clave es el `FilterItem.value`. Al limpiar un chip individualmente el valor inicial queda descartado y no se restaura automáticamente.
1449
1545
 
1450
1546
  **Outputs:**
1451
1547
 
@@ -1459,6 +1555,7 @@ Componente de **filtro de hora** con chips configurables y selector AM/PM desple
1459
1555
  <lib-input-time-filter
1460
1556
  [filters]="timeFilters"
1461
1557
  [clearTrigger]="clearVersion"
1558
+ [initialValues]="{ startTime: '08:00', endTime: '17:00' }"
1462
1559
  (filterSelected)="onTimeFilter($event)"
1463
1560
  (valueChange)="onTimeChange($event)"
1464
1561
  ></lib-input-time-filter>
@@ -1466,8 +1563,8 @@ Componente de **filtro de hora** con chips configurables y selector AM/PM desple
1466
1563
 
1467
1564
  ```ts
1468
1565
  timeFilters: FilterItem[] = [
1469
- { label: 'Hora inicio', value: 'startTime', type: 'time' },
1470
- { label: 'Hora fin', value: 'endTime', type: 'time' },
1566
+ { label: 'Hora inicio', value: 'startTime', type: 'time', placeholder: 'Hora inicio' },
1567
+ { label: 'Hora fin', value: 'endTime', type: 'time', placeholder: 'Hora fin' },
1471
1568
  ];
1472
1569
  ```
1473
1570