ngx-eiffage-material 0.0.50 → 0.1.1

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
@@ -1,10 +1,12 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnInit, ElementRef, WritableSignal, Type, TemplateRef, PipeTransform, InjectionToken, Signal, OnDestroy } from '@angular/core';
3
- import { FormControl, ControlValueAccessor } from '@angular/forms';
3
+ import { ControlValueAccessor, FormControl, FormBuilder, FormGroup, FormArray, AbstractControl } from '@angular/forms';
4
+ import { ErrorStateMatcher } from '@angular/material/core';
4
5
  import { SubscriptSizing } from '@angular/material/form-field';
5
6
  import { MatSelect, MatSelectChange } from '@angular/material/select';
6
- import { MatDialogRef, MatDialogConfig } from '@angular/material/dialog';
7
7
  import { Observable, Subject } from 'rxjs';
8
+ import * as ngx_eiffage_material from 'ngx-eiffage-material';
9
+ import { MatDialogRef, MatDialogConfig } from '@angular/material/dialog';
8
10
  import { DateRange } from '@angular/material/datepicker';
9
11
  import { MatMenuTrigger } from '@angular/material/menu';
10
12
  import { PageEvent, MatPaginator } from '@angular/material/paginator';
@@ -13,7 +15,6 @@ import jsPDF from 'jspdf';
13
15
  import moment from 'moment';
14
16
  import { MatTableDataSource } from '@angular/material/table';
15
17
  import { MatChipEvent } from '@angular/material/chips';
16
- import { ErrorStateMatcher } from '@angular/material/core';
17
18
 
18
19
  declare class NgxLoadingButton {
19
20
  isLoading: _angular_core.InputSignal<boolean>;
@@ -28,13 +29,18 @@ declare class NgxLoadingButton {
28
29
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxLoadingButton, "ngx-loading-button", never, { "isLoading": { "alias": "isLoading"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "matButton": { "alias": "matButton"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "spinnerDiameter": { "alias": "spinnerDiameter"; "required": false; "isSignal": true; }; "spinnerStrokeWidth": { "alias": "spinnerStrokeWidth"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
29
30
  }
30
31
 
31
- declare class NgxInputFile implements OnInit {
32
+ declare class NgxInputFile implements ControlValueAccessor, OnInit {
32
33
  private _cdr;
33
34
  value: _angular_core.WritableSignal<File[]>;
34
35
  onChangeCb?: (files: File[]) => void;
35
36
  onTouchCb?: () => void;
36
37
  label: _angular_core.InputSignal<string>;
37
- control: _angular_core.InputSignal<FormControl<File[]>>;
38
+ /**
39
+ * FormControl externo. Es opcional: si el componente se usa con
40
+ * `formControlName` / `[formControl]`, el enlace se hace por
41
+ * ControlValueAccessor y no hace falta pasarlo.
42
+ */
43
+ control: _angular_core.InputSignal<FormControl<File[]> | undefined>;
38
44
  disabled: _angular_core.InputSignal<boolean>;
39
45
  placeholder: _angular_core.InputSignal<string>;
40
46
  class: _angular_core.InputSignal<string>;
@@ -45,6 +51,10 @@ declare class NgxInputFile implements OnInit {
45
51
  isDropping: _angular_core.WritableSignal<boolean>;
46
52
  inputFileRef: _angular_core.Signal<ElementRef<any> | undefined>;
47
53
  internalControl: FormControl<string[] | null>;
54
+ /** Estado deshabilitado que llega desde setDisabledState() (reactive forms). */
55
+ private readonly _cvaDisabled;
56
+ /** Estado deshabilitado efectivo: input `disabled` o el del FormControl padre. */
57
+ readonly isDisabled: _angular_core.Signal<boolean>;
48
58
  constructor();
49
59
  private checkErrors;
50
60
  controlEffect: _angular_core.EffectRef;
@@ -58,11 +68,14 @@ declare class NgxInputFile implements OnInit {
58
68
  writeValue(files: File[] | undefined | null): void;
59
69
  registerOnChange(fn: any): void;
60
70
  registerOnTouched(fn: any): void;
71
+ setDisabledState(isDisabled: boolean): void;
61
72
  onDeleteFileClick(file: File): void;
62
73
  getAccept(): string;
63
74
  bytesToMegaBytes(bytes: number): string;
75
+ private markAsTouched;
76
+ private markAsDirty;
64
77
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxInputFile, never>;
65
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxInputFile, "ngx-input-file", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
78
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxInputFile, "ngx-input-file", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
66
79
  }
67
80
 
68
81
  interface BasicSelectConfig<T> {
@@ -89,12 +102,18 @@ interface PaginatedSelectConfig<T> {
89
102
  subtitle?: (item: T) => string;
90
103
  /** Whether an individual option row is disabled */
91
104
  disabled?: (item: T) => boolean;
105
+ /**
106
+ * URL of an image shown in the circular avatar (e.g. a photo or logo).
107
+ * Takes priority over `avatarText` and `avatarIcon`. If the image fails to
108
+ * load, the component falls back to `avatarText`/`avatarIcon`/initials.
109
+ */
110
+ avatarImage?: (item: T) => string | null | undefined;
92
111
  /**
93
112
  * Short text for the circular avatar badge (e.g. initials).
94
- * Takes priority over `avatarIcon`.
113
+ * Used when `avatarImage` is not provided. Takes priority over `avatarIcon`.
95
114
  */
96
115
  avatarText?: (item: T) => string;
97
- /** Material icon name shown as avatar when `avatarText` is not provided */
116
+ /** Material icon name shown as avatar when `avatarImage`/`avatarText` are not provided */
98
117
  avatarIcon?: string;
99
118
  }
100
119
 
@@ -133,6 +152,8 @@ interface PaginatedTableConfig<T> {
133
152
  defaultStickyColumn?: keyof T;
134
153
  showActions?: () => boolean;
135
154
  hideExportData?: () => boolean;
155
+ hideColumnConfig?: () => boolean;
156
+ hideFullScreen?: () => boolean;
136
157
  }
137
158
  interface PaginatedTableColumn<T> {
138
159
  key: keyof T;
@@ -205,6 +226,14 @@ interface SortBy {
205
226
  direction: SortDirection;
206
227
  }
207
228
 
229
+ /**
230
+ * Signal con el identificador del usuario actual. Se usa para aislar por usuario
231
+ * la configuracion de columnas y los filtros avanzados guardados en localStorage.
232
+ *
233
+ * Si la aplicacion no lo provee, el valor por defecto es `undefined`, lo que
234
+ * desactiva la persistencia: las tablas siguen funcionando, pero no recuerdan
235
+ * la configuracion entre sesiones.
236
+ */
208
237
  declare const USER_ID_FACTORY: InjectionToken<Signal<string | null | undefined>>;
209
238
 
210
239
  type FilterConnector = 'AND' | 'OR';
@@ -226,178 +255,12 @@ interface FilterRule<T> {
226
255
  }
227
256
  declare const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]>;
228
257
 
229
- interface RowActionClickEvent<T> {
230
- id: string;
231
- row: T;
232
- }
233
-
234
- interface SelectionActionEvent<T> {
235
- id: string;
236
- rows: T[];
237
- }
238
-
239
- interface ConfirmDialogData<T = any> {
240
- title: string;
241
- body?: string;
242
- template?: TemplateRef<{
243
- $implicit: T;
244
- }>;
245
- row?: T;
246
- denyButtonLabel?: string;
247
- confirmButtonLabel?: string;
248
- }
249
-
250
- interface BasicFilter<T> {
251
- query?: string;
252
- sortBy?: SortBy;
253
- columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>;
254
- }
255
-
256
- interface BasicTableConfig<T> {
257
- tableId: string;
258
- primaryKey: keyof T | Array<keyof T>;
259
- title: () => string;
260
- columns: BasicTableColumn<T>[];
261
- queryFilterPlaceholder?: string;
262
- create?: TableBasicAction<T>;
263
- update?: TableBasicAction<T>;
264
- clickOnRowForUpdate?: boolean;
265
- delete?: TableBasicAction<T>;
266
- deleteConfirm?: DeleteConfirm<T>;
267
- rowActions?: TableRowAction<T>[];
268
- expandableDetail?: boolean;
269
- expandableDetailTemplateRef?: () => TemplateRef<{
270
- $implicit: T;
271
- }>;
272
- enableRowSelection?: boolean;
273
- rowSelectionAction?: RowSelectionAction<T>[];
274
- exportFileName?: () => string;
275
- mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;
276
- pdfConfig?: jsPDF;
277
- maxHeight?: string;
278
- defaultStickyColumn?: keyof T;
279
- showActions?: () => boolean;
280
- hideExportData?: () => boolean;
281
- }
282
- interface BasicTableColumn<T> {
283
- key: keyof T;
284
- label: string;
285
- isFilterableByInput?: boolean;
286
- sortType?: SortType;
287
- sortByKey?: (row: T) => string | undefined;
288
- filterType?: FilterType;
289
- filterOptions?: FilterOption[];
290
- endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;
291
- filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;
292
- filterByKey?: (row: T) => string | undefined;
293
- component?: Type<any>;
294
- templateRef?: () => TemplateRef<{
295
- $implicit: T;
296
- }>;
297
- valueGetter?: (row: T) => string;
298
- pipes?: ColumnPipe | ColumnPipe[];
299
- showTotalPerPage?: boolean;
300
- showTotalGeneral?: boolean;
301
- totalFooterFormatter?: (total: number) => string;
302
- style?: string;
303
- footerStyle?: string;
304
- }
305
- type SortType = 'string' | 'number' | 'date';
306
-
307
- type AlertType = 'info' | 'warning' | 'error' | 'success';
308
-
309
- type SkeletonVariant = 'text' | 'circle' | 'rect' | 'rounded';
310
- type SkeletonAnimation = 'shimmer' | 'pulse' | 'none';
311
-
312
- /** Visual variant of the file input component. */
313
- type NgxFileInputVariant = 'default' | 'compact' | 'button';
314
- /** Validation error codes emitted by the file input. */
315
- type NgxFileErrorCode = 'SIZE_EXCEEDED' | 'TYPE_NOT_ALLOWED' | 'MAX_FILES_EXCEEDED';
316
- /** Represents a file selected by the user, with metadata and optional preview. */
317
- interface NgxFileItem {
318
- /** The native File object. */
319
- file: File;
320
- /** Unique identifier generated internally. */
321
- id: string;
322
- /** File name. */
323
- name: string;
324
- /** File size in bytes. */
325
- size: number;
326
- /** MIME type of the file. */
327
- type: string;
328
- /** Data URL for image previews. */
329
- preview?: string;
330
- /** Whether the file passed validation. */
331
- status: 'valid' | 'error';
332
- /** Validation error message, if any. */
333
- error?: string;
334
- }
335
- /** Describes a validation error for a specific file. */
336
- interface NgxFileError {
337
- /** The native File that failed validation. */
338
- file: File;
339
- /** Machine-readable error code. */
340
- code: NgxFileErrorCode;
341
- /** Human-readable error message. */
342
- message: string;
343
- }
344
-
345
- declare class NgxBasicSelect<T> {
346
- readonly label: _angular_core.InputSignal<string>;
347
- readonly options: _angular_core.InputSignal<T[]>;
348
- readonly basicSelectConfig: _angular_core.InputSignal<BasicSelectConfig<T>>;
349
- readonly control: _angular_core.InputSignal<FormControl<any>>;
350
- readonly isLoading: _angular_core.InputSignal<boolean>;
351
- readonly placeholder: _angular_core.InputSignal<string>;
352
- readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
353
- readonly appearance: _angular_core.InputSignal<"fill" | "outline">;
354
- readonly multiple: _angular_core.InputSignal<boolean>;
355
- readonly disabled: _angular_core.InputSignal<boolean>;
356
- readonly clearable: _angular_core.InputSignal<boolean>;
357
- readonly error: _angular_core.InputSignal<string>;
358
- readonly class: _angular_core.InputSignal<string>;
359
- selectionChange: _angular_core.OutputEmitterRef<any>;
360
- readonly matSelect: _angular_core.Signal<MatSelect>;
361
- readonly searchInput: _angular_core.Signal<ElementRef<any> | undefined>;
362
- constructor();
363
- onOpenedChange(opened: boolean): void;
364
- includeInFilter(option: T, query: string): boolean;
365
- onClearClick(): void;
366
- onSelectionChange(event: MatSelectChange): void;
367
- onClearInputClick(): void;
368
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxBasicSelect<any>, never>;
369
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxBasicSelect<any>, "ngx-basic-select", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "basicSelectConfig": { "alias": "basicSelectConfig"; "required": true; "isSignal": true; }; "control": { "alias": "control"; "required": true; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "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; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
370
- }
371
-
372
- declare enum DialogBodyType {
373
- TEXT = "text",
374
- HTML = "html",
375
- COMPONENT = "component",
376
- TEMPLATE = "template"
377
- }
378
- interface DialogBodyConfig<T = any> {
379
- type: DialogBodyType;
380
- content: string | Type<T> | TemplateRef<any>;
381
- data?: T;
382
- }
383
-
384
- declare class NgxDialog<T = any> {
385
- private _dialogRef;
386
- private _data;
387
- readonly title: string;
388
- readonly icon: string | undefined;
389
- readonly iconColor: string | undefined;
390
- readonly subtitle: string | undefined;
391
- readonly body: DialogBodyConfig<T>;
392
- readonly showCancel: boolean;
393
- readonly showConfirm: boolean;
394
- readonly cancelText: string;
395
- readonly confirmText: string;
396
- DialogBodyType: typeof DialogBodyType;
397
- onCancelClick(): void;
398
- onConfirmClick(): void;
399
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDialog<any>, never>;
400
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDialog<any>, "ngx-dialog", never, {}, {}, never, never, true, never>;
258
+ interface DynamicFilter<T> {
259
+ campo: keyof T;
260
+ operador: FilterOperator;
261
+ valor: string;
262
+ conector: FilterConnector;
263
+ grupo: string;
401
264
  }
402
265
 
403
266
  declare class NgxTablesIntl {
@@ -568,6 +431,26 @@ declare class NgxTablesIntl {
568
431
  noResultsMessage: string;
569
432
  /** Etiqueta del botón de ver más resultados */
570
433
  showMoreLabel: string;
434
+ /** Botón de confirmar selección (modo múltiple) */
435
+ paginatedSelectConfirmLabel: string;
436
+ /** Botón de limpiar selección (modo múltiple) */
437
+ paginatedSelectResetLabel: string;
438
+ /** Etiqueta del toggle "Seleccionar todo" */
439
+ paginatedSelectSelectAllLabel: string;
440
+ /** Fila "cargando más…" al paginar por scroll */
441
+ paginatedSelectLoadingMoreLabel: string;
442
+ /** Fila de fin de lista cuando ya no quedan más resultados */
443
+ paginatedSelectEndOfListLabel: string;
444
+ /** Ayuda bajo el mensaje de "sin resultados" cuando hay búsqueda activa */
445
+ paginatedSelectNoResultsHint: string;
446
+ /** Botón para limpiar la búsqueda desde el estado vacío */
447
+ paginatedSelectClearSearchLabel: string;
448
+ /** Título del estado de error al fallar la carga */
449
+ paginatedSelectErrorTitle: string;
450
+ /** Ayuda del estado de error */
451
+ paginatedSelectErrorHint: string;
452
+ /** Botón de reintentar la carga */
453
+ paginatedSelectRetryLabel: string;
571
454
  /**
572
455
  * Función para obtener el mensaje de confirmación de eliminación
573
456
  * @param itemName Nombre del elemento a eliminar (opcional)
@@ -598,24 +481,332 @@ declare class NgxTablesIntl {
598
481
  * @param optionName Nombre de la opción (opcional)
599
482
  */
600
483
  getRemoveOptionText(optionName: string): string;
484
+ /**
485
+ * Mensaje anunciado por lectores de pantalla (aria-live) con el número de
486
+ * resultados tras filtrar en un select buscable.
487
+ * @param count Número de resultados visibles
488
+ */
489
+ getSearchResultsCountMessage(count: number): string;
490
+ /**
491
+ * Footer del ngx-paginated-select en modo múltiple: elementos seleccionados
492
+ * sobre el total disponible.
493
+ */
494
+ getPaginatedSelectSelectedCountLabel(selected: number, total: number): string;
495
+ /**
496
+ * Footer del ngx-paginated-select en modo simple: número total de resultados.
497
+ */
498
+ getPaginatedSelectResultsCountLabel(total: number): string;
601
499
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTablesIntl, never>;
602
500
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxTablesIntl>;
603
501
  }
604
502
 
605
- declare class NgxConfirmDialogComponent {
606
- dialogRef: MatDialogRef<any, any>;
607
- data: ConfirmDialogData<any>;
608
- intl: NgxTablesIntl;
609
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxConfirmDialogComponent, never>;
610
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxConfirmDialogComponent, "ngx-confirm-dialog", never, {}, {}, never, never, true, never>;
503
+ declare class AdvancedFilterUtils {
504
+ static createAdvancedFilter: <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>) => FormGroup;
505
+ static createFilterGroup: <T>(fb: FormBuilder, group: FilterGroup<T>) => FormGroup;
506
+ static createFilterRule: <T>(fb: FormBuilder, rule: FilterRule<T>) => FormGroup;
507
+ static isFilterGroup: <T>(obj: any) => obj is FilterGroup<T>;
508
+ private static isFilterRule;
509
+ static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>): void;
510
+ static deleteGroup<T>(form: FormGroup, groupId: string): boolean;
511
+ static addRuleToGroup: <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => void;
512
+ static deleteRule<T>(form: FormGroup, ruleId: string): boolean;
513
+ private static deleteByIdRecursive;
514
+ static findGroupFormById(array: FormArray, id: string): FormGroup | null;
515
+ static isFilterGroupForm(group: AbstractControl): boolean;
516
+ static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T>;
517
+ private static mapFormGroupToFilterGroup;
518
+ private static mapFormGroupToFilterRule;
519
+ private static isNonEmptyFilter;
520
+ private static isNonEmptyGroup;
521
+ private static isNonEmptyRule;
522
+ static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string;
523
+ private static groupToHtml;
524
+ private static ruleToHtml;
525
+ private static getOperatorLabel;
526
+ private static valueToHtml;
527
+ static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[];
528
+ private static mapGroupToDynamicFilters;
529
+ static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T>;
530
+ private static normalizeGroupForBackend;
531
+ private static normalizeRuleForBackend;
611
532
  }
612
533
 
534
+ interface RowActionClickEvent<T> {
535
+ id: string;
536
+ row: T;
537
+ }
538
+
539
+ interface SelectionActionEvent<T> {
540
+ id: string;
541
+ rows: T[];
542
+ }
543
+
544
+ interface ConfirmDialogData<T = any> {
545
+ title: string;
546
+ body?: string;
547
+ template?: TemplateRef<{
548
+ $implicit: T;
549
+ }>;
550
+ row?: T;
551
+ denyButtonLabel?: string;
552
+ confirmButtonLabel?: string;
553
+ }
554
+
555
+ interface BasicFilter<T> {
556
+ query?: string;
557
+ sortBy?: SortBy;
558
+ columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>;
559
+ }
560
+
561
+ interface BasicTableConfig<T> {
562
+ tableId: string;
563
+ primaryKey: keyof T | Array<keyof T>;
564
+ title: () => string;
565
+ columns: BasicTableColumn<T>[];
566
+ queryFilterPlaceholder?: string;
567
+ create?: TableBasicAction<T>;
568
+ update?: TableBasicAction<T>;
569
+ clickOnRowForUpdate?: boolean;
570
+ delete?: TableBasicAction<T>;
571
+ deleteConfirm?: DeleteConfirm<T>;
572
+ rowActions?: TableRowAction<T>[];
573
+ expandableDetail?: boolean;
574
+ expandableDetailTemplateRef?: () => TemplateRef<{
575
+ $implicit: T;
576
+ }>;
577
+ enableRowSelection?: boolean;
578
+ rowSelectionAction?: RowSelectionAction<T>[];
579
+ exportFileName?: () => string;
580
+ mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;
581
+ pdfConfig?: jsPDF;
582
+ maxHeight?: string;
583
+ defaultStickyColumn?: keyof T;
584
+ showActions?: () => boolean;
585
+ hideExportData?: () => boolean;
586
+ hideColumnConfig?: () => boolean;
587
+ hideFullScreen?: () => boolean;
588
+ }
589
+ interface BasicTableColumn<T> {
590
+ key: keyof T;
591
+ label: string;
592
+ isFilterableByInput?: boolean;
593
+ sortType?: SortType;
594
+ sortByKey?: (row: T) => string | undefined;
595
+ filterType?: FilterType;
596
+ filterOptions?: FilterOption[];
597
+ endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;
598
+ filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;
599
+ filterByKey?: (row: T) => string | undefined;
600
+ component?: Type<any>;
601
+ templateRef?: () => TemplateRef<{
602
+ $implicit: T;
603
+ }>;
604
+ valueGetter?: (row: T) => string;
605
+ pipes?: ColumnPipe | ColumnPipe[];
606
+ showTotalPerPage?: boolean;
607
+ showTotalGeneral?: boolean;
608
+ totalFooterFormatter?: (total: number) => string;
609
+ style?: string;
610
+ footerStyle?: string;
611
+ }
612
+ type SortType = 'string' | 'number' | 'date';
613
+
614
+ type AlertType = 'info' | 'warning' | 'error' | 'success';
615
+
616
+ type SkeletonVariant = 'text' | 'circle' | 'rect' | 'rounded';
617
+ type SkeletonAnimation = 'shimmer' | 'pulse' | 'none';
618
+
619
+ /** Visual variant of the file input component. */
620
+ type NgxFileInputVariant = 'default' | 'compact' | 'button';
621
+ /** Validation error codes emitted by the file input. */
622
+ type NgxFileErrorCode = 'SIZE_EXCEEDED' | 'TYPE_NOT_ALLOWED' | 'MAX_FILES_EXCEEDED';
623
+ /** Represents a file selected by the user, with metadata and optional preview. */
624
+ interface NgxFileItem {
625
+ /** The native File object. */
626
+ file: File;
627
+ /** Unique identifier generated internally. */
628
+ id: string;
629
+ /** File name. */
630
+ name: string;
631
+ /** File size in bytes. */
632
+ size: number;
633
+ /** MIME type of the file. */
634
+ type: string;
635
+ /** Data URL for image previews. */
636
+ preview?: string;
637
+ /** Whether the file passed validation. */
638
+ status: 'valid' | 'error';
639
+ /** Validation error message, if any. */
640
+ error?: string;
641
+ }
642
+ /** Describes a validation error for a specific file. */
643
+ interface NgxFileError {
644
+ /** The native File that failed validation. */
645
+ file: File;
646
+ /** Machine-readable error code. */
647
+ code: NgxFileErrorCode;
648
+ /** Human-readable error message. */
649
+ message: string;
650
+ }
651
+
652
+ declare enum DialogBodyType {
653
+ TEXT = "text",
654
+ HTML = "html",
655
+ COMPONENT = "component",
656
+ TEMPLATE = "template"
657
+ }
658
+ interface DialogBodyConfig<T = any> {
659
+ type: DialogBodyType;
660
+ content: string | Type<T> | TemplateRef<any>;
661
+ data?: T;
662
+ }
663
+ interface DialogConfig<T = any> {
664
+ title: string;
665
+ icon?: string;
666
+ iconColor?: string;
667
+ subtitle?: string;
668
+ body: DialogBodyConfig<T>;
669
+ showCancel?: boolean;
670
+ showConfirm?: boolean;
671
+ cancelText?: string;
672
+ confirmText?: string;
673
+ }
674
+
675
+ interface ConfigureTableColumnData<T> {
676
+ tableId: string;
677
+ tableName: string;
678
+ columns: ColumnConfig<T>[];
679
+ filtersValue: Partial<Record<keyof T, ColumnValue>>;
680
+ columnsLabels: Partial<Record<keyof T, string>>;
681
+ }
613
682
  interface ColumnConfig<T> {
614
683
  key: keyof T;
615
684
  show: boolean;
616
685
  isSticky: boolean;
617
686
  }
618
687
 
688
+ type TipoPantalla = 'movil' | 'tablet' | 'escritorio';
689
+
690
+ interface Pantalla {
691
+ tipo: TipoPantalla;
692
+ ancho: number;
693
+ alto: number;
694
+ }
695
+
696
+ type SendType = 'save' | 'save_and_apply';
697
+
698
+ /** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */
699
+ interface ResolvedOption<T> {
700
+ value: T[keyof T];
701
+ label: string;
702
+ disabled: boolean;
703
+ visible: boolean;
704
+ }
705
+ declare class NgxBasicSelect<T> implements ControlValueAccessor {
706
+ readonly intl: NgxTablesIntl;
707
+ /**
708
+ * Se auto-registra como ControlValueAccessor del control del formulario.
709
+ * Se usa `self`/`optional` para poder leer el estado de validación (invalid/touched)
710
+ * y para no fallar cuando el componente se usa sin formulario.
711
+ */
712
+ private readonly _ngControl;
713
+ readonly label: _angular_core.InputSignal<string>;
714
+ readonly options: _angular_core.InputSignal<T[]>;
715
+ readonly basicSelectConfig: _angular_core.InputSignal<BasicSelectConfig<T>>;
716
+ readonly isLoading: _angular_core.InputSignal<boolean>;
717
+ readonly placeholder: _angular_core.InputSignal<string>;
718
+ readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
719
+ readonly appearance: _angular_core.InputSignal<"fill" | "outline">;
720
+ readonly multiple: _angular_core.InputSignal<boolean>;
721
+ readonly disabled: _angular_core.InputSignal<boolean>;
722
+ readonly clearable: _angular_core.InputSignal<boolean>;
723
+ readonly error: _angular_core.InputSignal<string>;
724
+ readonly class: _angular_core.InputSignal<string>;
725
+ /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */
726
+ selectionChange: _angular_core.OutputEmitterRef<T[keyof T] | T[keyof T][] | null>;
727
+ readonly matSelect: _angular_core.Signal<MatSelect>;
728
+ readonly searchInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
729
+ /** FormControl interno que gobierna el mat-select (independiente del control del form). */
730
+ protected readonly innerControl: FormControl<any>;
731
+ /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */
732
+ protected readonly value: _angular_core.WritableSignal<any>;
733
+ /** Deshabilitado que llega vía setDisabledState (reactive forms). */
734
+ private readonly cvaDisabled;
735
+ /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */
736
+ protected readonly searchQuery: _angular_core.WritableSignal<string>;
737
+ private onChange;
738
+ private onTouched;
739
+ /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */
740
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
741
+ /**
742
+ * Opciones resueltas y marcadas con `visible` según el buscador. Las no visibles
743
+ * NO se quitan del DOM (se ocultan con display:none) para que el mat-select siga
744
+ * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.
745
+ */
746
+ protected readonly resolvedOptions: _angular_core.Signal<ResolvedOption<T>[]>;
747
+ /** Hay datos de entrada (con independencia del buscador). */
748
+ protected readonly hasData: _angular_core.Signal<boolean>;
749
+ /**
750
+ * Opciones que se renderizan realmente: las que casan con el buscador MÁS las que
751
+ * estén seleccionadas (aunque no casen). Se quitan del DOM las que no casan para que
752
+ * el ListKeyManager de mat-select no las pueda enfocar con las flechas —marcarlas
753
+ * `disabled` no basta: con el panel abierto Material permite enfocar deshabilitadas
754
+ * (recomendación WAI-ARIA)—. Las seleccionadas se conservan para que el trigger
755
+ * pueda pintar su etiqueta y no se pierda el valor al filtrar.
756
+ */
757
+ protected readonly displayedOptions: _angular_core.Signal<ResolvedOption<T>[]>;
758
+ /** No hay ninguna opción que mostrar (ni coincidencia ni seleccionada). */
759
+ protected readonly showNoOptionsMessage: _angular_core.Signal<boolean>;
760
+ /** Mensaje aria-live con el recuento de resultados al filtrar. */
761
+ protected readonly searchAnnouncement: _angular_core.Signal<string>;
762
+ /** ErrorStateMatcher que refleja el estado del control del formulario. */
763
+ protected readonly errorStateMatcher: ErrorStateMatcher;
764
+ constructor();
765
+ writeValue(value: any): void;
766
+ registerOnChange(fn: (value: any) => void): void;
767
+ registerOnTouched(fn: () => void): void;
768
+ setDisabledState(isDisabled: boolean): void;
769
+ onOpenedChange(opened: boolean): void;
770
+ onSearchInput(value: string): void;
771
+ /**
772
+ * Deja pasar al mat-select las teclas de navegación (flechas, Enter, Escape…) para
773
+ * poder moverse por la lista sin salir del buscador, y detiene las de carácter para
774
+ * que no disparen el typeahead nativo del mat-select.
775
+ */
776
+ onSearchKeydown(event: KeyboardEvent): void;
777
+ clearSearch(): void;
778
+ onClearClick(): void;
779
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxBasicSelect<any>, never>;
780
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxBasicSelect<any>, "ngx-basic-select", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "basicSelectConfig": { "alias": "basicSelectConfig"; "required": true; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "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; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
781
+ }
782
+
783
+ declare class NgxDialog<T = any> {
784
+ private _dialogRef;
785
+ private _data;
786
+ readonly title: string;
787
+ readonly icon: string | undefined;
788
+ readonly iconColor: string | undefined;
789
+ readonly subtitle: string | undefined;
790
+ readonly body: ngx_eiffage_material.DialogBodyConfig<T>;
791
+ readonly showCancel: boolean;
792
+ readonly showConfirm: boolean;
793
+ readonly cancelText: string;
794
+ readonly confirmText: string;
795
+ DialogBodyType: typeof DialogBodyType;
796
+ onCancelClick(): void;
797
+ onConfirmClick(): void;
798
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDialog<any>, never>;
799
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDialog<any>, "ngx-dialog", never, {}, {}, never, never, true, never>;
800
+ }
801
+
802
+ declare class NgxConfirmDialogComponent {
803
+ dialogRef: MatDialogRef<any, any>;
804
+ data: ConfirmDialogData<any>;
805
+ intl: NgxTablesIntl;
806
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxConfirmDialogComponent, never>;
807
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxConfirmDialogComponent, "ngx-confirm-dialog", never, {}, {}, never, never, true, never>;
808
+ }
809
+
619
810
  declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnInit, OnDestroy {
620
811
  private readonly columnConfigService;
621
812
  private readonly advancedFilterService;
@@ -665,7 +856,6 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnIn
665
856
  private overlayRef?;
666
857
  private portal?;
667
858
  protected defaultFiltersForPaginatedFilterOptions: WritableSignal<PaginatedFilter<FilterOption>>;
668
- constructor(intl: NgxTablesIntl | null);
669
859
  ngOnInit(): void;
670
860
  onEscape(): void;
671
861
  ngOnDestroy(): void;
@@ -720,7 +910,7 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnIn
720
910
  private enterFullscreen;
721
911
  private exitFullscreen;
722
912
  private isMyOverlayOnTop;
723
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedTable<any, any>, [{ optional: true; }]>;
913
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedTable<any, any>, never>;
724
914
  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>;
725
915
  }
726
916
 
@@ -842,7 +1032,6 @@ declare class SearchableSelectComponent<T> {
842
1032
  optionChange: _angular_core.OutputEmitterRef<string | string[] | undefined>;
843
1033
  protected searcher: _angular_core.Signal<ElementRef<any> | undefined>;
844
1034
  protected innerControl: _angular_core.WritableSignal<FormControl<any>>;
845
- constructor(intl: NgxTablesIntl | null);
846
1035
  selectedEffect: _angular_core.EffectRef;
847
1036
  protected openedChange(open: boolean): void;
848
1037
  protected cleanQuery(): void;
@@ -850,7 +1039,7 @@ declare class SearchableSelectComponent<T> {
850
1039
  protected showOption(option: T): boolean;
851
1040
  protected onOptionChange(event: MatSelectChange<string | string[] | undefined>): void;
852
1041
  protected numberOfResults(): number;
853
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchableSelectComponent<any>, [{ optional: true; }]>;
1042
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchableSelectComponent<any>, never>;
854
1043
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchableSelectComponent<any>, "ngx-searchable-select", never, { "control": { "alias": "control"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchInputPlaceholder": { "alias": "searchInputPlaceholder"; "required": false; "isSignal": true; }; "selectLabel": { "alias": "selectLabel"; "required": false; "isSignal": true; }; "selectPlaceholder": { "alias": "selectPlaceholder"; "required": false; "isSignal": true; }; "clearableOptionLabel": { "alias": "clearableOptionLabel"; "required": false; "isSignal": true; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; }, never, never, true, never>;
855
1044
  }
856
1045
 
@@ -876,7 +1065,6 @@ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>
876
1065
  protected innerControl: WritableSignal<FormControl<any>>;
877
1066
  private queryTimeout;
878
1067
  private readonly debounceTime;
879
- constructor(intl: NgxTablesIntl | null);
880
1068
  selectedEffect: _angular_core.EffectRef;
881
1069
  dataResource: _angular_core.ResourceRef<PaginatedItems<T>>;
882
1070
  protected options: WritableSignal<T[]>;
@@ -890,7 +1078,7 @@ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>
890
1078
  protected onOptionChange(event: MatSelectChange<T | T[] | undefined>): void;
891
1079
  protected optionsSelectedForView(): T[];
892
1080
  protected onMoreClick(): void;
893
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginatedSearchableSelectComponent<any, any>, [{ optional: true; }]>;
1081
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginatedSearchableSelectComponent<any, any>, never>;
894
1082
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PaginatedSearchableSelectComponent<any, any>, "ngx-paginated-searchable-select", never, { "control": { "alias": "control"; "required": false; "isSignal": true; }; "endpoint": { "alias": "endpoint"; "required": true; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchInputPlaceholder": { "alias": "searchInputPlaceholder"; "required": false; "isSignal": true; }; "selectLabel": { "alias": "selectLabel"; "required": false; "isSignal": true; }; "selectPlaceholder": { "alias": "selectPlaceholder"; "required": false; "isSignal": true; }; "clearableOptionLabel": { "alias": "clearableOptionLabel"; "required": false; "isSignal": true; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "optionChange": "optionChange"; }, never, never, true, never>;
895
1083
  }
896
1084
 
@@ -903,10 +1091,11 @@ declare class NgxAlert {
903
1091
  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; }; }, {}, never, ["*"], true, never>;
904
1092
  }
905
1093
 
906
- declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnInit {
1094
+ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor {
907
1095
  private readonly _bottomSheet;
908
- private readonly _cdr;
909
- private readonly _matSelect;
1096
+ /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */
1097
+ private readonly _ngControl;
1098
+ readonly intl: NgxTablesIntl;
910
1099
  /** Label that floats on the form field */
911
1100
  readonly label: _angular_core.InputSignal<string>;
912
1101
  /** Title shown in the bottom sheet header */
@@ -917,8 +1106,6 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
917
1106
  readonly config: _angular_core.InputSignal<PaginatedSelectConfig<T>>;
918
1107
  /** Writable signal with the current filter state */
919
1108
  readonly filters: _angular_core.InputSignal<WritableSignal<U>>;
920
- /** FormControl to integrate with reactive forms */
921
- readonly control: _angular_core.InputSignal<FormControl<any>>;
922
1109
  /** Pre-selected items — accepts full objects OR partials with only the valueKey set */
923
1110
  readonly selectedItems: _angular_core.InputSignal<Partial<T>[]>;
924
1111
  /** Allow selecting multiple items */
@@ -932,17 +1119,17 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
932
1119
  * - 'chips': a chip per selected item (default when multiple=true)
933
1120
  * - 'text': a single comma-joined text line
934
1121
  */
935
- readonly displayMode: _angular_core.InputSignal<"chips" | "text">;
1122
+ readonly displayMode: _angular_core.InputSignal<"text" | "chips">;
936
1123
  /** Whether to show the search input inside the bottom sheet */
937
1124
  readonly showSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
938
- /** Placeholder for the search input inside the bottom sheet */
939
- readonly searchPlaceholder: _angular_core.InputSignal<string>;
940
- /** Message when no results are found */
941
- readonly noResultsMessage: _angular_core.InputSignal<string>;
942
- /** Label for the confirm button (multiple mode) */
943
- readonly confirmLabel: _angular_core.InputSignal<string>;
944
- /** Label for the reset button (multiple mode) */
945
- readonly resetLabel: _angular_core.InputSignal<string>;
1125
+ /** Placeholder for the search input inside the bottom sheet (defaults to intl) */
1126
+ readonly searchPlaceholder: _angular_core.InputSignal<string | undefined>;
1127
+ /** Message when no results are found (defaults to intl) */
1128
+ readonly noResultsMessage: _angular_core.InputSignal<string | undefined>;
1129
+ /** Label for the confirm button (multiple mode, defaults to intl) */
1130
+ readonly confirmLabel: _angular_core.InputSignal<string | undefined>;
1131
+ /** Label for the reset button (multiple mode, defaults to intl) */
1132
+ readonly resetLabel: _angular_core.InputSignal<string | undefined>;
946
1133
  /** Controls how the subscript wrapper (hint/error) reserves space */
947
1134
  readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
948
1135
  /** Error message rendered inside mat-error */
@@ -964,35 +1151,55 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
964
1151
  readonly chipsDirection: _angular_core.InputSignal<"row" | "column">;
965
1152
  /** Whether to show a "Select all" toggle in the bottom sheet (multiple mode) */
966
1153
  readonly showSelectAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
967
- /** Label for the select all toggle */
968
- readonly selectAllLabel: _angular_core.InputSignal<string>;
1154
+ /** Label for the select all toggle (defaults to intl) */
1155
+ readonly selectAllLabel: _angular_core.InputSignal<string | undefined>;
969
1156
  /** Emits the full T object (single) or T[] (multiple) when selection changes */
970
1157
  readonly valueChange: _angular_core.OutputEmitterRef<Partial<T> | Partial<T>[] | undefined>;
971
1158
  /** Emits the raw array of selected items (may be partial if never confirmed) */
972
1159
  readonly selectionChange: _angular_core.OutputEmitterRef<Partial<T>[]>;
973
- protected _selectedItems: WritableSignal<Partial<T>[]>;
974
- protected _isDisabled: WritableSignal<boolean>;
975
- protected _isOpen: WritableSignal<boolean>;
1160
+ protected readonly _selectedItems: WritableSignal<Partial<T>[]>;
1161
+ private readonly _cvaDisabled;
1162
+ protected readonly _isOpen: WritableSignal<boolean>;
1163
+ private onChange;
1164
+ private onTouched;
1165
+ /** Evita re-emitir onChange cuando el cambio viene del formulario (writeValue). */
1166
+ private _suppressEmit;
1167
+ /** Huella de la última selección aplicada desde el input `selectedItems`. */
1168
+ private _lastSyncedSelection;
1169
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
976
1170
  protected readonly selectedLabel: _angular_core.Signal<string>;
977
- /**
978
- * Safe label resolver: tries `displayedLabel(item)`, falls back to
979
- * `String(item[valueKey])` so partial objects never throw.
980
- */
981
- protected getLabel(item: Partial<T>): string;
982
1171
  protected readonly hasSelection: _angular_core.Signal<boolean>;
983
- /** ErrorStateMatcher that reflects the bound FormControl's touched+invalid state */
984
- protected readonly errorStateMatcher: _angular_core.Signal<ErrorStateMatcher>;
985
1172
  protected readonly showChips: _angular_core.Signal<boolean>;
986
1173
  protected readonly displayedChips: _angular_core.Signal<Partial<T>[]>;
987
1174
  protected readonly remainingChipsCount: _angular_core.Signal<number>;
1175
+ /** ErrorStateMatcher que refleja el estado del control del formulario. */
1176
+ protected readonly errorStateMatcher: ErrorStateMatcher;
1177
+ protected readonly effectiveSearchPlaceholder: _angular_core.Signal<string>;
1178
+ protected readonly effectiveNoResults: _angular_core.Signal<string>;
1179
+ protected readonly effectiveConfirmLabel: _angular_core.Signal<string>;
1180
+ protected readonly effectiveResetLabel: _angular_core.Signal<string>;
1181
+ protected readonly effectiveSelectAllLabel: _angular_core.Signal<string>;
988
1182
  constructor();
989
- ngOnInit(): void;
1183
+ writeValue(value: T[keyof T] | T[keyof T][] | null): void;
1184
+ registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | null) => void): void;
1185
+ registerOnTouched(fn: () => void): void;
1186
+ setDisabledState(isDisabled: boolean): void;
1187
+ private keysFromValue;
1188
+ private applyValueFromKeys;
1189
+ private sameKeySet;
1190
+ private emitChange;
1191
+ /**
1192
+ * Safe label resolver: tries `displayedLabel(item)`, falls back to
1193
+ * `String(item[valueKey])` so partial objects never throw.
1194
+ */
1195
+ protected getLabel(item: Partial<T>): string;
990
1196
  openBottomSheet(event: Event): void;
1197
+ /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */
1198
+ onTriggerKeydown(event: KeyboardEvent): void;
991
1199
  removeChip(item: Partial<T>, _event: MatChipEvent): void;
992
- preventOpen(isOpen: boolean): void;
993
1200
  clearSelection(event: Event): void;
994
1201
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedSelect<any, any>, never>;
995
- 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; }; "control": { "alias": "control"; "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>;
1202
+ 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>;
996
1203
  }
997
1204
 
998
1205
  interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {
@@ -1019,6 +1226,7 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1019
1226
  private readonly _ref;
1020
1227
  private readonly _destroy;
1021
1228
  readonly data: NgxPaginatedSelectBottomSheetData<T, U>;
1229
+ readonly intl: NgxTablesIntl;
1022
1230
  /** Raw input value — updates on every keystroke, does NOT trigger the resource */
1023
1231
  readonly query: WritableSignal<string | undefined>;
1024
1232
  /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */
@@ -1038,8 +1246,26 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1038
1246
  readonly resource: _angular_core.ResourceRef<PaginatedItems<T>>;
1039
1247
  readonly isLoading: _angular_core.Signal<boolean>;
1040
1248
  readonly options: _angular_core.Signal<T[]>;
1041
- readonly total: _angular_core.Signal<number>;
1249
+ readonly hasError: _angular_core.Signal<boolean>;
1042
1250
  readonly selectedCount: _angular_core.Signal<number>;
1251
+ /**
1252
+ * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante
1253
+ * la carga por scroll, resource.value() pasa transitoriamente al defaultValue
1254
+ * (total: 0); leerlo directamente hacía parpadear el footer a "0 resultados"
1255
+ * aunque el total real no cambie. Con este signal el total se mantiene estable
1256
+ * mientras se cargan más páginas.
1257
+ */
1258
+ private readonly _total;
1259
+ readonly total: _angular_core.Signal<number>;
1260
+ private readonly _totalEffect;
1261
+ /** Cargando la PRIMERA página (lista vacía) → se muestran skeletons. */
1262
+ readonly isInitialLoading: _angular_core.Signal<boolean>;
1263
+ /** Cargando MÁS páginas (scroll) → fila inline "cargando más…", sin barra superior. */
1264
+ readonly isLoadingMore: _angular_core.Signal<boolean>;
1265
+ /** Ya se han cargado todos los resultados disponibles. */
1266
+ readonly allLoaded: _angular_core.Signal<boolean>;
1267
+ /** Cabecera con sombra solo cuando la lista está desplazada. */
1268
+ readonly headerScrolled: WritableSignal<boolean>;
1043
1269
  readonly allSelected: _angular_core.Signal<boolean>;
1044
1270
  readonly someSelected: _angular_core.Signal<boolean>;
1045
1271
  /**
@@ -1069,11 +1295,19 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1069
1295
  */
1070
1296
  getLabel(item: Partial<T>): string;
1071
1297
  getAvatarText(item: Partial<T>): string;
1298
+ /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */
1299
+ private readonly failedImages;
1300
+ /** URL de imagen del avatar, o null si no hay o si falló al cargar. */
1301
+ getAvatarImage(item: Partial<T>): string | null | undefined;
1302
+ /** Marca la imagen como fallida para caer al texto/icono. */
1303
+ onAvatarError(item: Partial<T>): void;
1072
1304
  toggleItem(item: T): void;
1073
1305
  removeSelectedChip(item: Partial<T>): void;
1074
1306
  onQueryInput(event: Event, container: HTMLElement): void;
1075
- clearQuery(inputEl: HTMLInputElement, container: HTMLElement): void;
1307
+ clearQuery(container?: HTMLElement): void;
1076
1308
  onScroll(container: HTMLElement): void;
1309
+ /** Reintenta la carga tras un error. */
1310
+ retry(): void;
1077
1311
  toggleSelectAll(): void;
1078
1312
  confirm(): void;
1079
1313
  reset(): void;
@@ -1118,6 +1352,7 @@ declare class NgxSkeleton {
1118
1352
  declare class NgxFileInput implements ControlValueAccessor {
1119
1353
  private readonly _platform;
1120
1354
  private readonly _inputId;
1355
+ private readonly _nativeInput;
1121
1356
  /** Accepted MIME types or extensions (e.g. `'image/*,.pdf'`). */
1122
1357
  readonly accept: _angular_core.InputSignal<string>;
1123
1358
  /** Allow selecting multiple files. */
@@ -1152,6 +1387,13 @@ declare class NgxFileInput implements ControlValueAccessor {
1152
1387
  readonly liveAnnouncement: _angular_core.WritableSignal<string>;
1153
1388
  /** Unique id for the hidden file input. */
1154
1389
  readonly inputId: string;
1390
+ /** Disabled state coming from `setDisabledState()` (reactive forms). */
1391
+ private readonly _cvaDisabled;
1392
+ /**
1393
+ * Effective disabled state: the `disabled` input OR the state pushed by the
1394
+ * parent FormControl through `setDisabledState()`.
1395
+ */
1396
+ readonly isDisabled: _angular_core.Signal<boolean>;
1155
1397
  /** Derived: valid files only (used as FormControl value). */
1156
1398
  protected readonly validFiles: _angular_core.Signal<File[]>;
1157
1399
  private _onChange;
@@ -1159,6 +1401,7 @@ declare class NgxFileInput implements ControlValueAccessor {
1159
1401
  writeValue(files: File[] | null): void;
1160
1402
  registerOnChange(fn: (value: File[]) => void): void;
1161
1403
  registerOnTouched(fn: () => void): void;
1404
+ setDisabledState(isDisabled: boolean): void;
1162
1405
  onDragOver(event: DragEvent): void;
1163
1406
  onDragLeave(event: DragEvent): void;
1164
1407
  onDrop(event: DragEvent): void;
@@ -1304,6 +1547,44 @@ declare class NgxDialogService {
1304
1547
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxDialogService>;
1305
1548
  }
1306
1549
 
1550
+ declare class AdvancedFilterService {
1551
+ private userIdFactory;
1552
+ private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG;
1553
+ private fullKey;
1554
+ private _advancedFilters;
1555
+ advancedFilters: _angular_core.Signal<Record<string, AdvancedFilter<any>[]>>;
1556
+ private setAdvancedFiltersEffect;
1557
+ constructor();
1558
+ private setAdvancedFilter;
1559
+ saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean;
1560
+ deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean;
1561
+ getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend?: boolean): AdvancedFilter<any> | undefined;
1562
+ getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[];
1563
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdvancedFilterService, never>;
1564
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AdvancedFilterService>;
1565
+ }
1566
+
1567
+ declare class ColumnConfigService {
1568
+ private userIdFactory;
1569
+ private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG;
1570
+ private fullKey;
1571
+ private _columnConfigs;
1572
+ columnConfigs: _angular_core.Signal<Record<string, ColumnConfig<any>[]>>;
1573
+ private setColumnConfigEffect;
1574
+ saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean;
1575
+ deleteColumnConfig(tableId: string): boolean;
1576
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnConfigService, never>;
1577
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ColumnConfigService>;
1578
+ }
1579
+
1580
+ declare class DatosPantallaService {
1581
+ private readonly isBrowser;
1582
+ pantalla: Signal<Pantalla | undefined>;
1583
+ private obtenerDatosPantalla;
1584
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatosPantallaService, never>;
1585
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DatosPantallaService>;
1586
+ }
1587
+
1307
1588
  declare class DynamicHostDirective<T> {
1308
1589
  private _vcr;
1309
1590
  private _currentRef;
@@ -1317,5 +1598,5 @@ declare class DynamicHostDirective<T> {
1317
1598
  declare const includeNoSensible: (cadena: string, query: string) => boolean;
1318
1599
  declare const base64ToUtf8: (str: string) => string;
1319
1600
 
1320
- export { DynamicHostDirective, NgxAlert, NgxBasicSelect, NgxBasicTable, NgxConfirmDialogComponent, NgxDialog, NgxDialogService, NgxFileInput, NgxInputFile, NgxLoadingButton, NgxPaginatedSelect, NgxPaginatedSelectBottomSheetComponent, NgxPaginatedTable, NgxSkeleton, NgxTablesIntl, OPERATOR_BY_FILTER_TYPE, PaginatedSearchableSelectComponent, SearchableSelectComponent, USER_ID_FACTORY, base64ToUtf8, includeNoSensible, isFilterOption };
1321
- export type { AdvancedFilter, AlertType, BasicFilter, BasicSelectConfig, BasicTableColumn, BasicTableConfig, ColumnPipe, ConfirmDialogData, DeleteConfirm, FilterConnector, FilterGroup, FilterOperator, FilterOption, FilterRule, FilterType, NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem, NgxPaginatedSelectBottomSheetData, PaginatedFilter, PaginatedItems, PaginatedSelectConfig, PaginatedTableColumn, PaginatedTableConfig, RowActionClickEvent, RowActionIconColor, RowSelectionAction, SelectionActionEvent, SkeletonAnimation, SkeletonVariant, SortBy, SortType, TableBasicAction, TableRowAction };
1601
+ export { AdvancedFilterService, AdvancedFilterUtils, ColumnConfigService, DatosPantallaService, DialogBodyType, DynamicHostDirective, NgxAlert, NgxBasicSelect, NgxBasicTable, NgxConfirmDialogComponent, NgxDialog, NgxDialogService, NgxFileInput, NgxInputFile, NgxLoadingButton, NgxPaginatedSelect, NgxPaginatedSelectBottomSheetComponent, NgxPaginatedTable, NgxSkeleton, NgxTablesIntl, OPERATOR_BY_FILTER_TYPE, PaginatedSearchableSelectComponent, SearchableSelectComponent, USER_ID_FACTORY, base64ToUtf8, includeNoSensible, isFilterOption };
1602
+ export type { AdvancedFilter, AlertType, BasicFilter, BasicSelectConfig, BasicTableColumn, BasicTableConfig, ColumnConfig, ColumnPipe, ColumnValue, ConfigureTableColumnData, ConfirmDialogData, DeleteConfirm, DialogBodyConfig, DialogConfig, DynamicFilter, FilterConnector, FilterGroup, FilterOperator, FilterOption, FilterRule, FilterType, NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem, NgxPaginatedSelectBottomSheetData, PaginatedFilter, PaginatedItems, PaginatedSelectConfig, PaginatedTableColumn, PaginatedTableConfig, Pantalla, RowActionClickEvent, RowActionIconColor, RowSelectionAction, SelectionActionEvent, SendType, SkeletonAnimation, SkeletonVariant, SortBy, SortType, TableBasicAction, TableRowAction, TipoPantalla };