ngx-eiffage-material 0.4.0 → 0.6.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/index.d.ts CHANGED
@@ -5,21 +5,29 @@ import { FormBuilder, FormGroup, FormArray, AbstractControl, ControlValueAccesso
5
5
  import { ErrorStateMatcher } from '@angular/material/core';
6
6
  import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';
7
7
  import { MatSelect, MatSelectChange } from '@angular/material/select';
8
+ import { Observable, Subject } from 'rxjs';
8
9
  import { MatDialogRef, MatDialogConfig } from '@angular/material/dialog';
9
10
  import { DateRange } from '@angular/material/datepicker';
10
11
  import { MatMenuTrigger } from '@angular/material/menu';
11
12
  import { PageEvent, MatPaginator } from '@angular/material/paginator';
12
13
  import { SortDirection, Sort } from '@angular/material/sort';
13
- import { Observable, Subject } from 'rxjs';
14
14
  import jsPDF from 'jspdf';
15
15
  import moment from 'moment';
16
16
  import { MatTableDataSource } from '@angular/material/table';
17
17
  import { MatChipEvent } from '@angular/material/chips';
18
18
 
19
19
  interface BasicSelectConfig<T> {
20
+ /** Propiedad de la opción que se usa como valor del control. */
20
21
  valueKey: keyof T;
22
+ /** Texto de cada opción (en la lista y en el campo). */
21
23
  displayedLabel: (item: T) => string;
24
+ /** Opciones que se ven pero no se pueden elegir. */
22
25
  disabled?: (item: T) => boolean;
26
+ /**
27
+ * Buscador del desplegable: `true` (por defecto) siempre, `false` nunca, o un número para
28
+ * mostrarlo solo cuando haya más opciones que ese número (p. ej. `7`: no sale en listas cortas).
29
+ */
30
+ search?: boolean | number;
23
31
  }
24
32
  /**
25
33
  * Configuration for NgxPaginatedSelect.
@@ -53,6 +61,17 @@ interface PaginatedSelectConfig<T> {
53
61
  avatarText?: (item: T) => string;
54
62
  /** Material icon name shown as avatar when `avatarImage`/`avatarText` are not provided */
55
63
  avatarIcon?: string;
64
+ /**
65
+ * Busca los elementos completos a partir de sus claves. Si el valor llega del formulario solo con
66
+ * ids (sin `selectedItems`), el componente lo usa para mostrar sus nombres en vez de los ids.
67
+ * Las claves son valores de `valueKey`: se tipan como `any[]` para poder escribir
68
+ * `(ids: number[]) => …` sin conversiones (TypeScript no sabe el tipo concreto de `valueKey`).
69
+ */
70
+ loadByKeys?: (keys: any[]) => Observable<T[]>;
71
+ /** Milisegundos de espera tras la última tecla antes de buscar. Por defecto, 400. */
72
+ searchDebounce?: number;
73
+ /** Caracteres mínimos para buscar (con menos, se mantiene la lista y se avisa). Por defecto, 1. */
74
+ minSearchLength?: number;
56
75
  }
57
76
 
58
77
  interface PaginatedItems<T> {
@@ -482,6 +501,17 @@ interface NgxEiffageTexts {
482
501
  dateRangeEnd: string;
483
502
  totalPerPage: string;
484
503
  totalGeneral: string;
504
+ /** Exportar en ngx-basic-table: todos los registros filtrados, no solo la página. */
505
+ exportExcelAll: string;
506
+ exportPdfAll: string;
507
+ /** Casilla de selección de una fila (lectores de pantalla). */
508
+ selectRow: string;
509
+ /** Casilla de la cabecera: seleccionar las filas de la página. */
510
+ selectPage: string;
511
+ expandRow: string;
512
+ collapseRow: string;
513
+ /** Nombre del filtro de columna en la opción «Sin …» de los selects de filtro. */
514
+ columnFilter: string;
485
515
  };
486
516
  /** Diálogo de ordenar y mostrar columnas de las tablas. */
487
517
  columnsDialog: {
@@ -537,6 +567,8 @@ interface NgxEiffageTexts {
537
567
  select: {
538
568
  noResults: string;
539
569
  showMore: string;
570
+ /** Etiqueta accesible del botón X que quita la selección (clearable). */
571
+ clear: string;
540
572
  removeOption: (optionName: string) => string;
541
573
  resultsCount: (count: number) => string;
542
574
  };
@@ -554,6 +586,18 @@ interface NgxEiffageTexts {
554
586
  retry: string;
555
587
  selectedCount: (selected: number, total: number) => string;
556
588
  resultsCount: (total: number) => string;
589
+ /** Etiqueta accesible del botón que quita un elemento seleccionado (chips). */
590
+ removeItem: (label: string) => string;
591
+ /** Texto accesible del indicador «+N» de chips que no caben. */
592
+ moreSelected: (count: number) => string;
593
+ /** Resumen de la selección en modo texto: las primeras etiquetas y cuántas más hay. */
594
+ summary: (labels: string[], rest: number) => string;
595
+ /** Aviso al cerrar el panel múltiple con cambios sin confirmar. */
596
+ discardChanges: string;
597
+ discard: string;
598
+ keepEditing: string;
599
+ /** Búsqueda demasiado corta (minSearchLength). */
600
+ minSearch: (min: number) => string;
557
601
  };
558
602
  /** NgxDialogService y ngx-dialog (botones por defecto). */
559
603
  dialog: {
@@ -1010,7 +1054,7 @@ interface ResolvedOption<T> {
1010
1054
  disabled: boolean;
1011
1055
  visible: boolean;
1012
1056
  }
1013
- declare class NgxBasicSelect<T> implements ControlValueAccessor {
1057
+ declare class NgxBasicSelect<T> implements ControlValueAccessor, AfterViewInit, DoCheck {
1014
1058
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1015
1059
  /**
1016
1060
  * Se auto-registra como ControlValueAccessor del control del formulario.
@@ -1025,19 +1069,21 @@ declare class NgxBasicSelect<T> implements ControlValueAccessor {
1025
1069
  readonly label: _angular_core.InputSignal<string>;
1026
1070
  readonly options: _angular_core.InputSignal<T[]>;
1027
1071
  readonly basicSelectConfig: _angular_core.InputSignal<BasicSelectConfig<T>>;
1028
- readonly isLoading: _angular_core.InputSignal<boolean>;
1072
+ readonly isLoading: _angular_core.InputSignalWithTransform<boolean, unknown>;
1029
1073
  readonly placeholder: _angular_core.InputSignal<string>;
1030
1074
  readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
1031
1075
  readonly appearance: _angular_core.InputSignal<"fill" | "outline">;
1032
- readonly multiple: _angular_core.InputSignal<boolean>;
1033
- readonly disabled: _angular_core.InputSignal<boolean>;
1034
- readonly clearable: _angular_core.InputSignal<boolean>;
1076
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
1077
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1078
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1035
1079
  readonly error: _angular_core.InputSignal<string>;
1036
1080
  readonly class: _angular_core.InputSignal<string>;
1037
1081
  /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */
1038
1082
  selectionChange: _angular_core.OutputEmitterRef<T[keyof T] | T[keyof T][] | null>;
1039
1083
  readonly matSelect: _angular_core.Signal<MatSelect>;
1040
1084
  readonly searchInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
1085
+ /** Igual que matSelect, pero sin fallar antes de crear la vista (ngDoCheck se llama antes). */
1086
+ private readonly _matSelectRef;
1041
1087
  /** FormControl interno que gobierna el mat-select (independiente del control del form). */
1042
1088
  protected readonly innerControl: FormControl<any>;
1043
1089
  /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */
@@ -1046,6 +1092,8 @@ declare class NgxBasicSelect<T> implements ControlValueAccessor {
1046
1092
  private readonly cvaDisabled;
1047
1093
  /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */
1048
1094
  protected readonly searchQuery: _angular_core.WritableSignal<string>;
1095
+ /** Anchos (en %) de las filas fantasma mientras se carga: distintos para que parezca texto. */
1096
+ protected readonly skeletonWidths: number[];
1049
1097
  private onChange;
1050
1098
  private onTouched;
1051
1099
  /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */
@@ -1056,6 +1104,8 @@ declare class NgxBasicSelect<T> implements ControlValueAccessor {
1056
1104
  * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.
1057
1105
  */
1058
1106
  protected readonly resolvedOptions: _angular_core.Signal<ResolvedOption<T>[]>;
1107
+ /** Buscador visible según `basicSelectConfig.search` (true, false o número mínimo de opciones). */
1108
+ protected readonly showSearch: _angular_core.Signal<boolean>;
1059
1109
  /** Hay datos de entrada (con independencia del buscador). */
1060
1110
  protected readonly hasData: _angular_core.Signal<boolean>;
1061
1111
  /**
@@ -1080,14 +1130,17 @@ declare class NgxBasicSelect<T> implements ControlValueAccessor {
1080
1130
  */
1081
1131
  protected readonly errorStateMatcher: ErrorStateMatcher;
1082
1132
  /**
1083
- * Obligatorio si el control del formulario tiene el validador `required`.
1084
- * Se propaga al mat-select interno para que el mat-form-field pinte el
1085
- * asterisco, igual que hace Material con un `<input matInput>`.
1133
+ * Obligatorio si el control del formulario tiene el validador `required`. Se propaga al
1134
+ * mat-select interno para que el mat-form-field pinte el asterisco. Es un signal (no un
1135
+ * método en plantilla): se actualiza con los eventos del control y en cada ngDoCheck.
1086
1136
  */
1087
- protected isRequired(): boolean;
1137
+ protected readonly isRequired: _angular_core.WritableSignal<boolean>;
1088
1138
  /** true cuando el formulario contenedor ya ha intentado enviarse. */
1089
1139
  private _isParentFormSubmitted;
1090
1140
  constructor();
1141
+ ngAfterViewInit(): void;
1142
+ ngDoCheck(): void;
1143
+ private _syncFormState;
1091
1144
  writeValue(value: any): void;
1092
1145
  registerOnChange(fn: (value: any) => void): void;
1093
1146
  registerOnTouched(fn: () => void): void;
@@ -1124,7 +1177,6 @@ declare class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {
1124
1177
  readonly destructive: boolean;
1125
1178
  /** La X no tiene sentido en un diálogo con disableClose (está pensado para no poder cerrarse sin decidir). */
1126
1179
  readonly showClose: boolean;
1127
- readonly closeLabel: string;
1128
1180
  readonly cancelText: string;
1129
1181
  readonly confirmText: string;
1130
1182
  readonly result: _angular_core.WritableSignal<R | undefined>;
@@ -1138,6 +1190,44 @@ declare class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {
1138
1190
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDialog<any, any>, "ngx-dialog", never, {}, {}, never, never, true, never>;
1139
1191
  }
1140
1192
 
1193
+ /**
1194
+ * Encabezado de diálogo con botón X para cerrar: el mismo que usa ngx-dialog, para diálogos propios
1195
+ * abiertos con MatDialog. Va en lugar de `<h2 mat-dialog-title>`:
1196
+ *
1197
+ * ```html
1198
+ * <ngx-dialog-header [title]="'Editar proyecto'" icon="edit" />
1199
+ * <!-- o con contenido propio -->
1200
+ * <ngx-dialog-header>{{ (isNew ? 'PROJECTS.create' : 'PROJECTS.edit') | translate }}</ngx-dialog-header>
1201
+ * ```
1202
+ */
1203
+ declare class NgxDialogHeader implements DoCheck {
1204
+ private readonly _dialogRef;
1205
+ protected readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1206
+ /** Título. También se puede poner como contenido (`<ngx-dialog-header>…</ngx-dialog-header>`). */
1207
+ readonly title: _angular_core.InputSignal<string | undefined>;
1208
+ /** Línea secundaria bajo el título. */
1209
+ readonly subtitle: _angular_core.InputSignal<string | undefined>;
1210
+ /** Icono de Material Symbols delante del título. */
1211
+ readonly icon: _angular_core.InputSignal<string | undefined>;
1212
+ /** Color del icono (p. ej. `var(--mat-sys-error)`). */
1213
+ readonly iconColor: _angular_core.InputSignal<string | undefined>;
1214
+ /**
1215
+ * Muestra la X. Sin indicar, se ve mientras el diálogo se pueda cerrar: se oculta si el diálogo tiene
1216
+ * `disableClose` (también si se activa después, p. ej. durante una subida) y vuelve al quitarlo.
1217
+ */
1218
+ readonly showClose: _angular_core.InputSignal<boolean | undefined>;
1219
+ /** Valor con el que se cierra al pulsar la X. Por defecto `undefined`, igual que con Esc o al pulsar fuera. */
1220
+ readonly closeResult: _angular_core.InputSignal<unknown>;
1221
+ /** disableClose es una propiedad normal del MatDialogRef: se lee en cada comprobación. */
1222
+ private readonly _closable;
1223
+ protected readonly closeVisible: _angular_core.Signal<boolean>;
1224
+ ngDoCheck(): void;
1225
+ /** Cierra el diálogo con `closeResult`. */
1226
+ close(): void;
1227
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDialogHeader, never>;
1228
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDialogHeader, "ngx-dialog-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "closeResult": { "alias": "closeResult"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1229
+ }
1230
+
1141
1231
  /**
1142
1232
  * @deprecated Usar `NgxDialogService.confirm()` (o `template()` con contenido propio), que tiene el
1143
1233
  * encabezado, el botón X y la opción `destructive` de ngx-dialog. Las tablas ya no lo usan; se
@@ -1157,17 +1247,19 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDe
1157
1247
  private readonly dialog;
1158
1248
  private readonly dialogService;
1159
1249
  private readonly datosPantallaService;
1250
+ private readonly _host;
1251
+ private readonly _destroyRef;
1160
1252
  readonly texts: Signal<ngx_eiffage_material.NgxEiffageTexts>;
1161
1253
  protected isDesktop: Signal<boolean>;
1162
1254
  endpoint: _angular_core.InputSignal<(filters: U) => Observable<PaginatedItems<T>>>;
1163
1255
  filters: _angular_core.InputSignal<WritableSignal<U>>;
1164
1256
  config: _angular_core.InputSignal<WritableSignal<PaginatedTableConfig<T>>>;
1165
- protected createClick: _angular_core.OutputEmitterRef<void>;
1166
- protected updateClick: _angular_core.OutputEmitterRef<T>;
1167
- protected deleteClick: _angular_core.OutputEmitterRef<T>;
1168
- protected rowActionClick: _angular_core.OutputEmitterRef<RowActionClickEvent<T>>;
1169
- protected expandedItemChange: _angular_core.OutputEmitterRef<T | null>;
1170
- protected selectionActionEvent: _angular_core.OutputEmitterRef<SelectionActionEvent<T>>;
1257
+ readonly createClick: _angular_core.OutputEmitterRef<void>;
1258
+ readonly updateClick: _angular_core.OutputEmitterRef<T>;
1259
+ readonly deleteClick: _angular_core.OutputEmitterRef<T>;
1260
+ readonly rowActionClick: _angular_core.OutputEmitterRef<RowActionClickEvent<T>>;
1261
+ readonly expandedItemChange: _angular_core.OutputEmitterRef<T | null>;
1262
+ readonly selectionActionEvent: _angular_core.OutputEmitterRef<SelectionActionEvent<T>>;
1171
1263
  protected readonly filterKeyPrefix = "filter";
1172
1264
  protected readonly nameOfActionsColumn = "actionsPerRow";
1173
1265
  protected readonly generalFooterKeyPrefix = "footer";
@@ -1185,21 +1277,30 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDe
1185
1277
  protected showActionsColumn: Signal<boolean>;
1186
1278
  protected showTotalPerPageFooter: Signal<boolean>;
1187
1279
  protected showTotalGeneralFooter: Signal<boolean>;
1280
+ /** Texto del buscador (para la X de borrar; antes se leía el DOM desde la plantilla). */
1281
+ protected readonly queryText: WritableSignal<string>;
1282
+ /** Texto de cada celda de la página (sin componente ni plantilla), calculado una vez. */
1283
+ protected readonly cellTexts: Signal<Map<T, Record<keyof T, string>>>;
1284
+ /** Total por página (de lo cargado) y general (lo da el consumidor con getTotalGeneral), ya formateados. */
1285
+ protected readonly pageTotals: Signal<Record<string, string>>;
1286
+ protected readonly generalTotals: Signal<Record<string, string>>;
1287
+ /** Descripción del filtro avanzado aplicado (HTML). */
1288
+ protected readonly advancedFilterLabel: Signal<string>;
1188
1289
  protected queryTimeout: number | undefined;
1189
1290
  protected timeoutsByKey: Partial<Record<keyof T, number>>;
1190
1291
  protected advancedFilters: Signal<AdvancedFilter<T>[]>;
1191
1292
  protected readonly expandableColumnDef = "expandedDetail";
1192
1293
  protected expandedItem: WritableSignal<T | null>;
1193
1294
  protected selection: WritableSignal<T[]>;
1295
+ /** Claves de las filas seleccionadas: comprobar una fila es O(1). */
1296
+ private readonly _selectedKeys;
1297
+ protected readonly allPageSelected: Signal<boolean>;
1194
1298
  protected isFullScreen: WritableSignal<boolean>;
1195
1299
  private readonly overlay;
1196
- private readonly overlayContainer;
1197
1300
  private readonly viewContainerRef;
1198
1301
  tableContentTemplate: Signal<TemplateRef<any> | undefined>;
1199
1302
  private overlayRef?;
1200
- private portal?;
1201
1303
  protected defaultFiltersForPaginatedFilterOptions: WritableSignal<PaginatedFilter<FilterOption>>;
1202
- onEscape(): void;
1203
1304
  ngOnDestroy(): void;
1204
1305
  private includeInColumnConfig;
1205
1306
  protected getKeyAsString: (columnKey: keyof T | string) => string;
@@ -1224,34 +1325,32 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDe
1224
1325
  protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined;
1225
1326
  protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null;
1226
1327
  protected onEditColumns(): void;
1227
- protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any;
1228
1328
  protected onNewAdvancedFiltersClick(): void;
1229
1329
  protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>): void;
1230
1330
  protected onSelectedAdvancedFilterUpdate(event: Event): void;
1231
1331
  protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger): void;
1232
1332
  protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>): void;
1233
1333
  protected onQuitAdvancedFilter(event: Event): void;
1234
- protected getAdvancedFilterLabel(): string;
1334
+ /** Por clave y no por referencia: el detalle sigue abierto si la página se recarga. */
1235
1335
  protected rowIsExpanded(row: T): boolean;
1236
1336
  protected expandableToggle(row: T): void;
1237
- protected getTotalOfColum(columnKey: keyof T): number;
1238
- protected areEqualByKeys(record1: T, record2: T): boolean;
1337
+ /** Lo que se pinta en una celda sin componente ni plantilla: valueGetter, o el valor con sus pipes, o «-». */
1338
+ private displayText;
1339
+ private totalsText;
1239
1340
  protected isRowSelected(row: T): boolean;
1240
1341
  protected toggleRowSelection(row: T): void;
1241
- protected isAllPageRowSelected(): boolean;
1242
1342
  protected toggleAllPageRowSelection(): void;
1243
1343
  private getSelectableRows;
1244
1344
  protected getRowSelectionAction(): RowSelectionAction<T>[];
1245
1345
  protected uncheckAllSelection(): void;
1246
1346
  protected onRowSelectionActionClick(actionId: string): void;
1247
- private getDocumentHeaders;
1248
- private getDocumentRows;
1347
+ /** Exporta la página cargada, con las columnas visibles y en el orden elegido. */
1249
1348
  protected exportToCsvCurrentPage(): void;
1250
1349
  protected exportToPdfCurrentPage(): void;
1350
+ private exportOptions;
1251
1351
  protected onToggleFullScreen(): void;
1252
1352
  private enterFullscreen;
1253
1353
  private exitFullscreen;
1254
- private isMyOverlayOnTop;
1255
1354
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedTable<any, any>, never>;
1256
1355
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPaginatedTable<any, any>, "ngx-paginated-table", never, { "endpoint": { "alias": "endpoint"; "required": true; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; }, { "createClick": "createClick"; "updateClick": "updateClick"; "deleteClick": "deleteClick"; "rowActionClick": "rowActionClick"; "expandedItemChange": "expandedItemChange"; "selectionActionEvent": "selectionActionEvent"; }, never, ["[icon-buttons]", "[more-filters]", "[extra-header-content]", "[end-container]"], true, never>;
1257
1356
  }
@@ -1261,6 +1360,8 @@ declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1261
1360
  private readonly dialog;
1262
1361
  private readonly dialogService;
1263
1362
  private readonly datosPantallaService;
1363
+ private readonly _host;
1364
+ private readonly _destroyRef;
1264
1365
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1265
1366
  protected isDesktop: _angular_core.Signal<boolean>;
1266
1367
  filters: _angular_core.InputSignal<WritableSignal<U>>;
@@ -1269,14 +1370,22 @@ declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1269
1370
  loading: _angular_core.InputSignal<boolean>;
1270
1371
  queryFilter: _angular_core.InputSignal<((query: string, data: T[]) => T[]) | undefined>;
1271
1372
  moreFilters: _angular_core.InputSignal<(data: T[], filters: U) => T[]>;
1272
- protected createClick: _angular_core.OutputEmitterRef<void>;
1273
- protected updateClick: _angular_core.OutputEmitterRef<T>;
1274
- protected deleteClick: _angular_core.OutputEmitterRef<T>;
1275
- protected rowActionClick: _angular_core.OutputEmitterRef<RowActionClickEvent<T>>;
1276
- protected expandedItemChange: _angular_core.OutputEmitterRef<T | null>;
1277
- protected selectionActionEvent: _angular_core.OutputEmitterRef<SelectionActionEvent<T>>;
1373
+ readonly createClick: _angular_core.OutputEmitterRef<void>;
1374
+ readonly updateClick: _angular_core.OutputEmitterRef<T>;
1375
+ readonly deleteClick: _angular_core.OutputEmitterRef<T>;
1376
+ readonly rowActionClick: _angular_core.OutputEmitterRef<RowActionClickEvent<T>>;
1377
+ readonly expandedItemChange: _angular_core.OutputEmitterRef<T | null>;
1378
+ readonly selectionActionEvent: _angular_core.OutputEmitterRef<SelectionActionEvent<T>>;
1379
+ protected paginator: _angular_core.Signal<MatPaginator | undefined>;
1380
+ /** Búsqueda, orden, filtros de columna y moreFilters aplicados: lo que se pagina y se exporta. */
1381
+ protected readonly filteredData: _angular_core.Signal<T[]>;
1278
1382
  dataSource: _angular_core.Signal<MatTableDataSource<T, MatPaginator>>;
1279
- filtersEffect: _angular_core.EffectRef;
1383
+ private readonly _syncData;
1384
+ /** Filas de la página visible (cambia con el paginador): totales por página y «seleccionar página». */
1385
+ protected readonly pageRows: _angular_core.Signal<T[]>;
1386
+ /** Al cambiar la búsqueda, el orden o un filtro se vuelve a la primera página. */
1387
+ private _lastFilters?;
1388
+ private readonly _resetPage;
1280
1389
  protected columnConfig: _angular_core.Signal<ColumnConfig<T>[]>;
1281
1390
  protected readonly filterKeyPrefix = "filter";
1282
1391
  protected readonly nameOfActionsColumn = "actionsPerRow";
@@ -1291,29 +1400,39 @@ declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1291
1400
  protected showTotalPerPageFooter: _angular_core.Signal<boolean>;
1292
1401
  protected showTotalGeneralFooter: _angular_core.Signal<boolean>;
1293
1402
  protected showQueryFilter: _angular_core.Signal<boolean>;
1403
+ /** Texto del buscador (para la X de borrar; antes se leía el DOM desde la plantilla). */
1404
+ protected readonly queryText: WritableSignal<string>;
1405
+ /** Texto de cada celda de la página (sin componente ni plantilla), calculado una vez. */
1406
+ protected readonly cellTexts: _angular_core.Signal<Map<T, Record<keyof T, string>>>;
1407
+ /** Totales por página y generales ya formateados, por clave de columna. */
1408
+ protected readonly pageTotals: _angular_core.Signal<Record<string, string>>;
1409
+ protected readonly generalTotals: _angular_core.Signal<Record<string, string>>;
1294
1410
  protected tableContentTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
1295
1411
  protected isFullScreen: WritableSignal<boolean>;
1296
1412
  private overlayRef?;
1297
- private portal?;
1298
1413
  private readonly overlay;
1299
- private readonly overlayContainer;
1300
1414
  private readonly viewContainerRef;
1301
1415
  protected selection: WritableSignal<T[]>;
1416
+ /** Claves de las filas seleccionadas: comprobar una fila es O(1). */
1417
+ private readonly _selectedKeys;
1418
+ protected readonly allPageSelected: _angular_core.Signal<boolean>;
1302
1419
  protected readonly expandableColumnDef = "expandedDetail";
1303
1420
  protected expandedItem: WritableSignal<T | null>;
1304
- protected paginator: _angular_core.Signal<MatPaginator | undefined>;
1305
1421
  protected defaultFiltersForPaginatedFilterOptions: WritableSignal<PaginatedFilter<FilterOption>>;
1422
+ constructor();
1306
1423
  protected getKeyAsString: (columnKey: keyof T | string) => string;
1307
1424
  private includeInColumnConfig;
1308
- protected onEscape(): void;
1309
1425
  private someColumnFilterable;
1426
+ /** Busca en el texto que se ve de cada columna buscable (también números, fechas con pipe y valueGetter). */
1310
1427
  private applyInputFilter;
1311
1428
  private applySort;
1312
1429
  private applyColumnFilter;
1430
+ /** Lo que se pinta en una celda sin componente ni plantilla: valueGetter, o el valor con sus pipes, o «-». */
1431
+ private displayText;
1432
+ private totalsText;
1313
1433
  protected onToggleFullScreen(): void;
1314
1434
  private enterFullscreen;
1315
1435
  private exitFullscreen;
1316
- private isMyOverlayOnTop;
1317
1436
  protected onNewClick(): void;
1318
1437
  protected onUpdateClick(row: T, event: Event): void;
1319
1438
  protected onRowClick(row: T): void;
@@ -1324,22 +1443,16 @@ declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1324
1443
  protected getRowSelectionAction(): RowSelectionAction<T>[];
1325
1444
  protected uncheckAllSelection(): void;
1326
1445
  protected onRowSelectionActionClick(actionId: string): void;
1327
- private getDocumentHeaders;
1328
- private getDocumentRows;
1446
+ /** Exporta todos los registros filtrados, con las columnas visibles y en el orden elegido. */
1329
1447
  protected exportToCsv(): void;
1330
1448
  protected exportToPdf(): void;
1449
+ private exportOptions;
1331
1450
  protected onQueryChange(inputElement: HTMLInputElement): void;
1332
1451
  protected onQueryReset(inputElement: HTMLInputElement): void;
1333
1452
  protected onSortChange(sort: Sort): void;
1334
1453
  protected toggleAllPageRowSelection(): void;
1335
- protected isAllPageRowSelected(): boolean;
1336
- protected areEqualByKeys(record1: T, record2: T): boolean;
1337
1454
  protected isRowSelected(row: T): boolean;
1338
1455
  protected toggleRowSelection(row: T): void;
1339
- protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any;
1340
- protected getTotalPerPageOfColum(columnKey: keyof T): number;
1341
- protected getDataOfCurrentPage(): T[];
1342
- protected getTotalOfColum(columnKey: keyof T): number;
1343
1456
  protected getValueOfColumnFilter(key: keyof T): ColumnValue;
1344
1457
  protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined;
1345
1458
  protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined;
@@ -1350,6 +1463,7 @@ declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1350
1463
  protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null): void;
1351
1464
  protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null): void;
1352
1465
  private onColumnFilterChange;
1466
+ /** Por clave y no por referencia: el detalle sigue abierto si los datos se recargan. */
1353
1467
  protected rowIsExpanded(row: T): boolean;
1354
1468
  protected expandableToggle(row: T): void;
1355
1469
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxBasicTable<any, any>, never>;
@@ -1490,7 +1604,7 @@ declare class NgxAlert {
1490
1604
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxAlert, "ngx-alert", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "hideIcon": { "alias": "hideIcon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "dismissLabel": { "alias": "dismissLabel"; "required": false; "isSignal": true; }; "politeness": { "alias": "politeness"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, never, ["*", "[alertActions]"], true, never>;
1491
1605
  }
1492
1606
 
1493
- declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor {
1607
+ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, DoCheck {
1494
1608
  private readonly _bottomSheet;
1495
1609
  /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */
1496
1610
  private readonly _ngControl;
@@ -1498,6 +1612,8 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements Con
1498
1612
  private readonly _parentFormGroup;
1499
1613
  private readonly _parentForm;
1500
1614
  private readonly _changeDetectorRef;
1615
+ private readonly _destroyRef;
1616
+ private readonly _host;
1501
1617
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1502
1618
  /** Label that floats on the form field */
1503
1619
  readonly label: _angular_core.InputSignal<string>;
@@ -1577,28 +1693,52 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements Con
1577
1693
  private _suppressEmit;
1578
1694
  /** Huella de la última selección aplicada desde el input `selectedItems`. */
1579
1695
  private _lastSyncedSelection;
1696
+ /** Primera página de la última apertura: la siguiente se pinta al instante mientras recarga. */
1697
+ private readonly _pageCache;
1698
+ /** Claves ya pedidas a config.loadByKeys (no se repiten aunque fallen). */
1699
+ private readonly _requestedKeys;
1700
+ /** Resolviendo etiquetas con config.loadByKeys. */
1701
+ protected readonly isResolving: WritableSignal<boolean>;
1580
1702
  protected readonly isDisabled: _angular_core.Signal<boolean>;
1703
+ /** Todas las etiquetas seleccionadas, separadas por comas (tooltip del modo texto). */
1704
+ protected readonly fullLabel: _angular_core.Signal<string>;
1705
+ /** Lo que se ve en el modo texto: en múltiple, las 3 primeras y «y N más». */
1581
1706
  protected readonly selectedLabel: _angular_core.Signal<string>;
1582
1707
  protected readonly hasSelection: _angular_core.Signal<boolean>;
1583
1708
  protected readonly showChips: _angular_core.Signal<boolean>;
1584
1709
  protected readonly displayedChips: _angular_core.Signal<Partial<T>[]>;
1710
+ /**
1711
+ * En fila (chipsDirection="row"), cuántos de los chips mostrados caben enteros en el ancho del
1712
+ * campo; null = sin medir. Los que no caben se ocultan y pasan a contar en el «+N», en vez de
1713
+ * quedar cortados a medias.
1714
+ */
1715
+ private readonly _fittingChips;
1716
+ /** Chips visibles de verdad: los de maxChipsDisplayed que caben (en fila) o todos (en columna). */
1717
+ protected readonly visibleChipCount: _angular_core.Signal<number>;
1585
1718
  protected readonly remainingChipsCount: _angular_core.Signal<number>;
1586
1719
  /** ErrorStateMatcher que refleja el estado del control del formulario. */
1587
1720
  protected readonly errorStateMatcher: ErrorStateMatcher;
1588
1721
  /** true cuando el formulario contenedor ya ha intentado enviarse. */
1589
1722
  private _isParentFormSubmitted;
1590
1723
  /**
1591
- * Obligatorio si el control del formulario tiene el validador `required`.
1592
- * Se propaga al input interno para que el mat-form-field pinte el asterisco,
1593
- * igual que hace Material con un `<input matInput>` normal.
1724
+ * Obligatorio si el control del formulario tiene el validador `required`: el mat-form-field pinta
1725
+ * el asterisco. Signal (no método en plantilla) que se actualiza en ngDoCheck.
1594
1726
  */
1595
- protected isRequired(): boolean;
1727
+ protected readonly isRequired: WritableSignal<boolean>;
1728
+ /** Control visible según el modo (chips o texto), para recalcular su error con OnPush. */
1729
+ private readonly _chipGrid;
1730
+ private readonly _textInput;
1596
1731
  protected readonly effectiveSearchPlaceholder: _angular_core.Signal<string>;
1597
1732
  protected readonly effectiveNoResults: _angular_core.Signal<string>;
1598
1733
  protected readonly effectiveConfirmLabel: _angular_core.Signal<string>;
1599
1734
  protected readonly effectiveResetLabel: _angular_core.Signal<string>;
1600
1735
  protected readonly effectiveSelectAllLabel: _angular_core.Signal<string>;
1601
1736
  constructor();
1737
+ ngAfterViewInit(): void;
1738
+ ngDoCheck(): void;
1739
+ /** Cuenta los chips que acaban dentro del ancho visible del grid (al menos uno). */
1740
+ private _measureChips;
1741
+ private _syncFormState;
1602
1742
  writeValue(value: T[keyof T] | T[keyof T][] | null): void;
1603
1743
  registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | null) => void): void;
1604
1744
  registerOnTouched(fn: () => void): void;
@@ -1612,6 +1752,8 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements Con
1612
1752
  * `String(item[valueKey])` so partial objects never throw.
1613
1753
  */
1614
1754
  protected getLabel(item: Partial<T>): string;
1755
+ /** Pide a config.loadByKeys los elementos de los que solo se conoce la clave. */
1756
+ private _resolvePartials;
1615
1757
  openBottomSheet(event: Event): void;
1616
1758
  /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */
1617
1759
  onTriggerKeydown(event: KeyboardEvent): void;
@@ -1621,6 +1763,36 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements Con
1621
1763
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPaginatedSelect<any, any>, "ngx-paginated-select", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "endpoint": { "alias": "endpoint"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "selectedItems": { "alias": "selectedItems"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "displayMode": { "alias": "displayMode"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "optionTemplate": { "alias": "optionTemplate"; "required": false; "isSignal": true; }; "extraFiltersTemplate": { "alias": "extraFiltersTemplate"; "required": false; "isSignal": true; }; "maxChipsDisplayed": { "alias": "maxChipsDisplayed"; "required": false; "isSignal": true; }; "chipsDirection": { "alias": "chipsDirection"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "selectionChange": "selectionChange"; }, never, never, true, never>;
1622
1764
  }
1623
1765
 
1766
+ /** Trozo de una etiqueta: `match` = coincide con la búsqueda (se resalta). */
1767
+ interface LabelPart {
1768
+ text: string;
1769
+ match: boolean;
1770
+ }
1771
+ /** Estado ya resuelto de cada fila: se calcula una vez por cambio, no en cada pasada de la plantilla. */
1772
+ interface OptionView<T> {
1773
+ item: T;
1774
+ key: unknown;
1775
+ index: number;
1776
+ id: string;
1777
+ label: string;
1778
+ labelParts: LabelPart[];
1779
+ subtitle: string | null;
1780
+ disabled: boolean;
1781
+ selected: boolean;
1782
+ /** Seleccionada que no está en las páginas cargadas: se fija arriba para que se vea al abrir. */
1783
+ pinned: boolean;
1784
+ avatarImage: string | null;
1785
+ avatarText: string;
1786
+ /** Tono del avatar de texto (0-3), estable para cada elemento. */
1787
+ avatarTone: number;
1788
+ }
1789
+ /** Primera página guardada entre aperturas: se muestra al instante mientras se recarga. */
1790
+ interface NgxPaginatedSelectPageCache<T> {
1791
+ value: {
1792
+ fingerprint: string;
1793
+ page: PaginatedItems<T>;
1794
+ } | null;
1795
+ }
1624
1796
  interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {
1625
1797
  title: string;
1626
1798
  config: PaginatedSelectConfig<T>;
@@ -1640,18 +1812,33 @@ interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {
1640
1812
  extraFiltersTemplate: TemplateRef<void> | null;
1641
1813
  showSelectAll: boolean;
1642
1814
  selectAllLabel: string;
1815
+ /** Primera página de aperturas anteriores (opcional). */
1816
+ cache?: NgxPaginatedSelectPageCache<T>;
1643
1817
  }
1644
1818
  declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {
1645
1819
  private readonly _ref;
1646
1820
  private readonly _destroy;
1821
+ private readonly _host;
1822
+ private readonly _injector;
1647
1823
  readonly data: NgxPaginatedSelectBottomSheetData<T, U>;
1648
1824
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1825
+ /** Prefijo de ids para aria-activedescendant. */
1826
+ readonly listId: string;
1827
+ private readonly _key;
1828
+ /** Mínimo de caracteres para lanzar una búsqueda. */
1829
+ readonly minSearch: number;
1649
1830
  /** Raw input value — updates on every keystroke, does NOT trigger the resource */
1650
1831
  readonly query: WritableSignal<string | undefined>;
1832
+ /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */
1833
+ private readonly failedImages;
1651
1834
  /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */
1652
1835
  readonly selectedItems: WritableSignal<Partial<T>[]>;
1836
+ /** Claves seleccionadas al abrir: para saber si hay cambios sin confirmar. */
1837
+ private readonly _initialKeys;
1838
+ /** Aviso «¿Descartar los cambios?» visible (múltiple). */
1839
+ readonly confirmDiscard: WritableSignal<boolean>;
1653
1840
  /**
1654
- * Subject used to bypass the 400 ms debounce (e.g. when the user clears
1841
+ * Subject used to bypass the debounce (e.g. when the user clears
1655
1842
  * the search field — we want an immediate response).
1656
1843
  */
1657
1844
  private readonly _immediateQuery$;
@@ -1667,6 +1854,20 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1667
1854
  readonly options: _angular_core.Signal<T[]>;
1668
1855
  readonly hasError: _angular_core.Signal<boolean>;
1669
1856
  readonly selectedCount: _angular_core.Signal<number>;
1857
+ /** Claves seleccionadas en un Set: comprobar si una opción está elegida es O(1). */
1858
+ private readonly _selectedKeys;
1859
+ /** Hay cambios respecto a la selección con la que se abrió el panel. */
1860
+ readonly isDirty: _angular_core.Signal<boolean>;
1861
+ /** Búsqueda escrita pero más corta que minSearchLength. */
1862
+ readonly searchTooShort: _angular_core.Signal<boolean>;
1863
+ /** Opción activa del teclado (índice en optionViews); -1 = ninguna. */
1864
+ readonly activeIndex: WritableSignal<number>;
1865
+ readonly activeId: _angular_core.Signal<string | null>;
1866
+ /**
1867
+ * Todo lo que pinta cada fila, resuelto de una vez. En simple, si lo seleccionado no está en
1868
+ * las páginas cargadas y no se está buscando, se fija arriba para que se vea al abrir.
1869
+ */
1870
+ readonly optionViews: _angular_core.Signal<OptionView<T>[]>;
1670
1871
  /**
1671
1872
  * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante
1672
1873
  * la carga por scroll, resource.value() pasa transitoriamente al defaultValue
@@ -1677,9 +1878,9 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1677
1878
  private readonly _total;
1678
1879
  readonly total: _angular_core.Signal<number>;
1679
1880
  private readonly _totalEffect;
1680
- /** Cargando la PRIMERA página (lista vacía) → se muestran skeletons. */
1881
+ /** Cargando la PRIMERA página sin nada que enseñar → skeletons. */
1681
1882
  readonly isInitialLoading: _angular_core.Signal<boolean>;
1682
- /** Cargando MÁS páginas (scroll) → fila inline "cargando más…", sin barra superior. */
1883
+ /** Cargando MÁS páginas (scroll) → fila «cargando más…». Recargar la primera (caché) no la muestra. */
1683
1884
  readonly isLoadingMore: _angular_core.Signal<boolean>;
1684
1885
  /** Ya se han cargado todos los resultados disponibles. */
1685
1886
  readonly allLoaded: _angular_core.Signal<boolean>;
@@ -1690,19 +1891,12 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1690
1891
  /**
1691
1892
  * Reactively depends ONLY on `resource.value()`. The filter snapshot is read
1692
1893
  * via `untracked` so external filter changes (parent-driven, e.g. an extra
1693
- * filters panel) do NOT create a reactive dependency here — that would make
1694
- * the effect re-run on scroll page increments with stale resource data,
1695
- * duplicating items and breaking `onScroll` (see original limitation).
1894
+ * filters panel) do NOT create a reactive dependency here.
1696
1895
  *
1697
1896
  * Reset logic:
1698
1897
  * - Fingerprint the current filter identity (everything except `pageNumber`).
1699
- * - If the fingerprint changed since the previous fetch, this fetch belongs
1700
- * to a different filter set → replace the accumulated array.
1898
+ * - If the fingerprint changed since the previous fetch, or this is page 1 → replace.
1701
1899
  * - If only `pageNumber` moved, this is a scroll-load-more → append.
1702
- *
1703
- * This is what allows callers to mutate `data.filters` from outside (extra
1704
- * filter selects, checkboxes, etc.) and have the list refresh cleanly
1705
- * without the previous page's items lingering.
1706
1900
  */
1707
1901
  private _lastFilterFingerprint;
1708
1902
  private readonly _accumEffect;
@@ -1714,14 +1908,24 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1714
1908
  */
1715
1909
  getLabel(item: Partial<T>): string;
1716
1910
  getAvatarText(item: Partial<T>): string;
1717
- /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */
1718
- private readonly failedImages;
1719
1911
  /** URL de imagen del avatar, o null si no hay o si falló al cargar. */
1720
1912
  getAvatarImage(item: Partial<T>): string | null | undefined;
1721
1913
  /** Marca la imagen como fallida para caer al texto/icono. */
1722
1914
  onAvatarError(item: Partial<T>): void;
1723
1915
  toggleItem(item: T): void;
1724
1916
  removeSelectedChip(item: Partial<T>): void;
1917
+ /**
1918
+ * Patrón combobox: el foco se queda en el buscador (se puede seguir escribiendo) y la opción
1919
+ * activa se marca con aria-activedescendant. Flechas y RePág/AvPág la mueven; Intro elige.
1920
+ */
1921
+ onSearchKeydown(event: KeyboardEvent): void;
1922
+ /** Sin buscador, la propia lista recibe el foco: además, Inicio/Fin y Espacio. */
1923
+ onListKeydown(event: KeyboardEvent): void;
1924
+ onOptionClick(view: OptionView<T>): void;
1925
+ private _moveActive;
1926
+ private _chooseActive;
1927
+ /** Activa una opción y la trae a la vista (si es de las últimas, el scroll carga la siguiente página). */
1928
+ private _setActive;
1725
1929
  onQueryInput(event: Event, container: HTMLElement): void;
1726
1930
  clearQuery(container?: HTMLElement): void;
1727
1931
  onScroll(container: HTMLElement): void;
@@ -1730,7 +1934,16 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1730
1934
  toggleSelectAll(): void;
1731
1935
  confirm(): void;
1732
1936
  reset(): void;
1937
+ /** Cierra sin aplicar cambios (botón X). En múltiple con cambios, pregunta antes. */
1733
1938
  close(): void;
1939
+ /** Cerrar desde la X, Escape o el fondo: si hay cambios sin confirmar, avisa primero. */
1940
+ requestClose(): void;
1941
+ discardChanges(): void;
1942
+ keepEditing(): void;
1943
+ /** Identidad de unos filtros sin la página: misma huella = misma lista. */
1944
+ private _fingerprint;
1945
+ /** Las funciones de config pueden fallar con objetos parciales (solo valueKey): se tratan como vacías. */
1946
+ private _safe;
1734
1947
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedSelectBottomSheetComponent<any, any>, never>;
1735
1948
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPaginatedSelectBottomSheetComponent<any, any>, "ngx-paginated-select-bottom-sheet", never, {}, {}, never, never, true, never>;
1736
1949
  }
@@ -2003,5 +2216,5 @@ declare class DynamicHostDirective<T> {
2003
2216
  declare const includeNoSensible: (cadena: string, query: string) => boolean;
2004
2217
  declare const base64ToUtf8: (str: string) => string;
2005
2218
 
2006
- export { AdvancedFilterService, AdvancedFilterUtils, ColumnConfigService, DatosPantallaService, DialogBodyType, DynamicHostDirective, NGX_EIFFAGE_DEFAULT_TEXTS, NGX_EIFFAGE_TEXTS, NgxAlert, NgxBasicSelect, NgxBasicTable, NgxConfirmDialogComponent, NgxDialog, NgxDialogContext, NgxDialogService, NgxFileInput, NgxInputFile, NgxLoadingButton, NgxPaginatedSelect, NgxPaginatedSelectBottomSheetComponent, NgxPaginatedTable, NgxSkeleton, NgxTablesIntl, NgxTexts, OPERATOR_BY_FILTER_TYPE, PaginatedSearchableSelectComponent, SearchableSelectComponent, USER_ID_FACTORY, base64ToUtf8, includeNoSensible, isFilterOption, provideNgxEiffageTexts };
2007
- export type { AdvancedFilter, AlertAppearance, AlertType, BasicFilter, BasicSelectConfig, BasicTableColumn, BasicTableConfig, ColumnConfig, ColumnPipe, ColumnValue, ConfigureTableColumnData, ConfirmDialogData, DeleteConfirm, DialogBodyConfig, DialogConfig, DynamicFilter, FilterConnector, FilterGroup, FilterOperator, FilterOption, FilterRule, FilterType, LoadingButtonAppearance, LoadingButtonColor, NgxDialogTemplateContext, NgxEiffageTexts, NgxEiffageTextsOverrides, NgxEiffageTextsSource, NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem, NgxPaginatedSelectBottomSheetData, PaginatedFilter, PaginatedItems, PaginatedSelectConfig, PaginatedTableColumn, PaginatedTableConfig, Pantalla, RowActionClickEvent, RowActionIconColor, RowSelectionAction, SelectionActionEvent, SendType, SkeletonAnimation, SkeletonVariant, SortBy, SortType, TableBasicAction, TableRowAction, TipoPantalla };
2219
+ export { AdvancedFilterService, AdvancedFilterUtils, ColumnConfigService, DatosPantallaService, DialogBodyType, DynamicHostDirective, NGX_EIFFAGE_DEFAULT_TEXTS, NGX_EIFFAGE_TEXTS, NgxAlert, NgxBasicSelect, NgxBasicTable, NgxConfirmDialogComponent, NgxDialog, NgxDialogContext, NgxDialogHeader, NgxDialogService, NgxFileInput, NgxInputFile, NgxLoadingButton, NgxPaginatedSelect, NgxPaginatedSelectBottomSheetComponent, NgxPaginatedTable, NgxSkeleton, NgxTablesIntl, NgxTexts, OPERATOR_BY_FILTER_TYPE, PaginatedSearchableSelectComponent, SearchableSelectComponent, USER_ID_FACTORY, base64ToUtf8, includeNoSensible, isFilterOption, provideNgxEiffageTexts };
2220
+ export type { AdvancedFilter, AlertAppearance, AlertType, BasicFilter, BasicSelectConfig, BasicTableColumn, BasicTableConfig, ColumnConfig, ColumnPipe, ColumnValue, ConfigureTableColumnData, ConfirmDialogData, DeleteConfirm, DialogBodyConfig, DialogConfig, DynamicFilter, FilterConnector, FilterGroup, FilterOperator, FilterOption, FilterRule, FilterType, LoadingButtonAppearance, LoadingButtonColor, NgxDialogTemplateContext, NgxEiffageTexts, NgxEiffageTextsOverrides, NgxEiffageTextsSource, NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem, NgxPaginatedSelectBottomSheetData, NgxPaginatedSelectPageCache, PaginatedFilter, PaginatedItems, PaginatedSelectConfig, PaginatedTableColumn, PaginatedTableConfig, Pantalla, RowActionClickEvent, RowActionIconColor, RowSelectionAction, SelectionActionEvent, SendType, SkeletonAnimation, SkeletonVariant, SortBy, SortType, TableBasicAction, TableRowAction, TipoPantalla };