ngx-eiffage-material 0.0.37 → 0.0.39

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-eiffage-material.mjs","sources":["../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.html","../../../projects/ngx-eiffage-material/src/lib/utils/string-operations.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.html","../../../projects/ngx-eiffage-material/src/lib/models/dialog-config.ts","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-tables.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-cell-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/pipes/only-upper-first-character.pipe.ts","../../../projects/ngx-eiffage-material/src/lib/models/paginated-table-config.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter-utils.ts","../../../projects/ngx-eiffage-material/src/lib/models/user-id-factory.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter.ts","../../../projects/ngx-eiffage-material/src/lib/services/advanced-filter.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/column-config.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/datos-pantalla.service.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.html","../../../projects/ngx-eiffage-material/src/lib/services/ngx-dialog.service.ts","../../../projects/ngx-eiffage-material/src/ngx-eiffage-material.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n input,\n output,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\n@Component({\n selector: 'ngx-loading-button',\n imports: [\n MatButtonModule,\n MatProgressSpinnerModule,\n MatIconModule,\n ],\n templateUrl: './ngx-loading-button.component.html',\n styleUrl: './ngx-loading-button.component.scss',\n})\nexport class NgxLoadingButton {\n isLoading = input.required<boolean>(); //Indica si el botón está cargando\n label = input.required<string>(); //Texto del botón\n matButton = input<'text' | 'filled' | 'elevated' | 'outlined' | 'tonal'>('filled'); //Tipo de botón\n type = input<'button' | 'submit' | 'reset'>('button'); //Tipo de acción del botón\n disabled = input<boolean>(false); //Indica si el botón está deshabilitado\n spinnerDiameter = input<number>(24) //Diameter del spinner de carga\n spinnerStrokeWidth = input<number>(3) //StrokeWidth del spinner de carga\n //Por defecto es Primary\n color = input<'secondary' | 'tertiary' | undefined>(undefined); //Color del botón\n\n /*\n No es necesario hacer el onClick, si queremos obtener un evento click,\n puedes hacerlo sobre la llamada al selector, es decir, sobre 'app-loading-button'\n */\n //onClick = output();\n}\n","<button\r\n class=\"loadingButton\"\r\n [matButton]=\"matButton()\"\r\n [type]=\"type()\"\r\n [disabled]=\"disabled() || isLoading()\"\r\n [class.isLoading]=\"isLoading()\"\r\n [class]=\"color() ?? ''\"\r\n>\r\n {{ label() }}\r\n</button>\r\n\r\n@if (isLoading()) {\r\n <mat-spinner\r\n class=\"spinnerLoadingButton\"\r\n [diameter]=\"spinnerDiameter()\"\r\n [strokeWidth]=\"spinnerStrokeWidth()\"\r\n />\r\n}\r\n","import {\n afterRenderEffect,\n ChangeDetectorRef,\n Component,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnInit,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'ngx-input-file',\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatProgressBarModule,\n MatChipsModule,\n MatTooltipModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatInputModule,\n ],\n templateUrl: './ngx-input-file.component.html',\n styleUrl: './ngx-input-file.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputFile),\n multi: true,\n },\n ],\n})\nexport class NgxInputFile implements OnInit {\n // dependencies injection\n private _cdr = inject(ChangeDetectorRef);\n\n\n value = signal<File[]>([]);\n onChangeCb?: (files: File[]) => void;\n onTouchCb?: () => void;\n\n label = input<string>('Seleccionar archivo');\n control = input.required<FormControl<File[]>>();\n disabled = input<boolean>(false);\n placeholder = input<string>('Haz click o arrastra archivos aquí');\n class = input<string>('');\n accept = input<string[]>([]);\n multiple = input<boolean>(false);\n hint = input<string>('');\n error = input<string>('');\n\n isDropping = signal(false);\n\n inputFileRef = viewChild<ElementRef>('inputFileRef');\n\n internalControl = new FormControl<string[]>([]);\n\n constructor() {\n afterRenderEffect(() => {\n const disabled = this.disabled();\n \n if (disabled && this.control().enabled) {\n this.control().disable({ emitEvent: false });\n this.internalControl.disable({ emitEvent: false });\n } else if (!disabled && this.control().disabled) {\n this.control().enable({ emitEvent: false });\n this.internalControl.enable({ emitEvent: false });\n }\n }); \n }\n\n private checkErrors() {\n if (this.control().invalid) {\n this.internalControl.setErrors(this.control().errors);\n } else {\n this.internalControl.setErrors(null);\n }\n this._cdr.markForCheck();\n }\n\n controlEffect = effect(() => {\n const value = this.value();\n // Usar untracked para evitar ciclos y emitEvent: false para no disparar eventos\n untracked(() => {\n this.control().setValue(value, { emitEvent: false });\n \n // Actualizar el control interno con strings (nombres de archivo)\n const fileNames = value.map(f => f.name);\n this.internalControl.setValue(fileNames, { emitEvent: false });\n \n this.checkErrors();\n this._cdr.markForCheck();\n });\n });\n\n ngOnInit(): void {\n if(this.disabled()) {\n this.control().disable();\n this.internalControl.disable();\n }\n }\n\n onContainerClick() {\n if (!this.disabled()) {\n this.control().markAsTouched();\n this.internalControl.markAsTouched();\n this.checkErrors();\n this._cdr.markForCheck();\n this.onTouchCb?.();\n this.inputFileRef()?.nativeElement.click();\n }\n }\n\n onInputchange(event: any) {\n const target: HTMLInputElement = event.target;\n const files: FileList | null = target.files;\n this.attachFiles(files);\n target.value = '';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n this.isDropping.set(true);\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n this.isDropping.set(false);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n this.isDropping.set(false);\n this.onTouchCb?.();\n if (!this.disabled()) {\n const files = event.dataTransfer?.files;\n // const validation = validateFiles(files, this.accept());\n\n this.attachFiles(files);\n }\n }\n\n attachFiles(files: FileList | null | undefined) {\n if (files && files.length > 0) {\n let newValue: File[];\n \n if (this.multiple()) {\n const currentFiles = this.value();\n const newFiles = Array.from(files);\n newValue = [...currentFiles, ...newFiles];\n } else {\n newValue = [files[0]];\n }\n \n this.value.set(newValue);\n this.onChangeCb?.(newValue);\n this.control().markAsTouched();\n this.internalControl.markAsTouched();\n this.control().markAsDirty();\n this.internalControl.markAsDirty();\n }\n }\n\n writeValue(files: File[] | undefined | null): void {\n this.value.set(files ?? []);\n }\n\n registerOnChange(fn: any): void {\n this.onChangeCb = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouchCb = fn;\n }\n\n onDeleteFileClick(file: File) {\n const newValue = this.value().filter((item) => item !== file);\n this.value.set(newValue);\n this.onChangeCb?.(newValue);\n this.control().markAsTouched();\n this.internalControl.markAsTouched();\n this.control().markAsDirty();\n this.internalControl.markAsDirty();\n }\n\n getAccept(): string {\n return this.accept().join();\n }\n\n bytesToMegaBytes(bytes: number): string {\n return (bytes / 1024 / 1024).toFixed(1);\n }\n}\n","<mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n (click)=\"onContainerClick()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n [class.dragover]=\"isDropping()\"\r\n>\r\n <mat-label>{{ label() }}</mat-label>\r\n <mat-chip-grid \r\n #chipGrid \r\n [formControl]=\"internalControl\"\r\n class=\"chips-grid\"\r\n >\r\n @for(file of value(); track file.name + $index) {\r\n <mat-chip-row\r\n (removed)=\"onDeleteFileClick(file)\"\r\n class=\"chip-item\"\r\n [title]=\"file.name\"\r\n >\r\n <div class=\"chip-content\">\r\n <span class=\"chip-label\">\r\n ({{ bytesToMegaBytes(file.size) }} MB) {{ file.name }}\r\n </span>\r\n </div>\r\n <button matChipRemove [attr.aria-label]=\"'Eliminar ' + file.name\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input \r\n #inputFileRef\r\n type=\"file\"\r\n [accept]=\"getAccept()\" \r\n [multiple]=\"multiple()\" \r\n (change)=\"onInputchange($event)\"\r\n [matChipInputFor]=\"chipGrid\"\r\n style=\"display: none\"\r\n /> \r\n <mat-hint>{{ isDropping() ? 'Arrastrar archivos aquí' : hint() }}</mat-hint>\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","export const includeNoSensible = (cadena: string, query: string): boolean => {\r\n const nomalizadoCadena = cadena\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n const nomalizadoQuery = query\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n return nomalizadoCadena.includes(nomalizadoQuery);\r\n};\r\n\r\nexport const base64ToUtf8 = (str: string): string => {\r\n return decodeURIComponent(\r\n atob(str)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n};\r\n","import { afterRenderEffect, Component, effect, ElementRef, input, OnInit, output, signal, untracked, viewChild } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelect, MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { BasicSelectConfig } from '../../models';\nimport { includeNoSensible } from '../../utils';\n\n@Component({\n selector: 'ngx-basic-select',\n imports: [\n MatInputModule,\n MatSelectModule,\n MatIconModule,\n MatButtonModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatProgressSpinnerModule,\n],\n templateUrl: './ngx-basic-select.component.html',\n styleUrl: './ngx-basic-select.component.scss',\n})\nexport class NgxBasicSelect<T> {\n\n //inputs\n readonly label = input.required<string>();\n readonly options = input.required<T[]>();\n readonly basicSelectConfig = input.required<BasicSelectConfig<T>>();\n readonly control = input.required<FormControl>();\n readonly isLoading = input.required<boolean>();\n readonly placeholder = input<string>('');\n readonly appearance = input<'fill' | 'outline'>('fill');\n readonly multiple = input<boolean>(false);\n readonly disabled = input<boolean>(false);\n readonly clearable = input<boolean>(false);\n readonly error = input<string>('');\n readonly class = input<string>('');\n\n //outputs\n selectionChange = output<any>();\n\n //viewChilds\n readonly matSelect = viewChild.required<MatSelect>('matSelect');\n readonly searchInput = viewChild<ElementRef>('searchInput');\n\n constructor() {\n afterRenderEffect(() => {\n const disabled = this.disabled();\n const control = this.control();\n\n if (disabled && control.enabled) {\n control.disable({ emitEvent: false });\n } else if (!disabled && control.disabled) {\n control.enable({ emitEvent: false });\n }\n });\n }\n\n onOpenedChange(opened: boolean): void {\n if (opened) {\n this.onClearInputClick();\n setTimeout(() => {\n const panel = this.matSelect().panel?.nativeElement;\n if (panel) {\n panel.scrollTop = 0;\n }\n });\n }\n }\n\n includeInFilter(option: T, query: string): boolean {\n return includeNoSensible(String(this.basicSelectConfig().displayedLabel(option)), query);\n }\n\n onClearClick(): void {\n const newValue = this.multiple() ? [] : null;\n this.control().setValue(newValue, { emitEvent: true });\n this.control().markAsTouched();\n this.control().updateValueAndValidity();\n this.selectionChange.emit(newValue);\n }\n\n onSelectionChange(event: MatSelectChange): void {\n if(this.multiple()) {\n const values = event.value as T[];\n this.selectionChange.emit(values);\n } else {\n const value = event.value as T;\n this.selectionChange.emit(value);\n }\n }\n\n onClearInputClick(): void {\n const searchInputRef = this.searchInput();\n if (searchInputRef) {\n searchInputRef.nativeElement.value = '';\n searchInputRef.nativeElement.focus();\n }\n }\n}\n","\n<mat-form-field [appearance]=\"appearance()\" [className]=\"class()\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select \n #matSelect\n [formControl]=\"control()\"\n (selectionChange)=\"onSelectionChange($event)\"\n [multiple]=\"multiple()\"\n [placeholder]=\"placeholder()\"\n (openedChange)=\"onOpenedChange($event)\"\n >\n @if(!isLoading()) {\n <div class=\"searchFilter\">\n <mat-icon class=\"searchIcon\">search</mat-icon>\n <input \n matInput\n #searchInput \n type=\"text\"\n (keydown)=\"$event.stopPropagation()\"\n />\n <button matIconButton (click)=\"onClearInputClick(); searchInput.value = ''\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n @for(option of options(); track option[basicSelectConfig().valueKey]) {\n <mat-option \n [value]=\"option[basicSelectConfig().valueKey]\" \n [disabled]=\"basicSelectConfig().disabled ? basicSelectConfig().disabled?.(option) : false\"\n [style]=\"{ display: includeInFilter(option, searchInput.value) ? 'flex' : 'none' }\"\n > \n {{ basicSelectConfig().displayedLabel(option) }}\n </mat-option>\n }\n }\n </mat-select>\n @if(isLoading()) {\n <mat-icon matSuffix><mat-spinner diameter=\"20\" /></mat-icon>\n } @else if(clearable() && (multiple() ? control().value?.length : control().value)) {\n <mat-icon matSuffix (click)=\"onClearClick(); $event.stopPropagation()\">close</mat-icon>\n }\n <mat-error>{{ error() }}</mat-error>\n</mat-form-field>","import { TemplateRef, Type } from \"@angular/core\";\r\n\r\nexport enum DialogBodyType {\r\n TEXT = 'text',\r\n HTML = 'html',\r\n COMPONENT = 'component',\r\n TEMPLATE = 'template'\r\n}\r\n\r\nexport interface DialogBodyConfig<T = any> {\r\n type: DialogBodyType;\r\n content: string | Type<T> | TemplateRef<any>;\r\n data?: T;\r\n}\r\n\r\nexport interface DialogConfig<T = any> {\r\n title: string;\r\n icon?: string;\r\n iconColor?: string;\r\n subtitle?: string;\r\n body: DialogBodyConfig<T>;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n cancelText?: string;\r\n confirmText?: string;\r\n}","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[ngxDynamicHost]'\r\n})\r\nexport class DynamicHostDirective<T> {\r\n private _vcr = inject(ViewContainerRef);\r\n private _currentRef: ComponentRef<any> | null = null;\r\n\r\n component = input<Type<any>>();\r\n data = input<T>();\r\n\r\n constructor() {\r\n effect(() => {\r\n const componentType = this.component();\r\n \r\n // 1. Gestión de la creación/destrucción del componente\r\n if (!componentType) {\r\n this._vcr.clear();\r\n this._currentRef = null;\r\n return;\r\n }\r\n\r\n // Si el componente es diferente al que tenemos, lo recreamos\r\n if (this._currentRef?.componentType !== componentType) {\r\n this._vcr.clear();\r\n this._currentRef = this._vcr.createComponent(componentType);\r\n }\r\n \r\n // 2. Actualización de datos (siempre, tanto si es nuevo como si ya existía)\r\n const data = this.data();\r\n if (this._currentRef && data !== undefined) {\r\n // La forma correcta de setear un input en Angular moderno\r\n this._currentRef.setInput('data', data); \r\n }\r\n });\r\n }\r\n}","import { Component, inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { DialogBodyType, DialogConfig } from '../../models/dialog-config';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DynamicHostDirective } from '../../directives';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\n\r\n@Component({\r\n selector: 'ngx-dialog',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDividerModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n CommonModule,\r\n DynamicHostDirective \r\n ],\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrl: './ngx-dialog.component.scss',\r\n})\r\nexport class NgxDialog<T = any> { \r\n //dependencies injection\r\n private _dialogRef = inject(MatDialogRef<NgxDialog>);\r\n private _data = inject<DialogConfig<T>>(MAT_DIALOG_DATA);\r\n\r\n readonly title = this._data.title;\r\n readonly icon = this._data.icon;\r\n readonly iconColor = this._data.iconColor;\r\n readonly subtitle = this._data.subtitle;\r\n readonly body = this._data.body;\r\n readonly showCancel = this._data.showCancel ?? true;\r\n readonly showConfirm = this._data.showConfirm ?? true;\r\n readonly cancelText = this._data.cancelText ?? 'Cancelar';\r\n readonly confirmText = this._data.confirmText ?? 'Aceptar';\r\n\r\n DialogBodyType = DialogBodyType;\r\n\r\n onCancelClick(): void {\r\n this._dialogRef.close(false);\r\n }\r\n\r\n onConfirmClick(): void {\r\n this._dialogRef.close(true);\r\n }\r\n}\r\n","<h2 mat-dialog-title class=\"title\">\r\n {{ title }}\r\n @if(icon) {\r\n <mat-icon \r\n [style.color]=\"iconColor\"\r\n class=\"icon\"\r\n >\r\n {{ icon }}\r\n </mat-icon>\r\n }\r\n</h2>\r\n<mat-dialog-content>\r\n @if(subtitle) {\r\n <p class=\"subtitle\">{{ subtitle }}</p>\r\n <mat-divider />\r\n }\r\n\r\n <div class=\"content\">\r\n @switch (body.type) {\r\n @case (DialogBodyType.TEXT) {\r\n <p>{{ body.content }}</p>\r\n }\r\n @case (DialogBodyType.HTML) {\r\n <div [innerHTML]=\"body.content\"></div>\r\n }\r\n @case (DialogBodyType.COMPONENT) {\r\n <ng-container \r\n ngxDynamicHost \r\n [component]=\"$any(body.content)\"\r\n [data]=\"body.data\"\r\n />\r\n }\r\n @case (DialogBodyType.TEMPLATE) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"$any(body.content)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: body.data }\"\r\n />\r\n }\r\n }\r\n </div>\r\n\r\n</mat-dialog-content>\r\n<mat-dialog-actions align=\"end\" class=\"matDialogActionsCustomGap\">\r\n @if(showCancel) {\r\n <button matButton=\"outlined\" (click)=\"onCancelClick()\">\r\n {{ cancelText }}\r\n </button>\r\n }\r\n @if(showConfirm) {\r\n <button matButton=\"filled\" (click)=\"onConfirmClick()\">\r\n {{ confirmText }}\r\n </button>\r\n }\r\n</mat-dialog-actions>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTablesIntl {\r\n /**\r\n * Stream que emite cuando las etiquetas cambian.\r\n * Los componentes deben reaccionar a estos cambios.\r\n */\r\n readonly changes = new Subject<void>();\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-TABLE ===\r\n // ========================================\r\n\r\n // === Botones de acciones ===\r\n /** Etiqueta del botón de crear/nuevo */\r\n createButtonLabel: string = 'Nuevo';\r\n\r\n /** Tooltip del botón de editar */\r\n editTooltip: string = 'Editar';\r\n\r\n /** Tooltip del botón de eliminar */\r\n deleteTooltip: string = 'Eliminar';\r\n\r\n /** Etiqueta del botón de confirmar eliminación */\r\n confirmDeleteLabel: string = 'Eliminar';\r\n\r\n // === Búsqueda y filtros ===\r\n /** Placeholder del campo de búsqueda */\r\n searchPlaceholder: string = 'Buscar...';\r\n\r\n /** Tooltip del botón de limpiar búsqueda */\r\n clearSearchTooltip: string = 'Limpiar búsqueda';\r\n\r\n /** Tooltip del botón de editar columnas */\r\n editColumnsTooltip: string = 'Visualizar y ordenar columnas';\r\n\r\n /** Etiqueta para filtros avanzados */\r\n advancedFiltersLabel: string = 'Filtros avanzados';\r\n\r\n /** Etiqueta para nuevo filtro avanzado */\r\n newAdvancedFilterLabel: string = 'Nuevo filtro';\r\n\r\n /** Tooltip del botón de editar filtro avanzado - usa función getEditAdvancedFilterTooltip() */\r\n editAdvancedFilterTooltip: string = 'Editar filtro';\r\n\r\n /** Tooltip del botón de eliminar filtro avanzado - usa función getDeleteAdvancedFilterTooltip() */\r\n deleteAdvancedFilterTooltip: string = 'Eliminar filtro';\r\n\r\n /** Tooltip del botón de quitar filtro avanzado aplicado */\r\n removeAdvancedFilterTooltip: string = 'Quitar filtros avanzados';\r\n\r\n /** Texto cuando no hay filtros avanzados */\r\n noAdvancedFiltersLabel: string = 'No hay filtros guardados';\r\n\r\n /** Etiqueta para quitar filtro en select */\r\n removeFilterLabel: string = '-- Quitar filtro --';\r\n\r\n // === Selección de filas ===\r\n /** Tooltip del checkbox de seleccionar todas las filas */\r\n selectAllTooltip: string = 'Seleccionar todo';\r\n\r\n /** Tooltip del checkbox de deseleccionar todas las filas */\r\n deselectAllTooltip: string = 'Deseleccionar todo';\r\n\r\n /** Etiqueta del botón de deseleccionar todos */\r\n deselectAllLabel: string = 'Desmarcar todos los registros';\r\n\r\n /** Tooltip del menú de acciones de selección */\r\n selectionActionsTooltip: string = 'Operaciones sobre los registros seleccionados';\r\n\r\n // === Exportación ===\r\n /** Tooltip del botón de exportar */\r\n exportTooltip: string = 'Exportar datos';\r\n\r\n /** Etiqueta para exportar a Excel */\r\n exportToExcelLabel: string = 'Exportar a XLSX la página actual';\r\n\r\n /** Etiqueta para exportar a PDF */\r\n exportToPdfLabel: string = 'Exportar a PDF la página actual';\r\n\r\n // === Pantalla completa ===\r\n /** Tooltip para entrar en pantalla completa */\r\n enterFullscreenTooltip: string = 'Pantalla completa';\r\n\r\n /** Tooltip para salir de pantalla completa */\r\n exitFullscreenTooltip: string = 'Salir del modo de pantalla completa';\r\n\r\n // === Mensajes ===\r\n /** Mensaje cuando no hay datos */\r\n noDataMessage: string = 'No se han encontrado resultados...';\r\n\r\n /** Mensaje mientras se cargan los datos */\r\n loadingMessage: string = 'Cargando...';\r\n\r\n /** Título del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmTitle: string = 'Eliminar';\r\n\r\n /** Cuerpo del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmBody: string = 'Vas a eliminar el registro seleccionado. ¿Estas seguro?';\r\n\r\n /** Título del diálogo de eliminación de filtro avanzado */\r\n deleteAdvancedFilterTitle: string = 'Eliminar plantilla de filtro avanzado';\r\n\r\n // === Columnas ===\r\n /** Etiqueta para la columna de acciones */\r\n actionsLabel: string = 'Acciones';\r\n\r\n // === Filtros de columna ===\r\n /** Placeholder para filtros de fecha */\r\n datePlaceholder: string = 'Fecha';\r\n\r\n /** Placeholder para filtro de rango de fechas - inicio */\r\n dateRangeStartPlaceholder: string = 'Desde';\r\n\r\n /** Placeholder para filtro de rango de fechas - fin */\r\n dateRangeEndPlaceholder: string = 'Hasta';\r\n\r\n // === Filas expandibles ===\r\n /** Tooltip para expandir detalles */\r\n expandDetailsTooltip: string = 'Ver detalles';\r\n\r\n /** Tooltip para contraer detalles */\r\n collapseDetailsTooltip: string = 'Ocultar detalles';\r\n\r\n // === Totales en pie de tabla ===\r\n /** Etiqueta para total por página */\r\n totalPerPageLabel: string = 'Total parcial (por página)';\r\n\r\n /** Etiqueta para total general */\r\n totalGeneralLabel: string = 'Total (todos los registros)';\r\n\r\n // === Diálogos ===\r\n /** Botón de cancelar en diálogos */\r\n cancelButtonLabel: string = 'Cancelar';\r\n\r\n /** Botón de confirmar en diálogos */\r\n confirmButtonLabel: string = 'Confirmar';\r\n\r\n /** Botón de cerrar en diálogos */\r\n closeButtonLabel: string = 'Cerrar';\r\n\r\n /** Botón de guardar en diálogos */\r\n saveButtonLabel: string = 'Guardar';\r\n\r\n /** Botón de guardar y aplicar en diálogos */\r\n saveAndApplyButtonLabel: string = 'Guardar y aplicar';\r\n\r\n // === Diálogo de configurar columnas ===\r\n /** Título del diálogo de configurar columnas */\r\n configureColumnsTitle: string = 'Ordenar y visualizar columnas de la tabla';\r\n\r\n /** Tooltip para anclar columna */\r\n pinColumnTooltip: string = 'Anclar columna';\r\n\r\n /** Tooltip para desanclar columna */\r\n unpinColumnTooltip: string = 'Desanclar';\r\n\r\n /** Tooltip para subir columna */\r\n moveUpTooltip: string = 'Subir';\r\n\r\n /** Tooltip para bajar columna */\r\n moveDownTooltip: string = 'Bajar';\r\n\r\n /** Texto para columnas con filtros aplicados */\r\n hasFiltersAppliedText: string = '(hay filtros aplicados)';\r\n\r\n /** Nota sobre ocultar columnas con filtros */\r\n hideColumnWithFiltersNote: string = 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados';\r\n\r\n /** Etiqueta de nota */\r\n noteLabel: string = 'Nota:';\r\n\r\n /** Botón de restablecer configuración de columnas */\r\n resetColumnsButtonLabel: string = 'Reestablecer orden y visualización';\r\n\r\n // === Diálogo de filtros avanzados ===\r\n /** Título del diálogo de filtros avanzados */\r\n advancedFiltersDialogTitle: string = 'Filtros avanzados para la tabla';\r\n\r\n /** Label del campo de nombre de plantilla */\r\n templateNameLabel: string = 'Nombre de la plantilla';\r\n\r\n /** Error de nombre obligatorio */\r\n templateNameRequiredError: string = 'El nombre es obligatorio';\r\n\r\n /** Título de ayuda de filtros avanzados */\r\n advancedFiltersHelpTitle: string = 'Uso de filtros avanzados';\r\n\r\n /** Texto de ayuda sobre grupos */\r\n advancedFiltersGroupHelp: string = 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos';\r\n\r\n /** Texto de ayuda sobre filtros */\r\n advancedFiltersRuleHelp: string = 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)';\r\n\r\n /** Label de grupo en ayuda */\r\n groupLabel: string = 'Grupo:';\r\n\r\n /** Label de filtro en ayuda */\r\n filterLabel: string = 'Filtro:';\r\n\r\n /** Botón añadir filtro */\r\n addFilterButtonLabel: string = 'Añadir filtro';\r\n\r\n /** Botón añadir grupo */\r\n addGroupButtonLabel: string = 'Añadir grupo';\r\n\r\n /** Tooltip eliminar grupo */\r\n deleteGroupTooltip: string = 'Eliminar grupo';\r\n\r\n /** Tooltip eliminar filtro */\r\n deleteFilterTooltip: string = 'Eliminar filtro';\r\n\r\n // === Reglas de filtros avanzados ===\r\n /** Label de campo */\r\n fieldLabel: string = 'Campo';\r\n\r\n /** Label de condición */\r\n conditionLabel: string = 'Condición';\r\n\r\n /** Label de valor */\r\n valueLabel: string = 'Valor';\r\n\r\n /** Placeholder de seleccionar opción */\r\n selectOptionPlaceholder: string = 'Selecciona una opción';\r\n\r\n /** Opción para quitar campo */\r\n removeFieldOption: string = '-- Quitar campo --';\r\n\r\n /** Opción para quitar condición */\r\n removeConditionOption: string = '-- Quitar condición --';\r\n\r\n /** Opción para quitar valor */\r\n removeValueOption: string = '-- Quitar valor --';\r\n\r\n /** Error de campo obligatorio */\r\n requiredFieldError: string = 'Obligatorio';\r\n\r\n // === Conectores y operadores de filtros ===\r\n /** Conector AND */\r\n connectorAnd: string = 'Y';\r\n\r\n /** Conector OR */\r\n connectorOr: string = 'O';\r\n\r\n /** Operador igual a */\r\n operatorEquals: string = 'Igual a';\r\n\r\n /** Operador distinto de */\r\n operatorNotEquals: string = 'Distinto de';\r\n\r\n /** Operador mayor que */\r\n operatorGreaterThan: string = 'Mayor que';\r\n\r\n /** Operador mayor o igual que */\r\n operatorGreaterOrEquals: string = 'Mayor o igual que';\r\n\r\n /** Operador menor que */\r\n operatorLessThan: string = 'Menor que';\r\n\r\n /** Operador menor o igual que */\r\n operatorLessOrEquals: string = 'Menor o igual que';\r\n\r\n /** Operador contiene */\r\n operatorLike: string = 'Contiene';\r\n\r\n // ========================================\r\n // === NGX-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Mensaje cuando no hay resultados en select */\r\n noResultsMessage: string = 'No se han encontrado resultados...';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Etiqueta del botón de ver más resultados */\r\n showMoreLabel: string = 'Ver más';\r\n\r\n // ========================================\r\n // === FUNCIONES AUXILIARES ===\r\n // ========================================\r\n\r\n /**\r\n * Función para obtener el mensaje de confirmación de eliminación\r\n * @param itemName Nombre del elemento a eliminar (opcional)\r\n */\r\n getDeleteConfirmMessage(itemName?: string): string {\r\n if (itemName) {\r\n return `Vas a eliminar '${itemName}'. ¿Estas seguro?`;\r\n }\r\n return this.deleteConfirmBody;\r\n }\r\n\r\n /**\r\n * Función para obtener el mensaje de eliminación de filtro avanzado\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterMessage(filterName: string): string {\r\n return `Vas a eliminar la plantilla de filtro avanzado '${filterName}'. ¿Estas seguro?`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de editar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getEditAdvancedFilterTooltip(filterName: string): string {\r\n return `Editar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de eliminar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterTooltip(filterName: string): string {\r\n return `Eliminar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el label de elementos seleccionados\r\n * @param count Número de elementos seleccionados\r\n */\r\n getSelectedItemsLabel(count: number): string {\r\n return count === 1\r\n ? `${count} elemento seleccionado`\r\n : `${count} elementos seleccionados`;\r\n }\r\n\r\n /**\r\n * Función para obtener el texto de quitar selección en selects\r\n * @param optionName Nombre de la opción (opcional)\r\n */\r\n getRemoveOptionText(optionName: string): string {\r\n return `-- Quitar ${optionName} --`;\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-confirm-dialog',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-confirm-dialog.component.html',\r\n styleUrl: './ngx-confirm-dialog.component.scss'\r\n})\r\nexport class NgxConfirmDialogComponent {\r\n dialogRef = inject(MatDialogRef<NgxConfirmDialogComponent>);\r\n data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\r\n intl = inject(NgxTablesIntl);\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content>\r\n @if(data.body) {\r\n <p>{{data.body}}</p>\r\n }\r\n \r\n @if (data.template) {\r\n <ng-container *ngTemplateOutlet=\"data.template; context: { $implicit: data.row }\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"false\">{{ data.denyButtonLabel ?? intl.cancelButtonLabel }}</button>\r\n <button matButton [mat-dialog-close]=\"true\">{{ data.confirmButtonLabel ?? intl.confirmButtonLabel }}</button>\r\n</mat-dialog-actions>","import { Directive, effect, inject, input, signal, Type, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxDynamicCellHost]',\r\n})\r\nexport class DynamicCellHostDirective<T> {\r\n vcr = inject(ViewContainerRef);\r\n\r\n component = input<Type<any>>();\r\n row = input<T>();\r\n key = input<keyof T>();\r\n\r\n effect = effect(() => {\r\n const component = this.component();\r\n const row = this.row();\r\n const key = this.key();\r\n\r\n if (component) {\r\n const compRef = this.vcr.createComponent(component);\r\n\r\n if (row && key) {\r\n compRef.instance.row = signal(row);\r\n compRef.instance.key = signal(key);\r\n }\r\n }\r\n });\r\n}\r\n","import { Pipe, type PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngxOnlyUpperFirstCharacter',\r\n})\r\nexport class OnlyUpperFirstCharacterPipe implements PipeTransform {\r\n\r\n transform(value: string): string {\r\n if (!value)\r\n return '';\r\n\r\n value = value.toLowerCase();\r\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\r\n }\r\n\r\n}\r\n","import { PipeTransform, TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\nimport jsPDF from \"jspdf\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PaginatedFilter } from \"./paginated-filter\";\r\nimport { PaginatedItems } from \"./paginated-items\";\r\n\r\nexport type FilterType = 'number' | 'text' | 'option' | 'option-multiple' | 'date' | 'date-range';\r\n\r\n//IMPORTANTE Si se añade aqui un color, hay que añadirlo tambien en paginated-table.component.scss\r\nexport type RowActionIconColor = 'Yellow' | 'Orange' | 'Pink' | 'Purple' | 'Green' | 'Blue' | 'Sky' | 'Brown';\r\n\r\nexport interface PaginatedTableConfig<T> {\r\n tableId: string;\r\n primaryKey: keyof T | Array<keyof T>;\r\n title: () => string;\r\n columns: PaginatedTableColumn<T>[];\r\n showQueryFilter?: boolean; //Filtro query para toda la tabla\r\n queryFilterPlaceholder?: string; //Placeholder del filtro query para toda la tabla\r\n create?: TableBasicAction<T>;\r\n update?: TableBasicAction<T>;\r\n clickOnRowForUpdate?: boolean; //Si esto se pone a true (desaparece el icono de acciones de update y toda la columna es el update) => Si expandableDetail true, esto se cancela y el editar se pone en acciones\r\n delete?: TableBasicAction<T>;\r\n deleteConfirm?: DeleteConfirm<T>;\r\n rowActions?: TableRowAction<T>[];\r\n showAdvancedFilters?: boolean;\r\n expandableDetail?: boolean;\r\n expandableDetailTemplateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n enableRowSelection?: boolean;\r\n rowSelectionAction?: RowSelectionAction<T>[]; //Para poner botones que actuen frente a una seleccion multiple,\r\n exportFileName?: () => string;\r\n mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;\r\n pdfConfig?: jsPDF;\r\n maxHeight?: string;\r\n defaultStickyColumn?: keyof T;\r\n showActions?: () => boolean; //Para mostrar o no la columna de acciones, en caso de que se tengan acciones de fila o clickOnRowForUpdate, esta propiedad se pondrá a true automaticamente, pero si no se quieren mostrar las acciones, se puede poner a false esta propiedad. En caso de que clickOnRowForUpdate sea true y expandableDetail sea true, entonces clickOnRowForUpdate se cancelará y las acciones de editar se pondrán en acciones de fila, por lo que en ese caso, showActions se pondrá a true automaticamente. Si se quieren ocultar las acciones en ese caso, habrá que poner showActions a false.\r\n}\r\n\r\n/*\r\n PRIORIDAD DE CREACION DE LA VISTA \r\n 1 => componente\r\n 2 => template\r\n 3 => valueGetter\r\n 4 => valor de la columna por defecto aplicando pipes (en caso de que se especifiquen)\r\n*/\r\nexport interface PaginatedTableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n isSortable?: boolean; //Los datos de la columna se pueden ordenar\r\n filterType?: FilterType; //Los datos de la columna se pueden filtrar\r\n filterOptions?: FilterOption[]; //En caso de filterType = option o filterType = option-multiple entonces, se pintara un select y habra que mandar las opciones\r\n endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;\r\n filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;\r\n component?: Type<any>; //Para crear la vista desde un component\r\n templateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n valueGetter?: (row: T) => string;\r\n pipes?: ColumnPipe | ColumnPipe[];\r\n showTotalPerPage?: boolean;\r\n showTotalGeneral?: boolean;\r\n getTotalGeneral?: () => number;\r\n totalFooterFormatter?: (total: number) => string;\r\n style?: string;\r\n footerStyle?: string;\r\n}\r\n\r\nexport interface TableBasicAction<T> {\r\n show?: (row?: T) => boolean;\r\n disabled?: (row?: T) => boolean;\r\n tooltip?: (row?: T) => string;\r\n}\r\n\r\nexport interface TableRowAction<T> {\r\n id: string;\r\n show?: (row: T) => boolean;\r\n disabled?: (row: T) => boolean;\r\n icon: string;\r\n iconColor?: RowActionIconColor;\r\n tooltip: (row: T) => string;\r\n}\r\n\r\nexport interface FilterOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport function isFilterOption(obj: unknown): obj is FilterOption {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'value' in obj &&\r\n 'label' in obj &&\r\n typeof (obj as any).value === 'string' &&\r\n typeof (obj as any).label === 'string'\r\n );\r\n}\r\n\r\nexport interface ColumnPipe {\r\n pipe: PipeTransform;\r\n args?: any[];\r\n}\r\n\r\nexport interface DeleteConfirm<T> {\r\n title: (row: T) => string;\r\n body?: (row: T) => string;\r\n templateRef?: () => TemplateRef<{ $implicit: T }>;\r\n}\r\n\r\nexport interface RowSelectionAction<T> {\r\n id: string;\r\n icon: string;\r\n label: (row: T[], totalSelected: number) => string;\r\n}","import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ColumnValue } from \"./column-value\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isFilterOption, PaginatedTableColumn } from \"./paginated-table-config\";\r\nimport { DynamicFilter } from \"./dynamic-filter\";\r\nimport { AdvancedFilter, FilterGroup, FilterRule, FilterConnector, FilterOperator } from \"./advanced-filter\";\r\nimport { NgxTablesIntl } from \"../i18n\";\r\n\r\nexport class AdvancedFilterUtils {\r\n static createAdvancedFilter = <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>): FormGroup => {\r\n return fb.group({\r\n name: [advancedFilter.name, Validators.required],\r\n groups: fb.array(advancedFilter.groups.map(g => this.createFilterGroup(fb, g)))\r\n });\r\n }\r\n\r\n static createFilterGroup = <T>(fb: FormBuilder, group: FilterGroup<T>): FormGroup => {\r\n return fb.group({\r\n id: [group.id ?? uuidv4()],\r\n connector: [group.connector, Validators.required],\r\n filters: fb.array(group.filters.map(f => {\r\n return this.isFilterGroup<T>(f)\r\n ? this.createFilterGroup(fb, f)\r\n : this.createFilterRule(fb, f);\r\n }), [Validators.required])\r\n });\r\n }\r\n\r\n static createFilterRule = <T>(fb: FormBuilder, rule: FilterRule<T>): FormGroup => {\r\n return fb.group({\r\n id: [rule.id ?? uuidv4()],\r\n key: [rule.key ?? null, Validators.required],\r\n operator: [rule.operator ?? null, Validators.required],\r\n value: [rule.value ?? null, Validators.required]\r\n });\r\n }\r\n\r\n static isFilterGroup = <T>(obj: any): obj is FilterGroup<T> => {\r\n return obj &&\r\n typeof obj === 'object' &&\r\n 'connector' in obj &&\r\n 'filters' in obj;\r\n }\r\n\r\n private static isFilterRule<T>(obj: any): obj is FilterRule<T> {\r\n return obj && typeof obj === 'object' && 'key' in obj;\r\n }\r\n\r\n static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>) {\r\n const groupFound = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (groupFound) {\r\n const filters = groupFound.get('filters') as FormArray;\r\n const formGroup = this.createFilterGroup(fb, group);\r\n filters.push(formGroup);\r\n }\r\n }\r\n\r\n static deleteGroup<T>(form: FormGroup, groupId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, groupId);\r\n }\r\n\r\n static addRuleToGroup = <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => {\r\n const group = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (group) {\r\n const filters = group.get('filters') as FormArray;\r\n const formRule = this.createFilterRule(fb, rule);\r\n filters.push(formRule);\r\n }\r\n }\r\n\r\n static deleteRule<T>(form: FormGroup, ruleId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, ruleId);\r\n }\r\n\r\n private static deleteByIdRecursive(array: FormArray, id: string): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n const control = array.at(i) as FormGroup;\r\n\r\n // Si el id coincide, eliminar directamente (da igual si es rule o group)\r\n if (control.get('id')?.value === id) {\r\n array.removeAt(i);\r\n return true;\r\n }\r\n\r\n // Si es un grupo, seguir buscando dentro de sus filtros\r\n const filters = control.get('filters');\r\n if (filters instanceof FormArray) {\r\n const deleted = this.deleteByIdRecursive(filters, id);\r\n if (deleted) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n static findGroupFormById(array: FormArray, id: string): FormGroup | null {\r\n for (const control of array.controls) {\r\n const group = control as FormGroup;\r\n if (group.get('id')?.value === id)\r\n return group;\r\n\r\n const filters = group.get('filters') as FormArray;\r\n if (filters) {\r\n const found = this.findGroupFormById(filters, id);\r\n if (found)\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isFilterGroupForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('connector') &&\r\n group.contains('filters')\r\n );\r\n }\r\n\r\n /*static isFilterRuleForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('key') &&\r\n group.contains('operator') &&\r\n group.contains('value') &&\r\n !group.contains('filters')\r\n );\r\n }*/\r\n\r\n static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T> {\r\n return {\r\n name: form.get('name')?.value,\r\n groups: (form.get('groups') as FormArray).controls\r\n .map(g => this.mapFormGroupToFilterGroup<T>(g as FormGroup))\r\n .filter(g => this.isNonEmptyGroup(g))\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterGroup<T>(groupForm: FormGroup): FilterGroup<T> {\r\n const id = groupForm.get('id')?.value as string;\r\n const connector = groupForm.get('connector')?.value as FilterConnector;\r\n const filtersArray = groupForm.get('filters') as FormArray;\r\n\r\n const filters = filtersArray.controls\r\n .map(control => {\r\n const value = control.value;\r\n if ('filters' in value)\r\n return this.mapFormGroupToFilterGroup<T>(control as FormGroup);\r\n else\r\n return this.mapFormGroupToFilterRule<T>(control as FormGroup);\r\n })\r\n .filter(f => this.isNonEmptyFilter(f));\r\n\r\n return {\r\n id: id,\r\n connector: connector,\r\n filters: filters\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterRule<T>(ruleForm: FormGroup): FilterRule<T> {\r\n return {\r\n id: ruleForm.get('id')?.value,\r\n key: ruleForm.get('key')?.value,\r\n operator: ruleForm.get('operator')?.value,\r\n value: ruleForm.get('value')?.value\r\n };\r\n }\r\n\r\n private static isNonEmptyFilter<T>(filter: FilterRule<T> | FilterGroup<T>): boolean {\r\n if (this.isFilterGroup(filter))\r\n return this.isNonEmptyGroup(filter);\r\n\r\n return this.isNonEmptyRule(filter);\r\n }\r\n\r\n private static isNonEmptyGroup<T>(group: FilterGroup<T>): boolean {\r\n return Array.isArray(group.filters) && group.filters.some(f => this.isNonEmptyFilter(f));\r\n }\r\n\r\n private static isNonEmptyRule<T>(rule: FilterRule<T>): boolean {\r\n return !!(rule.key && rule.operator && rule.value !== undefined && rule.value !== null && rule.value !== '');\r\n }\r\n\r\n static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string {\r\n return this.groupToHtml(groups[0], columns, intl);\r\n //return groups.map(g => this.groupToString(g)).join(' OR ');\r\n }\r\n\r\n private static groupToHtml<T>(group: FilterGroup<T>, columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string {\r\n const connectorLabel = group.connector === 'AND' ? intl.connectorAnd : intl.connectorOr;\r\n const connector = ` <strong>${connectorLabel}</strong> `;\r\n\r\n const parts = group.filters.map(filter => {\r\n if (this.isFilterGroup<T>(filter))\r\n return `<strong>[ </strong>${this.groupToHtml(filter, columns, intl)}<strong> ]</strong>`;\r\n else\r\n return this.ruleToHtml(filter, columns, intl);\r\n });\r\n\r\n return parts.join(connector);\r\n }\r\n\r\n private static ruleToHtml<T>(rule: FilterRule<T>, columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string {\r\n const column = columns.find(column => column.key == rule.key);\r\n\r\n if (!column)\r\n return \"\";\r\n\r\n const key = `<i>${column.label}</i>`;\r\n const operator = rule.operator ? this.getOperatorLabel(rule.operator, intl).toLowerCase() : '';\r\n //const operator = rule.operator ?? '';\r\n const value = this.valueToHtml(rule.value, column);\r\n return `${key} ${operator} \"${value}\"`;\r\n }\r\n\r\n private static getOperatorLabel(operator: FilterOperator, intl: NgxTablesIntl): string {\r\n const operatorLabels: Record<FilterOperator, string> = {\r\n '=': intl.operatorEquals,\r\n '<>': intl.operatorNotEquals,\r\n '>': intl.operatorGreaterThan,\r\n '>=': intl.operatorGreaterOrEquals,\r\n '<': intl.operatorLessThan,\r\n '<=': intl.operatorLessOrEquals,\r\n 'LIKE': intl.operatorLike\r\n };\r\n return operatorLabels[operator];\r\n }\r\n\r\n private static valueToHtml<T>(value: ColumnValue, column: PaginatedTableColumn<T>): string {\r\n switch (column.filterType) {\r\n case 'option':\r\n case 'option-multiple':\r\n if (isFilterOption(value))\r\n return value.label;\r\n\r\n const optionSelected = column.filterOptions?.find(option => option.value == value);\r\n return optionSelected?.label ?? '';\r\n case 'date':\r\n case 'date-range':\r\n const pipe = new DatePipe('es-ES');\r\n return pipe.transform(value as string, 'dd/MM/yyyy') ?? '';\r\n }\r\n\r\n return value as string;\r\n }\r\n\r\n static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[] {\r\n const result: DynamicFilter<T>[] = [];\r\n\r\n for (const group of advancedFilter.groups) {\r\n result.push(...this.mapGroupToDynamicFilters(group));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static mapGroupToDynamicFilters<T>(group: FilterGroup<T>): DynamicFilter<T>[] {\r\n const filters: DynamicFilter<T>[] = [];\r\n\r\n for (const f of group.filters) {\r\n if (this.isFilterGroup<T>(f)) {\r\n filters.push(...this.mapGroupToDynamicFilters(f));\r\n } else if (this.isFilterRule<T>(f) && f.key && f.operator && f.value !== undefined && f.value !== null) {\r\n filters.push({\r\n campo: f.key,\r\n operador: f.operator,\r\n valor: f.value?.toString(),\r\n conector: group.connector,\r\n grupo: group.id ?? 'root'\r\n });\r\n }\r\n }\r\n\r\n return filters;\r\n }\r\n\r\n\r\n static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T> {\r\n return {\r\n ...filter,\r\n groups: filter.groups.map(group => this.normalizeGroupForBackend(group))\r\n };\r\n }\r\n\r\n private static normalizeGroupForBackend<T>(group: FilterGroup<T>): FilterGroup<T> {\r\n return {\r\n ...group,\r\n filters: group.filters.map(f => {\r\n if (this.isFilterGroup(f)) {\r\n return this.normalizeGroupForBackend(f);\r\n }\r\n\r\n return this.normalizeRuleForBackend(f);\r\n })\r\n };\r\n }\r\n\r\n private static normalizeRuleForBackend<T>(rule: FilterRule<T>): FilterRule<T> {\r\n if (isFilterOption(rule.value)) {\r\n return {\r\n ...rule,\r\n value: rule.value.value\r\n };\r\n }\r\n\r\n return rule;\r\n }\r\n}\r\n","import { InjectionToken, Signal } from \"@angular/core\";\r\n\r\nexport const USER_ID_FACTORY = new InjectionToken<Signal<string | null | undefined>>('USER_ID_FACTORY');","import { FilterOption, FilterType } from \"./paginated-table-config\";\r\nimport { ColumnValue } from \"../models/column-value\";\r\n\r\nexport type FilterConnector = 'AND' | 'OR';\r\n\r\nexport type FilterOperator = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'LIKE';\r\n\r\nexport interface AdvancedFilter<T> {\r\n name: string;\r\n groups: FilterGroup<T>[];\r\n}\r\n\r\nexport interface FilterGroup<T> {\r\n id?: string;\r\n connector: FilterConnector;\r\n filters: (FilterRule<T> | FilterGroup<T>)[];\r\n}\r\n\r\nexport interface FilterRule<T> {\r\n id?: string;\r\n key?: keyof T;\r\n operator?: FilterOperator;\r\n value?: ColumnValue;\r\n}\r\n\r\nexport const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]> = {\r\n number: ['=', '<>', '>', '>=', '<', '<='],\r\n text: ['=', 'LIKE', '<>'],\r\n option: ['=', '<>'],\r\n 'option-multiple': ['=', '<>'], //Actuara como un option\r\n date: ['=', '<>', '>', '>=', '<', '<='],\r\n 'date-range': ['=', '<>', '>', '>=', '<', '<='] //Actuara como un date normal\r\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { USER_ID_FACTORY } from '../models';\r\nimport { AdvancedFilter } from '../models/advanced-filter';\r\nimport { AdvancedFilterUtils } from '../models/advanced-filter-utils';\r\nimport { DynamicFilter } from '../models/dynamic-filter';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdvancedFilterService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG = 'advanced_filter';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG}_${userId}`;\r\n });\r\n\r\n private _advancedFilters = signal<Record<string, AdvancedFilter<any>[]>>({});\r\n advancedFilters = this._advancedFilters.asReadonly();\r\n\r\n private setAdvancedFiltersEffect = effect(() => {\r\n this.setAdvancedFilter();\r\n });\r\n\r\n constructor() {\r\n this.setAdvancedFilter();\r\n }\r\n\r\n private setAdvancedFilter() {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const recordAdvancedFitler = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordAdvancedFitler) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const advancedFilters: Record<string, AdvancedFilter<any>[]> = JSON.parse(recordAdvancedFitler);\r\n\r\n this._advancedFilters.set(advancedFilters);\r\n }\r\n\r\n saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const index = currentArray.findIndex(f => f.groups[0].id === advancedFilter.groups[0].id);\r\n let newArray: AdvancedFilter<any>[];\r\n if (index >= 0) { //Si existe, lo reemplazamos\r\n newArray = [...currentArray];\r\n newArray[index] = advancedFilter;\r\n } else { // Si no existe, lo añadimos\r\n newArray = [...currentArray, advancedFilter];\r\n }\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const newArray = currentArray.filter(f => f.groups[0].id !== advancedFilter.groups[0].id);\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend: boolean = true): AdvancedFilter<any> | undefined {\r\n const allAdvancedFiltersByTable = this._advancedFilters()[tableId];\r\n\r\n if (!allAdvancedFiltersByTable)\r\n return undefined;\r\n\r\n const advancedFilter = allAdvancedFiltersByTable.find(advancedFilter => {\r\n return advancedFilter.groups?.[0].id !== undefined && advancedFilter.groups[0].id == advancedFilterId;\r\n });\r\n\r\n if (!normalizeForBackend)\r\n return advancedFilter;\r\n\r\n if (!advancedFilter)\r\n return undefined;\r\n\r\n return AdvancedFilterUtils.normalizeAdvancedFilterForBackend(advancedFilter);\r\n }\r\n\r\n getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[] {\r\n const advancedFilter = this.getAdvancedFilterById(tableId, advancedFilterId);\r\n\r\n if (!advancedFilter)\r\n return [];\r\n\r\n return AdvancedFilterUtils.mapToDynamicFilter(advancedFilter);\r\n }\r\n}\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { ColumnConfig } from '../models/configure-table-column-data';\r\nimport { USER_ID_FACTORY } from '../models';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColumnConfigService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG = 'column_config';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_COLUMN_CONFIG}_${userId}`;\r\n });\r\n\r\n private _columnConfigs = signal<Record<string, ColumnConfig<any>[]>>({});\r\n columnConfigs = this._columnConfigs.asReadonly();\r\n\r\n private setColumnConfigEffect = effect(() => {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const recordColumnConfig = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordColumnConfig) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const columnConfigs: Record<string, ColumnConfig<any>[]> = JSON.parse(recordColumnConfig);\r\n\r\n this._columnConfigs.set(columnConfigs);\r\n });\r\n\r\n saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue = {\r\n ...currentValue,\r\n [tableId]: columnConfig\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteColumnConfig(tableId: string): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue: Record<string, ColumnConfig<any>[]> = { ...currentValue };\r\n delete newValue[tableId];\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n","import { Injectable, Signal } from '@angular/core';\r\nimport { fromEvent, map, startWith } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { Pantalla } from '../models/pantalla';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatosPantallaService {\r\n\r\n pantalla: Signal<Pantalla | undefined> = toSignal(\r\n fromEvent(window, 'resize').pipe(\r\n startWith(this.obtenerDatosPantalla()),\r\n map(() => this.obtenerDatosPantalla())\r\n )\r\n );\r\n\r\n private obtenerDatosPantalla(): Pantalla {\r\n let pantalla: Pantalla = {\r\n tipo: 'escritorio',\r\n ancho: window.innerWidth,\r\n alto: window.innerHeight\r\n }\r\n\r\n if (pantalla.ancho < 600) {\r\n pantalla.tipo = 'movil';\r\n return pantalla;\r\n }\r\n\r\n if (pantalla.ancho < 950) {\r\n pantalla.tipo = 'tablet';\r\n return pantalla;\r\n }\r\n\r\n return pantalla;\r\n }\r\n\r\n}\r\n","import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { DateRange } from '@angular/material/datepicker';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport moment from 'moment';\r\nimport { ConfigureTableColumnData, ColumnConfig } from '../../../models/configure-table-column-data';\r\nimport { ColumnConfigService } from '../../../services/column-config.service';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\nimport { isFilterOption } from '../../../models';\r\n\r\n@Component({\r\n selector: 'lib-configure-table-columns',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatIconModule,\r\n MatSlideToggleModule,\r\n CdkDropList,\r\n CdkDrag,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './configure-table-columns.component.html',\r\n styleUrl: './configure-table-columns.component.scss',\r\n})\r\nexport class ConfigureTableColumnsComponent<T> {\r\n columnConfigService = inject(ColumnConfigService);\r\n dialogRef = inject(MatDialogRef<ConfigureTableColumnsComponent<T>>);\r\n data = inject<ConfigureTableColumnData<T>>(MAT_DIALOG_DATA);\r\n intl = inject(NgxTablesIntl);\r\n columns = signal(this.data.columns);\r\n isConfirmDisabled = computed(() => {\r\n const allDisabled = this.columns().every(column => !column.show);\r\n const someHasFilter = this.columns().some(column => this.hasFilterAndDisabled(column));\r\n return allDisabled || someHasFilter;\r\n });\r\n\r\n startAnimationTimeout?: number = undefined;\r\n endAnimationTimeout?: number = undefined;\r\n animationTime: number = 250;\r\n animationIndex = signal<number | undefined>(undefined);\r\n\r\n hasFilterAndDisabled(column: ColumnConfig<T>): boolean {\r\n const value = this.data.filtersValue[column.key];\r\n if (Array.isArray(value))\r\n return value.length > 0 && !column.show;\r\n\r\n if (typeof value === 'string')\r\n return value.length > 0 && !column.show;\r\n\r\n if (value instanceof DateRange)\r\n return (value.start != null || value.end != null) && !column.show;\r\n\r\n if (moment.isMoment(value))\r\n return !column.show;\r\n\r\n if (isFilterOption(value))\r\n return !column.show;\r\n\r\n return false;\r\n }\r\n\r\n onUpClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index > 0) {\r\n [cols[index - 1], cols[index]] = [cols[index], cols[index - 1]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDownClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index < cols.length - 1) {\r\n [cols[index], cols[index + 1]] = [cols[index + 1], cols[index]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<any, any, any>) {\r\n const cols = [...this.columns()];\r\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\r\n this.columns.set(cols);\r\n }\r\n\r\n onToggleChange(columnClicked: ColumnConfig<T>) {\r\n this.columns.update(value => {\r\n return value.map(column => {\r\n if (column.key == columnClicked.key)\r\n return { ...column, show: !column.show };\r\n else\r\n return column;\r\n });\r\n });\r\n }\r\n\r\n onPinClick(columnConfig: ColumnConfig<T>, index: number) {\r\n const columns = [...this.columns()];\r\n const currentSticky = columns.find(c => c.isSticky);\r\n\r\n if (columnConfig.key == currentSticky?.key) {\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: false\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n return;\r\n }\r\n\r\n clearTimeout(this.startAnimationTimeout);\r\n clearTimeout(this.endAnimationTimeout);\r\n this.animationIndex.set(undefined);\r\n\r\n this.animationIndex.set(index);\r\n\r\n this.startAnimationTimeout = setTimeout(() => {\r\n moveItemInArray(columns, index, 0);\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: c.key == columnConfig.key\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n this.animationIndex.set(0);\r\n this.endAnimationTimeout = setTimeout(() => this.animationIndex.set(undefined), this.animationTime)\r\n }, this.animationTime);\r\n }\r\n\r\n onConfirmClick() {\r\n this.columnConfigService.saveColumnConfig(this.data.tableId, this.columns());\r\n this.dialogRef.close();\r\n }\r\n\r\n onResetClick() {\r\n this.columnConfigService.deleteColumnConfig(this.data.tableId);\r\n this.dialogRef.close();\r\n }\r\n}\r\n","<h2 mat-dialog-title>{{intl.configureColumnsTitle}} {{data.tableName| lowercase}}</h2>\r\n<mat-dialog-content>\r\n\r\n <div class=\"columnsList\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n @for (column of columns(); track $index; let first = $first; let last = $last;) {\r\n <div \r\n class=\"columnContainer\" \r\n cdkDrag \r\n [class.pinned]=\"$index == animationIndex()\"\r\n [style]=\"{ transition: `background-color ${animationTime}ms ease` }\">\r\n\r\n <div class=\"labelContainer\">\r\n <mat-icon>drag_indicator</mat-icon>\r\n <p class=\"label\">\r\n {{data.columnsLabels[column.key] ?? ''}}\r\n @if(hasFilterAndDisabled(column)) {\r\n <span> {{intl.hasFiltersAppliedText}}</span>\r\n }\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button \r\n matIconButton\r\n [matTooltip]=\"column.isSticky ? intl.unpinColumnTooltip : intl.pinColumnTooltip\"\r\n (click)=\"onPinClick(column, $index)\">\r\n <mat-icon>{{column.isSticky ? 'keep_off' : 'keep'}}</mat-icon>\r\n </button>\r\n\r\n <button [matTooltip]=\"intl.moveUpTooltip\" matIconButton [disabled]=\"$first\" (click)=\"onUpClick($index)\"><mat-icon>keyboard_arrow_up</mat-icon></button>\r\n <button [matTooltip]=\"intl.moveDownTooltip\" matIconButton [disabled]=\"$last\" (click)=\"onDownClick($index)\"><mat-icon>keyboard_arrow_down</mat-icon></button>\r\n <mat-slide-toggle [checked]=\"column.show\" (toggleChange)=\"onToggleChange(column)\"></mat-slide-toggle>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p class=\"note\"><span>{{intl.noteLabel}}</span> {{intl.hideColumnWithFiltersNote}}</p>\r\n \r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{intl.closeButtonLabel}}</button>\r\n <button matButton (click)=\"onResetClick()\">{{intl.resetColumnsButtonLabel}}</button>\r\n <button matButton [disabled]=\"isConfirmDisabled()\" (click)=\"onConfirmClick()\">{{intl.confirmButtonLabel}}</button>\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, effect, ElementRef, inject, input, OnDestroy, Optional, output, signal, viewChild, WritableSignal } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule,\r\n MatProgressBarModule\r\n ],\r\n templateUrl: './ngx-paginated-searchable-select.component.html',\r\n styleUrl: './ngx-paginated-searchable-select.component.scss',\r\n})\r\nexport class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements OnDestroy {\r\n\r\n // Inyectar el servicio de internacionalización (opcional para permitir override)\r\n public readonly intl: NgxTablesIntl;\r\n\r\n control = input<FormControl | undefined>();\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n } as U\r\n )\r\n );\r\n optionLabel = input<((option: T) => string)>(\r\n (o: T) => {\r\n if (isFilterOption(o))\r\n return o.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n compareWith = input<(o1: T, o2: T) => boolean>(\r\n (o1: T, o2: T) => {\r\n if (!o2)\r\n return false;\r\n\r\n if (isFilterOption(o1) && isFilterOption(o2))\r\n return o1.value == o2.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n //Estos input/output se utiliza por si no se quiere utilizar el componente select buscable dentro de un formulario\r\n selected = input<T | T[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<T | T[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n private queryTimeout: number | undefined = undefined;\r\n private readonly debounceTime = 300;\r\n\r\n constructor(@Optional() intl: NgxTablesIntl | null) {\r\n this.intl = intl ?? inject(NgxTablesIntl);\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const selected = this.selected();\r\n const control = this.control();\r\n const disabled = this.disabled();\r\n const innerControl = control ? control : new FormControl({ value: selected, disabled: disabled });\r\n this.innerControl.set(innerControl);\r\n });\r\n\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n\r\n protected options = signal<T[]>([]);\r\n\r\n setOptions = effect(() => {\r\n const paginatedRecords = this.dataResource.value();\r\n const pageNumber = this.filters()().pageNumber;\r\n\r\n if (!paginatedRecords)\r\n return;\r\n\r\n if (pageNumber > 1)\r\n this.options.update((oldValue: T[]) => [...oldValue, ...paginatedRecords.items]);\r\n else\r\n this.options.set(paginatedRecords.items);\r\n });\r\n /*protected options = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.records;\r\n });*/\r\n\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n this.onQueryChange();\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected onQueryChange() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n const query = searcher.nativeElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime);\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<T | T[] | undefined>) {\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected optionsSelectedForView(): T[] {\r\n const innerControl = this.innerControl();\r\n\r\n if (!innerControl.value)\r\n return [];\r\n\r\n if (Array.isArray(innerControl.value))\r\n return innerControl.value;\r\n\r\n return [innerControl.value];\r\n };\r\n\r\n protected onMoreClick() {\r\n this.filters().update((value: U) => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageNumber + 1\r\n };\r\n });\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{ selectLabel() }}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\"\r\n [compareWith]=\"compareWith()\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || intl.searchPlaceholder }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\"\r\n [value]=\"filters()().query ?? ''\" \r\n (input)=\"onQueryChange()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\" />\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ intl.getRemoveOptionText(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option [value]=\"option\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Es MUY importante que estos vayan los ultimos (al final de todas las opciones). -->\r\n @for (option of optionsSelectedForView(); track $index) {\r\n <mat-option [value]=\"option\" class=\"hideOption\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Si es multiple, como no esta el option de resetear, si filtran y no hay opciones, y luego cierran el select el desplegable no se abre y queda inutilizado, por eso, ponemos esta opcion dummy, que siempre esta oculta, y no hace nada, pero ya hace que haya un item, y el desplegable se abra -->\r\n @if(multiple()) {\r\n <mat-option class=\"hideOption\" dummyOption></mat-option>\r\n }\r\n\r\n @if (total() == 0) {\r\n <p class=\"withoutResults\">{{ intl.noResultsMessage }}</p>\r\n }\r\n\r\n @if((filters()().pageNumber * filters()().pageSize) < total() && !dataResource.isLoading()) {\r\n <button matButton=\"text\" class=\"showMore\" (click)=\"onMoreClick()\">\r\n {{ intl.showMoreLabel }}\r\n </button>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","import { Component, effect, ElementRef, inject, input, OnInit, Optional, output, signal, viewChild } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n\r\n@Component({\r\n selector: 'ngx-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-searchable-select.component.html',\r\n styleUrl: './ngx-searchable-select.component.scss',\r\n})\r\nexport class SearchableSelectComponent<T> {\r\n\r\n // Inyectar el servicio de internacionalización (opcional para permitir override)\r\n public readonly intl: NgxTablesIntl;\r\n\r\n control = input<FormControl | undefined>();\r\n options = input.required<T[]>();\r\n optionLabel = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n optionValue = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionValue\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n //Estos input/output se utiliza por si no se quiere utilizar el componente select buscable dentro de un formulario\r\n selected = input<string | string[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<string | string[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n constructor(@Optional() intl: NgxTablesIntl | null) {\r\n this.intl = intl ?? inject(NgxTablesIntl);\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const selected = this.selected();\r\n const control = this.control();\r\n const disabled = this.disabled();\r\n const innerControl = control ? control : new FormControl({ value: selected, disabled: disabled });\r\n this.innerControl.set(innerControl);\r\n });\r\n\r\n protected openedChange(open: boolean) {\r\n /*if (open)\r\n this.cleanQuery();*/\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n setTimeout(() => {\r\n searcher.nativeElement.focus();\r\n });\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected showOption(option: T): boolean {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const label = this.optionLabel()(option);\r\n return includeNoSensible(label, query);\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<string | string[] | undefined>) {\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected numberOfResults(): number {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const optionLabel = this.optionLabel();\r\n const results = this.options().filter((option) => {\r\n const label = optionLabel(option);\r\n return includeNoSensible(label, query);\r\n });\r\n return results.length;\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{selectLabel()}}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || intl.searchPlaceholder }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ intl.getRemoveOptionText(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option \r\n [value]=\"optionValue()(option)\"\r\n [class.hideOption]=\"!showOption(option)\">\r\n {{optionLabel()(option)}}\r\n </mat-option>\r\n }\r\n\r\n @if (numberOfResults() == 0) {\r\n <p class=\"withoutResults\">{{ intl.noResultsMessage }}</p>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{error()}}</mat-error>\r\n</mat-form-field>","import { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { PaginatedTableConfig, OPERATOR_BY_FILTER_TYPE, FilterOperator, FilterType, PaginatedTableColumn, FilterOption, PaginatedFilter } from '../../../models';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../../../components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../../../components/ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-rule',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatTooltipModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './advanced-filter-rule.component.html',\r\n styleUrl: './advanced-filter-rule.component.scss',\r\n})\r\nexport class AdvancedFilterRuleComponent<T> {\r\n rule = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n deleteFilter = output<string>();\r\n\r\n intl = inject(NgxTablesIntl);\r\n columns = computed(() => this.config().columns.filter(column => column.filterType != undefined));\r\n operatorByFilterType = OPERATOR_BY_FILTER_TYPE;\r\n \r\n filterOperatorLabel = computed<Record<FilterOperator, string>>(() => ({\r\n '=': this.intl.operatorEquals,\r\n '<>': this.intl.operatorNotEquals,\r\n '>': this.intl.operatorGreaterThan,\r\n '>=': this.intl.operatorGreaterOrEquals,\r\n '<': this.intl.operatorLessThan,\r\n '<=': this.intl.operatorLessOrEquals,\r\n 'LIKE': this.intl.operatorLike\r\n }));\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n getRuleId(): string {\r\n return (this.rule().get('id')! as FormControl).value;\r\n }\r\n\r\n getKey(): FormControl {\r\n return this.rule().get('key')! as FormControl\r\n }\r\n\r\n getOperator(): FormControl {\r\n return this.rule().get('operator')! as FormControl\r\n }\r\n\r\n getValue(): FormControl {\r\n return this.rule().get('value')! as FormControl\r\n }\r\n\r\n getColumnSelected(value: keyof T): PaginatedTableColumn<T> | undefined {\r\n return this.columns().find(column => column.key == value);\r\n }\r\n\r\n getOperatorsOption(value: keyof T): FilterOperator[] {\r\n const columnSelected = this.getColumnSelected(value);\r\n\r\n if (!columnSelected || !columnSelected.filterType)\r\n return [];\r\n\r\n return this.operatorByFilterType[columnSelected.filterType];\r\n }\r\n\r\n getFilterType(value: keyof T): FilterType | undefined {\r\n const columnSelected = this.getColumnSelected(value);\r\n return columnSelected?.filterType;\r\n }\r\n\r\n onKeyChange(_?: string | string[]) {\r\n this.getOperator().setValue(null);\r\n this.getValue().setValue(null);\r\n }\r\n\r\n keyOptionLabel = (column: PaginatedTableColumn<T>): string => column.label\r\n keyOptionValue = (column: PaginatedTableColumn<T>): string => column.key as string\r\n\r\n operatorOptionLabel = (filterOperator: FilterOperator): string => this.filterOperatorLabel()[filterOperator];\r\n operatorOptionValue = (filterOperator: FilterOperator): string => filterOperator;\r\n}\r\n\r\n","<button \r\n matIconButton \r\n [matTooltip]=\"intl.deleteFilterTooltip\" \r\n (click)=\"deleteFilter.emit(getRuleId())\"\r\n class=\"deleteButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n</button>\r\n\r\n<ngx-searchable-select\r\n [control]=\"getKey()\"\r\n [options]=\"columns()\"\r\n [optionLabel]=\"keyOptionLabel\"\r\n [optionValue]=\"keyOptionValue\"\r\n (optionChange)=\"onKeyChange($event)\"\r\n [selectLabel]=\"intl.fieldLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n/>\r\n\r\n<ngx-searchable-select\r\n [control]=\"getOperator()\"\r\n [options]=\"getOperatorsOption(getKey().value)\"\r\n [optionLabel]=\"operatorOptionLabel\"\r\n [optionValue]=\"operatorOptionValue\"\r\n [selectLabel]=\"intl.conditionLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n/>\r\n\r\n@if (getFilterType(getKey().value) == 'text' || getFilterType(getKey().value) == 'number') {\r\n <mat-form-field>\r\n <mat-label>{{intl.valueLabel}}</mat-label>\r\n <input [formControl]=\"getValue()\" [type]=\"getFilterType(getKey().value) ?? 'text'\" matInput>\r\n <mat-error>{{intl.requiredFieldError}}</mat-error>\r\n </mat-form-field>\r\n}\r\n\r\n@if (getFilterType(getKey().value) == 'option' || getFilterType(getKey().value) == 'option-multiple') {\r\n @if(getColumnSelected(getKey().value)?.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select \r\n [control]=\"getValue()\"\r\n [endpoint]=\"getColumnSelected(getKey().value)!.endpointForPaginatedFilterOptions!\"\r\n [filters]=\"getColumnSelected(getKey().value)!.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [selectLabel]=\"intl.valueLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n [control]=\"getValue()\"\r\n [options]=\"getColumnSelected(getKey().value)?.filterOptions ?? []\"\r\n [selectLabel]=\"intl.valueLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n />\r\n }\r\n}\r\n\r\n@if(getFilterType(getKey().value) == 'date' || getFilterType(getKey().value) == 'date-range') {\r\n <mat-form-field>\r\n <mat-label>{{intl.valueLabel}}</mat-label>\r\n <input\r\n [formControl]=\"getValue()\"\r\n matInput \r\n [matDatepicker]=\"picker\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n <mat-error>{{intl.requiredFieldError}}</mat-error>\r\n </mat-form-field>\r\n}\r\n\r\n\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PaginatedTableConfig, FilterOption } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { DatosPantallaService } from '../../../services/datos-pantalla.service';\r\nimport { AdvancedFilterRuleComponent } from '../advanced-filter-rule/advanced-filter-rule.component';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-group',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n AdvancedFilterRuleComponent,\r\n MatButtonToggleModule,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './advanced-filter-group.component.html',\r\n styleUrl: './advanced-filter-group.component.scss',\r\n})\r\nexport class AdvancedFilterGroupComponent<T> {\r\n isRootNode = input.required<boolean>();\r\n group = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n addGroup = output<string>();\r\n addFilter = output<string>();\r\n deleteGroup = output<string>();\r\n deleteFilter = output<string>();\r\n\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n intl = inject(NgxTablesIntl);\r\n isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n optionsFilterConnector = computed<FilterOption[]>(() => [\r\n { value: 'AND', label: this.intl.connectorAnd },\r\n { value: 'OR', label: this.intl.connectorOr }\r\n ]);\r\n\r\n isFilterGroupForm(group: AbstractControl): boolean {\r\n return AdvancedFilterUtils.isFilterGroupForm(group);\r\n }\r\n\r\n getConnector(): FormControl {\r\n return this.group().get('connector')! as FormControl\r\n }\r\n\r\n getGroupId(): string {\r\n return (this.group().get('id')! as FormControl).value;\r\n }\r\n\r\n getFilters(): FormGroup[] {\r\n return (this.group().get('filters') as FormArray).controls as FormGroup[];\r\n }\r\n}\r\n","<div class=\"grupo\" [formGroup]=\"group()\">\r\n \r\n <mat-button-toggle-group [formControl]=\"getConnector()\">\r\n @for (option of optionsFilterConnector(); track option.value) {\r\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\r\n }\r\n </mat-button-toggle-group>\r\n\r\n @if (isDesktop()) {\r\n <button \r\n matButton=\"outlined\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n {{intl.addFilterButtonLabel}}\r\n </button>\r\n\r\n <button \r\n matButton=\"outlined\"\r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n {{intl.addGroupButtonLabel}}\r\n </button>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.addFilterButtonLabel\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.addGroupButtonLabel\" \r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n </button>\r\n }\r\n \r\n\r\n @if(!isRootNode()) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.deleteGroupTooltip\" \r\n (click)=\"deleteGroup.emit(getGroupId())\"\r\n class=\"deleteGroupButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (group of getFilters(); track $index) {\r\n @if(isFilterGroupForm(group)) {\r\n <lib-advanced-filter-group \r\n [group]=\"group\"\r\n [config]=\"config()\"\r\n [isRootNode]=\"false\"\r\n (addGroup)=\"addGroup.emit($event)\"\r\n (addFilter)=\"addFilter.emit($event)\"\r\n (deleteGroup)=\"deleteGroup.emit($event)\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n } @else {\r\n <lib-advanced-filter-rule \r\n [rule]=\"group\"\r\n [config]=\"config()\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n }\r\n }\r\n\r\n</div>","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { FilterGroup, FilterRule } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { ConfigureAdvancedFilterData } from '../../../models/configure-advanced-filter-data';\r\nimport { AdvancedFilterService } from '../../../services/advanced-filter.service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SendType } from '../../../models/send-type';\r\nimport { AdvancedFilterGroupComponent } from '../advanced-filter-group/advanced-filter-group.component';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-configure-advanced-filter',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n AdvancedFilterGroupComponent\r\n ],\r\n templateUrl: './configure-advanced-filter.component.html',\r\n styleUrl: './configure-advanced-filter.component.scss',\r\n})\r\nexport class ConfigureAdvancedFilterComponent<T> { \r\n private readonly fb = inject(FormBuilder);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n dialogRef = inject(MatDialogRef<ConfigureAdvancedFilterComponent<T>>);\r\n data = inject<ConfigureAdvancedFilterData<T>>(MAT_DIALOG_DATA);\r\n intl = inject(NgxTablesIntl);\r\n\r\n query = signal('');\r\n\r\n form = AdvancedFilterUtils.createAdvancedFilter<T>(this.fb, this.data.advancedFilter);\r\n formChanges = toSignal(this.form.valueChanges);\r\n\r\n mapFormToAdvancedFilterEffect = effect(() => {\r\n const values = this.formChanges();\r\n\r\n if (this.form.invalid) {\r\n this.query.set('');\r\n return;\r\n }\r\n\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const queryString = AdvancedFilterUtils.groupsToReadableHtml(advancedFilter.groups, this.data.config.columns, this.intl);\r\n this.query.set(queryString);\r\n });\r\n\r\n getRootGroup(): FormGroup {\r\n return (this.form.get('groups') as FormArray).controls[0] as FormGroup;\r\n }\r\n\r\n addGroup(groupId: string) {\r\n const newGroup: FilterGroup<T> = {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [\r\n { id: uuidv4() }\r\n ]\r\n };\r\n AdvancedFilterUtils.addGroupToGroup<T>(this.fb, this.form, groupId, newGroup);\r\n }\r\n\r\n addFilter(groupId: string) {\r\n const newRule: FilterRule<T> = { id: uuidv4() };\r\n AdvancedFilterUtils.addRuleToGroup<T>(this.fb, this.form, groupId, newRule);\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n AdvancedFilterUtils.deleteGroup<T>(this.form, groupId);\r\n }\r\n\r\n deleteFilter(ruleId: string) {\r\n AdvancedFilterUtils.deleteRule<T>(this.form, ruleId);\r\n }\r\n\r\n onSubmit(sendType: SendType) {\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const tableId = this.data.config.tableId;\r\n this.advancedFilterService.saveAdvancedFilter(tableId, advancedFilter);\r\n switch (sendType) {\r\n case 'save':\r\n this.dialogRef.close();\r\n break;\r\n case 'save_and_apply':\r\n this.dialogRef.close(advancedFilter);\r\n break;\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit('save_and_apply')\">\r\n\r\n <h2 mat-dialog-title>{{intl.advancedFiltersDialogTitle}} {{data.config.title() | lowercase}}</h2>\r\n <mat-dialog-content>\r\n\r\n <p class=\"advancedFilterResult\" [innerHTML]=\"query()\" [style.visibility]=\"query() ? 'visible': 'hidden'\"></p>\r\n\r\n <mat-form-field>\r\n <mat-label>{{intl.templateNameLabel}}</mat-label>\r\n <input matInput formControlName=\"name\" [maxlength]=\"16\">\r\n <mat-hint>{{form.get('name')?.value.length ?? 0}}/16</mat-hint>\r\n <mat-error>{{intl.templateNameRequiredError}}</mat-error>\r\n </mat-form-field>\r\n\r\n <lib-advanced-filter-group \r\n [group]=\"getRootGroup()\"\r\n [config]=\"data.config\"\r\n [isRootNode]=\"true\"\r\n (addGroup)=\"addGroup($event)\"\r\n (addFilter)=\"addFilter($event)\"\r\n (deleteGroup)=\"deleteGroup($event)\"\r\n (deleteFilter)=\"deleteFilter($event)\"\r\n />\r\n\r\n <div class=\"helperContainer\">\r\n <p class=\"helperTitle\"><strong>{{intl.advancedFiltersHelpTitle}}</strong></p>\r\n <p class=\"helper\">\r\n <strong>{{intl.groupLabel}} </strong>{{intl.advancedFiltersGroupHelp}}<br>\r\n <strong>{{intl.filterLabel}} </strong>{{intl.advancedFiltersRuleHelp}}\r\n </p>\r\n </div>\r\n \r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{intl.closeButtonLabel}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save')\">{{intl.saveButtonLabel}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save_and_apply')\">{{intl.saveAndApplyButtonLabel}}</button>\r\n </mat-dialog-actions>\r\n\r\n\r\n</form>","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, computed, HostListener, inject, input, OnDestroy, OnInit, Optional, output, Signal, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { MatSortModule, Sort } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\r\nimport { OnlyUpperFirstCharacterPipe } from '../../pipes/only-upper-first-character.pipe';\r\nimport { Observable, Subject, takeUntil } from 'rxjs';\r\nimport { ColumnPipe, FilterOption, isFilterOption, PaginatedTableColumn, PaginatedTableConfig, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\r\nimport moment from 'moment';\r\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport jsPDF from 'jspdf';\r\nimport autoTable from 'jspdf-autotable';\r\nimport { utils, writeFileXLSX } from 'xlsx';\r\nimport { AdvancedFilter, PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { AdvancedFilterUtils } from '../../models/advanced-filter-utils';\r\nimport { ColumnValue } from '../../models/column-value';\r\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\r\nimport { AdvancedFilterService } from '../../services/advanced-filter.service';\r\nimport { ColumnConfigService } from '../../services/column-config.service';\r\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\r\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\r\nimport { SelectionActionEvent } from '../../models/selection-action-event';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { NgxConfirmDialogComponent } from '../ngx-confirm-dialog/ngx-confirm-dialog.component';\r\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\r\nimport { ConfigureAdvancedFilterData } from '../../models/configure-advanced-filter-data';\r\nimport { ConfigureAdvancedFilterComponent } from '../../common/components/configure-advanced-filter/configure-advanced-filter.component';\r\nimport { NgxTablesIntl } from '../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-table',\r\n imports: [\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n CommonModule,\r\n DynamicCellHostDirective,\r\n MatMenuModule,\r\n MatDividerModule,\r\n OnlyUpperFirstCharacterPipe,\r\n MatCheckboxModule,\r\n PaginatedSearchableSelectComponent,\r\n SearchableSelectComponent\r\n ],\r\n templateUrl: './ngx-paginated-table.component.html',\r\n styleUrl: './ngx-paginated-table.component.scss',\r\n host: { class: 'contenedorDefecto' }\r\n})\r\nexport class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnInit, OnDestroy {\r\n \r\n private readonly columnConfigService = inject(ColumnConfigService);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n private readonly dialog = inject(MatDialog);\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // Inyectar el servicio de internacionalización (opcional para permitir override)\r\n public readonly intl: NgxTablesIntl;\r\n private readonly _destroy$ = new Subject<void>();\r\n\r\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 10,\r\n query: undefined,\r\n sortBy: undefined,\r\n columnsFiltersValue: undefined,\r\n advancedFilterId: undefined\r\n } as U\r\n )\r\n );\r\n\r\n config = input.required<WritableSignal<PaginatedTableConfig<T>>>();\r\n\r\n protected createClick = output<void>();\r\n protected updateClick = output<T>();\r\n protected deleteClick = output<T>();\r\n protected rowActionClick = output<RowActionClickEvent<T>>();\r\n protected expandedItemChange = output<T | null>();\r\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\r\n\r\n\r\n protected readonly filterKeyPrefix = 'filter';\r\n protected readonly nameOfActionsColumn = 'actionsPerRow';\r\n protected readonly generalFooterKeyPrefix = 'footer';\r\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\r\n protected readonly debounceTime = 300;\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n protected data = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.items;\r\n });\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n protected columnConfig = computed(() => {\r\n const columnConfigs = this.columnConfigService.columnConfigs();\r\n const configValue = this.config()();\r\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\r\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\r\n return {\r\n key: column.key,\r\n show: true,\r\n isSticky: configValue.defaultStickyColumn == column.key\r\n }\r\n });\r\n\r\n if (!columnConfig)\r\n return defaultColumnConfig;\r\n\r\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\r\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\r\n\r\n //Por si a posteriori se añaden nuevas columnas\r\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\r\n\r\n return [...filteredColumns, ...columnsAdded];\r\n });\r\n\r\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\r\n\r\n protected keys = computed(() => {\r\n const configValue = this.config()();\r\n const columnConfig = this.columnConfig();\r\n\r\n let keys: (string | keyof T)[] = [...columnConfig]\r\n .filter(column => column.show)\r\n .map(column => column.key);\r\n\r\n if ((configValue.showActions?.() ?? true) &&\r\n ((configValue.update && !configValue.clickOnRowForUpdate)\r\n || configValue.delete\r\n || (configValue.rowActions && configValue.rowActions.length > 0)\r\n || configValue.expandableDetail)\r\n ) {\r\n keys = [...keys, this.nameOfActionsColumn];\r\n }\r\n\r\n if (configValue.enableRowSelection)\r\n keys = [this.nameOfRowSelectionColumn, ...keys];\r\n\r\n return keys;\r\n });\r\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected showFiltersRow = computed(() => {\r\n const configValue = this.config()();\r\n return [...configValue.columns].some(column => column.filterType) && !configValue.showAdvancedFilters;\r\n });\r\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\r\n protected showTotalPerPageFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\r\n });\r\n protected showTotalGeneralFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\r\n });\r\n\r\n protected queryTimeout: number | undefined = undefined;\r\n\r\n protected timeoutsByKey: Partial<Record<keyof T, number>> = {}\r\n\r\n protected advancedFilters: Signal<AdvancedFilter<T>[]> = computed(() => {\r\n const allTablesAdvancedFilters = this.advancedFilterService.advancedFilters();\r\n const tableId = this.config()().tableId;\r\n return allTablesAdvancedFilters[tableId];\r\n });\r\n\r\n protected readonly expandableColumnDef = 'expandedDetail';\r\n protected expandedItem = signal<T | null>(null);\r\n\r\n protected selection = signal<T[]>([]);\r\n\r\n protected isFullScreen = signal(false);\r\n private readonly overlay = inject(Overlay);\r\n private readonly overlayContainer = inject(OverlayContainer);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\r\n private overlayRef?: OverlayRef;\r\n private portal?: TemplatePortal;\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n constructor(@Optional() intl: NgxTablesIntl | null) {\r\n this.intl = intl ?? new NgxTablesIntl();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Suscribirse a los cambios de las etiquetas\r\n this.intl.changes\r\n .pipe(takeUntil(this._destroy$))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape() {\r\n if (this.overlayRef && this.isMyOverlayOnTop())\r\n this.exitFullscreen();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n //Limpiamos todos los timeouts de filtros tipo texto de columnas\r\n Object.keys(this.timeoutsByKey).forEach((key) => {\r\n const timeout = this.timeoutsByKey[key as keyof T]\r\n clearTimeout(timeout);\r\n });\r\n\r\n this._destroy$.next();\r\n this._destroy$.complete();\r\n }\r\n\r\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\r\n return allColumns.some(column => searchedColumn.key == column.key);\r\n }\r\n\r\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\r\n\r\n protected onPageChange(event: PageEvent) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageSize == event.pageSize ? event.pageIndex + 1 : 1,\r\n pageSize: event.pageSize\r\n };\r\n });\r\n }\r\n\r\n protected onQueryChange(inputElement: HTMLInputElement) {\r\n const query = inputElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime)\r\n }\r\n\r\n protected onQueryReset(inputElement: HTMLInputElement) {\r\n inputElement.value = '';\r\n this.onQueryChange(inputElement);\r\n }\r\n\r\n protected onSortChange(sort: Sort) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n pageNumber: 1,\r\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\r\n };\r\n });\r\n }\r\n\r\n protected onNewClick() {\r\n this.createClick.emit();\r\n }\r\n\r\n protected onUpdateClick(row: T, event: Event) {\r\n this.updateClick.emit(row);\r\n event.stopPropagation();\r\n }\r\n\r\n protected onRowClick(row: T) {\r\n if (this.isRowEnabled(row))\r\n this.updateClick.emit(row);\r\n }\r\n\r\n protected isRowEnabled(row: T): boolean | undefined {\r\n return this.config()().update\r\n && this.config()().clickOnRowForUpdate\r\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\r\n && !this.config()().update?.disabled?.(row);\r\n }\r\n\r\n protected onDeleteClick(row: T, event: Event) {\r\n event.stopPropagation();\r\n\r\n const title = this.config()().deleteConfirm?.title?.(row) ?? this.intl.deleteConfirmTitle;\r\n const body = this.config()().deleteConfirm?.body?.(row) ?? this.intl.deleteConfirmBody;\r\n const template = this.config()().deleteConfirm?.templateRef?.();\r\n const data: ConfirmDialogData = {\r\n title: title,\r\n body: !template ? body : undefined,\r\n template: template,\r\n row: row,\r\n confirmButtonLabel: this.intl.confirmDeleteLabel\r\n };\r\n const dialogRef = this.dialog.open(NgxConfirmDialogComponent, { data: data });\r\n dialogRef.afterClosed().subscribe((confirm: boolean) => {\r\n if (confirm)\r\n this.deleteClick.emit(row);\r\n });\r\n }\r\n\r\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\r\n this.rowActionClick.emit({ id: rowAction.id, row: row })\r\n event.stopPropagation();\r\n }\r\n\r\n protected onTextFilterColumnChange(column: PaginatedTableColumn<T>, event: Event) {\r\n const query = (event.target as HTMLInputElement).value;\r\n\r\n //Si existe, limpio el anterior\r\n if (column.key in this.timeoutsByKey)\r\n clearTimeout(this.timeoutsByKey[column.key]);\r\n\r\n this.timeoutsByKey[column.key] = setTimeout(() => {\r\n this.onColumnFilterChange(column.key, query);\r\n }, this.debounceTime);\r\n }\r\n\r\n protected onPaginatedOptionFilterColumnChange(column: PaginatedTableColumn<T>, option?: FilterOption | FilterOption[]) {\r\n this.onColumnFilterChange(column.key, option);\r\n }\r\n\r\n protected onOptionFilterColumnChange(column: PaginatedTableColumn<T>, value?: string | string[]) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateFilterChange(column: PaginatedTableColumn<T>, value: moment.Moment | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateRangeFilterChange(column: PaginatedTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\r\n this.filters().update(currentValue => {\r\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = currentValue.columnsFiltersValue ?? {};\r\n columnsFiltersValue[columnKey] = value;\r\n return {\r\n ...currentValue,\r\n pageNumber: 1,\r\n columnsFiltersValue: columnsFiltersValue\r\n }\r\n });\r\n }\r\n\r\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\r\n return this.filters()().columnsFiltersValue?.[key];\r\n }\r\n\r\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\r\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\r\n\r\n if (!value)\r\n return null;\r\n\r\n return type == 'start' ? value.start : value.end\r\n }\r\n\r\n protected onEditColumns() {\r\n const config = this.config()();\r\n const filters = this.filters()();\r\n const columnConfig = this.columnConfig();\r\n\r\n const columnsLabel = Object.fromEntries(\r\n config.columns.map(column => [column.key, column.label])\r\n ) as Record<keyof T, string>;\r\n\r\n const data: ConfigureTableColumnData<T> = {\r\n tableId: config.tableId,\r\n tableName: config.title(),\r\n columns: columnConfig,\r\n filtersValue: filters.columnsFiltersValue ?? {},\r\n columnsLabels: columnsLabel\r\n };\r\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\r\n }\r\n\r\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\r\n if (!pipes)\r\n return value;\r\n\r\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\r\n\r\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\r\n }\r\n\r\n\r\n protected onNewAdvancedFiltersClick() {\r\n const data: ConfigureAdvancedFilterData<T> = {\r\n config: this.config()(),\r\n advancedFilter: {\r\n name: '',\r\n groups: [\r\n {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [{ id: uuidv4() }]\r\n }\r\n ]\r\n }\r\n };\r\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\r\n\r\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\r\n if (advancedFilter)\r\n this.onApplyTemplateClick(advancedFilter);\r\n });\r\n }\r\n\r\n protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>) {\r\n const advancedFilterId: string | undefined = advancedFilter?.groups?.[0].id;\r\n this.filters().update(currentValue => {\r\n return {\r\n ...currentValue,\r\n advancedFilterId: advancedFilterId,\r\n pageNumber: 1\r\n };\r\n });\r\n }\r\n\r\n protected onSelectedAdvancedFilterUpdate(event: Event) {\r\n const advancedFilterId = this.filters()().advancedFilterId;\r\n if (!advancedFilterId)\r\n return;\r\n\r\n const tableId = this.config()().tableId;\r\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\r\n\r\n if (!advancedFilter)\r\n return;\r\n\r\n this.onAdvancedFilterUpdate(event, advancedFilter);\r\n }\r\n\r\n protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger) {\r\n event.stopPropagation();\r\n advancedFiltersMenuTrigger?.closeMenu();\r\n\r\n const data: ConfigureAdvancedFilterData<T> = {\r\n config: this.config()(),\r\n advancedFilter: advancedFilter\r\n };\r\n\r\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\r\n\r\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\r\n if (advancedFilter)\r\n this.onApplyTemplateClick(advancedFilter);\r\n });\r\n }\r\n\r\n protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>) {\r\n event.stopPropagation();\r\n advancedFiltersMenuTrigger.closeMenu();\r\n\r\n const data: ConfirmDialogData = {\r\n title: this.intl.deleteAdvancedFilterTitle,\r\n body: this.intl.getDeleteAdvancedFilterMessage(advancedFilter.name),\r\n confirmButtonLabel: this.intl.confirmDeleteLabel\r\n };\r\n const dialogRef = this.dialog.open(NgxConfirmDialogComponent, { data: data });\r\n dialogRef.afterClosed().subscribe((confirm: boolean) => {\r\n if (confirm) {\r\n if (this.filters()().advancedFilterId == advancedFilter.groups[0].id)\r\n this.onApplyTemplateClick();\r\n\r\n this.advancedFilterService.deleteAdvancedFilter(this.config()().tableId, advancedFilter);\r\n }\r\n });\r\n }\r\n\r\n protected onQuitAdvancedFilter(event: Event) {\r\n event.stopPropagation();\r\n this.onApplyTemplateClick();\r\n }\r\n\r\n protected getAdvancedFilterLabel(): string {\r\n const advancedFilterId = this.filters()().advancedFilterId;\r\n if (!advancedFilterId)\r\n return '';\r\n\r\n const tableId = this.config()().tableId;\r\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\r\n\r\n if (!advancedFilter)\r\n return '';\r\n\r\n return AdvancedFilterUtils.groupsToReadableHtml<T>(advancedFilter.groups, this.config()().columns, this.intl);\r\n }\r\n\r\n protected rowIsExpanded(row: T): boolean {\r\n return this.expandedItem() == row;\r\n }\r\n\r\n protected expandableToggle(row: T) {\r\n this.expandedItem.update(currentValue => {\r\n const newValue = currentValue != row ? row : null;\r\n this.expandedItemChange.emit(newValue);\r\n return newValue;\r\n });\r\n }\r\n\r\n protected getTotalOfColum(columnKey: keyof T): number {\r\n const result = this.data().reduce((previous, item) => (previous + Number(item[columnKey])), 0);\r\n return result;\r\n }\r\n\r\n protected areEqualByKeys(record1: T, record2: T): boolean {\r\n const primaryKey = this.config()().primaryKey;\r\n\r\n if (Array.isArray(primaryKey))\r\n return primaryKey.every(key => record1[key] === record2[key]);\r\n else\r\n return record1[primaryKey] === record2[primaryKey];\r\n }\r\n\r\n protected isRowSelected(row: T): boolean {\r\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\r\n }\r\n\r\n protected toggleRowSelection(row: T) {\r\n if (this.isRowSelected(row)) {\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\r\n });\r\n } else {\r\n this.selection.update(recordsSelected => [...recordsSelected, row]);\r\n }\r\n }\r\n\r\n protected isAllPageRowSelected(): boolean {\r\n const records = this.data();\r\n return records.every(record => this.isRowSelected(record));\r\n }\r\n\r\n protected toggleAllPageRowSelection() {\r\n const records = this.data();\r\n\r\n if (this.isAllPageRowSelected()) {\r\n //Deseleccionar todas las filas de la página actual\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(\r\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\r\n );\r\n });\r\n } else {\r\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\r\n const notSelected = records.filter(record => !this.isRowSelected(record));\r\n\r\n this.selection.update(recordsSelected => {\r\n // Evitar duplicados por si ya hay seleccionadas\r\n const nuevas = notSelected.filter(\r\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\r\n );\r\n return [...recordsSelected, ...nuevas];\r\n });\r\n }\r\n }\r\n\r\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\r\n return this.config()().rowSelectionAction ?? [];\r\n }\r\n\r\n protected uncheckAllSelection() {\r\n this.selection.set([]);\r\n }\r\n\r\n protected onRowSelectionActionClick(actionId: string) {\r\n this.selectionActionEvent.emit(\r\n {\r\n id: actionId,\r\n rows: this.selection()\r\n }\r\n );\r\n }\r\n\r\n private getDocumentHeaders(): string[] {\r\n const config = this.config()();\r\n return config.columns.map(c => c.label);\r\n }\r\n\r\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\r\n const config = this.config()();\r\n const columns = config.columns;\r\n\r\n const data = this.data();\r\n\r\n return data.map(row => {\r\n if (config.mapperForExportData) {\r\n const mapped = config.mapperForExportData(row);\r\n return columns.map(c => mapped[c.key]);\r\n }\r\n\r\n return columns.map(c => row[c.key] ?? '');\r\n });\r\n }\r\n\r\n protected exportToCsvCurrentPage() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const aoaData = [headers, ...rows];\r\n\r\n //const workSheet = utils.json_to_sheet(data);\r\n\r\n const workSheet = utils.aoa_to_sheet(aoaData);\r\n const workBook = utils.book_new();\r\n utils.book_append_sheet(workBook, workSheet, title);\r\n writeFileXLSX(workBook, `${fileName}.xlsx`);\r\n }\r\n\r\n protected exportToPdfCurrentPage() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const doc = config.pdfConfig ?? new jsPDF({\r\n orientation: 'landscape',\r\n unit: 'pt',\r\n format: 'A4'\r\n });\r\n\r\n doc.setFontSize(14);\r\n doc.text(title, 40, 40);\r\n\r\n autoTable(doc, {\r\n startY: 60,\r\n head: [headers],\r\n body: rows,\r\n styles: { fontSize: 9, cellPadding: 4 },\r\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\r\n alternateRowStyles: { fillColor: [245, 245, 245] },\r\n tableLineColor: [200, 200, 200],\r\n tableLineWidth: 0.1,\r\n });\r\n\r\n doc.save(`${fileName}.pdf`);\r\n }\r\n\r\n protected onToggleFullScreen() {\r\n if (this.isFullScreen())\r\n this.exitFullscreen()\r\n else\r\n this.enterFullscreen();\r\n }\r\n\r\n private enterFullscreen() {\r\n if (this.overlayRef)\r\n return;\r\n\r\n this.overlayRef = this.overlay.create({\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.block(),\r\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\r\n });\r\n\r\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\r\n this.overlayRef.attach(this.portal);\r\n\r\n this.isFullScreen.set(true);\r\n }\r\n\r\n private exitFullscreen() {\r\n if (!this.overlayRef)\r\n return;\r\n\r\n this.overlayRef.detach();\r\n this.overlayRef.dispose();\r\n this.overlayRef = undefined;\r\n this.portal = undefined;\r\n\r\n this.isFullScreen.set(false);\r\n }\r\n\r\n private isMyOverlayOnTop(): boolean {\r\n if (!this.overlayRef)\r\n return false;\r\n\r\n //Contenedor principal de overlays en el DOM\r\n const containerElement = this.overlayContainer.getContainerElement();\r\n // Los overlays se añaden como hijos dentro de este contenedor\r\n const overlays = Array.from(containerElement.children);\r\n // El último hijo es el overlay más \"arriba\"\r\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\r\n\r\n return topOverlay === this.overlayRef.hostElement;\r\n }\r\n \r\n}\r\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? intl.createButtonLabel\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.editColumnsTooltip\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n\r\n @if(config()().showAdvancedFilters) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.advancedFiltersLabel\"\r\n [matMenuTriggerFor]=\"advancedFiltersMenu\" \r\n #advancedFiltersMenuTrigger=\"matMenuTrigger\">\r\n\r\n <mat-icon>filter_alt</mat-icon>\r\n </button>\r\n\r\n <mat-menu #advancedFiltersMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"onNewAdvancedFiltersClick()\">\r\n <mat-icon>filter_alt</mat-icon>\r\n <span>{{ intl.newAdvancedFilterLabel }}</span>\r\n </button>\r\n\r\n @for (advancedFilter of advancedFilters(); track $index; let first = $first) {\r\n @if (first) {\r\n <mat-divider />\r\n }\r\n\r\n <div mat-menu-item (click)=\"onApplyTemplateClick(advancedFilter)\">\r\n <div class=\"templateContainer\"> \r\n <span>{{advancedFilter.name | ngxOnlyUpperFirstCharacter}}</span>\r\n\r\n <div class=\"buttonTemplateContainer\">\r\n <button\r\n matIconButton \r\n [matTooltip]=\"intl.getEditAdvancedFilterTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterUpdate($event, advancedFilter, advancedFiltersMenuTrigger)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n\r\n <button\r\n matIconButton \r\n [matTooltip]=\"intl.getDeleteAdvancedFilterTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterDelete($event, advancedFiltersMenuTrigger, advancedFilter)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.selectionActionsTooltip\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ intl.deselectAllLabel }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.deselectAllLabel\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.exportTooltip\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsvCurrentPage()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ intl.exportToExcelLabel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdfCurrentPage()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ intl.exportToPdfLabel }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? intl.exitFullscreenTooltip : intl.enterFullscreenTooltip\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(config()().showQueryFilter) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? intl.searchPlaceholder\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n @if(filters()().advancedFilterId) {\r\n <div class=\"advancedFiltersApplied\" (click)=\"onSelectedAdvancedFilterUpdate($event)\">\r\n <p [innerHTML]=\"getAdvancedFilterLabel()\"></p>\r\n <button matIconButton [matTooltip]=\"intl.removeAdvancedFilterTooltip\" class=\"\" (click)=\"onQuitAdvancedFilter($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"data()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!column.isSortable\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td \r\n mat-footer-cell \r\n *matFooterCellDef \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral && column.getTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(column.getTotalGeneral(), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(column.getTotalGeneral()) }}\r\n } @else {\r\n {{ column.getTotalGeneral() }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n }\r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"intl.dateRangeStartPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"intl.dateRangeEndPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ intl.actionsLabel }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? intl.editTooltip\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? intl.deleteTooltip\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ dataResource.isLoading() ? intl.loadingMessage : intl.noDataMessage }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ intl.totalPerPageLabel }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ intl.totalGeneralLabel }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator [length]=\"total()\" [pageSize]=\"filters()().pageSize\" [pageIndex]=\"filters()().pageNumber - 1\" (page)=\"onPageChange($event)\"/>\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, effect, HostListener, inject, input, output, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\r\nimport { BasicFilter } from '../../models/basic-filter';\r\nimport { BasicTableColumn, BasicTableConfig } from '../../models/basic-table-config';\r\n\r\nimport { PaginatedFilter, SortBy } from '../../models/paginated-filter';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSortModule, Sort } from '@angular/material/sort';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\r\nimport { SelectionActionEvent } from '../../models/selection-action-event';\r\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\r\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ColumnConfigService } from '../../services/column-config.service';\r\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\r\nimport { ColumnPipe, FilterOption, isFilterOption, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\r\nimport jsPDF from 'jspdf';\r\nimport autoTable from 'jspdf-autotable';\r\nimport { utils, writeFileXLSX } from 'xlsx';\r\nimport { ColumnValue } from '../../models/column-value';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { NgxConfirmDialogComponent } from '../ngx-confirm-dialog/ngx-confirm-dialog.component';\r\nimport moment from 'moment';\r\n\r\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\r\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-basic-table',\r\n imports: [\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n CommonModule,\r\n DynamicCellHostDirective,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatCheckboxModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './ngx-basic-table.component.html',\r\n styleUrl: './ngx-basic-table.component.scss',\r\n host: { class: 'contenedorDefecto' }\r\n})\r\nexport class NgxBasicTable<T, U extends BasicFilter<T>> {\r\n\r\n private readonly columnConfigService = inject(ColumnConfigService);\r\n private readonly dialog = inject(MatDialog);\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n \r\n // Inyectar el servicio de internacionalización\r\n public readonly intl = inject(NgxTablesIntl);\r\n \r\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n query: undefined,\r\n sortBy: undefined,\r\n columnsFiltersValue: undefined\r\n } as U\r\n )\r\n );\r\n config = input.required<WritableSignal<BasicTableConfig<T>>>();\r\n data = input.required<T[]>();\r\n loading = input<boolean>(false);\r\n queryFilter = input<(query: string, data: T[]) => T[]>();\r\n\r\n moreFilters = input<(data: T[], filters: U) => T[]>(\r\n (data: T[], _: U) => {\r\n return data;\r\n }\r\n );\r\n\r\n protected createClick = output<void>();\r\n protected updateClick = output<T>();\r\n protected deleteClick = output<T>();\r\n protected rowActionClick = output<RowActionClickEvent<T>>();\r\n protected expandedItemChange = output<T | null>();\r\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\r\n\r\n dataSource = computed(() => {\r\n const data = this.data();\r\n const paginator = this.paginator();\r\n const dataSource = new MatTableDataSource(data);\r\n\r\n if (paginator)\r\n dataSource.paginator = paginator;\r\n\r\n return dataSource;\r\n });\r\n\r\n filtersEffect = effect(() => {\r\n let data = this.data();\r\n const filters = this.filters()();\r\n const config = this.config()();\r\n const queryFilter = this.queryFilter();\r\n const moreFilters = this.moreFilters();\r\n\r\n if (queryFilter)\r\n data = queryFilter(filters.query ?? '', data);\r\n else if (this.someColumnFilterable(config.columns))\r\n data = this.applyInputFilter(config.columns, data, filters.query);\r\n\r\n data = this.applySort(data, config.columns, filters.sortBy);\r\n\r\n data = this.applyColumnFilter(data, config.columns, filters.columnsFiltersValue);\r\n\r\n data = moreFilters(data, filters);\r\n\r\n this.dataSource().data = data;\r\n });\r\n\r\n protected columnConfig = computed(() => {\r\n const columnConfigs = this.columnConfigService.columnConfigs();\r\n const configValue = this.config()();\r\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\r\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\r\n return {\r\n key: column.key,\r\n show: true,\r\n isSticky: configValue.defaultStickyColumn == column.key\r\n }\r\n });\r\n\r\n if (!columnConfig)\r\n return defaultColumnConfig;\r\n\r\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\r\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\r\n\r\n //Por si a posteriori se añaden nuevas columnas\r\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\r\n\r\n return [...filteredColumns, ...columnsAdded];\r\n });\r\n\r\n protected readonly filterKeyPrefix = 'filter';\r\n protected readonly nameOfActionsColumn = 'actionsPerRow';\r\n protected readonly generalFooterKeyPrefix = 'footer';\r\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\r\n\r\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\r\n\r\n protected keys = computed(() => {\r\n const configValue = this.config()();\r\n const columnConfig = this.columnConfig();\r\n\r\n let keys: (string | keyof T)[] = [...columnConfig]\r\n .filter(column => column.show)\r\n .map(column => column.key);\r\n\r\n if ((configValue.showActions?.() ?? true) &&\r\n ((configValue.update && !configValue.clickOnRowForUpdate)\r\n || configValue.delete\r\n || (configValue.rowActions && configValue.rowActions.length > 0)\r\n || configValue.expandableDetail)\r\n ) {\r\n keys = [...keys, this.nameOfActionsColumn];\r\n }\r\n\r\n if (configValue.enableRowSelection)\r\n keys = [this.nameOfRowSelectionColumn, ...keys];\r\n\r\n return keys;\r\n });\r\n\r\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected showFiltersRow = computed(() => {\r\n const configValue = this.config()();\r\n return [...configValue.columns].some(column => column.filterType);\r\n });\r\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\r\n protected showTotalPerPageFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\r\n });\r\n protected showTotalGeneralFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\r\n });\r\n\r\n protected showQueryFilter = computed(() => {\r\n const queryFilter = this.queryFilter();\r\n const config = this.config()();\r\n\r\n if (queryFilter)\r\n return true;\r\n\r\n return this.someColumnFilterable(config.columns);\r\n });\r\n\r\n protected tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\r\n protected isFullScreen = signal(false);\r\n private overlayRef?: OverlayRef;\r\n private portal?: TemplatePortal;\r\n private readonly overlay = inject(Overlay);\r\n private readonly overlayContainer = inject(OverlayContainer);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n protected selection = signal<T[]>([]);\r\n\r\n protected readonly expandableColumnDef = 'expandedDetail';\r\n protected expandedItem = signal<T | null>(null);\r\n\r\n\r\n protected paginator = viewChild(MatPaginator);\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n\r\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\r\n\r\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\r\n return allColumns.some(column => searchedColumn.key == column.key);\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n protected onEscape() {\r\n if (this.overlayRef && this.isMyOverlayOnTop())\r\n this.exitFullscreen();\r\n }\r\n\r\n private someColumnFilterable(columns: BasicTableColumn<T>[]): boolean {\r\n return columns.some((column) => column.isFilterableByInput === true);\r\n }\r\n\r\n private applyInputFilter(columns: BasicTableColumn<T>[], data: T[], query?: string): T[] {\r\n if (!query)\r\n return data;\r\n\r\n const filterableColumns = columns.filter(c => c.isFilterableByInput);\r\n\r\n return data.filter(item =>\r\n filterableColumns.some(column => {\r\n const value = item[column.key];\r\n return typeof value === 'string' && includeNoSensible(value, query);\r\n })\r\n );\r\n }\r\n\r\n private applySort(data: T[], columns: BasicTableColumn<T>[], sortBy?: SortBy): T[] {\r\n if (!sortBy)\r\n return data;\r\n\r\n const column = columns.find(c => c.key === sortBy.key);\r\n\r\n if (!column || column.sortType === undefined)\r\n return data;\r\n\r\n const { key, direction } = sortBy;\r\n const factor = direction === 'asc' ? 1 : -1;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = (a as any)[key];\r\n const bValue = (b as any)[key];\r\n\r\n if (aValue == null && bValue == null)\r\n return 0;\r\n\r\n if (aValue == null)\r\n return -1 * factor;\r\n\r\n if (bValue == null)\r\n return 1 * factor;\r\n\r\n switch (column.sortType) {\r\n case 'number':\r\n return (Number(aValue) - Number(bValue)) * factor;\r\n\r\n case 'date':\r\n return (Date.parse(aValue) - Date.parse(bValue)) * factor;\r\n\r\n case 'string':\r\n default:\r\n if(column.sortByKey) {\r\n const aObjectString = column.sortByKey(a) ?? '';\r\n const bObjectString = column.sortByKey(b) ?? '';\r\n return aObjectString.localeCompare(bObjectString) * factor;\r\n }\r\n\r\n return String(aValue).localeCompare(String(bValue)) * factor;\r\n }\r\n });\r\n }\r\n\r\n private applyColumnFilter(data: T[], columns: BasicTableColumn<T>[], columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>): T[] {\r\n if (!this.showFiltersRow() || !columnsFiltersValue)\r\n return data;\r\n\r\n columns.forEach(column => {\r\n const columnFilterValue = columnsFiltersValue[column.key];\r\n\r\n if (columnFilterValue) {\r\n switch (column.filterType) {\r\n case 'number':\r\n case 'option':\r\n const filterValue = isFilterOption(columnFilterValue) ? columnFilterValue.value : columnFilterValue\r\n data = data.filter(d => {\r\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\r\n return columnValue == filterValue\r\n });\r\n break;\r\n case 'text':\r\n const query = columnFilterValue as string;\r\n data = data.filter(d => {\r\n const word = (column.filterByKey?.(d) ?? d[column.key] ?? '') as string;\r\n return includeNoSensible(word, query);\r\n });\r\n break;\r\n case 'option-multiple':\r\n if (!Array.isArray(columnFilterValue) || columnFilterValue.length <= 0)\r\n break;\r\n\r\n data = data.filter(d => {\r\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\r\n return columnFilterValue.some(f => {\r\n const columnValueString = isFilterOption(f) ? f.value : f;\r\n return columnValueString == columnValue;\r\n });\r\n });\r\n break;\r\n case 'date':\r\n const date = columnFilterValue as moment.Moment\r\n data = data.filter(d => {\r\n const value = d[column.key];\r\n if (typeof value !== 'string')\r\n return false;\r\n\r\n const momentValue = moment.utc(value);\r\n return date.isSame(momentValue, 'day');\r\n });\r\n break;\r\n case 'date-range':\r\n const dateRange = columnFilterValue as DateRange<moment.Moment | null>\r\n if (dateRange.start != null || dateRange.end != null) {\r\n data = data.filter(d => {\r\n const value = d[column.key];\r\n if (typeof value !== 'string')\r\n return false;\r\n\r\n const momentValue = moment.utc(value);\r\n\r\n if (dateRange.start && dateRange.end)\r\n return momentValue.isBetween(dateRange.start, dateRange.end, 'day', '[]');\r\n\r\n if (dateRange.start)\r\n return momentValue.isSameOrAfter(dateRange.start, 'day');\r\n\r\n if (dateRange.end)\r\n return momentValue.isSameOrBefore(dateRange.end, 'day');\r\n\r\n return true;\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n\r\n protected onToggleFullScreen() {\r\n if (this.isFullScreen())\r\n this.exitFullscreen()\r\n else\r\n this.enterFullscreen();\r\n }\r\n\r\n private enterFullscreen() {\r\n if (this.overlayRef)\r\n return;\r\n\r\n this.overlayRef = this.overlay.create({\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.block(),\r\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\r\n });\r\n\r\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\r\n this.overlayRef.attach(this.portal);\r\n\r\n this.isFullScreen.set(true);\r\n }\r\n\r\n private exitFullscreen() {\r\n if (!this.overlayRef)\r\n return;\r\n\r\n this.overlayRef.detach();\r\n this.overlayRef.dispose();\r\n this.overlayRef = undefined;\r\n this.portal = undefined;\r\n\r\n this.isFullScreen.set(false);\r\n }\r\n\r\n private isMyOverlayOnTop(): boolean {\r\n if (!this.overlayRef)\r\n return false;\r\n\r\n //Contenedor principal de overlays en el DOM\r\n const containerElement = this.overlayContainer.getContainerElement();\r\n // Los overlays se añaden como hijos dentro de este contenedor\r\n const overlays = Array.from(containerElement.children);\r\n // El último hijo es el overlay más \"arriba\"\r\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\r\n\r\n return topOverlay === this.overlayRef.hostElement;\r\n }\r\n\r\n protected onNewClick() {\r\n this.createClick.emit();\r\n }\r\n\r\n protected onUpdateClick(row: T, event: Event) {\r\n this.updateClick.emit(row);\r\n event.stopPropagation();\r\n }\r\n\r\n protected onRowClick(row: T) {\r\n if (this.isRowEnabled(row))\r\n this.updateClick.emit(row);\r\n }\r\n\r\n protected isRowEnabled(row: T): boolean | undefined {\r\n return this.config()().update\r\n && this.config()().clickOnRowForUpdate\r\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\r\n && !this.config()().update?.disabled?.(row);\r\n }\r\n\r\n protected onDeleteClick(row: T, event: Event) {\r\n event.stopPropagation();\r\n\r\n const title = this.config()().deleteConfirm?.title?.(row) ?? this.intl.deleteConfirmTitle;\r\n const body = this.config()().deleteConfirm?.body?.(row) ?? this.intl.deleteConfirmBody;\r\n const template = this.config()().deleteConfirm?.templateRef?.();\r\n const data: ConfirmDialogData = {\r\n title: title,\r\n body: !template ? body : undefined,\r\n template: template,\r\n row: row,\r\n confirmButtonLabel: this.intl.confirmDeleteLabel\r\n };\r\n const dialogRef = this.dialog.open(NgxConfirmDialogComponent, { data: data });\r\n dialogRef.afterClosed().subscribe((confirm: boolean) => {\r\n if (confirm)\r\n this.deleteClick.emit(row);\r\n });\r\n }\r\n\r\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\r\n this.rowActionClick.emit({ id: rowAction.id, row: row })\r\n event.stopPropagation();\r\n }\r\n\r\n protected onEditColumns() {\r\n const config = this.config()();\r\n const filters = this.filters()();\r\n const columnConfig = this.columnConfig();\r\n\r\n const columnsLabel = Object.fromEntries(\r\n config.columns.map(column => [column.key, column.label])\r\n ) as Record<keyof T, string>;\r\n\r\n const data: ConfigureTableColumnData<T> = {\r\n tableId: config.tableId,\r\n tableName: config.title(),\r\n columns: columnConfig,\r\n filtersValue: filters.columnsFiltersValue ?? {},\r\n columnsLabels: columnsLabel\r\n };\r\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\r\n }\r\n\r\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\r\n return this.config()().rowSelectionAction ?? [];\r\n }\r\n\r\n protected uncheckAllSelection() {\r\n this.selection.set([]);\r\n }\r\n\r\n protected onRowSelectionActionClick(actionId: string) {\r\n this.selectionActionEvent.emit(\r\n {\r\n id: actionId,\r\n rows: this.selection()\r\n }\r\n );\r\n }\r\n\r\n private getDocumentHeaders(): string[] {\r\n const config = this.config()();\r\n return config.columns.map(c => c.label);\r\n }\r\n\r\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\r\n const config = this.config()();\r\n const columns = config.columns;\r\n\r\n const data = this.dataSource().data;\r\n\r\n return data.map(row => {\r\n if (config.mapperForExportData) {\r\n const mapped = config.mapperForExportData(row);\r\n return columns.map(c => mapped[c.key]);\r\n }\r\n\r\n return columns.map(c => row[c.key] ?? '');\r\n });\r\n }\r\n\r\n protected exportToCsv() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const aoaData = [headers, ...rows];\r\n\r\n //const workSheet = utils.json_to_sheet(data);\r\n\r\n const workSheet = utils.aoa_to_sheet(aoaData);\r\n const workBook = utils.book_new();\r\n\r\n //El nombre de la hoja no puede exceder de 31 caracteres\r\n const name = title.substring(0, 31);\r\n utils.book_append_sheet(workBook, workSheet, name);\r\n writeFileXLSX(workBook, `${fileName}.xlsx`);\r\n }\r\n\r\n protected exportToPdf() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const doc = config.pdfConfig ?? new jsPDF({\r\n orientation: 'landscape',\r\n unit: 'pt',\r\n format: 'A4'\r\n });\r\n\r\n doc.setFontSize(14);\r\n doc.text(title, 40, 40);\r\n\r\n autoTable(doc, {\r\n startY: 60,\r\n head: [headers],\r\n body: rows,\r\n styles: { fontSize: 9, cellPadding: 4 },\r\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\r\n alternateRowStyles: { fillColor: [245, 245, 245] },\r\n tableLineColor: [200, 200, 200],\r\n tableLineWidth: 0.1,\r\n });\r\n\r\n doc.save(`${fileName}.pdf`);\r\n }\r\n\r\n protected onQueryChange(inputElement: HTMLInputElement) {\r\n const query = inputElement.value;\r\n\r\n this.filters().update((value: U) => {\r\n //return { ...value, query: query, pageNumber: 1 };\r\n //Hay que ver el tema del paginador si hay que volver a la pagina 1\r\n return { ...value, query: query };\r\n });\r\n }\r\n\r\n protected onQueryReset(inputElement: HTMLInputElement) {\r\n inputElement.value = '';\r\n this.onQueryChange(inputElement);\r\n }\r\n\r\n protected onSortChange(sort: Sort) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n //pageNumber: 1,\r\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\r\n };\r\n });\r\n }\r\n\r\n protected toggleAllPageRowSelection() {\r\n const records = this.getDataOfCurrentPage();\r\n\r\n if (this.isAllPageRowSelected()) {\r\n //Deseleccionar todas las filas de la página actual\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(\r\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\r\n );\r\n });\r\n } else {\r\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\r\n const notSelected = records.filter(record => !this.isRowSelected(record));\r\n\r\n this.selection.update(recordsSelected => {\r\n // Evitar duplicados por si ya hay seleccionadas\r\n const nuevas = notSelected.filter(\r\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\r\n );\r\n return [...recordsSelected, ...nuevas];\r\n });\r\n }\r\n }\r\n\r\n protected isAllPageRowSelected(): boolean {\r\n const records = this.getDataOfCurrentPage();\r\n return records.every(record => this.isRowSelected(record));\r\n }\r\n\r\n protected areEqualByKeys(record1: T, record2: T): boolean {\r\n const primaryKey = this.config()().primaryKey;\r\n\r\n if (Array.isArray(primaryKey))\r\n return primaryKey.every(key => record1[key] === record2[key]);\r\n else\r\n return record1[primaryKey] === record2[primaryKey];\r\n }\r\n\r\n protected isRowSelected(row: T): boolean {\r\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\r\n }\r\n\r\n protected toggleRowSelection(row: T) {\r\n if (this.isRowSelected(row)) {\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\r\n });\r\n } else {\r\n this.selection.update(recordsSelected => [...recordsSelected, row]);\r\n }\r\n }\r\n\r\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\r\n if (!pipes)\r\n return value;\r\n\r\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\r\n\r\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\r\n }\r\n\r\n protected getTotalPerPageOfColum(columnKey: keyof T): number {\r\n const dataOfCurrentPage = this.getDataOfCurrentPage();\r\n return dataOfCurrentPage.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\r\n }\r\n\r\n protected getDataOfCurrentPage(): T[] {\r\n const paginator = this.dataSource().paginator;\r\n\r\n if (!paginator)\r\n return [];\r\n\r\n const startIndex = paginator.pageIndex * paginator.pageSize;\r\n const endIndex = startIndex + paginator.pageSize;\r\n\r\n return this.dataSource().data.slice(startIndex, endIndex);\r\n }\r\n\r\n protected getTotalOfColum(columnKey: keyof T): number {\r\n return this.dataSource().data.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\r\n }\r\n\r\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\r\n return this.filters()().columnsFiltersValue?.[key];\r\n }\r\n\r\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\r\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\r\n\r\n if (!value)\r\n return null;\r\n\r\n return type == 'start' ? value.start : value.end\r\n }\r\n\r\n protected onTextFilterColumnChange(column: BasicTableColumn<T>, event: Event) {\r\n const query = (event.target as HTMLInputElement).value;\r\n this.onColumnFilterChange(column.key, query);\r\n }\r\n\r\n protected onPaginatedOptionFilterColumnChange(column: BasicTableColumn<T>, option?: FilterOption | FilterOption[]) {\r\n this.onColumnFilterChange(column.key, option);\r\n }\r\n\r\n protected onOptionFilterColumnChange(column: BasicTableColumn<T>, value?: string | string[]) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\r\n this.filters().update(currentValue => {\r\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = currentValue.columnsFiltersValue ?? {};\r\n columnsFiltersValue[columnKey] = value;\r\n return {\r\n ...currentValue,\r\n pageNumber: 1,\r\n columnsFiltersValue: columnsFiltersValue\r\n }\r\n });\r\n }\r\n\r\n protected rowIsExpanded(row: T): boolean {\r\n return this.expandedItem() == row;\r\n }\r\n\r\n protected expandableToggle(row: T) {\r\n this.expandedItem.update(currentValue => {\r\n const newValue = currentValue != row ? row : null;\r\n this.expandedItemChange.emit(newValue);\r\n return newValue;\r\n });\r\n }\r\n}\r\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? intl.createButtonLabel\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.editColumnsTooltip\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.selectionActionsTooltip\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ intl.deselectAllLabel }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.deselectAllLabel\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.exportTooltip\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ intl.exportToExcelLabel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdf()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ intl.exportToPdfLabel }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? intl.exitFullscreenTooltip : intl.enterFullscreenTooltip\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(showQueryFilter()) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? intl.searchPlaceholder\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"loading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"dataSource()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"celdaSelection\"></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"column.sortType === undefined\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td\r\n mat-footer-cell \r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalPerPageOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalPerPageOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalPerPageOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } \r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"intl.dateRangeStartPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"intl.dateRangeEndPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ intl.actionsLabel }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? intl.editTooltip\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? intl.deleteTooltip\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ loading() ? intl.loadingMessage : intl.noDataMessage }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ intl.totalPerPageLabel }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ intl.totalGeneralLabel }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator />\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, input } from '@angular/core';\nimport { AlertType } from '../../models';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'ngx-alert',\n imports: [\n MatIconModule\n ],\n templateUrl: './ngx-alert.component.html',\n styleUrl: './ngx-alert.component.scss',\n})\nexport class NgxAlert { \n type = input<AlertType>('info');\n title = input<string>();\n message = input<string>();\n\n iconName = computed(() => {\n switch (this.type()) {\n case 'warning': return 'warning';\n case 'error': return 'error';\n case 'success': return 'check_circle';\n case 'info':\n default: return 'info';\n }\n });\n}\n","<div class=\"alert\" [class]=\"type()\">\n <div class=\"icon-wrapper\">\n <mat-icon>{{ iconName() }}</mat-icon>\n </div>\n <div class=\"content\">\n @if (title()) {\n <div class=\"title\">{{ title() }}</div>\n }\n <div class=\"description\">\n @if (message()) {\n {{ message() }}\n } @else {\n <ng-content />\n }\n </div>\n </div>\n</div>\n","import {\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n signal,\r\n TemplateRef,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet';\r\nimport { PaginatedFilter } from '../../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../../models/select-config';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { debounceTime, distinctUntilChanged, merge, Observable, skip, Subject } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\nexport interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {\r\n title: string;\r\n config: PaginatedSelectConfig<T>;\r\n endpoint: (filters: U) => Observable<PaginatedItems<T>>;\r\n filters: WritableSignal<U>;\r\n /** Accepts full objects OR partials containing only the valueKey */\r\n selectedItems: Partial<T>[];\r\n multiple: boolean;\r\n searchPlaceholder: string;\r\n noResultsMessage: string;\r\n confirmLabel: string;\r\n resetLabel: string;\r\n optionTemplate: TemplateRef<{ $implicit: T }> | null;\r\n extraFiltersTemplate: TemplateRef<void> | null;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select-bottom-sheet',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatRippleModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n MatBadgeModule,\r\n ],\r\n templateUrl: './ngx-paginated-select-bottom-sheet.component.html',\r\n styleUrl: './ngx-paginated-select-bottom-sheet.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _ref = inject(MatBottomSheetRef<NgxPaginatedSelectBottomSheetComponent<T, U>>);\r\n private readonly _destroy = inject(DestroyRef);\r\n readonly data = inject<NgxPaginatedSelectBottomSheetData<T, U>>(MAT_BOTTOM_SHEET_DATA);\r\n\r\n // ─── State ─────────────────────────────────────────────────────────────────\r\n /** Raw input value — updates on every keystroke, does NOT trigger the resource */\r\n readonly query = signal(this.data.filters().query);\r\n /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */\r\n readonly selectedItems = signal<Partial<T>[]>([...this.data.selectedItems]);\r\n\r\n /**\r\n * Subject used to bypass the 400 ms debounce (e.g. when the user clears\r\n * the search field — we want an immediate response).\r\n */\r\n private readonly _immediateQuery$ = new Subject<string>();\r\n\r\n private readonly accumulatedItems = signal<T[]>([]);\r\n\r\n // ─── Resource (single trigger: data.filters) ───────────────────────────────\r\n /**\r\n * IMPORTANT: the resource depends ONLY on `data.filters`.\r\n * The debounce subscription (below) is the only thing that mutates\r\n * `data.filters.query`, so the resource fires at most once per debounce\r\n * period — never on every keystroke.\r\n */\r\n readonly resource = rxResource({\r\n params: () => ({ ...this.data.filters() }),\r\n stream: ({ params }) => this.data.endpoint(params),\r\n defaultValue: { items: [], total: 0 } as PaginatedItems<T>,\r\n });\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n readonly isLoading = computed(() => this.resource.isLoading());\r\n readonly options = computed(() => this.accumulatedItems());\r\n readonly total = computed(() => this.resource.value().total);\r\n readonly selectedCount = computed(() => this.selectedItems().length);\r\n\r\n // ─── Accumulate pages ──────────────────────────────────────────────────────\r\n /**\r\n * Only reads `resource.value()` — never `data.filters()`.\r\n *\r\n * When a query change or a new open resets to page 1 we call\r\n * `accumulatedItems.set([])` synchronously *before* updating the filter,\r\n * so by the time this effect fires with new data it always appends onto an\r\n * already-clean array. Reading `data.filters()` here would cause the effect\r\n * to run a second time (with stale resource data) the moment the page number\r\n * is incremented on scroll, duplicating items and making\r\n * `options().length >= total()` so `onScroll` would never fire again.\r\n */\r\n private readonly _accumEffect = effect(() => {\r\n const value = this.resource.value();\r\n this.accumulatedItems.update(acc => [...acc, ...value.items]);\r\n });\r\n\r\n constructor() {\r\n // Reset to page 1 when the sheet opens\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n /**\r\n * Debounce pipeline:\r\n * typed input → wait 400 ms → push into data.filters\r\n * _immediateQuery$ → no wait → push into data.filters (used by clearQuery)\r\n *\r\n * The merged stream has a final distinctUntilChanged so that an immediate\r\n * clear followed by the debounced '' 400 ms later does NOT fire twice.\r\n */\r\n merge(\r\n this._immediateQuery$,\r\n // skip(1) skips the initial BehaviorSubject-like emission from toObservable\r\n // so we don't re-fetch 400ms after the sheet opens with an empty query\r\n toObservable(this.query).pipe(skip(1), debounceTime(400), distinctUntilChanged()),\r\n )\r\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this._destroy))\r\n .subscribe(q => {\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, query: q, pageNumber: 1 }));\r\n });\r\n }\r\n\r\n // ─── Helpers ────────────────────────────────────────────────────────────────\r\n\r\n isSelected(item: T): boolean {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n return this.selectedItems().some(s => s[key] === val);\r\n }\r\n\r\n /**\r\n * Safe label: tries displayedLabel(item), falls back to String(item[valueKey]).\r\n * Works for both full objects and partials.\r\n */\r\n getLabel(item: Partial<T>): string {\r\n const cfg = this.data.config;\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n getAvatarText(item: Partial<T>): string {\r\n if (this.data.config.avatarText) {\r\n try { return this.data.config.avatarText(item as T); } catch { /* fall through */ }\r\n }\r\n return this.getLabel(item).charAt(0).toUpperCase();\r\n }\r\n\r\n // ─── Selection ──────────────────────────────────────────────────────────────\r\n\r\n toggleItem(item: T): void {\r\n if (this.data.config.disabled?.(item)) return;\r\n\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n\r\n if (this.data.multiple) {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n } else {\r\n // Remove any existing partial with the same key, then add the full object\r\n this.selectedItems.update(items => [\r\n ...items.filter(s => s[key] !== val),\r\n item,\r\n ]);\r\n }\r\n } else {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.set([]);\r\n } else {\r\n this.selectedItems.set([item]);\r\n this.confirm();\r\n }\r\n }\r\n }\r\n\r\n removeSelectedChip(item: Partial<T>): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n }\r\n\r\n // ─── Search ──────────────────────────────────────────────────────────────────\r\n\r\n onQueryInput(event: Event, container: HTMLElement): void {\r\n container.scrollTop = 0;\r\n // Only update the raw signal — the debounce subscription handles the rest\r\n this.query.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n clearQuery(inputEl: HTMLInputElement, container: HTMLElement): void {\r\n inputEl.value = '';\r\n container.scrollTop = 0;\r\n this.query.set('');\r\n // Emit on the immediate subject to bypass the 400 ms debounce\r\n this._immediateQuery$.next('');\r\n }\r\n\r\n // ─── Scroll ──────────────────────────────────────────────────────────────────\r\n\r\n onScroll(container: HTMLElement): void {\r\n if (this.isLoading()) return;\r\n const { scrollTop, clientHeight, scrollHeight } = container;\r\n if (\r\n scrollTop + clientHeight + 250 >= scrollHeight &&\r\n this.options().length < this.total()\r\n ) {\r\n this.data.filters.update(f => ({ ...f, pageNumber: f.pageNumber + 1 }));\r\n }\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\n confirm(): void {\r\n this._ref.dismiss(this.selectedItems());\r\n }\r\n\r\n reset(): void {\r\n this.selectedItems.set([]);\r\n }\r\n\r\n close(): void {\r\n this._ref.dismiss(undefined);\r\n }\r\n}\r\n","<div class=\"ps-bs\">\n\n <!-- ── Header ─────────────────────────────────────────────────────────────── -->\n <div class=\"ps-bs__header\">\n <div class=\"ps-bs__header-top\">\n <span class=\"ps-bs__title\">{{ data.title }}</span>\n <button mat-icon-button class=\"ps-bs__close-btn\" (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <!-- Search -->\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"ps-bs__search\">\n <mat-icon matPrefix>search</mat-icon>\n <input\n matInput\n #searchInput\n [value]=\"query() ?? ''\"\n [placeholder]=\"data.searchPlaceholder\"\n (input)=\"onQueryInput($event, optionsContainer)\"\n />\n @if (searchInput.value.length > 0) {\n <button matSuffix mat-icon-button (click)=\"clearQuery(searchInput, optionsContainer); $event.stopPropagation()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- Extra filters projection -->\n @if (data.extraFiltersTemplate) {\n <div class=\"ps-bs__extra-filters\">\n <ng-container *ngTemplateOutlet=\"data.extraFiltersTemplate\" />\n </div>\n }\n\n <!-- Selected chips (multiple mode) -->\n @if (data.multiple && selectedItems().length > 0) {\n <div class=\"ps-bs__selected-chips\">\n <mat-chip-set>\n @for (item of selectedItems(); track item[data.config.valueKey]) {\n <mat-chip (removed)=\"removeSelectedChip(item)\">\n {{ getLabel(item) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n }\n </mat-chip-set>\n </div>\n }\n </div>\n\n <!-- ── Progress bar ──────────────────────────────────────────────────────── -->\n <div class=\"ps-bs__progress\">\n @if (isLoading()) {\n <mat-progress-bar mode=\"indeterminate\" />\n }\n </div>\n\n <div class=\"ps-bs__options\" #optionsContainer (scroll)=\"onScroll(optionsContainer)\">\n @if (options().length === 0 && !isLoading()) {\n <div class=\"ps-bs__empty\">\n <mat-icon>search_off</mat-icon>\n <p>{{ data.noResultsMessage }}</p>\n </div>\n }\n\n @for (item of options(); track item[data.config.valueKey]; let last = $last) {\n @let disabled = data.config.disabled ? data.config.disabled(item) : false;\n @let selected = isSelected(item);\n\n <div\n class=\"ps-bs__option\"\n [class.ps-bs__option--selected]=\"selected\"\n [class.ps-bs__option--disabled]=\"disabled\"\n matRipple\n [matRippleDisabled]=\"disabled\"\n (click)=\"toggleItem(item)\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-selected]=\"selected\"\n role=\"option\"\n >\n <!-- Avatar -->\n <div class=\"ps-bs__option-avatar\" [class.ps-bs__option-avatar--selected]=\"selected\">\n @if (data.config.avatarText) {\n {{ getAvatarText(item) }}\n } @else if (data.config.avatarIcon) {\n <mat-icon>{{ data.config.avatarIcon }}</mat-icon>\n } @else {\n {{ getAvatarText(item) }}\n }\n </div>\n\n <!-- Content -->\n <div class=\"ps-bs__option-content\">\n @if (data.optionTemplate) {\n <ng-container *ngTemplateOutlet=\"data.optionTemplate; context: { $implicit: item }\" />\n } @else {\n <span class=\"ps-bs__option-label\">{{ getLabel(item) }}</span>\n @if (data.config.subtitle) {\n <span class=\"ps-bs__option-subtitle\">{{ data.config.subtitle(item) }}</span>\n }\n }\n </div>\n\n <!-- Check indicator -->\n @if (data.multiple) {\n <div class=\"ps-bs__option-check\">\n <mat-checkbox [checked]=\"selected\" [disabled]=\"disabled\" (click)=\"$event.preventDefault()\" />\n </div>\n } @else {\n @if (selected) {\n <mat-icon class=\"ps-bs__option-check-icon\">check</mat-icon>\n }\n }\n </div>\n\n @if (!last) {\n <mat-divider />\n }\n }\n </div>\n\n <!-- ── Footer ─────────────────────────────────────────────────────────────── -->\n <div class=\"ps-bs__footer\">\n <span class=\"ps-bs__footer-count\">\n @if (data.multiple) {\n {{ selectedCount() }} / {{ total() }}\n } @else {\n {{ total() }} resultados\n }\n </span>\n\n @if (data.multiple) {\n <div class=\"ps-bs__footer-actions\">\n @if (selectedCount() > 0) {\n <button matButton=\"outlined\" (click)=\"reset()\">{{ data.resetLabel }}</button>\n }\n <button matButton=\"filled\" color=\"primary\" (click)=\"confirm()\">{{ data.confirmLabel }}</button>\n </div>\n }\n </div>\n</div>","import {\r\n booleanAttribute,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule, MatChipEvent } from '@angular/material/chips';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter } from '../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../models/select-config';\r\nimport {\r\n NgxPaginatedSelectBottomSheetComponent,\r\n NgxPaginatedSelectBottomSheetData,\r\n} from './bottom-sheet/ngx-paginated-select-bottom-sheet.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-paginated-select.component.html',\r\n styleUrl: './ngx-paginated-select.component.scss',\r\n})\r\nexport class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnInit {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _bottomSheet = inject(MatBottomSheet);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n // ─── ViewChild ─────────────────────────────────────────────────────────────\r\n private readonly _matSelect = viewChild<MatSelect>('matSelect');\r\n\r\n // ─── Inputs ────────────────────────────────────────────────────────────────\r\n /** Label that floats on the form field */\r\n readonly label = input.required<string>();\r\n /** Title shown in the bottom sheet header */\r\n readonly title = input<string>('');\r\n /** Endpoint to fetch paginated data */\r\n readonly endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n /** Config for display and value binding */\r\n readonly config = input.required<PaginatedSelectConfig<T>>();\r\n /** Writable signal with the current filter state */\r\n readonly filters = input<WritableSignal<U>>(\r\n signal<U>({\r\n pageNumber: 1,\r\n pageSize: 25,\r\n query: undefined,\r\n sortBy: undefined,\r\n } as U)\r\n );\r\n /** FormControl to integrate with reactive forms */\r\n readonly control = input<FormControl>(new FormControl());\r\n /** Pre-selected items — accepts full objects OR partials with only the valueKey set */\r\n readonly selectedItems = input<Partial<T>[]>([]);\r\n /** Allow selecting multiple items */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Whether the component is disabled */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Show a clear button when items are selected */\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Controls how selected items are shown in the trigger:\r\n * - 'chips': a chip per selected item (default when multiple=true)\r\n * - 'text': a single comma-joined text line\r\n */\r\n readonly displayMode = input<'chips' | 'text'>('chips');\r\n /** Placeholder for the search input inside the bottom sheet */\r\n readonly searchPlaceholder = input<string>('Buscar...');\r\n /** Message when no results are found */\r\n readonly noResultsMessage = input<string>('No se encontraron resultados');\r\n /** Label for the confirm button (multiple mode) */\r\n readonly confirmLabel = input<string>('Confirmar');\r\n /** Label for the reset button (multiple mode) */\r\n readonly resetLabel = input<string>('Limpiar');\r\n /** Error message rendered inside mat-error */\r\n readonly error = input<string>('');\r\n /** Hint message rendered inside mat-hint */\r\n readonly hint = input<string>('');\r\n /** Custom template for each option row inside the bottom sheet */\r\n readonly optionTemplate = input<TemplateRef<{ $implicit: T }> | null>(null);\r\n /**\r\n * Optional template projected into the bottom sheet header (e.g. toggle filters).\r\n * Pass an `ng-template` reference from the consumer: `[extraFiltersTemplate]=\"myTpl\"`\r\n */\r\n readonly extraFiltersTemplate = input<TemplateRef<void> | null>(null);\r\n\r\n // ─── Outputs ───────────────────────────────────────────────────────────────\r\n /** Emits the full T object (single) or T[] (multiple) when selection changes */\r\n readonly valueChange = output<Partial<T> | Partial<T>[] | undefined>();\r\n /** Emits the raw array of selected items (may be partial if never confirmed) */\r\n readonly selectionChange = output<Partial<T>[]>();\r\n\r\n // ─── Internal state ────────────────────────────────────────────────────────\r\n protected _selectedItems = signal<Partial<T>[]>([]);\r\n protected _isDisabled = signal(false);\r\n protected _isOpen = signal(false);\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n protected readonly selectedLabel = computed(() => {\r\n const items = this._selectedItems();\r\n if (items.length === 0) return '';\r\n return items.map(i => this.getLabel(i)).join(', ');\r\n });\r\n\r\n /**\r\n * Safe label resolver: tries `displayedLabel(item)`, falls back to\r\n * `String(item[valueKey])` so partial objects never throw.\r\n */\r\n protected getLabel(item: Partial<T>): string {\r\n const cfg = this.config();\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n protected readonly hasSelection = computed(() => this._selectedItems().length > 0);\r\n\r\n /** ErrorStateMatcher that reflects the bound FormControl's touched+invalid state */\r\n protected readonly errorStateMatcher = computed((): ErrorStateMatcher => ({\r\n isErrorState: () => {\r\n const ctrl = this.control();\r\n return !!(ctrl && ctrl.invalid && ctrl.touched);\r\n },\r\n }));\r\n\r\n protected readonly showChips = computed(\r\n () => this.multiple() && this.displayMode() === 'chips'\r\n );\r\n\r\n constructor() {\r\n // Sync selectedItems input → internal state\r\n effect(() => {\r\n this._selectedItems.set(this.selectedItems());\r\n });\r\n\r\n // Sync disabled input → internal state\r\n effect(() => {\r\n const isDisabled = this.disabled();\r\n this._isDisabled.set(isDisabled);\r\n });\r\n\r\n // Sync selection → FormControl value + outputs\r\n effect(() => {\r\n const items = this._selectedItems();\r\n const key = this.config().valueKey as keyof T;\r\n\r\n if (this.multiple()) {\r\n // Use null instead of [] so Validators.required flags empty selection correctly\r\n this.control()?.setValue(items.length > 0 ? items.map(i => i[key]) : null);\r\n this.valueChange.emit(items);\r\n } else {\r\n this.control()?.setValue(items[0]?.[key] ?? null);\r\n this.valueChange.emit(items[0]);\r\n }\r\n this.selectionChange.emit(items);\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.disabled()) {\r\n this.control()?.disable();\r\n }\r\n }\r\n\r\n // ─── Bottom sheet ──────────────────────────────────────────────────────────\r\n\r\n openBottomSheet(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this._isDisabled()) return;\r\n\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._isOpen.set(true);\r\n\r\n const filtersSignal = this.filters();\r\n console.log('Current filters on open:', filtersSignal());\r\n filtersSignal.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n const data: NgxPaginatedSelectBottomSheetData<T, U> = {\r\n title: this.title() || this.label(),\r\n config: this.config(),\r\n endpoint: this.endpoint(),\r\n filters: filtersSignal,\r\n selectedItems: [...this._selectedItems()],\r\n multiple: this.multiple(),\r\n searchPlaceholder: this.searchPlaceholder(),\r\n noResultsMessage: this.noResultsMessage(),\r\n confirmLabel: this.confirmLabel(),\r\n resetLabel: this.resetLabel(),\r\n optionTemplate: this.optionTemplate(),\r\n extraFiltersTemplate: this.extraFiltersTemplate(),\r\n };\r\n\r\n this._bottomSheet\r\n .open<NgxPaginatedSelectBottomSheetComponent<T, U>, typeof data, Partial<T>[] | undefined>(\r\n NgxPaginatedSelectBottomSheetComponent,\r\n { data, panelClass: 'ngx-paginated-select-panel' }\r\n )\r\n .afterDismissed()\r\n .subscribe(result => {\r\n this._isOpen.set(false);\r\n if (result !== undefined) {\r\n this._selectedItems.set(result);\r\n }\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._cdr.detectChanges();\r\n });\r\n }\r\n\r\n // ─── Chip actions ──────────────────────────────────────────────────────────\r\n\r\n removeChip(item: Partial<T>, _event: MatChipEvent): void {\r\n const key = this.config().valueKey as keyof T;\r\n this._selectedItems.update(items => items.filter(i => i[key] !== item[key]));\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._cdr.detectChanges();\r\n }\r\n\r\n preventOpen(isOpen: boolean): void {\r\n if (isOpen) {\r\n this._matSelect()?.close();\r\n }\r\n }\r\n\r\n clearSelection(event: Event): void {\r\n event.stopPropagation();\r\n this._selectedItems.set([]);\r\n this.control()?.reset();\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._cdr.markForCheck();\r\n }\r\n}\r\n","<!-- ── Chips mode (multiple + displayMode = 'chips') ─────────────────────── -->\n@if (showChips()) {\n <mat-form-field\n appearance=\"outline\"\n floatLabel=\"always\"\n class=\"ps-trigger\"\n [class.ps-trigger--disabled]=\"_isDisabled()\"\n [class.ps-trigger--open]=\"_isOpen()\"\n (click)=\"openBottomSheet($event)\"\n >\n <mat-label>{{ label() }}</mat-label>\n\n <mat-chip-grid #chipGrid class=\"ps-trigger__chip-grid\" [formControl]=\"control()\">\n @for (item of _selectedItems(); track item[config().valueKey]) {\n <mat-chip-row\n class=\"ps-trigger__chip\"\n [disabled]=\"_isDisabled()\"\n (removed)=\"removeChip(item, $event)\"\n >\n {{ getLabel(item) }}\n <button matChipRemove [disabled]=\"_isDisabled()\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n\n <!-- Hidden input required for mat-chip-grid -->\n <input matInput [matChipInputFor]=\"chipGrid\" style=\"display: none\" readonly />\n\n <div matSuffix class=\"ps-trigger__suffix\">\n @if (clearable() && hasSelection() && !_isDisabled()) {\n <button matIconButton matSuffix (click)=\"clearSelection($event)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\n </div>\n\n @if (error()) {\n <mat-error>{{ error() }}</mat-error>\n }\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n </mat-form-field>\n}\n\n<!-- ── Text mode (single or multiple + displayMode = 'text') ─────────────── -->\n@if (!showChips()) {\n <mat-form-field\n appearance=\"outline\"\n floatLabel=\"always\"\n class=\"ps-trigger\"\n [class.ps-trigger--disabled]=\"_isDisabled()\"\n [class.ps-trigger--open]=\"_isOpen()\"\n (click)=\"openBottomSheet($event)\"\n >\n <mat-label>{{ label() }}</mat-label>\n\n <mat-select\n #matSelect\n class=\"ps-trigger__input\"\n [formControl]=\"control()\"\n [multiple]=\"multiple()\"\n style=\"pointer-events: none\"\n (openedChange)=\"preventOpen($event)\"\n >\n @for (item of _selectedItems(); track item[config().valueKey]) {\n <mat-option [value]=\"item[config().valueKey]\">{{ getLabel(item) }}</mat-option>\n }\n </mat-select>\n\n <div matSuffix class=\"ps-trigger__suffix\">\n @if (clearable() && hasSelection() && !_isDisabled()) {\n <button matIconButton matSuffix (click)=\"clearSelection($event)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\n </div>\n\n @if (error()) {\n <mat-error>{{ error() }}</mat-error>\n }\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n </mat-form-field>\n}\n\n\n","import { inject, Injectable, TemplateRef, Type } from \"@angular/core\";\r\nimport { MatDialog, MatDialogConfig } from \"@angular/material/dialog\";\r\nimport { DialogBodyConfig, DialogBodyType } from \"../models/dialog-config\";\r\nimport { Observable } from \"rxjs\";\r\nimport { NgxDialog } from \"../components\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxDialogService {\r\n // dependencies injection\r\n private readonly _dialog = inject(MatDialog);\r\n\r\n /**\r\n * \r\n * @param config\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens a text dialog with the provided configuration.\r\n */\r\n openText(\r\n config: {\r\n title: string;\r\n content: string;\r\n subtitle?: string;\r\n cancelText?: string;\r\n confirmText?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog, {\r\n ...dialogConfig,\r\n data: {\r\n ...config,\r\n body: {\r\n type: DialogBodyType.TEXT,\r\n content: config.content \r\n } satisfies DialogBodyConfig,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n\r\n /**\r\n * \r\n * @param title \r\n * @param message \r\n * @param cancelText\r\n * @param confirmText \r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens a confirmation dialog with cancel and confirm buttons.\r\n */\r\n confirm(config: {\r\n title: string;\r\n message: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n cancelText?: string;\r\n confirmText?: string;\r\n }, dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this.openText({\r\n title: config.title,\r\n content: config.message,\r\n subtitle: config.subtitle,\r\n icon : config.icon,\r\n iconColor : config.iconColor,\r\n cancelText : config.cancelText ?? 'Cancelar',\r\n confirmText : config.confirmText ?? 'Confirmar'\r\n }, dialogConfig);\r\n }\r\n\r\n /**\r\n * \r\n * @param title \r\n * @param message \r\n * @param confirmText\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens an informational dialog with a single confirm button. \r\n */\r\n info(\r\n config: {\r\n title: string;\r\n message: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n confirmText?: string;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this.openText({\r\n title: config.title,\r\n content: config.message,\r\n subtitle: config.subtitle,\r\n icon: config.icon,\r\n iconColor: config.iconColor,\r\n showCancel: false,\r\n confirmText: config.confirmText ?? 'Aceptar',\r\n }, dialogConfig);\r\n }\r\n\r\n /**\r\n * \r\n * @param config\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens an HTML dialog with the provided configuration.\r\n */\r\n html(\r\n config: {\r\n title: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n html: string;\r\n cancelText?: string;\r\n confirmText?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog, {\r\n ...dialogConfig,\r\n data: {\r\n ...config,\r\n body: {\r\n type: DialogBodyType.HTML,\r\n content: config.html\r\n } satisfies DialogBodyConfig,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n\r\n /**\r\n * \r\n * @param config\r\n * @return Observable<DialogResult>\r\n * \r\n * Opens a component dialog with the provided configuration.\r\n */\r\n component<T = any>(\r\n config: {\r\n title: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n component: Type<any>;\r\n componentData?: T;\r\n cancelText?: string;\r\n confirmText?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog<T>, {\r\n ...dialogConfig,\r\n data: {\r\n title: config.title,\r\n subtitle: config.subtitle,\r\n icon: config.icon,\r\n iconColor: config.iconColor,\r\n body: {\r\n type: DialogBodyType.COMPONENT,\r\n content: config.component,\r\n data: config.componentData\r\n } satisfies DialogBodyConfig<T>,\r\n cancelText: config.cancelText,\r\n confirmText: config.confirmText,\r\n showCancel: config.showCancel,\r\n showConfirm: config.showConfirm,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n\r\n /**\r\n * \r\n * @param config\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens a template dialog with the provided configuration.\r\n */\r\n template<T = any>(\r\n config: {\r\n title: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n template: TemplateRef<T>;\r\n templateData?: T;\r\n cancelText?: string;\r\n confirmText?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog<T>, {\r\n ...dialogConfig,\r\n data: {\r\n ...config,\r\n body: {\r\n type: DialogBodyType.TEMPLATE,\r\n content: config.template,\r\n data: config.templateData\r\n } satisfies DialogBodyConfig<T>,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i5","i7","i2","uuidv4","i1.NgxTablesIntl","i6","i9","i10","i12","i8","i11","i13"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-eiffage-material.mjs","sources":["../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.html","../../../projects/ngx-eiffage-material/src/lib/utils/string-operations.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.html","../../../projects/ngx-eiffage-material/src/lib/models/dialog-config.ts","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-tables.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-cell-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/pipes/only-upper-first-character.pipe.ts","../../../projects/ngx-eiffage-material/src/lib/models/paginated-table-config.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter-utils.ts","../../../projects/ngx-eiffage-material/src/lib/models/user-id-factory.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter.ts","../../../projects/ngx-eiffage-material/src/lib/services/advanced-filter.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/column-config.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/datos-pantalla.service.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.html","../../../projects/ngx-eiffage-material/src/lib/services/ngx-dialog.service.ts","../../../projects/ngx-eiffage-material/src/ngx-eiffage-material.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n input,\n output,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\n@Component({\n selector: 'ngx-loading-button',\n imports: [\n MatButtonModule,\n MatProgressSpinnerModule,\n MatIconModule,\n ],\n templateUrl: './ngx-loading-button.component.html',\n styleUrl: './ngx-loading-button.component.scss',\n})\nexport class NgxLoadingButton {\n isLoading = input.required<boolean>(); //Indica si el botón está cargando\n label = input.required<string>(); //Texto del botón\n matButton = input<'text' | 'filled' | 'elevated' | 'outlined' | 'tonal'>('filled'); //Tipo de botón\n type = input<'button' | 'submit' | 'reset'>('button'); //Tipo de acción del botón\n disabled = input<boolean>(false); //Indica si el botón está deshabilitado\n spinnerDiameter = input<number>(24) //Diameter del spinner de carga\n spinnerStrokeWidth = input<number>(3) //StrokeWidth del spinner de carga\n //Por defecto es Primary\n color = input<'secondary' | 'tertiary' | undefined>(undefined); //Color del botón\n\n /*\n No es necesario hacer el onClick, si queremos obtener un evento click,\n puedes hacerlo sobre la llamada al selector, es decir, sobre 'app-loading-button'\n */\n //onClick = output();\n}\n","<button\r\n class=\"loadingButton\"\r\n [matButton]=\"matButton()\"\r\n [type]=\"type()\"\r\n [disabled]=\"disabled() || isLoading()\"\r\n [class.isLoading]=\"isLoading()\"\r\n [class]=\"color() ?? ''\"\r\n>\r\n {{ label() }}\r\n</button>\r\n\r\n@if (isLoading()) {\r\n <mat-spinner\r\n class=\"spinnerLoadingButton\"\r\n [diameter]=\"spinnerDiameter()\"\r\n [strokeWidth]=\"spinnerStrokeWidth()\"\r\n />\r\n}\r\n","import {\n afterRenderEffect,\n ChangeDetectorRef,\n Component,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnInit,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'ngx-input-file',\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatProgressBarModule,\n MatChipsModule,\n MatTooltipModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatInputModule,\n ],\n templateUrl: './ngx-input-file.component.html',\n styleUrl: './ngx-input-file.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputFile),\n multi: true,\n },\n ],\n})\nexport class NgxInputFile implements OnInit {\n // dependencies injection\n private _cdr = inject(ChangeDetectorRef);\n\n\n value = signal<File[]>([]);\n onChangeCb?: (files: File[]) => void;\n onTouchCb?: () => void;\n\n label = input<string>('Seleccionar archivo');\n control = input.required<FormControl<File[]>>();\n disabled = input<boolean>(false);\n placeholder = input<string>('Haz click o arrastra archivos aquí');\n class = input<string>('');\n accept = input<string[]>([]);\n multiple = input<boolean>(false);\n hint = input<string>('');\n error = input<string>('');\n\n isDropping = signal(false);\n\n inputFileRef = viewChild<ElementRef>('inputFileRef');\n\n internalControl = new FormControl<string[]>([]);\n\n constructor() {\n afterRenderEffect(() => {\n const disabled = this.disabled();\n \n if (disabled && this.control().enabled) {\n this.control().disable({ emitEvent: false });\n this.internalControl.disable({ emitEvent: false });\n } else if (!disabled && this.control().disabled) {\n this.control().enable({ emitEvent: false });\n this.internalControl.enable({ emitEvent: false });\n }\n }); \n }\n\n private checkErrors() {\n if (this.control().invalid) {\n this.internalControl.setErrors(this.control().errors);\n } else {\n this.internalControl.setErrors(null);\n }\n this._cdr.markForCheck();\n }\n\n controlEffect = effect(() => {\n const value = this.value();\n // Usar untracked para evitar ciclos y emitEvent: false para no disparar eventos\n untracked(() => {\n this.control().setValue(value, { emitEvent: false });\n \n // Actualizar el control interno con strings (nombres de archivo)\n const fileNames = value.map(f => f.name);\n this.internalControl.setValue(fileNames, { emitEvent: false });\n \n this.checkErrors();\n this._cdr.markForCheck();\n });\n });\n\n ngOnInit(): void {\n if(this.disabled()) {\n this.control().disable();\n this.internalControl.disable();\n }\n }\n\n onContainerClick() {\n if (!this.disabled()) {\n this.control().markAsTouched();\n this.internalControl.markAsTouched();\n this.checkErrors();\n this._cdr.markForCheck();\n this.onTouchCb?.();\n this.inputFileRef()?.nativeElement.click();\n }\n }\n\n onInputchange(event: any) {\n const target: HTMLInputElement = event.target;\n const files: FileList | null = target.files;\n this.attachFiles(files);\n target.value = '';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n this.isDropping.set(true);\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n this.isDropping.set(false);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n this.isDropping.set(false);\n this.onTouchCb?.();\n if (!this.disabled()) {\n const files = event.dataTransfer?.files;\n // const validation = validateFiles(files, this.accept());\n\n this.attachFiles(files);\n }\n }\n\n attachFiles(files: FileList | null | undefined) {\n if (files && files.length > 0) {\n let newValue: File[];\n \n if (this.multiple()) {\n const currentFiles = this.value();\n const newFiles = Array.from(files);\n newValue = [...currentFiles, ...newFiles];\n } else {\n newValue = [files[0]];\n }\n \n this.value.set(newValue);\n this.onChangeCb?.(newValue);\n this.control().markAsTouched();\n this.internalControl.markAsTouched();\n this.control().markAsDirty();\n this.internalControl.markAsDirty();\n }\n }\n\n writeValue(files: File[] | undefined | null): void {\n this.value.set(files ?? []);\n }\n\n registerOnChange(fn: any): void {\n this.onChangeCb = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouchCb = fn;\n }\n\n onDeleteFileClick(file: File) {\n const newValue = this.value().filter((item) => item !== file);\n this.value.set(newValue);\n this.onChangeCb?.(newValue);\n this.control().markAsTouched();\n this.internalControl.markAsTouched();\n this.control().markAsDirty();\n this.internalControl.markAsDirty();\n }\n\n getAccept(): string {\n return this.accept().join();\n }\n\n bytesToMegaBytes(bytes: number): string {\n return (bytes / 1024 / 1024).toFixed(1);\n }\n}\n","<mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n (click)=\"onContainerClick()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n [class.dragover]=\"isDropping()\"\r\n>\r\n <mat-label>{{ label() }}</mat-label>\r\n <mat-chip-grid \r\n #chipGrid \r\n [formControl]=\"internalControl\"\r\n class=\"chips-grid\"\r\n >\r\n @for(file of value(); track file.name + $index) {\r\n <mat-chip-row\r\n (removed)=\"onDeleteFileClick(file)\"\r\n class=\"chip-item\"\r\n [title]=\"file.name\"\r\n >\r\n <div class=\"chip-content\">\r\n <span class=\"chip-label\">\r\n ({{ bytesToMegaBytes(file.size) }} MB) {{ file.name }}\r\n </span>\r\n </div>\r\n <button matChipRemove [attr.aria-label]=\"'Eliminar ' + file.name\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input \r\n #inputFileRef\r\n type=\"file\"\r\n [accept]=\"getAccept()\" \r\n [multiple]=\"multiple()\" \r\n (change)=\"onInputchange($event)\"\r\n [matChipInputFor]=\"chipGrid\"\r\n style=\"display: none\"\r\n /> \r\n <mat-hint>{{ isDropping() ? 'Arrastrar archivos aquí' : hint() }}</mat-hint>\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","export const includeNoSensible = (cadena: string, query: string): boolean => {\r\n const nomalizadoCadena = cadena\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n const nomalizadoQuery = query\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n return nomalizadoCadena.includes(nomalizadoQuery);\r\n};\r\n\r\nexport const base64ToUtf8 = (str: string): string => {\r\n return decodeURIComponent(\r\n atob(str)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n};\r\n","import { afterRenderEffect, Component, effect, ElementRef, input, OnInit, output, signal, untracked, viewChild } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelect, MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { BasicSelectConfig } from '../../models';\nimport { includeNoSensible } from '../../utils';\n\n@Component({\n selector: 'ngx-basic-select',\n imports: [\n MatInputModule,\n MatSelectModule,\n MatIconModule,\n MatButtonModule,\n MatFormFieldModule,\n ReactiveFormsModule,\n MatProgressSpinnerModule,\n],\n templateUrl: './ngx-basic-select.component.html',\n styleUrl: './ngx-basic-select.component.scss',\n})\nexport class NgxBasicSelect<T> {\n\n //inputs\n readonly label = input.required<string>();\n readonly options = input.required<T[]>();\n readonly basicSelectConfig = input.required<BasicSelectConfig<T>>();\n readonly control = input.required<FormControl>();\n readonly isLoading = input.required<boolean>();\n readonly placeholder = input<string>('');\n readonly appearance = input<'fill' | 'outline'>('fill');\n readonly multiple = input<boolean>(false);\n readonly disabled = input<boolean>(false);\n readonly clearable = input<boolean>(false);\n readonly error = input<string>('');\n readonly class = input<string>('');\n\n //outputs\n selectionChange = output<any>();\n\n //viewChilds\n readonly matSelect = viewChild.required<MatSelect>('matSelect');\n readonly searchInput = viewChild<ElementRef>('searchInput');\n\n constructor() {\n afterRenderEffect(() => {\n const disabled = this.disabled();\n const control = this.control();\n\n if (disabled && control.enabled) {\n control.disable({ emitEvent: false });\n } else if (!disabled && control.disabled) {\n control.enable({ emitEvent: false });\n }\n });\n }\n\n onOpenedChange(opened: boolean): void {\n if (opened) {\n this.onClearInputClick();\n setTimeout(() => {\n const panel = this.matSelect().panel?.nativeElement;\n if (panel) {\n panel.scrollTop = 0;\n }\n });\n }\n }\n\n includeInFilter(option: T, query: string): boolean {\n return includeNoSensible(String(this.basicSelectConfig().displayedLabel(option)), query);\n }\n\n onClearClick(): void {\n const newValue = this.multiple() ? [] : null;\n this.control().setValue(newValue, { emitEvent: true });\n this.control().markAsTouched();\n this.control().updateValueAndValidity();\n this.selectionChange.emit(newValue);\n }\n\n onSelectionChange(event: MatSelectChange): void {\n if(this.multiple()) {\n const values = event.value as T[];\n this.selectionChange.emit(values);\n } else {\n const value = event.value as T;\n this.selectionChange.emit(value);\n }\n }\n\n onClearInputClick(): void {\n const searchInputRef = this.searchInput();\n if (searchInputRef) {\n searchInputRef.nativeElement.value = '';\n searchInputRef.nativeElement.focus();\n }\n }\n}\n","\n<mat-form-field [appearance]=\"appearance()\" [className]=\"class()\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select \n #matSelect\n [formControl]=\"control()\"\n (selectionChange)=\"onSelectionChange($event)\"\n [multiple]=\"multiple()\"\n [placeholder]=\"placeholder()\"\n (openedChange)=\"onOpenedChange($event)\"\n >\n @if(!isLoading()) {\n <div class=\"searchFilter\">\n <mat-icon class=\"searchIcon\">search</mat-icon>\n <input \n matInput\n #searchInput \n type=\"text\"\n (keydown)=\"$event.stopPropagation()\"\n />\n <button matIconButton (click)=\"onClearInputClick(); searchInput.value = ''\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n @for(option of options(); track option[basicSelectConfig().valueKey]) {\n <mat-option \n [value]=\"option[basicSelectConfig().valueKey]\" \n [disabled]=\"basicSelectConfig().disabled ? basicSelectConfig().disabled?.(option) : false\"\n [style]=\"{ display: includeInFilter(option, searchInput.value) ? 'flex' : 'none' }\"\n > \n {{ basicSelectConfig().displayedLabel(option) }}\n </mat-option>\n }\n }\n </mat-select>\n @if(isLoading()) {\n <mat-icon matSuffix><mat-spinner diameter=\"20\" /></mat-icon>\n } @else if(clearable() && (multiple() ? control().value?.length : control().value)) {\n <mat-icon matSuffix (click)=\"onClearClick(); $event.stopPropagation()\">close</mat-icon>\n }\n <mat-error>{{ error() }}</mat-error>\n</mat-form-field>","import { TemplateRef, Type } from \"@angular/core\";\r\n\r\nexport enum DialogBodyType {\r\n TEXT = 'text',\r\n HTML = 'html',\r\n COMPONENT = 'component',\r\n TEMPLATE = 'template'\r\n}\r\n\r\nexport interface DialogBodyConfig<T = any> {\r\n type: DialogBodyType;\r\n content: string | Type<T> | TemplateRef<any>;\r\n data?: T;\r\n}\r\n\r\nexport interface DialogConfig<T = any> {\r\n title: string;\r\n icon?: string;\r\n iconColor?: string;\r\n subtitle?: string;\r\n body: DialogBodyConfig<T>;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n cancelText?: string;\r\n confirmText?: string;\r\n}","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[ngxDynamicHost]'\r\n})\r\nexport class DynamicHostDirective<T> {\r\n private _vcr = inject(ViewContainerRef);\r\n private _currentRef: ComponentRef<any> | null = null;\r\n\r\n component = input<Type<any>>();\r\n data = input<T>();\r\n\r\n constructor() {\r\n effect(() => {\r\n const componentType = this.component();\r\n \r\n // 1. Gestión de la creación/destrucción del componente\r\n if (!componentType) {\r\n this._vcr.clear();\r\n this._currentRef = null;\r\n return;\r\n }\r\n\r\n // Si el componente es diferente al que tenemos, lo recreamos\r\n if (this._currentRef?.componentType !== componentType) {\r\n this._vcr.clear();\r\n this._currentRef = this._vcr.createComponent(componentType);\r\n }\r\n \r\n // 2. Actualización de datos (siempre, tanto si es nuevo como si ya existía)\r\n const data = this.data();\r\n if (this._currentRef && data !== undefined) {\r\n // La forma correcta de setear un input en Angular moderno\r\n this._currentRef.setInput('data', data); \r\n }\r\n });\r\n }\r\n}","import { Component, inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { DialogBodyType, DialogConfig } from '../../models/dialog-config';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DynamicHostDirective } from '../../directives';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\n\r\n@Component({\r\n selector: 'ngx-dialog',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDividerModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n CommonModule,\r\n DynamicHostDirective \r\n ],\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrl: './ngx-dialog.component.scss',\r\n})\r\nexport class NgxDialog<T = any> { \r\n //dependencies injection\r\n private _dialogRef = inject(MatDialogRef<NgxDialog>);\r\n private _data = inject<DialogConfig<T>>(MAT_DIALOG_DATA);\r\n\r\n readonly title = this._data.title;\r\n readonly icon = this._data.icon;\r\n readonly iconColor = this._data.iconColor;\r\n readonly subtitle = this._data.subtitle;\r\n readonly body = this._data.body;\r\n readonly showCancel = this._data.showCancel ?? true;\r\n readonly showConfirm = this._data.showConfirm ?? true;\r\n readonly cancelText = this._data.cancelText ?? 'Cancelar';\r\n readonly confirmText = this._data.confirmText ?? 'Aceptar';\r\n\r\n DialogBodyType = DialogBodyType;\r\n\r\n onCancelClick(): void {\r\n this._dialogRef.close(false);\r\n }\r\n\r\n onConfirmClick(): void {\r\n this._dialogRef.close(true);\r\n }\r\n}\r\n","<h2 mat-dialog-title class=\"title\">\r\n {{ title }}\r\n @if(icon) {\r\n <mat-icon \r\n [style.color]=\"iconColor\"\r\n class=\"icon\"\r\n >\r\n {{ icon }}\r\n </mat-icon>\r\n }\r\n</h2>\r\n<mat-dialog-content>\r\n @if(subtitle) {\r\n <p class=\"subtitle\">{{ subtitle }}</p>\r\n <mat-divider />\r\n }\r\n\r\n <div class=\"content\">\r\n @switch (body.type) {\r\n @case (DialogBodyType.TEXT) {\r\n <p>{{ body.content }}</p>\r\n }\r\n @case (DialogBodyType.HTML) {\r\n <div [innerHTML]=\"body.content\"></div>\r\n }\r\n @case (DialogBodyType.COMPONENT) {\r\n <ng-container \r\n ngxDynamicHost \r\n [component]=\"$any(body.content)\"\r\n [data]=\"body.data\"\r\n />\r\n }\r\n @case (DialogBodyType.TEMPLATE) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"$any(body.content)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: body.data }\"\r\n />\r\n }\r\n }\r\n </div>\r\n\r\n</mat-dialog-content>\r\n<mat-dialog-actions align=\"end\" class=\"matDialogActionsCustomGap\">\r\n @if(showCancel) {\r\n <button matButton=\"outlined\" (click)=\"onCancelClick()\">\r\n {{ cancelText }}\r\n </button>\r\n }\r\n @if(showConfirm) {\r\n <button matButton=\"filled\" (click)=\"onConfirmClick()\">\r\n {{ confirmText }}\r\n </button>\r\n }\r\n</mat-dialog-actions>\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTablesIntl {\r\n /**\r\n * Stream que emite cuando las etiquetas cambian.\r\n * Los componentes deben reaccionar a estos cambios.\r\n */\r\n readonly changes = new Subject<void>();\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-TABLE ===\r\n // ========================================\r\n\r\n // === Botones de acciones ===\r\n /** Etiqueta del botón de crear/nuevo */\r\n createButtonLabel: string = 'Nuevo';\r\n\r\n /** Tooltip del botón de editar */\r\n editTooltip: string = 'Editar';\r\n\r\n /** Tooltip del botón de eliminar */\r\n deleteTooltip: string = 'Eliminar';\r\n\r\n /** Etiqueta del botón de confirmar eliminación */\r\n confirmDeleteLabel: string = 'Eliminar';\r\n\r\n // === Búsqueda y filtros ===\r\n /** Placeholder del campo de búsqueda */\r\n searchPlaceholder: string = 'Buscar...';\r\n\r\n /** Tooltip del botón de limpiar búsqueda */\r\n clearSearchTooltip: string = 'Limpiar búsqueda';\r\n\r\n /** Tooltip del botón de editar columnas */\r\n editColumnsTooltip: string = 'Visualizar y ordenar columnas';\r\n\r\n /** Etiqueta para filtros avanzados */\r\n advancedFiltersLabel: string = 'Filtros avanzados';\r\n\r\n /** Etiqueta para nuevo filtro avanzado */\r\n newAdvancedFilterLabel: string = 'Nuevo filtro';\r\n\r\n /** Tooltip del botón de editar filtro avanzado - usa función getEditAdvancedFilterTooltip() */\r\n editAdvancedFilterTooltip: string = 'Editar filtro';\r\n\r\n /** Tooltip del botón de eliminar filtro avanzado - usa función getDeleteAdvancedFilterTooltip() */\r\n deleteAdvancedFilterTooltip: string = 'Eliminar filtro';\r\n\r\n /** Tooltip del botón de quitar filtro avanzado aplicado */\r\n removeAdvancedFilterTooltip: string = 'Quitar filtros avanzados';\r\n\r\n /** Texto cuando no hay filtros avanzados */\r\n noAdvancedFiltersLabel: string = 'No hay filtros guardados';\r\n\r\n /** Etiqueta para quitar filtro en select */\r\n removeFilterLabel: string = '-- Quitar filtro --';\r\n\r\n // === Selección de filas ===\r\n /** Tooltip del checkbox de seleccionar todas las filas */\r\n selectAllTooltip: string = 'Seleccionar todo';\r\n\r\n /** Tooltip del checkbox de deseleccionar todas las filas */\r\n deselectAllTooltip: string = 'Deseleccionar todo';\r\n\r\n /** Etiqueta del botón de deseleccionar todos */\r\n deselectAllLabel: string = 'Desmarcar todos los registros';\r\n\r\n /** Tooltip del menú de acciones de selección */\r\n selectionActionsTooltip: string = 'Operaciones sobre los registros seleccionados';\r\n\r\n // === Exportación ===\r\n /** Tooltip del botón de exportar */\r\n exportTooltip: string = 'Exportar datos';\r\n\r\n /** Etiqueta para exportar a Excel */\r\n exportToExcelLabel: string = 'Exportar a XLSX la página actual';\r\n\r\n /** Etiqueta para exportar a PDF */\r\n exportToPdfLabel: string = 'Exportar a PDF la página actual';\r\n\r\n // === Pantalla completa ===\r\n /** Tooltip para entrar en pantalla completa */\r\n enterFullscreenTooltip: string = 'Pantalla completa';\r\n\r\n /** Tooltip para salir de pantalla completa */\r\n exitFullscreenTooltip: string = 'Salir del modo de pantalla completa';\r\n\r\n // === Mensajes ===\r\n /** Mensaje cuando no hay datos */\r\n noDataMessage: string = 'No se han encontrado resultados...';\r\n\r\n /** Mensaje mientras se cargan los datos */\r\n loadingMessage: string = 'Cargando...';\r\n\r\n /** Título del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmTitle: string = 'Eliminar';\r\n\r\n /** Cuerpo del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmBody: string = 'Vas a eliminar el registro seleccionado. ¿Estas seguro?';\r\n\r\n /** Título del diálogo de eliminación de filtro avanzado */\r\n deleteAdvancedFilterTitle: string = 'Eliminar plantilla de filtro avanzado';\r\n\r\n // === Columnas ===\r\n /** Etiqueta para la columna de acciones */\r\n actionsLabel: string = 'Acciones';\r\n\r\n // === Filtros de columna ===\r\n /** Placeholder para filtros de fecha */\r\n datePlaceholder: string = 'Fecha';\r\n\r\n /** Placeholder para filtro de rango de fechas - inicio */\r\n dateRangeStartPlaceholder: string = 'Desde';\r\n\r\n /** Placeholder para filtro de rango de fechas - fin */\r\n dateRangeEndPlaceholder: string = 'Hasta';\r\n\r\n // === Filas expandibles ===\r\n /** Tooltip para expandir detalles */\r\n expandDetailsTooltip: string = 'Ver detalles';\r\n\r\n /** Tooltip para contraer detalles */\r\n collapseDetailsTooltip: string = 'Ocultar detalles';\r\n\r\n // === Totales en pie de tabla ===\r\n /** Etiqueta para total por página */\r\n totalPerPageLabel: string = 'Total parcial (por página)';\r\n\r\n /** Etiqueta para total general */\r\n totalGeneralLabel: string = 'Total (todos los registros)';\r\n\r\n // === Diálogos ===\r\n /** Botón de cancelar en diálogos */\r\n cancelButtonLabel: string = 'Cancelar';\r\n\r\n /** Botón de confirmar en diálogos */\r\n confirmButtonLabel: string = 'Confirmar';\r\n\r\n /** Botón de cerrar en diálogos */\r\n closeButtonLabel: string = 'Cerrar';\r\n\r\n /** Botón de guardar en diálogos */\r\n saveButtonLabel: string = 'Guardar';\r\n\r\n /** Botón de guardar y aplicar en diálogos */\r\n saveAndApplyButtonLabel: string = 'Guardar y aplicar';\r\n\r\n // === Diálogo de configurar columnas ===\r\n /** Título del diálogo de configurar columnas */\r\n configureColumnsTitle: string = 'Ordenar y visualizar columnas de la tabla';\r\n\r\n /** Tooltip para anclar columna */\r\n pinColumnTooltip: string = 'Anclar columna';\r\n\r\n /** Tooltip para desanclar columna */\r\n unpinColumnTooltip: string = 'Desanclar';\r\n\r\n /** Tooltip para subir columna */\r\n moveUpTooltip: string = 'Subir';\r\n\r\n /** Tooltip para bajar columna */\r\n moveDownTooltip: string = 'Bajar';\r\n\r\n /** Texto para columnas con filtros aplicados */\r\n hasFiltersAppliedText: string = '(hay filtros aplicados)';\r\n\r\n /** Nota sobre ocultar columnas con filtros */\r\n hideColumnWithFiltersNote: string = 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados';\r\n\r\n /** Etiqueta de nota */\r\n noteLabel: string = 'Nota:';\r\n\r\n /** Botón de restablecer configuración de columnas */\r\n resetColumnsButtonLabel: string = 'Reestablecer orden y visualización';\r\n\r\n // === Diálogo de filtros avanzados ===\r\n /** Título del diálogo de filtros avanzados */\r\n advancedFiltersDialogTitle: string = 'Filtros avanzados para la tabla';\r\n\r\n /** Label del campo de nombre de plantilla */\r\n templateNameLabel: string = 'Nombre de la plantilla';\r\n\r\n /** Error de nombre obligatorio */\r\n templateNameRequiredError: string = 'El nombre es obligatorio';\r\n\r\n /** Título de ayuda de filtros avanzados */\r\n advancedFiltersHelpTitle: string = 'Uso de filtros avanzados';\r\n\r\n /** Texto de ayuda sobre grupos */\r\n advancedFiltersGroupHelp: string = 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos';\r\n\r\n /** Texto de ayuda sobre filtros */\r\n advancedFiltersRuleHelp: string = 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)';\r\n\r\n /** Label de grupo en ayuda */\r\n groupLabel: string = 'Grupo:';\r\n\r\n /** Label de filtro en ayuda */\r\n filterLabel: string = 'Filtro:';\r\n\r\n /** Botón añadir filtro */\r\n addFilterButtonLabel: string = 'Añadir filtro';\r\n\r\n /** Botón añadir grupo */\r\n addGroupButtonLabel: string = 'Añadir grupo';\r\n\r\n /** Tooltip eliminar grupo */\r\n deleteGroupTooltip: string = 'Eliminar grupo';\r\n\r\n /** Tooltip eliminar filtro */\r\n deleteFilterTooltip: string = 'Eliminar filtro';\r\n\r\n // === Reglas de filtros avanzados ===\r\n /** Label de campo */\r\n fieldLabel: string = 'Campo';\r\n\r\n /** Label de condición */\r\n conditionLabel: string = 'Condición';\r\n\r\n /** Label de valor */\r\n valueLabel: string = 'Valor';\r\n\r\n /** Placeholder de seleccionar opción */\r\n selectOptionPlaceholder: string = 'Selecciona una opción';\r\n\r\n /** Opción para quitar campo */\r\n removeFieldOption: string = '-- Quitar campo --';\r\n\r\n /** Opción para quitar condición */\r\n removeConditionOption: string = '-- Quitar condición --';\r\n\r\n /** Opción para quitar valor */\r\n removeValueOption: string = '-- Quitar valor --';\r\n\r\n /** Error de campo obligatorio */\r\n requiredFieldError: string = 'Obligatorio';\r\n\r\n // === Conectores y operadores de filtros ===\r\n /** Conector AND */\r\n connectorAnd: string = 'Y';\r\n\r\n /** Conector OR */\r\n connectorOr: string = 'O';\r\n\r\n /** Operador igual a */\r\n operatorEquals: string = 'Igual a';\r\n\r\n /** Operador distinto de */\r\n operatorNotEquals: string = 'Distinto de';\r\n\r\n /** Operador mayor que */\r\n operatorGreaterThan: string = 'Mayor que';\r\n\r\n /** Operador mayor o igual que */\r\n operatorGreaterOrEquals: string = 'Mayor o igual que';\r\n\r\n /** Operador menor que */\r\n operatorLessThan: string = 'Menor que';\r\n\r\n /** Operador menor o igual que */\r\n operatorLessOrEquals: string = 'Menor o igual que';\r\n\r\n /** Operador contiene */\r\n operatorLike: string = 'Contiene';\r\n\r\n // ========================================\r\n // === NGX-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Mensaje cuando no hay resultados en select */\r\n noResultsMessage: string = 'No se han encontrado resultados...';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Etiqueta del botón de ver más resultados */\r\n showMoreLabel: string = 'Ver más';\r\n\r\n // ========================================\r\n // === FUNCIONES AUXILIARES ===\r\n // ========================================\r\n\r\n /**\r\n * Función para obtener el mensaje de confirmación de eliminación\r\n * @param itemName Nombre del elemento a eliminar (opcional)\r\n */\r\n getDeleteConfirmMessage(itemName?: string): string {\r\n if (itemName) {\r\n return `Vas a eliminar '${itemName}'. ¿Estas seguro?`;\r\n }\r\n return this.deleteConfirmBody;\r\n }\r\n\r\n /**\r\n * Función para obtener el mensaje de eliminación de filtro avanzado\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterMessage(filterName: string): string {\r\n return `Vas a eliminar la plantilla de filtro avanzado '${filterName}'. ¿Estas seguro?`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de editar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getEditAdvancedFilterTooltip(filterName: string): string {\r\n return `Editar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de eliminar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterTooltip(filterName: string): string {\r\n return `Eliminar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el label de elementos seleccionados\r\n * @param count Número de elementos seleccionados\r\n */\r\n getSelectedItemsLabel(count: number): string {\r\n return count === 1\r\n ? `${count} elemento seleccionado`\r\n : `${count} elementos seleccionados`;\r\n }\r\n\r\n /**\r\n * Función para obtener el texto de quitar selección en selects\r\n * @param optionName Nombre de la opción (opcional)\r\n */\r\n getRemoveOptionText(optionName: string): string {\r\n return `-- Quitar ${optionName} --`;\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-confirm-dialog',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-confirm-dialog.component.html',\r\n styleUrl: './ngx-confirm-dialog.component.scss'\r\n})\r\nexport class NgxConfirmDialogComponent {\r\n dialogRef = inject(MatDialogRef<NgxConfirmDialogComponent>);\r\n data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\r\n intl = inject(NgxTablesIntl);\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content>\r\n @if(data.body) {\r\n <p>{{data.body}}</p>\r\n }\r\n \r\n @if (data.template) {\r\n <ng-container *ngTemplateOutlet=\"data.template; context: { $implicit: data.row }\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"false\">{{ data.denyButtonLabel ?? intl.cancelButtonLabel }}</button>\r\n <button matButton [mat-dialog-close]=\"true\">{{ data.confirmButtonLabel ?? intl.confirmButtonLabel }}</button>\r\n</mat-dialog-actions>","import { Directive, effect, inject, input, signal, Type, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxDynamicCellHost]',\r\n})\r\nexport class DynamicCellHostDirective<T> {\r\n vcr = inject(ViewContainerRef);\r\n\r\n component = input<Type<any>>();\r\n row = input<T>();\r\n key = input<keyof T>();\r\n\r\n effect = effect(() => {\r\n const component = this.component();\r\n const row = this.row();\r\n const key = this.key();\r\n\r\n if (component) {\r\n const compRef = this.vcr.createComponent(component);\r\n\r\n if (row && key) {\r\n compRef.instance.row = signal(row);\r\n compRef.instance.key = signal(key);\r\n }\r\n }\r\n });\r\n}\r\n","import { Pipe, type PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngxOnlyUpperFirstCharacter',\r\n})\r\nexport class OnlyUpperFirstCharacterPipe implements PipeTransform {\r\n\r\n transform(value: string): string {\r\n if (!value)\r\n return '';\r\n\r\n value = value.toLowerCase();\r\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\r\n }\r\n\r\n}\r\n","import { PipeTransform, TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\nimport jsPDF from \"jspdf\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PaginatedFilter } from \"./paginated-filter\";\r\nimport { PaginatedItems } from \"./paginated-items\";\r\n\r\nexport type FilterType = 'number' | 'text' | 'option' | 'option-multiple' | 'date' | 'date-range';\r\n\r\n//IMPORTANTE Si se añade aqui un color, hay que añadirlo tambien en paginated-table.component.scss\r\nexport type RowActionIconColor = 'Yellow' | 'Orange' | 'Pink' | 'Purple' | 'Green' | 'Blue' | 'Sky' | 'Brown';\r\n\r\nexport interface PaginatedTableConfig<T> {\r\n tableId: string;\r\n primaryKey: keyof T | Array<keyof T>;\r\n title: () => string;\r\n columns: PaginatedTableColumn<T>[];\r\n showQueryFilter?: boolean; //Filtro query para toda la tabla\r\n queryFilterPlaceholder?: string; //Placeholder del filtro query para toda la tabla\r\n create?: TableBasicAction<T>;\r\n update?: TableBasicAction<T>;\r\n clickOnRowForUpdate?: boolean; //Si esto se pone a true (desaparece el icono de acciones de update y toda la columna es el update) => Si expandableDetail true, esto se cancela y el editar se pone en acciones\r\n delete?: TableBasicAction<T>;\r\n deleteConfirm?: DeleteConfirm<T>;\r\n rowActions?: TableRowAction<T>[];\r\n showAdvancedFilters?: boolean;\r\n expandableDetail?: boolean;\r\n expandableDetailTemplateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n enableRowSelection?: boolean;\r\n rowSelectionAction?: RowSelectionAction<T>[]; //Para poner botones que actuen frente a una seleccion multiple,\r\n exportFileName?: () => string;\r\n mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;\r\n pdfConfig?: jsPDF;\r\n maxHeight?: string;\r\n defaultStickyColumn?: keyof T;\r\n showActions?: () => boolean; //Para mostrar o no la columna de acciones, en caso de que se tengan acciones de fila o clickOnRowForUpdate, esta propiedad se pondrá a true automaticamente, pero si no se quieren mostrar las acciones, se puede poner a false esta propiedad. En caso de que clickOnRowForUpdate sea true y expandableDetail sea true, entonces clickOnRowForUpdate se cancelará y las acciones de editar se pondrán en acciones de fila, por lo que en ese caso, showActions se pondrá a true automaticamente. Si se quieren ocultar las acciones en ese caso, habrá que poner showActions a false.\r\n}\r\n\r\n/*\r\n PRIORIDAD DE CREACION DE LA VISTA \r\n 1 => componente\r\n 2 => template\r\n 3 => valueGetter\r\n 4 => valor de la columna por defecto aplicando pipes (en caso de que se especifiquen)\r\n*/\r\nexport interface PaginatedTableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n isSortable?: boolean; //Los datos de la columna se pueden ordenar\r\n filterType?: FilterType; //Los datos de la columna se pueden filtrar\r\n filterOptions?: FilterOption[]; //En caso de filterType = option o filterType = option-multiple entonces, se pintara un select y habra que mandar las opciones\r\n endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;\r\n filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;\r\n component?: Type<any>; //Para crear la vista desde un component\r\n templateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n valueGetter?: (row: T) => string;\r\n pipes?: ColumnPipe | ColumnPipe[];\r\n showTotalPerPage?: boolean;\r\n showTotalGeneral?: boolean;\r\n getTotalGeneral?: () => number;\r\n totalFooterFormatter?: (total: number) => string;\r\n style?: string;\r\n footerStyle?: string;\r\n}\r\n\r\nexport interface TableBasicAction<T> {\r\n show?: (row?: T) => boolean;\r\n disabled?: (row?: T) => boolean;\r\n tooltip?: (row?: T) => string;\r\n}\r\n\r\nexport interface TableRowAction<T> {\r\n id: string;\r\n show?: (row: T) => boolean;\r\n disabled?: (row: T) => boolean;\r\n icon: string;\r\n iconColor?: RowActionIconColor;\r\n tooltip: (row: T) => string;\r\n}\r\n\r\nexport interface FilterOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport function isFilterOption(obj: unknown): obj is FilterOption {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'value' in obj &&\r\n 'label' in obj &&\r\n typeof (obj as any).value === 'string' &&\r\n typeof (obj as any).label === 'string'\r\n );\r\n}\r\n\r\nexport interface ColumnPipe {\r\n pipe: PipeTransform;\r\n args?: any[];\r\n}\r\n\r\nexport interface DeleteConfirm<T> {\r\n title: (row: T) => string;\r\n body?: (row: T) => string;\r\n templateRef?: () => TemplateRef<{ $implicit: T }>;\r\n}\r\n\r\nexport interface RowSelectionAction<T> {\r\n id: string;\r\n icon: string;\r\n label: (row: T[], totalSelected: number) => string;\r\n}","import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ColumnValue } from \"./column-value\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isFilterOption, PaginatedTableColumn } from \"./paginated-table-config\";\r\nimport { DynamicFilter } from \"./dynamic-filter\";\r\nimport { AdvancedFilter, FilterGroup, FilterRule, FilterConnector, FilterOperator } from \"./advanced-filter\";\r\nimport { NgxTablesIntl } from \"../i18n\";\r\n\r\nexport class AdvancedFilterUtils {\r\n static createAdvancedFilter = <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>): FormGroup => {\r\n return fb.group({\r\n name: [advancedFilter.name, Validators.required],\r\n groups: fb.array(advancedFilter.groups.map(g => this.createFilterGroup(fb, g)))\r\n });\r\n }\r\n\r\n static createFilterGroup = <T>(fb: FormBuilder, group: FilterGroup<T>): FormGroup => {\r\n return fb.group({\r\n id: [group.id ?? uuidv4()],\r\n connector: [group.connector, Validators.required],\r\n filters: fb.array(group.filters.map(f => {\r\n return this.isFilterGroup<T>(f)\r\n ? this.createFilterGroup(fb, f)\r\n : this.createFilterRule(fb, f);\r\n }), [Validators.required])\r\n });\r\n }\r\n\r\n static createFilterRule = <T>(fb: FormBuilder, rule: FilterRule<T>): FormGroup => {\r\n return fb.group({\r\n id: [rule.id ?? uuidv4()],\r\n key: [rule.key ?? null, Validators.required],\r\n operator: [rule.operator ?? null, Validators.required],\r\n value: [rule.value ?? null, Validators.required]\r\n });\r\n }\r\n\r\n static isFilterGroup = <T>(obj: any): obj is FilterGroup<T> => {\r\n return obj &&\r\n typeof obj === 'object' &&\r\n 'connector' in obj &&\r\n 'filters' in obj;\r\n }\r\n\r\n private static isFilterRule<T>(obj: any): obj is FilterRule<T> {\r\n return obj && typeof obj === 'object' && 'key' in obj;\r\n }\r\n\r\n static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>) {\r\n const groupFound = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (groupFound) {\r\n const filters = groupFound.get('filters') as FormArray;\r\n const formGroup = this.createFilterGroup(fb, group);\r\n filters.push(formGroup);\r\n }\r\n }\r\n\r\n static deleteGroup<T>(form: FormGroup, groupId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, groupId);\r\n }\r\n\r\n static addRuleToGroup = <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => {\r\n const group = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (group) {\r\n const filters = group.get('filters') as FormArray;\r\n const formRule = this.createFilterRule(fb, rule);\r\n filters.push(formRule);\r\n }\r\n }\r\n\r\n static deleteRule<T>(form: FormGroup, ruleId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, ruleId);\r\n }\r\n\r\n private static deleteByIdRecursive(array: FormArray, id: string): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n const control = array.at(i) as FormGroup;\r\n\r\n // Si el id coincide, eliminar directamente (da igual si es rule o group)\r\n if (control.get('id')?.value === id) {\r\n array.removeAt(i);\r\n return true;\r\n }\r\n\r\n // Si es un grupo, seguir buscando dentro de sus filtros\r\n const filters = control.get('filters');\r\n if (filters instanceof FormArray) {\r\n const deleted = this.deleteByIdRecursive(filters, id);\r\n if (deleted) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n static findGroupFormById(array: FormArray, id: string): FormGroup | null {\r\n for (const control of array.controls) {\r\n const group = control as FormGroup;\r\n if (group.get('id')?.value === id)\r\n return group;\r\n\r\n const filters = group.get('filters') as FormArray;\r\n if (filters) {\r\n const found = this.findGroupFormById(filters, id);\r\n if (found)\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isFilterGroupForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('connector') &&\r\n group.contains('filters')\r\n );\r\n }\r\n\r\n /*static isFilterRuleForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('key') &&\r\n group.contains('operator') &&\r\n group.contains('value') &&\r\n !group.contains('filters')\r\n );\r\n }*/\r\n\r\n static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T> {\r\n return {\r\n name: form.get('name')?.value,\r\n groups: (form.get('groups') as FormArray).controls\r\n .map(g => this.mapFormGroupToFilterGroup<T>(g as FormGroup))\r\n .filter(g => this.isNonEmptyGroup(g))\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterGroup<T>(groupForm: FormGroup): FilterGroup<T> {\r\n const id = groupForm.get('id')?.value as string;\r\n const connector = groupForm.get('connector')?.value as FilterConnector;\r\n const filtersArray = groupForm.get('filters') as FormArray;\r\n\r\n const filters = filtersArray.controls\r\n .map(control => {\r\n const value = control.value;\r\n if ('filters' in value)\r\n return this.mapFormGroupToFilterGroup<T>(control as FormGroup);\r\n else\r\n return this.mapFormGroupToFilterRule<T>(control as FormGroup);\r\n })\r\n .filter(f => this.isNonEmptyFilter(f));\r\n\r\n return {\r\n id: id,\r\n connector: connector,\r\n filters: filters\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterRule<T>(ruleForm: FormGroup): FilterRule<T> {\r\n return {\r\n id: ruleForm.get('id')?.value,\r\n key: ruleForm.get('key')?.value,\r\n operator: ruleForm.get('operator')?.value,\r\n value: ruleForm.get('value')?.value\r\n };\r\n }\r\n\r\n private static isNonEmptyFilter<T>(filter: FilterRule<T> | FilterGroup<T>): boolean {\r\n if (this.isFilterGroup(filter))\r\n return this.isNonEmptyGroup(filter);\r\n\r\n return this.isNonEmptyRule(filter);\r\n }\r\n\r\n private static isNonEmptyGroup<T>(group: FilterGroup<T>): boolean {\r\n return Array.isArray(group.filters) && group.filters.some(f => this.isNonEmptyFilter(f));\r\n }\r\n\r\n private static isNonEmptyRule<T>(rule: FilterRule<T>): boolean {\r\n return !!(rule.key && rule.operator && rule.value !== undefined && rule.value !== null && rule.value !== '');\r\n }\r\n\r\n static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string {\r\n return this.groupToHtml(groups[0], columns, intl);\r\n //return groups.map(g => this.groupToString(g)).join(' OR ');\r\n }\r\n\r\n private static groupToHtml<T>(group: FilterGroup<T>, columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string {\r\n const connectorLabel = group.connector === 'AND' ? intl.connectorAnd : intl.connectorOr;\r\n const connector = ` <strong>${connectorLabel}</strong> `;\r\n\r\n const parts = group.filters.map(filter => {\r\n if (this.isFilterGroup<T>(filter))\r\n return `<strong>[ </strong>${this.groupToHtml(filter, columns, intl)}<strong> ]</strong>`;\r\n else\r\n return this.ruleToHtml(filter, columns, intl);\r\n });\r\n\r\n return parts.join(connector);\r\n }\r\n\r\n private static ruleToHtml<T>(rule: FilterRule<T>, columns: PaginatedTableColumn<T>[], intl: NgxTablesIntl): string {\r\n const column = columns.find(column => column.key == rule.key);\r\n\r\n if (!column)\r\n return \"\";\r\n\r\n const key = `<i>${column.label}</i>`;\r\n const operator = rule.operator ? this.getOperatorLabel(rule.operator, intl).toLowerCase() : '';\r\n //const operator = rule.operator ?? '';\r\n const value = this.valueToHtml(rule.value, column);\r\n return `${key} ${operator} \"${value}\"`;\r\n }\r\n\r\n private static getOperatorLabel(operator: FilterOperator, intl: NgxTablesIntl): string {\r\n const operatorLabels: Record<FilterOperator, string> = {\r\n '=': intl.operatorEquals,\r\n '<>': intl.operatorNotEquals,\r\n '>': intl.operatorGreaterThan,\r\n '>=': intl.operatorGreaterOrEquals,\r\n '<': intl.operatorLessThan,\r\n '<=': intl.operatorLessOrEquals,\r\n 'LIKE': intl.operatorLike\r\n };\r\n return operatorLabels[operator];\r\n }\r\n\r\n private static valueToHtml<T>(value: ColumnValue, column: PaginatedTableColumn<T>): string {\r\n switch (column.filterType) {\r\n case 'option':\r\n case 'option-multiple':\r\n if (isFilterOption(value))\r\n return value.label;\r\n\r\n const optionSelected = column.filterOptions?.find(option => option.value == value);\r\n return optionSelected?.label ?? '';\r\n case 'date':\r\n case 'date-range':\r\n const pipe = new DatePipe('es-ES');\r\n return pipe.transform(value as string, 'dd/MM/yyyy') ?? '';\r\n }\r\n\r\n return value as string;\r\n }\r\n\r\n static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[] {\r\n const result: DynamicFilter<T>[] = [];\r\n\r\n for (const group of advancedFilter.groups) {\r\n result.push(...this.mapGroupToDynamicFilters(group));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static mapGroupToDynamicFilters<T>(group: FilterGroup<T>): DynamicFilter<T>[] {\r\n const filters: DynamicFilter<T>[] = [];\r\n\r\n for (const f of group.filters) {\r\n if (this.isFilterGroup<T>(f)) {\r\n filters.push(...this.mapGroupToDynamicFilters(f));\r\n } else if (this.isFilterRule<T>(f) && f.key && f.operator && f.value !== undefined && f.value !== null) {\r\n filters.push({\r\n campo: f.key,\r\n operador: f.operator,\r\n valor: f.value?.toString(),\r\n conector: group.connector,\r\n grupo: group.id ?? 'root'\r\n });\r\n }\r\n }\r\n\r\n return filters;\r\n }\r\n\r\n\r\n static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T> {\r\n return {\r\n ...filter,\r\n groups: filter.groups.map(group => this.normalizeGroupForBackend(group))\r\n };\r\n }\r\n\r\n private static normalizeGroupForBackend<T>(group: FilterGroup<T>): FilterGroup<T> {\r\n return {\r\n ...group,\r\n filters: group.filters.map(f => {\r\n if (this.isFilterGroup(f)) {\r\n return this.normalizeGroupForBackend(f);\r\n }\r\n\r\n return this.normalizeRuleForBackend(f);\r\n })\r\n };\r\n }\r\n\r\n private static normalizeRuleForBackend<T>(rule: FilterRule<T>): FilterRule<T> {\r\n if (isFilterOption(rule.value)) {\r\n return {\r\n ...rule,\r\n value: rule.value.value\r\n };\r\n }\r\n\r\n return rule;\r\n }\r\n}\r\n","import { InjectionToken, Signal } from \"@angular/core\";\r\n\r\nexport const USER_ID_FACTORY = new InjectionToken<Signal<string | null | undefined>>('USER_ID_FACTORY');","import { FilterOption, FilterType } from \"./paginated-table-config\";\r\nimport { ColumnValue } from \"../models/column-value\";\r\n\r\nexport type FilterConnector = 'AND' | 'OR';\r\n\r\nexport type FilterOperator = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'LIKE';\r\n\r\nexport interface AdvancedFilter<T> {\r\n name: string;\r\n groups: FilterGroup<T>[];\r\n}\r\n\r\nexport interface FilterGroup<T> {\r\n id?: string;\r\n connector: FilterConnector;\r\n filters: (FilterRule<T> | FilterGroup<T>)[];\r\n}\r\n\r\nexport interface FilterRule<T> {\r\n id?: string;\r\n key?: keyof T;\r\n operator?: FilterOperator;\r\n value?: ColumnValue;\r\n}\r\n\r\nexport const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]> = {\r\n number: ['=', '<>', '>', '>=', '<', '<='],\r\n text: ['=', 'LIKE', '<>'],\r\n option: ['=', '<>'],\r\n 'option-multiple': ['=', '<>'], //Actuara como un option\r\n date: ['=', '<>', '>', '>=', '<', '<='],\r\n 'date-range': ['=', '<>', '>', '>=', '<', '<='] //Actuara como un date normal\r\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { USER_ID_FACTORY } from '../models';\r\nimport { AdvancedFilter } from '../models/advanced-filter';\r\nimport { AdvancedFilterUtils } from '../models/advanced-filter-utils';\r\nimport { DynamicFilter } from '../models/dynamic-filter';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdvancedFilterService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG = 'advanced_filter';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG}_${userId}`;\r\n });\r\n\r\n private _advancedFilters = signal<Record<string, AdvancedFilter<any>[]>>({});\r\n advancedFilters = this._advancedFilters.asReadonly();\r\n\r\n private setAdvancedFiltersEffect = effect(() => {\r\n this.setAdvancedFilter();\r\n });\r\n\r\n constructor() {\r\n this.setAdvancedFilter();\r\n }\r\n\r\n private setAdvancedFilter() {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const recordAdvancedFitler = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordAdvancedFitler) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const advancedFilters: Record<string, AdvancedFilter<any>[]> = JSON.parse(recordAdvancedFitler);\r\n\r\n this._advancedFilters.set(advancedFilters);\r\n }\r\n\r\n saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const index = currentArray.findIndex(f => f.groups[0].id === advancedFilter.groups[0].id);\r\n let newArray: AdvancedFilter<any>[];\r\n if (index >= 0) { //Si existe, lo reemplazamos\r\n newArray = [...currentArray];\r\n newArray[index] = advancedFilter;\r\n } else { // Si no existe, lo añadimos\r\n newArray = [...currentArray, advancedFilter];\r\n }\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const newArray = currentArray.filter(f => f.groups[0].id !== advancedFilter.groups[0].id);\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend: boolean = true): AdvancedFilter<any> | undefined {\r\n const allAdvancedFiltersByTable = this._advancedFilters()[tableId];\r\n\r\n if (!allAdvancedFiltersByTable)\r\n return undefined;\r\n\r\n const advancedFilter = allAdvancedFiltersByTable.find(advancedFilter => {\r\n return advancedFilter.groups?.[0].id !== undefined && advancedFilter.groups[0].id == advancedFilterId;\r\n });\r\n\r\n if (!normalizeForBackend)\r\n return advancedFilter;\r\n\r\n if (!advancedFilter)\r\n return undefined;\r\n\r\n return AdvancedFilterUtils.normalizeAdvancedFilterForBackend(advancedFilter);\r\n }\r\n\r\n getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[] {\r\n const advancedFilter = this.getAdvancedFilterById(tableId, advancedFilterId);\r\n\r\n if (!advancedFilter)\r\n return [];\r\n\r\n return AdvancedFilterUtils.mapToDynamicFilter(advancedFilter);\r\n }\r\n}\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { ColumnConfig } from '../models/configure-table-column-data';\r\nimport { USER_ID_FACTORY } from '../models';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColumnConfigService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG = 'column_config';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_COLUMN_CONFIG}_${userId}`;\r\n });\r\n\r\n private _columnConfigs = signal<Record<string, ColumnConfig<any>[]>>({});\r\n columnConfigs = this._columnConfigs.asReadonly();\r\n\r\n private setColumnConfigEffect = effect(() => {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const recordColumnConfig = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordColumnConfig) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const columnConfigs: Record<string, ColumnConfig<any>[]> = JSON.parse(recordColumnConfig);\r\n\r\n this._columnConfigs.set(columnConfigs);\r\n });\r\n\r\n saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue = {\r\n ...currentValue,\r\n [tableId]: columnConfig\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteColumnConfig(tableId: string): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue: Record<string, ColumnConfig<any>[]> = { ...currentValue };\r\n delete newValue[tableId];\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n","import { Injectable, Signal } from '@angular/core';\r\nimport { fromEvent, map, startWith } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { Pantalla } from '../models/pantalla';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatosPantallaService {\r\n\r\n pantalla: Signal<Pantalla | undefined> = toSignal(\r\n fromEvent(window, 'resize').pipe(\r\n startWith(this.obtenerDatosPantalla()),\r\n map(() => this.obtenerDatosPantalla())\r\n )\r\n );\r\n\r\n private obtenerDatosPantalla(): Pantalla {\r\n let pantalla: Pantalla = {\r\n tipo: 'escritorio',\r\n ancho: window.innerWidth,\r\n alto: window.innerHeight\r\n }\r\n\r\n if (pantalla.ancho < 600) {\r\n pantalla.tipo = 'movil';\r\n return pantalla;\r\n }\r\n\r\n if (pantalla.ancho < 950) {\r\n pantalla.tipo = 'tablet';\r\n return pantalla;\r\n }\r\n\r\n return pantalla;\r\n }\r\n\r\n}\r\n","import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { DateRange } from '@angular/material/datepicker';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport moment from 'moment';\r\nimport { ConfigureTableColumnData, ColumnConfig } from '../../../models/configure-table-column-data';\r\nimport { ColumnConfigService } from '../../../services/column-config.service';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\nimport { isFilterOption } from '../../../models';\r\n\r\n@Component({\r\n selector: 'lib-configure-table-columns',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatIconModule,\r\n MatSlideToggleModule,\r\n CdkDropList,\r\n CdkDrag,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './configure-table-columns.component.html',\r\n styleUrl: './configure-table-columns.component.scss',\r\n})\r\nexport class ConfigureTableColumnsComponent<T> {\r\n columnConfigService = inject(ColumnConfigService);\r\n dialogRef = inject(MatDialogRef<ConfigureTableColumnsComponent<T>>);\r\n data = inject<ConfigureTableColumnData<T>>(MAT_DIALOG_DATA);\r\n intl = inject(NgxTablesIntl);\r\n columns = signal(this.data.columns);\r\n isConfirmDisabled = computed(() => {\r\n const allDisabled = this.columns().every(column => !column.show);\r\n const someHasFilter = this.columns().some(column => this.hasFilterAndDisabled(column));\r\n return allDisabled || someHasFilter;\r\n });\r\n\r\n startAnimationTimeout?: number = undefined;\r\n endAnimationTimeout?: number = undefined;\r\n animationTime: number = 250;\r\n animationIndex = signal<number | undefined>(undefined);\r\n\r\n hasFilterAndDisabled(column: ColumnConfig<T>): boolean {\r\n const value = this.data.filtersValue[column.key];\r\n if (Array.isArray(value))\r\n return value.length > 0 && !column.show;\r\n\r\n if (typeof value === 'string')\r\n return value.length > 0 && !column.show;\r\n\r\n if (value instanceof DateRange)\r\n return (value.start != null || value.end != null) && !column.show;\r\n\r\n if (moment.isMoment(value))\r\n return !column.show;\r\n\r\n if (isFilterOption(value))\r\n return !column.show;\r\n\r\n return false;\r\n }\r\n\r\n onUpClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index > 0) {\r\n [cols[index - 1], cols[index]] = [cols[index], cols[index - 1]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDownClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index < cols.length - 1) {\r\n [cols[index], cols[index + 1]] = [cols[index + 1], cols[index]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<any, any, any>) {\r\n const cols = [...this.columns()];\r\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\r\n this.columns.set(cols);\r\n }\r\n\r\n onToggleChange(columnClicked: ColumnConfig<T>) {\r\n this.columns.update(value => {\r\n return value.map(column => {\r\n if (column.key == columnClicked.key)\r\n return { ...column, show: !column.show };\r\n else\r\n return column;\r\n });\r\n });\r\n }\r\n\r\n onPinClick(columnConfig: ColumnConfig<T>, index: number) {\r\n const columns = [...this.columns()];\r\n const currentSticky = columns.find(c => c.isSticky);\r\n\r\n if (columnConfig.key == currentSticky?.key) {\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: false\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n return;\r\n }\r\n\r\n clearTimeout(this.startAnimationTimeout);\r\n clearTimeout(this.endAnimationTimeout);\r\n this.animationIndex.set(undefined);\r\n\r\n this.animationIndex.set(index);\r\n\r\n this.startAnimationTimeout = setTimeout(() => {\r\n moveItemInArray(columns, index, 0);\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: c.key == columnConfig.key\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n this.animationIndex.set(0);\r\n this.endAnimationTimeout = setTimeout(() => this.animationIndex.set(undefined), this.animationTime)\r\n }, this.animationTime);\r\n }\r\n\r\n onConfirmClick() {\r\n this.columnConfigService.saveColumnConfig(this.data.tableId, this.columns());\r\n this.dialogRef.close();\r\n }\r\n\r\n onResetClick() {\r\n this.columnConfigService.deleteColumnConfig(this.data.tableId);\r\n this.dialogRef.close();\r\n }\r\n}\r\n","<h2 mat-dialog-title>{{intl.configureColumnsTitle}} {{data.tableName| lowercase}}</h2>\r\n<mat-dialog-content>\r\n\r\n <div class=\"columnsList\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n @for (column of columns(); track $index; let first = $first; let last = $last;) {\r\n <div \r\n class=\"columnContainer\" \r\n cdkDrag \r\n [class.pinned]=\"$index == animationIndex()\"\r\n [style]=\"{ transition: `background-color ${animationTime}ms ease` }\">\r\n\r\n <div class=\"labelContainer\">\r\n <mat-icon>drag_indicator</mat-icon>\r\n <p class=\"label\">\r\n {{data.columnsLabels[column.key] ?? ''}}\r\n @if(hasFilterAndDisabled(column)) {\r\n <span> {{intl.hasFiltersAppliedText}}</span>\r\n }\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button \r\n matIconButton\r\n [matTooltip]=\"column.isSticky ? intl.unpinColumnTooltip : intl.pinColumnTooltip\"\r\n (click)=\"onPinClick(column, $index)\">\r\n <mat-icon>{{column.isSticky ? 'keep_off' : 'keep'}}</mat-icon>\r\n </button>\r\n\r\n <button [matTooltip]=\"intl.moveUpTooltip\" matIconButton [disabled]=\"$first\" (click)=\"onUpClick($index)\"><mat-icon>keyboard_arrow_up</mat-icon></button>\r\n <button [matTooltip]=\"intl.moveDownTooltip\" matIconButton [disabled]=\"$last\" (click)=\"onDownClick($index)\"><mat-icon>keyboard_arrow_down</mat-icon></button>\r\n <mat-slide-toggle [checked]=\"column.show\" (toggleChange)=\"onToggleChange(column)\"></mat-slide-toggle>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p class=\"note\"><span>{{intl.noteLabel}}</span> {{intl.hideColumnWithFiltersNote}}</p>\r\n \r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{intl.closeButtonLabel}}</button>\r\n <button matButton (click)=\"onResetClick()\">{{intl.resetColumnsButtonLabel}}</button>\r\n <button matButton [disabled]=\"isConfirmDisabled()\" (click)=\"onConfirmClick()\">{{intl.confirmButtonLabel}}</button>\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, effect, ElementRef, inject, input, OnDestroy, Optional, output, signal, viewChild, WritableSignal } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule,\r\n MatProgressBarModule\r\n ],\r\n templateUrl: './ngx-paginated-searchable-select.component.html',\r\n styleUrl: './ngx-paginated-searchable-select.component.scss',\r\n})\r\nexport class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements OnDestroy {\r\n\r\n // Inyectar el servicio de internacionalización (opcional para permitir override)\r\n public readonly intl: NgxTablesIntl;\r\n\r\n control = input<FormControl | undefined>();\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n } as U\r\n )\r\n );\r\n optionLabel = input<((option: T) => string)>(\r\n (o: T) => {\r\n if (isFilterOption(o))\r\n return o.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n compareWith = input<(o1: T, o2: T) => boolean>(\r\n (o1: T, o2: T) => {\r\n if (!o2)\r\n return false;\r\n\r\n if (isFilterOption(o1) && isFilterOption(o2))\r\n return o1.value == o2.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n //Estos input/output se utiliza por si no se quiere utilizar el componente select buscable dentro de un formulario\r\n selected = input<T | T[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<T | T[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n private queryTimeout: number | undefined = undefined;\r\n private readonly debounceTime = 300;\r\n\r\n constructor(@Optional() intl: NgxTablesIntl | null) {\r\n this.intl = intl ?? inject(NgxTablesIntl);\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const selected = this.selected();\r\n const control = this.control();\r\n const disabled = this.disabled();\r\n const innerControl = control ? control : new FormControl({ value: selected, disabled: disabled });\r\n this.innerControl.set(innerControl);\r\n });\r\n\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n\r\n protected options = signal<T[]>([]);\r\n\r\n setOptions = effect(() => {\r\n const paginatedRecords = this.dataResource.value();\r\n const pageNumber = this.filters()().pageNumber;\r\n\r\n if (!paginatedRecords)\r\n return;\r\n\r\n if (pageNumber > 1)\r\n this.options.update((oldValue: T[]) => [...oldValue, ...paginatedRecords.items]);\r\n else\r\n this.options.set(paginatedRecords.items);\r\n });\r\n /*protected options = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.records;\r\n });*/\r\n\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n this.onQueryChange();\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected onQueryChange() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n const query = searcher.nativeElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime);\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<T | T[] | undefined>) {\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected optionsSelectedForView(): T[] {\r\n const innerControl = this.innerControl();\r\n\r\n if (!innerControl.value)\r\n return [];\r\n\r\n if (Array.isArray(innerControl.value))\r\n return innerControl.value;\r\n\r\n return [innerControl.value];\r\n };\r\n\r\n protected onMoreClick() {\r\n this.filters().update((value: U) => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageNumber + 1\r\n };\r\n });\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{ selectLabel() }}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\"\r\n [compareWith]=\"compareWith()\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || intl.searchPlaceholder }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\"\r\n [value]=\"filters()().query ?? ''\" \r\n (input)=\"onQueryChange()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\" />\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ intl.getRemoveOptionText(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option [value]=\"option\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Es MUY importante que estos vayan los ultimos (al final de todas las opciones). -->\r\n @for (option of optionsSelectedForView(); track $index) {\r\n <mat-option [value]=\"option\" class=\"hideOption\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Si es multiple, como no esta el option de resetear, si filtran y no hay opciones, y luego cierran el select el desplegable no se abre y queda inutilizado, por eso, ponemos esta opcion dummy, que siempre esta oculta, y no hace nada, pero ya hace que haya un item, y el desplegable se abra -->\r\n @if(multiple()) {\r\n <mat-option class=\"hideOption\" dummyOption></mat-option>\r\n }\r\n\r\n @if (total() == 0) {\r\n <p class=\"withoutResults\">{{ intl.noResultsMessage }}</p>\r\n }\r\n\r\n @if((filters()().pageNumber * filters()().pageSize) < total() && !dataResource.isLoading()) {\r\n <button matButton=\"text\" class=\"showMore\" (click)=\"onMoreClick()\">\r\n {{ intl.showMoreLabel }}\r\n </button>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","import { Component, effect, ElementRef, inject, input, OnInit, Optional, output, signal, viewChild } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n\r\n@Component({\r\n selector: 'ngx-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-searchable-select.component.html',\r\n styleUrl: './ngx-searchable-select.component.scss',\r\n})\r\nexport class SearchableSelectComponent<T> {\r\n\r\n // Inyectar el servicio de internacionalización (opcional para permitir override)\r\n public readonly intl: NgxTablesIntl;\r\n\r\n control = input<FormControl | undefined>();\r\n options = input.required<T[]>();\r\n optionLabel = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n optionValue = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionValue\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n //Estos input/output se utiliza por si no se quiere utilizar el componente select buscable dentro de un formulario\r\n selected = input<string | string[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<string | string[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n constructor(@Optional() intl: NgxTablesIntl | null) {\r\n this.intl = intl ?? inject(NgxTablesIntl);\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const selected = this.selected();\r\n const control = this.control();\r\n const disabled = this.disabled();\r\n const innerControl = control ? control : new FormControl({ value: selected, disabled: disabled });\r\n this.innerControl.set(innerControl);\r\n });\r\n\r\n protected openedChange(open: boolean) {\r\n /*if (open)\r\n this.cleanQuery();*/\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n setTimeout(() => {\r\n searcher.nativeElement.focus();\r\n });\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected showOption(option: T): boolean {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const label = this.optionLabel()(option);\r\n return includeNoSensible(label, query);\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<string | string[] | undefined>) {\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected numberOfResults(): number {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const optionLabel = this.optionLabel();\r\n const results = this.options().filter((option) => {\r\n const label = optionLabel(option);\r\n return includeNoSensible(label, query);\r\n });\r\n return results.length;\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{selectLabel()}}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || intl.searchPlaceholder }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ intl.getRemoveOptionText(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option \r\n [value]=\"optionValue()(option)\"\r\n [class.hideOption]=\"!showOption(option)\">\r\n {{optionLabel()(option)}}\r\n </mat-option>\r\n }\r\n\r\n @if (numberOfResults() == 0) {\r\n <p class=\"withoutResults\">{{ intl.noResultsMessage }}</p>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{error()}}</mat-error>\r\n</mat-form-field>","import { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { PaginatedTableConfig, OPERATOR_BY_FILTER_TYPE, FilterOperator, FilterType, PaginatedTableColumn, FilterOption, PaginatedFilter } from '../../../models';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../../../components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../../../components/ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-rule',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatTooltipModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './advanced-filter-rule.component.html',\r\n styleUrl: './advanced-filter-rule.component.scss',\r\n})\r\nexport class AdvancedFilterRuleComponent<T> {\r\n rule = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n deleteFilter = output<string>();\r\n\r\n intl = inject(NgxTablesIntl);\r\n columns = computed(() => this.config().columns.filter(column => column.filterType != undefined));\r\n operatorByFilterType = OPERATOR_BY_FILTER_TYPE;\r\n \r\n filterOperatorLabel = computed<Record<FilterOperator, string>>(() => ({\r\n '=': this.intl.operatorEquals,\r\n '<>': this.intl.operatorNotEquals,\r\n '>': this.intl.operatorGreaterThan,\r\n '>=': this.intl.operatorGreaterOrEquals,\r\n '<': this.intl.operatorLessThan,\r\n '<=': this.intl.operatorLessOrEquals,\r\n 'LIKE': this.intl.operatorLike\r\n }));\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n getRuleId(): string {\r\n return (this.rule().get('id')! as FormControl).value;\r\n }\r\n\r\n getKey(): FormControl {\r\n return this.rule().get('key')! as FormControl\r\n }\r\n\r\n getOperator(): FormControl {\r\n return this.rule().get('operator')! as FormControl\r\n }\r\n\r\n getValue(): FormControl {\r\n return this.rule().get('value')! as FormControl\r\n }\r\n\r\n getColumnSelected(value: keyof T): PaginatedTableColumn<T> | undefined {\r\n return this.columns().find(column => column.key == value);\r\n }\r\n\r\n getOperatorsOption(value: keyof T): FilterOperator[] {\r\n const columnSelected = this.getColumnSelected(value);\r\n\r\n if (!columnSelected || !columnSelected.filterType)\r\n return [];\r\n\r\n return this.operatorByFilterType[columnSelected.filterType];\r\n }\r\n\r\n getFilterType(value: keyof T): FilterType | undefined {\r\n const columnSelected = this.getColumnSelected(value);\r\n return columnSelected?.filterType;\r\n }\r\n\r\n onKeyChange(_?: string | string[]) {\r\n this.getOperator().setValue(null);\r\n this.getValue().setValue(null);\r\n }\r\n\r\n keyOptionLabel = (column: PaginatedTableColumn<T>): string => column.label\r\n keyOptionValue = (column: PaginatedTableColumn<T>): string => column.key as string\r\n\r\n operatorOptionLabel = (filterOperator: FilterOperator): string => this.filterOperatorLabel()[filterOperator];\r\n operatorOptionValue = (filterOperator: FilterOperator): string => filterOperator;\r\n}\r\n\r\n","<button \r\n matIconButton \r\n [matTooltip]=\"intl.deleteFilterTooltip\" \r\n (click)=\"deleteFilter.emit(getRuleId())\"\r\n class=\"deleteButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n</button>\r\n\r\n<ngx-searchable-select\r\n [control]=\"getKey()\"\r\n [options]=\"columns()\"\r\n [optionLabel]=\"keyOptionLabel\"\r\n [optionValue]=\"keyOptionValue\"\r\n (optionChange)=\"onKeyChange($event)\"\r\n [selectLabel]=\"intl.fieldLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n/>\r\n\r\n<ngx-searchable-select\r\n [control]=\"getOperator()\"\r\n [options]=\"getOperatorsOption(getKey().value)\"\r\n [optionLabel]=\"operatorOptionLabel\"\r\n [optionValue]=\"operatorOptionValue\"\r\n [selectLabel]=\"intl.conditionLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n/>\r\n\r\n@if (getFilterType(getKey().value) == 'text' || getFilterType(getKey().value) == 'number') {\r\n <mat-form-field>\r\n <mat-label>{{intl.valueLabel}}</mat-label>\r\n <input [formControl]=\"getValue()\" [type]=\"getFilterType(getKey().value) ?? 'text'\" matInput>\r\n <mat-error>{{intl.requiredFieldError}}</mat-error>\r\n </mat-form-field>\r\n}\r\n\r\n@if (getFilterType(getKey().value) == 'option' || getFilterType(getKey().value) == 'option-multiple') {\r\n @if(getColumnSelected(getKey().value)?.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select \r\n [control]=\"getValue()\"\r\n [endpoint]=\"getColumnSelected(getKey().value)!.endpointForPaginatedFilterOptions!\"\r\n [filters]=\"getColumnSelected(getKey().value)!.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [selectLabel]=\"intl.valueLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n [control]=\"getValue()\"\r\n [options]=\"getColumnSelected(getKey().value)?.filterOptions ?? []\"\r\n [selectLabel]=\"intl.valueLabel\"\r\n [selectPlaceholder]=\"intl.selectOptionPlaceholder\"\r\n [error]=\"intl.requiredFieldError\"\r\n />\r\n }\r\n}\r\n\r\n@if(getFilterType(getKey().value) == 'date' || getFilterType(getKey().value) == 'date-range') {\r\n <mat-form-field>\r\n <mat-label>{{intl.valueLabel}}</mat-label>\r\n <input\r\n [formControl]=\"getValue()\"\r\n matInput \r\n [matDatepicker]=\"picker\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n <mat-error>{{intl.requiredFieldError}}</mat-error>\r\n </mat-form-field>\r\n}\r\n\r\n\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PaginatedTableConfig, FilterOption } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { DatosPantallaService } from '../../../services/datos-pantalla.service';\r\nimport { AdvancedFilterRuleComponent } from '../advanced-filter-rule/advanced-filter-rule.component';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-group',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n AdvancedFilterRuleComponent,\r\n MatButtonToggleModule,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './advanced-filter-group.component.html',\r\n styleUrl: './advanced-filter-group.component.scss',\r\n})\r\nexport class AdvancedFilterGroupComponent<T> {\r\n isRootNode = input.required<boolean>();\r\n group = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n addGroup = output<string>();\r\n addFilter = output<string>();\r\n deleteGroup = output<string>();\r\n deleteFilter = output<string>();\r\n\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n intl = inject(NgxTablesIntl);\r\n isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n optionsFilterConnector = computed<FilterOption[]>(() => [\r\n { value: 'AND', label: this.intl.connectorAnd },\r\n { value: 'OR', label: this.intl.connectorOr }\r\n ]);\r\n\r\n isFilterGroupForm(group: AbstractControl): boolean {\r\n return AdvancedFilterUtils.isFilterGroupForm(group);\r\n }\r\n\r\n getConnector(): FormControl {\r\n return this.group().get('connector')! as FormControl\r\n }\r\n\r\n getGroupId(): string {\r\n return (this.group().get('id')! as FormControl).value;\r\n }\r\n\r\n getFilters(): FormGroup[] {\r\n return (this.group().get('filters') as FormArray).controls as FormGroup[];\r\n }\r\n}\r\n","<div class=\"grupo\" [formGroup]=\"group()\">\r\n \r\n <mat-button-toggle-group [formControl]=\"getConnector()\">\r\n @for (option of optionsFilterConnector(); track option.value) {\r\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\r\n }\r\n </mat-button-toggle-group>\r\n\r\n @if (isDesktop()) {\r\n <button \r\n matButton=\"outlined\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n {{intl.addFilterButtonLabel}}\r\n </button>\r\n\r\n <button \r\n matButton=\"outlined\"\r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n {{intl.addGroupButtonLabel}}\r\n </button>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.addFilterButtonLabel\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.addGroupButtonLabel\" \r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n </button>\r\n }\r\n \r\n\r\n @if(!isRootNode()) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.deleteGroupTooltip\" \r\n (click)=\"deleteGroup.emit(getGroupId())\"\r\n class=\"deleteGroupButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (group of getFilters(); track $index) {\r\n @if(isFilterGroupForm(group)) {\r\n <lib-advanced-filter-group \r\n [group]=\"group\"\r\n [config]=\"config()\"\r\n [isRootNode]=\"false\"\r\n (addGroup)=\"addGroup.emit($event)\"\r\n (addFilter)=\"addFilter.emit($event)\"\r\n (deleteGroup)=\"deleteGroup.emit($event)\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n } @else {\r\n <lib-advanced-filter-rule \r\n [rule]=\"group\"\r\n [config]=\"config()\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n }\r\n }\r\n\r\n</div>","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { FilterGroup, FilterRule } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { ConfigureAdvancedFilterData } from '../../../models/configure-advanced-filter-data';\r\nimport { AdvancedFilterService } from '../../../services/advanced-filter.service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SendType } from '../../../models/send-type';\r\nimport { AdvancedFilterGroupComponent } from '../advanced-filter-group/advanced-filter-group.component';\r\nimport { NgxTablesIntl } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-configure-advanced-filter',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n AdvancedFilterGroupComponent\r\n ],\r\n templateUrl: './configure-advanced-filter.component.html',\r\n styleUrl: './configure-advanced-filter.component.scss',\r\n})\r\nexport class ConfigureAdvancedFilterComponent<T> { \r\n private readonly fb = inject(FormBuilder);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n dialogRef = inject(MatDialogRef<ConfigureAdvancedFilterComponent<T>>);\r\n data = inject<ConfigureAdvancedFilterData<T>>(MAT_DIALOG_DATA);\r\n intl = inject(NgxTablesIntl);\r\n\r\n query = signal('');\r\n\r\n form = AdvancedFilterUtils.createAdvancedFilter<T>(this.fb, this.data.advancedFilter);\r\n formChanges = toSignal(this.form.valueChanges);\r\n\r\n mapFormToAdvancedFilterEffect = effect(() => {\r\n const values = this.formChanges();\r\n\r\n if (this.form.invalid) {\r\n this.query.set('');\r\n return;\r\n }\r\n\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const queryString = AdvancedFilterUtils.groupsToReadableHtml(advancedFilter.groups, this.data.config.columns, this.intl);\r\n this.query.set(queryString);\r\n });\r\n\r\n getRootGroup(): FormGroup {\r\n return (this.form.get('groups') as FormArray).controls[0] as FormGroup;\r\n }\r\n\r\n addGroup(groupId: string) {\r\n const newGroup: FilterGroup<T> = {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [\r\n { id: uuidv4() }\r\n ]\r\n };\r\n AdvancedFilterUtils.addGroupToGroup<T>(this.fb, this.form, groupId, newGroup);\r\n }\r\n\r\n addFilter(groupId: string) {\r\n const newRule: FilterRule<T> = { id: uuidv4() };\r\n AdvancedFilterUtils.addRuleToGroup<T>(this.fb, this.form, groupId, newRule);\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n AdvancedFilterUtils.deleteGroup<T>(this.form, groupId);\r\n }\r\n\r\n deleteFilter(ruleId: string) {\r\n AdvancedFilterUtils.deleteRule<T>(this.form, ruleId);\r\n }\r\n\r\n onSubmit(sendType: SendType) {\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const tableId = this.data.config.tableId;\r\n this.advancedFilterService.saveAdvancedFilter(tableId, advancedFilter);\r\n switch (sendType) {\r\n case 'save':\r\n this.dialogRef.close();\r\n break;\r\n case 'save_and_apply':\r\n this.dialogRef.close(advancedFilter);\r\n break;\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit('save_and_apply')\">\r\n\r\n <h2 mat-dialog-title>{{intl.advancedFiltersDialogTitle}} {{data.config.title() | lowercase}}</h2>\r\n <mat-dialog-content>\r\n\r\n <p class=\"advancedFilterResult\" [innerHTML]=\"query()\" [style.visibility]=\"query() ? 'visible': 'hidden'\"></p>\r\n\r\n <mat-form-field>\r\n <mat-label>{{intl.templateNameLabel}}</mat-label>\r\n <input matInput formControlName=\"name\" [maxlength]=\"16\">\r\n <mat-hint>{{form.get('name')?.value.length ?? 0}}/16</mat-hint>\r\n <mat-error>{{intl.templateNameRequiredError}}</mat-error>\r\n </mat-form-field>\r\n\r\n <lib-advanced-filter-group \r\n [group]=\"getRootGroup()\"\r\n [config]=\"data.config\"\r\n [isRootNode]=\"true\"\r\n (addGroup)=\"addGroup($event)\"\r\n (addFilter)=\"addFilter($event)\"\r\n (deleteGroup)=\"deleteGroup($event)\"\r\n (deleteFilter)=\"deleteFilter($event)\"\r\n />\r\n\r\n <div class=\"helperContainer\">\r\n <p class=\"helperTitle\"><strong>{{intl.advancedFiltersHelpTitle}}</strong></p>\r\n <p class=\"helper\">\r\n <strong>{{intl.groupLabel}} </strong>{{intl.advancedFiltersGroupHelp}}<br>\r\n <strong>{{intl.filterLabel}} </strong>{{intl.advancedFiltersRuleHelp}}\r\n </p>\r\n </div>\r\n \r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{intl.closeButtonLabel}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save')\">{{intl.saveButtonLabel}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save_and_apply')\">{{intl.saveAndApplyButtonLabel}}</button>\r\n </mat-dialog-actions>\r\n\r\n\r\n</form>","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, computed, HostListener, inject, input, OnDestroy, OnInit, Optional, output, Signal, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { MatSortModule, Sort } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\r\nimport { OnlyUpperFirstCharacterPipe } from '../../pipes/only-upper-first-character.pipe';\r\nimport { Observable, Subject, takeUntil } from 'rxjs';\r\nimport { ColumnPipe, FilterOption, isFilterOption, PaginatedTableColumn, PaginatedTableConfig, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\r\nimport moment from 'moment';\r\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport jsPDF from 'jspdf';\r\nimport autoTable from 'jspdf-autotable';\r\nimport { utils, writeFileXLSX } from 'xlsx';\r\nimport { AdvancedFilter, PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { AdvancedFilterUtils } from '../../models/advanced-filter-utils';\r\nimport { ColumnValue } from '../../models/column-value';\r\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\r\nimport { AdvancedFilterService } from '../../services/advanced-filter.service';\r\nimport { ColumnConfigService } from '../../services/column-config.service';\r\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\r\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\r\nimport { SelectionActionEvent } from '../../models/selection-action-event';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { NgxConfirmDialogComponent } from '../ngx-confirm-dialog/ngx-confirm-dialog.component';\r\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\r\nimport { ConfigureAdvancedFilterData } from '../../models/configure-advanced-filter-data';\r\nimport { ConfigureAdvancedFilterComponent } from '../../common/components/configure-advanced-filter/configure-advanced-filter.component';\r\nimport { NgxTablesIntl } from '../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-table',\r\n imports: [\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n CommonModule,\r\n DynamicCellHostDirective,\r\n MatMenuModule,\r\n MatDividerModule,\r\n OnlyUpperFirstCharacterPipe,\r\n MatCheckboxModule,\r\n PaginatedSearchableSelectComponent,\r\n SearchableSelectComponent\r\n ],\r\n templateUrl: './ngx-paginated-table.component.html',\r\n styleUrl: './ngx-paginated-table.component.scss',\r\n host: { class: 'contenedorDefecto' }\r\n})\r\nexport class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnInit, OnDestroy {\r\n \r\n private readonly columnConfigService = inject(ColumnConfigService);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n private readonly dialog = inject(MatDialog);\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // Inyectar el servicio de internacionalización (opcional para permitir override)\r\n public readonly intl: NgxTablesIntl;\r\n private readonly _destroy$ = new Subject<void>();\r\n\r\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 10,\r\n query: undefined,\r\n sortBy: undefined,\r\n columnsFiltersValue: undefined,\r\n advancedFilterId: undefined\r\n } as U\r\n )\r\n );\r\n\r\n config = input.required<WritableSignal<PaginatedTableConfig<T>>>();\r\n\r\n protected createClick = output<void>();\r\n protected updateClick = output<T>();\r\n protected deleteClick = output<T>();\r\n protected rowActionClick = output<RowActionClickEvent<T>>();\r\n protected expandedItemChange = output<T | null>();\r\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\r\n\r\n\r\n protected readonly filterKeyPrefix = 'filter';\r\n protected readonly nameOfActionsColumn = 'actionsPerRow';\r\n protected readonly generalFooterKeyPrefix = 'footer';\r\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\r\n protected readonly debounceTime = 300;\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n protected data = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.items;\r\n });\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n protected columnConfig = computed(() => {\r\n const columnConfigs = this.columnConfigService.columnConfigs();\r\n const configValue = this.config()();\r\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\r\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\r\n return {\r\n key: column.key,\r\n show: true,\r\n isSticky: configValue.defaultStickyColumn == column.key\r\n }\r\n });\r\n\r\n if (!columnConfig)\r\n return defaultColumnConfig;\r\n\r\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\r\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\r\n\r\n //Por si a posteriori se añaden nuevas columnas\r\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\r\n\r\n return [...filteredColumns, ...columnsAdded];\r\n });\r\n\r\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\r\n\r\n protected keys = computed(() => {\r\n const configValue = this.config()();\r\n const columnConfig = this.columnConfig();\r\n\r\n let keys: (string | keyof T)[] = [...columnConfig]\r\n .filter(column => column.show)\r\n .map(column => column.key);\r\n\r\n if ((configValue.showActions?.() ?? true) &&\r\n ((configValue.update && !configValue.clickOnRowForUpdate)\r\n || configValue.delete\r\n || (configValue.rowActions && configValue.rowActions.length > 0)\r\n || configValue.expandableDetail)\r\n ) {\r\n keys = [...keys, this.nameOfActionsColumn];\r\n }\r\n\r\n if (configValue.enableRowSelection)\r\n keys = [this.nameOfRowSelectionColumn, ...keys];\r\n\r\n return keys;\r\n });\r\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected showFiltersRow = computed(() => {\r\n const configValue = this.config()();\r\n return [...configValue.columns].some(column => column.filterType) && !configValue.showAdvancedFilters;\r\n });\r\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\r\n protected showTotalPerPageFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\r\n });\r\n protected showTotalGeneralFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\r\n });\r\n\r\n protected queryTimeout: number | undefined = undefined;\r\n\r\n protected timeoutsByKey: Partial<Record<keyof T, number>> = {}\r\n\r\n protected advancedFilters: Signal<AdvancedFilter<T>[]> = computed(() => {\r\n const allTablesAdvancedFilters = this.advancedFilterService.advancedFilters();\r\n const tableId = this.config()().tableId;\r\n return allTablesAdvancedFilters[tableId];\r\n });\r\n\r\n protected readonly expandableColumnDef = 'expandedDetail';\r\n protected expandedItem = signal<T | null>(null);\r\n\r\n protected selection = signal<T[]>([]);\r\n\r\n protected isFullScreen = signal(false);\r\n private readonly overlay = inject(Overlay);\r\n private readonly overlayContainer = inject(OverlayContainer);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\r\n private overlayRef?: OverlayRef;\r\n private portal?: TemplatePortal;\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n constructor(@Optional() intl: NgxTablesIntl | null) {\r\n this.intl = intl ?? new NgxTablesIntl();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Suscribirse a los cambios de las etiquetas\r\n this.intl.changes\r\n .pipe(takeUntil(this._destroy$))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscape() {\r\n if (this.overlayRef && this.isMyOverlayOnTop())\r\n this.exitFullscreen();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n //Limpiamos todos los timeouts de filtros tipo texto de columnas\r\n Object.keys(this.timeoutsByKey).forEach((key) => {\r\n const timeout = this.timeoutsByKey[key as keyof T]\r\n clearTimeout(timeout);\r\n });\r\n\r\n this._destroy$.next();\r\n this._destroy$.complete();\r\n }\r\n\r\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\r\n return allColumns.some(column => searchedColumn.key == column.key);\r\n }\r\n\r\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\r\n\r\n protected onPageChange(event: PageEvent) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageSize == event.pageSize ? event.pageIndex + 1 : 1,\r\n pageSize: event.pageSize\r\n };\r\n });\r\n }\r\n\r\n protected onQueryChange(inputElement: HTMLInputElement) {\r\n const query = inputElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime)\r\n }\r\n\r\n protected onQueryReset(inputElement: HTMLInputElement) {\r\n inputElement.value = '';\r\n this.onQueryChange(inputElement);\r\n }\r\n\r\n protected onSortChange(sort: Sort) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n pageNumber: 1,\r\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\r\n };\r\n });\r\n }\r\n\r\n protected onNewClick() {\r\n this.createClick.emit();\r\n }\r\n\r\n protected onUpdateClick(row: T, event: Event) {\r\n this.updateClick.emit(row);\r\n event.stopPropagation();\r\n }\r\n\r\n protected onRowClick(row: T) {\r\n if (this.isRowEnabled(row))\r\n this.updateClick.emit(row);\r\n }\r\n\r\n protected isRowEnabled(row: T): boolean | undefined {\r\n return this.config()().update\r\n && this.config()().clickOnRowForUpdate\r\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\r\n && !this.config()().update?.disabled?.(row);\r\n }\r\n\r\n protected onDeleteClick(row: T, event: Event) {\r\n event.stopPropagation();\r\n\r\n const title = this.config()().deleteConfirm?.title?.(row) ?? this.intl.deleteConfirmTitle;\r\n const body = this.config()().deleteConfirm?.body?.(row) ?? this.intl.deleteConfirmBody;\r\n const template = this.config()().deleteConfirm?.templateRef?.();\r\n const data: ConfirmDialogData = {\r\n title: title,\r\n body: !template ? body : undefined,\r\n template: template,\r\n row: row,\r\n confirmButtonLabel: this.intl.confirmDeleteLabel\r\n };\r\n const dialogRef = this.dialog.open(NgxConfirmDialogComponent, { data: data });\r\n dialogRef.afterClosed().subscribe((confirm: boolean) => {\r\n if (confirm)\r\n this.deleteClick.emit(row);\r\n });\r\n }\r\n\r\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\r\n this.rowActionClick.emit({ id: rowAction.id, row: row })\r\n event.stopPropagation();\r\n }\r\n\r\n protected onTextFilterColumnChange(column: PaginatedTableColumn<T>, event: Event) {\r\n const query = (event.target as HTMLInputElement).value;\r\n\r\n //Si existe, limpio el anterior\r\n if (column.key in this.timeoutsByKey)\r\n clearTimeout(this.timeoutsByKey[column.key]);\r\n\r\n this.timeoutsByKey[column.key] = setTimeout(() => {\r\n this.onColumnFilterChange(column.key, query);\r\n }, this.debounceTime);\r\n }\r\n\r\n protected onPaginatedOptionFilterColumnChange(column: PaginatedTableColumn<T>, option?: FilterOption | FilterOption[]) {\r\n this.onColumnFilterChange(column.key, option);\r\n }\r\n\r\n protected onOptionFilterColumnChange(column: PaginatedTableColumn<T>, value?: string | string[]) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateFilterChange(column: PaginatedTableColumn<T>, value: moment.Moment | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateRangeFilterChange(column: PaginatedTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\r\n this.filters().update(currentValue => {\r\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = currentValue.columnsFiltersValue ?? {};\r\n columnsFiltersValue[columnKey] = value;\r\n return {\r\n ...currentValue,\r\n pageNumber: 1,\r\n columnsFiltersValue: columnsFiltersValue\r\n }\r\n });\r\n }\r\n\r\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\r\n return this.filters()().columnsFiltersValue?.[key];\r\n }\r\n\r\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\r\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\r\n\r\n if (!value)\r\n return null;\r\n\r\n return type == 'start' ? value.start : value.end\r\n }\r\n\r\n protected onEditColumns() {\r\n const config = this.config()();\r\n const filters = this.filters()();\r\n const columnConfig = this.columnConfig();\r\n\r\n const columnsLabel = Object.fromEntries(\r\n config.columns.map(column => [column.key, column.label])\r\n ) as Record<keyof T, string>;\r\n\r\n const data: ConfigureTableColumnData<T> = {\r\n tableId: config.tableId,\r\n tableName: config.title(),\r\n columns: columnConfig,\r\n filtersValue: filters.columnsFiltersValue ?? {},\r\n columnsLabels: columnsLabel\r\n };\r\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\r\n }\r\n\r\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\r\n if (!pipes)\r\n return value;\r\n\r\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\r\n\r\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\r\n }\r\n\r\n\r\n protected onNewAdvancedFiltersClick() {\r\n const data: ConfigureAdvancedFilterData<T> = {\r\n config: this.config()(),\r\n advancedFilter: {\r\n name: '',\r\n groups: [\r\n {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [{ id: uuidv4() }]\r\n }\r\n ]\r\n }\r\n };\r\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\r\n\r\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\r\n if (advancedFilter)\r\n this.onApplyTemplateClick(advancedFilter);\r\n });\r\n }\r\n\r\n protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>) {\r\n const advancedFilterId: string | undefined = advancedFilter?.groups?.[0].id;\r\n this.filters().update(currentValue => {\r\n return {\r\n ...currentValue,\r\n advancedFilterId: advancedFilterId,\r\n pageNumber: 1\r\n };\r\n });\r\n }\r\n\r\n protected onSelectedAdvancedFilterUpdate(event: Event) {\r\n const advancedFilterId = this.filters()().advancedFilterId;\r\n if (!advancedFilterId)\r\n return;\r\n\r\n const tableId = this.config()().tableId;\r\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\r\n\r\n if (!advancedFilter)\r\n return;\r\n\r\n this.onAdvancedFilterUpdate(event, advancedFilter);\r\n }\r\n\r\n protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger) {\r\n event.stopPropagation();\r\n advancedFiltersMenuTrigger?.closeMenu();\r\n\r\n const data: ConfigureAdvancedFilterData<T> = {\r\n config: this.config()(),\r\n advancedFilter: advancedFilter\r\n };\r\n\r\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\r\n\r\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\r\n if (advancedFilter)\r\n this.onApplyTemplateClick(advancedFilter);\r\n });\r\n }\r\n\r\n protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>) {\r\n event.stopPropagation();\r\n advancedFiltersMenuTrigger.closeMenu();\r\n\r\n const data: ConfirmDialogData = {\r\n title: this.intl.deleteAdvancedFilterTitle,\r\n body: this.intl.getDeleteAdvancedFilterMessage(advancedFilter.name),\r\n confirmButtonLabel: this.intl.confirmDeleteLabel\r\n };\r\n const dialogRef = this.dialog.open(NgxConfirmDialogComponent, { data: data });\r\n dialogRef.afterClosed().subscribe((confirm: boolean) => {\r\n if (confirm) {\r\n if (this.filters()().advancedFilterId == advancedFilter.groups[0].id)\r\n this.onApplyTemplateClick();\r\n\r\n this.advancedFilterService.deleteAdvancedFilter(this.config()().tableId, advancedFilter);\r\n }\r\n });\r\n }\r\n\r\n protected onQuitAdvancedFilter(event: Event) {\r\n event.stopPropagation();\r\n this.onApplyTemplateClick();\r\n }\r\n\r\n protected getAdvancedFilterLabel(): string {\r\n const advancedFilterId = this.filters()().advancedFilterId;\r\n if (!advancedFilterId)\r\n return '';\r\n\r\n const tableId = this.config()().tableId;\r\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\r\n\r\n if (!advancedFilter)\r\n return '';\r\n\r\n return AdvancedFilterUtils.groupsToReadableHtml<T>(advancedFilter.groups, this.config()().columns, this.intl);\r\n }\r\n\r\n protected rowIsExpanded(row: T): boolean {\r\n return this.expandedItem() == row;\r\n }\r\n\r\n protected expandableToggle(row: T) {\r\n this.expandedItem.update(currentValue => {\r\n const newValue = currentValue != row ? row : null;\r\n this.expandedItemChange.emit(newValue);\r\n return newValue;\r\n });\r\n }\r\n\r\n protected getTotalOfColum(columnKey: keyof T): number {\r\n const result = this.data().reduce((previous, item) => (previous + Number(item[columnKey])), 0);\r\n return result;\r\n }\r\n\r\n protected areEqualByKeys(record1: T, record2: T): boolean {\r\n const primaryKey = this.config()().primaryKey;\r\n\r\n if (Array.isArray(primaryKey))\r\n return primaryKey.every(key => record1[key] === record2[key]);\r\n else\r\n return record1[primaryKey] === record2[primaryKey];\r\n }\r\n\r\n protected isRowSelected(row: T): boolean {\r\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\r\n }\r\n\r\n protected toggleRowSelection(row: T) {\r\n if (this.isRowSelected(row)) {\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\r\n });\r\n } else {\r\n this.selection.update(recordsSelected => [...recordsSelected, row]);\r\n }\r\n }\r\n\r\n protected isAllPageRowSelected(): boolean {\r\n const records = this.data();\r\n return records.every(record => this.isRowSelected(record));\r\n }\r\n\r\n protected toggleAllPageRowSelection() {\r\n const records = this.data();\r\n\r\n if (this.isAllPageRowSelected()) {\r\n //Deseleccionar todas las filas de la página actual\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(\r\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\r\n );\r\n });\r\n } else {\r\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\r\n const notSelected = records.filter(record => !this.isRowSelected(record));\r\n\r\n this.selection.update(recordsSelected => {\r\n // Evitar duplicados por si ya hay seleccionadas\r\n const nuevas = notSelected.filter(\r\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\r\n );\r\n return [...recordsSelected, ...nuevas];\r\n });\r\n }\r\n }\r\n\r\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\r\n return this.config()().rowSelectionAction ?? [];\r\n }\r\n\r\n protected uncheckAllSelection() {\r\n this.selection.set([]);\r\n }\r\n\r\n protected onRowSelectionActionClick(actionId: string) {\r\n this.selectionActionEvent.emit(\r\n {\r\n id: actionId,\r\n rows: this.selection()\r\n }\r\n );\r\n }\r\n\r\n private getDocumentHeaders(): string[] {\r\n const config = this.config()();\r\n return config.columns.map(c => c.label);\r\n }\r\n\r\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\r\n const config = this.config()();\r\n const columns = config.columns;\r\n\r\n const data = this.data();\r\n\r\n return data.map(row => {\r\n if (config.mapperForExportData) {\r\n const mapped = config.mapperForExportData(row);\r\n return columns.map(c => mapped[c.key]);\r\n }\r\n\r\n return columns.map(c => row[c.key] ?? '');\r\n });\r\n }\r\n\r\n protected exportToCsvCurrentPage() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const aoaData = [headers, ...rows];\r\n\r\n //const workSheet = utils.json_to_sheet(data);\r\n\r\n const workSheet = utils.aoa_to_sheet(aoaData);\r\n const workBook = utils.book_new();\r\n utils.book_append_sheet(workBook, workSheet, title);\r\n writeFileXLSX(workBook, `${fileName}.xlsx`);\r\n }\r\n\r\n protected exportToPdfCurrentPage() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const doc = config.pdfConfig ?? new jsPDF({\r\n orientation: 'landscape',\r\n unit: 'pt',\r\n format: 'A4'\r\n });\r\n\r\n doc.setFontSize(14);\r\n doc.text(title, 40, 40);\r\n\r\n autoTable(doc, {\r\n startY: 60,\r\n head: [headers],\r\n body: rows,\r\n styles: { fontSize: 9, cellPadding: 4 },\r\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\r\n alternateRowStyles: { fillColor: [245, 245, 245] },\r\n tableLineColor: [200, 200, 200],\r\n tableLineWidth: 0.1,\r\n });\r\n\r\n doc.save(`${fileName}.pdf`);\r\n }\r\n\r\n protected onToggleFullScreen() {\r\n if (this.isFullScreen())\r\n this.exitFullscreen()\r\n else\r\n this.enterFullscreen();\r\n }\r\n\r\n private enterFullscreen() {\r\n if (this.overlayRef)\r\n return;\r\n\r\n this.overlayRef = this.overlay.create({\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.block(),\r\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\r\n });\r\n\r\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\r\n this.overlayRef.attach(this.portal);\r\n\r\n this.isFullScreen.set(true);\r\n }\r\n\r\n private exitFullscreen() {\r\n if (!this.overlayRef)\r\n return;\r\n\r\n this.overlayRef.detach();\r\n this.overlayRef.dispose();\r\n this.overlayRef = undefined;\r\n this.portal = undefined;\r\n\r\n this.isFullScreen.set(false);\r\n }\r\n\r\n private isMyOverlayOnTop(): boolean {\r\n if (!this.overlayRef)\r\n return false;\r\n\r\n //Contenedor principal de overlays en el DOM\r\n const containerElement = this.overlayContainer.getContainerElement();\r\n // Los overlays se añaden como hijos dentro de este contenedor\r\n const overlays = Array.from(containerElement.children);\r\n // El último hijo es el overlay más \"arriba\"\r\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\r\n\r\n return topOverlay === this.overlayRef.hostElement;\r\n }\r\n \r\n}\r\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? intl.createButtonLabel\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.editColumnsTooltip\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n\r\n @if(config()().showAdvancedFilters) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.advancedFiltersLabel\"\r\n [matMenuTriggerFor]=\"advancedFiltersMenu\" \r\n #advancedFiltersMenuTrigger=\"matMenuTrigger\">\r\n\r\n <mat-icon>filter_alt</mat-icon>\r\n </button>\r\n\r\n <mat-menu #advancedFiltersMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"onNewAdvancedFiltersClick()\">\r\n <mat-icon>filter_alt</mat-icon>\r\n <span>{{ intl.newAdvancedFilterLabel }}</span>\r\n </button>\r\n\r\n @for (advancedFilter of advancedFilters(); track $index; let first = $first) {\r\n @if (first) {\r\n <mat-divider />\r\n }\r\n\r\n <div mat-menu-item (click)=\"onApplyTemplateClick(advancedFilter)\">\r\n <div class=\"templateContainer\"> \r\n <span>{{advancedFilter.name | ngxOnlyUpperFirstCharacter}}</span>\r\n\r\n <div class=\"buttonTemplateContainer\">\r\n <button\r\n matIconButton \r\n [matTooltip]=\"intl.getEditAdvancedFilterTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterUpdate($event, advancedFilter, advancedFiltersMenuTrigger)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n\r\n <button\r\n matIconButton \r\n [matTooltip]=\"intl.getDeleteAdvancedFilterTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterDelete($event, advancedFiltersMenuTrigger, advancedFilter)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.selectionActionsTooltip\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ intl.deselectAllLabel }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.deselectAllLabel\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.exportTooltip\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsvCurrentPage()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ intl.exportToExcelLabel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdfCurrentPage()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ intl.exportToPdfLabel }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? intl.exitFullscreenTooltip : intl.enterFullscreenTooltip\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(config()().showQueryFilter) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? intl.searchPlaceholder\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n @if(filters()().advancedFilterId) {\r\n <div class=\"advancedFiltersApplied\" (click)=\"onSelectedAdvancedFilterUpdate($event)\">\r\n <p [innerHTML]=\"getAdvancedFilterLabel()\"></p>\r\n <button matIconButton [matTooltip]=\"intl.removeAdvancedFilterTooltip\" class=\"\" (click)=\"onQuitAdvancedFilter($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"data()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!column.isSortable\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td \r\n mat-footer-cell \r\n *matFooterCellDef \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral && column.getTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(column.getTotalGeneral(), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(column.getTotalGeneral()) }}\r\n } @else {\r\n {{ column.getTotalGeneral() }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n }\r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"intl.dateRangeStartPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"intl.dateRangeEndPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ intl.actionsLabel }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? intl.editTooltip\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? intl.deleteTooltip\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ dataResource.isLoading() ? intl.loadingMessage : intl.noDataMessage }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ intl.totalPerPageLabel }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ intl.totalGeneralLabel }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator [length]=\"total()\" [pageSize]=\"filters()().pageSize\" [pageIndex]=\"filters()().pageNumber - 1\" (page)=\"onPageChange($event)\"/>\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, effect, HostListener, inject, input, output, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\r\nimport { BasicFilter } from '../../models/basic-filter';\r\nimport { BasicTableColumn, BasicTableConfig } from '../../models/basic-table-config';\r\n\r\nimport { PaginatedFilter, SortBy } from '../../models/paginated-filter';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSortModule, Sort } from '@angular/material/sort';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\r\nimport { SelectionActionEvent } from '../../models/selection-action-event';\r\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\r\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ColumnConfigService } from '../../services/column-config.service';\r\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\r\nimport { ColumnPipe, FilterOption, isFilterOption, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\r\nimport jsPDF from 'jspdf';\r\nimport autoTable from 'jspdf-autotable';\r\nimport { utils, writeFileXLSX } from 'xlsx';\r\nimport { ColumnValue } from '../../models/column-value';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { NgxConfirmDialogComponent } from '../ngx-confirm-dialog/ngx-confirm-dialog.component';\r\nimport moment from 'moment';\r\n\r\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\r\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { NgxTablesIntl } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-basic-table',\r\n imports: [\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n CommonModule,\r\n DynamicCellHostDirective,\r\n MatMenuModule,\r\n MatDividerModule,\r\n MatCheckboxModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './ngx-basic-table.component.html',\r\n styleUrl: './ngx-basic-table.component.scss',\r\n host: { class: 'contenedorDefecto' }\r\n})\r\nexport class NgxBasicTable<T, U extends BasicFilter<T>> {\r\n\r\n private readonly columnConfigService = inject(ColumnConfigService);\r\n private readonly dialog = inject(MatDialog);\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n \r\n // Inyectar el servicio de internacionalización\r\n public readonly intl = inject(NgxTablesIntl);\r\n \r\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n query: undefined,\r\n sortBy: undefined,\r\n columnsFiltersValue: undefined\r\n } as U\r\n )\r\n );\r\n config = input.required<WritableSignal<BasicTableConfig<T>>>();\r\n data = input.required<T[]>();\r\n loading = input<boolean>(false);\r\n queryFilter = input<(query: string, data: T[]) => T[]>();\r\n\r\n moreFilters = input<(data: T[], filters: U) => T[]>(\r\n (data: T[], _: U) => {\r\n return data;\r\n }\r\n );\r\n\r\n protected createClick = output<void>();\r\n protected updateClick = output<T>();\r\n protected deleteClick = output<T>();\r\n protected rowActionClick = output<RowActionClickEvent<T>>();\r\n protected expandedItemChange = output<T | null>();\r\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\r\n\r\n dataSource = computed(() => {\r\n const data = this.data();\r\n const paginator = this.paginator();\r\n const dataSource = new MatTableDataSource(data);\r\n\r\n if (paginator)\r\n dataSource.paginator = paginator;\r\n\r\n return dataSource;\r\n });\r\n\r\n filtersEffect = effect(() => {\r\n let data = this.data();\r\n const filters = this.filters()();\r\n const config = this.config()();\r\n const queryFilter = this.queryFilter();\r\n const moreFilters = this.moreFilters();\r\n\r\n if (queryFilter)\r\n data = queryFilter(filters.query ?? '', data);\r\n else if (this.someColumnFilterable(config.columns))\r\n data = this.applyInputFilter(config.columns, data, filters.query);\r\n\r\n data = this.applySort(data, config.columns, filters.sortBy);\r\n\r\n data = this.applyColumnFilter(data, config.columns, filters.columnsFiltersValue);\r\n\r\n data = moreFilters(data, filters);\r\n\r\n this.dataSource().data = data;\r\n });\r\n\r\n protected columnConfig = computed(() => {\r\n const columnConfigs = this.columnConfigService.columnConfigs();\r\n const configValue = this.config()();\r\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\r\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\r\n return {\r\n key: column.key,\r\n show: true,\r\n isSticky: configValue.defaultStickyColumn == column.key\r\n }\r\n });\r\n\r\n if (!columnConfig)\r\n return defaultColumnConfig;\r\n\r\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\r\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\r\n\r\n //Por si a posteriori se añaden nuevas columnas\r\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\r\n\r\n return [...filteredColumns, ...columnsAdded];\r\n });\r\n\r\n protected readonly filterKeyPrefix = 'filter';\r\n protected readonly nameOfActionsColumn = 'actionsPerRow';\r\n protected readonly generalFooterKeyPrefix = 'footer';\r\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\r\n\r\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\r\n\r\n protected keys = computed(() => {\r\n const configValue = this.config()();\r\n const columnConfig = this.columnConfig();\r\n\r\n let keys: (string | keyof T)[] = [...columnConfig]\r\n .filter(column => column.show)\r\n .map(column => column.key);\r\n\r\n if ((configValue.showActions?.() ?? true) &&\r\n ((configValue.update && !configValue.clickOnRowForUpdate)\r\n || configValue.delete\r\n || (configValue.rowActions && configValue.rowActions.length > 0)\r\n || configValue.expandableDetail)\r\n ) {\r\n keys = [...keys, this.nameOfActionsColumn];\r\n }\r\n\r\n if (configValue.enableRowSelection)\r\n keys = [this.nameOfRowSelectionColumn, ...keys];\r\n\r\n return keys;\r\n });\r\n\r\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\r\n protected showFiltersRow = computed(() => {\r\n const configValue = this.config()();\r\n return [...configValue.columns].some(column => column.filterType);\r\n });\r\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\r\n protected showTotalPerPageFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\r\n });\r\n protected showTotalGeneralFooter = computed(() => {\r\n const columns = this.config()().columns;\r\n const keys = this.keys();\r\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\r\n });\r\n\r\n protected showQueryFilter = computed(() => {\r\n const queryFilter = this.queryFilter();\r\n const config = this.config()();\r\n\r\n if (queryFilter)\r\n return true;\r\n\r\n return this.someColumnFilterable(config.columns);\r\n });\r\n\r\n protected tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\r\n protected isFullScreen = signal(false);\r\n private overlayRef?: OverlayRef;\r\n private portal?: TemplatePortal;\r\n private readonly overlay = inject(Overlay);\r\n private readonly overlayContainer = inject(OverlayContainer);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n protected selection = signal<T[]>([]);\r\n\r\n protected readonly expandableColumnDef = 'expandedDetail';\r\n protected expandedItem = signal<T | null>(null);\r\n\r\n\r\n protected paginator = viewChild(MatPaginator);\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n\r\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\r\n\r\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\r\n return allColumns.some(column => searchedColumn.key == column.key);\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n protected onEscape() {\r\n if (this.overlayRef && this.isMyOverlayOnTop())\r\n this.exitFullscreen();\r\n }\r\n\r\n private someColumnFilterable(columns: BasicTableColumn<T>[]): boolean {\r\n return columns.some((column) => column.isFilterableByInput === true);\r\n }\r\n\r\n private applyInputFilter(columns: BasicTableColumn<T>[], data: T[], query?: string): T[] {\r\n if (!query)\r\n return data;\r\n\r\n const filterableColumns = columns.filter(c => c.isFilterableByInput);\r\n\r\n return data.filter(item =>\r\n filterableColumns.some(column => {\r\n const value = item[column.key];\r\n return typeof value === 'string' && includeNoSensible(value, query);\r\n })\r\n );\r\n }\r\n\r\n private applySort(data: T[], columns: BasicTableColumn<T>[], sortBy?: SortBy): T[] {\r\n if (!sortBy)\r\n return data;\r\n\r\n const column = columns.find(c => c.key === sortBy.key);\r\n\r\n if (!column || column.sortType === undefined)\r\n return data;\r\n\r\n const { key, direction } = sortBy;\r\n const factor = direction === 'asc' ? 1 : -1;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = (a as any)[key];\r\n const bValue = (b as any)[key];\r\n\r\n if (aValue == null && bValue == null)\r\n return 0;\r\n\r\n if (aValue == null)\r\n return -1 * factor;\r\n\r\n if (bValue == null)\r\n return 1 * factor;\r\n\r\n switch (column.sortType) {\r\n case 'number':\r\n return (Number(aValue) - Number(bValue)) * factor;\r\n\r\n case 'date':\r\n return (Date.parse(aValue) - Date.parse(bValue)) * factor;\r\n\r\n case 'string':\r\n default:\r\n if(column.sortByKey) {\r\n const aObjectString = column.sortByKey(a) ?? '';\r\n const bObjectString = column.sortByKey(b) ?? '';\r\n return aObjectString.localeCompare(bObjectString) * factor;\r\n }\r\n\r\n return String(aValue).localeCompare(String(bValue)) * factor;\r\n }\r\n });\r\n }\r\n\r\n private applyColumnFilter(data: T[], columns: BasicTableColumn<T>[], columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>): T[] {\r\n if (!this.showFiltersRow() || !columnsFiltersValue)\r\n return data;\r\n\r\n columns.forEach(column => {\r\n const columnFilterValue = columnsFiltersValue[column.key];\r\n\r\n if (columnFilterValue) {\r\n switch (column.filterType) {\r\n case 'number':\r\n case 'option':\r\n const filterValue = isFilterOption(columnFilterValue) ? columnFilterValue.value : columnFilterValue\r\n data = data.filter(d => {\r\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\r\n return columnValue == filterValue\r\n });\r\n break;\r\n case 'text':\r\n const query = columnFilterValue as string;\r\n data = data.filter(d => {\r\n const word = (column.filterByKey?.(d) ?? d[column.key] ?? '') as string;\r\n return includeNoSensible(word, query);\r\n });\r\n break;\r\n case 'option-multiple':\r\n if (!Array.isArray(columnFilterValue) || columnFilterValue.length <= 0)\r\n break;\r\n\r\n data = data.filter(d => {\r\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\r\n return columnFilterValue.some(f => {\r\n const columnValueString = isFilterOption(f) ? f.value : f;\r\n return columnValueString == columnValue;\r\n });\r\n });\r\n break;\r\n case 'date':\r\n const date = columnFilterValue as moment.Moment\r\n data = data.filter(d => {\r\n const value = d[column.key];\r\n if (typeof value !== 'string')\r\n return false;\r\n\r\n const momentValue = moment.utc(value);\r\n return date.isSame(momentValue, 'day');\r\n });\r\n break;\r\n case 'date-range':\r\n const dateRange = columnFilterValue as DateRange<moment.Moment | null>\r\n if (dateRange.start != null || dateRange.end != null) {\r\n data = data.filter(d => {\r\n const value = d[column.key];\r\n if (typeof value !== 'string')\r\n return false;\r\n\r\n const momentValue = moment.utc(value);\r\n\r\n if (dateRange.start && dateRange.end)\r\n return momentValue.isBetween(dateRange.start, dateRange.end, 'day', '[]');\r\n\r\n if (dateRange.start)\r\n return momentValue.isSameOrAfter(dateRange.start, 'day');\r\n\r\n if (dateRange.end)\r\n return momentValue.isSameOrBefore(dateRange.end, 'day');\r\n\r\n return true;\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n\r\n protected onToggleFullScreen() {\r\n if (this.isFullScreen())\r\n this.exitFullscreen()\r\n else\r\n this.enterFullscreen();\r\n }\r\n\r\n private enterFullscreen() {\r\n if (this.overlayRef)\r\n return;\r\n\r\n this.overlayRef = this.overlay.create({\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.block(),\r\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\r\n });\r\n\r\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\r\n this.overlayRef.attach(this.portal);\r\n\r\n this.isFullScreen.set(true);\r\n }\r\n\r\n private exitFullscreen() {\r\n if (!this.overlayRef)\r\n return;\r\n\r\n this.overlayRef.detach();\r\n this.overlayRef.dispose();\r\n this.overlayRef = undefined;\r\n this.portal = undefined;\r\n\r\n this.isFullScreen.set(false);\r\n }\r\n\r\n private isMyOverlayOnTop(): boolean {\r\n if (!this.overlayRef)\r\n return false;\r\n\r\n //Contenedor principal de overlays en el DOM\r\n const containerElement = this.overlayContainer.getContainerElement();\r\n // Los overlays se añaden como hijos dentro de este contenedor\r\n const overlays = Array.from(containerElement.children);\r\n // El último hijo es el overlay más \"arriba\"\r\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\r\n\r\n return topOverlay === this.overlayRef.hostElement;\r\n }\r\n\r\n protected onNewClick() {\r\n this.createClick.emit();\r\n }\r\n\r\n protected onUpdateClick(row: T, event: Event) {\r\n this.updateClick.emit(row);\r\n event.stopPropagation();\r\n }\r\n\r\n protected onRowClick(row: T) {\r\n if (this.isRowEnabled(row))\r\n this.updateClick.emit(row);\r\n }\r\n\r\n protected isRowEnabled(row: T): boolean | undefined {\r\n return this.config()().update\r\n && this.config()().clickOnRowForUpdate\r\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\r\n && !this.config()().update?.disabled?.(row);\r\n }\r\n\r\n protected onDeleteClick(row: T, event: Event) {\r\n event.stopPropagation();\r\n\r\n const title = this.config()().deleteConfirm?.title?.(row) ?? this.intl.deleteConfirmTitle;\r\n const body = this.config()().deleteConfirm?.body?.(row) ?? this.intl.deleteConfirmBody;\r\n const template = this.config()().deleteConfirm?.templateRef?.();\r\n const data: ConfirmDialogData = {\r\n title: title,\r\n body: !template ? body : undefined,\r\n template: template,\r\n row: row,\r\n confirmButtonLabel: this.intl.confirmDeleteLabel\r\n };\r\n const dialogRef = this.dialog.open(NgxConfirmDialogComponent, { data: data });\r\n dialogRef.afterClosed().subscribe((confirm: boolean) => {\r\n if (confirm)\r\n this.deleteClick.emit(row);\r\n });\r\n }\r\n\r\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\r\n this.rowActionClick.emit({ id: rowAction.id, row: row })\r\n event.stopPropagation();\r\n }\r\n\r\n protected onEditColumns() {\r\n const config = this.config()();\r\n const filters = this.filters()();\r\n const columnConfig = this.columnConfig();\r\n\r\n const columnsLabel = Object.fromEntries(\r\n config.columns.map(column => [column.key, column.label])\r\n ) as Record<keyof T, string>;\r\n\r\n const data: ConfigureTableColumnData<T> = {\r\n tableId: config.tableId,\r\n tableName: config.title(),\r\n columns: columnConfig,\r\n filtersValue: filters.columnsFiltersValue ?? {},\r\n columnsLabels: columnsLabel\r\n };\r\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\r\n }\r\n\r\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\r\n return this.config()().rowSelectionAction ?? [];\r\n }\r\n\r\n protected uncheckAllSelection() {\r\n this.selection.set([]);\r\n }\r\n\r\n protected onRowSelectionActionClick(actionId: string) {\r\n this.selectionActionEvent.emit(\r\n {\r\n id: actionId,\r\n rows: this.selection()\r\n }\r\n );\r\n }\r\n\r\n private getDocumentHeaders(): string[] {\r\n const config = this.config()();\r\n return config.columns.map(c => c.label);\r\n }\r\n\r\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\r\n const config = this.config()();\r\n const columns = config.columns;\r\n\r\n const data = this.dataSource().data;\r\n\r\n return data.map(row => {\r\n if (config.mapperForExportData) {\r\n const mapped = config.mapperForExportData(row);\r\n return columns.map(c => mapped[c.key]);\r\n }\r\n\r\n return columns.map(c => row[c.key] ?? '');\r\n });\r\n }\r\n\r\n protected exportToCsv() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const aoaData = [headers, ...rows];\r\n\r\n //const workSheet = utils.json_to_sheet(data);\r\n\r\n const workSheet = utils.aoa_to_sheet(aoaData);\r\n const workBook = utils.book_new();\r\n\r\n //El nombre de la hoja no puede exceder de 31 caracteres\r\n const name = title.substring(0, 31);\r\n utils.book_append_sheet(workBook, workSheet, name);\r\n writeFileXLSX(workBook, `${fileName}.xlsx`);\r\n }\r\n\r\n protected exportToPdf() {\r\n const config = this.config()();\r\n\r\n const title = config.title();\r\n const fileName = config.exportFileName?.() ?? title;\r\n\r\n const headers = this.getDocumentHeaders();\r\n const rows = this.getDocumentRows();\r\n\r\n const doc = config.pdfConfig ?? new jsPDF({\r\n orientation: 'landscape',\r\n unit: 'pt',\r\n format: 'A4'\r\n });\r\n\r\n doc.setFontSize(14);\r\n doc.text(title, 40, 40);\r\n\r\n autoTable(doc, {\r\n startY: 60,\r\n head: [headers],\r\n body: rows,\r\n styles: { fontSize: 9, cellPadding: 4 },\r\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\r\n alternateRowStyles: { fillColor: [245, 245, 245] },\r\n tableLineColor: [200, 200, 200],\r\n tableLineWidth: 0.1,\r\n });\r\n\r\n doc.save(`${fileName}.pdf`);\r\n }\r\n\r\n protected onQueryChange(inputElement: HTMLInputElement) {\r\n const query = inputElement.value;\r\n\r\n this.filters().update((value: U) => {\r\n //return { ...value, query: query, pageNumber: 1 };\r\n //Hay que ver el tema del paginador si hay que volver a la pagina 1\r\n return { ...value, query: query };\r\n });\r\n }\r\n\r\n protected onQueryReset(inputElement: HTMLInputElement) {\r\n inputElement.value = '';\r\n this.onQueryChange(inputElement);\r\n }\r\n\r\n protected onSortChange(sort: Sort) {\r\n this.filters().update(value => {\r\n return {\r\n ...value,\r\n //pageNumber: 1,\r\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\r\n };\r\n });\r\n }\r\n\r\n protected toggleAllPageRowSelection() {\r\n const records = this.getDataOfCurrentPage();\r\n\r\n if (this.isAllPageRowSelected()) {\r\n //Deseleccionar todas las filas de la página actual\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(\r\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\r\n );\r\n });\r\n } else {\r\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\r\n const notSelected = records.filter(record => !this.isRowSelected(record));\r\n\r\n this.selection.update(recordsSelected => {\r\n // Evitar duplicados por si ya hay seleccionadas\r\n const nuevas = notSelected.filter(\r\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\r\n );\r\n return [...recordsSelected, ...nuevas];\r\n });\r\n }\r\n }\r\n\r\n protected isAllPageRowSelected(): boolean {\r\n const records = this.getDataOfCurrentPage();\r\n return records.every(record => this.isRowSelected(record));\r\n }\r\n\r\n protected areEqualByKeys(record1: T, record2: T): boolean {\r\n const primaryKey = this.config()().primaryKey;\r\n\r\n if (Array.isArray(primaryKey))\r\n return primaryKey.every(key => record1[key] === record2[key]);\r\n else\r\n return record1[primaryKey] === record2[primaryKey];\r\n }\r\n\r\n protected isRowSelected(row: T): boolean {\r\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\r\n }\r\n\r\n protected toggleRowSelection(row: T) {\r\n if (this.isRowSelected(row)) {\r\n this.selection.update(recordsSelected => {\r\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\r\n });\r\n } else {\r\n this.selection.update(recordsSelected => [...recordsSelected, row]);\r\n }\r\n }\r\n\r\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\r\n if (!pipes)\r\n return value;\r\n\r\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\r\n\r\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\r\n }\r\n\r\n protected getTotalPerPageOfColum(columnKey: keyof T): number {\r\n const dataOfCurrentPage = this.getDataOfCurrentPage();\r\n return dataOfCurrentPage.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\r\n }\r\n\r\n protected getDataOfCurrentPage(): T[] {\r\n const paginator = this.dataSource().paginator;\r\n\r\n if (!paginator)\r\n return [];\r\n\r\n const startIndex = paginator.pageIndex * paginator.pageSize;\r\n const endIndex = startIndex + paginator.pageSize;\r\n\r\n return this.dataSource().data.slice(startIndex, endIndex);\r\n }\r\n\r\n protected getTotalOfColum(columnKey: keyof T): number {\r\n return this.dataSource().data.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\r\n }\r\n\r\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\r\n return this.filters()().columnsFiltersValue?.[key];\r\n }\r\n\r\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\r\n const value = this.getValueOfColumnFilter(key);\r\n\r\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\r\n return value;\r\n\r\n return undefined;\r\n }\r\n\r\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\r\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\r\n\r\n if (!value)\r\n return null;\r\n\r\n return type == 'start' ? value.start : value.end\r\n }\r\n\r\n protected onTextFilterColumnChange(column: BasicTableColumn<T>, event: Event) {\r\n const query = (event.target as HTMLInputElement).value;\r\n this.onColumnFilterChange(column.key, query);\r\n }\r\n\r\n protected onPaginatedOptionFilterColumnChange(column: BasicTableColumn<T>, option?: FilterOption | FilterOption[]) {\r\n this.onColumnFilterChange(column.key, option);\r\n }\r\n\r\n protected onOptionFilterColumnChange(column: BasicTableColumn<T>, value?: string | string[]) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\r\n this.onColumnFilterChange(column.key, value);\r\n }\r\n\r\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\r\n this.filters().update(currentValue => {\r\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = currentValue.columnsFiltersValue ?? {};\r\n columnsFiltersValue[columnKey] = value;\r\n return {\r\n ...currentValue,\r\n pageNumber: 1,\r\n columnsFiltersValue: columnsFiltersValue\r\n }\r\n });\r\n }\r\n\r\n protected rowIsExpanded(row: T): boolean {\r\n return this.expandedItem() == row;\r\n }\r\n\r\n protected expandableToggle(row: T) {\r\n this.expandedItem.update(currentValue => {\r\n const newValue = currentValue != row ? row : null;\r\n this.expandedItemChange.emit(newValue);\r\n return newValue;\r\n });\r\n }\r\n}\r\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? intl.createButtonLabel\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.editColumnsTooltip\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.selectionActionsTooltip\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ intl.deselectAllLabel }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"intl.deselectAllLabel\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n <button matIconButton [matTooltip]=\"intl.exportTooltip\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ intl.exportToExcelLabel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdf()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ intl.exportToPdfLabel }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? intl.exitFullscreenTooltip : intl.enterFullscreenTooltip\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(showQueryFilter()) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? intl.searchPlaceholder\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"loading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"dataSource()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"celdaSelection\"></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"column.sortType === undefined\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td\r\n mat-footer-cell \r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalPerPageOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalPerPageOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalPerPageOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } \r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"intl.dateRangeStartPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"intl.dateRangeEndPlaceholder\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ intl.actionsLabel }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? intl.editTooltip\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? intl.deleteTooltip\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ loading() ? intl.loadingMessage : intl.noDataMessage }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ intl.totalPerPageLabel }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ intl.totalGeneralLabel }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator />\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, input } from '@angular/core';\nimport { AlertType } from '../../models';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'ngx-alert',\n imports: [\n MatIconModule\n ],\n templateUrl: './ngx-alert.component.html',\n styleUrl: './ngx-alert.component.scss',\n})\nexport class NgxAlert { \n type = input<AlertType>('info');\n title = input<string>();\n message = input<string>();\n\n iconName = computed(() => {\n switch (this.type()) {\n case 'warning': return 'warning';\n case 'error': return 'error';\n case 'success': return 'check_circle';\n case 'info':\n default: return 'info';\n }\n });\n}\n","<div class=\"alert\" [class]=\"type()\">\n <div class=\"icon-wrapper\">\n <mat-icon>{{ iconName() }}</mat-icon>\n </div>\n <div class=\"content\">\n @if (title()) {\n <div class=\"title\">{{ title() }}</div>\n }\n <div class=\"description\">\n @if (message()) {\n {{ message() }}\n } @else {\n <ng-content />\n }\n </div>\n </div>\n</div>\n","import {\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n signal,\r\n TemplateRef,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet';\r\nimport { PaginatedFilter } from '../../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../../models/select-config';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { debounceTime, distinctUntilChanged, merge, Observable, skip, Subject } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\nexport interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {\r\n title: string;\r\n config: PaginatedSelectConfig<T>;\r\n endpoint: (filters: U) => Observable<PaginatedItems<T>>;\r\n filters: WritableSignal<U>;\r\n /** Accepts full objects OR partials containing only the valueKey */\r\n selectedItems: Partial<T>[];\r\n multiple: boolean;\r\n showSearch: boolean;\r\n searchPlaceholder: string;\r\n noResultsMessage: string;\r\n confirmLabel: string;\r\n resetLabel: string;\r\n optionTemplate: TemplateRef<{ $implicit: T }> | null;\r\n extraFiltersTemplate: TemplateRef<void> | null;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select-bottom-sheet',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatRippleModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n MatBadgeModule,\r\n ],\r\n templateUrl: './ngx-paginated-select-bottom-sheet.component.html',\r\n styleUrl: './ngx-paginated-select-bottom-sheet.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _ref = inject(MatBottomSheetRef<NgxPaginatedSelectBottomSheetComponent<T, U>>);\r\n private readonly _destroy = inject(DestroyRef);\r\n readonly data = inject<NgxPaginatedSelectBottomSheetData<T, U>>(MAT_BOTTOM_SHEET_DATA);\r\n\r\n // ─── State ─────────────────────────────────────────────────────────────────\r\n /** Raw input value — updates on every keystroke, does NOT trigger the resource */\r\n readonly query = signal(this.data.filters().query);\r\n /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */\r\n readonly selectedItems = signal<Partial<T>[]>([...this.data.selectedItems]);\r\n\r\n /**\r\n * Subject used to bypass the 400 ms debounce (e.g. when the user clears\r\n * the search field — we want an immediate response).\r\n */\r\n private readonly _immediateQuery$ = new Subject<string>();\r\n\r\n private readonly accumulatedItems = signal<T[]>([]);\r\n\r\n // ─── Resource (single trigger: data.filters) ───────────────────────────────\r\n /**\r\n * IMPORTANT: the resource depends ONLY on `data.filters`.\r\n * The debounce subscription (below) is the only thing that mutates\r\n * `data.filters.query`, so the resource fires at most once per debounce\r\n * period — never on every keystroke.\r\n */\r\n readonly resource = rxResource({\r\n params: () => ({ ...this.data.filters() }),\r\n stream: ({ params }) => this.data.endpoint(params),\r\n defaultValue: { items: [], total: 0 } as PaginatedItems<T>,\r\n });\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n readonly isLoading = computed(() => this.resource.isLoading());\r\n readonly options = computed(() => this.accumulatedItems());\r\n readonly total = computed(() => this.resource.value().total);\r\n readonly selectedCount = computed(() => this.selectedItems().length);\r\n\r\n // ─── Accumulate pages ──────────────────────────────────────────────────────\r\n /**\r\n * Only reads `resource.value()` — never `data.filters()`.\r\n *\r\n * When a query change or a new open resets to page 1 we call\r\n * `accumulatedItems.set([])` synchronously *before* updating the filter,\r\n * so by the time this effect fires with new data it always appends onto an\r\n * already-clean array. Reading `data.filters()` here would cause the effect\r\n * to run a second time (with stale resource data) the moment the page number\r\n * is incremented on scroll, duplicating items and making\r\n * `options().length >= total()` so `onScroll` would never fire again.\r\n */\r\n private readonly _accumEffect = effect(() => {\r\n const value = this.resource.value();\r\n this.accumulatedItems.update(acc => [...acc, ...value.items]);\r\n });\r\n\r\n constructor() {\r\n // Reset to page 1 when the sheet opens\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n /**\r\n * Debounce pipeline:\r\n * typed input → wait 400 ms → push into data.filters\r\n * _immediateQuery$ → no wait → push into data.filters (used by clearQuery)\r\n *\r\n * The merged stream has a final distinctUntilChanged so that an immediate\r\n * clear followed by the debounced '' 400 ms later does NOT fire twice.\r\n */\r\n merge(\r\n this._immediateQuery$,\r\n // skip(1) skips the initial BehaviorSubject-like emission from toObservable\r\n // so we don't re-fetch 400ms after the sheet opens with an empty query\r\n toObservable(this.query).pipe(skip(1), debounceTime(400), distinctUntilChanged()),\r\n )\r\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this._destroy))\r\n .subscribe(q => {\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, query: q, pageNumber: 1 }));\r\n });\r\n }\r\n\r\n // ─── Helpers ────────────────────────────────────────────────────────────────\r\n\r\n isSelected(item: T): boolean {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n return this.selectedItems().some(s => s[key] === val);\r\n }\r\n\r\n /**\r\n * Safe label: tries displayedLabel(item), falls back to String(item[valueKey]).\r\n * Works for both full objects and partials.\r\n */\r\n getLabel(item: Partial<T>): string {\r\n const cfg = this.data.config;\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n getAvatarText(item: Partial<T>): string {\r\n if (this.data.config.avatarText) {\r\n try { return this.data.config.avatarText(item as T); } catch { /* fall through */ }\r\n }\r\n return this.getLabel(item).charAt(0).toUpperCase();\r\n }\r\n\r\n // ─── Selection ──────────────────────────────────────────────────────────────\r\n\r\n toggleItem(item: T): void {\r\n if (this.data.config.disabled?.(item)) return;\r\n\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n\r\n if (this.data.multiple) {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n } else {\r\n // Remove any existing partial with the same key, then add the full object\r\n this.selectedItems.update(items => [\r\n ...items.filter(s => s[key] !== val),\r\n item,\r\n ]);\r\n }\r\n } else {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.set([]);\r\n } else {\r\n this.selectedItems.set([item]);\r\n this.confirm();\r\n }\r\n }\r\n }\r\n\r\n removeSelectedChip(item: Partial<T>): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n }\r\n\r\n // ─── Search ──────────────────────────────────────────────────────────────────\r\n\r\n onQueryInput(event: Event, container: HTMLElement): void {\r\n container.scrollTop = 0;\r\n // Only update the raw signal — the debounce subscription handles the rest\r\n this.query.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n clearQuery(inputEl: HTMLInputElement, container: HTMLElement): void {\r\n inputEl.value = '';\r\n container.scrollTop = 0;\r\n this.query.set('');\r\n // Emit on the immediate subject to bypass the 400 ms debounce\r\n this._immediateQuery$.next('');\r\n }\r\n\r\n // ─── Scroll ──────────────────────────────────────────────────────────────────\r\n\r\n onScroll(container: HTMLElement): void {\r\n if (this.isLoading()) return;\r\n const { scrollTop, clientHeight, scrollHeight } = container;\r\n if (\r\n scrollTop + clientHeight + 250 >= scrollHeight &&\r\n this.options().length < this.total()\r\n ) {\r\n this.data.filters.update(f => ({ ...f, pageNumber: f.pageNumber + 1 }));\r\n }\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\n confirm(): void {\r\n this._ref.dismiss(this.selectedItems());\r\n }\r\n\r\n reset(): void {\r\n this.selectedItems.set([]);\r\n }\r\n\r\n close(): void {\r\n this._ref.dismiss(undefined);\r\n }\r\n}\r\n","<div class=\"ps-bs\">\n\n <!-- ── Header ─────────────────────────────────────────────────────────────── -->\n <div class=\"ps-bs__header\">\n <div class=\"ps-bs__header-top\">\n <span class=\"ps-bs__title\">{{ data.title }}</span>\n <button mat-icon-button class=\"ps-bs__close-btn\" (click)=\"close()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <!-- Search -->\n @if (data.showSearch) {\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"ps-bs__search\">\n <mat-icon matPrefix>search</mat-icon>\n <input\n matInput\n #searchInput\n [value]=\"query() ?? ''\"\n [placeholder]=\"data.searchPlaceholder\"\n (input)=\"onQueryInput($event, optionsContainer)\"\n />\n @if (searchInput.value.length > 0) {\n <button matSuffix mat-icon-button (click)=\"clearQuery(searchInput, optionsContainer); $event.stopPropagation()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n\n <!-- Extra filters projection -->\n @if (data.extraFiltersTemplate) {\n <div class=\"ps-bs__extra-filters\">\n <ng-container *ngTemplateOutlet=\"data.extraFiltersTemplate\" />\n </div>\n }\n\n <!-- Selected chips (multiple mode) -->\n @if (data.multiple && selectedItems().length > 0) {\n <div class=\"ps-bs__selected-chips\">\n <mat-chip-set>\n @for (item of selectedItems(); track item[data.config.valueKey]) {\n <mat-chip (removed)=\"removeSelectedChip(item)\">\n {{ getLabel(item) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n }\n </mat-chip-set>\n </div>\n }\n </div>\n\n <!-- ── Progress bar ──────────────────────────────────────────────────────── -->\n <div class=\"ps-bs__progress\">\n @if (isLoading()) {\n <mat-progress-bar mode=\"indeterminate\" />\n }\n </div>\n\n <div class=\"ps-bs__options\" #optionsContainer (scroll)=\"onScroll(optionsContainer)\">\n @if (options().length === 0 && !isLoading()) {\n <div class=\"ps-bs__empty\">\n <mat-icon>search_off</mat-icon>\n <p>{{ data.noResultsMessage }}</p>\n </div>\n }\n\n @for (item of options(); track item[data.config.valueKey]; let last = $last) {\n @let disabled = data.config.disabled ? data.config.disabled(item) : false;\n @let selected = isSelected(item);\n\n <div\n class=\"ps-bs__option\"\n [class.ps-bs__option--selected]=\"selected\"\n [class.ps-bs__option--disabled]=\"disabled\"\n matRipple\n [matRippleDisabled]=\"disabled\"\n (click)=\"toggleItem(item)\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-selected]=\"selected\"\n role=\"option\"\n >\n <!-- Avatar -->\n <div class=\"ps-bs__option-avatar\" [class.ps-bs__option-avatar--selected]=\"selected\">\n @if (data.config.avatarText) {\n {{ getAvatarText(item) }}\n } @else if (data.config.avatarIcon) {\n <mat-icon>{{ data.config.avatarIcon }}</mat-icon>\n } @else {\n {{ getAvatarText(item) }}\n }\n </div>\n\n <!-- Content -->\n <div class=\"ps-bs__option-content\">\n @if (data.optionTemplate) {\n <ng-container *ngTemplateOutlet=\"data.optionTemplate; context: { $implicit: item }\" />\n } @else {\n <span class=\"ps-bs__option-label\">{{ getLabel(item) }}</span>\n @if (data.config.subtitle) {\n <span class=\"ps-bs__option-subtitle\">{{ data.config.subtitle(item) }}</span>\n }\n }\n </div>\n\n <!-- Check indicator -->\n @if (data.multiple) {\n <div class=\"ps-bs__option-check\">\n <mat-checkbox [checked]=\"selected\" [disabled]=\"disabled\" (click)=\"$event.preventDefault()\" />\n </div>\n } @else {\n @if (selected) {\n <mat-icon class=\"ps-bs__option-check-icon\">check</mat-icon>\n }\n }\n </div>\n\n @if (!last) {\n <mat-divider />\n }\n }\n </div>\n\n <!-- ── Footer ─────────────────────────────────────────────────────────────── -->\n <div class=\"ps-bs__footer\">\n <span class=\"ps-bs__footer-count\">\n @if (data.multiple) {\n {{ selectedCount() }} / {{ total() }}\n } @else {\n {{ total() }} resultados\n }\n </span>\n\n @if (data.multiple) {\n <div class=\"ps-bs__footer-actions\">\n @if (selectedCount() > 0) {\n <button matButton=\"outlined\" (click)=\"reset()\">{{ data.resetLabel }}</button>\n }\n <button matButton=\"filled\" color=\"primary\" (click)=\"confirm()\">{{ data.confirmLabel }}</button>\n </div>\n }\n </div>\n</div>","import {\r\n booleanAttribute,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule, MatChipEvent } from '@angular/material/chips';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter } from '../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../models/select-config';\r\nimport {\r\n NgxPaginatedSelectBottomSheetComponent,\r\n NgxPaginatedSelectBottomSheetData,\r\n} from './bottom-sheet/ngx-paginated-select-bottom-sheet.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-paginated-select.component.html',\r\n styleUrl: './ngx-paginated-select.component.scss',\r\n})\r\nexport class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements OnInit {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _bottomSheet = inject(MatBottomSheet);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n // ─── ViewChild ─────────────────────────────────────────────────────────────\r\n private readonly _matSelect = viewChild<MatSelect>('matSelect');\r\n\r\n // ─── Inputs ────────────────────────────────────────────────────────────────\r\n /** Label that floats on the form field */\r\n readonly label = input.required<string>();\r\n /** Title shown in the bottom sheet header */\r\n readonly title = input<string>('');\r\n /** Endpoint to fetch paginated data */\r\n readonly endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n /** Config for display and value binding */\r\n readonly config = input.required<PaginatedSelectConfig<T>>();\r\n /** Writable signal with the current filter state */\r\n readonly filters = input<WritableSignal<U>>(\r\n signal<U>({\r\n pageNumber: 1,\r\n pageSize: 25,\r\n query: undefined,\r\n sortBy: undefined,\r\n } as U)\r\n );\r\n /** FormControl to integrate with reactive forms */\r\n readonly control = input<FormControl>(new FormControl());\r\n /** Pre-selected items — accepts full objects OR partials with only the valueKey set */\r\n readonly selectedItems = input<Partial<T>[]>([]);\r\n /** Allow selecting multiple items */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Whether the component is disabled */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Show a clear button when items are selected */\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Controls how selected items are shown in the trigger:\r\n * - 'chips': a chip per selected item (default when multiple=true)\r\n * - 'text': a single comma-joined text line\r\n */\r\n readonly displayMode = input<'chips' | 'text'>('chips');\r\n /** Whether to show the search input inside the bottom sheet */\r\n readonly showSearch = input(true, { transform: booleanAttribute });\r\n /** Placeholder for the search input inside the bottom sheet */\r\n readonly searchPlaceholder = input<string>('Buscar...');\r\n /** Message when no results are found */\r\n readonly noResultsMessage = input<string>('No se encontraron resultados');\r\n /** Label for the confirm button (multiple mode) */\r\n readonly confirmLabel = input<string>('Confirmar');\r\n /** Label for the reset button (multiple mode) */\r\n readonly resetLabel = input<string>('Limpiar');\r\n /** Error message rendered inside mat-error */\r\n readonly error = input<string>('');\r\n /** Hint message rendered inside mat-hint */\r\n readonly hint = input<string>('');\r\n /** Custom template for each option row inside the bottom sheet */\r\n readonly optionTemplate = input<TemplateRef<{ $implicit: T }> | null>(null);\r\n /**\r\n * Optional template projected into the bottom sheet header (e.g. toggle filters).\r\n * Pass an `ng-template` reference from the consumer: `[extraFiltersTemplate]=\"myTpl\"`\r\n */\r\n readonly extraFiltersTemplate = input<TemplateRef<void> | null>(null);\r\n\r\n // ─── Outputs ───────────────────────────────────────────────────────────────\r\n /** Emits the full T object (single) or T[] (multiple) when selection changes */\r\n readonly valueChange = output<Partial<T> | Partial<T>[] | undefined>();\r\n /** Emits the raw array of selected items (may be partial if never confirmed) */\r\n readonly selectionChange = output<Partial<T>[]>();\r\n\r\n // ─── Internal state ────────────────────────────────────────────────────────\r\n protected _selectedItems = signal<Partial<T>[]>([]);\r\n protected _isDisabled = signal(false);\r\n protected _isOpen = signal(false);\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n protected readonly selectedLabel = computed(() => {\r\n const items = this._selectedItems();\r\n if (items.length === 0) return '';\r\n return items.map(i => this.getLabel(i)).join(', ');\r\n });\r\n\r\n /**\r\n * Safe label resolver: tries `displayedLabel(item)`, falls back to\r\n * `String(item[valueKey])` so partial objects never throw.\r\n */\r\n protected getLabel(item: Partial<T>): string {\r\n const cfg = this.config();\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n protected readonly hasSelection = computed(() => this._selectedItems().length > 0);\r\n\r\n /** ErrorStateMatcher that reflects the bound FormControl's touched+invalid state */\r\n protected readonly errorStateMatcher = computed((): ErrorStateMatcher => ({\r\n isErrorState: () => {\r\n const ctrl = this.control();\r\n return !!(ctrl && ctrl.invalid && ctrl.touched);\r\n },\r\n }));\r\n\r\n protected readonly showChips = computed(\r\n () => this.multiple() && this.displayMode() === 'chips'\r\n );\r\n\r\n constructor() {\r\n // Sync selectedItems input → internal state.\r\n // Guard against the consumer providing both a populated `control` (IDs) AND\r\n // `selectedItems` (full objects for the same IDs), which would cause the\r\n // @for track expression to see duplicated keys.\r\n // Strategy: build the list solely from `selectedItems()` but deduplicate by\r\n // valueKey so that any ID already represented by a full object is never\r\n // added a second time as a bare partial from the control.\r\n effect(() => {\r\n const key = this.config().valueKey as keyof T;\r\n const seen = new Set<unknown>();\r\n const deduped = this.selectedItems().filter(item => {\r\n const val = item[key];\r\n if (seen.has(val)) return false;\r\n seen.add(val);\r\n return true;\r\n });\r\n this._selectedItems.set(deduped);\r\n });\r\n\r\n // Sync disabled input → internal state\r\n effect(() => {\r\n const isDisabled = this.disabled();\r\n this._isDisabled.set(isDisabled);\r\n });\r\n\r\n // Sync selection → FormControl value + outputs\r\n effect(() => {\r\n const items = this._selectedItems();\r\n const key = this.config().valueKey as keyof T;\r\n\r\n if (this.multiple()) {\r\n // Use null instead of [] so Validators.required flags empty selection correctly\r\n this.control()?.setValue(items.length > 0 ? items.map(i => i[key]) : null);\r\n this.valueChange.emit(items);\r\n } else {\r\n this.control()?.setValue(items[0]?.[key] ?? null);\r\n this.valueChange.emit(items[0]);\r\n }\r\n this.selectionChange.emit(items);\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.disabled()) {\r\n this.control()?.disable();\r\n }\r\n }\r\n\r\n // ─── Bottom sheet ──────────────────────────────────────────────────────────\r\n\r\n openBottomSheet(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this._isDisabled()) return;\r\n\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._isOpen.set(true);\r\n\r\n const filtersSignal = this.filters();\r\n filtersSignal.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n const data: NgxPaginatedSelectBottomSheetData<T, U> = {\r\n title: this.title() || this.label(),\r\n config: this.config(),\r\n endpoint: this.endpoint(),\r\n filters: filtersSignal,\r\n selectedItems: [...this._selectedItems()],\r\n multiple: this.multiple(),\r\n showSearch: this.showSearch(),\r\n searchPlaceholder: this.searchPlaceholder(),\r\n noResultsMessage: this.noResultsMessage(),\r\n confirmLabel: this.confirmLabel(),\r\n resetLabel: this.resetLabel(),\r\n optionTemplate: this.optionTemplate(),\r\n extraFiltersTemplate: this.extraFiltersTemplate(),\r\n };\r\n\r\n this._bottomSheet\r\n .open<NgxPaginatedSelectBottomSheetComponent<T, U>, typeof data, Partial<T>[] | undefined>(\r\n NgxPaginatedSelectBottomSheetComponent,\r\n { data, panelClass: 'ngx-paginated-select-panel' }\r\n )\r\n .afterDismissed()\r\n .subscribe(result => {\r\n this._isOpen.set(false);\r\n if (result !== undefined) {\r\n this._selectedItems.set(result);\r\n }\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._cdr.detectChanges();\r\n });\r\n }\r\n\r\n // ─── Chip actions ──────────────────────────────────────────────────────────\r\n\r\n removeChip(item: Partial<T>, _event: MatChipEvent): void {\r\n const key = this.config().valueKey as keyof T;\r\n this._selectedItems.update(items => items.filter(i => i[key] !== item[key]));\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._cdr.detectChanges();\r\n }\r\n\r\n preventOpen(isOpen: boolean): void {\r\n if (isOpen) {\r\n this._matSelect()?.close();\r\n }\r\n }\r\n\r\n clearSelection(event: Event): void {\r\n event.stopPropagation();\r\n this._selectedItems.set([]);\r\n this.control()?.reset();\r\n this.control()?.markAsTouched();\r\n this.control()?.updateValueAndValidity();\r\n this._cdr.markForCheck();\r\n }\r\n}\r\n","<!-- ── Chips mode (multiple + displayMode = 'chips') ─────────────────────── -->\n@if (showChips()) {\n <mat-form-field\n appearance=\"outline\"\n floatLabel=\"always\"\n class=\"ps-trigger\"\n [class.ps-trigger--disabled]=\"_isDisabled()\"\n [class.ps-trigger--open]=\"_isOpen()\"\n (click)=\"openBottomSheet($event)\"\n >\n <mat-label>{{ label() }}</mat-label>\n\n <mat-chip-grid #chipGrid class=\"ps-trigger__chip-grid\" [formControl]=\"control()\">\n @for (item of _selectedItems(); track item[config().valueKey]) {\n <mat-chip-row\n class=\"ps-trigger__chip\"\n [disabled]=\"_isDisabled()\"\n (removed)=\"removeChip(item, $event)\"\n >\n {{ getLabel(item) }}\n <button matChipRemove [disabled]=\"_isDisabled()\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n\n <!-- Hidden input required for mat-chip-grid -->\n <input matInput [matChipInputFor]=\"chipGrid\" style=\"display: none\" readonly />\n\n <div matSuffix class=\"ps-trigger__suffix\">\n @if (clearable() && hasSelection() && !_isDisabled()) {\n <button matIconButton matSuffix (click)=\"clearSelection($event)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\n </div>\n\n @if (error()) {\n <mat-error>{{ error() }}</mat-error>\n }\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n </mat-form-field>\n}\n\n<!-- ── Text mode (single or multiple + displayMode = 'text') ─────────────── -->\n@if (!showChips()) {\n <mat-form-field\n appearance=\"outline\"\n floatLabel=\"always\"\n class=\"ps-trigger\"\n [class.ps-trigger--disabled]=\"_isDisabled()\"\n [class.ps-trigger--open]=\"_isOpen()\"\n (click)=\"openBottomSheet($event)\"\n >\n <mat-label>{{ label() }}</mat-label>\n\n <mat-select\n #matSelect\n class=\"ps-trigger__input\"\n [formControl]=\"control()\"\n [multiple]=\"multiple()\"\n style=\"pointer-events: none\"\n (openedChange)=\"preventOpen($event)\"\n >\n @for (item of _selectedItems(); track item[config().valueKey]) {\n <mat-option [value]=\"item[config().valueKey]\">{{ getLabel(item) }}</mat-option>\n }\n </mat-select>\n\n <div matSuffix class=\"ps-trigger__suffix\">\n @if (clearable() && hasSelection() && !_isDisabled()) {\n <button matIconButton matSuffix (click)=\"clearSelection($event)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n\n @if (error()) {\n <mat-error>{{ error() }}</mat-error>\n }\n @if (hint()) {\n <mat-hint>{{ hint() }}</mat-hint>\n }\n </mat-form-field>\n}\n\n\n","import { inject, Injectable, TemplateRef, Type } from \"@angular/core\";\r\nimport { MatDialog, MatDialogConfig } from \"@angular/material/dialog\";\r\nimport { DialogBodyConfig, DialogBodyType } from \"../models/dialog-config\";\r\nimport { Observable } from \"rxjs\";\r\nimport { NgxDialog } from \"../components\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxDialogService {\r\n // dependencies injection\r\n private readonly _dialog = inject(MatDialog);\r\n\r\n /**\r\n * \r\n * @param config\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens a text dialog with the provided configuration.\r\n */\r\n openText(\r\n config: {\r\n title: string;\r\n content: string;\r\n subtitle?: string;\r\n cancelText?: string;\r\n confirmText?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog, {\r\n ...dialogConfig,\r\n data: {\r\n ...config,\r\n body: {\r\n type: DialogBodyType.TEXT,\r\n content: config.content \r\n } satisfies DialogBodyConfig,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n\r\n /**\r\n * \r\n * @param title \r\n * @param message \r\n * @param cancelText\r\n * @param confirmText \r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens a confirmation dialog with cancel and confirm buttons.\r\n */\r\n confirm(config: {\r\n title: string;\r\n message: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n cancelText?: string;\r\n confirmText?: string;\r\n }, dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this.openText({\r\n title: config.title,\r\n content: config.message,\r\n subtitle: config.subtitle,\r\n icon : config.icon,\r\n iconColor : config.iconColor,\r\n cancelText : config.cancelText ?? 'Cancelar',\r\n confirmText : config.confirmText ?? 'Confirmar'\r\n }, dialogConfig);\r\n }\r\n\r\n /**\r\n * \r\n * @param title \r\n * @param message \r\n * @param confirmText\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens an informational dialog with a single confirm button. \r\n */\r\n info(\r\n config: {\r\n title: string;\r\n message: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n confirmText?: string;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this.openText({\r\n title: config.title,\r\n content: config.message,\r\n subtitle: config.subtitle,\r\n icon: config.icon,\r\n iconColor: config.iconColor,\r\n showCancel: false,\r\n confirmText: config.confirmText ?? 'Aceptar',\r\n }, dialogConfig);\r\n }\r\n\r\n /**\r\n * \r\n * @param config\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens an HTML dialog with the provided configuration.\r\n */\r\n html(\r\n config: {\r\n title: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n html: string;\r\n cancelText?: string;\r\n confirmText?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog, {\r\n ...dialogConfig,\r\n data: {\r\n ...config,\r\n body: {\r\n type: DialogBodyType.HTML,\r\n content: config.html\r\n } satisfies DialogBodyConfig,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n\r\n /**\r\n * \r\n * @param config\r\n * @return Observable<DialogResult>\r\n * \r\n * Opens a component dialog with the provided configuration.\r\n */\r\n component<T = any>(\r\n config: {\r\n title: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n component: Type<any>;\r\n componentData?: T;\r\n cancelText?: string;\r\n confirmText?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog<T>, {\r\n ...dialogConfig,\r\n data: {\r\n title: config.title,\r\n subtitle: config.subtitle,\r\n icon: config.icon,\r\n iconColor: config.iconColor,\r\n body: {\r\n type: DialogBodyType.COMPONENT,\r\n content: config.component,\r\n data: config.componentData\r\n } satisfies DialogBodyConfig<T>,\r\n cancelText: config.cancelText,\r\n confirmText: config.confirmText,\r\n showCancel: config.showCancel,\r\n showConfirm: config.showConfirm,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n\r\n /**\r\n * \r\n * @param config\r\n * @param dialogConfig\r\n * @returns Observable<DialogResult>\r\n * \r\n * Opens a template dialog with the provided configuration.\r\n */\r\n template<T = any>(\r\n config: {\r\n title: string;\r\n subtitle?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n template: TemplateRef<T>;\r\n templateData?: T;\r\n cancelText?: string;\r\n confirmText?: string;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n },\r\n dialogConfig?: MatDialogConfig\r\n ): Observable<boolean | undefined> {\r\n return this._dialog.open(NgxDialog<T>, {\r\n ...dialogConfig,\r\n data: {\r\n ...config,\r\n body: {\r\n type: DialogBodyType.TEMPLATE,\r\n content: config.template,\r\n data: config.templateData\r\n } satisfies DialogBodyConfig<T>,\r\n },\r\n minWidth: dialogConfig?.minWidth ?? '400px',\r\n autoFocus: dialogConfig?.autoFocus ?? false\r\n }).afterClosed();\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i5","i7","i2","uuidv4","i1.NgxTablesIntl","i6","i9","i10","i12","i8","i11","i13"],"mappings":"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"}