ngx-eiffage-material 0.2.0 → 0.4.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,9 +1,9 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { WritableSignal, Type, TemplateRef, PipeTransform, InjectionToken, Signal, EnvironmentProviders, OnInit, ElementRef, OnDestroy } from '@angular/core';
2
+ import { WritableSignal, Type, TemplateRef, PipeTransform, InjectionToken, Signal, EnvironmentProviders, AfterViewInit, DoCheck, ElementRef, OnDestroy } from '@angular/core';
3
3
  import * as ngx_eiffage_material from 'ngx-eiffage-material';
4
4
  import { FormBuilder, FormGroup, FormArray, AbstractControl, ControlValueAccessor, FormControl } from '@angular/forms';
5
5
  import { ErrorStateMatcher } from '@angular/material/core';
6
- import { SubscriptSizing } from '@angular/material/form-field';
6
+ import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';
7
7
  import { MatSelect, MatSelectChange } from '@angular/material/select';
8
8
  import { MatDialogRef, MatDialogConfig } from '@angular/material/dialog';
9
9
  import { DateRange } from '@angular/material/datepicker';
@@ -579,8 +579,19 @@ interface NgxEiffageTexts {
579
579
  /** ngx-input-file. */
580
580
  inputFile: {
581
581
  label: string;
582
+ /** Texto del campo vacío. */
583
+ placeholder: string;
584
+ /** Pista mientras se arrastran ficheros encima. */
582
585
  dropping: string;
586
+ /** Etiqueta accesible y tooltip del botón de examinar. */
587
+ browse: string;
583
588
  remove: (fileName: string) => string;
589
+ /** Fichero descartado por no cumplir `accept`. */
590
+ rejectedType: (fileName: string) => string;
591
+ /** Fichero descartado por superar `maxSize` (ya formateado: «2 MB»). */
592
+ rejectedSize: (fileName: string, maxSize: string) => string;
593
+ /** Ficheros descartados por superar `maxFiles`. */
594
+ rejectedCount: (max: number) => string;
584
595
  };
585
596
  skeleton: {
586
597
  loading: string;
@@ -903,57 +914,93 @@ declare class NgxLoadingButton {
903
914
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxLoadingButton, "ngx-loading-button", never, { "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "matButton": { "alias": "matButton"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "spinnerDiameter": { "alias": "spinnerDiameter"; "required": false; "isSignal": true; }; "spinnerStrokeWidth": { "alias": "spinnerStrokeWidth"; "required": false; "isSignal": true; }; "busyLabel": { "alias": "busyLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
904
915
  }
905
916
 
906
- declare class NgxInputFile implements ControlValueAccessor, OnInit {
907
- private _cdr;
908
- value: _angular_core.WritableSignal<File[]>;
909
- onChangeCb?: (files: File[]) => void;
910
- onTouchCb?: () => void;
911
- /** Etiqueta del campo. Por defecto, el texto `inputFile.label` de la librería. */
912
- label: _angular_core.InputSignal<string | undefined>;
913
- /**
914
- * FormControl externo. Es opcional: si el componente se usa con
915
- * `formControlName` / `[formControl]`, el enlace se hace por
916
- * ControlValueAccessor y no hace falta pasarlo.
917
- */
918
- control: _angular_core.InputSignal<FormControl<File[]> | undefined>;
919
- disabled: _angular_core.InputSignal<boolean>;
920
- /** Sin uso: la plantilla nunca lo ha pintado (pendiente de revisar en ngx-input-file). */
921
- placeholder: _angular_core.InputSignal<string | undefined>;
917
+ /**
918
+ * Selector de ficheros con forma de campo de formulario: un `mat-form-field` con los ficheros como chips.
919
+ * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: `File[]`) o con `[(files)]`.
920
+ */
921
+ declare class NgxInputFile implements ControlValueAccessor, AfterViewInit, DoCheck {
922
+ private readonly _ngControl;
923
+ private readonly _parentForm;
924
+ private readonly _cdr;
925
+ private readonly _host;
926
+ private readonly _locale;
927
+ private readonly _nativeInput;
928
+ private readonly _chipGrid;
922
929
  protected readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
930
+ /** Etiqueta del campo. Por defecto, el texto `inputFile.label` de la librería. */
931
+ readonly label: _angular_core.InputSignal<string | undefined>;
932
+ /** Texto del campo vacío. Por defecto, el texto `inputFile.placeholder` de la librería. */
933
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
934
+ /** Texto de ayuda bajo el campo. */
935
+ readonly hint: _angular_core.InputSignal<string>;
936
+ /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */
937
+ readonly error: _angular_core.InputSignal<string>;
938
+ /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). Se comprueba también al arrastrar. */
939
+ readonly accept: _angular_core.InputSignal<string | string[]>;
940
+ /** Permite varios ficheros; cada selección se añade a los que ya hay. */
941
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
942
+ /** Tamaño máximo por fichero, en bytes. Los mayores se descartan. */
943
+ readonly maxSize: _angular_core.InputSignal<number | null>;
944
+ /** Número máximo de ficheros (con `multiple`). Los que no caben se descartan. */
945
+ readonly maxFiles: _angular_core.InputSignal<number | null>;
946
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
947
+ /** Apariencia del `mat-form-field`. */
948
+ readonly appearance: _angular_core.InputSignal<MatFormFieldAppearance>;
949
+ /** Ficheros seleccionados. Admite `[(files)]` para usarlo sin formularios. */
950
+ readonly files: _angular_core.ModelSignal<File[]>;
951
+ /** Fichero descartado al seleccionar o arrastrar (tipo, tamaño o número), con el mismo formato que ngx-file-input. */
952
+ readonly validationError: _angular_core.OutputEmitterRef<NgxFileError>;
923
953
  protected readonly resolvedLabel: _angular_core.Signal<string>;
924
- class: _angular_core.InputSignal<string>;
925
- accept: _angular_core.InputSignal<string[]>;
926
- multiple: _angular_core.InputSignal<boolean>;
927
- hint: _angular_core.InputSignal<string>;
928
- error: _angular_core.InputSignal<string>;
929
- isDropping: _angular_core.WritableSignal<boolean>;
930
- inputFileRef: _angular_core.Signal<ElementRef<any> | undefined>;
931
- internalControl: FormControl<string[] | null>;
932
- /** Estado deshabilitado que llega desde setDisabledState() (reactive forms). */
954
+ protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
955
+ protected readonly acceptAttr: _angular_core.Signal<string>;
956
+ protected readonly items: _angular_core.Signal<{
957
+ file: File;
958
+ icon: string;
959
+ size: string;
960
+ }[]>;
933
961
  private readonly _cvaDisabled;
934
- /** Estado deshabilitado efectivo: input `disabled` o el del FormControl padre. */
962
+ /** Deshabilitado por el input `disabled` o por el control del formulario. */
935
963
  readonly isDisabled: _angular_core.Signal<boolean>;
964
+ protected readonly isDropping: _angular_core.WritableSignal<boolean>;
965
+ protected readonly isRequired: _angular_core.WritableSignal<boolean>;
966
+ /** Ficheros descartados en la última selección; el mensaje se recalcula si cambia el idioma. */
967
+ private readonly _rejected;
968
+ protected readonly rejectionMessage: _angular_core.Signal<string>;
969
+ /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */
970
+ protected readonly errorStateMatcher: ErrorStateMatcher;
971
+ protected readonly noSeparators: number[];
972
+ private _onChange;
973
+ private _onTouched;
974
+ private _controlSub?;
936
975
  constructor();
937
- private checkErrors;
938
- controlEffect: _angular_core.EffectRef;
939
- ngOnInit(): void;
940
- onContainerClick(): void;
941
- onInputchange(event: any): void;
942
- onDragOver(event: DragEvent): void;
943
- onDragLeave(event: DragEvent): void;
944
- onDrop(event: DragEvent): void;
945
- attachFiles(files: FileList | null | undefined): void;
946
- writeValue(files: File[] | undefined | null): void;
947
- registerOnChange(fn: any): void;
948
- registerOnTouched(fn: any): void;
976
+ ngAfterViewInit(): void;
977
+ ngDoCheck(): void;
978
+ /** Abre el selector de ficheros del sistema. */
979
+ openPicker(): void;
980
+ /** Quita un fichero de la selección. */
981
+ remove(file: File): void;
982
+ protected onFieldClick(event: MouseEvent): void;
983
+ protected onTriggerKeydown(event: KeyboardEvent): void;
984
+ protected onTriggerBlur(): void;
985
+ protected onNativeChange(event: Event): void;
986
+ protected onNativeCancel(): void;
987
+ protected onDragOver(event: DragEvent): void;
988
+ protected onDragLeave(event: DragEvent): void;
989
+ protected onDrop(event: DragEvent): void;
990
+ writeValue(files: File[] | null | undefined): void;
991
+ registerOnChange(fn: (files: File[]) => void): void;
992
+ registerOnTouched(fn: () => void): void;
949
993
  setDisabledState(isDisabled: boolean): void;
950
- onDeleteFileClick(file: File): void;
951
- getAccept(): string;
952
- bytesToMegaBytes(bytes: number): string;
953
- private markAsTouched;
954
- private markAsDirty;
994
+ private _control;
995
+ /** Escucha el control (y el envío del formulario) para refrescar el asterisco y el estado de error con OnPush. */
996
+ private _bindControl;
997
+ private _syncFormState;
998
+ private _addFiles;
999
+ private _commit;
1000
+ private _markTouched;
1001
+ private _message;
955
1002
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxInputFile, never>;
956
- 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>;
1003
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxInputFile, "ngx-input-file", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; }, { "files": "filesChange"; "validationError": "validationError"; }, never, never, true, never>;
957
1004
  }
958
1005
 
959
1006
  /** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */
@@ -1091,6 +1138,11 @@ declare class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {
1091
1138
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDialog<any, any>, "ngx-dialog", never, {}, {}, never, never, true, never>;
1092
1139
  }
1093
1140
 
1141
+ /**
1142
+ * @deprecated Usar `NgxDialogService.confirm()` (o `template()` con contenido propio), que tiene el
1143
+ * encabezado, el botón X y la opción `destructive` de ngx-dialog. Las tablas ya no lo usan; se
1144
+ * mantiene solo por compatibilidad con quien lo abra directamente.
1145
+ */
1094
1146
  declare class NgxConfirmDialogComponent {
1095
1147
  dialogRef: MatDialogRef<any, any>;
1096
1148
  data: ConfirmDialogData<any>;
@@ -1103,6 +1155,7 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDe
1103
1155
  private readonly columnConfigService;
1104
1156
  private readonly advancedFilterService;
1105
1157
  private readonly dialog;
1158
+ private readonly dialogService;
1106
1159
  private readonly datosPantallaService;
1107
1160
  readonly texts: Signal<ngx_eiffage_material.NgxEiffageTexts>;
1108
1161
  protected isDesktop: Signal<boolean>;
@@ -1206,6 +1259,7 @@ declare class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDe
1206
1259
  declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1207
1260
  private readonly columnConfigService;
1208
1261
  private readonly dialog;
1262
+ private readonly dialogService;
1209
1263
  private readonly datosPantallaService;
1210
1264
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1211
1265
  protected isDesktop: _angular_core.Signal<boolean>;
@@ -1302,9 +1356,8 @@ declare class NgxBasicTable<T, U extends BasicFilter<T>> {
1302
1356
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxBasicTable<any, any>, "ngx-basic-table", never, { "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "queryFilter": { "alias": "queryFilter"; "required": false; "isSignal": true; }; "moreFilters": { "alias": "moreFilters"; "required": false; "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>;
1303
1357
  }
1304
1358
 
1305
- declare class SearchableSelectComponent<T> {
1359
+ declare class SearchableSelectComponent<T> implements ControlValueAccessor, AfterViewInit {
1306
1360
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1307
- control: _angular_core.InputSignal<FormControl<any> | undefined>;
1308
1361
  options: _angular_core.InputSignal<T[]>;
1309
1362
  optionLabel: _angular_core.InputSignal<(option: T) => string>;
1310
1363
  optionValue: _angular_core.InputSignal<(option: T) => string>;
@@ -1321,7 +1374,23 @@ declare class SearchableSelectComponent<T> {
1321
1374
  optionChange: _angular_core.OutputEmitterRef<string | string[] | undefined>;
1322
1375
  protected searcher: _angular_core.Signal<ElementRef<any> | undefined>;
1323
1376
  protected innerControl: _angular_core.WritableSignal<FormControl<any>>;
1377
+ /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */
1378
+ private readonly _ngControl;
1379
+ private readonly _parentForm;
1380
+ private readonly _cvaDisabled;
1381
+ private _onChange;
1382
+ private _onTouched;
1383
+ /** Asterisco de obligatorio: lo decide el control del formulario. */
1384
+ protected readonly isRequired: _angular_core.WritableSignal<boolean>;
1385
+ /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */
1386
+ protected readonly errorStateMatcher: ErrorStateMatcher;
1387
+ constructor();
1324
1388
  selectedEffect: _angular_core.EffectRef;
1389
+ ngAfterViewInit(): void;
1390
+ writeValue(value: string | string[] | undefined | null): void;
1391
+ registerOnChange(fn: (value: string | string[] | undefined) => void): void;
1392
+ registerOnTouched(fn: () => void): void;
1393
+ setDisabledState(isDisabled: boolean): void;
1325
1394
  protected openedChange(open: boolean): void;
1326
1395
  protected cleanQuery(): void;
1327
1396
  protected getClearableOptionName(): string;
@@ -1329,12 +1398,11 @@ declare class SearchableSelectComponent<T> {
1329
1398
  protected onOptionChange(event: MatSelectChange<string | string[] | undefined>): void;
1330
1399
  protected numberOfResults(): number;
1331
1400
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchableSelectComponent<any>, never>;
1332
- 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>;
1401
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchableSelectComponent<any>, "ngx-searchable-select", never, { "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>;
1333
1402
  }
1334
1403
 
1335
- declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements OnDestroy {
1404
+ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, OnDestroy {
1336
1405
  readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1337
- control: _angular_core.InputSignal<FormControl<any> | undefined>;
1338
1406
  endpoint: _angular_core.InputSignal<(filters: U) => Observable<PaginatedItems<T>>>;
1339
1407
  filters: _angular_core.InputSignal<WritableSignal<U>>;
1340
1408
  optionLabel: _angular_core.InputSignal<(option: T) => string>;
@@ -1354,7 +1422,23 @@ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>
1354
1422
  protected innerControl: WritableSignal<FormControl<any>>;
1355
1423
  private queryTimeout;
1356
1424
  private readonly debounceTime;
1425
+ /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */
1426
+ private readonly _ngControl;
1427
+ private readonly _parentForm;
1428
+ private readonly _cvaDisabled;
1429
+ private _onChange;
1430
+ private _onTouched;
1431
+ /** Asterisco de obligatorio: lo decide el control del formulario. */
1432
+ protected readonly isRequired: WritableSignal<boolean>;
1433
+ /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */
1434
+ protected readonly errorStateMatcher: ErrorStateMatcher;
1435
+ constructor();
1357
1436
  selectedEffect: _angular_core.EffectRef;
1437
+ ngAfterViewInit(): void;
1438
+ writeValue(value: T | T[] | undefined | null): void;
1439
+ registerOnChange(fn: (value: T | T[] | undefined) => void): void;
1440
+ registerOnTouched(fn: () => void): void;
1441
+ setDisabledState(isDisabled: boolean): void;
1358
1442
  dataResource: _angular_core.ResourceRef<PaginatedItems<T>>;
1359
1443
  protected options: WritableSignal<T[]>;
1360
1444
  setOptions: _angular_core.EffectRef;
@@ -1368,7 +1452,7 @@ declare class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>
1368
1452
  protected optionsSelectedForView(): T[];
1369
1453
  protected onMoreClick(): void;
1370
1454
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginatedSearchableSelectComponent<any, any>, never>;
1371
- 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>;
1455
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PaginatedSearchableSelectComponent<any, any>, "ngx-paginated-searchable-select", never, { "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>;
1372
1456
  }
1373
1457
 
1374
1458
  declare class NgxAlert {
@@ -1694,83 +1778,105 @@ declare class NgxSkeleton {
1694
1778
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxSkeleton, "ngx-skeleton", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "lineSpacing": { "alias": "lineSpacing"; "required": false; "isSignal": true; }; "lastLineWidth": { "alias": "lastLineWidth"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "animationDuration": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "decorative": { "alias": "decorative"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1695
1779
  }
1696
1780
 
1697
- declare class NgxFileInput implements ControlValueAccessor {
1698
- private readonly _platform;
1699
- private readonly _inputId;
1781
+ /** Familia del fichero, para el color de su icono en ngx-file-input. */
1782
+ type FileKind = 'image' | 'pdf' | 'video' | 'audio' | 'generic';
1783
+
1784
+ /**
1785
+ * Zona para soltar o seleccionar ficheros, con lista de ficheros y previsualización de imágenes.
1786
+ * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: los `File[]` válidos) o con `[(files)]`.
1787
+ */
1788
+ declare class NgxFileInput implements ControlValueAccessor, AfterViewInit, DoCheck {
1789
+ private readonly _ngControl;
1790
+ private readonly _parentForm;
1791
+ private readonly _host;
1792
+ private readonly _locale;
1793
+ private readonly _isBrowser;
1700
1794
  private readonly _nativeInput;
1701
- /** Accepted MIME types or extensions (e.g. `'image/*,.pdf'`). */
1702
- readonly accept: _angular_core.InputSignal<string>;
1703
- /** Allow selecting multiple files. */
1795
+ protected readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1796
+ /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). `'*'` = cualquiera. */
1797
+ readonly accept: _angular_core.InputSignal<string | string[]>;
1798
+ /** Admite varios ficheros: cada selección se añade a la anterior. */
1704
1799
  readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
1705
- /** Maximum file size in bytes per file. `null` means no limit. */
1800
+ /** Tamaño máximo por fichero, en bytes. `null` = sin límite. */
1706
1801
  readonly maxSize: _angular_core.InputSignal<number | null>;
1707
- /** Maximum number of files when `multiple` is true. `null` means no limit. */
1802
+ /** Número máximo de ficheros válidos (con `multiple`). `null` = sin límite. */
1708
1803
  readonly maxFiles: _angular_core.InputSignal<number | null>;
1709
- /** Disables the component. */
1710
1804
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1711
- /** Label text shown inside the drop zone. Por defecto, el texto `fileInput.dropLabel` de la librería. */
1805
+ /** Texto principal. Por defecto, el texto `fileInput.dropLabel` de la librería. */
1712
1806
  readonly label: _angular_core.InputSignal<string | undefined>;
1713
- protected readonly texts: _angular_core.Signal<ngx_eiffage_material.NgxEiffageTexts>;
1714
- protected readonly resolvedLabel: _angular_core.Signal<string>;
1715
- /** Secondary hint text (formats, sizes…). */
1807
+ /** Texto secundario (formatos, tamaños…). */
1716
1808
  readonly hint: _angular_core.InputSignal<string | null>;
1717
- /** Show the file preview list below the drop zone. */
1809
+ /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */
1810
+ readonly error: _angular_core.InputSignal<string>;
1811
+ /** Muestra la lista de ficheros (con miniatura de las imágenes). */
1718
1812
  readonly showPreview: _angular_core.InputSignalWithTransform<boolean, unknown>;
1719
- /** Visual variant: `'default'` (large zone), `'compact'` (horizontal), or `'button'`. */
1813
+ /** `'default'` (zona grande), `'compact'` (barra horizontal) o `'button'` (solo un botón). */
1720
1814
  readonly variant: _angular_core.InputSignal<NgxFileInputVariant>;
1721
- /** Emits when valid files are added. */
1815
+ /** Ficheros válidos seleccionados. Admite `[(files)]` para usarlo sin formularios. */
1816
+ readonly files: _angular_core.ModelSignal<File[]>;
1817
+ /** Ficheros válidos añadidos en una selección o al soltar. */
1722
1818
  readonly filesSelected: _angular_core.OutputEmitterRef<NgxFileItem[]>;
1723
- /** Emits when a file is removed from the list. */
1819
+ /** Fichero quitado de la lista (válido o rechazado). */
1724
1820
  readonly fileRemoved: _angular_core.OutputEmitterRef<NgxFileItem>;
1725
- /** Emits for each file that fails validation. */
1821
+ /** Un fichero rechazado (tipo, tamaño o número). */
1726
1822
  readonly validationError: _angular_core.OutputEmitterRef<NgxFileError>;
1727
- /** All file items (valid + invalid). */
1728
- readonly items: _angular_core.WritableSignal<NgxFileItem[]>;
1729
- /** Whether the user is dragging files over the drop zone. */
1730
- readonly isDragOver: _angular_core.WritableSignal<boolean>;
1731
- /** Brief flash after a successful drop. */
1732
- readonly showDropConfirm: _angular_core.WritableSignal<boolean>;
1733
- /** Announcement text for screen readers. */
1734
- readonly liveAnnouncement: _angular_core.WritableSignal<string>;
1735
- /** Unique id for the hidden file input. */
1736
- readonly inputId: string;
1737
- /** Disabled state coming from `setDisabledState()` (reactive forms). */
1823
+ protected readonly id: string;
1824
+ private readonly _entries;
1738
1825
  private readonly _cvaDisabled;
1739
- /**
1740
- * Effective disabled state: the `disabled` input OR the state pushed by the
1741
- * parent FormControl through `setDisabledState()`.
1742
- */
1826
+ /** Deshabilitado por el input `disabled` o por el control del formulario. */
1743
1827
  readonly isDisabled: _angular_core.Signal<boolean>;
1744
- /** Derived: valid files only (used as FormControl value). */
1745
- protected readonly validFiles: _angular_core.Signal<File[]>;
1828
+ protected readonly isDragOver: _angular_core.WritableSignal<boolean>;
1829
+ protected readonly showDropConfirm: _angular_core.WritableSignal<boolean>;
1830
+ protected readonly announcement: _angular_core.WritableSignal<string>;
1831
+ protected readonly isRequired: _angular_core.WritableSignal<boolean>;
1832
+ protected readonly showError: _angular_core.WritableSignal<boolean>;
1833
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1834
+ protected readonly acceptAttr: _angular_core.Signal<string>;
1835
+ protected readonly describedBy: _angular_core.Signal<string | null>;
1836
+ /** Lo que pinta la lista: icono, color, tamaño legible y mensaje de error ya traducido. */
1837
+ protected readonly views: _angular_core.Signal<{
1838
+ item: NgxFileItem;
1839
+ icon: string;
1840
+ kind: FileKind;
1841
+ size: string;
1842
+ error: string | null;
1843
+ }[]>;
1746
1844
  private _onChange;
1747
1845
  private _onTouched;
1748
- writeValue(files: File[] | null): void;
1749
- registerOnChange(fn: (value: File[]) => void): void;
1750
- registerOnTouched(fn: () => void): void;
1751
- setDisabledState(isDisabled: boolean): void;
1752
- onDragOver(event: DragEvent): void;
1753
- onDragLeave(event: DragEvent): void;
1754
- onDrop(event: DragEvent): void;
1755
- onFileInputChange(event: Event): void;
1846
+ private _controlSub?;
1847
+ private _confirmTimer?;
1848
+ constructor();
1849
+ ngAfterViewInit(): void;
1850
+ ngDoCheck(): void;
1851
+ /** Abre el selector de ficheros del sistema (no hace nada si está deshabilitado). */
1756
1852
  openFilePicker(): void;
1853
+ /** Quita un fichero de la lista, válido o rechazado. */
1757
1854
  removeFile(item: NgxFileItem): void;
1758
- /** Format bytes to human-readable string. */
1759
- formatSize(bytes: number): string;
1760
- /** Get a Material icon name based on MIME type. */
1761
- getFileIcon(type: string): string;
1762
- /** Get an accent color class based on MIME type. */
1763
- getFileColorClass(type: string): string;
1764
- private _processFiles;
1765
- private _validateAndCreate;
1766
- private _toFileItem;
1767
- private _isTypeAllowed;
1768
- private _generatePreviews;
1769
- private _emitChange;
1855
+ protected onZoneKeydown(event: KeyboardEvent): void;
1856
+ protected onZoneBlur(): void;
1857
+ protected onNativeChange(event: Event): void;
1858
+ protected onDragOver(event: DragEvent): void;
1859
+ protected onDragLeave(event: DragEvent): void;
1860
+ protected onDrop(event: DragEvent): void;
1861
+ writeValue(files: File[] | null | undefined): void;
1862
+ registerOnChange(fn: (files: File[]) => void): void;
1863
+ registerOnTouched(fn: () => void): void;
1864
+ setDisabledState(isDisabled: boolean): void;
1865
+ private _validFiles;
1866
+ private _addFiles;
1867
+ /** Publica los ficheros válidos: model, formulario y estado de tocado. */
1868
+ private _commit;
1869
+ /** Lista nueva a partir de un valor externo (writeValue o [files]); los rechazados se descartan. */
1870
+ private _resetFrom;
1871
+ private _toItem;
1872
+ private _revokePreview;
1873
+ private _message;
1874
+ private _bindControl;
1875
+ private _syncFormState;
1876
+ private _markTouched;
1770
1877
  private _flashDropConfirm;
1771
- private _generateId;
1772
1878
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxFileInput, never>;
1773
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxFileInput, "ngx-file-input", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "showPreview": { "alias": "showPreview"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "filesSelected": "filesSelected"; "fileRemoved": "fileRemoved"; "validationError": "validationError"; }, never, never, true, never>;
1879
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxFileInput, "ngx-file-input", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "showPreview": { "alias": "showPreview"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; }, { "files": "filesChange"; "filesSelected": "filesSelected"; "fileRemoved": "fileRemoved"; "validationError": "validationError"; }, never, never, true, never>;
1774
1880
  }
1775
1881
 
1776
1882
  /** Opciones comunes a todos los diálogos. */
@@ -1836,7 +1942,9 @@ declare class NgxDialogService {
1836
1942
  * del diálogo como `dialog` (`let-data let-dialog="dialog"`).
1837
1943
  */
1838
1944
  template<T = any, R = boolean>(config: DialogHeaderOptions & {
1839
- template: TemplateRef<NgxDialogTemplateContext<T, R>> | TemplateRef<T>;
1945
+ template: TemplateRef<NgxDialogTemplateContext<T, R>> | TemplateRef<{
1946
+ $implicit: T;
1947
+ }> | TemplateRef<T>;
1840
1948
  templateData?: T;
1841
1949
  }, dialogConfig?: MatDialogConfig): Observable<R | boolean | undefined>;
1842
1950
  private _open;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-eiffage-material",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.0.0 || ^21.0.0 || ^22.0.0",
6
6
  "@angular/common": "^20.1.0 || ^21.0.0 || ^22.0.0",