{"version":3,"file":"mat-table-ext-test1.mjs","sources":["../../../projects/mat-table-ext/src/lib/mat-table-ext.service.ts","../../../projects/mat-table-ext/src/lib/components/editing/editing.component.ts","../../../projects/mat-table-ext/src/lib/components/editing/editing.component.html","../../../projects/mat-table-ext/src/lib/components/column-pinning/column-pinning.component.ts","../../../projects/mat-table-ext/src/lib/components/column-pinning/column-pinning.component.html","../../../projects/mat-table-ext/src/lib/components/filter-columns-component/filter-columns-component.component.ts","../../../projects/mat-table-ext/src/lib/components/filter-columns-component/filter-columns-component.component.html","../../../projects/mat-table-ext/src/lib/directives/resize-column.directive.ts","../../../projects/mat-table-ext/src/lib/mat-table-ext.component.ts","../../../projects/mat-table-ext/src/lib/mat-table-ext.component.html","../../../projects/mat-table-ext/src/lib/mat-table-ext.module.ts","../../../projects/mat-table-ext/src/public-api.ts","../../../projects/mat-table-ext/src/mat-table-ext-test1.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class MatTableExtService {\n  public selectedRow = new BehaviorSubject<any>(null);\n  \n  constructor(public http: HttpClient) { }\n}\n","import { Component, Inject, OnInit, TemplateRef } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MTExColumn } from '../../models/tableExtModels';\nimport { MatTableExtService } from '../../mat-table-ext.service';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { TitleCasePipe } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n  selector: 'app-editing',\n  templateUrl: './editing.component.html',\n  styleUrls: ['./editing.component.scss'],\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatButtonModule,\n    MatDialogModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    MatIconModule,\n    TitleCasePipe\n  ]\n})\nexport class EditingComponent implements OnInit {\n  public templateRef!: TemplateRef<any>;\n  public keys: string[] = [];\n  public templateKeys: string[] = [];\n  public types: any = {};\n  public templateTypes: any = {};\n  public columns: MTExColumn[] = [];\n  public templateRow: any = {};\n  public isCellEdit: boolean = false;\n  public cellColumn!: MTExColumn;\n  public cellValue: any;\n  public cellField: string = '';\n  \n  constructor(\n    public dialogRef: MatDialogRef<EditingComponent>,\n    @Inject(MAT_DIALOG_DATA) public dialogData: any,\n    public service: MatTableExtService\n  ) { }\n  \n  ngOnInit(): void {\n    // Check if this is cell-level editing\n    if (this.dialogData.isCellEdit) {\n      this.isCellEdit = true;\n      this.cellColumn = this.dialogData.column;\n      this.cellField = this.cellColumn.field;\n      this.cellValue = this.dialogData.row[this.cellField];\n      \n      // Handle selection type\n      if (this.cellColumn.type === 'selection') {\n        this.types[this.cellField] = 'selection';\n      } else {\n        this.types[this.cellField] = this.cellColumn.type;\n      }\n      \n      this.templateRef = this.dialogData.templateRef;\n    } else {\n      this.setData(this.dialogData);\n    }\n  }\n/**\n * @description This method is used to set data for editing.\n * @param value dialog Data\n */\n  setData(value: any) {\n    let row = value.row;\n    let types: any = {};\n    this.keys = [];\n    this.columns = value.columns;\n    this.columns.forEach((column) => {\n      this.keys.push(column.field);\n      if (column.type == 'selection') {\n        types[column.field] = column.type;\n        let temp = row[column.field];\n        row[column.field] = {\n          value: temp,\n          options: column.options,\n        };\n      } else {\n        types[column.field] = column.type;\n      }\n    });\n    this.types = types;\n    this.setTemplateRef(value);\n  }\n/**\n * @description This method is used to set the data when data comes in from cus template.\n * @param value template value\n */\n  setTemplateRef(value: any) {\n    if (value.templateRef !== undefined) {\n      this.templateRow = { ...value.row };\n      let types: any = {};\n      this.templateKeys = [];\n      this.columns.forEach((column) => {\n        this.templateKeys.push(column.field);\n        if (column.type == 'selection') {\n          types[column.field] = column.type;\n          let temp = this.templateRow[column.field];\n          this.templateRow[column.field] = {\n            value: temp,\n            options: column.options,\n          };\n        } else {\n          types[column.field] = column.type;\n        }\n      });\n      this.templateTypes = types;\n      this.templateRef = value.templateRef;\n    }\n  }\n  /**\n   * @description This method is triggered when dialog is closed and also emits the dialog closed event data.\n   */\n  closeDialog() {\n    if (this.isCellEdit) {\n      // Return single cell data\n      this.dialogRef.close({\n        field: this.cellField,\n        value: this.cellValue\n      });\n    } else {\n      // Return full row data\n      let rowData = { ...this.dialogData.row };\n      this.keys.forEach((key: any) => {\n        if (this.types[key] === 'selection') {\n          let temp = rowData[key].value;\n          rowData[key] = temp;\n        }\n      });\n      this.dialogRef.close(rowData);\n    }\n  }  /**\n   * @description This method is called when the dialog is closed custom template action.\n   * @param row row to be edited.\n   * @param keys keys of columns\n   * @param types column types\n   */\n  closeTemplateDialog(row: any, keys: string[], types: string[]) {\n    let rowData = { ...row };\n    keys.forEach((key: any) => {\n      if (types[key] === 'selection') {\n        let temp = rowData[key].value;\n        rowData[key] = temp;\n      }\n    });\n    this.dialogRef.close(rowData);\n  }\n}\n","@if (!templateRef) {\n    <div style=\"height: 100%;\" class=\"main-dialog-container\">\n        <div mat-dialog-title class=\"dialog-title-container\">\n            <h4 style=\"margin: 0;\">{{ isCellEdit ? 'Edit Cell' : 'Edit Row' }}</h4>\n            <span class=\"example-spacer\"></span>\n            <button style=\"margin-right: -10px;\" mat-icon-button aria-label=\"Example icon button with a vertical three dot icon\">\n                <mat-icon mat-dialog-close style=\"cursor: pointer;\" fxFlex=\"5\">close</mat-icon>\n            </button>\n        </div>\n        <mat-dialog-content style=\"margin-right: 20px;\">\n            <!-- Cell-level editing -->\n            @if (isCellEdit) {\n                <div style=\"display: flex; flex-direction: column;\">\n                    <!-- Number Type -->\n                    @if (types[cellField] == 'number') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            <input matInput type=\"number\" [(ngModel)]=\"cellValue\" [ngModelOptions]=\"{standalone: true}\">\n                        </mat-form-field>\n                    }\n            \n                    <!-- String Type -->\n                    @if (types[cellField] == 'string') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            <input matInput type=\"text\" [(ngModel)]=\"cellValue\" [ngModelOptions]=\"{standalone: true}\">\n                        </mat-form-field>\n                    }\n                    \n                    <!-- Textarea Type -->\n                    @if (types[cellField] == 'textarea') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            <textarea matInput rows=\"6\" [(ngModel)]=\"cellValue\" [ngModelOptions]=\"{standalone: true}\"></textarea>\n                        </mat-form-field>\n                    }\n                    \n                    @if (types[cellField] == 'date') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            <input matInput type=\"text\" [(ngModel)]=\"cellValue\" [ngModelOptions]=\"{standalone: true}\">\n                        </mat-form-field>\n                    }\n                    \n                    <!-- Datepicker Type -->\n                    @if (types[cellField] == 'datepicker') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            <input matInput [matDatepicker]=\"cellPopupPicker\" [(ngModel)]=\"cellValue\" [ngModelOptions]=\"{standalone: true}\">\n                            <mat-datepicker-toggle matIconSuffix [for]=\"cellPopupPicker\"></mat-datepicker-toggle>\n                            <mat-datepicker #cellPopupPicker></mat-datepicker>\n                        </mat-form-field>\n                    }\n                    \n                    <!-- Selection Type -->\n                    @if (types[cellField] == 'selection') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            <mat-select [(ngModel)]=\"cellValue\">\n                                @for (option of cellColumn.options; track option) {\n                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                }\n                            </mat-select>\n                        </mat-form-field>\n                    }\n                    \n                    <!-- Boolean Type -->\n                    @if (types[cellField] == 'boolean') {\n                        <p>\n                            <mat-checkbox color=\"primary\" [(ngModel)]=\"cellValue\">\n                                <mat-label>{{cellColumn.header || cellField | titlecase}}</mat-label>\n                            </mat-checkbox>\n                        </p>\n                    }\n                </div>\n            }\n            \n            <!-- Row-level editing -->\n            @if (!isCellEdit) {\n                <div style=\"display: flex; flex-direction: column;\">\\n                @for (key of keys; track key) {\n                    <!-- Number Type -->\n                    @if (types[key] == 'number') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{key | titlecase}}</mat-label>\n                            <input matInput type=\"number\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\n                        </mat-form-field>\n                    }\n            \n                    <!-- String Type -->\n                    @if (types[key] == 'string') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{key | titlecase}}</mat-label>\n                            <input matInput type=\"text\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\n                        </mat-form-field>\n                    }\n                    <!-- Textarea Type -->\n                    @if (types[key] == 'textarea') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{key | titlecase}}</mat-label>\n                            <textarea matInput rows=\"4\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\"></textarea>\n                        </mat-form-field>\n                    }\n                    @if (types[key] == 'date') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{key | titlecase}}</mat-label>\n                            <input matInput type=\"text\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\n                        </mat-form-field>\n                    }\n                    <!-- Datepicker Type -->\n                    @if (types[key] == 'datepicker') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{key | titlecase}}</mat-label>\n                            <input matInput [matDatepicker]=\"popupPicker\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\n                            <mat-datepicker-toggle matIconSuffix [for]=\"popupPicker\"></mat-datepicker-toggle>\n                            <mat-datepicker #popupPicker></mat-datepicker>\n                        </mat-form-field>\n                    }\n                    <!-- Selection Type -->\n                    @if (types[key] == 'selection') {\n                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                            <mat-label>{{key | titlecase}}</mat-label>\n                            <mat-select [value]=\"dialogData['row'][key].value\" [(ngModel)]=\"dialogData['row'][key].value\">\n                                @for (option of dialogData['row'][key].options; track option) {\n                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                }\n                            </mat-select>\n                        </mat-form-field>\n                    }\n                    <!-- Boolean Type -->\n                    @if (types[key] == 'boolean') {\n                        <p>\n                            <mat-checkbox color=\"primary\" [(ngModel)]=\"dialogData['row'][key]\">\n                                <mat-label>{{key | titlecase}}</mat-label>\n                            </mat-checkbox>\n                        </p>\n                    }\n                }\n            </div>\n            }\n        </mat-dialog-content>\n        <div class=\"spacer\"></div>\n        <mat-dialog-actions style=\"margin-top: 20px;\" align=\"end\">\n            <button mat-raised-button color=\"warn\" mat-dialog-close>\n                Cancel\n            </button>\n            <button mat-raised-button color=\"primary\" (click)=\"closeDialog()\">Save</button>\n        </mat-dialog-actions>\n    </div>\n}\n@if (templateRef) {\n    <ng-container [ngTemplateOutlet]=\"templateRef\" [ngTemplateOutletContext]=\"{data:{row:templateRow,columns:columns,columnKeys:templateKeys,columnTypes:templateTypes,closeDialog:closeTemplateDialog}}\"></ng-container>\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { MTExColumn } from '../../models/tableExtModels';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TitleCasePipe } from '@angular/common';\n\n@Component({\n  selector: 'app-column-pinning',\n  templateUrl: './column-pinning.component.html',\n  styleUrls: ['./column-pinning.component.scss'],\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatIconModule,\n    MatTooltipModule,\n    TitleCasePipe\n  ]\n})\nexport class ColumnPinningComponent implements OnInit {\n  @Input() columns!: MTExColumn[];\n  @Output() columnsChanged: EventEmitter<MTExColumn[]> = new EventEmitter();\n  public icons = {\n    left: 'pinLeft',\n    right: 'pinRight',\n    none: 'pinNone',\n  };\n\n  constructor() {}\n  ngOnInit(): void {}\n  /**\n   * @description This method is called when pin value changes for a column.\n   * @param column column of which to set the pin value\n   */\n  changeValue(column: MTExColumn) {\n    if (column.pinned) {\n      if (column.pinned == 'left') {\n        this.setColumnPinValue(column, 'right');\n      } else if (column.pinned == 'right') {\n        this.setColumnPinValue(column, null);\n      }\n    } else {\n      this.setColumnPinValue(column, 'left');\n    }\n    \n    // Create a new array reference to trigger change detection\n    this.columnsChanged.emit([...this.columns]);\n  }\n  /**\n   * @description This method is used to set the column pin value.\n   * @param column column of which to set the pin value\n   * @param value pin value to set\n   */\n  setColumnPinValue(column: MTExColumn, value: 'left' | 'right' | null) {\n    // Create a new array with updated column\n    this.columns = this.columns.map(col => {\n      if (column?.field == col.field) {\n        return { ...col, pinned: value };\n      }\n      return col;\n    });\n  }\n}\n","@for (column of columns; track column.field) {\n    <div class=\"pinning-list-item\">\n        <button mat-icon-button (click)=\"changeValue(column)\">\n            <mat-icon matTooltip=\"{{column['pinned'] ? (column['pinned'] | titlecase) : 'None'}}\"\n                svgIcon=\"{{column['pinned'] == 'left' || column['pinned'] == 'right' ? icons[column['pinned']] : 'pinNone'}}\"\n                class=\"pinning-icon\"></mat-icon>\n        </button>\n        <span class=\"column-headers\">{{column.header}}</span>\n    </div>\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\n\n@Component({\n  selector: 'app-filter-columns-component',\n  templateUrl: './filter-columns-component.component.html',\n  styleUrls: ['./filter-columns-component.component.scss'],\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatDatepickerModule\n  ]\n})\nexport class FilterColumnsComponentComponent implements OnInit {\n  @Input() obj!: any;\n  @Output() filterOutput: EventEmitter<any> = new EventEmitter<any>();\n  stringCtrl: FormControl = new FormControl();\n  numberCtrl: FormControl = new FormControl();\n  dateCtrl: FormControl = new FormControl();\n  textareaCtrl: FormControl = new FormControl();\n  booleanCtrl: FormControl = new FormControl();\n  selectionCtrl: FormControl = new FormControl();\n  constructor() {}\n  ngOnInit(): void {\n    this.stringCtrl.valueChanges.subscribe((value) => {\n      this.checkValue(value);\n    });\n    this.dateCtrl.valueChanges.subscribe((value) => {\n      this.checkValue(value);\n    });\n    this.textareaCtrl.valueChanges.subscribe((value) => {\n      this.checkValue(value);\n    });\n    this.numberCtrl.valueChanges.subscribe((value) => {\n      this.checkValue(value);\n    });\n    this.booleanCtrl.valueChanges.subscribe((value) => {\n      this.checkValue(value);\n    });\n    this.selectionCtrl.valueChanges.subscribe((value) => {\n      this.checkValue(value);\n    });\n  }\n  /**\n   * @description This method is make value is valid and not null.\n   * @param value value to check its type.\n   */\n  checkValue(value: any) {\n    if (value || value == '') {\n      this.emitOutput(value);\n    } else if (value == null) {\n      this.emitOutput('');\n    }\n  }\n/**\n * @description This method will emit seach value to parent component.\n * @param value value on which base table rows are filtered. \n */\n  emitOutput(value: any) {\n    let obj = { [this.obj.field]: value };\n    this.filterOutput.emit(obj);\n  }\n}\n","\n@if (obj) {\n    <!-- Number Type -->\n    @if (obj.type == 'number') {\n        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\" >\n            <input matInput type=\"number\" [formControl]=\"numberCtrl\">\n        </mat-form-field>\n    }\n    \n    <!-- String Type -->\n    @if (obj.type == 'string') {\n        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n            <input matInput type=\"text\" [formControl]=\"stringCtrl\">\n        </mat-form-field>\n    }\n    @if (obj.type == 'textarea') {\n        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n            <textarea matInput rows=\"3\" [formControl]=\"textareaCtrl\"></textarea>\n        </mat-form-field>\n    }\n    @if (obj.type == 'date') {\n        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n            <input matInput type=\"date\" [formControl]=\"dateCtrl\">\n        </mat-form-field>\n    }\n        @if (obj.type == 'datepicker') {\n        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n            <input matInput [matDatepicker]=\"cellPicker\" [formControl]=\"dateCtrl\">\n            <mat-datepicker-toggle matIconSuffix [for]=\"cellPicker\"></mat-datepicker-toggle>\n            <mat-datepicker #cellPicker></mat-datepicker>\n        </mat-form-field>\n        }\n    <!-- Selection Type -->\n    @if (obj.type == 'selection') {\n        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n            <mat-select [value]=\"\" [formControl]=\"selectionCtrl\">\n                @for (option of obj.options; track option) {\n                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                }\n            </mat-select>\n        </mat-form-field>\n    }\n    <!-- Boolean Type -->\n    @if (obj.type == 'boolean') {\n        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [formControl]=\"booleanCtrl\"></mat-checkbox>\n    }\n}","import { Directive, OnInit, Renderer2, Input, ElementRef, OnChanges, OnDestroy, inject } from \"@angular/core\";\n\n@Directive({\n    selector: \"[columnsResizable]\",\n    standalone: true\n})\nexport class ResizeColumnDirective implements OnInit, OnChanges, OnDestroy {\n    private readonly renderer = inject(Renderer2);\n    private readonly elementRef = inject(ElementRef<HTMLElement>);\n    \n    private columnsResizable$: boolean = false;\n    \n    @Input() set columnsResizable(val: boolean) {\n        this.columnsResizable$ = val;\n    }\n    \n    get columnsResizable(): boolean {\n        return this.columnsResizable$;\n    }\n    \n    @Input() index!: number;\n    \n    private startX: number = 0;\n    private startWidth: number = 0;\n    private readonly column: HTMLElement;\n    private table: HTMLElement | null = null;\n    private pressed: boolean = false;\n    private resizerElement: HTMLElement | null = null;\n\n    constructor() {\n        this.column = this.elementRef.nativeElement;\n    }\n\n    ngOnInit(): void {\n        this.setupResizing();\n    }\n    ngOnChanges(): void {\n        this.setupResizing();\n    }\n    \n    ngOnDestroy(): void {\n        this.cleanup();\n    }\n    \n    private setupResizing(): void {\n        if (this.columnsResizable$) {\n            this.initializeResizer();\n        } else {\n            this.removeDragElementFromDom();\n        }\n    }\n    \n    private initializeResizer(): void {\n        const row = this.renderer.parentNode(this.column) as HTMLElement;\n        const thead = this.renderer.parentNode(row) as HTMLElement;\n        this.table = this.renderer.parentNode(thead) as HTMLElement;\n\n        this.resizerElement = this.renderer.createElement(\"span\");\n        this.renderer.addClass(this.resizerElement, \"resize-holder\");\n        this.renderer.setAttribute(this.resizerElement, 'id', `resizeHolderSpan-${this.index}`);\n        this.renderer.appendChild(this.column, this.resizerElement);\n        \n        this.renderer.listen(this.resizerElement, \"mousedown\", this.onMouseDown);\n        this.renderer.listen(this.table, \"mousemove\", this.onMouseMove);\n        this.renderer.listen(\"document\", \"mouseup\", this.onMouseUp);\n    }\n    \n    private cleanup(): void {\n        this.removeDragElementFromDom();\n    }\n    \n    private readonly onMouseDown = (event: MouseEvent): void => {\n        this.pressed = true;\n        this.startX = event.pageX;\n        this.startWidth = this.column.offsetWidth;\n    };\n\n    private readonly onMouseMove = (event: MouseEvent): void => {\n        const offset = 5;\n        if (this.pressed && event.buttons && this.table) {\n            this.renderer.addClass(this.table, \"resizing\");\n            \n            // Calculate width of column\n            const width = this.startWidth + (event.pageX - this.startX - offset);\n            \n            // Get table cells for this column index\n            const tableRows = this.table.querySelectorAll(\".mat-mdc-row\");\n            const tableCells = Array.from(tableRows).map(\n                (row: Element) => row.querySelectorAll(\".mat-mdc-cell\").item(this.index)\n            );\n            \n            // Set table header width\n            this.renderer.setStyle(this.column, \"width\", `${width}px`);\n            \n            // Set table cells width\n            tableCells.forEach((cell: Element | null) => {\n                if (cell instanceof HTMLElement) {\n                    this.renderer.setStyle(cell, \"width\", `${width}px`);\n                }\n            });\n        }\n    };\n\n    private readonly onMouseUp = (event: MouseEvent): void => {\n        if (this.pressed && this.table) {\n            this.pressed = false;\n            this.renderer.removeClass(this.table, \"resizing\");\n        }\n    };\n    \n    /**\n     * @description This method is used to remove resizing handlers from the table headers when column resizing is disabled.\n     */\n    private removeDragElementFromDom(): void {\n        if (this.resizerElement) {\n            this.renderer.removeChild(this.column, this.resizerElement);\n            this.resizerElement = null;\n        }\n        \n        // Also remove any existing resizer elements with the old ID pattern\n        const existingElement = document.getElementById(`resizeHolderSpan-${this.index}`);\n        if (existingElement) {\n            this.renderer.removeChild(this.column, existingElement);\n        }\n    }\n}\n","import {\n  animate,\n  state,\n  style,\n  transition,\n  trigger,\n} from '@angular/animations';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport {\n  AfterViewInit,\n  ChangeDetectorRef,\n  ElementRef,\n  EventEmitter,\n  Output,\n} from '@angular/core';\nimport {\n  Component,\n  Input,\n  OnChanges,\n  OnInit,\n  OnDestroy,\n  SimpleChanges,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatDialog, MatDialogConfig } from '@angular/material/dialog';\nimport { MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTable, MatTableDataSource } from '@angular/material/table';\nimport { EditingComponent } from '../lib/components/editing/editing.component';\nimport {\n  RowChange,\n  DisplayColumn,\n  MTExColumn,\n  MTExColumnPinOption,\n  RowSelectionChange,\n  CellTemplateRefMap,\n  ExpansionChange,\n  FilterSearchValue,\n  MTExRow,\n  ColumnVisibility,\n  MTExColumnGroup,\n  RowPinning,\n} from '../lib/models/tableExtModels';\nimport { MatTableExtService } from '../lib/mat-table-ext.service';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport * as XLSX from 'xlsx';\nimport { CommonModule } from '@angular/common';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { ColumnPinningComponent } from './components/column-pinning/column-pinning.component';\nimport { FilterColumnsComponentComponent } from './components/filter-columns-component/filter-columns-component.component';\nimport { ResizeColumnDirective } from './directives/resize-column.directive';\n@Component({\n  selector: 'mat-table-ext',\n  templateUrl: 'mat-table-ext.component.html',\n  styleUrls: ['mat-table-ext.scss'],\n  encapsulation: ViewEncapsulation.None,\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatTableModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatIconModule,\n    MatPaginatorModule,\n    MatSortModule,\n    MatMenuModule,\n    MatButtonModule,\n    MatTooltipModule,\n    MatToolbarModule,\n    MatProgressBarModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    DragDropModule,\n    ColumnPinningComponent,\n    FilterColumnsComponentComponent,\n    ResizeColumnDirective\n  ],\n  animations: [\n    trigger('detailExpand', [\n      state('collapsed', style({ height: '0px', minHeight: '0' })),\n      state('expanded', style({ height: '*' })),\n      transition(\n        'expanded <=> collapsed',\n        animate('300ms cubic-bezier(0.4, 0.0, 0.2, 1)')\n      ),\n    ]),\n  ],\n})\nexport class MatTableExtComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n  @ViewChild(MatMenuTrigger) menuTrigger!: MatMenuTrigger;\n  @ViewChild('columnMenuTrigger') columnMenuTrigger!: MatMenuTrigger;\n  @ViewChild(MatPaginator) paginator!: MatPaginator;\n  @ViewChild(MatSort) sort!: MatSort;\n  @ViewChild('matTable', { read: ElementRef }) matTableRef!: ElementRef;\n  @ViewChild('MyTable') table!: MatTable<any>;\n  @ViewChild('MyTable', { read: ElementRef }) tableElement!: ElementRef;\n\n  // Table inputs\n  @Input() dataSource!: MatTableDataSource<any>;\n  @Input() columns: MTExColumn[] = [];\n  @Input() columnResizable: boolean = false;\n  @Input() stripedRows: boolean = false;\n  @Input() rowHover: boolean = false;\n  @Input() inlineRowEditing: boolean = false;\n  @Input() inCellEditing: boolean = false;\n  @Input() cellPopupEditing: boolean = false;\n  @Input() popupRowEditing: boolean = false;\n  @Input() enableDelete: boolean = false;\n  @Input() rowSelection: boolean = false;\n  @Input() multiRowSelection: boolean = false;\n  @Input() stickyFooter: boolean = false;\n  @Input() stickyHeader: boolean = false;\n  @Input() showFooterRow: boolean = false;\n  @Input() columnFilter: boolean = false;\n  @Input() loadingIndicator: boolean = false;\n  @Input() sorting: boolean = false;\n  @Input() showToolbar: boolean = false;\n  @Input() toolbarTitle: string = '';\n  @Input() tableHeight: string = '';\n  @Input() toolbarHeight: string = '50px';\n  @Input() tableWidth: string = '100%';\n  @Input() scrollbarH: boolean = false;\n  @Input() toolbarTemplate: TemplateRef<any> | undefined;\n  @Input() columnHidable: boolean = false;\n  @Input() columnPinnable: boolean = false;\n  @Input() globalSearch: boolean = false;\n  @Input() expandRows: boolean = false;\n  @Input() dndColumns: boolean = false;\n  @Input() showPaginator: boolean = true;\n  @Input() showFirstLastButtons: boolean = false;\n  @Input() exportButtonEnable: boolean = false;\n  @Input() printButtonEnable: boolean = false;\n  @Input() pageSizeOptions: number[] = [10, 50, 100];\n  @Input() toolbarTemplateRef!: TemplateRef<any> | undefined;\n  @Input() headerTemplateRef!: TemplateRef<any> | null;\n  @Input() cellTemplateRef!: TemplateRef<any> | undefined;\n  @Input() expansionTemplateRef!: TemplateRef<any> | undefined;\n  @Input() popupEditingTemplateRef!: TemplateRef<any> | undefined;\n  @Input() inlineEditingTemplateRef!: TemplateRef<any> | undefined;\n  @Input() cellEditingTemplateRef!: TemplateRef<any> | undefined;\n  @Input() cellPopupEditingTemplateRef!: TemplateRef<any> | undefined;\n  @Input() cellTemplateRefMap: CellTemplateRefMap = {};\n  @Input() tableClassName: string = '';\n  @Input() columnGroups: MTExColumnGroup[] = [];\n  @Input() hiddenRowIndices: number[] = [];\n  @Input() enableRowHiding: boolean = false;\n  @Input() enableRowPinning: boolean = false;\n  @Input() topPinnedMaxHeight: string = ''; // Max height for top pinned table (e.g., '200px', '20vh')\n  @Input() bottomPinnedMaxHeight: string = ''; // Max height for bottom pinned table (e.g., '200px', '20vh')\n  @Input() rowPinningFn?: (row: any, index: number) => 'top' | 'bottom' | null;\n  @Input() rowHidingFilterFn?: (row: any, index: number) => boolean;\n  @Input() pdfOrientation: 'portrait' | 'landscape' = 'portrait';\n\n  // Table outputs\n  @Output() inlineChange: EventEmitter<any> = new EventEmitter<RowChange>();\n  @Output() cellChange: EventEmitter<any> = new EventEmitter<RowChange>();\n  @Output() popupChange: EventEmitter<any> = new EventEmitter<RowChange>();\n  @Output() rowDeleted: EventEmitter<any> = new EventEmitter<any>();\n  @Output() scroll: EventEmitter<any> = new EventEmitter<any>();\n  @Output() selectionChanged: EventEmitter<RowSelectionChange> =\n    new EventEmitter<any>();\n  @Output() expansionChange: EventEmitter<ExpansionChange> =\n    new EventEmitter<any>();\n  @Output() rowPinningChange: EventEmitter<{row: any, position: 'top' | 'bottom' | null}> = \n    new EventEmitter<any>();\n  tableID = new Date().getTime();\n  columnPinningOptions: MTExColumnPinOption[] = [];\n  exportMenuCtrl: boolean = false;\n  columnPinMenuCtrl: boolean = false;\n  hideShowMenuCtrl: boolean = false;\n  rowDataTemp: Record<string, MTExRow> = {};\n  inlineEditingTemplateRefData: any = {};\n  displayedColumns: string[] = [];\n  showHideColumnsArray: MTExColumn[] = [];\n  columnsList: string[] = [];\n  columnsArray: MTExColumn[] = [];\n  headersFiltersIds: string[] = [];\n  columnsToDisplayWithExpand: string[] = [];\n  selection = new SelectionModel<any>(false, []);\n  hiddenCtrl = new SelectionModel<any>(true, []);\n  tableData: MTExRow[] = [];\n  filterValues: Record<string, string | number | boolean> = {};\n  pinnedTopRows: any[] = [];\n  pinnedBottomRows: any[] = [];\n  rowPinMenuPosition = { x: '0px', y: '0px' };\n  rowPinMenuRow: any = null;\n  globalFilter = '';\n  showHideFilter = '';\n  individualFilter = '';\n  toggleFilters = false;\n  hideRows = false;\n  expandedElement: any | null;\n  currentRowIndex: number = -1;\n  currentRow: MTExRow = {};\n  cellEditing: Record<string, boolean> = {};\n  // Store original sizes before entering edit mode\n  private originalSizesBeforeEdit: {\n    columnWidths: number[];\n    rowHeight: number;\n  } | null = null;\n  hideShowMenuGroup: FormGroup = this.formBuilder.group({});\n  menuX: number = 0;\n  menuY: number = 0;\n  dynamicDisplayedColumns: any[] = [\n    { filter: false, name: 'select', show: false },\n    { filter: false, name: 'edit', show: false },\n    { filter: false, name: 'popup', show: false },\n    { filter: false, name: 'delete', show: false },\n    { filter: false, name: 'freeze', show: false },\n    { filter: false, name: 'hide', show: false },\n    { filter: false, name: 'pin', show: false },\n    { filter: false, name: 'expand', show: false },\n  ];\n  inputPropertyKeys: string[] = [\n    'dataSource',\n    'columns',\n    'inlineRowEditing',\n    'popupRowEditing',\n    'enableDelete',\n    'enableRowFreezing',\n    'enableRowHiding',\n    'enableRowPinning',\n    'rowSelection',\n    'multiRowSelection',\n    'stickyHeader',\n    'stickyFooter',\n    'columnFilter',\n    'globalSearch',\n    'expandRows',\n    'sorting',\n    'columnGroups',\n  ];\n  \n\n  constructor(\n    public dialog: MatDialog,\n    public service: MatTableExtService,\n    public formBuilder: FormBuilder,\n    public domSanitizer: DomSanitizer,\n    public matIconRegistry: MatIconRegistry,\n    private cdr: ChangeDetectorRef\n  ) {\n    this.addIconsToRegistry();\n    if (this.dataSource) {\n      this.tableData = this.dataSource.data;\n    }\n  }\n  /**\n   *\n   * @param changes changes captured each time user changes property value.\n   */\n\n  /**\n * Handle column pinning changes from ColumnPinningComponent\n * @param updatedColumns Updated columns array with new pinning states\n */\nupdateColumns(updatedColumns: MTExColumn[]) {\n  // Create a completely new columnsArray to trigger change detection\n  this.columnsArray = updatedColumns.map(col => ({ ...col }));\n  \n  // Update showHideColumnsArray to keep it in sync\n  this.showHideColumnsArray = [...this.columnsArray];\n\n  // Re-apply column configurations\n  this.setColumnsList(this.columnsArray);\n  \n  // Force complete table re-render by recreating the data source\n  if (this.dataSource) {\n    const currentData = [...this.dataSource.data];\n    this.dataSource = new MatTableDataSource(currentData);\n    this.pinnedTopDataSource = new MatTableDataSource(this.pinnedTopRows);\n    this.pinnedBtmDataSource = new MatTableDataSource(this.pinnedBottomRows);\n    this.reCal(); // Re-apply paginator, sort, and filter\n  }\n  \n  if (this.columnFilter) {\n      this.setColumnFilter(true);\n  }\n  \n  // Force change detection\n  this.cdr.markForCheck();\n  this.cdr.detectChanges();\n  // Re-sync column sizes in case column ordering/visibility changed\n  if (this.enableRowPinning) {\n    setTimeout(() => this.syncColumnSizesFromTop(), 80);\n  }\n}\n  ngOnChanges(changes: SimpleChanges) {\n    this.setPropertyValue(changes);\n  }\n\n  ngOnInit() {\n    if (this.dataSource) {\n      this.dataSource.filterPredicate = this.createFilter();\n    }\n    \n    \n    // Initialize FormGroup if not already initialized\n    if (!this.hideShowMenuGroup || Object.keys(this.hideShowMenuGroup.controls).length === 0) {\n      this.hideShowMenuGroup = this.formBuilder.group({});\n    }\n    \n    // Initialize pinned rows if function provided\n    if (this.enableRowPinning) {\n      this.initializePinnedRows();\n    }\n  }\n\n  ngAfterViewInit() {\n    if (this.dataSource) {\n      this.dataSource.paginator = this.paginator;\n      this.dataSource.sort = this.sort;\n      if (this.enableRowPinning) {\n        this.pinnedTopDataSource.sort = this.sort;\n        this.pinnedBtmDataSource.sort = this.sort;\n      }\n    }\n    \n    // Calculate and set pinned row offsets\n    this.updatePinnedRowOffsets();\n    // Sync column sizes from top table to middle/bottom when pinning enabled\n    if (this.enableRowPinning) {\n      setTimeout(() => this.syncColumnSizesFromTop(), 150);\n      window.addEventListener('resize', this.onWindowResizeBound);\n    }\n  }\n\n  /**\n   * @description Calculate offsets for pinned rows based on sticky headers/footers\n   */\n  private updatePinnedRowOffsets(): void {\n    if (!this.tableElement?.nativeElement || !this.enableRowPinning) return;\n\n    setTimeout(() => {\n      const table = this.tableElement.nativeElement as HTMLElement;\n      \n      // Calculate top offset (sticky header + group header + filter row)\n      let topOffset = 0;\n      \n      if (this.stickyHeader) {\n        // Get all header rows that are sticky\n        const headerRows = table.querySelectorAll('.mat-mdc-header-row');\n        headerRows.forEach((header: Element) => {\n          topOffset += (header as HTMLElement).offsetHeight;\n        });\n      }\n      \n      // Calculate bottom offset (sticky footer + paginator)\n      let bottomOffset = 0;\n      \n      if (this.stickyFooter) {\n        const footerRow = table.querySelector('.mat-mdc-footer-row');\n        if (footerRow) {\n          bottomOffset += (footerRow as HTMLElement).offsetHeight;\n        }\n      }\n      \n      // Set base offsets\n      table.style.setProperty('--pinned-top-base-offset', `${topOffset}px`);\n      table.style.setProperty('--pinned-bottom-base-offset', `${bottomOffset}px`);\n      \n      // Calculate and set individual row offsets for stacked pinned rows\n      this.updateStackedPinnedRowOffsets(table, topOffset, bottomOffset);\n      // After offsets are updated, ensure column sizes are re-synced\n      if (this.enableRowPinning) {\n        setTimeout(() => this.syncColumnSizesFromTop(), 10);\n      }\n      \n      console.log('Pinned row offsets:', { topOffset, bottomOffset });\n    }, 100);\n  }\n\n  /**\n   * @description Update offsets for each individual pinned row to stack them\n   */\n  private updateStackedPinnedRowOffsets(table: HTMLElement, baseTopOffset: number, baseBottomOffset: number): void {\n    // Use setTimeout to ensure DOM is fully rendered with pinned classes\n    setTimeout(() => {\n      // Handle top pinned rows - stack them from top to bottom\n      const topPinnedRows = table.querySelectorAll('.pinned-top-row');\n      let currentTopOffset = baseTopOffset;\n      \n      topPinnedRows.forEach((row: Element, index: number) => {\n        const htmlRow = row as HTMLElement;\n        htmlRow.style.setProperty('--pinned-row-top-offset', `${currentTopOffset}px`);\n        htmlRow.style.top = `${currentTopOffset}px`;\n        \n        // Add current row height to offset for next row\n        if (index < topPinnedRows.length - 1) {\n          currentTopOffset += htmlRow.offsetHeight;\n        }\n      });\n      \n      // Handle bottom pinned rows - stack them from bottom to top\n      const bottomPinnedRows = table.querySelectorAll('.pinned-bottom-row');\n      let currentBottomOffset = baseBottomOffset;\n      \n      // Process bottom rows in reverse order (from bottom to top)\n      for (let i = bottomPinnedRows.length - 1; i >= 0; i--) {\n        const htmlRow = bottomPinnedRows[i] as HTMLElement;\n        htmlRow.style.setProperty('--pinned-row-bottom-offset', `${currentBottomOffset}px`);\n        htmlRow.style.bottom = `${currentBottomOffset}px`;\n        \n        // Add current row height to offset for next row (going upward)\n        if (i > 0) {\n          currentBottomOffset += htmlRow.offsetHeight;\n        }\n      }\n      // After stacking offsets are applied, re-sync column sizes to handle any layout changes\n      if (this.enableRowPinning) {\n        setTimeout(() => this.syncColumnSizesFromTop(), 60);\n      }\n    }, 50);\n  }\n\n  private onWindowResizeBound = () => {\n    this.updatePinnedRowOffsets();\n    this.syncColumnSizesFromTop();\n  };\n\n  /**\n   * Copy header cell widths/heights from the top table and apply them to middle and bottom tables.\n   * This ensures columns line up when the middle/bottom tables don't render headers.\n   */\n  private syncColumnSizesFromTop(): void {\n    if (!this.enableRowPinning) return;\n\n    try {\n      const topId = `matTableExtTop${this.tableID}`;\n      const bottomId = `matTableExtBtm${this.tableID}`;\n      const topTable = document.getElementById(topId) as HTMLElement | null;\n      const middleTable = document.getElementById(`matTableExt${this.tableID}`) as HTMLElement | null;\n      const bottomTable = document.getElementById(bottomId) as HTMLElement | null;\n\n      if (!topTable) return;\n\n      const headerRow = topTable.querySelector(\n        'tr.mat-mdc-header-row:not(.group-header-row), tr.mat-header-row:not(.group-header-row), thead tr:not(.group-header-row)'\n      ) as HTMLElement | null;\n\n      if (!headerRow) return;\n\n      const headerCells = Array.from(headerRow.querySelectorAll('th, .mat-header-cell')) as HTMLElement[];\n      if (!headerCells.length) return;\n\n      const topTableWidth = topTable.getBoundingClientRect().width;\n      [middleTable, bottomTable].forEach(tbl => {\n        if (!tbl) return;\n        tbl.style.width = topTable.style.width && topTable.style.width !== '' ? topTable.style.width : `${topTableWidth}px`;\n      });\n\n      // Use the header row height as the canonical row height to apply\n      const headerRowHeight = Math.round(headerRow.getBoundingClientRect().height);\n\n      headerCells.forEach((hc, index) => {\n        const rect = hc.getBoundingClientRect();\n        const w = Math.round(rect.width);\n\n        [middleTable, bottomTable].forEach(tbl => {\n          if (!tbl) return;\n\n          // If a placeholder header exists in the target table, set its cell sizes\n          const placeholderHeader = tbl.querySelector('tr.mat-mdc-header-row, tr.mat-header-row') as HTMLElement | null;\n          if (placeholderHeader) {\n            const phCells = placeholderHeader.querySelectorAll('th, .mat-header-cell');\n            if (phCells && phCells[index]) {\n              const el = phCells[index] as HTMLElement;\n              el.style.minWidth = `${w}px`;\n              el.style.maxWidth = `${w}px`;\n              el.style.boxSizing = 'border-box';\n              el.style.height = `${headerRowHeight}px`;\n              el.style.minHeight = `${headerRowHeight}px`;\n              el.style.maxHeight = `${headerRowHeight}px`;\n            }\n          }\n\n          // Apply widths/heights directly to data cells (in case header placeholder is not present)\n          const dataRow = tbl.querySelector('tr.mat-mdc-row, tr.mat-row') as HTMLElement | null;\n          if (dataRow) {\n            const dataCells = dataRow.querySelectorAll('td, .mat-cell');\n            if (dataCells && dataCells[index]) {\n              const cel = dataCells[index] as HTMLElement;\n              cel.style.minWidth = `${w}px`;\n              cel.style.maxWidth = `${w}px`;\n              cel.style.boxSizing = 'border-box';\n              cel.style.height = `${headerRowHeight}px`;\n              cel.style.minHeight = `${headerRowHeight}px`;\n              cel.style.maxHeight = `${headerRowHeight}px`;\n            }\n\n            // Set every data row's height to match the header row height for visual alignment\n            const rows = tbl.querySelectorAll('tr.mat-mdc-row, tr.mat-row');\n            rows.forEach((r: Element) => {\n              const reh = r as HTMLElement;\n              reh.style.height = `${headerRowHeight}px`;\n              reh.style.minHeight = `${headerRowHeight}px`;\n              reh.style.maxHeight = `${headerRowHeight}px`;\n            });\n          }\n        });\n      });\n    } catch (err) {\n      console.warn('syncColumnSizesFromTop failed', err);\n    }\n  }\n\n  /**\n   * Sync column sizes from the currently edited row in the middle table to top/bottom tables.\n   * This ensures proper alignment when a row is in edit mode with different height.\n   */\n  private syncColumnSizesFromEditedRow(editedRowIndex: number): void {\n    if (!this.enableRowPinning) return;\n\n    try {\n      const topTable = document.getElementById(`matTableExtTop${this.tableID}`) as HTMLElement | null;\n      if (!topTable) return;\n\n      // Capture original sizes from the top table header before modifying\n      if (!this.originalSizesBeforeEdit) {\n        const headerRow = topTable.querySelector(\n          'tr.mat-mdc-header-row:not(.group-header-row), tr.mat-header-row:not(.group-header-row)'\n        ) as HTMLElement | null;\n\n        if (headerRow) {\n          const headerCells = Array.from(headerRow.querySelectorAll('th, .mat-header-cell')) as HTMLElement[];\n          const headerRowHeight = Math.round(headerRow.getBoundingClientRect().height);\n          const columnWidths = headerCells.map(cell => Math.round(cell.getBoundingClientRect().width));\n          \n          this.originalSizesBeforeEdit = {\n            columnWidths,\n            rowHeight: headerRowHeight\n          };\n        }\n      }\n\n      const middleTable = document.getElementById(`matTableExt${this.tableID}`) as HTMLElement | null;\n      const bottomTable = document.getElementById(`matTableExtBtm${this.tableID}`) as HTMLElement | null;\n\n      if (!middleTable || !topTable) return;\n\n      // Find the edited row in the middle table\n      const editedRow = middleTable.querySelector(`tr.mat-mdc-row:nth-child(${editedRowIndex + 1})`) as HTMLElement | null;\n      if (!editedRow) {\n        // Fallback to normal sync if edited row not found\n        this.syncColumnSizesFromTop();\n        return;\n      }\n\n      const editedCells = Array.from(editedRow.querySelectorAll('td, .mat-cell')) as HTMLElement[];\n      if (!editedCells.length) return;\n\n      // Get the height of the edited row\n      const editedRowHeight = Math.round(editedRow.getBoundingClientRect().height);\n\n      // Sync widths and heights from edited row to top and bottom tables\n      // First, collect all widths in a single pass (layout read)\n      const cellWidths = editedCells.map(cell => Math.round(cell.getBoundingClientRect().width));\n\n      // Then, apply style changes in a separate pass (layout write)\n      cellWidths.forEach((w, index) => {\n        [topTable, bottomTable].forEach(tbl => {\n          if (!tbl) return;\n\n          // Update header cells in top table\n          if (tbl === topTable) {\n            const headerRow = tbl.querySelector('tr.mat-mdc-header-row:not(.group-header-row), tr.mat-header-row:not(.group-header-row)') as HTMLElement | null;\n            if (headerRow) {\n              const headerCells = headerRow.querySelectorAll('th, .mat-header-cell');\n              if (headerCells && headerCells[index]) {\n                const hc = headerCells[index] as HTMLElement;\n                hc.style.minWidth = `${w}px`;\n                hc.style.maxWidth = `${w}px`;\n                hc.style.boxSizing = 'border-box';\n              }\n            }\n          }\n\n          // Update data cells in both tables\n          const dataRow = tbl.querySelector('tr.mat-mdc-row, tr.mat-row') as HTMLElement | null;\n          if (dataRow) {\n            const dataCells = dataRow.querySelectorAll('td, .mat-cell');\n            if (dataCells && dataCells[index]) {\n              const dc = dataCells[index] as HTMLElement;\n              dc.style.minWidth = `${w}px`;\n              dc.style.maxWidth = `${w}px`;\n              dc.style.boxSizing = 'border-box';\n            }\n\n            // Set all data rows' height to match the edited row height\n            // const rows = tbl.querySelectorAll('tr.mat-mdc-row, tr.mat-row');\n            // rows.forEach((r: Element) => {\n            //   const reh = r as HTMLElement;\n            //   reh.style.height = `${editedRowHeight}px`;\n            //   reh.style.minHeight = `${editedRowHeight}px`;\n            //   reh.style.maxHeight = `${editedRowHeight}px`;\n            // });\n          }\n        });\n      });\n    } catch (err) {\n      console.warn('syncColumnSizesFromEditedRow failed', err);\n    }\n  }\n\n  /**\n   * Restore original column widths and row heights from before edit mode.\n   */\n  private restoreOriginalSizes(): void {\n    if (!this.enableRowPinning || !this.originalSizesBeforeEdit) return;\n\n    try {\n      const topTable = document.getElementById(`matTableExtTop${this.tableID}`) as HTMLElement | null;\n      const middleTable = document.getElementById(`matTableExt${this.tableID}`) as HTMLElement | null;\n      const bottomTable = document.getElementById(`matTableExtBtm${this.tableID}`) as HTMLElement | null;\n\n      if (!topTable) return;\n\n      const { columnWidths, rowHeight } = this.originalSizesBeforeEdit;\n\n      [topTable, middleTable, bottomTable].forEach(tbl => {\n        if (!tbl) return;\n\n        // Restore header cells in top table\n        if (tbl === topTable) {\n          const headerRow = tbl.querySelector(\n            'tr.mat-mdc-header-row:not(.group-header-row), tr.mat-header-row:not(.group-header-row)'\n          ) as HTMLElement | null;\n          if (headerRow) {\n            const headerCells = Array.from(headerRow.querySelectorAll('th, .mat-header-cell')) as HTMLElement[];\n            headerCells.forEach((cell, index) => {\n              if (columnWidths[index] !== undefined) {\n                const w = columnWidths[index];\n                cell.style.minWidth = `${w}px`;\n                cell.style.maxWidth = `${w}px`;\n                cell.style.boxSizing = 'border-box';\n                cell.style.height = `${rowHeight}px`;\n                cell.style.minHeight = `${rowHeight}px`;\n                cell.style.maxHeight = `${rowHeight}px`;\n              }\n            });\n          }\n        }\n\n        // Restore data cells\n        const dataRow = tbl.querySelector('tr.mat-mdc-row, tr.mat-row') as HTMLElement | null;\n        if (dataRow) {\n          const dataCells = Array.from(dataRow.querySelectorAll('td, .mat-cell')) as HTMLElement[];\n          dataCells.forEach((cell, index) => {\n            if (columnWidths[index] !== undefined) {\n              const w = columnWidths[index];\n              cell.style.minWidth = `${w}px`;\n              cell.style.maxWidth = `${w}px`;\n              cell.style.boxSizing = 'border-box';\n              cell.style.height = `${rowHeight}px`;\n              cell.style.minHeight = `${rowHeight}px`;\n              cell.style.maxHeight = `${rowHeight}px`;\n            }\n          });\n\n          // Restore all data rows' height\n          const rows = tbl.querySelectorAll('tr.mat-mdc-row, tr.mat-row');\n          rows.forEach((r: Element) => {\n            const reh = r as HTMLElement;\n            reh.style.height = `${rowHeight}px`;\n            reh.style.minHeight = `${rowHeight}px`;\n            reh.style.maxHeight = `${rowHeight}px`;\n          });\n        }\n      });\n\n      // Clear the stored sizes\n      this.originalSizesBeforeEdit = null;\n    } catch (err) {\n      console.warn('restoreOriginalSizes failed', err);\n    }\n  }\n\n  ngOnDestroy(): void {\n    window.removeEventListener('resize', this.onWindowResizeBound);\n  }\n  /**\n   * @description checks and updates the the column's hide and show properties.\n   */\n  setColumnHideShow() {\n    if (\n      this.hideShowMenuGroup !== undefined &&\n      this.hideShowMenuGroup !== null\n    ) {\n      this.updateColumnsHideShow(this.hideShowMenuGroup.value);\n    }\n  }\n  /**\n   * @description set the properties of the table.\n   * @param changes changes captured each time user changes property value.\n   */\n  setPropertyValue(changes: SimpleChanges) {\n    let keys = Object.keys(changes);\n    keys.forEach((property) => {\n      if (this.inputPropertyKeys.includes(property)) {\n        this.setPropertiesMap[property](changes[property]);\n        setTimeout(() => this.syncColumnSizesFromTop(), 80);\n      } else if (property == 'showToolbar') {\n        if (changes['columns']) {\n          this.setToolbarMenuControls(changes['columns'].currentValue);\n        } else {\n          this.setToolbarMenuControls(this.columnsArray);\n        }\n      }\n    });\n  }\n  /**\n   * @description This mapping is used to set and update changesin the table.\n   */\n  setPropertiesMap: any = {\n    dataSource: (value: any) => this.setTableDataSource(value),\n    columns: (value: any) => this.setColumnsData(value.currentValue),\n    inlineRowEditing: (value: any) =>\n      this.showHideColumn('edit', value.currentValue),\n    popupRowEditing: (value: any) =>\n      this.showHideColumn('popup', value.currentValue),\n    enableDelete: (value: any) =>\n      this.showHideColumn('delete', value.currentValue),\n    enableRowFreezing: (value: any) =>\n      this.showHideColumn('freeze', value.currentValue),\n    enableRowHiding: (value: any) =>\n      this.showHideColumn('hide', value.currentValue),\n    enableRowPinning: (value: any) => {\n      this.showHideColumn('pin', value.currentValue);\n      if (value.currentValue) {\n        this.initializePinnedRows();\n      }\n    },\n    rowSelection: (value: any) => this.setRowSelection(value.currentValue),\n    multiRowSelection: (value: any) => {\n      this.selection = new SelectionModel<any>(value.currentValue, []);\n    },\n    stickyHeader: (value: any) => {\n      this.stickyHeader = value.currentValue;\n      // Recalculate pinned row offsets when sticky header changes\n      setTimeout(() => this.updatePinnedRowOffsets(), 100);\n    },\n    stickyFooter: (value: any) => {\n      this.stickyFooter = value.currentValue;\n      // Recalculate pinned row offsets when sticky footer changes\n      setTimeout(() => this.updatePinnedRowOffsets(), 100);\n    },\n    columnFilter: (value: any) => this.setColumnFilter(value.currentValue),\n    globalSearch: (value: any) =>\n      (this.dataSource.filterPredicate = this.createFilter()),\n    expandRows: (value: any) => {\n      this.loadingIndicator = true;\n      this.dataSource = new MatTableDataSource(this.tableData);\n      if (value.currentValue == true) {\n        if (!this.displayedColumns.includes('expand')) {\n          this.displayedColumns.push('expand');\n          this.columnsToDisplayWithExpand = [...this.displayedColumns];\n        }\n      } else {\n        this.columnsToDisplayWithExpand = [...this.displayedColumns];\n        if (this.displayedColumns.includes('expand')) {\n          let index = this.displayedColumns.indexOf('expand');\n          this.displayedColumns.splice(index, 1);\n        }\n        this.expandedElement = null;\n      }\n      setTimeout(() => {\n        this.loadingIndicator = false;\n      }, 200);\n    },\n    sorting: (value: any) => {\n      this.dataSource.sort = this.sort;\n      if (this.enableRowPinning) {\n        this.pinnedTopDataSource.sort = this.sort;\n        this.pinnedBtmDataSource.sort = this.sort;\n      }\n    },\n    columnGroups: (value: any) => {\n      this.columnGroups = value.currentValue || [];\n      this.cdr.detectChanges();\n      // When group headers change, re-sync column sizes for pinned tables\n      if (this.enableRowPinning) {\n        setTimeout(() => this.syncColumnSizesFromTop(), 80);\n      }\n    },\n  };\n  /**\n   * @description used set data source for table.\n   * @param value data source value from user.\n   */\n  setTableDataSource(value: any) {\n    if (value.currentValue) {\n      this.tableData = value.currentValue.data;\n      this.dataSource = value.currentValue;\n      this.reCal();\n    } else {\n      this.dataSource = new MatTableDataSource([{}]);\n    }\n  }\n  /**\n   * @description used create seletion model and set selection column visibility.\n   * @param value boolean value to show or hide selection Column from table.\n   */\n  setRowSelection(value: boolean) {\n    this.selection = new SelectionModel<any>(true, []);\n    this.updateSelectionColumnVisibility(value);\n  }\n\n  /**\n   * @description create filter header row and assigns filter predicate to table data source.\n   * @param value boolean value to change  visibility of column filter row.\n   */\n  setColumnFilter(value: boolean) {\n    if (value) {\n      let array: string[] = [];\n      this.columnsArray.forEach((column, i) => {\n        if (\n          this.dynamicDisplayedColumns.filter((a) => a.name == column?.field)[0]\n            .show\n        ) {\n          array.push(column?.field + '_' + i);\n        }\n      });\n      this.headersFiltersIds = array;\n      this.dataSource.filterPredicate = this.createFilter();\n    } else {\n      this.headersFiltersIds = [];\n      this.dataSource.filter = '';\n    }\n    this.toggleFilters = value;\n    setTimeout(() => this.syncColumnSizesFromTop(), 150);\n  }\n  /**\n   * @description This method returns the list of visible column names.\n   * @returns list of visible column names.\n   */\n  getDisplayedColumns(): string[] {\n    if (this.columnGroups.length === 0) {\n      // No groups, place select at start and other action columns at the end\n      const actionColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n      const visibleColumns = this.dynamicDisplayedColumns.filter((cd) => cd.show);\n      const dataColumns = visibleColumns.filter((cd) => !actionColumns.includes(cd.name)).map((cd) => cd.name);\n      const selectCol = visibleColumns.find((cd) => cd.name === 'select');\n      const otherActionCols = visibleColumns.filter((cd) => actionColumns.includes(cd.name) && cd.name !== 'select').map((cd) => cd.name);\n      \n      const result = [];\n      if (selectCol) result.push('select');\n      result.push(...dataColumns);\n      result.push(...otherActionCols);\n      return result;\n    }\n    \n    // When groups exist, reorder: select first, grouped columns, ungrouped columns, then other action columns\n    const actionColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n    const groupedFields = new Set<string>();\n    \n    // Collect all fields that belong to groups\n    this.columnGroups.forEach(group => {\n      group.columns.forEach(colField => groupedFields.add(colField));\n    });\n    \n    const result: string[] = [];\n    const visibleColumns = this.dynamicDisplayedColumns.filter((cd) => cd.show);\n    \n    // Add select column first if visible\n    const selectCol = visibleColumns.find(c => c.name === 'select');\n    if (selectCol) {\n      result.push('select');\n    }\n    \n    // Add grouped columns in the order they appear in groups\n    this.columnGroups.forEach(group => {\n      group.columns.forEach(colField => {\n        const col = visibleColumns.find(c => c.name === colField);\n        if (col && !result.includes(col.name)) {\n          result.push(col.name);\n        }\n      });\n    });\n    \n    // Add ungrouped data columns\n    visibleColumns.forEach(col => {\n      if (!actionColumns.includes(col.name) && !groupedFields.has(col.name) && !result.includes(col.name)) {\n        result.push(col.name);\n      }\n    });\n    \n    // Add other action columns at the end (excluding select which is already at start)\n    visibleColumns.forEach(col => {\n      if (actionColumns.includes(col.name) && col.name !== 'select' && !result.includes(col.name)) {\n        result.push(col.name);\n      }\n    });\n    \n    return result;\n  }\n  /**\n   * @description This method returns the grouped column header definitions.\n   * @returns list of grouped column definitions for header row.\n   */\n  getGroupedColumns(): string[] {\n    if (this.columnGroups.length === 0) return [];\n    \n    const grouped: string[] = [];\n    const groupedFields = new Set<string>();\n    const actionColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n    \n    // Collect all fields that belong to groups\n    this.columnGroups.forEach(group => {\n      group.columns.forEach(colField => groupedFields.add(colField));\n    });\n    \n    // Add group headers for groups with visible columns\n    this.columnGroups.forEach(group => {\n      const visibleColumnsInGroup = group.columns.filter(colField => {\n        const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === colField);\n        return displayCol && displayCol.show;\n      });\n      \n      if (visibleColumnsInGroup.length > 0) {\n        grouped.push('group-' + group.name);\n      }\n    });\n    \n    // Add empty header placeholders for ungrouped columns at the end\n    this.columnsArray.forEach(col => {\n      if (!groupedFields.has(col.field) && !actionColumns.includes(col.field)) {\n        const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === col.field);\n        if (displayCol && displayCol.show) {\n          grouped.push('ungrouped-' + col.field);\n        }\n      }\n    });\n\n    // Add placeholders for visible action columns so group header row has cells to align with action columns\n    const actionPlaceholders = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n    actionPlaceholders.forEach(act => {\n      const display = this.dynamicDisplayedColumns.find(dc => dc.name === act);\n      if (display && display.show) {\n        grouped.push('ungrouped-' + act);\n      }\n    });\n    \n    return grouped;\n  }\n\n  /**\n   * @description Returns filter column IDs including placeholders for action columns\n   * @returns Array of filter column IDs with action column placeholders\n   */\n  getFilterColumns(): string[] {\n    const filters: string[] = [];\n    const actionColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n    \n    // Get visible columns in display order\n    const displayedCols = this.getDisplayedColumns();\n    \n    displayedCols.forEach(colName => {\n      if (actionColumns.includes(colName)) {\n        // Add filter placeholder for action column\n        filters.push('filter-' + colName);\n      } else {\n        // Find the actual filter ID from headersFiltersIds\n        const filterCol = this.headersFiltersIds.find(id => id.startsWith(colName + '_'));\n        if (filterCol) {\n          filters.push(filterCol);\n        }\n      }\n    });\n    \n    return this.columnFilter ? filters : [];\n  }\n  /**\n   * @param menuType type of menu to open from toolbar.\n   * @param event mouse event to open menu on that location.\n   */\n  openMenu(menuType: string, event: MouseEvent) {\n    this.menuX = event.clientX;\n    this.menuY = event.clientY;\n    switch (menuType) {\n      case 'export': {\n        this.exportMenuCtrl = true;\n        this.menuTrigger.openMenu();\n        break;\n      }\n      case 'hideShow': {\n        this.hideShowMenuCtrl = true;\n        this.openHideShowMenu(this.columnsArray);\n        break;\n      }\n      case 'columnPin': {\n        this.columnPinMenuCtrl = true;\n        this.openHideShowMenu(this.columnsArray);\n        break;\n      }\n    }\n  }\n  /**\n   * @description triggers when menu is closed and reset the required controls.\n   */\n  menuClosed() {\n    this.exportMenuCtrl = false;\n  }\n  /**\n   * @description set list of columns to display in table.\n   * @param columns columns array from user input.\n   */\n  setColumnsData(columns: MTExColumn[]) {\n    if (columns.length) {\n      this.columnsArray = [...columns];\n      this.setColumnsList(columns);\n      this.setToolbarMenuControls(columns);\n    }\n  }\n  /**\n   * @description set list of columns to display in table.\n   * @param columns columns array from user input with configurations.\n   */\n  setColumnsList(columns: MTExColumn[]) {\n    this.columnsList = [];\n    this.displayedColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n    let columnsArray: DisplayColumn[] = [];\n    columns.forEach((col) => {\n      if (typeof col?.header == 'string') {\n        this.columnsList.push(col?.header);\n        this.displayedColumns.push(col?.field);\n        columnsArray.push({ filter: true, name: col?.field, show: !col.hide });\n      }\n    });\n    \n    // Preserve the current state of action columns before resetting\n    const currentActionColumns = this.dynamicDisplayedColumns.filter(dc => \n      ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'].includes(dc.name)\n    );\n    \n    // Create new action columns array, preserving existing states\n    const newActionColumns = [\n      { filter: false, name: 'select', show: false },\n      { filter: false, name: 'edit', show: false },\n      { filter: false, name: 'popup', show: false },\n      { filter: false, name: 'delete', show: false },\n      { filter: false, name: 'freeze', show: false },\n      { filter: false, name: 'hide', show: false },\n      { filter: false, name: 'pin', show: false },\n    ].map(actionCol => {\n      const existing = currentActionColumns.find(c => c.name === actionCol.name);\n      return existing ? { ...existing } : actionCol;\n    });\n    \n    this.dynamicDisplayedColumns = columnsArray.concat(newActionColumns);\n    // After updating columns, ensure sizes match the top header (if pinning enabled)\n    if (this.enableRowPinning) {\n      setTimeout(() => this.syncColumnSizesFromTop(), 80);\n    }\n  }\n  /**\n   * @description Take boolean value and name column and update its visibility status in table.\n   * @param name name of the column to set visibility.\n   * @param value boolean value to set visibility of the column.\n   */\n  showHideColumn(name: string, value: boolean) {\n    const column = this.dynamicDisplayedColumns.filter((a) => a.name == name)[0];\n    if (column) {\n      column.show = value;\n      if (this.enableRowPinning) {\n        this.syncColumnSizesFromTop();\n      }\n    }\n    if (this.columnFilter) {\n      this.setColumnFilter(true);\n    }\n  }\n\n\n\n  /**\n   * @description Toggle hide state for a specific row\n   * @param index The row index to hide/unhide\n   */\n  toggleRowHide(index: number): void {\n    const hiddenIndex = this.hiddenRowIndices.indexOf(index);\n    if (hiddenIndex > -1) {\n      // Unhide the row\n      this.hiddenRowIndices.splice(hiddenIndex, 1);\n    } else {\n      // Hide the row\n      this.hiddenRowIndices.push(index);\n    }\n    // Trigger change detection\n    this.hiddenRowIndices = [...this.hiddenRowIndices];\n  }\n\n  /**\n   * @description Check if a row index is in the hidden rows list or matches the filter function.\n   * @param index The row index to check\n   * @returns True if the row is hidden\n   */\n  isRowHidden(index: number): boolean {\n    // Check explicit hidden indices\n    if (this.hiddenRowIndices.includes(index)) {\n      return true;\n    }\n    \n    // Check filter function if provided\n    if (this.rowHidingFilterFn && this.dataSource?.data?.[index]) {\n      return this.rowHidingFilterFn(this.dataSource.data[index], index);\n    }\n    \n    return false;\n  }\n\n  /**\n   * @description Unhide all hidden rows\n   */\n  unhideAllRows(): void {\n    this.hiddenRowIndices = [];\n  }\n\n  /**\n   * @description Open row pin menu\n   * @param event Mouse event\n   * @param row The row to pin\n   */\n  openRowPinMenu(event: MouseEvent, row: any): void {\n    event.stopPropagation();\n    this.rowPinMenuPosition = {\n      x: event.clientX + 'px',\n      y: event.clientY + 'px'\n    };\n    this.rowPinMenuRow = row;\n  }\n\n  /**\n   * @description Close row pin menu\n   */\n  closeRowPinMenu(): void {\n    this.rowPinMenuRow = null;\n  }\n\n  pinnedTopDataSource!: MatTableDataSource<any>;\n  pinnedBtmDataSource!: MatTableDataSource<any>;\n\n  /**\n   * @description Pin row to top or bottom\n   * @param row The row to pin\n   * @param position 'top' or 'bottom'\n   */\n  pinRow(row: any, position: 'top' | 'bottom'): void {\n    console.log('pinRow called:', { row, position, enableRowPinning: this.enableRowPinning });\n    \n    // Remove from other position if exists\n    this.unpinRow(row);\n    \n    // Mark the row with pinning metadata\n    row._pinnedPosition = position;\n    \n    // Add to the selected position\n    if (position === 'top') {\n      if (!this.pinnedTopRows.includes(row)) {\n        this.pinnedTopRows.push(row);\n      }\n      this.pinnedTopDataSource = new MatTableDataSource(this.pinnedTopRows);\n    } else {\n      if (!this.pinnedBottomRows.includes(row)) {\n        this.pinnedBottomRows.push(row);\n      }\n      this.pinnedBtmDataSource = new MatTableDataSource(this.pinnedBottomRows);\n    }\n    \n    console.log('After pinning:', { \n      pinnedTopRows: this.pinnedTopRows, \n      pinnedBottomRows: this.pinnedBottomRows,\n      topLength: this.pinnedTopRows.length,\n      bottomLength: this.pinnedBottomRows.length\n    });\n    \n    this.rowPinningChange.emit({ row, position });\n    this.closeRowPinMenu();\n    this.updateDataSourceForPinning();\n  }\n\n  /**\n   * @description Unpin row from any position\n   * @param row The row to unpin\n   */\n  unpinRow(row: any): void {\n    const topIndex = this.pinnedTopRows.indexOf(row);\n    if (topIndex > -1) {\n      this.pinnedTopRows.splice(topIndex, 1);\n      this.pinnedTopDataSource = new MatTableDataSource(this.pinnedTopRows);\n    }\n    \n    const bottomIndex = this.pinnedBottomRows.indexOf(row);\n    if (bottomIndex > -1) {\n      this.pinnedBottomRows.splice(bottomIndex, 1);\n      this.pinnedBtmDataSource = new MatTableDataSource(this.pinnedBottomRows);\n    }\n    \n    // Clear pinning metadata\n    delete row._pinnedPosition;\n    \n    // Update the data source to trigger re-render\n    this.updateDataSourceForPinning();\n    \n    this.rowPinningChange.emit({ row, position: null });\n    this.closeRowPinMenu();\n  }\n\n  /**\n   * @description Check if a row is pinned\n   * @param row The row to check\n   * @returns true if pinned\n   */\n  isRowPinned(row: any): boolean {\n    return this.pinnedTopRows.includes(row) || this.pinnedBottomRows.includes(row);\n  }\n\n  /**\n   * @description Get row pin position\n   * @param row The row to check\n   * @returns 'top', 'bottom', or null\n   */\n  getRowPinPosition(row: any): 'top' | 'bottom' | null {\n    if (this.pinnedTopRows.includes(row)) return 'top';\n    if (this.pinnedBottomRows.includes(row)) return 'bottom';\n    return null;\n  }\n\n  /**\n   * @description Get rows for main data section (excluding pinned rows)\n   * @returns Array of non-pinned rows\n   */\n  getUnpinnedRows(): any[] {\n    if (!this.dataSource?.data) return [];\n    return this.dataSource.data.filter(row => \n      !this.pinnedTopRows.includes(row) && !this.pinnedBottomRows.includes(row)\n    );\n  }\n\n  /**\n   * @description Get combined data source with pinned rows\n   */\n  getCombinedDataSource(): any[] {\n    if (!this.enableRowPinning || !this.dataSource?.data) {\n      return this.dataSource?.data || [];\n    }\n    \n    // Combine: pinnedTop + regular + pinnedBottom\n    return [\n      ...this.pinnedTopRows,\n      ...this.dataSource.data.filter(row => !this.isRowPinned(row)),\n      ...this.pinnedBottomRows\n    ];\n  }\n\n  /**\n   * @description Check if row is pinned to top (for CSS class binding)\n   */\n  isRowPinnedTop=(row: any): boolean=> {\n    return this.pinnedTopRows.includes(row);\n  }\n\n  /**\n   * @description Check if row is pinned to bottom (for CSS class binding)\n   */\n  isRowPinnedBottom = (row: any): boolean => {\n    return this.pinnedBottomRows.includes(row);\n  }\n\n  /**\n   * @description Initialize pinned rows based on function\n   */\n  initializePinnedRows(): void {\n    if (!this.rowPinningFn || !this.dataSource?.data) return;\n    \n    this.pinnedTopRows = [];\n    this.pinnedBottomRows = [];\n    \n    this.dataSource.data.forEach((row, index) => {\n      const position = this.rowPinningFn!(row, index);\n      if (position === 'top') {\n        row._pinnedPosition = 'top';\n        this.pinnedTopRows.push(row);\n      } else if (position === 'bottom') {\n        row._pinnedPosition = 'bottom';\n        this.pinnedBottomRows.push(row);\n      }\n    });\n    \n    this.cdr.detectChanges();\n  }\n\n  /**\n   * @description Update data source and recalculate pinned row offsets\n   */\n  private updateDataSourceForPinning(): void {\n    // Trigger change detection\n    this.cdr.detectChanges();\n    \n    // Force table to re-render rows\n    if (this.table) {\n      this.table.renderRows();\n    }\n    \n    // Update offsets for sticky positioning\n    this.updatePinnedRowOffsets();\n  }\n\n  /**\n   * @description This method will position the selection column to first and also update its visibility.\n   * @param value value used to set visibility of the selection column.\n   */\n  updateSelectionColumnVisibility(value: boolean) {\n    let columnName = 'select';\n    let column = this.dynamicDisplayedColumns.filter(\n      (a) => a.name == columnName\n    )[0];\n    let index = this.dynamicDisplayedColumns.findIndex(\n      (column: any) => column.name == columnName\n    );\n    if (index > -1) {\n      this.dynamicDisplayedColumns.splice(index, 1);\n      this.dynamicDisplayedColumns.unshift(column);\n      this.dynamicDisplayedColumns.filter(\n        (column) => column.name == columnName\n      )[0].show = value;\n    }\n  }\n  /**\n   * @description This method is used to update the position of  column in columns array according to its dropped position.\n   * @param event CdkDragDrop used to update column position in columns array.\n   */\n  onDrop(event: CdkDragDrop<any>) {\n    if (this.dndColumns) {\n      let adjustedValue = 0;\n      if (\n        this.dynamicDisplayedColumns[0].name == 'select' &&\n        this.dynamicDisplayedColumns[0].show == false\n      ) {\n        adjustedValue = 1;\n      }\n      moveItemInArray(\n        this.dynamicDisplayedColumns,\n        event.previousIndex + adjustedValue,\n        event.currentIndex + adjustedValue\n      );\n      if (this.enableRowPinning) {\n        setTimeout(() => this.syncColumnSizesFromTop(), 80);\n      }\n    }\n  }\n  /**\n   * @description This method create filter predicate function which will set search value to table filters\n   * for both global and individual colum filtering.\n   * @returns returns boolean value to filter rows in table.\n   */\n  createFilter(): (data: any, filter: string) => boolean {\n    const tableFilterPredicate = (data: any, filter: string): boolean => {\n      let result: boolean = true;\n      // search all column fields\n      if (this.globalFilter) {\n        let expression = '';\n        let keys = Object.keys(data);\n        keys.forEach((key) => {\n          expression =\n            expression +\n            `data.${key}.toString().trim().toLowerCase().indexOf(this.globalFilter.toLowerCase()) !== -1 ||`;\n        });\n        if (\n          expression.charAt(expression.length - 2) +\n            expression.charAt(expression.length - 1) ==\n          '||'\n        ) {\n          expression = expression.substring(0, expression.length - 2);\n        }\n        result = eval(expression);\n      }\n      if (!result) {\n        return false;\n      }\n      let searchString = JSON.parse(filter);\n      //search single column field\n      if (this.individualFilter) {\n        return (\n          data[this.individualFilter]\n            .toString()\n            .trim()\n            .toLowerCase()\n            .indexOf(\n              searchString[this.individualFilter].toString().toLowerCase()\n            ) !== -1\n        );\n      }\n      return true;\n    };\n    return tableFilterPredicate;\n  }\n  /**\n   * @description assigns the search value to mat table data source to apply the filter.\n   * @param searchValue value to be searched from table rows.\n   */\n  applyGlobalFilter(searchValue: string) {\n    this.globalFilter = searchValue;\n    let columns: any = {};\n    this.columnsArray.forEach((column: MTExColumn) => {\n      if (column.field) columns[column.field] = searchValue;\n    });\n    this.dataSource.filter = JSON.stringify(columns);\n  }\n  /**\n   * @description This method is used to apply column based filtering\n   * @param searchValue value to be searched from table rows.\n   * @param column filter will be applied based on this column field.\n   */\n  applyColumnFilter(searchValue: FilterSearchValue, column: MTExColumn) {\n    this.individualFilter = column.field;\n    this.filterValues[column.field] = searchValue[column.field];\n    this.dataSource.filter = JSON.stringify(this.filterValues);\n    if (this.enableRowPinning) {\n      setTimeout(() => this.syncColumnSizesFromTop(), 80);\n    }\n  }\n  /**\n   * @description This method will take row and its index enable inline editing tools on that row.\n   * @param row row on which user wants to do edit.\n   * @param index index of the row where inline editing will be enabled.\n   */\n  enableInlineEditing(row: any, index: number) {\n    // Check if another row is currently in edit mode\n    const currentEditIndex = this.tableData.findIndex((r: any) => r.editable === true);\n    \n    if (currentEditIndex !== -1 && currentEditIndex !== index) {\n      // Disable the previous row's edit mode\n      this.tableData[currentEditIndex]['editable'] = false;\n      // Clear the temporary data for the previous row\n      this.rowDataTemp['e' + currentEditIndex] = {};\n      // Restore original sizes when switching rows\n      if (this.enableRowPinning && this.originalSizesBeforeEdit) {\n        this.restoreOriginalSizes();\n      }\n    }\n    \n    const rowData: any = {};\n    rowData['e' + index] = { ...row };\n    this.rowDataTemp = rowData;\n    \n    setTimeout(() => {\n      const wasEditable = this.tableData[index]['editable'];\n      this.tableData[index]['editable'] = !this.tableData[index]['editable'];\n      \n      // If row is now in edit mode, sync sizes from this edited row\n      if (this.tableData[index]['editable'] && this.enableRowPinning) {\n        // Wait for DOM to update with edit controls\n        setTimeout(() => {\n          this.syncColumnSizesFromEditedRow(index);\n        }, 100);\n      } else if (!this.tableData[index]['editable'] && this.enableRowPinning) {\n        // Row was disabled, restore original sizes\n        this.restoreOriginalSizes();\n      }\n    }, 0);\n  }\n  /**\n   * @description This method will create and return data to inline editing template.\n   * @param row row on which user wants to do edit.\n   * @param index index of the row where inline editing will be enabled.\n   * @param column current column of the table.\n   */\n  getInlineEditingData(row: MTExRow, index: number, column: MTExColumn) {\n    this.inlineEditingTemplateRefData = {\n      row: { ...row },\n      column: { ...column },\n      index: index,\n      updateFunc: this.updateInlineTemplateData,\n    };\n    return this.inlineEditingTemplateRefData;\n  }\n  /**\n   * @description This method will take data from inline editing template and update in table data source.\n   * @param row updated row from inline editing template.\n   */\n  updateInlineTemplateData = (row: MTExRow) => {\n    this.service.selectedRow.next(row);\n  };\n  /**\n   * @description This method set data for in-cell editing.\n   * @param row row on which user wants to do edit.\n   * @param index index of the row where inline editing will be enabled.\n   */\n  setCellData(row: MTExRow, index: number) {\n    // If there's already an inline edit in progress, cancel it first\n    if (this.currentRowIndex !== -1 && this.currentRowIndex !== index) {\n      // Find and cancel the previous inline editing row\n      const previousEditableRow = this.tableData.find((r: any, i: number) => \n        i === this.currentRowIndex && r.editable\n      );\n      if (previousEditableRow) {\n        previousEditableRow['editable'] = false;\n      }\n      // Clear previous cell editing states\n      Object.keys(this.cellEditing).forEach(key => {\n        if (key.startsWith(this.currentRowIndex + '_')) {\n          delete this.cellEditing[key];\n        }\n      });\n      this.rowDataTemp['e' + this.currentRowIndex] = {};\n      \n      // Restore sizes when switching from previous cell editing\n      if (this.enableRowPinning) {\n        this.restoreOriginalSizes();\n      }\n    }\n    \n    this.currentRow = { ...row };\n    this.currentRowIndex = index;\n    this.rowDataTemp['e' + index] = { ...row };\n    \n    // Sync column sizes from the edited row when cell editing starts\n    if (this.enableRowPinning) {\n      setTimeout(() => {\n        this.syncColumnSizesFromEditedRow(index);\n      }, 50);\n    }\n  }\n  /**\n   * @description This will restore the data and cencel the inline editing.\n   * @param row row on which user wants to do edit.\n   * @param index index of the row where inline editing will be enabled.\n   */\n  cancelInlineEditing(row: MTExRow, index: number) {\n    this.tableData.filter((a: any, i: number) => i == index)[0]['editable'] =\n      !this.tableData.filter((a: any, i: number) => i == index)[0]['editable'];\n    this.dataSource = new MatTableDataSource(this.tableData);\n    this.rowDataTemp['e' + index] = {};\n    this.service.selectedRow.next(undefined);\n    \n    // Restore original sizes after canceling edit mode\n    if (this.enableRowPinning) {\n      this.restoreOriginalSizes();\n    }\n  }\n  /**\n   * @description This method will save and update the inline editing data and emit the update row and index.\n   * @param row row on which user wants to do edit.\n   * @param index index of the row where inline editing will be enabled.\n   */\n  saveInlineEditing(row: MTExRow, index: number) {\n    if (!this.inlineEditingTemplateRef) {\n      this.tableData[index] = { ...this.rowDataTemp['e' + index] };\n      row = { ...this.rowDataTemp['e' + index] };\n    } else {\n      let changedData = this.service.selectedRow.value;\n      if (changedData) {\n        this.tableData[index] = { ...changedData };\n      }\n    }\n    this.dataSource = new MatTableDataSource(this.tableData);\n    this.rowDataTemp['e' + index] = {};\n    let data: RowChange = {\n      row: row,\n      index: index,\n    };\n    this.inlineChange.emit(data);\n    this.tableData[index]['editable'] = false;\n    \n    // Restore original sizes after saving edit mode\n    if (this.enableRowPinning) {\n      this.restoreOriginalSizes();\n    }\n  }\n  /**\n   * @description This method will save and update the cell editing data and emit the update row and index.\n   */\n  saveCellEditing() {\n    this.cellEditing = {};\n    let index = this.currentRowIndex;\n    if (index > -1) {\n      if (this.cellEditingTemplateRef) {\n        let changedData = this.service.selectedRow.value;\n        if (changedData) {\n          this.tableData[index] = { ...changedData };\n        }\n      } else {\n        this.tableData[index] = { ...this.rowDataTemp['e' + index] };\n      }\n      this.dataSource = new MatTableDataSource(this.tableData);\n      this.rowDataTemp['e' + index] = {};\n      let data: RowChange = {\n        row: { ...this.tableData[index] },\n        index: index,\n      };\n      this.currentRowIndex = -1;\n      this.cellChange.emit(data);\n      \n      // Restore original sizes after saving cell edits\n      if (this.enableRowPinning) {\n        this.restoreOriginalSizes();\n      }\n    }\n  }\n  /**\n   * @description This method will delete the row from the given index and emit the deleted row and index.\n   * @param row row to be deleted.\n   * @param index index of the row to be deleted.\n   */\n  deleteRow(row: any, index: number) {\n    // this.tableData.splice(index, 1);\n    // this.dataSource = new MatTableDataSource(this.tableData);\n    // this.dataSource.paginator = this.paginator;\n    // this.dataSource.sort = this.sort;\n    this.rowDeleted.emit({ removedRow: row, fromIndex: index });\n  }\n\n  /**\n   * @description This method will expand or collapse the row and emit expand event.\n   * @param row row to be expanded or collapsed.\n   * @param expand value used to expand or collapse the row.\n   * @param index index of the row.\n   */\n  expandRow(row: MTExRow, expand: boolean, index: number) {\n    if (this.expandRows) {\n      this.expansionChange.emit({ data: row, expanded: expand, index: index });\n      this.expandedElement = this.expandedElement === row ? null : row;\n    }\n  }\n  /**\n   * @description This method is used to set data for popup component and open editing dialog.\n   * @param row row which used want to edit.\n   */\n  openEditingDialog(row: MTExRow) {\n    const dialogConfig = new MatDialogConfig();\n    dialogConfig.disableClose = true;\n    dialogConfig.width = '40%';\n    dialogConfig.height = '70%';\n    dialogConfig.maxWidth = '100%';\n    let rowData = { ...row };\n    dialogConfig.data = {\n      row: rowData,\n      columns: [...this.columnsArray],\n      templateRef: this.popupEditingTemplateRef,\n    };\n    this.dialog\n      .open(EditingComponent, dialogConfig)\n      .afterClosed()\n      .subscribe((data) => {\n        let index = this.tableData.indexOf(row);\n        if (data && index > -1) {\n          this.tableData[index] = data;\n          this.dataSource = new MatTableDataSource(this.tableData);\n          let dataChange: RowChange = {\n            row: data,\n            index: index,\n          };\n          this.popupChange.emit(dataChange);\n          if (this.enableRowPinning) {\n            setTimeout(() => this.syncColumnSizesFromTop(), 80);\n          }\n        }\n      });\n  }\n  /**\n   * @description This method is used to open cell popup editing dialog for a single cell.\n   * @param row row which contains the cell to edit.\n   * @param column column definition of the cell to edit.\n   * @param rowIndex index of the row.\n   */\n  openCellPopupDialog(row: any, column: MTExColumn, rowIndex: number) {\n    const dialogConfig = new MatDialogConfig();\n    dialogConfig.disableClose = true;\n    dialogConfig.width = '400px';\n    dialogConfig.height = 'auto';\n    dialogConfig.maxWidth = '100%';\n    \n    dialogConfig.data = {\n      row: { ...row },\n      column: column,\n      rowIndex: rowIndex,\n      isCellEdit: true,\n      templateRef: this.cellPopupEditingTemplateRef,\n    };\n    \n    this.dialog\n      .open(EditingComponent, dialogConfig)\n      .afterClosed()\n      .subscribe((data) => {\n        if (data && data.field && rowIndex > -1) {\n          this.tableData[rowIndex][data.field] = data.value;\n          this.dataSource = new MatTableDataSource(this.tableData);\n          let dataChange: RowChange = {\n            row: { ...this.tableData[rowIndex] },\n            index: rowIndex,\n          };\n          this.cellChange.emit(dataChange);\n          if (this.enableRowPinning) {\n            setTimeout(() => this.syncColumnSizesFromTop(), 80);\n          }\n        }\n      });\n  }\n  /**\n   * @description used to check whether all rows are selected.\n   */\n  isAllSelected() {\n    const numSelected = this.selection.selected.length;\n    const numRows = this.dataSource.data.length;\n    return numSelected === numRows;\n  }\n\n  /**\n   * @description this method is used to toggle the all and no rows selection.\n   */\n  toggleAllRows() {\n    if (this.isAllSelected()) {\n      this.selection.clear();\n      return;\n    }\n    this.selection.select(...this.dataSource.data);\n  }\n\n  /**\n   * @description This method is used return aria-label for selection column checkboxs.\n   * @param row row from table.\n   * @returns labels for selection column checkboxs.\n   */\n  checkboxLabel(row?: any): string {\n    if (!row) {\n      return `${this.isAllSelected() ? 'deselect' : 'select'} all`;\n    }\n    return `${this.selection.isSelected(row) ? 'deselect' : 'select'} row ${\n      row.position + 1\n    }`;\n  }\n\n  /**\n   * @description create form control for columns for hiding and and pinning purpose\n   * @param columns list of columns to be displayed\n   */\n  setToolbarMenuControls(columns: MTExColumn[]) {\n    if (columns.length > 0 && this.showToolbar) {\n      const group = this.formBuilder.group({});\n      columns.forEach((column: MTExColumn) => {\n        const control = this.formBuilder.control(true);\n        group.addControl(column.field, control);\n      });\n      this.hideShowMenuGroup = group;\n    }\n  }\n\n  /**\n   * @param column current column\n   * @param event mouse event used to set the menu position\n   */\n  openPinnablePropertyMenu(column: MTExColumn, event: MouseEvent): void {\n    this.menuX = event.clientX;\n    this.menuY = event.clientY;\n    let options: MTExColumnPinOption[] = [\n      {\n        label: 'Pin Left',\n        value: 'left',\n        selected: false,\n        field: column.field,\n      },\n      {\n        label: 'Pin Right',\n        value: 'right',\n        selected: false,\n        field: column.field,\n      },\n      { label: 'No Pin', value: null, selected: false, field: column.field },\n    ];\n    if (column.pinned && column.pinned !== null) {\n      options.forEach((opt: MTExColumnPinOption) => {\n        if (opt.value === column.pinned) {\n          opt.selected = true;\n        }\n      });\n    } else if (column.pinned == null || column.pinned == 'null') {\n      options[2].selected = true;\n    }\n    this.columnPinningOptions = options;\n    this.columnMenuTrigger.openMenu();\n  }\n  /**\n   * @description This method is used to reset menu checks when required.\n   */\n  resetMenuChecks() {\n    this.hideShowMenuCtrl = false;\n    this.showHideColumnsArray = [];\n    this.columnPinMenuCtrl = false;\n    this.columnPinningOptions = [];\n  }\n  /**\n   * @description This method is used to filter columns for menus like pinning or hide show menu.\n   * @param value search value to filter colunms\n   */\n  filterColumns(value: string) {\n    if (value !== '') {\n      this.showHideColumnsArray = this.columnsArray.filter(\n        (col: MTExColumn) => {\n          return col.header!.toLowerCase().includes(value.toLowerCase());\n        }\n      );\n    } else {\n      this.showHideColumnsArray = this.columnsArray;\n    }\n  }\n  /**\n   * @description This method is used to open hide show column menu.\n   * @param columns columns array to display in hide show menu.\n   */\n  openHideShowMenu(columns: MTExColumn[]) {\n    this.showHideColumnsArray = [...columns];\n    this.columnMenuTrigger.openMenu();\n  }\n  /**\n   * @param values columns\n   */\n  updateColumnsHideShow(values: ColumnVisibility) {\n    let keys = Object.keys(values);\n    keys.forEach((key: string) => {\n      this.showHideColumn(key, values[key]);\n    });\n  }\n\n  /**\n   * @description This method is called when the table rows are scrolled.\n   * @param event scroll event\n   */\n  onScroll(event: any) {\n    this.scroll.emit(event);\n  }\n  /**\n   * @param row row to be toggled\n   * @param index index of toggled row\n   */\n  setSelectedRows(row: any, index: number) {\n    this.selection.toggle(row);\n    if (this.selection.isSelected(row)) {\n      this.selectionChanged.emit({ row: row, index: index, isSelected: true });\n    } else {\n      this.selectionChanged.emit({ row: row, index: index, isSelected: false });\n    }\n  }\n/**\n * @description This method is used to display all hidden rows.\n */\n  showHiddenRows() {\n    this.hideRows = false;\n    this.selection.clear();\n    this.hiddenCtrl.clear();\n  }\n/**\n * @description This method is used to hide all selected rows.\n */\n  hideSelectedRows() {\n    if (!this.selection.isEmpty()) {\n      let values = [...this.selection.selected];\n      values.forEach((value) => {\n        if (!this.hiddenCtrl.isSelected(value)) {\n          this.hiddenCtrl.toggle(value);\n        }\n      });\n      this.selection.clear();\n      this.hideRows = true;\n    }\n  }\n/**\n * @description This method is used to recalculate the required values for table.\n */\n  reCal() {\n    if (this.showPaginator) {\n      this.dataSource.paginator = this.paginator;\n    }\n    if (this.sorting) {\n      this.dataSource.sort = this.sort;\n      if (this.enableRowPinning) {\n        this.pinnedTopDataSource.sort = this.sort;\n        this.pinnedBtmDataSource.sort = this.sort;\n      }\n    }\n    if (this.columnFilter) {\n      this.dataSource.filterPredicate = this.createFilter();\n      this.pinnedTopDataSource.filterPredicate = this.createFilter();\n      this.pinnedBtmDataSource.filterPredicate = this.createFilter();\n    }\n    this.cdr.detectChanges();\n  }\n/**\n * @description This method is called in constructor method to add SVGs into icon registration.\n */\n  addIconsToRegistry() {\n    let y = this.domSanitizer.bypassSecurityTrustResourceUrl(\n      `assets/pinRight.svg`\n    );\n    let iconNames = ['pinLeft', 'pinRight', 'pinNone', 'pinned', 'pinIcon'];\n    iconNames.forEach((icon) => {\n      this.matIconRegistry.addSvgIcon(\n        icon,\n        this.domSanitizer.bypassSecurityTrustResourceUrl(\n          `assets/${icon}.svg`\n        )\n      );\n    });\n  }\n/**\n * @description This method is used to export table data.\n * @param type type of file to be exported.\n */\n  exportTable(type: string) {\n    const actionColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n    \n    // Get visible columns in the correct order (grouped first, ungrouped at end)\n    let visibleColumns: MTExColumn[] = [];\n    \n    if (this.columnGroups.length > 0) {\n      const groupedFields = new Set<string>();\n      \n      // Collect all fields that belong to groups\n      this.columnGroups.forEach(group => {\n        group.columns.forEach(colField => groupedFields.add(colField));\n      });\n      \n      // Add grouped columns first (in group order)\n      this.columnGroups.forEach(group => {\n        group.columns.forEach(colField => {\n          const col = this.columnsArray.find(c => c.field === colField);\n          const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === colField);\n          if (col && displayCol && displayCol.show && !visibleColumns.includes(col)) {\n            visibleColumns.push(col);\n          }\n        });\n      });\n      \n      // Add ungrouped columns at the end\n      this.columnsArray.forEach(col => {\n        const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === col.field);\n        if (!groupedFields.has(col.field) && displayCol && displayCol.show && \n            !actionColumns.includes(col.field) && !visibleColumns.includes(col)) {\n          visibleColumns.push(col);\n        }\n      });\n    } else {\n      // No groups, use default order\n      visibleColumns = this.columnsArray.filter(col => {\n        const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === col.field);\n        return displayCol && displayCol.show && !actionColumns.includes(col.field);\n      });\n    }\n\n    const data: any[] = [];\n    \n    // Add group headers if they exist\n    if (this.columnGroups.length > 0) {\n      const groupRow: any[] = [];\n      const columnIndexMap: { [key: string]: number } = {};\n      \n      visibleColumns.forEach((col, idx) => {\n        columnIndexMap[col.field] = idx;\n      });\n      \n      // Initialize group row with empty strings\n      for (let i = 0; i < visibleColumns.length; i++) {\n        groupRow.push('');\n      }\n      \n      // Fill in group labels\n      this.columnGroups.forEach(group => {\n        const groupCols = group.columns.filter(colField => \n          visibleColumns.find(vc => vc.field === colField)\n        );\n        \n        if (groupCols.length > 0) {\n          const firstColIndex = columnIndexMap[groupCols[0]];\n          groupRow[firstColIndex] = group.label;\n        }\n      });\n      \n      data.push(groupRow);\n    }\n    \n    // Add column headers\n    data.push(visibleColumns.map(col => col.header || col.field));\n    \n    // Add data rows (exclude hidden rows)\n    this.dataSource.data.forEach((row, index) => {\n      // Skip hidden rows\n      if (this.hiddenRowIndices.includes(index)) {\n        return;\n      }\n      const rowData = visibleColumns.map(col => {\n        const value = row[col.field];\n        if (value === null || value === undefined) return '';\n        if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n        if (value instanceof Date) return new Intl.DateTimeFormat('en-US').format(value);\n        return value;\n      });\n      data.push(rowData);\n    });\n    \n    const ws: XLSX.WorkSheet = XLSX.utils.aoa_to_sheet(data);\n    \n    // Add merge cells for group headers if they exist\n    if (this.columnGroups.length > 0) {\n      if (!ws['!merges']) {\n        ws['!merges'] = [];\n      }\n      const columnIndexMap: { [key: string]: number } = {};\n      \n      visibleColumns.forEach((col, idx) => {\n        columnIndexMap[col.field] = idx;\n      });\n      \n      this.columnGroups.forEach(group => {\n        const groupCols = group.columns.filter(colField => \n          visibleColumns.find(vc => vc.field === colField)\n        );\n        \n        if (groupCols.length > 1 && ws['!merges']) {\n          const firstColIndex = columnIndexMap[groupCols[0]];\n          const lastColIndex = columnIndexMap[groupCols[groupCols.length - 1]];\n          \n          ws['!merges'].push({\n            s: { r: 0, c: firstColIndex },\n            e: { r: 0, c: lastColIndex }\n          });\n        }\n      });\n    }\n    \n    const wb: XLSX.WorkBook = XLSX.utils.book_new();\n    XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');\n    XLSX.writeFile(wb, `tablesheets.${type}`);\n  }\n/**\n * @description This method is used to print the table with proper styling.\n */\n  printTable() {\n    const printContent = document.getElementById('matTableExt' + this.tableID);\n    if (!printContent) return;\n\n    const windowPrint = window.open('', '', 'width=900,height=650');\n    if (!windowPrint) return;\n\n    windowPrint.document.write('<html><head><title>Print Table</title>');\n    windowPrint.document.write('<style>');\n    windowPrint.document.write(`\n      table { border-collapse: collapse; width: 100%; font-family: Arial, sans-serif; }\n      th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n      th { background-color: #f2f2f2; font-weight: bold; }\n      tr:nth-child(even) { background-color: #f9f9f9; }\n      .mat-sort-header-container { display: inline; }\n      .mat-sort-header-arrow, .mat-sort-header-indicator { display: none !important; }\n      button, .mat-icon { display: none !important; }\n      @media print {\n        .mat-mdc-table { page-break-inside: auto; }\n        tr { page-break-inside: avoid; page-break-after: auto; }\n        thead { display: table-header-group; }\n      }\n    `);\n    windowPrint.document.write('</style></head><body>');\n    \n    // Clone the table and remove all action columns\n    const tableClone = printContent.cloneNode(true) as HTMLElement;\n    \n    // Define action column class selectors\n    const actionColumnSelectors = [\n      'th.action-column-cells',\n      'td.inline-edit-column-cell',\n      // Remove columns by checking for action column names\n      '[matColumnDef=\"select\"]',\n      '[matColumnDef=\"edit\"]',\n      '[matColumnDef=\"popup\"]',\n      '[matColumnDef=\"delete\"]',\n      '[matColumnDef=\"freeze\"]',\n      '[matColumnDef=\"hide\"]',\n    ];\n    \n    // Remove all matching elements\n    actionColumnSelectors.forEach(selector => {\n      const elements = tableClone.querySelectorAll(selector);\n      elements.forEach(el => el.remove());\n    });\n    \n    // Also remove cells by index for action columns\n    const actionColumnIndices: number[] = [];\n    const headerRow = tableClone.querySelector('tr.mat-mdc-header-row');\n    if (headerRow) {\n      const headers = Array.from(headerRow.querySelectorAll('th'));\n      headers.forEach((th, index) => {\n        if (th.classList.contains('action-column-cells')) {\n          actionColumnIndices.push(index);\n        }\n      });\n    }\n    \n    // Remove cells at action column indices from all rows\n    const rows = tableClone.querySelectorAll('tr');\n    rows.forEach((row, rowIndex) => {\n      // Remove hidden rows (accounting for header rows)\n      const dataIndex = rowIndex - 1; // Subtract 1 for header row\n      if (dataIndex >= 0 && this.hiddenRowIndices.includes(dataIndex)) {\n        row.remove();\n        return;\n      }\n      \n      const cells = Array.from(row.querySelectorAll('th, td'));\n      // Remove in reverse order to maintain correct indices\n      for (let i = actionColumnIndices.length - 1; i >= 0; i--) {\n        const index = actionColumnIndices[i];\n        if (cells[index]) {\n          cells[index].remove();\n        }\n      }\n    });\n    \n    windowPrint.document.write(tableClone.outerHTML);\n    windowPrint.document.write('</body></html>');\n    windowPrint.document.close();\n    \n    setTimeout(() => {\n      windowPrint.print();\n      windowPrint.close();\n    }, 250);\n  }\n\n  async exportToPDF() {\n    try {\n      // Correct jsPDF import\n      const JsPDF = (await import('jspdf')).default;\n\n      // Correct AutoTable import\n      const autoTableModule = await import('jspdf-autotable');\n      const autoTable = autoTableModule.autoTable || autoTableModule.default;\n\n      // Create PDF with user-specified orientation\n      const doc = new JsPDF({\n        orientation: this.pdfOrientation,\n        unit: 'mm',\n        format: 'a4'\n      });\n\n      const actionColumns = ['select', 'edit', 'popup', 'delete', 'freeze', 'hide', 'pin'];\n\n      // Get visible columns in the correct order (grouped first, ungrouped at end)\n      let visibleColumns: MTExColumn[] = [];\n      \n      if (this.columnGroups.length > 0) {\n        const groupedFields = new Set<string>();\n        \n        // Collect all fields that belong to groups\n        this.columnGroups.forEach(group => {\n          group.columns.forEach(colField => groupedFields.add(colField));\n        });\n        \n        // Add grouped columns first (in group order)\n        this.columnGroups.forEach(group => {\n          group.columns.forEach(colField => {\n            const col = this.columnsArray.find(c => c.field === colField);\n            const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === colField);\n            if (col && displayCol && displayCol.show && !visibleColumns.includes(col)) {\n              visibleColumns.push(col);\n            }\n          });\n        });\n        \n        // Add ungrouped columns at the end\n        this.columnsArray.forEach(col => {\n          const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === col.field);\n          if (!groupedFields.has(col.field) && displayCol && displayCol.show && \n              !actionColumns.includes(col.field) && !visibleColumns.includes(col)) {\n            visibleColumns.push(col);\n          }\n        });\n      } else {\n        // No groups, use default order\n        visibleColumns = this.columnsArray.filter(col => {\n          const displayCol = this.dynamicDisplayedColumns.find(dc => dc.name === col.field);\n          return displayCol && displayCol.show && !actionColumns.includes(col.field);\n        });\n      }\n\n      // Prepare group headers if column groups exist\n      let groupHeaders: any[] = [];\n      let columnIndexMap: { [key: string]: number } = {};\n      let groupColSpans: { [key: number]: number } = {};\n      \n      if (this.columnGroups.length > 0) {\n        // Build column index map\n        visibleColumns.forEach((col, idx) => {\n          columnIndexMap[col.field] = idx;\n        });\n        \n        // Create group header row\n        const groupRow: any[] = [];\n        let currentIndex = 0;\n        \n        this.columnGroups.forEach(group => {\n          const groupCols = group.columns.filter(colField => \n            visibleColumns.find(vc => vc.field === colField)\n          );\n          \n          if (groupCols.length > 0) {\n            const firstColIndex = columnIndexMap[groupCols[0]];\n            \n            // Add the group header cell with content and colspan\n            groupRow.push({\n              content: group.label,\n              colSpan: groupCols.length,\n              styles: { halign: 'center' }\n            });\n            \n            groupColSpans[firstColIndex] = groupCols.length;\n            currentIndex = firstColIndex + groupCols.length;\n          }\n        });\n        \n        // Add empty cells for ungrouped columns\n        const groupedFields = new Set<string>();\n        this.columnGroups.forEach(group => {\n          group.columns.forEach(colField => groupedFields.add(colField));\n        });\n        \n        const ungroupedCount = visibleColumns.filter(col => \n          !groupedFields.has(col.field)\n        ).length;\n        \n        for (let i = 0; i < ungroupedCount; i++) {\n          groupRow.push({\n            content: '',\n            styles: { halign: 'center' }\n          });\n        }\n        \n        groupHeaders = [groupRow];\n      }\n\n      const headers = visibleColumns.map(col => col.header || col.field);\n\n      const rows = this.dataSource.data\n        .map((row, index) => ({\n          row,\n          index\n        }))\n        .filter(({ index }) => !this.hiddenRowIndices.includes(index))\n        .map(({ row }) =>\n          visibleColumns.map(col => {\n            const value = row[col.field];\n          if (value === null || value === undefined) return '';\n          if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n          if (value instanceof Date)\n            return new Intl.DateTimeFormat('en-US').format(value);\n          return String(value);\n        })\n      );\n\n      let startY = 10;\n      if (this.toolbarTitle) {\n        doc.text(this.toolbarTitle, 14, 15);\n        startY = 20;\n      }\n\n      // Extract header styles from actual mat-table\n      let headerStyles: any = {\n        fillColor: [245, 245, 245],  // Default Material table header background (#f5f5f5)\n        textColor: [0, 0, 0],        // Default Material table header text (black)\n        fontStyle: 'bold'\n      };\n\n      // If headerTemplateRef is defined, extract styles from the actual header cells\n      if (this.headerTemplateRef) {\n        const headerCells = this.tableElement?.nativeElement?.querySelectorAll('.mat-mdc-header-cell');\n        if (headerCells && headerCells.length > 0) {\n          const firstHeader = headerCells[0] as HTMLElement;\n          const computedStyles = window.getComputedStyle(firstHeader);\n          \n          // Extract background color\n          const bgColor = computedStyles.backgroundColor;\n          if (bgColor && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {\n            const rgb = bgColor.match(/\\d+/g);\n            if (rgb && rgb.length >= 3) {\n              headerStyles.fillColor = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])];\n            }\n          }\n          \n          // Extract text color\n          const textColor = computedStyles.color;\n          if (textColor) {\n            const rgb = textColor.match(/\\d+/g);\n            if (rgb && rgb.length >= 3) {\n              headerStyles.textColor = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])];\n            }\n          }\n          \n          // Extract font weight\n          const fontWeight = computedStyles.fontWeight;\n          if (fontWeight && (fontWeight === 'bold' || parseInt(fontWeight) >= 600)) {\n            headerStyles.fontStyle = 'bold';\n          } else {\n            headerStyles.fontStyle = 'normal';\n          }\n        }\n      }\n\n      // Extract group header styles if groups exist\n      let groupHeaderStyles: any = null;\n      if (groupHeaders.length > 0) {\n        // Extract from group-header-cell elements\n        const groupHeaderCells = this.tableElement?.nativeElement?.querySelectorAll('.group-header-cell');\n        if (groupHeaderCells && groupHeaderCells.length > 0) {\n          const firstGroupHeader = groupHeaderCells[0] as HTMLElement;\n          const computedStyles = window.getComputedStyle(firstGroupHeader);\n          \n          groupHeaderStyles = {};\n          \n          // Extract background color\n          const bgColor = computedStyles.backgroundColor;\n          if (bgColor && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {\n            const rgb = bgColor.match(/\\d+/g);\n            if (rgb && rgb.length >= 3) {\n              groupHeaderStyles.fillColor = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])];\n            }\n          } else {\n            // Default to same as header background\n            groupHeaderStyles.fillColor = headerStyles.fillColor;\n          }\n          \n          // Extract text color\n          const textColor = computedStyles.color;\n          if (textColor) {\n            const rgb = textColor.match(/\\d+/g);\n            if (rgb && rgb.length >= 3) {\n              groupHeaderStyles.textColor = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])];\n            }\n          } else {\n            // Default to same as header text\n            groupHeaderStyles.textColor = headerStyles.textColor;\n          }\n          \n          // Extract font weight\n          const fontWeight = computedStyles.fontWeight;\n          if (fontWeight && (fontWeight === 'bold' || parseInt(fontWeight) >= 600)) {\n            groupHeaderStyles.fontStyle = 'bold';\n          } else {\n            groupHeaderStyles.fontStyle = 'normal';\n          }\n        } else {\n          // No group header cells found, use same as regular headers\n          groupHeaderStyles = { ...headerStyles };\n        }\n      }\n\n      // Build table config without default grid borders. We'll draw only\n      // bottom dividers manually in `didDrawCell` so there are no left/right borders.\n      const tableConfig: any = {\n        head: groupHeaders.length > 0 ? [...groupHeaders, headers] : [headers],\n        body: rows,\n        startY: startY,\n        // Use 'plain' so autowire doesn't draw full grid borders\n        theme: 'plain',\n        styles: {\n          fontSize: 9,\n          cellPadding: 3,\n          // ensure autTable doesn't draw default lines\n          lineWidth: 0\n        },\n        headStyles: headerStyles\n      };\n\n      // didParseCell: apply header/group header visual styles (background/text/font)\n      tableConfig.didParseCell = (data: any) => {\n        // Group header row styling (if present)\n        if (data.section === 'head' && groupHeaders.length > 0 && data.row.index === 0 && groupHeaderStyles) {\n          if (groupHeaderStyles.fillColor) data.cell.styles.fillColor = groupHeaderStyles.fillColor;\n          if (groupHeaderStyles.textColor) data.cell.styles.textColor = groupHeaderStyles.textColor;\n          if (groupHeaderStyles.fontStyle) data.cell.styles.fontStyle = groupHeaderStyles.fontStyle;\n          data.cell.styles.halign = 'center';\n        }\n\n        // Final header row (column labels) should use headerStyles\n        if (data.section === 'head' && data.row.index === (groupHeaders.length > 0 ? groupHeaders.length : 0)) {\n          if (headerStyles.fillColor) data.cell.styles.fillColor = headerStyles.fillColor;\n          if (headerStyles.textColor) data.cell.styles.textColor = headerStyles.textColor;\n          if (headerStyles.fontStyle) data.cell.styles.fontStyle = headerStyles.fontStyle;\n        }\n      };\n\n      // didDrawCell: draw only the bottom divider line for each cell\n      tableConfig.didDrawCell = (data: any) => {\n        try {\n          const cell = data.cell;\n          const docRef: any = doc;\n          // Determine stroke color and width for divider\n          const lineColor = [200, 200, 200];\n          const lineWidth = 0.5;\n\n          // Coordinates: draw a horizontal line across the bottom of the cell\n          const x1 = cell.x;\n          const x2 = cell.x + cell.width;\n          const y = cell.y + cell.height;\n\n          docRef.setDrawColor(lineColor[0], lineColor[1], lineColor[2]);\n          docRef.setLineWidth(lineWidth);\n          docRef.line(x1, y, x2, y);\n        } catch (err) {\n          // don't block export on draw errors\n        }\n      };\n\n      autoTable(doc, tableConfig);\n\n      doc.save(`${this.toolbarTitle || 'table-export'}.pdf`);\n\n    } catch (error) {\n      console.error('Error exporting to PDF:', error);\n    }\n  }\n\n\n  /**\n   * @description This method is used to split name of filter row header to get index.\n   * @param value value to be splited for index.\n   * @returns Will return index of column from value.\n   */\n  returnIndex(value: string): number {\n    return Number(value.split('_')[1]);\n  }\n/**\n * @description This method is used to manage column filtering, expanded data for exporting.\n * @param ws work sheet\n * @returns custom generated worksheet to be used in export.\n */\n  writeSheetData(ws: XLSX.WorkSheet): XLSX.WorkSheet {\n    let displayedColumns = this.getDisplayedColumns();\n    var nMerges = this.getMergeIndex(ws['!merges'] || []);\n    var merges = ws['!merges'] || [];\n    let data: XLSX.WorkSheet = {\n      '!cols': [],\n      '!rows': [],\n      '!merges': nMerges,\n    };\n    var range = XLSX.utils.decode_range(ws['!ref'] || '');\n    let extracolumns = ['popup', 'delete', 'select', 'edit'];\n    let keys = Object.keys(ws);\n    let nKey = 'A';\n    keys.forEach((key, i) => {\n      if (ws[key]?.v && typeof ws[key]?.v === 'string') {\n        if (\n          !extracolumns.includes(ws[key].v.toLowerCase()) &&\n          displayedColumns.includes(ws[key].v.toLowerCase())\n        ) {\n          let lastRowIndex = range?.e?.r;\n          data[key] = ws[key];\n          let chr = key.charAt(0);\n          for (let j = 2; j <= lastRowIndex; j++) {\n            if (\n              ws[chr + (j + 1)] !== undefined &&\n              (typeof ws[chr + (j + 1)].v === 'string' ||\n                typeof ws[chr + (j + 1)].v === 'number')\n            ) {\n              data[nKey + j] = ws[chr + (j + 1)];\n            }\n          }\n          nKey = String.fromCharCode(nKey.charCodeAt(0) + 1);\n        }\n      }\n    });\n    if (this.rowSelection) {\n      let chr = 'A';\n      for (let i = 1; i < range.e.c + 1; i++) {\n        data[chr + 1] = data[String.fromCharCode(chr.charCodeAt(0) + 1) + 1];\n        chr = String.fromCharCode(chr.charCodeAt(0) + 1);\n        if (i == range.e.c) {\n          data[chr + 1] = undefined;\n        }\n      }\n    }\n    if (this.rowSelection && this.expandRows) {\n      merges.forEach((merge) => {\n        data['A' + merge.s.r] = ws['A' + (merge.s.r + 1)];\n      });\n    }\n    range.e.r--;\n    let nRef = XLSX.utils.encode_range(range);\n    data['!ref'] = nRef;\n    data['!fullref'] = nRef;\n    return data;\n  }\n  getMergeIndex(merges: any[]) {\n    var arr: any[] = [];\n    merges.forEach((element: any) => {\n      arr.push({\n        e: {\n          r: element.e.r == 0 ? element.e.r : element.e.r - 1,\n          c: element.e.c,\n        },\n        s: {\n          r: element.s.r == 0 ? element.s.r : element.s.r - 1,\n          c: element.s.c,\n        },\n      });\n    });\n    return arr;\n  }\n\n  \n}\n\n","<div [style.width]=\"tableWidth\">\n    @if (globalSearch) {\n        <mat-form-field class=\"global-search-field\" appearance=\"fill\">\n            <mat-label>Search</mat-label>\n            <input matInput [ngModel]=\"globalFilter\" (ngModelChange)=\"applyGlobalFilter($event)\" placeholder=\"Ex. Mia\"\n                #input>\n        </mat-form-field>\n    }\n    @if (showToolbar) {\n        <mat-toolbar class=\"toolbar-container\" [style.height]=\"toolbarHeight?toolbarHeight:'50px'\">\n            @if (toolbarTitle) {\n                <span class=\"toolbar-title\">{{toolbarTitle}}</span>\n            }\n            @if (toolbarTemplateRef) {\n                <ng-container [ngTemplateOutlet]=\"toolbarTemplateRef\"></ng-container>\n            }\n            <span class=\"example-spacer\"></span>\n            @if (rowSelection || multiRowSelection) {\n                <button class=\"hide-button\" mat-stroked-button color=\"primary\" (click)=\"hideSelectedRows()\">\n                    Hide Rows\n                </button>\n                <button class=\"hide-button\" mat-stroked-button color=\"primary\" (click)=\"showHiddenRows()\">\n                    Show All Rows\n                </button>\n            }\n            @if (enableRowHiding && hiddenRowIndices.length > 0) {\n                <button class=\"hide-button custom-primary-color\" mat-stroked-button color=\"accent\" (click)=\"unhideAllRows()\"\n                    matTooltip=\"Unhide all hidden rows\" matTooltipPosition=\"above\">\n                    <mat-icon>visibility</mat-icon>\n                    <span>Unhide All ({{hiddenRowIndices.length}})</span>\n                </button>\n            }\n            @if (columnHidable) {\n                <button class=\"hide-button\" mat-stroked-button color=\"primary\"\n                    (click)=\"openMenu('hideShow',$event)\" matTooltip=\"Column Visibility\" matTooltipPosition=\"above\">\n                    <mat-icon>visibility</mat-icon>\n                </button>\n            }\n            @if (columnPinnable) {\n                <button class=\"pin-button\" mat-stroked-button color=\"primary\"\n                    (click)=\"openMenu('columnPin',$event)\" matTooltip=\"Column Pinning\">\n                    <mat-icon svgIcon=\"pinIcon\"></mat-icon>\n                </button>\n            }\n            @if (exportButtonEnable) {\n                <button class=\"export-button\" mat-stroked-button color=\"primary\"\n                    (click)=\"openMenu('export',$event)\" matTooltip=\"Table Data Export\">\n                    <mat-icon>import_export</mat-icon>\n                    <span>Export</span>\n                    <mat-icon iconPositionEnd>expand_more</mat-icon>\n                </button>\n              }\n            @if (printButtonEnable) {\n                <button class=\"print-button\" mat-icon-button color=\"primary\"\n                    (click)=\"printTable()\" matTooltip=\"Print Table\">\n                    <mat-icon>print</mat-icon>\n                </button>\n              }\n            <div style=\"visibility: hidden; position:fixed\" [matMenuTriggerFor]=\"menu\" [style.left.px]=\"menuX\"\n                [style.top.px]=\"menuY\"></div>\n        </mat-toolbar>\n    }\n    <mat-menu #menu=\"matMenu\" (closed)=\"menuClosed()\" id=\"exportMenu\">\n        @if (exportMenuCtrl) {\n            <mat-option (click)=\"exportTable('xlsx')\">Export to Excel</mat-option>\n            <mat-option (click)=\"exportTable('csv')\">Export to CSV</mat-option>\n            <mat-option (click)=\"exportToPDF()\">Export to PDF</mat-option>\n        }\n    </mat-menu>\n    <div style=\"visibility: hidden; position:fixed\" #columnMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"columnMenu\"\n        [style.left.px]=\"menuX\" [style.top.px]=\"menuY\">\n    </div>\n    <mat-menu #columnMenu=\"matMenu\" (closed)=\"resetMenuChecks()\">\n        @if (hideShowMenuCtrl) {\n            <div class=\"toolbar-menu-container\" [formGroup]=\"hideShowMenuGroup\"\n                (click)=\"$event.stopPropagation()\">\n                <h4 class=\"column-headers\">Visible Columns</h4>\n                <mat-form-field appearance=\"fill\" style=\"width: -webkit-fill-available;\">\n                    <mat-label>Filter Columns</mat-label>\n                    <input matInput [(ngModel)]=\"showHideFilter\" (ngModelChange)=\"filterColumns($event)\"\n                        [ngModelOptions]=\"{standalone: true}\">\n                </mat-form-field>\n                <div class=\"showHide-menu-columns-list\">\n                    @for (column of showHideColumnsArray; track column.field) {\n                        <div class=\"toolbar-menu-item\">\n                            <mat-checkbox color=\"primary\" class=\"toolbar-menu-checkbox\" style=\"width: max-content;\"\n                                [formControlName]=\"column.field\" (change)=\"setColumnHideShow()\">{{column.header}}</mat-checkbox>\n                        </div>\n                    }\n                </div>\n            </div>\n        }\n        @if (columnPinMenuCtrl) {\n            <div class=\"toolbar-menu-container\" (click)=\"$event.stopPropagation()\">\n                <h4 class=\"column-headers\">Pin Columns</h4>\n                <form class=\"example-form\">\n                    <mat-form-field appearance=\"fill\" style=\"width: -webkit-fill-available;\">\n                        <mat-label>Filter Columns</mat-label>\n                        <input matInput [(ngModel)]=\"showHideFilter\" (ngModelChange)=\"filterColumns($event)\"\n                            [ngModelOptions]=\"{standalone: true}\">\n                    </mat-form-field>\n                </form>\n                <div class=\"showHide-menu-columns-list\">\n                    <app-column-pinning [columns]=\"showHideColumnsArray\" (columnsChanged)=\"updateColumns($event)\"></app-column-pinning>\n                </div>\n            </div>\n        }\n    </mat-menu>\n\n    <!-- Row Pin Menu -->\n    <mat-menu #pinMenu=\"matMenu\" (closed)=\"closeRowPinMenu()\">\n        @if (rowPinMenuRow) {\n            @if (!isRowPinned(rowPinMenuRow)) {\n                <button mat-menu-item (click)=\"pinRow(rowPinMenuRow, 'top')\">\n                    <mat-icon>vertical_align_top</mat-icon>\n                    <span>Pin to Top</span>\n                </button>\n                <button mat-menu-item (click)=\"pinRow(rowPinMenuRow, 'bottom')\">\n                    <mat-icon>vertical_align_bottom</mat-icon>\n                    <span>Pin to Bottom</span>\n                </button>\n            }\n            @if (isRowPinned(rowPinMenuRow)) {\n                <button mat-menu-item (click)=\"unpinRow(rowPinMenuRow)\">\n                    <mat-icon>close</mat-icon>\n                    <span>Unpin Row</span>\n                </button>\n            }\n        }\n    </mat-menu>\n\n    @if (loadingIndicator) {\n        <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n    }\n    <section id=\"tableContainer\" class=\"mat-table-ext-container\" (scroll)=\"onScroll($event)\"\n        [style.height]=\"tableHeight ? tableHeight :'max-content'\">\n        \n        @if(enableRowPinning){\n            <div [style.max-height]=\"topPinnedMaxHeight\" [style.overflow]=\"topPinnedMaxHeight ? 'auto' : 'visible'\" \n                 [style.position]=\"'sticky'\" [style.top]=\"'0'\" [style.z-index]=\"'111'\">\n            <table style=\"width: 100%;\" \n             mat-table #MyTableTop [id]=\"'matTableExtTop'+tableID\" [dataSource]=\"pinnedTopDataSource\" matSort cdkDropList\n                cdkDropListOrientation=\"horizontal\" multiTemplateDataRows (cdkDropListDropped)=\"onDrop($event)\"\n                (click)=\"saveCellEditing()\" [style.width]=\"scrollbarH?'max-content':'100%'\" \n                [class]=\"'mat-mdc-table' + (tableClassName ? ' ' + tableClassName : '')\">\n    \n                <!-- Row selection column -->\n                <ng-container matColumnDef=\"select\">\n                    <th mat-header-cell *matHeaderCellDef cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\">\n                        <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n                            [checked]=\"selection.hasValue() && isAllSelected()\"\n                            [indeterminate]=\"selection.hasValue() && !isAllSelected()\" [aria-label]=\"checkboxLabel()\">\n                        </mat-checkbox>\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i = dataIndex\">\n                        <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? setSelectedRows(row,i) : null\"\n                            [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n                        </mat-checkbox>\n                    </td>\n                    <ng-container *ngIf=\"showFooterRow\">\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n                </ng-container>\n                <!--dynamic columns are being generated here-->\n                @for (column of columnsArray; track column.field + '_' + column.pinned; let i = $index) {\n                    <div matColumnDef=\"{{column['field']}}\" [sticky]=\"column.pinned === 'left'\" [stickyEnd]=\"column.pinned === 'right'\">\n                    <th mat-header-cell *matHeaderCellDef [style.minWidth]=\"column.width\" [style.maxWidth]=\"column.maxWidth?column.maxWidth:column.width\"\n                        [style.minWidth]=\"column.minWidth\" cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\"\n                        [columnsResizable]=\"columnResizable\" [index]=\"i\" class=\"mat-mdc-header-cell\"\n                        [mat-sort-header]=\"column.field\" [disabled]=\"!sorting || column.disabled === true\">\n    \n                        @if (column.headerTemplate || headerTemplateRef) {\n                            <ng-template [ngTemplateOutlet]=\"column.headerTemplate || headerTemplateRef\"\n                                [ngTemplateOutletContext]=\"{data:column}\"></ng-template>\n                        }\n                        @if (!headerTemplateRef && !column.headerTemplate) {\n                            <span matTooltip=\"{{column.headerTooltip?.value}}\"\n                                [matTooltipPosition]=\"column?.headerTooltip?.tooltipPosition!\"\n                                [class.disabled]=\"!sorting || column.disabled === true\">{{column.header}}</span>\n                        }\n                    </th>\n                    <td mat-cell *matCellDef=\"let row ;let i=dataIndex\" class=\"mat-mdc-cell\">\n                        @if (!row.editable && !cellEditing[i +'_'+column.field]) {\n                            <div [style.cursor]=\"'default'\"\n                                matTooltip=\"{{column.cellTooltip?.value}}\"\n                                [matTooltipPosition]=\"column?.cellTooltip?.tooltipPosition!\">\n                                @if (!cellTemplateRef && !column?.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <span>{{row[column.field]}}</span>\n                                }\n                                @if (cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"cellTemplateRefMap[column.field]\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (!cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (cellTemplateRef && !column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"cellTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                            </div>\n                        }\n                        @if (row.editable || cellEditing[i +'_'+column.field]) {\n                            <div (click)=\"$event.stopPropagation()\">\n                                @if (inlineEditingTemplateRef && !cellEditing[i +'_'+column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"inlineEditingTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                }\n                                @if (cellEditingTemplateRef && !(row.editable)) {\n                                    <ng-container [ngTemplateOutlet]=\"cellEditingTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                }\n                                @if (!inlineEditingTemplateRef && (row.editable) && rowDataTemp['e'+i]) {\n                                    @if (column.type == 'number') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'string') {\n                                        <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'textarea') {\n                                        <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                            <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'date') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'datepicker') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput [matDatepicker]=\"inlinePicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                            <mat-datepicker-toggle matIconSuffix [for]=\"inlinePicker\"></mat-datepicker-toggle>\n                                            <mat-datepicker #inlinePicker></mat-datepicker>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'selection') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                @for (option of column.options; track option) {\n                                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                }\n                                            </mat-select>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'boolean') {\n                                        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                    }\n                                }\n                                @if (!cellEditingTemplateRef && cellEditing[i +'_'+column.field]) {\n                                    @if (column.type == 'number') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'string') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'textarea') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'date') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'datepicker') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput [matDatepicker]=\"cellPicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                            <mat-datepicker-toggle matIconSuffix [for]=\"cellPicker\"></mat-datepicker-toggle>\n                                            <mat-datepicker #cellPicker></mat-datepicker>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'selection') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                @for (option of column.options; track option) {\n                                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                }\n                                            </mat-select>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'boolean') {\n                                        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                    }\n                                }\n                            </div>\n                        }\n                    </td>\n                    @if (showFooterRow) {\n                        <td mat-footer-cell *matFooterCellDef> {{column.footerText}} </td>\n                    }\n                    </div>\n                }\n                <ng-container matColumnDef=\"edit\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Edit </th>\n                    <td mat-cell *matCellDef=\"let row; let i = dataIndex\" class=\"inline-edit-column-cell\">\n                        <!-- Edit disabled in pinned top table -->\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef> edit </td>\n                </ng-container>\n                <ng-container matColumnDef=\"popup\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Popup\n                    </th>\n                    <td mat-cell *matCellDef=\"let row; let i = index\">\n                        <!-- Popup edit disabled in pinned top table -->\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"delete\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Delete\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <mat-icon (click)=\"deleteRow(row,i)\" aria-hidden=\"false\" aria-label=\"Example home icon\"\n                            fontIcon=\"delete\">\n                        </mat-icon>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"hide\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Hide\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <button mat-icon-button (click)=\"toggleRowHide(i)\" \n                            [matTooltip]=\"isRowHidden(i) ? 'Unhide Row' : 'Hide Row'\"\n                            matTooltipPosition=\"above\">\n                            <mat-icon [color]=\"isRowHidden(i) ? 'primary' : ''\" aria-hidden=\"false\">\n                                {{ isRowHidden(i) ? 'visibility_off' : 'visibility' }}\n                            </mat-icon>\n                        </button>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"pin\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Pinning\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <button mat-icon-button \n                            [matMenuTriggerFor]=\"pinMenu\"\n                            (click)=\"openRowPinMenu($event, row)\"\n                            [matTooltip]=\"getRowPinPosition(row) ? 'Pinned ' + getRowPinPosition(row) : 'Pin Row'\"\n                            matTooltipPosition=\"above\">\n                            <mat-icon [color]=\"isRowPinned(row) ? 'primary' : ''\" aria-hidden=\"false\">\n                                {{ isRowPinned(row) ? 'push_pin' : 'push_pin' }}\n                            </mat-icon>\n                        </button>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n                @if (expandRows) {\n                    <ng-container matColumnDef=\"expandedDetail\">\n                        <td mat-cell *matCellDef=\"let element;let i=dataIndex \"\n                            [attr.colspan]=\"columnsToDisplayWithExpand.length\">\n                            <div class=\"example-element-detail\"\n                                [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\">\n                                @if (expansionTemplateRef) {\n                                    <ng-container [ngTemplateOutlet]=\"expansionTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{$explicit:element,row:element,index:i}\">\n                                    </ng-container>\n                                }\n                            </div>\n                        </td>\n                    </ng-container>\n                }\n                <!-- Column group headers -->\n                @if (columnGroups.length > 0) {\n                    @for (group of columnGroups; track group.name) {\n                        <ng-container [matColumnDef]=\"'group-' + group.name\">\n                            <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"group.colspan || group.columns.length\" \n                                class=\"group-header-cell\">\n                                <div class=\"group-header-content\">\n                                    <span class=\"group-label\">{{group.label}}</span>\n                                </div>\n                            </th>\n                        </ng-container>\n                    }\n                    <!-- Empty header cells for ungrouped columns -->\n                    @for (column of columnsArray; track column.field) {\n                        <ng-container [matColumnDef]=\"'ungrouped-' + column.field\">\n                            <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\">\n                            </th>\n                        </ng-container>\n                    }\n                    <!-- Empty header cells for action columns to fill space in group header -->\n                    <ng-container [matColumnDef]=\"'ungrouped-select'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'ungrouped-edit'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'ungrouped-popup'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'ungrouped-delete'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'ungrouped-freeze'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'ungrouped-hide'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'ungrouped-pin'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\"></th>\n                    </ng-container>\n                }\n                <!-- Filter row columns for data columns -->\n                @for (ids of headersFiltersIds; track ids; let i = $index) {\n                    <ng-container [matColumnDef]=\"ids\" [sticky]=\"columnsArray[$index].pinned === 'left'\" [stickyEnd]=\"columnsArray[$index].pinned === 'right'\">\n                        <th mat-header-cell *matHeaderCellDef  [style.minWidth]=\"columnsArray[$index].width\" [style.maxWidth]=\"columnsArray[$index].maxWidth?columnsArray[$index].maxWidth:columnsArray[$index].width\"\n                        [style.minWidth]=\"columnsArray[$index].minWidth\" >\n                            <div style=\"display: block; width: 100%;\" class=\"filters-container\" [class.animate]=\"toggleFilters\">\n                                <app-filter-columns-component style=\"display: block; width: 100%;\" [obj]=\"columnsArray[returnIndex(ids)]\"\n                                    (filterOutput)=\"applyColumnFilter($event,columnsArray[returnIndex(ids)])\"></app-filter-columns-component>\n                            </div>\n                        </th>\n                    </ng-container>\n                }\n                <!-- Empty filter cells for action columns -->\n                <ng-container [matColumnDef]=\"'filter-select'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-edit'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-popup'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-delete'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-freeze'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-hide'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-pin'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                @if (columnGroups.length > 0) {\n                    <tr mat-header-row *matHeaderRowDef=\"getGroupedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row group-header-row\"></tr>\n                }\n                <tr mat-header-row *matHeaderRowDef=\" getDisplayedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row\"></tr>\n                <tr style=\"height: 0px;\" mat-header-row class=\"no-default-height\" *matHeaderRowDef=\"getFilterColumns()\">\n                </tr>\n                \n                <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; \" \n                    class=\"mat-mdc-row data-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'mat-row-sticky-top': isRowPinnedTop(row),\n                      'mat-row-sticky-bottom': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr>\n           \n                @if (expandRows) {\n                    <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']; let i=dataIndex\"\n                        class=\"example-detail-row\"\n                        [ngClass]=\"{'hidden': isRowHidden(i)}\">\n                    </tr>\n                }\n                @if (showFooterRow) {\n                    <tr mat-footer-row *matFooterRowDef=\"getDisplayedColumns(); sticky: stickyFooter\"></tr>\n                }\n            </table>\n            </div>\n            \n            <table mat-table #matTable #MyTable [id]=\"'matTableExt'+tableID\" [dataSource]=\"dataSource\" matSort cdkDropList\n                cdkDropListOrientation=\"horizontal\" multiTemplateDataRows (cdkDropListDropped)=\"onDrop($event)\"\n                (click)=\"saveCellEditing()\" [style.width]=\"scrollbarH?'max-content':'100%'\" \n                [class]=\"'mat-mdc-table' + (tableClassName ? ' ' + tableClassName : '')\">\n    \n                <!-- Row selection column -->\n                <ng-container matColumnDef=\"select\">\n                    <th mat-header-cell *matHeaderCellDef cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\">\n                        <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n                            [checked]=\"selection.hasValue() && isAllSelected()\"\n                            [indeterminate]=\"selection.hasValue() && !isAllSelected()\" [aria-label]=\"checkboxLabel()\">\n                        </mat-checkbox>\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i = dataIndex\">\n                        <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? setSelectedRows(row,i) : null\"\n                            [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n                        </mat-checkbox>\n                    </td>\n                    <ng-container *ngIf=\"showFooterRow\">\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n                </ng-container>\n                <!--dynamic columns are being generated here-->\n                @for (column of columnsArray; track column.field + '_' + column.pinned; let i = $index) {\n                    <div matColumnDef=\"{{column['field']}}\" [sticky]=\"column.pinned === 'left'\" [stickyEnd]=\"column.pinned === 'right'\">\n                    <th mat-header-cell *matHeaderCellDef [style.minWidth]=\"column.width\" [style.maxWidth]=\"column.maxWidth?column.maxWidth:column.width\"\n                        [style.minWidth]=\"column.minWidth\" cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\"\n                        [columnsResizable]=\"columnResizable\" [index]=\"i\" class=\"mat-mdc-header-cell\"\n                        [mat-sort-header]=\"column.field\" [disabled]=\"!sorting || column.disabled === true\">\n    \n                        @if (column.headerTemplate || headerTemplateRef) {\n                            <ng-template [ngTemplateOutlet]=\"column.headerTemplate || headerTemplateRef\"\n                                [ngTemplateOutletContext]=\"{data:column}\"></ng-template>\n                        }\n                        @if (!headerTemplateRef && !column.headerTemplate) {\n                            <span matTooltip=\"{{column.headerTooltip?.value}}\"\n                                [matTooltipPosition]=\"column?.headerTooltip?.tooltipPosition!\"\n                                [class.disabled]=\"!sorting || column.disabled === true\">{{column.header}}</span>\n                        }\n                    </th>\n                    <td mat-cell *matCellDef=\"let row ;let i=dataIndex\" class=\"mat-mdc-cell\">\n                        @if (!row.editable && !cellEditing[i +'_'+column.field]) {\n                            <div (dblclick)=\"cellEditing[i +'_'+column.field] = inCellEditing;setCellData(row,i)\"\n                                (click)=\"cellPopupEditing ? openCellPopupDialog(row, column, i) : null\"\n                                [style.cursor]=\"cellPopupEditing ? 'pointer' : 'default'\"\n                                matTooltip=\"{{column.cellTooltip?.value}}\"\n                                [matTooltipPosition]=\"column?.cellTooltip?.tooltipPosition!\">\n                                @if (!cellTemplateRef && !column?.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <span>{{row[column.field]}}</span>\n                                }\n                                @if (cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"cellTemplateRefMap[column.field]\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (!cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (cellTemplateRef && !column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"cellTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                            </div>\n                        }\n                        @if (row.editable || cellEditing[i +'_'+column.field]) {\n                            <div (click)=\"$event.stopPropagation()\">\n                                @if (inlineEditingTemplateRef && !cellEditing[i +'_'+column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"inlineEditingTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                }\n                                @if (cellEditingTemplateRef && !(row.editable)) {\n                                    <ng-container [ngTemplateOutlet]=\"cellEditingTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                }\n                                @if (!inlineEditingTemplateRef && (row.editable) && rowDataTemp['e'+i]) {\n                                    @if (column.type == 'number') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'string') {\n                                        <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'textarea') {\n                                        <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                            <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'date') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'datepicker') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput [matDatepicker]=\"inlinePicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                            <mat-datepicker-toggle matIconSuffix [for]=\"inlinePicker\"></mat-datepicker-toggle>\n                                            <mat-datepicker #inlinePicker></mat-datepicker>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'selection') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                @for (option of column.options; track option) {\n                                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                }\n                                            </mat-select>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'boolean') {\n                                        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                    }\n                                }\n                                @if (!cellEditingTemplateRef && cellEditing[i +'_'+column.field]) {\n                                    @if (column.type == 'number') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'string') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'textarea') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'date') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'datepicker') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput [matDatepicker]=\"cellPicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                            <mat-datepicker-toggle matIconSuffix [for]=\"cellPicker\"></mat-datepicker-toggle>\n                                            <mat-datepicker #cellPicker></mat-datepicker>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'selection') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                @for (option of column.options; track option) {\n                                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                }\n                                            </mat-select>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'boolean') {\n                                        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                    }\n                                }\n                            </div>\n                        }\n                    </td>\n                    @if (showFooterRow) {\n                        <td mat-footer-cell *matFooterCellDef> {{column.footerText}} </td>\n                    }\n                    </div>\n                }\n                <ng-container matColumnDef=\"edit\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Edit </th>\n                    <td mat-cell *matCellDef=\"let row; let i = dataIndex\" class=\"inline-edit-column-cell\">\n                        @if (!row.editable && !row.editmodal) {\n                            <mat-icon class=\"edit-column-icons\" aria-hidden=\"false\"\n                                (click)=\"enableInlineEditing(row,i)\" fontIcon=\"edit_note\">\n                            </mat-icon>\n                        }\n                        @if (row.editable && !row.editmodal) {\n                            <div class=\"inline-editing-controls\">\n                                <mat-icon class=\"edit-column-icons\" aria-hidden=\"false\" (click)=\"saveInlineEditing(row,i)\"\n                                    fontIcon=\"done\"></mat-icon>\n                                <mat-icon class=\"edit-column-icons\" aria-hidden=\"false\" (click)=\"cancelInlineEditing(row,i)\"\n                                    fontIcon=\"close\"></mat-icon>\n                            </div>\n                        }\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef> edit </td>\n                </ng-container>\n                <ng-container matColumnDef=\"popup\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Popup\n                    </th>\n                    <td mat-cell *matCellDef=\"let row; let i = index\">\n                        <mat-icon aria-hidden=\"false\" (click)=\"openEditingDialog(row)\" fontIcon=\"edit\">\n                        </mat-icon>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"delete\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Delete\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <mat-icon (click)=\"deleteRow(row,i)\" aria-hidden=\"false\" aria-label=\"Example home icon\"\n                            fontIcon=\"delete\">\n                        </mat-icon>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"hide\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Hide\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <button mat-icon-button (click)=\"toggleRowHide(i)\" \n                            [matTooltip]=\"isRowHidden(i) ? 'Unhide Row' : 'Hide Row'\"\n                            matTooltipPosition=\"above\">\n                            <mat-icon [color]=\"isRowHidden(i) ? 'primary' : ''\" aria-hidden=\"false\">\n                                {{ isRowHidden(i) ? 'visibility_off' : 'visibility' }}\n                            </mat-icon>\n                        </button>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"pin\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Pin\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <button mat-icon-button \n                            [matMenuTriggerFor]=\"pinMenu\"\n                            (click)=\"openRowPinMenu($event, row)\"\n                            [matTooltip]=\"getRowPinPosition(row) ? 'Pinned ' + getRowPinPosition(row) : 'Pin Row'\"\n                            matTooltipPosition=\"above\">\n                            <mat-icon [color]=\"isRowPinned(row) ? 'primary' : ''\" aria-hidden=\"false\">\n                                {{ isRowPinned(row) ? 'push_pin' : 'push_pin' }}\n                            </mat-icon>\n                        </button>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n                @if (expandRows) {\n                    <ng-container matColumnDef=\"expandedDetail\">\n                        <td mat-cell *matCellDef=\"let element;let i=dataIndex \"\n                            [attr.colspan]=\"columnsToDisplayWithExpand.length\">\n                            <div class=\"example-element-detail\"\n                                [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\">\n                                @if (expansionTemplateRef) {\n                                    <ng-container [ngTemplateOutlet]=\"expansionTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{$explicit:element,row:element,index:i}\">\n                                    </ng-container>\n                                }\n                            </div>\n                        </td>\n                    </ng-container>\n                }\n                <!-- Column group headers -->\n                <!-- @if (columnGroups.length > 0) {\n                    @for (group of columnGroups; track group.name) {\n                        <ng-container [matColumnDef]=\"'group-' + group.name\">\n                            <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"group.colspan || group.columns.length\" \n                                class=\"group-header-cell\">\n                                <div class=\"group-header-content\">\n                                    <span class=\"group-label\">{{group.label}}</span>\n                                </div>\n                            </th>\n                        </ng-container>\n                    }\n                    @for (column of columnsArray; track column.field) {\n                        <ng-container [matColumnDef]=\"'ungrouped-' + column.field\">\n                            <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\">\n                            </th>\n                        </ng-container>\n                    }\n                } -->\n                <!-- @if (columnGroups.length > 0) {\n                    <tr mat-header-row *matHeaderRowDef=\"getGroupedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row group-header-row\"></tr>\n                } -->\n                <tr style=\"display:none\" mat-header-row *matHeaderRowDef=\" getDisplayedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row\"></tr>\n                \n                <!-- All Data Rows (with dynamic pinning classes) -->\n                <!-- <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex;\" \n                    class=\"mat-mdc-row data-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'pinned-top-row': isRowPinnedTop(row),\n                      'pinned-bottom-row': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr> -->\n                <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; \" \n                    class=\"mat-mdc-row data-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'mat-row-sticky-top': isRowPinnedTop(row),\n                      'mat-row-sticky-bottom': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr>\n                <!-- <tr mat-header-row *matHeaderRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; when: isRowPinnedTop(row)\" \n                    class=\"mat-mdc-row data-row\"\n                    class=\"mat-mdc-header-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'pinned-top-row': isRowPinnedTop(row),\n                      'pinned-bottom-row': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr> -->\n           \n                @if (expandRows) {\n                    <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']; let i=dataIndex\"\n                        class=\"example-detail-row\"\n                        [ngClass]=\"{'hidden': isRowHidden(i)}\">\n                    </tr>\n                }\n                @if (showFooterRow) {\n                    <tr mat-footer-row *matFooterRowDef=\"getDisplayedColumns(); sticky: stickyFooter\"></tr>\n                }\n            </table>\n            @if (pinnedBtmDataSource && pinnedBtmDataSource.data.length > 0) {\n                <div [style.max-height]=\"bottomPinnedMaxHeight\" [style.overflow]=\"bottomPinnedMaxHeight ? 'auto' : 'visible'\" \n                     [style.position]=\"'sticky'\" [style.bottom]=\"'0'\" [style.z-index]=\"'111'\">\n                <table style=\"width: 100%;\"  mat-table #matTable #MyTable [id]=\"'matTableExtBtm'+tableID\" [dataSource]=\"pinnedBtmDataSource\" matSort cdkDropList\n                    cdkDropListOrientation=\"horizontal\" multiTemplateDataRows (cdkDropListDropped)=\"onDrop($event)\"\n                    (click)=\"saveCellEditing()\" [style.width]=\"scrollbarH?'max-content':'100%'\" \n                    [class]=\"'mat-mdc-table' + (tableClassName ? ' ' + tableClassName : '')\">\n        \n                    <!-- Row selection column -->\n                    <ng-container matColumnDef=\"select\">\n                        <th mat-header-cell *matHeaderCellDef cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\">\n                            <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n                                [checked]=\"selection.hasValue() && isAllSelected()\"\n                                [indeterminate]=\"selection.hasValue() && !isAllSelected()\" [aria-label]=\"checkboxLabel()\">\n                            </mat-checkbox>\n                        </th>\n                        <td mat-cell *matCellDef=\"let row;let i = dataIndex\">\n                            <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? setSelectedRows(row,i) : null\"\n                                [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n                            </mat-checkbox>\n                        </td>\n                        <ng-container *ngIf=\"showFooterRow\">\n                            <td mat-footer-cell *matFooterCellDef></td>\n                        </ng-container>\n                    </ng-container>\n                    <!--dynamic columns are being generated here-->\n                    @for (column of columnsArray; track column.field + '_' + column.pinned; let i = $index) {\n                        <div matColumnDef=\"{{column['field']}}\" [sticky]=\"column.pinned === 'left'\" [stickyEnd]=\"column.pinned === 'right'\">\n                        <th mat-header-cell *matHeaderCellDef [style.minWidth]=\"column.width\" [style.maxWidth]=\"column.maxWidth?column.maxWidth:column.width\"\n                            [style.minWidth]=\"column.minWidth\" cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\"\n                            [columnsResizable]=\"columnResizable\" [index]=\"i\" class=\"mat-mdc-header-cell\"\n                            [mat-sort-header]=\"column.field\" [disabled]=\"!sorting || column.disabled === true\">\n        \n                            @if (column.headerTemplate || headerTemplateRef) {\n                                <ng-template [ngTemplateOutlet]=\"column.headerTemplate || headerTemplateRef\"\n                                    [ngTemplateOutletContext]=\"{data:column}\"></ng-template>\n                            }\n                            @if (!headerTemplateRef && !column.headerTemplate) {\n                                <span matTooltip=\"{{column.headerTooltip?.value}}\"\n                                    [matTooltipPosition]=\"column?.headerTooltip?.tooltipPosition!\"\n                                    [class.disabled]=\"!sorting || column.disabled === true\">{{column.header}}</span>\n                            }\n                        </th>\n                        <td mat-cell *matCellDef=\"let row ;let i=dataIndex\" class=\"mat-mdc-cell\">\n                            @if (!row.editable && !cellEditing[i +'_'+column.field]) {\n                                <div [style.cursor]=\"'default'\"\n                                    matTooltip=\"{{column.cellTooltip?.value}}\"\n                                    [matTooltipPosition]=\"column?.cellTooltip?.tooltipPosition!\">\n                                    @if (!cellTemplateRef && !column?.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                        <span>{{row[column.field]}}</span>\n                                    }\n                                    @if (cellTemplateRefMap[column.field]) {\n                                        <ng-container [ngTemplateOutlet]=\"cellTemplateRefMap[column.field]\"\n                                            [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                        </ng-container>\n                                    }\n                                    @if (cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                        <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                            [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                        </ng-container>\n                                    }\n                                    @if (!cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                        <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                            [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                        </ng-container>\n                                    }\n                                    @if (cellTemplateRef && !column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                        <ng-container [ngTemplateOutlet]=\"cellTemplateRef\"\n                                            [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                        </ng-container>\n                                    }\n                                </div>\n                            }\n                            @if (row.editable || cellEditing[i +'_'+column.field]) {\n                                <div (click)=\"$event.stopPropagation()\">\n                                    @if (inlineEditingTemplateRef && !cellEditing[i +'_'+column.field]) {\n                                        <ng-container [ngTemplateOutlet]=\"inlineEditingTemplateRef\"\n                                            [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                    }\n                                    @if (cellEditingTemplateRef && !(row.editable)) {\n                                        <ng-container [ngTemplateOutlet]=\"cellEditingTemplateRef\"\n                                            [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                    }\n                                    @if (!inlineEditingTemplateRef && (row.editable) && rowDataTemp['e'+i]) {\n                                        @if (column.type == 'number') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'string') {\n                                            <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'textarea') {\n                                            <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                                <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'date') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'datepicker') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput [matDatepicker]=\"inlinePicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                                <mat-datepicker-toggle matIconSuffix [for]=\"inlinePicker\"></mat-datepicker-toggle>\n                                                <mat-datepicker #inlinePicker></mat-datepicker>\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'selection') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                    @for (option of column.options; track option) {\n                                                        <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                    }\n                                                </mat-select>\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'boolean') {\n                                            <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                        }\n                                    }\n                                    @if (!cellEditingTemplateRef && cellEditing[i +'_'+column.field]) {\n                                        @if (column.type == 'number') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'string') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'textarea') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'date') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'datepicker') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <input matInput [matDatepicker]=\"cellPicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [ngModelOptions]=\"{standalone: true}\">\n                                                <mat-datepicker-toggle matIconSuffix [for]=\"cellPicker\"></mat-datepicker-toggle>\n                                                <mat-datepicker #cellPicker></mat-datepicker>\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'selection') {\n                                            <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                                <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                    [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                    @for (option of column.options; track option) {\n                                                        <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                    }\n                                                </mat-select>\n                                            </mat-form-field>\n                                        }\n                                        @if (column.type == 'boolean') {\n                                            <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                        }\n                                    }\n                                </div>\n                            }\n                        </td>\n                        @if (showFooterRow) {\n                            <td mat-footer-cell *matFooterCellDef> {{column.footerText}} </td>\n                        }\n                        </div>\n                    }\n                    <ng-container matColumnDef=\"edit\" stickyEnd=\"false\">\n                        <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                            class=\"action-column-cells\"> Edit </th>\n                        <td mat-cell *matCellDef=\"let row; let i = dataIndex\" class=\"inline-edit-column-cell\">\n                            <!-- Edit disabled in pinned bottom table -->\n                        </td>\n                        <td mat-footer-cell *matFooterCellDef> edit </td>\n                    </ng-container>\n                    <ng-container matColumnDef=\"popup\" stickyEnd=\"false\">\n                        <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                            class=\"action-column-cells\"> Popup\n                        </th>\n                        <td mat-cell *matCellDef=\"let row; let i = index\">\n                            <!-- Popup edit disabled in pinned bottom table -->\n                        </td>\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n        \n                    <ng-container matColumnDef=\"delete\">\n                        <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                            class=\"action-column-cells\"> Delete\n                        </th>\n                        <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                            <mat-icon (click)=\"deleteRow(row,i)\" aria-hidden=\"false\" aria-label=\"Example home icon\"\n                                fontIcon=\"delete\">\n                            </mat-icon>\n                        </td>\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n        \n                    <ng-container matColumnDef=\"hide\" stickyEnd=\"false\">\n                        <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                            class=\"action-column-cells\"> Hide\n                        </th>\n                        <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                            <button mat-icon-button (click)=\"toggleRowHide(i)\" \n                                [matTooltip]=\"isRowHidden(i) ? 'Unhide Row' : 'Hide Row'\"\n                                matTooltipPosition=\"above\">\n                                <mat-icon [color]=\"isRowHidden(i) ? 'primary' : ''\" aria-hidden=\"false\">\n                                    {{ isRowHidden(i) ? 'visibility_off' : 'visibility' }}\n                                </mat-icon>\n                            </button>\n                        </td>\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n        \n                    <ng-container matColumnDef=\"pin\" stickyEnd=\"false\">\n                        <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                            class=\"action-column-cells\"> Pin\n                        </th>\n                        <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                            <button mat-icon-button \n                                [matMenuTriggerFor]=\"pinMenu\"\n                                (click)=\"openRowPinMenu($event, row)\"\n                                [matTooltip]=\"getRowPinPosition(row) ? 'Pinned ' + getRowPinPosition(row) : 'Pin Row'\"\n                                matTooltipPosition=\"above\">\n                                <mat-icon [color]=\"isRowPinned(row) ? 'primary' : ''\" aria-hidden=\"false\">\n                                    {{ isRowPinned(row) ? 'push_pin' : 'push_pin' }}\n                                </mat-icon>\n                            </button>\n                        </td>\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n        \n                    <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n                    @if (expandRows) {\n                        <ng-container matColumnDef=\"expandedDetail\">\n                            <td mat-cell *matCellDef=\"let element;let i=dataIndex \"\n                                [attr.colspan]=\"columnsToDisplayWithExpand.length\">\n                                <div class=\"example-element-detail\"\n                                    [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\">\n                                    @if (expansionTemplateRef) {\n                                        <ng-container [ngTemplateOutlet]=\"expansionTemplateRef\"\n                                            [ngTemplateOutletContext]=\"{$explicit:element,row:element,index:i}\">\n                                        </ng-container>\n                                    }\n                                </div>\n                            </td>\n                        </ng-container>\n                    }\n                    <!-- Column group headers -->\n                    @if (columnGroups.length > 0) {\n                        @for (group of columnGroups; track group.name) {\n                            <ng-container [matColumnDef]=\"'group-' + group.name\">\n                                <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"group.colspan || group.columns.length\" \n                                    class=\"group-header-cell\">\n                                    <div class=\"group-header-content\">\n                                        <span class=\"group-label\">{{group.label}}</span>\n                                    </div>\n                                </th>\n                            </ng-container>\n                        }\n                        <!-- Empty header cells for ungrouped columns -->\n                        @for (column of columnsArray; track column.field) {\n                            <ng-container [matColumnDef]=\"'ungrouped-' + column.field\">\n                                <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\">\n                                </th>\n                            </ng-container>\n                        }\n                    }\n                    <!-- Empty filter cells for action columns -->\n                    <ng-container [matColumnDef]=\"'filter-select'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'filter-edit'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'filter-popup'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'filter-delete'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'filter-freeze'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'filter-hide'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    <ng-container [matColumnDef]=\"'filter-pin'\">\n                        <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                    </ng-container>\n                    @if (columnGroups.length > 0) {\n                        <tr mat-header-row *matHeaderRowDef=\"getGroupedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row group-header-row\"></tr>\n                    }\n                    <!-- <tr mat-header-row *matHeaderRowDef=\" getDisplayedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row\"></tr> -->\n                    <tr style=\"display:none\" mat-header-row *matHeaderRowDef=\" getDisplayedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row\"></tr>\n                    \n                    <!-- All Data Rows (with dynamic pinning classes) -->\n                    <!-- <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex;\" \n                        class=\"mat-mdc-row data-row\"\n                        [ngClass]=\"{\n                          'data-row':expandRows,\n                          'stripedRows':(stripedRows &&  i % 2 == 1),\n                          'hoverClass':rowHover, \n                          'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                          'example-expanded-row':expandedElement === row,\n                          'pinned-row': isRowPinned(row),\n                          'pinned-top-row': isRowPinnedTop(row),\n                          'pinned-bottom-row': isRowPinnedBottom(row)\n                        }\"\n                        (click)=\"expandRow(row, row !== expandedElement,i)\">\n                    </tr> -->\n                    <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; \" \n                        class=\"mat-mdc-row data-row\"\n                        [ngClass]=\"{\n                          'data-row':expandRows,\n                          'stripedRows':(stripedRows &&  i % 2 == 1),\n                          'hoverClass':rowHover, \n                          'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                          'example-expanded-row':expandedElement === row,\n                          'pinned-row': isRowPinned(row),\n                          'mat-row-sticky-top': isRowPinnedTop(row),\n                          'mat-row-sticky-bottom': isRowPinnedBottom(row)\n                        }\"\n                        (click)=\"expandRow(row, row !== expandedElement,i)\">\n                    </tr>\n                    <!-- <tr mat-header-row *matHeaderRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; when: isRowPinnedTop(row)\" \n                        class=\"mat-mdc-row data-row\"\n                        class=\"mat-mdc-header-row\"\n                        [ngClass]=\"{\n                          'data-row':expandRows,\n                          'stripedRows':(stripedRows &&  i % 2 == 1),\n                          'hoverClass':rowHover, \n                          'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                          'example-expanded-row':expandedElement === row,\n                          'pinned-row': isRowPinned(row),\n                          'pinned-top-row': isRowPinnedTop(row),\n                          'pinned-bottom-row': isRowPinnedBottom(row)\n                        }\"\n                        (click)=\"expandRow(row, row !== expandedElement,i)\">\n                    </tr> -->\n               \n                    @if (expandRows) {\n                        <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']; let i=dataIndex\"\n                            class=\"example-detail-row\"\n                            [ngClass]=\"{'hidden': isRowHidden(i)}\">\n                        </tr>\n                    }\n                    @if (showFooterRow) {\n                        <tr mat-footer-row *matFooterRowDef=\"getDisplayedColumns(); sticky: stickyFooter\"></tr>\n                    }\n                </table>\n                </div>\n            }\n        }\n        @else{\n            <table mat-table #matTable #MyTable [id]=\"'matTableExt'+tableID\" [dataSource]=\"dataSource\" matSort cdkDropList\n                cdkDropListOrientation=\"horizontal\" multiTemplateDataRows (cdkDropListDropped)=\"onDrop($event)\"\n                (click)=\"saveCellEditing()\" [style.width]=\"scrollbarH?'max-content':'100%'\" \n                [class]=\"'mat-mdc-table' + (tableClassName ? ' ' + tableClassName : '')\">\n    \n                <!-- Row selection column -->\n                <ng-container matColumnDef=\"select\">\n                    <th mat-header-cell *matHeaderCellDef cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\">\n                        <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n                            [checked]=\"selection.hasValue() && isAllSelected()\"\n                            [indeterminate]=\"selection.hasValue() && !isAllSelected()\" [aria-label]=\"checkboxLabel()\">\n                        </mat-checkbox>\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i = dataIndex\">\n                        <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? setSelectedRows(row,i) : null\"\n                            [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n                        </mat-checkbox>\n                    </td>\n                    <ng-container *ngIf=\"showFooterRow\">\n                        <td mat-footer-cell *matFooterCellDef></td>\n                    </ng-container>\n                </ng-container>\n                <!--dynamic columns are being generated here-->\n                @for (column of columnsArray; track column.field + '_' + column.pinned; let i = $index) {\n                    <div matColumnDef=\"{{column['field']}}\" [sticky]=\"column.pinned === 'left'\" [stickyEnd]=\"column.pinned === 'right'\">\n                    <th mat-header-cell *matHeaderCellDef [style.minWidth]=\"column.width\" [style.maxWidth]=\"column.maxWidth?column.maxWidth:column.width\"\n                        [style.minWidth]=\"column.minWidth\" cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"!dndColumns\"\n                        [columnsResizable]=\"columnResizable\" [index]=\"i\" class=\"mat-mdc-header-cell\"\n                        [mat-sort-header]=\"column.field\" [disabled]=\"!sorting || column.disabled === true\">\n    \n                        @if (column.headerTemplate || headerTemplateRef) {\n                            <ng-template [ngTemplateOutlet]=\"column.headerTemplate || headerTemplateRef\"\n                                [ngTemplateOutletContext]=\"{data:column}\"></ng-template>\n                        }\n                        @if (!headerTemplateRef && !column.headerTemplate) {\n                            <span matTooltip=\"{{column.headerTooltip?.value}}\"\n                                [matTooltipPosition]=\"column?.headerTooltip?.tooltipPosition!\"\n                                [class.disabled]=\"!sorting || column.disabled === true\">{{column.header}}</span>\n                        }\n                    </th>\n                    <td mat-cell *matCellDef=\"let row ;let i=dataIndex\" class=\"mat-mdc-cell\">\n                        @if (!row.editable && !cellEditing[i +'_'+column.field]) {\n                            <div (dblclick)=\"cellEditing[i +'_'+column.field] = inCellEditing;setCellData(row,i)\"\n                                (click)=\"cellPopupEditing ? openCellPopupDialog(row, column, i) : null\"\n                                [style.cursor]=\"cellPopupEditing ? 'pointer' : 'default'\"\n                                matTooltip=\"{{column.cellTooltip?.value}}\"\n                                [matTooltipPosition]=\"column?.cellTooltip?.tooltipPosition!\">\n                                @if (!cellTemplateRef && !column?.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <span>{{row[column.field]}}</span>\n                                }\n                                @if (cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"cellTemplateRefMap[column.field]\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (!cellTemplateRef && column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"column.cellTemplate\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                                @if (cellTemplateRef && !column.cellTemplate && !cellTemplateRefMap[column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"cellTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{row:row,column:column,index:i}\">\n                                    </ng-container>\n                                }\n                            </div>\n                        }\n                        @if (row.editable || cellEditing[i +'_'+column.field]) {\n                            <div (click)=\"$event.stopPropagation()\">\n                                @if (inlineEditingTemplateRef && !cellEditing[i +'_'+column.field]) {\n                                    <ng-container [ngTemplateOutlet]=\"inlineEditingTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                }\n                                @if (cellEditingTemplateRef && !(row.editable)) {\n                                    <ng-container [ngTemplateOutlet]=\"cellEditingTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{data:getInlineEditingData(row,i,column)}\"></ng-container>\n                                }\n                                @if (!inlineEditingTemplateRef && (row.editable) && rowDataTemp['e'+i]) {\n                                    @if (column.type == 'number') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'string') {\n                                        <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'textarea') {\n                                        <mat-form-field style=\"width: 100%;\" appearance=\"outline\" class=\"inline-editing-field\">\n                                            <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'date') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'datepicker') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput [matDatepicker]=\"inlinePicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                            <mat-datepicker-toggle matIconSuffix [for]=\"inlinePicker\"></mat-datepicker-toggle>\n                                            <mat-datepicker #inlinePicker></mat-datepicker>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'selection') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                @for (option of column.options; track option) {\n                                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                }\n                                            </mat-select>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'boolean') {\n                                        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                    }\n                                }\n                                @if (!cellEditingTemplateRef && cellEditing[i +'_'+column.field]) {\n                                    @if (column.type == 'number') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"number\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'string') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"text\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'textarea') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <textarea matInput rows=\"3\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\"></textarea>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'date') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput type=\"date\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'datepicker') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <input matInput [matDatepicker]=\"cellPicker\" [(ngModel)]=\"rowDataTemp['e'+i][column.field]\"\n                                                [ngModelOptions]=\"{standalone: true}\">\n                                            <mat-datepicker-toggle matIconSuffix [for]=\"cellPicker\"></mat-datepicker-toggle>\n                                            <mat-datepicker #cellPicker></mat-datepicker>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'selection') {\n                                        <mat-form-field appearance=\"outline\" class=\"inline-editing-field\">\n                                            <mat-select [value]=\"rowDataTemp['e'+i][column.field]\"\n                                                [(ngModel)]=\"rowDataTemp['e'+i][column.field]\">\n                                                @for (option of column.options; track option) {\n                                                    <mat-option [value]=\"option\">{{option}}</mat-option>\n                                                }\n                                            </mat-select>\n                                        </mat-form-field>\n                                    }\n                                    @if (column.type == 'boolean') {\n                                        <mat-checkbox (click)=\"$event.stopPropagation()\" color=\"primary\" [(ngModel)]=\"row[column.field]\"></mat-checkbox>\n                                    }\n                                }\n                            </div>\n                        }\n                    </td>\n                    @if (showFooterRow) {\n                        <td mat-footer-cell *matFooterCellDef> {{column.footerText}} </td>\n                    }\n                    </div>\n                }\n                <ng-container matColumnDef=\"edit\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Edit </th>\n                    <td mat-cell *matCellDef=\"let row; let i = dataIndex\" class=\"inline-edit-column-cell\">\n                        @if (!row.editable && !row.editmodal) {\n                            <mat-icon class=\"edit-column-icons\" aria-hidden=\"false\"\n                                (click)=\"enableInlineEditing(row,i)\" fontIcon=\"edit_note\">\n                            </mat-icon>\n                        }\n                        @if (row.editable && !row.editmodal) {\n                            <div class=\"inline-editing-controls\">\n                                <mat-icon class=\"edit-column-icons\" aria-hidden=\"false\" (click)=\"saveInlineEditing(row,i)\"\n                                    fontIcon=\"done\"></mat-icon>\n                                <mat-icon class=\"edit-column-icons\" aria-hidden=\"false\" (click)=\"cancelInlineEditing(row,i)\"\n                                    fontIcon=\"close\"></mat-icon>\n                            </div>\n                        }\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef> edit </td>\n                </ng-container>\n                <ng-container matColumnDef=\"popup\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Popup\n                    </th>\n                    <td mat-cell *matCellDef=\"let row; let i = index\">\n                        <mat-icon aria-hidden=\"false\" (click)=\"openEditingDialog(row)\" fontIcon=\"edit\">\n                        </mat-icon>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"delete\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Delete\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <mat-icon (click)=\"deleteRow(row,i)\" aria-hidden=\"false\" aria-label=\"Example home icon\"\n                            fontIcon=\"delete\">\n                        </mat-icon>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"hide\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Hide\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <button mat-icon-button (click)=\"toggleRowHide(i)\" \n                            [matTooltip]=\"isRowHidden(i) ? 'Unhide Row' : 'Hide Row'\"\n                            matTooltipPosition=\"above\">\n                            <mat-icon [color]=\"isRowHidden(i) ? 'primary' : ''\" aria-hidden=\"false\">\n                                {{ isRowHidden(i) ? 'visibility_off' : 'visibility' }}\n                            </mat-icon>\n                        </button>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <ng-container matColumnDef=\"pin\" stickyEnd=\"false\">\n                    <th mat-header-cell cdkDragLockAxis=\"x\" cdkDrag [cdkDragDisabled]=\"true\" *matHeaderCellDef\n                        class=\"action-column-cells\"> Pinning\n                    </th>\n                    <td mat-cell *matCellDef=\"let row;let i=dataIndex\">\n                        <button mat-icon-button \n                            [matMenuTriggerFor]=\"pinMenu\"\n                            (click)=\"openRowPinMenu($event, row)\"\n                            [matTooltip]=\"getRowPinPosition(row) ? 'Pinned ' + getRowPinPosition(row) : 'Pin Row'\"\n                            matTooltipPosition=\"above\">\n                            <mat-icon [color]=\"isRowPinned(row) ? 'primary' : ''\" aria-hidden=\"false\">\n                                {{ isRowPinned(row) ? 'push_pin' : 'push_pin' }}\n                            </mat-icon>\n                        </button>\n                    </td>\n                    <td mat-footer-cell *matFooterCellDef></td>\n                </ng-container>\n    \n                <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n                @if (expandRows) {\n                    <ng-container matColumnDef=\"expandedDetail\">\n                        <td mat-cell *matCellDef=\"let element;let i=dataIndex \"\n                            [attr.colspan]=\"columnsToDisplayWithExpand.length\">\n                            <div class=\"example-element-detail\"\n                                [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\">\n                                @if (expansionTemplateRef) {\n                                    <ng-container [ngTemplateOutlet]=\"expansionTemplateRef\"\n                                        [ngTemplateOutletContext]=\"{$explicit:element,row:element,index:i}\">\n                                    </ng-container>\n                                }\n                            </div>\n                        </td>\n                    </ng-container>\n                }\n                <!-- Column group headers -->\n                @if (columnGroups.length > 0) {\n                    @for (group of columnGroups; track group.name) {\n                        <ng-container [matColumnDef]=\"'group-' + group.name\">\n                            <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"group.colspan || group.columns.length\" \n                                class=\"group-header-cell\">\n                                <div class=\"group-header-content\">\n                                    <span class=\"group-label\">{{group.label}}</span>\n                                </div>\n                            </th>\n                        </ng-container>\n                    }\n                    <!-- Empty header cells for ungrouped columns -->\n                    <ng-container *ngFor=\"let column of columnsArray\">\n                        <ng-container [matColumnDef]=\"'ungrouped-' + column.field\">\n                            <th mat-header-cell *matHeaderCellDef class=\"group-header-cell ungrouped-header-cell\">\n                            </th>\n                        </ng-container>\n                    </ng-container>\n                }\n                <!-- Filter row columns for data columns -->\n                <ng-container *ngFor=\"let ids of headersFiltersIds; let i = index\">\n                    <ng-container [matColumnDef]=\"ids\" [sticky]=\"columnsArray[returnIndex(ids)].pinned === 'left'\" [stickyEnd]=\"columnsArray[returnIndex(ids)].pinned === 'right'\">\n                        <th mat-header-cell *matHeaderCellDef  [style.minWidth]=\"columnsArray[returnIndex(ids)].width\" [style.maxWidth]=\"columnsArray[returnIndex(ids)].maxWidth?columnsArray[returnIndex(ids)].maxWidth:columnsArray[returnIndex(ids)].width\"\n                        [style.minWidth]=\"columnsArray[returnIndex(ids)].minWidth\" >\n                            <div style=\"display: block; width: 100%;\" class=\"filters-container\" [class.animate]=\"toggleFilters\">\n                                <app-filter-columns-component style=\"display: block; width: 100%;\" [obj]=\"columnsArray[returnIndex(ids)]\"\n                                    (filterOutput)=\"applyColumnFilter($event,columnsArray[returnIndex(ids)])\"></app-filter-columns-component>\n                            </div>\n                        </th>\n                    </ng-container>\n                </ng-container>\n\n                <!-- Empty filter cells for action columns -->\n                <ng-container [matColumnDef]=\"'filter-select'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-edit'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-popup'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-delete'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-freeze'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-hide'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n                <ng-container [matColumnDef]=\"'filter-pin'\">\n                    <th mat-header-cell *matHeaderCellDef class=\"filter-placeholder-cell\"></th>\n                </ng-container>\n\n                <ng-container *ngIf=\"columnGroups.length > 0\">\n                    <tr mat-header-row *matHeaderRowDef=\"getGroupedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row group-header-row\"></tr>\n                </ng-container>\n                <tr mat-header-row *matHeaderRowDef=\" getDisplayedColumns(); sticky: stickyHeader\" class=\"mat-mdc-header-row\"></tr>\n                <tr style=\"height: 0px;\" mat-header-row class=\"no-default-height\" *matHeaderRowDef=\"getFilterColumns()\">\n                </tr>\n                \n                <!-- All Data Rows (with dynamic pinning classes) -->\n                <!-- <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex;\" \n                    class=\"mat-mdc-row data-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'pinned-top-row': isRowPinnedTop(row),\n                      'pinned-bottom-row': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr> -->\n                <tr mat-row *matRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; \" \n                    class=\"mat-mdc-row data-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'mat-row-sticky-top': isRowPinnedTop(row),\n                      'mat-row-sticky-bottom': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr>\n                <!-- <tr mat-header-row *matHeaderRowDef=\"let row; columns:getDisplayedColumns(); let i=dataIndex; when: isRowPinnedTop(row)\" \n                    class=\"mat-mdc-row data-row\"\n                    class=\"mat-mdc-header-row\"\n                    [ngClass]=\"{\n                      'data-row':expandRows,\n                      'stripedRows':(stripedRows &&  i % 2 == 1),\n                      'hoverClass':rowHover, \n                      'hidden':(hiddenCtrl.isSelected(row) && hideRows) || isRowHidden(i),\n                      'example-expanded-row':expandedElement === row,\n                      'pinned-row': isRowPinned(row),\n                      'pinned-top-row': isRowPinnedTop(row),\n                      'pinned-bottom-row': isRowPinnedBottom(row)\n                    }\"\n                    (click)=\"expandRow(row, row !== expandedElement,i)\">\n                </tr> -->\n           \n                @if (expandRows) {\n                    <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']; let i=dataIndex\"\n                        class=\"example-detail-row\"\n                        [ngClass]=\"{'hidden': isRowHidden(i)}\">\n                    </tr>\n                }\n                @if (showFooterRow) {\n                    <tr mat-footer-row *matFooterRowDef=\"getDisplayedColumns(); sticky: stickyFooter\"></tr>\n                }\n            </table>\n\n        }\n        \n    </section>\n    @if (showPaginator) {\n        <mat-paginator [pageSizeOptions]=\"pageSizeOptions\"\n            [showFirstLastButtons]=\"showFirstLastButtons\" class=\"mat-mdc-paginator\">\n        </mat-paginator>\n    }\n</div>","import { NgModule } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { MatTableModule } from '@angular/material/table'\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatTableExtComponent } from '../lib/mat-table-ext.component';\nimport { ResizeColumnDirective } from '../lib/directives/resize-column.directive';\nimport { ColumnPinningComponent } from '../lib/components/column-pinning/column-pinning.component';\nimport { EditingComponent } from '../lib/components/editing/editing.component';\nimport { FilterColumnsComponentComponent } from '../lib/components/filter-columns-component/filter-columns-component.component';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { CdkAccordionModule } from '@angular/cdk/accordion';\nimport { ClipboardModule } from '@angular/cdk/clipboard';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CdkStepperModule } from '@angular/cdk/stepper';\nimport { CdkTableModule } from '@angular/cdk/table';\nimport { CdkTreeModule } from '@angular/cdk/tree';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule } from '@angular/material/tree';\n\n\n@NgModule({\n  declarations: [],\n  imports: [\n    CommonModule,\n    TranslateModule.forChild(),\n    MatTableModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatNativeDateModule,\n    A11yModule,\n    CdkAccordionModule,\n    ClipboardModule,\n    CdkStepperModule,\n    CdkTableModule,\n    CdkTreeModule,\n    DragDropModule,\n    MatAutocompleteModule,\n    MatBadgeModule,\n    MatBottomSheetModule,\n    MatButtonModule,\n    MatButtonToggleModule,\n    MatCardModule,\n    MatCheckboxModule,\n    MatChipsModule,\n    MatStepperModule,\n    MatDatepickerModule,\n    MatDialogModule,\n    MatDividerModule,\n    MatExpansionModule,\n    MatGridListModule,\n    MatIconModule,\n    MatInputModule,\n    MatListModule,\n    MatMenuModule,\n    MatNativeDateModule,\n    MatPaginatorModule,\n    MatProgressBarModule,\n    MatProgressSpinnerModule,\n    MatRadioModule,\n    MatRippleModule,\n    MatSelectModule,\n    MatSidenavModule,\n    MatSliderModule,\n    MatSlideToggleModule,\n    MatSnackBarModule,\n    MatSortModule,\n    MatTabsModule,\n    MatToolbarModule,\n    MatTooltipModule,\n    MatTreeModule,\n    PortalModule,\n    ScrollingModule,\n    MatFormFieldModule,\n    MatTableExtComponent,\n    ResizeColumnDirective,\n    ColumnPinningComponent,\n    EditingComponent,\n    FilterColumnsComponentComponent,\n  ],\n  exports: [\n    MatTableExtComponent,\n    ResizeColumnDirective,\n    ColumnPinningComponent,\n    EditingComponent,\n    FilterColumnsComponentComponent,\n  ],\n})\nexport class MatTableExtModule { }","/*\n * Public API Surface of mat-table-ext\n */\n\nexport * from './lib/mat-table-ext.module';\nexport * from './lib/mat-table-ext.service';\nexport * from './lib/mat-table-ext.component';\nexport * from './lib/components/column-pinning/column-pinning.component';\nexport * from './lib/components/editing/editing.component';\nexport * from './lib/components/filter-columns-component/filter-columns-component.component';\nexport * from './lib/directives/resize-column.directive';\nexport * from './lib/models/tableExtModels';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.MatTableExtService","i4","i6","i11","i3","i1","i2","i5","i7","i8","i9","i10","i15","i16","i19"],"mappings":"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"}