@acontplus/ng-components 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, booleanAttribute, output, ViewEncapsulation, Component, inject, viewChild, ViewContainerRef, ChangeDetectionStrategy, effect, Injectable, computed, Pipe, ChangeDetectorRef, contentChildren, Input, PLATFORM_ID, signal, TemplateRef, Directive, ViewChild, KeyValueDiffers, InjectionToken, ANIMATION_MODULE_TYPE, HostListener, ContentChildren, ElementRef, Renderer2 } from '@angular/core';
2
+ import { input, booleanAttribute, output, ViewEncapsulation, Component, inject, viewChild, ViewContainerRef, ChangeDetectionStrategy, effect, Injectable, computed, PLATFORM_ID, signal, Input, TemplateRef, Pipe, Directive, ViewChild, KeyValueDiffers, ChangeDetectorRef, InjectionToken, ANIMATION_MODULE_TYPE, HostListener, ContentChildren, ElementRef, Renderer2 } from '@angular/core';
3
3
  import * as i1 from '@angular/material/card';
4
4
  import { MatCardModule } from '@angular/material/card';
5
5
  import * as i2 from '@angular/material/button';
@@ -9,7 +9,7 @@ import { MatIconModule, MatIcon } from '@angular/material/icon';
9
9
  import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
10
10
  import * as i1$1 from '@angular/material/dialog';
11
11
  import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule, MatDialog, MatDialogConfig } from '@angular/material/dialog';
12
- import { NgClass, NgTemplateOutlet, NgStyle, DatePipe, DecimalPipe, isPlatformBrowser, AsyncPipe, CurrencyPipe, PercentPipe } from '@angular/common';
12
+ import { NgClass, NgTemplateOutlet, isPlatformBrowser, AsyncPipe, DecimalPipe, CurrencyPipe, PercentPipe, DatePipe } from '@angular/common';
13
13
  import { REPORT_FORMAT, DEFAULT_ICONS, FALLBACK_ICON } from '@acontplus/ui-kit';
14
14
  import * as i2$1 from '@angular/forms';
15
15
  import { FormControl, ReactiveFormsModule, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
@@ -23,44 +23,31 @@ import { MatFormField, MatLabel, MatHint } from '@angular/material/form-field';
23
23
  import { LiveAnnouncer } from '@angular/cdk/a11y';
24
24
  import { ENTER, COMMA } from '@angular/cdk/keycodes';
25
25
  import { MatProgressSpinner } from '@angular/material/progress-spinner';
26
- import * as i1$3 from '@angular/material/table';
27
- import { MatTableDataSource, MatHeaderRowDef, MatRowDef, MatFooterRowDef, MatColumnDef, MatTable, MatTableModule, MatHeaderRow, MatRow, MatFooterRow, MatHeaderCellDef, MatHeaderCell, MatCellDef, MatCell, MatFooterCellDef, MatFooterCell } from '@angular/material/table';
28
- import { SelectionModel } from '@angular/cdk/collections';
29
- import * as i6 from '@angular/material/paginator';
30
- import { MatPaginatorModule, MatPaginator } from '@angular/material/paginator';
31
- import * as i2$2 from '@angular/material/checkbox';
32
- import { MatCheckboxModule, MatCheckbox } from '@angular/material/checkbox';
33
- import * as i3$1 from '@angular/material/sort';
34
- import { MatSortModule, MatSort, MatSortHeader } from '@angular/material/sort';
35
- import { TranslocoService } from '@jsverse/transloco';
36
26
  import { Tabulator, PageModule, ReactiveDataModule, FormatModule, EditModule, ValidateModule, ColumnCalcsModule, SortModule, TooltipModule, DataTreeModule, MoveRowsModule, SelectRowModule, PopupModule, InteractionModule } from 'tabulator-tables';
37
- import * as i1$4 from '@angular/cdk/overlay';
27
+ import { toSignal } from '@angular/core/rxjs-interop';
28
+ import * as i1$3 from '@angular/cdk/overlay';
38
29
  import { Overlay, OverlayModule } from '@angular/cdk/overlay';
39
30
  import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
40
31
  import { ComponentPortal } from '@angular/cdk/portal';
32
+ import * as i2$2 from '@angular/material/tooltip';
33
+ import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
41
34
  import { MatProgressBarModule, MatProgressBar } from '@angular/material/progress-bar';
42
35
  import { switchMap, catchError as catchError$1, takeUntil as takeUntil$1, filter } from 'rxjs/operators';
43
- import * as i1$5 from '@angular/material/menu';
36
+ import { MatTableDataSource, MatTable, MatColumnDef, MatHeaderRowDef, MatHeaderRow, MatRowDef, MatRow, MatFooterRowDef, MatFooterRow, MatHeaderCellDef, MatHeaderCell, MatCellDef, MatCell, MatFooterCellDef, MatFooterCell } from '@angular/material/table';
37
+ import { MatPaginator } from '@angular/material/paginator';
38
+ import { MatSort, MatSortHeader } from '@angular/material/sort';
39
+ import { MatCheckbox } from '@angular/material/checkbox';
40
+ import { SelectionModel } from '@angular/cdk/collections';
41
+ import * as i1$4 from '@angular/material/menu';
44
42
  import { MatMenu, MatMenuItem, MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
45
- import * as i2$3 from '@angular/material/tooltip';
46
- import { MatTooltipModule } from '@angular/material/tooltip';
47
- import * as i3$2 from '@angular/material/badge';
43
+ import * as i3$1 from '@angular/material/badge';
48
44
  import { MatBadgeModule } from '@angular/material/badge';
45
+ import { TranslocoService } from '@jsverse/transloco';
49
46
 
50
47
  /**
51
48
  * A versatile card component that wraps Angular Material's mat-card with additional functionality
52
49
  * and customization options. This component provides a consistent card layout with configurable
53
50
  * header, content, and action areas.
54
- *
55
- * @example
56
- * <acp-dynamic-card
57
- * [cardTitle]="'Card Title'"
58
- * [cardSubtitle]="'Card Subtitle'"
59
- * [isHeaderVisible]="true"
60
- * [areActionsVisible]="true"
61
- * (primaryButtonClicked)="onPrimaryAction()">
62
- * Card content goes here
63
- * </acp-dynamic-card>
64
51
  */
65
52
  class DynamicCard {
66
53
  // Header inputs
@@ -348,15 +335,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
348
335
  * including a draggable header and the ability to dynamically create components inside the dialog.
349
336
  *
350
337
  * This component is typically used with the AdvancedDialogService's openInWrapper method.
351
- *
352
- * @example
353
- * // In your service or component:
354
- * this.dialogService.openInWrapper({
355
- * component: YourDialogContentComponent,
356
- * title: 'Dialog Title',
357
- * icon: 'info',
358
- * data: { message: 'This is some data passed to the dialog content component' }
359
- * });
360
338
  */
361
339
  class DialogWrapper {
362
340
  dialogRef = inject(MatDialogRef);
@@ -797,282 +775,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
797
775
  args: [{ selector: 'acp-spinner', imports: [MatProgressSpinner], encapsulation: ViewEncapsulation.None, template: "<div class=\"acp-spinner\">\n <mat-spinner />\n</div>\n", styles: [".acp-spinner{display:flex;justify-content:center;align-items:center;height:100%}\n"] }]
798
776
  }] });
799
777
 
800
- class GetTotalPipe {
801
- transform(colName, dataSource) {
802
- return this.getTotal(colName, dataSource) || '';
803
- }
804
- /**
805
- * Calculate and return the total (sum) of all the column --> the column must be number
806
- */
807
- getTotal(colName, dataSource) {
808
- const total = dataSource
809
- .map(row => row[colName])
810
- .reduce((acc, value) => (value ? acc + Number(value) : acc), 0);
811
- return total?.toFixed(2);
812
- }
813
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GetTotalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
814
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: GetTotalPipe, isStandalone: true, name: "getTotal" });
815
- }
816
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GetTotalPipe, decorators: [{
817
- type: Pipe,
818
- args: [{
819
- name: 'getTotal',
820
- standalone: true,
821
- }]
822
- }] });
823
-
824
- class StatusDisplayPipe {
825
- sanitizer = inject(DomSanitizer);
826
- transloco = inject(TranslocoService, { optional: true });
827
- transform(isActive, options = {}) {
828
- const { gender = 'neutral', showIcon = true, customActiveText, customInactiveText, textClass = '', iconClass = '', } = options;
829
- const text = this.getStatusText(isActive, gender, customActiveText, customInactiveText);
830
- const icon = isActive ? 'check_circle' : 'cancel';
831
- const colorClass = isActive ? 'text-green-500' : 'text-red-500';
832
- const combinedIconClass = `${colorClass} align-middle mr-1 ${iconClass}`.trim();
833
- const combinedTextClass = `align-middle ${textClass}`.trim();
834
- let html = '';
835
- if (showIcon) {
836
- html += `<mat-icon class="${combinedIconClass}" fontIcon="${icon}"></mat-icon>`;
837
- }
838
- html += `<span class="${combinedTextClass}">${text}</span>`;
839
- return this.sanitizer.bypassSecurityTrustHtml(html);
840
- }
841
- getStatusText(isActive, gender, customActive, customInactive) {
842
- if (customActive && isActive)
843
- return customActive;
844
- if (customInactive && !isActive)
845
- return customInactive;
846
- if (!this.transloco)
847
- return this.getFallbackText(isActive, gender);
848
- const translationKey = this.getTranslationKey(isActive, gender);
849
- const translation = this.transloco.translate(translationKey);
850
- return translation !== translationKey ? translation : this.getFallbackText(isActive, gender);
851
- }
852
- getTranslationKey(isActive, gender) {
853
- const base = isActive ? 'status.active' : 'status.inactive';
854
- return gender !== 'neutral'
855
- ? `${base}.${gender}`
856
- : base;
857
- }
858
- getFallbackText(isActive, gender) {
859
- const lang = this.transloco?.getActiveLang() || 'en';
860
- const isSpanish = lang.startsWith('es');
861
- if (!isSpanish) {
862
- return isActive ? 'Active' : 'Inactive';
863
- }
864
- if (isActive) {
865
- return gender === 'female' ? 'Activa' : 'Activo';
866
- }
867
- else {
868
- return gender === 'female' ? 'Inactiva' : 'Inactivo';
869
- }
870
- }
871
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: StatusDisplayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
872
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: StatusDisplayPipe, isStandalone: true, name: "statusDisplay" });
873
- }
874
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: StatusDisplayPipe, decorators: [{
875
- type: Pipe,
876
- args: [{
877
- name: 'statusDisplay',
878
- }]
879
- }] });
880
-
881
- class DynamicTable {
882
- componentRefs = [];
883
- embeddedViews = [];
884
- cdr = inject(ChangeDetectorRef);
885
- showExpand = input(false, ...(ngDevMode ? [{ debugName: "showExpand" }] : []));
886
- showFooter = input(false, ...(ngDevMode ? [{ debugName: "showFooter" }] : []));
887
- locale = input('en-US', ...(ngDevMode ? [{ debugName: "locale" }] : []));
888
- highlightRowIndex = input(0, ...(ngDevMode ? [{ debugName: "highlightRowIndex" }] : []));
889
- visibleColumns = [];
890
- columnDefinitions = [];
891
- showSelectBox = input(false, ...(ngDevMode ? [{ debugName: "showSelectBox" }] : []));
892
- multipleSelection = input(true, ...(ngDevMode ? [{ debugName: "multipleSelection" }] : []));
893
- tableData = input([], ...(ngDevMode ? [{ debugName: "tableData" }] : []));
894
- rowTemplate = input(null, ...(ngDevMode ? [{ debugName: "rowTemplate" }] : []));
895
- expandedDetail = null;
896
- enablePagination = input(false, ...(ngDevMode ? [{ debugName: "enablePagination" }] : []));
897
- paginationConfig = null;
898
- isLoadingData = input(false, ...(ngDevMode ? [{ debugName: "isLoadingData" }] : []));
899
- rowSelected = output();
900
- copyRow = output();
901
- showExpanded = output();
902
- hideExpanded = output();
903
- pageEvent = output();
904
- isNormalRow = (_, row) => this.expandedElement !== row;
905
- isExpandedRow = (_, row) => this.expandedElement === row;
906
- dataSource = new MatTableDataSource([]);
907
- selection = new SelectionModel(true, []);
908
- expandedElement = null;
909
- columnsToDisplayWithExpand = [];
910
- headerRowDefs = contentChildren(MatHeaderRowDef, ...(ngDevMode ? [{ debugName: "headerRowDefs" }] : []));
911
- rowDefs = contentChildren(MatRowDef, ...(ngDevMode ? [{ debugName: "rowDefs" }] : []));
912
- footerRowDefs = contentChildren(MatFooterRowDef, ...(ngDevMode ? [{ debugName: "footerRowDefs" }] : []));
913
- columnDefs = contentChildren(MatColumnDef, ...(ngDevMode ? [{ debugName: "columnDefs" }] : []));
914
- table = viewChild.required(MatTable);
915
- rows = contentChildren(ViewContainerRef, ...(ngDevMode ? [{ debugName: "rows" }] : []));
916
- ngOnInit() {
917
- this.updateColumnsToDisplay();
918
- this.initializeSelection();
919
- }
920
- ngOnChanges(changes) {
921
- if (changes['tableData']) {
922
- this.updateTableData();
923
- }
924
- if (changes['showExpand'] || changes['visibleColumns'] || changes['columnDefinitions']) {
925
- this.updateColumnsToDisplay();
926
- }
927
- // Trigger change detection for OnPush strategy
928
- this.cdr.markForCheck();
929
- }
930
- ngAfterContentInit() {
931
- this.registerTableContent();
932
- this.initializeTable();
933
- this.cdr.markForCheck();
934
- }
935
- ngOnDestroy() {
936
- this.cleanupDynamicComponents();
937
- }
938
- updateTableData() {
939
- // Clear selection when new data arrives
940
- this.selection.clear();
941
- // Update data source
942
- this.dataSource.data = this.tableData() || [];
943
- // Reset expanded element if it's no longer in the new data
944
- if (this.expandedElement && !this.dataSource.data.includes(this.expandedElement)) {
945
- this.expandedElement = null;
946
- }
947
- // Trigger change detection
948
- this.cdr.markForCheck();
949
- }
950
- updateColumnsToDisplay() {
951
- if (!this.visibleColumns.length && this.columnDefinitions) {
952
- this.visibleColumns = this.columnDefinitions.map(col => col.key);
953
- this.columnDefinitions.forEach((col, index) => (col.index = index));
954
- }
955
- const newColumns = [...this.visibleColumns];
956
- if (this.showSelectBox() && !newColumns.includes('select')) {
957
- newColumns.unshift('select');
958
- }
959
- if (this.showExpand() && this.expandedDetail) {
960
- if (!this.columnDefinitions?.some(col => col.key === 'expand')) {
961
- this.columnDefinitions = [
962
- ...(this.columnDefinitions || []),
963
- {
964
- key: 'expand',
965
- label: '',
966
- type: 'expand',
967
- index: this.columnDefinitions?.length || 0,
968
- },
969
- ];
970
- }
971
- if (!newColumns.includes('expand')) {
972
- newColumns.push('expand');
973
- }
974
- }
975
- this.columnsToDisplayWithExpand = newColumns;
976
- }
977
- initializeSelection() {
978
- this.selection = new SelectionModel(this.multipleSelection(), []);
979
- }
980
- registerTableContent() {
981
- this.columnDefs().forEach(columnDef => this.table().addColumnDef(columnDef));
982
- this.rowDefs().forEach(rowDef => this.table().addRowDef(rowDef));
983
- this.headerRowDefs().forEach(headerRowDef => this.table().addHeaderRowDef(headerRowDef));
984
- if (this.showFooter()) {
985
- this.footerRowDefs().forEach(footerRowDef => this.table().addFooterRowDef(footerRowDef));
986
- }
987
- else {
988
- this.footerRowDefs().forEach(footerRowDef => this.table().removeFooterRowDef(footerRowDef));
989
- }
990
- }
991
- initializeTable() {
992
- this.dataSource = new MatTableDataSource(this.tableData() || []);
993
- }
994
- cleanupDynamicComponents() {
995
- this.componentRefs.forEach(ref => ref.destroy());
996
- this.embeddedViews.forEach(view => view.destroy());
997
- }
998
- isAllSelected() {
999
- const numSelected = this.selection.selected.length;
1000
- const selectableRows = this.dataSource.data.filter(row => !row.disableSelection);
1001
- return numSelected === selectableRows.length && selectableRows.length > 0;
1002
- }
1003
- masterToggle() {
1004
- if (!this.multipleSelection())
1005
- return;
1006
- if (this.isAllSelected()) {
1007
- this.selection.clear();
1008
- }
1009
- else {
1010
- this.dataSource.data
1011
- .filter(row => !row.disableSelection)
1012
- .forEach(row => this.selection.select(row));
1013
- }
1014
- this.rowSelected.emit(this.selection.selected);
1015
- this.cdr.markForCheck();
1016
- }
1017
- checkboxLabel(row) {
1018
- if (!row) {
1019
- return `${this.isAllSelected() ? 'deselect' : 'select'} all`;
1020
- }
1021
- return `${this.selection.isSelected(row) ? 'deselect' : 'select'} row`;
1022
- }
1023
- selectRow(row) {
1024
- if (row.disableSelection)
1025
- return;
1026
- this.selection.toggle(row);
1027
- this.rowSelected.emit(this.selection.selected);
1028
- this.cdr.markForCheck();
1029
- }
1030
- onExpand(event, element) {
1031
- event.stopPropagation();
1032
- this.expandedElement = this.expandedElement === element ? null : element;
1033
- if (this.expandedElement) {
1034
- this.showExpanded.emit(element);
1035
- }
1036
- else {
1037
- this.hideExpanded.emit(element);
1038
- }
1039
- this.cdr.markForCheck();
1040
- }
1041
- getRowStyle(element) {
1042
- return element.rowStyle || {};
1043
- }
1044
- handlePageEvent(e) {
1045
- this.pageEvent.emit(e);
1046
- }
1047
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DynamicTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
1048
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DynamicTable, isStandalone: true, selector: "acp-dynamic-table", inputs: { showExpand: { classPropertyName: "showExpand", publicName: "showExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, highlightRowIndex: { classPropertyName: "highlightRowIndex", publicName: "highlightRowIndex", isSignal: true, isRequired: false, transformFunction: null }, visibleColumns: { classPropertyName: "visibleColumns", publicName: "visibleColumns", isSignal: false, isRequired: false, transformFunction: null }, columnDefinitions: { classPropertyName: "columnDefinitions", publicName: "columnDefinitions", isSignal: false, isRequired: false, transformFunction: null }, showSelectBox: { classPropertyName: "showSelectBox", publicName: "showSelectBox", isSignal: true, isRequired: false, transformFunction: null }, multipleSelection: { classPropertyName: "multipleSelection", publicName: "multipleSelection", isSignal: true, isRequired: false, transformFunction: null }, tableData: { classPropertyName: "tableData", publicName: "tableData", isSignal: true, isRequired: false, transformFunction: null }, rowTemplate: { classPropertyName: "rowTemplate", publicName: "rowTemplate", isSignal: true, isRequired: false, transformFunction: null }, expandedDetail: { classPropertyName: "expandedDetail", publicName: "expandedDetail", isSignal: false, isRequired: false, transformFunction: null }, enablePagination: { classPropertyName: "enablePagination", publicName: "enablePagination", isSignal: true, isRequired: false, transformFunction: null }, paginationConfig: { classPropertyName: "paginationConfig", publicName: "paginationConfig", isSignal: false, isRequired: false, transformFunction: null }, isLoadingData: { classPropertyName: "isLoadingData", publicName: "isLoadingData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowSelected: "rowSelected", copyRow: "copyRow", showExpanded: "showExpanded", hideExpanded: "hideExpanded", pageEvent: "pageEvent" }, queries: [{ propertyName: "headerRowDefs", predicate: MatHeaderRowDef, isSignal: true }, { propertyName: "rowDefs", predicate: MatRowDef, isSignal: true }, { propertyName: "footerRowDefs", predicate: MatFooterRowDef, isSignal: true }, { propertyName: "columnDefs", predicate: MatColumnDef, isSignal: true }, { propertyName: "rows", predicate: ViewContainerRef, isSignal: true }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"acp-dynamic-table\">\n <div class=\"acp-table-container small-table\">\n <table #sort=\"matSort\" [dataSource]=\"dataSource.data\" mat-table matSort>\n @if (columnDefinitions) {\n <!-- Checkbox Column -->\n @if (showSelectBox()) {\n <ng-container matColumnDef=\"select\">\n <th *matHeaderCellDef mat-header-cell>\n @if (multipleSelection()) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n (click)=\"$event.stopPropagation()\"\n [aria-label]=\"checkboxLabel()\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n />\n }\n </th>\n <td *matCellDef=\"let row\" mat-cell>\n <mat-checkbox\n (change)=\"$event ? selectRow(row) : null\"\n (click)=\"$event.stopPropagation()\"\n [aria-label]=\"checkboxLabel(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"row.disableSelection\"\n />\n </td>\n <td *matFooterCellDef mat-footer-cell></td>\n </ng-container>\n }\n\n <!-- Dynamic Columns -->\n @for (col of columnDefinitions; track col.key) {\n <ng-container [matColumnDef]=\"col.key\">\n <th *matHeaderCellDef mat-header-cell>{{ col.label }}</th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let i = index\"\n [ngClass]=\"{ highlighted: highlightRowIndex() === i }\"\n >\n @if (col.key === 'op') {\n <div class=\"d-flex flex-row gap-1\">\n @if (col.templateOutlet) {\n <ng-container\n *ngTemplateOutlet=\"\n col.templateOutlet;\n context: { $implicit: element, index: i }\n \"\n />\n } @else if (rowTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"rowTemplate(); context: { $implicit: element, index: i }\"\n />\n }\n </div>\n } @else { @switch (col.type) { @case ('image') {\n <img [src]=\"element[col.key]\" class=\"img-fluid img-thumbnail my-1\" width=\"50\" alt=\"\" />\n } @case ('number') {\n <div>{{ element[col.key] | number: '1.2' : locale() }}</div>\n } @case ('date') {\n <div>{{ element[col.key] | date: 'dd.MM.yyyy' }}</div>\n } @case ('expand') {\n <button mat-icon-button aria-label=\"expand row\" (click)=\"onExpand($event, element)\">\n @if (expandedElement === element) {\n <mat-icon>keyboard_arrow_up</mat-icon>\n } @else {\n <mat-icon>keyboard_arrow_down</mat-icon>\n }\n </button>\n } @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"\n col.templateOutlet;\n context: { $implicit: element, index: i }\n \"\n />\n } @case ('custom') {\n <ng-container #dynamicContent />\n } @default {\n <div>{{ element[col.key] }}</div>\n } } }\n </td>\n\n <td *matFooterCellDef mat-footer-cell>\n @if (col.index === 0) {\n <div>Total</div>\n } @if (col.hasFooter) {\n <div>{{ col.key | getTotal: dataSource.data }}</div>\n }\n </td>\n </ng-container>\n }\n\n <!-- Expanded Detail Row -->\n @if (showExpand() && expandedDetail) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let element; let i = index\"\n [attr.colspan]=\"columnsToDisplayWithExpand.length\"\n >\n <div class=\"m-0 p-0 acp-detail-expand\" [class.acp-expanded]=\"element === expandedElement\">\n <ng-container\n *ngTemplateOutlet=\"expandedDetail; context: { $implicit: element, index: i }\"\n />\n </div>\n </td>\n </ng-container>\n }\n\n <!-- Header Row -->\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplayWithExpand\"></tr>\n\n <!-- Data Rows -->\n @if (showExpand() && expandedDetail) {\n <!-- Regular Row -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: columnsToDisplayWithExpand; when: isNormalRow\"\n class=\"acp-dynamic-table-row\"\n [class.acp-dynamic-table-expanded-row]=\"expandedElement === row\"\n [ngStyle]=\"getRowStyle(row)\"\n (click)=\"expandedElement = expandedElement === row ? null : row\"\n ></tr>\n\n <!-- Expanded Row -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']; when: isExpandedRow\"\n class=\"acp-dynamic-table-detail-row\"\n ></tr>\n } @else {\n <!-- Regular Row without expansion -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: columnsToDisplayWithExpand\"\n [ngStyle]=\"getRowStyle(row)\"\n ></tr>\n }\n\n <!-- No Data Row -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell text-center\" [attr.colspan]=\"columnsToDisplayWithExpand.length\">\n No records found\n </td>\n </tr>\n\n <!-- Footer -->\n @if (showFooter() && dataSource.data.length > 0) {\n <tr mat-footer-row *matFooterRowDef=\"columnsToDisplayWithExpand\"></tr>\n } }\n </table>\n </div>\n\n @if (enablePagination() && paginationConfig) {\n <mat-paginator\n #paginator\n [disabled]=\"isLoadingData()\"\n (page)=\"handlePageEvent($event)\"\n [length]=\"paginationConfig.totalRecords\"\n [pageSize]=\"paginationConfig.pageSize\"\n [pageSizeOptions]=\"paginationConfig.pageSizeOptions || []\"\n [showFirstLastButtons]=\"paginationConfig.showFirstLastButtons\"\n [pageIndex]=\"paginationConfig.pageIndex\"\n [hidePageSize]=\"paginationConfig.hidePageSize\"\n [disabled]=\"paginationConfig.disabled\"\n aria-label=\"Select page\"\n />\n }\n</div>\n", styles: [".acp-dynamic-table{display:block}.acp-dynamic-table .acp-table-container{position:relative;min-height:200px;max-height:400px;overflow:auto}.acp-dynamic-table table{width:100%}.acp-dynamic-table tr.acp-dynamic-table-detail-row{height:0}.acp-dynamic-table tr.acp-dynamic-table-row:not(.acp-dynamic-table-expanded-row):hover{background:var(--mat-sys-surface-variant, whitesmoke)}.acp-dynamic-table tr.acp-dynamic-table-row:not(.acp-dynamic-table-expanded-row):active{background:var(--mat-sys-surface-container, #efefef)}.acp-dynamic-table .acp-dynamic-table-row td{border-bottom-width:0}.acp-dynamic-table .acp-detail-expand{height:0;overflow:hidden;transition:height .15s ease-in-out}.acp-dynamic-table .acp-detail-expand.acp-expanded{height:auto;overflow:visible}@starting-style{.acp-dynamic-table .acp-detail-expand.acp-expanded{height:0}}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$3.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$3.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1$3.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1$3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1$3.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1$3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1$3.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: i1$3.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2$2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i3$1.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i6.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: GetTotalPipe, name: "getTotal" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1049
- }
1050
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DynamicTable, decorators: [{
1051
- type: Component,
1052
- args: [{ selector: 'acp-dynamic-table', standalone: true, imports: [
1053
- MatTableModule,
1054
- MatCheckboxModule,
1055
- MatSortModule,
1056
- MatIconModule,
1057
- MatButtonModule,
1058
- MatPaginatorModule,
1059
- NgClass,
1060
- NgStyle,
1061
- GetTotalPipe,
1062
- DatePipe,
1063
- DecimalPipe,
1064
- NgTemplateOutlet,
1065
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"acp-dynamic-table\">\n <div class=\"acp-table-container small-table\">\n <table #sort=\"matSort\" [dataSource]=\"dataSource.data\" mat-table matSort>\n @if (columnDefinitions) {\n <!-- Checkbox Column -->\n @if (showSelectBox()) {\n <ng-container matColumnDef=\"select\">\n <th *matHeaderCellDef mat-header-cell>\n @if (multipleSelection()) {\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n (click)=\"$event.stopPropagation()\"\n [aria-label]=\"checkboxLabel()\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n />\n }\n </th>\n <td *matCellDef=\"let row\" mat-cell>\n <mat-checkbox\n (change)=\"$event ? selectRow(row) : null\"\n (click)=\"$event.stopPropagation()\"\n [aria-label]=\"checkboxLabel(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"row.disableSelection\"\n />\n </td>\n <td *matFooterCellDef mat-footer-cell></td>\n </ng-container>\n }\n\n <!-- Dynamic Columns -->\n @for (col of columnDefinitions; track col.key) {\n <ng-container [matColumnDef]=\"col.key\">\n <th *matHeaderCellDef mat-header-cell>{{ col.label }}</th>\n\n <td\n mat-cell\n *matCellDef=\"let element; let i = index\"\n [ngClass]=\"{ highlighted: highlightRowIndex() === i }\"\n >\n @if (col.key === 'op') {\n <div class=\"d-flex flex-row gap-1\">\n @if (col.templateOutlet) {\n <ng-container\n *ngTemplateOutlet=\"\n col.templateOutlet;\n context: { $implicit: element, index: i }\n \"\n />\n } @else if (rowTemplate()) {\n <ng-container\n *ngTemplateOutlet=\"rowTemplate(); context: { $implicit: element, index: i }\"\n />\n }\n </div>\n } @else { @switch (col.type) { @case ('image') {\n <img [src]=\"element[col.key]\" class=\"img-fluid img-thumbnail my-1\" width=\"50\" alt=\"\" />\n } @case ('number') {\n <div>{{ element[col.key] | number: '1.2' : locale() }}</div>\n } @case ('date') {\n <div>{{ element[col.key] | date: 'dd.MM.yyyy' }}</div>\n } @case ('expand') {\n <button mat-icon-button aria-label=\"expand row\" (click)=\"onExpand($event, element)\">\n @if (expandedElement === element) {\n <mat-icon>keyboard_arrow_up</mat-icon>\n } @else {\n <mat-icon>keyboard_arrow_down</mat-icon>\n }\n </button>\n } @case ('template') {\n <ng-container\n *ngTemplateOutlet=\"\n col.templateOutlet;\n context: { $implicit: element, index: i }\n \"\n />\n } @case ('custom') {\n <ng-container #dynamicContent />\n } @default {\n <div>{{ element[col.key] }}</div>\n } } }\n </td>\n\n <td *matFooterCellDef mat-footer-cell>\n @if (col.index === 0) {\n <div>Total</div>\n } @if (col.hasFooter) {\n <div>{{ col.key | getTotal: dataSource.data }}</div>\n }\n </td>\n </ng-container>\n }\n\n <!-- Expanded Detail Row -->\n @if (showExpand() && expandedDetail) {\n <ng-container matColumnDef=\"expandedDetail\">\n <td\n mat-cell\n *matCellDef=\"let element; let i = index\"\n [attr.colspan]=\"columnsToDisplayWithExpand.length\"\n >\n <div class=\"m-0 p-0 acp-detail-expand\" [class.acp-expanded]=\"element === expandedElement\">\n <ng-container\n *ngTemplateOutlet=\"expandedDetail; context: { $implicit: element, index: i }\"\n />\n </div>\n </td>\n </ng-container>\n }\n\n <!-- Header Row -->\n <tr mat-header-row *matHeaderRowDef=\"columnsToDisplayWithExpand\"></tr>\n\n <!-- Data Rows -->\n @if (showExpand() && expandedDetail) {\n <!-- Regular Row -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: columnsToDisplayWithExpand; when: isNormalRow\"\n class=\"acp-dynamic-table-row\"\n [class.acp-dynamic-table-expanded-row]=\"expandedElement === row\"\n [ngStyle]=\"getRowStyle(row)\"\n (click)=\"expandedElement = expandedElement === row ? null : row\"\n ></tr>\n\n <!-- Expanded Row -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['expandedDetail']; when: isExpandedRow\"\n class=\"acp-dynamic-table-detail-row\"\n ></tr>\n } @else {\n <!-- Regular Row without expansion -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: columnsToDisplayWithExpand\"\n [ngStyle]=\"getRowStyle(row)\"\n ></tr>\n }\n\n <!-- No Data Row -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell text-center\" [attr.colspan]=\"columnsToDisplayWithExpand.length\">\n No records found\n </td>\n </tr>\n\n <!-- Footer -->\n @if (showFooter() && dataSource.data.length > 0) {\n <tr mat-footer-row *matFooterRowDef=\"columnsToDisplayWithExpand\"></tr>\n } }\n </table>\n </div>\n\n @if (enablePagination() && paginationConfig) {\n <mat-paginator\n #paginator\n [disabled]=\"isLoadingData()\"\n (page)=\"handlePageEvent($event)\"\n [length]=\"paginationConfig.totalRecords\"\n [pageSize]=\"paginationConfig.pageSize\"\n [pageSizeOptions]=\"paginationConfig.pageSizeOptions || []\"\n [showFirstLastButtons]=\"paginationConfig.showFirstLastButtons\"\n [pageIndex]=\"paginationConfig.pageIndex\"\n [hidePageSize]=\"paginationConfig.hidePageSize\"\n [disabled]=\"paginationConfig.disabled\"\n aria-label=\"Select page\"\n />\n }\n</div>\n", styles: [".acp-dynamic-table{display:block}.acp-dynamic-table .acp-table-container{position:relative;min-height:200px;max-height:400px;overflow:auto}.acp-dynamic-table table{width:100%}.acp-dynamic-table tr.acp-dynamic-table-detail-row{height:0}.acp-dynamic-table tr.acp-dynamic-table-row:not(.acp-dynamic-table-expanded-row):hover{background:var(--mat-sys-surface-variant, whitesmoke)}.acp-dynamic-table tr.acp-dynamic-table-row:not(.acp-dynamic-table-expanded-row):active{background:var(--mat-sys-surface-container, #efefef)}.acp-dynamic-table .acp-dynamic-table-row td{border-bottom-width:0}.acp-dynamic-table .acp-detail-expand{height:0;overflow:hidden;transition:height .15s ease-in-out}.acp-dynamic-table .acp-detail-expand.acp-expanded{height:auto;overflow:visible}@starting-style{.acp-dynamic-table .acp-detail-expand.acp-expanded{height:0}}\n"] }]
1066
- }], propDecorators: { showExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "showExpand", required: false }] }], showFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFooter", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], highlightRowIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightRowIndex", required: false }] }], visibleColumns: [{
1067
- type: Input
1068
- }], columnDefinitions: [{
1069
- type: Input
1070
- }], showSelectBox: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSelectBox", required: false }] }], multipleSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "multipleSelection", required: false }] }], tableData: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableData", required: false }] }], rowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowTemplate", required: false }] }], expandedDetail: [{
1071
- type: Input
1072
- }], enablePagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "enablePagination", required: false }] }], paginationConfig: [{
1073
- type: Input
1074
- }], isLoadingData: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoadingData", required: false }] }], rowSelected: [{ type: i0.Output, args: ["rowSelected"] }], copyRow: [{ type: i0.Output, args: ["copyRow"] }], showExpanded: [{ type: i0.Output, args: ["showExpanded"] }], hideExpanded: [{ type: i0.Output, args: ["hideExpanded"] }], pageEvent: [{ type: i0.Output, args: ["pageEvent"] }], headerRowDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MatHeaderRowDef), { isSignal: true }] }], rowDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MatRowDef), { isSignal: true }] }], footerRowDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MatFooterRowDef), { isSignal: true }] }], columnDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MatColumnDef), { isSignal: true }] }], table: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MatTable), { isSignal: true }] }], rows: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ViewContainerRef), { isSignal: true }] }] } });
1075
-
1076
778
  // tabulator-table.ts
1077
779
  Tabulator.registerModule([
1078
780
  PageModule,
@@ -1909,105 +1611,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
1909
1611
  }]
1910
1612
  }], ctorParameters: () => [] });
1911
1613
 
1614
+ /**
1615
+ * A theme toggle button component that allows users to switch between
1616
+ * light and dark modes. Follows WAI-ARIA best practices for toggle buttons.
1617
+ */
1912
1618
  class ThemeToggle {
1913
- themeService = inject(ThemeSwitcher);
1914
- darkMode$;
1915
- constructor() {
1916
- this.darkMode$ = this.themeService.isDarkMode$;
1917
- }
1619
+ themeSwitcher = inject(ThemeSwitcher);
1620
+ /** Icon to display when in dark mode (clicking will switch to light) */
1621
+ lightModeIcon = input('light_mode', ...(ngDevMode ? [{ debugName: "lightModeIcon" }] : []));
1622
+ /** Icon to display when in light mode (clicking will switch to dark) */
1623
+ darkModeIcon = input('dark_mode', ...(ngDevMode ? [{ debugName: "darkModeIcon" }] : []));
1624
+ /** Accessible label for when in dark mode */
1625
+ lightModeLabel = input('Switch to light mode', ...(ngDevMode ? [{ debugName: "lightModeLabel" }] : []));
1626
+ /** Accessible label for when in light mode */
1627
+ darkModeLabel = input('Switch to dark mode', ...(ngDevMode ? [{ debugName: "darkModeLabel" }] : []));
1628
+ /** Test ID for automated testing */
1629
+ testId = input('', ...(ngDevMode ? [{ debugName: "testId" }] : []));
1630
+ /** Current dark mode state as a signal */
1631
+ isDarkMode = toSignal(this.themeSwitcher.isDarkMode$, {
1632
+ initialValue: false,
1633
+ });
1634
+ /** Computed icon based on current theme */
1635
+ currentIcon = computed(() => this.isDarkMode() ? this.lightModeIcon() : this.darkModeIcon(), ...(ngDevMode ? [{ debugName: "currentIcon" }] : []));
1636
+ /** Computed accessible label based on current theme */
1637
+ currentLabel = computed(() => this.isDarkMode() ? this.lightModeLabel() : this.darkModeLabel(), ...(ngDevMode ? [{ debugName: "currentLabel" }] : []));
1638
+ /** Toggle between dark and light mode */
1918
1639
  toggleDarkMode() {
1919
- this.themeService.toggleDarkMode();
1640
+ this.themeSwitcher.toggleDarkMode();
1920
1641
  }
1921
1642
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ThemeToggle, deps: [], target: i0.ɵɵFactoryTarget.Component });
1922
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: ThemeToggle, isStandalone: true, selector: "acp-theme-toggle", ngImport: i0, template: "<button\n mat-icon-button\n (click)=\"toggleDarkMode()\"\n title=\"{{ (darkMode$ | async) ? 'Modo D\u00EDa' : 'Modo Noche' }}\"\n>\n <mat-icon>{{ (darkMode$ | async) ? 'light_mode' : 'dark_mode' }}</mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
1643
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: ThemeToggle, isStandalone: true, selector: "acp-theme-toggle", inputs: { lightModeIcon: { classPropertyName: "lightModeIcon", publicName: "lightModeIcon", isSignal: true, isRequired: false, transformFunction: null }, darkModeIcon: { classPropertyName: "darkModeIcon", publicName: "darkModeIcon", isSignal: true, isRequired: false, transformFunction: null }, lightModeLabel: { classPropertyName: "lightModeLabel", publicName: "lightModeLabel", isSignal: true, isRequired: false, transformFunction: null }, darkModeLabel: { classPropertyName: "darkModeLabel", publicName: "darkModeLabel", isSignal: true, isRequired: false, transformFunction: null }, testId: { classPropertyName: "testId", publicName: "testId", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "acp-theme-toggle" }, ngImport: i0, template: "<button\n mat-icon-button\n type=\"button\"\n (click)=\"toggleDarkMode()\"\n [attr.aria-label]=\"currentLabel()\"\n [attr.aria-pressed]=\"isDarkMode()\"\n [matTooltip]=\"currentLabel()\"\n [attr.data-testid]=\"testId() || null\"\n>\n <mat-icon>{{ currentIcon() }}</mat-icon>\n</button>\n", styles: [".acp-theme-toggle{display:inline-block}\n"], dependencies: [{ kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1923
1644
  }
1924
1645
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ThemeToggle, decorators: [{
1925
1646
  type: Component,
1926
- args: [{ selector: 'acp-theme-toggle', imports: [MatIconButton, MatIcon, AsyncPipe], encapsulation: ViewEncapsulation.None, template: "<button\n mat-icon-button\n (click)=\"toggleDarkMode()\"\n title=\"{{ (darkMode$ | async) ? 'Modo D\u00EDa' : 'Modo Noche' }}\"\n>\n <mat-icon>{{ (darkMode$ | async) ? 'light_mode' : 'dark_mode' }}</mat-icon>\n</button>\n" }]
1927
- }], ctorParameters: () => [] });
1928
-
1929
- class FieldDefinition {
1930
- value;
1931
- valueLabel;
1932
- defaultValue;
1933
- defaultValueLabel;
1934
- key;
1935
- label;
1936
- dateRangeConfig;
1937
- isDefaultSearchField;
1938
- required;
1939
- disabled;
1940
- order;
1941
- icon;
1942
- controlType = 'textbox';
1943
- type = 'string';
1944
- editor; // this attribut is for Kendo-Grid
1945
- options;
1946
- valueOptions;
1947
- valuePrimitive; // for kendo dropdown
1948
- textField; // for kendo dropdown
1949
- valueField; // for kendo dropdown
1950
- errorMessage;
1951
- width;
1952
- valueChangeCallback;
1953
- columnType;
1954
- body;
1955
- constructor(options = {}) {
1956
- this.value = options.value;
1957
- this.valueLabel = options.valueLabel;
1958
- this.defaultValue = options.defaultValue;
1959
- this.defaultValueLabel = options.defaultValueLabel;
1960
- this.key = options.key || '';
1961
- this.label = options.label || '';
1962
- this.dateRangeConfig = options.dateRangeConfig;
1963
- this.isDefaultSearchField = options.isDefaultSearchField;
1964
- this.required = !!options.required;
1965
- this.disabled = options.disabled;
1966
- this.order = options.order === undefined ? 1 : options.order;
1967
- this.icon = options.icon;
1968
- this.controlType = options.controlType || 'textbox';
1969
- this.type = options.type || 'string';
1970
- this.editor = options.editor || '';
1971
- this.options = options.options || [];
1972
- this.valueOptions = options.valueOptions || [];
1973
- this.valuePrimitive = options.valuePrimitive;
1974
- this.textField = options.textField;
1975
- this.valueField = options.valueField;
1976
- this.errorMessage = options.errorMessage || '';
1977
- this.width = options.width;
1978
- this.valueChangeCallback = options.valueChangeCallback;
1979
- this.columnType = options.columnType;
1980
- this.body = options.body;
1981
- }
1982
- }
1983
-
1984
- class ColumnDefinition extends FieldDefinition {
1985
- index; // if the list of columns will be displayed in material edit-grid (angular material grid), index must be given
1986
- format; // it could be: { style: 'currency', currency: 'EUR' }, { date: 'short' }
1987
- hasFooter;
1988
- hideInOverlay;
1989
- // optionsAttribut is used in stock-receipt maintenance: StockReceiptItem.Unit has options for StockReceiptItem.Birimi
1990
- optionsAttribut; // name of the attribut that has the options list for dropdown
1991
- templateOutlet;
1992
- constructor(options = {}) {
1993
- super(options);
1994
- this.index = options.index;
1995
- this.format = options.format;
1996
- this.hasFooter = options.hasFooter;
1997
- this.hideInOverlay = options.hideInOverlay;
1998
- this.optionsAttribut = options.optionsAttribut;
1999
- this.templateOutlet = options.templateOutlet;
2000
- }
2001
- }
2002
-
2003
- class TableCellIndex {
2004
- row;
2005
- column;
2006
- constructor(row, column) {
2007
- this.row = row;
2008
- this.column = column;
2009
- }
2010
- }
1647
+ args: [{ selector: 'acp-theme-toggle', imports: [MatIconButton, MatIcon, MatTooltip], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1648
+ class: 'acp-theme-toggle',
1649
+ }, template: "<button\n mat-icon-button\n type=\"button\"\n (click)=\"toggleDarkMode()\"\n [attr.aria-label]=\"currentLabel()\"\n [attr.aria-pressed]=\"isDarkMode()\"\n [matTooltip]=\"currentLabel()\"\n [attr.data-testid]=\"testId() || null\"\n>\n <mat-icon>{{ currentIcon() }}</mat-icon>\n</button>\n", styles: [".acp-theme-toggle{display:inline-block}\n"] }]
1650
+ }], propDecorators: { lightModeIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "lightModeIcon", required: false }] }], darkModeIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "darkModeIcon", required: false }] }], lightModeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "lightModeLabel", required: false }] }], darkModeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "darkModeLabel", required: false }] }], testId: [{ type: i0.Input, args: [{ isSignal: true, alias: "testId", required: false }] }] } });
2011
1651
 
2012
1652
  class Pagination {
2013
1653
  totalRecords;
@@ -2445,7 +2085,7 @@ class ReusableAutocompleteComponent {
2445
2085
  this.searchInput()?.nativeElement?.focus();
2446
2086
  }
2447
2087
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReusableAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2448
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: ReusableAutocompleteComponent, isStandalone: true, selector: "acp-autocomplete-wrapper", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, searchFunction: { classPropertyName: "searchFunction", publicName: "searchFunction", isSignal: true, isRequired: false, transformFunction: null }, notFoundTemplate: { classPropertyName: "notFoundTemplate", publicName: "notFoundTemplate", isSignal: true, isRequired: false, transformFunction: null }, overlayWidth: { classPropertyName: "overlayWidth", publicName: "overlayWidth", isSignal: true, isRequired: false, transformFunction: null }, overlayMaxHeight: { classPropertyName: "overlayMaxHeight", publicName: "overlayMaxHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected", searchChanged: "searchChanged", searchRequested: "searchRequested", pageChanged: "pageChanged", filterChanged: "filterChanged", advancedSearchClicked: "advancedSearchClicked", allResultsClicked: "allResultsClicked", createClicked: "createClicked" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "historyListElement", first: true, predicate: ["historyListElement"], descendants: true, isSignal: true }, { propertyName: "resultsListElement", first: true, predicate: ["resultsListElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"acp-autocomplete-wrapper\" [class.acp-autocomplete-wrapper-active]=\"overlayOpen()\">\n <!-- Input Container -->\n <div\n class=\"acp-autocomplete-wrapper-input-container\"\n cdkOverlayOrigin\n #overlayPosition=\"cdkOverlayOrigin\"\n >\n <div class=\"acp-autocomplete-wrapper-input-wrapper\">\n <mat-icon class=\"acp-autocomplete-wrapper-search-icon\">search</mat-icon>\n <input\n #searchInput\n type=\"text\"\n class=\"acp-autocomplete-wrapper-input-field\"\n [placeholder]=\"config.placeholder\"\n [(ngModel)]=\"query\"\n (input)=\"onInput($event)\"\n (click)=\"showOverlay()\"\n (keydown)=\"onKeyDown($event)\"\n [disabled]=\"config.disabled || false\"\n autocomplete=\"off\"\n />\n @if (query && query.length > 0 && !isLoading()) {\n <button\n mat-icon-button\n (click)=\"clearSearch()\"\n type=\"button\"\n class=\"acp-autocomplete-wrapper-clear-button\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n }\n <button mat-icon-button type=\"button\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n @if (isLoading()) {\n <div class=\"acp-autocomplete-wrapper-loading-spinner\">\n <mat-spinner diameter=\"20\" />\n </div>\n }\n </div>\n\n <!-- Overlay -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayPosition\"\n [cdkConnectedOverlayOpen]=\"overlayOpen()\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n [cdkConnectedOverlayHeight]=\"overlayMaxHeight()\"\n (overlayOutsideClick)=\"hideOverlay()\"\n (backdropClick)=\"hideOverlay()\"\n >\n <div class=\"autocomplete-wrapper-dropdown\" [class.autocomplete-wrapper-active]=\"overlayOpen()\">\n <div class=\"autocomplete-wrapper-dropdown-content\">\n <!-- History Section -->\n @if (isHistoryVisible() && historyList().length > 0) {\n <div class=\"autocomplete-wrapper-section\">\n <div class=\"autocomplete-wrapper-section-header\">\n <span class=\"autocomplete-wrapper-section-title\">B\u00FAsquedas recientes</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"clearHistory()\"\n class=\"autocomplete-wrapper-clear-history-button\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n <ul\n class=\"autocomplete-wrapper-items-list autocomplete-wrapper-scrollable-list\"\n #historyListElement\n >\n @for (item of historyList(); track $index) {\n <li class=\"autocomplete-wrapper-list-item autocomplete-wrapper-history-item\">\n <div\n class=\"autocomplete-wrapper-item-content\"\n [class.autocomplete-wrapper-selected]=\"$index === selectedIndex()\"\n tabindex=\"0\"\n (click)=\"selectItem(item)\"\n (keydown.enter)=\"selectItem(item)\"\n >\n <mat-icon class=\"autocomplete-wrapper-history-icon\">history</mat-icon>\n <div class=\"autocomplete-wrapper-item-details\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate() || defaultItemTemplate;\n context: { $implicit: item }\n \"\n />\n </div>\n </div>\n <button\n type=\"button\"\n mat-icon-button\n class=\"autocomplete-wrapper-remove-button\"\n (click)=\"removeHistoryItem($index, $event)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n </ul>\n </div>\n }\n\n <!-- Results Section -->\n @if (!isHistoryVisible()) {\n <div class=\"autocomplete-wrapper-section\">\n <!-- Header with filters and pagination -->\n @if (config.enableFilters || config.enablePagination) {\n <div class=\"autocomplete-wrapper-section-header\">\n <span class=\"autocomplete-wrapper-section-title\">{{ sectionTitle() }}</span>\n\n <!-- Filters -->\n @if (config.enableFilters) {\n <div class=\"autocomplete-wrapper-filter-controls\">\n @if (config.searchFields && config.searchFields.length > 1) {\n <div class=\"autocomplete-wrapper-filter-group\">\n <label class=\"autocomplete-wrapper-filter-label\" for=\"searchBySelect\"\n >Buscar por:</label\n >\n <select\n id=\"searchBySelect\"\n class=\"autocomplete-wrapper-filter-select\"\n [(ngModel)]=\"filters.searchBy\"\n (change)=\"onFilterChange()\"\n >\n @for (field of config.searchFields; track $index) {\n <option [value]=\"field.value\">{{ field.label }}</option>\n }\n </select>\n </div>\n } @if (config.enableStockFilter && config.stockOptions) {\n <div class=\"autocomplete-wrapper-filter-group\">\n <label class=\"autocomplete-wrapper-filter-label\" for=\"stockSelect\">Stock:</label>\n <select\n id=\"stockSelect\"\n class=\"autocomplete-wrapper-filter-select\"\n [(ngModel)]=\"filters.stockFilter\"\n (change)=\"onFilterChange()\"\n >\n @for (option of config.stockOptions; track $index) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n }\n </div>\n }\n\n <!-- Pagination Controls -->\n @if (config.enablePagination && totalPages() > 1) {\n <div class=\"autocomplete-wrapper-pagination-header\">\n <div class=\"autocomplete-wrapper-pagination-info\">\n <span>P\u00E1gina {{ currentPage() }} de {{ totalPages() }}</span>\n </div>\n <div class=\"autocomplete-wrapper-pagination-controls\">\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToFirstPage()\"\n [disabled]=\"currentPage() === 1\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToPreviousPage()\"\n [disabled]=\"currentPage() === 1\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <input\n type=\"number\"\n class=\"autocomplete-wrapper-page-input\"\n [value]=\"currentPage()\"\n [min]=\"1\"\n [max]=\"totalPages()\"\n (change)=\"goToPage($event)\"\n />\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToNextPage()\"\n [disabled]=\"currentPage() === totalPages()\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToLastPage()\"\n [disabled]=\"currentPage() === totalPages()\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"autocomplete-wrapper-section-header\">\n <span class=\"autocomplete-wrapper-section-title\">{{ sectionTitle() }}</span>\n </div>\n }\n\n <!-- Items List -->\n @if (totalItems()) {\n <ul\n class=\"autocomplete-wrapper-items-list autocomplete-wrapper-scrollable-list\"\n #resultsListElement\n >\n @for (item of currentPageItems(); track $index) {\n <li class=\"autocomplete-wrapper-list-item autocomplete-wrapper-result-item\">\n <div\n class=\"autocomplete-wrapper-item-content\"\n [class.autocomplete-wrapper-selected]=\"$index === selectedIndex()\"\n tabindex=\"0\"\n (click)=\"selectItem(item)\"\n (keydown.enter)=\"selectItem(item)\"\n >\n <div class=\"autocomplete-wrapper-item-info\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate() || defaultItemTemplate;\n context: { $implicit: item }\n \"\n />\n </div>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n <!-- No Results -->\n @if (!isLoading() && isNoResults()) {\n <div class=\"autocomplete-wrapper-no-results\">\n <mat-icon class=\"autocomplete-wrapper-no-results-icon\">search_off</mat-icon>\n <div class=\"autocomplete-wrapper-no-results-content\">\n <ng-container\n *ngTemplateOutlet=\"\n notFoundTemplate() || defaultNotFoundTemplate;\n context: { $implicit: noResultsText() }\n \"\n />\n </div>\n </div>\n }\n\n <!-- Footer -->\n @if (overlayOpen() && totalItems() > 0) {\n <div class=\"autocomplete-wrapper-footer\">\n @if (!isHistoryVisible() && totalItems() > 0 && config.enablePagination) {\n <div class=\"autocomplete-wrapper-pagination-footer\">\n <div class=\"autocomplete-wrapper-pagination-summary\">\n Mostrando {{ startItem() }}-{{ endItem() }} de {{ totalCount() }} resultados\n </div>\n <div class=\"autocomplete-wrapper-pagination-controls-footer\">\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToPreviousPage()\"\n [disabled]=\"currentPage() === 1\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <span class=\"autocomplete-wrapper-page-indicator\"\n >{{ currentPage() }} / {{ totalPages() }}</span\n >\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToNextPage()\"\n [disabled]=\"currentPage() === totalPages()\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n } @if (config.enableFooterActions) {\n <div class=\"autocomplete-wrapper-footer-actions\">\n <button\n class=\"autocomplete-wrapper-footer-button autocomplete-wrapper-create-button\"\n (click)=\"onCreateNew($event)\"\n >\n <mat-icon>add</mat-icon>\n <span class=\"autocomplete-wrapper-button-text\">Crear</span>\n </button>\n <button\n class=\"autocomplete-wrapper-footer-button autocomplete-wrapper-search-button\"\n (click)=\"onAdvancedSearch()\"\n >\n <mat-icon>tune</mat-icon>\n <span class=\"autocomplete-wrapper-button-text\">Avanzada</span>\n </button>\n @if (!isHistoryVisible() && totalItems() > 0) {\n <button\n class=\"autocomplete-wrapper-footer-button autocomplete-wrapper-results-button\"\n (click)=\"onShowAllResults()\"\n >\n <mat-icon>list</mat-icon>\n <span class=\"autocomplete-wrapper-button-text\">Todos</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Default Templates -->\n <ng-template #defaultItemTemplate let-item>\n <div class=\"autocomplete-wrapper-default-item\">\n <div class=\"autocomplete-wrapper-item-name\">{{ getItemDisplayText(item) }}</div>\n @if (item.description && typeof item === 'object') {\n <div class=\"autocomplete-wrapper-item-description\">{{ item.description }}</div>\n }\n </div>\n </ng-template>\n\n <ng-template #defaultNotFoundTemplate let-text>\n <div class=\"autocomplete-wrapper-default-no-results\">\n <p>{{ text }}</p>\n <p>Intenta con otros t\u00E9rminos de b\u00FAsqueda</p>\n </div>\n </ng-template>\n</div>\n", styles: [".acp-autocomplete-wrapper{display:block}.acp-autocomplete-wrapper{position:relative;width:100%;max-width:100%}.acp-autocomplete-wrapper.acp-autocomplete-wrapper-active .acp-autocomplete-wrapper-input-wrapper{border-color:#1976d2;box-shadow:0 0 0 2px #1976d21a}.acp-autocomplete-wrapper-input-container{position:relative;width:100%}.acp-autocomplete-wrapper-input-wrapper{position:relative;display:flex;align-items:center;background:var(--mat-sys-surface, white);border:1px solid var(--mat-sys-outline-variant, #e0e0e0);border-radius:8px;padding:0 12px;transition:all .3s ease}.acp-autocomplete-wrapper-input-wrapper:focus-within{border-color:#1976d2;box-shadow:0 0 0 2px #1976d21a}.acp-autocomplete-wrapper-search-icon{color:var(--mat-sys-on-surface-variant, #666);margin-right:8px;font-size:20px}.acp-autocomplete-wrapper-input-field{flex:1;border:none;outline:none;font-size:16px;padding:7px 0;background:transparent;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-input-field::placeholder{color:var(--mat-sys-on-surface-variant, #999)}.acp-autocomplete-wrapper-input-field:disabled{opacity:.6;cursor:not-allowed}.acp-autocomplete-wrapper-clear-button{margin-left:8px;color:var(--mat-sys-on-surface-variant, #666);background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s ease}.acp-autocomplete-wrapper-clear-button:hover{background-color:#0000000a;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-loading-spinner{position:absolute;right:12px;top:50%;transform:translateY(-50%)}.acp-autocomplete-wrapper-dropdown{background:var(--mat-sys-surface-container, white);border-radius:8px;box-shadow:0 4px 20px #00000026;border:1px solid var(--mat-sys-outline-variant, #e0e0e0);overflow:hidden;max-height:500px;min-width:300px;display:flex;flex-direction:column}.acp-autocomplete-wrapper-dropdown.acp-autocomplete-wrapper-active{animation:reusableAutocompleteSlideIn .2s ease-out}@keyframes reusableAutocompleteSlideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.acp-autocomplete-wrapper-dropdown-content{display:flex;flex-direction:column;height:100%;max-height:500px}.acp-autocomplete-wrapper-section{display:flex;flex-direction:column;height:100%;min-height:0}.acp-autocomplete-wrapper-section-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px 8px;border-bottom:1px solid var(--mat-sys-outline-variant, #f0f0f0);background:var(--mat-sys-surface-variant, #fafafa);flex-shrink:0;min-height:56px;flex-wrap:wrap;gap:12px}.acp-autocomplete-wrapper-section-title{font-size:13px;font-weight:500;color:var(--mat-sys-on-surface-variant, #666);text-transform:uppercase;letter-spacing:.5px;white-space:nowrap}.acp-autocomplete-wrapper-clear-history-button{color:var(--mat-sys-on-surface-variant, #666);background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s ease}.acp-autocomplete-wrapper-clear-history-button:hover{background-color:#0000000a;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-filter-controls{display:flex;align-items:center;gap:16px;flex:1;justify-content:center}.acp-autocomplete-wrapper-filter-group{display:flex;align-items:center;gap:6px}.acp-autocomplete-wrapper-filter-label{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);font-weight:500;white-space:nowrap}.acp-autocomplete-wrapper-filter-select{padding:4px 8px;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;font-size:12px;background:var(--mat-sys-surface, white);color:var(--mat-sys-on-surface, #333);cursor:pointer;min-width:120px}.acp-autocomplete-wrapper-filter-select:focus{outline:none;border-color:#1976d2;box-shadow:0 0 0 1px #1976d233}.acp-autocomplete-wrapper-filter-select:hover{border-color:#bbb}.acp-autocomplete-wrapper-pagination-header{display:flex;align-items:center;gap:12px;margin-left:auto}.acp-autocomplete-wrapper-pagination-info{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);white-space:nowrap}.acp-autocomplete-wrapper-pagination-controls{display:flex;align-items:center;gap:4px}.acp-autocomplete-wrapper-pagination-button{min-width:32px;height:32px;line-height:32px;padding:0;color:var(--mat-sys-on-surface-variant, #666);background:none;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.acp-autocomplete-wrapper-pagination-button:hover:not(:disabled){background-color:#0000000a;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-pagination-button:disabled{opacity:.5;cursor:not-allowed}.acp-autocomplete-wrapper-pagination-button mat-icon{font-size:18px;width:18px;height:18px}.acp-autocomplete-wrapper-page-input{width:50px;height:32px;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;text-align:center;font-size:12px;padding:4px;margin:0 4px}.acp-autocomplete-wrapper-page-input:focus{outline:none;border-color:#1976d2}.acp-autocomplete-wrapper-items-list{list-style:none;margin:0;padding:0;flex:1;min-height:0}.acp-autocomplete-wrapper-items-list.acp-autocomplete-wrapper-scrollable-list{overflow-y:auto}.acp-autocomplete-wrapper-list-item{display:flex;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant, #f5f5f5);transition:background-color .2s ease}.acp-autocomplete-wrapper-list-item:last-child{border-bottom:none}.acp-autocomplete-wrapper-list-item:hover{background-color:var(--mat-sys-surface-variant, #f8f9fa)}.acp-autocomplete-wrapper-item-content{flex:1;display:flex;align-items:center;padding:12px 16px;cursor:pointer;min-height:48px;transition:all .2s ease}.acp-autocomplete-wrapper-item-content.acp-autocomplete-wrapper-selected{background-color:var(--mat-sys-primary-container, #e3f2fd);color:var(--mat-sys-on-primary-container, #1976d2)}.acp-autocomplete-wrapper-history-item .acp-autocomplete-wrapper-item-content{padding-left:12px}.acp-autocomplete-wrapper-history-icon{color:var(--mat-sys-on-surface-variant, #999);margin-right:12px;font-size:18px}.acp-autocomplete-wrapper-item-details{flex:1;display:flex;align-items:center}.acp-autocomplete-wrapper-remove-button{margin-right:8px}.acp-autocomplete-wrapper-result-item{position:relative}.acp-autocomplete-wrapper-item-info{flex:1;display:flex;align-items:center}.acp-autocomplete-wrapper-default-item{flex:1}.acp-autocomplete-wrapper-default-item .acp-autocomplete-wrapper-item-name{font-weight:500;font-size:14px;margin-bottom:2px;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-default-item .acp-autocomplete-wrapper-item-description{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acp-autocomplete-wrapper-no-results{display:flex;flex-direction:column;align-items:center;padding:32px 16px;text-align:center;color:var(--mat-sys-on-surface-variant, #666)}.acp-autocomplete-wrapper-no-results-icon{font-size:48px;color:var(--mat-sys-outline, #ccc);margin-bottom:16px;width:45px;height:45px}.acp-autocomplete-wrapper-no-results-content{font-size:14px;line-height:1.5}.acp-autocomplete-wrapper-default-no-results{text-align:center}.acp-autocomplete-wrapper-default-no-results p:first-child{font-weight:500;margin-bottom:8px}.acp-autocomplete-wrapper-footer{border-top:1px solid var(--mat-sys-outline-variant, #f0f0f0);background:var(--mat-sys-surface-variant, #fafafa);flex-shrink:0;padding:12px 16px;display:flex;flex-direction:column;gap:12px}.acp-autocomplete-wrapper-pagination-footer{display:flex;align-items:center;justify-content:space-between;width:100%;gap:16px}.acp-autocomplete-wrapper-pagination-summary{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);white-space:nowrap}.acp-autocomplete-wrapper-pagination-controls-footer{display:flex;align-items:center;gap:8px}.acp-autocomplete-wrapper-page-indicator{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);min-width:40px;text-align:center}.acp-autocomplete-wrapper-footer-actions{display:flex;gap:8px;flex-wrap:wrap}.acp-autocomplete-wrapper-footer-button{flex:1;display:flex;align-items:center;justify-content:center;gap:8px;min-height:40px;font-size:13px;text-transform:none;white-space:nowrap;background:none;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;cursor:pointer;padding:8px 12px;transition:all .2s ease}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-create-button{background-color:#4caf500a;border-color:#4caf50;color:#4caf50}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-create-button:hover{background-color:#4caf5014}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-search-button{background-color:#ff98000a;border-color:#ff9800;color:#ff9800}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-search-button:hover{background-color:#ff980014}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-results-button{background-color:#3f51b50a;border-color:#3f51b5;color:#3f51b5}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-results-button:hover{background-color:#3f51b514}.acp-autocomplete-wrapper-button-text{display:inline}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar{width:6px}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar-track{background:var(--mat-sys-surface-variant, #f1f1f1);border-radius:3px}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar-thumb{background:var(--mat-sys-outline, #c1c1c1);border-radius:3px}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar-thumb:hover{background:var(--mat-sys-on-surface-variant, #a8a8a8)}@media(max-width:768px){.acp-autocomplete-wrapper-dropdown{min-width:280px;max-height:60vh}.acp-autocomplete-wrapper-dropdown-content{max-height:60vh}.acp-autocomplete-wrapper-input-field{font-size:16px}.acp-autocomplete-wrapper-footer{padding:8px 12px}.acp-autocomplete-wrapper-footer-actions{flex-direction:column;gap:6px}.acp-autocomplete-wrapper-footer-button{width:100%;min-height:44px}.acp-autocomplete-wrapper-pagination-footer{flex-direction:column;gap:8px}.acp-autocomplete-wrapper-section-header{flex-direction:column;align-items:flex-start;min-height:80px;gap:8px}.acp-autocomplete-wrapper-filter-controls{width:100%;justify-content:flex-start;flex-wrap:wrap;gap:12px}.acp-autocomplete-wrapper-filter-select{min-width:100px;font-size:11px}.acp-autocomplete-wrapper-filter-label{font-size:11px}.acp-autocomplete-wrapper-pagination-header{width:100%;justify-content:space-between}.acp-autocomplete-wrapper-pagination-header .acp-autocomplete-wrapper-pagination-info{display:none}.acp-autocomplete-wrapper-pagination-controls{gap:2px}.acp-autocomplete-wrapper-page-input{width:40px}.acp-autocomplete-wrapper-item-content{padding:16px 12px;min-height:52px}.acp-autocomplete-wrapper-button-text{font-size:12px}.acp-autocomplete-wrapper-items-list.acp-autocomplete-wrapper-scrollable-list{max-height:250px}}@media(max-width:480px){.acp-autocomplete-wrapper-dropdown{min-width:260px;max-height:50vh}.acp-autocomplete-wrapper-section-header{padding:8px 12px 6px;min-height:70px;gap:6px}.acp-autocomplete-wrapper-filter-controls{gap:8px}.acp-autocomplete-wrapper-filter-group{gap:4px}.acp-autocomplete-wrapper-filter-select{min-width:90px;padding:3px 6px}.acp-autocomplete-wrapper-item-content{padding:14px 12px}.acp-autocomplete-wrapper-pagination-header{gap:8px}.acp-autocomplete-wrapper-pagination-button{min-width:28px;height:28px}.acp-autocomplete-wrapper-page-input{width:35px;height:28px}.acp-autocomplete-wrapper-items-list.acp-autocomplete-wrapper-scrollable-list{max-height:200px}.acp-autocomplete-wrapper-footer-actions{gap:4px}.acp-autocomplete-wrapper-footer-button{font-size:12px;padding:8px 12px;min-height:40px}.acp-autocomplete-wrapper-button-text{display:none}}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }], encapsulation: i0.ViewEncapsulation.None });
2088
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: ReusableAutocompleteComponent, isStandalone: true, selector: "acp-autocomplete-wrapper", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, searchFunction: { classPropertyName: "searchFunction", publicName: "searchFunction", isSignal: true, isRequired: false, transformFunction: null }, notFoundTemplate: { classPropertyName: "notFoundTemplate", publicName: "notFoundTemplate", isSignal: true, isRequired: false, transformFunction: null }, overlayWidth: { classPropertyName: "overlayWidth", publicName: "overlayWidth", isSignal: true, isRequired: false, transformFunction: null }, overlayMaxHeight: { classPropertyName: "overlayMaxHeight", publicName: "overlayMaxHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected", searchChanged: "searchChanged", searchRequested: "searchRequested", pageChanged: "pageChanged", filterChanged: "filterChanged", advancedSearchClicked: "advancedSearchClicked", allResultsClicked: "allResultsClicked", createClicked: "createClicked" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "historyListElement", first: true, predicate: ["historyListElement"], descendants: true, isSignal: true }, { propertyName: "resultsListElement", first: true, predicate: ["resultsListElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"acp-autocomplete-wrapper\" [class.acp-autocomplete-wrapper-active]=\"overlayOpen()\">\n <!-- Input Container -->\n <div\n class=\"acp-autocomplete-wrapper-input-container\"\n cdkOverlayOrigin\n #overlayPosition=\"cdkOverlayOrigin\"\n >\n <div class=\"acp-autocomplete-wrapper-input-wrapper\">\n <mat-icon class=\"acp-autocomplete-wrapper-search-icon\">search</mat-icon>\n <input\n #searchInput\n type=\"text\"\n class=\"acp-autocomplete-wrapper-input-field\"\n [placeholder]=\"config.placeholder\"\n [(ngModel)]=\"query\"\n (input)=\"onInput($event)\"\n (click)=\"showOverlay()\"\n (keydown)=\"onKeyDown($event)\"\n [disabled]=\"config.disabled || false\"\n autocomplete=\"off\"\n />\n @if (query && query.length > 0 && !isLoading()) {\n <button\n mat-icon-button\n (click)=\"clearSearch()\"\n type=\"button\"\n class=\"acp-autocomplete-wrapper-clear-button\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n }\n <button mat-icon-button type=\"button\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n @if (isLoading()) {\n <div class=\"acp-autocomplete-wrapper-loading-spinner\">\n <mat-spinner diameter=\"20\" />\n </div>\n }\n </div>\n\n <!-- Overlay -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayPosition\"\n [cdkConnectedOverlayOpen]=\"overlayOpen()\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n [cdkConnectedOverlayHeight]=\"overlayMaxHeight()\"\n (overlayOutsideClick)=\"hideOverlay()\"\n (backdropClick)=\"hideOverlay()\"\n >\n <div class=\"autocomplete-wrapper-dropdown\" [class.autocomplete-wrapper-active]=\"overlayOpen()\">\n <div class=\"autocomplete-wrapper-dropdown-content\">\n <!-- History Section -->\n @if (isHistoryVisible() && historyList().length > 0) {\n <div class=\"autocomplete-wrapper-section\">\n <div class=\"autocomplete-wrapper-section-header\">\n <span class=\"autocomplete-wrapper-section-title\">B\u00FAsquedas recientes</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"clearHistory()\"\n class=\"autocomplete-wrapper-clear-history-button\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n </div>\n <ul\n class=\"autocomplete-wrapper-items-list autocomplete-wrapper-scrollable-list\"\n #historyListElement\n >\n @for (item of historyList(); track $index) {\n <li class=\"autocomplete-wrapper-list-item autocomplete-wrapper-history-item\">\n <div\n class=\"autocomplete-wrapper-item-content\"\n [class.autocomplete-wrapper-selected]=\"$index === selectedIndex()\"\n tabindex=\"0\"\n (click)=\"selectItem(item)\"\n (keydown.enter)=\"selectItem(item)\"\n >\n <mat-icon class=\"autocomplete-wrapper-history-icon\">history</mat-icon>\n <div class=\"autocomplete-wrapper-item-details\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate() || defaultItemTemplate;\n context: { $implicit: item }\n \"\n />\n </div>\n </div>\n <button\n type=\"button\"\n mat-icon-button\n class=\"autocomplete-wrapper-remove-button\"\n (click)=\"removeHistoryItem($index, $event)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n </ul>\n </div>\n }\n\n <!-- Results Section -->\n @if (!isHistoryVisible()) {\n <div class=\"autocomplete-wrapper-section\">\n <!-- Header with filters and pagination -->\n @if (config.enableFilters || config.enablePagination) {\n <div class=\"autocomplete-wrapper-section-header\">\n <span class=\"autocomplete-wrapper-section-title\">{{ sectionTitle() }}</span>\n\n <!-- Filters -->\n @if (config.enableFilters) {\n <div class=\"autocomplete-wrapper-filter-controls\">\n @if (config.searchFields && config.searchFields.length > 1) {\n <div class=\"autocomplete-wrapper-filter-group\">\n <label class=\"autocomplete-wrapper-filter-label\" for=\"searchBySelect\"\n >Buscar por:</label\n >\n <select\n id=\"searchBySelect\"\n class=\"autocomplete-wrapper-filter-select\"\n [(ngModel)]=\"filters.searchBy\"\n (change)=\"onFilterChange()\"\n >\n @for (field of config.searchFields; track $index) {\n <option [value]=\"field.value\">{{ field.label }}</option>\n }\n </select>\n </div>\n } @if (config.enableStockFilter && config.stockOptions) {\n <div class=\"autocomplete-wrapper-filter-group\">\n <label class=\"autocomplete-wrapper-filter-label\" for=\"stockSelect\">Stock:</label>\n <select\n id=\"stockSelect\"\n class=\"autocomplete-wrapper-filter-select\"\n [(ngModel)]=\"filters.stockFilter\"\n (change)=\"onFilterChange()\"\n >\n @for (option of config.stockOptions; track $index) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n }\n </div>\n }\n\n <!-- Pagination Controls -->\n @if (config.enablePagination && totalPages() > 1) {\n <div class=\"autocomplete-wrapper-pagination-header\">\n <div class=\"autocomplete-wrapper-pagination-info\">\n <span>P\u00E1gina {{ currentPage() }} de {{ totalPages() }}</span>\n </div>\n <div class=\"autocomplete-wrapper-pagination-controls\">\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToFirstPage()\"\n [disabled]=\"currentPage() === 1\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToPreviousPage()\"\n [disabled]=\"currentPage() === 1\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <input\n type=\"number\"\n class=\"autocomplete-wrapper-page-input\"\n [value]=\"currentPage()\"\n [min]=\"1\"\n [max]=\"totalPages()\"\n (change)=\"goToPage($event)\"\n />\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToNextPage()\"\n [disabled]=\"currentPage() === totalPages()\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToLastPage()\"\n [disabled]=\"currentPage() === totalPages()\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"autocomplete-wrapper-section-header\">\n <span class=\"autocomplete-wrapper-section-title\">{{ sectionTitle() }}</span>\n </div>\n }\n\n <!-- Items List -->\n @if (totalItems()) {\n <ul\n class=\"autocomplete-wrapper-items-list autocomplete-wrapper-scrollable-list\"\n #resultsListElement\n >\n @for (item of currentPageItems(); track $index) {\n <li class=\"autocomplete-wrapper-list-item autocomplete-wrapper-result-item\">\n <div\n class=\"autocomplete-wrapper-item-content\"\n [class.autocomplete-wrapper-selected]=\"$index === selectedIndex()\"\n tabindex=\"0\"\n (click)=\"selectItem(item)\"\n (keydown.enter)=\"selectItem(item)\"\n >\n <div class=\"autocomplete-wrapper-item-info\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate() || defaultItemTemplate;\n context: { $implicit: item }\n \"\n />\n </div>\n </div>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n <!-- No Results -->\n @if (!isLoading() && isNoResults()) {\n <div class=\"autocomplete-wrapper-no-results\">\n <mat-icon class=\"autocomplete-wrapper-no-results-icon\">search_off</mat-icon>\n <div class=\"autocomplete-wrapper-no-results-content\">\n <ng-container\n *ngTemplateOutlet=\"\n notFoundTemplate() || defaultNotFoundTemplate;\n context: { $implicit: noResultsText() }\n \"\n />\n </div>\n </div>\n }\n\n <!-- Footer -->\n @if (overlayOpen() && totalItems() > 0) {\n <div class=\"autocomplete-wrapper-footer\">\n @if (!isHistoryVisible() && totalItems() > 0 && config.enablePagination) {\n <div class=\"autocomplete-wrapper-pagination-footer\">\n <div class=\"autocomplete-wrapper-pagination-summary\">\n Mostrando {{ startItem() }}-{{ endItem() }} de {{ totalCount() }} resultados\n </div>\n <div class=\"autocomplete-wrapper-pagination-controls-footer\">\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToPreviousPage()\"\n [disabled]=\"currentPage() === 1\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <span class=\"autocomplete-wrapper-page-indicator\"\n >{{ currentPage() }} / {{ totalPages() }}</span\n >\n <button\n class=\"autocomplete-wrapper-pagination-button\"\n (click)=\"goToNextPage()\"\n [disabled]=\"currentPage() === totalPages()\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n } @if (config.enableFooterActions) {\n <div class=\"autocomplete-wrapper-footer-actions\">\n <button\n class=\"autocomplete-wrapper-footer-button autocomplete-wrapper-create-button\"\n (click)=\"onCreateNew($event)\"\n >\n <mat-icon>add</mat-icon>\n <span class=\"autocomplete-wrapper-button-text\">Crear</span>\n </button>\n <button\n class=\"autocomplete-wrapper-footer-button autocomplete-wrapper-search-button\"\n (click)=\"onAdvancedSearch()\"\n >\n <mat-icon>tune</mat-icon>\n <span class=\"autocomplete-wrapper-button-text\">Avanzada</span>\n </button>\n @if (!isHistoryVisible() && totalItems() > 0) {\n <button\n class=\"autocomplete-wrapper-footer-button autocomplete-wrapper-results-button\"\n (click)=\"onShowAllResults()\"\n >\n <mat-icon>list</mat-icon>\n <span class=\"autocomplete-wrapper-button-text\">Todos</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Default Templates -->\n <ng-template #defaultItemTemplate let-item>\n <div class=\"autocomplete-wrapper-default-item\">\n <div class=\"autocomplete-wrapper-item-name\">{{ getItemDisplayText(item) }}</div>\n @if (item.description && typeof item === 'object') {\n <div class=\"autocomplete-wrapper-item-description\">{{ item.description }}</div>\n }\n </div>\n </ng-template>\n\n <ng-template #defaultNotFoundTemplate let-text>\n <div class=\"autocomplete-wrapper-default-no-results\">\n <p>{{ text }}</p>\n <p>Intenta con otros t\u00E9rminos de b\u00FAsqueda</p>\n </div>\n </ng-template>\n</div>\n", styles: [".acp-autocomplete-wrapper{display:block}.acp-autocomplete-wrapper{position:relative;width:100%;max-width:100%}.acp-autocomplete-wrapper.acp-autocomplete-wrapper-active .acp-autocomplete-wrapper-input-wrapper{border-color:#1976d2;box-shadow:0 0 0 2px #1976d21a}.acp-autocomplete-wrapper-input-container{position:relative;width:100%}.acp-autocomplete-wrapper-input-wrapper{position:relative;display:flex;align-items:center;background:var(--mat-sys-surface, white);border:1px solid var(--mat-sys-outline-variant, #e0e0e0);border-radius:8px;padding:0 12px;transition:all .3s ease}.acp-autocomplete-wrapper-input-wrapper:focus-within{border-color:#1976d2;box-shadow:0 0 0 2px #1976d21a}.acp-autocomplete-wrapper-search-icon{color:var(--mat-sys-on-surface-variant, #666);margin-right:8px;font-size:20px}.acp-autocomplete-wrapper-input-field{flex:1;border:none;outline:none;font-size:16px;padding:7px 0;background:transparent;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-input-field::placeholder{color:var(--mat-sys-on-surface-variant, #999)}.acp-autocomplete-wrapper-input-field:disabled{opacity:.6;cursor:not-allowed}.acp-autocomplete-wrapper-clear-button{margin-left:8px;color:var(--mat-sys-on-surface-variant, #666);background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s ease}.acp-autocomplete-wrapper-clear-button:hover{background-color:#0000000a;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-loading-spinner{position:absolute;right:12px;top:50%;transform:translateY(-50%)}.acp-autocomplete-wrapper-dropdown{background:var(--mat-sys-surface-container, white);border-radius:8px;box-shadow:0 4px 20px #00000026;border:1px solid var(--mat-sys-outline-variant, #e0e0e0);overflow:hidden;max-height:500px;min-width:300px;display:flex;flex-direction:column}.acp-autocomplete-wrapper-dropdown.acp-autocomplete-wrapper-active{animation:reusableAutocompleteSlideIn .2s ease-out}@keyframes reusableAutocompleteSlideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.acp-autocomplete-wrapper-dropdown-content{display:flex;flex-direction:column;height:100%;max-height:500px}.acp-autocomplete-wrapper-section{display:flex;flex-direction:column;height:100%;min-height:0}.acp-autocomplete-wrapper-section-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px 8px;border-bottom:1px solid var(--mat-sys-outline-variant, #f0f0f0);background:var(--mat-sys-surface-variant, #fafafa);flex-shrink:0;min-height:56px;flex-wrap:wrap;gap:12px}.acp-autocomplete-wrapper-section-title{font-size:13px;font-weight:500;color:var(--mat-sys-on-surface-variant, #666);text-transform:uppercase;letter-spacing:.5px;white-space:nowrap}.acp-autocomplete-wrapper-clear-history-button{color:var(--mat-sys-on-surface-variant, #666);background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;transition:all .2s ease}.acp-autocomplete-wrapper-clear-history-button:hover{background-color:#0000000a;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-filter-controls{display:flex;align-items:center;gap:16px;flex:1;justify-content:center}.acp-autocomplete-wrapper-filter-group{display:flex;align-items:center;gap:6px}.acp-autocomplete-wrapper-filter-label{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);font-weight:500;white-space:nowrap}.acp-autocomplete-wrapper-filter-select{padding:4px 8px;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;font-size:12px;background:var(--mat-sys-surface, white);color:var(--mat-sys-on-surface, #333);cursor:pointer;min-width:120px}.acp-autocomplete-wrapper-filter-select:focus{outline:none;border-color:#1976d2;box-shadow:0 0 0 1px #1976d233}.acp-autocomplete-wrapper-filter-select:hover{border-color:#bbb}.acp-autocomplete-wrapper-pagination-header{display:flex;align-items:center;gap:12px;margin-left:auto}.acp-autocomplete-wrapper-pagination-info{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);white-space:nowrap}.acp-autocomplete-wrapper-pagination-controls{display:flex;align-items:center;gap:4px}.acp-autocomplete-wrapper-pagination-button{min-width:32px;height:32px;line-height:32px;padding:0;color:var(--mat-sys-on-surface-variant, #666);background:none;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.acp-autocomplete-wrapper-pagination-button:hover:not(:disabled){background-color:#0000000a;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-pagination-button:disabled{opacity:.5;cursor:not-allowed}.acp-autocomplete-wrapper-pagination-button mat-icon{font-size:18px;width:18px;height:18px}.acp-autocomplete-wrapper-page-input{width:50px;height:32px;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;text-align:center;font-size:12px;padding:4px;margin:0 4px}.acp-autocomplete-wrapper-page-input:focus{outline:none;border-color:#1976d2}.acp-autocomplete-wrapper-items-list{list-style:none;margin:0;padding:0;flex:1;min-height:0}.acp-autocomplete-wrapper-items-list.acp-autocomplete-wrapper-scrollable-list{overflow-y:auto}.acp-autocomplete-wrapper-list-item{display:flex;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant, #f5f5f5);transition:background-color .2s ease}.acp-autocomplete-wrapper-list-item:last-child{border-bottom:none}.acp-autocomplete-wrapper-list-item:hover{background-color:var(--mat-sys-surface-variant, #f8f9fa)}.acp-autocomplete-wrapper-item-content{flex:1;display:flex;align-items:center;padding:12px 16px;cursor:pointer;min-height:48px;transition:all .2s ease}.acp-autocomplete-wrapper-item-content.acp-autocomplete-wrapper-selected{background-color:var(--mat-sys-primary-container, #e3f2fd);color:var(--mat-sys-on-primary-container, #1976d2)}.acp-autocomplete-wrapper-history-item .acp-autocomplete-wrapper-item-content{padding-left:12px}.acp-autocomplete-wrapper-history-icon{color:var(--mat-sys-on-surface-variant, #999);margin-right:12px;font-size:18px}.acp-autocomplete-wrapper-item-details{flex:1;display:flex;align-items:center}.acp-autocomplete-wrapper-remove-button{margin-right:8px}.acp-autocomplete-wrapper-result-item{position:relative}.acp-autocomplete-wrapper-item-info{flex:1;display:flex;align-items:center}.acp-autocomplete-wrapper-default-item{flex:1}.acp-autocomplete-wrapper-default-item .acp-autocomplete-wrapper-item-name{font-weight:500;font-size:14px;margin-bottom:2px;color:var(--mat-sys-on-surface, #333)}.acp-autocomplete-wrapper-default-item .acp-autocomplete-wrapper-item-description{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acp-autocomplete-wrapper-no-results{display:flex;flex-direction:column;align-items:center;padding:32px 16px;text-align:center;color:var(--mat-sys-on-surface-variant, #666)}.acp-autocomplete-wrapper-no-results-icon{font-size:48px;color:var(--mat-sys-outline, #ccc);margin-bottom:16px;width:45px;height:45px}.acp-autocomplete-wrapper-no-results-content{font-size:14px;line-height:1.5}.acp-autocomplete-wrapper-default-no-results{text-align:center}.acp-autocomplete-wrapper-default-no-results p:first-child{font-weight:500;margin-bottom:8px}.acp-autocomplete-wrapper-footer{border-top:1px solid var(--mat-sys-outline-variant, #f0f0f0);background:var(--mat-sys-surface-variant, #fafafa);flex-shrink:0;padding:12px 16px;display:flex;flex-direction:column;gap:12px}.acp-autocomplete-wrapper-pagination-footer{display:flex;align-items:center;justify-content:space-between;width:100%;gap:16px}.acp-autocomplete-wrapper-pagination-summary{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);white-space:nowrap}.acp-autocomplete-wrapper-pagination-controls-footer{display:flex;align-items:center;gap:8px}.acp-autocomplete-wrapper-page-indicator{font-size:12px;color:var(--mat-sys-on-surface-variant, #666);min-width:40px;text-align:center}.acp-autocomplete-wrapper-footer-actions{display:flex;gap:8px;flex-wrap:wrap}.acp-autocomplete-wrapper-footer-button{flex:1;display:flex;align-items:center;justify-content:center;gap:8px;min-height:40px;font-size:13px;text-transform:none;white-space:nowrap;background:none;border:1px solid var(--mat-sys-outline, #ddd);border-radius:4px;cursor:pointer;padding:8px 12px;transition:all .2s ease}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-create-button{background-color:#4caf500a;border-color:#4caf50;color:#4caf50}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-create-button:hover{background-color:#4caf5014}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-search-button{background-color:#ff98000a;border-color:#ff9800;color:#ff9800}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-search-button:hover{background-color:#ff980014}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-results-button{background-color:#3f51b50a;border-color:#3f51b5;color:#3f51b5}.acp-autocomplete-wrapper-footer-button.acp-autocomplete-wrapper-results-button:hover{background-color:#3f51b514}.acp-autocomplete-wrapper-button-text{display:inline}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar{width:6px}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar-track{background:var(--mat-sys-surface-variant, #f1f1f1);border-radius:3px}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar-thumb{background:var(--mat-sys-outline, #c1c1c1);border-radius:3px}.acp-autocomplete-wrapper-items-list::-webkit-scrollbar-thumb:hover{background:var(--mat-sys-on-surface-variant, #a8a8a8)}@media(max-width:768px){.acp-autocomplete-wrapper-dropdown{min-width:280px;max-height:60vh}.acp-autocomplete-wrapper-dropdown-content{max-height:60vh}.acp-autocomplete-wrapper-input-field{font-size:16px}.acp-autocomplete-wrapper-footer{padding:8px 12px}.acp-autocomplete-wrapper-footer-actions{flex-direction:column;gap:6px}.acp-autocomplete-wrapper-footer-button{width:100%;min-height:44px}.acp-autocomplete-wrapper-pagination-footer{flex-direction:column;gap:8px}.acp-autocomplete-wrapper-section-header{flex-direction:column;align-items:flex-start;min-height:80px;gap:8px}.acp-autocomplete-wrapper-filter-controls{width:100%;justify-content:flex-start;flex-wrap:wrap;gap:12px}.acp-autocomplete-wrapper-filter-select{min-width:100px;font-size:11px}.acp-autocomplete-wrapper-filter-label{font-size:11px}.acp-autocomplete-wrapper-pagination-header{width:100%;justify-content:space-between}.acp-autocomplete-wrapper-pagination-header .acp-autocomplete-wrapper-pagination-info{display:none}.acp-autocomplete-wrapper-pagination-controls{gap:2px}.acp-autocomplete-wrapper-page-input{width:40px}.acp-autocomplete-wrapper-item-content{padding:16px 12px;min-height:52px}.acp-autocomplete-wrapper-button-text{font-size:12px}.acp-autocomplete-wrapper-items-list.acp-autocomplete-wrapper-scrollable-list{max-height:250px}}@media(max-width:480px){.acp-autocomplete-wrapper-dropdown{min-width:260px;max-height:50vh}.acp-autocomplete-wrapper-section-header{padding:8px 12px 6px;min-height:70px;gap:6px}.acp-autocomplete-wrapper-filter-controls{gap:8px}.acp-autocomplete-wrapper-filter-group{gap:4px}.acp-autocomplete-wrapper-filter-select{min-width:90px;padding:3px 6px}.acp-autocomplete-wrapper-item-content{padding:14px 12px}.acp-autocomplete-wrapper-pagination-header{gap:8px}.acp-autocomplete-wrapper-pagination-button{min-width:28px;height:28px}.acp-autocomplete-wrapper-page-input{width:35px;height:28px}.acp-autocomplete-wrapper-items-list.acp-autocomplete-wrapper-scrollable-list{max-height:200px}.acp-autocomplete-wrapper-footer-actions{gap:4px}.acp-autocomplete-wrapper-footer-button{font-size:12px;padding:8px 12px;min-height:40px}.acp-autocomplete-wrapper-button-text{display:none}}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }], encapsulation: i0.ViewEncapsulation.None });
2449
2089
  }
2450
2090
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ReusableAutocompleteComponent, decorators: [{
2451
2091
  type: Component,
@@ -2939,7 +2579,7 @@ class DataGridCell {
2939
2579
  }
2940
2580
  }
2941
2581
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DataGridCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
2942
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DataGridCell, isStandalone: true, selector: "acp-data-grid-cell", inputs: { rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: false, transformFunction: null }, colDef: { classPropertyName: "colDef", publicName: "colDef", isSignal: true, isRequired: false, transformFunction: null }, summary: { classPropertyName: "summary", publicName: "summary", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowDataChange: "rowDataChange" }, ngImport: i0, template: "@if (summary()) {\n<span\n [title]=\"_getFormatterTooltip(data() | cellSummary: colDef())\"\n [innerHTML]=\"_getText(data() | cellSummary: colDef())\"\n>\n</span>\n} @else {\n<!-- Custom formatting -->\n@if (colDef().formatter) {\n<span\n [title]=\"_getFormatterTooltip(colDef().formatter(rowData(), colDef()))\"\n [innerHTML]=\"_getText(colDef().formatter(rowData(), colDef()))\"\n>\n</span>\n} @else {\n<!-- Default formatting -->\n@switch (colDef().type) {\n<!-- Buttons -->\n@case ('button') { @for ( btn of colDef().buttons | cellActions: rowData() : rowChangeRecord :\nrowChangeRecord?.currentValue; track btn ) { @if (!btn.iif || btn.iif(rowData())) { @if\n(btn.children && btn.children.length > 0) { @if (btn.type === 'icon') {\n<button\n matIconButton\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n [matMenuTriggerFor]=\"\n btn.children && btn.children.length > 0 ? gridMenu.menu : null\n \"\n (click)=\"$event.stopPropagation()\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n</button>\n\n<acp-data-grid-menu #gridMenu [items]=\"btn.children || []\" [data]=\"rowData()\" />\n} @else {\n<button\n [matButton]=\"btn.type || 'text'\"\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n [matMenuTriggerFor]=\"\n btn.children && btn.children.length > 0 ? gridMenu.menu : null\n \"\n (click)=\"$event.stopPropagation()\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n <span>{{ btn.text | toObservable | async }}</span>\n</button>\n\n<acp-data-grid-menu #gridMenu [items]=\"btn.children || []\" [data]=\"rowData()\" />\n} } @else { @if (btn.type === 'icon') {\n<button\n matIconButton\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n (click)=\"_onActionClick($event, btn, rowData())\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n</button>\n} @else {\n<button\n [matButton]=\"btn.type || 'text'\"\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n (click)=\"_onActionClick($event, btn, rowData())\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n <span>{{ btn.text | toObservable | async }}</span>\n</button>\n} } } } }\n<!-- Tag -->\n@case ('tag') { @if (colDef().tag && colDef().tag[_value]) {\n<mat-chip-listbox>\n <mat-chip color=\"primary\" [class]=\"'bg-' + colDef().tag[_value].color\">\n {{ colDef().tag[_value].text }}\n </mat-chip>\n</mat-chip-listbox>\n} @else { {{ _value }} } }\n<!-- Link -->\n@case ('link') {\n<a [href]=\"_value\" target=\"_blank\">{{ _value }}</a>\n}\n<!-- Image -->\n@case ('image') { @if (_value) {\n<!-- Imagen real -->\n<img class=\"placeholder-image\" [src]=\"_value\" alt=\"img\" />\n} @else {\n<!-- Placeholder -->\n<div class=\"placeholder-box\">\n <svg class=\"placeholder-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L15 14m-12 5h16a1 1 0 001-1V5a1 1 0 00-1-1H3a1 1 0 00-1 1v14a1 1 0 001 1z\"\n />\n </svg>\n</div>\n} }\n<!-- Boolean -->\n@case ('boolean') {\n<span [title]=\"_getTooltip(_value)\">{{ _getText(_value) }}</span>\n}\n<!-- Number -->\n@case ('number') {\n<span\n [title]=\"\n _getTooltip(\n _value | number: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | number: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n ) }}\n</span>\n}\n<!-- Currency -->\n@case ('currency') {\n<span\n [title]=\"\n _getTooltip(\n _value\n | currency\n : colDef().typeParameter?.currencyCode\n : colDef().typeParameter?.display\n : colDef().typeParameter?.digitsInfo\n : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | currency : colDef().typeParameter?.currencyCode :\n colDef().typeParameter?.display : colDef().typeParameter?.digitsInfo :\n colDef().typeParameter?.locale ) }}\n</span>\n}\n<!-- Percent -->\n@case ('percent') {\n<span\n [title]=\"\n _getTooltip(\n _value | percent: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | percent: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n ) }}\n</span>\n}\n<!-- Date -->\n@case ('date') {\n<span\n [title]=\"\n _getTooltip(\n _value\n | date\n : colDef().typeParameter?.format\n : colDef().typeParameter?.timezone\n : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | date : colDef().typeParameter?.format : colDef().typeParameter?.timezone :\n colDef().typeParameter?.locale ) }}\n</span>\n}\n<!-- Default -->\n@default {\n<span [title]=\"_getTooltip(_value)\">{{ _getText(_value) }}</span>\n} } } }\n\n<ng-template #iconTpl let-btn>\n @if (btn.icon) {\n <mat-icon class=\"acp-grid-icon\">{{ btn.icon }}</mat-icon>\n } @else if (btn.fontIcon) {\n <mat-icon class=\"acp-grid-icon\" [fontIcon]=\"btn.fontIcon\" />\n } @else if (btn.svgIcon) {\n <mat-icon class=\"acp-grid-icon\" [svgIcon]=\"btn.svgIcon\" />\n }\n</ng-template>\n", styles: [".placeholder-box{width:50px;height:50px;background:#f0f0f0;border:2px dashed #c2c2c2;border-radius:50%;display:flex;flex-direction:column;justify-content:center;align-items:center;color:#6b7280;font-size:.85rem;gap:8px}.placeholder-icon{width:32px;height:32px;color:#3b82f6}.placeholder-image{width:50px;height:50px;object-fit:cover;border-radius:50%;box-shadow:0 4px 8px #0000001a}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "directive", type: i1$5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i3$2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: DataGridMenu, selector: "acp-data-grid-menu", inputs: ["items", "data"], exportAs: ["acpDataGridMenu"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "pipe", type: DataGridCellSummaryPipe, name: "cellSummary" }, { kind: "pipe", type: DataGridCellActionsPipe, name: "cellActions" }, { kind: "pipe", type: DataGridCellActionDisablePipe, name: "cellActionDisable" }, { kind: "pipe", type: DataGridCellActionTooltipPipe, name: "cellActionTooltip" }, { kind: "pipe", type: AcpToObservablePipe, name: "toObservable" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DataGridCellActionBadgePipe, name: "cellActionBadge" }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2582
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DataGridCell, isStandalone: true, selector: "acp-data-grid-cell", inputs: { rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: false, transformFunction: null }, colDef: { classPropertyName: "colDef", publicName: "colDef", isSignal: true, isRequired: false, transformFunction: null }, summary: { classPropertyName: "summary", publicName: "summary", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowDataChange: "rowDataChange" }, ngImport: i0, template: "@if (summary()) {\n<span\n [title]=\"_getFormatterTooltip(data() | cellSummary: colDef())\"\n [innerHTML]=\"_getText(data() | cellSummary: colDef())\"\n>\n</span>\n} @else {\n<!-- Custom formatting -->\n@if (colDef().formatter) {\n<span\n [title]=\"_getFormatterTooltip(colDef().formatter(rowData(), colDef()))\"\n [innerHTML]=\"_getText(colDef().formatter(rowData(), colDef()))\"\n>\n</span>\n} @else {\n<!-- Default formatting -->\n@switch (colDef().type) {\n<!-- Buttons -->\n@case ('button') { @for ( btn of colDef().buttons | cellActions: rowData() : rowChangeRecord :\nrowChangeRecord?.currentValue; track btn ) { @if (!btn.iif || btn.iif(rowData())) { @if\n(btn.children && btn.children.length > 0) { @if (btn.type === 'icon') {\n<button\n matIconButton\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n [matMenuTriggerFor]=\"\n btn.children && btn.children.length > 0 ? gridMenu.menu : null\n \"\n (click)=\"$event.stopPropagation()\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n</button>\n\n<acp-data-grid-menu #gridMenu [items]=\"btn.children || []\" [data]=\"rowData()\" />\n} @else {\n<button\n [matButton]=\"btn.type || 'text'\"\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n [matMenuTriggerFor]=\"\n btn.children && btn.children.length > 0 ? gridMenu.menu : null\n \"\n (click)=\"$event.stopPropagation()\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n <span>{{ btn.text | toObservable | async }}</span>\n</button>\n\n<acp-data-grid-menu #gridMenu [items]=\"btn.children || []\" [data]=\"rowData()\" />\n} } @else { @if (btn.type === 'icon') {\n<button\n matIconButton\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n (click)=\"_onActionClick($event, btn, rowData())\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n</button>\n} @else {\n<button\n [matButton]=\"btn.type || 'text'\"\n [color]=\"btn.color || 'primary'\"\n type=\"button\"\n class=\"acp-grid-action-button\"\n [class]=\"btn.class\"\n [disabled]=\"\n btn\n | cellActionDisable\n : rowData()\n : rowChangeRecord\n : rowChangeRecord?.currentValue\n \"\n [matTooltip]=\"(btn | cellActionTooltip).message | toObservable | async\"\n [matTooltipClass]=\"(btn | cellActionTooltip).class\"\n [matTooltipHideDelay]=\"(btn | cellActionTooltip).hideDelay\"\n [matTooltipShowDelay]=\"(btn | cellActionTooltip).showDelay\"\n [matTooltipPosition]=\"(btn | cellActionTooltip).position || 'below'\"\n [matTooltipPositionAtOrigin]=\"(btn | cellActionTooltip).positionAtOrigin\"\n [matTooltipTouchGestures]=\"(btn | cellActionTooltip).touchGestures || 'auto'\"\n [matTooltipDisabled]=\"(btn | cellActionTooltip).disabled\"\n [matBadge]=\"(btn | cellActionBadge).content | toObservable | async\"\n [matBadgeDescription]=\"(btn | cellActionBadge).description | toObservable | async\"\n [matBadgeColor]=\"(btn | cellActionBadge).color\"\n [matBadgePosition]=\"(btn | cellActionBadge).position || 'above after'\"\n [matBadgeSize]=\"(btn | cellActionBadge).size || 'medium'\"\n [matBadgeOverlap]=\"(btn | cellActionBadge).overlap\"\n [matBadgeDisabled]=\"(btn | cellActionBadge).disabled\"\n [matBadgeHidden]=\"(btn | cellActionBadge).hidden\"\n (click)=\"_onActionClick($event, btn, rowData())\"\n>\n <mat-icon *ngTemplateOutlet=\"iconTpl; context: { $implicit: btn }\" />\n <span>{{ btn.text | toObservable | async }}</span>\n</button>\n} } } } }\n<!-- Tag -->\n@case ('tag') { @if (colDef().tag && colDef().tag[_value]) {\n<mat-chip-listbox>\n <mat-chip color=\"primary\" [class]=\"'bg-' + colDef().tag[_value].color\">\n {{ colDef().tag[_value].text }}\n </mat-chip>\n</mat-chip-listbox>\n} @else { {{ _value }} } }\n<!-- Link -->\n@case ('link') {\n<a [href]=\"_value\" target=\"_blank\">{{ _value }}</a>\n}\n<!-- Image -->\n@case ('image') { @if (_value) {\n<!-- Imagen real -->\n<img class=\"placeholder-image\" [src]=\"_value\" alt=\"img\" />\n} @else {\n<!-- Placeholder -->\n<div class=\"placeholder-box\">\n <svg class=\"placeholder-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L15 14m-12 5h16a1 1 0 001-1V5a1 1 0 00-1-1H3a1 1 0 00-1 1v14a1 1 0 001 1z\"\n />\n </svg>\n</div>\n} }\n<!-- Boolean -->\n@case ('boolean') {\n<span [title]=\"_getTooltip(_value)\">{{ _getText(_value) }}</span>\n}\n<!-- Number -->\n@case ('number') {\n<span\n [title]=\"\n _getTooltip(\n _value | number: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | number: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n ) }}\n</span>\n}\n<!-- Currency -->\n@case ('currency') {\n<span\n [title]=\"\n _getTooltip(\n _value\n | currency\n : colDef().typeParameter?.currencyCode\n : colDef().typeParameter?.display\n : colDef().typeParameter?.digitsInfo\n : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | currency : colDef().typeParameter?.currencyCode :\n colDef().typeParameter?.display : colDef().typeParameter?.digitsInfo :\n colDef().typeParameter?.locale ) }}\n</span>\n}\n<!-- Percent -->\n@case ('percent') {\n<span\n [title]=\"\n _getTooltip(\n _value | percent: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | percent: colDef().typeParameter?.digitsInfo : colDef().typeParameter?.locale\n ) }}\n</span>\n}\n<!-- Date -->\n@case ('date') {\n<span\n [title]=\"\n _getTooltip(\n _value\n | date\n : colDef().typeParameter?.format\n : colDef().typeParameter?.timezone\n : colDef().typeParameter?.locale\n )\n \"\n>\n {{ _getText( _value | date : colDef().typeParameter?.format : colDef().typeParameter?.timezone :\n colDef().typeParameter?.locale ) }}\n</span>\n}\n<!-- Default -->\n@default {\n<span [title]=\"_getTooltip(_value)\">{{ _getText(_value) }}</span>\n} } } }\n\n<ng-template #iconTpl let-btn>\n @if (btn.icon) {\n <mat-icon class=\"acp-grid-icon\">{{ btn.icon }}</mat-icon>\n } @else if (btn.fontIcon) {\n <mat-icon class=\"acp-grid-icon\" [fontIcon]=\"btn.fontIcon\" />\n } @else if (btn.svgIcon) {\n <mat-icon class=\"acp-grid-icon\" [svgIcon]=\"btn.svgIcon\" />\n }\n</ng-template>\n", styles: [".placeholder-box{width:50px;height:50px;background:#f0f0f0;border:2px dashed #c2c2c2;border-radius:50%;display:flex;flex-direction:column;justify-content:center;align-items:center;color:#6b7280;font-size:.85rem;gap:8px}.placeholder-icon{width:32px;height:32px;color:#3b82f6}.placeholder-image{width:50px;height:50px;object-fit:cover;border-radius:50%;box-shadow:0 4px 8px #0000001a}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "directive", type: i1$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i3$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: DataGridMenu, selector: "acp-data-grid-menu", inputs: ["items", "data"], exportAs: ["acpDataGridMenu"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "pipe", type: DataGridCellSummaryPipe, name: "cellSummary" }, { kind: "pipe", type: DataGridCellActionsPipe, name: "cellActions" }, { kind: "pipe", type: DataGridCellActionDisablePipe, name: "cellActionDisable" }, { kind: "pipe", type: DataGridCellActionTooltipPipe, name: "cellActionTooltip" }, { kind: "pipe", type: AcpToObservablePipe, name: "toObservable" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DataGridCellActionBadgePipe, name: "cellActionBadge" }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2943
2583
  }
2944
2584
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DataGridCell, decorators: [{
2945
2585
  type: Component,
@@ -3204,6 +2844,8 @@ class DataGrid {
3204
2844
  // Keyboard Navigation
3205
2845
  keyboardNavigation = input(false, ...(ngDevMode ? [{ debugName: "keyboardNavigation" }] : []));
3206
2846
  focusedRowIndex = computed(() => this._keyboardNavService.focusedRowIndex(), ...(ngDevMode ? [{ debugName: "focusedRowIndex" }] : [])); // Vinculado al servicio
2847
+ // Row Highlighting
2848
+ highlightedRowIndex = input(-1, ...(ngDevMode ? [{ debugName: "highlightedRowIndex" }] : []));
3207
2849
  // Sorting
3208
2850
  sortOnFront = input(true, ...(ngDevMode ? [{ debugName: "sortOnFront" }] : []));
3209
2851
  sortActive = input('', ...(ngDevMode ? [{ debugName: "sortActive" }] : []));
@@ -3628,7 +3270,7 @@ class DataGrid {
3628
3270
  return index === undefined ? dataIndex : index;
3629
3271
  }
3630
3272
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DataGrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
3631
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DataGrid, isStandalone: true, selector: "acp-data-grid", inputs: { showToolbar: { classPropertyName: "showToolbar", publicName: "showToolbar", isSignal: true, isRequired: false, transformFunction: null }, showColumnMenuButton: { classPropertyName: "showColumnMenuButton", publicName: "showColumnMenuButton", isSignal: true, isRequired: false, transformFunction: null }, toolbarTitle: { classPropertyName: "toolbarTitle", publicName: "toolbarTitle", isSignal: true, isRequired: false, transformFunction: null }, toolbarTemplate: { classPropertyName: "toolbarTemplate", publicName: "toolbarTemplate", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, emptyValuePlaceholder: { classPropertyName: "emptyValuePlaceholder", publicName: "emptyValuePlaceholder", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, headerExtraTemplate: { classPropertyName: "headerExtraTemplate", publicName: "headerExtraTemplate", isSignal: true, isRequired: false, transformFunction: null }, noResultTemplate: { classPropertyName: "noResultTemplate", publicName: "noResultTemplate", isSignal: true, isRequired: false, transformFunction: null }, paginationTemplate: { classPropertyName: "paginationTemplate", publicName: "paginationTemplate", isSignal: true, isRequired: false, transformFunction: null }, summaryTemplate: { classPropertyName: "summaryTemplate", publicName: "summaryTemplate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, headerCellTemplate: { classPropertyName: "headerCellTemplate", publicName: "headerCellTemplate", isSignal: true, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: true, isRequired: false, transformFunction: null }, expansionTemplate: { classPropertyName: "expansionTemplate", publicName: "expansionTemplate", isSignal: true, isRequired: false, transformFunction: null }, closeOthersOnExpand: { classPropertyName: "closeOthersOnExpand", publicName: "closeOthersOnExpand", isSignal: true, isRequired: false, transformFunction: null }, pageOnFront: { classPropertyName: "pageOnFront", publicName: "pageOnFront", isSignal: true, isRequired: false, transformFunction: null }, showPaginator: { classPropertyName: "showPaginator", publicName: "showPaginator", isSignal: true, isRequired: false, transformFunction: null }, pageDisabled: { classPropertyName: "pageDisabled", publicName: "pageDisabled", isSignal: true, isRequired: false, transformFunction: null }, showFirstLastButtons: { classPropertyName: "showFirstLastButtons", publicName: "showFirstLastButtons", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, hidePageSize: { classPropertyName: "hidePageSize", publicName: "hidePageSize", isSignal: true, isRequired: false, transformFunction: null }, infiniteScroll: { classPropertyName: "infiniteScroll", publicName: "infiniteScroll", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollThreshold: { classPropertyName: "infiniteScrollThreshold", publicName: "infiniteScrollThreshold", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollDisabled: { classPropertyName: "infiniteScrollDisabled", publicName: "infiniteScrollDisabled", isSignal: true, isRequired: false, transformFunction: null }, keyboardNavigation: { classPropertyName: "keyboardNavigation", publicName: "keyboardNavigation", isSignal: true, isRequired: false, transformFunction: null }, sortOnFront: { classPropertyName: "sortOnFront", publicName: "sortOnFront", isSignal: true, isRequired: false, transformFunction: null }, sortActive: { classPropertyName: "sortActive", publicName: "sortActive", isSignal: true, isRequired: false, transformFunction: null }, sortDirection: { classPropertyName: "sortDirection", publicName: "sortDirection", isSignal: true, isRequired: false, transformFunction: null }, sortDisableClear: { classPropertyName: "sortDisableClear", publicName: "sortDisableClear", isSignal: true, isRequired: false, transformFunction: null }, sortDisabled: { classPropertyName: "sortDisabled", publicName: "sortDisabled", isSignal: true, isRequired: false, transformFunction: null }, sortStart: { classPropertyName: "sortStart", publicName: "sortStart", isSignal: true, isRequired: false, transformFunction: null }, rowHover: { classPropertyName: "rowHover", publicName: "rowHover", isSignal: true, isRequired: false, transformFunction: null }, rowStriped: { classPropertyName: "rowStriped", publicName: "rowStriped", isSignal: true, isRequired: false, transformFunction: null }, rowSelectable: { classPropertyName: "rowSelectable", publicName: "rowSelectable", isSignal: true, isRequired: false, transformFunction: null }, multiSelectable: { classPropertyName: "multiSelectable", publicName: "multiSelectable", isSignal: true, isRequired: false, transformFunction: null }, multiSelectionWithClick: { classPropertyName: "multiSelectionWithClick", publicName: "multiSelectionWithClick", isSignal: true, isRequired: false, transformFunction: null }, hideRowSelectionCheckbox: { classPropertyName: "hideRowSelectionCheckbox", publicName: "hideRowSelectionCheckbox", isSignal: true, isRequired: false, transformFunction: null }, disableRowClickSelection: { classPropertyName: "disableRowClickSelection", publicName: "disableRowClickSelection", isSignal: true, isRequired: false, transformFunction: null }, rowClassFormatter: { classPropertyName: "rowClassFormatter", publicName: "rowClassFormatter", isSignal: true, isRequired: false, transformFunction: null }, rowSelected: { classPropertyName: "rowSelected", publicName: "rowSelected", isSignal: true, isRequired: false, transformFunction: null }, rowSelectionFormatter: { classPropertyName: "rowSelectionFormatter", publicName: "rowSelectionFormatter", isSignal: true, isRequired: false, transformFunction: null }, cellSelectable: { classPropertyName: "cellSelectable", publicName: "cellSelectable", isSignal: true, isRequired: false, transformFunction: null }, useContentRowTemplate: { classPropertyName: "useContentRowTemplate", publicName: "useContentRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, useContentHeaderRowTemplate: { classPropertyName: "useContentHeaderRowTemplate", publicName: "useContentHeaderRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, useContentFooterRowTemplate: { classPropertyName: "useContentFooterRowTemplate", publicName: "useContentFooterRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, showSummary: { classPropertyName: "showSummary", publicName: "showSummary", isSignal: true, isRequired: false, transformFunction: null }, noResultText: { classPropertyName: "noResultText", publicName: "noResultText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "page", sortChange: "sortChange", rowClick: "rowClick", rowSelectedChange: "rowSelectedChange", selectionChange: "selectionChange", cellClick: "cellClick", cellSelectedChange: "cellSelectedChange", expansionChange: "expansionChange", rowContextMenu: "rowContextMenu", infiniteScrollLoad: "infiniteScrollLoad", focusedRowChange: "focusedRowChange" }, host: { listeners: { "document:keydown": "handleKeyDown($event)" }, properties: { "class.data-grid-animations-enabled": "!_animationsDisabled", "class.data-grid-size-small": "size() === \"small\"", "class.data-grid-size-medium": "size() === \"medium\"", "class.data-grid-size-normal": "size() === \"normal\"", "attr.tabindex": "0" }, classAttribute: "data-grid" }, queries: [{ propertyName: "rowDefs", predicate: MatRowDef }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "footerRowDefs", predicate: MatFooterRow }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], exportAs: ["dataGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- src/app/shared/components/data-grid/data-grid.component.html -->\n@if (loading()) {\n<div class=\"data-grid-progress\">\n <mat-progress-bar mode=\"indeterminate\" />\n</div>\n} @if (showToolbar()) {\n<div class=\"data-grid-toolbar\">\n <div class=\"data-grid-toolbar-content\">\n @if (toolbarTemplate()) {\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate()\" />\n } @else if (toolbarTitle()) {\n <div class=\"data-grid-toolbar-title\">{{ toolbarTitle() }}</div>\n }\n </div>\n <div class=\"data-grid-toolbar-actions\"></div>\n</div>\n}\n\n<div class=\"data-grid-main data-grid-layout\">\n <div class=\"data-grid-content data-grid-layout\">\n <div #tableContainer class=\"mat-table-container\" [class.mat-table-with-data]=\"!hasNoResult()\">\n <table\n mat-table\n [class.mat-table-hover]=\"rowHover()\"\n [class.mat-table-striped]=\"rowStriped()\"\n [class.mat-table-expandable]=\"expandable()\"\n [class.mat-table-keyboard-navigation]=\"keyboardNavigation()\"\n [dataSource]=\"dataSource\"\n multiTemplateDataRows\n matSort\n [matSortActive]=\"sortActive()\"\n [matSortDirection]=\"sortDirection()\"\n [matSortDisableClear]=\"sortDisableClear()\"\n [matSortDisabled]=\"sortDisabled()\"\n [matSortStart]=\"sortStart()\"\n (matSortChange)=\"onSortChange($event)\"\n [trackBy]=\"trackBy\"\n >\n <!-- Selection Column -->\n @if (rowSelectable() && !hideRowSelectionCheckbox()) {\n <ng-container matColumnDef=\"DataGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"data-grid-checkbox-cell\">\n @if (multiSelectable()) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !isAllSelected()\"\n (change)=\"$event ? toggleAllRows() : null\"\n />\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n class=\"data-grid-checkbox-cell\"\n >\n @if (!shouldHideCheckbox(row, getIndex(index, dataIndex))) {\n <mat-checkbox\n [disabled]=\"isRowDisabled(row, getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? toggleNormalCheckbox(row) : null\"\n />\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"data-grid-checkbox-cell\"></td>\n </ng-container>\n }\n\n <!-- Data Columns -->\n @for (col of columns(); track col.field) {\n <ng-container\n [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned === 'left'\"\n [stickyEnd]=\"col.pinned === 'right'\"\n >\n <!-- Header Cell -->\n <th\n mat-header-cell\n *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n <!-- Prioridad 1: Template espec\u00EDfico de la columna -->\n @if (col.headerCellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.headerCellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerCellTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 2: Template general por campo -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerCellTemplate() | isTemplateRef) {\n <!-- Prioridad 3: Template general -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 4: Template por campo en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerTemplate() | isTemplateRef) {\n <!-- Prioridad 5: Template general en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else {\n <!-- Comportamiento por defecto -->\n <div class=\"mat-header-cell-inner\">\n <div\n [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear()\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n }\n <span>{{ col.header | toObservable | async }}</span>\n @if (col.sortable) {\n <svg\n class=\"data-grid-icon mat-sort-header-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate(), colDef: col }\"\n />\n </div>\n }\n </th>\n\n <!-- Data Cell -->\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n [class]=\"col | colClass: row : rowChangeRecord : rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n acpGridSelectableCell\n [cellSelectable]=\"cellSelectable()\"\n (cellSelectedChange)=\"selectCell($event, row, col)\"\n >\n @if (cellTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if ($any(cellTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.showExpand) {\n <button\n class=\"data-grid-row-expand-button\"\n mat-icon-button\n acpDataGridExpansionToggle\n type=\"button\"\n [(opened)]=\"expansionRowStates()[dataIndex].expanded\"\n (toggleChange)=\"onExpansionChange($event, row, col, dataIndex)\"\n >\n <svg\n class=\"data-grid-icon data-grid-row-expand-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <acp-data-grid-cell\n [rowData]=\"row\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n (rowDataChange)=\"onRowDataChange($event)\"\n />\n } } }\n </td>\n\n <!-- Footer Cell -->\n <td\n mat-footer-cell\n *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n } @if (summaryTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data() }\"\n />\n } @else { @if ($any(summaryTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: getColData(data(), col),\n colData: getColData(data(), col),\n colDef: col,\n }\"\n />\n } @else {\n <acp-data-grid-cell\n [summary]=\"true\"\n [data]=\"data()\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n />\n } }\n </td>\n </ng-container>\n }\n\n <!-- Header Row -->\n @if (!useContentHeaderRowTemplate()) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Data Rows -->\n @if (!useContentRowTemplate()) {\n <tr\n mat-row\n *matRowDef=\"\n let row;\n let index = index;\n let dataIndex = dataIndex;\n columns: displayedColumns()\n \"\n [class]=\"row | rowClass: index : dataIndex : rowClassFormatter()\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n (click)=\"selectRow($event, row, getIndex(index, dataIndex))\"\n (contextmenu)=\"contextmenu($event, row, getIndex(index, dataIndex))\"\n ></tr>\n }\n\n <!-- Summary Row -->\n @if (whetherShowSummary()) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Expansion Row -->\n @if (expandable()) {\n <ng-container matColumnDef=\"DataGridExpansionColumnDef\">\n <td\n mat-cell\n *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns().length\"\n >\n <div class=\"data-grid-expansion-detail-wrapper\">\n <div class=\"data-grid-expansion-detail\">\n <ng-template\n [ngTemplateOutlet]=\"expansionTemplate()\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: dataIndex,\n expanded: expansionRowStates()[dataIndex].expanded,\n }\"\n />\n </div>\n </div>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['DataGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"data-grid-expansion\"\n [class]=\"expansionRowStates()[dataIndex].expanded ? 'expanded' : 'collapsed'\"\n ></tr>\n }\n </table>\n </div>\n\n <!-- No result -->\n @if (hasNoResult()) {\n <div class=\"data-grid-no-result\">\n @if (noResultTemplate()) {\n <ng-template [ngTemplateOutlet]=\"noResultTemplate()\" />\n } @else { {{ noResultText() }} }\n </div>\n }\n\n <!-- Infinite Scroll Loading Indicator -->\n @if (infiniteScroll() && isLoadingMore()) {\n <div class=\"data-grid-infinite-scroll-loading\">\n <mat-progress-bar mode=\"indeterminate\" />\n </div>\n }\n </div>\n</div>\n\n<div class=\"data-grid-footer\">\n <!-- Pagination -->\n @if (!infiniteScroll() && showPaginator()) {\n <div class=\"data-grid-pagination\">\n @if (paginationTemplate()) {\n <ng-template [ngTemplateOutlet]=\"paginationTemplate()\" />\n } @else {\n <mat-paginator\n [class.mat-paginator-hidden]=\"!showPaginator()\"\n [showFirstLastButtons]=\"showFirstLastButtons()\"\n [length]=\"length()\"\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [hidePageSize]=\"hidePageSize()\"\n (page)=\"onPage($event)\"\n [disabled]=\"pageDisabled()\"\n />\n }\n </div>\n }\n</div>\n\n<!-- Header template for extra content -->\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\n @if (headerExtraTemplate | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else { @if ($any(headerExtraTemplate)?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } }\n</ng-template>\n", styles: [".data-grid{position:relative;display:flex;flex-direction:column;width:100%;overflow:hidden;border:1px solid #c4c6d0;border-radius:12px}.data-grid .mat-table-container{overflow:auto}.data-grid .mat-table-container.mat-table-with-data{flex:1}.data-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.data-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-row.data-grid-expansion{height:0;overflow:hidden}.data-grid .mat-mdc-row.data-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.data-grid .mat-mdc-row.data-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.data-grid .mat-sort-header-icon{margin-left:4px}[dir=rtl] .data-grid .mat-sort-header-icon{margin-left:0;margin-right:4px}.data-grid .mat-header-cell-inner{display:inline-flex;align-items:center;vertical-align:middle}.data-grid .mat-paginator-hidden{display:none}.data-grid .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-row{padding:4px 8px;font-size:12px;height:32px}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-cell{height:32px}.data-grid.data-grid-size-small .data-grid-checkbox-cell{width:40px;min-width:40px;padding:0 calc((40px - var(--mat-checkbox-state-layer-size, 32px)) / 2)}.data-grid.data-grid-size-small .data-grid-row-expand-button{width:28px;height:28px}.data-grid.data-grid-size-small .data-grid-row-expand-button .data-grid-icon{width:18px;height:18px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-cell{padding:8px 12px;font-size:13px;height:40px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell{height:48px}.data-grid.data-grid-size-medium .data-grid-checkbox-cell{width:50px;min-width:50px;padding:0 calc((50px - var(--mat-checkbox-state-layer-size, 36px)) / 2)}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-cell{padding:12px 16px;font-size:14px;height:48px}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell{height:56px}.data-grid.data-grid-size-normal .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid-progress{position:absolute;top:0;z-index:120;width:100%}.data-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:var(--mat-table-header-container-height, 56px);padding:8px;box-sizing:border-box}.data-grid-toolbar-content{flex:1;width:0;padding:0 8px}.data-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.data-grid-content{flex-direction:column;width:0}.data-grid-footer{position:relative;z-index:1}.data-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.data-grid-expansion-placeholder{display:inline-block;vertical-align:middle;width:var(--mat-icon-button-state-layer-size);height:var(--mat-icon-button-state-layer-size)}.data-grid-expansion-detail-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%;padding:0;overflow:hidden}.data-grid-expansion.expanded .data-grid-expansion-detail-wrapper{grid-template-rows:1fr;padding:calc((var(--mat-table-row-item-container-height, 52px) - 20px) / 2) 0}.data-grid-expansion-detail{min-height:0}.data-grid-animations-enabled .data-grid-expansion-detail-wrapper{transition:all 225ms cubic-bezier(.4,0,.2,1)}.data-grid-row-expand-button.expanded .data-grid-row-expand-icon{transform:rotate(90deg)}.data-grid-row-expand-button.mat-mdc-icon-button,.data-grid-row-expand-button+data-grid-cell{vertical-align:middle}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:#3f51b514!important;position:relative}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{content:\"\";position:absolute;inset:0;border:2px solid #3f51b5;pointer-events:none;z-index:1}.mat-table-keyboard-navigation .mat-mdc-row:hover:not(.focused){background-color:#0000000a}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:rgba(var(--mat-primary-color),.08)!important}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{border-color:rgba(var(--mat-primary-color),1)}.data-grid-infinite-scroll-loading{width:100%;position:relative;height:4px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "component", type: MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: DataGridSelectableCell, selector: "[acpGridSelectableCell]", inputs: ["cellSelectable"], outputs: ["cellSelectedChange"] }, { kind: "directive", type: DataGridExpansionToggle, selector: "[acpDataGridExpansionToggle]", inputs: ["opened", "expandableRow", "expansionRowTpl"], outputs: ["openedChange", "toggleChange"] }, { kind: "component", type: DataGridCell, selector: "acp-data-grid-cell", inputs: ["rowData", "colDef", "summary", "data", "placeholder"], outputs: ["rowDataChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DataGridColClassPipe, name: "colClass" }, { kind: "pipe", type: AcpIsTemplateRefPipe, name: "isTemplateRef" }, { kind: "pipe", type: AcpToObservablePipe, name: "toObservable" }, { kind: "pipe", type: DataGridRowClassPipe, name: "rowClass" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3273
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DataGrid, isStandalone: true, selector: "acp-data-grid", inputs: { showToolbar: { classPropertyName: "showToolbar", publicName: "showToolbar", isSignal: true, isRequired: false, transformFunction: null }, showColumnMenuButton: { classPropertyName: "showColumnMenuButton", publicName: "showColumnMenuButton", isSignal: true, isRequired: false, transformFunction: null }, toolbarTitle: { classPropertyName: "toolbarTitle", publicName: "toolbarTitle", isSignal: true, isRequired: false, transformFunction: null }, toolbarTemplate: { classPropertyName: "toolbarTemplate", publicName: "toolbarTemplate", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, emptyValuePlaceholder: { classPropertyName: "emptyValuePlaceholder", publicName: "emptyValuePlaceholder", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, headerExtraTemplate: { classPropertyName: "headerExtraTemplate", publicName: "headerExtraTemplate", isSignal: true, isRequired: false, transformFunction: null }, noResultTemplate: { classPropertyName: "noResultTemplate", publicName: "noResultTemplate", isSignal: true, isRequired: false, transformFunction: null }, paginationTemplate: { classPropertyName: "paginationTemplate", publicName: "paginationTemplate", isSignal: true, isRequired: false, transformFunction: null }, summaryTemplate: { classPropertyName: "summaryTemplate", publicName: "summaryTemplate", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, headerCellTemplate: { classPropertyName: "headerCellTemplate", publicName: "headerCellTemplate", isSignal: true, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: true, isRequired: false, transformFunction: null }, expansionTemplate: { classPropertyName: "expansionTemplate", publicName: "expansionTemplate", isSignal: true, isRequired: false, transformFunction: null }, closeOthersOnExpand: { classPropertyName: "closeOthersOnExpand", publicName: "closeOthersOnExpand", isSignal: true, isRequired: false, transformFunction: null }, pageOnFront: { classPropertyName: "pageOnFront", publicName: "pageOnFront", isSignal: true, isRequired: false, transformFunction: null }, showPaginator: { classPropertyName: "showPaginator", publicName: "showPaginator", isSignal: true, isRequired: false, transformFunction: null }, pageDisabled: { classPropertyName: "pageDisabled", publicName: "pageDisabled", isSignal: true, isRequired: false, transformFunction: null }, showFirstLastButtons: { classPropertyName: "showFirstLastButtons", publicName: "showFirstLastButtons", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, hidePageSize: { classPropertyName: "hidePageSize", publicName: "hidePageSize", isSignal: true, isRequired: false, transformFunction: null }, infiniteScroll: { classPropertyName: "infiniteScroll", publicName: "infiniteScroll", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollThreshold: { classPropertyName: "infiniteScrollThreshold", publicName: "infiniteScrollThreshold", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollDisabled: { classPropertyName: "infiniteScrollDisabled", publicName: "infiniteScrollDisabled", isSignal: true, isRequired: false, transformFunction: null }, keyboardNavigation: { classPropertyName: "keyboardNavigation", publicName: "keyboardNavigation", isSignal: true, isRequired: false, transformFunction: null }, highlightedRowIndex: { classPropertyName: "highlightedRowIndex", publicName: "highlightedRowIndex", isSignal: true, isRequired: false, transformFunction: null }, sortOnFront: { classPropertyName: "sortOnFront", publicName: "sortOnFront", isSignal: true, isRequired: false, transformFunction: null }, sortActive: { classPropertyName: "sortActive", publicName: "sortActive", isSignal: true, isRequired: false, transformFunction: null }, sortDirection: { classPropertyName: "sortDirection", publicName: "sortDirection", isSignal: true, isRequired: false, transformFunction: null }, sortDisableClear: { classPropertyName: "sortDisableClear", publicName: "sortDisableClear", isSignal: true, isRequired: false, transformFunction: null }, sortDisabled: { classPropertyName: "sortDisabled", publicName: "sortDisabled", isSignal: true, isRequired: false, transformFunction: null }, sortStart: { classPropertyName: "sortStart", publicName: "sortStart", isSignal: true, isRequired: false, transformFunction: null }, rowHover: { classPropertyName: "rowHover", publicName: "rowHover", isSignal: true, isRequired: false, transformFunction: null }, rowStriped: { classPropertyName: "rowStriped", publicName: "rowStriped", isSignal: true, isRequired: false, transformFunction: null }, rowSelectable: { classPropertyName: "rowSelectable", publicName: "rowSelectable", isSignal: true, isRequired: false, transformFunction: null }, multiSelectable: { classPropertyName: "multiSelectable", publicName: "multiSelectable", isSignal: true, isRequired: false, transformFunction: null }, multiSelectionWithClick: { classPropertyName: "multiSelectionWithClick", publicName: "multiSelectionWithClick", isSignal: true, isRequired: false, transformFunction: null }, hideRowSelectionCheckbox: { classPropertyName: "hideRowSelectionCheckbox", publicName: "hideRowSelectionCheckbox", isSignal: true, isRequired: false, transformFunction: null }, disableRowClickSelection: { classPropertyName: "disableRowClickSelection", publicName: "disableRowClickSelection", isSignal: true, isRequired: false, transformFunction: null }, rowClassFormatter: { classPropertyName: "rowClassFormatter", publicName: "rowClassFormatter", isSignal: true, isRequired: false, transformFunction: null }, rowSelected: { classPropertyName: "rowSelected", publicName: "rowSelected", isSignal: true, isRequired: false, transformFunction: null }, rowSelectionFormatter: { classPropertyName: "rowSelectionFormatter", publicName: "rowSelectionFormatter", isSignal: true, isRequired: false, transformFunction: null }, cellSelectable: { classPropertyName: "cellSelectable", publicName: "cellSelectable", isSignal: true, isRequired: false, transformFunction: null }, useContentRowTemplate: { classPropertyName: "useContentRowTemplate", publicName: "useContentRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, useContentHeaderRowTemplate: { classPropertyName: "useContentHeaderRowTemplate", publicName: "useContentHeaderRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, useContentFooterRowTemplate: { classPropertyName: "useContentFooterRowTemplate", publicName: "useContentFooterRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, showSummary: { classPropertyName: "showSummary", publicName: "showSummary", isSignal: true, isRequired: false, transformFunction: null }, noResultText: { classPropertyName: "noResultText", publicName: "noResultText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "page", sortChange: "sortChange", rowClick: "rowClick", rowSelectedChange: "rowSelectedChange", selectionChange: "selectionChange", cellClick: "cellClick", cellSelectedChange: "cellSelectedChange", expansionChange: "expansionChange", rowContextMenu: "rowContextMenu", infiniteScrollLoad: "infiniteScrollLoad", focusedRowChange: "focusedRowChange" }, host: { listeners: { "document:keydown": "handleKeyDown($event)" }, properties: { "class.data-grid-animations-enabled": "!_animationsDisabled", "class.data-grid-size-small": "size() === \"small\"", "class.data-grid-size-medium": "size() === \"medium\"", "class.data-grid-size-normal": "size() === \"normal\"", "attr.tabindex": "0" }, classAttribute: "data-grid" }, queries: [{ propertyName: "rowDefs", predicate: MatRowDef }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "footerRowDefs", predicate: MatFooterRow }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], exportAs: ["dataGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- src/app/shared/components/data-grid/data-grid.component.html -->\n@if (loading()) {\n<div class=\"data-grid-progress\">\n <mat-progress-bar mode=\"indeterminate\" />\n</div>\n} @if (showToolbar()) {\n<div class=\"data-grid-toolbar\">\n <div class=\"data-grid-toolbar-content\">\n @if (toolbarTemplate()) {\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate()\" />\n } @else if (toolbarTitle()) {\n <div class=\"data-grid-toolbar-title\">{{ toolbarTitle() }}</div>\n }\n </div>\n <div class=\"data-grid-toolbar-actions\"></div>\n</div>\n}\n\n<div class=\"data-grid-main data-grid-layout\">\n <div class=\"data-grid-content data-grid-layout\">\n <div #tableContainer class=\"mat-table-container\" [class.mat-table-with-data]=\"!hasNoResult()\">\n <table\n mat-table\n [class.mat-table-hover]=\"rowHover()\"\n [class.mat-table-striped]=\"rowStriped()\"\n [class.mat-table-expandable]=\"expandable()\"\n [class.mat-table-keyboard-navigation]=\"keyboardNavigation()\"\n [dataSource]=\"dataSource\"\n multiTemplateDataRows\n matSort\n [matSortActive]=\"sortActive()\"\n [matSortDirection]=\"sortDirection()\"\n [matSortDisableClear]=\"sortDisableClear()\"\n [matSortDisabled]=\"sortDisabled()\"\n [matSortStart]=\"sortStart()\"\n (matSortChange)=\"onSortChange($event)\"\n [trackBy]=\"trackBy\"\n >\n <!-- Selection Column -->\n @if (rowSelectable() && !hideRowSelectionCheckbox()) {\n <ng-container matColumnDef=\"DataGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"data-grid-checkbox-cell\">\n @if (multiSelectable()) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !isAllSelected()\"\n (change)=\"$event ? toggleAllRows() : null\"\n />\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n class=\"data-grid-checkbox-cell\"\n >\n @if (!shouldHideCheckbox(row, getIndex(index, dataIndex))) {\n <mat-checkbox\n [disabled]=\"isRowDisabled(row, getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? toggleNormalCheckbox(row) : null\"\n />\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"data-grid-checkbox-cell\"></td>\n </ng-container>\n }\n\n <!-- Data Columns -->\n @for (col of columns(); track col.field) {\n <ng-container\n [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned === 'left'\"\n [stickyEnd]=\"col.pinned === 'right'\"\n >\n <!-- Header Cell -->\n <th\n mat-header-cell\n *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n <!-- Prioridad 1: Template espec\u00EDfico de la columna -->\n @if (col.headerCellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.headerCellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerCellTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 2: Template general por campo -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerCellTemplate() | isTemplateRef) {\n <!-- Prioridad 3: Template general -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 4: Template por campo en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerTemplate() | isTemplateRef) {\n <!-- Prioridad 5: Template general en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else {\n <!-- Comportamiento por defecto -->\n <div class=\"mat-header-cell-inner\">\n <div\n [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear()\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n }\n <span>{{ col.header | toObservable | async }}</span>\n @if (col.sortable) {\n <svg\n class=\"data-grid-icon mat-sort-header-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate(), colDef: col }\"\n />\n </div>\n }\n </th>\n\n <!-- Data Cell -->\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n [class]=\"col | colClass: row : rowChangeRecord : rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n acpGridSelectableCell\n [cellSelectable]=\"cellSelectable()\"\n (cellSelectedChange)=\"selectCell($event, row, col)\"\n >\n @if (cellTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if ($any(cellTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.showExpand) {\n <button\n class=\"data-grid-row-expand-button\"\n mat-icon-button\n acpDataGridExpansionToggle\n type=\"button\"\n [(opened)]=\"expansionRowStates()[dataIndex].expanded\"\n (toggleChange)=\"onExpansionChange($event, row, col, dataIndex)\"\n >\n <svg\n class=\"data-grid-icon data-grid-row-expand-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <acp-data-grid-cell\n [rowData]=\"row\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n (rowDataChange)=\"onRowDataChange($event)\"\n />\n } } }\n </td>\n\n <!-- Footer Cell -->\n <td\n mat-footer-cell\n *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n } @if (summaryTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data() }\"\n />\n } @else { @if ($any(summaryTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: getColData(data(), col),\n colData: getColData(data(), col),\n colDef: col,\n }\"\n />\n } @else {\n <acp-data-grid-cell\n [summary]=\"true\"\n [data]=\"data()\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n />\n } }\n </td>\n </ng-container>\n }\n\n <!-- Header Row -->\n @if (!useContentHeaderRowTemplate()) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Data Rows -->\n @if (!useContentRowTemplate()) {\n <tr\n mat-row\n *matRowDef=\"\n let row;\n let index = index;\n let dataIndex = dataIndex;\n columns: displayedColumns()\n \"\n [class]=\"row | rowClass: index : dataIndex : rowClassFormatter()\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n [class.highlighted]=\"highlightedRowIndex() === dataIndex\"\n (click)=\"selectRow($event, row, getIndex(index, dataIndex))\"\n (contextmenu)=\"contextmenu($event, row, getIndex(index, dataIndex))\"\n ></tr>\n }\n\n <!-- Summary Row -->\n @if (whetherShowSummary()) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Expansion Row -->\n @if (expandable()) {\n <ng-container matColumnDef=\"DataGridExpansionColumnDef\">\n <td\n mat-cell\n *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns().length\"\n >\n <div class=\"data-grid-expansion-detail-wrapper\">\n <div class=\"data-grid-expansion-detail\">\n <ng-template\n [ngTemplateOutlet]=\"expansionTemplate()\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: dataIndex,\n expanded: expansionRowStates()[dataIndex].expanded,\n }\"\n />\n </div>\n </div>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['DataGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"data-grid-expansion\"\n [class]=\"expansionRowStates()[dataIndex].expanded ? 'expanded' : 'collapsed'\"\n ></tr>\n }\n </table>\n </div>\n\n <!-- No result -->\n @if (hasNoResult()) {\n <div class=\"data-grid-no-result\">\n @if (noResultTemplate()) {\n <ng-template [ngTemplateOutlet]=\"noResultTemplate()\" />\n } @else { {{ noResultText() }} }\n </div>\n }\n\n <!-- Infinite Scroll Loading Indicator -->\n @if (infiniteScroll() && isLoadingMore()) {\n <div class=\"data-grid-infinite-scroll-loading\">\n <mat-progress-bar mode=\"indeterminate\" />\n </div>\n }\n </div>\n</div>\n\n<div class=\"data-grid-footer\">\n <!-- Pagination -->\n @if (!infiniteScroll() && showPaginator()) {\n <div class=\"data-grid-pagination\">\n @if (paginationTemplate()) {\n <ng-template [ngTemplateOutlet]=\"paginationTemplate()\" />\n } @else {\n <mat-paginator\n [class.mat-paginator-hidden]=\"!showPaginator()\"\n [showFirstLastButtons]=\"showFirstLastButtons()\"\n [length]=\"length()\"\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [hidePageSize]=\"hidePageSize()\"\n (page)=\"onPage($event)\"\n [disabled]=\"pageDisabled()\"\n />\n }\n </div>\n }\n</div>\n\n<!-- Header template for extra content -->\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\n @if (headerExtraTemplate | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else { @if ($any(headerExtraTemplate)?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } }\n</ng-template>\n", styles: [".data-grid{position:relative;display:flex;flex-direction:column;width:100%;overflow:hidden;border:1px solid #c4c6d0;border-radius:12px}.data-grid .mat-table-container{overflow:auto}.data-grid .mat-table-container.mat-table-with-data{flex:1}.data-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.data-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-row.highlighted{background-color:var(--mat-sys-surface-container-highest, #e6e1e5)}.data-grid .mat-mdc-row.data-grid-expansion{height:0;overflow:hidden}.data-grid .mat-mdc-row.data-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.data-grid .mat-mdc-row.data-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.data-grid .mat-sort-header-icon{margin-left:4px}[dir=rtl] .data-grid .mat-sort-header-icon{margin-left:0;margin-right:4px}.data-grid .mat-header-cell-inner{display:inline-flex;align-items:center;vertical-align:middle}.data-grid .mat-paginator-hidden{display:none}.data-grid .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-row{padding:4px 8px;font-size:12px;height:32px}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-cell{height:32px}.data-grid.data-grid-size-small .data-grid-checkbox-cell{width:40px;min-width:40px;padding:0 calc((40px - var(--mat-checkbox-state-layer-size, 32px)) / 2)}.data-grid.data-grid-size-small .data-grid-row-expand-button{width:28px;height:28px}.data-grid.data-grid-size-small .data-grid-row-expand-button .data-grid-icon{width:18px;height:18px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-cell{padding:8px 12px;font-size:13px;height:40px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell{height:48px}.data-grid.data-grid-size-medium .data-grid-checkbox-cell{width:50px;min-width:50px;padding:0 calc((50px - var(--mat-checkbox-state-layer-size, 36px)) / 2)}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-cell{padding:12px 16px;font-size:14px;height:48px}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell{height:56px}.data-grid.data-grid-size-normal .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid-progress{position:absolute;top:0;z-index:120;width:100%}.data-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:var(--mat-table-header-container-height, 56px);padding:8px;box-sizing:border-box}.data-grid-toolbar-content{flex:1;width:0;padding:0 8px}.data-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.data-grid-content{flex-direction:column;width:0}.data-grid-footer{position:relative;z-index:1}.data-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.data-grid-expansion-placeholder{display:inline-block;vertical-align:middle;width:var(--mat-icon-button-state-layer-size);height:var(--mat-icon-button-state-layer-size)}.data-grid-expansion-detail-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%;padding:0;overflow:hidden}.data-grid-expansion.expanded .data-grid-expansion-detail-wrapper{grid-template-rows:1fr;padding:calc((var(--mat-table-row-item-container-height, 52px) - 20px) / 2) 0}.data-grid-expansion-detail{min-height:0}.data-grid-animations-enabled .data-grid-expansion-detail-wrapper{transition:all 225ms cubic-bezier(.4,0,.2,1)}.data-grid-row-expand-button.expanded .data-grid-row-expand-icon{transform:rotate(90deg)}.data-grid-row-expand-button.mat-mdc-icon-button,.data-grid-row-expand-button+data-grid-cell{vertical-align:middle}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:#3f51b514!important;position:relative}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{content:\"\";position:absolute;inset:0;border:2px solid #3f51b5;pointer-events:none;z-index:1}.mat-table-keyboard-navigation .mat-mdc-row:hover:not(.focused){background-color:#0000000a}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:rgba(var(--mat-primary-color),.08)!important}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{border-color:rgba(var(--mat-primary-color),1)}.data-grid-infinite-scroll-loading{width:100%;position:relative;height:4px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "component", type: MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: DataGridSelectableCell, selector: "[acpGridSelectableCell]", inputs: ["cellSelectable"], outputs: ["cellSelectedChange"] }, { kind: "directive", type: DataGridExpansionToggle, selector: "[acpDataGridExpansionToggle]", inputs: ["opened", "expandableRow", "expansionRowTpl"], outputs: ["openedChange", "toggleChange"] }, { kind: "component", type: DataGridCell, selector: "acp-data-grid-cell", inputs: ["rowData", "colDef", "summary", "data", "placeholder"], outputs: ["rowDataChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DataGridColClassPipe, name: "colClass" }, { kind: "pipe", type: AcpIsTemplateRefPipe, name: "isTemplateRef" }, { kind: "pipe", type: AcpToObservablePipe, name: "toObservable" }, { kind: "pipe", type: DataGridRowClassPipe, name: "rowClass" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3632
3274
  }
3633
3275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DataGrid, decorators: [{
3634
3276
  type: Component,
@@ -3670,7 +3312,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
3670
3312
  '[class.data-grid-size-normal]': 'size() === "normal"',
3671
3313
  '[attr.tabindex]': '0',
3672
3314
  // '(keydown)': 'handleKeyDown($event)'
3673
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- src/app/shared/components/data-grid/data-grid.component.html -->\n@if (loading()) {\n<div class=\"data-grid-progress\">\n <mat-progress-bar mode=\"indeterminate\" />\n</div>\n} @if (showToolbar()) {\n<div class=\"data-grid-toolbar\">\n <div class=\"data-grid-toolbar-content\">\n @if (toolbarTemplate()) {\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate()\" />\n } @else if (toolbarTitle()) {\n <div class=\"data-grid-toolbar-title\">{{ toolbarTitle() }}</div>\n }\n </div>\n <div class=\"data-grid-toolbar-actions\"></div>\n</div>\n}\n\n<div class=\"data-grid-main data-grid-layout\">\n <div class=\"data-grid-content data-grid-layout\">\n <div #tableContainer class=\"mat-table-container\" [class.mat-table-with-data]=\"!hasNoResult()\">\n <table\n mat-table\n [class.mat-table-hover]=\"rowHover()\"\n [class.mat-table-striped]=\"rowStriped()\"\n [class.mat-table-expandable]=\"expandable()\"\n [class.mat-table-keyboard-navigation]=\"keyboardNavigation()\"\n [dataSource]=\"dataSource\"\n multiTemplateDataRows\n matSort\n [matSortActive]=\"sortActive()\"\n [matSortDirection]=\"sortDirection()\"\n [matSortDisableClear]=\"sortDisableClear()\"\n [matSortDisabled]=\"sortDisabled()\"\n [matSortStart]=\"sortStart()\"\n (matSortChange)=\"onSortChange($event)\"\n [trackBy]=\"trackBy\"\n >\n <!-- Selection Column -->\n @if (rowSelectable() && !hideRowSelectionCheckbox()) {\n <ng-container matColumnDef=\"DataGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"data-grid-checkbox-cell\">\n @if (multiSelectable()) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !isAllSelected()\"\n (change)=\"$event ? toggleAllRows() : null\"\n />\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n class=\"data-grid-checkbox-cell\"\n >\n @if (!shouldHideCheckbox(row, getIndex(index, dataIndex))) {\n <mat-checkbox\n [disabled]=\"isRowDisabled(row, getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? toggleNormalCheckbox(row) : null\"\n />\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"data-grid-checkbox-cell\"></td>\n </ng-container>\n }\n\n <!-- Data Columns -->\n @for (col of columns(); track col.field) {\n <ng-container\n [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned === 'left'\"\n [stickyEnd]=\"col.pinned === 'right'\"\n >\n <!-- Header Cell -->\n <th\n mat-header-cell\n *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n <!-- Prioridad 1: Template espec\u00EDfico de la columna -->\n @if (col.headerCellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.headerCellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerCellTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 2: Template general por campo -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerCellTemplate() | isTemplateRef) {\n <!-- Prioridad 3: Template general -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 4: Template por campo en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerTemplate() | isTemplateRef) {\n <!-- Prioridad 5: Template general en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else {\n <!-- Comportamiento por defecto -->\n <div class=\"mat-header-cell-inner\">\n <div\n [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear()\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n }\n <span>{{ col.header | toObservable | async }}</span>\n @if (col.sortable) {\n <svg\n class=\"data-grid-icon mat-sort-header-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate(), colDef: col }\"\n />\n </div>\n }\n </th>\n\n <!-- Data Cell -->\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n [class]=\"col | colClass: row : rowChangeRecord : rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n acpGridSelectableCell\n [cellSelectable]=\"cellSelectable()\"\n (cellSelectedChange)=\"selectCell($event, row, col)\"\n >\n @if (cellTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if ($any(cellTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.showExpand) {\n <button\n class=\"data-grid-row-expand-button\"\n mat-icon-button\n acpDataGridExpansionToggle\n type=\"button\"\n [(opened)]=\"expansionRowStates()[dataIndex].expanded\"\n (toggleChange)=\"onExpansionChange($event, row, col, dataIndex)\"\n >\n <svg\n class=\"data-grid-icon data-grid-row-expand-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <acp-data-grid-cell\n [rowData]=\"row\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n (rowDataChange)=\"onRowDataChange($event)\"\n />\n } } }\n </td>\n\n <!-- Footer Cell -->\n <td\n mat-footer-cell\n *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n } @if (summaryTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data() }\"\n />\n } @else { @if ($any(summaryTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: getColData(data(), col),\n colData: getColData(data(), col),\n colDef: col,\n }\"\n />\n } @else {\n <acp-data-grid-cell\n [summary]=\"true\"\n [data]=\"data()\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n />\n } }\n </td>\n </ng-container>\n }\n\n <!-- Header Row -->\n @if (!useContentHeaderRowTemplate()) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Data Rows -->\n @if (!useContentRowTemplate()) {\n <tr\n mat-row\n *matRowDef=\"\n let row;\n let index = index;\n let dataIndex = dataIndex;\n columns: displayedColumns()\n \"\n [class]=\"row | rowClass: index : dataIndex : rowClassFormatter()\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n (click)=\"selectRow($event, row, getIndex(index, dataIndex))\"\n (contextmenu)=\"contextmenu($event, row, getIndex(index, dataIndex))\"\n ></tr>\n }\n\n <!-- Summary Row -->\n @if (whetherShowSummary()) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Expansion Row -->\n @if (expandable()) {\n <ng-container matColumnDef=\"DataGridExpansionColumnDef\">\n <td\n mat-cell\n *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns().length\"\n >\n <div class=\"data-grid-expansion-detail-wrapper\">\n <div class=\"data-grid-expansion-detail\">\n <ng-template\n [ngTemplateOutlet]=\"expansionTemplate()\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: dataIndex,\n expanded: expansionRowStates()[dataIndex].expanded,\n }\"\n />\n </div>\n </div>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['DataGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"data-grid-expansion\"\n [class]=\"expansionRowStates()[dataIndex].expanded ? 'expanded' : 'collapsed'\"\n ></tr>\n }\n </table>\n </div>\n\n <!-- No result -->\n @if (hasNoResult()) {\n <div class=\"data-grid-no-result\">\n @if (noResultTemplate()) {\n <ng-template [ngTemplateOutlet]=\"noResultTemplate()\" />\n } @else { {{ noResultText() }} }\n </div>\n }\n\n <!-- Infinite Scroll Loading Indicator -->\n @if (infiniteScroll() && isLoadingMore()) {\n <div class=\"data-grid-infinite-scroll-loading\">\n <mat-progress-bar mode=\"indeterminate\" />\n </div>\n }\n </div>\n</div>\n\n<div class=\"data-grid-footer\">\n <!-- Pagination -->\n @if (!infiniteScroll() && showPaginator()) {\n <div class=\"data-grid-pagination\">\n @if (paginationTemplate()) {\n <ng-template [ngTemplateOutlet]=\"paginationTemplate()\" />\n } @else {\n <mat-paginator\n [class.mat-paginator-hidden]=\"!showPaginator()\"\n [showFirstLastButtons]=\"showFirstLastButtons()\"\n [length]=\"length()\"\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [hidePageSize]=\"hidePageSize()\"\n (page)=\"onPage($event)\"\n [disabled]=\"pageDisabled()\"\n />\n }\n </div>\n }\n</div>\n\n<!-- Header template for extra content -->\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\n @if (headerExtraTemplate | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else { @if ($any(headerExtraTemplate)?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } }\n</ng-template>\n", styles: [".data-grid{position:relative;display:flex;flex-direction:column;width:100%;overflow:hidden;border:1px solid #c4c6d0;border-radius:12px}.data-grid .mat-table-container{overflow:auto}.data-grid .mat-table-container.mat-table-with-data{flex:1}.data-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.data-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-row.data-grid-expansion{height:0;overflow:hidden}.data-grid .mat-mdc-row.data-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.data-grid .mat-mdc-row.data-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.data-grid .mat-sort-header-icon{margin-left:4px}[dir=rtl] .data-grid .mat-sort-header-icon{margin-left:0;margin-right:4px}.data-grid .mat-header-cell-inner{display:inline-flex;align-items:center;vertical-align:middle}.data-grid .mat-paginator-hidden{display:none}.data-grid .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-row{padding:4px 8px;font-size:12px;height:32px}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-cell{height:32px}.data-grid.data-grid-size-small .data-grid-checkbox-cell{width:40px;min-width:40px;padding:0 calc((40px - var(--mat-checkbox-state-layer-size, 32px)) / 2)}.data-grid.data-grid-size-small .data-grid-row-expand-button{width:28px;height:28px}.data-grid.data-grid-size-small .data-grid-row-expand-button .data-grid-icon{width:18px;height:18px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-cell{padding:8px 12px;font-size:13px;height:40px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell{height:48px}.data-grid.data-grid-size-medium .data-grid-checkbox-cell{width:50px;min-width:50px;padding:0 calc((50px - var(--mat-checkbox-state-layer-size, 36px)) / 2)}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-cell{padding:12px 16px;font-size:14px;height:48px}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell{height:56px}.data-grid.data-grid-size-normal .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid-progress{position:absolute;top:0;z-index:120;width:100%}.data-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:var(--mat-table-header-container-height, 56px);padding:8px;box-sizing:border-box}.data-grid-toolbar-content{flex:1;width:0;padding:0 8px}.data-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.data-grid-content{flex-direction:column;width:0}.data-grid-footer{position:relative;z-index:1}.data-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.data-grid-expansion-placeholder{display:inline-block;vertical-align:middle;width:var(--mat-icon-button-state-layer-size);height:var(--mat-icon-button-state-layer-size)}.data-grid-expansion-detail-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%;padding:0;overflow:hidden}.data-grid-expansion.expanded .data-grid-expansion-detail-wrapper{grid-template-rows:1fr;padding:calc((var(--mat-table-row-item-container-height, 52px) - 20px) / 2) 0}.data-grid-expansion-detail{min-height:0}.data-grid-animations-enabled .data-grid-expansion-detail-wrapper{transition:all 225ms cubic-bezier(.4,0,.2,1)}.data-grid-row-expand-button.expanded .data-grid-row-expand-icon{transform:rotate(90deg)}.data-grid-row-expand-button.mat-mdc-icon-button,.data-grid-row-expand-button+data-grid-cell{vertical-align:middle}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:#3f51b514!important;position:relative}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{content:\"\";position:absolute;inset:0;border:2px solid #3f51b5;pointer-events:none;z-index:1}.mat-table-keyboard-navigation .mat-mdc-row:hover:not(.focused){background-color:#0000000a}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:rgba(var(--mat-primary-color),.08)!important}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{border-color:rgba(var(--mat-primary-color),1)}.data-grid-infinite-scroll-loading{width:100%;position:relative;height:4px}\n"] }]
3315
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- src/app/shared/components/data-grid/data-grid.component.html -->\n@if (loading()) {\n<div class=\"data-grid-progress\">\n <mat-progress-bar mode=\"indeterminate\" />\n</div>\n} @if (showToolbar()) {\n<div class=\"data-grid-toolbar\">\n <div class=\"data-grid-toolbar-content\">\n @if (toolbarTemplate()) {\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate()\" />\n } @else if (toolbarTitle()) {\n <div class=\"data-grid-toolbar-title\">{{ toolbarTitle() }}</div>\n }\n </div>\n <div class=\"data-grid-toolbar-actions\"></div>\n</div>\n}\n\n<div class=\"data-grid-main data-grid-layout\">\n <div class=\"data-grid-content data-grid-layout\">\n <div #tableContainer class=\"mat-table-container\" [class.mat-table-with-data]=\"!hasNoResult()\">\n <table\n mat-table\n [class.mat-table-hover]=\"rowHover()\"\n [class.mat-table-striped]=\"rowStriped()\"\n [class.mat-table-expandable]=\"expandable()\"\n [class.mat-table-keyboard-navigation]=\"keyboardNavigation()\"\n [dataSource]=\"dataSource\"\n multiTemplateDataRows\n matSort\n [matSortActive]=\"sortActive()\"\n [matSortDirection]=\"sortDirection()\"\n [matSortDisableClear]=\"sortDisableClear()\"\n [matSortDisabled]=\"sortDisabled()\"\n [matSortStart]=\"sortStart()\"\n (matSortChange)=\"onSortChange($event)\"\n [trackBy]=\"trackBy\"\n >\n <!-- Selection Column -->\n @if (rowSelectable() && !hideRowSelectionCheckbox()) {\n <ng-container matColumnDef=\"DataGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"data-grid-checkbox-cell\">\n @if (multiSelectable()) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !isAllSelected()\"\n (change)=\"$event ? toggleAllRows() : null\"\n />\n }\n </th>\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n class=\"data-grid-checkbox-cell\"\n >\n @if (!shouldHideCheckbox(row, getIndex(index, dataIndex))) {\n <mat-checkbox\n [disabled]=\"isRowDisabled(row, getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? toggleNormalCheckbox(row) : null\"\n />\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"data-grid-checkbox-cell\"></td>\n </ng-container>\n }\n\n <!-- Data Columns -->\n @for (col of columns(); track col.field) {\n <ng-container\n [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned === 'left'\"\n [stickyEnd]=\"col.pinned === 'right'\"\n >\n <!-- Header Cell -->\n <th\n mat-header-cell\n *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n <!-- Prioridad 1: Template espec\u00EDfico de la columna -->\n @if (col.headerCellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.headerCellTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerCellTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 2: Template general por campo -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerCellTemplate() | isTemplateRef) {\n <!-- Prioridad 3: Template general -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerCellTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if ($any(headerTemplate())?.[col.field] | isTemplateRef) {\n <!-- Prioridad 4: Template por campo en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else if (headerTemplate() | isTemplateRef) {\n <!-- Prioridad 5: Template general en headerTemplate -->\n <ng-template\n [ngTemplateOutlet]=\"$any(headerTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else {\n <!-- Comportamiento por defecto -->\n <div class=\"mat-header-cell-inner\">\n <div\n [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear()\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n }\n <span>{{ col.header | toObservable | async }}</span>\n @if (col.sortable) {\n <svg\n class=\"data-grid-icon mat-sort-header-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate(), colDef: col }\"\n />\n </div>\n }\n </th>\n\n <!-- Data Cell -->\n <td\n mat-cell\n *matCellDef=\"let row; let index = index; let dataIndex = dataIndex\"\n [class]=\"col | colClass: row : rowChangeRecord : rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n acpGridSelectableCell\n [cellSelectable]=\"cellSelectable()\"\n (cellSelectedChange)=\"selectCell($event, row, col)\"\n >\n @if (cellTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if ($any(cellTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(cellTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: getIndex(index, dataIndex),\n colDef: col,\n }\"\n />\n } @else { @if (col.showExpand) {\n <button\n class=\"data-grid-row-expand-button\"\n mat-icon-button\n acpDataGridExpansionToggle\n type=\"button\"\n [(opened)]=\"expansionRowStates()[dataIndex].expanded\"\n (toggleChange)=\"onExpansionChange($event, row, col, dataIndex)\"\n >\n <svg\n class=\"data-grid-icon data-grid-row-expand-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <acp-data-grid-cell\n [rowData]=\"row\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n (rowDataChange)=\"onRowDataChange($event)\"\n />\n } } }\n </td>\n\n <!-- Footer Cell -->\n <td\n mat-footer-cell\n *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style.width]=\"col.width\"\n [style.min-width]=\"col.width\"\n [style.left]=\"col.left\"\n [style.right]=\"col.right\"\n >\n @if (col.showExpand) {\n <span class=\"data-grid-expansion-placeholder\"></span>\n } @if (summaryTemplate() | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data() }\"\n />\n } @else { @if ($any(summaryTemplate())?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"$any(summaryTemplate())[col.field]\"\n [ngTemplateOutletContext]=\"{\n $implicit: getColData(data(), col),\n colData: getColData(data(), col),\n colDef: col,\n }\"\n />\n } @else {\n <acp-data-grid-cell\n [summary]=\"true\"\n [data]=\"data()\"\n [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder()\"\n />\n } }\n </td>\n </ng-container>\n }\n\n <!-- Header Row -->\n @if (!useContentHeaderRowTemplate()) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Data Rows -->\n @if (!useContentRowTemplate()) {\n <tr\n mat-row\n *matRowDef=\"\n let row;\n let index = index;\n let dataIndex = dataIndex;\n columns: displayedColumns()\n \"\n [class]=\"row | rowClass: index : dataIndex : rowClassFormatter()\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n [class.focused]=\"keyboardNavigation() && focusedRowIndex() === dataIndex\"\n [class.highlighted]=\"highlightedRowIndex() === dataIndex\"\n (click)=\"selectRow($event, row, getIndex(index, dataIndex))\"\n (contextmenu)=\"contextmenu($event, row, getIndex(index, dataIndex))\"\n ></tr>\n }\n\n <!-- Summary Row -->\n @if (whetherShowSummary()) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns(); sticky: true\"></tr>\n }\n\n <!-- Expansion Row -->\n @if (expandable()) {\n <ng-container matColumnDef=\"DataGridExpansionColumnDef\">\n <td\n mat-cell\n *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns().length\"\n >\n <div class=\"data-grid-expansion-detail-wrapper\">\n <div class=\"data-grid-expansion-detail\">\n <ng-template\n [ngTemplateOutlet]=\"expansionTemplate()\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n rowData: row,\n index: dataIndex,\n expanded: expansionRowStates()[dataIndex].expanded,\n }\"\n />\n </div>\n </div>\n </td>\n </ng-container>\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['DataGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"data-grid-expansion\"\n [class]=\"expansionRowStates()[dataIndex].expanded ? 'expanded' : 'collapsed'\"\n ></tr>\n }\n </table>\n </div>\n\n <!-- No result -->\n @if (hasNoResult()) {\n <div class=\"data-grid-no-result\">\n @if (noResultTemplate()) {\n <ng-template [ngTemplateOutlet]=\"noResultTemplate()\" />\n } @else { {{ noResultText() }} }\n </div>\n }\n\n <!-- Infinite Scroll Loading Indicator -->\n @if (infiniteScroll() && isLoadingMore()) {\n <div class=\"data-grid-infinite-scroll-loading\">\n <mat-progress-bar mode=\"indeterminate\" />\n </div>\n }\n </div>\n</div>\n\n<div class=\"data-grid-footer\">\n <!-- Pagination -->\n @if (!infiniteScroll() && showPaginator()) {\n <div class=\"data-grid-pagination\">\n @if (paginationTemplate()) {\n <ng-template [ngTemplateOutlet]=\"paginationTemplate()\" />\n } @else {\n <mat-paginator\n [class.mat-paginator-hidden]=\"!showPaginator()\"\n [showFirstLastButtons]=\"showFirstLastButtons()\"\n [length]=\"length()\"\n [pageIndex]=\"pageIndex()\"\n [pageSize]=\"pageSize()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [hidePageSize]=\"hidePageSize()\"\n (page)=\"onPage($event)\"\n [disabled]=\"pageDisabled()\"\n />\n }\n </div>\n }\n</div>\n\n<!-- Header template for extra content -->\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\n @if (headerExtraTemplate | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } @else { @if ($any(headerExtraTemplate)?.[col.field] | isTemplateRef) {\n <ng-template\n [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\"\n />\n } }\n</ng-template>\n", styles: [".data-grid{position:relative;display:flex;flex-direction:column;width:100%;overflow:hidden;border:1px solid #c4c6d0;border-radius:12px}.data-grid .mat-table-container{overflow:auto}.data-grid .mat-table-container.mat-table-with-data{flex:1}.data-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.data-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .data-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color)}.data-grid .mat-mdc-row.highlighted{background-color:var(--mat-sys-surface-container-highest, #e6e1e5)}.data-grid .mat-mdc-row.data-grid-expansion{height:0;overflow:hidden}.data-grid .mat-mdc-row.data-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.data-grid .mat-mdc-row.data-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.data-grid .mat-sort-header-icon{margin-left:4px}[dir=rtl] .data-grid .mat-sort-header-icon{margin-left:0;margin-right:4px}.data-grid .mat-header-cell-inner{display:inline-flex;align-items:center;vertical-align:middle}.data-grid .mat-paginator-hidden{display:none}.data-grid .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-row{padding:4px 8px;font-size:12px;height:32px}.data-grid.data-grid-size-small .mat-mdc-table .mat-mdc-header-cell{height:32px}.data-grid.data-grid-size-small .data-grid-checkbox-cell{width:40px;min-width:40px;padding:0 calc((40px - var(--mat-checkbox-state-layer-size, 32px)) / 2)}.data-grid.data-grid-size-small .data-grid-row-expand-button{width:28px;height:28px}.data-grid.data-grid-size-small .data-grid-row-expand-button .data-grid-icon{width:18px;height:18px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-row,.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-cell{padding:8px 12px;font-size:13px;height:40px}.data-grid.data-grid-size-medium .mat-mdc-table .mat-mdc-header-cell{height:48px}.data-grid.data-grid-size-medium .data-grid-checkbox-cell{width:50px;min-width:50px;padding:0 calc((50px - var(--mat-checkbox-state-layer-size, 36px)) / 2)}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-footer-cell,.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-cell{padding:12px 16px;font-size:14px;height:48px}.data-grid.data-grid-size-normal .mat-mdc-table .mat-mdc-header-cell{height:56px}.data-grid.data-grid-size-normal .data-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mat-checkbox-state-layer-size, 40px)) / 2)}.data-grid-progress{position:absolute;top:0;z-index:120;width:100%}.data-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:var(--mat-table-header-container-height, 56px);padding:8px;box-sizing:border-box}.data-grid-toolbar-content{flex:1;width:0;padding:0 8px}.data-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.data-grid-content{flex-direction:column;width:0}.data-grid-footer{position:relative;z-index:1}.data-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.data-grid-expansion-placeholder{display:inline-block;vertical-align:middle;width:var(--mat-icon-button-state-layer-size);height:var(--mat-icon-button-state-layer-size)}.data-grid-expansion-detail-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%;padding:0;overflow:hidden}.data-grid-expansion.expanded .data-grid-expansion-detail-wrapper{grid-template-rows:1fr;padding:calc((var(--mat-table-row-item-container-height, 52px) - 20px) / 2) 0}.data-grid-expansion-detail{min-height:0}.data-grid-animations-enabled .data-grid-expansion-detail-wrapper{transition:all 225ms cubic-bezier(.4,0,.2,1)}.data-grid-row-expand-button.expanded .data-grid-row-expand-icon{transform:rotate(90deg)}.data-grid-row-expand-button.mat-mdc-icon-button,.data-grid-row-expand-button+data-grid-cell{vertical-align:middle}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:#3f51b514!important;position:relative}.mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{content:\"\";position:absolute;inset:0;border:2px solid #3f51b5;pointer-events:none;z-index:1}.mat-table-keyboard-navigation .mat-mdc-row:hover:not(.focused){background-color:#0000000a}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused{background-color:rgba(var(--mat-primary-color),.08)!important}.mat-app-background .mat-table-keyboard-navigation .mat-mdc-row.cdk-row.focused:after{border-color:rgba(var(--mat-primary-color),1)}.data-grid-infinite-scroll-loading{width:100%;position:relative;height:4px}\n"] }]
3674
3316
  }], ctorParameters: () => [], propDecorators: { table: [{
3675
3317
  type: ViewChild,
3676
3318
  args: [MatTable]
@@ -3692,7 +3334,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
3692
3334
  }], footerRowDefs: [{
3693
3335
  type: ContentChildren,
3694
3336
  args: [MatFooterRow]
3695
- }], showToolbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToolbar", required: false }] }], showColumnMenuButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showColumnMenuButton", required: false }] }], toolbarTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarTitle", required: false }] }], toolbarTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarTemplate", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], emptyValuePlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyValuePlaceholder", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], headerExtraTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerExtraTemplate", required: false }] }], noResultTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultTemplate", required: false }] }], paginationTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "paginationTemplate", required: false }] }], summaryTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "summaryTemplate", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], headerCellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerCellTemplate", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], expansionTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "expansionTemplate", required: false }] }], closeOthersOnExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOthersOnExpand", required: false }] }], pageOnFront: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageOnFront", required: false }] }], showPaginator: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPaginator", required: false }] }], pageDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageDisabled", required: false }] }], showFirstLastButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLastButtons", required: false }] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], hidePageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidePageSize", required: false }] }], infiniteScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScroll", required: false }] }], infiniteScrollThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollThreshold", required: false }] }], infiniteScrollDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollDisabled", required: false }] }], keyboardNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardNavigation", required: false }] }], sortOnFront: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortOnFront", required: false }] }], sortActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortActive", required: false }] }], sortDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDirection", required: false }] }], sortDisableClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDisableClear", required: false }] }], sortDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDisabled", required: false }] }], sortStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortStart", required: false }] }], rowHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHover", required: false }] }], rowStriped: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowStriped", required: false }] }], rowSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelectable", required: false }] }], multiSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSelectable", required: false }] }], multiSelectionWithClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSelectionWithClick", required: false }] }], hideRowSelectionCheckbox: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideRowSelectionCheckbox", required: false }] }], disableRowClickSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRowClickSelection", required: false }] }], rowClassFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowClassFormatter", required: false }] }], rowSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelected", required: false }] }], rowSelectionFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelectionFormatter", required: false }] }], cellSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellSelectable", required: false }] }], useContentRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContentRowTemplate", required: false }] }], useContentHeaderRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContentHeaderRowTemplate", required: false }] }], useContentFooterRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContentFooterRowTemplate", required: false }] }], showSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSummary", required: false }] }], noResultText: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultText", required: false }] }], page: [{ type: i0.Output, args: ["page"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], rowSelectedChange: [{ type: i0.Output, args: ["rowSelectedChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], cellClick: [{ type: i0.Output, args: ["cellClick"] }], cellSelectedChange: [{ type: i0.Output, args: ["cellSelectedChange"] }], expansionChange: [{ type: i0.Output, args: ["expansionChange"] }], rowContextMenu: [{ type: i0.Output, args: ["rowContextMenu"] }], infiniteScrollLoad: [{ type: i0.Output, args: ["infiniteScrollLoad"] }], focusedRowChange: [{ type: i0.Output, args: ["focusedRowChange"] }], handleKeyDown: [{
3337
+ }], showToolbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToolbar", required: false }] }], showColumnMenuButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showColumnMenuButton", required: false }] }], toolbarTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarTitle", required: false }] }], toolbarTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarTemplate", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], emptyValuePlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyValuePlaceholder", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], headerExtraTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerExtraTemplate", required: false }] }], noResultTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultTemplate", required: false }] }], paginationTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "paginationTemplate", required: false }] }], summaryTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "summaryTemplate", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], headerCellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerCellTemplate", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], expansionTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "expansionTemplate", required: false }] }], closeOthersOnExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOthersOnExpand", required: false }] }], pageOnFront: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageOnFront", required: false }] }], showPaginator: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPaginator", required: false }] }], pageDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageDisabled", required: false }] }], showFirstLastButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLastButtons", required: false }] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], hidePageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidePageSize", required: false }] }], infiniteScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScroll", required: false }] }], infiniteScrollThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollThreshold", required: false }] }], infiniteScrollDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollDisabled", required: false }] }], keyboardNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardNavigation", required: false }] }], highlightedRowIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightedRowIndex", required: false }] }], sortOnFront: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortOnFront", required: false }] }], sortActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortActive", required: false }] }], sortDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDirection", required: false }] }], sortDisableClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDisableClear", required: false }] }], sortDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDisabled", required: false }] }], sortStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortStart", required: false }] }], rowHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHover", required: false }] }], rowStriped: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowStriped", required: false }] }], rowSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelectable", required: false }] }], multiSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSelectable", required: false }] }], multiSelectionWithClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSelectionWithClick", required: false }] }], hideRowSelectionCheckbox: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideRowSelectionCheckbox", required: false }] }], disableRowClickSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableRowClickSelection", required: false }] }], rowClassFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowClassFormatter", required: false }] }], rowSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelected", required: false }] }], rowSelectionFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelectionFormatter", required: false }] }], cellSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellSelectable", required: false }] }], useContentRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContentRowTemplate", required: false }] }], useContentHeaderRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContentHeaderRowTemplate", required: false }] }], useContentFooterRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContentFooterRowTemplate", required: false }] }], showSummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSummary", required: false }] }], noResultText: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultText", required: false }] }], page: [{ type: i0.Output, args: ["page"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], rowSelectedChange: [{ type: i0.Output, args: ["rowSelectedChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], cellClick: [{ type: i0.Output, args: ["cellClick"] }], cellSelectedChange: [{ type: i0.Output, args: ["cellSelectedChange"] }], expansionChange: [{ type: i0.Output, args: ["expansionChange"] }], rowContextMenu: [{ type: i0.Output, args: ["rowContextMenu"] }], infiniteScrollLoad: [{ type: i0.Output, args: ["infiniteScrollLoad"] }], focusedRowChange: [{ type: i0.Output, args: ["focusedRowChange"] }], handleKeyDown: [{
3696
3338
  type: HostListener,
3697
3339
  args: ['document:keydown', ['$event']]
3698
3340
  }] } });
@@ -3749,9 +3391,90 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
3749
3391
  args: ['input']
3750
3392
  }] } });
3751
3393
 
3394
+ class GetTotalPipe {
3395
+ transform(colName, dataSource) {
3396
+ return this.getTotal(colName, dataSource) || '';
3397
+ }
3398
+ /**
3399
+ * Calculate and return the total (sum) of all the column --> the column must be number
3400
+ */
3401
+ getTotal(colName, dataSource) {
3402
+ const total = dataSource
3403
+ .map(row => row[colName])
3404
+ .reduce((acc, value) => (value ? acc + Number(value) : acc), 0);
3405
+ return total?.toFixed(2);
3406
+ }
3407
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GetTotalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3408
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: GetTotalPipe, isStandalone: true, name: "getTotal" });
3409
+ }
3410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: GetTotalPipe, decorators: [{
3411
+ type: Pipe,
3412
+ args: [{
3413
+ name: 'getTotal',
3414
+ standalone: true,
3415
+ }]
3416
+ }] });
3417
+
3418
+ class StatusDisplayPipe {
3419
+ sanitizer = inject(DomSanitizer);
3420
+ transloco = inject(TranslocoService, { optional: true });
3421
+ transform(isActive, options = {}) {
3422
+ const { gender = 'neutral', showIcon = true, customActiveText, customInactiveText, textClass = '', iconClass = '', } = options;
3423
+ const text = this.getStatusText(isActive, gender, customActiveText, customInactiveText);
3424
+ const icon = isActive ? 'check_circle' : 'cancel';
3425
+ const colorClass = isActive ? 'text-green-500' : 'text-red-500';
3426
+ const combinedIconClass = `${colorClass} align-middle mr-1 ${iconClass}`.trim();
3427
+ const combinedTextClass = `align-middle ${textClass}`.trim();
3428
+ let html = '';
3429
+ if (showIcon) {
3430
+ html += `<mat-icon class="${combinedIconClass}" fontIcon="${icon}"></mat-icon>`;
3431
+ }
3432
+ html += `<span class="${combinedTextClass}">${text}</span>`;
3433
+ return this.sanitizer.bypassSecurityTrustHtml(html);
3434
+ }
3435
+ getStatusText(isActive, gender, customActive, customInactive) {
3436
+ if (customActive && isActive)
3437
+ return customActive;
3438
+ if (customInactive && !isActive)
3439
+ return customInactive;
3440
+ if (!this.transloco)
3441
+ return this.getFallbackText(isActive, gender);
3442
+ const translationKey = this.getTranslationKey(isActive, gender);
3443
+ const translation = this.transloco.translate(translationKey);
3444
+ return translation !== translationKey ? translation : this.getFallbackText(isActive, gender);
3445
+ }
3446
+ getTranslationKey(isActive, gender) {
3447
+ const base = isActive ? 'status.active' : 'status.inactive';
3448
+ return gender !== 'neutral'
3449
+ ? `${base}.${gender}`
3450
+ : base;
3451
+ }
3452
+ getFallbackText(isActive, gender) {
3453
+ const lang = this.transloco?.getActiveLang() || 'en';
3454
+ const isSpanish = lang.startsWith('es');
3455
+ if (!isSpanish) {
3456
+ return isActive ? 'Active' : 'Inactive';
3457
+ }
3458
+ if (isActive) {
3459
+ return gender === 'female' ? 'Activa' : 'Activo';
3460
+ }
3461
+ else {
3462
+ return gender === 'female' ? 'Inactiva' : 'Inactivo';
3463
+ }
3464
+ }
3465
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: StatusDisplayPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3466
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: StatusDisplayPipe, isStandalone: true, name: "statusDisplay" });
3467
+ }
3468
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: StatusDisplayPipe, decorators: [{
3469
+ type: Pipe,
3470
+ args: [{
3471
+ name: 'statusDisplay',
3472
+ }]
3473
+ }] });
3474
+
3752
3475
  /**
3753
3476
  * Generated bundle index. Do not edit.
3754
3477
  */
3755
3478
 
3756
- export { AUTOCOMPLETE_WRAPPER_CUSTOMER_CONFIG, AUTOCOMPLETE_WRAPPER_DEFAULT_CONFIG, AUTOCOMPLETE_WRAPPER_LOCAL_CONFIG, AUTOCOMPLETE_WRAPPER_PAGINATED_CONFIG, AUTOCOMPLETE_WRAPPER_PRODUCT_CONFIG, AUTOCOMPLETE_WRAPPER_SIMPLE_CONFIG, AdvancedDialogService, AutocompleteWrapperService, Button, ColumnDefinition, DATA_GRID_DEFAULT_OPTIONS, DataGrid, DialogWrapper, DynamicCard, DynamicSelect, DynamicTable, FieldDefinition, GetTotalPipe, IconRegistryService, InputChip, OverlayService, Pagination, ReusableAutocompleteComponent, Spinner, StatusDisplayPipe, SvgIcon, TableCellIndex, TabulatorTable, ThemeSwitcher, ThemeToggle, ToUpperCase, UserIcon, createAutocompleteWrapperConfig };
3479
+ export { AUTOCOMPLETE_WRAPPER_CUSTOMER_CONFIG, AUTOCOMPLETE_WRAPPER_DEFAULT_CONFIG, AUTOCOMPLETE_WRAPPER_LOCAL_CONFIG, AUTOCOMPLETE_WRAPPER_PAGINATED_CONFIG, AUTOCOMPLETE_WRAPPER_PRODUCT_CONFIG, AUTOCOMPLETE_WRAPPER_SIMPLE_CONFIG, AdvancedDialogService, AutocompleteWrapperService, Button, DATA_GRID_DEFAULT_OPTIONS, DataGrid, DialogWrapper, DynamicCard, DynamicSelect, GetTotalPipe, IconRegistryService, InputChip, OverlayService, Pagination, ReusableAutocompleteComponent, Spinner, StatusDisplayPipe, SvgIcon, TabulatorTable, ThemeSwitcher, ThemeToggle, ToUpperCase, UserIcon, createAutocompleteWrapperConfig };
3757
3480
  //# sourceMappingURL=acontplus-ng-components.mjs.map