ngx-eiffage-material 0.0.48 → 0.1.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
@@ -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,330 @@ 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;
532
+ }
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
+ }
587
+ interface BasicTableColumn<T> {
588
+ key: keyof T;
589
+ label: string;
590
+ isFilterableByInput?: boolean;
591
+ sortType?: SortType;
592
+ sortByKey?: (row: T) => string | undefined;
593
+ filterType?: FilterType;
594
+ filterOptions?: FilterOption[];
595
+ endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;
596
+ filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;
597
+ filterByKey?: (row: T) => string | undefined;
598
+ component?: Type<any>;
599
+ templateRef?: () => TemplateRef<{
600
+ $implicit: T;
601
+ }>;
602
+ valueGetter?: (row: T) => string;
603
+ pipes?: ColumnPipe | ColumnPipe[];
604
+ showTotalPerPage?: boolean;
605
+ showTotalGeneral?: boolean;
606
+ totalFooterFormatter?: (total: number) => string;
607
+ style?: string;
608
+ footerStyle?: string;
611
609
  }
610
+ type SortType = 'string' | 'number' | 'date';
611
+
612
+ type AlertType = 'info' | 'warning' | 'error' | 'success';
613
+
614
+ type SkeletonVariant = 'text' | 'circle' | 'rect' | 'rounded';
615
+ type SkeletonAnimation = 'shimmer' | 'pulse' | 'none';
612
616
 
617
+ /** Visual variant of the file input component. */
618
+ type NgxFileInputVariant = 'default' | 'compact' | 'button';
619
+ /** Validation error codes emitted by the file input. */
620
+ type NgxFileErrorCode = 'SIZE_EXCEEDED' | 'TYPE_NOT_ALLOWED' | 'MAX_FILES_EXCEEDED';
621
+ /** Represents a file selected by the user, with metadata and optional preview. */
622
+ interface NgxFileItem {
623
+ /** The native File object. */
624
+ file: File;
625
+ /** Unique identifier generated internally. */
626
+ id: string;
627
+ /** File name. */
628
+ name: string;
629
+ /** File size in bytes. */
630
+ size: number;
631
+ /** MIME type of the file. */
632
+ type: string;
633
+ /** Data URL for image previews. */
634
+ preview?: string;
635
+ /** Whether the file passed validation. */
636
+ status: 'valid' | 'error';
637
+ /** Validation error message, if any. */
638
+ error?: string;
639
+ }
640
+ /** Describes a validation error for a specific file. */
641
+ interface NgxFileError {
642
+ /** The native File that failed validation. */
643
+ file: File;
644
+ /** Machine-readable error code. */
645
+ code: NgxFileErrorCode;
646
+ /** Human-readable error message. */
647
+ message: string;
648
+ }
649
+
650
+ declare enum DialogBodyType {
651
+ TEXT = "text",
652
+ HTML = "html",
653
+ COMPONENT = "component",
654
+ TEMPLATE = "template"
655
+ }
656
+ interface DialogBodyConfig<T = any> {
657
+ type: DialogBodyType;
658
+ content: string | Type<T> | TemplateRef<any>;
659
+ data?: T;
660
+ }
661
+ interface DialogConfig<T = any> {
662
+ title: string;
663
+ icon?: string;
664
+ iconColor?: string;
665
+ subtitle?: string;
666
+ body: DialogBodyConfig<T>;
667
+ showCancel?: boolean;
668
+ showConfirm?: boolean;
669
+ cancelText?: string;
670
+ confirmText?: string;
671
+ }
672
+
673
+ interface ConfigureTableColumnData<T> {
674
+ tableId: string;
675
+ tableName: string;
676
+ columns: ColumnConfig<T>[];
677
+ filtersValue: Partial<Record<keyof T, ColumnValue>>;
678
+ columnsLabels: Partial<Record<keyof T, string>>;
679
+ }
613
680
  interface ColumnConfig<T> {
614
681
  key: keyof T;
615
682
  show: boolean;
616
683
  isSticky: boolean;
617
684
  }
618
685
 
686
+ type TipoPantalla = 'movil' | 'tablet' | 'escritorio';
687
+
688
+ interface Pantalla {
689
+ tipo: TipoPantalla;
690
+ ancho: number;
691
+ alto: number;
692
+ }
693
+
694
+ type SendType = 'save' | 'save_and_apply';
695
+
696
+ /** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */
697
+ interface ResolvedOption<T> {
698
+ value: T[keyof T];
699
+ label: string;
700
+ disabled: boolean;
701
+ visible: boolean;
702
+ }
703
+ declare class NgxBasicSelect<T> implements ControlValueAccessor {
704
+ readonly intl: NgxTablesIntl;
705
+ /**
706
+ * Se auto-registra como ControlValueAccessor del control del formulario.
707
+ * Se usa `self`/`optional` para poder leer el estado de validación (invalid/touched)
708
+ * y para no fallar cuando el componente se usa sin formulario.
709
+ */
710
+ private readonly _ngControl;
711
+ readonly label: _angular_core.InputSignal<string>;
712
+ readonly options: _angular_core.InputSignal<T[]>;
713
+ readonly basicSelectConfig: _angular_core.InputSignal<BasicSelectConfig<T>>;
714
+ readonly isLoading: _angular_core.InputSignal<boolean>;
715
+ readonly placeholder: _angular_core.InputSignal<string>;
716
+ readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
717
+ readonly appearance: _angular_core.InputSignal<"fill" | "outline">;
718
+ readonly multiple: _angular_core.InputSignal<boolean>;
719
+ readonly disabled: _angular_core.InputSignal<boolean>;
720
+ readonly clearable: _angular_core.InputSignal<boolean>;
721
+ readonly error: _angular_core.InputSignal<string>;
722
+ readonly class: _angular_core.InputSignal<string>;
723
+ /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */
724
+ selectionChange: _angular_core.OutputEmitterRef<T[keyof T] | T[keyof T][] | null>;
725
+ readonly matSelect: _angular_core.Signal<MatSelect>;
726
+ readonly searchInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
727
+ /** FormControl interno que gobierna el mat-select (independiente del control del form). */
728
+ protected readonly innerControl: FormControl<any>;
729
+ /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */
730
+ protected readonly value: _angular_core.WritableSignal<any>;
731
+ /** Deshabilitado que llega vía setDisabledState (reactive forms). */
732
+ private readonly cvaDisabled;
733
+ /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */
734
+ protected readonly searchQuery: _angular_core.WritableSignal<string>;
735
+ private onChange;
736
+ private onTouched;
737
+ /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */
738
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
739
+ /**
740
+ * Opciones resueltas y marcadas con `visible` según el buscador. Las no visibles
741
+ * NO se quitan del DOM (se ocultan con display:none) para que el mat-select siga
742
+ * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.
743
+ */
744
+ protected readonly resolvedOptions: _angular_core.Signal<ResolvedOption<T>[]>;
745
+ /** Hay datos de entrada (con independencia del buscador). */
746
+ protected readonly hasData: _angular_core.Signal<boolean>;
747
+ /**
748
+ * Opciones que se renderizan realmente: las que casan con el buscador MÁS las que
749
+ * estén seleccionadas (aunque no casen). Se quitan del DOM las que no casan para que
750
+ * el ListKeyManager de mat-select no las pueda enfocar con las flechas —marcarlas
751
+ * `disabled` no basta: con el panel abierto Material permite enfocar deshabilitadas
752
+ * (recomendación WAI-ARIA)—. Las seleccionadas se conservan para que el trigger
753
+ * pueda pintar su etiqueta y no se pierda el valor al filtrar.
754
+ */
755
+ protected readonly displayedOptions: _angular_core.Signal<ResolvedOption<T>[]>;
756
+ /** No hay ninguna opción que mostrar (ni coincidencia ni seleccionada). */
757
+ protected readonly showNoOptionsMessage: _angular_core.Signal<boolean>;
758
+ /** Mensaje aria-live con el recuento de resultados al filtrar. */
759
+ protected readonly searchAnnouncement: _angular_core.Signal<string>;
760
+ /** ErrorStateMatcher que refleja el estado del control del formulario. */
761
+ protected readonly errorStateMatcher: ErrorStateMatcher;
762
+ constructor();
763
+ writeValue(value: any): void;
764
+ registerOnChange(fn: (value: any) => void): void;
765
+ registerOnTouched(fn: () => void): void;
766
+ setDisabledState(isDisabled: boolean): void;
767
+ onOpenedChange(opened: boolean): void;
768
+ onSearchInput(value: string): void;
769
+ /**
770
+ * Deja pasar al mat-select las teclas de navegación (flechas, Enter, Escape…) para
771
+ * poder moverse por la lista sin salir del buscador, y detiene las de carácter para
772
+ * que no disparen el typeahead nativo del mat-select.
773
+ */
774
+ onSearchKeydown(event: KeyboardEvent): void;
775
+ clearSearch(): void;
776
+ onClearClick(): void;
777
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxBasicSelect<any>, never>;
778
+ 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>;
779
+ }
780
+
781
+ declare class NgxDialog<T = any> {
782
+ private _dialogRef;
783
+ private _data;
784
+ readonly title: string;
785
+ readonly icon: string | undefined;
786
+ readonly iconColor: string | undefined;
787
+ readonly subtitle: string | undefined;
788
+ readonly body: ngx_eiffage_material.DialogBodyConfig<T>;
789
+ readonly showCancel: boolean;
790
+ readonly showConfirm: boolean;
791
+ readonly cancelText: string;
792
+ readonly confirmText: string;
793
+ DialogBodyType: typeof DialogBodyType;
794
+ onCancelClick(): void;
795
+ onConfirmClick(): void;
796
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDialog<any>, never>;
797
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDialog<any>, "ngx-dialog", never, {}, {}, never, never, true, never>;
798
+ }
799
+
800
+ declare class NgxConfirmDialogComponent {
801
+ dialogRef: MatDialogRef<any, any>;
802
+ data: ConfirmDialogData<any>;
803
+ intl: NgxTablesIntl;
804
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxConfirmDialogComponent, never>;
805
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxConfirmDialogComponent, "ngx-confirm-dialog", never, {}, {}, never, never, true, never>;
806
+ }
807
+
619
808
  declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnInit, OnDestroy {
620
809
  private readonly columnConfigService;
621
810
  private readonly advancedFilterService;
@@ -665,7 +854,6 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnIn
665
854
  private overlayRef?;
666
855
  private portal?;
667
856
  protected defaultFiltersForPaginatedFilterOptions: WritableSignal<PaginatedFilter<FilterOption>>;
668
- constructor(intl: NgxTablesIntl | null);
669
857
  ngOnInit(): void;
670
858
  onEscape(): void;
671
859
  ngOnDestroy(): void;
@@ -720,7 +908,7 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnIn
720
908
  private enterFullscreen;
721
909
  private exitFullscreen;
722
910
  private isMyOverlayOnTop;
723
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedTable<any, any>, [{ optional: true; }]>;
911
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedTable<any, any>, never>;
724
912
  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
913
  }
726
914
 
@@ -842,7 +1030,6 @@ declare class SearchableSelectComponent<T> {
842
1030
  optionChange: _angular_core.OutputEmitterRef<string | string[] | undefined>;
843
1031
  protected searcher: _angular_core.Signal<ElementRef<any> | undefined>;
844
1032
  protected innerControl: _angular_core.WritableSignal<FormControl<any>>;
845
- constructor(intl: NgxTablesIntl | null);
846
1033
  selectedEffect: _angular_core.EffectRef;
847
1034
  protected openedChange(open: boolean): void;
848
1035
  protected cleanQuery(): void;
@@ -850,7 +1037,7 @@ declare class SearchableSelectComponent<T> {
850
1037
  protected showOption(option: T): boolean;
851
1038
  protected onOptionChange(event: MatSelectChange<string | string[] | undefined>): void;
852
1039
  protected numberOfResults(): number;
853
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchableSelectComponent<any>, [{ optional: true; }]>;
1040
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchableSelectComponent<any>, never>;
854
1041
  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
1042
  }
856
1043
 
@@ -876,7 +1063,6 @@ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>
876
1063
  protected innerControl: WritableSignal<FormControl<any>>;
877
1064
  private queryTimeout;
878
1065
  private readonly debounceTime;
879
- constructor(intl: NgxTablesIntl | null);
880
1066
  selectedEffect: _angular_core.EffectRef;
881
1067
  dataResource: _angular_core.ResourceRef<PaginatedItems<T>>;
882
1068
  protected options: WritableSignal<T[]>;
@@ -890,7 +1076,7 @@ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>
890
1076
  protected onOptionChange(event: MatSelectChange<T | T[] | undefined>): void;
891
1077
  protected optionsSelectedForView(): T[];
892
1078
  protected onMoreClick(): void;
893
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginatedSearchableSelectComponent<any, any>, [{ optional: true; }]>;
1079
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginatedSearchableSelectComponent<any, any>, never>;
894
1080
  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
1081
  }
896
1082
 
@@ -898,15 +1084,16 @@ declare class NgxAlert {
898
1084
  type: _angular_core.InputSignal<AlertType>;
899
1085
  title: _angular_core.InputSignal<string | undefined>;
900
1086
  message: _angular_core.InputSignal<string | undefined>;
901
- iconName: _angular_core.Signal<"error" | "info" | "warning" | "check_circle">;
1087
+ iconName: _angular_core.Signal<"info" | "warning" | "error" | "check_circle">;
902
1088
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxAlert, never>;
903
1089
  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
1090
  }
905
1091
 
906
- declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnInit {
1092
+ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor {
907
1093
  private readonly _bottomSheet;
908
- private readonly _cdr;
909
- private readonly _matSelect;
1094
+ /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */
1095
+ private readonly _ngControl;
1096
+ readonly intl: NgxTablesIntl;
910
1097
  /** Label that floats on the form field */
911
1098
  readonly label: _angular_core.InputSignal<string>;
912
1099
  /** Title shown in the bottom sheet header */
@@ -917,8 +1104,6 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
917
1104
  readonly config: _angular_core.InputSignal<PaginatedSelectConfig<T>>;
918
1105
  /** Writable signal with the current filter state */
919
1106
  readonly filters: _angular_core.InputSignal<WritableSignal<U>>;
920
- /** FormControl to integrate with reactive forms */
921
- readonly control: _angular_core.InputSignal<FormControl<any>>;
922
1107
  /** Pre-selected items — accepts full objects OR partials with only the valueKey set */
923
1108
  readonly selectedItems: _angular_core.InputSignal<Partial<T>[]>;
924
1109
  /** Allow selecting multiple items */
@@ -935,14 +1120,16 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
935
1120
  readonly displayMode: _angular_core.InputSignal<"text" | "chips">;
936
1121
  /** Whether to show the search input inside the bottom sheet */
937
1122
  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>;
1123
+ /** Placeholder for the search input inside the bottom sheet (defaults to intl) */
1124
+ readonly searchPlaceholder: _angular_core.InputSignal<string | undefined>;
1125
+ /** Message when no results are found (defaults to intl) */
1126
+ readonly noResultsMessage: _angular_core.InputSignal<string | undefined>;
1127
+ /** Label for the confirm button (multiple mode, defaults to intl) */
1128
+ readonly confirmLabel: _angular_core.InputSignal<string | undefined>;
1129
+ /** Label for the reset button (multiple mode, defaults to intl) */
1130
+ readonly resetLabel: _angular_core.InputSignal<string | undefined>;
1131
+ /** Controls how the subscript wrapper (hint/error) reserves space */
1132
+ readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
946
1133
  /** Error message rendered inside mat-error */
947
1134
  readonly error: _angular_core.InputSignal<string>;
948
1135
  /** Hint message rendered inside mat-hint */
@@ -962,35 +1149,55 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
962
1149
  readonly chipsDirection: _angular_core.InputSignal<"row" | "column">;
963
1150
  /** Whether to show a "Select all" toggle in the bottom sheet (multiple mode) */
964
1151
  readonly showSelectAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
965
- /** Label for the select all toggle */
966
- readonly selectAllLabel: _angular_core.InputSignal<string>;
1152
+ /** Label for the select all toggle (defaults to intl) */
1153
+ readonly selectAllLabel: _angular_core.InputSignal<string | undefined>;
967
1154
  /** Emits the full T object (single) or T[] (multiple) when selection changes */
968
1155
  readonly valueChange: _angular_core.OutputEmitterRef<Partial<T> | Partial<T>[] | undefined>;
969
1156
  /** Emits the raw array of selected items (may be partial if never confirmed) */
970
1157
  readonly selectionChange: _angular_core.OutputEmitterRef<Partial<T>[]>;
971
- protected _selectedItems: WritableSignal<Partial<T>[]>;
972
- protected _isDisabled: WritableSignal<boolean>;
973
- protected _isOpen: WritableSignal<boolean>;
1158
+ protected readonly _selectedItems: WritableSignal<Partial<T>[]>;
1159
+ private readonly _cvaDisabled;
1160
+ protected readonly _isOpen: WritableSignal<boolean>;
1161
+ private onChange;
1162
+ private onTouched;
1163
+ /** Evita re-emitir onChange cuando el cambio viene del formulario (writeValue). */
1164
+ private _suppressEmit;
1165
+ /** Huella de la última selección aplicada desde el input `selectedItems`. */
1166
+ private _lastSyncedSelection;
1167
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
974
1168
  protected readonly selectedLabel: _angular_core.Signal<string>;
975
- /**
976
- * Safe label resolver: tries `displayedLabel(item)`, falls back to
977
- * `String(item[valueKey])` so partial objects never throw.
978
- */
979
- protected getLabel(item: Partial<T>): string;
980
1169
  protected readonly hasSelection: _angular_core.Signal<boolean>;
981
- /** ErrorStateMatcher that reflects the bound FormControl's touched+invalid state */
982
- protected readonly errorStateMatcher: _angular_core.Signal<ErrorStateMatcher>;
983
1170
  protected readonly showChips: _angular_core.Signal<boolean>;
984
1171
  protected readonly displayedChips: _angular_core.Signal<Partial<T>[]>;
985
1172
  protected readonly remainingChipsCount: _angular_core.Signal<number>;
1173
+ /** ErrorStateMatcher que refleja el estado del control del formulario. */
1174
+ protected readonly errorStateMatcher: ErrorStateMatcher;
1175
+ protected readonly effectiveSearchPlaceholder: _angular_core.Signal<string>;
1176
+ protected readonly effectiveNoResults: _angular_core.Signal<string>;
1177
+ protected readonly effectiveConfirmLabel: _angular_core.Signal<string>;
1178
+ protected readonly effectiveResetLabel: _angular_core.Signal<string>;
1179
+ protected readonly effectiveSelectAllLabel: _angular_core.Signal<string>;
986
1180
  constructor();
987
- ngOnInit(): void;
1181
+ writeValue(value: T[keyof T] | T[keyof T][] | null): void;
1182
+ registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | null) => void): void;
1183
+ registerOnTouched(fn: () => void): void;
1184
+ setDisabledState(isDisabled: boolean): void;
1185
+ private keysFromValue;
1186
+ private applyValueFromKeys;
1187
+ private sameKeySet;
1188
+ private emitChange;
1189
+ /**
1190
+ * Safe label resolver: tries `displayedLabel(item)`, falls back to
1191
+ * `String(item[valueKey])` so partial objects never throw.
1192
+ */
1193
+ protected getLabel(item: Partial<T>): string;
988
1194
  openBottomSheet(event: Event): void;
1195
+ /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */
1196
+ onTriggerKeydown(event: KeyboardEvent): void;
989
1197
  removeChip(item: Partial<T>, _event: MatChipEvent): void;
990
- preventOpen(isOpen: boolean): void;
991
1198
  clearSelection(event: Event): void;
992
1199
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPaginatedSelect<any, any>, never>;
993
- 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; }; "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>;
1200
+ 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>;
994
1201
  }
995
1202
 
996
1203
  interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {
@@ -1017,6 +1224,7 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1017
1224
  private readonly _ref;
1018
1225
  private readonly _destroy;
1019
1226
  readonly data: NgxPaginatedSelectBottomSheetData<T, U>;
1227
+ readonly intl: NgxTablesIntl;
1020
1228
  /** Raw input value — updates on every keystroke, does NOT trigger the resource */
1021
1229
  readonly query: WritableSignal<string | undefined>;
1022
1230
  /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */
@@ -1036,8 +1244,26 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1036
1244
  readonly resource: _angular_core.ResourceRef<PaginatedItems<T>>;
1037
1245
  readonly isLoading: _angular_core.Signal<boolean>;
1038
1246
  readonly options: _angular_core.Signal<T[]>;
1039
- readonly total: _angular_core.Signal<number>;
1247
+ readonly hasError: _angular_core.Signal<boolean>;
1040
1248
  readonly selectedCount: _angular_core.Signal<number>;
1249
+ /**
1250
+ * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante
1251
+ * la carga por scroll, resource.value() pasa transitoriamente al defaultValue
1252
+ * (total: 0); leerlo directamente hacía parpadear el footer a "0 resultados"
1253
+ * aunque el total real no cambie. Con este signal el total se mantiene estable
1254
+ * mientras se cargan más páginas.
1255
+ */
1256
+ private readonly _total;
1257
+ readonly total: _angular_core.Signal<number>;
1258
+ private readonly _totalEffect;
1259
+ /** Cargando la PRIMERA página (lista vacía) → se muestran skeletons. */
1260
+ readonly isInitialLoading: _angular_core.Signal<boolean>;
1261
+ /** Cargando MÁS páginas (scroll) → fila inline "cargando más…", sin barra superior. */
1262
+ readonly isLoadingMore: _angular_core.Signal<boolean>;
1263
+ /** Ya se han cargado todos los resultados disponibles. */
1264
+ readonly allLoaded: _angular_core.Signal<boolean>;
1265
+ /** Cabecera con sombra solo cuando la lista está desplazada. */
1266
+ readonly headerScrolled: WritableSignal<boolean>;
1041
1267
  readonly allSelected: _angular_core.Signal<boolean>;
1042
1268
  readonly someSelected: _angular_core.Signal<boolean>;
1043
1269
  /**
@@ -1067,11 +1293,19 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1067
1293
  */
1068
1294
  getLabel(item: Partial<T>): string;
1069
1295
  getAvatarText(item: Partial<T>): string;
1296
+ /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */
1297
+ private readonly failedImages;
1298
+ /** URL de imagen del avatar, o null si no hay o si falló al cargar. */
1299
+ getAvatarImage(item: Partial<T>): string | null | undefined;
1300
+ /** Marca la imagen como fallida para caer al texto/icono. */
1301
+ onAvatarError(item: Partial<T>): void;
1070
1302
  toggleItem(item: T): void;
1071
1303
  removeSelectedChip(item: Partial<T>): void;
1072
1304
  onQueryInput(event: Event, container: HTMLElement): void;
1073
- clearQuery(inputEl: HTMLInputElement, container: HTMLElement): void;
1305
+ clearQuery(container?: HTMLElement): void;
1074
1306
  onScroll(container: HTMLElement): void;
1307
+ /** Reintenta la carga tras un error. */
1308
+ retry(): void;
1075
1309
  toggleSelectAll(): void;
1076
1310
  confirm(): void;
1077
1311
  reset(): void;
@@ -1116,6 +1350,7 @@ declare class NgxSkeleton {
1116
1350
  declare class NgxFileInput implements ControlValueAccessor {
1117
1351
  private readonly _platform;
1118
1352
  private readonly _inputId;
1353
+ private readonly _nativeInput;
1119
1354
  /** Accepted MIME types or extensions (e.g. `'image/*,.pdf'`). */
1120
1355
  readonly accept: _angular_core.InputSignal<string>;
1121
1356
  /** Allow selecting multiple files. */
@@ -1150,6 +1385,13 @@ declare class NgxFileInput implements ControlValueAccessor {
1150
1385
  readonly liveAnnouncement: _angular_core.WritableSignal<string>;
1151
1386
  /** Unique id for the hidden file input. */
1152
1387
  readonly inputId: string;
1388
+ /** Disabled state coming from `setDisabledState()` (reactive forms). */
1389
+ private readonly _cvaDisabled;
1390
+ /**
1391
+ * Effective disabled state: the `disabled` input OR the state pushed by the
1392
+ * parent FormControl through `setDisabledState()`.
1393
+ */
1394
+ readonly isDisabled: _angular_core.Signal<boolean>;
1153
1395
  /** Derived: valid files only (used as FormControl value). */
1154
1396
  protected readonly validFiles: _angular_core.Signal<File[]>;
1155
1397
  private _onChange;
@@ -1157,6 +1399,7 @@ declare class NgxFileInput implements ControlValueAccessor {
1157
1399
  writeValue(files: File[] | null): void;
1158
1400
  registerOnChange(fn: (value: File[]) => void): void;
1159
1401
  registerOnTouched(fn: () => void): void;
1402
+ setDisabledState(isDisabled: boolean): void;
1160
1403
  onDragOver(event: DragEvent): void;
1161
1404
  onDragLeave(event: DragEvent): void;
1162
1405
  onDrop(event: DragEvent): void;
@@ -1302,6 +1545,44 @@ declare class NgxDialogService {
1302
1545
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxDialogService>;
1303
1546
  }
1304
1547
 
1548
+ declare class AdvancedFilterService {
1549
+ private userIdFactory;
1550
+ private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG;
1551
+ private fullKey;
1552
+ private _advancedFilters;
1553
+ advancedFilters: _angular_core.Signal<Record<string, AdvancedFilter<any>[]>>;
1554
+ private setAdvancedFiltersEffect;
1555
+ constructor();
1556
+ private setAdvancedFilter;
1557
+ saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean;
1558
+ deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean;
1559
+ getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend?: boolean): AdvancedFilter<any> | undefined;
1560
+ getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[];
1561
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdvancedFilterService, never>;
1562
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AdvancedFilterService>;
1563
+ }
1564
+
1565
+ declare class ColumnConfigService {
1566
+ private userIdFactory;
1567
+ private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG;
1568
+ private fullKey;
1569
+ private _columnConfigs;
1570
+ columnConfigs: _angular_core.Signal<Record<string, ColumnConfig<any>[]>>;
1571
+ private setColumnConfigEffect;
1572
+ saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean;
1573
+ deleteColumnConfig(tableId: string): boolean;
1574
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnConfigService, never>;
1575
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ColumnConfigService>;
1576
+ }
1577
+
1578
+ declare class DatosPantallaService {
1579
+ private readonly isBrowser;
1580
+ pantalla: Signal<Pantalla | undefined>;
1581
+ private obtenerDatosPantalla;
1582
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatosPantallaService, never>;
1583
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DatosPantallaService>;
1584
+ }
1585
+
1305
1586
  declare class DynamicHostDirective<T> {
1306
1587
  private _vcr;
1307
1588
  private _currentRef;
@@ -1315,5 +1596,5 @@ declare class DynamicHostDirective<T> {
1315
1596
  declare const includeNoSensible: (cadena: string, query: string) => boolean;
1316
1597
  declare const base64ToUtf8: (str: string) => string;
1317
1598
 
1318
- 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 };
1319
- 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 };
1599
+ 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 };
1600
+ 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 };