{"version":3,"file":"verben-ng-ui-src-lib-components-data-table.mjs","sources":["../../../projects/verben-ng-ui/src/lib/components/data-table/column.directive.ts","../../../projects/verben-ng-ui/src/lib/components/data-table/data-table.component.ts","../../../projects/verben-ng-ui/src/lib/components/data-table/data-table.component.html","../../../projects/verben-ng-ui/src/lib/components/data-table/data-table.module.ts","../../../projects/verben-ng-ui/src/lib/components/data-table/data-table.types.ts","../../../projects/verben-ng-ui/src/lib/components/data-table/verben-ng-ui-src-lib-components-data-table.ts"],"sourcesContent":["import { ContentChild, Directive, Input, TemplateRef } from '@angular/core';\n\n@Directive({\n  selector: '[libColumn]',\n})\nexport class ColumnDirective {\n  @Input('libColumn') columnId!: string;\n\n  @ContentChild('cell', { static: true }) cellTemplate?: TemplateRef<any>;\n  @ContentChild('cellEdit', { static: true })\n  cellEditTemplate?: TemplateRef<any>;\n  @ContentChild('header', { static: true }) headerTemplate?: TemplateRef<any>;\n  @ContentChild('footer', { static: true }) footerTemplate?: TemplateRef<any>;\n}\n","import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChildren,\n  effect,\n  EventEmitter,\n  input,\n  Input,\n  Output,\n  Signal,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { AbstractControl, FormControl, FormGroup } from '@angular/forms';\nimport { ColumnDirective } from './column.directive';\nimport {\n  ColumnDefinition,\n  DataWithKey,\n  FormGroupConfig,\n  GroupedDataRow,\n} from './data-table.types';\nimport { TableStyles } from './style.types';\n\n@Component({\n  selector: 'lib-data-table',\n  templateUrl: './data-table.component.html',\n  styleUrl: './data-table.component.css',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DataTableComponent<T> {\n  // Modify data input to use grouped data\n  data = input.required<T[]>();\n  columns = input.required<ColumnDefinition<T>[]>();\n  dataKey = input<keyof T>(); // New required input for unique identifier\n  formGroupConfig = input<\n    FormGroupConfig<{\n      [K in keyof T]: AbstractControl;\n    }>\n  >();\n\n  groupBy = input<keyof T | ((row: T) => any)>();\n  useVirtualScroll = input<boolean>(false);\n  virtualScrollItemSize = input<number>(48);\n  viewPort = viewChild(CdkVirtualScrollViewport);\n\n  @Input() styleConfig: TableStyles = defaultTableStyles;\n\n  columnTemplates = contentChildren(ColumnDirective);\n\n  @Output() rowEdit = new EventEmitter<T>();\n  @Output() rowSave = new EventEmitter<{\n    index: number;\n    key: number | string;\n    data: Partial<T>;\n  }>();\n  @Output() rowRevert = new EventEmitter<{\n    index: number;\n    key: number | string;\n    data: T;\n  }>();\n  @Output() rowDelete = new EventEmitter<T>();\n  @Output() selectionChange = new EventEmitter<T[]>();\n\n  /** Internally maintained data, with guaranteed uniqueness due to key property */\n  tableData: Signal<DataWithKey<T>[]>;\n\n  private editingRowsSignal = signal<Set<string | number>>(new Set());\n  private selectedRowsSignal = signal<Set<string | number>>(new Set());\n  // private editedDataSignal = signal<Map<string | number, EditedData<T>>>(\n  //   new Map()\n  // );\n  private unEditedDataSignal = signal<Map<string | number, T>>(new Map());\n  private formGroupsSignal = signal<Map<string | number, FormGroup>>(new Map());\n\n  // columnsSignal = computed(() => this.columns());\n\n  displayColumns: Signal<ColumnDefinition<T>[]>;\n\n  constructor() {\n    this.displayColumns = computed(() => {\n      return this.columns()?.filter(({ isHidden }) => !isHidden).map((column) => {\n        const matchingTemplate = this.columnTemplates().find(\n          (t) => t.columnId === column.id\n        );\n        if (matchingTemplate) {\n          console.log('Found matching template:', matchingTemplate);\n          return {\n            ...column,\n            cellTemplate: matchingTemplate.cellTemplate ?? column.cellTemplate,\n            cellEditTemplate:\n              matchingTemplate.cellEditTemplate ?? column.cellEditTemplate,\n            headerTemplate:\n              matchingTemplate.headerTemplate ?? column.headerTemplate,\n            footerTemplate:\n              matchingTemplate.footerTemplate ?? column.footerTemplate,\n          };\n        }\n        return column;\n      });\n    });\n\n    this.tableData = computed(() => {\n      return this.data().map((item, index) => {\n        let key;\n        const dataKey = this._getRowIdByDataKey(item);\n        if (dataKey) {\n          key = dataKey;\n        } else {\n          key = index as DataWithKey<T>['_key'];\n        }\n        return {\n          originalData: item,\n          _key: key,\n          _key_prop: this.dataKey() ?? '_index',\n        };\n      });\n    });\n\n    effect(() => {\n      const tableData = this.tableData();\n\n      if (this.useVirtualScroll()) {\n        this.updateVirtualScrollViewport();\n      }\n    });\n  }\n\n  updateVirtualScrollViewport() {\n    const viewportInstance = this.viewPort();\n    if (viewportInstance) {\n      viewportInstance.checkViewportSize(); // Example usage\n    }\n  }\n\n  hasFooter = computed(() =>\n    this.displayColumns().some((col) => col.footerTemplate !== undefined)\n  );\n\n  // Helper method to get unique identifier for a row\n  private _getRowIdByDataKey(row: T): string | number | undefined {\n    const key = this.dataKey();\n    if (key) {\n      const value = row[key];\n\n      // Convert to string or number if possible, otherwise stringify\n      if (typeof value === 'string' || typeof value === 'number') {\n        return value;\n      }\n      return JSON.stringify(value);\n    }\n    return;\n  }\n\n  // Type guard method to check for group rows\n  isGroupRow(row: T): row is T & { isGroupRow: true; groupTitle: any } {\n    return !!(row as any).isGroupRow;\n  }\n\n  trackByRowKey(index: number, row: any) {\n    return row._key;\n  }\n\n  // Computed property for grouped data\n\n  groupedData = computed(() => {\n    if (!this.groupBy()) return this.tableData() as GroupedDataRow<T>[];\n\n    const getGroupValue =\n      typeof this.groupBy() === 'function'\n        ? (this.groupBy() as (row: T) => any)\n        : (row: T) => row[this.groupBy() as keyof T];\n\n    const groups = new Map<any, DataWithKey<T>[]>();\n\n    this.tableData().forEach((row) => {\n      if (getGroupValue !== undefined) {\n        const groupValue = getGroupValue(row.originalData);\n        const existingGroup = groups.get(groupValue) || [];\n        groups.set(groupValue, [...existingGroup, row]);\n      }\n    });\n\n    const groupedDataArray: GroupedDataRow<T>[] = [];\n\n    groups.forEach((groupRows, groupValue) => {\n      // Create group header row\n      const groupRow: GroupedDataRow<T> = {\n        ...({} as DataWithKey<T>), // Create empty object of type T as base\n        _key: `group-${groupValue}`,\n        isGroupRow: true,\n        groupValue,\n        groupTitle: groupValue,\n      };\n\n      groupedDataArray.push(groupRow);\n      // Add regular rows with the optional isGroupRow property (undefined by default)\n      groupedDataArray.push(...(groupRows as GroupedDataRow<T>[]));\n    });\n\n    return groupedDataArray;\n  });\n\n  getCellValue = (row: T, column: ColumnDefinition<T>): any => {\n    // For group rows, return the group title if it exists\n    if (this.isGroupRow(row)) {\n      return (row as any).groupTitle;\n    }\n\n    // Existing logic for normal rows\n    if (column.accessorKey) {\n      return row[column.accessorKey];\n    }\n    return column.accessorFn ? column.accessorFn(row) : undefined;\n  };\n\n  public isRowEditing = (rowKey: DataWithKey<T>['_key']): boolean => {\n    return this.editingRowsSignal().has(rowKey);\n  };\n\n  public toggleRowEdit = (rowId: DataWithKey<T>['_key']) => {\n    let data: DataWithKey<T> | undefined = undefined;\n    let index: number = -1;\n\n    this.tableData().forEach((datum, i) => {\n      if (datum._key === rowId) {\n        data = datum;\n        index = i;\n      }\n    });\n\n    if (data !== undefined && index >= 0) {\n      this.toggleRowEditInternal(data, index);\n    }\n  };\n\n  private toggleRowEditInternal = (row: DataWithKey<T>, index: number) => {\n    this.editingRowsSignal.update((set) => {\n      const newSet = new Set(set);\n      if (newSet.has(row._key)) {\n        newSet.delete(row._key);\n        this.saveRow(row._key, index);\n      } else {\n        newSet.add(row._key);\n        this.initializeEditedData(row);\n      }\n      return newSet;\n    });\n  };\n\n  private initializeEditedData(row: DataWithKey<T>) {\n    const rowId = row._key;\n    this.unEditedDataSignal.update((map) => {\n      const newMap = new Map(map);\n      newMap.set(rowId, { ...row.originalData });\n      return newMap;\n    });\n    const formGroupConfig = this.formGroupConfig();\n    if (formGroupConfig) {\n      // Clone controls so each row gets its own independent AbstractControl instances\n      const clonedControls: { [key: string]: AbstractControl } = {};\n      for (const [key, control] of Object.entries(formGroupConfig.controls) as [string, AbstractControl][]) {\n        clonedControls[key] = new FormControl(\n          control.value,\n          control.validator,\n          control.asyncValidator\n        );\n      }\n      const formGroup = new FormGroup(\n        clonedControls,\n        formGroupConfig.validatorOrOpts,\n        formGroupConfig.asyncValidator\n      );\n      formGroup.patchValue(row.originalData as any);\n      this.formGroupsSignal.update((map) => {\n        const newMap = new Map(map);\n        newMap.set(rowId, formGroup);\n        return newMap;\n      });\n    }\n  }\n\n  private saveRow(rowId: string | number, rowIndex: number) {\n    const editedForm = this.formGroupsSignal().get(rowId);\n    const unEditedData = this.unEditedDataSignal().get(rowId);\n\n    // if (editedData) {\n    //   const originalRow = this.tableData().find((row) => row._key === rowId);\n    //   if (originalRow) {\n    //     const updatedRow = { ...originalRow, ...editedData };\n    //     this.rowSave.emit(updatedRow);\n    //     this.editedDataSignal.update((map) => {\n    //       const newMap = new Map(map);\n    //       newMap.delete(rowId);\n    //       return newMap;\n    //     });\n    //   }\n    // }\n\n    // console.log(this.formGroupConfig());\n    // console.log(editedForm);\n    // console.log(unEditedData);\n\n    if (editedForm) {\n      editedForm.markAsPristine();\n      editedForm.markAsUntouched();\n      this.formGroupsSignal.update((map) => {\n        const newMap = new Map(map);\n        newMap.delete(rowId);\n        return newMap;\n      });\n      this.rowSave.emit({\n        index: rowIndex,\n        key: rowId,\n        data: editedForm.value,\n      });\n    }\n\n    if (unEditedData) {\n      this.unEditedDataSignal.update((map) => {\n        const newMap = new Map(map);\n        newMap.delete(rowId);\n        return newMap;\n      });\n      this.rowRevert.emit({\n        index: rowIndex,\n        key: rowId,\n        data: unEditedData,\n      });\n    }\n  }\n\n  private isRowSelected = (rowId: string | number): boolean => {\n    return this.selectedRowsSignal().has(rowId);\n  };\n\n  private toggleRowSelection = (rowId: string | number) => {\n    this.selectedRowsSignal.update((set) => {\n      const newSet = new Set(set);\n      if (newSet.has(rowId)) {\n        newSet.delete(rowId);\n      } else {\n        newSet.add(rowId);\n      }\n      this.emitSelectionChange();\n      return newSet;\n    });\n  };\n\n  private allRowsSelected = (): boolean => {\n    const nonGroupRows = this.data().filter((row) => !this.isGroupRow(row));\n    return (\n      nonGroupRows.length > 0 &&\n      this.selectedRowsSignal().size === nonGroupRows.length\n    );\n  };\n\n  private someRowsSelected = (): boolean => {\n    const nonGroupRows = this.data().filter((row) => !this.isGroupRow(row));\n    return (\n      this.selectedRowsSignal().size > 0 &&\n      this.selectedRowsSignal().size < nonGroupRows.length\n    );\n  };\n\n  private toggleAllRows = () => {\n    if (this.allRowsSelected()) {\n      this.selectedRowsSignal.set(new Set());\n    } else {\n      const nonGroupRows = this.tableData().filter(\n        (row) => !this.isGroupRow(row.originalData)\n      );\n      this.selectedRowsSignal.set(new Set(nonGroupRows.map((row) => row._key)));\n    }\n    this.emitSelectionChange();\n  };\n\n  private emitSelectionChange() {\n    const selectedRows = this.tableData().filter((row) =>\n      this.selectedRowsSignal().has(row._key)\n    );\n    this.selectionChange.emit(\n      selectedRows.map(({ originalData }) => originalData)\n    );\n  }\n\n  getHeaderContext(column: ColumnDefinition<T>) {\n    return {\n      $implicit: column,\n      column,\n      allRowsSelected: this.allRowsSelected,\n      someRowsSelected: this.someRowsSelected,\n      toggleAllRows: this.toggleAllRows,\n    };\n  }\n\n  updateEditedValue(\n    rowId: string | number,\n    column: ColumnDefinition<T>,\n    value: any\n  ) {\n    // this.editedDataSignal.update((map) => {\n    //   const newMap = new Map(map);\n    //   const rowData = newMap.get(rowId) || ({} as EditedData<T>);\n    //   if (column.accessorKey) {\n    //     newMap.set(rowId, { ...rowData, [column.accessorKey]: value });\n    //   } else {\n    //     console.warn(\n    //       'Cannot update value for column without accessorKey:',\n    //       column.id\n    //     );\n    //   }\n    //   return newMap;\n    // });\n  }\n\n  updateEditedValueFn(\n    rowId: string | number,\n    valueFn: (value: any) => T,\n    value: any\n  ) {\n    // this.editedDataSignal.update((map) => {\n    //   const newMap = new Map(map);\n    //   const rowData = newMap.get(rowId) || ({} as EditedData<T>);\n    //   newMap.set(rowId, { ...rowData, ...valueFn(value) });\n    //   return newMap;\n    // });\n  }\n\n  updateEditedData(rowId: string | number, data: Partial<T>) {\n    // this.editedDataSignal.update((map) => {\n    //   const newMap = new Map(map);\n    //   const rowData = newMap.get(rowId) || ({} as EditedData<T>);\n    //   newMap.set(rowId, { ...rowData, ...data });\n    //   return newMap;\n    // });\n  }\n\n  updateNestedEditedValue(\n    rowId: string | number,\n    column: ColumnDefinition<T>,\n    nestedField: string,\n    value: any\n  ) {\n    // this.editedDataSignal.update((map) => {\n    //   const newMap = new Map(map);\n    //   const rowData = newMap.get(rowId) || ({} as EditedData<T>);\n    //   if (column.accessorKey) {\n    //     const columnData = (rowData[column.accessorKey] as any) || {};\n    //     newMap.set(rowId, {\n    //       ...rowData,\n    //       [column.accessorKey]: {\n    //         ...columnData,\n    //         [nestedField]: value,\n    //       },\n    //     });\n    //   } else {\n    //     console.warn(\n    //       'Cannot update nested value for column without accessorKey:',\n    //       column.id\n    //     );\n    //   }\n    //   return newMap;\n    // });\n  }\n\n  getCellContext(\n    row: DataWithKey<T>,\n    column: ColumnDefinition<T>,\n    rowIndex: number\n  ) {\n    const rowId = row._key;\n    const isEditing = this.isRowEditing(row._key);\n    // const editedData = this.editedDataSignal().get(rowId);\n    const editedForm = this.formGroupsSignal().get(rowId);\n    const formControl = column.formControlName\n      ? editedForm?.get(column.formControlName)\n      : undefined;\n\n    let value: any;\n    if (isEditing) {\n      if (formControl) {\n        value = formControl.value;\n      } else {\n        value = this.getCellValue(row.originalData, column);\n      }\n      // else if (editedData) {\n      //   if (column.accessorKey && column.accessorKey in editedData) {\n      //     // If column has an accessorKey and it exists in edited data, use that\n      //     value = editedData[column.accessorKey];\n      //   } else if (column.accessorFn) {\n      //     // If column has an accessorFn, apply it to the edited data\n      //     value = column.accessorFn({ ...row, ...editedData });\n      //   } else {\n      //     // Fallback to getting the value from the original row\n      //     value = this.getCellValue(row, column);\n      //   }\n      // }\n    } else {\n      value = this.getCellValue(row.originalData, column);\n    }\n\n    return {\n      $implicit: value,\n      value,\n      row: row.originalData,\n      column,\n      rowIndex,\n      rowId,\n      isEditing,\n      formControl,\n      control: formControl,\n      isSelected: this.isRowSelected(rowId),\n      toggleRowSelection: () => this.toggleRowSelection(rowId),\n      toggleRowEdit: () => this.toggleRowEditInternal(row, rowIndex),\n      deleteRow: () => this.deleteRow(rowId),\n      updateValue: (newValue: any) =>\n        this.updateEditedValue(rowId, column, newValue),\n      updateNestedValue: (nestedField: string, newValue: any) =>\n        this.updateNestedEditedValue(rowId, column, nestedField, newValue),\n      updateValueFn: (valueFn: (value: any) => T, newValue: any) =>\n        this.updateEditedValueFn(rowId, valueFn, newValue),\n      updateData: (newData: Partial<T>) =>\n        this.updateEditedData(rowId, newData),\n    };\n  }\n\n  deleteRow = (rowId: string | number) => {\n    const rowToDelete = this.tableData().find((row) => row._key === rowId);\n    if (rowToDelete) {\n      this.rowDelete.emit(rowToDelete.originalData);\n    }\n  };\n\n  getFooterContext(column: ColumnDefinition<T>) {\n    return {\n      $implicit: column,\n      column,\n      data: this.data,\n    };\n  }\n\n  getTableStyle(): any {\n    return {\n      ...this.styleConfig,\n      fontFamily: this.styleConfig.fontFamily,\n      fontSize: this.styleConfig.fontSize,\n      whiteSpace: this.styleConfig.whiteSpace,\n      margin: this.styleConfig.margin,\n      border: this.styleConfig.border,\n      borderCollapse: this.styleConfig.borderCollapse,\n      borderSpacing: this.styleConfig.borderSpacing,\n      tableLayout: this.styleConfig.tableLayout,\n      width: this.styleConfig.width,\n    };\n  }\n\n  getHeaderStyle(): any {\n    return {\n      ...this.styleConfig.header,\n      position: this.styleConfig.header?.stickyTop ? 'sticky' : 'static',\n      top: this.styleConfig.header?.stickyTop ? '0' : 'auto',\n      zIndex: this.styleConfig.header?.zIndex || 'auto',\n    };\n  }\n\n  getFooterStyle(): any {\n    return {\n      ...this.styleConfig.footer,\n      position: this.styleConfig.footer?.stickyBottom ? 'sticky' : 'static',\n      bottom: this.styleConfig.footer?.stickyBottom ? '0' : 'auto',\n      zIndex: this.styleConfig.footer?.zIndex || 'auto',\n    };\n  }\n\n  getRowStyle(rowIndex: number): any {\n    const rowStyles = this.styleConfig.rows;\n    if (rowStyles && 'even' in rowStyles && 'odd' in rowStyles) {\n      return rowIndex % 2 === 0 ? rowStyles.even : rowStyles.odd;\n    } else if (rowStyles && 'nth' in rowStyles && rowStyles.nth) {\n      const { interval, style } = rowStyles.nth;\n      return (rowIndex + 1) % (interval || 1) === 0 ? style : {};\n    } else {\n      return rowStyles || {};\n    }\n  }\n\n  getCellStyle(rowIndex: number, colIndex: number): any {\n    const isFirstColumn = colIndex === 0;\n    const isLastColumn = colIndex === this.displayColumns().length - 1;\n\n    let cellStyle = { ...this.styleConfig.cells };\n\n    if (isFirstColumn) {\n      cellStyle = {\n        ...cellStyle,\n        ...this.styleConfig.firstColumn,\n        position: this.styleConfig.firstColumn?.stickyLeft\n          ? 'sticky'\n          : 'static',\n        left: this.styleConfig.firstColumn?.stickyLeft ? '0' : 'auto',\n        zIndex: this.styleConfig.firstColumn?.zIndex || 'auto',\n      };\n    } else if (isLastColumn) {\n      cellStyle = {\n        ...cellStyle,\n        ...this.styleConfig.lastColumn,\n        position: this.styleConfig.lastColumn?.stickyRight\n          ? 'sticky'\n          : 'static',\n        right: this.styleConfig.lastColumn?.stickyRight ? '0' : 'auto',\n        zIndex: this.styleConfig.lastColumn?.zIndex || 'auto',\n      };\n    }\n\n    if (rowIndex >= 0) {\n      // Apply body styles to all cells\n      cellStyle = { ...cellStyle, ...this.styleConfig.body };\n    } else {\n      cellStyle = { ...this.styleConfig.header };\n    }\n\n    return cellStyle;\n  }\n}\n\n// Default styles\nconst defaultTableStyles: TableStyles = {\n  border: '1px solid #e0e0e0',\n  borderRadius: '4px',\n  overflow: 'hidden',\n  boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n  width: '100%',\n  header: {\n    backgroundColor: '#f5f5f5',\n    fontWeight: 'bold',\n    color: '#333',\n    textAlign: 'left',\n    padding: '12px 16px',\n    borderBottom: '2px solid #e0e0e0',\n  },\n  rows: {\n    even: {\n      backgroundColor: '#ffffff',\n    },\n    odd: {\n      backgroundColor: '#f9f9f9',\n    },\n    nth: {\n      interval: 5,\n      style: {\n        backgroundColor: '#f0f0f0',\n      },\n    },\n  },\n  cells: {\n    padding: '12px 16px',\n    borderBottom: '1px solid #e0e0e0',\n  },\n  footer: {\n    backgroundColor: '#f5f5f5',\n    fontWeight: 'bold',\n    color: '#333',\n    textAlign: 'left',\n    padding: '12px 16px',\n    borderTop: '2px solid #e0e0e0',\n  },\n};\n","@if (useVirtualScroll()) {\n<cdk-virtual-scroll-viewport\n  [itemSize]=\"virtualScrollItemSize()\"\n  class=\"virtual-scroll-viewport\"\n  [style.height.px]=\"virtualScrollItemSize() * 10\"\n>\n  <table [ngStyle]=\"getTableStyle()\">\n    <thead>\n      <!-- <tr [ngStyle]=\"getHeaderStyle()\">\n      <th colspan=\"2\" scope=\"colgroup\">Group 1</th>\n      <th colspan=\"1\" scope=\"colgroup\">Group 2</th>\n    </tr> -->\n\n      <tr [ngStyle]=\"getHeaderStyle()\">\n        @for (column of displayColumns(); track column.id) {\n        <th [ngStyle]=\"getCellStyle(-1, $index)\">\n          @if (column.headerTemplate) {\n          <ng-container\n            [ngTemplateOutlet]=\"column.headerTemplate\"\n            [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n          ></ng-container>\n          } @else {\n          {{ column.header }}\n          }\n        </th>\n        }\n      </tr>\n    </thead>\n    <tbody>\n      <tr\n        *cdkVirtualFor=\"\n          let row of tableData();\n          trackBy: trackByRowKey;\n          let rowIndex = index\n        \"\n        [ngStyle]=\"getRowStyle(rowIndex)\"\n      >\n        @for (column of displayColumns(); track column.id; let colIndex =\n        $index) {\n        <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n          @if (isRowEditing(row._key) && column.cellEditTemplate) {\n          <ng-container\n            [ngTemplateOutlet]=\"column.cellEditTemplate\"\n            [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n          ></ng-container>\n          } @else if (column.cellTemplate) {\n          <ng-container\n            [ngTemplateOutlet]=\"column.cellTemplate\"\n            [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n          ></ng-container>\n          } @else {\n          {{ getCellValue(row.originalData, column) }}\n          }\n        </td>\n        }\n      </tr>\n    </tbody>\n\n    @if (hasFooter()) {\n    <tfoot>\n      <tr [ngStyle]=\"getFooterStyle()\">\n        @for (column of displayColumns(); track column.id) {\n        <td [ngStyle]=\"getCellStyle(-1, $index)\">\n          @if (column.footerTemplate) {\n          <ng-container\n            [ngTemplateOutlet]=\"column.footerTemplate\"\n            [ngTemplateOutletContext]=\"getFooterContext(column)\"\n          ></ng-container>\n          }\n        </td>\n        }\n      </tr>\n    </tfoot>\n\n    }\n  </table>\n</cdk-virtual-scroll-viewport>\n} @else {\n<table [ngStyle]=\"getTableStyle()\">\n  <thead>\n    <!-- <tr [ngStyle]=\"getHeaderStyle()\">\n      <th colspan=\"2\" scope=\"colgroup\">Group 1</th>\n      <th colspan=\"1\" scope=\"colgroup\">Group 2</th>\n    </tr> -->\n\n    <tr [ngStyle]=\"getHeaderStyle()\">\n      @for (column of displayColumns(); track column.id) {\n      <th [ngStyle]=\"getCellStyle(-1, $index)\">\n        @if (column.headerTemplate) {\n        <ng-container\n          [ngTemplateOutlet]=\"column.headerTemplate\"\n          [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n        ></ng-container>\n        } @else {\n        {{ column.header }}\n        }\n      </th>\n      }\n    </tr>\n  </thead>\n  <tbody>\n    @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n    (isGroupRow(row.originalData)) {\n    <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n      <td\n        [attr.colspan]=\"displayColumns().length\"\n        [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n      >\n        {{ getCellValue(row.originalData, displayColumns()[0]) }}\n      </td>\n    </tr>\n    } @else {\n    <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n      @for (column of displayColumns(); track column.id; let colIndex = $index)\n      {\n      <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n        @if (isRowEditing(row._key) && column.cellEditTemplate) {\n        <ng-container\n          [ngTemplateOutlet]=\"column.cellEditTemplate\"\n          [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n        ></ng-container>\n        } @else if (column.cellTemplate) {\n        <ng-container\n          [ngTemplateOutlet]=\"column.cellTemplate\"\n          [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n        ></ng-container>\n        } @else {\n        {{ getCellValue(row.originalData, column) }}\n        }\n      </td>\n      }\n    </tr>\n    } }\n  </tbody>\n\n  @if (hasFooter()) {\n  <tfoot>\n    <tr [ngStyle]=\"getFooterStyle()\">\n      @for (column of displayColumns(); track column.id) {\n      <td [ngStyle]=\"getCellStyle(-1, $index)\">\n        @if (column.footerTemplate) {\n        <ng-container\n          [ngTemplateOutlet]=\"column.footerTemplate\"\n          [ngTemplateOutletContext]=\"getFooterContext(column)\"\n        ></ng-container>\n        }\n      </td>\n      }\n    </tr>\n  </tfoot>\n\n  }\n</table>\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ColumnDirective } from './column.directive';\nimport { DataTableComponent } from './data-table.component';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\n\n@NgModule({\n  declarations: [DataTableComponent, ColumnDirective],\n  imports: [CommonModule, ScrollingModule],\n  exports: [DataTableComponent, ColumnDirective],\n})\nexport class DataTableModule {}\n","import { TemplateRef } from '@angular/core';\nimport {\n  AbstractControl,\n  AbstractControlOptions,\n  AsyncValidatorFn,\n  FormControl,\n  ValidatorFn,\n} from '@angular/forms';\n\nexport interface ColumnDefinition<T> {\n  id: string;\n  header: string | ((context: any) => any);\n  accessorKey?: keyof T;\n  accessorFn?: (row: T) => any;\n  cellTemplate?: TemplateRef<any>;\n  cellEditTemplate?: TemplateRef<any>;\n  headerTemplate?: TemplateRef<any>;\n  footerTemplate?: TemplateRef<any>;\n  sortAction?: 'ASC' | 'DESC';\n  formControlName?: string;\n  groupName?: string;\n  validatorFn?: (value: T[keyof T]) => boolean;\n  importKey?: keyof T;\n  canImport?: boolean;\n  canExport?: boolean;\n  importBy?: keyof T | ((importedRow: any) => T[keyof T]);\n  exportBy?: keyof T | ((row: T) => any);\n  isHidden?: boolean;\n}\n\n// Define a type that extends T with a _key property\nexport type DataWithKey<T> = {\n  _key: string | number;\n  _key_prop: keyof T | '_index';\n  originalData: T;\n};\n\nexport type GroupedDataRow<T> = DataWithKey<T> & {\n  isGroupRow?: boolean;\n  groupValue?: any;\n  groupTitle?: any;\n};\n\nexport type FormControlOf<T> = {\n  [K in keyof T]?: FormControl;\n};\n\nexport interface FormGroupConfig<\n  TControl extends { [key: string]: AbstractControl }\n> {\n  controls: TControl;\n  validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null;\n  asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null;\n}\n\nexport type EditedData<T> = {\n  [K in keyof T]?: T[K] extends object ? Partial<T[K]> : T[K];\n};\n\n// ====================================\n\n// export type ColumnDefinitionBase<T> = {\n//   id: string;\n//   header: string | ((context: any) => any);\n//   cellTemplate?: TemplateRef<any>;\n//   cellEditTemplate?: TemplateRef<any>;\n//   headerTemplate?: TemplateRef<any>;\n//   footerTemplate?: TemplateRef<any>;\n//   sortAction?: 'ASC' | 'DESC';\n//   formControlName?: string;\n//   groupName?: string;\n// };\n\n// // Helper type to create a column definition with a specific accessor key\n// export type ColumnDefinitionWithKey<\n//   T,\n//   K extends keyof T\n// > = ColumnDefinitionBase<T> & {\n//   accessorKey: K;\n//   accessorFn?: never;\n//   validatorFn?: (value: T[K]) => boolean;\n// };\n\n// export type ColumnDefinitionWithFn<T, R = any> = ColumnDefinitionBase<T> & {\n//   accessorKey?: never;\n//   accessorFn: (row: T) => R;\n//   validatorFn?: (value: R) => boolean;\n// };\n\n// export type ColumnDefinitionWithNeither<T> = ColumnDefinitionBase<T> & {\n//   accessorKey?: never;\n//   accessorFn?: never;\n//   validatorFn?: never;\n// };\n\n// // Union type that represents all possible column definition variants\n// export type ColumnDefinition<T> =\n//   | { [K in keyof T]: ColumnDefinitionWithKey<T, K> }[keyof T]\n//   | ColumnDefinitionWithFn<T>\n//   | ColumnDefinitionWithNeither<T>;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}