{"version":3,"file":"ms-data-grid.mjs","sources":["../../../projects/data-grid/src/lib/data-grid/statuses.ts","../../../projects/data-grid/src/lib/directives/cellHost.directive.ts","../../../projects/data-grid/src/lib/services/split-columns.service.ts","../../../projects/data-grid/src/lib/services/common.service.ts","../../../projects/data-grid/src/lib/services/copy-service.service.ts","../../../projects/data-grid/src/lib/services/export.service.ts","../../../projects/data-grid/src/lib/directives/cell-render-init.directive.ts","../../../projects/data-grid/src/lib/pipes/filter.pipe.ts","../../../projects/data-grid/src/lib/data-grid/data-grid.component.ts","../../../projects/data-grid/src/lib/data-grid/data-grid.component.html","../../../projects/data-grid/src/lib/data-grid.module.ts","../../../projects/data-grid/src/public-api.ts","../../../projects/data-grid/src/ms-data-grid.ts"],"sourcesContent":["export const STATUSES_BADGE_MAP: { [key: string]: string } = {\r\n  //  Success – Green\r\n  'active': 'badge badge-success',\r\n  'approved': 'badge badge-success',\r\n  'accepted': 'badge badge-success',\r\n  'completed': 'badge badge-success',\r\n  'evaluated': 'badge badge-success',\r\n  'assigned': 'badge badge-success',\r\n  'scrap': 'badge badge-success',\r\n  'move-available': 'badge badge-success',\r\n  'move-assigned': 'badge badge-success',\r\n\r\n  // Warning – Yellow/Amber\r\n  'contract': 'badge badge-warning',\r\n  'warranty': 'badge badge-warning',\r\n  'scheduled': 'badge badge-warning',\r\n  'leased': 'badge badge-warning',\r\n  'disposed': 'badge badge-warning',\r\n  'maintenance': 'badge badge-warning',\r\n  'assigning start': 'badge badge-warning',\r\n  'evaluation start': 'badge badge-warning',\r\n  'to be start assigning': 'badge badge-warning',\r\n  'pending': 'badge badge-warning',\r\n  'leave': 'badge badge-warning',\r\n\r\n  //  Danger – Red\r\n  'inactive': 'badge badge-danger',\r\n  'rejected': 'badge badge-danger',\r\n  'unassigned': 'badge badge-danger',\r\n  'trashed': 'badge badge-danger',\r\n  'onhold': 'badge badge-danger',\r\n  'assigning stop': 'badge badge-danger',\r\n  'evaluation stop': 'badge badge-danger',\r\n  'unavailable': 'badge badge-danger',\r\n  'move-error': 'badge badge-danger',\r\n  'failed': 'badge badge-danger',\r\n  'absent': 'badge badge-danger',\r\n\r\n  //  Info – Blue\r\n  'insurance': 'badge badge-info',\r\n  'pastdue': 'badge badge-info',\r\n\r\n  //  Dark – Neutral/Other\r\n  'expired': 'badge badge-dark',\r\n  'draft': 'badge badge-dark',\r\n  'present': 'badge badge-success',\r\n\r\n  'todo': 'badge badge-secondary',\r\n};\r\n","import { Directive, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n  selector: '[cellHost]'\r\n})\r\nexport class CellHostDirective  {\r\n\r\n  constructor(public viewContainerRef: ViewContainerRef) {}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class SplitColumnsService {\r\n  prepareColumns(columns: any[], containerWidth: number): any {\r\n    const left: any[] = [];\r\n    const center: any[] = [];\r\n    const right: any[] = [];\r\n\r\n    for (const col of columns) {\r\n      if (col.children?.length) {\r\n        const leftChildren: any[] = [];\r\n        const centerChildren: any[] = [];\r\n        const rightChildren: any[] = [];\r\n\r\n        for (const child of col.children) {\r\n          if (child.is_visible === false) continue;\r\n\r\n          const pinned = child.pinned ?? col.pinned ?? null;\r\n          const childWithPinned = { ...child, pinned };\r\n\r\n          if (pinned === 'left') leftChildren.push(childWithPinned);\r\n          else if (pinned === 'right') rightChildren.push(childWithPinned);\r\n          else centerChildren.push(childWithPinned);\r\n        }\r\n\r\n        if (leftChildren.length) {\r\n          left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });\r\n        }\r\n        if (centerChildren.length) {\r\n          center.push({\r\n            header: col.header,\r\n            children: centerChildren,\r\n            id: col.id || col._id,\r\n          });\r\n        }\r\n        if (rightChildren.length) {\r\n          right.push({\r\n            header: col.header,\r\n            children: rightChildren,\r\n            id: col.id || col._id,\r\n          });\r\n        }\r\n      } else if (col.is_visible !== false) {\r\n        const pinned = col.pinned ?? null;\r\n        if (pinned === 'left') left.push(col);\r\n        else if (pinned === 'right') right.push(col);\r\n        else center.push(col);\r\n      }\r\n    }\r\n\r\n    return { left, center, right };\r\n  }\r\n\r\n  setColumnsQuery(columns: any[]) {\r\n    for (const col of columns) {\r\n      // if (col.children?.length) {\r\n      //   for (const child of col.children) {\r\n      //     if (!child?.query?.firt_value && !child?.query?._ids?.length) {\r\n      //       child['query'] = {\r\n      //         first_condition: 'contain',\r\n      //         first_value: null,\r\n      //         condition: 'none',\r\n      //         second_condition: 'contain',\r\n      //         second_value: null,\r\n      //         _ids: [],\r\n      //       };\r\n      //     }\r\n      //   }\r\n      // }\r\n      // if (!col?.query?.firt_value && !col?.query?._ids?.length) {\r\n      //   col.query = {\r\n      //     first_condition: 'contain',\r\n      //     first_value: null,\r\n      //     condition: 'none',\r\n      //     second_condition: 'contain',\r\n      //     second_value: null,\r\n      //     _ids: [],\r\n      //   };\r\n      // }\r\n    }\r\n\r\n    console.log('Updated Columns: ', columns);\r\n\r\n    return columns;\r\n  }\r\n\r\n   assignDefaultWidths(columns: any[], containerWidth: number): any[] {\r\n  const visibleLeafCols = this.getVisibleLeafColumns(columns);\r\n\r\n  if (!visibleLeafCols.length) return columns;\r\n\r\n  let defaultWidth = Math.floor(containerWidth / visibleLeafCols.length);\r\n  if (defaultWidth < 150) defaultWidth = 150;\r\n\r\n  const cloneColumns = (cols: any[]): any[] =>\r\n    cols.map((col) => {\r\n      if (col.children?.length) {\r\n        const newChildren = col.children.map((child: any) => {\r\n          // If visible → dynamic default width\r\n          // If invisible → fixed 150px\r\n          if (!child.width) {\r\n            if (child.is_visible === false) {\r\n              return { ...child, width: 150 };\r\n            } else {\r\n              return { ...child, width: defaultWidth };\r\n            }\r\n          }\r\n          return { ...child };\r\n        });\r\n\r\n        return { ...col, children: newChildren };\r\n      }\r\n\r\n      if (!col.width) {\r\n        if (col.is_visible === false) {\r\n          return { ...col, width: 150 };\r\n        } else {\r\n          return { ...col, width: defaultWidth };\r\n        }\r\n      }\r\n\r\n      return { ...col };\r\n    });\r\n\r\n  return cloneColumns(columns);\r\n}\r\n\r\n\r\n  private getVisibleLeafColumns(columns: any[]): any[] {\r\n    const result: any[] = [];\r\n\r\n    for (const col of columns) {\r\n      if (col.children?.length) {\r\n        const visibleChildren = col.children.filter(\r\n          (c: any) => c.is_visible !== false\r\n        );\r\n        result.push(...visibleChildren);\r\n      } else if (col.is_visible !== false) {\r\n        result.push(col);\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CommonService {\r\n\r\n  constructor() { }\r\n  gethasVisibleColumns(columns: any[]): boolean {\r\n    const checkVisible = (columns: any[]): boolean => {\r\n      return columns.some((col) => {\r\n        if (col?.is_visible) return true;\r\n        if (col?.children?.length) {\r\n          return checkVisible(col.children);\r\n        }\r\n        return false;\r\n      });\r\n    };\r\n    return checkVisible(columns);\r\n  }\r\n\r\n  gethasInVisibleColumns(columns: any[]): boolean {\r\n    const checkVisible = (columns: any[]): boolean => {\r\n      return columns.some((col) => {\r\n        if (!col?.is_visible) return true;\r\n        if (col?.children?.length) {\r\n          return checkVisible(col.children);\r\n        }\r\n        return false;\r\n      });\r\n    };\r\n    return checkVisible(columns);\r\n  }\r\n\r\n\r\n  getTotalColumnsLength(columns: any[]): number {\r\n    let count = 0;\r\n\r\n    columns.forEach(col => {\r\n      if (col.children && Array.isArray(col.children) && col.children.length) {\r\n        count += col.children.length; // count children instead of parent\r\n      } else {\r\n        count += 1; // count parent directly\r\n      }\r\n    });\r\n\r\n    return count;\r\n  }\r\n\r\n  gethasRightPinnedColumns(columns: any[]): boolean {\r\n    const checkPinnedRight = (columns: any[]): boolean => {\r\n      return columns.some((col) => {\r\n        if (col?.pinned === 'right' && col?.is_visible) return true;\r\n        if (col?.children?.length) {\r\n          return checkPinnedRight(col.children);\r\n        }\r\n        return false;\r\n      });\r\n    };\r\n    return checkPinnedRight(columns);\r\n  }\r\n\r\n  gethasLeftPinnedColumns(columns: any[]): boolean {\r\n    const checkPinnedRight = (columns: any[]): boolean => {\r\n      return columns.some((col) => {\r\n        if (col?.pinned === 'left' && col?.is_visible) return true;\r\n        if (col?.children?.length) {\r\n          return checkPinnedRight(col.children);\r\n        }\r\n        return false;\r\n      });\r\n    };\r\n    return checkPinnedRight(columns);\r\n  }\r\n\r\n\r\n  getExpandedRowCount(data: any[]): number {\r\n    let groupCount = 0;\r\n    let rowCount = 0;\r\n\r\n    data.forEach(group => {\r\n      if (group?.isGroup) {\r\n        groupCount++;\r\n\r\n        if (group?.isExpand && Array.isArray(group?.children)) {\r\n          group.children.forEach((child: any) => {\r\n            if (child.isGroup) {\r\n              if (child.isExpand && Array.isArray(child.children)) {\r\n                rowCount += child.children.length;\r\n              }\r\n            } else {\r\n              rowCount++;\r\n            }\r\n          });\r\n        }\r\n      }\r\n    });\r\n\r\n    if (groupCount === 0) {\r\n      return data.length;\r\n    }\r\n\r\n    return groupCount + rowCount;\r\n  }\r\n\r\n\r\ngetFiltersFromColumns(columns: any[], filtersConfig:any []): any[] {\r\n  const result: any[] = [];\r\n  \r\n  const checkColumn = (col: any) => {\r\n     if (col.query?.condition === 'none') {\r\n      col.query.second_value = null;\r\n      col.query.second_condition = null;\r\n    }\r\n    const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== \"\" && filtersConfig.some((ele)=> ele.field == col.field);\r\n    const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele)=> ele.field == col.field);\r\n    if (hasFirstValue || hasIds) {\r\n      result.push({\r\n        search: col.search ?? \"\",\r\n        field: col.field,\r\n        type: col.type,\r\n        _ids: col.type == 'dropdown'? col.query?._ids: [],\r\n        query: col.type == 'dropdown'? null : (col?.query?.first_value ? col?.query : null)\r\n      });\r\n    }\r\n \r\n    if (Array.isArray(col.children) && col.children.length > 0) {\r\n      col.children.forEach(checkColumn);\r\n    }\r\n  };\r\n  columns.forEach(checkColumn);\r\n \r\n  return result;\r\n}\r\n\r\nasync applyFiltersToColumns(columns: any[], filters: any[]): Promise<any[]> {\r\n  for (const col of columns) {\r\n    if (!col.query) {\r\n      col.query = {\r\n        first_value: null,\r\n        second_value: null,\r\n        first_condition: col.type !== 'date' ? 'contain' : 'equal',\r\n        second_condition: null,\r\n        condition: 'none',\r\n        _ids: []\r\n      };\r\n    }\r\n\r\n    const filter = filters.find(f => f.field === col.field);\r\n\r\n    if (filter) {\r\n      if (col.type === 'dropdown') {\r\n        const selectedIds = filter._ids ?? [];\r\n        const dropdownValues = col.column_dropdown_value ?? [];\r\n\r\n        // ✅ Map depending on dropdown value structure\r\n        let selectedLabels: string[] = [];\r\n\r\n        if (Array.isArray(dropdownValues) && dropdownValues.length > 0) {\r\n          if (typeof dropdownValues[0] === 'object') {\r\n            // object-based dropdowns: { id, name/label/value/text }\r\n            selectedLabels = dropdownValues\r\n              .filter(opt => selectedIds.includes(opt.id))\r\n              .map(opt => opt.name ?? opt.label ?? opt.value ?? opt.text ?? '');\r\n          } else {\r\n            // string-based dropdowns\r\n            selectedLabels = dropdownValues.filter(opt => selectedIds.includes(opt));\r\n          }\r\n        }\r\n\r\n        // ✅ Store readable text in filterValue (comma-separated)\r\n        col.filterValue = selectedLabels.join(', ');\r\n\r\n        // maintain query state\r\n        col.query._ids = selectedIds;\r\n        col.search = filter.search ?? '';\r\n\r\n      } else {\r\n        // ✅ Non-dropdown filters (text/date/number)\r\n        col.filterValue = filter.search || filter.query?.first_value || '';\r\n        col.search = filter.search ?? '';\r\n        col.query.first_value = filter.query?.first_value ?? null;\r\n        col.query.second_value = filter.query?.second_value ?? null;\r\n        col.query.first_condition =\r\n          filter.query?.first_condition ??\r\n          (col.type !== 'date' ? 'contain' : 'equal');\r\n        col.query.second_condition = filter.query?.second_condition ?? null;\r\n        col.query.condition = filter.query?.condition ?? 'none';\r\n      }\r\n    } else {\r\n      // Clear filter if not present\r\n      col.filterValue = null;\r\n      col.search = '';\r\n      col.query._ids = [];\r\n      col.query.first_value = null;\r\n    }\r\n\r\n    // ✅ Recursively apply for children\r\n    if (Array.isArray(col.children) && col.children.length > 0) {\r\n      col.children = await this.applyFiltersToColumns(col.children, filters);\r\n    }\r\n  }\r\n\r\n  return columns;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\nactiveFilteredColumns: any[] = [];\r\nupdateActiveFilteredColumns(columns: any[]): any[] {\r\n  const collectFiltered = (cols: any[]): any[] => {\r\n    let result: any[] = [];\r\n\r\n    for (let i = 0; i < cols.length; i++) {\r\n      const col = cols[i];\r\n      if (col.children && col.children.length > 0) {\r\n        result = result.concat(collectFiltered(col.children));\r\n      }\r\n\r\n      if (col.query) {\r\n        const hasDropdownFilter =\r\n          Array.isArray(col.query._ids) && col.query._ids.length > 0;\r\n\r\n        const hasValueFilter =\r\n          (col.query.first_value && col.query.first_value !== '') ||\r\n          (col.query.second_value && col.query.second_value !== '');\r\n\r\n        if (hasDropdownFilter || hasValueFilter) {\r\n          result.push(col);\r\n        }\r\n      }\r\n    }\r\n    return result;\r\n  };\r\n  this.activeFilteredColumns = [...collectFiltered(columns)];\r\n  return this.activeFilteredColumns;\r\n}\r\n\r\n\r\n\r\nhasFieldChanged(current: any, original: any, type: string): boolean {\r\n    switch (type) {\r\n      case 'number':\r\n        return Number(current) !== Number(original);\r\n\r\n      case 'string':\r\n        return String(current || '') !== String(original || '');\r\n\r\n      case 'dropdown':\r\n        if (typeof current === 'object' && typeof original === 'object') {\r\n          return current?.id !== original?.id || current?.value !== original?.value;\r\n        }\r\n        return current !== original;\r\n\r\n      case 'boolean':\r\n        return Boolean(current) !== Boolean(original);\r\n\r\n      case 'date':\r\n        const currentDate = new Date(current).getTime();\r\n        const originalDate = new Date(original).getTime();\r\n        return isNaN(currentDate) || isNaN(originalDate)\r\n          ? current !== original\r\n          : currentDate !== originalDate;\r\n\r\n      default:\r\n        return JSON.stringify(current) !== JSON.stringify(original);\r\n    }\r\n  }\r\n\r\n\r\n   // Copy column data to column dropdown values in case of absence\r\n async copyDropdownDataRecursively(columns: any[]): Promise<any[]> {\r\n  for (const col of columns) {\r\n    if (col.type === 'dropdown') {\r\n      const dropdownValues = col.column_dropdown_value;\r\n      const dataValues = col.column_data;\r\n\r\n      if (\r\n        (!Array.isArray(dropdownValues) || dropdownValues.length === 0) &&\r\n        Array.isArray(dataValues) &&\r\n        dataValues.length > 0\r\n      ) {\r\n        col.column_dropdown_value = dataValues.map(item =>\r\n          typeof item === 'object'\r\n            ? item\r\n            : { id: item, name: item, value: item }\r\n        );\r\n      }\r\n    }\r\n\r\n    if (Array.isArray(col.children) && col.children.length > 0) {\r\n      col.children = await this.copyDropdownDataRecursively(col.children);\r\n    }\r\n  }\r\n\r\n  return columns;\r\n}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CopyServiceService {\r\n\r\n  constructor() { }\r\n  getSelectedDataForCopy(\r\n    dataSet: any[],\r\n    columns: any[],\r\n    rowSelectedIndexes: Set<number>,\r\n    selectedCells: any[],\r\n    getNestedValue: (obj: any, path: string) => any\r\n  ): any[][] {\r\n    columns = columns.filter(col => col.is_visible);\r\n    const copiedRows: any[][] = [];\r\n    const findRowByVirtualIndex = (vIndex: number) =>\r\n      dataSet.find((r: any) => r.__virtualIndex === vIndex);\r\n    if (rowSelectedIndexes && rowSelectedIndexes.size > 0) {\r\n      const sortedIndexes = [...rowSelectedIndexes].sort((a, b) => a - b);\r\n      for (const vIndex of sortedIndexes) {\r\n        const row = findRowByVirtualIndex(vIndex);\r\n        if (!row) continue;\r\n        const extractValue = (field: string): string => {\r\n          const nested = getNestedValue(row, field);\r\n          const value =\r\n            nested?.value ??\r\n            nested?.name ??\r\n            nested ??\r\n            '-';\r\n\r\n          if (Array.isArray(value)) {\r\n            return value\r\n              .map(v =>\r\n                typeof v === 'object'\r\n                  ? (v.departmentName ?? v.roleName ?? '')\r\n                  : (v?.toString() ?? '')\r\n              )\r\n              .join(', ');\r\n          }\r\n          return value ?? '';\r\n        };\r\n        const mapped = columns.map(col => {\r\n          if (col.children && Array.isArray(col.children)) {\r\n            return col.children.map((c: { field: string }) => extractValue(c.field));\r\n          }\r\n          return [extractValue(col.field)];\r\n        });\r\n        const rowValues = mapped.reduce<string[]>((acc, curr) => acc.concat(curr), []);\r\n        copiedRows.push(rowValues);\r\n      }\r\n    }\r\n    if (selectedCells && selectedCells.length > 0) {\r\n      const rowsMap = new Map<number, any[]>();\r\n      for (const cell of selectedCells) {\r\n        const row = findRowByVirtualIndex(cell.rowIndex);\r\n        if (!row) continue;\r\n        const col = columns[cell.colIndex];\r\n        let fieldName = col?.field;\r\n        if (col?.children && col.children[cell.subColIndex]) {\r\n          fieldName = col.children[cell.subColIndex].field;\r\n        }\r\n        let value = getNestedValue(row, fieldName) || getNestedValue(row, fieldName)?.name || getNestedValue(row, fieldName) || '-';\r\n        if (Array.isArray(value)) {\r\n          value = value\r\n            .map(v =>\r\n              typeof v === 'object'\r\n                ? v.departmentName ?? v.roleName ?? v.full_name ?? ''\r\n                : v?.toString() ?? ''\r\n            )\r\n            .join(', ');\r\n        } else {\r\n          value = value ?? '';\r\n        }\r\n        if (!rowsMap.has(cell.rowIndex)) rowsMap.set(cell.rowIndex, []);\r\n        rowsMap.get(cell.rowIndex)!.push(value);\r\n      }\r\n      const sortedCells = [...rowsMap.entries()]\r\n        .sort(([a], [b]) => a - b)\r\n        .map(([_, v]) => v);\r\n      copiedRows.push(...sortedCells);\r\n    }\r\n    if (copiedRows.length === 0) {\r\n      const activeCell = document.querySelector('.active-cell');\r\n      if (activeCell) return [[activeCell.textContent?.trim() || '']];\r\n    }\r\n\r\n    const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);\r\n    return copiedRows.map(row => {\r\n      const newRow = [...row];\r\n      while (newRow.length < maxCols) newRow.push('');\r\n      return newRow;\r\n    });\r\n  }\r\n\r\n\r\n  copyToClipboard(\r\n    selectedData: any[][],\r\n    selector = '.selected-cell, .active-cell, .row-selected'\r\n  ): void {\r\n    if (!selectedData || selectedData.length === 0) return;\r\n    const textToCopy = selectedData\r\n      .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\r\n      .join('\\n');\r\n    navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\r\n    const selectedEls = document.querySelectorAll(selector);\r\n    selectedEls.forEach(el => el.classList.add('flash-bg'));\r\n    setTimeout(() => {\r\n      selectedEls.forEach(el => el.classList.remove('flash-bg'));\r\n    }, 1000);\r\n  }\r\n\r\n\r\nupdateRows: any[] = [];\r\n  currentColums : any = []\r\n  async pasteFromClipboardText(\r\n    text: string,\r\n    dataSet: any[],\r\n    columns: any[],\r\n    startRowIndex: number,\r\n    startColIndex: number,\r\n    startSubColIndex: number = 0\r\n  ): Promise<any> {\r\n    if (!text) return [];\r\n    this.updateRows = [];\r\n    const rows = text.split(/\\r?\\n/).map(r => r.split('\\t'));\r\n    const flattenedColumns: any[] = [];\r\n    columns.forEach(col => {\r\n      if (col.children?.length) {\r\n        col.children.forEach((child: any) => flattenedColumns.push({ parent: col, ...child }));\r\n      } else {\r\n        flattenedColumns.push(col);\r\n      }\r\n    });\r\n    let startFlattenedIndex = 0;\r\n    for (let i = 0; i < startColIndex; i++) {\r\n      const col = columns[i];\r\n      startFlattenedIndex += col.children?.length || 1;\r\n    }\r\n    const startCol = columns[startColIndex];\r\n    if (startCol?.children?.length) {\r\n      startFlattenedIndex += Math.min(startSubColIndex, startCol.children.length - 1);\r\n    }\r\n \r\n    rows.forEach((rowValues, rOffset) => {\r\n      const targetRowIndex = startRowIndex + rOffset;\r\n      const row = dataSet.find(r => r?.__virtualIndex === targetRowIndex);\r\n      if (!row) return;\r\n \r\n      rowValues.forEach((value, cOffset) => {\r\n        const targetIndex = startFlattenedIndex + cOffset;\r\n        if (targetIndex < 0 || targetIndex >= flattenedColumns.length) return;\r\n \r\n        const targetColumn = flattenedColumns[targetIndex];\r\n        if(!targetColumn || !targetColumn.is_editable) return;\r\n         if (targetColumn?.type === 'string') {\r\n          this.currentColums.push(targetColumn);\r\n            this.setNestedValue(row, targetColumn, value);\r\n          } else if (targetColumn.type === 'number') {\r\n            const num = Number(value);\r\n            if (!isNaN(num) && value !== '') {\r\n              this.currentColums.push(targetColumn);\r\n              this.setNestedValue(row, targetColumn, num);\r\n            }\r\n          }\r\n      });\r\n    });\r\n \r\n    return {updateRows : this.updateRows, currentColums : this.currentColums};\r\n  }\r\n\r\n\r\n  setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n    if (column.type === 'date' || column.type === 'image') return;\r\n    const path = column.field;\r\n    if (!path) return;\r\n    const keys = path.split('.');\r\n    const lastKey = keys.pop();\r\n    const parent = keys.reduce((acc: any, key: string) => (acc[key] ??= {}), obj);\r\n    if (parent && lastKey) {\r\n      if (typeof option === 'object' && option !== null) {\r\n        parent[lastKey] = {\r\n          id: option.id ?? 1,\r\n          value: option.value ?? option,\r\n        };\r\n      } else {\r\n        parent[lastKey] = option;\r\n      }\r\n    }\r\n    const sendObj = {\r\n      data: { ...obj },\r\n      eventType: 'onCellEdit',\r\n    };\r\n    this.updateRows.push(obj);\r\n  }\r\n\r\n\r\n  cutSelectedSelectedData(\r\n    dataSet: any[],\r\n    rowSelectedIndexes: Set<number>,\r\n    selectedCells: any[],\r\n    columns: any[],\r\n    setNestedValue: (obj: any, column: any, value: any) => void\r\n  ): any {\r\n    let updatedData = [...dataSet];\r\n    if (rowSelectedIndexes?.size) {\r\n      const indexes = [...rowSelectedIndexes];\r\n      updatedData = updatedData.filter(\r\n        (row: any) => !indexes.includes(row.__virtualIndex)\r\n      );\r\n      // rowSelectedIndexes.clear();\r\n    }\r\n    else if (selectedCells?.length) {\r\n      this.updateRows = [];\r\n      for (const cell of selectedCells) {\r\n        const row = updatedData.find(r => r.__virtualIndex === cell.rowIndex);\r\n        if (!row) continue;\r\n        let col = columns[cell.colIndex];\r\n        if (col?.children && col.children[cell.subColIndex]) {\r\n          col = col.children[cell.subColIndex];\r\n        }\r\n        this.setNestedValue(row, col, '');\r\n      }\r\n      // selectedCells.length = 0;\r\n    }\r\n    return {updatedData: updatedData, updatedRows: this.updateRows};\r\n  }\r\n\r\n\r\n  cutWithAnimation(\r\n    selectedData: any[][],\r\n    selector = '.selected-cell, .active-cell, .row-selected'\r\n  ): void {\r\n    if (!selectedData || selectedData.length === 0) return;\r\n\r\n    const textToCopy = selectedData\r\n      .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\r\n      .join('\\n');\r\n\r\n    navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\r\n\r\n    // Apply red cut animation\r\n    const selectedEls = document.querySelectorAll(selector);\r\n    selectedEls.forEach(el => el.classList.add('cut-flash-bg'));\r\n    setTimeout(() => {\r\n      selectedEls.forEach(el => el.classList.remove('cut-flash-bg'));\r\n    }, 1000);\r\n  }\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as XLSX from 'xlsx-js-style';\r\nimport { saveAs } from 'file-saver';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ExportService {\r\n\r\n  constructor() {}\r\n\r\n  /**\r\n   * Exports data to CSV or Excel.\r\n   * @param columns List of column definitions (each having name/key/is_visible)\r\n   * @param data The array of data objects\r\n   * @param fileName Name of the exported file (without extension)\r\n   * @param format 'csv' | 'xlsx'\r\n   */\r\nexportData(\r\n  columns: any[],\r\n  data: any[],\r\n  fileName: string,\r\n  format: 'csv' | 'xlsx' = 'xlsx',\r\n  rowSelectedIndexes: Set<number> | null = new Set(),\r\n  styleConfig: {\r\n    headerBgColor?: string;\r\n    headerTextColor?: string;\r\n    bodyTextColor?: string;\r\n    fontFamily?: string;\r\n    fontWeight?: 'normal' | 'bold';\r\n    zoomScale?: number;\r\n    headerRowHeight?: number;\r\n    selectedRowBgColor?: string;\r\n  } = {}\r\n) {\r\n  const {\r\n    headerBgColor = '#228B22',\r\n    headerTextColor = '#FFFFFF',\r\n    bodyTextColor = '#000000',\r\n    fontFamily = 'Calibri',\r\n    fontWeight = 'normal',\r\n    zoomScale = 120,\r\n    headerRowHeight = 20,\r\n    selectedRowBgColor = '#8AC5FF',\r\n  } = styleConfig;\r\n\r\n  const visibleColumns = columns.filter(\r\n    col => col.is_visible && col.type !== 'image' && col.type !== 'logo'\r\n  );\r\n\r\n  const headers = visibleColumns.map(col => col.header || col.headerName || col.name);\r\n\r\n  const flattenValue = (value: any): any => {\r\n    if (value == null) return '';\r\n    if (Array.isArray(value))\r\n      return value.map(v => (typeof v === 'object' ? flattenValue(v) : v)).join(', ');\r\n    if (typeof value === 'object')\r\n      return Object.entries(value)\r\n        .map(([k, v]) => `${k}: ${flattenValue(v)}`)\r\n        .join(', ');\r\n    return value;\r\n  };\r\n\r\n  const exportData = data.map(row =>\r\n    visibleColumns.reduce((acc: any, col) => {\r\n      const header = col.headerName || col.name || col.header;\r\n      let value = this.getNestedValue(row, col.field);\r\n\r\n      switch (col.type) {\r\n        case 'boolean':\r\n          value = value ? 'Yes' : 'No';\r\n          break;\r\n        case 'date':\r\n          if (value) {\r\n            const date = new Date(value);\r\n            if (!isNaN(date.getTime())) {\r\n              value = date.toLocaleDateString('en-US', {\r\n                day: '2-digit',\r\n                month: 'long',\r\n                year: 'numeric',\r\n              });\r\n            }\r\n          }\r\n          break;\r\n        default:\r\n          value = flattenValue(value);\r\n      }\r\n\r\n      acc[header] = value;\r\n      return acc;\r\n    }, {})\r\n  );\r\n\r\n  const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(exportData, { header: headers });\r\n\r\n  // ✅ Define a reusable border style\r\n  const borderStyle = {\r\n    top: { style: 'thin', color: { rgb: 'CCCCCC' } },\r\n    bottom: { style: 'thin', color: { rgb: 'CCCCCC' } },\r\n    left: { style: 'thin', color: { rgb: 'CCCCCC' } },\r\n    right: { style: 'thin', color: { rgb: 'CCCCCC' } },\r\n  };\r\n\r\n  // ✅ Apply header styles\r\n  headers.forEach((header, index) => {\r\n    const cellAddress = XLSX.utils.encode_cell({ r: 0, c: index });\r\n    if (!worksheet[cellAddress]) return;\r\n\r\n    worksheet[cellAddress].s = {\r\n      fill: { fgColor: { rgb: headerBgColor.replace('#', '') } },\r\n      font: {\r\n        name: fontFamily,\r\n        sz: 14,\r\n        color: { rgb: headerTextColor.replace('#', '') },\r\n        bold: fontWeight === 'bold',\r\n      },\r\n      alignment: { horizontal: 'center', vertical: 'center' },\r\n      border: borderStyle, // ✅ Added border here\r\n    };\r\n  });\r\n\r\n  // ✅ Apply body styles + highlight selected rows\r\n  for (let r = 1; r <= exportData.length; r++) {\r\n    const isSelected = rowSelectedIndexes?.has(r - 1);\r\n    const rowBgColor = isSelected ? selectedRowBgColor : '#FFFFFF';\r\n\r\n    for (let c = 0; c < headers.length; c++) {\r\n      const col = visibleColumns[c];\r\n      const cellAddress = XLSX.utils.encode_cell({ r, c });\r\n      const cell = worksheet[cellAddress];\r\n      if (!cell) continue;\r\n\r\n      let horizontalAlign = 'left';\r\n      if (['number', 'boolean', 'date'].includes(col.type)) horizontalAlign = 'center';\r\n\r\n      cell.s = {\r\n        fill: { fgColor: { rgb: rowBgColor.replace('#', '') } },\r\n        font: {\r\n          name: fontFamily,\r\n          sz: 14,\r\n          color: { rgb: bodyTextColor.replace('#', '') },\r\n          bold: false,\r\n        },\r\n        alignment: { horizontal: horizontalAlign, vertical: 'center', wrapText: true },\r\n        border: borderStyle, // ✅ Added border here too\r\n      };\r\n    }\r\n  }\r\n\r\n  // ✅ Adjust column widths\r\n  const colWidths = headers.map(header => {\r\n    let maxLength = header.length;\r\n    exportData.forEach(row => {\r\n      const val = row[header];\r\n      if (val != null) {\r\n        const len = val.toString().length;\r\n        if (len > maxLength) maxLength = len;\r\n      }\r\n    });\r\n    return { wch: Math.min(maxLength + 2, 64) };\r\n  });\r\n  worksheet['!cols'] = colWidths;\r\n\r\n  worksheet['!rows'] = [{ hpt: headerRowHeight }];\r\n  worksheet['!zoom'] = zoomScale;\r\n\r\n  const workbook: XLSX.WorkBook = { Sheets: { Data: worksheet }, SheetNames: ['Data'] };\r\n\r\n  if (format === 'csv') {\r\n    const csv = XLSX.utils.sheet_to_csv(worksheet);\r\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\r\n    saveAs(blob, `${fileName}.csv`);\r\n  } else {\r\n    const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });\r\n    const blob = new Blob([excelBuffer], {\r\n      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8',\r\n    });\r\n    saveAs(blob, `${fileName}.xlsx`);\r\n  }\r\n}\r\n\r\n\r\n\r\n\r\nprivate getNestedValue(obj: any, path: string): any {\r\n  if (!path || typeof obj !== 'object') return obj;\r\n  return path.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : ''), obj);\r\n}\r\n}\r\n","import {\r\n  Directive,\r\n  Input,\r\n  OnInit,\r\n  ViewContainerRef,\r\n  Injector,\r\n  ComponentRef,\r\n  Type,\r\n  EventEmitter,\r\n  Output\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n  selector: '[cellRenderInit]'\r\n})\r\nexport class CellRenderInitDirective implements OnInit {\r\n  @Input('cellRenderInit') componentType!: Type<any>;\r\n  @Input() rowData: any;\r\n  @Input() colData: any;\r\n  @Input() cellValue: any;\r\n\r\n  @Output() cellEvent = new EventEmitter<{ eventName: string; data: any }>();\r\n\r\n  constructor(private vcr: ViewContainerRef, private injector: Injector) { }\r\n\r\n  ngOnInit(): void {\r\n    if (!this.componentType) return;\r\n\r\n    // ✅ Dynamically create the component\r\n    const componentRef: ComponentRef<any> = this.vcr.createComponent(this.componentType, {\r\n      injector: Injector.create({\r\n        providers: [\r\n          { provide: 'rowData', useValue: this.rowData },\r\n          { provide: 'colData', useValue: this.colData },\r\n          { provide: 'cellValue', useValue: this.cellValue }\r\n        ],\r\n        parent: this.injector\r\n      })\r\n    });\r\n\r\n    // ✅ Automatically call custom lifecycle hook if present\r\n    if (typeof componentRef.instance.gridInit === 'function') {\r\n      componentRef.instance.gridInit({\r\n        row: this.rowData,\r\n        col: this.colData,\r\n        value: this.cellValue\r\n      });\r\n    }\r\n    for (const key of Object.keys(componentRef.instance)) {\r\n      const property = componentRef.instance[key];\r\n      if (property instanceof EventEmitter) {\r\n        property.subscribe((value: any) => {\r\n          this.cellEvent.emit({\r\n            eventName: key,\r\n            data: {\r\n              row: this.rowData,\r\n              col: this.colData,\r\n              value,\r\n            }\r\n          });\r\n        });\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n  name: 'filter',\r\n})\r\nexport class FilterPipe implements PipeTransform {\r\ntransform(items: any[], searchText: string, key?: string): any[] {\r\n  if (!items || !searchText) return items;\r\n \r\n  const lowerSearch = searchText.toLowerCase();\r\n \r\n  return items.filter(item => {\r\n    if (key && item && typeof item === 'object') {\r\n      const value = item[key];\r\n      return value?.toString().toLowerCase().includes(lowerSearch);\r\n    }\r\n    if (typeof item === 'string' || typeof item === 'number') {\r\n      return item.toString().toLowerCase().includes(lowerSearch);\r\n    }\r\n    return false;\r\n  });\r\n}}\r\n","import {\r\n  Component,\r\n  OnInit,\r\n  Input,\r\n  Output,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  ElementRef,\r\n  ViewChild,\r\n  AfterViewInit,\r\n  HostListener,\r\n  ChangeDetectorRef,\r\n  EventEmitter,\r\n  NgZone,\r\n  Renderer2,\r\n  AfterViewChecked,\r\n  EmbeddedViewRef,\r\n  TemplateRef,\r\n  ChangeDetectionStrategy,\r\n  QueryList,\r\n  ViewChildren,\r\n  inject,\r\n  Injector\r\n} from '@angular/core';\r\nimport { SplitColumnsService } from '../services/split-columns.service';\r\nimport { CommonService } from '../services/common.service';\r\nimport {\r\n  CdkDrag,\r\n  CdkDragDrop,\r\n  CdkDragEnd,\r\n  CdkDragEnter,\r\n  CdkDragExit,\r\n  CdkDragMove,\r\n  CdkDragSortEvent,\r\n  CdkDragStart,\r\n  DragDrop,\r\n  moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\nimport {\r\n  trigger,\r\n  state,\r\n  style,\r\n  transition,\r\n  animate,\r\n  query,\r\n  stagger,\r\n} from '@angular/animations';\r\nimport { CdkDropList } from '@angular/cdk/drag-drop';\r\nimport { STATUSES_BADGE_MAP } from './statuses';\r\nimport { CopyServiceService } from '../services/copy-service.service';\r\nimport { take } from 'rxjs';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { ExportService } from '../services/export.service';\r\nimport { CellHostDirective } from '../directives/cellHost.directive';\r\n\r\ninterface CellPosition {\r\n  rowIndex: number;\r\n  colIndex: number;\r\n  subColIndex: number;\r\n  field: string;\r\n  key: string;\r\n}\r\nexport enum RowAnimationType {\r\n  None = 'none',\r\n  Spread = 'spreadAnimation',\r\n  Bounce = 'bounceAnimation',\r\n  SlideUp = 'slideUpFromBottom',\r\n  Flip = 'flipAnimation',\r\n  Skew = 'skewAnimation',\r\n  SlideRight = 'slideFromRight',\r\n}\r\n\r\n\r\nexport const sortingAnimation = trigger('listSort', [\r\n  transition('* => *', [\r\n    // Query all elements entering or leaving\r\n    query(':enter, :leave', style({ position: 'absolute', width: '100%' }), { optional: true }),\r\n\r\n    // Animate leaving elements upward with fade out\r\n    query(':leave', [\r\n      animate('300ms ease-in', style({ transform: 'translateY(-20px)', opacity: 0 }))\r\n    ], { optional: true }),\r\n\r\n    // Stagger the entering elements for a smoother effect\r\n    query(':enter', [\r\n      style({ transform: 'translateY(20px)', opacity: 0 }),\r\n      stagger(50, [\r\n        animate('300ms ease-out', style({ transform: 'translateY(0)', opacity: 1 }))\r\n      ])\r\n    ], { optional: true })\r\n  ])\r\n]);\r\n@Component({\r\n  selector: 'data-grid',\r\n  templateUrl: './data-grid.component.html',\r\n  styleUrls: ['./data-grid.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  animations: [\r\n    trigger('accordionToggle', [\r\n      state(\r\n        'collapsed',\r\n        style({ height: '0px', overflow: 'unset' })\r\n      ),\r\n      state('expanded', style({ height: '*', overflow: 'unset' })),\r\n      transition('collapsed <=> expanded', animate('300ms ease-in')),\r\n    ]),\r\n    trigger('slideToggle', [\r\n      transition(':enter', [\r\n        style({ height: '0px', opacity: 0, overflow: 'hidden' }),\r\n        animate('300ms ease-out', style({ height: '*', opacity: 1 }))\r\n      ]),\r\n      transition(':leave', [\r\n        style({ height: '*', opacity: 1, overflow: 'hidden' }),\r\n        animate('300ms ease-in', style({ height: '0px', opacity: 0 }))\r\n      ])\r\n    ]),\r\n    trigger('slideUp', [\r\n      state('void', style({ transform: 'translateY(100%)', opacity: 0 })),\r\n      state('*', style({ transform: 'translateY(0)', opacity: 1 })),\r\n      transition('void => *', animate('300ms ease-out')),\r\n      transition('* => void', animate('300ms ease-in')),\r\n    ]),\r\n  trigger('rowDynamic', [\r\n\r\n  /* -------------------- SPREAD -------------------- */\r\n    transition('* => spreadAnimation', [\r\n      query(':enter', [\r\n        style({ opacity: 0, transform: 'scaleX(0.7)' }),\r\n        stagger(60, [\r\n          animate('350ms ease-out',\r\n            style({ opacity: 1, transform: 'scaleX(1)' })\r\n          )\r\n        ])\r\n      ], { optional: true }),\r\n\r\n      query(':leave', [\r\n        stagger(40, [\r\n          animate('220ms ease-in',\r\n            style({ opacity: 0, transform: 'scaleX(0.7)' })\r\n          )\r\n        ])\r\n      ], { optional: true })\r\n    ]),\r\n\r\n    /* -------------------- BOUNCE -------------------- */\r\n    transition('* => bounceAnimation', [\r\n      query(':enter', [\r\n        style({ opacity: 0, transform: 'translateY(-10px)' }),\r\n        stagger(45, [\r\n          animate(\r\n            '500ms cubic-bezier(.68,-0.55,.27,1.55)',\r\n            style({ opacity: 1, transform: 'translateY(0)' })\r\n          )\r\n        ])\r\n      ], { optional: true }),\r\n\r\n      query(':leave', [\r\n        stagger(40, [\r\n          animate('200ms ease-in',\r\n            style({ opacity: 0, transform: 'translateY(10px)' })\r\n          )\r\n        ])\r\n      ], { optional: true })\r\n    ]),\r\n\r\n    /* -------------------- NEW 1: FLIP -------------------- */\r\n    transition('* => flipAnimation', [\r\n      query(':enter', [\r\n        style({ opacity: 0, transform: 'rotateX(-80deg)' }),\r\n        stagger(70, [\r\n          animate('450ms ease-out',\r\n            style({ opacity: 1, transform: 'rotateX(0)' })\r\n          )\r\n        ])\r\n      ], { optional: true }),\r\n\r\n      query(':leave', [\r\n        stagger(50, [\r\n          animate('250ms ease-in',\r\n            style({ opacity: 0, transform: 'rotateX(80deg)' })\r\n          )\r\n        ])\r\n      ], { optional: true })\r\n    ]),\r\n\r\n    /* -------------------- NEW 2: SKEW -------------------- */\r\n    transition('* => skewAnimation', [\r\n      query(':enter', [\r\n        style({ opacity: 0, transform: 'skewY(6deg) translateY(8px)' }),\r\n        stagger(60, [\r\n          animate('320ms ease-out',\r\n            style({ opacity: 1, transform: 'skewY(0deg) translateY(0)' })\r\n          )\r\n        ])\r\n      ], { optional: true }),\r\n\r\n      query(':leave', [\r\n        stagger(40, [\r\n          animate('220ms ease-in',\r\n            style({ opacity: 0, transform: 'skewY(-6deg) translateY(-8px)' })\r\n          )\r\n        ])\r\n      ], { optional: true })\r\n    ]),\r\n    transition('* => slideUpFromBottom', [\r\n        query(':enter', [\r\n          style({ opacity: 0, transform: 'translateY(100vh)' }),\r\n          stagger(60, [\r\n            animate('500ms cubic-bezier(0.25, 0.8, 0.25, 1)',\r\n              style({ opacity: 1, transform: 'translateY(0)' })\r\n            )\r\n          ])\r\n        ], { optional: true }),\r\n\r\n        query(':leave', [\r\n          stagger(40, [\r\n            animate('300ms ease-in',\r\n              style({ opacity: 0, transform: 'translateY(-50px)' })\r\n            )\r\n          ])\r\n        ], { optional: true })\r\n      ]),\r\n\r\n      transition('* => slideFromRight', [\r\n        query(':enter', [\r\n          style({ opacity: 0, transform: 'translateX(100vw)' }),\r\n          stagger(60, [\r\n            animate('500ms cubic-bezier(0.25, 0.8, 0.25, 1)',\r\n              style({ opacity: 1, transform: 'translateX(0)' }) \r\n            )\r\n          ])\r\n        ], { optional: true }),\r\n\r\n        query(':leave', [\r\n          stagger(40, [\r\n            animate('300ms ease-in',\r\n              style({ opacity: 0, transform: 'translateX(50px)' })\r\n            )\r\n          ])\r\n        ], { optional: true })\r\n      ]),\r\n\r\n\r\n\r\n  ])\r\n\r\n\r\n  ],\r\n\r\n})\r\nexport class DataGridComponent implements OnChanges, AfterViewInit, OnInit, AfterViewChecked {\r\n  //  **************************************//\r\n  //  **************************************//\r\n  // **********  Input Goes Here *********** //\r\n  //  **************************************//\r\n  //  **************************************//\r\n\r\n\r\n@Input() rowAnimation: RowAnimationType = RowAnimationType.None;\r\n\r\n  // Pagination Config Store Here\r\n  @Input() paginationConfig: any = {};\r\n\r\n  // The dataset store here;\r\n  @Input() dataSet: any[] = [];\r\n\r\n  // The columns Store Here\r\n  @Input() columns: any[] = [];\r\n\r\n  // Row Height;\r\n  @Input() rowHeight: number = 44;\r\n\r\n  // Header Row Height;\r\n  @Input() headerRowHeight: number = 50;\r\n\r\n  // Show Vertical Borders;\r\n  @Input() showVerticalBorder: boolean = false;\r\n\r\n  // Even Rows Background Color;\r\n  @Input() evenRowsBackgroundColor: string | undefined = '';\r\n\r\n  // Even Rows Background Color;\r\n  @Input() oddRowsBackgroundColor: string | undefined = '#f2f2f2';\r\n\r\n  // Header Rows Background Color;\r\n  @Input() headerBackgroundColor: string = '#f6f8ff';\r\n\r\n  // Header Rows Background Color;\r\n  @Input() checkboxesBackgroundColor: string = '#f6f8ff';\r\n\r\n  // Show Columns Grouping;\r\n  @Input() showColumnsGrouping: boolean = false;\r\n\r\n  // Row Hovered Background color;\r\n  @Input() rowHoverColor: string | undefined = 'rgba(0, 123, 255, 0.1)';\r\n\r\n  // Left PinnedBackground color;\r\n  @Input() leftPinnedBackgroundColor: string | undefined = '#f6f8ff';\r\n\r\n  // Body Background color;\r\n  @Input() bodyBackgroundColor: string | undefined = '#f6f8ff';\r\n\r\n  // Right Pinned Background color;\r\n  @Input() rightPinnedBackgroundColor: string | undefined = '#f6f8ff';\r\n\r\n  // Side Menu Background color;\r\n  @Input() sidemenuBackgroundColor: string | undefined = '#f6f8ff';\r\n\r\n  // Body text color;\r\n  @Input() bodyTextColor: string | undefined = '#0c112b';\r\n\r\n  // Header text color;\r\n  @Input() headerTextColor: string | undefined = '#2a1f73';\r\n\r\n  // Header text color;\r\n  @Input() checkboxesColor: string | undefined = '#2a1f73';\r\n\r\n  // Header text size;\r\n  @Input() headerTextFontsSize: number | undefined = 14;\r\n\r\n  // Body text color;\r\n  @Input() bodyTextFontsSize: number | undefined = 14;\r\n\r\n  // Header font weight;\r\n  @Input() headerFontWeight: number | undefined = 500;\r\n\r\n  // Body Font Weight;\r\n  @Input() bodyFontWeight: number | undefined = 400;\r\n\r\n  // Checked Row Background Color;\r\n  @Input() checkedRowBackgroundColor: string | undefined = 'aliceblue';\r\n\r\n  // dropdowns Background Color;\r\n  @Input() dropdownsBackgroundColor: string | undefined = '#f6f8f8';\r\n\r\n\r\n  @Input() footerRowBackgroundColor: string | undefined = '';\r\n\r\n  // Footer row Height;\r\n  @Input() footerRowHeight: number = 46;\r\n\r\n  // Footer row Height;\r\n  @Input() topGroupedBadgesBackgroundColor: string | undefined = '';\r\n\r\n  // Show Row wise grouping;\r\n  @Input() showRowsGrouping: boolean | undefined = false;\r\n\r\n  // Show Row wise grouping;\r\n  @Input() showFilterRow: boolean | undefined = false;\r\n\r\n  // Show Row wise grouping;\r\n  @Input() fontFaimly: string | undefined = 'sans-serif';\r\n\r\n  // Show SideColumn;\r\n  @Input() showSideMenu: boolean = false;\r\n\r\n  // Footer Padding\r\n  @Input() footerPadding: number = 3\r\n\r\n\r\n  // Footer Padding\r\n  @Input() topFilterRowHeight: number = 50;\r\n\r\n  // Show Rows shading\r\n  @Input() rowShadingEnabled: boolean = false;\r\n\r\n  // Show Rows shading\r\n  @Input() showSerialNumber: boolean = false;\r\n\r\n  // Single Spa Url Attach to icons\r\n  @Input() singleSpaAssetsPath: string = 'assets/';\r\n\r\n\r\n  // Applied Filters\r\n  @Input() filtersConfig: any[] = [];\r\n\r\n\r\n  // Applied Filters\r\n  @Input() loading: boolean = false;\r\n\r\n  //Vertical Scrollbar style\r\n  @Input() verticalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n  //Horizintal Scrollbar style\r\n  @Input() horizintalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n  // Show Cell details box\r\n  @Input() showCellDetailsBox: boolean = false;\r\n\r\n  //Date format\r\n\r\n  @Input() dateFormat: string = 'dd/MM/yyyy'\r\n\r\n  //Date format\r\n  @Input() tableSearch: string = '';\r\n\r\n\r\n  //Date format\r\n  @Input() actions: any[] = ['edit', 'delete'];\r\n\r\n\r\n  // Table Config for paginations is here\r\n  @Input() config: any;\r\n\r\n\r\n  // Selection task bar\r\n  @Input() showTaskbar = false\r\n\r\n  // Table Name for state manage\r\n  @Input() tableName = true\r\n\r\n\r\n  // Listing type\r\n  @Input() listingType: string | boolean = '';\r\n\r\n  // Listing type\r\n\r\n  @Input() checkboxState: { reset: boolean } = {\r\n    reset: true\r\n  }\r\n\r\n  // Taskbar actions\r\n  @Input() taskbarActions: any[] = []\r\n\r\n\r\n  // Sorting Config to show sort icons\r\n  @Input() sortingConfig: { field: string, order_by: string } | null = null;\r\n\r\n\r\n  @Input() tableFilterViewId: any = '';\r\n\r\n\r\n  @Input() selectedTableLayout: any = 'medium'\r\n\r\n  @Input() closeDropdown: { preset: { closed: boolean, loading: boolean } } = { preset: { closed: false, loading: false } };\r\n\r\n  // Table View\r\n\r\n  // GlobalSearch\r\n  @Input() globalSearchText: string = '';\r\n\r\n  // Nested Table Row Fontsize\r\n  @Input() nestedTablerowFontsize = 14;\r\n\r\n  // Nested table row Header row Height\r\n  @Input() nestedTableHeaderRowHeight = 40;\r\n\r\n  // Nested Table row height\r\n  @Input() nestedTablerowHeight = 45;\r\n\r\n\r\n  @Input() gridType: string = '';\r\n\r\n  @Input() currencySymbol: string = '$';\r\n\r\n\r\n  @Input() leftPinnedBoxshadow: string = '';\r\n\r\n  @Input() rightPinnedBoxshadow: string = '';\r\n\r\n  // GlobalSearch\r\n  @Input() selectedRowsBackgroundColor: string = '#8ac5ff';\r\n\r\n  // GlobalSearch\r\n  @Input() nestedTableHeaderBackgroundColor: string = '#f6f8ff';\r\n\r\n\r\n  @Input() nestedTableRowBackgroundColor: string = '#eaeaea';\r\n\r\n  @Input() tableView: any[] = [];\r\n\r\n  @Input() buttons: { name: string; is_showIcon: boolean; icon: string, has_permission: boolean }[] = [];\r\n\r\n  @Input() keepMultipleExpandedDetails = false;\r\n\r\n\r\n  @Input() showTotalAmountRow = false;\r\n\r\n\r\n  @Input() enableGlobalSearch = true;\r\n\r\n\r\n  @Input() tableType = '';\r\n\r\n\r\n  @Input() enableExport = false;\r\n\r\n\r\n  @Input() showFullScreenButton = false;\r\n\r\n\r\n  @Input() enableCut = false;\r\n\r\n\r\n  @Input() tabs: string[] = [];\r\n\r\n  @Input() showCheckboxes = true;\r\n\r\n\r\n\r\n\r\n  @Input() resetAllFilters = { resetAll: false };\r\n\r\n\r\n  @Input() columnThreedotsMunuConfig = {\r\n    showPinleft: true,\r\n    showPinright: true,\r\n    showAscending: true,\r\n    showDescending: true,\r\n    showFilter: true,\r\n    showRowsGrouping: this.showRowsGrouping,\r\n    showAutosizeAllColumns: true,\r\n    showAutosizeThisColumn: false,\r\n    showChoseColumns: false,\r\n    showResetColumns: false,\r\n  };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  // ///////////////////////////////////////////////////////////////////////////////////////////\r\n  // ///////////////////////////////////////////////////////////////////////////////////////////\r\n  //                         Out Put Events\r\n  // ///////////////////////////////////////////////////////////////////////////////////////////\r\n  // ///////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n  //Change Table Layout\r\n  @ViewChildren(CellHostDirective) cellHosts!: QueryList<CellHostDirective>;\r\n\r\n  @Output() public changeLayout = new EventEmitter<any>();\r\n\r\n  @Output() public customCellEvent = new EventEmitter<any>();\r\n\r\n  // Filter Apply event;\r\n  @Output() public filterOptions = new EventEmitter<any>();\r\n\r\n  @Output() genericEvent: EventEmitter<any> = new EventEmitter();\r\n\r\n  @Output() tablePresetConfig: EventEmitter<any> = new EventEmitter();\r\n\r\n  @Output() sortingOrderOptions: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n  @Output() createUpdateConfigListing: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  isFullScreen = false;\r\n  activeTab: string | null = null;\r\n  groupedColumns: any[] = [];\r\n  activeCol: any = null;\r\n  activeFilterCell: any = null;\r\n  showActionsDropDown = false;\r\n  sideMenuVisible = false;\r\n  pivotMode: boolean = false;\r\n  columnSearch: string = '';\r\n  expandAllAccordians = true;\r\n  currentOpenedSideMenue: 'cols' | 'filtrs' | null = null;\r\n  originalColumns: any[] = [];\r\n  originalDataSet: any[] = [];\r\n  activeTopButton: string | null = '';\r\n  filterColumnsList: any[] = [];\r\n  groupBoxPadding = 200;\r\n  presetName: string = '';\r\n  presetFilter: boolean = false;\r\n  searchTextPresetTable = '';\r\n  addFilterColumnInput = '';\r\n  searchInDropdown = '';\r\n  addFilterDropdownSearch = ''\r\n  topShowHideColumns = '';\r\n  choseColumnsSearch = ''\r\n  sideNestedFilterSearch = ''\r\n  editinDropdownSearch = '';\r\n  isThreeDotsFilterOpen = false;\r\n  confirmDelete = false;\r\n  fontFamilies: string[] = [\r\n    // Common Excel fonts\r\n    'Arial',\r\n    'Arial Black',\r\n    'Bahnschrift',\r\n    'Calibri',\r\n    'Cambria',\r\n    'Cambria Math',\r\n    'math',\r\n    'Candara',\r\n    'Comic Sans MS',\r\n    'Consolas',\r\n    'Constantia',\r\n    'Corbel',\r\n    'Courier New',\r\n    'Ebrima',\r\n    'Franklin Gothic Medium',\r\n    'Gabriola',\r\n    'Gadugi',\r\n    'Georgia',\r\n    'Impact',\r\n    'Ink Free',\r\n    'Javanese Text',\r\n    'Leelawadee UI',\r\n    'Lucida Console',\r\n    'Lucida Sans Unicode',\r\n    'Malgun Gothic',\r\n    'Microsoft Himalaya',\r\n    'Microsoft JhengHei',\r\n    'Microsoft New Tai Lue',\r\n    'Microsoft PhagsPa',\r\n    'Microsoft Sans Serif',\r\n    'Microsoft Tai Le',\r\n    'Microsoft YaHei',\r\n    'Microsoft Yi Baiti',\r\n    'Mongolian Baiti',\r\n    'MS Gothic',\r\n    'MS PGothic',\r\n    'MS UI Gothic',\r\n    'MV Boli',\r\n    'Nirmala UI',\r\n    'Palatino Linotype',\r\n    'Segoe Print',\r\n    'Segoe Script',\r\n    'Segoe UI',\r\n    'Segoe UI Historic',\r\n    'Segoe UI Emoji',\r\n    'Segoe UI Symbol',\r\n    'SimSun',\r\n    'Sitka Small',\r\n    'Sylfaen',\r\n    'Symbol',\r\n    'Tahoma',\r\n    'Times New Roman',\r\n    'Trebuchet MS',\r\n    'Verdana',\r\n    'Webdings',\r\n    'Wingdings',\r\n    'Yu Gothic',\r\n    'sans-serif',\r\n    'serif',\r\n    'monospace',\r\n    'Inter'\r\n  ];\r\n\r\n  fontSizes: string[] = [\r\n    '8', '9', '10', '11', '12', '14', '16', '18', '20', '24', '28', '32'\r\n  ];\r\n\r\n  hasScroll = false;\r\n\r\n\r\n\r\n\r\n  constructor(\r\n    private columnService: SplitColumnsService,\r\n    public cdr: ChangeDetectorRef,\r\n    public commonSevice: CommonService,\r\n    private elementRef: ElementRef,\r\n    private ngZone: NgZone,\r\n    private copyService: CopyServiceService,\r\n    private renderer: Renderer2,\r\n    private sanitizer: DomSanitizer,\r\n    private exportService: ExportService,\r\n\r\n  ) { }\r\n\r\n  @ViewChild('cellText', { static: false }) cellText!: any;\r\n  @ViewChild('nestedHeader', { static: false }) nestedHeader!: ElementRef;\r\n  ngAfterViewInit() {\r\n    this.ngZone.onStable.pipe(take(1)).subscribe(async () => {\r\n      await this.SetColumnsDefaultWidth();\r\n      await this.refreshHeaders();\r\n      this.updateFlattenedData();\r\n      this.computeViewportRows();\r\n      this.updateVisibleRows(0);\r\n      this.hasScroll = this.hasHorizontalScrollbar();\r\n\r\n      if (this.cellText) {\r\n        const observer = new ResizeObserver(() => {\r\n          this.cdr.detectChanges();\r\n        });\r\n        observer.observe(this.cellText.nativeElement);\r\n      }\r\n\r\n      this.cdr.detectChanges();\r\n    });\r\n    this.renderCustomCells();\r\n  }\r\n\r\n  private injector = inject(Injector);\r\n\r\n  createCellInjector(row: any, col: any): Injector {\r\n    return Injector.create({\r\n      providers: [\r\n        { provide: 'rowData', useValue: row },\r\n        { provide: 'colData', useValue: col }\r\n      ],\r\n      parent: this.injector\r\n    });\r\n  }\r\n\r\n\r\n  private renderCustomCells(): void {\r\n    const hosts = this.cellHosts.toArray();\r\n    let hostIndex = 0;\r\n\r\n    for (const row of this.visibleRows) {\r\n      for (const col of this.columns) {\r\n        const host = hosts[hostIndex++];\r\n        if (!host || !col.cellRenderer) continue;\r\n\r\n        const viewContainer = host.viewContainerRef;\r\n        viewContainer.clear();\r\n\r\n        const compRef = viewContainer.createComponent(col.cellRenderer);\r\n\r\n        const params = {\r\n          row,\r\n          col,\r\n          value: this.getNestedValue(row, col.field),\r\n          api: this,\r\n        };\r\n\r\n        if ((compRef.instance as any).gridInit) {\r\n          (compRef.instance as any).gridInit(params);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    this.addStylesToImages();\r\n    this.hasScroll = this.hasHorizontalScrollbar();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  ngOnInit() {\r\n    //  if (this.tabs?.length) {\r\n    //   this.activeTab = this.tabs[0];\r\n    // }\r\n    // this.autosizeAllColumns();\r\n  }\r\n\r\n\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    if (changes['columns']) {\r\n      await this.setColumnsColumnDropdownValus();\r\n\r\n    }\r\n\r\n      if (changes['tabs']) {\r\n        if (changes['tabs']) {\r\n        const allTabs = JSON.parse(localStorage.getItem('activeTabs') || '{}');\r\n        const savedTab = allTabs[this.tableType];\r\n        this.activeTab = savedTab || this.tabs?.[0];\r\n\r\n        if(this.tableType){\r\n          this.setActiveTab(this.activeTab);\r\n        }\r\n      }\r\n  }\r\n    if (changes['filtersConfig']) {\r\n      this.checkFilterChangesEffect();\r\n      await this.applyFilteroptionList();\r\n    }\r\n\r\n    if (changes['columns']?.currentValue?.length) {\r\n\r\n      await this.applyFilteroptionList();\r\n\r\n      this.originalColumns = this.columns.map(col => ({\r\n        ...col,\r\n        query: col.query ? { ...col.query } : null,\r\n        column_dropdown_value: col.column_dropdown_value\r\n          ? [...col.column_dropdown_value]\r\n          : [],\r\n      }));\r\n\r\n\r\n      if (this.dataGridContainer?.nativeElement?.offsetWidth) {\r\n        await this.SetColumnsDefaultWidth();\r\n        await this.updateColumnWidthsAndGroups();\r\n        await this.refreshPreviewColumns();\r\n        this.setSectionsWidth();\r\n      }\r\n\r\n      this.ngZone.onStable.pipe(take(1)).subscribe(() => {\r\n        this.cdr.detectChanges();\r\n      });\r\n    }\r\n\r\n    if (changes['dataSet']) {\r\n      this.dataSet = this.dataSet?.map((row, i) => ({\r\n        ...row,\r\n        __virtualIndex: i + 1,\r\n      }));\r\n      this.originalDataSet = structuredClone(this.dataSet);\r\n      this.expandedCells.clear();\r\n      this.updateFlattenedData();\r\n\r\n      this.ngZone.onStable.pipe(take(1)).subscribe(() => {\r\n        this.computeViewportRows();\r\n        this.updateVisibleRows(0);\r\n        this.cdr.detectChanges();\r\n      });\r\n\r\n      if (this.centerPinnedHeader?.nativeElement) {\r\n        void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n\r\n        if (this.centerScrollableBody?.nativeElement) {\r\n          this.centerScrollableBody.nativeElement.scrollLeft =\r\n            this.centerPinnedHeader.nativeElement.scrollLeft;\r\n        }\r\n      }\r\n\r\n      this.applyRowsSelectionState();\r\n\r\n      if (this.groupedColumns?.length) {\r\n        const fields = this.groupedColumns.map((item) => item.field);\r\n        this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n\r\n        this.ngZone.onStable.pipe(take(1)).subscribe(() => {\r\n          this.updateFlattenedData();\r\n          this.updateColumnWidthsAndGroups();\r\n          this.refreshPreviewColumns();\r\n          this.updateVisibleRows(0);\r\n          this.loading = false;\r\n          this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\r\n          this.cdr.detectChanges();\r\n        });\r\n      }\r\n    }\r\n\r\n    if (changes['checkboxState']?.currentValue?.reset) {\r\n      this.selectedRows.clear();\r\n      this.clearSelectionState(this.tableType);\r\n\r\n      const ids = Array.from(this.selectedRows);\r\n      const event = {\r\n        data: {\r\n          listingType: this.listingType,\r\n          obj: ids,\r\n        },\r\n        eventType: 'onSelectRow',\r\n      };\r\n\r\n      this.genericEvent.emit(event);\r\n\r\n      this.ngZone.onStable.pipe(take(1)).subscribe(() => {\r\n        this.cdr.detectChanges();\r\n      });\r\n    }\r\n\r\n    if (changes['closeDropdown'] && this.closeDropdown.preset.closed) {\r\n      this.activeTopButton = null;\r\n      this.presetFilter = false;\r\n      this.presetName = '';\r\n    }\r\n\r\n    // if (changes['oddRowsBackgroundColor']) {\r\n    //   this.rowShadingEnabled = !!this.oddRowsBackgroundColor;\r\n    // }\r\n\r\n    if (changes['resetAllFilters'] && this.resetAllFilters.resetAll) {\r\n      this.clearAllFilters();\r\n    }\r\n\r\n    if (changes['tableView']) {\r\n      setTimeout(() => {\r\n        const viewValue = this.tableView;\r\n      let temprorySelected = Array.isArray(viewValue)\r\n        ? viewValue.find(item => item.is_temp)\r\n        : null;\r\n\r\n        if(!temprorySelected){\r\n          temprorySelected = Array.isArray(viewValue)\r\n        ? viewValue.find(item => item.is_default)\r\n        : null;\r\n        }\r\n\r\n      this.curretaTablePresetForUpdate = temprorySelected || null;\r\n      this.presetName = temprorySelected?.name || '';\r\n      this.presetFilter = temprorySelected?.activeFilters || false;\r\n      if(this.curretaTablePresetForUpdate){\r\n        this.rowShadingEnabled = temprorySelected.config.rowShadingEnabled;\r\n        this.showVerticalBorder = temprorySelected.config.showVerticalBorder;\r\n        this.fontFaimly = temprorySelected.config.fontFaimly;\r\n        this.headerTextFontsSize = temprorySelected.config.headerTextFontsSize;\r\n        this.selectedTableLayout = temprorySelected.config.selectedTableLayout;\r\n        this.bodyTextFontsSize = temprorySelected.config.bodyTextFontsSize;\r\n        this.globalSearchText = temprorySelected.config.globalSearch;\r\n        this.cdr.detectChanges();\r\n      }else{\r\n        this.rowShadingEnabled = false;\r\n        this.showVerticalBorder = false;\r\n        this.fontFaimly = 'Inter';\r\n        this.headerTextFontsSize = 14;\r\n        this.selectedTableLayout = 'mediumd';\r\n        this.bodyTextFontsSize = 14;\r\n        this.globalSearchText = '';\r\n      }\r\n      }, 100);\r\n    }\r\n\r\n  }\r\n\r\n  async setColumnsColumnDropdownValus(): Promise<void> {\r\n    if (!this.columns) return;\r\n    this.columns = await this.commonSevice.copyDropdownDataRecursively(this.columns);\r\n  }\r\n\r\n\r\n\r\n\r\n  applyRowsSelectionState() {\r\n    const selectedIdsFromState = this.restoreSelection(this.tableType);\r\n    if (selectedIdsFromState.size > 0) {\r\n      const ids = Array.from(this.selectedRows);\r\n      const event = {\r\n        data: {\r\n          listingType: this.listingType,\r\n          obj: ids\r\n        },\r\n        eventType: \"onSelectRow\",\r\n      }\r\n      this.genericEvent.emit(event);\r\n    }\r\n  }\r\n\r\n  clearSelectionState(tableType: string): void {\r\n    const stored = JSON.parse(localStorage.getItem('datatableSelections') || '{\"selectedRows\": {}}');\r\n    if (stored.selectedRows && stored.selectedRows[tableType]) {\r\n      delete stored.selectedRows[tableType];\r\n    }\r\n    localStorage.setItem(\r\n      'datatableSelections',\r\n      JSON.stringify(stored)\r\n    );\r\n  }\r\n\r\n\r\n\r\n  async applyFilteroptionList() {\r\n    const updatedColumns = await this.commonSevice.applyFiltersToColumns(this.columns, this.filtersConfig);\r\n    this.columns = [...updatedColumns];\r\n    this.cdr.detectChanges();\r\n  }\r\n  leftPinnedColumns: any[] = [];\r\n  centerColumns: any[] = [];\r\n  rightPinnedColumns: any[] = [];\r\n\r\n  previewLeftPinnedColumns: any[] = [];\r\n  previewCenterColumns: any[] = [];\r\n  previewRightPinnedColumns: any[] = [];\r\n\r\n  // Main Container Template References\r\n  @ViewChild('dataGridContainer')\r\n  dataGridContainer!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('taskManagementContainer')\r\n  taskManagementContainer!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('nestedTableContainer')\r\n  nestedTableContainer!: ElementRef<HTMLDivElement>;\r\n\r\n  // Body Template References\r\n  @ViewChild('leftPinnedBody')\r\n  leftPinnedBody!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('centerPinnedBody')\r\n  centerPinnedBody!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('rightPinnedBody')\r\n  rightPinnedBody!: ElementRef<HTMLDivElement>;\r\n\r\n  // Headers Template References\r\n  @ViewChild('leftPinnedHeader')\r\n  leftPinnedHeader!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('centerPinnedHeader')\r\n  centerPinnedHeader!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('rightPinnedHeader')\r\n  rightPinnedHeader!: ElementRef<HTMLDivElement>;\r\n\r\n  @ViewChild('columnsGroupedBox')\r\n  columnsGroupedBox!: ElementRef<HTMLDivElement>;\r\n\r\n  // Center Fake scrollbard\r\n  @ViewChild('centerFakeScrollbar')\r\n  centerFakeScrollbar!: ElementRef<HTMLDivElement>;\r\n  async updateColumnWidthsAndGroups(columns: any = null) {\r\n    if (!this.dataGridContainer) return;\r\n\r\n    const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n    // Wrap in a promise so we can await\r\n    const { left, center, right }: any = await new Promise(resolve => {\r\n      const prepared = this.columnService.prepareColumns(\r\n        columns ? columns : this.columns,\r\n        containerWidth\r\n      );\r\n      resolve(prepared);\r\n    });\r\n\r\n    this.leftPinnedColumns = left;\r\n    this.centerColumns = center;\r\n    this.rightPinnedColumns = right;\r\n    await new Promise(r => setTimeout(r, 0));\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  async refreshPreviewColumns(columns: any = null) {\r\n    if (!this.dataGridContainer) return;\r\n\r\n    const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n    // Wrap prepareColumns in a Promise to make it awaitable\r\n    const { left, center, right }: any = await new Promise(resolve => {\r\n      const prepared = this.columnService.prepareColumns(\r\n        columns ? columns : this.columns,\r\n        containerWidth\r\n      );\r\n      resolve(prepared);\r\n    });\r\n\r\n    this.previewLeftPinnedColumns = left;\r\n    this.previewCenterColumns = center;\r\n    this.previewRightPinnedColumns = right;\r\n    await new Promise(r => setTimeout(r, 10));\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  async SetColumnsDefaultWidth() {\r\n    let containerWidth = this.dataGridContainer?.nativeElement.offsetWidth + 70;\r\n    // if (this.showSerialNumber) containerWidth -= 55;\r\n    // if (this.showSideMenu) containerWidth -= 29;\r\n    // if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\r\n    // containerWidth -= 5;\r\n    this.columns = this.columnService.assignDefaultWidths(\r\n      this.columns,\r\n      containerWidth\r\n    );\r\n    await new Promise(resolve => setTimeout(resolve, 0));\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  setSectionsWidth() {\r\n    const left = document.querySelector('.left-pinned-body') as HTMLElement;\r\n    const center = document.querySelector(\r\n      '.center-scrollable-body'\r\n    ) as HTMLElement;\r\n    const right = document.querySelector('.right-pinned-body') as HTMLElement;\r\n    if (left) {\r\n      left.style.minWidth = `${this.leftPinnedHeader.nativeElement.offsetWidth}`;\r\n    }\r\n    if (center) {\r\n      left.style.minWidth = `${this.centerPinnedHeader.nativeElement.offsetWidth}`;\r\n    }\r\n    if (right) {\r\n      left.style.minWidth = `${this.rightPinnedHeader.nativeElement.offsetWidth}`;\r\n    }\r\n  }\r\n\r\n  // onCenterBodyScroll(): void {\r\n  //   const scrollTop = this.centerPinnedBody.nativeElement.scrollTop;\r\n  //   const scrollLeft = this.centerPinnedBody.nativeElement.scrollLeft;\r\n\r\n  //   // Sync vertical scroll with left & right pinned bodies\r\n  //   this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\r\n  //   this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\r\n\r\n  //   // Sync horizontal scroll with center header\r\n  //   this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n  //   this.centerFakeScrollbar.nativeElement.scrollLeft = scrollLeft;\r\n  // }\r\n\r\n  // onLeftBodyScroll(): void {\r\n  //   const scrollTop = this.leftPinnedBody.nativeElement.scrollTop;\r\n  //   this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\r\n  //   this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\r\n  // }\r\n  // onRightBodyScroll(): void {\r\n  //   const scrollTop = this.rightPinnedBody.nativeElement.scrollTop;\r\n  //   this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\r\n  //   this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\r\n  // }\r\n\r\n  fakeScrollbarScrollLeft = 0;\r\n  // onFakeScroll(event: Event) {\r\n  //   const target = event.target as HTMLElement;\r\n  //   this.fakeScrollbarScrollLeft = target.scrollLeft;\r\n  //   this.centerPinnedBody.nativeElement.scrollLeft = target.scrollLeft;\r\n  //   this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n  // }\r\n\r\n\r\n\r\n\r\n  getNestedValue(obj: any, field: string): any {\r\n    return field?.split('.').reduce((acc, part) => acc && acc[part], obj);\r\n  }\r\n\r\n  isNestedValueArray(obj: any, field: string): boolean {\r\n    if (!obj || !field) return false;\r\n    const value = field\r\n      .split('.')\r\n      .reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\r\n    return Array.isArray(value);\r\n  }\r\n\r\n  onResizeGroup(event: MouseEvent, col: any, isRightPinned?: boolean): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    const startX = event.clientX;\r\n    const children = col.children || [];\r\n    if (!children.length) return;\r\n\r\n    const childWidths: { field: string; width: number }[] = children.map(\r\n      (child: any) => {\r\n        const el = document.querySelector(\r\n          `[field=\"${child.field}\"]`\r\n        ) as HTMLElement;\r\n        return {\r\n          field: child.field,\r\n          width: el?.offsetWidth || 0,\r\n        };\r\n      }\r\n    );\r\n\r\n    const totalInitialWidth = childWidths.reduce(\r\n      (sum, col) => sum + col.width,\r\n      0\r\n    );\r\n\r\n    const onMouseMove = (moveEvent: MouseEvent) => {\r\n      let deltaX = moveEvent.clientX - startX;\r\n\r\n      if (isRightPinned) {\r\n        deltaX = -deltaX;\r\n      }\r\n\r\n      // Prevent shrinking too small\r\n      if (totalInitialWidth + deltaX < children.length * 80) return;\r\n\r\n      let totalNewWidth = 0;\r\n\r\n      childWidths.forEach((child) => {\r\n        const ratio = child.width / totalInitialWidth;\r\n        const newWidth = Math.max(child.width + deltaX * ratio, 80);\r\n        totalNewWidth += newWidth;\r\n\r\n        const childEls = document.querySelectorAll(`[field=\"${child.field}\"]`);\r\n        childEls.forEach((el: Element) => {\r\n          const elHtml = el as HTMLElement;\r\n          elHtml.style.minWidth = `${newWidth}px`;\r\n          elHtml.style.width = `${newWidth}px`;\r\n        });\r\n\r\n        this.updateColumnWidthInSourceByField(child.field, newWidth);\r\n      });\r\n\r\n      // ✅ Update group header width in DOM\r\n      const groupHeaderEl = document.querySelector(\r\n        `[group=\"${col.header}\"]`\r\n      ) as HTMLElement;\r\n      if (groupHeaderEl) {\r\n        groupHeaderEl.style.width = `${totalNewWidth}px`;\r\n      }\r\n    };\r\n\r\n    const onMouseUp = () => {\r\n      if (this.tableFilterViewId) {\r\n        this.savePreset('mouseUp');\r\n      }\r\n      this.refreshHeaders();\r\n      window.removeEventListener('mousemove', onMouseMove);\r\n      window.removeEventListener('mouseup', onMouseUp);\r\n      const sendData = {\r\n        columns: this.cleanColumns(this.columns),\r\n        filters: this.cleanFilterdColumns(),\r\n        no_of_records: this.paginationConfig.pageSize,\r\n        type: this.tableType,\r\n      };\r\n      this.createUpdateConfigListing.emit(sendData);\r\n    };\r\n\r\n    window.addEventListener('mousemove', onMouseMove);\r\n    window.addEventListener('mouseup', onMouseUp);\r\n  }\r\n\r\n  private updateColumnWidthInSourceByField(field: string, width: number): void {\r\n    const update = (columns: any[]) => {\r\n      for (const col of columns) {\r\n        if (col.children?.length) {\r\n          update(col.children);\r\n        } else if (col.field === field) {\r\n          col.width = width;\r\n        }\r\n      }\r\n    };\r\n\r\n    update(this.columns);\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  cleanColumns(columns: any[]): any[] {\r\n    const cleanedColumns = columns.map(\r\n      ({\r\n        __typename,\r\n        _id,\r\n        column_dropdown_value,\r\n        filterValue,\r\n        search,\r\n        expandedFilter,\r\n        query,\r\n        isRowGrouped,\r\n        ...rest\r\n      }) => {\r\n        return {\r\n          ...rest,\r\n          is_groupable: rest.type !== 'image',\r\n        };\r\n      }\r\n    );\r\n\r\n    return cleanedColumns;\r\n\r\n  }\r\n\r\n  onResizeColumn(event: MouseEvent, col: any): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    const startX = event.clientX;\r\n\r\n    const targetEl = document.querySelector(\r\n      `[field=\"${col.field}\"]`\r\n    ) as HTMLElement;\r\n    const initialWidth = targetEl?.offsetWidth || 150;\r\n\r\n    const matchingEls = document.querySelectorAll(`[field=\"${col.field}\"]`);\r\n\r\n    // 👉 Add highlight while resizing\r\n    if (col?.pinned == 'right') {\r\n      matchingEls.forEach((el: Element) => {\r\n        (el as HTMLElement).classList.add('resizing-highlight-right');\r\n      });\r\n    } else {\r\n      matchingEls.forEach((el: Element) => {\r\n        (el as HTMLElement).classList.add('resizing-highlight');\r\n      });\r\n    }\r\n\r\n    const onMouseMove = (moveEvent: MouseEvent) => {\r\n      let deltaX = moveEvent.clientX - startX;\r\n\r\n      // 👉 Reverse if the column is pinned to the right\r\n      if (col.pinned === 'right') {\r\n        deltaX = -deltaX;\r\n      }\r\n\r\n      let newWidth = initialWidth + deltaX;\r\n      if (newWidth < 80) return;\r\n\r\n      matchingEls.forEach((el: Element) => {\r\n        const element = el as HTMLElement;\r\n        element.style.minWidth = `${newWidth}px`;\r\n        element.style.width = `${newWidth}px`;\r\n      });\r\n\r\n      this.updateColumnWidthInSourceByField(col.field, newWidth);\r\n      col.width = newWidth;\r\n      this.hasScroll = this.hasHorizontalScrollbar();\r\n    };\r\n\r\n    const onMouseUp = () => {\r\n      if (this.tableFilterViewId) {\r\n        this.savePreset('mouseUp');\r\n      }\r\n      this.refreshHeaders();\r\n      const sendData = {\r\n        columns: this.cleanColumns(this.columns),\r\n        filters: this.cleanFilterdColumns(),\r\n        no_of_records: this.paginationConfig.pageSize,\r\n        type: this.tableType,\r\n      };\r\n      this.createUpdateConfigListing.emit(sendData);\r\n\r\n      matchingEls.forEach((el: Element) => {\r\n        (el as HTMLElement).classList.remove('resizing-highlight');\r\n        (el as HTMLElement).classList.remove('resizing-highlight-right');\r\n      });\r\n\r\n      window.removeEventListener('mousemove', onMouseMove);\r\n      window.removeEventListener('mouseup', onMouseUp);\r\n    };\r\n\r\n    window.addEventListener('mousemove', onMouseMove);\r\n    window.addEventListener('mouseup', onMouseUp);\r\n  }\r\n\r\n\r\n\r\n  onResizeGroupBox(event: MouseEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    const startX = event.clientX;\r\n\r\n    const targetEl = document.getElementById('groupBoxHeaderDiv');\r\n    const initialWidth = targetEl?.offsetWidth || 150;\r\n\r\n    const onMouseMove = (moveEvent: MouseEvent) => {\r\n      const deltaX = moveEvent.clientX - startX;\r\n\r\n      let newWidth = initialWidth + deltaX;\r\n      if (newWidth < 100) newWidth = 100;\r\n\r\n      if (targetEl) {\r\n        targetEl.style.width = `${newWidth}px`;\r\n        targetEl.style.minWidth = `${newWidth}px`;\r\n        this.groupBoxPadding = newWidth;\r\n      }\r\n    };\r\n\r\n    const onMouseUp = () => {\r\n      window.removeEventListener('mousemove', onMouseMove);\r\n      window.removeEventListener('mouseup', onMouseUp);\r\n    };\r\n\r\n    window.addEventListener('mousemove', onMouseMove);\r\n    window.addEventListener('mouseup', onMouseUp);\r\n  }\r\n\r\n  onPasteInFilterRowSearch(event: ClipboardEvent, col: any) {\r\n    setTimeout(() => {\r\n      this.onFilterChange(col);\r\n      this.applyDropdownFilter();\r\n    });\r\n  }\r\n\r\n  onFilterChange(col: any): void {\r\n    const filterValue = col.filterValue?.toLowerCase() || '';\r\n    this.selectedColumnForFilter = col;\r\n    if (!col?.query) {\r\n      col.query = {\r\n        first_condition: col.type == 'date' ? 'equal' : 'contain',\r\n        first_value: null,\r\n        second_condition: null,\r\n        second_value: null,\r\n        condition: null\r\n      }\r\n    }\r\n    col.query.first_value = filterValue;\r\n    this.firstValue = filterValue;\r\n  }\r\n\r\n  // Get Body Height\r\n  get bodyWrapperHeight(): string {\r\n    const rows = this.showColumnsGrouping && this.showFilterRow ? 3 : (this.showColumnsGrouping || this.showFilterRow ? 2 : 1);\r\n    const offset = this.headerRowHeight * rows + (this.hasScroll ? 17 : 0);\r\n    return `calc(100% - ${offset}px)`;\r\n  }\r\n\r\n  // Row Hover Logic Here\r\n  hoveredRowId: string | number | null = null;\r\n  onRowHover(row: any): void {\r\n    this.hoveredRowId = row._id || row.id;\r\n  }\r\n\r\n  onRowLeave(): void {\r\n    this.hoveredRowId = null;\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent): void {\r\n    const target = event.target as HTMLElement;\r\n    this.isVisible = false;\r\n    this.openIndex = null;\r\n    if (\r\n      !this.hasParentWithClass(target, [\r\n        'three-dots',\r\n        'filter-icon-wrapper',\r\n        'column-menu',\r\n        'filter-menu',\r\n      ])\r\n    ) {\r\n      this.activeCol = null;\r\n      this.activeFilterCell = null;\r\n    }\r\n    if (!this.elementRef.nativeElement.contains(event.target)) {\r\n      this.showActionsDropDown = false;\r\n    }\r\n    const insideTopFilterRow = target.closest('.filter-tags') || target.closest('.add-filter-button-menu') ||\r\n      target.closest('.table-right-top-actions') || target.closest('.table-layout') || target.closest('.filter-row-filter-wrapper');\r\n    const isClickedInsideThreeDotsFilter = target.closest('.three-dots-filter') || target.closest('.filter-menu-container');\r\n    if (!isClickedInsideThreeDotsFilter) {\r\n      this.closeThreeDotsMenuFilter();\r\n    }\r\n    if (!insideTopFilterRow) {\r\n      this.closeFilterDropdowns(event);\r\n    }\r\n    if (!target.closest('.set-default-preset')) {\r\n      document.querySelector('.set-default-preset')?.classList?.remove('show');\r\n    }\r\n\r\n    if (!target.closest('.full-text-box') && !target.closest('.data-grid-header-wrapper')) {\r\n      this.collapseAllExpandedCells();\r\n    }\r\n\r\n    if (!target.closest('.data-grid-table-wrapper')) {\r\n      this.selectedKeys.clear();\r\n      this.activeCell = '';\r\n    }\r\n  }\r\n\r\n\r\n  closeThreeDotsMenuFilter() {\r\n    this.isThreeDotsFilterOpen = false;\r\n  }\r\n\r\n\r\n  closeFilterDropdowns(event: MouseEvent) {\r\n    this.isFilterOpen = false;\r\n    this.isActiveFilterOpen = false;\r\n    this.activeTopButton = '';\r\n    this.activeFilterCell = null;\r\n  }\r\n\r\n  private hasParentWithClass(\r\n    element: HTMLElement,\r\n    classList: string[]\r\n  ): boolean {\r\n    let el: HTMLElement | null = element;\r\n\r\n    while (el !== null) {\r\n      if (\r\n        el.classList &&\r\n        classList.some((className) => el!.classList.contains(className))\r\n      ) {\r\n        return true;\r\n      }\r\n      el = el.parentElement;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  isMenueHidden = false;\r\n  openThreeDotsMenu(event: MouseEvent, child: any, keepOriginalPosition = false) {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isMenueHidden = true;\r\n    const containerWidth = this.dataGridContainer?.nativeElement?.offsetWidth;\r\n    this.activeCol = child;\r\n    this.activeFilterCell = null;\r\n    const x = event.clientX;\r\n    setTimeout(() => {\r\n      const element = document.querySelector('.column-menu') as HTMLElement;\r\n      if (element) {\r\n        if (x > (containerWidth / 2)) {\r\n          element.style.left = `${x - 240}px`;\r\n        } else {\r\n          element!.style.left = `${x}px`;\r\n        }\r\n      }\r\n      this.isMenueHidden = false;\r\n      this.cdr.detectChanges();\r\n    }, 0);\r\n  }\r\n  // ////////////////////////////////////////////////////////////////////////////////////////\r\n  // ////////////////////////////////////////////////////////////////////////////////////////\r\n  // Column Three Dots Actions\r\n  // //////////////////////////////////////////////////////////////////////////////////////\r\n  // //////////////////////////////////////////////////////////////////////////////////////\r\n  sortAsc(col: any) {\r\n    if (!col.is_sortable) return;\r\n    col!.order_by = 'asc';\r\n    const event = {\r\n      order: 'asc',\r\n      column: col\r\n    }\r\n    this.cdr.detectChanges();\r\n    this.sortingOrderOptions.emit(event);\r\n  }\r\n\r\n  sortDesc(col: any) {\r\n    if (!col.is_sortable) return;\r\n    col!.order_by = 'desc';\r\n    const event = {\r\n      order: 'desc',\r\n      column: col\r\n    }\r\n    this.cdr.detectChanges();\r\n    this.sortingOrderOptions.emit(event);\r\n  }\r\n\r\n  resetSort(col: any) {\r\n    this.sortingConfig = { field: '', order_by: '' };\r\n    const event = { field: null, order_by: null }\r\n    this.cdr.detectChanges();\r\n    this.sortingOrderOptions.emit(event);\r\n  }\r\n\r\n\r\n  async updateColumnPinInSourceByField(\r\n    column: any,\r\n    pinned: 'left' | 'right' | null,\r\n    isNestedTable: any = false,\r\n    columns?: any\r\n  ) {\r\n    debugger\r\n    if (isNestedTable) {\r\n      this.pinUnpinColum(column, pinned, columns);\r\n      return;\r\n    }\r\n    const update = (columns: any[]) => {\r\n      for (const col of columns) {\r\n        if (col.children?.length) {\r\n          update(col.children);\r\n        } else if (col.field === column.field) {\r\n          col.pinned = pinned;\r\n        }\r\n      }\r\n    };\r\n    this.activeCol = null;\r\n    update(this.columns);\r\n    this.updateColumnWidthsAndGroups();\r\n    this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: this.paginationConfig.pageSize,\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n  }\r\n\r\n  autosizeColumn(cols: any | any[]): void {\r\n    this.activeCol = null;\r\n\r\n    // Normalize input to an array\r\n    const columnsToResize = Array.isArray(cols) ? cols : [cols];\r\n\r\n    // Helper: Flatten all visible leaf columns\r\n    const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n      const result: any[] = [];\r\n      for (const column of columns) {\r\n        if (column.children && Array.isArray(column.children)) {\r\n          result.push(...getVisibleLeafColumns(column.children));\r\n        } else if (column.is_visible) {\r\n          result.push(column);\r\n        }\r\n      }\r\n      return result;\r\n    };\r\n\r\n    const visibleColumns = getVisibleLeafColumns(this.columns);\r\n    const visibleCount = visibleColumns.length;\r\n\r\n    if (visibleCount === 0) return;\r\n\r\n    let containerWidth =\r\n      this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n    if (this.showSerialNumber) containerWidth -= 55;\r\n    if (this.showSideMenu) containerWidth -= 29;\r\n    if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\r\n    containerWidth -= 55;\r\n    const equalWidth = Math.floor(containerWidth / visibleCount);\r\n\r\n    // Resize each passed column\r\n    for (const col of columnsToResize) {\r\n      if (col && col.field) {\r\n        col.width = equalWidth;\r\n        this.updateColumnWidthInSourceByField(col.field, equalWidth);\r\n      }\r\n    }\r\n\r\n    this.updateColumnWidthsAndGroups();\r\n\r\n    setTimeout(() => {\r\n      const sendData = {\r\n        columns: this.cleanColumns(this.columns),\r\n        filters: this.cleanFilterdColumns(),\r\n        no_of_records: this.paginationConfig.pageSize,\r\n        type: this.tableType,\r\n      };\r\n      this.createUpdateConfigListing.emit(sendData);\r\n    }, 1000);\r\n    this.refreshPreviewColumns();\r\n  }\r\n\r\n  getGroupWidth(group: any): number {\r\n    return (\r\n      group?.children\r\n        ?.filter((col: any) => col?.is_visible)\r\n        ?.reduce((acc: number, col: any) => acc + (col?.width || 0), 0) || 0\r\n    );\r\n  }\r\n\r\n  autosizeAllColumns(): void {\r\n    this.activeCol = null;\r\n\r\n    const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n      const result: any[] = [];\r\n\r\n      for (const column of columns) {\r\n        if (column.children && Array.isArray(column.children)) {\r\n          result.push(...getVisibleLeafColumns(column.children));\r\n        } else if (column.is_visible !== false) {\r\n          result.push(column);\r\n        }\r\n      }\r\n\r\n      return result;\r\n    };\r\n\r\n    const visibleColumns = getVisibleLeafColumns(this.columns);\r\n    const visibleCount = visibleColumns.length;\r\n\r\n    if (visibleCount === 0) return;\r\n\r\n    let containerWidth =\r\n      this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n    if (this.showSerialNumber) containerWidth -= 55;\r\n    if (this.showSideMenu) containerWidth -= 29;\r\n    if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\r\n    containerWidth -= 55;\r\n    const equalWidth = Math.max(Math.floor(containerWidth / visibleCount), 150);\r\n\r\n    // Update widths for all visible columns\r\n    visibleColumns.forEach((col) => {\r\n      col.width = equalWidth;\r\n      this.updateColumnWidthInSourceByField(col.field, equalWidth);\r\n    });\r\n\r\n    this.refreshHeaders();\r\n    this.hasScroll = this.hasHorizontalScrollbar();\r\n    this.cdr.detectChanges();\r\n    setTimeout(() => {\r\n      const sendData = {\r\n        columns: this.cleanColumns(this.columns),\r\n        filters: this.cleanFilterdColumns(),\r\n        no_of_records: this.paginationConfig.pageSize,\r\n        type: this.tableType,\r\n      };\r\n      this.createUpdateConfigListing.emit(sendData);\r\n    }, 1000);\r\n  }\r\n\r\n  private markColumnAsGrouped(columns: any[], field: string): void {\r\n    for (const col of columns) {\r\n      if (col.field === field) {\r\n        col.isRowGrouped = true;\r\n        return;\r\n      }\r\n      if (col.children?.length) {\r\n        this.markColumnAsGrouped(col.children, field);\r\n      }\r\n    }\r\n  }\r\n\r\n  async groupBy(col: any) {\r\n    this.mainScroll.nativeElement.scrollTop = 0;\r\n    this.translateY = 0;\r\n    this.cdr.detectChanges();\r\n    this.activeCol = null;\r\n    if (!col) return;\r\n    this.loading = true;\r\n    this.cdr.detectChanges();\r\n    if (col?.is_groupable) {\r\n      this.groupedColumns.push(col);\r\n      this.markColumnAsGrouped(this.columns, col.field);\r\n    }\r\n    const fields = this.groupedColumns.map((item) => item.field);\r\n    this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n    setTimeout(() => {\r\n      this.updateFlattenedData();\r\n      this.updateColumnWidthsAndGroups();\r\n      this.refreshPreviewColumns();\r\n      this.updateVisibleRows(0);\r\n      this.loading = false;\r\n      this.cdr.detectChanges();\r\n    }, 100);\r\n\r\n    setTimeout(() => {\r\n      this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\r\n      this.cdr.detectChanges()\r\n    }, 10);\r\n\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  async groupDataAsync(data: any[], groupFields: string[]): Promise<any[]> {\r\n    return new Promise(resolve => {\r\n      setTimeout(() => {\r\n        const result = this.groupData(data, groupFields);\r\n        resolve(result);\r\n      }, 0);\r\n    });\r\n  }\r\n\r\n\r\n\r\n\r\n  chooseColumns() {\r\n    this.activeCol = null;\r\n    this.showColumnPanel = true;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  resetColumns() {\r\n    this.activeCol = null;\r\n\r\n    // this.columns = structuredClone(this.originalColumns);\r\n    // Deep copy nested objects but keep class refs safe\r\n    this.originalColumns = this.columns.map(col => ({\r\n      ...col,\r\n      // Deep copy nested objects but keep class refs safe\r\n      query: col.query ? { ...col.query } : null,\r\n      column_dropdown_value: col.column_dropdown_value\r\n        ? [...col.column_dropdown_value]\r\n        : [],\r\n    }));\r\n\r\n    this.SetColumnsDefaultWidth();\r\n    setTimeout(() => {\r\n      this.updateColumnWidthsAndGroups();\r\n      this.refreshPreviewColumns();\r\n      this.cdr.detectChanges();\r\n    }, 100);\r\n  }\r\n\r\n  clearFilter(col: any) {\r\n    col.firstValue = '';\r\n    col.secondValue = '';\r\n    col.firstCondition = 'contain';\r\n    col.secondCondition = null;\r\n    col.logic = 'AND';\r\n    col.selectAll = false;\r\n    col.selectedOptions = {};\r\n    col.searchValue = '';\r\n\r\n  }\r\n\r\n\r\n  applyFilter(col: any) {\r\n    this.filterColumnsList.push(col);\r\n  }\r\n\r\n  // Rows Selection Logic Goes Here\r\n\r\n  selectedRows: Set<string> = new Set();\r\n\r\n  /**\r\n   * Get normalized ID from row.\r\n   */\r\n  private getRowId(row: any): string {\r\n    return row.id ?? row._id;\r\n  }\r\n\r\n  /**\r\n   * Toggle a single row selection.\r\n   */\r\n  toggleRowSelection(row: any): void {\r\n    const id = this.getRowId(row);\r\n\r\n    if (this.selectedRows.has(id)) {\r\n      this.selectedRows.delete(id);\r\n    } else {\r\n      this.selectedRows.add(id);\r\n    }\r\n\r\n    const ids = Array.from(this.selectedRows);\r\n\r\n    this.saveSelection(ids, this.tableType);\r\n\r\n    const event = {\r\n      data: {\r\n        listingType: this.listingType,\r\n        obj: ids\r\n      },\r\n      eventType: \"onSelectRow\",\r\n    };\r\n    this.genericEvent.emit(event);\r\n  }\r\n\r\n\r\n\r\n  toggleSelectAll(data: any[]): void {\r\n    const allIds = this.originalDataSet.map((row) => this.getRowId(row));\r\n    const allSelected = allIds.every((id) => this.selectedRows.has(id));\r\n\r\n    if (allSelected) {\r\n      allIds.forEach((id) => this.selectedRows.delete(id));\r\n    } else {\r\n      allIds.forEach((id) => this.selectedRows.add(id));\r\n    }\r\n    this.cdr.detectChanges();\r\n    const ids = Array.from(this.selectedRows);\r\n    const event = {\r\n      data: {\r\n        listingType: this.listingType,\r\n        obj: ids\r\n      },\r\n      eventType: \"onSelectRow\",\r\n    }\r\n    this.genericEvent.emit(event);\r\n    this.saveSelection(ids, this.tableType);\r\n  }\r\n\r\n  isRowSelected(row: any): boolean {\r\n    return this.selectedRows.has(this.getRowId(row));\r\n  }\r\n\r\n  isAllSelected(data: any[]): boolean {\r\n    return (data?.every((row) => this.selectedRows.has(this.getRowId(row))) && (this.dataSet?.length > 0));\r\n  }\r\n\r\n  isIndeterminateState(data: any[]): boolean {\r\n    if (!data || data.length === 0) return false;\r\n    const selectedCount = data.filter(row => this.selectedRows.has(this.getRowId(row))).length;\r\n    return selectedCount > 0 && selectedCount < data.length;\r\n  }\r\n\r\n  // Side Menu Working Goes Here\r\n  toggleSideMenu(clickedOn: 'cols' | 'filtrs') {\r\n    if (this.currentOpenedSideMenue == clickedOn) {\r\n      this.currentOpenedSideMenue = clickedOn;\r\n      this.sideMenuVisible = !this.sideMenuVisible;\r\n    } else if (\r\n      this.sideMenuVisible &&\r\n      clickedOn != this.currentOpenedSideMenue\r\n    ) {\r\n      this.currentOpenedSideMenue = clickedOn;\r\n      return;\r\n    } else {\r\n      this.currentOpenedSideMenue = clickedOn;\r\n      this.sideMenuVisible = !this.sideMenuVisible;\r\n    }\r\n    this.hasScroll = this.hasHorizontalScrollbar();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  toggleGroupVisibility(col: any) {\r\n    const allVisible = col.children.every((child: any) => child.is_visible);\r\n    col.children.forEach((child: any) => (child.is_visible = !allVisible));\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: this.paginationConfig.pageSize,\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n    setTimeout(() => {\r\n      this.updateColumnWidthsAndGroups();\r\n      this.refreshPreviewColumns();\r\n      this.SetColumnsDefaultWidth();\r\n      this.cdr.detectChanges();\r\n    }, 10);\r\n  }\r\n\r\n  isColumnVisible(columns: any) {\r\n    if (columns?.children) {\r\n      return columns.children.every((element: any) => element.is_visible);\r\n    }\r\n\r\n    return columns?.is_visible;\r\n  }\r\n\r\n  allColumnsSelected(): boolean {\r\n    const flatten = this.flattenColumns(this.columns);\r\n    return flatten.every((col) => col.is_visible);\r\n  }\r\n\r\n\r\n  private findColumnByField(field: string, cols: any[]): any | null {\r\n    for (const col of cols) {\r\n      if (col.field === field) {\r\n        return col;\r\n      }\r\n      if (col.children && Array.isArray(col.children)) {\r\n        const found = this.findColumnByField(field, col.children);\r\n        if (found) return found;\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n\r\n\r\n  async toggleColumnVisibility(column: any, isVisible: boolean) {\r\n    if(isVisible){\r\n      if(this.visibleColumns()?.length <= 2){\r\n        return;\r\n      }\r\n    }\r\n    const col = this.findColumnByField(column.field, this.columns);\r\n    if (col) {\r\n      col.is_visible = isVisible;\r\n    }\r\n    await this.refreshHeaders();\r\n    this.cdr.detectChanges();\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: this.paginationConfig.pageSize,\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n    if (this.tableFilterViewId) {\r\n      this.savePreset('mouseUp');\r\n    }\r\n  }\r\n\r\n\r\n  toggleAllColumnsVisibility(): void {\r\n  const flatten = this.flattenColumns(this.columns);\r\n  const visibleColumns = flatten.filter((c: any) => c.is_visible);\r\n  const allSelected = visibleColumns.length === flatten.length;\r\n  if (allSelected) {\r\n    flatten.forEach((col: any, index: number) => {\r\n      col.is_visible = index < 2;\r\n    });\r\n  } else {\r\n    flatten.forEach((col: any) => (col.is_visible = true));\r\n  }\r\n  setTimeout(() => {\r\n    this.updateColumnWidthsAndGroups();\r\n    setTimeout(() => {\r\n      this.refreshPreviewColumns();\r\n      this.cdr.detectChanges();\r\n    }, 100);\r\n  }, 100);\r\n}\r\n\r\nvisibleColumns(){\r\n  const flatten = this.flattenColumns(this.columns);\r\n  const visibleColumns = flatten.filter((c: any) => c.is_visible);\r\n  return visibleColumns;\r\n}\r\n\r\n  flattenColumns(cols: any[]): any[] {\r\n    return cols.reduce((acc: any[], col: any) => {\r\n      if (col?.children && col.children.length) {\r\n        // recursively flatten children\r\n        return acc.concat(this.flattenColumns(col.children));\r\n      } else {\r\n        // leaf column\r\n        return acc.concat(col);\r\n      }\r\n    }, []);\r\n  }\r\n\r\n\r\n  filteredColumns(cols: any[]): any[] {\r\n    const search = this.columnSearch.toLowerCase();\r\n    return cols\r\n      .map((col) => {\r\n        if (col.children) {\r\n          const filteredChildren = this.filteredColumns(col.children);\r\n          if (\r\n            col.header.toLowerCase().includes(search) ||\r\n            filteredChildren.length\r\n          ) {\r\n            return { ...col, children: filteredChildren };\r\n          }\r\n          return null;\r\n        } else {\r\n          return col.header.toLowerCase().includes(search) ? col : null;\r\n        }\r\n      })\r\n      .filter(Boolean);\r\n  }\r\n\r\n  get accordionState(): 'all' | 'none' | 'some' {\r\n    const groups = this.getAllGroupColumns(this.columns);\r\n    const expandedCount = groups.filter((col) => col.expanded).length;\r\n\r\n    if (expandedCount === 0) return 'none';\r\n    if (expandedCount === groups.length) return 'all';\r\n    return 'some';\r\n  }\r\n\r\n  get filterAccordionState(): 'all' | 'none' | 'some' {\r\n    const groups = this.getAllGroupColumns(this.columns);\r\n    const expandedCount = groups.filter((col) => col.expandedFilter).length;\r\n\r\n    if (expandedCount === 0) return 'none';\r\n    if (expandedCount === groups.length) return 'all';\r\n    return 'some';\r\n  }\r\n\r\n  // Recursively collect all group columns\r\n  private getAllGroupColumns(cols: any[]): any[] {\r\n    let groups: any[] = [];\r\n    for (const col of cols) {\r\n      if (col.children?.length) {\r\n        groups.push(col);\r\n        groups = groups.concat(this.getAllGroupColumns(col.children));\r\n      }\r\n    }\r\n    return groups;\r\n  }\r\n\r\n  // Toggle based on current state\r\n  toggleAllAccordions(): void {\r\n    const nextState = this.accordionState === 'all' ? false : true;\r\n    this.setAccordionState(this.columns, nextState);\r\n  }\r\n\r\n  toggleAllFilterAccordions(): void {\r\n    const nextState = this.filterAccordionState === 'all' ? false : true;\r\n    this.setFilterAccordionState(this.columns, nextState);\r\n  }\r\n\r\n  private setAccordionState(cols: any[], state: boolean): void {\r\n    for (let col of cols) {\r\n      if (col.children?.length) {\r\n        col.expanded = state;\r\n        this.setAccordionState(col.children, state); // Recursively handle nested\r\n      }\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n  private setFilterAccordionState(cols: any[], state: boolean): void {\r\n    for (let col of cols) {\r\n      if (col.children?.length) {\r\n        col.expandedFilter = state;\r\n        this.setFilterAccordionState(col.children, state); // Recursively handle nested\r\n      }\r\n    }\r\n  }\r\n\r\n  showColumnPanel = false;\r\n\r\n  closeModalColumnPanel() {\r\n    this.showColumnPanel = false;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  @HostListener('document:keydown.escape', ['$event'])\r\n  onEscape(event: Event) {\r\n    this.closeModalColumnPanel();\r\n  }\r\n\r\n  // Check If  Any column have right pinned\r\n  get hasRightPinnedColumns() {\r\n    return this.commonSevice.gethasRightPinnedColumns(this.columns);\r\n  }\r\n\r\n  get hasLeftPinnedColumns() {\r\n    return this.commonSevice.gethasLeftPinnedColumns(this.columns);\r\n  }\r\n\r\n  get dataSetLength() {\r\n    return this.commonSevice.getExpandedRowCount(this.dataSet);\r\n  }\r\n\r\n\r\n\r\n  @HostListener('window:resize', ['$event'])\r\n  onResize(event: UIEvent) {\r\n    // this.autosizeAllColumns();\r\n    const h = this.mainScroll?.nativeElement?.clientHeight ?? 0;\r\n    this.viewportRows = Math.max(1, Math.ceil(h / this.rowHeight));\r\n    this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n    this.hasScroll = this.hasHorizontalScrollbar();\r\n    this.cdr.detectChanges();\r\n    setTimeout(() => { }, 100);\r\n  }\r\n\r\n  async refreshHeaders() {\r\n    this.ngZone.runOutsideAngular(async () => {\r\n      await new Promise(r => setTimeout(r, 0));\r\n      await this.updateColumnWidthsAndGroups();\r\n      await this.refreshPreviewColumns();\r\n\r\n      this.ngZone.run(() => this.cdr.detectChanges());\r\n    });\r\n  }\r\n\r\n  get hasAnyVisibleColumn() {\r\n    return this.commonSevice.gethasVisibleColumns(this.columns);\r\n  }\r\n\r\n  get hasAnyInVisibleColumn() {\r\n    return this.commonSevice.gethasInVisibleColumns(this.columns);\r\n  }\r\n\r\n  get columnsCount() {\r\n    return this.commonSevice.getTotalColumnsLength(this.columns);\r\n  }\r\n\r\n  tableHeaderAndBodyHeight() {\r\n    return `calc(100% - ${this.footerRowHeight})`;\r\n  }\r\n\r\n  draggingInGroupArea = false;\r\n\r\n  @ViewChild('centerScroll') centerScroll!: ElementRef<HTMLDivElement>;\r\n  visibleRowCount = 25;\r\n  startIndex = 0;\r\n  visibleRows: any[] = [];\r\n\r\n  private flattenGroupedRows(\r\n    rows: any[] = [],\r\n    level = 0,\r\n    result: any[] = []\r\n  ): any[] {\r\n    for (const row of rows) {\r\n      result.push({ ...row, __depth: level });\r\n      if (row.isGroup && row.isExpand && row.children?.length) {\r\n        this.flattenGroupedRows(row.children, level + 1, []);\r\n      }\r\n    }\r\n    this.assignVirtualIndexes(this.visibleRows);\r\n    return result;\r\n  }\r\n\r\n  assignVirtualIndexes(data: any[]): any[] {\r\n    let currentIndex = 1;\r\n    const walk = (items: any[]): void => {\r\n      for (const item of items) {\r\n        item.__virtualIndex = currentIndex++;\r\n        if (item?.isGroup) {\r\n          const group = item;\r\n          if (group.isExpand && Array.isArray(group.children)) {\r\n            walk(group.children);\r\n          }\r\n        }\r\n      }\r\n    };\r\n    walk(data);\r\n    // console.log('This dataset: ', this.visibleRows)\r\n    return data;\r\n  }\r\n\r\n\r\n  updateVisibleRows(scrollTop: number) {\r\n\r\n    if (this.groupedColumns?.length) {\r\n      this.visibleRows = this.dataSet;\r\n      return;\r\n    }\r\n    const flatData = this.flattenGroupedRows(this.dataSet);\r\n\r\n    if (this.dataSet?.length <= 15) {\r\n      this.visibleRows = flatData;\r\n      this.firstIndex = 0;\r\n      this.startIndex = 0;\r\n      this.renderStart = 0;\r\n      this.cdr.detectChanges();\r\n      return;\r\n    }\r\n    const total = flatData.length;\r\n    const maxFirst = Math.max(0, total - this.viewportRows);\r\n    const first = Math.min(Math.floor(scrollTop / this.rowHeight), maxFirst);\r\n    const start = Math.max(0, first);\r\n    const end = Math.min(total, first + this.viewportRows);\r\n\r\n    this.firstIndex = first;\r\n    this.startIndex = first;\r\n    this.renderStart = start;\r\n    this.visibleRows = flatData.slice(start, end);\r\n    this.assignVirtualIndexes(this.visibleRows);\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  trackByRenderedIndex = (i: number, _row: any) => this.renderStart + i;\r\n\r\n  private isSyncingFromMain = false;\r\n  private isSyncingFromFake = false;\r\n  private mainScrollRaf: number | null = null;\r\n\r\n  trackById(index: number, item: any) {\r\n    return item.id || item._id;\r\n  }\r\n\r\n  flattenedData: any[] = [];\r\n\r\n  updateFlattenedData(): void {\r\n    setTimeout(() => {\r\n      this.flattenedData = this.flattenGroupedRows(this.dataSet);\r\n      this.cdr.detectChanges();\r\n    }, 10);\r\n  }\r\n\r\n  // requestAnimationFrame IDs\r\n  private fakeScrollRaf: number | null = null;\r\n\r\n\r\n  // onMainScroll(event: Event) {\r\n  //   this.expandedCells.clear();\r\n  //   const scrollTop = (event.target as HTMLElement).scrollTop;\r\n  //     if (this.groupedColumns?.length > 0) {\r\n  //       this.startIndex = 0;\r\n  //       this.cdr.detectChanges();\r\n  //       return;\r\n  //     }\r\n  //     const overscan = this.overscan * 2;\r\n  //     this.startIndex = Math.floor(scrollTop / this.rowHeight);\r\n  //     const start = Math.max(0, this.startIndex - overscan);\r\n  //     const end = Math.min(this.flattenedData.length, this.startIndex + this.viewportRows + overscan);\r\n  //     this.visibleRows = this.flattenedData.slice(start, end);\r\n  //     this.cdr.detectChanges();\r\n  // }\r\n  translateY = 0;\r\n\r\n  lastScrollTop = 0;\r\n  pendingAnimationFrame: number | null = null;\r\n\r\n  onMainScroll(event: Event): void {\r\n    const scrollTop = (event.target as HTMLElement).scrollTop;\r\n    if (Math.abs(scrollTop - this.lastScrollTop) < (10)) return;\r\n    if (this.pendingAnimationFrame) cancelAnimationFrame(this.pendingAnimationFrame);\r\n    if (this.groupedColumns?.length > 0) {\r\n      this.startIndex = 0;\r\n      this.cdr.detectChanges();\r\n      return;\r\n    }\r\n    this.pendingAnimationFrame = requestAnimationFrame(() => {\r\n      const scrollingDown = scrollTop > this.lastScrollTop;\r\n      this.lastScrollTop = scrollTop;\r\n\r\n      const overscan = 5;\r\n      const newStartIndex = Math.floor(scrollTop / this.rowHeight);\r\n      const dynamicOverscan = scrollingDown ? overscan : overscan;\r\n\r\n      const start = Math.max(0, newStartIndex - dynamicOverscan);\r\n      const end = Math.min(\r\n        this.flattenedData.length,\r\n        newStartIndex + this.viewportRows + dynamicOverscan\r\n      );\r\n      this.translateY = start * this.rowHeight;\r\n      if (this.startIndex !== start || this.visibleRows.length !== end - start) {\r\n        this.startIndex = start;\r\n        this.visibleRows = this.dataSet.slice(start, end);\r\n        this.cdr.markForCheck();\r\n      }\r\n\r\n      this.pendingAnimationFrame = null;\r\n    });\r\n  }\r\n\r\n\r\n  // onMainScroll(event: Event): void {\r\n  //   this.expandedCells.clear();\r\n  //   if (this.isSyncingFromFake) {\r\n  //     this.isSyncingFromFake = false;\r\n  //     return;\r\n  //   }\r\n  //   const scrollTop = (event.target as HTMLElement).scrollTop;\r\n  //   if (Math.abs(scrollTop - this.lastScrollTop) < this.rowHeight / 2) return;\r\n  //   this.lastScrollTop = scrollTop;\r\n\r\n  //   if (this.fakeScrollRaf) cancelAnimationFrame(this.fakeScrollRaf);\r\n\r\n  //   this.fakeScrollRaf = requestAnimationFrame(() => {\r\n  //     if (this.groupedColumns?.length > 0) {\r\n  //       this.startIndex = 0;\r\n  //       this.cdr.detectChanges();\r\n  //       return;\r\n  //     }\r\n  //     const flatData = this.flattenGroupedRows(this.dataSet);\r\n  //     const totalRows = flatData.length;\r\n  //     const newStartIndex = Math.floor(scrollTop / this.rowHeight);\r\n  //     const start = Math.max(0, newStartIndex - (this.overscan * 2));\r\n  //     const end = Math.min(totalRows, newStartIndex + this.viewportRows + (this.overscan * 2));\r\n\r\n  //     this.translateY = start * this.rowHeight;\r\n  //     this.startIndex = start;\r\n  //     this.visibleRows = flatData.slice(start, end);\r\n  //     this.cdr.detectChanges();\r\n  //   });\r\n  // }\r\n\r\n\r\n  get isScrollbarVisible(): boolean {\r\n    if (!this.mainScroll) return false;\r\n    const el = this.mainScroll.nativeElement;\r\n    return el.scrollHeight > el.clientHeight;\r\n  }\r\n\r\n  toggleExpand(row: any) {\r\n    if (row.details) {\r\n      row.isDetailsExpand = !row.isDetailsExpand;\r\n    } else {\r\n      row.isExpand = !row.isExpand;\r\n    }\r\n    this.rowSelectedIndexes.clear();\r\n    this.updateFlattenedData();\r\n    // this.cdr.detectChanges();\r\n    // setTimeout(() => {\r\n    //   this.cdr.detectChanges();\r\n    // }, 100);\r\n  }\r\n\r\n  // onMainFakeScroll(event: Event) {\r\n  //   if (this.isSyncingFromMain) {\r\n  //     this.isSyncingFromMain = false;\r\n  //     return;\r\n  //   }\r\n  //   if (this.groupedColumns?.length > 0) {\r\n  //     this.startIndex = 0;\r\n  //     this.cdr.detectChanges();\r\n  //     return;\r\n  //   }\r\n  //   const scrollTop = (event.target as HTMLElement).scrollTop;\r\n  //   if (this.mainScrollRaf) cancelAnimationFrame(this.mainScrollRaf);\r\n  //   this.mainScrollRaf = requestAnimationFrame(() => {\r\n  //     this.isSyncingFromFake = true;\r\n  //     this.mainScroll.nativeElement.scrollTop = scrollTop;\r\n  //     const overscan = this.overscan ?? 0;\r\n  //     this.startIndex = Math.floor(scrollTop / this.rowHeight);\r\n  //     const start = Math.max(0, this.startIndex - overscan);\r\n  //     const end = Math.min(\r\n  //       this.flattenedData.length,\r\n  //       this.startIndex + this.viewportRows + overscan\r\n  //     );\r\n  //     this.visibleRows = this.flattenedData.slice(start, end);\r\n  //     this.cdr.detectChanges();\r\n  //   });\r\n  // }\r\n\r\n\r\n\r\n\r\n\r\n  viewportRows = 0; // how many rows fit in viewport (computed)\r\n  firstIndex = 0; // index of the first visible row (clamped)\r\n  renderStart = 0; // where the slice actually starts (firstIndex - overscan, clamped)\r\n\r\n  private scrollRaf: number | null = null;\r\n  private pendingScrollTop = 0;\r\n\r\n  @ViewChild('mainScroll') mainScroll!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('fakeScroll') fakeScroll!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('horizintalFakeScroll')\r\n  horizintalFakeScroll!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('centerScrollableBody')\r\n  centerScrollableBody!: ElementRef<HTMLDivElement>;\r\n  private overscan = 10; // buffer rows above and below\r\n\r\n  computeViewportRows() {\r\n    if (this.fakeScroll?.nativeElement) {\r\n      this.fakeScroll.nativeElement.scrollTop = 0;\r\n    }\r\n\r\n    if (this.mainScroll?.nativeElement) {\r\n      this.mainScroll.nativeElement.scrollTop = 0;\r\n      const h = this.mainScroll.nativeElement.clientHeight ?? 0;\r\n\r\n      // rows visible in viewport\r\n      const rowsInViewport = Math.max(1, Math.ceil(h / this.rowHeight));\r\n\r\n      // add buffer rows (overscan)\r\n      this.viewportRows = rowsInViewport + this.overscan;\r\n\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n\r\n  onHorizontalFakeScroll(event: Event) {\r\n    const scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n    this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n    if (this.centerScrollableBody?.nativeElement) {\r\n      this.centerScrollableBody.nativeElement.scrollLeft = scrollLeft;\r\n    }\r\n  }\r\n\r\n  onCenterBodyScroll(event: Event) {\r\n    const target = event.target as HTMLElement;\r\n    if (this.centerScrollableBody?.nativeElement) {\r\n      this.centerScrollableBody.nativeElement.scrollLeft = target.scrollLeft;\r\n    }\r\n    if (this.centerPinnedHeader) {\r\n      this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n    }\r\n    if (this.horizintalFakeScroll?.nativeElement) {\r\n      this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n    }\r\n    event.stopPropagation();\r\n    event.preventDefault();\r\n  }\r\n\r\n  onCenterHeaderScroll(event: Event) {\r\n    const target = event.target as HTMLElement;\r\n    if (this.horizintalFakeScroll?.nativeElement) {\r\n      this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n    }\r\n    if (this.centerScrollableBody?.nativeElement) {\r\n      this.centerScrollableBody.nativeElement.scrollLeft = target.scrollLeft;\r\n    }\r\n  }\r\n\r\n  // Dragging Logic is implemented here\r\n  // private initialIndex: number | null = null;\r\n\r\n  draggingColumn: any;\r\n  dragStartIndex: any = 0;\r\n  // onDragStart(data: any, index: number) {\r\n  //   this.draggingColumn = data.column;\r\n  //   this.dragStartIndex = index;\r\n  // }\r\n  // onDragMove(data: any) {\r\n  //   const { clientX, clientY } = data.event;\r\n  //   const headers = Array.from(\r\n  //     document.querySelectorAll('.one-row-header-cells')\r\n  //   ) as HTMLElement[];\r\n\r\n  //   headers.forEach((headerEl, idx) => {\r\n  //     const rect = headerEl.getBoundingClientRect();\r\n  //     if (\r\n  //       idx !== this.dragStartIndex &&\r\n  //       clientX > rect.left &&\r\n  //       clientX < rect.right &&\r\n  //       clientY > rect.top &&\r\n  //       clientY < rect.bottom\r\n  //     ) {\r\n  //       const otherIndex = idx;\r\n  //       console.log(`${this.dragStartIndex} --> ${otherIndex}`);\r\n  //       this.swapColumn(this.dragStartIndex, otherIndex);\r\n  //       console.log('Updated Columns: ', this.columns);\r\n  //       this.dragStartIndex = otherIndex; // update index\r\n  //     }\r\n  //   });\r\n  // }\r\n\r\n  // swapColumn(previusIndex: number, currentIndex: number) {\r\n  //   const columns = structuredClone(this.columns);\r\n  //   const flattenColumns = this.flattenColumns(columns);\r\n\r\n  //   const visibleFlattenColumns = flattenColumns.filter(\r\n  //     (col) => col.is_visible\r\n  //   );\r\n  //   const previusColumn = visibleFlattenColumns[previusIndex];\r\n  //   const currentColumn = visibleFlattenColumns[currentIndex];\r\n\r\n  //   console.log('Previus Column: ', previusColumn);\r\n  //   console.log('current clumn: ', currentColumn);\r\n  // }\r\n\r\n  // onDragEnd(data: any) {\r\n  //   this.draggingColumn = null;\r\n  //   this.dragStartIndex = null;\r\n  // }\r\n\r\n  // CDK DRAG DROP LOGIC GOES HERE\r\n\r\n\r\n  canEnterToRowsGrouping = (drag: CdkDrag<any>, drop: CdkDropList<any>) => {\r\n    // Example: Block if already pinned left\r\n    const data = drag.data;\r\n    if (data?.children && data?.children.length) {\r\n      return data.children.some(\r\n        (col: any) => col.is_visible && col.is_groupable\r\n      );\r\n    }\r\n    return data.is_visible && data.is_groupable;\r\n  };\r\n\r\n  // onDragMoved(event: CdkDragMove<any>) {\r\n  //   const pointerX = event.pointerPosition.x;\r\n  //   const pointerY = event.pointerPosition.y;\r\n\r\n  //   const targetElement = document.getElementById(\r\n  //     'rows-grouping-top-container'\r\n  //   );\r\n\r\n  //   if (targetElement) {\r\n  //     const rect = targetElement.getBoundingClientRect();\r\n\r\n  //     const isOverTarget =\r\n  //       pointerX >= rect.left &&\r\n  //       pointerX <= rect.right &&\r\n  //       pointerY >= rect.top &&\r\n  //       pointerY <= rect.bottom;\r\n\r\n  //     if (isOverTarget) {\r\n  //       this.draggingInGroupArea = true;\r\n  //     } else {\r\n  //       this.draggingInGroupArea = false;\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  enterToTopRowGrouping(dropList: CdkDragEnter<any>) {\r\n    const draggingData = dropList.item.data;\r\n    this.draggingInGroupArea = true;\r\n    // console.log(\"Dragging in group area\")\r\n    this.cdr.detectChanges();\r\n\r\n    if (Array.isArray(draggingData?.children)) {\r\n      const targetGroup = this.columns.find(\r\n        (col) => col.header === draggingData.header\r\n      );\r\n      if (targetGroup) {\r\n        draggingData.children.forEach((draggedChild: any) => {\r\n          const matchingChild = targetGroup.children.find(\r\n            (child: any) => child.field === draggedChild.field\r\n          );\r\n          if (matchingChild) {\r\n            matchingChild.isRowGrouped = !!matchingChild.is_groupable;\r\n          }\r\n        });\r\n      }\r\n    }\r\n    else {\r\n      // Try finding it in top-level columns first\r\n      let targetColumn = this.columns.find(\r\n        (col: any) => col.field === draggingData.field\r\n      );\r\n\r\n      if (targetColumn) {\r\n        targetColumn.isRowGrouped = !!targetColumn.is_groupable;\r\n      } else {\r\n        for (let group of this.columns) {\r\n          if (Array.isArray(group.children)) {\r\n            const matchingChild = group.children.find(\r\n              (child: any) => child.field === draggingData.field\r\n            );\r\n            if (matchingChild) {\r\n              matchingChild.isRowGrouped = !!matchingChild.is_groupable;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // ✅ Refresh UI\r\n    this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  onDropListEnter(\r\n    dropList: CdkDragEnter<any>,\r\n    section: 'left' | 'center' | 'right'\r\n  ) {\r\n    const draggingData = dropList.item.data;\r\n\r\n    const targetColumn: any = this.columns.find(\r\n      (col) => col.header == draggingData.header\r\n    );\r\n\r\n    if (!targetColumn) return;\r\n\r\n    if (\r\n      Array.isArray(draggingData?.children) &&\r\n      Array.isArray(targetColumn?.children)\r\n    ) {\r\n      draggingData.children.forEach((draggedChild: any) => {\r\n        const matchingChild = targetColumn.children.find(\r\n          (child: any) => child.field === draggedChild.field\r\n        );\r\n        if (matchingChild) {\r\n          matchingChild.pinned = section === 'center' ? null : section;\r\n          matchingChild['isRowGrouped'] = false;\r\n        }\r\n      });\r\n    } else {\r\n      targetColumn.pinned = section === 'center' ? null : section;\r\n      targetColumn['isRowGrouped'] = false;\r\n    }\r\n\r\n    this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  // enterToTopGroupingRow(dropList: CdkDragEnter<any>) {\r\n  //   this.shouldDisableDroplistSorting = this.isDisableColumnGrouping;\r\n  //   this.draggingInGroupArea = true;\r\n  //   this.cdr.detectChanges();\r\n  // const index = this.groupedColumns.findIndex(\r\n  //   (col) => col.field === column.field\r\n  // );\r\n  // if (index !== -1) {\r\n  //   this.groupedColumns.splice(index, 1);\r\n  // }\r\n\r\n  // // 2. Traverse this.columns to find and update the matching column\r\n  // this.columns.forEach((group) => {\r\n  //   if (group?.children && Array.isArray(group.children)) {\r\n  //     group.children.forEach((child) => {\r\n  //       if (child.field === column.field) {\r\n  //         child.isRowGrouped = false;\r\n  //       }\r\n  //     });\r\n  //   } else if (group.field === column.field) {\r\n  //     group.isRowGrouped = false;\r\n  //   }\r\n  // });\r\n  //   this.cdr.detectChanges();\r\n  // }\r\n\r\n  exitedFromTheTopRow(dropList: CdkDragExit<any>) {\r\n    this.draggingInGroupArea = false;\r\n    this.isDisableColumnGrouping = false;\r\n    this.shouldDisableDroplistSorting = false;\r\n    const draggingData = dropList.item.data;\r\n    if (Array.isArray(draggingData?.children)) {\r\n      const targetGroup = this.columns.find(\r\n        (col) => col.header === draggingData.header\r\n      );\r\n      if (targetGroup) {\r\n        draggingData.children.forEach((draggedChild: any) => {\r\n          const matchingChild = targetGroup.children.find(\r\n            (child: any) => child.field === draggedChild.field\r\n          );\r\n          if (matchingChild) {\r\n            matchingChild.isRowGrouped = false;\r\n          }\r\n        });\r\n      }\r\n    } else {\r\n      let targetColumn = this.columns.find(\r\n        (col: any) => col.field === draggingData.field\r\n      );\r\n\r\n      if (targetColumn) {\r\n        targetColumn.isRowGrouped = false;\r\n      } else {\r\n        for (let group of this.columns) {\r\n          if (Array.isArray(group.children)) {\r\n            const matchingChild = group.children.find(\r\n              (child: any) => child.field === draggingData.field\r\n            );\r\n            if (matchingChild) {\r\n              matchingChild.isRowGrouped = false;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  shouldDisableDroplistSorting = false;\r\n  isDisableColumnGrouping = false;\r\n  checkColumnGroupingStatus(col: any) {\r\n    if (col?.children && Array.isArray(col.children)) {\r\n      const allChildrenDisabled = col.children.every(\r\n        (child: any) => child.is_groupable === false\r\n      );\r\n      this.isDisableColumnGrouping = allChildrenDisabled;\r\n    } else {\r\n      this.isDisableColumnGrouping = col.is_groupable === false;\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  currentDraggingColumn: any = null;\r\n  dragStartOnGroup(col: any) {\r\n    this.currentDraggingColumn = col;\r\n  }\r\n\r\n  onSortGroup = async (event: CdkDragSortEvent<any>, section: string) => {\r\n    const columns = (this as any)[section];\r\n    if (event.previousIndex === event.currentIndex) return;\r\n    const visibleColumns = columns.filter((col: any) => {\r\n      if (col?.children && Array.isArray(col.children)) {\r\n        return col.children.some((child: any) => child.is_visible);\r\n      }\r\n      return col.is_visible;\r\n    });\r\n    const previousHeader = visibleColumns[event.previousIndex].header;\r\n    const currentHeader = visibleColumns[event.currentIndex].header;\r\n    const visiblePrevIndex = visibleColumns.findIndex(\r\n      (col: any) => col.header === previousHeader\r\n    );\r\n    const visibleCurrIndex = visibleColumns.findIndex(\r\n      (col: any) => col.header === currentHeader\r\n    );\r\n    const getFields = (item: any): string[] => {\r\n      if (item?.children && Array.isArray(item.children)) {\r\n        return item.children.map((child: any) => child.field);\r\n      }\r\n      return [item.field];\r\n    };\r\n    const prevFields = getFields(visibleColumns[visiblePrevIndex]);\r\n    const currFields = getFields(visibleColumns[visibleCurrIndex]);\r\n    const allFields = [...prevFields, ...currFields];\r\n    const cells = allFields.length\r\n      ? ([] as HTMLElement[]).concat(\r\n        ...allFields.map((field) =>\r\n          Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n        )\r\n      )\r\n      : [];\r\n    const firstPositions = new Map<HTMLElement, number>();\r\n    cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n    // console.log(\"this .coluns\", this.columns);\r\n    moveItemInArray((this as any)[section], visiblePrevIndex, visibleCurrIndex);\r\n\r\n    const prevColIndexInColumns = this.columns.findIndex(item => item.header === previousHeader);\r\n    const currColIndexInColumns = this.columns.findIndex(item => item.header === currentHeader);\r\n    moveItemInArray(this.columns, prevColIndexInColumns, currColIndexInColumns);\r\n    // await this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n    allFields.forEach((field) => {\r\n      const updatedCells = Array.from(\r\n        document.querySelectorAll(`[field=\"${field}\"]`)\r\n      ) as HTMLElement[];\r\n\r\n      updatedCells.forEach((el) => {\r\n        const newLeft = el.getBoundingClientRect().left;\r\n        const oldLeft = firstPositions.get(el)!;\r\n        const deltaX = oldLeft - newLeft;\r\n        if (deltaX !== 0) {\r\n          el.style.willChange = 'transform';\r\n          el.style.transition = 'none';\r\n          el.style.transform = `translateX(${deltaX}px)`;\r\n          void el.offsetWidth;\r\n          el.style.transition = 'transform 300ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n          el.style.transform = 'translateX(0)';\r\n          const handle = () => {\r\n            el.style.transition = '';\r\n            el.style.transform = '';\r\n            el.style.willChange = '';\r\n            el.removeEventListener('transitionend', handle);\r\n          };\r\n          el.addEventListener('transitionend', handle);\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n\r\n  onDropGroup() {\r\n    this.leftPinnedColumns = this.deepCloneColumns(this.previewLeftPinnedColumns);\r\n    this.centerColumns = this.deepCloneColumns(this.previewCenterColumns);\r\n    this.rightPinnedColumns = this.deepCloneColumns(this.previewRightPinnedColumns);\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: this.paginationConfig.pageSize,\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  private deepCloneColumns(columns: any[]): any[] {\r\n    if (!Array.isArray(columns)) return [];\r\n\r\n    return columns.map(col => ({\r\n      ...col,\r\n      query: col.query ? { ...col.query } : null,\r\n      column_dropdown_value: Array.isArray(col.column_dropdown_value)\r\n        ? [...col.column_dropdown_value]\r\n        : [],\r\n      // Recursively deep clone children if present\r\n      children: Array.isArray(col.children)\r\n        ? this.deepCloneColumns(col.children)\r\n        : undefined,\r\n    }));\r\n  }\r\n\r\n\r\n  async onDropTopGroup(event: CdkDragDrop<any>) {\r\n    if (this.isOutsideContainer) return;\r\n    this.mainScroll.nativeElement.scrollTop = 0;\r\n    this.loading = true;\r\n    this.translateY = 0;\r\n    this.cdr.detectChanges();\r\n    const draggedData = event.item.data;\r\n    if (draggedData?.children && Array.isArray(draggedData.children)) {\r\n      draggedData.children.forEach((col: any) => {\r\n        if (col.is_visible && col.is_groupable) {\r\n          this.groupedColumns.push(col);\r\n        }\r\n      });\r\n    } else {\r\n      if (draggedData.is_visible && draggedData.is_groupable) {\r\n        this.groupedColumns.push(draggedData);\r\n      }\r\n    }\r\n    this.draggingInGroupArea = false;\r\n    const fields = this.groupedColumns.map((item) => item.field);\r\n    this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n    this.updateFlattenedData();\r\n    this.updateColumnWidthsAndGroups();\r\n    this.refreshPreviewColumns();\r\n    this.updateVisibleRows(0);\r\n    this.loading = false;\r\n    this.cdr.detectChanges();\r\n    this.selectedCells = [];\r\n    setTimeout(() => {\r\n      this.rowSelectedIndexes.clear();\r\n      this.cdr.detectChanges();\r\n    }, 1000);\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  async onGroupReorder(event: CdkDragDrop<any[]>) {\r\n    moveItemInArray(this.groupedColumns, event.previousIndex, event.currentIndex);\r\n    const fields = this.groupedColumns.map((item) => item.field);\r\n    this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n    setTimeout(() => {\r\n      this.updateFlattenedData();\r\n      this.updateColumnWidthsAndGroups();\r\n      this.refreshPreviewColumns();\r\n      this.updateVisibleRows(0);\r\n      this.loading = false;\r\n      this.cdr.detectChanges();\r\n    }, 100);\r\n\r\n    setTimeout(() => {\r\n      this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\r\n      this.cdr.detectChanges()\r\n    }, 10);\r\n  }\r\n\r\n  async ungroupColumn(column: any) {\r\n    try {\r\n      this.loading = true;\r\n      this.cdr.detectChanges();\r\n      const index = this.groupedColumns.findIndex(\r\n        (col) => col.field === column.field\r\n      );\r\n      if (index !== -1) {\r\n        this.groupedColumns.splice(index, 1);\r\n      }\r\n      const fields = this.groupedColumns.map((item) => item.field);\r\n      this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\r\n      this.columns.forEach((group) => {\r\n        if (group?.children && Array.isArray(group.children)) {\r\n          group.children.forEach((child: any) => {\r\n            if (child.field === column.field) {\r\n              child.isRowGrouped = false;\r\n            }\r\n          });\r\n        } else if (group.field === column.field) {\r\n          group.isRowGrouped = false;\r\n        }\r\n      });\r\n      setTimeout(() => {\r\n        this.updateFlattenedData();\r\n        this.updateColumnWidthsAndGroups();\r\n        this.refreshPreviewColumns();\r\n        this.updateVisibleRows(0);\r\n        this.loading = false;\r\n        this.cdr.detectChanges();\r\n      }, 1000);\r\n\r\n    } catch (err) {\r\n      console.error(\"Error in ungroupColumn:\", err);\r\n      this.loading = false;\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  shouldTheGroupHeaderShow(group: any) {\r\n    if (group?.children && group.children.length) {\r\n      return group.children.some(\r\n        (col: any) => col.is_visible && !col?.isRowGrouped\r\n      );\r\n    }\r\n    return group?.is_visible && !group?.isRowGrouped;\r\n  }\r\n\r\n\r\n  // onChildDragStart() {\r\n  //   debugger;\r\n  // }\r\n\r\n  // dropListIds: string[] = [];\r\n\r\n  // generateDropListIds() {\r\n  //   this.dropListIds = [];\r\n\r\n  //   const sectionKeys = [\r\n  //     'leftPinnedColumns',\r\n  //     'centerColumns',\r\n  //     'rightPinnedColumns',\r\n  //   ];\r\n\r\n  //   sectionKeys.forEach((sectionKey) => {\r\n  //     const sectionCols = (this as any)[sectionKey];\r\n\r\n  //     this.columns.forEach((col: any, i: number) => {\r\n  //       if (col?.children?.length > 0) {\r\n  //         col.children.forEach((child: any, childIndex: number) => {\r\n  //           if (child?.is_visible && !child.isRowGrouped) {\r\n  //             const id = `${sectionKey}${i}`;\r\n  //             this.dropListIds.push(id);\r\n  //           }\r\n  //         });\r\n  //       } else if (col?.is_visible && !col.isRowGrouped) {\r\n  //         const id = `${sectionKey}${i}`;\r\n  //         this.dropListIds.push(id);\r\n  //       }\r\n  //     });\r\n  //   });\r\n  // }\r\n\r\n  onChildDroplistSorted = async (event: CdkDragSortEvent<any>, section: string) => {\r\n    if (event.previousIndex === event.currentIndex) return;\r\n\r\n    const pinned =\r\n      section == 'previewLeftPinnedColumns'\r\n        ? 'left'\r\n        : section == 'previewRightPinnedColumns'\r\n          ? 'right'\r\n          : \"\";\r\n\r\n    const column = event.item.data;\r\n    let group = this.columns.find(\r\n      (col: any) =>\r\n        Array.isArray(col.children) &&\r\n        col.children.some((child: any) => child?.field === column?.field)\r\n    );\r\n    const groupIndex = this.columns.findIndex(\r\n      (col) => col.header === group.header\r\n    );\r\n    const filteredGroup = group?.children.filter((col: any) => {\r\n      const isPinnedMatch =\r\n        (pinned === \"\" && (!col?.pinned || col?.pinned === \"\")) || col?.pinned === pinned;\r\n      return isPinnedMatch && col?.is_visible;\r\n    });\r\n\r\n    const previousField = filteredGroup[event.previousIndex].field;\r\n    const currentField = filteredGroup[event.currentIndex].field;\r\n    const visiblePrevIndex = group.children.findIndex(\r\n      (col: any) => col.field == previousField\r\n    );\r\n    const visibleCurrIndex = group.children.findIndex(\r\n      (col: any) => col.field == currentField\r\n    );\r\n    const allFields = [previousField, currentField];\r\n    const cells = allFields.length\r\n      ? ([] as HTMLElement[]).concat(\r\n        ...allFields.map((field) =>\r\n          Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n        )\r\n      )\r\n      : [];\r\n\r\n    const groupInSection = (this as any)[section].find(\r\n      (col: any) =>\r\n        Array.isArray(col.children) &&\r\n        col.children.some((child: any) => child?.field === column?.field)\r\n    );\r\n\r\n    const filterGroupInSection = (this as any)[section].find(\r\n      (col: any) =>\r\n        Array.isArray(col.children) &&\r\n        col.children.some((child: any) => child?.field === column?.field)\r\n    );\r\n\r\n    const groupInSectionIndex = (this as any)[section].findIndex(\r\n      (col: any) => col.header === groupInSection.header\r\n    );\r\n\r\n    const firstPositions = new Map<HTMLElement, number>();\r\n    cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n    moveItemInArray(\r\n      this.columns[groupIndex]?.children,\r\n      visiblePrevIndex,\r\n      visibleCurrIndex\r\n    );\r\n\r\n    moveItemInArray(\r\n      (this as any)[section]?.[groupInSectionIndex].children,\r\n      event.previousIndex,\r\n      event.currentIndex\r\n    );\r\n\r\n    // await this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n    allFields.forEach((field) => {\r\n      const updatedCells = Array.from(\r\n        document.querySelectorAll(`[field=\"${field}\"]`)\r\n      ) as HTMLElement[];\r\n      updatedCells.forEach((el) => {\r\n        const newLeft = el.getBoundingClientRect().left;\r\n        const oldLeft = firstPositions.get(el)!;\r\n        const deltaX = oldLeft - newLeft;\r\n        if (deltaX !== 0) {\r\n          el.style.willChange = 'transform';\r\n          el.style.transition = 'none';\r\n          el.style.transform = `translateX(${deltaX}px)`;\r\n          void el.offsetWidth;\r\n          el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n          el.style.transform = 'translateX(0)';\r\n\r\n          const handle = () => {\r\n            el.style.transition = '';\r\n            el.style.transform = '';\r\n            el.style.willChange = '';\r\n            el.removeEventListener('transitionend', handle);\r\n          };\r\n          el.addEventListener('transitionend', handle);\r\n        }\r\n      });\r\n    });\r\n    console.group('Group: ', group);\r\n  }\r\n\r\n\r\n  onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>) {\r\n    this.updateColumnWidthsAndGroups();\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: this.paginationConfig.pageSize,\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n\r\n    setTimeout(() => {\r\n      this.cdr.detectChanges();\r\n    }, 2);\r\n  }\r\n\r\n  // Rows Grouping Logic Goes Here\r\n\r\n  groupData(data: any[], groupFields: string[]): any[] {\r\n    let dataSet = structuredClone(data);\r\n    if (!groupFields.length) return data;\r\n    const [currentField, ...restFields] = groupFields;\r\n    const groupedMap = new Map<string, any[]>();\r\n    for (const item of dataSet) {\r\n      let keyValue = currentField.split('.').reduce((obj, k) => obj?.[k], item);\r\n      let groupKey: string;\r\n      if (Array.isArray(keyValue)) {\r\n        if (keyValue.length === 0) {\r\n          groupKey = \"_Blank\";\r\n        } else if (typeof keyValue[0] === \"object\") {\r\n          groupKey = keyValue\r\n            .map(obj => (obj?.department_name || obj.roleName || obj?.full_name) ?? \"_Blank\")\r\n            .join(\",\");\r\n        } else {\r\n          groupKey = keyValue\r\n            .map(val => val ?? \"_Blank\")\r\n            .join(\",\");\r\n        }\r\n      } else {\r\n        groupKey = keyValue ?? \"_Blank\";\r\n      }\r\n      if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n      groupedMap.get(groupKey)!.push(item);\r\n    }\r\n    return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n      isGroup: true,\r\n      groupField: currentField,\r\n      groupValue,\r\n      children: this.groupData(groupItems, restFields),\r\n      isExpand: false,\r\n    }));\r\n  }\r\n\r\n\r\n  countLeafRows(group: any): number {\r\n    if (!group.children || !group.children.length) return 0;\r\n\r\n    return group.children.reduce((count: number, child: any) => {\r\n      return count + (child.isGroup ? this.countLeafRows(child) : 1);\r\n    }, 0);\r\n  }\r\n\r\n  isActiveFilterOpen = false;\r\n  toggleActiveFilter() {\r\n    this.isActiveFilterOpen = !this.isActiveFilterOpen;\r\n  }\r\n\r\n  toggleActions(type: string) {\r\n    if (type === this.activeTopButton) this.activeTopButton = type;\r\n    else this.activeTopButton = type;\r\n    this.activeSubButton = '';\r\n    this.isFilterOpen = false;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  activeSubButton = '';\r\n  toggleSubActions(type: string) {\r\n    if (type === this.activeSubButton) this.activeSubButton = '';\r\n    else this.activeSubButton = type;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  toggleActionsDropdown() {\r\n    this.showActionsDropDown = !this.showActionsDropDown;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n\r\n  async changeTableLayout(event: Event, layoutType: string) {\r\n    let target = event.target as HTMLInputElement;\r\n\r\n    if (target.checked) {\r\n      this.selectedTableLayout = layoutType;\r\n      if (layoutType === 'small') {\r\n        this.rowHeight = 36;\r\n        this.headerRowHeight = 40;\r\n        this.bodyTextFontsSize = 10;\r\n        this.headerTextFontsSize = 10;\r\n\r\n      } else if (layoutType === 'medium') {\r\n        this.rowHeight = 44;\r\n        this.headerRowHeight = 44;\r\n        this.bodyTextFontsSize = 14;\r\n        this.headerTextFontsSize = 14;\r\n\r\n      } else {\r\n        this.rowHeight = 60;\r\n        this.headerRowHeight = 52;\r\n        this.bodyTextFontsSize = 16;\r\n        this.headerTextFontsSize = 16;\r\n      }\r\n      this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n      await this.refreshHeaders();\r\n    }\r\n    if (this.tableFilterViewId) {\r\n      this.savePreset('mouseUp');\r\n    }\r\n    this.onFontChange()\r\n  }\r\n\r\n\r\n  pageSizeOptions = [10, 25, 50, 75, 100, 150, 200, 250, 300, 500];\r\n  get startIndexData() {\r\n    return (this.paginationConfig.page - 1) * this.paginationConfig.limit;\r\n  }\r\n\r\n  get endIndex() {\r\n    return Math.min(this.startIndex + this.paginationConfig.limit, this.paginationConfig.totalResults);\r\n  }\r\n\r\n  get visiblePages(): (number | string)[] {\r\n    const pages: (number | string)[] = [];\r\n\r\n    if (this.paginationConfig.totalPages <= 7) {\r\n      for (let i = 1; i <= this.paginationConfig.totalPages; i++) {\r\n        pages.push(i);\r\n      }\r\n    } else {\r\n      pages.push(1);\r\n      if (this.paginationConfig.page > 3) {\r\n        pages.push('...');\r\n      }\r\n      let start = Math.max(2, this.paginationConfig.page - 1);\r\n      let end = Math.min(this.paginationConfig.totalPages - 1, this.paginationConfig.page + 1);\r\n\r\n      for (let i = start; i <= end; i++) {\r\n        pages.push(i);\r\n      }\r\n\r\n      if (this.paginationConfig.page < this.paginationConfig.totalPages - 2) {\r\n        pages.push('...');\r\n      }\r\n      pages.push(this.paginationConfig.totalPages);\r\n    }\r\n\r\n    return pages;\r\n  }\r\n\r\n\r\n  searchTextForFilterDropDown = '';\r\n  toggleColumnInFilterDropdown(col: any) {\r\n\r\n  }\r\n\r\n  removeColumnFromFilter(option: any) {\r\n\r\n  }\r\n\r\n  handleBackspace(event: Event) {\r\n    // If search is empty, remove last tag\r\n    if (!this.searchTextForFilterDropDown && this.selectedFilterOptions.length) {\r\n      const last = this.selectedFilterOptions[this.selectedFilterOptions.length - 1];\r\n      this.toggleSelectionInFilter(last);\r\n    }\r\n  }\r\n\r\n  @ViewChild('filterMenueSearchInput') filterMenueSearchInput!: ElementRef<HTMLInputElement>\r\n  @ViewChild('filterMenueTextchInput') filterMenueTextchInput!: ElementRef<HTMLInputElement>\r\n\r\n  openFilteronThreeDotsClick(col: any) {\r\n    if (col.type == 'image' || !col?.type) return;\r\n    this.selectedColumnForFilter = col;\r\n    this.isThreeDotsFilterOpen = true;\r\n    if (col.type === 'dropdown') {\r\n      this.currentFilterSelectedIds.clear();\r\n      const savedIds = col?.query?._ids || [];\r\n      savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n      this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value.filter(\r\n        (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\r\n      );\r\n      setTimeout(() => {\r\n        if (this.filterMenueSearchInput) {\r\n          this.filterMenueSearchInput.nativeElement.focus();\r\n        }\r\n      }, 100);\r\n    } else if (['string', 'number', 'date'].includes(col.type)) {\r\n      this.firstCondition = col.query.first_condition ? col.query.first_condition : (col.type == 'date' ? 'equal' : 'contain');\r\n      this.firstValue = col?.query?.first_value || '';\r\n      this.condition = col?.query?.condition || 'none';\r\n      this.secondCondition = (col?.query?.second_condition) || null;\r\n      this.secondValue = col?.query?.second_value || '';\r\n      setTimeout(() => {\r\n        this.filterMenueTextchInput.nativeElement.focus();\r\n      }, 100);\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  isFilterOpen = false\r\n  selectedColumnForFilter: any;\r\n  showFilters = this.showSideMenu ? false : false;\r\n\r\n  openFilterFromDisabledSearchedInput(col: any) {\r\n    if (col.type !== 'dropdown') return;\r\n    this.openFilter(col);\r\n  }\r\n\r\n  openFilter(col: any) {\r\n    this.activeFilterCell = col;\r\n    this.activeCol = null\r\n    this.isFilterOpen = true;\r\n    this.selectedColumnForFilter = col;\r\n\r\n    if (col.type === 'dropdown') {\r\n      this.currentFilterSelectedIds.clear();\r\n      const savedIds = col?.query?._ids || [];\r\n      savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n      this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value?.filter(\r\n        (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\r\n      );\r\n    } else if (['string', 'number', 'date'].includes(col.type)) {\r\n      this.firstCondition = col?.query?.first_condition || 'contain';\r\n      this.firstValue = col?.query?.first_value || '';\r\n      this.condition = col?.query?.condition || 'none';\r\n      this.secondCondition = col?.query?.second_condition || null;\r\n      this.secondValue = col?.query?.second_value || '';\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  firstValue: any = '';\r\n  firstCondition = '';\r\n  secondValue: any = '';\r\n  secondCondition = null;\r\n  condition = '';\r\n\r\n  resetTextFilterChanges() {\r\n    this.firstCondition = 'contain';\r\n    this.firstValue = '';\r\n    this.condition = 'none';\r\n    this.secondCondition = null;\r\n    this.secondValue = '';\r\n    this.isFilterOpen = false;\r\n    this.isActiveFilterOpen = false;\r\n    this.activeTopButton = '';\r\n  }\r\n\r\n  toggleAllValusSelectionInDropdownFilter(column: any) {\r\n\r\n  }\r\n\r\n\r\n  selectedFilterOptions: any[] = []\r\n\r\n  currentFilterSelectedIds = new Set<string>();\r\n\r\n  toggleSelectionInFilter(option: any) {\r\n    debugger\r\n    const id = option.id || option._id || option;\r\n    if (this.currentFilterSelectedIds.has(id)) {\r\n      this.currentFilterSelectedIds.delete(id);\r\n    } else {\r\n      this.currentFilterSelectedIds.add(id);\r\n    }\r\n    this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value.filter((option: any) => this.currentFilterSelectedIds.has(option.id || option._id || option))\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  resetFilterChanges() {\r\n    this.isFilterOpen = false;\r\n    this.currentFilterSelectedIds.clear();\r\n    this.selectedFilterOptions!.length = 0;\r\n    this.isActiveFilterOpen = false;\r\n    this.activeTopButton = '';\r\n    // const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns);\r\n    // console.log(\"Filtered Columns Are: \", filteredColumns);\r\n  }\r\n\r\n  applyDropdownFilter() {\r\n    this.isFilterOpen = false;\r\n    this.isActiveFilterOpen = false;\r\n    this.activeTopButton = '';\r\n    this.activeFilterCell = null;\r\n    this.isThreeDotsFilterOpen = false;\r\n    const findColumn = (columns: any[], field: string): any => {\r\n      for (const col of columns) {\r\n        if (col.field === field) return col;\r\n        if (col.children && col.children.length) {\r\n          const found = findColumn(col.children, field);\r\n          if (found) return found;\r\n        }\r\n      }\r\n      return null;\r\n    };\r\n\r\n    const column = findColumn(this.columns, this.selectedColumnForFilter.field);\r\n    if (column) {\r\n      if (column.type === 'dropdown') {\r\n        column.query = column.query || {};\r\n        column.query._ids = column.query._ids || [];\r\n\r\n        // Remove stale IDs (not present in Set)\r\n        column.query._ids = column.query._ids.filter(\r\n          (id: any) => this.currentFilterSelectedIds.has(id)   // <-- use .has()\r\n        );\r\n\r\n        // Add new ones if missing\r\n        this.currentFilterSelectedIds.forEach(id => {\r\n          if (!column.query._ids.includes(id)) {\r\n            column.query._ids.push(id);\r\n          }\r\n        });\r\n\r\n      } else if (['string', 'number', 'date'].includes(column.type)) {\r\n        column.query = {\r\n          first_condition: this.firstCondition || 'contain',\r\n          first_value: this.firstValue || null,\r\n          condition: this.condition || 'none',\r\n          second_condition: this.secondCondition || null,\r\n          second_value: this.secondValue || null,\r\n        };\r\n      }\r\n    }\r\n\r\n    const filter = {\r\n      field: column.field,\r\n      search: column.search,\r\n      query: column.query,\r\n      type: column.type,\r\n      _ids: column._ids\r\n    };\r\n\r\n    const existingIndex = this.filtersConfig.findIndex(f => f.field === column.field);\r\n\r\n    if (existingIndex !== -1) {\r\n      this.filtersConfig[existingIndex] = filter;\r\n    } else {\r\n      this.filtersConfig.push(filter);\r\n    }\r\n\r\n    this.isFilterOpen = false;\r\n    this.activeCol = null;\r\n    this.isActiveFilterOpen = false;\r\n    this.activeTopButton = '';\r\n    this.activeFilterCell = null;\r\n    this.isThreeDotsFilterOpen = false;\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n\r\n    const filters = this.cleanFilterdColumns()\r\n    setTimeout(() => {\r\n      this.filterOptions.emit(filters);\r\n    }, 200);\r\n  }\r\n\r\n  // applyFilterFromFilterRow(column: any) {\r\n  //   const filter = {\r\n  //     field: column.field,\r\n  //     search: column.search,\r\n  //     query: column.query,\r\n  //     type: column.type,\r\n  //     _ids: column._ids\r\n  //   };\r\n  //   this.filtersConfig.push(filter);\r\n  //   this.isFilterOpen = false;\r\n  //   this.isActiveFilterOpen = false;\r\n  //   this.activeTopButton = '';\r\n  //   this.activeFilterCell = null;\r\n  //   this.isThreeDotsFilterOpen = false;\r\n  //   const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n  //   this.filterOptions.emit(filteredColumns);\r\n  // }\r\n\r\n  isFilterAppliedOnColumn(column: any) {\r\n    return this.filtersConfig.some(col => col.field === column.field);\r\n  }\r\n\r\n  // Side Filters Logic is here\r\n\r\n  toggleSelectAllSideFilters(col: any, event: Event) {\r\n    const checked = (event?.target as HTMLInputElement)?.checked;\r\n\r\n    if (checked) {\r\n      col.query._ids = col?.column_dropdown_value?.map(\r\n        (opt: any) => opt.id || opt._id || opt\r\n      );\r\n      this.currentFilterSelectedIds = new Set<string>(col.query._ids);\r\n    } else {\r\n      col.query._ids = [];\r\n      this.currentFilterSelectedIds.clear();\r\n    }\r\n  }\r\n\r\n\r\n  isAllSideFilterOptionsSelected(col: any): boolean {\r\n    if (!col?.query?._ids || !Array.isArray(col.column_dropdown_value)) return false;\r\n    return col.query._ids.length === col.column_dropdown_value.length;\r\n  }\r\n\r\n  onOptionToggle(col: any, option: any) {\r\n    const optionId = option.id || option._id || option;\r\n    if (!col.query._ids) {\r\n      col.query._ids = [];\r\n    }\r\n    const idx = col.query._ids.indexOf(optionId);\r\n    if (idx > -1) {\r\n      col.query._ids.splice(idx, 1);\r\n    } else {\r\n      col.query._ids.push(optionId);\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n\r\n\r\n  resetSideFilter(col: any) {\r\n    const resetColumnRecursively = (columns: any[]): boolean => {\r\n      for (const column of columns) {\r\n        if (column.field === col.field) {\r\n          column.query = {\r\n            _ids: [],\r\n            first_condition: 'contain',\r\n            first_value: null,\r\n            condition: 'none',\r\n            second_condition: 'contain',\r\n            second_value: null\r\n          };\r\n          return true;\r\n        }\r\n        if (Array.isArray(column?.children) && column?.children?.length) {\r\n          if (resetColumnRecursively(column.children)) {\r\n            return true;\r\n          }\r\n        }\r\n      }\r\n      return false;\r\n    };\r\n    resetColumnRecursively(this.columns);\r\n    const index = this.filtersConfig.findIndex((f: any) => f.field === col.field);\r\n    if (index !== -1) {\r\n      this.filtersConfig.splice(index, 1);\r\n    }\r\n    this.activeFilterCell = null;\r\n    this.cdr.detectChanges();\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.cleanFilterdColumns(),\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n\r\n    const filters = this.cleanFilterdColumns()\r\n    setTimeout(() => {\r\n      this.filterOptions.emit(filters);\r\n    }, 200);\r\n  }\r\n\r\n\r\n  clearAllFilters() {\r\n    this.tableView?.forEach((ele) => { ele.is_temp = false });\r\n    const resetAllRecursively = (columns: any[]) => {\r\n      for (const column of columns) {\r\n        if (column.query) {\r\n          column.query = {\r\n            _ids: [],\r\n            first_condition: 'contain',\r\n            first_value: null,\r\n            condition: 'none',\r\n            second_condition: 'contain',\r\n            second_value: null\r\n          };\r\n        }\r\n        if (Array.isArray(column?.children) && column.children.length) {\r\n          resetAllRecursively(column.children);\r\n        }\r\n      }\r\n    };\r\n    resetAllRecursively(this.columns);\r\n    this.activeFilterCell = null;\r\n    this.filtersConfig = [];\r\n    this.refreshPreviewColumns();\r\n    this.cdr.detectChanges();\r\n    this.rowShadingEnabled = false;\r\n    this.showVerticalBorder = false;\r\n    this.fontFaimly = 'Inter';\r\n    this.headerTextFontsSize = 14;\r\n    this.selectedTableLayout = 'mediumd';\r\n    this.bodyTextFontsSize = 14;\r\n    this.globalSearchText = '';\r\n    const event = { eventType: 'reset', data: { tableType: this.tableType } };\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\r\n        if (query) {\r\n          delete query.__typename;\r\n        }\r\n        return {\r\n          query,\r\n          ...rest,\r\n        }\r\n      }),\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n\r\n    setTimeout(() => {\r\n      const filteredColumns = this.cleanFilterdColumns();\r\n      this.filterOptions.emit(filteredColumns);\r\n    }, 300);\r\n    this.genericEvent.emit(event)\r\n  }\r\n\r\n\r\n  applySideFilter(column: any) {\r\n    if (!column.query.first_value && !column?.query?._ids.length) return;\r\n    const filter = {\r\n      field: column.field,\r\n      search: column.search,\r\n      query: column.query,\r\n      type: column.type,\r\n      _ids: column._ids || []\r\n    };\r\n\r\n    const existingIndex = this.filtersConfig.findIndex(f => f.field === column.field);\r\n\r\n    if (existingIndex !== -1) {\r\n      // Replace the existing filter\r\n      this.filtersConfig[existingIndex] = filter;\r\n    } else {\r\n      // Add new filter\r\n      this.filtersConfig.push(filter);\r\n    }\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\r\n        if (query) {\r\n          delete query.__typename;\r\n        }\r\n        return {\r\n          query,\r\n          ...rest,\r\n        }\r\n      }),\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n\r\n    setTimeout(() => {\r\n      const filteredColumns = this.cleanFilterdColumns();\r\n      this.filterOptions.emit(filteredColumns);\r\n    }, 200);\r\n  }\r\n\r\n\r\n  removeSideFilter(column: any) {\r\n    if (!column.query.first_value && !column?.query?._ids.length) return;\r\n\r\n    const existingIndex = this.filtersConfig.findIndex(f => f.field === column.field);\r\n    if (existingIndex !== -1) {\r\n      this.filtersConfig.splice(existingIndex, 1);\r\n    }\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\r\n        if (query) {\r\n          delete query.__typename;\r\n        }\r\n        return {\r\n          query,\r\n          ...rest,\r\n        };\r\n      }),\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n    setTimeout(() => {\r\n      const filteredColumns = this.cleanFilterdColumns();\r\n      this.filterOptions.emit(filteredColumns);\r\n    }, 200);\r\n  }\r\n\r\n  collapseAllExpandedCells() {\r\n    if (this.expandedCells?.size > 0) {\r\n      this.expandedCells.clear();\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n\r\n\r\n  trackByField(index: number, col: any): string {\r\n    return col?.field;\r\n  }\r\n\r\n  get activeFilteredColumns(): any[] {\r\n    const collectFiltered = (columns: any[]): any[] => {\r\n      let result: any[] = [];\r\n\r\n      columns.forEach(col => {\r\n        if (col.children && col.children.length) {\r\n          result = result.concat(collectFiltered(col.children));\r\n        }\r\n\r\n        const isInFiltersConfig = this.filtersConfig.some(f => f.field === col.field);\r\n        if (isInFiltersConfig) {\r\n          result.push(col);\r\n        }\r\n      });\r\n\r\n      return result;\r\n    };\r\n\r\n    return collectFiltered(this.columns);\r\n  }\r\n\r\n\r\n\r\n\r\n  toggleOpenFilter() {\r\n    this.showFilters = !this.showFilters;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n\r\n\r\n  // Cell Editing Work start here\r\n\r\n  editingKey: string | null = null;\r\n  activeCell: string | null = null;\r\n\r\n  setActiveCell(row: any, column: any) {\r\n    this.activeCell = ((row.id || row._id) + '-' + column.field);\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  isActiveCell(row: any, col: any): boolean {\r\n    return this.activeCell === ((row.id || row._id) + '-' + col.field);\r\n  }\r\n\r\n  @ViewChild('textAreadInput') textAreadInput!: ElementRef<HTMLTextAreaElement>;\r\n  enableEdit(row: any, column: any, clickedFromDetailsBox = false, cellContainer?: HTMLElement) {\r\n    this.editinDropdownSearch = '';\r\n    if (row?.__virtualIndex == 0) return;\r\n    if (column.type == 'image' || !column?.is_editable) return;\r\n    this.editingKey = ((row.id || row._id) + '-' + column.field);\r\n\r\n    if (column.type === 'dropdown') {\r\n      setTimeout(() => {\r\n        const dropdownMenu = document.querySelector('.cell-editing-dropdown-menu') as HTMLElement;\r\n        if (dropdownMenu) {\r\n          const rect = dropdownMenu.getBoundingClientRect();\r\n          const windowHeight = this.dataGridContainer.nativeElement?.offsetHeight;\r\n\r\n          if (rect.bottom > windowHeight) {\r\n            dropdownMenu.style.top = `-${rect.height}px`;\r\n          } else {\r\n            dropdownMenu.style.top = '100%';\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    if (!clickedFromDetailsBox && this.getNestedValue(row, column.field)?.length > 50) {\r\n      this.toggleExpandOfLongCellText(row, column, this.columns, false)\r\n    }\r\n    setTimeout(() => {\r\n      if (!cellContainer) return;\r\n\r\n      const focusable = cellContainer.querySelector(\r\n        'input, textarea, select, [contenteditable=\"true\"]'\r\n      ) as HTMLElement | null;\r\n\r\n      if (focusable) {\r\n        (focusable as HTMLElement).style.fontSize = '16px';\r\n        focusable.focus();\r\n\r\n        if (focusable instanceof HTMLInputElement || focusable instanceof HTMLTextAreaElement) {\r\n          focusable.select();\r\n        }\r\n      }\r\n\r\n    });\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  disableEdit(row: any, column: any, control?: any) {\r\n    this.rowSelectedIndexes.clear();\r\n    if (!this.editingKey) return\r\n    this.checkRowEditAndEmitValue(row, column, row[column.field])\r\n    this.editingKey = null;\r\n    this.cdr.detectChanges();\r\n    const current = this.getNestedValue(row, column?.field);\r\n    if (!current || (column.type == 'email' && !this.validateEmail(current))) {\r\n      const originalRow = this.originalDataSet.find(item => item.id == row.id || item.id == row._id);\r\n      const original = this.getNestedValue(originalRow, column?.field);\r\n      this.setNestedValue(row, column, original);\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n  emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n  validateEmail(value: string): boolean {\r\n    return this.emailRegex.test(value);\r\n  }\r\n  allowOnlyNumbers(event: KeyboardEvent) {\r\n    const charCode = event.which ? event.which : event.keyCode;\r\n    if (charCode < 48 || charCode > 57) {\r\n      event.preventDefault();\r\n    }\r\n  }\r\n\r\n  checkRowEditAndEmitValue(row: any, column: any, value?: any) {\r\n    // setTimeout(() => {\r\n    const originalRow = this.originalDataSet?.find(\r\n      (r: any) => r.id === row.id || r._id === row._id\r\n    );\r\n    if (!originalRow) return;\r\n    // const clean = (obj: any) => JSON.parse(JSON.stringify(obj));\r\n    // const currentValue = this.getNestedValue(row, column.field);\r\n    // const originalValue = this.getNestedValue(originalRow, column.field);\r\n    const originValue = this.dataSet.find((r: any) => r.id === row.id);\r\n    const changedValue = originValue.verified == value;\r\n    // if (changedValue) return;\r\n    // const hasChanged = this.commonSevice.hasFieldChanged(currentValue, originalValue, column.type);\r\n    // if (!hasChanged) return;\r\n    // this.setNestedValue(originalRow, column, value);\r\n\r\n    const sendObj = {\r\n      data: { ...originValue },\r\n      eventType: 'onCellEdit',\r\n      value: value,\r\n      column: column\r\n    };\r\n    return this.genericEvent.emit(sendObj)\r\n    // }, 100);\r\n  }\r\n\r\n\r\n  isEditing(row: any, col: any): boolean {\r\n    return this.editingKey === ((row.id || row._id) + '-' + col.field);\r\n  }\r\n\r\n  setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n    const path = column.field;\r\n    const keys = path.split('.');\r\n    const lastKey = keys.pop();\r\n    const parent = keys.reduce((acc: { [x: string]: {}; }, key: string | number) => acc[key] ??= {}, obj);\r\n\r\n    if (parent && lastKey) {\r\n      if (typeof option === 'object' && option !== null) {\r\n        // case: dropdown object {id, value}\r\n        parent.id = option.id;\r\n        parent[lastKey] = option.value;\r\n      } else {\r\n        // case: plain string or number\r\n        parent[lastKey] = option;\r\n      }\r\n    }\r\n\r\n    const sendObj = {\r\n      data: { ...obj },\r\n      eventType: 'onCellEdit',\r\n    };\r\n\r\n    if (calledFromInput) {\r\n      this.checkRowEditAndEmitValue(obj, column, option);\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n\r\n  goToPage(page: any) {\r\n    if (this.paginationConfig?.page == page) return;\r\n    if (page < 1 || page > this.paginationConfig.totalPages) return;\r\n    this.paginationConfig.page = page;\r\n    const event = {\r\n      obj: {\r\n        limit: this.paginationConfig.limit,\r\n        page: page,\r\n      },\r\n      eventType: 'pageChange',\r\n    };\r\n    this.genericEvent.emit(event)\r\n  }\r\n\r\n  onPageSizeChange() {\r\n    this.paginationConfig.page = 1;\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\r\n        if (query) {\r\n          delete query.__typename;\r\n        }\r\n        return {\r\n          query,\r\n          ...rest,\r\n        }\r\n      }),\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n    setTimeout(() => {\r\n      const event = {\r\n        obj: {\r\n          limit: this.paginationConfig.limit,\r\n          page: this.paginationConfig.page,\r\n        },\r\n        eventType: 'pageChange',\r\n      };\r\n      this.genericEvent.emit(event)\r\n    }, 700);\r\n  }\r\n\r\n  actionPreset(data: any, type: any) {\r\n    data.columns = data.columns.map(({ _id, filterValue, search, column_dropdown_value, query, __typename, ...rest }: any) => rest);\r\n    this.tableView?.forEach((ele) => { ele.is_temp = false });\r\n\r\n    {\r\n      this.bodyTextFontsSize = data.config.bodyTextFontsSize,\r\n        this.fontFaimly = data.config.fontFaimly,\r\n        data.filters.forEach((element: any) => {\r\n          delete element.__typename;\r\n          if (element.query) {\r\n            delete element.query.__typename;\r\n            if (\r\n              typeof element.query === 'object' &&\r\n              element.query !== null &&\r\n              Object.keys(element.query).length === 0\r\n            ) {\r\n              element.query = null;\r\n            }\r\n          }\r\n        });\r\n      this.headerTextFontsSize = data.config.headerTextFontsSize,\r\n        this.selectedTableLayout = data.config.selectedTableLayout,\r\n        this.showVerticalBorder = data.config.showVerticalBorder,\r\n        this.currentIdForUpdatePreset = data.id;\r\n      this.filtersConfig = data.filters;\r\n    }\r\n    delete data?.__typename;\r\n    delete data?.is_temp;\r\n    delete data?.config.__typename;\r\n    const event = {\r\n      obj: {\r\n        data: data\r\n      },\r\n      eventType: type\r\n    }\r\n    this.genericEvent.emit(event)\r\n  }\r\n\r\n  currentIdForUpdatePreset = '';\r\n  curretaTablePresetForUpdate: any;\r\n  temp_state = {\r\n    id: '',\r\n    is_temp: false\r\n  }\r\n  async selectFilter(data: any) {\r\n    this.temp_state = {\r\n      id: data.id,\r\n      is_temp: true\r\n    }\r\n    this.tableView?.forEach((ele) => { ele.is_temp = false });\r\n    this.tableView = this.tableView.map(item => ({\r\n      ...item,\r\n      is_temp: item.id == data?.id\r\n    }));\r\n    this.columns = data.columns;\r\n    {\r\n      this.bodyTextFontsSize = data.config.bodyTextFontsSize,\r\n        this.fontFaimly = data.config.fontFaimly,\r\n        data.filters.forEach((element: any) => {\r\n          delete element.__typename;\r\n\r\n          if (element.query) {\r\n            delete element.query.__typename;\r\n            if (\r\n              typeof element.query === 'object' &&\r\n              element.query !== null &&\r\n              Object.keys(element.query).length === 0\r\n            ) {\r\n              element.query = null;\r\n            }\r\n          }\r\n        });\r\n\r\n      // this.globalSearch = data.config.bodyTextFontsSize,\r\n      this.headerTextFontsSize = data.config.headerTextFontsSize,\r\n        this.selectedTableLayout = data.config.selectedTableLayout,\r\n        this.showVerticalBorder = data.config.showVerticalBorder,\r\n        this.currentIdForUpdatePreset = data.id;\r\n      this.curretaTablePresetForUpdate = structuredClone(data);\r\n      this.presetName = data?.name;\r\n      this.presetFilter = data?.activeFilters || false;\r\n      this.filtersConfig = data.filters;\r\n      await this.applyFilteroptionList();\r\n      this.refreshHeaders();\r\n      this.cdr.detectChanges();\r\n      data.columns = this.cleanColumns(this.columns);\r\n      delete data?.__typename;\r\n      delete data?.is_temp;\r\n      delete data?.config.__typename;\r\n    }\r\n    if (data?.is_deafult) {\r\n      return this.actionPreset(data, 'setPreset')\r\n    }\r\n    const event = {\r\n      obj: {\r\n        data: data\r\n      },\r\n      eventType: 'select'\r\n    }\r\n    this.genericEvent.emit(event)\r\n  }\r\n\r\n  savePreset(control?: any) {\r\n    if (control?.invalid) {\r\n      control?.control.markAsTouched();\r\n      return;\r\n    }\r\n    let names = this.getFilterHeaders(this.filtersConfig, this.columns);\r\n    this.presetFilter = this.tableFilterViewId ? true : this.presetFilter;\r\n    let selectedData: any = this.tableView.find((ele) => ele.id == this.tableFilterViewId);\r\n    let config = {\r\n      fontFaimly: this.fontFaimly,\r\n      bodyTextFontsSize: +(this.bodyTextFontsSize || 14),\r\n      headerTextFontsSize: +(this.headerTextFontsSize || 14),\r\n      oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\r\n      showVerticalBorder: this.showVerticalBorder,\r\n      selectedTableLayout: this.selectedTableLayout,\r\n      globalSearch: this.tableSearch,\r\n      filterNames: names,\r\n      totalCount: this.paginationConfig.totalResults,\r\n      rowShadingEnabled: this.rowShadingEnabled\r\n\r\n    }\r\n    const event = {\r\n      obj: {\r\n        name: this.tableFilterViewId ? selectedData?.name : this.presetName,\r\n        activeFilters: this.presetFilter,\r\n        columns: this.cleanColumns(this.columns),\r\n        filters: this.presetFilter\r\n          ? this.filtersConfig?.map(({ __typename, query, ...rest }) => {\r\n            const { __typename: __inner, ...cleanQuery } = query || {};\r\n            return { ...rest, query: cleanQuery };\r\n          })\r\n          : [],\r\n        config: config,\r\n        id: this.tableFilterViewId || this.curretaTablePresetForUpdate?.id,\r\n        loadingCall: control == 'mouseUp' ? false : true,\r\n        type: this.tableType\r\n      },\r\n      eventType: this.tableFilterViewId || !this.isTablePresetNotChanged ? 'updatePreset' : 'createPreset'\r\n    }\r\n    this.genericEvent.emit(event)\r\n  }\r\n\r\n  getFilterHeaders(filters: any[], columns: any[]): string {\r\n    const matchedHeaders = filters\r\n      .map(f => {\r\n        const column = columns.find(c => c.field === f.field);\r\n        return column ? column.header : null;\r\n      })\r\n      .filter(header => !!header);\r\n\r\n    return matchedHeaders.join(', ');\r\n  }\r\n\r\n\r\n  toggleRowShading() {\r\n    this.oddRowsBackgroundColor = this.rowShadingEnabled ? '#f1f1f1' : undefined;\r\n    this.onFontChange();\r\n  }\r\n\r\n  trackByTable(index: number): number {\r\n    return index;\r\n  }\r\n  activeRow: any\r\n  activeRowCol: any;\r\n\r\n  // Track expanded cells as a Set of unique row+col identifiers\r\n\r\n  getCellKey(row: any, col: any): string {\r\n    return `${this.getRowId(row)}_${col?.field}`;\r\n  }\r\n\r\n  expandedCells = new Map<string, number>();\r\n  private zCounter = 21;\r\n\r\n  showDetailsBox = false;\r\n\r\n  toggleExpandOfLongCellText(\r\n    row: any,\r\n    col: any,\r\n    columns: any[],\r\n    expandWholeRow = false\r\n  ) {\r\n    const expandCells = (targetRow: any) => {\r\n      columns.forEach(c => {\r\n        if (c.type === 'image') return;\r\n        const text = targetRow[c.field];\r\n\r\n        if ((typeof text === 'string' && text.length > 50) || (Array.isArray(text) && text?.length > 1)) {\r\n          const key = this.getRowId(targetRow) + '-' + c.field;\r\n          this.zCounter++;\r\n          this.expandedCells.set(key, this.zCounter);\r\n        }\r\n      });\r\n    };\r\n\r\n\r\n    const collectKeysForRow = (targetRow: any) => {\r\n      const keys: string[] = [];\r\n      columns.forEach(c => {\r\n        if (c.type === 'image') return;\r\n\r\n        const text = targetRow[c.field];\r\n        if (typeof text === 'string' && text.length > 50 || (Array.isArray(text) && text?.length > 1)) {\r\n          keys.push(this.getRowId(targetRow) + '-' + c.field);\r\n        }\r\n      });\r\n      return keys;\r\n    };\r\n\r\n    if (expandWholeRow) {\r\n      let rowKeys: string[] = [];\r\n      const text = this.getNestedValue(row, col?.field);\r\n      if (Array.isArray(text) && text.length > 0) {\r\n        rowKeys = collectKeysForRow(row);\r\n        row?.children?.forEach((child: any) => {\r\n          rowKeys.push(...collectKeysForRow(child));\r\n        });\r\n      } else {\r\n        rowKeys = collectKeysForRow(row);\r\n      }\r\n      const allExpanded = rowKeys.every(k => this.expandedCells.has(k));\r\n      this.expandedCells.clear();\r\n      if (!allExpanded) {\r\n        if (Array.isArray(row.children) && row.children.length > 0) {\r\n          expandCells(row);\r\n          row?.children?.forEach((child: any) => expandCells(child));\r\n        } else {\r\n          expandCells(row);\r\n        }\r\n      }\r\n    } else {\r\n      const key = this.getRowId(row) + '-' + col.field;\r\n      if (col.type === 'image') return;\r\n\r\n      if (!this.expandedCells.has(key)) {\r\n        this.expandedCells.clear();\r\n        this.zCounter++;\r\n        this.expandedCells.set(key, this.zCounter);\r\n      } else {\r\n        this.expandedCells.delete(key);\r\n      }\r\n    }\r\n\r\n    this.showDetailsBox = false;\r\n    setTimeout(() => {\r\n      this.isOpenToTop(row)\r\n    }, 0);\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  isOpenToTop(row: any) {\r\n    const wrapper = document.querySelector('.data-grid-body-wrapper') as HTMLElement | null;\r\n    if (!wrapper) return false;\r\n    this.columns.forEach((col: any) => {\r\n      const id = (row.id || row._id) + '-' + (col.id || col._id);\r\n      const box = document.getElementById(id);\r\n      if (!box) return false;\r\n      const boxRect = box.getBoundingClientRect();\r\n      const wrapperRect = wrapper.getBoundingClientRect();\r\n      const isOverflowingBottom = boxRect.bottom > wrapperRect.bottom;\r\n      const isOverflowingTop = boxRect.top < wrapperRect.top;\r\n      if (isOverflowingBottom && !isOverflowingTop) {\r\n        const boxHeight = box.offsetHeight || 0;\r\n        const offset = boxHeight + 4;\r\n        box.style.top = `${-offset}px`;\r\n\r\n      } else {\r\n        box.style.bottom = `auto`;\r\n        box.style.top = `100%`;\r\n        box.style.transform = `translateY(0)`;\r\n      }\r\n      return false;\r\n    })\r\n    this.showDetailsBox = true;\r\n    this.cdr.detectChanges();\r\n    return true;\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n\r\n  isExpanded(row: any, col: any): boolean {\r\n    return this.expandedCells.has(this.getRowId(row) + '-' + col.field);\r\n  }\r\n\r\n  getZIndex(row: any, col: any): number {\r\n    return this.expandedCells.get(this.getRowId(row) + '-' + col.field) ?? 21;\r\n  }\r\n\r\n  isOverflowing(element: HTMLElement | null): boolean {\r\n    if (!element) return false;\r\n    return element.scrollWidth > element.clientWidth;\r\n  }\r\n\r\n\r\n  // Picture cell Logic\r\n  colorCombination = ['pic-comb1', 'pic-comb2', 'pic-comb4'];\r\n  getDynamicClass(name: string): string {\r\n    if (!name) return this.colorCombination[0];\r\n    const hash = Array.from(name).reduce((acc, char) => acc + char.charCodeAt(0), 0);\r\n    const index = hash % this.colorCombination?.length;\r\n    return this.colorCombination[index];\r\n  }\r\n\r\n  getInitials(name: string): string {\r\n    if (!name) return 'NA';\r\n    const parts = name.trim().split(' ');\r\n    return (parts[0][0] + (parts[1]?.[0] || '')).toUpperCase();\r\n  }\r\n\r\n\r\n  actionHide: boolean = true;\r\n  xPos = 0;\r\n  yPos = 0;\r\n  isVisible = false;\r\n  deatilsList: any;\r\n  openExpendIndex: any;\r\n  positionedYet = false;\r\n\r\n  onRightClick(event: MouseEvent | TouchEvent | any, deatilsList: any): boolean {\r\n    if (deatilsList?.actions?.length) {\r\n      this.actions = deatilsList.actions;\r\n    }\r\n    if (!(event instanceof MouseEvent)) {\r\n      event.preventDefault();\r\n    }\r\n    if (deatilsList.__virtualIndex == 0) return false;\r\n    event.preventDefault();\r\n    this.xPos = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX;\r\n    this.yPos = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY;\r\n    // this.xPos = event.clientX;\r\n    // this.yPos = event.clientY;\r\n    this.isVisible = true;\r\n    this.positionedYet = false;\r\n    this.deatilsList = deatilsList;\r\n    setTimeout(() => {\r\n      const menuElement = document.querySelector('.context-menu') as HTMLElement;\r\n      if (!menuElement) return;\r\n      const menuWidth = menuElement.offsetWidth;\r\n      const menuHeight = menuElement.offsetHeight;\r\n      const viewportWidth = window.innerWidth;\r\n      const viewportHeight = window.innerHeight;\r\n      let x = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX; //event.clientX;\r\n      let y = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY; //event.clientY;\r\n      if (x + menuWidth > viewportWidth) {\r\n        x = viewportWidth - menuWidth - 10;\r\n      }\r\n      if (y + menuHeight > viewportHeight) {\r\n        y = viewportHeight - menuHeight - 10;\r\n      }\r\n      this.xPos = x;\r\n      this.yPos = y;\r\n      this.isVisible = true;\r\n\r\n      setTimeout(() => {\r\n        this.positionedYet = true;\r\n        this.cdr.detectChanges();\r\n      });\r\n\r\n      this.cdr.detectChanges();\r\n    });\r\n    this.cdr.detectChanges()\r\n    return false;\r\n  }\r\n\r\n  onActionClick(action: string) {\r\n    const sendObj = {\r\n      obj: this.deatilsList,\r\n      eventType: action,\r\n    };\r\n    this.positionedYet = false;\r\n    this.cdr.detectChanges();\r\n    this.genericEvent.emit(sendObj);\r\n  }\r\n\r\n\r\n  onVerifyClick(type: string) {\r\n    const idsArray = Array.from(this.selectedRows);\r\n    const arrayOfObjectsWithTableType: any[] = [];\r\n    this.selectedRows.forEach(id => {\r\n      arrayOfObjectsWithTableType.push({\r\n        id: id,\r\n        listingType: this.listingType,\r\n      });\r\n    });\r\n    const sendObj = {\r\n      data: {\r\n        obj: idsArray,\r\n        tableName: this.tableName,\r\n        listingType: this.listingType,\r\n      },\r\n      eventType: type,\r\n    };\r\n    this.genericEvent.emit(sendObj)\r\n  }\r\n\r\n\r\n\r\n  getCellClasses(column: any, value: any): string {\r\n    if (!value || !column?.field) return '';\r\n\r\n    let val: any = typeof value === 'object' ? value?.value ?? value : value;\r\n    const field = column.field.toLowerCase();\r\n\r\n    if (field === 'due_date') {\r\n      const dueDate = new Date(val);\r\n      const today = new Date();\r\n      const todayUTC = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());\r\n      const dueUTC = Date.UTC(dueDate.getFullYear(), dueDate.getMonth(), dueDate.getDate());\r\n\r\n      if (dueUTC < todayUTC) {\r\n        return 'text-danger';\r\n      }\r\n      // else if(dueUTC === todayUTC){\r\n      //   return 'text-warning';\r\n      // }\r\n\r\n      return '';\r\n    }\r\n\r\n\r\n    const status = val?.toString().toLowerCase();\r\n    if (\r\n      (field === 'status' ||\r\n      field === 'account_status' ||\r\n      field === 'availstatus' ||\r\n      field === 'is_custom_grade') \r\n      && !column?.cellRenderer\r\n    ) {\r\n      return STATUSES_BADGE_MAP[status] || 'badge badge-secondary';\r\n    }\r\n\r\n    return '';\r\n  }\r\n\r\n\r\n  removeColumnFilterFromColumn(column: any) {\r\n    if (!column) return\r\n    if (column.type === 'dropdown') {\r\n      column.query._ids = [];\r\n    } else if (['string', 'number', 'date'].includes(column.type)) {\r\n      column.query = {\r\n        first_condition: 'contain',\r\n        first_value: null,\r\n        condition: 'none',\r\n        second_condition: null,\r\n        second_value: null,\r\n      }\r\n    }\r\n\r\n    const index = this.filtersConfig.findIndex((f: any) => f.field === column.field);\r\n    if (index !== -1) {\r\n      this.filtersConfig.splice(index, 1);\r\n    }\r\n\r\n    const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n    const cleanedFilteredColumns = filteredColumns.map(({ query, ...rest }) => {\r\n      if (query) {\r\n        delete query.__typename;\r\n      }\r\n      return {\r\n        query,\r\n        ...rest,\r\n      }\r\n    });\r\n\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: cleanedFilteredColumns,\r\n      no_of_records: Number(this.paginationConfig.limit),\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n    setTimeout(() => {\r\n      const filteredColumns = cleanedFilteredColumns;\r\n      this.filterOptions.emit(filteredColumns);\r\n    }, 200);\r\n  }\r\n\r\n  onSideMenuColumnsVisibilityChange() {\r\n    this.refreshHeaders();\r\n    const sendData = {\r\n      columns: this.cleanColumns(this.columns),\r\n      filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\r\n        if (query) {\r\n          delete query.__typename;\r\n        }\r\n        return {\r\n          query,\r\n          ...rest,\r\n        }\r\n      }),\r\n      no_of_records: this.paginationConfig.pageSize,\r\n      type: this.tableType,\r\n    };\r\n    this.createUpdateConfigListing.emit(sendData);\r\n  }\r\n\r\n  cleanFilterdColumns() {\r\n    const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n    const cleanedFilteredColumns = filteredColumns.map(({ query, ...rest }) => {\r\n      if (query) {\r\n        delete query.__typename;\r\n      }\r\n      return {\r\n        query,\r\n        ...rest,\r\n      }\r\n    });\r\n    return cleanedFilteredColumns;\r\n  }\r\n\r\n  downloadCsv(type: 'csv' | 'xlsx') {\r\n    const config: any = {\r\n      headerBgColor: this.headerBackgroundColor,\r\n      headerTextColor: this.headerTextColor,\r\n      bodyTextColor: '#000000',\r\n      fontFamily: this.fontFaimly,\r\n      fontWeight: 'normal',\r\n      zoomScale: 125,\r\n      headerRowHeight: 30\r\n    }\r\n    if (this.enableExport) {\r\n      const now = new Date();\r\n      const dd = String(now.getDate()).padStart(2, '0');\r\n      const mm = String(now.getMonth() + 1).padStart(2, '0');\r\n      const yyyy = now.getFullYear();\r\n      const HH = String(now.getHours()).padStart(2, '0');\r\n      const MM = String(now.getMinutes()).padStart(2, '0');\r\n      const formatted =\r\n        `${this.tableType}_${dd}-${mm}-${yyyy}_${HH}-${MM}`;\r\n\r\n      console.log(formatted);\r\n\r\n      this.exportService.exportData(this.columns, this.dataSet, formatted, type, this.rowSelectedIndexes, config);\r\n    }\r\n    const event = {\r\n      obj: {\r\n        columns: this.columns,\r\n        filters: []\r\n      },\r\n      eventType: 'downloadCsv'\r\n    }\r\n    if (type == 'xlsx') {\r\n      return\r\n    }\r\n    this.genericEvent.emit(event)\r\n\r\n  }\r\n\r\n  onFontChange() {\r\n    this.headerTextFontsSize = this.bodyTextFontsSize;\r\n    const config = {\r\n      fontFaimly: this.fontFaimly,\r\n      bodyTextFontsSize: this.bodyTextFontsSize,\r\n      headerTextFontsSize: this.headerTextFontsSize,\r\n      oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\r\n      showVerticalBorder: this.showVerticalBorder,\r\n      selectedTableLayout: this.selectedTableLayout,\r\n      globalSearch: this.tableSearch\r\n    }\r\n    const event = {\r\n      obj: {\r\n        data: config\r\n      },\r\n      eventType: 'config'\r\n    }\r\n    this.genericEvent.emit(event)\r\n  }\r\n\r\n  onGlobalSearch() {\r\n    const event = {\r\n      obj: {\r\n        tableSearch: this.tableSearch\r\n      },\r\n      eventType: 'search'\r\n    }\r\n    this.genericEvent.emit(event)\r\n    if (this.tableFilterViewId) {\r\n      this.savePreset('mouseUp');\r\n    }\r\n  }\r\n\r\n  onSearchInput(event: Event) {\r\n    const value = (event.target as HTMLInputElement).value;\r\n    // console.log('Search value:', value);\r\n\r\n    if (value === '') {\r\n      this.tableSearch = '';\r\n      this.onGlobalSearch();\r\n    }\r\n  }\r\n\r\n  checkFilterChangesEffect(): any {\r\n    if (!this.tableFilterViewId) return true\r\n    const findDefaultFilter = this.tableView?.find((ele: any) => ele?.id == this.tableFilterViewId);\r\n    const normalizeFilters = (filters: any[] | undefined): any[] => {\r\n      if (!Array.isArray(filters)) return [];\r\n      const cloned = filters.map(f => {\r\n        const item = JSON.parse(JSON.stringify(f ?? {}));\r\n        if (!Array.isArray(item._ids)) item._ids = [];\r\n        item._ids = item._ids.slice().sort((a: any, b: any) => {\r\n          if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n          return ('' + a).localeCompare('' + b);\r\n        });\r\n\r\n        if (item.query === null) {\r\n        } else if (typeof item.query === 'object') {\r\n          if (!Array.isArray(item.query._ids)) item.query._ids = [];\r\n          item.query._ids = item.query._ids.slice().sort((a: any, b: any) => {\r\n            if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n            return ('' + a).localeCompare('' + b);\r\n          });\r\n        }\r\n\r\n        return item;\r\n      });\r\n      cloned.sort((a: any, b: any) => {\r\n        const fa = (a.field || '') + '|' + (a.type || '');\r\n        const fb = (b.field || '') + '|' + (b.type || '');\r\n        return fa.localeCompare(fb);\r\n      });\r\n\r\n      return cloned;\r\n    };\r\n\r\n    const deepEqual = (a: any, b: any): boolean => {\r\n      if (a === b) return true;\r\n\r\n      if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n        return a === b;\r\n      }\r\n\r\n      if (Array.isArray(a) !== Array.isArray(b)) return false;\r\n\r\n      if (Array.isArray(a)) {\r\n        if (a.length !== b.length) return false;\r\n        for (let i = 0; i < a.length; i++) {\r\n          if (!deepEqual(a[i], b[i])) return false;\r\n        }\r\n        return true;\r\n      }\r\n\r\n      const keysA = Object.keys(a);\r\n      const keysB = Object.keys(b);\r\n      if (keysA.length !== keysB.length) return false;\r\n\r\n      for (const key of keysA) {\r\n        if (!keysB.includes(key)) return false;\r\n        if (!deepEqual(a[key], b[key])) return false;\r\n      }\r\n      return true;\r\n    };\r\n    const normalizedA = normalizeFilters(findDefaultFilter?.filters);\r\n    const normalizedB = normalizeFilters(this.filtersConfig);\r\n    const isSame = deepEqual(normalizedA, normalizedB);\r\n    return isSame;\r\n  }\r\n\r\n\r\n\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // Cell Selection Implemented Here Implemented Here\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n\r\n  selectedCells: any[] = [];\r\n  selectedKeys: Set<string> = new Set();\r\n  selectionStart: any = null;\r\n  isSelecting = false;\r\n  startSelection(\r\n    rowIndex: number,\r\n    colIndex: number,\r\n    subColIndex: number | null,\r\n    field: string,\r\n    event: MouseEvent,\r\n    section: string\r\n  ) {\r\n    // event.preventDefault();\r\n    this.rowSelectedIndexes.clear();\r\n    const safeSub = subColIndex ?? 0;\r\n    const key = `${rowIndex}-${colIndex}-${safeSub}-${field}`;\r\n\r\n    this.selectionStart = { rowIndex, colIndex, subColIndex: safeSub, field, key };\r\n    this.isSelecting = true;\r\n    this.selectedKeys.clear();\r\n    this.selectedKeys.add(key);\r\n    this.selectedCells = [this.selectionStart];\r\n    const mouseUpHandler = () => {\r\n      this.endSelection();\r\n      document.removeEventListener('mouseup', mouseUpHandler);\r\n    };\r\n    document.addEventListener('mouseup', mouseUpHandler);\r\n    this.updateSelectionBoundaries()\r\n  }\r\n\r\n\r\n  extendSelection(\r\n    rowIndex: number,\r\n    colIndex: number,\r\n    subColIndex: number | null,\r\n    field: string,\r\n    event: MouseEvent,\r\n    section: string\r\n  ) {\r\n    if (!this.isSelecting || !this.selectionStart) return;\r\n\r\n    const start = this.selectionStart;\r\n    const targetSubColIndex = subColIndex ?? 0;\r\n    const newKeys: Set<string> = new Set();\r\n    const newCells: any[] = [];\r\n    const minRow = Math.min(start.rowIndex, rowIndex);\r\n    const maxRow = Math.max(start.rowIndex, rowIndex);\r\n    const columnsToSelect = this.getColumnSelectionRange(start.colIndex, colIndex, start.subColIndex, targetSubColIndex);\r\n\r\n    for (let r = minRow; r <= maxRow; r++) {\r\n      for (const colInfo of columnsToSelect) {\r\n        const k = `${r}-${colInfo.colIndex}-${colInfo.subColIndex}-${section}`;\r\n        newKeys.add(k);\r\n        newCells.push({\r\n          rowIndex: r,\r\n          colIndex: colInfo.colIndex,\r\n          subColIndex: colInfo.subColIndex,\r\n          field,\r\n          key: k\r\n        });\r\n      }\r\n    }\r\n\r\n    this.selectedKeys = newKeys;\r\n    this.selectedCells = newCells;\r\n    this.updateSelectionBoundaries();\r\n    this.cdr.detectChanges();\r\n\r\n    // Add auto-scrolling logic\r\n    this.handleCellAutoScroll(event);\r\n  }\r\n\r\n\r\n\r\n\r\n  getColumnSelectionRange(\r\n    startCol: number,\r\n    endCol: number,\r\n    startSub: number,\r\n    endSub: number\r\n  ): { colIndex: number; subColIndex: number }[] {\r\n    const result: { colIndex: number; subColIndex: number }[] = [];\r\n    const minCol = Math.min(startCol, endCol);\r\n    const maxCol = Math.max(startCol, endCol);\r\n\r\n    const isLeftToRight = startCol <= endCol;\r\n    for (let c = minCol; c <= maxCol; c++) {\r\n      const subColCount = this.getSubColumnCount(c);\r\n\r\n      if (c === startCol && c === endCol) {\r\n        const minSub = Math.min(startSub, endSub);\r\n        const maxSub = Math.max(startSub, endSub);\r\n        for (let s = minSub; s <= maxSub && s < subColCount; s++) {\r\n          result.push({ colIndex: c, subColIndex: s });\r\n        }\r\n      }\r\n      else if (c === startCol) {\r\n        if (isLeftToRight) {\r\n          for (let s = startSub; s < subColCount; s++) {\r\n            result.push({ colIndex: c, subColIndex: s });\r\n          }\r\n        } else {\r\n          for (let s = 0; s <= startSub && s < subColCount; s++) {\r\n            result.push({ colIndex: c, subColIndex: s });\r\n          }\r\n        }\r\n      }\r\n      else if (c === endCol) {\r\n        if (isLeftToRight) {\r\n          for (let s = 0; s <= endSub && s < subColCount; s++) {\r\n            result.push({ colIndex: c, subColIndex: s });\r\n          }\r\n        } else {\r\n          for (let s = endSub; s < subColCount; s++) {\r\n            result.push({ colIndex: c, subColIndex: s });\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        for (let s = 0; s < subColCount; s++) {\r\n          result.push({ colIndex: c, subColIndex: s });\r\n        }\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  getSubColumnCount(colIndex: number): number {\r\n    if (!this.columns || colIndex < 0 || colIndex >= this.columns.length) {\r\n      return 1;\r\n    }\r\n    const column = this.columns[colIndex];\r\n    if (column.children && Array.isArray(column.children)) {\r\n      return column.children.length;\r\n    }\r\n    return 1;\r\n  }\r\n  isGroupColumn(colIndex: number): boolean {\r\n    return this.getSubColumnCount(colIndex) > 1;\r\n  }\r\n  endSelection() {\r\n    this.isSelecting = false;\r\n    this.stopAutoScroll();\r\n    this.updateSelectionBoundaries();\r\n  }\r\n  isSelected(\r\n    rowIndex: number,\r\n    colIndex: number,\r\n    subColIndex: number | null,\r\n    field: string,\r\n    section: string\r\n  ) {\r\n    const safeSub = subColIndex ?? 0;\r\n    const key = `${rowIndex}-${colIndex}-${safeSub}-${section}`;\r\n    return this.selectedKeys.has(key);\r\n  }\r\n\r\n\r\n  private selectionBounds: {\r\n    top: number | null;\r\n    bottom: number | null;\r\n    left: { colIndex: number; subColIndex: number } | null;\r\n    right: { colIndex: number; subColIndex: number } | null;\r\n  } = { top: null, bottom: null, left: null, right: null };\r\n\r\n  updateSelectionBoundaries() {\r\n    if (this.selectedCells.length === 0) {\r\n      this.selectionBounds = { top: null, bottom: null, left: null, right: null };\r\n      return;\r\n    }\r\n\r\n    // Get all unique row indices and find min/max\r\n    const rowIndices = [...new Set(this.selectedCells.map(cell => cell.rowIndex))];\r\n    this.selectionBounds.top = Math.min(...rowIndices);\r\n    this.selectionBounds.bottom = Math.max(...rowIndices);\r\n\r\n    // For left/right boundaries, we need to consider both colIndex and subColIndex\r\n    const leftMost = this.findLeftMostCell();\r\n    const rightMost = this.findRightMostCell();\r\n\r\n    this.selectionBounds.left = leftMost;\r\n    this.selectionBounds.right = rightMost;\r\n  }\r\n  findLeftMostCell(): { colIndex: number; subColIndex: number } | null {\r\n    if (this.selectedCells.length === 0) return null;\r\n\r\n    const minColIndex = Math.min(...this.selectedCells.map(cell => cell.colIndex));\r\n    const leftColCells = this.selectedCells.filter(cell => cell.colIndex === minColIndex);\r\n    const minSubColIndex = Math.min(...leftColCells.map(cell => cell.subColIndex));\r\n\r\n    return { colIndex: minColIndex, subColIndex: minSubColIndex };\r\n  }\r\n  findRightMostCell(): { colIndex: number; subColIndex: number } | null {\r\n    if (this.selectedCells.length === 0) return null;\r\n\r\n    const maxColIndex = Math.max(...this.selectedCells.map(cell => cell.colIndex));\r\n    const rightColCells = this.selectedCells.filter(cell => cell.colIndex === maxColIndex);\r\n    const maxSubColIndex = Math.max(...rightColCells.map(cell => cell.subColIndex));\r\n\r\n    return { colIndex: maxColIndex, subColIndex: maxSubColIndex };\r\n  }\r\n  isTopBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    const safeSub = subColIndex ?? 0;\r\n    const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n    return isSelected && this.selectionBounds.top !== null && rowIndex === this.selectionBounds.top;\r\n  }\r\n  isBottomBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    const safeSub = subColIndex ?? 0;\r\n    const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n    return isSelected && this.selectionBounds.bottom !== null && rowIndex === this.selectionBounds.bottom;\r\n  }\r\n  isLeftBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    const safeSub = subColIndex ?? 0;\r\n    const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n    return isSelected && this.selectionBounds.left !== null &&\r\n      colIndex === this.selectionBounds.left.colIndex &&\r\n      safeSub === this.selectionBounds.left.subColIndex;\r\n  }\r\n\r\n  isRightBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    const safeSub = subColIndex ?? 0;\r\n    const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\r\n    return isSelected && this.selectionBounds.right !== null &&\r\n      colIndex === this.selectionBounds.right.colIndex &&\r\n      safeSub === this.selectionBounds.right.subColIndex;\r\n  }\r\n\r\n  isTopLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\r\n  }\r\n\r\n  isTopRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\r\n  }\r\n\r\n  isBottomLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\r\n  }\r\n\r\n  isBottomRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\r\n    return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\r\n  }\r\n\r\n\r\n  cellSelectionAutoScrollInterval: any = null;\r\n  private scrollSpeed = 150;\r\n  private scrollMargin = 30;\r\n  handleCellAutoScroll(event: MouseEvent) {\r\n    if (this.cellSelectionAutoScrollInterval) {\r\n      clearInterval(this.cellSelectionAutoScrollInterval);\r\n      this.cellSelectionAutoScrollInterval = null;\r\n    }\r\n    const horizontalContainer = this.centerScrollableBody.nativeElement;\r\n    const verticalContainer = this.mainScroll.nativeElement;\r\n    if (!horizontalContainer || !verticalContainer) return;\r\n    const horizontalRect = horizontalContainer.getBoundingClientRect();\r\n    const mouseX = event.clientX;\r\n    const verticalRect = verticalContainer.getBoundingClientRect();\r\n    const mouseY = event.clientY;\r\n    const nearTop = mouseY - verticalRect.top < this.scrollMargin;\r\n    const nearBottom = verticalRect.bottom - mouseY < this.scrollMargin;\r\n    const nearLeft = mouseX - horizontalRect.left < this.scrollMargin;\r\n    const nearRight = horizontalRect.right - mouseX < this.scrollMargin;\r\n    let scrollX = 0;\r\n    let scrollY = 0;\r\n    if (nearTop) scrollY = -this.scrollSpeed;\r\n    if (nearBottom) scrollY = this.scrollSpeed;\r\n    if (nearLeft) scrollX = -this.scrollSpeed;\r\n    if (nearRight) scrollX = this.scrollSpeed;\r\n    if (scrollX !== 0 || scrollY !== 0) {\r\n      this.cellSelectionAutoScrollInterval = setInterval(() => {\r\n        if (scrollX !== 0) {\r\n          horizontalContainer.scrollBy(scrollX, 0);\r\n        }\r\n        if (scrollY !== 0) {\r\n          verticalContainer.scrollBy(0, scrollY);\r\n        }\r\n      }, 8);\r\n    }\r\n  }\r\n\r\n  stopAutoScroll() {\r\n    if (this.cellSelectionAutoScrollInterval) {\r\n      clearInterval(this.cellSelectionAutoScrollInterval);\r\n      this.cellSelectionAutoScrollInterval = null;\r\n    }\r\n  }\r\n\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // Row Selection from the Indexing Implemented Here\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n  // *************************************************************************\r\n\r\n  rowSelectedIndexes: Set<number> = new Set();\r\n  rowSelecting = false;\r\n  rowSelectionStartIndex: number | null = null;\r\n  autoScrollInterval: any = null;\r\n\r\n  get firstSelectedRow(): number | null {\r\n    if (this.rowSelectedIndexes.size === 0) return null;\r\n    return Math.min(...this.rowSelectedIndexes);\r\n  }\r\n\r\n  get lastSelectedRow(): number | null {\r\n    if (this.rowSelectedIndexes.size === 0) return null;\r\n    return Math.max(...this.rowSelectedIndexes);\r\n  }\r\n\r\n\r\n  onRowMouseDown(index: number, event: MouseEvent) {\r\n    event.preventDefault();\r\n    this.rowSelecting = true;\r\n    this.selectedKeys.clear();\r\n    this.rowSelectionStartIndex = index;\r\n    this.rowSelectedIndexes.clear();\r\n    this.rowSelectedIndexes.add(index);\r\n    this.activeCell = '';\r\n    this.cdr.detectChanges();\r\n\r\n    const mouseMoveHandler = (e: MouseEvent) => this.handleAutoScroll(e);\r\n    const mouseUpHandler = () => {\r\n      this.onRowMouseUp();\r\n      document.removeEventListener('mouseup', mouseUpHandler);\r\n      document.removeEventListener('mousemove', mouseMoveHandler);\r\n      if (this.autoScrollInterval) {\r\n        cancelAnimationFrame(this.autoScrollInterval);\r\n        this.autoScrollInterval = null;\r\n      }\r\n    };\r\n\r\n    document.addEventListener('mouseup', mouseUpHandler);\r\n    document.addEventListener('mousemove', mouseMoveHandler);\r\n  }\r\n\r\n  onRowMouseOver(index: number, event: MouseEvent) {\r\n    if (!this.rowSelecting || this.rowSelectionStartIndex === null) return;\r\n    this.rowSelectedIndexes.clear();\r\n    const start = Math.min(this.rowSelectionStartIndex, index);\r\n    const end = Math.max(this.rowSelectionStartIndex, index);\r\n    for (let i = start; i <= end; i++) {\r\n      this.rowSelectedIndexes.add(i);\r\n    }\r\n    // console.log([...this.rowSelectedIndexes]);\r\n  }\r\n\r\n  onRowMouseUp() {\r\n    this.rowSelecting = false;\r\n    this.rowSelectionStartIndex = null;\r\n  }\r\n  handleAutoScroll(e: MouseEvent) {\r\n    const container = this.mainScroll?.nativeElement as HTMLElement;\r\n    if (!container) return;\r\n\r\n    const rect = container.getBoundingClientRect();\r\n    const edgeSize = 40\r\n    let scrollAmount = 0;\r\n\r\n    if (e.clientY < rect.top + edgeSize) {\r\n      scrollAmount = -150;\r\n    } else if (e.clientY > rect.bottom - edgeSize) {\r\n      scrollAmount = 150;\r\n    }\r\n\r\n    if (scrollAmount !== 0) {\r\n      if (!this.autoScrollInterval) {\r\n        const step = () => {\r\n          container.scrollTop += scrollAmount;\r\n          this.autoScrollInterval = requestAnimationFrame(step);\r\n        };\r\n        this.autoScrollInterval = requestAnimationFrame(step);\r\n      }\r\n    } else {\r\n      if (this.autoScrollInterval) {\r\n        cancelAnimationFrame(this.autoScrollInterval);\r\n        this.autoScrollInterval = null;\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  // getSelectedDataForCopy(): any[][] {\r\n  //   const copiedRows: any[][] = [];\r\n  //   const findRowByVirtualIndex = (vIndex: number) =>\r\n  //     this.dataSet.find((r: any) => r.__virtualIndex === vIndex);\r\n  //   if (this.rowSelectedIndexes && this.rowSelectedIndexes.size > 0) {\r\n  //     const sortedIndexes = [...this.rowSelectedIndexes].sort((a, b) => a - b);\r\n  //     for (const vIndex of sortedIndexes) {\r\n  //       const row = findRowByVirtualIndex(vIndex);\r\n  //       if (!row) continue;\r\n  //       const rowValues = this.columns.flatMap(col =>\r\n  //         col.children && Array.isArray(col.children)\r\n  //           ? col.children.map((c: { field: string }) =>\r\n  //               this.getNestedValue(row, c.field) ?? ''\r\n  //             )\r\n  //           : this.getNestedValue(row, col.field) ?? ''\r\n  //       );\r\n  //       copiedRows.push(rowValues);\r\n  //     }\r\n  //   }\r\n\r\n  //   if (this.selectedCells && this.selectedCells.length > 0) {\r\n  //     const rowsMap = new Map<number, any[]>();\r\n  //     for (const cell of this.selectedCells) {\r\n  //       const row = findRowByVirtualIndex(cell.rowIndex);\r\n  //       if (!row) continue;\r\n\r\n  //       const col = this.columns[cell.colIndex];\r\n  //       let fieldName = col?.field;\r\n  //       if (col?.children && col.children[cell.subColIndex]) {\r\n  //         fieldName = col.children[cell.subColIndex].field;\r\n  //       }\r\n  //       const value = this.getNestedValue(row, fieldName) ?? '';\r\n\r\n  //       if (!rowsMap.has(cell.rowIndex)) rowsMap.set(cell.rowIndex, []);\r\n  //       rowsMap.get(cell.rowIndex)!.push(value);\r\n  //     }\r\n\r\n  //     const sortedCells = [...rowsMap.entries()]\r\n  //       .sort(([a], [b]) => a - b)\r\n  //       .map(([_, v]) => v);\r\n\r\n  //     copiedRows.push(...sortedCells);\r\n  //   }\r\n\r\n  //   if (copiedRows.length === 0) {\r\n  //     const activeCell = document.querySelector('.active-cell');\r\n  //     if (activeCell) return [[activeCell.textContent?.trim() || '']];\r\n  //   }\r\n  //   const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);\r\n  //   const normalized = copiedRows.map(row => {\r\n  //     const newRow = [...row];\r\n  //     while (newRow.length < maxCols) newRow.push(''); \r\n  //     return newRow;\r\n  //   });\r\n  //   return normalized;\r\n  // }\r\n\r\n\r\n  undoStack: any[][] = [];\r\n  redoStack: any[][] = [];\r\n\r\n  private cloneData(data: any[]): any[] {\r\n    return JSON.parse(JSON.stringify(data));\r\n  }\r\n\r\n  performCut(selectedData: any[][]) {\r\n    // Save current state for undo\r\n    this.undoStack.push(this.cloneData(this.visibleRows));\r\n    this.redoStack = []; // Clear redo stack on new action\r\n\r\n    // Perform cut\r\n    this.copyService.cutWithAnimation(selectedData);\r\n    const { updatedRows } = this.copyService.cutSelectedSelectedData(\r\n      this.visibleRows,\r\n      this.rowSelectedIndexes,\r\n      this.selectedCells,\r\n      this.columns,\r\n      this.setNestedValue.bind(this)\r\n    );\r\n\r\n    // console.log('Updated Rows: ', updatedRows);\r\n  }\r\n\r\n\r\n\r\n  getSelectedDataForCopy(): any[][] {\r\n    return this.copyService.getSelectedDataForCopy(\r\n      this.dataSet,\r\n      this.columns,\r\n      this.rowSelectedIndexes,\r\n      this.selectedCells,\r\n      this.getNestedValue.bind(this)\r\n    );\r\n  }\r\n\r\n  @HostListener('document:keydown', ['$event'])\r\n  onKeyDown(event: KeyboardEvent) {\r\n    const target = event.target as HTMLElement;\r\n    const isFormField =\r\n      target.tagName === 'INPUT' ||\r\n      target.tagName === 'TEXTAREA' ||\r\n      target.isContentEditable;\r\n    if (isFormField) return;\r\n\r\n    const tableContainer = document.querySelector('.data-grid-body-wrapper');\r\n    if (tableContainer && !tableContainer.contains(target)) return;\r\n    if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n      if (!this.selectedCells?.length && !this.rowSelectedIndexes.size) return\r\n      const selectedData = this.getSelectedDataForCopy();\r\n      // event.preventDefault();\r\n      this.copyService.copyToClipboard(selectedData);\r\n\r\n    } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n      if (!this.selectedCells?.length || !this.enableCut) return\r\n      const selectedData = this.getSelectedDataForCopy();\r\n      // event.preventDefault();\r\n      this.performCut(selectedData);\r\n\r\n    } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n      if (!this.selectedCells?.length) return\r\n      // event.preventDefault();\r\n      this.undo();\r\n\r\n    } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n      if (!this.selectedCells?.length) return\r\n      // event.preventDefault();\r\n      this.redo();\r\n    } else if ((event.ctrlKey || event.metaKey) && event.key === 'a') {\r\n      // ✅ Select all cells\r\n      event.preventDefault();\r\n      this.selectAllCells();\r\n    }\r\n  }\r\n\r\n\r\n  selectAllCells() {\r\n    this.selectedCells = [];\r\n    this.selectedKeys.clear();\r\n    this.rowSelectedIndexes.clear();\r\n\r\n    // Set selection start like single selection (first cell)\r\n    if (this.dataSet.length && this.columns.length) {\r\n      const firstField = this.columns[0].field || this.columns[0].name;\r\n      this.selectionStart = {\r\n        rowIndex: 0,\r\n        colIndex: 0,\r\n        subColIndex: 0,\r\n        field: firstField,\r\n        key: `0-0-0-${firstField}`,\r\n      };\r\n    }\r\n\r\n    this.isSelecting = true;\r\n\r\n    for (let rowIndex = 0; rowIndex <= this.dataSet?.length; rowIndex++) {\r\n      if (!rowIndex) continue;\r\n      const row = this.dataSet[rowIndex];\r\n      this.rowSelectedIndexes.add(rowIndex);\r\n\r\n      // for (let colIndex = 0; colIndex < this.columns.length; colIndex++) {\r\n      //   const col = this.columns[colIndex];\r\n      //   const field = col.field || col.name;\r\n      //   if(!col.is_visible) continue;\r\n\r\n      //   if (col.children?.length) {\r\n      //     col.children.forEach((sub: any, subColIndex: number) => {\r\n      //       const key = `${rowIndex}-${colIndex}-${subColIndex}-${field}`;\r\n      //       this.selectedKeys.add(key);\r\n      //       this.selectedCells.push({\r\n      //         rowIndex,\r\n      //         colIndex,\r\n      //         subColIndex,\r\n      //         field,\r\n      //         key,\r\n      //       });\r\n      //     });\r\n      //   } else {\r\n      //     const key = `${rowIndex}-${colIndex}-0-${field}`;\r\n      //     this.selectedKeys.add(key);\r\n      //     this.selectedCells.push({\r\n      //       rowIndex,\r\n      //       colIndex,\r\n      //       subColIndex: 0,\r\n      //       field,\r\n      //       key,\r\n      //     });\r\n      //   }\r\n      // }\r\n    }\r\n\r\n    // Update highlighting and UI\r\n    this.updateSelectionBoundaries();\r\n\r\n    // Stop \"selecting\" mode since it's a one-time select-all\r\n    this.isSelecting = false;\r\n  }\r\n\r\n\r\n\r\n  undo() {\r\n    if (this.undoStack.length > 0) {\r\n      const prevState = this.undoStack.pop()!;\r\n      this.redoStack.push(this.cloneData(this.visibleRows));\r\n      this.visibleRows = this.cloneData(prevState);\r\n    }\r\n  }\r\n\r\n  redo() {\r\n    if (this.redoStack.length > 0) {\r\n      const nextState = this.redoStack.pop()!;\r\n      this.undoStack.push(this.cloneData(this.visibleRows));\r\n      this.visibleRows = this.cloneData(nextState);\r\n    }\r\n  }\r\n\r\n\r\n\r\n  @HostListener('document:paste', ['$event'])\r\n  async onPaste(event: ClipboardEvent) {\r\n    const target = event.target as HTMLElement;\r\n    const tag = target?.tagName?.toLowerCase();\r\n    if (tag === 'input' || tag === 'textarea' || target?.getAttribute('contenteditable') === 'true') {\r\n      return;\r\n    }\r\n\r\n    if (!this.selectedCells?.length || !this.activeCell) return;\r\n\r\n    const text = event.clipboardData?.getData('text');\r\n    if (!text) return;\r\n    const userConfirmed = await this.showConfirmationModal(\r\n      'Are you sure you want to paste the copied data?'\r\n    );\r\n\r\n    if (!userConfirmed) {\r\n      event.preventDefault();\r\n      return;\r\n    }\r\n\r\n    const startCell = this.selectedCells?.[0];\r\n    if (!startCell) return;\r\n\r\n    const updatedRows = await this.copyService.pasteFromClipboardText(\r\n      text,\r\n      this.visibleRows,\r\n      this.columns,\r\n      startCell.rowIndex,\r\n      startCell.colIndex,\r\n      startCell.subColIndex\r\n    );\r\n\r\n    if (updatedRows?.updateRows?.length) {\r\n      this.genericEvent.emit({\r\n        data: updatedRows?.updateRows,\r\n        eventType: 'onCellEdit',\r\n        column: updatedRows?.currentColums\r\n      });\r\n    }\r\n\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  showConfirmationModal(message: string): Promise<boolean> {\r\n    return new Promise(resolve => {\r\n      const overlay = document.createElement('div');\r\n      overlay.classList.add('custom-overlay-wrapper');\r\n      overlay.innerHTML = `\r\n      <div class=\"custom-overlay\">\r\n        <div class=\"custom-modal\">\r\n          <div class=\"custom-modal-body\">\r\n            <p class=\"modal-message\">${message}</p>\r\n            <div class=\"modal-actions\">\r\n              <button class=\"btn-confirm\">Confirm</button>\r\n              <button class=\"btn-cancel\">Cancel</button>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    `;\r\n\r\n      document.body.appendChild(overlay);\r\n      const confirmBtn = overlay.querySelector('.btn-confirm') as HTMLElement;\r\n      const cancelBtn = overlay.querySelector('.btn-cancel') as HTMLElement;\r\n      const cleanup = () => {\r\n        document.body.removeChild(overlay);\r\n      };\r\n      confirmBtn.addEventListener('click', () => {\r\n        cleanup();\r\n        resolve(true);\r\n      });\r\n\r\n      cancelBtn.addEventListener('click', () => {\r\n        cleanup();\r\n        resolve(false);\r\n      });\r\n    });\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  isDate(value: any): boolean {\r\n    return !isNaN(new Date(value)?.getTime());\r\n  }\r\n\r\n\r\n  // Hold expanded IDs (array for multiple, single value for single)\r\n  expandededDetailRows: (string | number)[] | string | number = '';\r\n\r\n  toggleDetailRowExpand(row: any) {\r\n    const id = row?.id || row?._id;\r\n    if (this.gridType === 'Assets' && row?.detail?.columns) {\r\n      row.detail.columns.forEach((item: any) => {\r\n        item.width = item?.width || (this.dataGridContainer.nativeElement.offsetWidth / row.detail.columns?.length)\r\n      });\r\n      this.previewNestedCols = this.deepCloneColumns(row.detail.columns);\r\n    }\r\n    if (this.keepMultipleExpandedDetails) {\r\n      if (!Array.isArray(this.expandededDetailRows)) {\r\n        this.expandededDetailRows = [];\r\n      }\r\n      const expanded = this.expandededDetailRows as (string | number)[];\r\n      const index = expanded.indexOf(id);\r\n\r\n      if (index > -1) {\r\n        expanded.splice(index, 1);\r\n      } else {\r\n        expanded.push(id);\r\n      }\r\n    } else {\r\n      if (this.expandededDetailRows === id) {\r\n        this.expandededDetailRows = '';\r\n      } else {\r\n        this.expandededDetailRows = id;\r\n      }\r\n    }\r\n\r\n    setTimeout(() => {\r\n      void this.rightPinnedHeader?.nativeElement.offsetWidth;\r\n      this.centerPinnedBody?.nativeElement.offsetWidth;\r\n      this.rightPinnedBody?.nativeElement.offsetWidth;\r\n      this.cdr.detectChanges();\r\n    }, 300)\r\n  }\r\n\r\n  isDetailsExpanded(row: any): boolean {\r\n    const id = row?.id || row?._id;\r\n\r\n    if (this.keepMultipleExpandedDetails) {\r\n      return Array.isArray(this.expandededDetailRows) &&\r\n        this.expandededDetailRows.includes(id);\r\n    } else {\r\n      return this.expandededDetailRows === id;\r\n    }\r\n  }\r\n\r\n  getFilterValue(option: any): any {\r\n    return option?.value ?? option;\r\n  }\r\n\r\n\r\n  openIndex: number | null = null;\r\n  toggleMenu(i: number, event?: MouseEvent) {\r\n    if (event) { event.stopPropagation(); }\r\n    this.openIndex = this.openIndex === i ? null : i;\r\n  }\r\n\r\n  @ViewChild('nestedTable')\r\n  nestedTable!: ElementRef<HTMLDivElement>;\r\n  get hasVerticalScroll(): boolean {\r\n    if (!this.nestedTable) return false;\r\n    return this.nestedTable.nativeElement.scrollHeight > this.nestedTable.nativeElement.clientHeight;\r\n  }\r\n\r\n  get hasHorizontalScroll(): boolean {\r\n    if (!this.nestedTable) return false;\r\n    const el = this.nestedTable.nativeElement;\r\n    return el.scrollWidth > el.clientWidth;\r\n  }\r\n\r\n\r\n  getTotalAmount(column: any) {\r\n    if (!column?.is_amount) return;\r\n    const total = this.originalDataSet.reduce((sum, row) => {\r\n      const value = row[column.field] || 0;\r\n      return sum + value;\r\n    }, 0);\r\n\r\n    return `${this.currencySymbol}${total}`;\r\n  }\r\n\r\n  dropColumn(event: CdkDragDrop<any[]>, row: any) {\r\n    // Reorder the columns array\r\n    moveItemInArray(row.detail.columns, event.previousIndex, event.currentIndex);\r\n  }\r\n\r\n  currentSubSortColumn: string | null = null; // active column\r\n  currentSortDirection: 'asc' | 'desc' = 'asc'; // active direction\r\n\r\n  sortNestedCol(col: any, row: any) {\r\n    const dataSet = row?.detail?.result;\r\n    if (this.currentSubSortColumn === col.field) {\r\n      this.currentSortDirection = this.currentSortDirection === 'asc' ? 'desc' : 'asc';\r\n    } else {\r\n      this.currentSubSortColumn = col.field;\r\n      this.currentSortDirection = 'asc';\r\n    }\r\n    col.order_by = this.currentSortDirection;\r\n\r\n    // Sort copy instead of mutating\r\n    const sorted = [...dataSet].sort((a, b) => {\r\n      let aVal = a[col.field];\r\n      let bVal = b[col.field];\r\n      aVal = aVal == null ? '' : aVal;\r\n      bVal = bVal == null ? '' : bVal;\r\n\r\n      if (col.type === 'date') {\r\n        aVal = new Date(aVal).getTime();\r\n        bVal = new Date(bVal).getTime();\r\n      }\r\n\r\n      const aNum = parseFloat(aVal);\r\n      const bNum = parseFloat(bVal);\r\n      const bothNumbers = !isNaN(aNum) && !isNaN(bNum);\r\n\r\n      if (bothNumbers) {\r\n        return this.currentSortDirection === 'asc' ? aNum - bNum : bNum - aNum;\r\n      } else {\r\n        const comp = String(aVal).localeCompare(String(bVal));\r\n        return this.currentSortDirection === 'asc' ? comp : -comp;\r\n      }\r\n    });\r\n\r\n    row.detail.result = sorted;\r\n\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n\r\n  getColumnWidthPx(row: any, col: any): string {\r\n    if (col.width) return col.width + 'px';\r\n    const pixels = this.centerScrollableBody?.nativeElement?.offsetWidth / row.detail?.columns.length;\r\n    return pixels + 'px';\r\n  }\r\n\r\n  fullscreenImage: string | null = null;\r\n\r\n\r\n  // Assests Nested Table Work Implemented Here\r\n\r\n  pinUnpinColum(col: any, value: 'left' | 'right' | null, columns: any[]) {\r\n    col.pinned = value;\r\n    const left = columns.filter(c => c.pinned === 'left');\r\n    const middle = columns.filter(c => !c.pinned || c.pinned === null);\r\n    const right = columns.filter(c => c.pinned === 'right');\r\n    columns.length = 0;\r\n    columns.push(...left, ...middle, ...right);\r\n    this.activeCol = null;\r\n  }\r\n\r\n  getLeftPinnedCount(columns: any[]): number {\r\n    return columns.filter(c => c.pinned === 'left').length;\r\n  }\r\n\r\n  getRightPinnedCount(columns: any[]): number {\r\n    return columns.filter(c => c.pinned === 'right').length;\r\n  }\r\n\r\n  getStickyLeft(columns: any[], index: number): string {\r\n    let left = 0;\r\n    for (let i = 0; i < index; i++) {\r\n      const prevCol = columns[i];\r\n      if (prevCol.pinned === 'left') {\r\n        left += prevCol.width || 100;\r\n      }\r\n    }\r\n    return `${left}px`;\r\n  }\r\n\r\n  previewNestedCols: any[] = [];\r\n  onNestedColSort(event: CdkDragSortEvent<any[]>, columns: any[]): void {\r\n    if (!event || !columns) return;\r\n    const firstPositions = new Map<HTMLElement, number>();\r\n    columns.forEach((col) => {\r\n      const colCells = Array.from(document.querySelectorAll(`[field=\"${col.field}\"]`)) as HTMLElement[];\r\n      colCells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n    });\r\n    moveItemInArray(columns, event.previousIndex, event.currentIndex);\r\n    this.cdr.detectChanges();\r\n    requestAnimationFrame(() => {\r\n      columns.forEach((col) => {\r\n        const updatedCells = Array.from(document.querySelectorAll(`[field=\"${col.field}\"]`)) as HTMLElement[];\r\n        updatedCells.forEach((el) => {\r\n          const newLeft = el.getBoundingClientRect().left;\r\n          const oldLeft = firstPositions.get(el) ?? newLeft;\r\n          const deltaX = oldLeft - newLeft;\r\n\r\n          if (deltaX !== 0) {\r\n            el.style.transition = 'none';\r\n            el.style.transform = `translateX(${deltaX}px)`;\r\n            void el.offsetWidth;\r\n            el.style.transition = 'transform 250ms ease';\r\n            el.style.transform = 'translateX(0)';\r\n            const cleanup = () => {\r\n              el.style.transition = '';\r\n              el.style.transform = '';\r\n              el.removeEventListener('transitionend', cleanup);\r\n            };\r\n            el.addEventListener('transitionend', cleanup);\r\n          }\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n\r\n  saveSelection(selectedIds: string[], tableType: string) {\r\n    if (!tableType) return;\r\n    const stored = JSON.parse(localStorage.getItem('datatableSelections') || '{\"selectedRows\": {}}');\r\n    const allSelected = stored.selectedRows || {};\r\n    allSelected[tableType] = selectedIds;\r\n    localStorage.setItem(\r\n      'datatableSelections',\r\n      JSON.stringify({\r\n        selectedRows: allSelected,\r\n        listingType: tableType\r\n      })\r\n    );\r\n  }\r\n\r\n\r\n  restoreSelection(tableType: string) {\r\n    const stored = JSON.parse(localStorage.getItem('datatableSelections') || '{}');\r\n    const ids = stored.selectedRows?.[tableType] || [];\r\n    this.selectedRows = new Set(ids);\r\n    return this.selectedRows;\r\n  }\r\n\r\n\r\n\r\n  isOutsideContainer = false;\r\n  private containerRect: DOMRect | null = null;\r\n\r\n\r\n  onDragStarted(col: any): void {\r\n    this.currentDraggingColumn = col;\r\n    const container = document.getElementById('data-grid-main-container');\r\n    this.containerRect = container?.getBoundingClientRect() || null;\r\n  }\r\n\r\n  onDragMoved(event: CdkDragMove): void {\r\n    if (!this.containerRect) return;\r\n\r\n    const { x, y } = event.pointerPosition;\r\n    const isOutside =\r\n      x < this.containerRect.left ||\r\n      x > this.containerRect.right ||\r\n      y < this.containerRect.top ||\r\n      y > this.containerRect.bottom;\r\n\r\n    if (isOutside !== this.isOutsideContainer) {\r\n      this.isOutsideContainer = isOutside;\r\n    }\r\n  }\r\n\r\n  onDragEnded(): void {\r\n    setTimeout(() => {\r\n      if (this.isOutsideContainer && this.currentDraggingColumn) {\r\n        this.currentDraggingColumn!.is_visible = false;\r\n        this.currentDraggingColumn = null;\r\n        this.isOutsideContainer = false;\r\n        this.cdr.detectChanges();\r\n      }\r\n    }, 100);\r\n    this.containerRect = null;\r\n  }\r\n\r\n  getStartIndex(): number {\r\n    return this.paginationConfig.totalResults === 0\r\n      ? 0\r\n      : (this.paginationConfig.page - 1) * this.paginationConfig.limit + 1 || 0;\r\n  }\r\n\r\n  hasAnyDefaultView() {\r\n    return this.tableView?.some((x) => x.is_default);\r\n  }\r\n\r\n\r\n  get isTablePresetNotChanged() {\r\n    if (this.tableFilterViewId) return false;\r\n    const currPreset = this.curretaTablePresetForUpdate;\r\n\r\n    const currentPresetColumns = currPreset?.columns?.map((col: { field: any; width: any; pinned: any; }) => {\r\n      return {\r\n        field: col.field,\r\n        width: col.width,\r\n        pinned: col.pinned\r\n      }\r\n    });\r\n    const columns = this.columns?.map(col => {\r\n      return {\r\n        field: col.field,\r\n        width: col.width,\r\n        pinned: col.pinned\r\n      }\r\n    });\r\n\r\n    const stringsCurrentPrestCols = JSON.stringify(currentPresetColumns);\r\n    const stringColumns = JSON.stringify(columns);\r\n    const filters = this.filtersConfig.map((filter) => {\r\n      return {\r\n        filed: filter.field,\r\n        query: {\r\n          condition: filter?.query?.condition,\r\n          first_condition: filter?.query?.first_condition,\r\n          first_value: filter?.query?.first_value,\r\n          second_condition: filter?.query?.second_condition,\r\n          second_value: filter?.query?.second_value,\r\n        },\r\n        _ids: filter?._ids\r\n      }\r\n    })\r\n\r\n    const currentPresetFilters = currPreset?.filters?.map((filter: any) => {\r\n      return {\r\n        filed: filter.field,\r\n        query: filter.query,\r\n        _ids: filter?._ids\r\n      }\r\n    })\r\n\r\n\r\n    // console.log(\"filter congig: \", filters);\r\n    // console.log(\"current preset filters: \", currentPresetFilters);\r\n\r\n    // console.log('isEqual', stringsCurrentPrestCols == stringColumns);\r\n    // console.log('Current Temp Preset : ', currPreset)\r\n    // console.log('Current Temp Preset Cols columns: ', currentPresetColumns)\r\n    // console.log('Current columns: ', columns);\r\n\r\n    if (!currentPresetColumns) return true;\r\n    return (currentPresetColumns && (stringsCurrentPrestCols == stringColumns) && (JSON.stringify(filters) == JSON.stringify(currentPresetFilters)) && (this.fontFaimly == currPreset.config.fontFaimly) && (this.bodyTextFontsSize == currPreset.config.bodyTextFontsSize) && (this.headerTextFontsSize == this.headerTextFontsSize));\r\n\r\n    // return false\r\n  }\r\n\r\n  onActionButtonClick(button: string) {\r\n    const event = {\r\n      data: {\r\n        listingType: this.listingType,\r\n        obj: button\r\n      },\r\n      eventType: \"onActionButtonClick\",\r\n    };\r\n    this.genericEvent.emit(event);\r\n  }\r\n\r\n\r\n  setActiveTab(tab: string | null): void {\r\n    this.activeTab = tab;\r\n    const allTabs = JSON.parse(localStorage.getItem('activeTabs') || '{}');\r\n    allTabs[this.tableType] = tab;\r\n    localStorage.setItem('activeTabs', JSON.stringify(allTabs));\r\n    this.cdr.detectChanges();\r\n    const event = {\r\n      data: {\r\n        tableType: this.tableType,\r\n        obj: tab\r\n      },\r\n      eventType: 'onTabChange',\r\n    };\r\n\r\n    this.genericEvent.emit(event);\r\n  }\r\n\r\n  getBackgroundColor(row: any, isEven: boolean, section: 'left' | 'center' | 'right'): string | undefined {\r\n    if (this.hoveredRowId === (row._id || row.id)) {\r\n      return this.rowHoverColor;\r\n    }\r\n    if (this.isRowSelected(row)) {\r\n      return this.checkedRowBackgroundColor;\r\n    }\r\n    let baseColor: string | undefined;\r\n\r\n    if (this.rowShadingEnabled) {\r\n      baseColor = isEven ? this.evenRowsBackgroundColor : this.oddRowsBackgroundColor;\r\n    } else {\r\n      baseColor = this.evenRowsBackgroundColor;\r\n    }\r\n    if (!baseColor) {\r\n      if (section === 'left') {\r\n        baseColor = this.leftPinnedBackgroundColor;\r\n      } else if (section === 'right') {\r\n        baseColor = this.rightPinnedBackgroundColor;\r\n      } else {\r\n        baseColor = this.bodyBackgroundColor;\r\n      }\r\n    }\r\n    return baseColor;\r\n  }\r\n\r\n  hasHorizontalScrollbar(): boolean {\r\n    if (!this.centerScrollableBody?.nativeElement) return false;\r\n    const el = this.centerScrollableBody.nativeElement;\r\n    return el.scrollWidth > el.clientWidth;\r\n  }\r\n\r\n\r\n  getSafeComment(description: string): SafeHtml {\r\n    return this.cleanEditorContent(description);\r\n  }\r\n  cleanEditorContent(content: string): SafeHtml {\r\n    if (!content) {\r\n      return '';\r\n    }\r\n    // 1. Decode HTML entities\r\n    const textarea = document.createElement('textarea');\r\n    textarea.innerHTML = content;\r\n    let decoded = textarea.value;\r\n\r\n    decoded = decoded\r\n      .replace(/<\\/?(span|p|thead|tbody|tfoot)[^>]*>/g, '')\r\n      .replace(/&nbsp;/g, ' ');\r\n\r\n    // Ensure clean table structure\r\n    decoded = decoded\r\n      .replace(/<table[^>]*>/g, '<table>')\r\n      .replace(/<tr[^>]*>/g, '<tr>')\r\n      .replace(/<th[^>]*>/g, '<th>')\r\n      .replace(/<td[^>]*>/g, '<td>');  // Remove <thead> and <tbody> tags\r\n\r\n    // 4. Add inline styles\r\n    decoded = decoded\r\n      // Add inline styles to <table>\r\n      .replace(/<table([^>]*)>/g, `<table style=\"width: 100%; border-collapse: collapse; padding: 20px; font-size: 14px; background-color: #ffffff;\"$1>`)\r\n      // Add inline styles to <tr>\r\n      .replace(/<tr([^>]*)>/g, `<tr style=\"border-bottom: 1px solid #ccc;\"$1>`)\r\n      // Add inline styles to <th>\r\n      .replace(/<th([^>]*)>/g, `<th style=\"background-color: #f0f0f0; font-weight: 600; font-size: 16px; color: #2A1F73; border: 1px solid #ccc; padding: 12px 20px; text-align: left;\"$1>`)\r\n      // Add inline styles to <td>\r\n      .replace(/<td([^>]*)>/g, `<td style=\"min-width:120px; border: 1px solid #ccc; padding: 12px 20px; text-align: left;\"$1>`);\r\n    decoded = decoded.replace(/<img([^>]*)>/g, (match, group1) => {\r\n      // Add style to <img> if not already specified\r\n      if (/style=/.test(group1)) {\r\n        return match;  // If style already exists, keep it\r\n      } else {\r\n        return `<img style=\"width: 30%; height: 30%;border-radius: 16px; padding-top: 15px;padding-bottom: 10px;\"${group1}>`;\r\n      }\r\n    });\r\n    // 5. Return safe HTML\r\n    return this.sanitizer.bypassSecurityTrustHtml(decoded);\r\n  }\r\n\r\n  getExtention(url: string | string[] | null | undefined) {\r\n    if (url !== '-') {\r\n      if (typeof (url) == 'string') {\r\n        return url.split('.').pop()\r\n      } else if (Array.isArray(url)) {\r\n        return url[0].split('.').pop()\r\n      } else return '-'\r\n    }\r\n    else return '-'\r\n  }\r\n\r\n  downloadAttchment(url: any, file?: any) {\r\n    // this.onEvent.emit({\r\n    //   download: true,\r\n    // });\r\n    // this.genericEvent.emit(data)\r\n    // event.preventDefault();\r\n    const link = document.createElement('a');\r\n    link.href = url;\r\n    link.download = '';\r\n    document.body.appendChild(link);\r\n    link.click();\r\n    document.body.removeChild(link);\r\n\r\n  }\r\n  fullImageSrc: string | null = '';\r\n  openFullImage(event: Event) {\r\n    const target = event.target as HTMLElement;\r\n    if (target.tagName === 'IMG') {\r\n      this.fullImageSrc = target.getAttribute('src');\r\n    }\r\n  }\r\n\r\n  addStylesToImages(): void {\r\n    const images = document.querySelectorAll('.comment-content img');\r\n    images.forEach((img) => {\r\n      // Apply inline styles directly\r\n      this.renderer.setStyle(img, 'width', '70px');\r\n      this.renderer.setStyle(img, 'border-radius', '16px');\r\n      this.renderer.setStyle(img, 'margin', '8px');\r\n      this.renderer.setStyle(img, 'cursor', 'pointer');\r\n\r\n      // Add click listener to show fullscreen image on click\r\n      this.renderer.listen(img, 'click', () => this.onImageClick((img as HTMLImageElement).src));\r\n    });\r\n  }\r\n\r\n  onImageClick(src: string): void {\r\n    this.fullscreenImage = src;\r\n  }\r\n\r\n  @ViewChild('fullscreenImageTemplate') fullscreenImageTemplate!: TemplateRef<any>;\r\n  private fullscreenViewRef: EmbeddedViewRef<any> | null = null;\r\n\r\n  iconMap: Record<string, (row: any, col: any) => string> = {\r\n    attachments_count: () => this.singleSpaAssetsPath + 'data-grid/icons/attachments.svg',\r\n    comment_count: () => this.singleSpaAssetsPath + 'data-grid/icons/comments.svg',\r\n    priority: (row, col) => {\r\n      const val =\r\n        this.getNestedValue(row, col.field)?.value ||\r\n        this.getNestedValue(row, col.field)?.name ||\r\n        this.getNestedValue(row, col.field);\r\n\r\n      return (\r\n        this.singleSpaAssetsPath +\r\n        'data-grid/icons/' +\r\n        (val ?? 'default') +\r\n        '.svg'\r\n      );\r\n    },\r\n  };\r\n\r\n  toggleFullscreen() {\r\n    this.isFullScreen = !this.isFullScreen;\r\n    const elem = document.documentElement as any;\r\n    if (!document.fullscreenElement) {\r\n      if (elem.requestFullscreen) {\r\n        elem.requestFullscreen();\r\n      } else if (elem.mozRequestFullScreen) {\r\n        elem.mozRequestFullScreen();\r\n      } else if (elem.webkitRequestFullscreen) {\r\n        elem.webkitRequestFullscreen();\r\n      } else if (elem.msRequestFullscreen) {\r\n        elem.msRequestFullscreen();\r\n      }\r\n    } else {\r\n      if (document.exitFullscreen) {\r\n        document.exitFullscreen();\r\n      } else if ((document as any).mozCancelFullScreen) {\r\n        (document as any).mozCancelFullScreen();\r\n      } else if ((document as any).webkitExitFullscreen) {\r\n        (document as any).webkitExitFullscreen();\r\n      } else if ((document as any).msExitFullscreen) {\r\n        (document as any).msExitFullscreen();\r\n      }\r\n    }\r\n  }\r\n\r\n  onCellEvent(event: any) {\r\n    this.customCellEvent.emit(event);\r\n  }\r\n\r\n\r\n\r\n\r\n}","<div class=\"position-relative h-100\">\r\n  <div\r\n    class=\"d-flex justify-content-between mb-2 align-items-center position-relative\"\r\n  >\r\n    <div class=\"d-flex gap-2\">\r\n      <div class=\"nav nav-tabs\" *ngIf=\"true\">\r\n        <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\r\n          <span\r\n            *ngFor=\"let tab of tabs; let i = index\"\r\n            (click)=\"setActiveTab(tab)\"\r\n            class=\"nav-link cursor-pointer\"\r\n            [class.active]=\"activeTab == tab\"\r\n          >\r\n            {{ tab }}\r\n          </span>\r\n        </div>\r\n      </div>\r\n      <div class=\"global-search\" [style.width.px]=\"350\">\r\n        <span\r\n          *ngIf=\"enableGlobalSearch\"\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n          class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n        ></span>\r\n        <input\r\n          *ngIf=\"enableGlobalSearch\"\r\n          style=\"height: 36px\"\r\n          class=\"form-control\"\r\n          placeholder=\"Type to search, then press Enter\"\r\n          [(ngModel)]=\"tableSearch\"\r\n          (keydown.enter)=\"onGlobalSearch()\"\r\n          (input)=\"onSearchInput($event)\"\r\n          type=\"search\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <div class=\"d-flex gap-2 align-items-center table-right-top-actions\">\r\n      <ng-container *ngFor=\"let button of buttons\">\r\n        <div\r\n          class=\"d-flex align-items-center gap-2 action-buttons-row\"\r\n          *ngIf=\"button?.has_permission\"\r\n        >\r\n          <a\r\n            href=\"JavaScript:void(0)\"\r\n            (click)=\"onActionButtonClick(button.name)\"\r\n            class=\"button button-small btn border border-primary btn-active-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n          >\r\n            <span\r\n              *ngIf=\"button.is_showIcon\"\r\n              [inlineSVG]=\"\r\n                singleSpaAssetsPath + 'data-grid/icons/' + button.icon + '.svg'\r\n              \"\r\n              class=\"svg-icon svg-icon-2\"\r\n            ></span>\r\n            <span\r\n              class=\"label-hidden text-white\"\r\n              [class.ms-0]=\"button.is_showIcon\"\r\n              >{{ button?.name }}</span\r\n            >\r\n          </a>\r\n        </div>\r\n      </ng-container>\r\n      <div\r\n        *ngIf=\"!showFilterRow\"\r\n        class=\"cursor-pointer position-relative action-buttons-row\"\r\n        (click)=\"toggleOpenFilter()\"\r\n        [class.active]=\"showFilters\"\r\n      >\r\n        <a\r\n          href=\"JavaScript:void(0)\"\r\n          class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n            class=\"svg-icon svg-icon-2\"\r\n          ></span>\r\n          <span class=\"label-hidden text-white\">Filters</span>\r\n        </a>\r\n        <span\r\n          *ngIf=\"activeFilteredColumns?.length\"\r\n          style=\"\r\n            width: 7px;\r\n            height: 7px;\r\n            box-shadow: 0px 0px 3px #0022ff;\r\n            background-color: rgb(0, 60, 255);\r\n            position: absolute;\r\n            right: 16px;\r\n            top: 10px;\r\n          \"\r\n          class=\"rounded-circle d-block\"\r\n        ></span>\r\n      </div>\r\n      <div\r\n        class=\"cursor-pointer d-none\"\r\n        (click)=\"toggleActions('advance-filter')\"\r\n        [class.active]=\"activeTopButton === 'advance-filter'\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/zoom-charge.svg'\"\r\n          class=\"data-grid-svg-icon top-icon me-2\"\r\n        ></span>\r\n      </div>\r\n      <div\r\n        class=\"cursor-pointer action-buttons-row\"\r\n        (click)=\"toggleActions('setting')\"\r\n        [class.active]=\"\r\n          activeTopButton === 'setting' ||\r\n          activeTopButton === 'table-layout' ||\r\n          activeTopButton === 'table-presets' ||\r\n          activeTopButton === 'show-hide-columns'\r\n        \"\r\n      >\r\n        <!-- <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\r\n          class=\"data-grid-svg-icon top-icon me-2\"\r\n        ></span> -->\r\n        <a\r\n          href=\"JavaScript:void(0)\"\r\n          class=\"button button-small btn btn-active-primary border border-primary me-2 p-0 d-flex align-items-center justify-content-center px-3\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\r\n            class=\"svg-icon svg-icon-2\"\r\n          ></span>\r\n          <span class=\"label-hidden text-white\">Setting</span>\r\n        </a>\r\n\r\n        <div\r\n          *ngIf=\"activeTopButton === 'setting'\"\r\n          class=\"actions-dropdown mt-1 actions-dropdown-setting\"\r\n          style=\"position: absolute\"\r\n        >\r\n          <div class=\"dropdown-menu show shadow custom-menu\">\r\n            <!-- Table Layout -->\r\n            <a\r\n              class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n              (click)=\"$event.stopPropagation(); toggleActions('table-layout')\"\r\n            >\r\n              <span\r\n                ><span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/table-2.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon me-2\"\r\n                ></span>\r\n                Table Layout</span\r\n              >\r\n              <span\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon me-2\"\r\n              ></span>\r\n            </a>\r\n            <!-- Table Presets -->\r\n            <a\r\n              (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n              class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n            >\r\n              <span\r\n                ><span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/list-details.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon me-2\"\r\n                ></span>\r\n                Table Presets</span\r\n              >\r\n              <span\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon me-2\"\r\n              ></span>\r\n            </a>\r\n\r\n            <!-- Columns -->\r\n            <a\r\n              *ngIf=\"!showSideMenu\"\r\n              (click)=\"\r\n                $event.stopPropagation(); toggleActions('show-hide-columns')\r\n              \"\r\n              class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n            >\r\n              <span\r\n                ><span\r\n                  [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n                  class=\"data-grid-svg-icon me-2\"\r\n                ></span>\r\n                Columns</span\r\n              >\r\n              <div class=\"d-flex gap-2\">\r\n                <span class=\"muted-text\">{{ columnsCount }}</span>\r\n                <span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon me-2\"\r\n                ></span>\r\n              </div>\r\n            </a>\r\n\r\n            <div class=\"dropdown-divider\"></div>\r\n\r\n            <!-- Filter -->\r\n            <a\r\n              class=\"dropdown-item cursor-pointer\"\r\n              (click)=\"toggleOpenFilter(); activeTopButton = ''\"\r\n              *ngIf=\"!showFilterRow\"\r\n            >\r\n              <span\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon me-2 mt-1 cursor-pointer\"\r\n              ></span>\r\n              Filter\r\n            </a>\r\n\r\n            <!-- Download -->\r\n            <a\r\n              class=\"dropdown-item cursor-pointer\"\r\n              (click)=\"downloadCsv('csv')\"\r\n            >\r\n              <span\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/download.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n              ></span>\r\n              CSV Export\r\n            </a>\r\n            <a\r\n              *ngIf=\"enableExport\"\r\n              class=\"dropdown-item cursor-pointer\"\r\n              (click)=\"downloadCsv('xlsx')\"\r\n            >\r\n              <span\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/download.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n              ></span>\r\n              Excel Export\r\n            </a>\r\n            <!-- Font Family & Font Size -->\r\n            <div class=\"px-2 pb-2 pt-2\">\r\n              <div class=\"d-flex gap-2\">\r\n                <!-- Font Family -->\r\n                <select\r\n                  class=\"form-select form-select-sm\"\r\n                  [(ngModel)]=\"fontFaimly\"\r\n                  (change)=\"onFontChange()\"\r\n                >\r\n                  <option *ngFor=\"let font of fontFamilies\" [value]=\"font\">\r\n                    {{ font }}\r\n                  </option>\r\n                </select>\r\n\r\n                <!-- Font Size -->\r\n                <select\r\n                  class=\"form-select form-select-sm\"\r\n                  (change)=\"onFontChange()\"\r\n                  [(ngModel)]=\"bodyTextFontsSize\"\r\n                >\r\n                  <option *ngFor=\"let size of fontSizes\" [value]=\"size\">\r\n                    {{ size }}\r\n                  </option>\r\n                </select>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Table Layout -->\r\n\r\n        <ng-container *ngIf=\"activeTopButton === 'table-layout'\">\r\n          <div\r\n            *ngTemplateOutlet=\"tableLayout\"\r\n            class=\"actions-dropdown mt-1\"\r\n            style=\"position: absolute\"\r\n          ></div>\r\n        </ng-container>\r\n\r\n        <!-- Table Presets -->\r\n        <ng-container *ngIf=\"activeTopButton === 'table-presets'\">\r\n          <div\r\n            *ngTemplateOutlet=\"tablePreset\"\r\n            class=\"actions-dropdown mt-1\"\r\n            style=\"position: absolute\"\r\n          ></div>\r\n        </ng-container>\r\n\r\n        <!-- Table Presets -->\r\n        <ng-container *ngIf=\"activeTopButton === 'show-hide-columns'\">\r\n          <div\r\n            *ngTemplateOutlet=\"showHideColumns\"\r\n            class=\"actions-dropdown mt-1\"\r\n            style=\"position: absolute\"\r\n          ></div>\r\n        </ng-container>\r\n      </div>\r\n\r\n      <div class=\"action-buttons-row\" *ngIf=\"showFullScreenButton\">\r\n        <a\r\n          *ngIf=\"!isFullScreen\"\r\n          class=\"button button-small btn btn-active-primary border border-primary expend d-flex justify-content-center align-items-center\"\r\n          (click)=\"toggleFullscreen()\"\r\n          data-bs-toggle=\"tooltip\"\r\n          data-bs-placement=\"top\"\r\n          title=\"Minimise\"\r\n          [ngClass]=\"{ minArrow: !isFullScreen, maxArrow: isFullScreen }\"\r\n          style=\"transition: color 0.2s\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/expend.svg'\"\r\n            class=\"svg-icon svg-icon-2 mb-1\"\r\n          ></span>\r\n        </a>\r\n        <a\r\n          *ngIf=\"isFullScreen\"\r\n          class=\"button button-small btn btn-active-primary border border-primary expend d-flex justify-content-center align-items-center\"\r\n          (click)=\"toggleFullscreen()\"\r\n          data-bs-toggle=\"tooltip\"\r\n          data-bs-placement=\"top\"\r\n          title=\"Maximise\"\r\n          [ngClass]=\"{ minArrow: !isFullScreen, maxArrow: isFullScreen }\"\r\n          style=\"transition: color 0.2s\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/minimize.svg'\"\r\n            class=\"svg-icon svg-icon-2 mb-1\"\r\n          ></span>\r\n        </a>\r\n      </div>\r\n      <div>\r\n        <!-- Example single danger button -->\r\n\r\n        <!-- <button\r\n          type=\"button\"\r\n          class=\"btn btn-primary btn-sm d-flex gap-2 action-button\"\r\n          (click)=\"toggleActions('actions')\"\r\n        >\r\n          Action\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/Vector.svg'\"\r\n            class=\"data-grid-svg-icon\"\r\n          ></span>\r\n        </button>\r\n        <div\r\n          *ngIf=\"activeTopButton === 'actions'\"\r\n          class=\"actions-dropdown mt-1\"\r\n        >\r\n          <div class=\"dropdown-menu show\">\r\n            <a class=\"dropdown-item\" href=\"#\">Action</a>\r\n            <a class=\"dropdown-item\" href=\"#\">Another action</a>\r\n            <a class=\"dropdown-item\" href=\"#\">Something else here</a>\r\n            <div class=\"dropdown-divider\"></div>\r\n            <a class=\"dropdown-item\" href=\"#\">Separated link</a>\r\n          </div>\r\n        </div> -->\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div\r\n    *ngIf=\"showFilters && !showFilterRow\"\r\n    class=\"top-filter-row border-top py-2 d-flex justify-content-between align-items-center\"\r\n    [style.height.px]=\"topFilterRowHeight\"\r\n  >\r\n    <!-- LEFT SIDE (Filter tags + Filter button) -->\r\n    <div class=\"d-flex gap-2 align-items-center\">\r\n      <ng-container>\r\n        <div\r\n          *ngFor=\"let col of activeFilteredColumns; trackBy: trackByField\"\r\n          class=\"filter-tags\"\r\n        >\r\n          <div\r\n            (click)=\"\r\n              isActiveFilterOpen = true;\r\n              activeTopButton = 'filter-columns';\r\n              openFilter(col)\r\n            \"\r\n            class=\"d-flex justify-content-center align-items-center muted-text add-filter-button active-filters\"\r\n            style=\"white-space: nowrap\"\r\n            [class.active]=\"\r\n              col?.field == selectedColumnForFilter?.field &&\r\n              isActiveFilterOpen &&\r\n              activeTopButton == 'filter-columns'\r\n            \"\r\n          >\r\n            <span class=\"header-tag mt-0 d-flex align-items-center\">\r\n              <span\r\n                *ngIf=\"col?.pinned\"\r\n                [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin.svg'\"\r\n                class=\"data-grid-svg-icon me-2\"\r\n              ></span>\r\n              {{ col.header }}\r\n              <span\r\n                (click)=\"\r\n                  $event.stopPropagation(); removeColumnFilterFromColumn(col)\r\n                \"\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon cross-secondary ms-2 mb-1\"\r\n              ></span>\r\n            </span>\r\n          </div>\r\n\r\n          <ng-container\r\n            *ngIf=\"\r\n              activeTopButton === 'filter-columns' &&\r\n              col?.field == selectedColumnForFilter?.field &&\r\n              isActiveFilterOpen\r\n            \"\r\n          >\r\n            <div\r\n              *ngTemplateOutlet=\"filterColumns; context: { column: col }\"\r\n              class=\"actions-dropdown mt-1\"\r\n            ></div>\r\n          </ng-container>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <!-- Filter Button -->\r\n      <div class=\"add-filter-button-menu\">\r\n        <div\r\n          (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n          class=\"d-flex justify-content-center align-items-center muted-text add-filter-button button-filter\"\r\n          style=\"width: 70px\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/plus.svg'\"\r\n            class=\"me-2 data-grid-svg-icon\"\r\n          ></span>\r\n          Filter\r\n        </div>\r\n\r\n        <ng-container\r\n          *ngIf=\"activeTopButton === 'filter-columns' && !isActiveFilterOpen\"\r\n        >\r\n          <div\r\n            *ngTemplateOutlet=\"filterColumns\"\r\n            class=\"actions-dropdown mt-1\"\r\n          ></div>\r\n        </ng-container>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- RIGHT SIDE (Update + Reset) -->\r\n    <div class=\"d-flex gap-3 align-items-center\">\r\n      <div\r\n        (click)=\"savePreset()\"\r\n        class=\"text-primary cursor-pointer all-filters-reset-button\"\r\n        *ngIf=\"!checkFilterChangesEffect()\"\r\n      >\r\n        Update View\r\n      </div>\r\n\r\n      <div\r\n        class=\"text-primary cursor-pointer all-filters-reset-button\"\r\n        *ngIf=\"!tableFilterViewId && activeFilteredColumns?.length\"\r\n        (click)=\"clearAllFilters()\"\r\n      >\r\n        Reset\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div\r\n    [style.height]=\"\r\n      showFilters ? 'calc(100% - ' + topFilterRowHeight + 'px)' : '100%'\r\n    \"\r\n    cdkDropListGroup\r\n    class=\"data-grid-table-wrapper overflow-hidden\"\r\n    #dataGridContainer\r\n    [style.fontFamily]=\"fontFaimly\"\r\n    [style.backgroundColor]=\"bodyBackgroundColor\"\r\n    id=\"data-grid-main-container\"\r\n  >\r\n    <div\r\n      *ngIf=\"showRowsGrouping\"\r\n      [style.height.px]=\"headerRowHeight\"\r\n      [cdkDropListData]=\"columns\"\r\n      [style.backgroundColor]=\"\r\n        topGroupedBadgesBackgroundColor || headerBackgroundColor\r\n      \"\r\n      cdkDropList\r\n      (cdkDropListEntered)=\"enterToTopRowGrouping($event)\"\r\n      (cdkDropListExited)=\"exitedFromTheTopRow($event)\"\r\n      (cdkDropListDropped)=\"onDropTopGroup($event)\"\r\n      [cdkDropListEnterPredicate]=\"canEnterToRowsGrouping\"\r\n      id=\"rows-grouping-top-container\"\r\n      class=\"border-below d-flex px-4 align-items-center\"\r\n    >\r\n      <div\r\n        class=\"d-flex gap-2 align-items-center\"\r\n        [style.color]=\"headerTextColor\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n        ></span>\r\n        <div *ngIf=\"!draggingInGroupArea && !groupedColumns?.length\">\r\n          Drag here to set row groups\r\n        </div>\r\n        <div\r\n          cdkDropListOrientation=\"horizontal\"\r\n          cdkDropList\r\n          (cdkDropListDropped)=\"onGroupReorder($event)\"\r\n          class=\"d-flex\"\r\n        >\r\n          <div\r\n            cdkDrag\r\n            [cdkDragLockAxis]=\"'x'\"\r\n            *ngFor=\"\r\n              let child of groupedColumns;\r\n              let i = index;\r\n              trackBy: trackByField\r\n            \"\r\n            class=\"d-flex align-items-center\"\r\n          >\r\n            <ng-container\r\n              *ngTemplateOutlet=\"\r\n                topGroupingRowPlaceholder;\r\n                context: {\r\n                  $implicit: child,\r\n                  showChevron:\r\n                    groupedColumns.length > 1 && i != groupedColumns.length - 1\r\n                }\r\n              \"\r\n            ></ng-container>\r\n            <ng-template cdkDragPreview\r\n              ><div class=\"p-2 border d-flex gap-2\">\r\n                <div>\r\n                  <span\r\n                    *ngIf=\"!draggingInGroupArea\"\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                  ></span>\r\n                </div>\r\n                <div>{{ child.header }}</div>\r\n              </div>\r\n            </ng-template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div\r\n      class=\"d-flex overflow-hidden\"\r\n      [style.height]=\"\r\n        'calc(100% - ' +\r\n        (showRowsGrouping\r\n          ? headerRowHeight + footerRowHeight\r\n          : footerRowHeight) +\r\n        'px)'\r\n      \"\r\n    >\r\n      <div\r\n        class=\"h-100\"\r\n        [style.width]=\"\r\n          !showSideMenu\r\n            ? '100%'\r\n            : sideMenuVisible\r\n            ? 'calc(100% - 280px)'\r\n            : 'calc(100% - 30px)'\r\n        \"\r\n      >\r\n        <div class=\"h-100 transition position-relative w-100\">\r\n          <!-- ##################################################################################################################################################################################### -->\r\n          <!-- ##################################################################################################################################################################################### -->\r\n          <!-- Data Grid Header starts here -->\r\n          <!-- ##################################################################################################################################################################################### -->\r\n          <!-- ##################################################################################################################################################################################### -->\r\n\r\n          <div\r\n            class=\"data-grid-header-wrapper w-100\"\r\n            [style.color]=\"headerTextColor\"\r\n            [style.fontSize.px]=\"headerTextFontsSize\"\r\n            [style.backgroundColor]=\"headerBackgroundColor\"\r\n            [class.border-below]=\"!hasAnyVisibleColumn\"\r\n            [style.height.px]=\"\r\n              showColumnsGrouping && showFilterRow\r\n                ? headerRowHeight * 3\r\n                : showColumnsGrouping || showFilterRow\r\n                ? headerRowHeight * 2\r\n                : headerRowHeight\r\n            \"\r\n          >\r\n            <!-- ********************************************************************************* -->\r\n            <!-- ********************************************************************************* -->\r\n            <!-- Data Grid Left Pinned Header starts here -->\r\n            <!-- ********************************************************************************* -->\r\n            <!-- ********************************************************************************* -->\r\n            <div\r\n              class=\"data-grid-header left-pinned\"\r\n              #leftPinnedHeader\r\n              [class.border-right]=\"hasLeftPinnedColumns\"\r\n            >\r\n              <div\r\n                *ngIf=\"showSerialNumber\"\r\n                [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n                class=\"select-all-checkbox-cell border-below\"\r\n                [style.width.px]=\"55\"\r\n                [style.height.px]=\"\r\n                  showColumnsGrouping && showFilterRow\r\n                    ? headerRowHeight * 3\r\n                    : showColumnsGrouping || showFilterRow\r\n                    ? headerRowHeight * 2\r\n                    : headerRowHeight\r\n                \"\r\n              >\r\n                S.No\r\n              </div>\r\n              <div\r\n               *ngIf=\"showCheckboxes\"\r\n                [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n                class=\"select-all-checkbox-cell border-below\"\r\n                [style.height.px]=\"\r\n                  showColumnsGrouping && showFilterRow\r\n                    ? headerRowHeight * 3\r\n                    : showColumnsGrouping || showFilterRow\r\n                    ? headerRowHeight * 2\r\n                    : headerRowHeight\r\n                \"\r\n              >\r\n                <input\r\n                  *ngIf=\"hasAnyVisibleColumn\"\r\n                  type=\"checkbox\"\r\n                  [indeterminate]=\"isIndeterminateState(dataSet)\"\r\n                  [checked]=\"isAllSelected(dataSet)\"\r\n                  (change)=\"toggleSelectAll(dataSet)\"\r\n                />\r\n              </div>\r\n              <div\r\n                [style.backgroundColor]=\"headerBackgroundColor\"\r\n                class=\"d-flex\"\r\n                cdkDropList\r\n                id=\"left-pinned-header\"\r\n                cdkDropListOrientation=\"horizontal\"\r\n                [cdkDropListData]=\"leftPinnedColumns\"\r\n                (cdkDropListEntered)=\"onDropListEnter($event, 'left')\"\r\n                (cdkDropListSorted)=\"\r\n                  onSortGroup($event, 'previewLeftPinnedColumns')\r\n                \"\r\n                (cdkDropListDropped)=\"onDropGroup()\"\r\n                style=\"min-width: 1px\"\r\n              >\r\n                <div\r\n                  class=\"dragable-header\"\r\n                  cdkDrag\r\n                  [cdkDragData]=\"col\"\r\n                  *ngFor=\"\r\n                    let col of leftPinnedColumns;\r\n                    let i = index;\r\n                    trackBy: trackByField\r\n                  \"\r\n                >\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      headerCell;\r\n                      context: {\r\n                        $implicit: col,\r\n                        index: i,\r\n                        section: 'previewLeftPinnedColumns'\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                  <ng-template cdkDragPreview\r\n                    ><div class=\"p-2 border d-flex gap-2\">\r\n                      <div>\r\n                        <span\r\n                          *ngIf=\"!draggingInGroupArea\"\r\n                          [inlineSVG]=\"\r\n                            singleSpaAssetsPath +\r\n                            'data-grid/icons/arrows-move.svg'\r\n                          \"\r\n                          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                        ></span>\r\n                      </div>\r\n                      <div>{{ col.header }}</div>\r\n                    </div>\r\n                  </ng-template>\r\n                  <ng-template cdkDragPlaceholder>\r\n                    <div *ngIf=\"!draggingInGroupArea\">\r\n                      <div\r\n                        *ngTemplateOutlet=\"\r\n                          headerCell;\r\n                          context: {\r\n                            $implicit: col,\r\n                            index: i,\r\n                            section: ''\r\n                          }\r\n                        \"\r\n                      ></div>\r\n                    </div>\r\n                    <div\r\n                      *ngIf=\"draggingInGroupArea\"\r\n                      class=\"d-flex gap-2 ms-2\"\r\n                      style=\"opacity: 0.6\"\r\n                    >\r\n                      <ng-container\r\n                        *ngIf=\"col?.children?.length; else singleCol\"\r\n                      >\r\n                        <ng-container\r\n                          *ngFor=\"\r\n                            let child of col.children;\r\n                            let i = index;\r\n                            trackBy: trackByField\r\n                          \"\r\n                        >\r\n                          <ng-container\r\n                            *ngTemplateOutlet=\"\r\n                              topGroupingRowPlaceholder;\r\n                              context: {\r\n                                $implicit: child,\r\n                                showChevron:\r\n                                  col.children.length > 1 &&\r\n                                  i != col.children.length - 1\r\n                              }\r\n                            \"\r\n                          ></ng-container>\r\n                        </ng-container>\r\n                      </ng-container>\r\n\r\n                      <ng-template #singleCol>\r\n                        <ng-container\r\n                          *ngTemplateOutlet=\"\r\n                            topGroupingRowPlaceholder;\r\n                            context: {\r\n                              $implicit: col,\r\n                              showChevron: col?.children?.length > 1\r\n                            }\r\n                          \"\r\n                        ></ng-container>\r\n                      </ng-template>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- ********************************************************************************* -->\r\n            <!-- ********************************************************************************* -->\r\n            <!-- Data Grid Center Pinned Header starts here -->\r\n            <!-- ********************************************************************************* -->\r\n            <!-- ********************************************************************************* -->\r\n            <div\r\n              class=\"data-grid-header center-scrollable\"\r\n              #centerPinnedHeader\r\n              (scroll)=\"onCenterBodyScroll($event)\"\r\n              id=\"center-pinned-header\"\r\n              cdkDropList\r\n              [cdkDropListConnectedTo]=\"\r\n                showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n              \"\r\n              [cdkDropListData]=\"centerColumns\"\r\n              cdkDropListOrientation=\"horizontal\"\r\n              [cdkDropListSortingDisabled]=\"\r\n                isDisableColumnGrouping && draggingInGroupArea\r\n              \"\r\n              (cdkDropListEntered)=\"onDropListEnter($event, 'center')\"\r\n              (cdkDropListSorted)=\"onSortGroup($event, 'previewCenterColumns')\"\r\n              (cdkDropListDropped)=\"onDropGroup()\"\r\n              [style.maxWidth]=\"\r\n                'calc(100% - ' +\r\n                (rightPinnedHeader.offsetWidth + leftPinnedHeader.offsetWidth) +\r\n                'px)'\r\n              \"\r\n            >\r\n              <div\r\n                *ngIf=\"groupedColumns?.length\"\r\n                style=\"min-width: 200px\"\r\n                class=\"h-100 align-items-center\"\r\n                #columnsGroupedBox\r\n                id=\"groupBoxHeaderDiv\"\r\n              >\r\n                <div\r\n                  class=\"d-flex w-100 justify-content-between align-items-center border-below\"\r\n                  [style.height.px]=\"\r\n                    showFilterRow ? headerRowHeight * 2 : headerRowHeight\r\n                  \"\r\n                >\r\n                  <div class=\"ps-3\">Group</div>\r\n                  <div class=\"d-flex\">\r\n                    <div\r\n                      class=\"three-dots cursor-pointer\"\r\n                      (click)=\"\r\n                        openThreeDotsMenu($event, 'group');\r\n                        isThreeDotsFilterOpen = false\r\n                      \"\r\n                    >\r\n                      <span\r\n                        [inlineSVG]=\"\r\n                          singleSpaAssetsPath +\r\n                          'data-grid/icons/three-dots-vertical.svg'\r\n                        \"\r\n                        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                      ></span>\r\n                    </div>\r\n                    <div\r\n                      (mousedown)=\"\r\n                        $event.stopPropagation(); onResizeGroupBox($event)\r\n                      \"\r\n                      class=\"resize-handle\"\r\n                      style=\"margin-right: -2px\"\r\n                    >\r\n                      <span\r\n                        [inlineSVG]=\"\r\n                          singleSpaAssetsPath +\r\n                          'data-grid/icons/resize-handle.svg'\r\n                        \"\r\n                        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                      ></span>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n                <div\r\n                  [style.height.px]=\"headerRowHeight\"\r\n                  class=\"border-below\"\r\n                ></div>\r\n              </div>\r\n              <span\r\n                class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n                style=\"min-width: 30px; height: 100%\"\r\n                *ngIf=\"gridType === 'Assets' || gridType === 'Tasks'\"\r\n              >\r\n              </span>\r\n              <div\r\n                class=\"dragable-header\"\r\n                (cdkDragStarted)=\"\r\n                  checkColumnGroupingStatus(col);\r\n                  dragStartOnGroup(col);\r\n                  onDragStarted(col)\r\n                \"\r\n                (cdkDragMoved)=\"onDragMoved($event)\"\r\n                (cdkDragEnded)=\"onDragEnded()\"\r\n                cdkDrag\r\n                [cdkDragData]=\"col\"\r\n                *ngFor=\"\r\n                  let col of centerColumns;\r\n                  let i = index;\r\n                  trackBy: trackById\r\n                \"\r\n              >\r\n                <ng-container\r\n                  *ngTemplateOutlet=\"\r\n                    headerCell;\r\n                    context: {\r\n                      $implicit: col,\r\n                      index: i,\r\n                      section: 'previewCenterColumns'\r\n                    }\r\n                  \"\r\n                >\r\n                </ng-container>\r\n                <ng-template cdkDragPreview\r\n                  ><div class=\"p-2 border d-flex gap-2\">\r\n                    <div>\r\n                      <span\r\n                        *ngIf=\"!isOutsideContainer\"\r\n                        [inlineSVG]=\"\r\n                          singleSpaAssetsPath +\r\n                          (draggingInGroupArea\r\n                            ? 'data-grid/icons/justify.svg'\r\n                            : 'data-grid/icons/arrows-move.svg')\r\n                        \"\r\n                        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                      >\r\n                      </span>\r\n                      <span\r\n                        *ngIf=\"isOutsideContainer\"\r\n                        [inlineSVG]=\"\r\n                          singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\r\n                        \"\r\n                        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                      >\r\n                      </span>\r\n                    </div>\r\n                    <div>{{ col.header }}</div>\r\n                  </div>\r\n                </ng-template>\r\n                <ng-template cdkDragPlaceholder>\r\n                  <div *ngIf=\"!draggingInGroupArea\">\r\n                    <div\r\n                      *ngTemplateOutlet=\"\r\n                        headerCell;\r\n                        context: {\r\n                          $implicit: col,\r\n                          index: i,\r\n                          section: 'centerColumns'\r\n                        }\r\n                      \"\r\n                    ></div>\r\n                  </div>\r\n                  <div\r\n                    *ngIf=\"draggingInGroupArea && !isOutsideContainer\"\r\n                    class=\"d-flex gap-2 ms-2\"\r\n                    style=\"opacity: 0.6\"\r\n                  >\r\n                    <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n                      <ng-container\r\n                        *ngFor=\"\r\n                          let child of col.children;\r\n                          let i = index;\r\n                          trackBy: trackById\r\n                        \"\r\n                      >\r\n                        <ng-container *ngIf=\"child?.is_groupable\">\r\n                          <ng-container\r\n                            *ngTemplateOutlet=\"\r\n                              topGroupingRowPlaceholder;\r\n                              context: {\r\n                                $implicit: child,\r\n                                showChevron:\r\n                                  col.children.length > 1 &&\r\n                                  i != col.children.length - 1\r\n                              }\r\n                            \"\r\n                          ></ng-container>\r\n                        </ng-container>\r\n                      </ng-container>\r\n                    </ng-container>\r\n\r\n                    <ng-template #singleCol>\r\n                      <ng-container *ngIf=\"col?.is_groupable\">\r\n                        <ng-container\r\n                          *ngTemplateOutlet=\"\r\n                            topGroupingRowPlaceholder;\r\n                            context: {\r\n                              $implicit: col,\r\n                              showChevron: col?.children?.length > 1\r\n                            }\r\n                          \"\r\n                        ></ng-container>\r\n                      </ng-container>\r\n                    </ng-template>\r\n                  </div>\r\n                </ng-template>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- ********************************************************************************* -->\r\n            <!-- ********************************************************************************* -->\r\n            <!-- Data Grid Right Pinned Header starts here -->\r\n            <!-- ********************************************************************************* -->\r\n            <!-- ********************************************************************************* -->\r\n            <div\r\n              [style.backgroundColor]=\"headerBackgroundColor\"\r\n              cdkDropList\r\n              id=\"right-pinned-header\"\r\n              [cdkDropListConnectedTo]=\"\r\n                showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n              \"\r\n              cdkDropListOrientation=\"horizontal\"\r\n              class=\"data-grid-header right-pinned\"\r\n              (cdkDropListSorted)=\"\r\n                onSortGroup($event, 'previewRightPinnedColumns')\r\n              \"\r\n              (cdkDropListEntered)=\"onDropListEnter($event, 'right')\"\r\n              (cdkDropListDropped)=\"onDropGroup()\"\r\n              #rightPinnedHeader\r\n              class=\"right-pinned-header d-flex\"\r\n              style=\"min-width: 0.2px\"\r\n            >\r\n              <div\r\n                class=\"dragable-header\"\r\n                cdkDrag\r\n                [cdkDragData]=\"col\"\r\n                *ngFor=\"\r\n                  let col of rightPinnedColumns;\r\n                  let i = index;\r\n                  trackBy: trackById\r\n                \"\r\n              >\r\n                <ng-container\r\n                  *ngTemplateOutlet=\"\r\n                    headerCell;\r\n                    context: {\r\n                      $implicit: col,\r\n                      pinnedRight: true,\r\n                      index: i,\r\n                      section: 'right'\r\n                    }\r\n                  \"\r\n                ></ng-container>\r\n                <ng-template cdkDragPreview\r\n                  ><div class=\"p-2 border d-flex gap-2\">\r\n                    <div>\r\n                      <span\r\n                        *ngIf=\"!draggingInGroupArea\"\r\n                        [inlineSVG]=\"\r\n                          singleSpaAssetsPath +\r\n                          'data-grid/icons/arrows-move.svg'\r\n                        \"\r\n                        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                      ></span>\r\n                    </div>\r\n                    <div>{{ col.header }}</div>\r\n                  </div>\r\n                </ng-template>\r\n                <ng-template cdkDragPlaceholder>\r\n                  <div *ngIf=\"!draggingInGroupArea\">\r\n                    <div\r\n                      *ngTemplateOutlet=\"\r\n                        headerCell;\r\n                        context: {\r\n                          $implicit: col,\r\n                          index: i,\r\n                          section: 'right'\r\n                        }\r\n                      \"\r\n                    ></div>\r\n                  </div>\r\n                  <div\r\n                    *ngIf=\"draggingInGroupArea\"\r\n                    class=\"d-flex gap-2 ms-2\"\r\n                    style=\"opacity: 0.6\"\r\n                  >\r\n                    <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n                      <ng-container\r\n                        *ngFor=\"\r\n                          let child of col.children;\r\n                          let i = index;\r\n                          trackBy: trackById\r\n                        \"\r\n                      >\r\n                        <ng-container\r\n                          *ngTemplateOutlet=\"\r\n                            topGroupingRowPlaceholder;\r\n                            context: {\r\n                              $implicit: child,\r\n                              showChevron:\r\n                                col.children.length > 1 &&\r\n                                i != col.children.length - 1\r\n                            }\r\n                          \"\r\n                        ></ng-container>\r\n                      </ng-container>\r\n                    </ng-container>\r\n\r\n                    <ng-template #singleCol>\r\n                      <ng-container\r\n                        *ngTemplateOutlet=\"\r\n                          topGroupingRowPlaceholder;\r\n                          context: {\r\n                            $implicit: col,\r\n                            showChevron: col?.children?.length > 1\r\n                          }\r\n                        \"\r\n                      ></ng-container>\r\n                    </ng-template>\r\n                  </div>\r\n                </ng-template>\r\n              </div>\r\n            </div>\r\n          </div>\r\n\r\n          <!--########################################################################################################################################################################################################################### -->\r\n          <!--########################################################################################################################################################################################################################### -->\r\n          <!-- Data Grid Body starts here -->\r\n          <!--########################################################################################################################################################################################################################### -->\r\n          <!--########################################################################################################################################################################################################################### -->\r\n          <div\r\n            class=\"h-100 d-flex justify-content-center align-items-center\"\r\n            *ngIf=\"!dataSet.length && !loading\"\r\n          >\r\n            <!-- <div\r\n            [inlineSVG]=\"\r\n              singleSpaAssetsPath + 'data-grid/icons/record-not-found.svg'\r\n            \"\r\n            class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n          ></div> -->\r\n            <div>No Record Found</div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"position-absolute w-100 h-100 d-flex justify-content-center align-items-center loading-overlay\"\r\n            *ngIf=\"loading\"\r\n            style=\"\r\n              z-index: 999;\r\n              backdrop-filter: blur(1px);\r\n            \"\r\n            [style.backgroundColor]=\"bodyBackgroundColor\"\r\n          >\r\n            <div class=\"spinner-border text-primary\" role=\"status\">\r\n              <!-- <span class=\"loader\"></span> -->\r\n              <!-- <span class=\"visually-hidden\">Loading...</span> -->\r\n              <!-- </div> -->\r\n            </div>\r\n          </div>\r\n\r\n          <div\r\n            class=\"data-grid-body-wrapper position-relative d-flex\"\r\n            [style.height]=\"bodyWrapperHeight\"\r\n            style=\"overflow-y: auto; overflow-x: hidden\"\r\n            #mainScroll\r\n            (scroll)=\"onMainScroll($event)\"\r\n            [style.scrollbarWidth]=\"verticalScrollbarWidth\"\r\n          >\r\n            <!-- LEFT PINNED -->\r\n            <div\r\n              [style.height.px]=\"\r\n                !groupedColumns.length ? originalDataSet.length * rowHeight : 0\r\n              \"\r\n            ></div>\r\n            <div [class.h-100]=\"originalDataSet.length < 8\">\r\n              <div\r\n                class=\"data-grid-body left-pinned-body w-100\"\r\n                style=\"overflow-y: hidden\"\r\n                [class.border-right]=\"hasLeftPinnedColumns\"\r\n                [class.transparent-border-right]=\"!hasLeftPinnedColumns\"\r\n                [style.transform]=\"'translateY(' + translateY + 'px)'\"\r\n                [style.backgroundColor]=\"leftPinnedBackgroundColor\"\r\n                [class.h-100]=\"originalDataSet.length < 8\"\r\n               *ngIf=\"!loading\"\r\n                [@rowDynamic]=\"rowAnimation\"\r\n\r\n                \r\n              >\r\n                <ng-container\r\n                  *ngFor=\"\r\n                    let row of visibleRows;\r\n                    let i = index;\r\n                    trackBy: trackById\r\n                  \"\r\n                >\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      rowCell;\r\n                      context: {\r\n                        $implicit: row,\r\n                        columns: previewLeftPinnedColumns,\r\n                        isEven: (startIndex + i) % 2 === 0,\r\n                        isOdd: (startIndex + i) % 2 !== 0,\r\n                        isLeft: true,\r\n                        section: 'left',\r\n                        isTotalRow: false\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n                <ng-container *ngIf=\"showTotalAmountRow && originalDataSet?.length\">\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      rowCell;\r\n                      context: {\r\n                        $implicit: { __virtualIndex: 0 },\r\n                        columns: previewLeftPinnedColumns,\r\n                        isEven: false,\r\n                        isOdd: false,\r\n                        section: 'left',\r\n                        isTotalRow: true\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- CENTER -->\r\n            <div\r\n              class=\"h-100\"\r\n              [style.width.px]=\"centerPinnedHeader.clientWidth\"\r\n              [style.backgroundColor]=\"bodyBackgroundColor\"\r\n            >\r\n              <div\r\n                class=\"data-grid-body center-scrollable\"\r\n                [class.h-100]=\"originalDataSet.length < 8\"\r\n                style=\"overflow-y: hidden; overflow-x: auto\"\r\n                [style.transform]=\"'translateY(' + translateY + 'px)'\"\r\n                [style.backgroundColor]=\"bodyBackgroundColor\"\r\n                #centerScrollableBody\r\n                (scroll)=\"onCenterBodyScroll($event)\"\r\n                [style.boxShadow]=\"leftPinnedBoxshadow\"\r\n                *ngIf=\"!loading\"\r\n                [@rowDynamic]=\"rowAnimation\"\r\n              >\r\n                <ng-container\r\n                  *ngFor=\"\r\n                    let row of visibleRows;\r\n                    let i = index;\r\n                    trackBy: trackById\r\n                  \"\r\n                >\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      rowCell;\r\n                      context: {\r\n                        $implicit: row,\r\n                        columns: previewCenterColumns,\r\n                        isEven: (startIndex + i) % 2 === 0,\r\n                        isOdd: (startIndex + i) % 2 !== 0,\r\n                        section: 'center',\r\n                        isTotalRow: false\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n                <ng-container *ngIf=\"showTotalAmountRow && originalDataSet?.length\">\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      rowCell;\r\n                      context: {\r\n                        $implicit: { __virtualIndex: 0 },\r\n                        columns: previewCenterColumns,\r\n                        isEven: false,\r\n                        isOdd: false,\r\n                        section: 'center',\r\n                        isTotalRow: true\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- RIGHT PINNED -->\r\n            <div\r\n              class=\"right-pinned-body-wrapper\"\r\n              *ngIf=\"hasRightPinnedColumns\"\r\n              [class.h-100]=\"originalDataSet.length < 8\"\r\n              [style.maxWidth.px]=\"\r\n                isScrollbarVisible\r\n                  ? rightPinnedHeader.offsetWidth - 15\r\n                  : rightPinnedHeader.offsetWidth\r\n              \"\r\n              [style.backgroundColor]=\"rightPinnedBackgroundColor\"\r\n            >\r\n              <div\r\n                class=\"data-grid-body right-pinned-body w-100 h-100\"\r\n                style=\"overflow-y: hidden\"\r\n                [style.transform]=\"'translateY(' + translateY + 'px)'\"\r\n                [style.boxShadow]=\"rightPinnedBoxshadow\"\r\n                [style.backgroundColor]=\"rightPinnedBackgroundColor\"\r\n                *ngIf=\"!loading\"\r\n                [@rowDynamic]=\"rowAnimation\"\r\n              >\r\n                <ng-container\r\n                  *ngFor=\"\r\n                    let row of visibleRows;\r\n                    let i = index;\r\n                    trackBy: trackById\r\n                  \"\r\n                >\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      rowCell;\r\n                      context: {\r\n                        $implicit: row,\r\n                        columns: previewRightPinnedColumns,\r\n                        isEven: (startIndex + i) % 2 === 0,\r\n                        isOdd: (startIndex + i) % 2 !== 0,\r\n                        section: 'right',\r\n                        isTotalRow: false\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n                <ng-container *ngIf=\"showTotalAmountRow && originalDataSet?.length\">\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      rowCell;\r\n                      context: {\r\n                        $implicit: { __virtualIndex: 0 },\r\n                        columns: previewRightPinnedColumns,\r\n                        isEven: false,\r\n                        isOdd: false,\r\n                        section: 'right',\r\n                        isTotalRow: true\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </div>\r\n\r\n            <div\r\n              style=\"top: auto; left: auto\"\r\n              (click)=\"\r\n                $event.stopPropagation();\r\n                fullscreenImage = null;\r\n                cdr.detectChanges()\r\n              \"\r\n              [style.width.px]=\"dataGridContainer.offsetWidth\"\r\n              [style.height.px]=\"\r\n                dataGridContainer.offsetHeight - (footerRowHeight + 100)\r\n              \"\r\n              class=\"image-modal full-image-modal\"\r\n              *ngIf=\"fullscreenImage\"\r\n            >\r\n              <img\r\n                (click)=\"$event.stopPropagation()\"\r\n                [src]=\"fullscreenImage\"\r\n                alt=\"Fullscreen Image\"\r\n              />\r\n            </div>\r\n            <div\r\n              *ngIf=\"selectedRows.size > 0 && showTaskbar\"\r\n              class=\"taskbar w-100\"\r\n              [style.bottom.px]=\"85\"\r\n            >\r\n              <div class=\"selected-rows-action-bar\" [@slideUp]>\r\n                <span class=\"selected-count\">\r\n                  {{ selectedRows.size }} selected of\r\n                  {{\r\n                    paginationConfig.totalResults ||\r\n                      config?.paginationParams?.totalItems\r\n                  }}\r\n                  Total\r\n                </span>\r\n                <div class=\"action-buttons d-flex align-items-center\">\r\n                  <ng-container\r\n                    *ngFor=\"let action of taskbarActions; let i = index\"\r\n                  >\r\n                    <ng-container *ngIf=\"action?.has_permission\">\r\n                      <span\r\n                        class=\"action-btn verified btn {{ action }}\"\r\n                        (click)=\"onVerifyClick(action?.actionName)\"\r\n                        >{{ action?.actionName }}</span\r\n                      >\r\n                      <span\r\n                        *ngIf=\"\r\n                          taskbarActions.length > 1 &&\r\n                          i !== taskbarActions.length - 1 &&\r\n                          taskbarActions[i + 1]?.has_permission\r\n                        \"\r\n                        class=\"\"\r\n                        >|</span\r\n                      >\r\n                    </ng-container>\r\n                  </ng-container>\r\n                  <button (click)=\"clearSelectionState(tableType);selectedRows.clear();\" class=\"clear-btn ms-2\">\r\n                    <i class=\"bi bi-x-circle\"></i> Clear Selection\r\n                  </button>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <!-- Vertical Fake scroll Bar -->\r\n          <!-- <div\r\n            (scroll)=\"onMainFakeScroll($event)\"\r\n            class=\"fake-scrollbar fake-scrollbar-vertical d-none\"\r\n            [style.scrollbarWidth]=\"verticalScrollbarWidth\"\r\n            [style.top.px]=\"\r\n              showColumnsGrouping && showFilterRow\r\n                ? headerRowHeight * 3\r\n                : showColumnsGrouping || showFilterRow\r\n                ? headerRowHeight * 2\r\n                : headerRowHeight\r\n            \"\r\n            #fakeScroll\r\n            [style.height]=\"bodyWrapperHeight\"\r\n            style=\"\r\n              overflow-y: auto;\r\n              overflow-x: hidden;\r\n              width: 17px;\r\n              position: absolute;\r\n              right: 0;\r\n              background-color: f1f2f3;\r\n              z-index: 10;\r\n            \"\r\n          >\r\n            <div [style.height.px]=\"rowHeight * dataSetLength\"></div>\r\n          </div> -->\r\n        </div>\r\n\r\n        <!-- Horizintal Fake Scrollbars -->\r\n        <div\r\n          class=\"d-flex justify-content-between\"\r\n          *ngIf=\"dataSet.length && hasScroll\"\r\n        >\r\n          <div\r\n            [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n            class=\"fake-horizintal-scrollbar\"\r\n            #fakeScroll\r\n            [style.width.px]=\"leftPinnedHeader.offsetWidth\"\r\n            style=\"overflow-x: scroll\"\r\n          ></div>\r\n          <div\r\n            [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n            (scroll)=\"onCenterBodyScroll($event)\"\r\n            class=\"fake-horizintal-scrollbar\"\r\n            #horizintalFakeScroll\r\n            [style.width.px]=\"centerPinnedHeader.offsetWidth\"\r\n          >\r\n            <div [style.width.px]=\"centerPinnedHeader.scrollWidth - 10\"></div>\r\n          </div>\r\n          <div\r\n            [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\r\n            class=\"fake-horizintal-scrollbar\"\r\n            #fakeScroll\r\n            [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n            style=\"overflow-x: scroll\"\r\n          ></div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Side Menu Implemented Here -->\r\n      <div\r\n        *ngIf=\"showSideMenu\"\r\n        [style.width.px]=\"sideMenuVisible ? 280 : 30\"\r\n        class=\"right-menu h-100\"\r\n        [style.backgroundColor]=\"sidemenuBackgroundColor\"\r\n      >\r\n        <div class=\"h-100 d-flex flex-row-reverse\">\r\n          <div\r\n            style=\"width: 30px\"\r\n            class=\"d-flex flex-column align-items-center cursor-pointer\"\r\n            [class.border-start]=\"sideMenuVisible\"\r\n          >\r\n            <div\r\n              (click)=\"toggleSideMenu('cols')\"\r\n              [class.bg-fff]=\"\r\n                currentOpenedSideMenue == 'cols' && sideMenuVisible\r\n              \"\r\n              [class.border-below]=\"sideMenuVisible\"\r\n              class=\"columns-button d-flex flex-column align-items-center\"\r\n            >\r\n              <div>\r\n                <span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                ></span>\r\n              </div>\r\n              <div class=\"side-menue-text\">Columns</div>\r\n            </div>\r\n\r\n            <div\r\n              (click)=\"toggleSideMenu('filtrs')\"\r\n              [class.bg-fff]=\"\r\n                currentOpenedSideMenue == 'filtrs' && sideMenuVisible\r\n              \"\r\n              [class.border-below]=\"\r\n                sideMenuVisible && currentOpenedSideMenue == 'filtrs'\r\n              \"\r\n              class=\"columns-button d-flex flex-column align-items-center\"\r\n            >\r\n              <div>\r\n                <span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                ></span>\r\n              </div>\r\n              <div class=\"side-menue-text\">Filter</div>\r\n            </div>\r\n          </div>\r\n          <div\r\n            class=\"h-100\"\r\n            *ngIf=\"sideMenuVisible\"\r\n            [ngStyle]=\"{ width: sideMenuVisible ? '250px' : '' }\"\r\n          >\r\n            <div class=\"h-100\">\r\n              <ng-container\r\n                *ngIf=\"currentOpenedSideMenue == 'cols' && sideMenuVisible\"\r\n              >\r\n                <ng-container *ngTemplateOutlet=\"columnPannel\"></ng-container>\r\n                <!-- Column Items -->\r\n                <div class=\"column-panel-body px-3\">\r\n                  <ng-container\r\n                    *ngFor=\"let col of columns; trackBy: trackByField\"\r\n                  >\r\n                    <ng-container\r\n                      *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\r\n                    ></ng-container>\r\n                  </ng-container>\r\n                </div>\r\n                <hr />\r\n\r\n                <div class=\"side-menu-row-groups\" style=\"height: 30%\">\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"sideMenuRowGroups\"\r\n                  ></ng-container>\r\n                </div>\r\n              </ng-container>\r\n              <ng-container\r\n                *ngIf=\"currentOpenedSideMenue == 'filtrs' && sideMenuVisible\"\r\n              >\r\n                <ng-container *ngTemplateOutlet=\"sideFilters\"></ng-container>\r\n              </ng-container>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div\r\n      [style.height.px]=\"footerRowHeight\"\r\n      class=\"border-top\"\r\n      [style.backgroundColor]=\"footerRowBackgroundColor\"\r\n    >\r\n      <!-- Rows: <span class=\"fw-500 ms-1\">{{ dataSet.length }}</span> -->\r\n\r\n      <div\r\n        class=\"pagination-container\"\r\n        [style.height.px]=\"footerRowHeight\"\r\n        [style.padding.px]=\"footerPadding\"\r\n      >\r\n        <div class=\"page-size\">\r\n          <select\r\n            [(ngModel)]=\"paginationConfig.limit\"\r\n            (change)=\"onPageSizeChange()\"\r\n          >\r\n            <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">\r\n              {{ size }}\r\n            </option>\r\n          </select>\r\n          <span class=\"separator\"> per page </span>\r\n        </div>\r\n\r\n        <div class=\"page-info\">\r\n          Results:\r\n          {{ (paginationConfig.page - 1) * paginationConfig.limit + 1 }}-{{\r\n            paginationConfig.page * paginationConfig.limit <\r\n            paginationConfig.totalResults\r\n              ? paginationConfig.page * paginationConfig.limit\r\n              : paginationConfig.totalResults\r\n          }}\r\n          of\r\n          {{ paginationConfig.totalResults }}\r\n        </div>\r\n\r\n        <div class=\"page-buttons\">\r\n          <button\r\n            (click)=\"goToPage(paginationConfig.page - 1)\"\r\n            [disabled]=\"paginationConfig.page === 1\"\r\n          >\r\n            ‹\r\n          </button>\r\n\r\n          <ng-container *ngFor=\"let page of visiblePages\">\r\n            <button\r\n              *ngIf=\"page !== '...'\"\r\n              (click)=\"goToPage(page)\"\r\n              [class.active]=\"page === paginationConfig.page\"\r\n            >\r\n              {{ page }}\r\n            </button>\r\n            <span *ngIf=\"page === '...'\">...</span>\r\n          </ng-container>\r\n\r\n          <button\r\n            (click)=\"goToPage(paginationConfig.page + 1)\"\r\n            [disabled]=\"paginationConfig.page === paginationConfig.totalResults\"\r\n          >\r\n            ›\r\n          </button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- Header Cell Template -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n\r\n<ng-template\r\n  #headerCell\r\n  let-col\r\n  let-pinnedRight=\"pinnedRight\"\r\n  let-i=\"index\"\r\n  let-sections=\"section\"\r\n  let-calledFromNestedPlaceholder=\"calledFromNestedPlaceholder\"\r\n>\r\n  <div>\r\n    <!-- Group Header -->\r\n    <ng-container *ngIf=\"col.children?.length > 0; else flatHeader\">\r\n      <div cdkDroplistGroup class=\"group-column-wrapper\">\r\n        <!-- Parent Header -->\r\n        <div\r\n          *ngIf=\"shouldTheGroupHeaderShow(col)\"\r\n          class=\"header-cell group-header\"\r\n          [style.height.px]=\"headerRowHeight\"\r\n          [style.min-height.px]=\"headerRowHeight\"\r\n          [style.max-height.px]=\"headerRowHeight\"\r\n          [class.border-right]=\"showVerticalBorder\"\r\n          [style.gridColumn]=\"'span ' + col.children.length\"\r\n          [style.fontWeight]=\"headerFontWeight\"\r\n          [class.flex-row-reverse]=\"pinnedRight\"\r\n          [class.justify-content-end]=\"pinnedRight\"\r\n          style=\"grid-row: 1\"\r\n        >\r\n          <div\r\n            class=\"group-header-content\"\r\n            [title]=\"col.header\"\r\n            [class.ms-2]=\"pinnedRight\"\r\n          >\r\n            {{ col.header }}\r\n          </div>\r\n          <div\r\n            class=\"resize-handle\"\r\n            (dblclick)=\"autosizeColumn(col.children)\"\r\n            (mousedown)=\"\r\n              $event.stopPropagation(); onResizeGroup($event, col, pinnedRight)\r\n            \"\r\n          >\r\n            <span\r\n              [inlineSVG]=\"\r\n                singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n              \"\r\n              class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n            ></span>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Child Headers and Filters -->\r\n\r\n        <div\r\n          class=\"d-flex\"\r\n          cdkDropList\r\n          cdkDropListOrientation=\"horizontal\"\r\n          [cdkDropListData]=\"col.children\"\r\n          (cdkDropListSorted)=\"onChildDroplistSorted($event, sections)\"\r\n          (cdkDropListDropped)=\"onChildDroplistDroped($event)\"\r\n          [cdkDropListSortingDisabled]=\"false\"\r\n          [cdkDropListConnectedTo]=\"\r\n            showRowsGrouping ? ['rows-grouping-top-container'] : []\r\n          \"\r\n        >\r\n          <div\r\n            cdkDrag\r\n            [cdkDragData]=\"child\"\r\n            *ngFor=\"let child of col.children; let i = index\"\r\n          >\r\n            <!-- Child Header -->\r\n            <ng-container *ngIf=\"child.is_visible && !child['isRowGrouped']\">\r\n              <div\r\n                cdkDragHandle\r\n                class=\"header-cell one-row-header-cells cursor-pointer\"\r\n                [class.border-right]=\"showVerticalBorder\"\r\n                [attr.field]=\"child.field\"\r\n                [style.width.px]=\"child.width\"\r\n                [style.min-width.px]=\"child.width\"\r\n                [style.min-height.px]=\"headerRowHeight\"\r\n                [style.max-height.px]=\"headerRowHeight\"\r\n                [style.fontWeight]=\"headerFontWeight\"\r\n                style=\"grid-row: 2\"\r\n                [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(child)\"\r\n              >\r\n                <div\r\n                  class=\"d-flex justify-content-between h-100 align-items-center w-100\"\r\n                >\r\n                  <div\r\n                    class=\"d-flex justify-content-between align-items-center w-100\"\r\n                    [class.flex-row-reverse]=\"pinnedRight\"\r\n                  >\r\n                    <div\r\n                      class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\r\n                      [title]=\"col.header\"\r\n                      [class.w-100]=\"pinnedRight\"\r\n                    >\r\n                      <div\r\n                        class=\"text-ellipsis h-100\"\r\n                        [class.editable-header]=\"child?.is_editable\"\r\n                        (click)=\"\r\n                          openThreeDotsMenu($event, child);\r\n                          openFilteronThreeDotsClick(child)\r\n                        \"\r\n                      >\r\n                        {{ child.header }}\r\n                      </div>\r\n                    </div>\r\n\r\n                    <div\r\n                      class=\"position-relative d-flex\"\r\n                      [class.flex-row-reverse]=\"pinnedRight\"\r\n                    >\r\n                      <div\r\n                        [class.me-2]=\"pinnedRight\"\r\n                        class=\"d-flex align-items-center\"\r\n                        *ngIf=\"child.pinned\"\r\n                      >\r\n                        <span\r\n                          [inlineSVG]=\"\r\n                            singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n                          \"\r\n                          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                        ></span>\r\n                      </div>\r\n                      <div\r\n                        class=\"three-dots p-1\"\r\n                        (click)=\"\r\n                          openThreeDotsMenu($event, child);\r\n                          isThreeDotsFilterOpen = false\r\n                        \"\r\n                        style=\"cursor: pointer\"\r\n                      >\r\n                        <span\r\n                          [inlineSVG]=\"\r\n                            singleSpaAssetsPath +\r\n                            'data-grid/icons/three-dots-vertical.svg'\r\n                          \"\r\n                          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                        ></span>\r\n                      </div>\r\n\r\n                      <!-- Only show menu if this column is active -->\r\n                      <div\r\n                        class=\"position-absolute\"\r\n                        *ngIf=\"activeCol === child\"\r\n                        style=\"top: -50%; z-index: 21\"\r\n                        [style.left.px]=\"\r\n                          -(!child?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n                        \"\r\n                        [style.top.px]=\"\r\n                          isThreeDotsFilterOpen\r\n                            ? showFilterRow || showColumnsGrouping\r\n                              ? headerRowHeight * 2 - 10\r\n                              : headerRowHeight - 10\r\n                            : 0\r\n                        \"\r\n                      >\r\n                        <ng-container\r\n                          *ngTemplateOutlet=\"\r\n                            columnMenu;\r\n                            context: {\r\n                              col: child,\r\n                              isNestedTable: false,\r\n                              section: sections\r\n                            }\r\n                          \"\r\n                        ></ng-container>\r\n                      </div>\r\n\r\n                      <div\r\n                        class=\"resize-handle\"\r\n                        (dblclick)=\"autosizeColumn(child)\"\r\n                        (mousedown)=\"\r\n                          $event.stopPropagation();\r\n                          onResizeColumn($event, child)\r\n                        \"\r\n                      >\r\n                        <span\r\n                          [inlineSVG]=\"\r\n                            singleSpaAssetsPath +\r\n                            'data-grid/icons/resize-handle.svg'\r\n                          \"\r\n                          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                        ></span>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Filter Cell -->\r\n              <div\r\n                *ngIf=\"showFilterRow\"\r\n                [style.backgroundColor]=\"headerBackgroundColor\"\r\n                class=\"header-cell filter-cell\"\r\n                [class.border-right]=\"showVerticalBorder\"\r\n                [attr.field]=\"child.field\"\r\n                [style.width.px]=\"child.width\"\r\n                [style.min-width.px]=\"child.width\"\r\n                [style.height.px]=\"headerRowHeight\"\r\n                [style.min-height.px]=\"headerRowHeight\"\r\n                [style.max-height.px]=\"headerRowHeight\"\r\n                [class.border-right]=\"showVerticalBorder\"\r\n                style=\"grid-row: 3\"\r\n              >\r\n                <div\r\n                  class=\"header-cell filter-cell\"\r\n                  [attr.field]=\"col.field\"\r\n                  [style.width.px]=\"col.width\"\r\n                  [style.min-width.px]=\"col.width\"\r\n                  [style.height.px]=\"headerRowHeight\"\r\n                  [style.min-height.px]=\"headerRowHeight\"\r\n                  [style.max-height.px]=\"headerRowHeight\"\r\n                >\r\n                  <input\r\n                    type=\"text\"\r\n                    class=\"form-control form-control-sm\"\r\n                    placeholder=\"Filter\"\r\n                    [(ngModel)]=\"child.filterValue\"\r\n                    (ngModelChange)=\"onFilterChange(child)\"\r\n                    (paste)=\"onFilterChange(child); applyDropdownFilter()\"\r\n                    [readonly]=\"\r\n                      child?.type == 'dropdown' || child?.type == 'image'\r\n                    \"\r\n                    [class.disabled-search-input]=\"\r\n                      child?.type == 'dropdown' || child?.type == 'image'\r\n                    \"\r\n                    (click)=\"\r\n                      $event.stopPropagation();\r\n                      openFilterFromDisabledSearchedInput(child)\r\n                    \"\r\n                    (keydown.enter)=\"applyDropdownFilter()\"\r\n                    (mousedown)=\"$event.stopPropagation()\"\r\n                  />\r\n                  <span\r\n                    class=\"filter-icon-wrapper\"\r\n                    (click)=\"$event.stopPropagation(); openFilter(child)\"\r\n                    [class.filter-applied]=\"isFilterAppliedOnColumn(child)\"\r\n                    [class.pe-none]=\"child?.type == 'image'\"\r\n                    ><span\r\n                      [inlineSVG]=\"\r\n                        singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\r\n                      \"\r\n                      class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                    ></span>\r\n                    <span\r\n                      *ngIf=\"isFilterAppliedOnColumn(child)\"\r\n                      style=\"\r\n                        width: 7px;\r\n                        height: 7px;\r\n                        box-shadow: 0px 0px 3px #7486ff;\r\n                        background-color: rgb(0 163 233);\r\n                        position: absolute;\r\n                        right: 4px;\r\n                        top: 12px;\r\n                      \"\r\n                      class=\"rounded-circle d-block\"\r\n                    ></span\r\n                  ></span>\r\n\r\n                  <div\r\n                    class=\"position-absolute filter-row-filter-wrapper\"\r\n                    *ngIf=\"activeFilterCell?.field == child?.field\"\r\n                    style=\"top: 100%; right: 0; z-index: 99\"\r\n                    [style.left.px]=\"\r\n                      child?.pinned ? 0 : -centerPinnedHeader.scrollLeft\r\n                    \"\r\n                  >\r\n                    <ng-container\r\n                      *ngTemplateOutlet=\"filterMenu; context: { col: child }\"\r\n                    ></ng-container>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </ng-container>\r\n            <ng-template cdkDragPreview\r\n              ><div class=\"p-2 border d-flex gap-2\">\r\n                <div\r\n                  *ngIf=\"\r\n                    !draggingInGroupArea ||\r\n                    (child.is_groupable && draggingInGroupArea)\r\n                  \"\r\n                >\r\n                  <span\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                  ></span>\r\n                </div>\r\n                <div *ngIf=\"draggingInGroupArea && !child.is_groupable\">\r\n                  <span\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/ban.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                  ></span>\r\n                </div>\r\n                <div>{{ child.header }}</div>\r\n              </div>\r\n            </ng-template>\r\n            <ng-template cdkDragPlaceholder>\r\n              <div *ngIf=\"!draggingInGroupArea\" class=\"position-relative\">\r\n                <div\r\n                  *ngTemplateOutlet=\"\r\n                  childHeaderPlaceholder;\r\n                  context: {\r\n                    $implicit: child,\r\n                    index: i,\r\n                    sections: sections,\r\n                    calledFromNestedPlaceholder: true,\r\n                  }\r\n                \"\r\n                ></div>\r\n              </div>\r\n              <div\r\n                *ngIf=\"draggingInGroupArea && child?.is_groupable\"\r\n                class=\"d-flex gap-2 ms-2\"\r\n                style=\"opacity: 0.6\"\r\n              >\r\n                <ng-container\r\n                  *ngTemplateOutlet=\"\r\n                    topGroupingRowPlaceholder;\r\n                    context: {\r\n                      $implicit: child,\r\n                      showChevron: false,\r\n                      pinnedRight: pinnedRight,\r\n                      sections: sections,\r\n                      index: i\r\n                    }\r\n                  \"\r\n                ></ng-container>\r\n              </div>\r\n            </ng-template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n\r\n    <!-- Flat Header || Single Header Cell-->\r\n    <ng-template #flatHeader>\r\n      <div\r\n        class=\"group-column-wrapper\"\r\n        *ngIf=\"col.is_visible && !col['isRowGrouped']\"\r\n      >\r\n        <!-- Full-height Header Cell (spans 2 rows visually) -->\r\n        <div\r\n          class=\"header-cell one-row-header-cells\"\r\n          [attr.field]=\"col.field\"\r\n          [style.width.px]=\"col.width\"\r\n          [style.min-width.px]=\"col.width\"\r\n          [class.border-right]=\"showVerticalBorder\"\r\n          [style.min-height.px]=\"\r\n            showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\r\n          \"\r\n          [style.height.px]=\"\r\n            showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\r\n          \"\r\n          [style.fontWeight]=\"headerFontWeight\"\r\n          style=\"grid-row: 1 / span 2\"\r\n        >\r\n          <div\r\n            class=\"d-flex justify-content-between h-100 align-items-center w-100\"\r\n          >\r\n            <div\r\n              class=\"d-flex justify-content-between w-100 align-items-center\"\r\n              [class.flex-row-reverse]=\"pinnedRight\"\r\n            >\r\n              <div\r\n                class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\r\n                [title]=\"col.header\"\r\n              >\r\n                <div\r\n                  class=\"text-ellipsis h-100 cursor-pointer\"\r\n                  [class.editable-header]=\"col?.is_editable\"\r\n                  [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(col)\"\r\n                  (click)=\"\r\n                    openThreeDotsMenu($event, col);\r\n                    openFilteronThreeDotsClick(col)\r\n                  \"\r\n                >\r\n                  {{ col.header }}\r\n                </div>\r\n              </div>\r\n\r\n              <div\r\n                class=\"position-relative d-flex\"\r\n                [class.flex-row-reverse]=\"pinnedRight\"\r\n              >\r\n                <div\r\n                  [class.me-2]=\"pinnedRight\"\r\n                  class=\"d-flex align-items-center\"\r\n                  *ngIf=\"col?.pinned\"\r\n                >\r\n                  <span\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                  ></span>\r\n                </div>\r\n                <div\r\n                  [class.me-2]=\"col.order_by\"\r\n                  class=\"d-flex align-items-center\"\r\n                  *ngIf=\"sortingConfig?.field == col.field\"\r\n                >\r\n                  <!-- Ascending Sort Icon -->\r\n                  <span\r\n                    *ngIf=\"sortingConfig?.order_by == 'asc'\"\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/sort-asc.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center mt-1 cursor-pointer\"\r\n                    (click)=\"sortDesc(col)\"\r\n                    [class.active]=\"sortingConfig?.order_by === 'asc'\"\r\n                  ></span>\r\n\r\n                  <!-- Descending Sort Icon -->\r\n                  <span\r\n                    *ngIf=\"sortingConfig?.order_by == 'desc'\"\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/sort-desc.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center mt-1 cursor-pointer\"\r\n                    (click)=\"sortAsc(col)\"\r\n                    [class.active]=\"sortingConfig?.order_by === 'desc'\"\r\n                  ></span>\r\n                </div>\r\n                <div\r\n                  class=\"three-dots p-1\"\r\n                  (click)=\"\r\n                    openThreeDotsMenu($event, col);\r\n                    isThreeDotsFilterOpen = false\r\n                  \"\r\n                  style=\"cursor: pointer\"\r\n                >\r\n                  <span\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath +\r\n                      'data-grid/icons/three-dots-vertical.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                  ></span>\r\n                </div>\r\n\r\n                <!-- Only show menu if this column is active -->\r\n                <div\r\n                  class=\"position-absolute\"\r\n                  *ngIf=\"activeCol === col\"\r\n                  style=\"top: -50%; z-index: 21\"\r\n                  [style.left.px]=\"\r\n                    -(!col?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n                  \"\r\n                  [style.top.px]=\"\r\n                    isThreeDotsFilterOpen\r\n                      ? showFilterRow || showColumnsGrouping\r\n                        ? headerRowHeight * 2 - 10\r\n                        : headerRowHeight - 10\r\n                      : 0\r\n                  \"\r\n                >\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      columnMenu;\r\n                      context: {\r\n                        col: col,\r\n                        isNestedTable: false,\r\n                        section: sections\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </div>\r\n\r\n                <div\r\n                  class=\"resize-handle\"\r\n                  [class.w-100]=\"col.pinned == 'right'\"\r\n                  (dblclick)=\"autosizeColumn(col)\"\r\n                  (mousedown)=\"\r\n                    $event.stopPropagation(); onResizeColumn($event, col)\r\n                  \"\r\n                >\r\n                  <span\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n                    \"\r\n                    class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                  ></span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Filter Cell -->\r\n        <div\r\n          *ngIf=\"showFilterRow\"\r\n          [style.backgroundColor]=\"headerBackgroundColor\"\r\n          class=\"header-cell filter-cell\"\r\n          [class.border-right]=\"showVerticalBorder\"\r\n          [attr.field]=\"col.field\"\r\n          [style.width.px]=\"col.width\"\r\n          [style.min-width.px]=\"col.width\"\r\n          [style.height.px]=\"headerRowHeight\"\r\n          [style.min-height.px]=\"headerRowHeight\"\r\n          [style.max-height.px]=\"headerRowHeight\"\r\n        >\r\n          <input\r\n            type=\"text\"\r\n            class=\"form-control form-control-sm\"\r\n            placeholder=\"Filter\"\r\n            [(ngModel)]=\"col.filterValue\"\r\n            (ngModelChange)=\"onFilterChange(col)\"\r\n            [readonly]=\"col?.type == 'dropdown' || col?.type == 'image'\"\r\n            [class.disabled-search-input]=\"\r\n              col?.type == 'dropdown' || col?.type == 'image'\r\n            \"\r\n            (paste)=\"onPasteInFilterRowSearch($event, col)\"\r\n            (click)=\"\r\n              $event.stopPropagation(); openFilterFromDisabledSearchedInput(col)\r\n            \"\r\n            (keydown.enter)=\"applyDropdownFilter()\"\r\n            (mousedown)=\"$event.stopPropagation()\"\r\n          />\r\n          <span\r\n            class=\"filter-icon-wrapper\"\r\n            (click)=\"$event.stopPropagation(); openFilter(col)\"\r\n            [class.filter-applied]=\"isFilterAppliedOnColumn(col)\"\r\n            [class.pe-none]=\"col?.type == 'image'\"\r\n            ><span\r\n              [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n              class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n            ></span>\r\n            <span\r\n              *ngIf=\"isFilterAppliedOnColumn(col)\"\r\n              style=\"\r\n                width: 7px;\r\n                height: 7px;\r\n                box-shadow: 0px 0px 3px #7486ff;\r\n                background-color: rgb(0 163 233);\r\n                position: absolute;\r\n                right: 4px;\r\n                top: 12px;\r\n              \"\r\n              class=\"rounded-circle d-block\"\r\n            ></span\r\n          ></span>\r\n\r\n          <div\r\n            class=\"position-absolute filter-row-filter-wrapper\"\r\n            *ngIf=\"activeFilterCell === col\"\r\n            style=\"top: 100%; right: 0; z-index: 99\"\r\n            [style.left.px]=\"col?.pinned ? 0 : -centerPinnedHeader.scrollLeft\"\r\n          >\r\n            <ng-container\r\n              *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\r\n            ></ng-container>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-template>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- Body Cell Template -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n<ng-template\r\n  #rowCell\r\n  let-row\r\n  let-columns=\"columns\"\r\n  let-isEven=\"isEven\"\r\n  let-isOdd=\"isOdd\"\r\n  let-isLeftSection=\"isLeft\"\r\n  let-section=\"section\"\r\n  let-rowIndex=\"rowIndex\"\r\n  let-isTotalRow=\"isTotalRow\"\r\n>\r\n  <!-- Check if row is a group -->\r\n  <ng-container\r\n    *ngTemplateOutlet=\"groupRowTemplate; context: { $implicit: row, depth: 0 }\"\r\n  ></ng-container>\r\n  <ng-template #groupRowTemplate let-row let-depth=\"depth\">\r\n    <ng-container *ngIf=\"row.isGroup; else regularRow\">\r\n      <!-- Group Header -->\r\n      <div\r\n        class=\"group-header-row d-flex align-items-center\"\r\n        [style.height.px]=\"rowHeight\"\r\n        [class.border-below]=\"section !== 'center'\"\r\n        [style.width]=\"\r\n          section === 'center'\r\n            ? (centerScrollableBody?.nativeElement?.scrollWidth ?? 0) + 'px'\r\n            : '100%'\r\n        \"\r\n      >\r\n        <div\r\n          *ngIf=\"section == 'left'\"\r\n          class=\"h-100 d-flex\"\r\n          [style.width.px]=\"leftPinnedHeader.offsetWidth - 1\"\r\n          [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n        >\r\n          <div\r\n            *ngIf=\"showSerialNumber\"\r\n            style=\"width: 50px\"\r\n            class=\"d-flex align-items-center h-100 border-right justify-content-end pe-2 s-no\"\r\n            [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n            [style.width.px]=\"55\"\r\n            [style.cursor]=\"\r\n              'url(' +\r\n              singleSpaAssetsPath +\r\n              'data-grid/icons/arrow-right.svg), auto'\r\n            \"\r\n            (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\r\n            (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\r\n            [style.color]=\"checkboxesColor\"\r\n          >\r\n            {{ getStartIndex() + (row.__virtualIndex - 1) || \"\" }}\r\n          </div>\r\n          <div\r\n            style=\"width: 50px\"\r\n            class=\"d-flex align-items-center justify-content-center h-100 border-right\"\r\n            [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n            [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n            [class.left-selection-border]=\"\r\n              rowSelectedIndexes.has(row.__virtualIndex)\r\n            \"\r\n            [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n            [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n            [style.color]=\"checkboxesColor\"\r\n          >\r\n            <input style=\"width: 16px; height: 16px\" type=\"checkbox\" />\r\n          </div>\r\n        </div>\r\n\r\n        <div\r\n          *ngIf=\"section == 'center'\"\r\n          [style.width.px]=\"centerPinnedHeader.scrollWidth\"\r\n          [style.minWidth.px]=\"centerPinnedHeader.scrollWidth\"\r\n          class=\"d-flex align-items-center ps-2 h-100 border-below\"\r\n          [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n          [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n          [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n        >\r\n          <div\r\n            class=\"d-flex align-items-center justify-content-between\"\r\n            [style.paddingLeft.px]=\"depth > 0 ? depth * 30 : 0\"\r\n          >\r\n            <span class=\"me-2 filter-icon-wrapper\" (click)=\"toggleExpand(row)\">\r\n              <span\r\n                class=\"data-grid-svg-icon\"\r\n                [inlineSVG]=\"\r\n                  row.isExpand\r\n                    ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n                    : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n                \"\r\n              ></span>\r\n            </span>\r\n            <strong (click)=\"toggleExpand(row)\" class=\"cursor-pointer\">\r\n              {{ row.groupValue }} ({{ countLeafRows(row) }})\r\n            </strong>\r\n          </div>\r\n        </div>\r\n\r\n        <div\r\n          *ngIf=\"section == 'right'\"\r\n          [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n          [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n          [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n          [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n        ></div>\r\n      </div>\r\n\r\n      <!-- Recursive Children -->\r\n      <div class=\"group-children\" *ngIf=\"row.isExpand\" [@slideToggle]>\r\n        <ng-container\r\n          *ngFor=\"let child of row.children; let i = index; trackBy: trackById\"\r\n        >\r\n          <ng-container *ngIf=\"child.isGroup; else dataRow\">\r\n            <!-- Recursive call for nested group -->\r\n            <ng-container\r\n              *ngTemplateOutlet=\"\r\n                groupRowTemplate;\r\n                context: { $implicit: child, depth: depth + 1 }\r\n              \"\r\n            ></ng-container>\r\n          </ng-container>\r\n\r\n          <ng-template #dataRow>\r\n            <!-- Regular data row -->\r\n            <ng-container\r\n              *ngTemplateOutlet=\"\r\n                rowCell;\r\n                context: {\r\n                  $implicit: child,\r\n                  columns: columns,\r\n                  isEven: i % 2 === 0,\r\n                  isOdd: i % 2 !== 0,\r\n                  isLeft: isLeftSection,\r\n                  section: section,\r\n                  isTotalRow: isTotalRow\r\n                }\r\n              \"\r\n            ></ng-container>\r\n          </ng-template>\r\n        </ng-container>\r\n      </div>\r\n    </ng-container>\r\n  </ng-template>\r\n\r\n  <!-- Regular row (not a group) -->\r\n  <ng-template #regularRow>\r\n    <div\r\n      class=\"d-flex\"\r\n      [style.height.px]=\"rowHeight\"\r\n      [style.minHeight.px]=\"rowHeight\"\r\n      [style.maxHeight.px]=\"rowHeight\"\r\n    >\r\n      <span\r\n        class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\r\n        style=\"min-width: 30px; height: 100%\"\r\n        *ngIf=\"\r\n          section == 'center' && (gridType === 'Assets' || gridType === 'Tasks')\r\n        \"\r\n        [ngStyle]=\"{\r\n          'background-color': rowSelectedIndexes.has(row.__virtualIndex)\r\n            ? null\r\n            : getBackgroundColor(row, isEven, section)\r\n        }\"\r\n        [class.selected-cell]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n        [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n        [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n      >\r\n        <span\r\n          (click)=\"toggleDetailRowExpand(row)\"\r\n          *ngIf=\"row?.detail?.result?.length || gridType === 'Tasks'\"\r\n          class=\"data-grid-svg-icon filter-icon-wrapper\"\r\n          [inlineSVG]=\"\r\n            isDetailsExpanded(row)\r\n              ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n              : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n          \"\r\n        ></span>\r\n      </span>\r\n      <div\r\n        [style.min-width.px]=\"\r\n          section == 'center' && groupedColumns?.length ? groupBoxPadding : 0\r\n        \"\r\n        [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n        [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n        [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n        (contextmenu)=\"onRightClick($event, row)\"\r\n        [style.height.px]=\"rowHeight\"\r\n        class=\"data-grid-row h-100\"\r\n        [class.even-row]=\"isEven\"\r\n        [class.odd-row]=\"isOdd\"\r\n        [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\r\n        (mouseenter)=\"onRowHover(row)\"\r\n        (mouseleave)=\"onRowLeave()\"\r\n        [ngStyle]=\"{\r\n          'background-color': getBackgroundColor(row, isEven, section)\r\n        }\"\r\n        [style.minHeight.px]=\"rowHeight\"\r\n        [style.maxHeight.px]=\"rowHeight\"\r\n      ></div>\r\n      <div\r\n        (contextmenu)=\"onRightClick($event, row)\"\r\n        [style.height.px]=\"rowHeight\"\r\n        class=\"data-grid-row\"\r\n        [class.even-row]=\"isEven\"\r\n        [class.odd-row]=\"isOdd\"\r\n        [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\r\n        (mouseenter)=\"onRowHover(row)\"\r\n        (mouseleave)=\"onRowLeave()\"\r\n        [ngStyle]=\"{\r\n          'background-color': getBackgroundColor(row, isEven, section)\r\n        }\"\r\n      >\r\n        <div\r\n          [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n          class=\"select-all-checkbox-cell justify-content-end pe-2 s-no\"\r\n          [style.width.px]=\"55\"\r\n          *ngIf=\"isLeftSection && showSerialNumber\"\r\n          [style.cursor]=\"\r\n            'url(' +\r\n            singleSpaAssetsPath +\r\n            'data-grid/icons/arrow-right.svg), auto'\r\n          \"\r\n          (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\r\n          (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\r\n          [style.color]=\"checkboxesColor\"\r\n        >\r\n          {{ getStartIndex() + (row.__virtualIndex - 1) }}\r\n        </div>\r\n        <div\r\n        class=\"border-below\"\r\n          [style.backgroundColor]=\"\r\n            rowSelectedIndexes.has(row.__virtualIndex)\r\n              ? selectedRowsBackgroundColor\r\n              : checkboxesBackgroundColor\r\n          \"\r\n          class=\"select-all-checkbox-cell\"\r\n          *ngIf=\"isLeftSection && showCheckboxes\"\r\n          [class.left-selection-border]=\"\r\n            rowSelectedIndexes.has(row.__virtualIndex)\r\n          \"\r\n          [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\r\n          [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\r\n          [style.minHeight.px]=\"rowHeight - 1\"\r\n          [style.maxHeight.px]=\"rowHeight\"\r\n        >\r\n          <input\r\n            *ngIf=\"hasAnyVisibleColumn\"\r\n            type=\"checkbox\"\r\n            [checked]=\"isRowSelected(row)\"\r\n            (change)=\"toggleRowSelection(row)\"\r\n          />\r\n        </div>\r\n\r\n        <!-- Render all columns -->\r\n        <ng-container\r\n          *ngFor=\"\r\n            let col of columns;\r\n            trackBy: trackByField;\r\n            let colIndex = index\r\n          \"\r\n        >\r\n          <ng-container *ngIf=\"col.children?.length > 0; else flatColumn\">\r\n            <ng-container\r\n              *ngFor=\"\r\n                let child of col.children;\r\n                trackBy: trackByField;\r\n                let subColIndex = index\r\n              \"\r\n            >\r\n              <ng-container *ngIf=\"child?.is_visible && !child?.isRowGrouped\">\r\n                <ng-container\r\n                  *ngTemplateOutlet=\"\r\n                    cellTemplate;\r\n                    context: {\r\n                      col: child,\r\n                      row: row,\r\n                      rowIndex: rowIndex,\r\n                      colIndex: colIndex,\r\n                      subColIndex: subColIndex,\r\n                      section: section,\r\n                      isTotalRow: isTotalRow\r\n                    }\r\n                  \"\r\n                ></ng-container>\r\n              </ng-container>\r\n            </ng-container>\r\n          </ng-container>\r\n\r\n          <ng-template #flatColumn>\r\n            <ng-container *ngIf=\"col?.is_visible && !col?.isRowGrouped\">\r\n              <ng-container\r\n                *ngTemplateOutlet=\"\r\n                  cellTemplate;\r\n                  context: {\r\n                    col: col,\r\n                    row: row,\r\n                    rowIndex: rowIndex,\r\n                    colIndex: colIndex,\r\n                    subColIndex: null,\r\n                    section: section,\r\n                    isTotalRow: isTotalRow\r\n                  }\r\n                \"\r\n              ></ng-container>\r\n            </ng-container>\r\n          </ng-template>\r\n        </ng-container>\r\n      </div>\r\n    </div>\r\n\r\n    <div\r\n      [@slideToggle]\r\n      *ngIf=\"section === 'left' && isDetailsExpanded(row)\"\r\n      class=\"accordion-details\"\r\n      style=\"max-height: 350px; overflow: hidden\"\r\n      [style.maxHeight.px]=\"hasHorizontalScroll ? 339 : 341\"\r\n    >\r\n      <ng-container\r\n        *ngTemplateOutlet=\"\r\n          leftRightNestedPlaceholder;\r\n          context: { $implicit: row }\r\n        \"\r\n      >\r\n      </ng-container>\r\n    </div>\r\n\r\n    <div\r\n      [@slideToggle]\r\n      *ngIf=\"section === 'center' && isDetailsExpanded(row)\"\r\n      class=\"accordion-details center-section\"\r\n      style=\"\r\n        max-height: 350px;\r\n        overflow-y: hidden;\r\n        overflow-x: auto;\r\n        scrollbar-width: thin;\r\n      \"\r\n      #nestedTable\r\n      [style.width]=\"\r\n        hasRightPinnedColumns\r\n          ? '100%'\r\n          : hasVerticalScroll\r\n          ? 'calc(100% - 12px)'\r\n          : '100%'\r\n      \"\r\n    >\r\n      <ng-container *ngIf=\"gridType == 'Assets'\">\r\n        <ng-container\r\n          *ngTemplateOutlet=\"nestedTableTemplate; context: { $implicit: row }\"\r\n        ></ng-container>\r\n      </ng-container>\r\n      <ng-container *ngIf=\"gridType == 'Tasks'\">\r\n        <ng-container\r\n          *ngTemplateOutlet=\"\r\n            taskManagementTemplate;\r\n            context: { taskDetails: row }\r\n          \"\r\n        ></ng-container>\r\n      </ng-container>\r\n    </div>\r\n\r\n    <div\r\n      [@slideToggle]\r\n      *ngIf=\"section === 'right' && isDetailsExpanded(row)\"\r\n      class=\"accordion-details\"\r\n      style=\"max-height: 350px; overflow: hidden\"\r\n      [style.maxHeight.px]=\"hasHorizontalScroll ? 339 : 341\"\r\n    >\r\n      <ng-container\r\n        *ngTemplateOutlet=\"\r\n          leftRightNestedPlaceholder;\r\n          context: { $implicit: row }\r\n        \"\r\n      >\r\n      </ng-container>\r\n    </div>\r\n  </ng-template>\r\n</ng-template>\r\n\r\n<!-- Actual Cell is Here -->\r\n<ng-template\r\n  #cellTemplate\r\n  let-col=\"col\"\r\n  let-row=\"row\"\r\n  let-section=\"section\"\r\n  let-subColIndex=\"subColIndex\"\r\n  let-rowIndex=\"rowIndex\"\r\n  let-colIndex=\"colIndex\"\r\n  let-isTotalRow=\"isTotalRow\"\r\n>\r\n  <div\r\n    #cellContainer\r\n    (click)=\"\r\n      editingKey = ''; setActiveCell(row, col); collapseAllExpandedCells()\r\n    \"\r\n    [style.fontWeight]=\"bodyFontWeight\"\r\n    [class.border-right]=\"showVerticalBorder\"\r\n    class=\"cell overflow-visible position-relative data-grid-cell\"\r\n    [attr.field]=\"col.field\"\r\n    [style.width.px]=\"col.width\"\r\n    [style.min-width.px]=\"col.width\"\r\n    [style.fontSize.px]=\"bodyTextFontsSize\"\r\n    [style.minHeight.px]=\"rowHeight\"\r\n    [style.maxHeight.px]=\"rowHeight\"\r\n    [class.active-cell]=\"\r\n      isActiveCell(row, col) && !isEditing(row, col) && selectedKeys.size == 1\r\n    \"\r\n    (dblclick)=\"\r\n      $event.stopPropagation();\r\n      $event.preventDefault();\r\n      enableEdit(row, col, false, cellContainer)\r\n    \"\r\n    [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n    [class.first-row-selected]=\"firstSelectedRow === row?.__virtualIndex\"\r\n    [class.last-row-selected]=\"lastSelectedRow === row?.__virtualIndex\"\r\n    tabindex=\"-1\"\r\n    (keydown.enter)=\"$event.preventDefault(); enableEdit(row, col)\"\r\n    (mousedown)=\"\r\n      startSelection(\r\n        row.__virtualIndex,\r\n        colIndex,\r\n        subColIndex ?? 0,\r\n        col.field,\r\n        $event,\r\n        section\r\n      )\r\n    \"\r\n    (mouseenter)=\"\r\n      extendSelection(\r\n        row.__virtualIndex,\r\n        colIndex,\r\n        subColIndex ?? 0,\r\n        col.field,\r\n        $event,\r\n        section\r\n      )\r\n    \"\r\n    (mouseup)=\"endSelection()\"\r\n    [class.selected-cell]=\"\r\n      isSelected(\r\n        row.__virtualIndex,\r\n        colIndex,\r\n        subColIndex ?? 0,\r\n        col.field,\r\n        section\r\n      )\r\n    \"\r\n    [class.top-border]=\"\r\n      isTopBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.bottom-border]=\"\r\n      isBottomBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.left-border]=\"\r\n      isLeftBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.right-border]=\"\r\n      isRightBorder(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.top-left-corner]=\"\r\n      isTopLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.top-right-corner]=\"\r\n      isTopRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.bottom-left-corner]=\"\r\n      isBottomLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n    [class.bottom-right-corner]=\"\r\n      isBottomRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\r\n    \"\r\n  >\r\n    <!--  (mousedown)=\"startSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\r\n  (mouseenter)=\"extendSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\r\n  (mouseup)=\"endSelection()\"\r\n  [class.selected-cell]=\"isSelected(row.__virtualIndex, colIndex,  subColIndex ?? 0, col.field)\" -->\r\n    <div\r\n      class=\"table-cell\"\r\n      [class.active-for-editing]=\"\r\n        isEditing(row, col) &&\r\n        (getNestedValue(row, col.field)?.length === undefined ||\r\n          getNestedValue(row, col.field)?.length <= 50)\r\n      \"\r\n    >\r\n      <div\r\n        (click)=\"$event.stopPropagation()\"\r\n        *ngIf=\"\r\n          isEditing(row, col) &&\r\n            (getNestedValue(row, col.field)?.length === undefined ||\r\n              (getNestedValue(row, col.field)?.length <= 50 &&\r\n                !expandedCells.size));\r\n          else viewMode\r\n        \"\r\n      >\r\n        <ng-container [ngSwitch]=\"col.type\">\r\n          <!-- Text Input -->\r\n          <input\r\n            [style.height.px]=\"rowHeight - 10\"\r\n            *ngSwitchCase=\"'input'\"\r\n            type=\"text\"\r\n            [(ngModel)]=\"row[col.field]\"\r\n            (blur)=\"disableEdit(row, col)\"\r\n            autofocus\r\n            class=\"form-control form-control-sm\"\r\n            (mousedown)=\"$event.stopPropagation()\"\r\n          />\r\n\r\n          <!-- Number Input -->\r\n          <input\r\n            [style.height.px]=\"rowHeight - 8\"\r\n            *ngSwitchCase=\"'number'\"\r\n            #numberInput=\"ngModel\"\r\n            #numberRef\r\n            (keypress)=\"allowOnlyNumbers($event)\"\r\n            type=\"number\"\r\n            required\r\n            [(ngModel)]=\"row[col.field]\"\r\n            (blur)=\"disableEdit(row, col)\"\r\n            autofocus\r\n            (keydown.enter)=\"numberRef.blur()\"\r\n            class=\"form-control form-control-sm\"\r\n            [ngClass]=\"{\r\n              'is-invalid': numberInput.invalid\r\n            }\"\r\n            (mousedown)=\"$event.stopPropagation()\"\r\n          />\r\n\r\n          <!-- Date Input -->\r\n          <input\r\n            [style.height.px]=\"rowHeight - 8\"\r\n            *ngSwitchCase=\"'date'\"\r\n            type=\"date\"\r\n            [(ngModel)]=\"row[col.field]\"\r\n            (blur)=\"disableEdit(row, col)\"\r\n            autofocus\r\n            class=\"form-control form-control-sm\"\r\n            #dateInput=\"ngModel\"\r\n            [ngClass]=\"{\r\n              'is-invalid': dateInput.invalid\r\n            }\"\r\n            (mousedown)=\"$event.stopPropagation()\"\r\n          />\r\n\r\n          <!-- Dropdown -->\r\n          <!-- ng-select like dropdown -->\r\n          <div\r\n            *ngSwitchCase=\"'dropdown'\"\r\n            class=\"dropdown w-100\"\r\n            (blur)=\"disableEdit(row, col)\"\r\n          >\r\n            <!-- Trigger -->\r\n            <button\r\n              class=\"form-select form-select-sm text-start w-100 text-ellipsis\"\r\n              type=\"button\"\r\n              data-bs-toggle=\"dropdown\"\r\n              aria-expanded=\"false\"\r\n              [style.minHeight.px]=\"rowHeight - 10\"\r\n              data-bs-display=\"static\"\r\n              (mousedown)=\"$event.stopPropagation()\"\r\n            >\r\n              <ng-container>\r\n                {{\r\n                  getNestedValue(row, col.field)?.value ||\r\n                    getNestedValue(row, col.field)?.name ||\r\n                    getNestedValue(row, col.field)\r\n                }}\r\n              </ng-container>\r\n              <ng-template #placeholder> Select options... </ng-template>\r\n            </button>\r\n\r\n            <!-- Menu -->\r\n            <div\r\n              class=\"dropdown-menu w-100 p-0 cell-editing-dropdown-menu rounded-3\"\r\n              [class.show]=\"isEditing(row, col)\"\r\n            >\r\n              <!-- Search -->\r\n              <div class=\"px-2 py-1 editing-dropdown-search-input\">\r\n                <input\r\n                  type=\"text\"\r\n                  class=\"form-control form-control-sm\"\r\n                  placeholder=\"Search...\"\r\n                  [(ngModel)]=\"editinDropdownSearch\"\r\n                  (mousedown)=\"$event.stopPropagation()\"\r\n                />\r\n              </div>\r\n\r\n              <!-- Options -->\r\n              <!-- <div\r\n                class=\"cell-editin-dropdown\"\r\n                style=\"max-height: 200px; overflow: auto\"\r\n              >\r\n                <div\r\n                  (click)=\"\r\n                    setNestedValue(row, col, option, true); editingKey = null\r\n                  \"\r\n                  class=\"px-2 py-1 d-flex align-items-center deopdown-item\"\r\n                  *ngFor=\"\r\n                    let option of col.column_dropdown_value\r\n                      | filter : editinDropdownSearch: 'value'\r\n                  \"\r\n                >\r\n                  <label\r\n                    class=\"form-check-label d-flex align-items-center mb-0 cursor-pointer\"\r\n                    [for]=\"col.field + '-' + option.value || option\"\r\n                  >\r\n                    {{ option.value || option }}\r\n                  </label>\r\n                </div>\r\n              </div> -->\r\n              <cdk-virtual-scroll-viewport \r\n                    itemSize=\"35\" \r\n                    class=\"dropdown-viewport\"\r\n                    style=\"height: 120px\"\r\n                  >\r\n                    <div\r\n                      class=\"px-2 py-1 d-flex align-items-center dropdown-item\"\r\n                      *cdkVirtualFor=\"\r\n                        let option of col.column_dropdown_value \r\n                          | filter : editinDropdownSearch : 'value'\r\n                      \"\r\n                      (click)=\"setNestedValue(row, col, option, true); editingKey = null\"\r\n                    >\r\n                      <label\r\n                        class=\"form-check-label d-flex align-items-center mb-0 cursor-pointer\"\r\n                        [for]=\"col.field + '-' + (option.value || option)\"\r\n                      >\r\n                        {{ option.value || option }}\r\n                      </label>\r\n                    </div>\r\n                </cdk-virtual-scroll-viewport>\r\n\r\n            </div>\r\n          </div>\r\n\r\n          <input\r\n            *ngSwitchCase=\"'email'\"\r\n            [style.height.px]=\"rowHeight - 10\"\r\n            [style.maxHeight.px]=\"rowHeight - 10\"\r\n            #emailModel=\"ngModel\"\r\n            #emailInput\r\n            type=\"email\"\r\n            [(ngModel)]=\"row[col.field]\"\r\n            name=\"{{ col.field }}\"\r\n            required\r\n            pattern=\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\r\n            (blur)=\"disableEdit(row, col, emailModel)\"\r\n            (keydown.enter)=\"\r\n              emailModel.control.markAsTouched(); emailInput.blur()\r\n            \"\r\n            autofocus\r\n            class=\"form-control form-control-sm\"\r\n            [ngClass]=\"{\r\n              'is-invalid': emailModel.invalid\r\n            }\"\r\n            (mousedown)=\"$event.stopPropagation()\"\r\n          />\r\n          <!-- Default fallback -->\r\n          <input\r\n            *ngSwitchDefault\r\n            [style.height.px]=\"rowHeight - 10\"\r\n            [style.maxHeight.px]=\"rowHeight - 10\"\r\n            #textModel=\"ngModel\"\r\n            #textInput\r\n            type=\"text\"\r\n            [(ngModel)]=\"row[col.field]\"\r\n            name=\"{{ col.field }}\"\r\n            required\r\n            (blur)=\"disableEdit(row, col, textModel)\"\r\n            (keydown.enter)=\"\r\n              textModel.control.markAsTouched(); textInput.blur()\r\n            \"\r\n            autofocus\r\n            class=\"form-control form-control-sm\"\r\n            [ngClass]=\"{\r\n              'is-invalid': textModel.invalid\r\n            }\"\r\n            (mousedown)=\"$event.stopPropagation()\"\r\n          />\r\n        </ng-container>\r\n      </div>\r\n\r\n      <!-- Display mode -->\r\n      <ng-template #viewMode>\r\n        <div\r\n          class=\"d-flex justify-content-between align-items-center w-100 overflow-hidden\"\r\n          [ngClass]=\"getCellClasses(col, getNestedValue(row, col.field))\"\r\n        >\r\n          <!-- Field icon (for Tasks grid) -->\r\n          <ng-container\r\n            *ngIf=\"gridType === 'Tasks' && iconMap[col.field] && !isTotalRow\"\r\n          >\r\n            <span\r\n              class=\"cursor-pointer me-2\"\r\n              (click)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n              [inlineSVG]=\"iconMap[col.field](row, col)\"\r\n            ></span>\r\n          </ng-container>\r\n\r\n          <!-- ✅ Custom cell renderer support -->\r\n          <ng-container *ngIf=\"col.cellRenderer; else defaultCell\">\r\n            <ng-container\r\n              [cellRenderInit]=\"col.cellRenderer\"\r\n              [rowData]=\"row\"\r\n              [colData]=\"col\"\r\n              [cellValue]=\"getNestedValue(row, col?.field)\"\r\n              (cellEvent)=\"onCellEvent($event)\"\r\n            >\r\n            </ng-container>\r\n          </ng-container>\r\n\r\n          <!-- 🧾 Default text-based cell rendering -->\r\n          <ng-template #defaultCell>\r\n            <div\r\n              #cellText\r\n              class=\"text-ellipsis flex-grow-1\"\r\n              [title]=\"\r\n                col.type === 'date'\r\n                  ? (getNestedValue(row, col.field) | date : dateFormat)\r\n                  : getNestedValue(row, col.field) || '-'\r\n              \"\r\n            >\r\n              <!-- Normal cell -->\r\n              <ng-container\r\n                *ngIf=\"\r\n                  col.type !== 'image' &&\r\n                  col.field != 'image' &&\r\n                  col.field != 'invoice.invoice_image' &&\r\n                  !isTotalRow\r\n                \"\r\n              >\r\n                <ng-container *ngIf=\"col.is_amount\">{{\r\n                  currencySymbol\r\n                }}</ng-container>\r\n                {{\r\n            !isNestedValueArray(row, col.field)\r\n              ? col.type === 'date'\r\n                ? (isDate(getNestedValue(row, col.field))\r\n                    ? (getNestedValue(row, col.field) | date : dateFormat)\r\n                    : (getNestedValue(row, col.field)?.value ||\r\n                      getNestedValue(row, col.field)?.name ||\r\n                      getNestedValue(row, col.field) ||\r\n                      '-'))\r\n                : (getNestedValue(row, col.field)?.value ||\r\n                  getNestedValue(row, col.field)?.name ||\r\n                  getNestedValue(row, col.field) ||\r\n                  (col.is_amount ? 0 : '-'))\r\n              : (getNestedValue(row, col.field)?.[0]?.department_name ||\r\n                getNestedValue(row, col.field)?.[0]?.roleName ||\r\n                getNestedValue(row, col.field)?.[0]?.full_name ||\r\n                '-')\r\n                }}\r\n              </ng-container>\r\n\r\n              <!-- Total row -->\r\n              <ng-container *ngIf=\"isTotalRow\">\r\n                {{ getTotalAmount(col) }}\r\n              </ng-container>\r\n\r\n              <!-- Invoice Image -->\r\n              <ng-container *ngIf=\"col.field == 'invoice.invoice_image'\">\r\n                <div style=\"display: flex; align-items: center; zoom: 0.7\">\r\n                  <span\r\n                    title=\"{{ getNestedValue(row, col.field) || 'Attachment' }}\"\r\n                    (click)=\"downloadAttchment(getNestedValue(row, col.field))\"\r\n                    [inlineSVG]=\"\r\n                      singleSpaAssetsPath +\r\n                      'data-grid/document-icons/' +\r\n                      getExtention(getNestedValue(row, col.field)) +\r\n                      '.svg'\r\n                    \"\r\n                  ></span>\r\n                </div>\r\n              </ng-container>\r\n\r\n              <!-- Image cell -->\r\n              <ng-container *ngIf=\"col.type == 'image' && !isTotalRow\">\r\n                <ng-container\r\n                  *ngTemplateOutlet=\"\r\n                    defaultImagePlaceholder;\r\n                    context: { row: row, col: col }\r\n                  \"\r\n                ></ng-container>\r\n              </ng-container>\r\n            </div>\r\n            <span\r\n            *ngIf=\"\r\n              (!col?.cellRenderer && showCellDetailsBox &&\r\n                getNestedValue(row, col.field)?.length > 50 && col.type !== 'image') ||\r\n              (isNestedValueArray(row, col.field) &&\r\n                getNestedValue(row, col.field)?.length > 1)\r\n            \"\r\n            class=\"toggle-icon data-grid-svg-icon ms-2 cursor-pointer\"\r\n            [inlineSVG]=\"\r\n              isExpanded(row, col)\r\n                ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n                : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n            \"\r\n            (click)=\"\r\n              $event.stopPropagation();\r\n              toggleExpandOfLongCellText(row, col, columns, true)\r\n            \"\r\n            (dblclick)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n          ></span>\r\n          </ng-template>\r\n          <!-- Expand / Collapse icon -->\r\n        </div>\r\n\r\n        <!-- Expanded text -->\r\n        <div\r\n          class=\"position-absolute w-100 expanded-box\"\r\n          *ngIf=\"isExpanded(row, col)\"\r\n          [style.zIndex]=\"getZIndex(row, col)\"\r\n          style=\"top: 100%; left: 0\"\r\n          [attr.id]=\"(row.id || row._id) + '-' + (col.id || col._id)\"\r\n          [class.invisible]=\"!showDetailsBox\"\r\n        >\r\n          <ng-container\r\n            *ngTemplateOutlet=\"\r\n              fullTextTemplate;\r\n              context: {\r\n                row: row,\r\n                col: col,\r\n                isArray: isNestedValueArray(row, col.field)\r\n              }\r\n            \"\r\n          ></ng-container>\r\n        </div>\r\n      </ng-template>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Headers Action List On clicking three dots -->\r\n\r\n<ng-template\r\n  #columnMenu\r\n  let-col=\"col\"\r\n  let-isNestedTable=\"isNestedTable\"\r\n  let-columns=\"columns\"\r\n  let-section=\"section\"\r\n>\r\n  <div\r\n    class=\"column-menu three-dots-col-menu\"\r\n    [class.visually-hidden]=\"isMenueHidden\"\r\n    *ngIf=\"activeCol && !isThreeDotsFilterOpen\"\r\n    [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n    (click)=\"$event.stopPropagation()\"\r\n    [style.color]=\"headerTextColor\"\r\n  >\r\n    <!-- Sort Ascending -->\r\n    <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n      <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n      <div\r\n        *ngIf=\"\r\n          columnThreedotsMunuConfig?.showAscending &&\r\n          (sortingConfig?.field != col.field ||\r\n            sortingConfig?.order_by == 'desc')\r\n        \"\r\n        class=\"column-menu-item\"\r\n        (click)=\"sortAsc(activeCol)\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span>\r\n        Sort Ascending\r\n      </div>\r\n\r\n      <!-- Sort Descending -->\r\n      <div\r\n        *ngIf=\"\r\n          columnThreedotsMunuConfig?.showDescending &&\r\n          (sortingConfig?.field != col.field ||\r\n            sortingConfig?.order_by == 'asc')\r\n        \"\r\n        class=\"column-menu-item\"\r\n        (click)=\"sortDesc(activeCol)\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span>\r\n        Sort Descending\r\n      </div>\r\n\r\n      <div\r\n        *ngIf=\"\r\n          sortingConfig?.field === col.field &&\r\n          (sortingConfig?.order_by === 'asc' ||\r\n            sortingConfig?.order_by === 'desc')\r\n        \"\r\n        class=\"column-menu-item\"\r\n        (click)=\"resetSort(activeCol)\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"\r\n            singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n          \"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span>\r\n        Reset Sort\r\n      </div>\r\n    </div>\r\n    <div class=\"py-2 border-below three-dots-filter\">\r\n      <div\r\n        *ngIf=\"columnThreedotsMunuConfig?.showFilter\"\r\n        class=\"column-menu-item three-dots-filter\"\r\n        (click)=\"openFilteronThreeDotsClick(col)\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span>\r\n        Filter\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"py-2 border-below\">\r\n      <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n      <div\r\n        *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n        class=\"column-menu-item\"\r\n        (click)=\"\r\n          $event.stopPropagation();\r\n          updateColumnPinInSourceByField(\r\n            activeCol,\r\n            'left',\r\n            isNestedTable,\r\n            columns\r\n          )\r\n        \"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-left.svg'\"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span\r\n        >Pin Left\r\n      </div>\r\n\r\n      <div\r\n        *ngIf=\"\r\n          columnThreedotsMunuConfig?.showPinright && col?.pinned !== 'right'\r\n        \"\r\n        class=\"column-menu-item\"\r\n        (click)=\"\r\n          $event.stopPropagation();\r\n          updateColumnPinInSourceByField(\r\n            activeCol,\r\n            'right',\r\n            isNestedTable,\r\n            columns\r\n          )\r\n        \"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-right.svg'\"\r\n          class=\"data-grid-svg-icon data-grid-svg-icon me-2\"\r\n        ></span\r\n        >Pin Right\r\n      </div>\r\n\r\n      <div\r\n        *ngIf=\"col?.pinned\"\r\n        class=\"column-menu-item\"\r\n        (click)=\"\r\n          $event.stopPropagation();\r\n          updateColumnPinInSourceByField(\r\n            activeCol,\r\n            null,\r\n            isNestedTable,\r\n            columns\r\n          )\r\n        \"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"\r\n            singleSpaAssetsPath + 'data-grid/icons/layout-three-columns.svg'\r\n          \"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span\r\n        >Unpin\r\n      </div>\r\n    </div>\r\n\r\n    <div\r\n      *ngIf=\"columnThreedotsMunuConfig?.showAutosizeThisColumn\"\r\n      class=\"column-menu-item\"\r\n      (click)=\"autosizeColumn(activeCol)\"\r\n    >\r\n      <span\r\n        [inlineSVG]=\"\r\n          singleSpaAssetsPath + 'data-grid/icons/arrows-expand-vertical.svg'\r\n        \"\r\n        class=\"me-2\"\r\n      ></span>\r\n      Autosize This Column\r\n    </div>\r\n\r\n    <!-- Autosize All Columns -->\r\n    <div\r\n      *ngIf=\"columnThreedotsMunuConfig?.showAutosizeAllColumns\"\r\n      class=\"column-menu-item\"\r\n      (click)=\"autosizeAllColumns()\"\r\n    >\r\n      <span\r\n        [inlineSVG]=\"\r\n          singleSpaAssetsPath + 'data-grid/icons/arrows-angle-expand.svg'\r\n        \"\r\n        class=\"data-grid-svg-icon me-2\"\r\n      ></span\r\n      >Autosize All Columns\r\n    </div>\r\n\r\n    <!-- Group By -->\r\n    <div\r\n      *ngIf=\"showRowsGrouping\"\r\n      class=\"column-menu-item\"\r\n      (click)=\"groupBy(activeCol)\"\r\n      [class.disable-sorting]=\"!col.is_groupable\"\r\n    >\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/diagram-3.svg'\"\r\n        class=\"data-grid-svg-icon me-2\"\r\n      ></span>\r\n      Group by {{ col.header }}\r\n    </div>\r\n\r\n    <!-- Choose Columns -->\r\n    <div\r\n      *ngIf=\"columnThreedotsMunuConfig?.showChoseColumns\"\r\n      class=\"column-menu-item\"\r\n      (click)=\"chooseColumns()\"\r\n    >\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\"\r\n        class=\"data-grid-svg-icon me-2\"\r\n      ></span>\r\n      Choose Columns\r\n    </div>\r\n\r\n    <!-- Reset Columns -->\r\n    <div\r\n      *ngIf=\"columnThreedotsMunuConfig?.showResetColumns\"\r\n      class=\"column-menu-item\"\r\n      (click)=\"resetColumns()\"\r\n    >\r\n      <span\r\n        [inlineSVG]=\"\r\n          singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n        \"\r\n        class=\"data-grid-svg-icon me-2\"\r\n      ></span\r\n      >Reset Columns\r\n    </div>\r\n  </div>\r\n  <div\r\n    @slideToggle\r\n    *ngIf=\"isThreeDotsFilterOpen\"\r\n    class=\"three-dots-col-menu position-relative\"\r\n    [style.right.px]=\"section == 'right' ? null : col.width - 45\"\r\n    [class.visually-hidden]=\"isMenueHidden\"\r\n  >\r\n    <ng-container\r\n      *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\r\n    ></ng-container>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Filter Menue -->\r\n<ng-template #filterMenu let-col=\"col\">\r\n  <div\r\n    class=\"filter-menu-container filter-menu\"\r\n    [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n  >\r\n    <!-- Dropdown Type -->\r\n    <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n      <div class=\"filter-dropdown-section p-1\">\r\n        <input\r\n          class=\"form-control form-control-sm\"\r\n          placeholder=\"Search...\"\r\n          type=\"search\"\r\n          [(ngModel)]=\"addFilterColumnInput\"\r\n        />\r\n\r\n        <div class=\"form-check mb-1 mt-2 ps-4 ms-1\">\r\n          <input\r\n            class=\"form-check-input\"\r\n            type=\"checkbox\"\r\n            [checked]=\"isAllSideFilterOptionsSelected(col)\"\r\n            (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n            id=\"selectAll_{{ col.field }}\"\r\n          />\r\n          <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n            Select All\r\n          </label>\r\n        </div>\r\n\r\n        <!-- <div class=\"dropdown-options ps-1\">\r\n          <div\r\n            class=\"form-check mb-1\"\r\n            *ngFor=\"\r\n              let option of selectedColumnForFilter?.column_dropdown_value\r\n                | filter : addFilterColumnInput : 'value';\r\n              trackBy: trackById;\r\n              let i = index\r\n            \"\r\n          >\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"checkbox\"\r\n              [id]=\"i\"\r\n              [checked]=\"\r\n                currentFilterSelectedIds.has(option?.id ?? option?._id ?? option)\r\n              \"\r\n              (change)=\"toggleSelectionInFilter(option)\"\r\n            />\r\n            <label class=\"form-check-label fw-semibold\" [for]=\"i\">\r\n              {{ option?.value ?? option?.name ?? option }}\r\n            </label>\r\n          </div>\r\n        </div> -->\r\n        <cdk-virtual-scroll-viewport\r\n              itemSize=\"32\"\r\n              class=\"filter-viewport\"\r\n              style=\"height: 120px\"\r\n            >\r\n              <div\r\n                class=\"form-check mb-1\"\r\n                *cdkVirtualFor=\"\r\n                  let option of selectedColumnForFilter?.column_dropdown_value\r\n                    | filter : addFilterColumnInput : 'value';\r\n                  trackBy: trackById\r\n                \"\r\n              >\r\n                <input\r\n                  class=\"form-check-input\"\r\n                  type=\"checkbox\"\r\n                  [id]=\"option?.id ?? option?._id ?? option\"\r\n                  [checked]=\"\r\n                    currentFilterSelectedIds.has(option?.id ?? option?._id ?? option)\r\n                  \"\r\n                  (change)=\"toggleSelectionInFilter(option)\"\r\n                />\r\n\r\n                <label\r\n                  class=\"form-check-label fw-semibold\"\r\n                  [for]=\"option?.id ?? option?._id ?? option\"\r\n                >\r\n                  {{ option?.value ?? option?.name ?? option }}\r\n                </label>\r\n              </div>\r\n          </cdk-virtual-scroll-viewport>\r\n      </div>\r\n    </ng-container>\r\n\r\n    <!-- Text Filter Section -->\r\n    <ng-template #textFilter>\r\n      <div class=\"filter-text-section\">\r\n        <div class=\"form-group mb-2\">\r\n          <select\r\n            class=\"form-select form-select-sm custom-select\"\r\n            [(ngModel)]=\"firstCondition\"\r\n          >\r\n            <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\r\n              <option value=\"contain\">Contains</option>\r\n              <option value=\"does_not_contain\">Does Not Contain</option>\r\n              <option value=\"equal\">Equals</option>\r\n              <option value=\"before\">Starts With</option>\r\n              <option value=\"after\">Ends With</option>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\r\n              <option value=\"equal\">Equals To</option>\r\n              <option value=\"not_equal\">Not Equal</option>\r\n              <option value=\"after\">After</option>\r\n              <option value=\"before\">Before</option>\r\n            </ng-container>\r\n          </select>\r\n        </div>\r\n\r\n        <input\r\n          [type]=\"col.type == 'string' ? 'text' : col.type\"\r\n          class=\"form-control form-control-sm mb-3\"\r\n          placeholder=\"Value\"\r\n          [(ngModel)]=\"firstValue\"\r\n          #filterMenueTextchInput\r\n          (keydown.enter)=\"applyDropdownFilter()\"\r\n        />\r\n\r\n        <div class=\"form-group mb-3 d-flex flex-row\">\r\n          <div\r\n            class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input filter-radio-inputs\"\r\n              type=\"radio\"\r\n              name=\"condition\"\r\n              [(ngModel)]=\"condition\"\r\n              value=\"and\"\r\n              id=\"and_{{ col.field }}\"\r\n              (change)=\"cdr.detectChanges()\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"and_{{ col.field }}\"\r\n              >AND</label\r\n            >\r\n          </div>\r\n          <div\r\n            class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1 gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input filter-radio-inputs\"\r\n              type=\"radio\"\r\n              name=\"condition\"\r\n              [(ngModel)]=\"condition\"\r\n              value=\"or\"\r\n              id=\"or_{{ col.field }}\"\r\n              (change)=\"cdr.detectChanges()\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"or_{{ col.field }}\"\r\n              >OR</label\r\n            >\r\n          </div>\r\n          <div\r\n            class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1 gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input filter-radio-inputs\"\r\n              type=\"radio\"\r\n              name=\"condition\"\r\n              [(ngModel)]=\"condition\"\r\n              value=\"none\"\r\n              id=\"none_{{ col.field }}\"\r\n              (change)=\"cdr.detectChanges()\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"none_{{ col.field }}\"\r\n              >None</label\r\n            >\r\n          </div>\r\n        </div>\r\n        <div @slideToggle *ngIf=\"firstValue && condition != 'none'\">\r\n          <div class=\"form-group mb-2\">\r\n            <select\r\n              class=\"form-select form-select-sm custom-select\"\r\n              [(ngModel)]=\"secondCondition\"\r\n            >\r\n              <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\r\n                <option value=\"contain\">Contains</option>\r\n                <option value=\"does_not_contain\">Does Not Contain</option>\r\n                <option value=\"equal\">Equals</option>\r\n                <option value=\"before\">Starts With</option>\r\n                <option value=\"after\">Ends With</option>\r\n              </ng-container>\r\n\r\n              <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\r\n                <option value=\"equal\">Equals To</option>\r\n                <option value=\"not_equal\">Not Equal</option>\r\n                <option value=\"after\">After</option>\r\n                <option value=\"before\">Before</option>\r\n              </ng-container>\r\n            </select>\r\n          </div>\r\n\r\n          <input\r\n            [type]=\"col.type == 'string' ? 'text' : col.type\"\r\n            class=\"form-control form-control-sm mb-3\"\r\n            placeholder=\"Second Value\"\r\n            [(ngModel)]=\"secondValue\"\r\n          />\r\n        </div>\r\n      </div>\r\n    </ng-template>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"d-flex gap-2 mt-2\">\r\n      <div\r\n        [class.disabled]=\"!currentFilterSelectedIds!.size && !firstValue\"\r\n        [class.pe-none]=\"!currentFilterSelectedIds!.size && !firstValue\"\r\n        class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center w-100\"\r\n        style=\"height: 30px\"\r\n        (click)=\"applyDropdownFilter()\"\r\n      >\r\n        Apply\r\n      </div>\r\n      <div\r\n        class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center w-100\"\r\n        style=\"height: 30px\"\r\n        (click)=\"resetSideFilter(col)\"\r\n      >\r\n        Reset\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Side Menue -->\r\n\r\n<!-- Column Pannel / Pivot Mode / Searching -->\r\n\r\n<ng-template #columnPannel>\r\n  <div class=\"column-panel-header\">\r\n    <!-- Pivot Toggle -->\r\n    <div\r\n      class=\"form-check form-switch d-flex align-items-center mb-2 pivot-mode px-5 ms-2 d-none\"\r\n    >\r\n      <input\r\n        class=\"form-check-input me-2\"\r\n        type=\"checkbox\"\r\n        id=\"pivotToggle\"\r\n        [(ngModel)]=\"pivotMode\"\r\n      />\r\n      <label class=\"form-check-label\" for=\"pivotToggle\">Pivot Mode</label>\r\n    </div>\r\n\r\n    <!-- Select All & Search -->\r\n    <div class=\"d-flex align-items-center mb-2 px-3 mt-3\">\r\n      <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n        <span\r\n          class=\"toggle-icon data-grid-svg-icon\"\r\n          [inlineSVG]=\"\r\n            accordionState === 'all'\r\n              ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n              : accordionState === 'some'\r\n              ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n              : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n          \"\r\n          (click)=\"toggleAllAccordions()\"\r\n        ></span>\r\n      </span>\r\n      <input\r\n        type=\"checkbox\"\r\n        class=\"form-check-input me-2\"\r\n        [checked]=\"allColumnsSelected()\"\r\n        (change)=\"toggleAllColumnsVisibility()\"\r\n      />\r\n      <input\r\n        type=\"text\"\r\n        class=\"form-control form-control-sm\"\r\n        placeholder=\"Search columns...\"\r\n        [(ngModel)]=\"columnSearch\"\r\n      />\r\n    </div>\r\n\r\n    <!-- Separator -->\r\n    <hr class=\"my-2\" />\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Right Columns Menue -->\r\n\r\n<!-- Column Panel Item Template -->\r\n<ng-template #columnPanelItem let-col=\"col\">\r\n  <!-- Group Column -->\r\n  <ng-container *ngIf=\"col.children?.length\">\r\n    <div class=\"column-group d-flex align-items-center mb-2\">\r\n      <span class=\"filter-icon-wrapper me-2\">\r\n        <span\r\n          class=\"toggle-icon data-grid-svg-icon\"\r\n          [inlineSVG]=\"\r\n            singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n          \"\r\n          [class.rotate]=\"col.expanded\"\r\n          (click)=\"col.expanded = !col.expanded\"\r\n        ></span>\r\n      </span>\r\n      <input\r\n        type=\"checkbox\"\r\n        class=\"form-check-input me-2\"\r\n        [id]=\"'group_' + col.header\"\r\n        [checked]=\"isColumnVisible(col)\"\r\n        (change)=\"toggleGroupVisibility(col)\"\r\n      />\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\r\n      ></span>\r\n      <label\r\n        class=\"d-flex align-items-center mb-0 w-100\"\r\n        [for]=\"'group_' + col.header\"\r\n        style=\"cursor: pointer\"\r\n      >\r\n        <span class=\"text-truncate\">{{ col.header }}</span>\r\n      </label>\r\n    </div>\r\n    <div *ngIf=\"col.expanded\" class=\"ps-4\">\r\n      <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\r\n        <ng-container\r\n          *ngTemplateOutlet=\"columnPanelItem; context: { col: child }\"\r\n        ></ng-container>\r\n      </ng-container>\r\n    </div>\r\n  </ng-container>\r\n\r\n  <!-- Leaf Column -->\r\n  <ng-container *ngIf=\"!col.children?.length\">\r\n    <div class=\"d-flex align-items-center mb-2\">\r\n      <span class=\"me-2\" style=\"width: 1.5rem\"></span>\r\n      <input\r\n        type=\"checkbox\"\r\n        class=\"form-check-input me-2\"\r\n        [(ngModel)]=\"col.is_visible\"\r\n        [id]=\"'col_' + col.field\"\r\n        (change)=\"onSideMenuColumnsVisibilityChange()\"\r\n      />\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\r\n      ></span>\r\n      <label\r\n        class=\"d-flex align-items-center mb-0 w-100\"\r\n        [for]=\"'col_' + col.field\"\r\n        style=\"cursor: pointer\"\r\n      >\r\n        <span class=\"text-truncate\">{{ col.header }}</span>\r\n      </label>\r\n    </div>\r\n  </ng-container>\r\n</ng-template>\r\n\r\n<!-- Columns Side Filter -->\r\n<ng-template #sideFilters>\r\n  <div class=\"py-3 px-2 pe-3 h-100\">\r\n    <div class=\"d-flex align-items-center mb-2\">\r\n      <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n        <span\r\n          class=\"toggle-icon data-grid-svg-icon\"\r\n          [inlineSVG]=\"\r\n            filterAccordionState === 'all'\r\n              ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n              : filterAccordionState === 'some'\r\n              ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n              : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n          \"\r\n          (click)=\"toggleAllFilterAccordions()\"\r\n        ></span>\r\n      </span>\r\n      <input\r\n        type=\"text\"\r\n        class=\"form-control form-control-sm\"\r\n        placeholder=\"Search...\"\r\n        [(ngModel)]=\"columnSearch\"\r\n      />\r\n    </div>\r\n    <div\r\n      class=\"overflow-auto side-filter-columns-wrapper\"\r\n      style=\"height: calc(100% - 70px); scrollbar-width: thin\"\r\n    >\r\n      <ng-container\r\n        *ngFor=\"\r\n          let col of columns | filter : columnSearch : 'header';\r\n          trackBy: trackByField\r\n        \"\r\n      >\r\n        <ng-container\r\n          *ngTemplateOutlet=\"filterPannelItem; context: { col: col }\"\r\n        ></ng-container>\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #filterPannelItem let-col=\"col\">\r\n  <!-- Group Column -->\r\n  <ng-container *ngIf=\"col.children?.length\">\r\n    <div\r\n      class=\"column-group d-flex align-items-center mb-2\"\r\n      *ngIf=\"col.type !== 'image'\"\r\n    >\r\n      <!-- Chevron toggle -->\r\n      <span class=\"filter-icon-wrapper me-2\">\r\n        <span\r\n          class=\"toggle-icon data-grid-svg-icon\"\r\n          [inlineSVG]=\"\r\n            singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n          \"\r\n          [class.rotate]=\"col.expandedFilter\"\r\n          (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n        ></span>\r\n      </span>\r\n\r\n      <!-- Group label toggle -->\r\n      <label\r\n        class=\"d-flex align-items-center mb-0 w-100\"\r\n        style=\"cursor: pointer\"\r\n        (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n      >\r\n        <span class=\"fw-bold text-truncate\"\r\n          >{{ col.header }}\r\n          <span\r\n            class=\"text-primary ms-1\"\r\n            *ngIf=\"col?.query?._ids?.length || col?.query?._first_value\"\r\n            >*</span\r\n          >\r\n        </span>\r\n      </label>\r\n    </div>\r\n\r\n    <!-- Children columns -->\r\n    <div *ngIf=\"col.expandedFilter\" class=\"ps-4\">\r\n      <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\r\n        <ng-container\r\n          *ngTemplateOutlet=\"filterPannelItem; context: { col: child }\"\r\n        ></ng-container>\r\n      </ng-container>\r\n    </div>\r\n  </ng-container>\r\n\r\n  <!-- Leaf Column -->\r\n  <ng-container *ngIf=\"!col.children?.length\">\r\n    <div class=\"d-flex align-items-center mb-2\" *ngIf=\"col.type !== 'image'\">\r\n      <span\r\n        class=\"me-2 filter-icon-wrapper me-2\"\r\n        (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n      >\r\n        <span\r\n          class=\"toggle-icon data-grid-svg-icon\"\r\n          [inlineSVG]=\"\r\n            singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n          \"\r\n          [class.rotate]=\"col.expandedFilter\"\r\n        ></span>\r\n      </span>\r\n\r\n      <label\r\n        class=\"d-flex align-items-center mb-0 w-100\"\r\n        style=\"cursor: pointer\"\r\n        (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n      >\r\n        <span class=\"text-truncate fw-bold\">{{ col.header }}</span>\r\n      </label>\r\n    </div>\r\n\r\n    <!-- Show filter when expanded -->\r\n    <div *ngIf=\"col.expandedFilter\" class=\"ps-4 pe-3\">\r\n      <ng-container\r\n        *ngTemplateOutlet=\"sideNestedFilter; context: { col: col }\"\r\n      ></ng-container>\r\n    </div>\r\n  </ng-container>\r\n</ng-template>\r\n\r\n<!-- Side Nested Filters -->\r\n<ng-template #sideNestedFilter let-col=\"col\">\r\n  <div class=\"\">\r\n    <!-- Dropdown Type -->\r\n    <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n      <div class=\"p-1\">\r\n        <!-- Search -->\r\n        <input\r\n          type=\"text\"\r\n          class=\"form-control form-control-sm mb-2\"\r\n          placeholder=\"Search...\"\r\n          [(ngModel)]=\"sideNestedFilterSearch\"\r\n        />\r\n\r\n        <!-- Select All -->\r\n        <div class=\"form-check mb-1 ms-1\">\r\n          <input\r\n            class=\"form-check-input\"\r\n            type=\"checkbox\"\r\n            [checked]=\"\r\n              col.query?._ids?.length == col?.column_dropdown_value?.length\r\n            \"\r\n            (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n            id=\"selectAll_{{ col.field }}\"\r\n          />\r\n          <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n            Select All\r\n          </label>\r\n        </div>\r\n\r\n        <!-- Options -->\r\n        <!-- <div class=\"dropdown-options\">\r\n          <div\r\n            class=\"form-check mb-1 ms-1\"\r\n            *ngFor=\"\r\n              let option of col?.column_dropdown_value\r\n                | filter : sideNestedFilterSearch : 'value'\r\n            \"\r\n          >\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"checkbox\"\r\n              [value]=\"option\"\r\n              [checked]=\"\r\n                col.query?._ids?.includes(option?._id || option?.id || option)\r\n              \"\r\n              (change)=\"onOptionToggle(col, option)\"\r\n              id=\"option_{{ col.field }}_{{\r\n                option?.id || option?._id || option\r\n              }}\"\r\n            />\r\n            <label\r\n              class=\"form-check-label\"\r\n              [for]=\"\r\n                'option_' +\r\n                col.field +\r\n                '_' +\r\n                (option?.id || option?._id || option)\r\n              \"\r\n            >\r\n              {{ option.value || option }}\r\n            </label>\r\n          </div>\r\n        </div> -->\r\n        <cdk-virtual-scroll-viewport\r\n            itemSize=\"32\"\r\n            class=\"dropdown-viewport\"\r\n            style=\"height: 120px\"\r\n          >\r\n            <div\r\n              class=\"form-check mb-1 ms-1\"\r\n              *cdkVirtualFor=\"\r\n                let option of col?.column_dropdown_value\r\n                  | filter : sideNestedFilterSearch : 'value'\r\n              \"\r\n            >\r\n              <input\r\n                class=\"form-check-input\"\r\n                type=\"checkbox\"\r\n                [value]=\"option\"\r\n                [checked]=\"\r\n                  col.query?._ids?.includes(option?._id || option?.id || option)\r\n                \"\r\n                (change)=\"onOptionToggle(col, option)\"\r\n                id=\"option_{{ col.field }}_{{\r\n                  option?.id || option?._id || option\r\n                }}\"\r\n              />\r\n\r\n              <label\r\n                class=\"form-check-label\"\r\n                [for]=\"\r\n                  'option_' +\r\n                  col.field +\r\n                  '_' +\r\n                  (option?.id || option?._id || option)\r\n                \"\r\n              >\r\n                {{ option.value || option }}\r\n              </label>\r\n            </div>\r\n          </cdk-virtual-scroll-viewport>\r\n\r\n\r\n        <!-- Actions -->\r\n        <!-- <div class=\"d-flex gap-2 mt-2\">\r\n      <div\r\n        class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center\"\r\n        style=\"height: 22px;\"\r\n        (click)=\"applySideFilter(col)\"\r\n      >\r\n        Apply\r\n      </div>\r\n      <div\r\n        class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center\" \r\n        style=\"height: 22px;\"\r\n        (click)=\"resetSideFilter(col)\"\r\n      >\r\n        Reset\r\n      </div>\r\n    </div> -->\r\n      </div>\r\n    </ng-container>\r\n\r\n    <!-- Text Filter Section -->\r\n    <ng-template #textFilter>\r\n      <div class=\"filter-text-section\">\r\n        <div class=\"form-group mb-2\">\r\n          <select\r\n            class=\"form-select form-select-sm\"\r\n            [(ngModel)]=\"col.query.first_condition\"\r\n          >\r\n            <ng-container *ngIf=\"col.type !== 'date'\">\r\n              <option value=\"contain\">Contains</option>\r\n               <option value=\"does_not_contain\">Does Not Contain</option>\r\n              <option value=\"equal\">Equals</option>\r\n              <option value=\"before\">Starts With</option>\r\n              <option value=\"after\">Ends With</option>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"col.type == 'date'\">\r\n              <option value=\"equal\">Equals To</option>\r\n               <option value=\"not_equal\">Not Equal</option>\r\n              <option value=\"after\">After</option>\r\n              <option value=\"before\">Before</option>\r\n            </ng-container>\r\n          </select>\r\n        </div>\r\n\r\n        <input\r\n          [type]=\"col.type == 'date' ? 'date' : 'text'\"\r\n          class=\"form-control form-control-sm mb-3\"\r\n          placeholder=\"Value\"\r\n          [(ngModel)]=\"col!.query!.first_value\"\r\n        />\r\n\r\n        <div\r\n          class=\"form-group mb-3 d-flex flex-row muted\"\r\n          style=\"font-size: 14px\"\r\n        >\r\n          <div\r\n            class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input filter-radio-inputs\"\r\n              type=\"radio\"\r\n              name=\"condition\"\r\n              [(ngModel)]=\"col!.query.condition\"\r\n              value=\"and\"\r\n              id=\"and_{{ col.field }}\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"and_{{ col.field }}\"\r\n              >AND</label\r\n            >\r\n          </div>\r\n          <div\r\n            class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input filter-radio-inputs\"\r\n              type=\"radio\"\r\n              name=\"condition\"\r\n              [(ngModel)]=\"col!.query.condition\"\r\n              value=\"or\"\r\n              id=\"or_{{ col.field }}\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"or_{{ col.field }}\"\r\n              >OR</label\r\n            >\r\n          </div>\r\n          <div\r\n            class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input filter-radio-inputs\"\r\n              type=\"radio\"\r\n              name=\"condition\"\r\n              [(ngModel)]=\"col!.query.condition\"\r\n              value=\"none\"\r\n              id=\"none_{{ col.field }}\"\r\n            />\r\n            <label\r\n              class=\"nnonem-check-label mb-0 mt-1\"\r\n              for=\"none_{{ col.field }}\"\r\n              >None</label\r\n            >\r\n          </div>\r\n        </div>\r\n        <ng-container\r\n          *ngIf=\"col?.query?.first_value && col?.query?.condition !== 'none'\"\r\n        >\r\n          <div class=\"form-group mb-2\">\r\n            <select\r\n              class=\"form-select form-select-sm\"\r\n              [(ngModel)]=\"col!.query.second_condition\"\r\n            >\r\n              <ng-container *ngIf=\"col.type !== 'date'\">\r\n                <option value=\"contain\">Contains</option>\r\n                <option value=\"does_not_contain\">Does Not Contain</option>\r\n                <option value=\"equal\">Equals</option>\r\n                <option value=\"before\">Starts With</option>\r\n                <option value=\"after\">Ends With</option>\r\n              </ng-container>\r\n\r\n              <ng-container *ngIf=\"col.type == 'date'\">\r\n                <option value=\"equal\">Equals To</option>\r\n                 <option value=\"not_equal\">Not Equal</option>\r\n                <option value=\"after\">After</option>\r\n                <option value=\"before\">Before</option>\r\n              </ng-container>\r\n            </select>\r\n          </div>\r\n\r\n          <input\r\n            [type]=\"col.type == 'date' ? 'date' : 'text'\"\r\n            class=\"form-control form-control-sm mb-3\"\r\n            placeholder=\"Second Value\"\r\n            [(ngModel)]=\"col!.query.second_value\"\r\n          />\r\n        </ng-container>\r\n        <!-- <div class=\"d-flex gap-2\">\r\n          <div class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center\" style=\"height: 22px;\" (click)=\"applyDropdownFilter()\">apply</div>\r\n          <div class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center\" style=\"height: 22px;\" (click)=\"applyDropdownFilter()\">reset</div>\r\n\r\n        </div> -->\r\n      </div>\r\n    </ng-template>\r\n    <div\r\n      class=\"d-flex justify-content-center gap-2 border-top\"\r\n      style=\"height: 38px\"\r\n    >\r\n      <button\r\n        type=\"button\"\r\n        style=\"max-height: 30px\"\r\n        class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n        (click)=\"$event.stopPropagation(); removeSideFilter(col)\"\r\n      >\r\n        <span>Clear</span>\r\n      </button>\r\n      <button\r\n        type=\"button\"\r\n        style=\"max-height: 30px\"\r\n        class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n        (click)=\"applySideFilter(col)\"\r\n      >\r\n        <span style=\"margin-top: -1px\">Apply</span>\r\n      </button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Centr Overlay for showing the chose columns -->\r\n\r\n<div *ngIf=\"showColumnPanel\" class=\"custom-modal-overlay\">\r\n  <div\r\n    class=\"custom-modal-content\"\r\n    [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n    (click)=\"$event.stopPropagation()\"\r\n  >\r\n    <ng-container *ngTemplateOutlet=\"modalColumnPannel\"></ng-container>\r\n  </div>\r\n</div>\r\n\r\n<!-- The existing ng-template you provided -->\r\n<ng-template #modalColumnPannel>\r\n  <div class=\"column-panel-header\">\r\n    <div\r\n      class=\"d-flex justify-content-between align-items-center px-2 ps-3 rounded-top-2 moda-header\"\r\n      [style.height.px]=\"48\"\r\n    >\r\n      Choose Columns\r\n      <span class=\"filter-icon-wrapper\" (click)=\"closeModalColumnPanel()\"\r\n        ><span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n        ></span\r\n      ></span>\r\n    </div>\r\n    <hr class=\"my-0\" />\r\n    <div>\r\n      <div class=\"d-flex align-items-center px-2 pe-3\" [style.height.px]=\"48\">\r\n        <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\r\n          <span\r\n            class=\"toggle-icon data-grid-svg-icon\"\r\n            [inlineSVG]=\"\r\n              accordionState === 'all'\r\n                ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n                : accordionState === 'some'\r\n                ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\r\n                : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n            \"\r\n            (click)=\"toggleAllAccordions()\"\r\n          ></span>\r\n        </span>\r\n        <input\r\n          type=\"checkbox\"\r\n          class=\"form-check-input me-2\"\r\n          [checked]=\"allColumnsSelected()\"\r\n          (change)=\"toggleAllColumnsVisibility()\"\r\n        />\r\n        <input\r\n          type=\"text\"\r\n          class=\"form-control form-control-sm\"\r\n          placeholder=\"Search columns...\"\r\n          [(ngModel)]=\"choseColumnsSearch\"\r\n        />\r\n      </div>\r\n\r\n      <hr class=\"mt-0 mb-1\" />\r\n      <div class=\"px-2 overlay-scrollable\">\r\n        <ng-container\r\n          *ngFor=\"\r\n            let col of columns | filter : choseColumnsSearch : 'header';\r\n            trackBy: trackByField\r\n          \"\r\n        >\r\n          <ng-container\r\n            *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\r\n          ></ng-container>\r\n        </ng-container>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #sideMenuRowGroups>\r\n  <div class=\"d-flex flex-column h-100 d-none\">\r\n    <div class=\"px-3 h-100\">\r\n      <div class=\"d-flex gap-3 mb-4\">\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n        ></span>\r\n        <span>Row Groups</span>\r\n      </div>\r\n      <div class=\"h-50\">\r\n        <div\r\n          class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\r\n          style=\"font-size: 14px\"\r\n        >\r\n          Drag here to set row Groups\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <hr class=\"mt-4\" />\r\n\r\n    <div class=\"px-3 h-100\">\r\n      <div class=\"d-flex gap-3 mb-4\">\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\r\n          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n        ></span>\r\n        <span>Values</span>\r\n      </div>\r\n      <div class=\"h-50 d-flex\">\r\n        <div\r\n          class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\r\n          style=\"font-size: 14px\"\r\n        >\r\n          Drag here aggregate\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<!-- Drag Preview Template -->\r\n<!-- *************************************************** -->\r\n<!-- *************************************************** -->\r\n<ng-template #dragPreview let-col>\r\n  <div class=\"p-2 border d-flex gap-2\">\r\n    <div>\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\"\r\n        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n      ></span>\r\n    </div>\r\n    <div>{{ col.header }}</div>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Drag Placeholder Template -->\r\n<ng-template\r\n  #dragPlaceholder\r\n  let-col\r\n  let-i=\"index\"\r\n  let-section=\"section\"\r\n  let-draggingInGroupArea=\"draggingInGroupArea\"\r\n>\r\n  <div *ngIf=\"!draggingInGroupArea\">\r\n    <div\r\n      *ngTemplateOutlet=\"\r\n        headerCell;\r\n        context: { $implicit: col, index: i, section: section }\r\n      \"\r\n    ></div>\r\n  </div>\r\n  <div *ngIf=\"draggingInGroupArea\">New Placeholder</div>\r\n</ng-template>\r\n\r\n<!-- Top Group Row Placeholder -->\r\n<ng-template #topGroupingRowPlaceholder let-col let-showChevron=\"showChevron\">\r\n  <div class=\"d-flex gap-2\">\r\n    <div\r\n      class=\"d-flex gap-2 top-row-grouping-placeholder\"\r\n      [style.backgroundColor]=\"topGroupedBadgesBackgroundColor\"\r\n    >\r\n      <span\r\n        cdkDragHandle\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\r\n        class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n      ></span>\r\n      <span>{{ col.header }}</span>\r\n      <span\r\n        (click)=\"ungroupColumn(col)\"\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\r\n        class=\"cursor-pointer data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n      ></span>\r\n    </div>\r\n  </div>\r\n  <div *ngIf=\"showChevron\" style=\"opacity: 0.6; font-size: 14px\">\r\n    <span\r\n      [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\"\r\n      class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n    ></span>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template\r\n  #childHeaderPlaceholder\r\n  let-col\r\n  let-pinnedRight=\"pinnedRight\"\r\n  let-i=\"index\"\r\n  let-sections=\"sections\"\r\n>\r\n  <div\r\n    class=\"header-cell one-row-header-cells\"\r\n    [class.border-right]=\"showVerticalBorder\"\r\n    [style.width.px]=\"col.width\"\r\n    [style.min-width.px]=\"col.width\"\r\n    [style.min-height.px]=\"headerRowHeight\"\r\n    [style.max-height.px]=\"headerRowHeight\"\r\n    [style.fontWeight]=\"headerFontWeight\"\r\n  >\r\n    <div class=\"d-flex justify-content-between h-100 align-items-center w-100\">\r\n      <div\r\n        class=\"d-flex justify-content-between align-items-center w-100\"\r\n        [class.flex-row-reverse]=\"pinnedRight\"\r\n      >\r\n        <div\r\n          class=\"text-ellipsis h-100 d-flex align-items-center\"\r\n          [title]=\"col.header\"\r\n          [class.w-100]=\"pinnedRight\"\r\n        >\r\n          {{ col.header }}\r\n        </div>\r\n\r\n        <div\r\n          class=\"position-relative d-flex\"\r\n          [class.flex-row-reverse]=\"pinnedRight\"\r\n        >\r\n          <div class=\"three-dots p-1\" style=\"cursor: pointer\">\r\n            <span\r\n              [inlineSVG]=\"\r\n                singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\r\n              \"\r\n              class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n            ></span>\r\n          </div>\r\n\r\n          <div class=\"resize-handle\">\r\n            <span\r\n              [inlineSVG]=\"\r\n                singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n              \"\r\n              class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n            ></span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n  <div\r\n    *ngIf=\"showFilterRow\"\r\n    [style.backgroundColor]=\"headerBackgroundColor\"\r\n    class=\"header-cell filter-cell\"\r\n    [class.border-right]=\"showVerticalBorder\"\r\n    [style.width.px]=\"col.width\"\r\n    [style.min-width.px]=\"col.width\"\r\n    [style.height.px]=\"headerRowHeight\"\r\n    [style.min-height.px]=\"headerRowHeight\"\r\n    [style.max-height.px]=\"headerRowHeight\"\r\n    [class.border-right]=\"showVerticalBorder\"\r\n    style=\"grid-row: 3\"\r\n  >\r\n    <div\r\n      class=\"header-cell filter-cell\"\r\n      [style.backgroundColor]=\"headerBackgroundColor\"\r\n      [style.width.px]=\"col.width\"\r\n      [style.min-width.px]=\"col.width\"\r\n      [style.height.px]=\"headerRowHeight\"\r\n      [style.min-height.px]=\"headerRowHeight\"\r\n      [style.max-height.px]=\"headerRowHeight\"\r\n    >\r\n      <input\r\n        type=\"text\"\r\n        class=\"form-control form-control-sm\"\r\n        placeholder=\"Filter\"\r\n        [(ngModel)]=\"col.filterValue\"\r\n        [readonly]=\"col?.type == 'dropdown' || col?.type == 'image'\"\r\n        [class.disabled-search-input]=\"\r\n          col?.type == 'dropdown' || col?.type == 'image'\r\n        \"\r\n      />\r\n      <span\r\n        class=\"filter-icon-wrapper\"\r\n        (click)=\"activeFilterCell = col; activeCol = null\"\r\n        ><span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n          class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n        ></span\r\n      ></span>\r\n\r\n      <div\r\n        class=\"position-absolute\"\r\n        *ngIf=\"activeFilterCell === col\"\r\n        style=\"top: 100%; right: 0; z-index: 10; left: 0\"\r\n      ></div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #tableLayout>\r\n  <div\r\n    (click)=\"$event.stopPropagation()\"\r\n    class=\"p-3 shadow actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n    style=\"width: 320px\"\r\n  >\r\n    <div class=\"d-flex align-items-center mb-3\">\r\n      <button\r\n        class=\"btn btn-link p-0\"\r\n        style=\"margin-left: -10px\"\r\n        (click)=\"toggleActions('setting')\"\r\n      >\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n          class=\"data-grid-svg-icon me-2\"\r\n        ></span>\r\n      </button>\r\n      <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Layout</h6>\r\n    </div>\r\n    <hr class=\"my-2\" />\r\n    <div class=\"w-100 mb-3 d-flex\" role=\"group\">\r\n      <input\r\n        type=\"radio\"\r\n        class=\"btn-check layout-button-check\"\r\n        name=\"layoutSize\"\r\n        id=\"small\"\r\n        autocomplete=\"off\"\r\n        (change)=\"changeTableLayout($event, 'small')\"\r\n        [checked]=\"selectedTableLayout == 'small'\"\r\n      />\r\n      <label\r\n        class=\"border d-flex flex-column align-items-center layout-button\"\r\n        for=\"small\"\r\n        [ngStyle]=\"{\r\n          color: selectedTableLayout == 'small' ? '#000' : '#727272'\r\n        }\"\r\n      >\r\n        <div class=\"preview-box border mb-1\" style=\"height: 8px\"></div>\r\n        Small\r\n      </label>\r\n\r\n      <input\r\n        type=\"radio\"\r\n        class=\"btn-check layout-button-check\"\r\n        name=\"layoutSize\"\r\n        id=\"medium\"\r\n        autocomplete=\"off\"\r\n        [checked]=\"selectedTableLayout == 'medium'\"\r\n        (change)=\"changeTableLayout($event, 'medium')\"\r\n      />\r\n      <label\r\n        class=\"border mx-3 d-flex flex-column align-items-center layout-button\"\r\n        for=\"medium\"\r\n        [ngStyle]=\"{\r\n          color: selectedTableLayout == 'medium' ? '#000' : '#727272'\r\n        }\"\r\n      >\r\n        <div class=\"preview-box border mb-1\" style=\"height: 12px\"></div>\r\n        Medium\r\n      </label>\r\n\r\n      <input\r\n        type=\"radio\"\r\n        class=\"btn-check layout-button-check\"\r\n        name=\"layoutSize\"\r\n        id=\"large\"\r\n        autocomplete=\"off\"\r\n        (change)=\"changeTableLayout($event, 'large')\"\r\n        [checked]=\"selectedTableLayout == 'large'\"\r\n      />\r\n      <label\r\n        class=\"border d-flex flex-column align-items-center layout-button\"\r\n        for=\"large\"\r\n        [ngStyle]=\"{\r\n          color: selectedTableLayout == 'large' ? '#000' : '#727272'\r\n        }\"\r\n      >\r\n        <div class=\"preview-box border mb-1\" style=\"height: 16px\"></div>\r\n        Large\r\n      </label>\r\n    </div>\r\n\r\n    <hr class=\"my-2\" />\r\n    <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n      <span>Show separators</span>\r\n      <div class=\"form-check form-switch m-0\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          type=\"checkbox\"\r\n          id=\"separators\"\r\n          [(ngModel)]=\"showVerticalBorder\"\r\n          (change)=\"onFontChange()\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <div class=\"d-flex justify-content-between align-items-center\">\r\n      <span>Row shading</span>\r\n      <div class=\"form-check form-switch m-0\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          [(ngModel)]=\"rowShadingEnabled\"\r\n          (change)=\"toggleRowShading()\"\r\n          type=\"checkbox\"\r\n          id=\"rowShading\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <!-- <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n      <span>Show Side Menu</span>\r\n      <div class=\"form-check form-switch m-0\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          [(ngModel)]=\"showSideMenu\"\r\n          type=\"checkbox\"\r\n          id=\"rowShading\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n      <span>Show Filter Row</span>\r\n      <div class=\"form-check form-switch m-0\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          [(ngModel)]=\"showFilterRow\"\r\n          type=\"checkbox\"\r\n          id=\"rowShading\"\r\n        />\r\n      </div>\r\n    </div> -->\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #tablePreset>\r\n  <div\r\n    *ngIf=\"activeSubButton !== 'save-preset'\"\r\n    (click)=\"$event.stopPropagation()\"\r\n    class=\"p-3 shadow actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n    style=\"width: 280px\"\r\n  >\r\n    <!-- Header -->\r\n    <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n      <div class=\"d-flex align-items-center\">\r\n        <button\r\n          class=\"btn btn-link p-0\"\r\n          style=\"margin-left: -10px\"\r\n          (click)=\"toggleActions('setting')\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n            class=\"data-grid-svg-icon\"\r\n          ></span>\r\n        </button>\r\n        <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Presets</h6>\r\n      </div>\r\n      <!-- Save Preset Button with Dropdown -->\r\n      <div>\r\n        <a\r\n          class=\"text-decoration-none text-primary\"\r\n          type=\"button\"\r\n          id=\"savePresetDropdown\"\r\n          (click)=\"$event.stopPropagation(); toggleSubActions('save-preset')\"\r\n        >\r\n          {{ isTablePresetNotChanged ? \"Save preset\" : \"Update Preset\" }}\r\n        </a>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Search -->\r\n    <div class=\"mb-3\">\r\n      <div class=\"col-12 global-search\">\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n          class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n        ></span>\r\n        <input\r\n          class=\"form-control form-control-sm\"\r\n          placeholder=\"Search...\"\r\n          [(ngModel)]=\"searchTextPresetTable\"\r\n          type=\"search\"\r\n        />\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Preset List -->\r\n    <ng-container\r\n      *ngIf=\"\r\n        tableView | filter : searchTextPresetTable : 'name' as filteredList\r\n      \"\r\n    >\r\n      <!-- If filteredList exists and none is default -> show fallback -->\r\n      <div\r\n        class=\" pb-5\"\r\n        [style.maxHeight.px]=\"dataGridContainer.offsetHeight - 250\"\r\n      >\r\n        <div\r\n          class=\"cursor-pointer\"\r\n          (click)=\"\r\n            clearAllFilters();\r\n            openIndex = null;\r\n            temp_state.id = '';\r\n            activeTopButton = '';\r\n            curretaTablePresetForUpdate = null\r\n          \"\r\n        >\r\n          <div class=\"fw-semibold\">Default View</div>\r\n        </div>\r\n        <div class=\"d-flex justify-content-between\">\r\n          <small class=\"text-dark\">Created by system</small>\r\n          <span\r\n            *ngIf=\"!tableFilterViewId && !hasAnyDefaultView()\"\r\n            class=\"badge bg-light text-primary ms-2\"\r\n            >Default</span\r\n          >\r\n          <span\r\n            *ngIf=\"!tableFilterViewId && !hasAnyDefaultView()\"\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\"\r\n            class=\"me-2\"\r\n          ></span>\r\n          <div\r\n            class=\"dropdown d-flex justify-content-end\"\r\n            *ngIf=\"tableFilterViewId\"\r\n          ></div>\r\n        </div>\r\n\r\n        <!-- The list: render each table from filteredList -->\r\n        <div\r\n          class=\"list-group list-group-flush\"\r\n          *ngFor=\"\r\n            let table of filteredList;\r\n            let i = index;\r\n            trackBy: trackByTable\r\n          \"\r\n        >\r\n          <!-- Item -->\r\n          <div\r\n            (click)=\"\r\n              $event.stopPropagation(); openIndex = null; activeTopButton = ''\r\n            \"\r\n            class=\"list-group-item px-0 d-flex justify-content-between align-items-center\"\r\n          >\r\n            <div (click)=\"selectFilter(table); openIndex = null\">\r\n              <div class=\"fw-semibold\" style=\"cursor: pointer\">\r\n                {{ table?.name }}\r\n                <!-- {{table?.is_temp}} -->\r\n                <span\r\n                  *ngIf=\"\r\n                    (table?.is_temp && !temp_state.id) ||\r\n                    temp_state.id == table.id\r\n                  \"\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\r\n                  \"\r\n                  class=\"me-2\"\r\n                ></span>\r\n                <span\r\n                  *ngIf=\"table?.is_default\"\r\n                  class=\"badge bg-light text-primary ms-2\"\r\n                  >Default</span\r\n                >\r\n              </div>\r\n              <small class=\"text-dark\" *ngIf=\"table?.config?.filterNames\" [title]=\"table?.config?.filterNames\">\r\n              {{\r\n              table?.config?.filterNames?.length > 25 \r\n              ? (table?.config?.filterNames | slice:0:25) + '...'\r\n              : table?.config?.filterNames\r\n              }}\r\n              ({{ table?.config?.totalCount }})\r\n            </small>\r\n             <small class=\"text-dark\" *ngIf=\"!table?.config?.filterNames\">{{ table?.createdAt | date : \"MMM d, y\" }}</small>\r\n            </div>\r\n\r\n            <div class=\"d-flex align-items-center\">\r\n              <span\r\n                *ngIf=\"table?.is_default\"\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\r\n                \"\r\n                class=\"me-2\"\r\n              ></span>\r\n\r\n              <div class=\"dropdown\" *ngIf=\"!table?.is_default\">\r\n                <div\r\n                  class=\"dropdown-wrapper\"\r\n                  (click)=\"$event.stopPropagation()\"\r\n                >\r\n                  <button\r\n                    type=\"button\"\r\n                    class=\"btn-icon muted-text\"\r\n                    (click)=\"toggleMenu(i, $event)\"\r\n                    aria-haspopup=\"true\"\r\n                    [attr.aria-expanded]=\"openIndex === i\"\r\n                  >\r\n                    <span\r\n                      [inlineSVG]=\"\r\n                        singleSpaAssetsPath +\r\n                        'data-grid/icons/horizontal-dots.svg'\r\n                      \"\r\n                      class=\"me-2\"\r\n                    ></span>\r\n                  </button>\r\n\r\n                  <!-- menu -->\r\n                  <ul\r\n                    *ngIf=\"openIndex === i\"\r\n                    class=\"custom-dropdown-menu\"\r\n                    role=\"menu\"\r\n                  >\r\n                    <li role=\"none\">\r\n                      <button\r\n                        role=\"menuitem\"\r\n                        class=\"dropdown-item\"\r\n                        (click)=\"\r\n                          actionPreset(table, 'setPreset'); temp_state.id = ''\r\n                        \"\r\n                      >\r\n                        <span\r\n                          [inlineSVG]=\"\r\n                            singleSpaAssetsPath + 'data-grid/icons/star.svg'\r\n                          \"\r\n                          class=\"me-2\"\r\n                        ></span>\r\n                        Set as default\r\n                      </button>\r\n                    </li>\r\n\r\n                    <li role=\"none\" *ngIf=\"!table.confirmDelete\">\r\n                      <button\r\n                        role=\"menuitem\"\r\n                        class=\"dropdown-item text-danger\"\r\n                        (click)=\"table.confirmDelete = true\"\r\n                      >\r\n                        <span\r\n                          style=\"margin-top: -4px\"\r\n                          [inlineSVG]=\"\r\n                            singleSpaAssetsPath +\r\n                            'data-grid/icons/trash-red.svg'\r\n                          \"\r\n                          class=\"me-2\"\r\n                        ></span>\r\n                        Delete\r\n                      </button>\r\n                    </li>\r\n\r\n                    <li\r\n                      role=\"none\"\r\n                      *ngIf=\"table.confirmDelete\"\r\n                      class=\"confirm-block\"\r\n                    >\r\n                      <div class=\"px-3 py-2 text-center\">\r\n                        <div class=\"mb-2\">\r\n                          Are you sure you want to delete <br /><b\r\n                            >“{{ table?.name }}”</b\r\n                          >?\r\n                        </div>\r\n                        <div class=\"d-flex gap-2\">\r\n                          <button\r\n                            class=\"btn btn-sm btn-light me-2\"\r\n                            (click)=\"table.confirmDelete = false\"\r\n                          >\r\n                            Cancel\r\n                          </button>\r\n                          <button\r\n                            class=\"btn btn-sm btn-danger\"\r\n                            (click)=\"actionPreset(table, 'deletePreset')\"\r\n                          >\r\n                            Delete\r\n                          </button>\r\n                        </div>\r\n                      </div>\r\n                    </li>\r\n                  </ul>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <!-- Item End Here -->\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n  </div>\r\n\r\n  <div\r\n    (click)=\"$event.stopPropagation()\"\r\n    *ngIf=\"activeSubButton == 'save-preset'\"\r\n    class=\"dropdown-menu p-3 badge mt-4 save-preset-dropdown mt-1\"\r\n    aria-labelledby=\"savePresetDropdown\"\r\n    style=\"min-width: 250px\"\r\n  >\r\n    <div class=\"fw-bold fs-14px mb-2\">\r\n      {{ isTablePresetNotChanged ? \"Save preset\" : \"Update Preset\" }}\r\n    </div>\r\n    <div class=\"fs-14px mb-2\" style=\"line-height: 20px\">\r\n      This will save the current table adjustments as a preset.\r\n    </div>\r\n    <!-- Input -->\r\n    <div class=\"mb-2\">\r\n      <label for=\"presetName\" class=\"form-label fs-12px fw-bold\"\r\n        >Preset Name</label\r\n      >\r\n      <div class=\"col-12 global-search\">\r\n        <input\r\n          #presetNameCtrl=\"ngModel\"\r\n          required\r\n          [(ngModel)]=\"presetName\"\r\n          [ngClass]=\"{\r\n            'is-invalid':\r\n              presetNameCtrl.invalid &&\r\n              (presetNameCtrl.dirty || presetNameCtrl.touched)\r\n          }\"\r\n          class=\"form-control form-control-sm ps-2\"\r\n          placeholder=\"Enter preset name\"\r\n          type=\"text\"\r\n        />\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Checkbox -->\r\n    <div class=\"form-check mb-2\">\r\n      <input\r\n        class=\"form-check-input\"\r\n        [(ngModel)]=\"presetFilter\"\r\n        type=\"checkbox\"\r\n        id=\"saveFilters\"\r\n      />\r\n      <label class=\"form-check-label mt-1\" for=\"saveFilters\">\r\n        Save active filters\r\n      </label>\r\n    </div>\r\n\r\n    <!-- Save Button -->\r\n    <div class=\"d-flex justify-content-center gap-2\" style=\"height: 32px\">\r\n      <button\r\n        type=\"button\"\r\n        style=\"height: 32px\"\r\n        class=\"btn border w-100 d-flex align-items-center justify-content-center btn-light\"\r\n        (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n        style=\"margin-top: -2px\"\r\n      >\r\n        <span>Cancel</span>\r\n      </button>\r\n      <button\r\n        [disabled]=\"closeDropdown.preset.loading\"\r\n        (click)=\"savePreset(presetNameCtrl)\"\r\n        type=\"button\"\r\n        style=\"height: 32px\"\r\n        class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center\"\r\n      >\r\n        <span style=\"margin-top: -2px\" *ngIf=\"isTablePresetNotChanged\">\r\n          <ng-container *ngIf=\"!closeDropdown.preset.loading\"\r\n            >Save</ng-container\r\n          >\r\n          <ng-container *ngIf=\"closeDropdown.preset.loading\"\r\n            ><span class=\"spinner-border spinner-border-sm\"></span\r\n          ></ng-container>\r\n        </span>\r\n        <span style=\"white-space: nowrap\" *ngIf=\"!isTablePresetNotChanged\"\r\n          >Update Preset</span\r\n        >\r\n      </button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #showHideColumns>\r\n  <div\r\n    (click)=\"$event.stopPropagation()\"\r\n    class=\"p-3 shadow actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n    style=\"width: 280px\"\r\n  >\r\n    <!-- Header -->\r\n    <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n      <div class=\"d-flex align-items-center\">\r\n        <button\r\n          class=\"btn btn-link p-0\"\r\n          style=\"margin-left: -10px\"\r\n          (click)=\"toggleActions('setting')\"\r\n        >\r\n          <span\r\n            [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n            class=\"data-grid-svg-icon\"\r\n          ></span>\r\n        </button>\r\n        <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Columns</h6>\r\n      </div>\r\n      <a\r\n        (click)=\"resetColumns()\"\r\n        href=\"javascript:void(0)\"\r\n        class=\"text-primary text-decoration-none\"\r\n        >Reset</a\r\n      >\r\n    </div>\r\n\r\n    <!-- Search -->\r\n    <div class=\"mb-3\">\r\n      <div class=\"col-12 global-search\">\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n          class=\"mx-2 position-absolute icon data-grid-svg-icon\"\r\n        ></span>\r\n        <input\r\n          class=\"form-control form-control-sm\"\r\n          placeholder=\"Search column\"\r\n          type=\"search\"\r\n          [(ngModel)]=\"topShowHideColumns\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <!-- Preset List -->\r\n    <div\r\n      class=\"list-group list-group-flush\"\r\n      style=\"overflow: auto; scrollbar-width: thin\"\r\n      [style.maxHeight.px]=\"dataGridContainer.offsetHeight - 220\"\r\n    >\r\n      <div class=\"muted-text show-hide-table-label d-flex justify-content-between\" *ngIf=\"hasAnyVisibleColumn\">\r\n        Show in table\r\n         <div class=\"form-check\">\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"checkbox\"\r\n              id=\"hide_all\"\r\n              [checked]=\"allColumnsSelected()\"\r\n              (change)=\"toggleAllColumnsVisibility()\"\r\n            />\r\n            <label class=\"form-check-label fw-semibold\" for=\"hide_all\">\r\n              Show/Hide All \r\n            </label>\r\n          </div>\r\n      </div>\r\n      <!-- Item -->\r\n      <ng-container\r\n        *ngFor=\"\r\n          let col of columns | filter : topShowHideColumns : 'header';\r\n          trackBy: trackByField\r\n        \"\r\n      >\r\n        <div\r\n          *ngIf=\"col.is_visible\"\r\n          class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\r\n        >\r\n          <div class=\"d-flex gap-1\">\r\n            <div>\r\n              <span\r\n                *ngIf=\"!col?.pinned\"\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\r\n                \"\r\n                class=\"cursor-grap data-grid-svg-icon\"\r\n                (mousedown)=\"$event.preventDefault()\"\r\n              ></span>\r\n              <span\r\n                *ngIf=\"col?.pinned\"\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n                \"\r\n                class=\"cursor-grap data-grid-svg-icon\"\r\n                (mousedown)=\"$event.preventDefault()\"\r\n              ></span>\r\n            </div>\r\n            <div class=\"fw-semibold\">\r\n              {{ col.header }}\r\n            </div>\r\n          </div>\r\n          <div\r\n            *ngIf=\"!col?.query?.first_value && !col?.query?._ids?.length\"\r\n            class=\"d-flex align-items-center cursor-pointer\"\r\n            (click)=\"toggleColumnVisibility(col, false)\"\r\n            [class.disabled]=\"visibleColumns().length <= 2 || col?.is_always_visible\"\r\n            [class.pe-none]=\"visibleColumns().length <= 2 || col?.is_always_visible\"\r\n            [class.opacity-50]=\"visibleColumns().length <= 2 || col?.is_always_visible\"\r\n          >\r\n            <span\r\n              [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n              class=\"data-grid-svg-icon me-2\"\r\n            ></span>\r\n          </div>\r\n          <div\r\n            *ngIf=\"col?.query?.first_value || col?.query?._ids?.length\"\r\n            class=\"d-flex align-items-center\"\r\n            style=\"opacity: 0.5\"\r\n          >\r\n            <span\r\n              [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n              class=\"data-grid-svg-icon me-2\"\r\n            ></span>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <!-- Item End Here -->\r\n\r\n      <div\r\n        class=\"dropdown-divider\"\r\n        *ngIf=\"hasAnyVisibleColumn && hasAnyInVisibleColumn\"\r\n      ></div>\r\n\r\n      <div\r\n        class=\"muted-text show-hide-table-label d-flex justify-content-between\"\r\n        *ngIf=\"hasAnyInVisibleColumn\"\r\n      >\r\n        Hide in table\r\n        <div class=\"form-check\">\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"checkbox\"\r\n              id=\"show_all\"\r\n              [checked]=\"allColumnsSelected()\"\r\n              (change)=\"toggleAllColumnsVisibility()\"\r\n            />\r\n            <label class=\"form-check-label fw-semibold\" for=\"show_all\">\r\n              Show/Hide All \r\n            </label>\r\n          </div>\r\n      </div>\r\n      <div class=\"list-group list-group-flush\">\r\n        <ng-container *ngFor=\"let col of columns; trackBy: trackByField\">\r\n          <div\r\n            *ngIf=\"!col.is_visible\"\r\n            class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\r\n          >\r\n            <div class=\"d-flex gap-1\">\r\n              <div>\r\n                <span\r\n                  *ngIf=\"!col?.pinned\"\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon cursor-grap\"\r\n                  (mousedown)=\"$event.preventDefault()\"\r\n                ></span>\r\n                <span\r\n                  *ngIf=\"col?.pinned\"\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon cursor-grap\"\r\n                  (mousedown)=\"$event.preventDefault()\"\r\n                ></span>\r\n              </div>\r\n              <div class=\"fw-semibold\">\r\n                {{ col.header }}\r\n              </div>\r\n            </div>\r\n            <div\r\n              class=\"d-flex align-items-center cursor-pointer\"\r\n              (click)=\"toggleColumnVisibility(col, true)\"\r\n            >\r\n              <span\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\r\n                \"\r\n                class=\"data-grid-svg-icon me-2\"\r\n              ></span>\r\n            </div>\r\n          </div>\r\n        </ng-container>\r\n      </div>\r\n\r\n      <!-- Item End Here -->\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #filterColumns let-col=\"column\">\r\n  <div\r\n    @slideToggle\r\n    *ngIf=\"!isFilterOpen && activeTopButton == 'filter-columns'\"\r\n    (click)=\"$event.stopPropagation()\"\r\n    class=\"shadow actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n    style=\"width: 280px; right: unset; max-width: 230px\"\r\n    [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n  >\r\n    <div class=\"mb-2 px-3\">\r\n      <div class=\"col-12 global-search\">\r\n        <span\r\n          [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n          class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n        ></span>\r\n        <input\r\n          class=\"form-control form-control-sm\"\r\n          placeholder=\"Filter by\"\r\n          type=\"search\"\r\n          [(ngModel)]=\"addFilterColumnInput\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <div\r\n      class=\"list-group list-group-flush\"\r\n      style=\"max-height: calc(100vh - 500px); overflow: auto\"\r\n    >\r\n      <ng-container\r\n        *ngFor=\"\r\n          let col of columns | filter : addFilterColumnInput : 'header';\r\n          trackBy: trackByField\r\n        \"\r\n      >\r\n        <div\r\n          (click)=\"openFilter(col)\"\r\n          *ngIf=\"\r\n            col.is_visible &&\r\n            !col?.query?.first_value &&\r\n            !col?.query?._ids?.length\r\n          \"\r\n          class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n        >\r\n          <div class=\"d-flex gap-1\">\r\n            <div style=\"margin-top: -3px\"></div>\r\n            <div class=\"fw-semibold\">\r\n              {{ col.header }}\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Dropdown -->\r\n  <div\r\n    @slideToggle\r\n    *ngIf=\"isFilterOpen && selectedColumnForFilter.type == 'dropdown'\"\r\n    (click)=\"$event.stopPropagation()\"\r\n    class=\"shadow actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns pb-2\"\r\n    style=\"width: 280px; right: unset; max-width: 230px\"\r\n    [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n  >\r\n    <div class=\"px-3 my-2 border-below py-1 pb-2 mb-3 d-flex ps-1\">\r\n      <span\r\n        (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n        class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n      ></span\r\n      ><b>{{ selectedColumnForFilter?.header }}</b>\r\n    </div>\r\n    <div class=\"mb-2 px-3\">\r\n      <div\r\n        class=\"col-12 global-search position-relative border rounded d-flex align-items-center flex-wrap px-2 filter-serach-inpt\"\r\n      >\r\n        <span\r\n          *ngFor=\"let selected of selectedFilterOptions\"\r\n          class=\"badge d-flex align-items-center gap-1 me-1 mb-1\"\r\n        >\r\n          {{ selected?.value ? selected.value : selected }}\r\n          <span\r\n            (click)=\"toggleSelectionInFilter(selected)\"\r\n            [inlineSVG]=\"\r\n              singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n            \"\r\n            class=\"me-2\"\r\n          ></span>\r\n        </span>\r\n        <input\r\n          class=\"form-control form-control-sm border-0 flex-grow-1\"\r\n          style=\"padding: 0\"\r\n          [placeholder]=\"selectedFilterOptions?.length ? '' : 'Filter by'\"\r\n          type=\"search\"\r\n          [(ngModel)]=\"searchTextForFilterDropDown\"\r\n          (keydown.backspace)=\"handleBackspace($event)\"\r\n        />\r\n      </div>\r\n    </div>\r\n    <div\r\n      class=\"list-group list-group-flush\"\r\n      style=\"max-height: calc(100vh - 600px); overflow: auto\"\r\n    >\r\n      <ng-container\r\n        *ngFor=\"\r\n          let col of selectedColumnForFilter.column_dropdown_value\r\n            | filter : searchTextForFilterDropDown : 'value';\r\n          let i = index\r\n        \"\r\n      >\r\n        <div\r\n          class=\"list-group-item border-0 px-2 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n        >\r\n          <div class=\"form-check\">\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"checkbox\"\r\n              [id]=\"i\"\r\n              [checked]=\"currentFilterSelectedIds.has(col.id || col._id || col)\"\r\n              (change)=\"toggleSelectionInFilter(col)\"\r\n            />\r\n            <label class=\"form-check-label fw-semibold\" [for]=\"i\">\r\n              {{ col?.value || col?.name || col }}\r\n            </label>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n    </div>\r\n    <div\r\n      class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n      style=\"height: 38px\"\r\n    >\r\n      <button\r\n        type=\"button\"\r\n        style=\"height: 32px\"\r\n        class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n        (click)=\"$event.stopPropagation(); resetFilterChanges()\"\r\n      >\r\n        <span>Cancel</span>\r\n      </button>\r\n      <button\r\n        type=\"button\"\r\n        style=\"height: 32px\"\r\n        class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n        (click)=\"applyDropdownFilter()\"\r\n      >\r\n        <span style=\"margin-top: -2px\">Save</span>\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- For Text fields and number fields-->\r\n\r\n  <div\r\n    @slideToggle\r\n    *ngIf=\"\r\n      isFilterOpen &&\r\n      (selectedColumnForFilter.type == 'string' ||\r\n        selectedColumnForFilter.type == 'number' ||\r\n        selectedColumnForFilter.type == 'date')\r\n    \"\r\n    (click)=\"$event.stopPropagation()\"\r\n    class=\"shadow actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns pb-2\"\r\n    style=\"width: 210px; right: unset; max-width: 230px\"\r\n    [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n  >\r\n    <div class=\"px-3 border-below py-1 pb-2 d-flex ps-1\">\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n        (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n        class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n      ></span\r\n      ><b>{{ selectedColumnForFilter?.header }}</b>\r\n    </div>\r\n    <div class=\"col-12 position-relative p-2 text-filter\">\r\n      <div class=\"mb-2\">\r\n        <select\r\n          class=\"form-select form-select-sm custom-select border\"\r\n          [(ngModel)]=\"firstCondition\"\r\n        >\r\n          <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\r\n            <option value=\"contain\">Contains</option>\r\n             <option value=\"does_not_contain\">Does Not Contain</option>\r\n            <option value=\"equal\">Equals</option>\r\n            <option value=\"before\">Starts With</option>\r\n            <option value=\"after\">Ends With</option>\r\n          </ng-container>\r\n\r\n          <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\r\n            <option value=\"equal\">Equals To</option>\r\n             <option value=\"not_equal\">Not Equal</option>\r\n            <option value=\"after\">After</option>\r\n            <option value=\"before\">Before</option>\r\n          </ng-container>\r\n        </select>\r\n      </div>\r\n      <div class=\"mb-2\">\r\n        <input\r\n          class=\"form-control form-control-sm\"\r\n          placeholder=\"Enter first value\"\r\n          type=\"search\"\r\n          [type]=\"\r\n            selectedColumnForFilter.type == 'string'\r\n              ? 'text'\r\n              : selectedColumnForFilter.type\r\n          \"\r\n          [(ngModel)]=\"firstValue\"\r\n          (keydown.enter)=\"applyDropdownFilter()\"\r\n        />\r\n      </div>\r\n      <div>\r\n        <div class=\"d-flex my-3 d-flex flex-row\" style=\"font-size: 14px\">\r\n          <div\r\n            class=\"form-check form-check-inline col-4 m-0 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"radio\"\r\n              id=\"logicalAnd\"\r\n              name=\"logicalOperator\"\r\n              value=\"and\"\r\n              [(ngModel)]=\"condition\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"logicalAnd\"\r\n              >AND</label\r\n            >\r\n          </div>\r\n\r\n          <div\r\n            class=\"form-check form-check-inline col-4 m-0 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"radio\"\r\n              id=\"logicalOr\"\r\n              name=\"logicalOperator\"\r\n              value=\"or\"\r\n              [(ngModel)]=\"condition\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"logicalOr\">OR</label>\r\n          </div>\r\n\r\n          <div\r\n            class=\"form-check form-check-inline col-4 m-0 d-flex align-items-center gap-1\"\r\n          >\r\n            <input\r\n              class=\"form-check-input\"\r\n              type=\"radio\"\r\n              id=\"logicalNone\"\r\n              name=\"logicalOperator\"\r\n              value=\"none\"\r\n              [(ngModel)]=\"condition\"\r\n            />\r\n            <label class=\"form-check-label mb-0 mt-1\" for=\"logicalNone\"\r\n              >None</label\r\n            >\r\n          </div>\r\n        </div>\r\n\r\n        <ng-container *ngIf=\"condition !== 'none' && firstValue\">\r\n          <div class=\"mb-2 mt-3\">\r\n            <!-- Second condition select -->\r\n            <select\r\n              class=\"form-select form-select-sm border\"\r\n              [(ngModel)]=\"secondCondition\"\r\n            >\r\n              <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\r\n                <option value=\"contain\">Contains</option>\r\n                <option value=\"does_not_contain\">Does Not Contain</option>\r\n                <option value=\"equal\">Equals</option>\r\n                <option value=\"before\">Starts With</option>\r\n                <option value=\"after\">Ends With</option>\r\n              </ng-container>\r\n\r\n              <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\r\n                <option value=\"equal\">Equals To</option>\r\n                <option value=\"not_equal\">Not Equal</option>\r\n                <option value=\"after\">After</option>\r\n                <option value=\"before\">Before</option>\r\n              </ng-container>\r\n            </select>\r\n          </div>\r\n\r\n          <div class=\"mb-2\">\r\n            <!-- Second value input -->\r\n            <input\r\n              [type]=\"\r\n                selectedColumnForFilter.type == 'string'\r\n                  ? 'text'\r\n                  : selectedColumnForFilter.type\r\n              \"\r\n              class=\"form-control form-control-sm\"\r\n              placeholder=\"Enter second value\"\r\n              type=\"search\"\r\n              [(ngModel)]=\"secondValue\"\r\n              (keydown.enter)=\"applyDropdownFilter()\"\r\n            />\r\n          </div>\r\n        </ng-container>\r\n      </div>\r\n    </div>\r\n\r\n    <div\r\n      class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n      style=\"height: 38px\"\r\n    >\r\n      <button\r\n        [disabled]=\"!currentFilterSelectedIds?.size && !firstValue\"\r\n        type=\"button\"\r\n        style=\"height: 32px\"\r\n        class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n        (click)=\"$event.stopPropagation(); resetTextFilterChanges()\"\r\n      >\r\n        <span>Cancel</span>\r\n      </button>\r\n      <button\r\n        [disabled]=\"currentFilterSelectedIds?.size === 0 && !firstValue\"\r\n        type=\"button\"\r\n        style=\"height: 32px\"\r\n        class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n        (click)=\"applyDropdownFilter()\"\r\n      >\r\n        <span style=\"margin-top: -2px\">Apply</span>\r\n      </button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<!-- Edit dropdown here -->\r\n<ng-template let-col>\r\n  <div class=\"drop-down-edit\"></div>\r\n</ng-template>\r\n\r\n<ng-template\r\n  #fullTextTemplate\r\n  let-row=\"row\"\r\n  let-col=\"col\"\r\n  let-isArray=\"isArray\"\r\n>\r\n  <div\r\n    class=\"full-text-box\"\r\n    (dblclick)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n    (click)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n    [style.maxHeight.px]=\"dataGridContainer.offsetHeight / 2\"\r\n  >\r\n    <ng-container *ngIf=\"!isEditing(row, col)\">\r\n      <div\r\n        *ngIf=\"!isArray\"\r\n        class=\"full-text-content\"\r\n        [style.maxHeight.px]=\"dataGridContainer.offsetHeight / 2\"\r\n        (dblclick)=\"\r\n          $event.stopPropagation();\r\n          $event.preventDefault();\r\n          enableEdit(row, col, true)\r\n        \"\r\n        (click)=\"$event.stopPropagation(); $event.preventDefault()\"\r\n      >\r\n        {{\r\n          getNestedValue(row, col.field)?.value ||\r\n            getNestedValue(row, col.field)?.name ||\r\n            getNestedValue(row, col.field)\r\n        }}\r\n      </div>\r\n      <div *ngIf=\"isArray\">\r\n        <ul>\r\n          <ng-container\r\n            *ngFor=\"let item of getNestedValue(row, col.field); let i = index\"\r\n          >\r\n            <li *ngIf=\"i !== 0\">\r\n              <ng-container>\r\n                {{\r\n                  item?.department_name ||\r\n                    item?.roleName ||\r\n                    item?.full_name ||\r\n                    \"-\"\r\n                }}\r\n              </ng-container>\r\n            </li>\r\n          </ng-container>\r\n        </ul>\r\n      </div>\r\n    </ng-container>\r\n    <ng-container *ngIf=\"isEditing(row, col)\">\r\n      <textarea\r\n        (dblclick)=\"\r\n          $event.stopPropagation();\r\n          $event.preventDefault();\r\n          enableEdit(row, col, true)\r\n        \"\r\n        #textModel=\"ngModel\"\r\n        rows=\"4\"\r\n        #textAreadInput\r\n        [(ngModel)]=\"row[col.field]\"\r\n        name=\"{{ col.field }}\"\r\n        required\r\n        (blur)=\"disableEdit(row, col, textModel)\"\r\n        (keydown.enter)=\"textAreadInput.blur()\"\r\n        autofocus\r\n        class=\"form-control\"\r\n        [ngClass]=\"{\r\n          'is-invalid': textModel.invalid\r\n        }\"\r\n        (mousedown)=\"$event.stopPropagation()\"\r\n      ></textarea>\r\n    </ng-container>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultImagePlaceholder let-row=\"row\" let-col=\"col\">\r\n  <span\r\n    class=\"px-2 d-flex w-100 cell-content image-placeholder\"\r\n    [title]=\"row?.full_name || row?.name || 'N/A'\"\r\n  >\r\n    <ng-container\r\n      *ngIf=\"\r\n        row?.logo ||\r\n          row?.assetImage ||\r\n          row?.invoice?.invoice_image ||\r\n          row?.invoice_image;\r\n        else placeholder\r\n      \"\r\n    >\r\n      <span\r\n        (click)=\"fullscreenImage = row?.profile_pictures?.[4]?.path ||\r\n            row?.logo ||\r\n            row?.assetImage ||\r\n            row?.invoice_image\"\r\n        class=\"pic\"\r\n        [style.width.px]=\"rowHeight - 10\"\r\n        [style.height.px]=\"rowHeight - 10\"\r\n        [class.assets-pic]=\"gridType == 'Assets'\"\r\n      >\r\n        <img\r\n          [width]=\"rowHeight - 12\"\r\n          [height]=\"rowHeight - 12\"\r\n          [style.width.px]=\"rowHeight - 10\"\r\n          [style.height.px]=\"rowHeight - 10\"\r\n          [src]=\"\r\n            row?.profile_pictures?.[4]?.path ||\r\n            row?.logo ||\r\n            row?.assetImage ||\r\n            row?.invoice_image\r\n          \"\r\n          alt=\"icon\"\r\n          class=\"option-icon\"\r\n          loading=\"lazy\"\r\n        />\r\n      </span>\r\n    </ng-container>\r\n    <!-- <div\r\n      class=\"fullscreen-overlay\"\r\n      *ngIf=\"fullscreenImage\"\r\n      (click)=\"fullscreenImage = null\"\r\n    >\r\n      <img [src]=\"fullscreenImage\" class=\"fullscreen-img\" />\r\n    </div> -->\r\n\r\n    <ng-template #placeholder>\r\n      <span\r\n        [ngClass]=\"getDynamicClass(row?.full_name || row?.name)\"\r\n        class=\"pic d-flex align-items-center rounded-circle\"\r\n        [style.width.px]=\"rowHeight - 12\"\r\n        [style.height.px]=\"rowHeight - 12\"\r\n        [style.fontSize.px]=\"rowHeight / 3\"\r\n        [class.assets-pic]=\"gridType == 'Assets'\"\r\n      >\r\n        {{ getInitials(row?.full_name) }}\r\n      </span>\r\n    </ng-template>\r\n  </span>\r\n</ng-template>\r\n\r\n<!-- Right Click Menue -->\r\n<div\r\n  [class.invisible]=\"!positionedYet\"\r\n  class=\"context-menu p-2\"\r\n  *ngIf=\"actionHide && actions?.length\"\r\n  [ngStyle]=\"{ 'top.px': yPos, 'left.px': xPos }\"\r\n  [class.show]=\"isVisible\"\r\n  appendTo=\"body\"\r\n>\r\n  <ul>\r\n    <li\r\n      *ngFor=\"let action of actions\"\r\n      class=\"rounded d-flex align-items-center\"\r\n      (click)=\"onActionClick(action)\"\r\n    >\r\n      <span\r\n        [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/' + action + '.svg'\"\r\n        class=\"data-grid-svg-icon right-click-menu-icons me-2\"\r\n      ></span>\r\n      <span class=\"text-capitalize fw-500\">{{ action }}</span>\r\n    </li>\r\n  </ul>\r\n</div>\r\n\r\n<!-- Details Toggle from bottom -->\r\n\r\n<ng-template #nestedTableTemplate let-row>\r\n  <div\r\n    class=\"nested-table table table-sm w-100 mb-0 center-nested-table w-100\"\r\n    style=\"table-layout: fixed !important\"\r\n    #nestedTableContainer\r\n  >\r\n    <thead\r\n      #nestedHeader\r\n      [style.backgroundColor]=\"nestedTableHeaderBackgroundColor\"\r\n    >\r\n      <div\r\n        cdkDropList\r\n        [cdkDropListData]=\"row?.detail.columns\"\r\n        cdkDropListOrientation=\"horizontal\"\r\n        (cdkDropListDropped)=\"dropColumn($event, row)\"\r\n        (cdkDropListSorted)=\"onNestedColSort($event, previewNestedCols)\"\r\n        [style.height.px]=\"nestedTableHeaderRowHeight\"\r\n        class=\"d-flex tr border-below\"\r\n      >\r\n        <div\r\n          *ngFor=\"let col of row.detail.columns; let i = index\"\r\n          [style.width.px]=\"col?.width || 250\"\r\n          [style.minWidth.px]=\"col?.width || 250\"\r\n          [style.maxWidth.px]=\"col?.width || 250\"\r\n          class=\"px-4 th\"\r\n          [attr.field]=\"col.field\"\r\n          [style.backgroundColor]=\"nestedTableHeaderBackgroundColor\"\r\n          cdkDrag\r\n        >\r\n          <div\r\n            class=\"d-flex h-100 justify-content-between position-relative align-items-center\"\r\n          >\r\n            <div class=\"text-ellipsis\" (click)=\"sortNestedCol(col, row)\">\r\n              {{ col.header }}\r\n            </div>\r\n            <div class=\"d-flex gap-2\">\r\n              <span\r\n                *ngIf=\"currentSubSortColumn == col.field\"\r\n                [inlineSVG]=\"\r\n                  singleSpaAssetsPath +\r\n                  (col?.order_by == 'desc'\r\n                    ? 'data-grid/icons/sort-desc.svg'\r\n                    : 'data-grid/icons/sort-asc.svg')\r\n                \"\r\n                class=\"data-grid-svg-icon d-flex justify-content-center align-items-center ms-2 start-50\"\r\n              >\r\n              </span>\r\n              <!-- <div\r\n                class=\"three-dots p-1\"\r\n                (click)=\"openThreeDotsMenu($event, col)\"\r\n                style=\"cursor: pointer\"\r\n              >\r\n                <span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath +\r\n                    'data-grid/icons/three-dots-vertical.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                ></span>\r\n              </div> -->\r\n\r\n              <!-- Only show menu if this column is active -->\r\n              <div\r\n                class=\"position-absolute\"\r\n                *ngIf=\"activeCol === col\"\r\n                style=\"top: -50%; z-index: 21; left: 0\"\r\n              >\r\n                <ng-container\r\n                  *ngTemplateOutlet=\"\r\n                    columnMenu;\r\n                    context: {\r\n                      col: col,\r\n                      isNestedTable: true,\r\n                      columns: row?.detail.columns\r\n                    }\r\n                  \"\r\n                ></ng-container>\r\n              </div>\r\n              <div\r\n                class=\"resize-handle\"\r\n                (click)=\"$event.stopPropagation()\"\r\n                (mousedown)=\"\r\n                  $event.preventDefault();\r\n                  onResizeColumn($event, col);\r\n                  $event.stopPropagation()\r\n                \"\r\n              >\r\n                <span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                ></span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <ng-template cdkDragPreview>\r\n            <div class=\"p-2 border d-flex gap-2\">\r\n              <div>\r\n                <span\r\n                  [inlineSVG]=\"\r\n                    singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\r\n                  \"\r\n                  class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\r\n                ></span>\r\n              </div>\r\n              <div>{{ col.header }}</div>\r\n            </div>\r\n          </ng-template>\r\n        </div>\r\n      </div>\r\n    </thead>\r\n    <div\r\n      [style.width.px]=\"nestedHeader.offsetWidth - 10\"\r\n      [style.minWidth.px]=\"nestedHeader.offsetWidth - 10\"\r\n    >\r\n      <cdk-virtual-scroll-viewport\r\n        [itemSize]=\"nestedTablerowHeight\"\r\n        class=\"viewport\"\r\n        [style.height.px]=\"\r\n          (row?.detail?.result?.length < 5\r\n            ? nestedTablerowHeight * row?.detail?.result?.length + 40\r\n            : 300) + (hasHorizontalScroll ? -12 : 1)\r\n        \"\r\n        [style.width.px]=\"nestedHeader.offsetWidth - 10\"\r\n        [style.minWidth.px]=\"nestedHeader.offsetWidth - 10\"\r\n      >\r\n        <div\r\n          class=\"cursor-pointer border-below d-flex tr\"\r\n          *cdkVirtualFor=\"let d of row?.detail?.result; trackBy: trackById\"\r\n          [style.height.px]=\"nestedTablerowHeight\"\r\n          [style.width.px]=\"nestedHeader?.offsetWidth\"\r\n          [style.minWidth.px]=\"nestedHeader?.offsetWidth\"\r\n          [style.backgroundColor]=\"bodyBackgroundColor\"\r\n          (contextmenu)=\"onRightClick($event, d)\"\r\n        >\r\n          <div\r\n            class=\"px-4 py-0 td\"\r\n            *ngFor=\"let col of previewNestedCols; let j = index\"\r\n            [style.fontSize.px]=\"nestedTablerowFontsize\"\r\n            [attr.field]=\"col.field\"\r\n            [style.width.px]=\"col?.width || 250\"\r\n            [style.minWidth.px]=\"col?.width || 250\"\r\n            [style.maxWidth.px]=\"col?.width || 250\"\r\n          >\r\n            <div\r\n              [style.height.px]=\"nestedTablerowHeight - 1\"\r\n              [style.max-width.px]=\"col?.width\"\r\n              class=\"d-flex align-items-center\"\r\n            >\r\n              <!-- {{ d[col.field] || (col.is_amount ? 0 : \"-\") }} -->\r\n              <div\r\n                #cellText\r\n                class=\"text-ellipsis flex-grow-1\"\r\n                [title]=\"\r\n                  col.type === 'date'\r\n                    ? (getNestedValue(d, col.field) | date : dateFormat)\r\n                    : getNestedValue(d, col.field) || '-'\r\n                \"\r\n              >\r\n                <ng-container *ngIf=\"col.type !== 'image'\">\r\n                  <ng-container *ngIf=\"col.is_amount\">{{\r\n                    currencySymbol\r\n                  }}</ng-container>\r\n                  {{\r\n                          !isNestedValueArray(d, col.field)\r\n                            ? col.type === 'date'\r\n                              ? (isDate(getNestedValue(d, col.field))\r\n                                  ? (getNestedValue(d, col.field) | date: dateFormat)\r\n                                  : (getNestedValue(d, col.field)?.value ||\r\n                                    getNestedValue(d, col.field)?.name ||\r\n                                    getNestedValue(d, col.field) ||\r\n                                    '-'))\r\n                              : (getNestedValue(d, col.field)?.value ||\r\n                                getNestedValue(d, col.field)?.name ||\r\n                                getNestedValue(d, col.field) ||\r\n                                (col.is_amount ? 0: '-'))\r\n                            : (getNestedValue(d, col.field)?.[0]?.department_name ||\r\n                              getNestedValue(d, col.field)?.[0]?.roleName || getNestedValue(d, col.field)?.[0]?.full_name ||\r\n                              '-')\r\n                  }}\r\n                </ng-container>\r\n                <ng-container *ngIf=\"false\">\r\n                  {{ getTotalAmount(col) }}\r\n                </ng-container>\r\n                <ng-container *ngIf=\"col.type == 'image'\">\r\n                  <ng-container\r\n                    *ngTemplateOutlet=\"\r\n                      defaultImagePlaceholder;\r\n                      context: {\r\n                        row: d,\r\n                        col: col,\r\n                      }\r\n                    \"\r\n                  ></ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </cdk-virtual-scroll-viewport>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #leftRightNestedPlaceholder let-row>\r\n  <table\r\n    class=\"nested-table table table-sm w-100 mb-0\"\r\n    [style.backgroundColor]=\"bodyBackgroundColor\"\r\n    [style.height.px]=\"\r\n      gridType == 'Assets'\r\n        ? (nestedTableContainer?.nativeElement?.offsetHeight ?? 0) + 12\r\n        : (taskManagementContainer?.nativeElement?.offsetHeight ?? 0)\r\n    \"\r\n  >\r\n    <!-- <div class=\"thead\">\r\n      <div\r\n        class=\"tr d-flex border-below\"\r\n        [style.height.px]=\"nestedTableHeaderRowHeight\"\r\n        [style.backgroundColor]=\"headerBackgroundColor\"\r\n      >\r\n        <div class=\"th\" *ngFor=\"let _ of [1, 2, 3, 4, 5]\"></div>\r\n      </div>\r\n    </div> -->\r\n    <!-- <div class=\"tbody\">\r\n      <div\r\n        class=\"tr border-below\"\r\n        [style.height.px]=\"nestedTablerowHeight\"\r\n        *ngFor=\"let _ of row?.detail?.result\"\r\n        [style.backgroundColor]=\"headerBackgroundColor\"\r\n      >\r\n        <div class=\"td\" *ngFor=\"let __ of [1, 2, 3, 4, 5]\" class=\"py-0\">\r\n          <span\r\n            [style.height.px]=\"nestedTablerowHeight\"\r\n            [style.max-width.px]=\"nestedTablerowHeight\"\r\n          ></span>\r\n        </div>\r\n      </div>\r\n    </div> -->\r\n  </table>\r\n</ng-template>\r\n\r\n<ng-template #taskManagementTemplate let-taskDetails=\"taskDetails\">\r\n  <div\r\n    class=\"p-4\"\r\n    #taskManagementContainer\r\n    [style.backgroundColor]=\"nestedTableHeaderBackgroundColor\"\r\n    [style.fontFaimly]=\"fontFaimly\"\r\n  >\r\n    <div class=\"d-flex justify-content-between\">\r\n      <div class=\"col-4\">\r\n        <div class=\"item-title\">Description</div>\r\n        <!-- <div class=\"item-content firstDiv\">\r\n        {{ taskDetails.description }}\r\n      </div> -->\r\n        <p\r\n          [style.fontSize]=\"bodyTextFontsSize\"\r\n          class=\"item-content firstDiv taskDescription pe-4\"\r\n          [innerHTML]=\"getSafeComment(taskDetails?.editor_description)\"\r\n          (click)=\"openFullImage($event)\"\r\n        ></p>\r\n      </div>\r\n      <div class=\"col-4\">\r\n        <div class=\"item-title\">Attachments</div>\r\n        <h5 *ngIf=\"taskDetails?.attachments?.length == 0\">\r\n          No Attachments found\r\n        </h5>\r\n        <div\r\n          *ngIf=\"taskDetails?.attachments?.length\"\r\n          class=\"item-content d-flex flex-wrap\"\r\n          style=\"gap: 10px\"\r\n        >\r\n          <a\r\n            *ngFor=\"let attachement of taskDetails?.attachments; let i = index\"\r\n            class=\"symbol-label fs-2 fw-semibold text-success cursor-pointer\"\r\n          >\r\n            <span\r\n              title=\"{{ taskDetails?.attachments_name[i] || 'Attachment' }}\"\r\n              (click)=\"downloadAttchment(attachement)\"\r\n              [inlineSVG]=\"\r\n                singleSpaAssetsPath +\r\n                'data-grid/document-icons/' +\r\n                getExtention(attachement) +\r\n                '.svg'\r\n              \"\r\n            >\r\n            </span>\r\n          </a>\r\n        </div>\r\n      </div>\r\n      <div class=\"col-4\">\r\n        <div class=\"item-title\">\r\n          Comments ({{ taskDetails?.comments?.length }})\r\n        </div>\r\n        <h5 *ngIf=\"taskDetails?.comments?.length == 0\">No Comments found</h5>\r\n        <div *ngIf=\"taskDetails?.comments?.length\" class=\"item-content\">\r\n          <div class=\"comment\" *ngFor=\"let comment of taskDetails.comments\">\r\n            <div class=\"d-flex align-items-center pe-3\">\r\n              <img\r\n                class=\"pic image-input-wrapper\"\r\n                [style.width.px]=\"rowHeight - 12\"\r\n                [style.height.px]=\"rowHeight - 12\"\r\n                *ngIf=\"comment?.comment_by.logo\"\r\n                src=\"{{ comment?.comment_by.logo }}\"\r\n                alt=\"{{ comment.comment_by.full_name }}\"\r\n              />\r\n              <!-- <app-default-image-placeholder *ngIf=\"!comment?.comment_by.logo\" title=\"{{ comment.comment_by.full_name }}\" [name]=\"comment.comment_by.full_name\"></app-default-image-placeholder> -->\r\n              <span\r\n                *ngIf=\"!comment?.comment_by.logo\"\r\n                [ngClass]=\"getDynamicClass(comment.comment_by.full_name)\"\r\n                class=\"pic d-flex align-items-center rounded-circle\"\r\n                [style.width.px]=\"rowHeight - 12\"\r\n                [style.height.px]=\"rowHeight - 12\"\r\n                [style.fontSize.px]=\"rowHeight / 3\"\r\n                title=\"{{ comment.comment_by.full_name }}\"\r\n              >\r\n                {{ getInitials(comment.comment_by.full_name) }}\r\n              </span>\r\n            </div>\r\n            <div>\r\n              <div class=\"comment-author fs-14px\">\r\n                {{ comment?.comment_by.full_name }}\r\n              </div>\r\n              <div\r\n                class=\"comment-content forCommentImg\"\r\n                [innerHTML]=\"getSafeComment(comment.comment)\"\r\n              ></div>\r\n              <div class=\"comment-timestamp\">\r\n                {{ comment.comment_date | date }}\r\n              </div>\r\n              <div class=\"comment-timestamp\">\r\n                Replies: ({{ comment.replies.length }})\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n","import { NgModule } from '@angular/core';\r\nimport { DataGridComponent } from './data-grid/data-grid.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FilterPipe } from './pipes/filter.pipe';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { InlineSVGModule } from 'ng-inline-svg';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling'; \r\nimport { CellHostDirective } from './directives/cellHost.directive'; \r\nimport { CellRenderInitDirective } from './directives/cell-render-init.directive'; \r\n\r\n\r\n\r\n@NgModule({\r\n  declarations: [DataGridComponent, FilterPipe, CellHostDirective, CellRenderInitDirective  ],\r\n  imports: [CommonModule, FormsModule, DragDropModule, InlineSVGModule.forRoot(), ScrollingModule],\r\n  exports: [DataGridComponent],\r\n  providers: [],\r\n})\r\nexport class DataGridModule {}\r\n","/*\r\n * Public API Surface of data-grid\r\n */\r\n\r\nexport * from './lib/data-grid.module';\r\nexport * from './lib/data-grid/data-grid.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SplitColumnsService","i2.CommonService","i3.CopyServiceService","i5.ExportService","i11.CellRenderInitDirective","i12.FilterPipe","i1"],"mappings":"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"}