ngx-eiffage-material 0.0.50 → 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;
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
+ }
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;
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';
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
 
@@ -903,10 +1089,11 @@ declare class NgxAlert {
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 */
@@ -932,17 +1117,17 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
932
1117
  * - 'chips': a chip per selected item (default when multiple=true)
933
1118
  * - 'text': a single comma-joined text line
934
1119
  */
935
- readonly displayMode: _angular_core.InputSignal<"chips" | "text">;
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>;
946
1131
  /** Controls how the subscript wrapper (hint/error) reserves space */
947
1132
  readonly subscriptSizing: _angular_core.InputSignal<SubscriptSizing>;
948
1133
  /** Error message rendered inside mat-error */
@@ -964,35 +1149,55 @@ declare class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnI
964
1149
  readonly chipsDirection: _angular_core.InputSignal<"row" | "column">;
965
1150
  /** Whether to show a "Select all" toggle in the bottom sheet (multiple mode) */
966
1151
  readonly showSelectAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
967
- /** Label for the select all toggle */
968
- readonly selectAllLabel: _angular_core.InputSignal<string>;
1152
+ /** Label for the select all toggle (defaults to intl) */
1153
+ readonly selectAllLabel: _angular_core.InputSignal<string | undefined>;
969
1154
  /** Emits the full T object (single) or T[] (multiple) when selection changes */
970
1155
  readonly valueChange: _angular_core.OutputEmitterRef<Partial<T> | Partial<T>[] | undefined>;
971
1156
  /** Emits the raw array of selected items (may be partial if never confirmed) */
972
1157
  readonly selectionChange: _angular_core.OutputEmitterRef<Partial<T>[]>;
973
- protected _selectedItems: WritableSignal<Partial<T>[]>;
974
- protected _isDisabled: WritableSignal<boolean>;
975
- 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>;
976
1168
  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
1169
  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
1170
  protected readonly showChips: _angular_core.Signal<boolean>;
986
1171
  protected readonly displayedChips: _angular_core.Signal<Partial<T>[]>;
987
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>;
988
1180
  constructor();
989
- 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;
990
1194
  openBottomSheet(event: Event): void;
1195
+ /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */
1196
+ onTriggerKeydown(event: KeyboardEvent): void;
991
1197
  removeChip(item: Partial<T>, _event: MatChipEvent): void;
992
- preventOpen(isOpen: boolean): void;
993
1198
  clearSelection(event: Event): void;
994
1199
  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>;
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>;
996
1201
  }
997
1202
 
998
1203
  interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {
@@ -1019,6 +1224,7 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1019
1224
  private readonly _ref;
1020
1225
  private readonly _destroy;
1021
1226
  readonly data: NgxPaginatedSelectBottomSheetData<T, U>;
1227
+ readonly intl: NgxTablesIntl;
1022
1228
  /** Raw input value — updates on every keystroke, does NOT trigger the resource */
1023
1229
  readonly query: WritableSignal<string | undefined>;
1024
1230
  /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */
@@ -1038,8 +1244,26 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1038
1244
  readonly resource: _angular_core.ResourceRef<PaginatedItems<T>>;
1039
1245
  readonly isLoading: _angular_core.Signal<boolean>;
1040
1246
  readonly options: _angular_core.Signal<T[]>;
1041
- readonly total: _angular_core.Signal<number>;
1247
+ readonly hasError: _angular_core.Signal<boolean>;
1042
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>;
1043
1267
  readonly allSelected: _angular_core.Signal<boolean>;
1044
1268
  readonly someSelected: _angular_core.Signal<boolean>;
1045
1269
  /**
@@ -1069,11 +1293,19 @@ declare class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilte
1069
1293
  */
1070
1294
  getLabel(item: Partial<T>): string;
1071
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;
1072
1302
  toggleItem(item: T): void;
1073
1303
  removeSelectedChip(item: Partial<T>): void;
1074
1304
  onQueryInput(event: Event, container: HTMLElement): void;
1075
- clearQuery(inputEl: HTMLInputElement, container: HTMLElement): void;
1305
+ clearQuery(container?: HTMLElement): void;
1076
1306
  onScroll(container: HTMLElement): void;
1307
+ /** Reintenta la carga tras un error. */
1308
+ retry(): void;
1077
1309
  toggleSelectAll(): void;
1078
1310
  confirm(): void;
1079
1311
  reset(): void;
@@ -1118,6 +1350,7 @@ declare class NgxSkeleton {
1118
1350
  declare class NgxFileInput implements ControlValueAccessor {
1119
1351
  private readonly _platform;
1120
1352
  private readonly _inputId;
1353
+ private readonly _nativeInput;
1121
1354
  /** Accepted MIME types or extensions (e.g. `'image/*,.pdf'`). */
1122
1355
  readonly accept: _angular_core.InputSignal<string>;
1123
1356
  /** Allow selecting multiple files. */
@@ -1152,6 +1385,13 @@ declare class NgxFileInput implements ControlValueAccessor {
1152
1385
  readonly liveAnnouncement: _angular_core.WritableSignal<string>;
1153
1386
  /** Unique id for the hidden file input. */
1154
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>;
1155
1395
  /** Derived: valid files only (used as FormControl value). */
1156
1396
  protected readonly validFiles: _angular_core.Signal<File[]>;
1157
1397
  private _onChange;
@@ -1159,6 +1399,7 @@ declare class NgxFileInput implements ControlValueAccessor {
1159
1399
  writeValue(files: File[] | null): void;
1160
1400
  registerOnChange(fn: (value: File[]) => void): void;
1161
1401
  registerOnTouched(fn: () => void): void;
1402
+ setDisabledState(isDisabled: boolean): void;
1162
1403
  onDragOver(event: DragEvent): void;
1163
1404
  onDragLeave(event: DragEvent): void;
1164
1405
  onDrop(event: DragEvent): void;
@@ -1304,6 +1545,44 @@ declare class NgxDialogService {
1304
1545
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxDialogService>;
1305
1546
  }
1306
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
+
1307
1586
  declare class DynamicHostDirective<T> {
1308
1587
  private _vcr;
1309
1588
  private _currentRef;
@@ -1317,5 +1596,5 @@ declare class DynamicHostDirective<T> {
1317
1596
  declare const includeNoSensible: (cadena: string, query: string) => boolean;
1318
1597
  declare const base64ToUtf8: (str: string) => string;
1319
1598
 
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 };
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 };