ms-data-grid 0.0.86 → 0.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +323 -323
- package/esm2022/lib/data-grid/data-grid.component.mjs +90 -86
- package/esm2022/lib/data-grid/statuses.mjs +1 -1
- package/esm2022/lib/data-grid.module.mjs +1 -1
- package/esm2022/lib/directives/cell-editor.directive.mjs +1 -1
- package/esm2022/lib/directives/cell-render-init.directive.mjs +1 -1
- package/esm2022/lib/directives/cellHost.directive.mjs +1 -1
- package/esm2022/lib/interfaces/data-grid-config.ts.mjs +1 -1
- package/esm2022/lib/pipes/filter.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-currency.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-index.pipe.mjs +1 -1
- package/esm2022/lib/services/common.service.mjs +1 -1
- package/esm2022/lib/services/copy-service.service.mjs +1 -1
- package/esm2022/lib/services/export.service.mjs +1 -1
- package/esm2022/lib/services/split-columns.service.mjs +2 -2
- package/esm2022/public-api.mjs +1 -2
- package/fesm2022/ms-data-grid.mjs +161 -159
- package/fesm2022/ms-data-grid.mjs.map +1 -1
- package/lib/data-grid/data-grid.component.d.ts +3 -7
- package/package.json +1 -1
- package/lib/styles/font-style.css +0 -34
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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/pipes/format-currency.pipe.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/directives/cell-editor.directive.ts","../../../projects/data-grid/src/lib/pipes/format-index.pipe.ts","../../../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 } = {\n // Success – Green\n 'active': 'badge badge-success',\n 'approved': 'badge badge-success',\n 'accepted': 'badge badge-success',\n 'completed': 'badge badge-success',\n 'evaluated': 'badge badge-success',\n 'assigned': 'badge badge-success',\n 'scrap': 'badge badge-success',\n 'move-available': 'badge badge-success',\n 'move-assigned': 'badge badge-success',\n\n // Warning – Yellow/Amber\n 'contract': 'badge badge-warning',\n 'warranty': 'badge badge-warning',\n 'scheduled': 'badge badge-warning',\n 'leased': 'badge badge-warning',\n 'disposed': 'badge badge-warning',\n 'maintenance': 'badge badge-warning',\n 'assigning start': 'badge badge-warning',\n 'evaluation start': 'badge badge-warning',\n 'to be start assigning': 'badge badge-warning',\n 'pending': 'badge badge-warning',\n 'leave': 'badge badge-warning',\n\n // Danger – Red\n 'inactive': 'badge badge-danger',\n 'rejected': 'badge badge-danger',\n 'unassigned': 'badge badge-danger',\n 'trashed': 'badge badge-danger',\n 'onhold': 'badge badge-danger',\n 'assigning stop': 'badge badge-danger',\n 'evaluation stop': 'badge badge-danger',\n 'unavailable': 'badge badge-danger',\n 'move-error': 'badge badge-danger',\n 'failed': 'badge badge-danger',\n 'absent': 'badge badge-danger',\n\n // Info – Blue\n 'insurance': 'badge badge-info',\n 'pastdue': 'badge badge-info',\n\n // Dark – Neutral/Other\n 'expired': 'badge badge-dark',\n 'draft': 'badge badge-dark',\n 'present': 'badge badge-success',\n\n 'todo': 'badge badge-secondary',\n};\n","import { Directive, ViewContainerRef } from '@angular/core';\n\n@Directive({\n selector: '[cellHost]'\n})\nexport class CellHostDirective {\n\n constructor(public viewContainerRef: ViewContainerRef) {}\n\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SplitColumnsService {\n prepareColumns(columns: any[], containerWidth: number): any {\n const left: any[] = [];\n const center: any[] = [];\n const right: any[] = [];\n\n for (const col of columns) {\n if (col.children?.length) {\n const leftChildren: any[] = [];\n const centerChildren: any[] = [];\n const rightChildren: any[] = [];\n\n for (const child of col.children) {\n if (child.is_visible === false) continue;\n\n const pinned = child.pinned ?? col.pinned ?? null;\n const childWithPinned = { ...child, pinned };\n\n if (pinned === 'left') leftChildren.push(childWithPinned);\n else if (pinned === 'right') rightChildren.push(childWithPinned);\n else centerChildren.push(childWithPinned);\n }\n\n if (leftChildren.length) {\n left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });\n }\n if (centerChildren.length) {\n center.push({\n header: col.header,\n children: centerChildren,\n id: col.id || col._id,\n });\n }\n if (rightChildren.length) {\n right.push({\n header: col.header,\n children: rightChildren,\n id: col.id || col._id,\n });\n }\n } else if (col.is_visible !== false) {\n const pinned = col.pinned ?? null;\n if (pinned === 'left') left.push(col);\n else if (pinned === 'right') right.push(col);\n else center.push(col);\n }\n }\n\n return { left, center, right };\n }\n\n setColumnsQuery(columns: any[]) {\n for (const col of columns) {\n // if (col.children?.length) {\n // for (const child of col.children) {\n // if (!child?.query?.firt_value && !child?.query?._ids?.length) {\n // child['query'] = {\n // first_condition: 'contain',\n // first_value: null,\n // condition: 'none',\n // second_condition: 'contain',\n // second_value: null,\n // _ids: [],\n // };\n // }\n // }\n // }\n // if (!col?.query?.firt_value && !col?.query?._ids?.length) {\n // col.query = {\n // first_condition: 'contain',\n // first_value: null,\n // condition: 'none',\n // second_condition: 'contain',\n // second_value: null,\n // _ids: [],\n // };\n // }\n }\n\n console.log('Updated Columns: ', columns);\n\n return columns;\n }\n\n assignDefaultWidths(columns: any[], containerWidth: number): any[] {\n const visibleLeafCols = this.getVisibleLeafColumns(columns);\n\n if (!visibleLeafCols.length) return columns;\n\n // ✅ Columns that already have width\n const fixedCols = visibleLeafCols.filter(\n col => col.width && col.width > 0\n );\n\n // ✅ Columns that need width\n const flexibleCols = visibleLeafCols.filter(\n col => !col.width && col.is_visible !== false\n );\n\n // ✅ Total width already consumed\n const usedWidth = fixedCols.reduce(\n (sum, col) => sum + col.width,\n 0\n );\n\n // ✅ Remaining width after fixed columns\n let remainingWidth = containerWidth - usedWidth;\n if (remainingWidth < 0) remainingWidth = 0;\n\n // ✅ Average width for columns without width\n let defaultWidth =\n flexibleCols.length > 0\n ? Math.floor(remainingWidth / flexibleCols.length)\n : 0;\n\n // ✅ Enforce minimum\n if (defaultWidth < 150) defaultWidth = 150;\n\n const cloneColumns = (cols: any[]): any[] =>\n cols.map(col => {\n if (col.children?.length) {\n return {\n ...col,\n children: cloneColumns(col.children)\n };\n }\n\n // ✅ Keep existing width\n if (col.width) {\n return { ...col };\n }\n\n // ✅ Hidden columns → fixed small width\n if (col.is_visible === false) {\n return { ...col, width: 150 };\n }\n\n // ✅ Assign calculated default width\n return { ...col, width: defaultWidth };\n });\n\n return cloneColumns(columns);\n}\n\n\n\n private getVisibleLeafColumns(columns: any[]): any[] {\n const result: any[] = [];\n\n for (const col of columns) {\n if (col.children?.length) {\n const visibleChildren = col.children.filter(\n (c: any) => c.is_visible !== false\n );\n result.push(...visibleChildren);\n } else if (col.is_visible !== false) {\n result.push(col);\n }\n }\n\n return result;\n }\n}\n","import { DatePipe } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CommonService {\n\n private datePipe = inject(DatePipe); \n constructor() { }\n\n public mainContainerLeft = 0;\n\n gethasVisibleColumns(columns: any[]): boolean {\n const checkVisible = (columns: any[]): boolean => {\n return columns.some((col) => {\n if (col?.is_visible) return true;\n if (col?.children?.length) {\n return checkVisible(col.children);\n }\n return false;\n });\n };\n return checkVisible(columns);\n }\n\n gethasInVisibleColumns(columns: any[]): boolean {\n const checkVisible = (columns: any[]): boolean => {\n return columns.some((col) => {\n if (!col?.is_visible) return true;\n if (col?.children?.length) {\n return checkVisible(col.children);\n }\n return false;\n });\n };\n return checkVisible(columns);\n }\n\n\n getTotalColumnsLength(columns: any[]): number {\n let count = 0;\n\n columns.forEach(col => {\n if (col.children && Array.isArray(col.children) && col.children.length) {\n count += col.children.length; // count children instead of parent\n } else {\n count += 1; // count parent directly\n }\n });\n\n return count;\n }\n\n gethasRightPinnedColumns(columns: any[]): boolean {\n const checkPinnedRight = (columns: any[]): boolean => {\n return columns.some((col) => {\n if (col?.pinned === 'right' && col?.is_visible) return true;\n if (col?.children?.length) {\n return checkPinnedRight(col.children);\n }\n return false;\n });\n };\n return checkPinnedRight(columns);\n }\n\n gethasLeftPinnedColumns(columns: any[]): boolean {\n const checkPinnedRight = (columns: any[]): boolean => {\n return columns.some((col) => {\n if (col?.pinned === 'left' && col?.is_visible) return true;\n if (col?.children?.length) {\n return checkPinnedRight(col.children);\n }\n return false;\n });\n };\n return checkPinnedRight(columns);\n }\n\n\n getExpandedRowCount(data: any[]): number {\n let groupCount = 0;\n let rowCount = 0;\n\n data.forEach(group => {\n if (group?.isGroup) {\n groupCount++;\n\n if (group?.isExpand && Array.isArray(group?.children)) {\n group.children.forEach((child: any) => {\n if (child.isGroup) {\n if (child.isExpand && Array.isArray(child.children)) {\n rowCount += child.children.length;\n }\n } else {\n rowCount++;\n }\n });\n }\n }\n });\n\n if (groupCount === 0) {\n return data.length;\n }\n\n return groupCount + rowCount;\n }\n\n\n getFiltersFromColumns(columns: any[], filtersConfig: any[]): any[] {\n const result: any[] = [];\n\n const checkColumn = (col: any) => {\n if (col.query?.condition === 'none') {\n col.query.second_value = null;\n col.query.second_condition = null;\n }\n const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== \"\" && filtersConfig.some((ele) => ele.field == col.field);\n const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele) => ele.field == col.field);\n if (hasFirstValue || hasIds) {\n result.push({\n search: col.search ?? \"\",\n field: col.field,\n type: col.type,\n _ids: (col.type == 'dropdown' || col.type == 'array') ? col.query?._ids : [],\n query: (col.type == 'dropdown' || col.type == 'array') ? null : (col?.query?.first_value ? col?.query : null)\n });\n }\n\n if (Array.isArray(col.children) && col.children.length > 0) {\n col.children.forEach(checkColumn);\n }\n };\n columns.forEach(checkColumn);\n\n return result;\n }\n\n async applyFiltersToColumns(columns: any[], filters: any[]): Promise<any[]> {\n for (const col of columns) {\n if (!col.query) {\n col.query = {\n first_value: null,\n second_value: null,\n first_condition: col.type !== 'date' && col.type !== 'number' ? 'contain' : 'equal',\n second_condition: null,\n condition: 'none',\n _ids: []\n };\n }\n\n const filter = filters.find(f => f.field === col.field);\n\n if (filter) {\n if (col.type === 'dropdown' || col.type == 'array') {\n const selectedIds = filter._ids ?? [];\n const dropdownValues = col.column_dropdown_value ?? [];\n\n // ✅ Map depending on dropdown value structure\n let selectedLabels: string[] = [];\n\n if (Array.isArray(dropdownValues) && dropdownValues.length > 0) {\n if (typeof dropdownValues[0] === 'object') {\n // object-based dropdowns: { id, name/label/value/text }\n selectedLabels = dropdownValues\n .filter(opt => selectedIds.includes(opt.id))\n .map(opt => opt.name ?? opt.label ?? opt.value ?? opt.text ?? '');\n } else {\n // string-based dropdowns\n selectedLabels = dropdownValues.filter(opt => selectedIds.includes(opt));\n }\n }\n\n // ✅ Store readable text in filterValue (comma-separated)\n col.filterValue = selectedLabels.join(', ');\n\n // maintain query state\n col.query._ids = selectedIds;\n col.search = filter.search ?? '';\n\n } else {\n // ✅ Non-dropdown filters (text/date/number)\n col.filterValue = filter.search || filter.query?.first_value || '';\n col.search = filter.search ?? '';\n col.query.first_value = filter.query?.first_value ?? null;\n col.query.second_value = filter.query?.second_value ?? null;\n col.query.first_condition =\n filter.query?.first_condition ??\n (col.type !== 'date' && col.type != 'number' ? 'contain' : 'equal');\n col.query.second_condition = filter.query?.second_condition ?? null;\n col.query.condition = filter.query?.condition ?? 'none';\n }\n } else {\n // Clear filter if not present\n col.filterValue = null;\n col.search = '';\n col.query._ids = [];\n col.query.first_value = null;\n }\n\n // ✅ Recursively apply for children\n if (Array.isArray(col.children) && col.children.length > 0) {\n col.children = await this.applyFiltersToColumns(col.children, filters);\n }\n }\n\n return columns;\n }\n\n\n\n\n\n\n activeFilteredColumns: any[] = [];\n updateActiveFilteredColumns(columns: any[]): any[] {\n const collectFiltered = (cols: any[]): any[] => {\n let result: any[] = [];\n\n for (let i = 0; i < cols.length; i++) {\n const col = cols[i];\n if (col.children && col.children.length > 0) {\n result = result.concat(collectFiltered(col.children));\n }\n\n if (col.query) {\n const hasDropdownFilter =\n Array.isArray(col.query._ids) && col.query._ids.length > 0;\n\n const hasValueFilter =\n (col.query.first_value && col.query.first_value !== '') ||\n (col.query.second_value && col.query.second_value !== '');\n\n if (hasDropdownFilter || hasValueFilter) {\n result.push(col);\n }\n }\n }\n return result;\n };\n this.activeFilteredColumns = [...collectFiltered(columns)];\n return this.activeFilteredColumns;\n }\n\n\n\n hasFieldChanged(current: any, original: any, type: string): boolean {\n switch (type) {\n case 'number':\n return Number(current) !== Number(original);\n\n case 'string':\n return String(current || '') !== String(original || '');\n\n case 'dropdown':\n if (typeof current === 'object' && typeof original === 'object') {\n return current?.id !== original?.id || current?.value !== original?.value;\n }\n return current !== original;\n\n case 'boolean':\n return Boolean(current) !== Boolean(original);\n\n case 'date':\n const currentDate = new Date(current).getTime();\n const originalDate = new Date(original).getTime();\n return isNaN(currentDate) || isNaN(originalDate)\n ? current !== original\n : currentDate !== originalDate;\n\n default:\n return JSON.stringify(current) !== JSON.stringify(original);\n }\n }\n\n\n // Copy column data to column dropdown values in case of absence\n async copyDropdownDataRecursively(columns: any[]): Promise<any[]> {\n for (const col of columns) {\n if (col.type === 'dropdown' || col.type == 'array') {\n const dropdownValues = col.column_dropdown_value;\n const dataValues = col.column_data;\n\n if (\n (!Array.isArray(dropdownValues) || dropdownValues.length === 0) &&\n Array.isArray(dataValues) &&\n dataValues.length > 0\n ) {\n col.column_dropdown_value = dataValues.map(item =>\n typeof item === 'object'\n ? item\n : { id: item, name: item, value: item }\n );\n }\n }\n\n if (Array.isArray(col.children) && col.children.length > 0) {\n col.children = await this.copyDropdownDataRecursively(col.children);\n }\n }\n\n return columns;\n }\n\n\n formatDateValue(value: any, momentFormat?: string): string {\n const tryFormat = (date: Date) => {\n const angularFormat = momentFormat\n ? this.convertMomentToAngularDateFormat(momentFormat)\n : 'dd/MM/yyyy';\n return this.datePipe.transform(date, angularFormat) ?? '-';\n };\n\n if (value instanceof Date && !isNaN(value.getTime())) {\n return tryFormat(value);\n }\n\n if (typeof value === 'string') {\n let cleanedValue = value.replace(/^DD/, '01');\n\n const parsedDDMM = this.parseDDMMYYYY(cleanedValue);\n if (parsedDDMM) return tryFormat(parsedDDMM);\n\n if (!isNaN(Date.parse(cleanedValue))) {\n return tryFormat(new Date(cleanedValue));\n }\n }\n\n\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\n return tryFormat(new Date(value));\n }\n\n if (value?.name || value?.value) {\n return value.value ?? value.name ?? '-';\n }\n\n if (value != null) return String(value);\n\n return '-';\n }\n\n\n\n\n private convertMomentToAngularDateFormat(momentFormat: string): string {\n if (!momentFormat) return 'mediumDate';\n\n return momentFormat\n .replace(/DD/g, 'dd')\n .replace(/D/g, 'd')\n .replace(/YYYY/g, 'yyyy')\n .replace(/YY/g, 'yy')\n .replace(/MMMM/g, 'MMMM')\n .replace(/MMM/g, 'MMM')\n .replace(/MM/g, 'MM')\n .replace(/M/g, 'M')\n .replace(/dddd/g, 'EEEE')\n .replace(/ddd/g, 'EEE')\n .replace(/HH/g, 'HH')\n .replace(/H/g, 'H')\n .replace(/hh/g, 'hh')\n .replace(/h/g, 'h')\n .replace(/mm/g, 'mm')\n .replace(/m/g, 'm')\n .replace(/ss/g, 'ss')\n .replace(/s/g, 's')\n .replace(/A/g, 'a')\n .replace(/a/g, 'a');\n }\n\n private parseDDMMYYYY(value: string): Date | null {\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\n if (!match) return null;\n\n const day = +match[1];\n const month = +match[2] - 1;\n const year = +match[3];\n\n const date = new Date(year, month, day);\n\n return (date.getFullYear() === year &&\n date.getMonth() === month &&\n date.getDate() === day)\n ? date\n : null;\n }\n\n}\n\n\n\n\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CopyServiceService {\n\n constructor() { }\n getSelectedDataForCopy(\n dataSet: any[],\n columns: any[],\n rowSelectedIndexes: Set<number>,\n selectedCells: any[],\n getNestedValue: (obj: any, path: string) => any\n ): any[][] {\n columns = columns.filter(col => col.is_visible);\n const copiedRows: any[][] = [];\n const findRowByVirtualIndex = (vIndex: number) =>\n dataSet.find((r: any) => r.__virtualIndex === vIndex);\n if (rowSelectedIndexes && rowSelectedIndexes.size > 0) {\n const sortedIndexes = [...rowSelectedIndexes].sort((a, b) => a - b);\n for (const vIndex of sortedIndexes) {\n const row = findRowByVirtualIndex(vIndex);\n if (!row) continue;\n const extractValue = (field: string): string => {\n const nested = getNestedValue(row, field);\n const value =\n nested?.value ??\n nested?.name ??\n nested ??\n '-';\n\n if (Array.isArray(value)) {\n return value\n .map(v =>\n typeof v === 'object'\n ? (v.departmentName ?? v.roleName ?? '')\n : (v?.toString() ?? '')\n )\n .join(', ');\n }\n return value ?? '';\n };\n const mapped = columns.map(col => {\n if (col.children && Array.isArray(col.children)) {\n return col.children.map((c: { field: string }) => extractValue(c.field));\n }\n return [extractValue(col.field)];\n });\n const rowValues = mapped.reduce<string[]>((acc, curr) => acc.concat(curr), []);\n copiedRows.push(rowValues);\n }\n }\n if (selectedCells && selectedCells.length > 0) {\n const rowsMap = new Map<number, any[]>();\n for (const cell of selectedCells) {\n const row = findRowByVirtualIndex(cell.rowIndex);\n if (!row) continue;\n const col = columns[cell.colIndex];\n let fieldName = col?.field;\n if (col?.children && col.children[cell.subColIndex]) {\n fieldName = col.children[cell.subColIndex].field;\n }\n let value = getNestedValue(row, fieldName) || getNestedValue(row, fieldName)?.name || getNestedValue(row, fieldName) || '-';\n if (Array.isArray(value)) {\n value = value\n .map(v =>\n typeof v === 'object'\n ? v.departmentName ?? v.roleName ?? v.full_name ?? ''\n : v?.toString() ?? ''\n )\n .join(', ');\n } else {\n value = value ?? '';\n }\n if (!rowsMap.has(cell.rowIndex)) rowsMap.set(cell.rowIndex, []);\n rowsMap.get(cell.rowIndex)!.push(value);\n }\n const sortedCells = [...rowsMap.entries()]\n .sort(([a], [b]) => a - b)\n .map(([_, v]) => v);\n copiedRows.push(...sortedCells);\n }\n if (copiedRows.length === 0) {\n const activeCell = document.querySelector('.active-cell');\n if (activeCell) return [[activeCell.textContent?.trim() || '']];\n }\n\n const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);\n return copiedRows.map(row => {\n const newRow = [...row];\n while (newRow.length < maxCols) newRow.push('');\n return newRow;\n });\n }\n\n\n copyToClipboard(\n selectedData: any[][],\n selector = '.selected-cell, .active-cell, .row-selected'\n ): void {\n if (!selectedData || selectedData.length === 0) return;\n const textToCopy = selectedData\n .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\n .join('\\n');\n navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\n const selectedEls = document.querySelectorAll(selector);\n selectedEls.forEach(el => el.classList.add('flash-bg'));\n setTimeout(() => {\n selectedEls.forEach(el => el.classList.remove('flash-bg'));\n }, 1000);\n }\n\n\nupdateRows: any[] = [];\n currentColums : any = []\n async pasteFromClipboardText(\n text: string,\n dataSet: any[],\n columns: any[],\n startRowIndex: number,\n startColIndex: number,\n startSubColIndex: number = 0\n ): Promise<any> {\n if (!text) return [];\n this.updateRows = [];\n const rows = text.split(/\\r?\\n/).map(r => r.split('\\t'));\n const flattenedColumns: any[] = [];\n columns.forEach(col => {\n if (col.children?.length) {\n col.children.forEach((child: any) => flattenedColumns.push({ parent: col, ...child }));\n } else {\n flattenedColumns.push(col);\n }\n });\n let startFlattenedIndex = 0;\n for (let i = 0; i < startColIndex; i++) {\n const col = columns[i];\n startFlattenedIndex += col.children?.length || 1;\n }\n const startCol = columns[startColIndex];\n if (startCol?.children?.length) {\n startFlattenedIndex += Math.min(startSubColIndex, startCol.children.length - 1);\n }\n \n rows.forEach((rowValues, rOffset) => {\n const targetRowIndex = startRowIndex + rOffset;\n const row = dataSet.find(r => r?.__virtualIndex === targetRowIndex);\n if (!row) return;\n \n rowValues.forEach((value, cOffset) => {\n const targetIndex = startFlattenedIndex + cOffset;\n if (targetIndex < 0 || targetIndex >= flattenedColumns.length) return;\n \n const targetColumn = flattenedColumns[targetIndex];\n if(!targetColumn || !targetColumn.is_editable) return;\n if (targetColumn?.type === 'string') {\n this.currentColums.push(targetColumn);\n this.setNestedValue(row, targetColumn, value);\n } else if (targetColumn.type === 'number') {\n const num = Number(value);\n if (!isNaN(num) && value !== '') {\n this.currentColums.push(targetColumn);\n this.setNestedValue(row, targetColumn, num);\n }\n }\n });\n });\n \n return {updateRows : this.updateRows, currentColums : this.currentColums};\n }\n\n\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\n if (column.type === 'date' || column.type === 'image') return;\n const path = column.field;\n if (!path) return;\n const keys = path.split('.');\n const lastKey = keys.pop();\n const parent = keys.reduce((acc: any, key: string) => (acc[key] ??= {}), obj);\n if (parent && lastKey) {\n if (typeof option === 'object' && option !== null) {\n parent[lastKey] = {\n id: option.id ?? 1,\n value: option.value ?? option,\n };\n } else {\n parent[lastKey] = option;\n }\n }\n const sendObj = {\n data: { ...obj },\n eventType: 'onCellEdit',\n };\n this.updateRows.push(obj);\n }\n\n\n cutSelectedSelectedData(\n dataSet: any[],\n rowSelectedIndexes: Set<number>,\n selectedCells: any[],\n columns: any[],\n setNestedValue: (obj: any, column: any, value: any) => void\n ): any {\n let updatedData = [...dataSet];\n if (rowSelectedIndexes?.size) {\n const indexes = [...rowSelectedIndexes];\n updatedData = updatedData.filter(\n (row: any) => !indexes.includes(row.__virtualIndex)\n );\n // rowSelectedIndexes.clear();\n }\n else if (selectedCells?.length) {\n this.updateRows = [];\n for (const cell of selectedCells) {\n const row = updatedData.find(r => r.__virtualIndex === cell.rowIndex);\n if (!row) continue;\n let col = columns[cell.colIndex];\n if (col?.children && col.children[cell.subColIndex]) {\n col = col.children[cell.subColIndex];\n }\n this.setNestedValue(row, col, '');\n }\n // selectedCells.length = 0;\n }\n return {updatedData: updatedData, updatedRows: this.updateRows};\n }\n\n\n cutWithAnimation(\n selectedData: any[][],\n selector = '.selected-cell, .active-cell, .row-selected'\n ): void {\n if (!selectedData || selectedData.length === 0) return;\n\n const textToCopy = selectedData\n .map(row => row.map(cell => (cell ?? '').toString()).join('\\t'))\n .join('\\n');\n\n navigator.clipboard.writeText(textToCopy).catch(err => console.error(err));\n\n // Apply red cut animation\n const selectedEls = document.querySelectorAll(selector);\n selectedEls.forEach(el => el.classList.add('cut-flash-bg'));\n setTimeout(() => {\n selectedEls.forEach(el => el.classList.remove('cut-flash-bg'));\n }, 1000);\n }\n\n\n}\n","import { Injectable } from '@angular/core';\nimport * as XLSX from 'xlsx-js-style';\nimport { saveAs } from 'file-saver';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ExportService {\n\n constructor() {}\n\n /**\n * Exports data to CSV or Excel.\n * @param columns List of column definitions (each having name/key/is_visible)\n * @param data The array of data objects\n * @param fileName Name of the exported file (without extension)\n * @param format 'csv' | 'xlsx'\n */\nexportData(\n columns: any[],\n data: any[],\n fileName: string,\n format: 'csv' | 'xlsx' = 'xlsx',\n rowSelectedIndexes: Set<number> | null = new Set(),\n styleConfig: {\n headerBgColor?: string;\n headerTextColor?: string;\n bodyTextColor?: string;\n fontFamily?: string;\n fontWeight?: 'normal' | 'bold';\n zoomScale?: number;\n headerRowHeight?: number;\n selectedRowBgColor?: string;\n } = {}\n) {\n const {\n headerBgColor = '#228B22',\n headerTextColor = '#FFFFFF',\n bodyTextColor = '#000000',\n fontFamily = 'Calibri',\n fontWeight = 'normal',\n zoomScale = 120,\n headerRowHeight = 20,\n selectedRowBgColor = '#8AC5FF',\n } = styleConfig;\n\n const visibleColumns = columns.filter(\n col => col.is_visible && col.type !== 'image' && col.type !== 'logo'\n );\n\n const headers = visibleColumns.map(col => col.header || col.headerName || col.name);\n\n const flattenValue = (value: any): any => {\n if (value == null) return '';\n if (Array.isArray(value))\n return value.map(v => (typeof v === 'object' ? flattenValue(v) : v)).join(', ');\n if (typeof value === 'object')\n return Object.entries(value)\n .map(([k, v]) => `${k}: ${flattenValue(v)}`)\n .join(', ');\n return value;\n };\n\n const exportData = data.map(row =>\n visibleColumns.reduce((acc: any, col) => {\n const header = col.headerName || col.name || col.header;\n let value = this.getNestedValue(row, col.field);\n\n switch (col.type) {\n case 'boolean':\n value = value ? 'Yes' : 'No';\n break;\n case 'date':\n if (value) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n value = date.toLocaleDateString('en-US', {\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n });\n }\n }\n break;\n default:\n value = flattenValue(value);\n }\n\n acc[header] = value;\n return acc;\n }, {})\n );\n\n const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(exportData, { header: headers });\n\n // ✅ Define a reusable border style\n const borderStyle = {\n top: { style: 'thin', color: { rgb: 'CCCCCC' } },\n bottom: { style: 'thin', color: { rgb: 'CCCCCC' } },\n left: { style: 'thin', color: { rgb: 'CCCCCC' } },\n right: { style: 'thin', color: { rgb: 'CCCCCC' } },\n };\n\n // ✅ Apply header styles\n headers.forEach((header, index) => {\n const cellAddress = XLSX.utils.encode_cell({ r: 0, c: index });\n if (!worksheet[cellAddress]) return;\n\n worksheet[cellAddress].s = {\n fill: { fgColor: { rgb: headerBgColor.replace('#', '') } },\n font: {\n name: fontFamily,\n sz: 14,\n color: { rgb: headerTextColor.replace('#', '') },\n bold: fontWeight === 'bold',\n },\n alignment: { horizontal: 'center', vertical: 'center' },\n border: borderStyle, // ✅ Added border here\n };\n });\n\n // ✅ Apply body styles + highlight selected rows\n for (let r = 1; r <= exportData.length; r++) {\n const isSelected = rowSelectedIndexes?.has(r - 1);\n const rowBgColor = isSelected ? selectedRowBgColor : '#FFFFFF';\n\n for (let c = 0; c < headers.length; c++) {\n const col = visibleColumns[c];\n const cellAddress = XLSX.utils.encode_cell({ r, c });\n const cell = worksheet[cellAddress];\n if (!cell) continue;\n\n let horizontalAlign = 'left';\n if (['number', 'boolean', 'date'].includes(col.type)) horizontalAlign = 'center';\n\n cell.s = {\n fill: { fgColor: { rgb: rowBgColor.replace('#', '') } },\n font: {\n name: fontFamily,\n sz: 14,\n color: { rgb: bodyTextColor.replace('#', '') },\n bold: false,\n },\n alignment: { horizontal: horizontalAlign, vertical: 'center', wrapText: true },\n border: borderStyle, // ✅ Added border here too\n };\n }\n }\n\n // ✅ Adjust column widths\n const colWidths = headers.map(header => {\n let maxLength = header.length;\n exportData.forEach(row => {\n const val = row[header];\n if (val != null) {\n const len = val.toString().length;\n if (len > maxLength) maxLength = len;\n }\n });\n return { wch: Math.min(maxLength + 2, 64) };\n });\n worksheet['!cols'] = colWidths;\n\n worksheet['!rows'] = [{ hpt: headerRowHeight }];\n worksheet['!zoom'] = zoomScale;\n\n const workbook: XLSX.WorkBook = { Sheets: { Data: worksheet }, SheetNames: ['Data'] };\n\n if (format === 'csv') {\n const csv = XLSX.utils.sheet_to_csv(worksheet);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n saveAs(blob, `${fileName}.csv`);\n } else {\n const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });\n const blob = new Blob([excelBuffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8',\n });\n saveAs(blob, `${fileName}.xlsx`);\n }\n}\n\n\n\n\nprivate getNestedValue(obj: any, path: string): any {\n if (!path || typeof obj !== 'object') return obj;\n return path.split('.').reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : ''), obj);\n}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'formatCurrencies',\n})\nexport class FormatCurrencyPipe implements PipeTransform {\n transform(value: number | string, currencyFormat: string): string {\n if (value == null || value === '' || !value) return '';\n\n const numericValue = typeof value === 'string' ? parseFloat(value) : value;\n if (isNaN(numericValue)) return '';\n\n\n let [integerPart, decimalPart] = numericValue.toFixed(2).split('.');\n\n\n let formattedInteger = integerPart;\n\n switch (currencyFormat) {\n case '1,234,567.89':\n formattedInteger = new Intl.NumberFormat('en-US', {\n style: 'decimal',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(Number(integerPart));\n break;\n\n case '12,34,567.89':\n formattedInteger = new Intl.NumberFormat('en-IN', {\n style: 'decimal',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(Number(integerPart)).replace(/(\\d)(?=(\\d{2})+\\d)/g, '$1,');\n break;\n\n case '1234567,89':\n formattedInteger = new Intl.NumberFormat('fr-FR', {\n style: 'decimal',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(Number(integerPart)).replace(',', '.');\n break;\n\n case '1.234.567,89':\n formattedInteger = new Intl.NumberFormat('de-DE', {\n style: 'decimal',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(Number(integerPart)).replace('.', ',');\n break;\n\n default:\n formattedInteger = integerPart;\n }\n\n return `${formattedInteger}.${decimalPart}`;\n }\n\n}\n","import {\n Directive,\n Input,\n OnInit,\n ViewContainerRef,\n Injector,\n ComponentRef,\n Type,\n EventEmitter,\n Output\n} from '@angular/core';\n\n@Directive({\n selector: '[cellRenderInit]'\n})\nexport class CellRenderInitDirective implements OnInit {\n @Input('cellRenderInit') componentType!: Type<any>;\n @Input() rowData: any;\n @Input() colData: any;\n @Input() cellValue: any;\n\n @Output() cellEvent = new EventEmitter<{ eventName: string; data: any }>();\n\n constructor(private vcr: ViewContainerRef, private injector: Injector) { }\n\n ngOnInit(): void {\n if (!this.componentType) return;\n\n // ✅ Dynamically create the component\n const componentRef: ComponentRef<any> = this.vcr.createComponent(this.componentType, {\n injector: Injector.create({\n providers: [\n { provide: 'rowData', useValue: this.rowData },\n { provide: 'colData', useValue: this.colData },\n { provide: 'cellValue', useValue: this.cellValue }\n ],\n parent: this.injector\n })\n });\n\n // ✅ Automatically call custom lifecycle hook if present\n if (typeof componentRef.instance.gridInit === 'function') {\n componentRef.instance.gridInit({\n row: this.rowData,\n col: this.colData,\n value: this.cellValue\n });\n }\n for (const key of Object.keys(componentRef.instance)) {\n const property = componentRef.instance[key];\n if (property instanceof EventEmitter) {\n property.subscribe((value: any) => {\n this.cellEvent.emit({\n eventName: key,\n data: {\n row: this.rowData,\n col: this.colData,\n value,\n }\n });\n });\n }\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'filter',\n})\nexport class FilterPipe implements PipeTransform {\ntransform(items: any[], searchText: string, key?: string): any[] {\n if (!items || !searchText) return items;\n \n const lowerSearch = searchText.toLowerCase();\n \n return items.filter(item => {\n if (key && item && typeof item === 'object') {\n const value = item[key];\n return value?.toString().toLowerCase().includes(lowerSearch);\n }\n if (typeof item === 'string' || typeof item === 'number') {\n return item.toString().toLowerCase().includes(lowerSearch);\n }\n return false;\n });\n}}\n","import {\n Component,\n OnInit,\n Input,\n Output,\n OnChanges,\n SimpleChanges,\n ElementRef,\n ViewChild,\n AfterViewInit,\n HostListener,\n ChangeDetectorRef,\n EventEmitter,\n NgZone,\n Renderer2,\n AfterViewChecked,\n EmbeddedViewRef,\n TemplateRef,\n ChangeDetectionStrategy,\n QueryList,\n ViewChildren,\n inject,\n Injector\n} from '@angular/core';\nimport { SplitColumnsService } from '../services/split-columns.service';\nimport { CommonService } from '../services/common.service';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragEnd,\n CdkDragEnter,\n CdkDragExit,\n CdkDragMove,\n CdkDragSortEvent,\n CdkDragStart,\n DragDrop,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport {\n trigger,\n state,\n style,\n transition,\n animate,\n query,\n stagger,\n} from '@angular/animations';\nimport { CdkDropList } from '@angular/cdk/drag-drop';\nimport { STATUSES_BADGE_MAP } from './statuses';\nimport { CopyServiceService } from '../services/copy-service.service';\nimport { firstValueFrom, take } from 'rxjs';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ExportService } from '../services/export.service';\nimport { CellHostDirective } from '../directives/cellHost.directive';\nimport { DatePipe } from '@angular/common';\nimport { FormatCurrencyPipe } from '../pipes/format-currency.pipe';\n\ninterface CellPosition {\n rowIndex: number;\n colIndex: number;\n subColIndex: number;\n field: string;\n key: string;\n}\nexport enum RowAnimationType {\n None = 'none',\n Spread = 'spreadAnimation',\n Bounce = 'bounceAnimation',\n SlideUp = 'slideUpFromBottom',\n Flip = 'flipAnimation',\n Skew = 'skewAnimation',\n SlideRight = 'slideFromRight',\n}\n\n\nexport const sortingAnimation = trigger('listSort', [\n transition('* => *', [\n // Query all elements entering or leaving\n query(':enter, :leave', style({ position: 'absolute', width: '100%' }), { optional: true }),\n\n // Animate leaving elements upward with fade out\n query(':leave', [\n animate('300ms ease-in', style({ transform: 'translateY(-20px)', opacity: 0 }))\n ], { optional: true }),\n\n // Stagger the entering elements for a smoother effect\n query(':enter', [\n style({ transform: 'translateY(20px)', opacity: 0 }),\n stagger(50, [\n animate('300ms ease-out', style({ transform: 'translateY(0)', opacity: 1 }))\n ])\n ], { optional: true })\n ])\n]);\n@Component({\n selector: 'data-grid',\n templateUrl: './data-grid.component.html',\n styleUrls: ['./data-grid.component.scss', '../styles/font-style.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('accordionToggle', [\n state(\n 'collapsed',\n style({ height: '0px', overflow: 'unset' })\n ),\n state('expanded', style({ height: '*', overflow: 'unset' })),\n transition('collapsed <=> expanded', animate('300ms ease-in')),\n ]),\n trigger('slideToggle', [\n transition(':enter', [\n style({ height: '0px', opacity: 0, overflow: 'hidden' }),\n animate('300ms ease-out', style({ height: '*', opacity: 1 }))\n ]),\n transition(':leave', [\n style({ height: '*', opacity: 1, overflow: 'hidden' }),\n animate('300ms ease-in', style({ height: '0px', opacity: 0 }))\n ])\n ]),\n trigger('slideUp', [\n state('void', style({ transform: 'translateY(100%)', opacity: 0 })),\n state('*', style({ transform: 'translateY(0)', opacity: 1 })),\n transition('void => *', animate('300ms ease-out')),\n transition('* => void', animate('300ms ease-in')),\n ]),\n trigger('rowDynamic', [\n\n /* -------------------- SPREAD -------------------- */\n transition('* => spreadAnimation', [\n query(':enter', [\n style({ opacity: 0, transform: 'scaleX(0.7)' }),\n stagger(60, [\n animate('350ms ease-out',\n style({ opacity: 1, transform: 'scaleX(1)' })\n )\n ])\n ], { optional: true }),\n\n query(':leave', [\n stagger(40, [\n animate('220ms ease-in',\n style({ opacity: 0, transform: 'scaleX(0.7)' })\n )\n ])\n ], { optional: true })\n ]),\n\n /* -------------------- BOUNCE -------------------- */\n transition('* => bounceAnimation', [\n query(':enter', [\n style({ opacity: 0, transform: 'translateY(-10px)' }),\n stagger(45, [\n animate(\n '500ms cubic-bezier(.68,-0.55,.27,1.55)',\n style({ opacity: 1, transform: 'translateY(0)' })\n )\n ])\n ], { optional: true }),\n\n query(':leave', [\n stagger(40, [\n animate('200ms ease-in',\n style({ opacity: 0, transform: 'translateY(10px)' })\n )\n ])\n ], { optional: true })\n ]),\n\n /* -------------------- NEW 1: FLIP -------------------- */\n transition('* => flipAnimation', [\n query(':enter', [\n style({ opacity: 0, transform: 'rotateX(-80deg)' }),\n stagger(70, [\n animate('450ms ease-out',\n style({ opacity: 1, transform: 'rotateX(0)' })\n )\n ])\n ], { optional: true }),\n\n query(':leave', [\n stagger(50, [\n animate('250ms ease-in',\n style({ opacity: 0, transform: 'rotateX(80deg)' })\n )\n ])\n ], { optional: true })\n ]),\n\n /* -------------------- NEW 2: SKEW -------------------- */\n transition('* => skewAnimation', [\n query(':enter', [\n style({ opacity: 0, transform: 'skewY(6deg) translateY(8px)' }),\n stagger(60, [\n animate('320ms ease-out',\n style({ opacity: 1, transform: 'skewY(0deg) translateY(0)' })\n )\n ])\n ], { optional: true }),\n\n query(':leave', [\n stagger(40, [\n animate('220ms ease-in',\n style({ opacity: 0, transform: 'skewY(-6deg) translateY(-8px)' })\n )\n ])\n ], { optional: true })\n ]),\n transition('* => slideUpFromBottom', [\n query(':enter', [\n style({ opacity: 0, transform: 'translateY(100vh)' }),\n stagger(60, [\n animate('500ms cubic-bezier(0.25, 0.8, 0.25, 1)',\n style({ opacity: 1, transform: 'translateY(0)' })\n )\n ])\n ], { optional: true }),\n\n query(':leave', [\n stagger(40, [\n animate('300ms ease-in',\n style({ opacity: 0, transform: 'translateY(-50px)' })\n )\n ])\n ], { optional: true })\n ]),\n\n transition('* => slideFromRight', [\n query(':enter', [\n style({ opacity: 0, transform: 'translateX(100vw)' }),\n stagger(60, [\n animate('500ms cubic-bezier(0.25, 0.8, 0.25, 1)',\n style({ opacity: 1, transform: 'translateX(0)' })\n )\n ])\n ], { optional: true }),\n\n query(':leave', [\n stagger(40, [\n animate('300ms ease-in',\n style({ opacity: 0, transform: 'translateX(50px)' })\n )\n ])\n ], { optional: true })\n ]),\n\n\n\n ])\n\n\n ],\n\n})\nexport class DataGridComponent implements OnChanges, AfterViewInit, OnInit, AfterViewChecked {\n // **************************************//\n // **************************************//\n // ********** Input Goes Here *********** //\n // **************************************//\n // **************************************//\n\n\n @Input() rowAnimation: RowAnimationType = RowAnimationType.None;\n\n // Pagination Config Store Here\n @Input() paginationConfig: any = {};\n\n // The dataset store here;\n @Input() dataSet: any[] = [];\n\n // The columns Store Here\n @Input() columns: any[] = [];\n\n // Row Height;\n @Input() rowHeight: number = 50;\n\n // Header Row Height;\n @Input() headerRowHeight: number = 40;\n\n // Show Vertical Borders;\n @Input() showVerticalBorder: boolean = false;\n\n // Even Rows Background Color;\n @Input() evenRowsBackgroundColor: string | undefined = '';\n\n // Even Rows Background Color;\n @Input() oddRowsBackgroundColor: string | undefined = '#f2f2f2';\n\n // Header Rows Background Color;\n @Input() headerBackgroundColor: string = '#f6f8ff';\n\n // Header Rows Background Color;\n @Input() checkboxesBackgroundColor: string = '#FFFFFF';\n\n // Show Columns Grouping;\n @Input() showColumnsGrouping: boolean = false;\n\n // Row Hovered Background color;\n @Input() rowHoverColor: string | undefined = 'rgba(0, 123, 255, 0.1)';\n\n // Left PinnedBackground color;\n @Input() leftPinnedBackgroundColor: string | undefined = '#FFFFFF';\n\n // Body Background color;\n @Input() bodyBackgroundColor: string | undefined = '#FFFFFF';\n\n // Right Pinned Background color;\n @Input() rightPinnedBackgroundColor: string | undefined = '#FFFFFF';\n\n // Side Menu Background color;\n @Input() sidemenuBackgroundColor: string | undefined = '#FFFFFF';\n\n // Body text color;\n @Input() bodyTextColor: string | undefined = '#0c112b';\n\n // Header text color;\n @Input() headerTextColor: string | undefined = '#6A6B6D';\n\n // Header text color;\n @Input() checkboxesColor: string | undefined = '#2a1f73';\n\n // Header text size;\n @Input() headerTextFontsSize: number | undefined = 13;\n\n // Body text color;\n @Input() bodyTextFontsSize: number | undefined = 14;\n\n // Header font weight;\n @Input() headerFontWeight: number | undefined = 500;\n\n // Body Font Weight;\n @Input() bodyFontWeight: number | undefined = 400;\n\n // Checked Row Background Color;\n @Input() checkedRowBackgroundColor: string | undefined = 'aliceblue';\n\n // dropdowns Background Color;\n @Input() dropdownsBackgroundColor: string | undefined = '#FFFFFF';\n\n\n @Input() footerRowBackgroundColor: string | undefined = '';\n\n // Footer row Height;\n @Input() footerRowHeight: number = 46;\n\n // Footer row Height;\n @Input() topGroupedBadgesBackgroundColor: string | undefined = '';\n\n // Show Row wise grouping;\n @Input() showRowsGrouping: boolean | undefined = false;\n\n // Show Row wise grouping;\n @Input() showFilterRow: boolean | undefined = false;\n\n // Show Row wise grouping;\n @Input() fontFaimly: string | undefined = 'sans-serif';\n\n // Show SideColumn;\n @Input() showSideMenu: boolean = false;\n\n // Footer Padding\n @Input() footerPadding: number = 3\n\n\n // Footer Padding\n @Input() topFilterRowHeight: number = 50;\n\n // Show Rows shading\n @Input() rowShadingEnabled: boolean = false;\n\n // Show Rows shading\n @Input() showSerialNumber: boolean = false;\n\n // Single Spa Url Attach to icons\n @Input() singleSpaAssetsPath: string = 'assets/';\n\n\n // Applied Filters\n @Input() filtersConfig: any[] = [];\n\n\n // Applied Filters\n @Input() loading: boolean = false;\n\n //Vertical Scrollbar style\n @Input() verticalScrollbarWidth: 'auto' | 'thin' = 'auto';\n\n //Horizintal Scrollbar style\n @Input() horizintalScrollbarWidth: 'auto' | 'thin' = 'auto';\n\n // Show Cell details box\n @Input() showCellDetailsBox: boolean = false;\n\n //Date format\n\n @Input() dateFormat: string = ''\n\n //Date format\n @Input() tableSearch: string = '';\n\n\n //Date format\n @Input() actions: any[] = ['edit', 'delete'];\n\n\n // Table Config for paginations is here\n @Input() config: any;\n\n\n // Selection task bar\n @Input() showTaskbar = false\n\n // Table Name for state manage\n @Input() tableName = true\n\n\n // Listing type\n @Input() listingType: string | boolean = '';\n\n // Listing type\n\n @Input() checkboxState: { reset: boolean } = {\n reset: true\n }\n\n // Taskbar actions\n @Input() taskbarActions: any[] = []\n\n\n // Sorting Config to show sort icons\n @Input() sortingConfig: { field: string, order_by: string } | null = {field: '', order_by: ''};\n\n\n @Input() tableFilterViewId: any = '';\n\n\n @Input() selectedTableLayout: any = 'medium'\n\n @Input() closeDropdown: { preset: { closed: boolean, loading: boolean } } = { preset: { closed: false, loading: false } };\n\n // Table View\n\n // GlobalSearch\n @Input() globalSearchText: string = '';\n\n // Nested Table Row Fontsize\n @Input() nestedTablerowFontsize = 14;\n\n // Nested table row Header row Height\n @Input() nestedTableHeaderRowHeight = 40;\n\n // Nested Table row height\n @Input() nestedTablerowHeight = 45;\n\n\n @Input() gridType: string = '';\n\n @Input() currencySymbol: string = '';\n\n @Input() currencyFormat: string = '';\n\n @Input() leftPinnedBoxshadow: string = '';\n\n @Input() rightPinnedBoxshadow: string = '';\n\n // GlobalSearch\n @Input() selectedRowsBackgroundColor: string = '#8ac5ff';\n\n // GlobalSearch\n @Input() nestedTableHeaderBackgroundColor: string = '#f6f8ff';\n\n\n @Input() nestedTableRowBackgroundColor: string = '#eaeaea';\n\n @Input() tableView: any[] = [];\n\n @Input() buttons: { name: string; is_showIcon: boolean; icon: string, has_permission: boolean }[] = [];\n\n @Input() keepMultipleExpandedDetails = false;\n\n\n @Input() showTotalAmountRow = false;\n\n\n @Input() enableGlobalSearch = true;\n\n\n @Input() tableType = '';\n\n\n @Input() enableExport = false;\n\n\n @Input() showFullScreenButton = false;\n\n\n @Input() enableCut = false;\n\n\n @Input() tabs: string[] = [];\n\n @Input() showCheckboxes = true;\n\n @Input() consumerFont: string | null = null;\n\n @Input() pageSizeOptions = [10, 25, 50, 75, 100, 150, 200, 250, 300, 500];\n\n\n @Input() resetAllFilters = { resetAll: false };\n\n\n @Input() columnThreedotsMunuConfig = {\n showPinleft: true,\n showPinright: true,\n showAscending: true,\n showDescending: true,\n showFilter: true,\n showRowsGrouping: this.showRowsGrouping,\n showAutosizeAllColumns: true,\n showAutosizeThisColumn: false,\n showChoseColumns: false,\n showResetColumns: false,\n };\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // ///////////////////////////////////////////////////////////////////////////////////////////\n // ///////////////////////////////////////////////////////////////////////////////////////////\n // Out Put Events\n // ///////////////////////////////////////////////////////////////////////////////////////////\n // ///////////////////////////////////////////////////////////////////////////////////////////\n\n\n\n //Change Table Layout\n @ViewChildren(CellHostDirective) cellHosts!: QueryList<CellHostDirective>;\n\n @Output() public changeLayout = new EventEmitter<any>();\n\n @Output() public customCellEvent = new EventEmitter<any>();\n\n // Filter Apply event;\n @Output() public filterOptions = new EventEmitter<any>();\n\n @Output() genericEvent: EventEmitter<any> = new EventEmitter();\n\n @Output() tablePresetConfig: EventEmitter<any> = new EventEmitter();\n\n @Output() sortingOrderOptions: EventEmitter<any> = new EventEmitter<any>();\n\n @Output() createUpdateConfigListing: EventEmitter<any> = new EventEmitter<any>();\n\n\n\n\n\n\n\n isFullScreen = false;\n activeTab: string | null = null;\n groupedColumns: any[] = [];\n activeCol: any = null;\n activeFilterCell: any = null;\n showActionsDropDown = false;\n sideMenuVisible = false;\n pivotMode: boolean = false;\n columnSearch: string = '';\n expandAllAccordians = true;\n currentOpenedSideMenue: 'cols' | 'filtrs' | null = null;\n originalColumns: any[] = [];\n originalDataSet: any[] = [];\n activeTopButton: string | null = '';\n filterColumnsList: any[] = [];\n groupBoxPadding = 200;\n presetName: string = '';\n presetFilter: boolean = false;\n searchTextPresetTable = '';\n addFilterColumnInput = '';\n searchInDropdown = '';\n private secretKey = 'tb-super-admin'\n addFilterDropdownSearch = ''\n topShowHideColumns = '';\n choseColumnsSearch = ''\n sideNestedFilterSearch = ''\n editinDropdownSearch = '';\n isThreeDotsFilterOpen = false;\n confirmDelete = false;\n fontFamilies: string[] = [\n // Common Excel fonts\n 'Arial',\n 'Arial Black',\n 'Bahnschrift',\n 'Calibri',\n 'Cambria',\n 'Cambria Math',\n 'math',\n 'Candara',\n 'Comic Sans MS',\n 'Consolas',\n 'Constantia',\n 'Corbel',\n 'Courier New',\n 'Ebrima',\n 'Franklin Gothic Medium',\n 'Gabriola',\n 'Gadugi',\n 'Georgia',\n 'Impact',\n 'Ink Free',\n 'Javanese Text',\n 'Leelawadee UI',\n 'Lucida Console',\n 'Lucida Sans Unicode',\n 'Malgun Gothic',\n 'Microsoft Himalaya',\n 'Microsoft JhengHei',\n 'Microsoft New Tai Lue',\n 'Microsoft PhagsPa',\n 'Microsoft Sans Serif',\n 'Microsoft Tai Le',\n 'Microsoft YaHei',\n 'Microsoft Yi Baiti',\n 'Mongolian Baiti',\n 'MS Gothic',\n 'MS PGothic',\n 'MS UI Gothic',\n 'MV Boli',\n 'Nirmala UI',\n 'Palatino Linotype',\n 'Segoe Print',\n 'Segoe Script',\n 'Segoe UI',\n 'Segoe UI Historic',\n 'Segoe UI Emoji',\n 'Segoe UI Symbol',\n 'SimSun',\n 'Sitka Small',\n 'Sylfaen',\n 'Symbol',\n 'Tahoma',\n 'Times New Roman',\n 'Trebuchet MS',\n 'Verdana',\n 'Webdings',\n 'Wingdings',\n 'Yu Gothic',\n 'sans-serif',\n 'serif',\n 'monospace',\n 'Inter'\n ];\n\n fontSizes: string[] = [\n '8', '9', '10', '11', '12', '14', '16', '18', '20', '24', '28', '32'\n ];\n\n hasScroll = false;\n\n\n\n\n constructor(\n private columnService: SplitColumnsService,\n public cdr: ChangeDetectorRef,\n public commonSevice: CommonService,\n private elementRef: ElementRef,\n private ngZone: NgZone,\n private copyService: CopyServiceService,\n private renderer: Renderer2,\n private sanitizer: DomSanitizer,\n private exportService: ExportService,\n private datePipe: DatePipe,\n private formatCurrency: FormatCurrencyPipe,\n\n ) { }\n\n @ViewChild('cellText', { static: false }) cellText!: any;\n @ViewChild('nestedHeader', { static: false }) nestedHeader!: ElementRef;\n ngAfterViewInit() {\n this.ngZone.onStable.pipe(take(1)).subscribe(async () => {\n await this.SetColumnsDefaultWidth();\n await this.refreshHeaders();\n this.updateFlattenedData();\n this.computeViewportRows();\n this.updateVisibleRows(0);\n this.hasScroll = this.hasHorizontalScrollbar();\n\n if (this.cellText) {\n const observer = new ResizeObserver(() => {\n this.cdr.detectChanges();\n });\n observer.observe(this.cellText.nativeElement);\n }\n\n this.cdr.detectChanges();\n });\n this.renderCustomCells();\n }\n\n private injector = inject(Injector);\n\n createCellInjector(row: any, col: any): Injector {\n return Injector.create({\n providers: [\n { provide: 'rowData', useValue: row },\n { provide: 'colData', useValue: col }\n ],\n parent: this.injector\n });\n }\n\n\n private renderCustomCells(): void {\n const hosts = this.cellHosts.toArray();\n let hostIndex = 0;\n\n for (const row of this.visibleRows) {\n for (const col of this.columns) {\n const host = hosts[hostIndex++];\n if (!host || !col.cellRenderer) continue;\n\n const viewContainer = host.viewContainerRef;\n viewContainer.clear();\n\n const compRef = viewContainer.createComponent(col.cellRenderer);\n\n const params = {\n row,\n col,\n value: this.getNestedValue(row, col.field),\n api: this,\n };\n\n if ((compRef.instance as any).gridInit) {\n (compRef.instance as any).gridInit(params);\n }\n }\n }\n }\n\n\n shouldRestoreScroll = false;\n ngAfterViewChecked(): void {\n this.addStylesToImages();\n this.hasScroll = this.hasHorizontalScrollbar();\n this.cdr.detectChanges();\n if (\n this.shouldRestoreScroll &&\n this.centerScrollableBody?.nativeElement\n ) {\n setTimeout(() => {\n const left = this.commonSevice.mainContainerLeft;\n this.centerScrollableBody.nativeElement.scrollLeft = left;\n this.centerPinnedHeader.nativeElement.scrollLeft = left;\n this.shouldRestoreScroll = false;\n }, 1000);\n }\n }\n\n ngOnInit() {\n // if (this.tabs?.length) {\n // this.activeTab = this.tabs[0];\n // }\n // this.autosizeAllColumns();\n if (this.consumerFont) {\n if (!this.fontFamilies.includes(this.consumerFont)) {\n this.fontFamilies.unshift(this.consumerFont);\n }\n this.fontFaimly = this.consumerFont;\n }\n if (!this.curretaTablePresetForUpdate) {\n // this.autoSizeColumnsByRatio();\n }\n\n // const user = this.getDecrypt('user');\n // this.currencyFormat = user?.currency_format;\n // this.currencySymbol = user?.currency_symbol;\n // this.dateFormat = user?.date_format;\n if (!this.dateFormat) {\n const storedDateFormat = localStorage.getItem('dateformat');\n if (storedDateFormat) {\n this.dateFormat = storedDateFormat ? JSON.parse(storedDateFormat) : 'dd/MM/yyyy';\n }\n }\n\n if (!this.currencyFormat) {\n const storedCurrencyFormat = localStorage.getItem('currencyFormat');\n if (storedCurrencyFormat) {\n this.currencyFormat = storedCurrencyFormat ? JSON.parse(storedCurrencyFormat) : '1,234,567.89';\n }\n }\n\n if (!this.currencySymbol) {\n const storedCurrencySymbol = localStorage.getItem('currencySymbol');\n if (storedCurrencySymbol) {\n this.currencySymbol = storedCurrencySymbol ? JSON.parse(storedCurrencySymbol) : '$';\n }\n }\n\n }\n\n // private getDecrypt(key:string){\n // const value = localStorage.getItem(key)\n // try {\n // return JSON.parse(CryptoJS.AES.decrypt(value as string, this.secretKey).toString(CryptoJS.enc.Utf8))\n // } catch (e) {\n // return null;\n // }\n // }\n\n dataSetLoading = false;\n async ngOnChanges(changes: SimpleChanges){\n if (changes['columns']) {\n await this.setColumnsColumnDropdownValus();\n\n }\n\n if (changes['tabs']) {\n if (changes['tabs']) {\n const allTabs = JSON.parse(localStorage.getItem('activeTabs') || '{}');\n const savedTab = allTabs[this.tableType];\n if (this.tabs.includes('Current Policy')) {\n this.activeTab = this.tabs?.[1] || 'Current Policy';\n } else {\n this.activeTab = savedTab || this.tabs?.[0];\n }\n\n // if (this.tableType) {\n // this.setActiveTab(this.activeTab);\n // }\n }\n }\n if (changes['filtersConfig']) {\n this.checkFilterChangesEffect();\n await this.applyFilteroptionList();\n }\n\n if (changes['columns']?.currentValue?.length) {\n\n await this.applyFilteroptionList();\n\n this.originalColumns = this.columns.map(col => ({\n ...col,\n query: col.query ? { ...col.query } : null,\n column_dropdown_value: col.column_dropdown_value\n ? [...col.column_dropdown_value]\n : [],\n }));\n\n\n if (this.dataGridContainer?.nativeElement?.offsetWidth) {\n await this.SetColumnsDefaultWidth();\n await this.updateColumnWidthsAndGroups();\n await this.refreshPreviewColumns();\n this.setSectionsWidth();\n }\n\n this.ngZone.onStable.pipe(take(1)).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n if (changes['dataSet']) {\n this.dataSet = this.dataSet?.map((row, i) => ({\n ...row,\n __virtualIndex: i + 1,\n }));\n this.originalDataSet = structuredClone(this.dataSet);\n this.expandedCells.clear();\n this.updateFlattenedData();\n\n this.ngZone.onStable.pipe(take(1)).subscribe(() => {\n this.computeViewportRows();\n this.updateVisibleRows(0);\n if(this.commonSevice?.mainContainerLeft > 200)\n this.shouldRestoreScroll = true;\n this.cdr.detectChanges();\n });\n\n if (this.centerPinnedHeader?.nativeElement) {\n void this.centerPinnedHeader.nativeElement.offsetWidth;\n\n this.dataSetLoading = true;\n setTimeout(() => {\n if (this.centerScrollableBody?.nativeElement) {\n this.centerScrollableBody.nativeElement.scrollLeft =\n this.centerPinnedHeader.nativeElement.scrollLeft;\n }\n this.dataSetLoading = false;\n this.cdr.detectChanges();\n }, 500);\n }\n\n this.applyRowsSelectionState();\n\n if (this.groupedColumns?.length) {\n const fields = this.groupedColumns.map((item) => item.field);\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\n\n this.ngZone.onStable.pipe(take(1)).subscribe(() => {\n this.updateFlattenedData();\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.updateVisibleRows(0);\n this.loading = false;\n this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\n this.cdr.detectChanges();\n });\n }\n }\n\n if (changes['checkboxState']?.currentValue?.reset) {\n this.selectedRows.clear();\n this.clearSelectionState(this.tableType);\n\n const ids = Array.from(this.selectedRows);\n const event = {\n data: {\n listingType: this.listingType,\n obj: ids,\n },\n eventType: 'onSelectRow',\n };\n\n this.genericEvent.emit(event);\n\n this.ngZone.onStable.pipe(take(1)).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n if (changes['closeDropdown'] && this.closeDropdown.preset.closed) {\n this.activeTopButton = null;\n this.presetFilter = false;\n this.presetName = '';\n }\n\n // if (changes['oddRowsBackgroundColor']) {\n // this.rowShadingEnabled = !!this.oddRowsBackgroundColor;\n // }\n\n if (changes['resetAllFilters'] && this.resetAllFilters.resetAll) {\n this.clearAllFilters();\n }\n\n if (changes['tableView']) {\n setTimeout(() => {\n const viewValue = this.tableView;\n let temprorySelected = Array.isArray(viewValue)\n ? viewValue.find(item => item.is_temp)\n : null;\n\n if (!temprorySelected) {\n temprorySelected = Array.isArray(viewValue)\n ? viewValue.find(item => item.is_default)\n : null;\n }\n\n this.curretaTablePresetForUpdate = temprorySelected || null;\n this.presetName = temprorySelected?.name || '';\n this.presetFilter = temprorySelected?.activeFilters || false;\n if (this.curretaTablePresetForUpdate) {\n this.rowShadingEnabled = temprorySelected.config.rowShadingEnabled;\n this.showVerticalBorder = temprorySelected.config.showVerticalBorder;\n this.fontFaimly = temprorySelected.config.fontFaimly;\n this.headerTextFontsSize = temprorySelected.config.headerTextFontsSize;\n this.selectedTableLayout = temprorySelected.config.selectedTableLayout;\n this.bodyTextFontsSize = temprorySelected.config.bodyTextFontsSize;\n this.globalSearchText = temprorySelected.config.globalSearch;\n this.setTableLayout(this.selectedTableLayout);\n this.oddRowsBackgroundColor = temprorySelected?.config?.oddRowsBackgroundColor || '#f1f1f1';\n const groupedColumns = temprorySelected?.config?.groupedColumns;\n if(groupedColumns?.length){\n this.groupedColumns = structuredClone(groupedColumns);\n this.groupDataAsync(this.dataSet, this.groupedColumns);\n }\n this.cdr.detectChanges();\n } else {\n this.rowShadingEnabled = false;\n this.showVerticalBorder = false;\n this.fontFaimly = 'Inter';\n this.headerTextFontsSize = 13;\n this.selectedTableLayout = 'medium';\n this.bodyTextFontsSize = 14;\n this.globalSearchText = '';\n // this.autoSizeColumnsByRatio();\n }\n this.cdr.detectChanges();\n }, 0);\n }\n\n }\n\n\n \n\n async setColumnsColumnDropdownValus(): Promise<void> {\n if (!this.columns) return;\n // Just removed temporary for super admin will set it again\n if (this.columns?.length) {\n this.columns = this.columns?.filter(c => c?.field?.trim() !== 'is_deleted')\n }\n this.columns = await this.commonSevice.copyDropdownDataRecursively(this.columns);\n }\n\n\n\n\n applyRowsSelectionState() {\n const selectedIdsFromState = this.restoreSelection(this.tableType);\n if (selectedIdsFromState.size > 0) {\n const ids = Array.from(this.selectedRows);\n const event = {\n data: {\n listingType: this.listingType,\n obj: ids\n },\n eventType: \"onSelectRow\",\n }\n this.genericEvent.emit(event);\n }\n }\n\n clearSelectionState(tableType: string): void {\n const stored = JSON.parse(localStorage.getItem('datatableSelections') || '{\"selectedRows\": {}}');\n if (stored.selectedRows && stored.selectedRows[tableType]) {\n delete stored.selectedRows[tableType];\n }\n localStorage.setItem(\n 'datatableSelections',\n JSON.stringify(stored)\n );\n }\n\n\n\n async applyFilteroptionList() {\n const updatedColumns = await this.commonSevice.applyFiltersToColumns(this.columns, this.filtersConfig);\n this.columns = [...updatedColumns];\n this.cdr.detectChanges();\n }\n leftPinnedColumns: any[] = [];\n centerColumns: any[] = [];\n rightPinnedColumns: any[] = [];\n\n previewLeftPinnedColumns: any[] = [];\n previewCenterColumns: any[] = [];\n previewRightPinnedColumns: any[] = [];\n\n // Main Container Template References\n @ViewChild('dataGridContainer')\n dataGridContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('taskManagementContainer')\n taskManagementContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('nestedTableContainer')\n nestedTableContainer!: ElementRef<HTMLDivElement>;\n\n // Body Template References\n @ViewChild('leftPinnedBody')\n leftPinnedBody!: ElementRef<HTMLDivElement>;\n @ViewChild('centerPinnedBody')\n centerPinnedBody!: ElementRef<HTMLDivElement>;\n @ViewChild('rightPinnedBody')\n rightPinnedBody!: ElementRef<HTMLDivElement>;\n\n // Headers Template References\n @ViewChild('leftPinnedHeader')\n leftPinnedHeader!: ElementRef<HTMLDivElement>;\n @ViewChild('centerPinnedHeader')\n centerPinnedHeader!: ElementRef<HTMLDivElement>;\n @ViewChild('rightPinnedHeader')\n rightPinnedHeader!: ElementRef<HTMLDivElement>;\n\n @ViewChild('columnsGroupedBox')\n columnsGroupedBox!: ElementRef<HTMLDivElement>;\n\n // Center Fake scrollbard\n @ViewChild('centerFakeScrollbar')\n centerFakeScrollbar!: ElementRef<HTMLDivElement>;\n async updateColumnWidthsAndGroups(columns: any = null) {\n if (!this.dataGridContainer) return;\n let containerWidth =\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\n // Wrap in a promise so we can await\n const { left, center, right }: any = await new Promise(resolve => {\n const prepared = this.columnService.prepareColumns(\n columns ? columns : this.columns,\n containerWidth\n );\n resolve(prepared);\n });\n\n this.leftPinnedColumns = left;\n this.centerColumns = center;\n this.rightPinnedColumns = right;\n await new Promise(r => setTimeout(r, 0));\n this.cdr.detectChanges();\n }\n\n async refreshPreviewColumns(columns: any = null) {\n if (!this.dataGridContainer) return;\n\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\n\n // Wrap prepareColumns in a Promise to make it awaitable\n const { left, center, right }: any = await new Promise(resolve => {\n const prepared = this.columnService.prepareColumns(\n columns ? columns : this.columns,\n containerWidth\n );\n resolve(prepared);\n });\n\n this.previewLeftPinnedColumns = left;\n this.previewCenterColumns = center;\n this.previewRightPinnedColumns = right;\n await new Promise(r => setTimeout(r, 10));\n this.cdr.detectChanges();\n }\n\n\n async SetColumnsDefaultWidth() {\n const visibleColumns = this.getVisibleLeafColumns(this.columns);\n const visibleCount = visibleColumns.length;\n\n if (visibleCount === 0) return;\n\n let containerWidth =\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\n if (this.showSerialNumber) containerWidth -= 55;\n if (this.showSideMenu) containerWidth -= 29;\n // if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\n // containerWidth -= 55;\n // if (this.showSerialNumber) containerWidth -= 55;\n // if (this.showSideMenu) containerWidth -= 29;\n // if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\n // containerWidth -= 5;\n this.columns = this.columnService.assignDefaultWidths(\n this.columns,\n containerWidth\n );\n await new Promise(resolve => setTimeout(resolve, 0));\n this.cdr.detectChanges();\n }\n\n\n setSectionsWidth() {\n const left = document.querySelector('.left-pinned-body') as HTMLElement;\n const center = document.querySelector(\n '.center-scrollable-body'\n ) as HTMLElement;\n const right = document.querySelector('.right-pinned-body') as HTMLElement;\n if (left) {\n left.style.minWidth = `${this.leftPinnedHeader.nativeElement.offsetWidth}`;\n }\n if (center) {\n left.style.minWidth = `${this.centerPinnedHeader.nativeElement.offsetWidth}`;\n }\n if (right) {\n left.style.minWidth = `${this.rightPinnedHeader.nativeElement.offsetWidth}`;\n }\n }\n\n // onCenterBodyScroll(): void {\n // const scrollTop = this.centerPinnedBody.nativeElement.scrollTop;\n // const scrollLeft = this.centerPinnedBody.nativeElement.scrollLeft;\n\n // // Sync vertical scroll with left & right pinned bodies\n // this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\n // this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\n\n // // Sync horizontal scroll with center header\n // this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\n // this.centerFakeScrollbar.nativeElement.scrollLeft = scrollLeft;\n // }\n\n // onLeftBodyScroll(): void {\n // const scrollTop = this.leftPinnedBody.nativeElement.scrollTop;\n // this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\n // this.rightPinnedBody.nativeElement.scrollTop = scrollTop;\n // }\n // onRightBodyScroll(): void {\n // const scrollTop = this.rightPinnedBody.nativeElement.scrollTop;\n // this.centerPinnedBody.nativeElement.scrollTop = scrollTop;\n // this.leftPinnedBody.nativeElement.scrollTop = scrollTop;\n // }\n\n fakeScrollbarScrollLeft = 0;\n // onFakeScroll(event: Event) {\n // const target = event.target as HTMLElement;\n // this.fakeScrollbarScrollLeft = target.scrollLeft;\n // this.centerPinnedBody.nativeElement.scrollLeft = target.scrollLeft;\n // this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\n // }\n\n\n\n\n getNestedValue(obj: any, field: string): any {\n return field?.split('.').reduce((acc, part) => acc && acc[part], obj);\n }\n\n isNestedValueArray(obj: any, field: string): boolean {\n if (!obj || !field) return false;\n const value = field\n .split('.')\n .reduce((acc, part) => (acc && acc[part] !== undefined ? acc[part] : undefined), obj);\n return Array.isArray(value);\n }\n\n onResizeGroup(event: MouseEvent, col: any, isRightPinned?: boolean): void {\n event.preventDefault();\n event.stopPropagation();\n\n const startX = event.clientX;\n const children = col.children || [];\n if (!children.length) return;\n\n const childWidths: { field: string; width: number }[] = children.map(\n (child: any) => {\n const el = document.querySelector(\n `[field=\"${child.field}\"]`\n ) as HTMLElement;\n return {\n field: child.field,\n width: el?.offsetWidth || 0,\n };\n }\n );\n\n const totalInitialWidth = childWidths.reduce(\n (sum, col) => sum + col.width,\n 0\n );\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n let deltaX = moveEvent.clientX - startX;\n\n if (isRightPinned) {\n deltaX = -deltaX;\n }\n\n // Prevent shrinking too small\n if (totalInitialWidth + deltaX < children.length * 80) return;\n\n let totalNewWidth = 0;\n\n childWidths.forEach((child) => {\n const ratio = child.width / totalInitialWidth;\n const newWidth = Math.max(child.width + deltaX * ratio, 80);\n totalNewWidth += newWidth;\n\n const childEls = document.querySelectorAll(`[field=\"${child.field}\"]`);\n childEls.forEach((el: Element) => {\n const elHtml = el as HTMLElement;\n elHtml.style.minWidth = `${newWidth}px`;\n elHtml.style.width = `${newWidth}px`;\n });\n\n this.updateColumnWidthInSourceByField(child.field, newWidth);\n });\n\n // ✅ Update group header width in DOM\n const groupHeaderEl = document.querySelector(\n `[group=\"${col.header}\"]`\n ) as HTMLElement;\n if (groupHeaderEl) {\n groupHeaderEl.style.width = `${totalNewWidth}px`;\n }\n };\n\n const onMouseUp = () => {\n if (this.tableFilterViewId) {\n this.savePreset('mouseUp');\n }\n this.refreshHeaders();\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n\n private updateColumnWidthInSourceByField(field: string, width: number): void {\n const update = (columns: any[]) => {\n for (const col of columns) {\n if (col.children?.length) {\n update(col.children);\n } else if (col.field === field) {\n col.width = width;\n }\n }\n };\n\n update(this.columns);\n this.cdr.detectChanges();\n }\n\n cleanColumns(columns: any[]): any[] {\n return columns.map((col) => {\n const {\n __typename,\n _id,\n column_dropdown_value,\n filterValue,\n expandedFilter,\n query,\n isRowGrouped,\n ...rest\n } = col;\n\n // Clean dropdown values (__typename removed)\n const cleanedDropdown = Array.isArray(column_dropdown_value)\n ? column_dropdown_value.map(({ __typename, ...dRest }) => dRest)\n : column_dropdown_value\n ? (({ __typename, ...dRest }) => dRest)(column_dropdown_value)\n : null;\n\n // Clean query (__typename removed)\n const cleanedQuery = Array.isArray(query)\n ? query.map(({ __typename, ...qRest }) => qRest)\n : query\n ? (({ __typename, _ids, ...qRest }) => qRest)(query)\n : null;\n\n return {\n ...rest,\n column_dropdown_value: cleanedDropdown,\n query: cleanedQuery,\n };\n });\n }\n\n onResizeColumn(event: MouseEvent, col: any): void {\n event.preventDefault();\n event.stopPropagation();\n\n const startX = event.clientX;\n\n const targetEl = document.querySelector(\n `[field=\"${col.field}\"]`\n ) as HTMLElement;\n const initialWidth = targetEl?.offsetWidth || 150;\n\n const matchingEls = document.querySelectorAll(`[field=\"${col.field}\"]`);\n\n // 👉 Add highlight while resizing\n if (col?.pinned == 'right') {\n matchingEls.forEach((el: Element) => {\n (el as HTMLElement).classList.add('resizing-highlight-right');\n });\n } else {\n matchingEls.forEach((el: Element) => {\n (el as HTMLElement).classList.add('resizing-highlight');\n });\n }\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n let deltaX = moveEvent.clientX - startX;\n\n // 👉 Reverse if the column is pinned to the right\n if (col.pinned === 'right') {\n deltaX = -deltaX;\n }\n\n let newWidth = initialWidth + deltaX;\n if (newWidth < 80) return;\n\n matchingEls.forEach((el: Element) => {\n const element = el as HTMLElement;\n element.style.minWidth = `${newWidth}px`;\n element.style.width = `${newWidth}px`;\n });\n\n this.updateColumnWidthInSourceByField(col.field, newWidth);\n col.width = newWidth;\n this.hasScroll = this.hasHorizontalScrollbar();\n };\n\n const onMouseUp = () => {\n if (this.tableFilterViewId) {\n this.savePreset('mouseUp');\n }\n this.refreshHeaders();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n matchingEls.forEach((el: Element) => {\n (el as HTMLElement).classList.remove('resizing-highlight');\n (el as HTMLElement).classList.remove('resizing-highlight-right');\n });\n\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n\n\n\n onResizeGroupBox(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const startX = event.clientX;\n\n const targetEl = document.getElementById('groupBoxHeaderDiv');\n const initialWidth = targetEl?.offsetWidth || 150;\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = moveEvent.clientX - startX;\n\n let newWidth = initialWidth + deltaX;\n if (newWidth < 100) newWidth = 100;\n\n if (targetEl) {\n targetEl.style.width = `${newWidth}px`;\n targetEl.style.minWidth = `${newWidth}px`;\n this.groupBoxPadding = newWidth;\n }\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n\n onPasteInFilterRowSearch(event: ClipboardEvent, col: any) {\n setTimeout(() => {\n this.onFilterChange(col);\n this.applyDropdownFilter();\n });\n }\n\n onFilterChange(col: any): void {\n const filterValue = col.filterValue?.toLowerCase() || '';\n this.selectedColumnForFilter = col;\n if (!col?.query) {\n col.query = {\n first_condition: col.type == 'date' ? 'equal' : 'contain',\n first_value: null,\n second_condition: null,\n second_value: null,\n condition: null\n }\n }\n col.query.first_value = filterValue;\n this.firstValue = filterValue;\n }\n\n // Get Body Height\n get bodyWrapperHeight(): string {\n const rows = this.showColumnsGrouping && this.showFilterRow ? 3 : (this.showColumnsGrouping || this.showFilterRow ? 2 : 1);\n const offset = this.headerRowHeight * rows + (this.hasScroll ? 17 : 0);\n return `calc(100% - ${offset}px)`;\n }\n\n // Row Hover Logic Here\n hoveredRowId: string | number | null = null;\n onRowHover(row: any): void {\n this.hoveredRowId = row._id || row.id;\n }\n\n onRowLeave(): void {\n this.hoveredRowId = null;\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n this.isVisible = false;\n this.openIndex = null;\n if (\n !this.hasParentWithClass(target, [\n 'three-dots',\n 'filter-icon-wrapper',\n 'column-menu',\n 'filter-menu',\n ])\n ) {\n this.activeCol = null;\n this.activeFilterCell = null;\n }\n if (!this.elementRef.nativeElement.contains(event.target)) {\n this.showActionsDropDown = false;\n }\n const insideTopFilterRow = target.closest('.filter-tags') || target.closest('.add-filter-button-menu') ||\n target.closest('.table-right-top-actions') || target.closest('.table-layout') || target.closest('.filter-row-filter-wrapper');\n const isClickedInsideThreeDotsFilter = target.closest('.three-dots-filter') || target.closest('.filter-menu-container');\n if (!isClickedInsideThreeDotsFilter) {\n this.closeThreeDotsMenuFilter();\n }\n if (!insideTopFilterRow) {\n this.closeFilterDropdowns(event);\n }\n if (!target.closest('.set-default-preset')) {\n document.querySelector('.set-default-preset')?.classList?.remove('show');\n }\n\n if (!target.closest('.full-text-box') && !target.closest('.data-grid-header-wrapper')) {\n this.collapseAllExpandedCells();\n }\n\n if (!target.closest('.data-grid-table-wrapper')) {\n this.selectedKeys.clear();\n this.activeCell = '';\n }\n }\n\n\n closeThreeDotsMenuFilter() {\n this.isThreeDotsFilterOpen = false;\n }\n\n\n closeFilterDropdowns(event: MouseEvent) {\n this.isFilterOpen = false;\n this.isActiveFilterOpen = false;\n this.activeTopButton = '';\n this.activeFilterCell = null;\n }\n\n private hasParentWithClass(\n element: HTMLElement,\n classList: string[]\n ): boolean {\n let el: HTMLElement | null = element;\n\n while (el !== null) {\n if (\n el.classList &&\n classList.some((className) => el!.classList.contains(className))\n ) {\n return true;\n }\n el = el.parentElement;\n }\n\n return false;\n }\n\n isMenueHidden = false;\n clickedOnSortIcon = false;\n openThreeDotsMenu(event: MouseEvent, child: any, clickedOnSortIcon?: boolean) {\n this.clickedOnSortIcon = clickedOnSortIcon || false;\n event.preventDefault();\n event.stopPropagation();\n this.isMenueHidden = true;\n const containerWidth = this.dataGridContainer?.nativeElement?.offsetWidth;\n this.activeCol = child;\n this.activeFilterCell = null;\n const x = event.clientX;\n setTimeout(() => {\n const element = document.querySelector('.column-menu') as HTMLElement;\n if (element) {\n if (x > (containerWidth / 2)) {\n element.style.left = `${x - 240}px`;\n } else {\n element!.style.left = `${x}px`;\n }\n }\n this.isMenueHidden = false;\n this.cdr.detectChanges();\n }, 0);\n }\n // ////////////////////////////////////////////////////////////////////////////////////////\n // ////////////////////////////////////////////////////////////////////////////////////////\n // Column Three Dots Actions\n // //////////////////////////////////////////////////////////////////////////////////////\n // //////////////////////////////////////////////////////////////////////////////////////\n sortAsc(col: any) {\n if (!col.is_sortable) return;\n this.sortingConfig!['order_by'] = 'asc';\n this.sortingConfig!['field'] = col.field;\n col!.order_by = 'asc';\n const event = {\n order: 'asc',\n column: col\n }\n this.cdr.detectChanges();\n this.sortingOrderOptions.emit(event);\n }\n\n sortDesc(col: any) {\n if (!col.is_sortable) return;\n this.sortingConfig!['order_by'] = 'desc';\n this.sortingConfig!['field'] = col.field;\n col!.order_by = 'desc';\n const event = {\n order: 'desc',\n column: col\n }\n this.cdr.detectChanges();\n this.sortingOrderOptions.emit(event);\n }\n\n resetSort(col: any) {\n this.sortingConfig = { field: '', order_by: '' };\n const event = { field: null, order_by: null }\n this.cdr.detectChanges();\n this.sortingOrderOptions.emit(event);\n }\n\n\n async updateColumnPinInSourceByField(\n column: any,\n pinned: 'left' | 'right' | null,\n isNestedTable: any = false,\n columns?: any\n ) {\n if (isNestedTable) {\n this.pinUnpinColum(column, pinned, columns);\n return;\n }\n const update = (columns: any[]) => {\n for (const col of columns) {\n if (col.children?.length) {\n update(col.children);\n } else if (col.field === column.field) {\n col.pinned = pinned;\n }\n }\n };\n this.activeCol = null;\n update(this.columns);\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.cdr.detectChanges();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n }\n\n private getVisibleLeafColumns = (columns: any[]): any[] => {\n const result: any[] = [];\n for (const column of columns) {\n if (column.children && Array.isArray(column.children)) {\n result.push(...this.getVisibleLeafColumns(column.children));\n } else if (column.is_visible) {\n result.push(column);\n }\n }\n return result;\n };\n\n autosizeColumn(cols: any | any[]): void {\n this.activeCol = null;\n\n // Normalize input to an array\n const columnsToResize = Array.isArray(cols) ? cols : [cols];\n\n // Helper: Flatten all visible leaf columns\n const visibleColumns = this.getVisibleLeafColumns(this.columns);\n const visibleCount = visibleColumns.length;\n\n if (visibleCount === 0) return;\n\n let containerWidth =\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\n if (this.showSerialNumber) containerWidth -= 55;\n if (this.showSideMenu) containerWidth -= 29;\n if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\n containerWidth -= 55;\n const equalWidth = Math.floor(containerWidth / visibleCount);\n\n // Resize each passed column\n for (const col of columnsToResize) {\n if (col && col.field) {\n col.width = equalWidth;\n this.updateColumnWidthInSourceByField(col.field, equalWidth);\n }\n }\n\n this.updateColumnWidthsAndGroups();\n\n setTimeout(() => {\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n }, 1000);\n this.refreshPreviewColumns();\n }\n\n getGroupWidth(group: any): number {\n return (\n group?.children\n ?.filter((col: any) => col?.is_visible)\n ?.reduce((acc: number, col: any) => acc + (col?.width || 0), 0) || 0\n );\n }\n\n autosizeAllColumns(): void {\n this.activeCol = null;\n\n const getVisibleLeafColumns = (columns: any[]): any[] => {\n const result: any[] = [];\n\n for (const column of columns) {\n if (column.children && Array.isArray(column.children)) {\n result.push(...getVisibleLeafColumns(column.children));\n } else if (column.is_visible !== false) {\n result.push(column);\n }\n }\n\n return result;\n };\n\n const visibleColumns = getVisibleLeafColumns(this.columns);\n const visibleCount = visibleColumns.length;\n\n if (visibleCount === 0) return;\n\n let containerWidth =\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\n if (this.showSerialNumber) containerWidth -= 55;\n if (this.showSideMenu) containerWidth -= 29;\n if (this.gridType == 'Assets' || this.gridType == 'Tasks') containerWidth -= 30;\n containerWidth -= 55;\n const equalWidth = Math.max(Math.floor(containerWidth / visibleCount), 150);\n\n // Update widths for all visible columns\n visibleColumns.forEach((col) => {\n col.width = equalWidth;\n this.updateColumnWidthInSourceByField(col.field, equalWidth);\n });\n\n this.refreshHeaders();\n this.hasScroll = this.hasHorizontalScrollbar();\n this.cdr.detectChanges();\n setTimeout(() => {\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n }, 1000);\n }\n\n private markColumnAsGrouped(columns: any[], field: string): void {\n for (const col of columns) {\n if (col.field === field) {\n col.isRowGrouped = true;\n return;\n }\n if (col.children?.length) {\n this.markColumnAsGrouped(col.children, field);\n }\n }\n }\n\n async groupBy(col: any) {\n this.mainScroll.nativeElement.scrollTop = 0;\n this.translateY = 0;\n this.cdr.detectChanges();\n this.activeCol = null;\n if (!col) return;\n this.loading = true;\n this.cdr.detectChanges();\n if (col?.is_groupable) {\n this.groupedColumns.push(col);\n this.markColumnAsGrouped(this.columns, col.field);\n }\n const fields = this.groupedColumns.map((item) => item.field);\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\n setTimeout(() => {\n this.updateFlattenedData();\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.updateVisibleRows(0);\n this.loading = false;\n this.cdr.detectChanges();\n }, 100);\n\n setTimeout(() => {\n this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\n this.cdr.detectChanges()\n }, 10);\n\n this.cdr.detectChanges();\n }\n\n async groupDataAsync(data: any[], groupFields: string[]): Promise<any[]> {\n return new Promise(resolve => {\n setTimeout(() => {\n const result = this.groupData(data, groupFields);\n resolve(result);\n }, 0);\n });\n }\n\n\n\n\n chooseColumns() {\n this.activeCol = null;\n this.showColumnPanel = true;\n this.cdr.detectChanges();\n }\n\n resetColumns() {\n this.activeCol = null;\n\n // this.columns = structuredClone(this.originalColumns);\n // Deep copy nested objects but keep class refs safe\n this.originalColumns = this.columns.map(col => ({\n ...col,\n // Deep copy nested objects but keep class refs safe\n query: col.query ? { ...col.query } : null,\n column_dropdown_value: col.column_dropdown_value\n ? [...col.column_dropdown_value]\n : [],\n }));\n\n this.SetColumnsDefaultWidth();\n setTimeout(() => {\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.cdr.detectChanges();\n }, 100);\n }\n\n clearFilter(col: any) {\n col.firstValue = '';\n col.secondValue = '';\n col.firstCondition = 'contain';\n col.secondCondition = null;\n col.logic = 'AND';\n col.selectAll = false;\n col.selectedOptions = {};\n col.searchValue = '';\n\n }\n\n\n applyFilter(col: any) {\n this.filterColumnsList.push(col);\n }\n\n // Rows Selection Logic Goes Here\n\n selectedRows: Set<string> = new Set();\n\n /**\n * Get normalized ID from row.\n */\n private getRowId(row: any): string {\n return row.id ?? row._id;\n }\n\n /**\n * Toggle a single row selection.\n */\n toggleRowSelection(row: any): void {\n const id = this.getRowId(row);\n\n if (this.selectedRows.has(id)) {\n this.selectedRows.delete(id);\n } else {\n this.selectedRows.add(id);\n }\n\n const ids = Array.from(this.selectedRows);\n\n this.saveSelection(ids, this.tableType);\n\n const event = {\n data: {\n listingType: this.listingType,\n obj: ids\n },\n eventType: \"onSelectRow\",\n };\n this.genericEvent.emit(event);\n }\n\n\n\n toggleSelectAll(data: any[]): void {\n const leafRows = this.getAllLeafRows(data);\n const allIds = leafRows.map(r => this.getRowId(r));\n\n const allSelected = allIds.every(id => this.selectedRows.has(id));\n\n if (allSelected) {\n allIds.forEach(id => this.selectedRows.delete(id));\n } else {\n allIds.forEach(id => this.selectedRows.add(id));\n }\n this.cdr.detectChanges();\n const ids = Array.from(this.selectedRows);\n const event = {\n data: {\n listingType: this.listingType,\n obj: ids\n },\n eventType: \"onSelectRow\",\n }\n this.genericEvent.emit(event);\n this.saveSelection(ids, this.tableType);\n }\n\n isRowSelected(row: any): boolean {\n return this.selectedRows.has(this.getRowId(row));\n }\n\n isAllSelected(data: any[]): boolean {\n const leafRows = this.getAllLeafRows(data);\n return leafRows.length > 0 && leafRows.every(r => this.selectedRows.has(this.getRowId(r)));\n }\n\n\n isIndeterminateState(data: any[]): boolean {\n const leafRows = this.getAllLeafRows(data);\n const selectedCount = leafRows.filter(r => this.selectedRows.has(this.getRowId(r))).length;\n\n return selectedCount > 0 && selectedCount < leafRows.length;\n }\n\n\n getAllLeafRows(data: any[]): any[] {\n const leaf: any[] = [];\n\n const traverse = (node: any) => {\n if (!node) return;\n\n if (node.isGroup) {\n node.children?.forEach(traverse);\n } else {\n leaf.push(node);\n }\n };\n\n data.forEach(traverse);\n return leaf;\n }\n\n\n\n\n // Side Menu Working Goes Here\n toggleSideMenu(clickedOn: 'cols' | 'filtrs') {\n if (this.currentOpenedSideMenue == clickedOn) {\n this.currentOpenedSideMenue = clickedOn;\n this.sideMenuVisible = !this.sideMenuVisible;\n } else if (\n this.sideMenuVisible &&\n clickedOn != this.currentOpenedSideMenue\n ) {\n this.currentOpenedSideMenue = clickedOn;\n return;\n } else {\n this.currentOpenedSideMenue = clickedOn;\n this.sideMenuVisible = !this.sideMenuVisible;\n }\n this.hasScroll = this.hasHorizontalScrollbar();\n this.cdr.detectChanges();\n }\n\n toggleGroupVisibility(col: any) {\n const allVisible = col.children.every((child: any) => child.is_visible);\n col.children.forEach((child: any) => (child.is_visible = !allVisible));\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n setTimeout(() => {\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.SetColumnsDefaultWidth();\n this.cdr.detectChanges();\n }, 10);\n }\n\n isColumnVisible(columns: any) {\n if (columns?.children) {\n return columns.children.every((element: any) => element.is_visible);\n }\n\n return columns?.is_visible;\n }\n\n allColumnsSelected(): boolean {\n const flatten = this.flattenColumns(this.columns);\n return flatten.every((col) => col.is_visible);\n }\n\n\n private findColumnByField(field: string, cols: any[]): any | null {\n for (const col of cols) {\n if (col.field === field) {\n return col;\n }\n if (col.children && Array.isArray(col.children)) {\n const found = this.findColumnByField(field, col.children);\n if (found) return found;\n }\n }\n return null;\n }\n\n\n\n async toggleColumnVisibility(column: any, isVisible: boolean) {\n if (isVisible) {\n if (this.visibleColumns()?.length <= 2 && column.is_visible || (column?.is_always_visible)) {\n return;\n }\n }\n const col = this.findColumnByField(column.field, this.columns);\n if (col) {\n col.is_visible = isVisible;\n }\n await this.refreshHeaders();\n this.cdr.detectChanges();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n if (this.tableFilterViewId) {\n this.savePreset('mouseUp');\n }\n }\n\n\n async toggleAllColumnsVisibility(): Promise<void> {\n this.loading = true;\n\n try {\n const flatten = this.flattenColumns(this.columns);\n const visibleColumns = flatten.filter(col => col.is_visible);\n if (visibleColumns.length <= 2) {\n this.loading = false;\n return;\n }\n\n const nonAlwaysVisible = flatten.filter(col => !col.is_always_visible);\n const allNonAlwaysVisibleAreVisible = nonAlwaysVisible.every(col => col.is_visible);\n if (allNonAlwaysVisibleAreVisible) {\n flatten.forEach(col => {\n col.is_visible = col.is_always_visible ? true : false;\n });\n } else {\n flatten.forEach(col => (col.is_visible = true));\n }\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n \n } finally {\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n\n private wait(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n\n\n visibleColumns() {\n const flatten = this.flattenColumns(this.columns);\n const visibleColumns = flatten.filter((c: any) => c.is_visible);\n return visibleColumns;\n }\n\n flattenColumns(cols: any[]): any[] {\n return cols.reduce((acc: any[], col: any) => {\n if (col?.children && col.children.length) {\n // recursively flatten children\n return acc.concat(this.flattenColumns(col.children));\n } else {\n // leaf column\n return acc.concat(col);\n }\n }, []);\n }\n\n\n filteredColumns(cols: any[]): any[] {\n const search = this.columnSearch.toLowerCase();\n return cols\n .map((col) => {\n if (col.children) {\n const filteredChildren = this.filteredColumns(col.children);\n if (\n col.header.toLowerCase().includes(search) ||\n filteredChildren.length\n ) {\n return { ...col, children: filteredChildren };\n }\n return null;\n } else {\n return col.header.toLowerCase().includes(search) ? col : null;\n }\n })\n .filter(Boolean);\n }\n\n get accordionState(): 'all' | 'none' | 'some' {\n const groups = this.getAllGroupColumns(this.columns);\n const expandedCount = groups.filter((col) => col.expanded).length;\n\n if (expandedCount === 0) return 'none';\n if (expandedCount === groups.length) return 'all';\n return 'some';\n }\n\n get filterAccordionState(): 'all' | 'none' | 'some' {\n const groups = this.getAllGroupColumns(this.columns);\n const expandedCount = groups.filter((col) => col.expandedFilter).length;\n\n if (expandedCount === 0) return 'none';\n if (expandedCount === groups.length) return 'all';\n return 'some';\n }\n\n // Recursively collect all group columns\n private getAllGroupColumns(cols: any[]): any[] {\n let groups: any[] = [];\n for (const col of cols) {\n if (col.children?.length) {\n groups.push(col);\n groups = groups.concat(this.getAllGroupColumns(col.children));\n }\n }\n return groups;\n }\n\n // Toggle based on current state\n toggleAllAccordions(): void {\n const nextState = this.accordionState === 'all' ? false : true;\n this.setAccordionState(this.columns, nextState);\n }\n\n toggleAllFilterAccordions(): void {\n const nextState = this.filterAccordionState === 'all' ? false : true;\n this.setFilterAccordionState(this.columns, nextState);\n }\n\n private setAccordionState(cols: any[], state: boolean): void {\n for (let col of cols) {\n if (col.children?.length) {\n col.expanded = state;\n this.setAccordionState(col.children, state); // Recursively handle nested\n }\n }\n this.cdr.detectChanges();\n }\n private setFilterAccordionState(cols: any[], state: boolean): void {\n for (let col of cols) {\n if (col.children?.length) {\n col.expandedFilter = state;\n this.setFilterAccordionState(col.children, state); // Recursively handle nested\n }\n }\n }\n\n showColumnPanel = false;\n\n closeModalColumnPanel() {\n this.showColumnPanel = false;\n this.cdr.detectChanges();\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscape(event: Event) {\n this.closeModalColumnPanel();\n }\n\n // Check If Any column have right pinned\n get hasRightPinnedColumns() {\n return this.commonSevice.gethasRightPinnedColumns(this.columns);\n }\n\n get hasLeftPinnedColumns() {\n return this.commonSevice.gethasLeftPinnedColumns(this.columns);\n }\n\n get dataSetLength() {\n return this.commonSevice.getExpandedRowCount(this.dataSet);\n }\n\n\n\n @HostListener('window:resize', ['$event'])\n onResize(event: UIEvent) {\n if (!this.curretaTablePresetForUpdate) this.autoSizeColumnsByRatio();\n const h = this.mainScroll?.nativeElement?.clientHeight ?? 0;\n this.viewportRows = Math.max(1, Math.ceil(h / this.rowHeight));\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\n this.hasScroll = this.hasHorizontalScrollbar();\n this.cdr.detectChanges();\n setTimeout(() => { }, 100);\n }\n\n autoSizeColumnsByRatio(): void {\n this.activeCol = null;\n\n const getVisibleLeafColumns = (columns: any[]): any[] => {\n const result: any[] = [];\n\n for (const column of columns) {\n if (column.children && Array.isArray(column.children)) {\n result.push(...getVisibleLeafColumns(column.children));\n } else if (column.is_visible !== false) {\n result.push(column);\n }\n }\n return result;\n };\n\n const visibleColumns = getVisibleLeafColumns(this.columns);\n\n if (visibleColumns.length === 0) return;\n let containerWidth =\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\n\n if (this.showSerialNumber) containerWidth -= 55;\n if (this.showSideMenu) containerWidth -= 29;\n if (this.gridType == 'Assets' || this.gridType == 'Tasks')\n containerWidth -= 30;\n containerWidth -= 55;\n const totalOldWidth = visibleColumns.reduce(\n (sum, col) => sum + (col.width || 0),\n 0\n );\n if (totalOldWidth === 0) return;\n visibleColumns.forEach((col) => {\n const ratio = col.width / totalOldWidth;\n const newWidth = Math.max(Math.floor(containerWidth * ratio), 100);\n col.width = newWidth;\n this.updateColumnWidthInSourceByField(col.field, newWidth);\n });\n\n this.refreshHeaders();\n this.hasScroll = this.hasHorizontalScrollbar();\n this.cdr.detectChanges();\n setTimeout(() => {\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n }, 400);\n }\n\n\n async refreshHeaders() {\n this.ngZone.runOutsideAngular(async () => {\n await new Promise(r => setTimeout(r, 0));\n await this.updateColumnWidthsAndGroups();\n await this.refreshPreviewColumns();\n\n this.ngZone.run(() => this.cdr.detectChanges());\n });\n }\n\n get hasAnyVisibleColumn() {\n return this.commonSevice.gethasVisibleColumns(this.columns);\n }\n\n get hasAnyInVisibleColumn() {\n return this.commonSevice.gethasInVisibleColumns(this.columns);\n }\n\n get columnsCount() {\n return this.commonSevice.getTotalColumnsLength(this.columns);\n }\n\n tableHeaderAndBodyHeight() {\n return `calc(100% - ${this.footerRowHeight})`;\n }\n\n draggingInGroupArea = false;\n\n @ViewChild('centerScroll') centerScroll!: ElementRef<HTMLDivElement>;\n visibleRowCount = 25;\n startIndex = 0;\n visibleRows: any[] = [];\n\n private flattenGroupedRows(\n rows: any[] = [],\n level = 0,\n result: any[] = []\n ): any[] {\n for (const row of rows) {\n result.push({ ...row, __depth: level });\n if (row.isGroup && row.isExpand && row.children?.length) {\n this.flattenGroupedRows(row.children, level + 1, []);\n }\n }\n this.assignVirtualIndexes(this.visibleRows);\n return result;\n }\n\n assignVirtualIndexes(data: any[]): any[] {\n let currentIndex = 1;\n const walk = (items: any[]): void => {\n for (const item of items) {\n item.__virtualIndex = currentIndex++;\n if (item?.isGroup) {\n const group = item;\n if (group.isExpand && Array.isArray(group.children)) {\n walk(group.children);\n }\n }\n }\n };\n walk(data);\n // console.log('This dataset: ', this.visibleRows)\n return data;\n }\n\n\n updateVisibleRows(scrollTop: number) {\n\n if (this.groupedColumns?.length) {\n this.visibleRows = this.dataSet;\n return;\n }\n const flatData = this.flattenGroupedRows(this.dataSet);\n\n if (this.dataSet?.length <= 15) {\n this.visibleRows = flatData;\n this.firstIndex = 0;\n this.startIndex = 0;\n this.renderStart = 0;\n this.cdr.detectChanges();\n return;\n }\n const total = flatData.length;\n const maxFirst = Math.max(0, total - this.viewportRows);\n const first = Math.min(Math.floor(scrollTop / this.rowHeight), maxFirst);\n const start = Math.max(0, first);\n const end = Math.min(total, first + this.viewportRows);\n\n this.firstIndex = first;\n this.startIndex = first;\n this.renderStart = start;\n this.visibleRows = flatData.slice(start, end);\n this.assignVirtualIndexes(this.visibleRows);\n this.cdr.detectChanges();\n }\n\n\n trackByRenderedIndex = (i: number, _row: any) => this.renderStart + i;\n\n private isSyncingFromMain = false;\n private isSyncingFromFake = false;\n private mainScrollRaf: number | null = null;\n\n trackById(index: number, item: any) {\n return item.id || item._id;\n }\n\n flattenedData: any[] = [];\n\n updateFlattenedData(): void {\n setTimeout(() => {\n this.flattenedData = this.flattenGroupedRows(this.dataSet);\n this.cdr.detectChanges();\n }, 10);\n }\n\n // requestAnimationFrame IDs\n private fakeScrollRaf: number | null = null;\n\n\n // onMainScroll(event: Event) {\n // this.expandedCells.clear();\n // const scrollTop = (event.target as HTMLElement).scrollTop;\n // if (this.groupedColumns?.length > 0) {\n // this.startIndex = 0;\n // this.cdr.detectChanges();\n // return;\n // }\n // const overscan = this.overscan * 2;\n // this.startIndex = Math.floor(scrollTop / this.rowHeight);\n // const start = Math.max(0, this.startIndex - overscan);\n // const end = Math.min(this.flattenedData.length, this.startIndex + this.viewportRows + overscan);\n // this.visibleRows = this.flattenedData.slice(start, end);\n // this.cdr.detectChanges();\n // }\n translateY = 0;\n\n lastScrollTop = 0;\n pendingAnimationFrame: number | null = null;\n\n onMainScroll(event: Event): void {\n const scrollTop = (event.target as HTMLElement).scrollTop;\n if (Math.abs(scrollTop - this.lastScrollTop) < (10)) return;\n if (this.pendingAnimationFrame) cancelAnimationFrame(this.pendingAnimationFrame);\n if (this.groupedColumns?.length > 0) {\n this.startIndex = 0;\n this.cdr.detectChanges();\n return;\n }\n this.pendingAnimationFrame = requestAnimationFrame(() => {\n const scrollingDown = scrollTop > this.lastScrollTop;\n this.lastScrollTop = scrollTop;\n\n const overscan = 5;\n const newStartIndex = Math.floor(scrollTop / this.rowHeight);\n const dynamicOverscan = scrollingDown ? overscan : overscan;\n\n const start = Math.max(0, newStartIndex - dynamicOverscan);\n const end = Math.min(\n this.flattenedData.length,\n newStartIndex + this.viewportRows + dynamicOverscan\n );\n this.translateY = start * this.rowHeight;\n if (this.startIndex !== start || this.visibleRows.length !== end - start) {\n this.startIndex = start;\n this.visibleRows = this.dataSet.slice(start, end);\n this.cdr.markForCheck();\n }\n\n this.pendingAnimationFrame = null;\n });\n }\n\n\n // onMainScroll(event: Event): void {\n // this.expandedCells.clear();\n // if (this.isSyncingFromFake) {\n // this.isSyncingFromFake = false;\n // return;\n // }\n // const scrollTop = (event.target as HTMLElement).scrollTop;\n // if (Math.abs(scrollTop - this.lastScrollTop) < this.rowHeight / 2) return;\n // this.lastScrollTop = scrollTop;\n\n // if (this.fakeScrollRaf) cancelAnimationFrame(this.fakeScrollRaf);\n\n // this.fakeScrollRaf = requestAnimationFrame(() => {\n // if (this.groupedColumns?.length > 0) {\n // this.startIndex = 0;\n // this.cdr.detectChanges();\n // return;\n // }\n // const flatData = this.flattenGroupedRows(this.dataSet);\n // const totalRows = flatData.length;\n // const newStartIndex = Math.floor(scrollTop / this.rowHeight);\n // const start = Math.max(0, newStartIndex - (this.overscan * 2));\n // const end = Math.min(totalRows, newStartIndex + this.viewportRows + (this.overscan * 2));\n\n // this.translateY = start * this.rowHeight;\n // this.startIndex = start;\n // this.visibleRows = flatData.slice(start, end);\n // this.cdr.detectChanges();\n // });\n // }\n\n\n get isScrollbarVisible(): boolean {\n if (!this.mainScroll) return false;\n const el = this.mainScroll.nativeElement;\n return el.scrollHeight > el.clientHeight;\n }\n\n toggleExpand(row: any) {\n if (row.details) {\n row.isDetailsExpand = !row.isDetailsExpand;\n } else {\n row.isExpand = !row.isExpand;\n }\n this.rowSelectedIndexes.clear();\n this.updateFlattenedData();\n // this.cdr.detectChanges();\n // setTimeout(() => {\n // this.cdr.detectChanges();\n // }, 100);\n }\n\n // onMainFakeScroll(event: Event) {\n // if (this.isSyncingFromMain) {\n // this.isSyncingFromMain = false;\n // return;\n // }\n // if (this.groupedColumns?.length > 0) {\n // this.startIndex = 0;\n // this.cdr.detectChanges();\n // return;\n // }\n // const scrollTop = (event.target as HTMLElement).scrollTop;\n // if (this.mainScrollRaf) cancelAnimationFrame(this.mainScrollRaf);\n // this.mainScrollRaf = requestAnimationFrame(() => {\n // this.isSyncingFromFake = true;\n // this.mainScroll.nativeElement.scrollTop = scrollTop;\n // const overscan = this.overscan ?? 0;\n // this.startIndex = Math.floor(scrollTop / this.rowHeight);\n // const start = Math.max(0, this.startIndex - overscan);\n // const end = Math.min(\n // this.flattenedData.length,\n // this.startIndex + this.viewportRows + overscan\n // );\n // this.visibleRows = this.flattenedData.slice(start, end);\n // this.cdr.detectChanges();\n // });\n // }\n\n\n\n\n\n viewportRows = 0; // how many rows fit in viewport (computed)\n firstIndex = 0; // index of the first visible row (clamped)\n renderStart = 0; // where the slice actually starts (firstIndex - overscan, clamped)\n\n private scrollRaf: number | null = null;\n private pendingScrollTop = 0;\n\n @ViewChild('mainScroll') mainScroll!: ElementRef<HTMLDivElement>;\n @ViewChild('fakeScroll') fakeScroll!: ElementRef<HTMLDivElement>;\n @ViewChild('horizintalFakeScroll')\n horizintalFakeScroll!: ElementRef<HTMLDivElement>;\n @ViewChild('centerScrollableBody')\n centerScrollableBody!: ElementRef<HTMLDivElement>;\n private overscan = 10; // buffer rows above and below\n\n computeViewportRows() {\n if (this.fakeScroll?.nativeElement) {\n this.fakeScroll.nativeElement.scrollTop = 0;\n }\n\n if (this.mainScroll?.nativeElement) {\n this.mainScroll.nativeElement.scrollTop = 0;\n const h = this.mainScroll.nativeElement.clientHeight ?? 0;\n\n // rows visible in viewport\n const rowsInViewport = Math.max(1, Math.ceil(h / this.rowHeight));\n\n // add buffer rows (overscan)\n this.viewportRows = rowsInViewport + this.overscan;\n\n this.cdr.detectChanges();\n }\n }\n\n\n onHorizontalFakeScroll(event: Event) {\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\n if (this.centerScrollableBody?.nativeElement) {\n this.centerScrollableBody.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n onCenterBodyScroll(event: Event) {\n const target = event.target as HTMLElement;\n if (this.centerScrollableBody?.nativeElement) {\n this.centerScrollableBody.nativeElement.scrollLeft = target.scrollLeft;\n }\n if (this.centerPinnedHeader) {\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\n }\n if (this.horizintalFakeScroll?.nativeElement) {\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\n }\n event.stopPropagation();\n event.preventDefault();\n }\n\n onCenterHeaderScroll(event: Event) {\n const target = event.target as HTMLElement;\n if (this.horizintalFakeScroll?.nativeElement) {\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\n }\n if (this.centerScrollableBody?.nativeElement) {\n this.centerScrollableBody.nativeElement.scrollLeft = target.scrollLeft;\n }\n }\n\n // Dragging Logic is implemented here\n // private initialIndex: number | null = null;\n\n draggingColumn: any;\n dragStartIndex: any = 0;\n // onDragStart(data: any, index: number) {\n // this.draggingColumn = data.column;\n // this.dragStartIndex = index;\n // }\n // onDragMove(data: any) {\n // const { clientX, clientY } = data.event;\n // const headers = Array.from(\n // document.querySelectorAll('.one-row-header-cells')\n // ) as HTMLElement[];\n\n // headers.forEach((headerEl, idx) => {\n // const rect = headerEl.getBoundingClientRect();\n // if (\n // idx !== this.dragStartIndex &&\n // clientX > rect.left &&\n // clientX < rect.right &&\n // clientY > rect.top &&\n // clientY < rect.bottom\n // ) {\n // const otherIndex = idx;\n // console.log(`${this.dragStartIndex} --> ${otherIndex}`);\n // this.swapColumn(this.dragStartIndex, otherIndex);\n // console.log('Updated Columns: ', this.columns);\n // this.dragStartIndex = otherIndex; // update index\n // }\n // });\n // }\n\n // swapColumn(previusIndex: number, currentIndex: number) {\n // const columns = structuredClone(this.columns);\n // const flattenColumns = this.flattenColumns(columns);\n\n // const visibleFlattenColumns = flattenColumns.filter(\n // (col) => col.is_visible\n // );\n // const previusColumn = visibleFlattenColumns[previusIndex];\n // const currentColumn = visibleFlattenColumns[currentIndex];\n\n // console.log('Previus Column: ', previusColumn);\n // console.log('current clumn: ', currentColumn);\n // }\n\n // onDragEnd(data: any) {\n // this.draggingColumn = null;\n // this.dragStartIndex = null;\n // }\n\n // CDK DRAG DROP LOGIC GOES HERE\n\n\n canEnterToRowsGrouping = (drag: CdkDrag<any>, drop: CdkDropList<any>) => {\n // Example: Block if already pinned left\n const data = drag.data;\n if (data?.children && data?.children.length) {\n return data.children.some(\n (col: any) => col.is_visible && col.is_groupable\n );\n }\n return data.is_visible && data.is_groupable;\n };\n\n // onDragMoved(event: CdkDragMove<any>) {\n // const pointerX = event.pointerPosition.x;\n // const pointerY = event.pointerPosition.y;\n\n // const targetElement = document.getElementById(\n // 'rows-grouping-top-container'\n // );\n\n // if (targetElement) {\n // const rect = targetElement.getBoundingClientRect();\n\n // const isOverTarget =\n // pointerX >= rect.left &&\n // pointerX <= rect.right &&\n // pointerY >= rect.top &&\n // pointerY <= rect.bottom;\n\n // if (isOverTarget) {\n // this.draggingInGroupArea = true;\n // } else {\n // this.draggingInGroupArea = false;\n // }\n // }\n // }\n\n enterToTopRowGrouping(dropList: CdkDragEnter<any>) {\n const draggingData = dropList.item.data;\n this.draggingInGroupArea = true;\n // console.log(\"Dragging in group area\")\n this.cdr.detectChanges();\n\n if (Array.isArray(draggingData?.children)) {\n const targetGroup = this.columns.find(\n (col) => col.header === draggingData.header\n );\n if (targetGroup) {\n draggingData.children.forEach((draggedChild: any) => {\n const matchingChild = targetGroup.children.find(\n (child: any) => child.field === draggedChild.field\n );\n if (matchingChild) {\n matchingChild.isRowGrouped = !!matchingChild.is_groupable;\n }\n });\n }\n }\n else {\n // Try finding it in top-level columns first\n let targetColumn = this.columns.find(\n (col: any) => col.field === draggingData.field\n );\n\n if (targetColumn) {\n targetColumn.isRowGrouped = !!targetColumn.is_groupable;\n } else {\n for (let group of this.columns) {\n if (Array.isArray(group.children)) {\n const matchingChild = group.children.find(\n (child: any) => child.field === draggingData.field\n );\n if (matchingChild) {\n matchingChild.isRowGrouped = !!matchingChild.is_groupable;\n break;\n }\n }\n }\n }\n }\n\n // ✅ Refresh UI\n this.refreshPreviewColumns();\n this.cdr.detectChanges();\n }\n\n onDropListEnter(\n dropList: CdkDragEnter<any>,\n section: 'left' | 'center' | 'right'\n ) {\n const draggingData = dropList.item.data;\n\n const targetColumn: any = this.columns.find(\n (col) => col.header == draggingData.header\n );\n\n if (!targetColumn) return;\n\n if (\n Array.isArray(draggingData?.children) &&\n Array.isArray(targetColumn?.children)\n ) {\n draggingData.children.forEach((draggedChild: any) => {\n const matchingChild = targetColumn.children.find(\n (child: any) => child.field === draggedChild.field\n );\n if (matchingChild) {\n matchingChild.pinned = section === 'center' ? null : section;\n matchingChild['isRowGrouped'] = false;\n }\n });\n } else {\n targetColumn.pinned = section === 'center' ? null : section;\n targetColumn['isRowGrouped'] = false;\n }\n\n this.refreshPreviewColumns();\n this.cdr.detectChanges();\n }\n\n // enterToTopGroupingRow(dropList: CdkDragEnter<any>) {\n // this.shouldDisableDroplistSorting = this.isDisableColumnGrouping;\n // this.draggingInGroupArea = true;\n // this.cdr.detectChanges();\n // const index = this.groupedColumns.findIndex(\n // (col) => col.field === column.field\n // );\n // if (index !== -1) {\n // this.groupedColumns.splice(index, 1);\n // }\n\n // // 2. Traverse this.columns to find and update the matching column\n // this.columns.forEach((group) => {\n // if (group?.children && Array.isArray(group.children)) {\n // group.children.forEach((child) => {\n // if (child.field === column.field) {\n // child.isRowGrouped = false;\n // }\n // });\n // } else if (group.field === column.field) {\n // group.isRowGrouped = false;\n // }\n // });\n // this.cdr.detectChanges();\n // }\n\n exitedFromTheTopRow(dropList: CdkDragExit<any>) {\n this.draggingInGroupArea = false;\n this.isDisableColumnGrouping = false;\n this.shouldDisableDroplistSorting = false;\n const draggingData = dropList.item.data;\n if (Array.isArray(draggingData?.children)) {\n const targetGroup = this.columns.find(\n (col) => col.header === draggingData.header\n );\n if (targetGroup) {\n draggingData.children.forEach((draggedChild: any) => {\n const matchingChild = targetGroup.children.find(\n (child: any) => child.field === draggedChild.field\n );\n if (matchingChild) {\n matchingChild.isRowGrouped = false;\n }\n });\n }\n } else {\n let targetColumn = this.columns.find(\n (col: any) => col.field === draggingData.field\n );\n\n if (targetColumn) {\n targetColumn.isRowGrouped = false;\n } else {\n for (let group of this.columns) {\n if (Array.isArray(group.children)) {\n const matchingChild = group.children.find(\n (child: any) => child.field === draggingData.field\n );\n if (matchingChild) {\n matchingChild.isRowGrouped = false;\n break;\n }\n }\n }\n }\n }\n this.refreshPreviewColumns();\n this.cdr.detectChanges();\n }\n\n shouldDisableDroplistSorting = false;\n isDisableColumnGrouping = false;\n checkColumnGroupingStatus(col: any) {\n if (col?.children && Array.isArray(col.children)) {\n const allChildrenDisabled = col.children.every(\n (child: any) => child.is_groupable === false\n );\n this.isDisableColumnGrouping = allChildrenDisabled;\n } else {\n this.isDisableColumnGrouping = col.is_groupable === false;\n }\n this.cdr.detectChanges();\n }\n\n currentDraggingColumn: any = null;\n dragStartOnGroup(col: any) {\n this.currentDraggingColumn = col;\n }\n\n onSortGroup = async (event: CdkDragSortEvent<any>, section: string) => {\n const columns = (this as any)[section];\n if (event.previousIndex === event.currentIndex) return;\n const visibleColumns = columns.filter((col: any) => {\n if (col?.children && Array.isArray(col.children)) {\n return col.children.some((child: any) => child.is_visible);\n }\n return col.is_visible;\n });\n const previousHeader = visibleColumns[event.previousIndex].header;\n const currentHeader = visibleColumns[event.currentIndex].header;\n const visiblePrevIndex = visibleColumns.findIndex(\n (col: any) => col.header === previousHeader\n );\n const visibleCurrIndex = visibleColumns.findIndex(\n (col: any) => col.header === currentHeader\n );\n const getFields = (item: any): string[] => {\n if (item?.children && Array.isArray(item.children)) {\n return item.children.map((child: any) => child.field);\n }\n return [item.field];\n };\n const prevFields = getFields(visibleColumns[visiblePrevIndex]);\n const currFields = getFields(visibleColumns[visibleCurrIndex]);\n const allFields = [...prevFields, ...currFields];\n const cells = allFields.length\n ? ([] as HTMLElement[]).concat(\n ...allFields.map((field) =>\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\n )\n )\n : [];\n const firstPositions = new Map<HTMLElement, number>();\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\n // console.log(\"this .coluns\", this.columns);\n moveItemInArray((this as any)[section], visiblePrevIndex, visibleCurrIndex);\n\n const prevColIndexInColumns = this.columns.findIndex(item => item.header === previousHeader);\n const currColIndexInColumns = this.columns.findIndex(item => item.header === currentHeader);\n moveItemInArray(this.columns, prevColIndexInColumns, currColIndexInColumns);\n // await this.refreshPreviewColumns();\n this.cdr.detectChanges();\n await firstValueFrom(this.ngZone.onStable);\n // this.ngZone.runOutsideAngular(() => {\n // Wait a tick to make sure elements are rendered\n requestAnimationFrame(() => {\n allFields.forEach((field) => {\n const updatedCells = Array.from(\n document.querySelectorAll(`[field=\"${field}\"]`)\n ) as HTMLElement[];\n\n updatedCells.forEach((el) => {\n const oldLeft = firstPositions.get(el);\n if (oldLeft == null) return; // skip if old position not available\n\n const newLeft = el.getBoundingClientRect().left;\n const deltaX = oldLeft - newLeft;\n\n if (deltaX !== 0) {\n el.style.willChange = 'transform';\n el.style.transition = 'none';\n el.style.transform = `translateX(${deltaX}px)`;\n\n // Force reflow\n void el.offsetWidth;\n\n el.style.transition = 'transform 250ms cubic-bezier(0.4, 0, 0.2, 1)';\n el.style.transform = 'translateX(0)';\n\n const handle = () => {\n el.style.transition = '';\n el.style.transform = '';\n el.style.willChange = '';\n el.removeEventListener('transitionend', handle);\n };\n el.addEventListener('transitionend', handle);\n }\n });\n });\n });\n // });\n }\n\n\n onDropGroup() {\n this.leftPinnedColumns = this.deepCloneColumns(this.previewLeftPinnedColumns);\n this.centerColumns = this.deepCloneColumns(this.previewCenterColumns);\n this.rightPinnedColumns = this.deepCloneColumns(this.previewRightPinnedColumns);\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n this.cdr.detectChanges();\n }\n\n private deepCloneColumns(columns: any[]): any[] {\n if (!Array.isArray(columns)) return [];\n\n return columns.map(col => ({\n ...col,\n query: col.query ? { ...col.query } : null,\n column_dropdown_value: Array.isArray(col.column_dropdown_value)\n ? [...col.column_dropdown_value]\n : [],\n // Recursively deep clone children if present\n children: Array.isArray(col.children)\n ? this.deepCloneColumns(col.children)\n : undefined,\n }));\n }\n\n\n async onDropTopGroup(event: CdkDragDrop<any>) {\n if (this.isOutsideContainer) return;\n this.mainScroll.nativeElement.scrollTop = 0;\n this.loading = true;\n this.translateY = 0;\n this.cdr.detectChanges();\n const draggedData = event.item.data;\n if (draggedData?.children && Array.isArray(draggedData.children)) {\n draggedData.children.forEach((col: any) => {\n if (col.is_visible && col.is_groupable) {\n this.groupedColumns.push(col);\n }\n });\n } else {\n if (draggedData.is_visible && draggedData.is_groupable) {\n this.groupedColumns.push(draggedData);\n }\n }\n this.draggingInGroupArea = false;\n const fields = this.groupedColumns.map((item) => item.field);\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\n this.updateFlattenedData();\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.updateVisibleRows(0);\n this.loading = false;\n this.cdr.detectChanges();\n this.selectedCells = [];\n setTimeout(() => {\n this.rowSelectedIndexes.clear();\n this.cdr.detectChanges();\n }, 1000);\n this.cdr.detectChanges();\n }\n\n async onGroupReorder(event: CdkDragDrop<any[]>) {\n moveItemInArray(this.groupedColumns, event.previousIndex, event.currentIndex);\n const fields = this.groupedColumns.map((item) => item.field);\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\n setTimeout(() => {\n this.updateFlattenedData();\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.updateVisibleRows(0);\n this.loading = false;\n this.cdr.detectChanges();\n }, 100);\n\n setTimeout(() => {\n this.groupBoxPadding = this.columnsGroupedBox?.nativeElement.offsetWidth;\n this.cdr.detectChanges()\n }, 10);\n }\n\n async ungroupColumn(column: any) {\n try {\n this.loading = true;\n this.cdr.detectChanges();\n const index = this.groupedColumns.findIndex(\n (col) => col.field === column.field\n );\n if (index !== -1) {\n this.groupedColumns.splice(index, 1);\n }\n const fields = this.groupedColumns.map((item) => item.field);\n this.dataSet = await this.groupDataAsync(this.originalDataSet, fields);\n this.columns.forEach((group) => {\n if (group?.children && Array.isArray(group.children)) {\n group.children.forEach((child: any) => {\n if (child.field === column.field) {\n child.isRowGrouped = false;\n }\n });\n } else if (group.field === column.field) {\n group.isRowGrouped = false;\n }\n });\n setTimeout(() => {\n this.updateFlattenedData();\n this.updateColumnWidthsAndGroups();\n this.refreshPreviewColumns();\n this.updateVisibleRows(0);\n this.loading = false;\n this.cdr.detectChanges();\n }, 1000);\n\n } catch (err) {\n console.error(\"Error in ungroupColumn:\", err);\n this.loading = false;\n }\n this.cdr.detectChanges();\n }\n\n\n shouldTheGroupHeaderShow(group: any) {\n if (group?.children && group.children.length) {\n return group.children.some(\n (col: any) => col.is_visible && !col?.isRowGrouped\n );\n }\n return group?.is_visible && !group?.isRowGrouped;\n }\n\n createCustomColumn(){\n const event = {\n data: {\n listingType: this.listingType, \n },\n eventType: \"createCustomColumn\",\n };\n this.genericEvent.emit(event);\n }\n\n // onChildDragStart() {\n // debugger;\n // }\n\n // dropListIds: string[] = [];\n\n // generateDropListIds() {\n // this.dropListIds = [];\n\n // const sectionKeys = [\n // 'leftPinnedColumns',\n // 'centerColumns',\n // 'rightPinnedColumns',\n // ];\n\n // sectionKeys.forEach((sectionKey) => {\n // const sectionCols = (this as any)[sectionKey];\n\n // this.columns.forEach((col: any, i: number) => {\n // if (col?.children?.length > 0) {\n // col.children.forEach((child: any, childIndex: number) => {\n // if (child?.is_visible && !child.isRowGrouped) {\n // const id = `${sectionKey}${i}`;\n // this.dropListIds.push(id);\n // }\n // });\n // } else if (col?.is_visible && !col.isRowGrouped) {\n // const id = `${sectionKey}${i}`;\n // this.dropListIds.push(id);\n // }\n // });\n // });\n // }\n\n onChildDroplistSorted = async (event: CdkDragSortEvent<any>, section: string) => {\n if (event.previousIndex === event.currentIndex) return;\n\n const pinned =\n section == 'previewLeftPinnedColumns'\n ? 'left'\n : section == 'previewRightPinnedColumns'\n ? 'right'\n : \"\";\n\n const column = event.item.data;\n let group = this.columns.find(\n (col: any) =>\n Array.isArray(col.children) &&\n col.children.some((child: any) => child?.field === column?.field)\n );\n const groupIndex = this.columns.findIndex(\n (col) => col.header === group.header\n );\n const filteredGroup = group?.children.filter((col: any) => {\n const isPinnedMatch =\n (pinned === \"\" && (!col?.pinned || col?.pinned === \"\")) || col?.pinned === pinned;\n return isPinnedMatch && col?.is_visible;\n });\n\n const previousField = filteredGroup[event.previousIndex].field;\n const currentField = filteredGroup[event.currentIndex].field;\n const visiblePrevIndex = group.children.findIndex(\n (col: any) => col.field == previousField\n );\n const visibleCurrIndex = group.children.findIndex(\n (col: any) => col.field == currentField\n );\n const allFields = [previousField, currentField];\n const cells = allFields.length\n ? ([] as HTMLElement[]).concat(\n ...allFields.map((field) =>\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\n )\n )\n : [];\n\n const groupInSection = (this as any)[section].find(\n (col: any) =>\n Array.isArray(col.children) &&\n col.children.some((child: any) => child?.field === column?.field)\n );\n\n const filterGroupInSection = (this as any)[section].find(\n (col: any) =>\n Array.isArray(col.children) &&\n col.children.some((child: any) => child?.field === column?.field)\n );\n\n const groupInSectionIndex = (this as any)[section].findIndex(\n (col: any) => col.header === groupInSection.header\n );\n\n const firstPositions = new Map<HTMLElement, number>();\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\n moveItemInArray(\n this.columns[groupIndex]?.children,\n visiblePrevIndex,\n visibleCurrIndex\n );\n\n moveItemInArray(\n (this as any)[section]?.[groupInSectionIndex].children,\n event.previousIndex,\n event.currentIndex\n );\n\n // await this.refreshPreviewColumns();\n this.cdr.detectChanges();\n\n await firstValueFrom(this.ngZone.onStable);\n // allFields.forEach((field) => {\n // const updatedCells = Array.from(\n // document.querySelectorAll(`[field=\"${field}\"]`)\n // ) as HTMLElement[];\n // updatedCells.forEach((el) => {\n // const newLeft = el.getBoundingClientRect().left;\n // const oldLeft = firstPositions.get(el)!;\n // const deltaX = oldLeft - newLeft;\n // if (deltaX !== 0) {\n // el.style.willChange = 'transform';\n // el.style.transition = 'none';\n // el.style.transform = `translateX(${deltaX}px)`;\n // void el.offsetWidth;\n // el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\n // el.style.transform = 'translateX(0)';\n\n // const handle = () => {\n // el.style.transition = '';\n // el.style.transform = '';\n // el.style.willChange = '';\n // el.removeEventListener('transitionend', handle);\n // };\n // el.addEventListener('transitionend', handle);\n // }\n // });\n // });\n\n this.ngZone.runOutsideAngular(() => {\n allFields.forEach((field) => {\n const updatedCells = Array.from(\n document.querySelectorAll(`[field=\"${field}\"]`)\n ) as HTMLElement[];\n\n updatedCells.forEach((el) => {\n const oldLeft = firstPositions.get(el);\n if (oldLeft == null) return; // safety check\n\n const newLeft = el.getBoundingClientRect().left;\n const deltaX = oldLeft - newLeft;\n\n if (deltaX !== 0) {\n el.style.willChange = 'transform';\n el.style.transition = 'none';\n el.style.transform = `translateX(${deltaX}px)`;\n\n // Force reflow\n void el.offsetWidth;\n\n el.style.transition = 'transform 250ms cubic-bezier(0.4, 0, 0.2, 1)';\n el.style.transform = 'translateX(0)';\n\n const handle = () => {\n el.style.transition = '';\n el.style.transform = '';\n el.style.willChange = '';\n el.removeEventListener('transitionend', handle);\n };\n el.addEventListener('transitionend', handle);\n }\n });\n });\n });\n\n // console.group('Group: ', group);\n }\n\n\n onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>) {\n this.updateColumnWidthsAndGroups();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 2);\n }\n\n // Rows Grouping Logic Goes Here\n\n groupData(data: any[], groupFields: string[]): any[] {\n let dataSet = structuredClone(data);\n if (!groupFields.length) return data;\n const [currentField, ...restFields] = groupFields;\n const groupedMap = new Map<string, any[]>();\n for (const item of dataSet) {\n let keyValue = currentField.split('.').reduce((obj, k) => obj?.[k], item);\n let groupKey: string;\n if (Array.isArray(keyValue)) {\n if (keyValue.length === 0) {\n groupKey = \"_Blank\";\n } else if (typeof keyValue[0] === \"object\") {\n groupKey = keyValue\n .map(obj => (obj?.department_name || obj.roleName || obj?.full_name) ?? \"_Blank\")\n .join(\",\");\n } else {\n groupKey = keyValue\n .map(val => val ?? \"_Blank\")\n .join(\",\");\n }\n } else {\n groupKey = keyValue ? this.toTitleCase(String(keyValue).trim()) : \"_Blank\";\n }\n if (typeof keyValue === 'string' && !isNaN(Date.parse(keyValue))) {\n const dateObj = new Date(keyValue);\n groupKey = this.commonSevice.formatDateValue(dateObj, this.dateFormat || 'dd/MM/yyyy');\n }\n\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\n groupedMap.get(groupKey)!.push(item);\n }\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\n isGroup: true,\n groupField: currentField,\n groupValue,\n children: this.groupData(groupItems, restFields),\n isExpand: false,\n }));\n }\n\n toTitleCase(str: string): string {\n return str\n ?.toLowerCase()\n ?.split(' ')\n ?.map(word => word.charAt(0).toUpperCase() + word.slice(1))\n ?.join(' ');\n }\n\n\n countLeafRows(group: any): number {\n if (!group.children || !group.children.length) return 0;\n\n return group.children.reduce((count: number, child: any) => {\n return count + (child.isGroup ? this.countLeafRows(child) : 1);\n }, 0);\n }\n\n isActiveFilterOpen = false;\n toggleActiveFilter() {\n this.isActiveFilterOpen = !this.isActiveFilterOpen;\n }\n\n toggleActions(type: string) {\n if (type === this.activeTopButton) this.activeTopButton = type;\n else this.activeTopButton = type;\n this.activeSubButton = '';\n this.isFilterOpen = false;\n this.cdr.detectChanges();\n }\n\n activeSubButton = '';\n toggleSubActions(type: string) {\n if (type === this.activeSubButton) this.activeSubButton = '';\n else this.activeSubButton = type;\n this.cdr.detectChanges();\n }\n\n toggleActionsDropdown() {\n this.showActionsDropDown = !this.showActionsDropDown;\n this.cdr.detectChanges();\n }\n\n\n\n async changeTableLayout(event: Event, layoutType: string) {\n let target = event.target as HTMLInputElement;\n\n if (target.checked) {\n this.selectedTableLayout = layoutType;\n this.setTableLayout(layoutType)\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\n await this.refreshHeaders();\n }\n if (this.tableFilterViewId) {\n this.savePreset('mouseUp');\n }\n this.onFontChange()\n }\n\n setTableLayout(layoutType: string){\n if (layoutType === 'small') {\n this.rowHeight = 50;\n this.headerRowHeight = 40;\n this.bodyTextFontsSize = 10;\n this.headerTextFontsSize = 10;\n\n } else if (layoutType === 'medium') {\n this.rowHeight = 60;\n this.headerRowHeight = 40;\n this.bodyTextFontsSize = 14;\n this.headerTextFontsSize = 13;\n\n } else {\n this.rowHeight = 72;\n this.headerRowHeight = 40;\n this.bodyTextFontsSize = 16;\n this.headerTextFontsSize = 16;\n }\n }\n\n get startIndexData() {\n return (this.paginationConfig.page - 1) * this.paginationConfig.limit;\n }\n\n get endIndex() {\n return Math.min(this.startIndex + this.paginationConfig.limit, this.paginationConfig.totalResults);\n }\n\n get visiblePages(): (number | string)[] {\n const pages: (number | string)[] = [];\n\n if (this.paginationConfig.totalPages <= 7) {\n for (let i = 1; i <= this.paginationConfig.totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n if (this.paginationConfig.page > 3) {\n pages.push('...');\n }\n let start = Math.max(2, this.paginationConfig.page - 1);\n let end = Math.min(this.paginationConfig.totalPages - 1, this.paginationConfig.page + 1);\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n if (this.paginationConfig.page < this.paginationConfig.totalPages - 2) {\n pages.push('...');\n }\n pages.push(this.paginationConfig.totalPages);\n }\n\n return pages;\n }\n\n\n searchTextForFilterDropDown = '';\n toggleColumnInFilterDropdown(col: any) {\n\n }\n\n removeColumnFromFilter(option: any) {\n\n }\n\n handleBackspace(event: Event) {\n // If search is empty, remove last tag\n if (!this.searchTextForFilterDropDown && this.selectedFilterOptions.length) {\n const last = this.selectedFilterOptions[this.selectedFilterOptions.length - 1];\n this.toggleSelectionInFilter(last);\n }\n }\n\n @ViewChild('filterMenueSearchInput') filterMenueSearchInput!: ElementRef<HTMLInputElement>\n @ViewChild('filterMenueTextchInput') filterMenueTextchInput!: ElementRef<HTMLInputElement>\n\n openFilteronThreeDotsClick(col: any) {\n if (col.type == 'image' || !col?.type || !col.is_search_able) return;\n this.selectedColumnForFilter = col;\n this.isThreeDotsFilterOpen = true;\n this.addFilterColumnInput = '';\n if (col.type === 'dropdown' || col.type === 'array') {\n this.currentFilterSelectedIds.clear();\n const savedIds = col?.query?._ids || [];\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\n\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value?.filter(\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\n );\n setTimeout(() => {\n if (this.filterMenueSearchInput) {\n this.filterMenueSearchInput.nativeElement.focus();\n }\n }, 100);\n } else if (['string', 'number', 'date'].includes(col.type)) {\n this.firstCondition = col.query.first_condition ? col.query.first_condition : ((col.type == 'date' || col.type == 'number') ? 'equal' : 'contain');\n this.firstValue = col?.query?.first_value || '';\n this.condition = col?.query?.condition || 'none';\n this.secondCondition = col.query.first_condition ? col.query.first_condition : ((col.type == 'date' || col.type == 'number') ? 'equal' : 'contain');\n this.secondValue = col?.query?.second_value || '';\n setTimeout(() => {\n this.filterMenueTextchInput.nativeElement.focus();\n }, 100);\n }\n this.cdr.detectChanges();\n }\n\n isFilterOpen = false\n selectedColumnForFilter: any;\n showFilters = this.showSideMenu ? false : false;\n\n\n openFilterFromDisabledSearchedInput(col: any) {\n if (col.type !== 'dropdown' && col.type !== 'array' || !col.is_search_able) return;\n this.openFilter(col);\n }\n\n openFilter(col: any) {\n if(!col.is_search_able) return;\n this.activeFilterCell = col;\n this.activeCol = null\n this.isFilterOpen = true;\n this.searchTextForFilterDropDown = '';\n this.addFilterColumnInput = '';\n this.selectedColumnForFilter = col;\n\n if (col.type === 'dropdown' || col.type == 'array') {\n this.currentFilterSelectedIds.clear();\n const savedIds = col?.query?._ids || [];\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\n\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value?.filter(\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\n );\n } else if (['string', 'number', 'date'].includes(col.type)) {\n this.firstCondition = col?.query?.first_condition || (col.type == 'number' || col.type == 'date') ? 'equal' : 'contain';\n this.firstValue = col?.query?.first_value || '';\n this.condition = col?.query?.condition || 'none';\n this.secondCondition = col?.query?.second_condition ||(col.type == 'number' || col.type == 'date') ? 'equal' : 'contain';\n this.secondValue = col?.query?.second_value || '';\n }\n this.cdr.detectChanges();\n }\n\n\n firstValue: any = '';\n firstCondition = '';\n secondValue: any = '';\n secondCondition: string | null = null;\n condition: string | null = '';\n\n resetTextFilterChanges() {\n this.firstCondition = 'contain';\n this.firstValue = '';\n this.condition = 'none';\n this.secondCondition = null;\n this.secondValue = '';\n this.isFilterOpen = false;\n this.isActiveFilterOpen = false;\n this.activeTopButton = '';\n }\n\n toggleAllValusSelectionInDropdownFilter(column: any) {\n\n }\n\n\n selectedFilterOptions: any[] = []\n\n currentFilterSelectedIds = new Set<string>();\n\n toggleSelectionInFilter(option: any) {\n const id = option.id || option._id || option;\n if (this.currentFilterSelectedIds.has(id)) {\n this.currentFilterSelectedIds.delete(id);\n } else {\n this.currentFilterSelectedIds.add(id);\n }\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value.filter((option: any) => this.currentFilterSelectedIds.has(option.id || option._id || option))\n this.cdr.detectChanges();\n }\n\n resetFilterChanges() {\n this.isFilterOpen = false;\n this.currentFilterSelectedIds.clear();\n this.selectedFilterOptions!.length = 0;\n this.isActiveFilterOpen = false;\n this.activeTopButton = '';\n // const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns);\n // console.log(\"Filtered Columns Are: \", filteredColumns);\n }\n\n applyDropdownFilter() {\n this.isFilterOpen = false;\n this.isActiveFilterOpen = false;\n this.activeTopButton = '';\n this.activeFilterCell = null;\n this.isThreeDotsFilterOpen = false;\n const findColumn = (columns: any[], field: string): any => {\n for (const col of columns) {\n if (col.field === field) return col;\n if (col.children && col.children.length) {\n const found = findColumn(col.children, field);\n if (found) return found;\n }\n }\n return null;\n };\n\n const column = findColumn(this.columns, this.selectedColumnForFilter.field);\n if (column) {\n if (column.type === 'dropdown' || column.type == 'array') {\n column.query = column.query || {};\n column.query._ids = column.query._ids || [];\n\n // Remove stale IDs (not present in Set)\n column.query._ids = column.query._ids.filter(\n (id: any) => this.currentFilterSelectedIds.has(id) // <-- use .has()\n );\n\n // Add new ones if missing\n this.currentFilterSelectedIds.forEach(id => {\n if (!column.query._ids.includes(id)) {\n column.query._ids.push(id);\n }\n });\n\n } else if (['string', 'number', 'date'].includes(column.type)) {\n column.query = {\n first_condition: this.firstCondition || 'contain',\n first_value: this.firstValue || null,\n condition: this.secondValue ? this.condition : 'none',\n second_condition: this.secondValue ? this.secondCondition : null,\n second_value: this.secondValue || null,\n };\n }\n }\n\n const filter = {\n field: column.field,\n search: column.search,\n query: column.query,\n type: column.type,\n _ids: column._ids\n };\n\n const existingIndex = this.filtersConfig.findIndex(f => f.field === column.field);\n\n if (existingIndex !== -1) {\n this.filtersConfig[existingIndex] = filter;\n } else {\n this.filtersConfig.push(filter);\n }\n\n this.isFilterOpen = false;\n this.activeCol = null;\n this.isActiveFilterOpen = false;\n this.activeTopButton = '';\n this.activeFilterCell = null;\n this.isThreeDotsFilterOpen = false;\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n const filters = this.cleanFilterdColumns()\n setTimeout(() => {\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n this.filterOptions.emit(filters);\n }, 200);\n }\n\n // applyFilterFromFilterRow(column: any) {\n // const filter = {\n // field: column.field,\n // search: column.search,\n // query: column.query,\n // type: column.type,\n // _ids: column._ids\n // };\n // this.filtersConfig.push(filter);\n // this.isFilterOpen = false;\n // this.isActiveFilterOpen = false;\n // this.activeTopButton = '';\n // this.activeFilterCell = null;\n // this.isThreeDotsFilterOpen = false;\n // const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\n // this.filterOptions.emit(filteredColumns);\n // }\n\n isFilterAppliedOnColumn(column: any) {\n return this.filtersConfig.some(col => col.field === column.field);\n }\n\n // Side Filters Logic is here\n\n toggleSelectAllSideFilters(col: any, event: Event) {\n const checked = (event?.target as HTMLInputElement)?.checked;\n\n if (checked) {\n col.query._ids = col?.column_dropdown_value?.map(\n (opt: any) => opt.id || opt._id || opt\n );\n this.currentFilterSelectedIds = new Set<string>(col.query._ids);\n } else {\n col.query._ids = [];\n this.currentFilterSelectedIds.clear();\n }\n }\n\n\n isAllSideFilterOptionsSelected(col: any): boolean {\n if (!col?.query?._ids || !Array.isArray(col.column_dropdown_value)) return false;\n return col.query._ids.length === col.column_dropdown_value.length;\n }\n\n onOptionToggle(col: any, option: any) {\n const optionId = option.id || option._id || option;\n if (!col.query._ids) {\n col.query._ids = [];\n }\n const idx = col.query._ids.indexOf(optionId);\n if (idx > -1) {\n col.query._ids.splice(idx, 1);\n } else {\n col.query._ids.push(optionId);\n }\n this.cdr.detectChanges();\n }\n\n\n\n\n resetSideFilter(col: any) {\n const resetColumnRecursively = (columns: any[]): boolean => {\n for (const column of columns) {\n if (column.field === col.field) {\n column.query = {\n _ids: [],\n first_condition: 'contain',\n first_value: null,\n condition: 'none',\n second_condition: 'contain',\n second_value: null\n };\n return true;\n }\n if (Array.isArray(column?.children) && column?.children?.length) {\n if (resetColumnRecursively(column.children)) {\n return true;\n }\n }\n }\n return false;\n };\n resetColumnRecursively(this.columns);\n const index = this.filtersConfig.findIndex((f: any) => f.field === col.field);\n if (index !== -1) {\n this.filtersConfig.splice(index, 1);\n }\n this.activeFilterCell = null;\n this.cdr.detectChanges();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.cleanFilterdColumns(),\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n const filters = this.cleanFilterdColumns()\n setTimeout(() => {\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n this.filterOptions.emit(filters);\n }, 200);\n }\n\n\n clearAllFilters() {\n this.groupedColumns = [];\n this.tableView?.forEach((ele) => { ele.is_temp = false });\n const resetAllRecursively = (columns: any[]) => {\n for (const column of columns) {\n if (column.query) {\n column.query = {\n _ids: [],\n first_condition: 'contain',\n first_value: null,\n condition: 'none',\n second_condition: 'contain',\n second_value: null\n };\n }\n if (Array.isArray(column?.children) && column.children.length) {\n resetAllRecursively(column.children);\n }\n }\n };\n resetAllRecursively(this.columns);\n this.activeFilterCell = null;\n this.filtersConfig = [];\n this.refreshPreviewColumns();\n this.cdr.detectChanges();\n this.rowShadingEnabled = false;\n this.showVerticalBorder = false;\n this.fontFaimly = 'Inter';\n this.headerTextFontsSize = 14;\n this.selectedTableLayout = 'mediumd';\n this.bodyTextFontsSize = 14;\n this.globalSearchText = '';\n const event = { eventType: 'reset', data: { tableType: this.tableType } };\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: [],\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n setTimeout(() => {\n const filteredColumns = this.cleanFilterdColumns();\n this.genericEvent.emit(event);\n this.filterOptions.emit(filteredColumns);\n }, 300);\n this.cdr.detectChanges();\n }\n\n\n applySideFilter(column: any) {\n if (!column.query.first_value && !column?.query?._ids.length) return;\n const filter = {\n field: column.field,\n search: column.search,\n query: column.query,\n type: column.type,\n _ids: column._ids || []\n };\n\n const existingIndex = this.filtersConfig.findIndex(f => f.field === column.field);\n\n if (existingIndex !== -1) {\n // Replace the existing filter\n this.filtersConfig[existingIndex] = filter;\n } else {\n // Add new filter\n this.filtersConfig.push(filter);\n }\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n }\n }),\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n setTimeout(() => {\n const filteredColumns = this.cleanFilterdColumns();\n this.filterOptions.emit(filteredColumns);\n }, 200);\n }\n\n\n removeSideFilter(column: any) {\n if (!column.query.first_value && !column?.query?._ids.length) return;\n\n const existingIndex = this.filtersConfig.findIndex(f => f.field === column.field);\n if (existingIndex !== -1) {\n this.filtersConfig.splice(existingIndex, 1);\n }\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n };\n }),\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n setTimeout(() => {\n const filteredColumns = this.cleanFilterdColumns();\n this.filterOptions.emit(filteredColumns);\n }, 200);\n }\n\n collapseAllExpandedCells() {\n if (this.expandedCells?.size > 0) {\n this.expandedCells.clear();\n this.cdr.detectChanges();\n }\n }\n\n\n\n trackByField(index: number, col: any): string {\n return col?.field;\n }\n\n get activeFilteredColumns(): any[] {\n const collectFiltered = (columns: any[]): any[] => {\n let result: any[] = [];\n\n columns.forEach(col => {\n if (col.children && col.children.length) {\n result = result.concat(collectFiltered(col.children));\n }\n\n const isInFiltersConfig = this.filtersConfig.some(f => f.field === col.field);\n if (isInFiltersConfig) {\n result.push(col);\n }\n });\n\n return result;\n };\n\n return collectFiltered(this.columns);\n }\n\n\n\n\n toggleOpenFilter() {\n this.showFilters = !this.showFilters;\n this.cdr.detectChanges();\n }\n\n\n\n\n // Cell Editing Work start here\n\n editingKey: string | null = null;\n activeCell: string | null = null;\n\n setActiveCell(row: any, column: any) {\n this.activeCell = ((row.id || row._id) + '-' + column.field);\n this.cdr.detectChanges();\n }\n\n isActiveCell(row: any, col: any): boolean {\n return this.activeCell === ((row.id || row._id) + '-' + col.field);\n }\n\n @ViewChild('textAreadInput') textAreadInput!: ElementRef<HTMLTextAreaElement>;\n enableEdit(row: any, column: any, clickedFromDetailsBox = false, cellContainer?: HTMLElement) {\n this.editinDropdownSearch = '';\n if (row?.__virtualIndex == 0) return;\n if (column.type == 'image' || !column?.is_editable) return;\n this.editingKey = ((row.id || row._id) + '-' + column.field);\n\n if (column.type === 'dropdown'|| column.type == 'array') {\n setTimeout(() => {\n const dropdownMenu = document.querySelector('.cell-editing-dropdown-menu') as HTMLElement;\n if (dropdownMenu) {\n const rect = dropdownMenu.getBoundingClientRect();\n const windowHeight = this.dataGridContainer.nativeElement?.offsetHeight;\n\n if (rect.bottom > windowHeight) {\n dropdownMenu.style.top = `-${rect.height}px`;\n } else {\n dropdownMenu.style.top = '100%';\n }\n }\n });\n }\n\n if (!clickedFromDetailsBox && this.getNestedValue(row, column.field)?.length > 50) {\n this.toggleExpandOfLongCellText(row, column, this.columns, false)\n }\n setTimeout(() => {\n if (!cellContainer) return;\n\n const focusable = cellContainer.querySelector(\n 'input, textarea, select, [contenteditable=\"true\"]'\n ) as HTMLElement | null;\n\n if (focusable) {\n (focusable as HTMLElement).style.fontSize = '16px';\n focusable.focus();\n\n if (focusable instanceof HTMLInputElement || focusable instanceof HTMLTextAreaElement) {\n focusable.select();\n }\n }\n\n });\n this.cdr.detectChanges();\n }\n\n\n disableEdit(row: any, column: any, control?: any) {\n this.rowSelectedIndexes.clear();\n if (!this.editingKey) return\n if (control && control.pristine) {\n this.editingKey = null;\n return;\n }\n this.checkRowEditAndEmitValue(row, column, row[column.field])\n this.editingKey = null;\n this.cdr.detectChanges();\n const current = this.getNestedValue(row, column?.field);\n if (!current || (column.type == 'email' && !this.validateEmail(current))) {\n const originalRow = this.originalDataSet.find(item => item.id == row.id || item.id == row._id);\n const original = this.getNestedValue(originalRow, column?.field);\n this.setNestedValue(row, column, original);\n this.cdr.detectChanges();\n }\n }\n\n emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\n validateEmail(value: string): boolean {\n return this.emailRegex.test(value);\n }\n allowOnlyNumbers(event: KeyboardEvent) {\n const charCode = event.which ? event.which : event.keyCode;\n if (charCode < 48 || charCode > 57) {\n event.preventDefault();\n }\n }\n\n checkRowEditAndEmitValue(row: any, column: any, value?: any) {\n // setTimeout(() => {\n const originalRow = this.originalDataSet?.find(\n (r: any) => r.id === row.id || r._id === row._id\n );\n if (!originalRow) return;\n // const clean = (obj: any) => JSON.parse(JSON.stringify(obj));\n // const currentValue = this.getNestedValue(row, column.field);\n // const originalValue = this.getNestedValue(originalRow, column.field);\n const originValue = this.dataSet.find((r: any) => r.id === row.id);\n const changedValue = originValue.verified == value;\n // if (changedValue) return;\n // const hasChanged = this.commonSevice.hasFieldChanged(currentValue, originalValue, column.type);\n // if (!hasChanged) return;\n // this.setNestedValue(originalRow, column, value);\n\n const sendObj = {\n data: { ...originValue },\n eventType: 'onCellEdit',\n value: value,\n column: column\n };\n return this.genericEvent.emit(sendObj)\n // }, 100);\n }\n\n\n isEditing(row: any, col: any): boolean {\n return this.editingKey === ((row.id || row._id) + '-' + col.field);\n }\n\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\n const path = column.field;\n const keys = path.split('.');\n const lastKey = keys.pop();\n const parent = keys.reduce((acc: { [x: string]: {}; }, key: string | number) => acc[key] ??= {}, obj);\n\n if (parent && lastKey) {\n if (typeof option === 'object' && option !== null) {\n // case: dropdown object {id, value}\n parent.id = option.id;\n parent[lastKey] = option.value;\n } else {\n // case: plain string or number\n parent[lastKey] = option;\n }\n }\n\n const sendObj = {\n data: { ...obj },\n eventType: 'onCellEdit',\n };\n\n if (calledFromInput) {\n this.checkRowEditAndEmitValue(obj, column, option);\n }\n this.cdr.detectChanges();\n }\n\n\n\n\n\n\n goToPage(page: any) {\n if (this.paginationConfig?.page == page) return;\n if (page < 1 || page > this.paginationConfig.totalPages) return;\n this.paginationConfig.page = page;\n const event = {\n obj: {\n limit: this.paginationConfig.limit,\n page: page,\n },\n eventType: 'pageChange',\n };\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\n this.genericEvent.emit(event)\n }\n\n onPageSizeChange() {\n this.paginationConfig.page = 1;\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n }\n }),\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n setTimeout(() => {\n const event = {\n obj: {\n limit: this.paginationConfig.limit,\n page: this.paginationConfig.page,\n },\n eventType: 'pageChange',\n };\n this.genericEvent.emit(event)\n }, 700);\n }\n\n actionPreset(data: any, type: any) {\n data.columns = data.columns.map(({ _id, filterValue, search, column_dropdown_value, query, __typename, ...rest }: any) => rest);\n this.tableView?.forEach((ele) => { ele.is_temp = false });\n\n {\n this.bodyTextFontsSize = data.config.bodyTextFontsSize,\n this.fontFaimly = data.config.fontFaimly,\n data.filters.forEach((element: any) => {\n delete element.__typename;\n if (element.query) {\n delete element.query.__typename;\n if (\n typeof element.query === 'object' &&\n element.query !== null &&\n Object.keys(element.query).length === 0\n ) {\n element.query = null;\n }\n }\n });\n this.headerTextFontsSize = data.config.headerTextFontsSize,\n this.selectedTableLayout = data.config.selectedTableLayout,\n this.showVerticalBorder = data.config.showVerticalBorder,\n this.currentIdForUpdatePreset = data.id;\n this.filtersConfig = data.filters;\n }\n delete data?.__typename;\n delete data?.is_temp;\n delete data?.config.__typename;\n const event = {\n obj: {\n data: data\n },\n eventType: type\n }\n this.genericEvent.emit(event)\n }\n\n currentIdForUpdatePreset = '';\n curretaTablePresetForUpdate: any;\n temp_state = {\n id: '',\n is_temp: false\n }\n async selectFilter(data: any) {\n this.temp_state = {\n id: data.id,\n is_temp: true\n }\n this.tableView?.forEach((ele) => { ele.is_temp = false });\n this.tableView = this.tableView.map(item => ({\n ...item,\n is_temp: item.id == data?.id\n }));\n this.columns = data.columns;\n {\n this.bodyTextFontsSize = data.config.bodyTextFontsSize,\n this.fontFaimly = data.config.fontFaimly,\n data.filters.forEach((element: any) => {\n delete element.__typename;\n\n if (element.query) {\n delete element.query.__typename;\n if (\n typeof element.query === 'object' &&\n element.query !== null &&\n Object.keys(element.query).length === 0\n ) {\n element.query = null;\n }\n }\n });\n\n // this.globalSearch = data.config.bodyTextFontsSize,\n this.headerTextFontsSize = data.config.headerTextFontsSize,\n this.selectedTableLayout = data.config.selectedTableLayout,\n this.showVerticalBorder = data.config.showVerticalBorder,\n this.currentIdForUpdatePreset = data.id;\n this.curretaTablePresetForUpdate = structuredClone(data);\n this.presetName = data?.name;\n this.presetFilter = data?.activeFilters || false;\n this.filtersConfig = data.filters;\n await this.applyFilteroptionList();\n this.refreshHeaders();\n this.cdr.detectChanges();\n data.columns = this.cleanColumns(this.columns);\n delete data?.__typename;\n delete data?.is_temp;\n delete data?.config.__typename;\n }\n if (data?.is_deafult) {\n return this.actionPreset(data, 'setPreset')\n }\n const event = {\n obj: {\n data: data\n },\n eventType: 'select'\n }\n this.genericEvent.emit(event)\n }\n\n savePreset(control?: any) {\n if (control?.invalid) {\n control?.control.markAsTouched();\n return;\n }\n let names = this.getFilterHeaders(this.filtersConfig, this.columns);\n this.presetFilter = this.tableFilterViewId ? true : this.presetFilter;\n let selectedData: any = this.tableView.find((ele) => ele.id == this.tableFilterViewId);\n let config = {\n fontFaimly: this.fontFaimly,\n bodyTextFontsSize: +(this.bodyTextFontsSize || 14),\n headerTextFontsSize: +(this.headerTextFontsSize || 14),\n oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\n showVerticalBorder: this.showVerticalBorder,\n selectedTableLayout: this.selectedTableLayout,\n globalSearch: this.tableSearch,\n filterNames: names,\n totalCount: this.paginationConfig.totalResults,\n rowShadingEnabled: this.rowShadingEnabled\n\n }\n const event = {\n obj: {\n name: this.tableFilterViewId ? selectedData?.name : this.presetName,\n activeFilters: this.presetFilter,\n columns: this.cleanColumns(this.columns),\n filters: this.presetFilter\n ? this.filtersConfig?.map(({ __typename, query, ...rest }) => {\n const { __typename: __inner, ...cleanQuery } = query || {};\n return { ...rest, query: cleanQuery };\n })\n : [],\n config: config,\n id: this.tableFilterViewId || this.curretaTablePresetForUpdate?.id,\n loadingCall: control == 'mouseUp' ? false : true,\n type: this.tableType\n },\n eventType: this.tableFilterViewId || !this.isTablePresetNotChanged ? 'updatePreset' : 'createPreset'\n }\n\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\n const cleanedFilteredColumns = filteredColumns.map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n }\n });\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: cleanedFilteredColumns,\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n setTimeout(() => {\n this.genericEvent.emit(event)\n }, 500);\n }\n\n\n getFilterHeaders(filters: any[], columns: any[]): string {\n const matchedHeaders = filters\n .map(f => {\n const column = columns.find(c => c.field === f.field);\n return column ? column.header : null;\n })\n .filter(header => !!header);\n\n return matchedHeaders.join(', ');\n }\n\n\n toggleRowShading() {\n this.oddRowsBackgroundColor = this.rowShadingEnabled ? '#f1f1f1' : undefined;\n this.onFontChange();\n }\n\n trackByTable(index: number): number {\n return index;\n }\n activeRow: any\n activeRowCol: any;\n\n // Track expanded cells as a Set of unique row+col identifiers\n\n getCellKey(row: any, col: any): string {\n return `${this.getRowId(row)}_${col?.field}`;\n }\n\n expandedCells = new Map<string, number>();\n private zCounter = 21;\n\n showDetailsBox = false;\n\n toggleExpandOfLongCellText(\n row: any,\n col: any,\n columns: any[],\n expandWholeRow = false\n ) {\n const expandCells = (targetRow: any) => {\n columns.forEach(c => {\n if (c.type === 'image') return;\n const text = targetRow[c.field];\n\n if ((typeof text === 'string' && text.length > 50) || (Array.isArray(text) && text?.length > 1)) {\n const key = this.getRowId(targetRow) + '-' + c.field;\n this.zCounter++;\n this.expandedCells.set(key, this.zCounter);\n }\n });\n };\n\n\n const collectKeysForRow = (targetRow: any) => {\n const keys: string[] = [];\n columns.forEach(c => {\n if (c.type === 'image') return;\n\n const text = targetRow[c.field];\n if (typeof text === 'string' && text.length > 50 || (Array.isArray(text) && text?.length > 1)) {\n keys.push(this.getRowId(targetRow) + '-' + c.field);\n }\n });\n return keys;\n };\n\n if (expandWholeRow) {\n let rowKeys: string[] = [];\n const text = this.getNestedValue(row, col?.field);\n if (Array.isArray(text) && text.length > 0) {\n rowKeys = collectKeysForRow(row);\n row?.children?.forEach((child: any) => {\n rowKeys.push(...collectKeysForRow(child));\n });\n } else {\n rowKeys = collectKeysForRow(row);\n }\n const allExpanded = rowKeys.every(k => this.expandedCells.has(k));\n this.expandedCells.clear();\n if (!allExpanded) {\n if (Array.isArray(row.children) && row.children.length > 0) {\n expandCells(row);\n row?.children?.forEach((child: any) => expandCells(child));\n } else {\n expandCells(row);\n }\n }\n } else {\n const key = this.getRowId(row) + '-' + col.field;\n if (col.type === 'image') return;\n\n if (!this.expandedCells.has(key)) {\n this.expandedCells.clear();\n this.zCounter++;\n this.expandedCells.set(key, this.zCounter);\n } else {\n this.expandedCells.delete(key);\n }\n }\n\n this.showDetailsBox = false;\n setTimeout(() => {\n this.isOpenToTop(row)\n }, 0);\n this.cdr.detectChanges();\n }\n\n isOpenToTop(row: any) {\n const wrapper = document.querySelector('.data-grid-body-wrapper') as HTMLElement | null;\n if (!wrapper) return false;\n this.columns.forEach((col: any) => {\n const id = (row.id || row._id) + '-' + (col.id || col._id);\n const box = document.getElementById(id);\n if (!box) return false;\n const boxRect = box.getBoundingClientRect();\n const wrapperRect = wrapper.getBoundingClientRect();\n const isOverflowingBottom = boxRect.bottom > wrapperRect.bottom;\n const isOverflowingTop = boxRect.top < wrapperRect.top;\n if (isOverflowingBottom && !isOverflowingTop) {\n const boxHeight = box.offsetHeight || 0;\n const offset = boxHeight + 4;\n box.style.top = `${-offset}px`;\n\n } else {\n box.style.bottom = `auto`;\n box.style.top = `100%`;\n box.style.transform = `translateY(0)`;\n }\n return false;\n })\n this.showDetailsBox = true;\n this.cdr.detectChanges();\n return true;\n }\n\n\n\n\n\n\n isExpanded(row: any, col: any): boolean {\n return this.expandedCells.has(this.getRowId(row) + '-' + col.field);\n }\n\n getZIndex(row: any, col: any): number {\n return this.expandedCells.get(this.getRowId(row) + '-' + col.field) ?? 21;\n }\n\n isOverflowing(element: HTMLElement | null): boolean {\n if (!element) return false;\n return element.scrollWidth > element.clientWidth;\n }\n\n\n // Picture cell Logic\n colorCombination = ['pic-comb1', 'pic-comb2', 'pic-comb4'];\n getDynamicClass(name: string): string {\n if (!name) return this.colorCombination[0];\n const hash = Array.from(name).reduce((acc, char) => acc + char.charCodeAt(0), 0);\n const index = hash % this.colorCombination?.length;\n return this.colorCombination[index];\n }\n\n getInitials(name: string): string {\n if (!name) return 'NA';\n const parts = name.trim().split(' ');\n return (parts[0][0] + (parts[1]?.[0] || '')).toUpperCase();\n }\n\n\n actionHide: boolean = true;\n xPos = 0;\n yPos = 0;\n isVisible = false;\n deatilsList: any;\n openExpendIndex: any;\n positionedYet = false;\n\n onRightClick(event: MouseEvent | TouchEvent | any, deatilsList: any): boolean {\n if (deatilsList?.actions?.length) {\n this.actions = deatilsList.actions;\n }\n if (!(event instanceof MouseEvent)) {\n event.preventDefault();\n }\n if (deatilsList.__virtualIndex == 0) return false;\n event.preventDefault();\n this.xPos = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX;\n this.yPos = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY;\n // this.xPos = event.clientX;\n // this.yPos = event.clientY;\n this.isVisible = true;\n this.positionedYet = false;\n this.deatilsList = deatilsList;\n setTimeout(() => {\n const menuElement = document.querySelector('.context-menu') as HTMLElement;\n if (!menuElement) return;\n const menuWidth = menuElement.offsetWidth;\n const menuHeight = menuElement.offsetHeight;\n const viewportWidth = window.innerWidth;\n const viewportHeight =this.dataGridContainer.nativeElement.offsetHeight;\n let x = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX; //event.clientX;\n let y = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY; //event.clientY;\n if (x + menuWidth > viewportWidth) {\n x = viewportWidth - menuWidth - 10;\n }\n if (y + menuHeight > this.dataGridContainer.nativeElement.offsetHeight) {\n y = viewportHeight - menuHeight - 10;\n }\n this.xPos = x;\n this.yPos = y;\n this.isVisible = true;\n\n setTimeout(() => {\n this.positionedYet = true;\n this.cdr.detectChanges();\n });\n\n this.cdr.detectChanges();\n });\n this.cdr.detectChanges()\n return false;\n }\n\n onActionClick(action: string) {\n const sendObj = {\n obj: this.deatilsList,\n eventType: action,\n };\n this.positionedYet = false;\n this.cdr.detectChanges();\n this.genericEvent.emit(sendObj);\n }\n\n\n onVerifyClick(type: string) {\n const text = type?.toLowerCase();\n if (text == 'archive' || text == 'unarchive'\n // || text == 'delete' || text == 'restore' || text == 'remove' || text == 'deactivate' || text == 'activate' || text == 'block' || text == 'unblock'\n // || text == 'enable' || text == 'disable' || text == 'approve' || text == 'reject' || text == 'publish' || text == 'unpublish' || text == 'lock' || text == 'unlock' || text == 'complete' || text == 'incomplete'\n // || text == 'send to review' || text == 'mark as paid' || text == 'mark as unpaid' || text == 'fulfill' || text == 'unfulfill' || text == 'refund' || text == 'cancel' || text == 'resend' || text == 'chargeback'\n // || text == 'dispute' || text == 'escalate' || text == 'deescalate' || text == 'flag' || text == 'unflag' || text == 'verify' || text == 'unverify' || text == 'subscribe' || text == 'unsubscribe' || text == 'follow' || text == 'unfollow'\n // || text == 'like' || text == 'unlike' || text == 'share' || text == 'unshare' || text == 'comment' || text == 'uncomment' || text == 'tag' || text == 'untag' || text == 'assign' || text == 'unassign' || text == 'link' || text == 'unlink'\n // || text == 'sync' || text == 'unsync' || text == 'backup' || text == 'restore backup' || text == 'migrate' || text == 'import' || text == 'export' || text == 'generate report' || text == 'download report' || text == 'view details'\n // || text == 'edit details' || text == 'update details' || text == 'change status' || text == 'reset password' || text == 'send notification' || text == 'schedule' || text == 'reschedule' || text == 'cancel schedule' || text == 'start' || text == 'stop' || text == 'pause' || text == 'resume'\n ) {\n this.clearSelectionState(this.tableType);\n this.selectedRows.clear();\n }\n const idsArray = Array.from(this.selectedRows);\n const arrayOfObjectsWithTableType: any[] = [];\n this.selectedRows.forEach(id => {\n arrayOfObjectsWithTableType.push({\n id: id,\n listingType: this.listingType,\n });\n });\n const sendObj = {\n data: {\n obj: idsArray,\n tableName: this.tableName,\n listingType: this.listingType,\n },\n eventType: type,\n };\n this.genericEvent.emit(sendObj)\n }\n\n\n\n getCellClasses(column: any, value: any): string {\n if (!value || !column?.field || column?.cellRenderer) return '';\n\n let val: any = typeof value === 'object' ? value?.value ?? value : value;\n const field = column.field.toLowerCase();\n\n if (field === 'due_date') {\n const dueDate = new Date(val);\n const today = new Date();\n const todayUTC = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());\n const dueUTC = Date.UTC(dueDate.getFullYear(), dueDate.getMonth(), dueDate.getDate());\n\n if (dueUTC < todayUTC) {\n return 'text-danger';\n }\n // else if(dueUTC === todayUTC){\n // return 'text-warning';\n // }\n\n return '';\n }\n\n\n const status = val?.toString().toLowerCase();\n if (\n field === 'status' ||\n field === 'account_status' ||\n field === 'availstatus' ||\n field === 'is_custom_grade'\n ) {\n return STATUSES_BADGE_MAP[status] || 'badge badge-secondary';\n }\n\n return '';\n }\n\n\n removeColumnFilterFromColumn(column: any) {\n if (!column) return\n if (column.type === 'dropdown'|| column.type == 'array') {\n column.query._ids = [];\n } else if (['string', 'number', 'date'].includes(column.type)) {\n column.query = {\n first_condition: 'contain',\n first_value: null,\n condition: 'none',\n second_condition: null,\n second_value: null,\n }\n }\n\n const index = this.filtersConfig.findIndex((f: any) => f.field === column.field);\n if (index !== -1) {\n this.filtersConfig.splice(index, 1);\n }\n\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\n const cleanedFilteredColumns = filteredColumns.map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n }\n });\n\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: cleanedFilteredColumns,\n no_of_records: Number(this.paginationConfig.limit),\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n setTimeout(() => {\n const filteredColumns = cleanedFilteredColumns;\n this.filterOptions.emit(filteredColumns);\n }, 200);\n }\n\n onSideMenuColumnsVisibilityChange() {\n this.refreshHeaders();\n const sendData = {\n columns: this.cleanColumns(this.columns),\n filters: this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig).map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n }\n }),\n no_of_records: this.paginationConfig.pageSize,\n type: this.tableType,\n };\n this.createUpdateConfigListing.emit(sendData);\n }\n\n cleanFilterdColumns() {\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\n const cleanedFilteredColumns = filteredColumns.map(({ query, ...rest }) => {\n if (query) {\n delete query.__typename;\n }\n return {\n query,\n ...rest,\n }\n });\n return cleanedFilteredColumns;\n }\n\n downloadCsv(type: 'csv' | 'xlsx') {\n const config: any = {\n headerBgColor: this.headerBackgroundColor,\n headerTextColor: this.headerTextColor,\n bodyTextColor: '#000000',\n fontFamily: this.fontFaimly,\n fontWeight: 'normal',\n zoomScale: 125,\n headerRowHeight: 30\n }\n if (this.enableExport) {\n const now = new Date();\n const dd = String(now.getDate()).padStart(2, '0');\n const mm = String(now.getMonth() + 1).padStart(2, '0');\n const yyyy = now.getFullYear();\n const HH = String(now.getHours()).padStart(2, '0');\n const MM = String(now.getMinutes()).padStart(2, '0');\n const formatted =\n `${this.tableType}_${dd}-${mm}-${yyyy}_${HH}-${MM}`;\n\n console.log(formatted);\n\n this.exportService.exportData(this.columns, this.dataSet, formatted, type, this.rowSelectedIndexes, config);\n }\n const event = {\n obj: {\n columns: this.columns,\n filters: []\n },\n eventType: 'downloadCsv'\n }\n if (type == 'xlsx') {\n return\n }\n this.genericEvent.emit(event)\n\n }\n\n onFontChange() {\n this.headerTextFontsSize = this.bodyTextFontsSize;\n const config = {\n fontFaimly: this.fontFaimly,\n bodyTextFontsSize: this.bodyTextFontsSize,\n headerTextFontsSize: this.headerTextFontsSize,\n oddRowsBackgroundColor: this.rowShadingEnabled ? this.oddRowsBackgroundColor : undefined,\n showVerticalBorder: this.showVerticalBorder,\n selectedTableLayout: this.selectedTableLayout,\n globalSearch: this.tableSearch\n }\n const event = {\n obj: {\n data: config\n },\n eventType: 'config'\n }\n this.genericEvent.emit(event)\n }\n\n onGlobalSearch() {\n const event = {\n obj: {\n tableSearch: this.tableSearch\n },\n eventType: 'search'\n }\n this.genericEvent.emit(event)\n if (this.tableFilterViewId) {\n this.savePreset('mouseUp');\n }\n }\n\n onSearchInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n // console.log('Search value:', value);\n\n if (value === '') {\n this.tableSearch = '';\n this.onGlobalSearch();\n }\n }\n\n checkFilterChangesEffect(): any {\n if (!this.tableFilterViewId) return true\n const findDefaultFilter = this.tableView?.find((ele: any) => ele?.id == this.tableFilterViewId);\n const normalizeFilters = (filters: any[] | undefined): any[] => {\n if (!Array.isArray(filters)) return [];\n const cloned = filters.map(f => {\n const item = JSON.parse(JSON.stringify(f ?? {}));\n if (!Array.isArray(item._ids)) item._ids = [];\n item._ids = item._ids.slice().sort((a: any, b: any) => {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return ('' + a).localeCompare('' + b);\n });\n\n if (item.query === null) {\n } else if (typeof item.query === 'object') {\n if (!Array.isArray(item.query._ids)) item.query._ids = [];\n item.query._ids = item.query._ids.slice().sort((a: any, b: any) => {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return ('' + a).localeCompare('' + b);\n });\n }\n\n return item;\n });\n cloned.sort((a: any, b: any) => {\n const fa = (a.field || '') + '|' + (a.type || '');\n const fb = (b.field || '') + '|' + (b.type || '');\n return fa.localeCompare(fb);\n });\n\n return cloned;\n };\n\n const deepEqual = (a: any, b: any): boolean => {\n if (a === b) return true;\n\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return a === b;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n return true;\n };\n const normalizedA = normalizeFilters(findDefaultFilter?.filters);\n const normalizedB = normalizeFilters(this.filtersConfig);\n const isSame = deepEqual(normalizedA, normalizedB);\n return isSame;\n }\n\n\n\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n // Cell Selection Implemented Here Implemented Here\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n\n selectedCells: any[] = [];\n selectedKeys: Set<string> = new Set();\n selectionStart: any = null;\n isSelecting = false;\n startSelection(\n rowIndex: number,\n colIndex: number,\n subColIndex: number | null,\n field: string,\n event: MouseEvent,\n section: string\n ) {\n // event.preventDefault();\n this.rowSelectedIndexes.clear();\n const safeSub = subColIndex ?? 0;\n const key = `${rowIndex}-${colIndex}-${safeSub}-${field}`;\n\n this.selectionStart = { rowIndex, colIndex, subColIndex: safeSub, field, key };\n this.isSelecting = true;\n this.selectedKeys.clear();\n this.selectedKeys.add(key);\n this.selectedCells = [this.selectionStart];\n const mouseUpHandler = () => {\n this.endSelection();\n document.removeEventListener('mouseup', mouseUpHandler);\n };\n document.addEventListener('mouseup', mouseUpHandler);\n this.updateSelectionBoundaries()\n }\n\n\n extendSelection(\n rowIndex: number,\n colIndex: number,\n subColIndex: number | null,\n field: string,\n event: MouseEvent,\n section: string\n ) {\n if (!this.isSelecting || !this.selectionStart) return;\n\n const start = this.selectionStart;\n const targetSubColIndex = subColIndex ?? 0;\n const newKeys: Set<string> = new Set();\n const newCells: any[] = [];\n const minRow = Math.min(start.rowIndex, rowIndex);\n const maxRow = Math.max(start.rowIndex, rowIndex);\n const columnsToSelect = this.getColumnSelectionRange(start.colIndex, colIndex, start.subColIndex, targetSubColIndex);\n\n for (let r = minRow; r <= maxRow; r++) {\n for (const colInfo of columnsToSelect) {\n const k = `${r}-${colInfo.colIndex}-${colInfo.subColIndex}-${section}`;\n newKeys.add(k);\n newCells.push({\n rowIndex: r,\n colIndex: colInfo.colIndex,\n subColIndex: colInfo.subColIndex,\n field,\n key: k\n });\n }\n }\n\n this.selectedKeys = newKeys;\n this.selectedCells = newCells;\n this.updateSelectionBoundaries();\n this.cdr.detectChanges();\n\n // Add auto-scrolling logic\n this.handleCellAutoScroll(event);\n }\n\n\n\n\n getColumnSelectionRange(\n startCol: number,\n endCol: number,\n startSub: number,\n endSub: number\n ): { colIndex: number; subColIndex: number }[] {\n const result: { colIndex: number; subColIndex: number }[] = [];\n const minCol = Math.min(startCol, endCol);\n const maxCol = Math.max(startCol, endCol);\n\n const isLeftToRight = startCol <= endCol;\n for (let c = minCol; c <= maxCol; c++) {\n const subColCount = this.getSubColumnCount(c);\n\n if (c === startCol && c === endCol) {\n const minSub = Math.min(startSub, endSub);\n const maxSub = Math.max(startSub, endSub);\n for (let s = minSub; s <= maxSub && s < subColCount; s++) {\n result.push({ colIndex: c, subColIndex: s });\n }\n }\n else if (c === startCol) {\n if (isLeftToRight) {\n for (let s = startSub; s < subColCount; s++) {\n result.push({ colIndex: c, subColIndex: s });\n }\n } else {\n for (let s = 0; s <= startSub && s < subColCount; s++) {\n result.push({ colIndex: c, subColIndex: s });\n }\n }\n }\n else if (c === endCol) {\n if (isLeftToRight) {\n for (let s = 0; s <= endSub && s < subColCount; s++) {\n result.push({ colIndex: c, subColIndex: s });\n }\n } else {\n for (let s = endSub; s < subColCount; s++) {\n result.push({ colIndex: c, subColIndex: s });\n }\n }\n }\n else {\n for (let s = 0; s < subColCount; s++) {\n result.push({ colIndex: c, subColIndex: s });\n }\n }\n }\n\n return result;\n }\n\n getSubColumnCount(colIndex: number): number {\n if (!this.columns || colIndex < 0 || colIndex >= this.columns.length) {\n return 1;\n }\n const column = this.columns[colIndex];\n if (column.children && Array.isArray(column.children)) {\n return column.children.length;\n }\n return 1;\n }\n isGroupColumn(colIndex: number): boolean {\n return this.getSubColumnCount(colIndex) > 1;\n }\n endSelection() {\n this.isSelecting = false;\n this.stopAutoScroll();\n this.updateSelectionBoundaries();\n }\n isSelected(\n rowIndex: number,\n colIndex: number,\n subColIndex: number | null,\n field: string,\n section: string\n ) {\n const safeSub = subColIndex ?? 0;\n const key = `${rowIndex}-${colIndex}-${safeSub}-${section}`;\n return this.selectedKeys.has(key);\n }\n\n\n private selectionBounds: {\n top: number | null;\n bottom: number | null;\n left: { colIndex: number; subColIndex: number } | null;\n right: { colIndex: number; subColIndex: number } | null;\n } = { top: null, bottom: null, left: null, right: null };\n\n updateSelectionBoundaries() {\n if (this.selectedCells.length === 0) {\n this.selectionBounds = { top: null, bottom: null, left: null, right: null };\n return;\n }\n\n // Get all unique row indices and find min/max\n const rowIndices = [...new Set(this.selectedCells.map(cell => cell.rowIndex))];\n this.selectionBounds.top = Math.min(...rowIndices);\n this.selectionBounds.bottom = Math.max(...rowIndices);\n\n // For left/right boundaries, we need to consider both colIndex and subColIndex\n const leftMost = this.findLeftMostCell();\n const rightMost = this.findRightMostCell();\n\n this.selectionBounds.left = leftMost;\n this.selectionBounds.right = rightMost;\n }\n findLeftMostCell(): { colIndex: number; subColIndex: number } | null {\n if (this.selectedCells.length === 0) return null;\n\n const minColIndex = Math.min(...this.selectedCells.map(cell => cell.colIndex));\n const leftColCells = this.selectedCells.filter(cell => cell.colIndex === minColIndex);\n const minSubColIndex = Math.min(...leftColCells.map(cell => cell.subColIndex));\n\n return { colIndex: minColIndex, subColIndex: minSubColIndex };\n }\n findRightMostCell(): { colIndex: number; subColIndex: number } | null {\n if (this.selectedCells.length === 0) return null;\n\n const maxColIndex = Math.max(...this.selectedCells.map(cell => cell.colIndex));\n const rightColCells = this.selectedCells.filter(cell => cell.colIndex === maxColIndex);\n const maxSubColIndex = Math.max(...rightColCells.map(cell => cell.subColIndex));\n\n return { colIndex: maxColIndex, subColIndex: maxSubColIndex };\n }\n isTopBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n const safeSub = subColIndex ?? 0;\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\n return isSelected && this.selectionBounds.top !== null && rowIndex === this.selectionBounds.top;\n }\n isBottomBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n const safeSub = subColIndex ?? 0;\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\n return isSelected && this.selectionBounds.bottom !== null && rowIndex === this.selectionBounds.bottom;\n }\n isLeftBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n const safeSub = subColIndex ?? 0;\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\n return isSelected && this.selectionBounds.left !== null &&\n colIndex === this.selectionBounds.left.colIndex &&\n safeSub === this.selectionBounds.left.subColIndex;\n }\n\n isRightBorder(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n const safeSub = subColIndex ?? 0;\n const isSelected = this.selectedKeys.has(`${rowIndex}-${colIndex}-${safeSub}-${section}`);\n return isSelected && this.selectionBounds.right !== null &&\n colIndex === this.selectionBounds.right.colIndex &&\n safeSub === this.selectionBounds.right.subColIndex;\n }\n\n isTopLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\n }\n\n isTopRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n return this.isTopBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\n }\n\n isBottomLeftCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isLeftBorder(rowIndex, colIndex, subColIndex, section);\n }\n\n isBottomRightCorner(rowIndex: number, colIndex: number, subColIndex: number | null, section: string): boolean {\n return this.isBottomBorder(rowIndex, colIndex, subColIndex, section) && this.isRightBorder(rowIndex, colIndex, subColIndex, section);\n }\n\n\n cellSelectionAutoScrollInterval: any = null;\n private scrollSpeed = 150;\n private scrollMargin = 30;\n handleCellAutoScroll(event: MouseEvent) {\n if (this.cellSelectionAutoScrollInterval) {\n clearInterval(this.cellSelectionAutoScrollInterval);\n this.cellSelectionAutoScrollInterval = null;\n }\n const horizontalContainer = this.centerScrollableBody.nativeElement;\n const verticalContainer = this.mainScroll.nativeElement;\n if (!horizontalContainer || !verticalContainer) return;\n const horizontalRect = horizontalContainer.getBoundingClientRect();\n const mouseX = event.clientX;\n const verticalRect = verticalContainer.getBoundingClientRect();\n const mouseY = event.clientY;\n const nearTop = mouseY - verticalRect.top < this.scrollMargin;\n const nearBottom = verticalRect.bottom - mouseY < this.scrollMargin;\n const nearLeft = mouseX - horizontalRect.left < this.scrollMargin;\n const nearRight = horizontalRect.right - mouseX < this.scrollMargin;\n let scrollX = 0;\n let scrollY = 0;\n if (nearTop) scrollY = -this.scrollSpeed;\n if (nearBottom) scrollY = this.scrollSpeed;\n if (nearLeft) scrollX = -this.scrollSpeed;\n if (nearRight) scrollX = this.scrollSpeed;\n if (scrollX !== 0 || scrollY !== 0) {\n this.cellSelectionAutoScrollInterval = setInterval(() => {\n if (scrollX !== 0) {\n horizontalContainer.scrollBy(scrollX, 0);\n }\n if (scrollY !== 0) {\n verticalContainer.scrollBy(0, scrollY);\n }\n }, 8);\n }\n }\n\n stopAutoScroll() {\n if (this.cellSelectionAutoScrollInterval) {\n clearInterval(this.cellSelectionAutoScrollInterval);\n this.cellSelectionAutoScrollInterval = null;\n }\n }\n\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n // Row Selection from the Indexing Implemented Here\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n // *************************************************************************\n\n rowSelectedIndexes: Set<number> = new Set();\n rowSelecting = false;\n rowSelectionStartIndex: number | null = null;\n autoScrollInterval: any = null;\n\n get firstSelectedRow(): number | null {\n if (this.rowSelectedIndexes.size === 0) return null;\n return Math.min(...this.rowSelectedIndexes);\n }\n\n get lastSelectedRow(): number | null {\n if (this.rowSelectedIndexes.size === 0) return null;\n return Math.max(...this.rowSelectedIndexes);\n }\n\n\n onRowMouseDown(index: number, event: MouseEvent) {\n event.preventDefault();\n this.rowSelecting = true;\n this.selectedKeys.clear();\n this.rowSelectionStartIndex = index;\n this.rowSelectedIndexes.clear();\n this.rowSelectedIndexes.add(index);\n this.activeCell = '';\n this.cdr.detectChanges();\n\n const mouseMoveHandler = (e: MouseEvent) => this.handleAutoScroll(e);\n const mouseUpHandler = () => {\n this.onRowMouseUp();\n document.removeEventListener('mouseup', mouseUpHandler);\n document.removeEventListener('mousemove', mouseMoveHandler);\n if (this.autoScrollInterval) {\n cancelAnimationFrame(this.autoScrollInterval);\n this.autoScrollInterval = null;\n }\n };\n\n document.addEventListener('mouseup', mouseUpHandler);\n document.addEventListener('mousemove', mouseMoveHandler);\n }\n\n onRowMouseOver(index: number, event: MouseEvent) {\n if (!this.rowSelecting || this.rowSelectionStartIndex === null) return;\n this.rowSelectedIndexes.clear();\n const start = Math.min(this.rowSelectionStartIndex, index);\n const end = Math.max(this.rowSelectionStartIndex, index);\n for (let i = start; i <= end; i++) {\n this.rowSelectedIndexes.add(i);\n }\n // console.log([...this.rowSelectedIndexes]);\n }\n\n onRowMouseUp() {\n this.rowSelecting = false;\n this.rowSelectionStartIndex = null;\n }\n handleAutoScroll(e: MouseEvent) {\n const container = this.mainScroll?.nativeElement as HTMLElement;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const edgeSize = 40\n let scrollAmount = 0;\n\n if (e.clientY < rect.top + edgeSize) {\n scrollAmount = -150;\n } else if (e.clientY > rect.bottom - edgeSize) {\n scrollAmount = 150;\n }\n\n if (scrollAmount !== 0) {\n if (!this.autoScrollInterval) {\n const step = () => {\n container.scrollTop += scrollAmount;\n this.autoScrollInterval = requestAnimationFrame(step);\n };\n this.autoScrollInterval = requestAnimationFrame(step);\n }\n } else {\n if (this.autoScrollInterval) {\n cancelAnimationFrame(this.autoScrollInterval);\n this.autoScrollInterval = null;\n }\n }\n }\n\n\n // getSelectedDataForCopy(): any[][] {\n // const copiedRows: any[][] = [];\n // const findRowByVirtualIndex = (vIndex: number) =>\n // this.dataSet.find((r: any) => r.__virtualIndex === vIndex);\n // if (this.rowSelectedIndexes && this.rowSelectedIndexes.size > 0) {\n // const sortedIndexes = [...this.rowSelectedIndexes].sort((a, b) => a - b);\n // for (const vIndex of sortedIndexes) {\n // const row = findRowByVirtualIndex(vIndex);\n // if (!row) continue;\n // const rowValues = this.columns.flatMap(col =>\n // col.children && Array.isArray(col.children)\n // ? col.children.map((c: { field: string }) =>\n // this.getNestedValue(row, c.field) ?? ''\n // )\n // : this.getNestedValue(row, col.field) ?? ''\n // );\n // copiedRows.push(rowValues);\n // }\n // }\n\n // if (this.selectedCells && this.selectedCells.length > 0) {\n // const rowsMap = new Map<number, any[]>();\n // for (const cell of this.selectedCells) {\n // const row = findRowByVirtualIndex(cell.rowIndex);\n // if (!row) continue;\n\n // const col = this.columns[cell.colIndex];\n // let fieldName = col?.field;\n // if (col?.children && col.children[cell.subColIndex]) {\n // fieldName = col.children[cell.subColIndex].field;\n // }\n // const value = this.getNestedValue(row, fieldName) ?? '';\n\n // if (!rowsMap.has(cell.rowIndex)) rowsMap.set(cell.rowIndex, []);\n // rowsMap.get(cell.rowIndex)!.push(value);\n // }\n\n // const sortedCells = [...rowsMap.entries()]\n // .sort(([a], [b]) => a - b)\n // .map(([_, v]) => v);\n\n // copiedRows.push(...sortedCells);\n // }\n\n // if (copiedRows.length === 0) {\n // const activeCell = document.querySelector('.active-cell');\n // if (activeCell) return [[activeCell.textContent?.trim() || '']];\n // }\n // const maxCols = copiedRows.reduce((max, row) => Math.max(max, row.length), 0);\n // const normalized = copiedRows.map(row => {\n // const newRow = [...row];\n // while (newRow.length < maxCols) newRow.push(''); \n // return newRow;\n // });\n // return normalized;\n // }\n\n\n undoStack: any[][] = [];\n redoStack: any[][] = [];\n\n private cloneData(data: any[]): any[] {\n return JSON.parse(JSON.stringify(data));\n }\n\n performCut(selectedData: any[][]) {\n // Save current state for undo\n this.undoStack.push(this.cloneData(this.visibleRows));\n this.redoStack = []; // Clear redo stack on new action\n\n // Perform cut\n this.copyService.cutWithAnimation(selectedData);\n const { updatedRows } = this.copyService.cutSelectedSelectedData(\n this.visibleRows,\n this.rowSelectedIndexes,\n this.selectedCells,\n this.columns,\n this.setNestedValue.bind(this)\n );\n\n // console.log('Updated Rows: ', updatedRows);\n }\n\n\n\n getSelectedDataForCopy(): any[][] {\n return this.copyService.getSelectedDataForCopy(\n this.dataSet,\n this.columns,\n this.rowSelectedIndexes,\n this.selectedCells,\n this.getNestedValue.bind(this)\n );\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n const target = event.target as HTMLElement;\n const isFormField =\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.isContentEditable;\n if (isFormField) return;\n\n const tableContainer = document.querySelector('.data-grid-body-wrapper');\n if (tableContainer && !tableContainer.contains(target)) return;\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\n if (!this.selectedCells?.length && !this.rowSelectedIndexes.size) return\n const selectedData = this.getSelectedDataForCopy();\n // event.preventDefault();\n this.copyService.copyToClipboard(selectedData);\n\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\n if (!this.selectedCells?.length || !this.enableCut) return\n const selectedData = this.getSelectedDataForCopy();\n // event.preventDefault();\n this.performCut(selectedData);\n\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\n if (!this.selectedCells?.length) return\n // event.preventDefault();\n this.undo();\n\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\n if (!this.selectedCells?.length) return\n // event.preventDefault();\n this.redo();\n } else if ((event.ctrlKey || event.metaKey) && event.key === 'a') {\n // ✅ Select all cells\n event.preventDefault();\n this.selectAllCells();\n }\n }\n\n\n selectAllCells() {\n this.selectedCells = [];\n this.selectedKeys.clear();\n this.rowSelectedIndexes.clear();\n\n // Set selection start like single selection (first cell)\n if (this.dataSet.length && this.columns.length) {\n const firstField = this.columns[0].field || this.columns[0].name;\n this.selectionStart = {\n rowIndex: 0,\n colIndex: 0,\n subColIndex: 0,\n field: firstField,\n key: `0-0-0-${firstField}`,\n };\n }\n\n this.isSelecting = true;\n\n for (let rowIndex = 0; rowIndex <= this.dataSet?.length; rowIndex++) {\n if (!rowIndex) continue;\n const row = this.dataSet[rowIndex];\n this.rowSelectedIndexes.add(rowIndex);\n\n // for (let colIndex = 0; colIndex < this.columns.length; colIndex++) {\n // const col = this.columns[colIndex];\n // const field = col.field || col.name;\n // if(!col.is_visible) continue;\n\n // if (col.children?.length) {\n // col.children.forEach((sub: any, subColIndex: number) => {\n // const key = `${rowIndex}-${colIndex}-${subColIndex}-${field}`;\n // this.selectedKeys.add(key);\n // this.selectedCells.push({\n // rowIndex,\n // colIndex,\n // subColIndex,\n // field,\n // key,\n // });\n // });\n // } else {\n // const key = `${rowIndex}-${colIndex}-0-${field}`;\n // this.selectedKeys.add(key);\n // this.selectedCells.push({\n // rowIndex,\n // colIndex,\n // subColIndex: 0,\n // field,\n // key,\n // });\n // }\n // }\n }\n\n // Update highlighting and UI\n this.updateSelectionBoundaries();\n\n // Stop \"selecting\" mode since it's a one-time select-all\n this.isSelecting = false;\n }\n\n\n\n undo() {\n if (this.undoStack.length > 0) {\n const prevState = this.undoStack.pop()!;\n this.redoStack.push(this.cloneData(this.visibleRows));\n this.visibleRows = this.cloneData(prevState);\n }\n }\n\n redo() {\n if (this.redoStack.length > 0) {\n const nextState = this.redoStack.pop()!;\n this.undoStack.push(this.cloneData(this.visibleRows));\n this.visibleRows = this.cloneData(nextState);\n }\n }\n\n\n\n @HostListener('document:paste', ['$event'])\n async onPaste(event: ClipboardEvent) {\n if(!this.enableCut) return;\n const target = event.target as HTMLElement;\n const tag = target?.tagName?.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || target?.getAttribute('contenteditable') === 'true') {\n return;\n }\n\n if (!this.selectedCells?.length || !this.activeCell) return;\n\n const text = event.clipboardData?.getData('text');\n if (!text) return;\n const userConfirmed = await this.showConfirmationModal(\n 'Are you sure you want to paste the copied data?'\n );\n\n if (!userConfirmed) {\n event.preventDefault();\n return;\n }\n\n const startCell = this.selectedCells?.[0];\n if (!startCell) return;\n\n const updatedRows = await this.copyService.pasteFromClipboardText(\n text,\n this.visibleRows,\n this.columns,\n startCell.rowIndex,\n startCell.colIndex,\n startCell.subColIndex\n );\n\n if (updatedRows?.updateRows?.length) {\n this.genericEvent.emit({\n data: updatedRows?.updateRows,\n eventType: 'onCellEdit',\n column: updatedRows?.currentColums\n });\n }\n\n this.cdr.detectChanges();\n }\n\n showConfirmationModal(message: string): Promise<boolean> {\n return new Promise(resolve => {\n const overlay = document.createElement('div');\n overlay.classList.add('custom-overlay-wrapper');\n overlay.innerHTML = `\n <div class=\"custom-overlay\">\n <div class=\"custom-modal\">\n <div class=\"custom-modal-body\">\n <p class=\"modal-message\">${message}</p>\n <div class=\"modal-actions\">\n <button class=\"btn-confirm\">Confirm</button>\n <button class=\"btn-cancel\">Cancel</button>\n </div>\n </div>\n </div>\n </div>\n `;\n\n document.body.appendChild(overlay);\n const confirmBtn = overlay.querySelector('.btn-confirm') as HTMLElement;\n const cancelBtn = overlay.querySelector('.btn-cancel') as HTMLElement;\n const cleanup = () => {\n document.body.removeChild(overlay);\n };\n confirmBtn.addEventListener('click', () => {\n cleanup();\n resolve(true);\n });\n\n cancelBtn.addEventListener('click', () => {\n cleanup();\n resolve(false);\n });\n });\n }\n\n\n\n\n\n isDate(value: any): boolean {\n return !isNaN(new Date(value)?.getTime());\n }\n\n\n // Hold expanded IDs (array for multiple, single value for single)\n expandededDetailRows: (string | number)[] | string | number = '';\n\n toggleDetailRowExpand(row: any) {\n const id = row?.id || row?._id;\n if (this.gridType === 'Assets' && row?.detail?.columns) {\n row.detail.columns.forEach((item: any) => {\n item.width = item?.width || (this.dataGridContainer.nativeElement.offsetWidth / row.detail.columns?.length)\n });\n this.previewNestedCols = this.deepCloneColumns(row.detail.columns);\n }\n if (this.keepMultipleExpandedDetails) {\n if (!Array.isArray(this.expandededDetailRows)) {\n this.expandededDetailRows = [];\n }\n const expanded = this.expandededDetailRows as (string | number)[];\n const index = expanded.indexOf(id);\n\n if (index > -1) {\n expanded.splice(index, 1);\n } else {\n expanded.push(id);\n }\n } else {\n if (this.expandededDetailRows === id) {\n this.expandededDetailRows = '';\n } else {\n this.expandededDetailRows = id;\n }\n }\n\n setTimeout(() => {\n void this.rightPinnedHeader?.nativeElement.offsetWidth;\n this.centerPinnedBody?.nativeElement.offsetWidth;\n this.rightPinnedBody?.nativeElement.offsetWidth;\n this.cdr.detectChanges();\n }, 300)\n }\n\n isDetailsExpanded(row: any): boolean {\n const id = row?.id || row?._id;\n\n if (this.keepMultipleExpandedDetails) {\n return Array.isArray(this.expandededDetailRows) &&\n this.expandededDetailRows.includes(id);\n } else {\n return this.expandededDetailRows === id;\n }\n }\n\n getFilterValue(option: any): any {\n return option?.value ?? option;\n }\n\n\n openIndex: number | null = null;\n toggleMenu(i: number, event?: MouseEvent) {\n if (event) { event.stopPropagation(); }\n this.openIndex = this.openIndex === i ? null : i;\n }\n\n @ViewChild('nestedTable')\n nestedTable!: ElementRef<HTMLDivElement>;\n get hasVerticalScroll(): boolean {\n if (!this.nestedTable) return false;\n return this.nestedTable.nativeElement.scrollHeight > this.nestedTable.nativeElement.clientHeight;\n }\n\n get hasHorizontalScroll(): boolean {\n if (!this.nestedTable) return false;\n const el = this.nestedTable.nativeElement;\n return el.scrollWidth > el.clientWidth;\n }\n\n\n getTotalAmount(column: any) {\n if (!column?.is_amount) return;\n const total = this.originalDataSet.reduce((sum, row) => {\n const value = row[column.field] || 0;\n return sum + value;\n }, 0);\n if (!total) return `${this.currencySymbol} 0.00`\n return `${this.currencySymbol} ${this.formatCurrency.transform(total, this.currencyFormat)}`;\n }\n\n dropColumn(event: CdkDragDrop<any[]>, row: any) {\n // Reorder the columns array\n moveItemInArray(row.detail.columns, event.previousIndex, event.currentIndex);\n }\n\n currentSubSortColumn: string | null = null; // active column\n currentSortDirection: 'asc' | 'desc' = 'asc'; // active direction\n\n sortNestedCol(col: any, row: any) {\n const dataSet = row?.detail?.result;\n if (this.currentSubSortColumn === col.field) {\n this.currentSortDirection = this.currentSortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.currentSubSortColumn = col.field;\n this.currentSortDirection = 'asc';\n }\n col.order_by = this.currentSortDirection;\n\n // Sort copy instead of mutating\n const sorted = [...dataSet].sort((a, b) => {\n let aVal = a[col.field];\n let bVal = b[col.field];\n aVal = aVal == null ? '' : aVal;\n bVal = bVal == null ? '' : bVal;\n\n if (col.type === 'date') {\n aVal = new Date(aVal).getTime();\n bVal = new Date(bVal).getTime();\n }\n\n const aNum = parseFloat(aVal);\n const bNum = parseFloat(bVal);\n const bothNumbers = !isNaN(aNum) && !isNaN(bNum);\n\n if (bothNumbers) {\n return this.currentSortDirection === 'asc' ? aNum - bNum : bNum - aNum;\n } else {\n const comp = String(aVal).localeCompare(String(bVal));\n return this.currentSortDirection === 'asc' ? comp : -comp;\n }\n });\n\n row.detail.result = sorted;\n\n this.cdr.detectChanges();\n }\n\n\n getColumnWidthPx(row: any, col: any): string {\n if (col.width) return col.width + 'px';\n const pixels = this.centerScrollableBody?.nativeElement?.offsetWidth / row.detail?.columns.length;\n return pixels + 'px';\n }\n\n fullscreenImage: string | null = null;\n\n\n // Assests Nested Table Work Implemented Here\n\n pinUnpinColum(col: any, value: 'left' | 'right' | null, columns: any[]) {\n col.pinned = value;\n const left = columns.filter(c => c.pinned === 'left');\n const middle = columns.filter(c => !c.pinned || c.pinned === null);\n const right = columns.filter(c => c.pinned === 'right');\n columns.length = 0;\n columns.push(...left, ...middle, ...right);\n this.activeCol = null;\n }\n\n getLeftPinnedCount(columns: any[]): number {\n return columns.filter(c => c.pinned === 'left').length;\n }\n\n getRightPinnedCount(columns: any[]): number {\n return columns.filter(c => c.pinned === 'right').length;\n }\n\n getStickyLeft(columns: any[], index: number): string {\n let left = 0;\n for (let i = 0; i < index; i++) {\n const prevCol = columns[i];\n if (prevCol.pinned === 'left') {\n left += prevCol.width || 100;\n }\n }\n return `${left}px`;\n }\n\n previewNestedCols: any[] = [];\n onNestedColSort(event: CdkDragSortEvent<any[]>, columns: any[]): void {\n if (!event || !columns) return;\n const firstPositions = new Map<HTMLElement, number>();\n columns.forEach((col) => {\n const colCells = Array.from(document.querySelectorAll(`[field=\"${col.field}\"]`)) as HTMLElement[];\n colCells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\n });\n moveItemInArray(columns, event.previousIndex, event.currentIndex);\n this.cdr.detectChanges();\n requestAnimationFrame(() => {\n columns.forEach((col) => {\n const updatedCells = Array.from(document.querySelectorAll(`[field=\"${col.field}\"]`)) as HTMLElement[];\n updatedCells.forEach((el) => {\n const newLeft = el.getBoundingClientRect().left;\n const oldLeft = firstPositions.get(el) ?? newLeft;\n const deltaX = oldLeft - newLeft;\n\n if (deltaX !== 0) {\n el.style.transition = 'none';\n el.style.transform = `translateX(${deltaX}px)`;\n void el.offsetWidth;\n el.style.transition = 'transform 250ms ease';\n el.style.transform = 'translateX(0)';\n const cleanup = () => {\n el.style.transition = '';\n el.style.transform = '';\n el.removeEventListener('transitionend', cleanup);\n };\n el.addEventListener('transitionend', cleanup);\n }\n });\n });\n });\n }\n\n\n saveSelection(selectedIds: string[], tableType: string) {\n if (!tableType) return;\n const stored = JSON.parse(localStorage.getItem('datatableSelections') || '{\"selectedRows\": {}}');\n const allSelected = stored.selectedRows || {};\n allSelected[tableType] = selectedIds;\n localStorage.setItem(\n 'datatableSelections',\n JSON.stringify({\n selectedRows: allSelected,\n listingType: tableType\n })\n );\n }\n\n\n restoreSelection(tableType: string) {\n const stored = JSON.parse(localStorage.getItem('datatableSelections') || '{}');\n const ids = stored.selectedRows?.[tableType] || [];\n this.selectedRows = new Set(ids);\n return this.selectedRows;\n }\n\n\n\n isOutsideContainer = false;\n private containerRect: DOMRect | null = null;\n\n\n onDragStarted(col: any): void {\n this.currentDraggingColumn = col;\n const container = document.getElementById('data-grid-main-container');\n this.containerRect = container?.getBoundingClientRect() || null;\n }\n\n onDragMoved(event: CdkDragMove): void {\n if (!this.containerRect) return;\n\n const { x, y } = event.pointerPosition;\n const isOutside =\n x < this.containerRect.left ||\n x > this.containerRect.right ||\n y < this.containerRect.top ||\n y > this.containerRect.bottom;\n\n // if (isOutside !== this.isOutsideContainer) {\n // this.isOutsideContainer = isOutside;\n // }\n }\n\n onDragEnded(): void {\n setTimeout(() => {\n // if (this.isOutsideContainer && this.currentDraggingColumn) {\n // this.currentDraggingColumn!.is_visible = false;\n this.currentDraggingColumn = null;\n this.isOutsideContainer = false;\n // this.cdr.detectChanges();\n // }\n }, 100);\n this.containerRect = null;\n }\n\n getStartIndex(): number {\n return this.paginationConfig.totalResults === 0\n ? 0\n : (this.paginationConfig.page - 1) * this.paginationConfig.limit + 1 || 0;\n }\n\n hasAnyDefaultView() {\n return this.tableView?.some((x) => x.is_default || x.is_temp);\n }\n\n\n get isTablePresetNotChanged() {\n if (this.tableFilterViewId) return false;\n const currPreset = this.curretaTablePresetForUpdate;\n\n const currentPresetColumns = currPreset?.columns?.map((col: { field: any; width: any; pinned: any; }) => {\n return {\n field: col.field,\n width: col.width,\n pinned: col.pinned\n }\n });\n const columns = this.columns?.map(col => {\n return {\n field: col.field,\n width: col.width,\n pinned: col.pinned\n }\n });\n\n const stringsCurrentPrestCols = JSON.stringify(currentPresetColumns);\n const stringColumns = JSON.stringify(columns);\n const filters = this.filtersConfig.map((filter) => {\n return {\n filed: filter.field,\n query: {\n condition: filter?.query?.condition,\n first_condition: filter?.query?.first_condition,\n first_value: filter?.query?.first_value,\n second_condition: filter?.query?.second_condition,\n second_value: filter?.query?.second_value,\n },\n _ids: filter?._ids\n }\n })\n\n const currentPresetFilters = currPreset?.filters?.map((filter: any) => {\n return {\n filed: filter.field,\n query: filter.query,\n _ids: filter?._ids\n }\n })\n\n\n // console.log(\"filter congig: \", filters);\n // console.log(\"current preset filters: \", currentPresetFilters);\n\n // console.log('isEqual', stringsCurrentPrestCols == stringColumns);\n // console.log('Current Temp Preset : ', currPreset)\n // console.log('Current Temp Preset Cols columns: ', currentPresetColumns)\n // console.log('Current columns: ', columns);\n\n if (!currentPresetColumns) return true;\n return (currentPresetColumns && (stringsCurrentPrestCols == stringColumns) && (JSON.stringify(filters) == JSON.stringify(currentPresetFilters)) && (this.fontFaimly == currPreset.config.fontFaimly)\n && (this.bodyTextFontsSize == currPreset.config.bodyTextFontsSize) &&\n (this.headerTextFontsSize == this.headerTextFontsSize)\n && this.curretaTablePresetForUpdate.config.showVerticalBorder == this.showVerticalBorder\n && this.curretaTablePresetForUpdate.config.fontFaimly == this.fontFaimly\n && this.curretaTablePresetForUpdate.config.selectedTableLayout == this.selectedTableLayout\n && this.curretaTablePresetForUpdate.config.bodyTextFontsSize == this.bodyTextFontsSize\n && this.curretaTablePresetForUpdate.config.rowShadingEnabled == this.rowShadingEnabled);\n\n // return false\n }\n\n onActionButtonClick(button: string) {\n const text = button?.toLocaleLowerCase();\n if (text == 'active data' || text == 'active' || text == 'data active' || text == 'unarchived data' || text == 'unarchive data') this.clearSelectionState(this.tableType);\n const event = {\n data: {\n listingType: this.listingType,\n obj: button\n },\n eventType: \"onActionButtonClick\",\n };\n this.genericEvent.emit(event);\n }\n\n\n setActiveTab(tab: string | null): void {\n this.activeTab = tab;\n const allTabs = JSON.parse(localStorage.getItem('activeTabs') || '{}');\n allTabs[this.tableType] = tab;\n localStorage.setItem('activeTabs', JSON.stringify(allTabs));\n this.cdr.detectChanges();\n const event = {\n data: {\n tableType: this.tableType,\n obj: tab\n },\n eventType: 'onTabChange',\n };\n\n this.genericEvent.emit(event);\n }\n\n getBackgroundColor(row: any, isEven: boolean, section: 'left' | 'center' | 'right'): string | undefined {\n if (this.hoveredRowId === (row._id || row.id)) {\n return this.rowHoverColor;\n }\n if (this.isRowSelected(row)) {\n return this.checkedRowBackgroundColor;\n }\n let baseColor: string | undefined;\n\n if (this.rowShadingEnabled) {\n baseColor = isEven ? this.evenRowsBackgroundColor : this.oddRowsBackgroundColor;\n } else {\n baseColor = this.evenRowsBackgroundColor;\n }\n if (!baseColor) {\n if (section === 'left') {\n baseColor = this.leftPinnedBackgroundColor;\n } else if (section === 'right') {\n baseColor = this.rightPinnedBackgroundColor;\n } else {\n baseColor = this.bodyBackgroundColor;\n }\n }\n return baseColor;\n }\n\n hasHorizontalScrollbar(): boolean {\n if (!this.centerPinnedHeader?.nativeElement) return false;\n const el = this.centerPinnedHeader.nativeElement;\n return el.scrollWidth > el.clientWidth;\n }\n\n\n getSafeComment(description: string): SafeHtml {\n return this.cleanEditorContent(description);\n }\n cleanEditorContent(content: string): SafeHtml {\n if (!content) {\n return '';\n }\n // 1. Decode HTML entities\n const textarea = document.createElement('textarea');\n textarea.innerHTML = content;\n let decoded = textarea.value;\n\n decoded = decoded\n .replace(/<\\/?(span|p|thead|tbody|tfoot)[^>]*>/g, '')\n .replace(/ /g, ' ');\n\n // Ensure clean table structure\n decoded = decoded\n .replace(/<table[^>]*>/g, '<table>')\n .replace(/<tr[^>]*>/g, '<tr>')\n .replace(/<th[^>]*>/g, '<th>')\n .replace(/<td[^>]*>/g, '<td>'); // Remove <thead> and <tbody> tags\n\n // 4. Add inline styles\n decoded = decoded\n // Add inline styles to <table>\n .replace(/<table([^>]*)>/g, `<table style=\"width: 100%; border-collapse: collapse; padding: 20px; font-size: 14px; background-color: #ffffff;\"$1>`)\n // Add inline styles to <tr>\n .replace(/<tr([^>]*)>/g, `<tr style=\"border-bottom: 1px solid #ccc;\"$1>`)\n // Add inline styles to <th>\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>`)\n // Add inline styles to <td>\n .replace(/<td([^>]*)>/g, `<td style=\"min-width:120px; border: 1px solid #ccc; padding: 12px 20px; text-align: left;\"$1>`);\n decoded = decoded.replace(/<img([^>]*)>/g, (match, group1) => {\n // Add style to <img> if not already specified\n if (/style=/.test(group1)) {\n return match; // If style already exists, keep it\n } else {\n return `<img style=\"width: 30%; height: 30%;border-radius: 16px; padding-top: 15px;padding-bottom: 10px;\"${group1}>`;\n }\n });\n // 5. Return safe HTML\n return this.sanitizer.bypassSecurityTrustHtml(decoded);\n }\n\n getExtention(url: string | string[] | null | undefined) {\n if (url !== '-') {\n if (typeof (url) == 'string') {\n return url.split('.').pop()\n } else if (Array.isArray(url)) {\n return url[0].split('.').pop()\n } else return '-'\n }\n else return '-'\n }\n\n downloadAttchment(url: any, file?: any) {\n // this.onEvent.emit({\n // download: true,\n // });\n // this.genericEvent.emit(data)\n // event.preventDefault();\n const link = document.createElement('a');\n link.href = url;\n link.download = '';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n }\n fullImageSrc: string | null = '';\n openFullImage(event: Event) {\n const target = event.target as HTMLElement;\n if (target.tagName === 'IMG') {\n this.fullImageSrc = target.getAttribute('src');\n }\n }\n\n addStylesToImages(): void {\n const images = document.querySelectorAll('.comment-content img');\n images.forEach((img) => {\n // Apply inline styles directly\n this.renderer.setStyle(img, 'width', '70px');\n this.renderer.setStyle(img, 'border-radius', '16px');\n this.renderer.setStyle(img, 'margin', '8px');\n this.renderer.setStyle(img, 'cursor', 'pointer');\n\n // Add click listener to show fullscreen image on click\n this.renderer.listen(img, 'click', () => this.onImageClick((img as HTMLImageElement).src));\n });\n }\n\n onImageClick(src: string): void {\n this.fullscreenImage = src;\n }\n\n @ViewChild('fullscreenImageTemplate') fullscreenImageTemplate!: TemplateRef<any>;\n private fullscreenViewRef: EmbeddedViewRef<any> | null = null;\n\n iconMap: Record<string, (row: any, col: any) => string> = {\n attachments_count: () => this.singleSpaAssetsPath + 'data-grid/icons/attachments.svg',\n comment_count: () => this.singleSpaAssetsPath + 'data-grid/icons/comments.svg',\n priority: (row, col) => {\n const val =\n this.getNestedValue(row, col.field)?.value ||\n this.getNestedValue(row, col.field)?.name ||\n this.getNestedValue(row, col.field);\n\n return (\n this.singleSpaAssetsPath +\n 'data-grid/icons/' +\n (val ?? 'default') +\n '.svg'\n );\n },\n };\n\n toggleFullscreen() {\n this.isFullScreen = !this.isFullScreen;\n const elem = document.documentElement as any;\n if (!document.fullscreenElement) {\n if (elem.requestFullscreen) {\n elem.requestFullscreen();\n } else if (elem.mozRequestFullScreen) {\n elem.mozRequestFullScreen();\n } else if (elem.webkitRequestFullscreen) {\n elem.webkitRequestFullscreen();\n } else if (elem.msRequestFullscreen) {\n elem.msRequestFullscreen();\n }\n } else {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if ((document as any).mozCancelFullScreen) {\n (document as any).mozCancelFullScreen();\n } else if ((document as any).webkitExitFullscreen) {\n (document as any).webkitExitFullscreen();\n } else if ((document as any).msExitFullscreen) {\n (document as any).msExitFullscreen();\n }\n }\n }\n\n onCellEvent(event: any) {\n this.customCellEvent.emit(event);\n }\n\n private flattenGroup(row: any): any[] {\n const result: any[] = [];\n const traverse = (node: any) => {\n if (!node) return;\n if (node.isGroup) {\n node.children?.forEach((child: any) => traverse(child));\n } else {\n result.push(node);\n }\n };\n traverse(row);\n return result;\n }\n\n selectGroupRow(e: Event, row: any) {\n const checkbox = e.target as HTMLInputElement;\n const isChecked = checkbox.checked;\n // Get all deep data rows (leaf rows)\n const leafRows = this.flattenGroup(row);\n if (isChecked) {\n leafRows.forEach(r => {\n const id = r._id || r.id;\n if (id) this.selectedRows.add(id);\n });\n } else {\n leafRows.forEach(r => {\n const id = r._id || r.id;\n if (id) this.selectedRows.delete(id);\n });\n }\n const ids = Array.from(this.selectedRows);\n const event = {\n data: {\n listingType: this.listingType,\n obj: ids\n },\n eventType: \"onSelectRow\",\n }\n this.genericEvent.emit(event);\n this.cdr.detectChanges();\n }\n\n getGroupCheckedState(row: any): boolean | undefined {\n if (!row.isGroup) return false;\n const leafRows = this.flattenGroup(row);\n let checkedCount = 0;\n leafRows.forEach(r => {\n const id = r._id || r.id;\n if (this.selectedRows.has(id)) checkedCount++;\n });\n if (checkedCount === 0) return false;\n if (checkedCount === leafRows.length) return true;\n return undefined;\n }\n\n getCellTitle(row: any, col: any): string {\n const val = this.getNestedValue(row, col.field);\n\n if (!this.isNestedValueArray(row, col.field)) {\n if (col.type === 'date') {\n return this.commonSevice.formatDateValue(val, this.dateFormat);\n } else if (col?.is_amount) {\n if (!val) return `0.00`\n return this.formatCurrency.transform(val, this.currencyFormat);\n }\n\n return (\n val?.value ??\n val?.name ??\n val ??\n (col.is_amount ? '0' : '-')\n ) + '';\n }\n\n const first = val?.[0];\n\n return (\n first?.department_name ??\n first?.roleName ??\n first?.full_name ??\n '-'\n );\n }\n\n\n finishEdit(event: any) {\n console.log('cell editeddddddddddddddd: ', event)\n }\n\n activeFilterType: string = ''\n activeFilter(type: string) {\n this.activeFilterType = type;\n }\n\n getDynamicRight(col: any, section: string, colIndex: number, subColIndex: number){\n if(section == 'right' && this.previewRightPinnedColumns?.length == 1 && col.width < 200){\n return 100;\n }else if(section == 'right'){\n return null;\n }\n else if(section == 'previewCenterColumns' && colIndex == (this.previewCenterColumns?.length - 1) && col.width < 200){\n return 200\n }else{\n return col.width - 45;\n }\n }\n\n blurInput(event: Event, row: any, col: any): void {\n const input = event?.target as HTMLInputElement;\n input?.blur();\n this.setActiveCell(row, col);\n setTimeout(() => {\n this.editingKey = '';\n this.cdr.detectChanges();\n }, 0);\n }\n\n\n}","<div class=\"position-relative h-100 card-outer\">\n <div class=\"d-flex justify-content-between mb-3 align-items-center position-relative\">\n <div class=\"d-flex gap-2\">\n <div class=\"nav nav-tabs\" *ngIf=\"true\">\n <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n <span\n *ngFor=\"let tab of tabs; let i = index\"\n (click)=\"setActiveTab(tab)\"\n class=\"nav-link cursor-pointer\"\n [class.active]=\"activeTab == tab\"\n >\n {{ tab }}\n </span>\n </div>\n </div>\n <div class=\"new_design_dropdown hide_arrow\">\n <a href=\"JavaScript:void(0)\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-auto-close=\"outside\"\n class=\"d-flex align-items-center dropdown-toggle justify-content-center dropdown_main_button\">\n All\n </a>\n </div>\n <div>\n <div class=\"btn-group new_design_dropdown hide_arrow\">\n <a href=\"JavaScript:void(0)\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-auto-close=\"outside\"\n class=\"d-flex align-items-center dropdown-toggle justify-content-center dropdown_main_button\">\n Unfulfilled\n </a>\n <ul class=\"dropdown-menu\">\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resetIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </div>\n <span> Reset</span>\n </a>\n </li>\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/updatePresetIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </div>\n <span> Update and Re-save</span>\n </a>\n </li>\n <hr class=\"mt-1\">\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/infoIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </div>\n <span> Rename</span>\n </a>\n </li>\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/duplicateIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </div>\n <span>Duplicate</span>\n </a>\n </li>\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/trashIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </div>\n <span>Delete</span>\n </a>\n </li>\n </ul>\n </div>\n </div>\n <div>\n <div class=\"btn-group new_design_dropdown hide_arrow\">\n <a href=\"JavaScript:void(0)\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-auto-close=\"outside\"\n class=\"d-flex align-items-center dropdown-toggle justify-content-center dropdown_main_button\">\n Unpaid\n </a>\n <ul class=\"dropdown-menu\">\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/infoIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </div>\n <span> Test Type</span>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-1 align-items-center table-right-top-actions\">\n <div class=\"global-search position-relative\" [style.width.px]=\"350\">\n <span *ngIf=\"enableGlobalSearch\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\n class=\"data-grid-svg-icon ms-2 mt-0 position-absolute icon\" style=\"top: 8px;\"\n ></span>\n <input\n *ngIf=\"enableGlobalSearch\"\n class=\"form-control\"\n placeholder=\"Search\"\n [(ngModel)]=\"tableSearch\"\n (keydown.enter)=\"onGlobalSearch()\"\n (input)=\"onSearchInput($event)\"\n type=\"search\"\n />\n </div>\n <!-- <ng-container *ngFor=\"let button of buttons\">\n <div\n class=\"d-flex align-items-center gap-2 action-buttons-row\"\n *ngIf=\"button?.has_permission\"\n >\n <a\n href=\"JavaScript:void(0)\"\n (click)=\"onActionButtonClick(button.name)\"\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\"\n >\n <span\n *ngIf=\"button.is_showIcon\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/' + button.icon + '.svg'\n \"\n class=\"svg-icon svg-icon-2\"\n ></span>\n <span\n class=\"label-hidden text-white\"\n [class.ms-0]=\"button.is_showIcon\"\n >{{ button?.name }}</span\n >\n </a>\n </div>\n </ng-container> -->\n <div *ngIf=\"!showFilterRow\"\n class=\"cursor-pointer position-relative action-buttons-row\"\n (click)=\"toggleOpenFilter()\"\n [class.active]=\"showFilters\"\n >\n <a\n href=\"JavaScript:void(0)\"\n class=\"p-0 d-flex align-items-center justify-content-center grid-header-icon\">\n <span \n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filterIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </a>\n <span\n *ngIf=\"activeFilteredColumns?.length\"\n style=\"\n width: 7px;\n height: 7px;\n box-shadow: 0px 0px 3px #0022ff;\n background-color: rgb(0, 60, 255);\n position: absolute;\n right: 16px;\n top: 10px;\n \"\n class=\"rounded-circle d-block\"\n ></span>\n </div>\n <div\n class=\"cursor-pointer d-none\"\n (click)=\"toggleActions('advance-filter')\"\n [class.active]=\"activeTopButton === 'advance-filter'\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/zoom-charge.svg'\"\n class=\"data-grid-svg-icon top-icon me-2\"\n ></span>\n </div>\n <div class=\"cursor-pointer actions-buttons-row\">\n <div class=\"btn-group new_design_dropdown hide_arrow\">\n <a href=\"JavaScript:void(0)\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-auto-close=\"outside\"\n class=\"p-0 d-flex align-items-center dropdown-toggle justify-content-center grid-header-icon\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/sortingIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </a>\n <ul class=\"dropdown-menu\">\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div class=\"sorting_icon_input\">\n <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"productName\" value=\"option1\" checked>\n </div>\n <label class=\"form-check-label mb-0 mt-1\" for=\"productName\">\n Product Name\n </label>\n </a>\n </li>\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div class=\"sorting_icon_input\">\n <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"createdDate\" value=\"option1\" checked>\n </div>\n <label class=\"form-check-label mb-0 mt-1\" for=\"createdDate\">\n Created Date\n </label>\n </a>\n </li>\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div class=\"sorting_icon_input\">\n <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"updatedDate\" value=\"option1\" checked>\n </div>\n <label class=\"form-check-label mb-0 mt-1\" for=\"updatedDate\">\n Updated Date\n </label>\n </a>\n </li>\n <li>\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <div class=\"sorting_icon_input\">\n <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"productType\" value=\"option1\" checked>\n </div>\n <label class=\"form-check-label mb-0 mt-1\" for=\"productType\">\n Product Type\n </label>\n </a>\n </li>\n <hr class=\"my-2\">\n <li class=\"d-flex\" (click)=\"activeFilter('newest')\" [class.active-filter]=\"activeFilterType === 'newest'\">\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrowupIconNew.svg'\"\n class=\"svg-icon svg-icon-2 mb-1 new_old_filter\"\n ></span>\n <span class=\"mt-1 newest\">Newest First</span>\n </a>\n <div *ngIf=\"activeFilterType === 'newest'\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/tickIconNew.svg'\"\n class=\"svg-icon svg-icon-2 mb-1\"\n ></span>\n </div>\n </li>\n <li class=\"d-flex\" (click)=\"activeFilter('oldest')\" [class.active-filter]=\"activeFilterType === 'oldest'\">\n <a class=\"dropdown-item hover_dropdown_bg d-flex align-items-center\" href=\"javascript:void(0)\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrowdownIconNew.svg'\"\n class=\"svg-icon svg-icon-2 mb-1 new_old_filter\"\n ></span>\n <span class=\"mt-1 oldest\">Newest First</span>\n </a>\n <div *ngIf=\"activeFilterType === 'oldest'\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/tickIconNew.svg'\"\n class=\"svg-icon svg-icon-2 mb-1\"\n ></span>\n </div>\n </li>\n </ul>\n </div>\n </div>\n <div class=\"cursor-pointer action-buttons-row\"\n (click)=\"toggleActions('setting')\"\n [class.active]=\"\n activeTopButton === 'setting' ||\n activeTopButton === 'table-layout' ||\n activeTopButton === 'table-presets' ||\n activeTopButton === 'show-hide-columns'\n \"\n >\n <!-- <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settings-2.svg'\"\n class=\"data-grid-svg-icon top-icon me-2\"\n ></span> -->\n <a\n href=\"JavaScript:void(0)\"\n class=\"p-0 d-flex align-items-center justify-content-center grid-header-icon\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/settingIconNew.svg'\"\n class=\"svg-icon svg-icon-2\"\n ></span>\n </a>\n\n <div\n *ngIf=\"activeTopButton === 'setting'\"\n class=\"actions-dropdown mt-1 actions-dropdown-setting\"\n style=\"position: absolute\"\n >\n <div class=\"dropdown-menu show shadow custom-menu setting_dropdown_menu\">\n <!-- Table Layout -->\n <a\n class=\"dropdown-item py-0 px-2 d-flex justify-content-between align-items-center cursor-pointer\"\n (click)=\"$event.stopPropagation(); toggleActions('table-layout')\"\n >\n <span class=\"d-flex justify-content-between align-items-center\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/layoutIconNew.svg'\n \"\n class=\"data-grid-svg-icon setting_dropdown\"\n ></span>\n Table Layout</span\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n class=\"data-grid-svg-icon d-flex align-items-center justify-content-center\"\n ></span>\n </a>\n <!-- Table Presets -->\n <a (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\n class=\"dropdown-item py-0 px-2 d-flex justify-content-between align-items-center cursor-pointer\">\n <span class=\"d-flex align-items-center justify-content-center\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/list-details.svg'\n \"\n class=\"data-grid-svg-icon setting_dropdown d-flex align-items-center justify-content-center\"\n ></span>\n Table Presets</span\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n class=\"data-grid-svg-icon d-flex align-items-center justify-content-center\"\n ></span>\n </a>\n\n <!-- Columns -->\n <a *ngIf=\"!showSideMenu\" (click)=\"$event.stopPropagation(); toggleActions('show-hide-columns')\"\n class=\"dropdown-item py-0 px-2 d-flex justify-content-between align-items-center cursor-pointer\">\n <span class=\"d-flex align-items-center justify-content-center\"><span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eyeIconNew.svg'\"\n class=\"data-grid-svg-icon setting_dropdown me-2\"\n ></span>\n Columns</span>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"muted-text\">{{ columnsCount }}</span>\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n class=\"data-grid-svg-icon d-flex align-items-center justify-content-center\"\n ></span>\n </div>\n </a>\n\n <a (click)=\"autosizeAllColumns()\" class=\"dropdown-item py-0 px-2 d-flex justify-content-between align-items-center cursor-pointer\">\n <span class=\"d-flex align-items-center justify-content-center\"><span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resizeIconNew.svg'\"\n class=\"data-grid-svg-icon setting_dropdown me-2\"></span>\n <span>Autosize all columns</span>\n </span>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"flexSwitchCheckChecked\">\n <label class=\"form-check-label\" for=\"flexSwitchCheckChecked\"></label>\n </div>\n </div>\n </a>\n\n <a class=\"dropdown-item py-0 px-2 d-flex justify-content-between align-items-center cursor-pointer\">\n <span class=\"d-flex align-items-center justify-content-center\"><span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/multicellNew.svg'\"\n class=\"data-grid-svg-icon setting_dropdown me-2\"></span>\n <span>Multi-cell tooltip mode</span>\n </span>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"form-check form-switch\">\n <input [(ngModel)]=\"showDetailsBox\" class=\"form-check-input\" type=\"checkbox\" id=\"flexSwitchCheckChecked\">\n <label class=\"form-check-label\" for=\"flexSwitchCheckChecked\"></label>\n </div>\n </div>\n </a>\n\n <div class=\"dropdown-divider\"></div>\n\n <!-- Filter -->\n <a class=\"dropdown-item py-0 px-2 d-flex align-items-center cursor-pointer\"\n (click)=\"toggleOpenFilter(); activeTopButton = '';\"\n *ngIf=\"!showFilterRow\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/filterIconNew.svg'\n \"\n class=\"data-grid-svg-icon setting_dropdown d-flex align-items-center justify-content-center cursor-pointer\"\n ></span>\n Filter\n </a>\n\n <!-- Download -->\n <a class=\"dropdown-item py-0 px-2 d-flex align-items-center cursor-pointer\"\n (click)=\"downloadCsv('csv')\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/exportIconNew.svg'\"\n class=\"data-grid-svg-icon setting_dropdown d-flex align-items-center justify-content-center cursor-pointer\"\n ></span>\n CSV Export\n </a>\n <a *ngIf=\"enableExport\"\n class=\"dropdown-item py-0 px-2 d-flex align-items-center cursor-pointer\"\n (click)=\"downloadCsv('xlsx')\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/exportIconNew.svg'\n \"\n class=\"data-grid-svg-icon setting_dropdown d-flex align-items-center justify-content-center cursor-pointer\"\n ></span>\n Excel Export\n </a>\n <!-- Font Family & Font Size -->\n <div class=\"px-2 pb-2 pt-2\">\n <div class=\"d-flex gap-2\">\n <!-- <select\n class=\"form-select form-select-sm\"\n [(ngModel)]=\"fontFaimly\"\n (change)=\"onFontChange()\"\n >\n <option *ngFor=\"let font of fontFamilies\" [value]=\"font\">\n {{ font }}\n </option>\n </select> -->\n\n <!-- Font Size -->\n <!-- <select\n class=\"form-select form-select-sm\"\n (change)=\"onFontChange()\"\n [(ngModel)]=\"bodyTextFontsSize\"\n >\n <option *ngFor=\"let size of fontSizes\" [value]=\"size\">\n {{ size }}\n </option>\n </select> -->\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table Layout -->\n\n <ng-container *ngIf=\"activeTopButton === 'table-layout'\">\n <div\n *ngTemplateOutlet=\"tableLayout\"\n class=\"actions-dropdown mt-1\"\n style=\"position: absolute\"\n ></div>\n </ng-container>\n\n <!-- Table Presets -->\n <ng-container *ngIf=\"activeTopButton === 'table-presets'\">\n <div\n *ngTemplateOutlet=\"tablePreset\"\n class=\"actions-dropdown mt-1\"\n style=\"position: absolute\"\n ></div>\n </ng-container>\n\n <!-- Table Presets -->\n <ng-container *ngIf=\"activeTopButton === 'show-hide-columns'\">\n <div\n *ngTemplateOutlet=\"showHideColumns\"\n class=\"actions-dropdown mt-1\"\n style=\"position: absolute\"\n ></div>\n </ng-container>\n </div>\n <div class=\"cursor-pointer actions-buttons-row\">\n <div class=\"btn-group new_design_dropdown\">\n <button type=\"button\" class=\"btn btn-primary dropdown-toggle consumerDropdownButton px-2\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n Actions\n </button>\n <ul class=\"dropdown-menu\">\n <li>\n <a class=\"dropdown-item hover_dropdown_bg action_dropdown\" (click)=\"createCustomColumn()\">Create custom column</a>\n </li>\n <ng-container *ngFor=\"let button of buttons\">\n <li *ngIf=\"button?.has_permission\">\n <a class=\"dropdown-item hover_dropdown_bg action_dropdown\" \n href=\"javascript:void(0)\" \n (click)=\"onActionButtonClick(button.name)\">\n <!-- <span *ngIf=\"button.is_showIcon\" \n class=\"me-2\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/' + button.icon + '.svg'\"\n class=\"svg-icon svg-icon-2\"></span>\n </span> -->\n <span>{{ button?.name }}</span>\n </a>\n </li>\n </ng-container>\n </ul>\n </div>\n </div>\n <!-- <div class=\"cursor-pointer actions-buttons-row\" *ngIf=\"buttons.length == 1\">\n <a href=\"JavaScript:void(0)\"\n (click)=\"onActionButtonClick(buttons[0].name)\"\n class=\"btn btn-primary border border-primary py-1 d-flex align-items-center justify-content-center px-3\">\n <span class=\"text-white\"\n [class.ms-0]=\"buttons[0].is_showIcon\"\n >{{ buttons[0].name }}</span>\n </a>\n </div> -->\n <div class=\"action-buttons-row\" *ngIf=\"showFullScreenButton\">\n <a\n *ngIf=\"!isFullScreen\"\n class=\"button button-small btn btn-active-primary border border-primary expend d-flex justify-content-center align-items-center\"\n (click)=\"toggleFullscreen()\"\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n title=\"Minimise\"\n [ngClass]=\"{ minArrow: !isFullScreen, maxArrow: isFullScreen }\"\n style=\"transition: color 0.2s\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/expend.svg'\"\n class=\"svg-icon svg-icon-2 mb-1\"\n ></span>\n </a>\n <a\n *ngIf=\"isFullScreen\"\n class=\"button button-small btn btn-active-primary border border-primary expend d-flex justify-content-center align-items-center\"\n (click)=\"toggleFullscreen()\"\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n title=\"Maximise\"\n [ngClass]=\"{ minArrow: !isFullScreen, maxArrow: isFullScreen }\"\n style=\"transition: color 0.2s\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/minimize.svg'\"\n class=\"svg-icon svg-icon-2 mb-1\"\n ></span>\n </a>\n </div>\n <div>\n <!-- Example single danger button -->\n\n <!-- <button\n type=\"button\"\n class=\"btn btn-primary btn-sm d-flex gap-2 action-button\"\n (click)=\"toggleActions('actions')\"\n >\n Action\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/Vector.svg'\"\n class=\"data-grid-svg-icon\"\n ></span>\n </button>\n <div\n *ngIf=\"activeTopButton === 'actions'\"\n class=\"actions-dropdown mt-1\"\n >\n <div class=\"dropdown-menu show\">\n <a class=\"dropdown-item\" href=\"#\">Action</a>\n <a class=\"dropdown-item\" href=\"#\">Another action</a>\n <a class=\"dropdown-item\" href=\"#\">Something else here</a>\n <div class=\"dropdown-divider\"></div>\n <a class=\"dropdown-item\" href=\"#\">Separated link</a>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"showFilters && !showFilterRow\"\n class=\"top-filter-row border-top py-2 d-flex justify-content-between align-items-center\"\n [style.height.px]=\"topFilterRowHeight\"\n >\n <!-- LEFT SIDE (Filter tags + Filter button) -->\n <div class=\"d-flex gap-2 align-items-center\">\n <ng-container>\n <div\n *ngFor=\"let col of activeFilteredColumns; trackBy: trackByField\"\n class=\"filter-tags\"\n >\n <div\n (click)=\"\n isActiveFilterOpen = true;\n activeTopButton = 'filter-columns';\n openFilter(col)\n \"\n class=\"d-flex justify-content-center align-items-center muted-text add-filter-button active-filters\"\n style=\"white-space: nowrap\"\n [class.active]=\"\n col?.field == selectedColumnForFilter?.field &&\n isActiveFilterOpen &&\n activeTopButton == 'filter-columns'\n \"\n >\n <span class=\"header-tag mt-0 d-flex align-items-center\">\n <span\n *ngIf=\"col?.pinned\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n {{ col.header }}\n <span\n (click)=\"\n $event.stopPropagation(); removeColumnFilterFromColumn(col)\n \"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\n \"\n class=\"data-grid-svg-icon cross-secondary ms-2 mb-1\"\n ></span>\n </span>\n </div>\n\n <ng-container\n *ngIf=\"\n activeTopButton === 'filter-columns' &&\n col?.field == selectedColumnForFilter?.field &&\n isActiveFilterOpen\n \"\n >\n <div\n *ngTemplateOutlet=\"filterColumns; context: { column: col }\"\n class=\"actions-dropdown mt-1\"\n ></div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Filter Button -->\n <div class=\"add-filter-button-menu\">\n <div\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\n class=\"d-flex justify-content-center align-items-center muted-text add-filter-button button-filter\"\n style=\"width: 70px\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/plus.svg'\"\n class=\"me-2 data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n Filter\n </div>\n\n <ng-container\n *ngIf=\"activeTopButton === 'filter-columns' && !isActiveFilterOpen\"\n >\n <div\n *ngTemplateOutlet=\"filterColumns\"\n class=\"actions-dropdown mt-1\"\n ></div>\n </ng-container>\n </div>\n </div>\n\n <!-- RIGHT SIDE (Update + Reset) -->\n <div class=\"d-flex gap-3 align-items-center\">\n <div\n (click)=\"savePreset()\"\n class=\"text-primary cursor-pointer all-filters-reset-button\"\n *ngIf=\"!checkFilterChangesEffect()\"\n >\n Update View\n </div>\n\n <div\n class=\"text-primary cursor-pointer all-filters-reset-button\"\n *ngIf=\"!tableFilterViewId && activeFilteredColumns?.length\"\n (click)=\"clearAllFilters()\"\n >\n Reset\n </div>\n </div>\n </div>\n\n <div\n [style.height]=\"\n showFilters ? 'calc(100% - ' + topFilterRowHeight + 'px)' : '100%'\n \"\n cdkDropListGroup\n class=\"data-grid-table-wrapper overflow-hidden\"\n #dataGridContainer\n [style.fontFamily]=\"fontFaimly\"\n [style.backgroundColor]=\"bodyBackgroundColor\"\n id=\"data-grid-main-container\"\n >\n <div\n *ngIf=\"showRowsGrouping\"\n [style.height.px]=\"headerRowHeight\"\n [cdkDropListData]=\"columns\"\n [style.backgroundColor]=\"\n topGroupedBadgesBackgroundColor || headerBackgroundColor\n \"\n cdkDropList\n (cdkDropListEntered)=\"enterToTopRowGrouping($event)\"\n (cdkDropListExited)=\"exitedFromTheTopRow($event)\"\n (cdkDropListDropped)=\"onDropTopGroup($event)\"\n [cdkDropListEnterPredicate]=\"canEnterToRowsGrouping\"\n id=\"rows-grouping-top-container\"\n class=\"border-below d-flex px-4 align-items-center\"\n >\n <div\n class=\"d-flex gap-2 align-items-center\"\n [style.color]=\"headerTextColor\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n <div *ngIf=\"!draggingInGroupArea && !groupedColumns?.length\">\n Drag here to set row groups\n </div>\n <div\n cdkDropListOrientation=\"horizontal\"\n cdkDropList\n (cdkDropListDropped)=\"onGroupReorder($event)\"\n class=\"d-flex\"\n >\n <div\n cdkDrag\n [cdkDragLockAxis]=\"'x'\"\n *ngFor=\"\n let child of groupedColumns;\n let i = index;\n trackBy: trackByField\n \"\n class=\"d-flex align-items-center\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: child,\n showChevron:\n groupedColumns.length > 1 && i != groupedColumns.length - 1\n }\n \"\n ></ng-container>\n <ng-template cdkDragPreview\n ><div class=\"p-2 border d-flex gap-2\">\n <div>\n <span\n *ngIf=\"!draggingInGroupArea\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div>{{ child.header }}</div>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"d-flex overflow-hidden\"\n [style.height]=\"\n 'calc(100% - ' +\n (showRowsGrouping\n ? headerRowHeight + footerRowHeight\n : footerRowHeight) +\n 'px)'\n \"\n >\n <div\n class=\"h-100\"\n [style.width]=\"\n !showSideMenu\n ? '100%'\n : sideMenuVisible\n ? 'calc(100% - 280px)'\n : 'calc(100% - 30px)'\n \"\n >\n <div class=\"h-100 transition position-relative w-100\">\n <!-- ##################################################################################################################################################################################### -->\n <!-- ##################################################################################################################################################################################### -->\n <!-- Data Grid Header starts here -->\n <!-- ##################################################################################################################################################################################### -->\n <!-- ##################################################################################################################################################################################### -->\n <!-- [style.backgroundColor]=\"headerBackgroundColor\" -->\n <div\n class=\"data-grid-header-wrapper w-100\"\n [style.color]=\"headerTextColor\"\n [style.fontSize.px]=\"headerTextFontsSize\"\n [class.border-below]=\"!hasAnyVisibleColumn\"\n [style.height.px]=\"\n showColumnsGrouping && showFilterRow\n ? headerRowHeight * 3\n : showColumnsGrouping || showFilterRow\n ? headerRowHeight * 2\n : headerRowHeight\n \"\n >\n <!-- ********************************************************************************* -->\n <!-- ********************************************************************************* -->\n <!-- Data Grid Left Pinned Header starts here -->\n <!-- ********************************************************************************* -->\n <!-- ********************************************************************************* -->\n <div\n class=\"data-grid-header left-pinned\"\n #leftPinnedHeader\n [class.border-right]=\"hasLeftPinnedColumns\">\n <div *ngIf=\"showSerialNumber\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n class=\"select-all-checkbox-cell border-below\"\n [style.width.px]=\"55\"\n [style.height.px]=\"\n showColumnsGrouping && showFilterRow\n ? headerRowHeight * 3\n : showColumnsGrouping || showFilterRow\n ? headerRowHeight * 2\n : headerRowHeight\n \"\n >\n S.No\n </div>\n <div\n *ngIf=\"showCheckboxes\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n class=\"select-all-checkbox-cell border-below\"\n [style.height.px]=\"\n showColumnsGrouping && showFilterRow\n ? headerRowHeight * 3\n : showColumnsGrouping || showFilterRow\n ? headerRowHeight * 2\n : headerRowHeight\n \"\n >\n <input\n *ngIf=\"hasAnyVisibleColumn\"\n style=\"width: 16px; height: 16px\"\n type=\"checkbox\"\n [indeterminate]=\"isIndeterminateState(dataSet)\"\n [checked]=\"isAllSelected(dataSet)\"\n (change)=\"toggleSelectAll(dataSet)\"\n />\n </div>\n <div\n [style.backgroundColor]=\"headerBackgroundColor\"\n class=\"d-flex\"\n cdkDropList\n id=\"left-pinned-header\"\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"leftPinnedColumns\"\n (cdkDropListEntered)=\"onDropListEnter($event, 'left')\"\n (cdkDropListSorted)=\"\n onSortGroup($event, 'previewLeftPinnedColumns')\n \"\n (cdkDropListDropped)=\"onDropGroup()\"\n style=\"min-width: 1px\"\n >\n <div\n class=\"dragable-header\"\n cdkDrag\n [cdkDragData]=\"col\"\n *ngFor=\"\n let col of leftPinnedColumns;\n let i = index;\n trackBy: trackByField\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerCell;\n context: {\n $implicit: col,\n index: i,\n section: 'previewLeftPinnedColumns'\n }\n \"\n ></ng-container>\n <ng-template cdkDragPreview\n ><div class=\"p-2 border d-flex gap-2\">\n <div>\n <span\n *ngIf=\"!draggingInGroupArea\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/arrows-move.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div>{{ col.header }}</div>\n </div>\n </ng-template>\n <ng-template cdkDragPlaceholder>\n <div *ngIf=\"!draggingInGroupArea\">\n <div\n *ngTemplateOutlet=\"\n headerCell;\n context: {\n $implicit: col,\n index: i,\n section: ''\n }\n \"\n ></div>\n </div>\n <div\n *ngIf=\"draggingInGroupArea\"\n class=\"d-flex gap-2 ms-2\"\n style=\"opacity: 0.6\"\n >\n <ng-container\n *ngIf=\"col?.children?.length; else singleCol\"\n >\n <ng-container\n *ngFor=\"\n let child of col.children;\n let i = index;\n trackBy: trackByField\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: child,\n showChevron:\n col.children.length > 1 &&\n i != col.children.length - 1\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #singleCol>\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: col,\n showChevron: col?.children?.length > 1\n }\n \"\n ></ng-container>\n </ng-template>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n\n <!-- ********************************************************************************* -->\n <!-- ********************************************************************************* -->\n <!-- Data Grid Center Pinned Header starts here -->\n <!-- ********************************************************************************* -->\n <!-- ********************************************************************************* -->\n <div\n class=\"data-grid-header center-scrollable\"\n #centerPinnedHeader\n (scroll)=\"onCenterBodyScroll($event)\"\n id=\"center-pinned-header\"\n cdkDropList\n [cdkDropListConnectedTo]=\"\n showRowsGrouping ? ['rows-grouping-top-container'] : []\n \"\n [cdkDropListData]=\"centerColumns\"\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListSortingDisabled]=\"\n isDisableColumnGrouping && draggingInGroupArea\n \"\n (cdkDropListEntered)=\"onDropListEnter($event, 'center')\"\n (cdkDropListSorted)=\"onSortGroup($event, 'previewCenterColumns')\"\n (cdkDropListDropped)=\"onDropGroup()\"\n [style.maxWidth]=\"\n 'calc(100% - ' +\n (rightPinnedHeader.offsetWidth + leftPinnedHeader.offsetWidth) +\n 'px)'\n \"\n >\n <div\n *ngIf=\"groupedColumns?.length\"\n style=\"min-width: 200px\"\n class=\"h-100 align-items-center\"\n #columnsGroupedBox\n id=\"groupBoxHeaderDiv\"\n >\n <div\n class=\"d-flex w-100 justify-content-between align-items-center border-below\"\n [style.height.px]=\"\n showFilterRow ? headerRowHeight * 2 : headerRowHeight\n \"\n >\n <div class=\"ps-3\">Group</div>\n <div class=\"d-flex\">\n <div\n class=\"three-dots cursor-pointer\"\n (click)=\"\n openThreeDotsMenu($event, 'group');\n isThreeDotsFilterOpen = false\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/three-dots-vertical.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div\n (mousedown)=\"\n $event.stopPropagation(); onResizeGroupBox($event)\n \"\n class=\"resize-handle\"\n style=\"margin-right: -2px\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/resize-handle.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n </div>\n\n <div\n [style.height.px]=\"headerRowHeight\"\n class=\"border-below\"\n ></div>\n </div>\n <span\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\n style=\"min-width: 30px; height: 100%\"\n *ngIf=\"gridType === 'Assets' || gridType === 'Tasks'\"\n >\n </span>\n <div\n class=\"dragable-header\"\n (cdkDragStarted)=\"\n checkColumnGroupingStatus(col);\n dragStartOnGroup(col);\n onDragStarted(col)\n \"\n (cdkDragMoved)=\"onDragMoved($event)\"\n (cdkDragEnded)=\"onDragEnded()\"\n cdkDrag\n [cdkDragData]=\"col\"\n *ngFor=\"\n let col of centerColumns;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerCell;\n context: {\n $implicit: col,\n index: i,\n section: 'previewCenterColumns'\n }\n \"\n >\n </ng-container>\n <ng-template cdkDragPreview\n ><div class=\"p-2 border d-flex gap-2\">\n <div>\n <span\n *ngIf=\"!isOutsideContainer\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n (draggingInGroupArea\n ? 'data-grid/icons/justify.svg'\n : 'data-grid/icons/arrows-move.svg')\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n >\n </span>\n <span\n *ngIf=\"isOutsideContainer\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n >\n </span>\n </div>\n <div>{{ col.header }}</div>\n </div>\n </ng-template>\n <ng-template cdkDragPlaceholder>\n <div *ngIf=\"!draggingInGroupArea\">\n <div\n *ngTemplateOutlet=\"\n headerCell;\n context: {\n $implicit: col,\n index: i,\n section: 'centerColumns'\n }\n \"\n ></div>\n </div>\n <div\n *ngIf=\"draggingInGroupArea && !isOutsideContainer\"\n class=\"d-flex gap-2 ms-2\"\n style=\"opacity: 0.6\"\n >\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\n <ng-container\n *ngFor=\"\n let child of col.children;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container *ngIf=\"child?.is_groupable\">\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: child,\n showChevron:\n col.children.length > 1 &&\n i != col.children.length - 1\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #singleCol>\n <ng-container *ngIf=\"col?.is_groupable\">\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: col,\n showChevron: col?.children?.length > 1\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n </div>\n </ng-template>\n </div>\n </div>\n\n <!-- ********************************************************************************* -->\n <!-- ********************************************************************************* -->\n <!-- Data Grid Right Pinned Header starts here -->\n <!-- ********************************************************************************* -->\n <!-- ********************************************************************************* -->\n <div\n [style.backgroundColor]=\"headerBackgroundColor\"\n cdkDropList\n id=\"right-pinned-header\"\n [cdkDropListConnectedTo]=\"\n showRowsGrouping ? ['rows-grouping-top-container'] : []\n \"\n cdkDropListOrientation=\"horizontal\"\n class=\"data-grid-header right-pinned\"\n (cdkDropListSorted)=\"\n onSortGroup($event, 'previewRightPinnedColumns')\n \"\n (cdkDropListEntered)=\"onDropListEnter($event, 'right')\"\n (cdkDropListDropped)=\"onDropGroup()\"\n #rightPinnedHeader\n class=\"right-pinned-header d-flex\"\n style=\"min-width: 0.2px\"\n >\n <div\n class=\"dragable-header\"\n cdkDrag\n [cdkDragData]=\"col\"\n *ngFor=\"\n let col of rightPinnedColumns;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerCell;\n context: {\n $implicit: col,\n pinnedRight: true,\n index: i,\n section: 'right'\n }\n \"\n ></ng-container>\n <ng-template cdkDragPreview\n ><div class=\"p-2 border d-flex gap-2\">\n <div>\n <span\n *ngIf=\"!draggingInGroupArea\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/arrows-move.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div>{{ col.header }}</div>\n </div>\n </ng-template>\n <ng-template cdkDragPlaceholder>\n <div *ngIf=\"!draggingInGroupArea\">\n <div\n *ngTemplateOutlet=\"\n headerCell;\n context: {\n $implicit: col,\n index: i,\n section: 'right'\n }\n \"\n ></div>\n </div>\n <div\n *ngIf=\"draggingInGroupArea\"\n class=\"d-flex gap-2 ms-2\"\n style=\"opacity: 0.6\"\n >\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\n <ng-container\n *ngFor=\"\n let child of col.children;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: child,\n showChevron:\n col.children.length > 1 &&\n i != col.children.length - 1\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #singleCol>\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: col,\n showChevron: col?.children?.length > 1\n }\n \"\n ></ng-container>\n </ng-template>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n\n <!--########################################################################################################################################################################################################################### -->\n <!--########################################################################################################################################################################################################################### -->\n <!-- Data Grid Body starts here -->\n <!--########################################################################################################################################################################################################################### -->\n <!--########################################################################################################################################################################################################################### -->\n <div\n class=\"h-100 d-flex justify-content-center align-items-center\"\n *ngIf=\"!dataSet?.length && !loading && !dataSetLoading\"\n >\n <!-- <div\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/record-not-found.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></div> -->\n <div>No Record Found</div>\n </div>\n\n <div\n class=\"position-absolute w-100 h-100 d-flex justify-content-center align-items-center loading-overlay\"\n *ngIf=\"loading || dataSetLoading\"\n style=\"\n z-index: 999;\n backdrop-filter: blur(1px);\n \"\n [style.backgroundColor]=\"bodyBackgroundColor\"\n >\n <div class=\"spinner-border text-primary\" role=\"status\">\n <!-- <span class=\"loader\"></span> -->\n <!-- <span class=\"visually-hidden\">Loading...</span> -->\n <!-- </div> -->\n </div>\n </div>\n\n <div\n class=\"data-grid-body-wrapper position-relative d-flex\"\n [style.height]=\"bodyWrapperHeight\"\n style=\"overflow-y: auto; overflow-x: hidden\"\n #mainScroll\n (scroll)=\"onMainScroll($event)\"\n [style.scrollbarWidth]=\"verticalScrollbarWidth\"\n >\n <!-- LEFT PINNED -->\n <div\n [style.height.px]=\"\n !groupedColumns.length ? originalDataSet.length * rowHeight : 0\n \"\n ></div>\n <div [class.h-100]=\"originalDataSet.length < 8\">\n <div\n class=\"data-grid-body left-pinned-body w-100\"\n style=\"overflow-y: hidden\"\n [class.border-right]=\"hasLeftPinnedColumns\"\n [class.transparent-border-right]=\"!hasLeftPinnedColumns\"\n [style.transform]=\"'translateY(' + translateY + 'px)'\"\n [style.backgroundColor]=\"leftPinnedBackgroundColor\"\n [class.h-100]=\"originalDataSet.length < 8\"\n *ngIf=\"!loading && !dataSetLoading\"\n [@rowDynamic]=\"rowAnimation\"\n\n \n >\n <ng-container\n *ngFor=\"\n let row of visibleRows;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: row,\n columns: previewLeftPinnedColumns,\n isEven: (startIndex + i) % 2 === 0,\n isOdd: (startIndex + i) % 2 !== 0,\n isLeft: true,\n section: 'left',\n isTotalRow: false\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"showTotalAmountRow && originalDataSet?.length\">\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: { __virtualIndex: 0 },\n columns: previewLeftPinnedColumns,\n isEven: false,\n isOdd: false,\n section: 'left',\n isTotalRow: true\n }\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n\n <!-- CENTER -->\n <div\n class=\"h-100\"\n [style.width.px]=\"centerPinnedHeader.clientWidth\"\n [style.backgroundColor]=\"bodyBackgroundColor\"\n >\n <div\n class=\"data-grid-body center-scrollable\"\n [class.h-100]=\"originalDataSet.length < 8\"\n style=\"overflow-y: hidden; overflow-x: auto\"\n [style.transform]=\"'translateY(' + translateY + 'px)'\"\n [style.backgroundColor]=\"bodyBackgroundColor\"\n #centerScrollableBody\n (scroll)=\"onCenterBodyScroll($event)\"\n [style.boxShadow]=\"leftPinnedBoxshadow\"\n >\n <div [@rowDynamic]=\"rowAnimation\" *ngIf=\"!loading && !dataSetLoading\">\n <ng-container\n *ngFor=\"\n let row of visibleRows;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: row,\n columns: previewCenterColumns,\n isEven: (startIndex + i) % 2 === 0,\n isOdd: (startIndex + i) % 2 !== 0,\n section: 'center',\n isTotalRow: false\n }\n \"\n ></ng-container>\n </ng-container>\n </div>\n <ng-container *ngIf=\"showTotalAmountRow && originalDataSet?.length\">\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: { __virtualIndex: 0 },\n columns: previewCenterColumns,\n isEven: false,\n isOdd: false,\n section: 'center',\n isTotalRow: true\n }\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n\n <!-- RIGHT PINNED -->\n <div\n class=\"right-pinned-body-wrapper\"\n *ngIf=\"hasRightPinnedColumns\"\n [class.h-100]=\"originalDataSet.length < 8\"\n [style.maxWidth.px]=\"\n isScrollbarVisible\n ? rightPinnedHeader.offsetWidth - 15\n : rightPinnedHeader.offsetWidth\n \"\n [style.backgroundColor]=\"rightPinnedBackgroundColor\"\n [@rowDynamic]=\"rowAnimation\"\n >\n <div\n class=\"data-grid-body right-pinned-body w-100 h-100\"\n style=\"overflow-y: hidden\"\n [style.transform]=\"'translateY(' + translateY + 'px)'\"\n [style.boxShadow]=\"rightPinnedBoxshadow\"\n [style.backgroundColor]=\"rightPinnedBackgroundColor\"\n *ngIf=\"!loading && !dataSetLoading && hasRightPinnedColumns\"\n >\n <ng-container\n *ngFor=\"\n let row of visibleRows;\n let i = index;\n trackBy: trackById\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: row,\n columns: previewRightPinnedColumns,\n isEven: (startIndex + i) % 2 === 0,\n isOdd: (startIndex + i) % 2 !== 0,\n section: 'right',\n isTotalRow: false\n }\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"showTotalAmountRow && originalDataSet?.length\">\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: { __virtualIndex: 0 },\n columns: previewRightPinnedColumns,\n isEven: false,\n isOdd: false,\n section: 'right',\n isTotalRow: true\n }\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n\n <div\n style=\"top: auto; left: auto\"\n (click)=\"\n $event.stopPropagation();\n fullscreenImage = null;\n cdr.detectChanges()\n \"\n [style.width.px]=\"dataGridContainer.offsetWidth\"\n [style.height.px]=\"\n dataGridContainer.offsetHeight - (footerRowHeight + 100)\n \"\n class=\"image-modal full-image-modal\"\n *ngIf=\"fullscreenImage\"\n >\n <img\n (click)=\"$event.stopPropagation()\"\n [src]=\"fullscreenImage\"\n alt=\"Fullscreen Image\"\n />\n </div>\n <div\n *ngIf=\"selectedRows.size > 0 && showTaskbar\"\n class=\"taskbar w-100\"\n [style.bottom.px]=\"85\"\n >\n <div class=\"selected-rows-action-bar\" [@slideUp]>\n <span class=\"selected-count\">\n {{ selectedRows.size }} selected of\n {{\n paginationConfig.totalResults ||\n config?.paginationParams?.totalItems\n }}\n Total\n </span>\n <div class=\"action-buttons d-flex align-items-center\">\n <ng-container\n *ngFor=\"let action of taskbarActions; let i = index\"\n >\n <ng-container *ngIf=\"action?.has_permission\">\n <span\n class=\"action-btn verified btn {{ action }}\"\n (click)=\"onVerifyClick(action?.actionName)\"\n >{{ action?.actionName }}</span\n >\n <span\n *ngIf=\"\n taskbarActions.length > 1 &&\n i !== taskbarActions.length - 1 &&\n taskbarActions[i + 1]?.has_permission\n \"\n class=\"\"\n >|</span\n >\n </ng-container>\n </ng-container>\n <button (click)=\"clearSelectionState(tableType);selectedRows.clear();\" class=\"clear-btn ms-2 mt-2\">\n <i class=\"bi bi-x-circle\"></i> Clear Selection\n </button>\n </div>\n </div>\n </div>\n </div>\n <!-- Vertical Fake scroll Bar -->\n <!-- <div\n (scroll)=\"onMainFakeScroll($event)\"\n class=\"fake-scrollbar fake-scrollbar-vertical d-none\"\n [style.scrollbarWidth]=\"verticalScrollbarWidth\"\n [style.top.px]=\"\n showColumnsGrouping && showFilterRow\n ? headerRowHeight * 3\n : showColumnsGrouping || showFilterRow\n ? headerRowHeight * 2\n : headerRowHeight\n \"\n #fakeScroll\n [style.height]=\"bodyWrapperHeight\"\n style=\"\n overflow-y: auto;\n overflow-x: hidden;\n width: 17px;\n position: absolute;\n right: 0;\n background-color: f1f2f3;\n z-index: 10;\n \"\n >\n <div [style.height.px]=\"rowHeight * dataSetLength\"></div>\n </div> -->\n </div>\n\n <!-- Horizintal Fake Scrollbars -->\n <div\n class=\"d-flex justify-content-between\"\n *ngIf=\"hasScroll\"\n >\n <div\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\n class=\"fake-horizintal-scrollbar\"\n #fakeScroll\n [style.width.px]=\"leftPinnedHeader.offsetWidth\"\n style=\"overflow-x: scroll\"\n ></div>\n <div\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\n (scroll)=\"onCenterBodyScroll($event)\"\n class=\"fake-horizintal-scrollbar\"\n #horizintalFakeScroll\n [style.width.px]=\"centerPinnedHeader.offsetWidth\"\n >\n <div [style.width.px]=\"centerPinnedHeader.scrollWidth - 10\"></div>\n </div>\n <div\n [style.scrollbarWidth]=\"horizintalScrollbarWidth\"\n class=\"fake-horizintal-scrollbar\"\n #fakeScroll\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\n style=\"overflow-x: scroll\"\n ></div>\n </div>\n </div>\n\n <!-- Side Menu Implemented Here -->\n <div\n *ngIf=\"showSideMenu\"\n [style.width.px]=\"sideMenuVisible ? 280 : 30\"\n class=\"right-menu h-100\"\n [style.backgroundColor]=\"sidemenuBackgroundColor\"\n >\n <div class=\"h-100 d-flex flex-row-reverse\">\n <div\n style=\"width: 30px\"\n class=\"d-flex flex-column align-items-center cursor-pointer\"\n [class.border-start]=\"sideMenuVisible\"\n >\n <div\n (click)=\"toggleSideMenu('cols')\"\n [class.bg-fff]=\"\n currentOpenedSideMenue == 'cols' && sideMenuVisible\n \"\n [class.border-below]=\"sideMenuVisible\"\n class=\"columns-button d-flex flex-column align-items-center\"\n >\n <div>\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div class=\"side-menue-text\">Columns</div>\n </div>\n\n <div\n (click)=\"toggleSideMenu('filtrs')\"\n [class.bg-fff]=\"\n currentOpenedSideMenue == 'filtrs' && sideMenuVisible\n \"\n [class.border-below]=\"\n sideMenuVisible && currentOpenedSideMenue == 'filtrs'\n \"\n class=\"columns-button d-flex flex-column align-items-center\"\n >\n <div>\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div class=\"side-menue-text\">Filter</div>\n </div>\n </div>\n <div\n class=\"h-100\"\n *ngIf=\"sideMenuVisible\"\n [ngStyle]=\"{ width: sideMenuVisible ? '250px' : '' }\"\n >\n <div class=\"h-100\">\n <ng-container\n *ngIf=\"currentOpenedSideMenue == 'cols' && sideMenuVisible\"\n >\n <ng-container *ngTemplateOutlet=\"columnPannel\"></ng-container>\n <!-- Column Items -->\n <div class=\"column-panel-body px-3\">\n <ng-container\n *ngFor=\"let col of columns; trackBy: trackByField\"\n >\n <ng-container\n *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\n ></ng-container>\n </ng-container>\n </div>\n <hr />\n\n <div class=\"side-menu-row-groups\" style=\"height: 30%\">\n <ng-container\n *ngTemplateOutlet=\"sideMenuRowGroups\"\n ></ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"currentOpenedSideMenue == 'filtrs' && sideMenuVisible\"\n >\n <ng-container *ngTemplateOutlet=\"sideFilters\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div\n [style.height.px]=\"footerRowHeight\"\n class=\"border-top\"\n [style.backgroundColor]=\"footerRowBackgroundColor\"\n >\n <!-- Rows: <span class=\"fw-500 ms-1\">{{ dataSet.length }}</span> -->\n\n <div\n class=\"pagination-container\"\n [style.height.px]=\"footerRowHeight\"\n [style.padding.px]=\"footerPadding\"\n >\n <div class=\"page-size\">\n <select\n [(ngModel)]=\"paginationConfig.limit\"\n (change)=\"onPageSizeChange()\"\n >\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">\n {{ size }}\n </option>\n </select>\n <span class=\"separator\"> per page </span>\n </div>\n\n <div class=\"page-info\">\n Results:\n {{ (paginationConfig.page - 1) * paginationConfig.limit + 1 }}-{{\n paginationConfig.page * paginationConfig.limit <\n paginationConfig.totalResults\n ? paginationConfig.page * paginationConfig.limit\n : paginationConfig.totalResults\n }}\n of\n {{ paginationConfig.totalResults }}\n </div>\n\n <div class=\"page-buttons\">\n <button\n (click)=\"goToPage(paginationConfig.page - 1)\"\n [disabled]=\"paginationConfig.page === 1\"\n >\n ‹\n </button>\n\n <ng-container *ngFor=\"let page of visiblePages\">\n <button\n *ngIf=\"page !== '...'\"\n (click)=\"goToPage(page)\"\n [class.active]=\"page === paginationConfig.page\"\n >\n {{ page }}\n </button>\n <span *ngIf=\"page === '...'\">...</span>\n </ng-container>\n\n <button\n (click)=\"goToPage(paginationConfig.page + 1)\"\n [disabled]=\"paginationConfig.page === paginationConfig.totalResults\"\n >\n ›\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\n<!-- Header Cell Template -->\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\n\n<ng-template\n #headerCell\n let-col\n let-pinnedRight=\"pinnedRight\"\n let-i=\"index\"\n let-sections=\"section\"\n let-calledFromNestedPlaceholder=\"calledFromNestedPlaceholder\"\n>\n <div>\n <!-- Group Header -->\n <ng-container *ngIf=\"col.children?.length > 0; else flatHeader\">\n <div cdkDroplistGroup class=\"group-column-wrapper\">\n <!-- Parent Header -->\n <div\n *ngIf=\"shouldTheGroupHeaderShow(col)\"\n class=\"header-cell group-header\"\n [style.height.px]=\"headerRowHeight\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n [class.border-right]=\"showVerticalBorder\"\n [style.gridColumn]=\"'span ' + col.children.length\"\n [style.fontWeight]=\"headerFontWeight\"\n [class.flex-row-reverse]=\"pinnedRight\"\n [class.justify-content-end]=\"pinnedRight\"\n style=\"grid-row: 1\"\n >\n <div\n class=\"group-header-content\"\n [title]=\"col.header\"\n [class.ms-2]=\"pinnedRight\"\n >\n {{ col.header }}\n </div>\n <div\n class=\"resize-handle\"\n (dblclick)=\"autosizeColumn(col.children)\"\n (mousedown)=\"\n $event.stopPropagation(); onResizeGroup($event, col, pinnedRight)\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n\n <!-- Child Headers and Filters -->\n\n <div\n class=\"d-flex\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"col.children\"\n (cdkDropListSorted)=\"onChildDroplistSorted($event, sections)\"\n (cdkDropListDropped)=\"onChildDroplistDroped($event)\"\n [cdkDropListSortingDisabled]=\"false\"\n [cdkDropListConnectedTo]=\"\n showRowsGrouping ? ['rows-grouping-top-container'] : []\n \"\n >\n <div\n cdkDrag\n [cdkDragData]=\"child\"\n *ngFor=\"let child of col.children; let i = index\"\n >\n <!-- Child Header -->\n <ng-container *ngIf=\"child.is_visible && !child['isRowGrouped']\">\n <div\n cdkDragHandle\n class=\"header-cell one-row-header-cells cursor-pointer\"\n [class.border-right]=\"showVerticalBorder\"\n [attr.field]=\"child.field\"\n [style.width.px]=\"child.width\"\n [style.min-width.px]=\"child.width\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n [style.fontWeight]=\"headerFontWeight\"\n style=\"grid-row: 2\"\n [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(child)\"\n >\n <div\n class=\"d-flex justify-content-between h-100 align-items-center w-100\"\n >\n <div\n class=\"d-flex justify-content-between align-items-center w-100\"\n [class.flex-row-reverse]=\"pinnedRight\"\n >\n <div\n class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\n [title]=\"col.header\"\n [class.w-100]=\"pinnedRight\"\n >\n <div\n class=\"text-ellipsis h-100\"\n [class.editable-header]=\"child?.is_editable\"\n (click)=\"\n openThreeDotsMenu($event, child);\n openFilteronThreeDotsClick(child)\n \"\n >\n {{ child.header }}\n </div>\n </div>\n\n <div\n class=\"position-relative d-flex\"\n [class.flex-row-reverse]=\"pinnedRight\"\n >\n <div\n [class.me-2]=\"pinnedRight\"\n class=\"d-flex align-items-center\"\n *ngIf=\"child.pinned\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div\n class=\"three-dots p-1\"\n (click)=\"\n openThreeDotsMenu($event, child);\n isThreeDotsFilterOpen = false\n \"\n style=\"cursor: pointer\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/three-dots-vertical.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n\n <!-- Only show menu if this column is active -->\n <div\n class=\"position-absolute\"\n *ngIf=\"activeCol === child\"\n style=\"top: -50%; z-index: 21\"\n [style.left.px]=\"\n -(!child?.pinned ? centerPinnedHeader.scrollLeft : 0)\n \"\n [style.top.px]=\"\n isThreeDotsFilterOpen\n ? showFilterRow || showColumnsGrouping\n ? headerRowHeight * 2 - 10\n : headerRowHeight - 10\n : 0\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnMenu;\n context: {\n col: child,\n isNestedTable: false,\n section: sections\n }\n \"\n ></ng-container>\n </div>\n\n <div\n class=\"resize-handle\"\n (dblclick)=\"autosizeColumn(child)\"\n (mousedown)=\"\n $event.stopPropagation();\n onResizeColumn($event, child)\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/resize-handle.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Filter Cell -->\n <div\n *ngIf=\"showFilterRow\"\n [style.backgroundColor]=\"headerBackgroundColor\"\n class=\"header-cell filter-cell\"\n [class.border-right]=\"showVerticalBorder\"\n [attr.field]=\"child.field\"\n [style.width.px]=\"child.width\"\n [style.min-width.px]=\"child.width\"\n [style.height.px]=\"headerRowHeight\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n [class.border-right]=\"showVerticalBorder\"\n style=\"grid-row: 3\"\n >\n <div\n class=\"header-cell filter-cell\"\n [attr.field]=\"col.field\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [style.height.px]=\"headerRowHeight\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n >\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Filter\"\n [(ngModel)]=\"child.filterValue\"\n (ngModelChange)=\"onFilterChange(child)\"\n (paste)=\"onFilterChange(child); applyDropdownFilter()\"\n [readonly]=\"\n child?.type == 'dropdown' || child?.type == 'image'\n \"\n [class.disabled-search-input]=\"\n child?.type == 'dropdown' || child?.type == 'image'\n \"\n (click)=\"\n $event.stopPropagation();\n openFilterFromDisabledSearchedInput(child)\n \"\n (keydown.enter)=\"applyDropdownFilter()\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n <span\n class=\"filter-icon-wrapper\"\n (click)=\"$event.stopPropagation(); openFilter(child)\"\n [class.filter-applied]=\"isFilterAppliedOnColumn(child)\"\n [class.pe-none]=\"child?.type == 'image'\"\n ><span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n <span\n *ngIf=\"isFilterAppliedOnColumn(child)\"\n style=\"\n width: 7px;\n height: 7px;\n box-shadow: 0px 0px 3px #7486ff;\n background-color: rgb(0 163 233);\n position: absolute;\n right: 4px;\n top: 12px;\n \"\n class=\"rounded-circle d-block\"\n ></span\n ></span>\n\n <div\n class=\"position-absolute filter-row-filter-wrapper\"\n *ngIf=\"activeFilterCell?.field == child?.field\"\n style=\"top: 100%; right: 0; z-index: 99\"\n [style.left.px]=\"\n child?.pinned ? 0 : -centerPinnedHeader.scrollLeft\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"filterMenu; context: { col: child }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template cdkDragPreview\n ><div class=\"p-2 border d-flex gap-2\">\n <div\n *ngIf=\"\n !draggingInGroupArea ||\n (child.is_groupable && draggingInGroupArea)\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div *ngIf=\"draggingInGroupArea && !child.is_groupable\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/ban.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div>{{ child.header }}</div>\n </div>\n </ng-template>\n <ng-template cdkDragPlaceholder>\n <div *ngIf=\"!draggingInGroupArea\" class=\"position-relative\">\n <div\n *ngTemplateOutlet=\"\n childHeaderPlaceholder;\n context: {\n $implicit: child,\n index: i,\n sections: sections,\n calledFromNestedPlaceholder: true,\n }\n \"\n ></div>\n </div>\n <div\n *ngIf=\"draggingInGroupArea && child?.is_groupable\"\n class=\"d-flex gap-2 ms-2\"\n style=\"opacity: 0.6\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n topGroupingRowPlaceholder;\n context: {\n $implicit: child,\n showChevron: false,\n pinnedRight: pinnedRight,\n sections: sections,\n index: i\n }\n \"\n ></ng-container>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Flat Header || Single Header Cell-->\n <ng-template #flatHeader>\n <div\n class=\"group-column-wrapper\"\n *ngIf=\"col.is_visible && !col['isRowGrouped']\"\n >\n <!-- Full-height Header Cell (spans 2 rows visually) -->\n <div\n class=\"header-cell one-row-header-cells\"\n [attr.field]=\"col.field\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [class.border-right]=\"showVerticalBorder\"\n [style.min-height.px]=\"\n showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\n \"\n [style.height.px]=\"\n showColumnsGrouping ? headerRowHeight * 2 : headerRowHeight\n \"\n [style.fontWeight]=\"headerFontWeight\"\n style=\"grid-row: 1 / span 2\"\n >\n <div\n class=\"d-flex justify-content-between h-100 align-items-center w-100\"\n >\n <div\n class=\"d-flex justify-content-between w-100 align-items-center\"\n [class.flex-row-reverse]=\"pinnedRight\"\n >\n <div\n class=\"text-ellipsis h-100 d-flex align-items-center w-100\"\n [title]=\"col.header\"\n >\n <div\n class=\"text-ellipsis h-100 cursor-pointer\"\n [class.editable-header]=\"col?.is_editable\"\n [class.filter-applied-on-text]=\"isFilterAppliedOnColumn(col)\"\n (click)=\"\n openThreeDotsMenu($event, col);\n openFilteronThreeDotsClick(col)\n \"\n >\n {{ col.header }}\n </div>\n </div>\n\n <div\n class=\"position-relative d-flex\"\n [class.flex-row-reverse]=\"pinnedRight\"\n >\n <div\n [class.me-2]=\"pinnedRight\"\n class=\"d-flex align-items-center\"\n *ngIf=\"col?.pinned\">\n <span (click)=\"\n openThreeDotsMenu($event, col, false);\n isThreeDotsFilterOpen = false\n \"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/pin-blueIconNew.svg'\n \"\n class=\"data-grid-svg-icon setting_dropdown d-flex justify-content-center align-items-center pin_blue_icon\"\n ></span>\n </div>\n <!-- <div\n [class.me-2]=\"col.order_by\"\n class=\"d-flex align-items-center\"\n *ngIf=\"sortingConfig?.field == col.field\">\n <span\n *ngIf=\"sortingConfig?.order_by == 'asc'\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/selectedAscIcon.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center mt-1 cursor-pointer\"\n (click)=\"sortDesc(col)\"\n [class.active]=\"sortingConfig?.order_by === 'asc'\"\n ></span>\n <span\n *ngIf=\"sortingConfig?.order_by == 'desc'\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/selectedAscIcon.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center mt-1 cursor-pointer\"\n (click)=\"sortAsc(col)\"\n [class.active]=\"sortingConfig?.order_by === 'desc'\"\n ></span>\n </div> -->\n <div class=\"three-dots p-1 me-0\"\n (click)=\"openThreeDotsMenu($event, col, true);\"\n style=\"cursor: pointer\">\n <div *ngIf=\"sortingConfig?.field === col.field\" \n class=\"d-flex align-items-center\">\n \n <!-- Ascending Sort Icon -->\n <span\n *ngIf=\"sortingConfig?.order_by == 'asc'\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/selectedAscIcon.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center cursor-pointer\"\n (click)=\"openThreeDotsMenu($event, col, true)\"\n [class.active]=\"sortingConfig?.order_by === 'asc'\">\n </span>\n\n <!-- Descending Sort Icon -->\n <span\n *ngIf=\"sortingConfig?.order_by == 'desc'\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/selectedAscIcon.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center cursor-pointer rotated-180\"\n (click)=\"openThreeDotsMenu($event, col, true)\"\n [class.active]=\"sortingConfig?.order_by === 'desc'\">\n </span>\n </div>\n <span *ngIf=\"sortingConfig?.field !== col.field\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/sortingIconNew.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n (click)=\"openThreeDotsMenu($event, col, true)\">\n </span>\n </div>\n <div class=\"three-dots p-1\" *ngIf=\"!col?.pinned\"\n (click)=\"\n openThreeDotsMenu($event, col, false);\n isThreeDotsFilterOpen = false\n \"\n style=\"cursor: pointer\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/three-dots-vertical.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n\n <!-- Only show menu if this column is active -->\n <div\n class=\"position-absolute\"\n *ngIf=\"activeCol === col\"\n style=\"top: -50%; z-index: 21\"\n [style.left.px]=\"\n -(!col?.pinned ? centerPinnedHeader.scrollLeft : 0)\n \"\n [style.top.px]=\"\n isThreeDotsFilterOpen\n ? showFilterRow || showColumnsGrouping\n ? headerRowHeight * 2 - 10\n : headerRowHeight - 10\n : 0\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnMenu;\n context: {\n col: col,\n isNestedTable: false,\n section: sections\n }\n \"\n ></ng-container>\n </div>\n\n <div\n class=\"resize-handle\"\n [class.w-100]=\"col.pinned == 'right'\"\n (dblclick)=\"autosizeColumn(col)\"\n (mousedown)=\"\n $event.stopPropagation(); onResizeColumn($event, col)\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Filter Cell -->\n <div\n *ngIf=\"showFilterRow\"\n [style.backgroundColor]=\"headerBackgroundColor\"\n class=\"header-cell filter-cell\"\n [class.border-right]=\"showVerticalBorder\"\n [attr.field]=\"col.field\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [style.height.px]=\"headerRowHeight\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n >\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Filter\"\n [(ngModel)]=\"col.filterValue\"\n (ngModelChange)=\"onFilterChange(col)\"\n [readonly]=\"col?.type == 'dropdown' || col?.type == 'image'\"\n [class.disabled-search-input]=\"\n col?.type == 'dropdown' || col?.type == 'image'\n \"\n (paste)=\"onPasteInFilterRowSearch($event, col)\"\n (click)=\"\n $event.stopPropagation(); openFilterFromDisabledSearchedInput(col)\n \"\n (keydown.enter)=\"applyDropdownFilter()\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n <span\n class=\"filter-icon-wrapper\"\n (click)=\"$event.stopPropagation(); openFilter(col)\"\n [class.filter-applied]=\"isFilterAppliedOnColumn(col)\"\n [class.pe-none]=\"col?.type == 'image'\"\n ><span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n <span\n *ngIf=\"isFilterAppliedOnColumn(col)\"\n style=\"\n width: 7px;\n height: 7px;\n box-shadow: 0px 0px 3px #7486ff;\n background-color: rgb(0 163 233);\n position: absolute;\n right: 4px;\n top: 12px;\n \"\n class=\"rounded-circle d-block\"\n ></span\n ></span>\n\n <div\n class=\"position-absolute filter-row-filter-wrapper\"\n *ngIf=\"activeFilterCell === col\"\n style=\"top: 100%; right: 0; z-index: 99\"\n [style.left.px]=\"col?.pinned ? 0 : -centerPinnedHeader.scrollLeft\"\n >\n <ng-container\n *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</ng-template>\n\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\n<!-- Body Cell Template -->\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\n<!-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -->\n\n<ng-template\n #rowCell\n let-row\n let-columns=\"columns\"\n let-isEven=\"isEven\"\n let-isOdd=\"isOdd\"\n let-isLeftSection=\"isLeft\"\n let-section=\"section\"\n let-rowIndex=\"rowIndex\"\n let-isTotalRow=\"isTotalRow\"\n>\n <!-- Check if row is a group -->\n <ng-container\n *ngTemplateOutlet=\"groupRowTemplate; context: { $implicit: row, depth: 0 }\"\n ></ng-container>\n <ng-template #groupRowTemplate let-row let-depth=\"depth\">\n <ng-container *ngIf=\"row.isGroup; else regularRow\">\n <!-- Group Header -->\n <div\n class=\"group-header-row d-flex align-items-center\"\n [style.height.px]=\"rowHeight\"\n [class.border-below]=\"section !== 'center'\"\n [style.width]=\"\n section === 'center'\n ? (centerScrollableBody?.scrollWidth ?? 0) + 'px'\n : '100%'\n \"\n >\n <div\n *ngIf=\"section == 'left'\"\n class=\"h-100 d-flex\"\n [style.width.px]=\"leftPinnedHeader.offsetWidth - 1\"\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n >\n <div\n *ngIf=\"showSerialNumber\"\n style=\"width: 50px\"\n class=\"d-flex align-items-center h-100 border-right justify-content-end pe-2 s-no\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n [style.width.px]=\"55\"\n [style.cursor]=\"\n 'url(' +\n singleSpaAssetsPath +\n 'data-grid/icons/arrow-right.svg), auto'\n \"\n (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\n (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\n [style.color]=\"checkboxesColor\"\n >\n {{ getStartIndex() + (row.__virtualIndex - 1) || \"\" }}\n </div>\n <div\n *ngIf=\"showCheckboxes\"\n style=\"width: 50px\"\n class=\"d-flex align-items-center justify-content-center h-100 border-right\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n [class.left-selection-border]=\"\n rowSelectedIndexes.has(row.__virtualIndex)\n \"\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\n [style.color]=\"checkboxesColor\"\n >\n <input\n style=\"width: 16px; height: 16px\"\n type=\"checkbox\"\n [checked]=\"getGroupCheckedState(row) === true\"\n [indeterminate]=\"getGroupCheckedState(row) === undefined\"\n (change)=\"selectGroupRow($event, row)\"\n />\n\n </div>\n </div>\n\n <div\n *ngIf=\"section == 'center'\"\n [style.width.px]=\"centerPinnedHeader.scrollWidth\"\n [style.minWidth.px]=\"centerPinnedHeader.scrollWidth\"\n class=\"d-flex align-items-center ps-2 h-100 border-below\"\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\n >\n <div\n class=\"d-flex align-items-center justify-content-between\"\n [style.paddingLeft.px]=\"depth > 0 ? depth * 30 : 0\"\n >\n <span class=\"me-2 filter-icon-wrapper\" (click)=\"toggleExpand(row)\">\n <span\n class=\"data-grid-svg-icon align-items-center d-flex\"\n [inlineSVG]=\"\n row.isExpand\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n ></span>\n </span>\n <strong (click)=\"toggleExpand(row)\" class=\"cursor-pointer\">\n {{ row.groupValue }} ({{ countLeafRows(row) }})\n </strong>\n </div>\n </div>\n\n <div\n *ngIf=\"section == 'right'\"\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\n ></div>\n </div>\n\n <!-- Recursive Children -->\n <div class=\"group-children\" *ngIf=\"row.isExpand\" [@slideToggle]>\n <ng-container\n *ngFor=\"let child of row.children; let i = index; trackBy: trackById\"\n >\n <ng-container *ngIf=\"child.isGroup; else dataRow\">\n <!-- Recursive call for nested group -->\n <ng-container\n *ngTemplateOutlet=\"\n groupRowTemplate;\n context: { $implicit: child, depth: depth + 1 }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template #dataRow>\n <!-- Regular data row -->\n <ng-container\n *ngTemplateOutlet=\"\n rowCell;\n context: {\n $implicit: child,\n columns: columns,\n isEven: i % 2 === 0,\n isOdd: i % 2 !== 0,\n isLeft: isLeftSection,\n section: section,\n isTotalRow: isTotalRow\n }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n </ng-template>\n\n <!-- Regular row (not a group) -->\n <ng-template #regularRow>\n <div\n class=\"d-flex\"\n [style.height.px]=\"rowHeight\"\n [style.minHeight.px]=\"rowHeight\"\n [style.maxHeight.px]=\"rowHeight\"\n >\n <span\n class=\"d-flex align-items-center justify-content-center cursor-pointer border-below\"\n style=\"min-width: 30px; height: 100%\"\n *ngIf=\"\n section == 'center' && (gridType === 'Assets' || gridType === 'Tasks')\n \"\n [ngStyle]=\"{\n 'background-color': rowSelectedIndexes.has(row.__virtualIndex)\n ? null\n : getBackgroundColor(row, isEven, section)\n }\"\n [class.selected-cell]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\n >\n <span\n (click)=\"toggleDetailRowExpand(row)\"\n *ngIf=\"row?.detail?.result?.length || gridType === 'Tasks'\"\n class=\"data-grid-svg-icon filter-icon-wrapper\"\n [inlineSVG]=\"\n isDetailsExpanded(row)\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n ></span>\n </span>\n <div\n [style.min-width.px]=\"\n section == 'center' && groupedColumns?.length ? groupBoxPadding : 0\n \"\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\n (contextmenu)=\"onRightClick($event, row)\"\n [style.height.px]=\"rowHeight\"\n class=\"data-grid-row h-100\"\n [class.even-row]=\"isEven\"\n [class.odd-row]=\"isOdd\"\n [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowLeave()\"\n [ngStyle]=\"{\n 'background-color': getBackgroundColor(row, isEven, section)\n }\"\n [style.minHeight.px]=\"rowHeight\"\n [style.maxHeight.px]=\"rowHeight\"\n ></div>\n <div\n (contextmenu)=\"onRightClick($event, row)\"\n [style.height.px]=\"rowHeight\"\n class=\"data-grid-row\"\n [class.even-row]=\"isEven\"\n [class.odd-row]=\"isOdd\"\n [class.hovered-row]=\"hoveredRowId === (row._id || row.id)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowLeave()\"\n [ngStyle]=\"{\n 'background-color': getBackgroundColor(row, isEven, section)\n }\"\n >\n <div\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n class=\"select-all-checkbox-cell justify-content-end pe-2 s-no\"\n [style.width.px]=\"55\"\n *ngIf=\"isLeftSection && showSerialNumber\"\n [style.cursor]=\"\n 'url(' +\n singleSpaAssetsPath +\n 'data-grid/icons/arrow-right.svg), auto'\n \"\n (mousedown)=\"onRowMouseDown(row.__virtualIndex, $event)\"\n (mouseover)=\"onRowMouseOver(row.__virtualIndex, $event)\"\n [style.color]=\"checkboxesColor\"\n >\n {{ getStartIndex() + (row.__virtualIndex - 1) }}\n </div>\n <div\n class=\"border-below\"\n [style.backgroundColor]=\"\n rowSelectedIndexes.has(row.__virtualIndex)\n ? selectedRowsBackgroundColor\n : checkboxesBackgroundColor\n \"\n class=\"select-all-checkbox-cell border-below\"\n *ngIf=\"isLeftSection && showCheckboxes\"\n [class.left-selection-border]=\"\n rowSelectedIndexes.has(row.__virtualIndex)\n \"\n [class.first-row-selected]=\"firstSelectedRow === row.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row.__virtualIndex\"\n [style.minHeight.px]=\"rowHeight - 1\"\n [style.maxHeight.px]=\"rowHeight\"\n >\n <input\n *ngIf=\"hasAnyVisibleColumn\"\n style=\"width: 16px; height: 16px\"\n type=\"checkbox\"\n [checked]=\"isRowSelected(row)\"\n (change)=\"toggleRowSelection(row)\"\n />\n </div>\n\n <!-- Render all columns -->\n <ng-container\n *ngFor=\"\n let col of columns;\n trackBy: trackByField;\n let colIndex = index\n \"\n >\n <ng-container *ngIf=\"col.children?.length > 0; else flatColumn\">\n <ng-container\n *ngFor=\"\n let child of col.children;\n trackBy: trackByField;\n let subColIndex = index\n \"\n >\n <ng-container *ngIf=\"child?.is_visible && !child?.isRowGrouped\">\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate;\n context: {\n col: child,\n row: row,\n rowIndex: rowIndex,\n colIndex: colIndex,\n subColIndex: subColIndex,\n section: section,\n isTotalRow: isTotalRow\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #flatColumn>\n <ng-container *ngIf=\"col?.is_visible && !col?.isRowGrouped\">\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate;\n context: {\n col: col,\n row: row,\n rowIndex: rowIndex,\n colIndex: colIndex,\n subColIndex: null,\n section: section,\n isTotalRow: isTotalRow\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n </ng-container>\n </div>\n </div>\n\n <div\n [@slideToggle]\n *ngIf=\"section === 'left' && isDetailsExpanded(row)\"\n class=\"accordion-details\"\n style=\"max-height: 350px; overflow: hidden\"\n [style.maxHeight.px]=\"hasHorizontalScroll ? 339 : 341\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n leftRightNestedPlaceholder;\n context: { $implicit: row }\n \"\n >\n </ng-container>\n </div>\n\n <div\n [@slideToggle]\n *ngIf=\"section === 'center' && isDetailsExpanded(row)\"\n class=\"accordion-details center-section\"\n style=\"\n max-height: 350px;\n overflow-y: hidden;\n overflow-x: auto;\n scrollbar-width: thin;\n \"\n #nestedTable\n [style.width]=\"\n hasRightPinnedColumns\n ? '100%'\n : hasVerticalScroll\n ? 'calc(100% - 12px)'\n : '100%'\n \"\n >\n <ng-container *ngIf=\"gridType == 'Assets'\">\n <ng-container\n *ngTemplateOutlet=\"nestedTableTemplate; context: { $implicit: row }\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"gridType == 'Tasks'\">\n <ng-container\n *ngTemplateOutlet=\"\n taskManagementTemplate;\n context: { taskDetails: row }\n \"\n ></ng-container>\n </ng-container>\n </div>\n\n <div\n [@slideToggle]\n *ngIf=\"section === 'right' && isDetailsExpanded(row)\"\n class=\"accordion-details\"\n style=\"max-height: 350px; overflow: hidden\"\n [style.maxHeight.px]=\"hasHorizontalScroll ? 339 : 341\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n leftRightNestedPlaceholder;\n context: { $implicit: row }\n \"\n >\n </ng-container>\n </div>\n </ng-template>\n</ng-template>\n\n<!-- Actual Cell is Here -->\n<ng-template\n #cellTemplate\n let-col=\"col\"\n let-row=\"row\"\n let-section=\"section\"\n let-subColIndex=\"subColIndex\"\n let-rowIndex=\"rowIndex\"\n let-colIndex=\"colIndex\"\n let-isTotalRow=\"isTotalRow\"\n>\n <div\n #cellContainer\n (click)=\"\n editingKey = ''; setActiveCell(row, col); collapseAllExpandedCells()\n \"\n [style.fontWeight]=\"bodyFontWeight\"\n [class.border-right]=\"showVerticalBorder\"\n class=\"cell overflow-visible position-relative data-grid-cell\"\n [attr.field]=\"col.field\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [style.fontSize.px]=\"bodyTextFontsSize\"\n [style.minHeight.px]=\"rowHeight\"\n [style.maxHeight.px]=\"rowHeight\"\n [class.active-cell]=\"\n isActiveCell(row, col) && !isEditing(row, col) && selectedKeys.size == 1\n \"\n (dblclick)=\"\n $event.stopPropagation();\n $event.preventDefault();\n enableEdit(row, col, false, cellContainer)\n \"\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\n [class.first-row-selected]=\"firstSelectedRow === row?.__virtualIndex\"\n [class.last-row-selected]=\"lastSelectedRow === row?.__virtualIndex\"\n tabindex=\"-1\"\n (keydown.enter)=\"$event.preventDefault(); enableEdit(row, col)\"\n (mousedown)=\"\n startSelection(\n row.__virtualIndex,\n colIndex,\n subColIndex ?? 0,\n col.field,\n $event,\n section\n )\n \"\n (mouseenter)=\"\n extendSelection(\n row.__virtualIndex,\n colIndex,\n subColIndex ?? 0,\n col.field,\n $event,\n section\n )\n \"\n (mouseup)=\"endSelection()\"\n [class.selected-cell]=\"\n isSelected(\n row.__virtualIndex,\n colIndex,\n subColIndex ?? 0,\n col.field,\n section\n )\n \"\n [class.top-border]=\"\n isTopBorder(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.bottom-border]=\"\n isBottomBorder(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.left-border]=\"\n isLeftBorder(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.right-border]=\"\n isRightBorder(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.top-left-corner]=\"\n isTopLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.top-right-corner]=\"\n isTopRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.bottom-left-corner]=\"\n isBottomLeftCorner(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n [class.bottom-right-corner]=\"\n isBottomRightCorner(row.__virtualIndex, colIndex, subColIndex, section)\n \"\n >\n <!-- (mousedown)=\"startSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\n (mouseenter)=\"extendSelection(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field, $event)\"\n (mouseup)=\"endSelection()\"\n [class.selected-cell]=\"isSelected(row.__virtualIndex, colIndex, subColIndex ?? 0, col.field)\" -->\n <div\n class=\"table-cell\"\n [class.active-for-editing]=\"\n isEditing(row, col) &&\n (getNestedValue(row, col.field)?.length === undefined ||\n getNestedValue(row, col.field)?.length <= 50)\n \"\n >\n <div\n (click)=\"$event.stopPropagation()\"\n *ngIf=\"\n isEditing(row, col) &&\n (getNestedValue(row, col.field)?.length === undefined ||\n (getNestedValue(row, col.field)?.length <= 50 &&\n !expandedCells.size));\n else viewMode\n \"\n >\n <ng-container [ngSwitch]=\"col.type\">\n <!-- Text Input -->\n <input\n [style.height.px]=\"rowHeight - 10\"\n *ngSwitchCase=\"'input'\"\n type=\"text\"\n [(ngModel)]=\"row[col.field]\"\n (blur)=\"disableEdit(row, col)\"\n autofocus\n class=\"form-control form-control-sm\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n\n <!-- Number Input -->\n <input\n [style.height.px]=\"rowHeight - 8\"\n *ngSwitchCase=\"'number'\"\n #numberInput=\"ngModel\"\n #numberRef\n (keypress)=\"allowOnlyNumbers($event)\"\n type=\"number\"\n required\n [(ngModel)]=\"row[col.field]\"\n (blur)=\"disableEdit(row, col)\"\n autofocus\n (keydown.enter)=\"numberRef.blur()\"\n class=\"form-control form-control-sm\"\n [ngClass]=\"{\n 'is-invalid': numberInput.invalid\n }\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n\n <!-- Date Input -->\n <input\n [style.height.px]=\"rowHeight - 8\"\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n [(ngModel)]=\"row[col.field]\"\n (blur)=\"disableEdit(row, col)\"\n autofocus\n class=\"form-control form-control-sm\"\n #dateInput=\"ngModel\"\n [ngClass]=\"{\n 'is-invalid': dateInput.invalid\n }\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n\n <!-- Dropdown -->\n <!-- ng-select like dropdown -->\n <div\n *ngSwitchCase=\"'dropdown'\"\n class=\"dropdown w-100\"\n (blur)=\"disableEdit(row, col)\"\n >\n <!-- Trigger -->\n <button\n class=\"form-select form-select-sm text-start w-100 text-ellipsis\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n aria-expanded=\"false\"\n [style.minHeight.px]=\"rowHeight - 10\"\n data-bs-display=\"static\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ng-container>\n {{\n getNestedValue(row, col.field)?.value ||\n getNestedValue(row, col.field)?.name ||\n getNestedValue(row, col.field)\n }}\n </ng-container>\n <ng-template #placeholder> Select options... </ng-template>\n </button>\n\n <!-- Menu -->\n <div\n class=\"dropdown-menu w-100 p-0 cell-editing-dropdown-menu rounded-3\"\n [class.show]=\"isEditing(row, col)\"\n >\n <!-- Search -->\n <div class=\"px-2 py-1 editing-dropdown-search-input\">\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Search...\"\n [(ngModel)]=\"editinDropdownSearch\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n </div>\n\n <!-- Options -->\n <!-- <div\n class=\"cell-editin-dropdown\"\n style=\"max-height: 200px; overflow: auto\"\n >\n <div\n (click)=\"\n setNestedValue(row, col, option, true); editingKey = null\n \"\n class=\"px-2 py-1 d-flex align-items-center deopdown-item\"\n *ngFor=\"\n let option of col.column_dropdown_value\n | filter : editinDropdownSearch: 'value'\n \"\n >\n <label\n class=\"form-check-label d-flex align-items-center mb-0 cursor-pointer\"\n [for]=\"col.field + '-' + option.value || option\"\n >\n {{ option.value || option }}\n </label>\n </div>\n </div> -->\n <cdk-virtual-scroll-viewport \n itemSize=\"35\" \n class=\"dropdown-viewport\"\n style=\"height: 120px\"\n >\n <div\n class=\"px-2 py-1 d-flex align-items-center dropdown-item\"\n *cdkVirtualFor=\"\n let option of col.column_dropdown_value \n | filter : editinDropdownSearch : 'value'\n \"\n (click)=\"setNestedValue(row, col, option, true); editingKey = null\"\n >\n <label\n class=\"form-check-label d-flex align-items-center mb-0 cursor-pointer\"\n [for]=\"col.field + '-' + (option.value || option)\"\n >\n {{ option.value || option }}\n </label>\n </div>\n </cdk-virtual-scroll-viewport>\n\n </div>\n </div>\n\n <input\n *ngSwitchCase=\"'email'\"\n [style.height.px]=\"rowHeight - 10\"\n [style.maxHeight.px]=\"rowHeight - 10\"\n #emailModel=\"ngModel\"\n #emailInput\n type=\"email\"\n [(ngModel)]=\"row[col.field]\"\n name=\"{{ col.field }}\"\n required\n pattern=\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\n (blur)=\"disableEdit(row, col, emailModel)\"\n (keydown.enter)=\"\n emailModel.control.markAsTouched(); emailInput.blur()\n \"\n autofocus\n class=\"form-control form-control-sm\"\n [ngClass]=\"{\n 'is-invalid': emailModel.invalid\n }\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n <!-- Default fallback -->\n <input\n *ngSwitchDefault\n [style.height.px]=\"rowHeight - 10\"\n [style.maxHeight.px]=\"rowHeight - 10\"\n #textModel=\"ngModel\"\n #textInput\n type=\"text\"\n [(ngModel)]=\"row[col.field]\"\n name=\"{{ col.field }}\"\n required\n (blur)=\"disableEdit(row, col, textModel)\"\n (keydown.enter)=\"\n textModel.control.markAsTouched(); textInput.blur()\n \"\n autofocus\n class=\"form-control form-control-sm\"\n [ngClass]=\"{\n 'is-invalid': textModel.invalid\n }\"\n (mousedown)=\"$event.stopPropagation()\"\n />\n </ng-container>\n </div>\n\n <!-- Display mode -->\n <ng-template #viewMode>\n <div\n class=\"d-flex justify-content-between align-items-center overflow-hidden\"\n [ngClass]=\"getCellClasses(col, getNestedValue(row, col.field))\"\n >\n <!-- Field icon (for Tasks grid) -->\n <ng-container\n *ngIf=\"gridType === 'Tasks' && iconMap[col.field] && !isTotalRow\"\n >\n <span\n class=\"cursor-pointer me-2\"\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\n [inlineSVG]=\"iconMap[col.field](row, col)\"\n ></span>\n </ng-container>\n\n <!-- ✅ Custom cell renderer support -->\n <ng-container *ngIf=\"col.cellRenderer; else defaultCell\">\n <ng-container\n [cellRenderInit]=\"col.cellRenderer\"\n [rowData]=\"row\"\n [colData]=\"col\"\n [cellValue]=\"getNestedValue(row, col?.field)\"\n (cellEvent)=\"onCellEvent($event)\"\n >\n </ng-container>\n </ng-container>\n\n <!-- 🧾 Default text-based cell rendering -->\n <ng-template #defaultCell>\n <div\n #cellText\n class=\"text-ellipsis flex-grow-1\"\n [title]=\"getCellTitle(row, col)\"\n >\n <!-- Normal cell -->\n <ng-container\n *ngIf=\"\n col.type !== 'image' &&\n col.field != 'image' &&\n col.field != 'invoice.invoice_image' &&\n !isTotalRow\n \"\n >\n <ng-container *ngIf=\"col.is_amount\">{{\n currencySymbol\n }}</ng-container>\n {{getCellTitle(row, col)}}\n </ng-container>\n\n <!-- Total row -->\n <ng-container *ngIf=\"isTotalRow\">\n {{ getTotalAmount(col) }}\n </ng-container>\n\n <!-- Invoice Image -->\n <ng-container *ngIf=\"col.field == 'invoice.invoice_image'\">\n <div style=\"display: flex; align-items: center; zoom: 0.7\">\n <span\n title=\"{{ getNestedValue(row, col.field) || 'Attachment' }}\"\n (click)=\"downloadAttchment(getNestedValue(row, col.field))\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/document-icons/' +\n getExtention(getNestedValue(row, col.field)) +\n '.svg'\n \"\n ></span>\n </div>\n </ng-container>\n\n <!-- Image cell -->\n <ng-container *ngIf=\"col.type == 'image' && !isTotalRow\">\n <ng-container\n *ngTemplateOutlet=\"\n defaultImagePlaceholder;\n context: { row: row, col: col }\n \"\n ></ng-container>\n </ng-container>\n </div>\n <span\n *ngIf=\"\n (!col?.cellRenderer && showCellDetailsBox &&\n getNestedValue(row, col.field)?.length > 50 && col.type !== 'image') ||\n (isNestedValueArray(row, col.field) &&\n getNestedValue(row, col.field)?.length > 1)\n \"\n class=\"toggle-icon data-grid-svg-icon ms-2 cursor-pointer\"\n [inlineSVG]=\"\n isExpanded(row, col)\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n (click)=\"\n $event.stopPropagation();\n toggleExpandOfLongCellText(row, col, columns, true)\n \"\n (dblclick)=\"$event.preventDefault(); $event.stopPropagation()\"\n ></span>\n </ng-template>\n <!-- Expand / Collapse icon -->\n </div>\n\n <!-- Expanded text -->\n <div\n class=\"position-absolute w-100 expanded-box\"\n *ngIf=\"isExpanded(row, col)\"\n [style.zIndex]=\"getZIndex(row, col)\"\n style=\"top: 100%; left: 0\"\n [attr.id]=\"(row.id || row._id) + '-' + (col.id || col._id)\"\n [class.invisible]=\"!showDetailsBox\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n fullTextTemplate;\n context: {\n row: row,\n col: col,\n isArray: isNestedValueArray(row, col.field)\n }\n \"\n ></ng-container>\n </div>\n </ng-template>\n </div>\n </div>\n</ng-template>\n\n<!-- Headers Action List On clicking three dots -->\n\n<ng-template\n #columnMenu\n let-col=\"col\"\n let-isNestedTable=\"isNestedTable\"\n let-columns=\"columns\"\n let-section=\"section\"\n>\n <div\n class=\"column-menu three-dots-col-menu\"\n [class.visually-hidden]=\"isMenueHidden\"\n *ngIf=\"activeCol && !isThreeDotsFilterOpen\"\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\n (click)=\"$event.stopPropagation()\"\n [style.color]=\"headerTextColor\"\n >\n <!-- Sort Ascending -->\n <ng-container *ngIf=\"clickedOnSortIcon\">\n <div class=\"pb-2 sorting_dropdown\" [class.disable-sorting]=\"!col.is_sortable\">\n <!-- <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span> -->\n <div\n *ngIf=\"\n columnThreedotsMunuConfig?.showAscending &&\n (sortingConfig?.field != col.field ||\n sortingConfig?.order_by == 'desc')\n \"\n class=\"column-menu-item\" [class.active-sort]=\"activeFilterType === 'Ascending'\"\n (click)=\"sortAsc(activeCol);activeFilter('Ascending')\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/headerSortingIcon.svg'\"\n class=\"data-grid-svg-icon me-2 setting_dropdown\"\n ></span>\n Sort Ascending\n <span *ngIf=\"sortingConfig?.field === col.field && sortingConfig?.order_by === 'asc'\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/tickIconNew.svg'\"\n class=\"svg-icon svg-icon-2 mb-1\" style=\"margin-left: auto;\"\n ></span>\n </div>\n\n <!-- Sort Descending -->\n <div\n *ngIf=\"\n columnThreedotsMunuConfig?.showDescending &&\n (sortingConfig?.field != col.field ||\n sortingConfig?.order_by == 'asc')\n \"\n class=\"column-menu-item\" [class.active-sort]=\"activeFilterType === 'Descending'\"\n (click)=\"sortDesc(activeCol);activeFilter('Descending')\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/headerSortingIcon1.svg'\"\n class=\"data-grid-svg-icon me-2 setting_dropdown\"\n ></span>\n Sort Descending\n <span *ngIf=\"sortingConfig?.field === col.field && sortingConfig?.order_by === 'desc'\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/tickIconNew.svg'\"\n class=\"svg-icon svg-icon-2 mb-1\" style=\"margin-left: auto;\"\n ></span>\n </div>\n\n <div\n *ngIf=\"\n sortingConfig?.field === col.field &&\n (sortingConfig?.order_by === 'asc' ||\n sortingConfig?.order_by === 'desc')\n \"\n class=\"column-menu-item\"\n (click)=\"resetSort(activeCol)\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/resetSortIconNew.svg'\n \"\n class=\"data-grid-svg-icon me-2 setting_dropdown\"\n ></span>\n Reset Sort\n </div>\n </div>\n </ng-container>\n <!-- <div class=\"py-2 border-below three-dots-filter\">\n <div\n *ngIf=\"columnThreedotsMunuConfig?.showFilter\"\n class=\"column-menu-item three-dots-filter\"\n (click)=\"openFilteronThreeDotsClick(col)\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n Filter\n </div>\n </div> -->\n\n <ng-container *ngIf=\"!clickedOnSortIcon\">\n <div class=\"py-2 sorting_dropdown\">\n <!-- <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span> -->\n <div\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\n class=\"column-menu-item\"\n (click)=\"\n $event.stopPropagation();\n updateColumnPinInSourceByField(\n activeCol,\n 'left',\n isNestedTable,\n columns\n )\n \"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pinLeftIconNew.svg'\"\n class=\"data-grid-svg-icon me-2 setting_dropdown\"\n ></span\n >Pin Left\n </div>\n\n <div\n *ngIf=\"\n columnThreedotsMunuConfig?.showPinright && col?.pinned !== 'right'\n \"\n class=\"column-menu-item\"\n (click)=\"\n $event.stopPropagation();\n updateColumnPinInSourceByField(\n activeCol,\n 'right',\n isNestedTable,\n columns\n )\n \"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pinRightIconNew.svg'\"\n class=\"data-grid-svg-icon data-grid-svg-icon me-2 setting_dropdown\"\n ></span\n >Pin Right\n </div>\n\n <div\n *ngIf=\"col?.pinned\"\n class=\"column-menu-item\"\n (click)=\"\n $event.stopPropagation();\n updateColumnPinInSourceByField(\n activeCol,\n null,\n isNestedTable,\n columns\n )\n \"\n >\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/layout-three-columns.svg'\"\n class=\"data-grid-svg-icon me-2 setting_dropdown d-flex align-items-center justify-content-center\"\n ></span\n >Unpin\n </div>\n </div>\n </ng-container>\n <!-- <div\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeThisColumn\"\n class=\"column-menu-item\"\n (click)=\"autosizeColumn(activeCol)\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/arrows-expand-vertical.svg'\n \"\n class=\"me-2\"\n ></span>\n Autosize This Column\n </div> -->\n\n <!-- Autosize All Columns -->\n <!-- <div\n *ngIf=\"columnThreedotsMunuConfig?.showAutosizeAllColumns\"\n class=\"column-menu-item\"\n (click)=\"autosizeAllColumns()\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/arrows-angle-expand.svg'\n \"\n class=\"data-grid-svg-icon me-2\"\n ></span\n >Autosize All Columns\n </div> -->\n\n <!-- Group By -->\n <div\n *ngIf=\"showRowsGrouping\"\n class=\"column-menu-item\"\n (click)=\"groupBy(activeCol)\"\n [class.disable-sorting]=\"!col.is_groupable\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/diagram-3.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n Group by {{ col.header }}\n </div>\n\n <!-- Choose Columns -->\n <div\n *ngIf=\"columnThreedotsMunuConfig?.showChoseColumns\"\n class=\"column-menu-item\"\n (click)=\"chooseColumns()\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n Choose Columns\n </div>\n\n <!-- Reset Columns -->\n <div\n *ngIf=\"columnThreedotsMunuConfig?.showResetColumns\"\n class=\"column-menu-item\"\n (click)=\"resetColumns()\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\n \"\n class=\"data-grid-svg-icon me-2\"\n ></span\n >Reset Columns\n </div>\n </div>\n <div\n @slideToggle\n *ngIf=\"isThreeDotsFilterOpen\"\n class=\"three-dots-col-menu position-relative\"\n [style.right.px]=\"section == 'right' ? null : col.width - 45\"\n [class.visually-hidden]=\"isMenueHidden\"\n >\n <ng-container\n *ngTemplateOutlet=\"filterMenu; context: { col: col }\"\n ></ng-container>\n </div>\n</ng-template>\n\n<!-- Filter Menue -->\n<ng-template #filterMenu let-col=\"col\">\n <div\n class=\"filter-menu-container filter-menu\"\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\n >\n <!-- Dropdown Type -->\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\n <div class=\"filter-dropdown-section p-1\">\n <input\n class=\"form-control form-control-sm\"\n placeholder=\"Search...\"\n type=\"search\"\n [(ngModel)]=\"addFilterColumnInput\"\n />\n\n <div class=\"form-check mb-1 mt-2 ps-4 ms-1\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [checked]=\"isAllSideFilterOptionsSelected(col)\"\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\n id=\"selectAll_{{ col.field }}\"\n />\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\n Select All\n </label>\n </div>\n\n <!-- <div class=\"dropdown-options ps-1\">\n <div\n class=\"form-check mb-1\"\n *ngFor=\"\n let option of selectedColumnForFilter?.column_dropdown_value\n | filter : addFilterColumnInput : 'value';\n trackBy: trackById;\n let i = index\n \"\n >\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [id]=\"i\"\n [checked]=\"\n currentFilterSelectedIds.has(option?.id ?? option?._id ?? option)\n \"\n (change)=\"toggleSelectionInFilter(option)\"\n />\n <label class=\"form-check-label fw-semibold\" [for]=\"i\">\n {{ option?.value ?? option?.name ?? option }}\n </label>\n </div>\n </div> -->\n <cdk-virtual-scroll-viewport\n itemSize=\"32\"\n class=\"filter-viewport\"\n style=\"height: 120px\"\n >\n <div\n class=\"form-check mb-1 ms-1\"\n *cdkVirtualFor=\"\n let option of selectedColumnForFilter?.column_dropdown_value\n | filter : addFilterColumnInput : 'value';\n trackBy: trackById\n \"\n >\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [id]=\"option?.id ?? option?._id ?? option\"\n [checked]=\"\n currentFilterSelectedIds.has(option?.id ?? option?._id ?? option)\n \"\n (change)=\"toggleSelectionInFilter(option)\"\n />\n\n <label\n class=\"form-check-label fw-semibold\"\n [for]=\"option?.id ?? option?._id ?? option\"\n >\n {{ option?.value ?? option?.name ?? option }}\n </label>\n </div>\n </cdk-virtual-scroll-viewport>\n </div>\n </ng-container>\n\n <!-- Text Filter Section -->\n <ng-template #textFilter>\n <div class=\"filter-text-section\">\n <div class=\"form-group mb-2\">\n <select\n class=\"form-select form-select-sm custom-select\"\n [(ngModel)]=\"firstCondition\"\n >\n <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\n <option value=\"contain\">Contains</option>\n <option value=\"does_not_contain\">Does Not Contain</option>\n <option value=\"equal\">Equals</option>\n <option value=\"before\">Starts With</option>\n <option value=\"after\">Ends With</option>\n </ng-container>\n\n <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\n <option value=\"equal\">Equals To</option>\n <option value=\"not_equal\">Not Equal</option>\n <option value=\"after\">After</option>\n <option value=\"before\">Before</option>\n </ng-container>\n </select>\n </div>\n\n <input\n [type]=\"col.type == 'string' ? 'text' : col.type\"\n class=\"form-control form-control-sm mb-3\"\n placeholder=\"Value\"\n [(ngModel)]=\"firstValue\"\n #filterMenueTextchInput\n (keydown.enter)=\"applyDropdownFilter()\"\n />\n\n <div class=\"form-group mb-3 d-flex flex-row\">\n <div\n class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input filter-radio-inputs\"\n type=\"radio\"\n name=\"condition\"\n [(ngModel)]=\"condition\"\n value=\"and\"\n id=\"and_{{ col.field }}\"\n (change)=\"cdr.detectChanges()\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"and_{{ col.field }}\"\n >AND</label\n >\n </div>\n <div\n class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1 gap-1\"\n >\n <input\n class=\"form-check-input filter-radio-inputs\"\n type=\"radio\"\n name=\"condition\"\n [(ngModel)]=\"condition\"\n value=\"or\"\n id=\"or_{{ col.field }}\"\n (change)=\"cdr.detectChanges()\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"or_{{ col.field }}\"\n >OR</label\n >\n </div>\n <div\n class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1 gap-1\"\n >\n <input\n class=\"form-check-input filter-radio-inputs\"\n type=\"radio\"\n name=\"condition\"\n [(ngModel)]=\"condition\"\n value=\"none\"\n id=\"none_{{ col.field }}\"\n (change)=\"cdr.detectChanges()\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"none_{{ col.field }}\"\n >None</label\n >\n </div>\n </div>\n <div @slideToggle *ngIf=\"firstValue && condition != 'none'\">\n <div class=\"form-group mb-2\">\n <select\n class=\"form-select form-select-sm custom-select\"\n [(ngModel)]=\"secondCondition\"\n >\n <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\n <option value=\"contain\">Contains</option>\n <option value=\"does_not_contain\">Does Not Contain</option>\n <option value=\"equal\">Equals</option>\n <option value=\"before\">Starts With</option>\n <option value=\"after\">Ends With</option>\n </ng-container>\n\n <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\n <option value=\"equal\">Equals To</option>\n <option value=\"not_equal\">Not Equal</option>\n <option value=\"after\">After</option>\n <option value=\"before\">Before</option>\n </ng-container>\n </select>\n </div>\n\n <input\n [type]=\"col.type == 'string' ? 'text' : col.type\"\n class=\"form-control form-control-sm mb-3\"\n placeholder=\"Second Value\"\n [(ngModel)]=\"secondValue\"\n />\n </div>\n </div>\n </ng-template>\n\n <!-- Actions -->\n <div class=\"d-flex gap-2 mt-2\">\n <div\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center w-100\"\n style=\"height: 30px\"\n (click)=\"applyDropdownFilter()\"\n >\n Apply\n </div>\n <div\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center w-100\"\n style=\"height: 30px\"\n (click)=\"resetSideFilter(col)\"\n >\n Reset\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Side Menue -->\n\n<!-- Column Pannel / Pivot Mode / Searching -->\n\n<ng-template #columnPannel>\n <div class=\"column-panel-header\">\n <!-- Pivot Toggle -->\n <div\n class=\"form-check form-switch d-flex align-items-center mb-2 pivot-mode px-5 ms-2 d-none\"\n >\n <input\n class=\"form-check-input me-2\"\n type=\"checkbox\"\n id=\"pivotToggle\"\n [(ngModel)]=\"pivotMode\"\n />\n <label class=\"form-check-label\" for=\"pivotToggle\">Pivot Mode</label>\n </div>\n\n <!-- Select All & Search -->\n <div class=\"d-flex align-items-center mb-2 px-3 mt-3\">\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\n <span\n class=\"toggle-icon data-grid-svg-icon\"\n [inlineSVG]=\"\n accordionState === 'all'\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\n : accordionState === 'some'\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n (click)=\"toggleAllAccordions()\"\n ></span>\n </span>\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2\"\n [checked]=\"allColumnsSelected()\"\n (change)=\"toggleAllColumnsVisibility()\"\n />\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Search columns...\"\n [(ngModel)]=\"columnSearch\"\n />\n </div>\n\n <!-- Separator -->\n <hr class=\"my-2\" />\n </div>\n</ng-template>\n\n<!-- Right Columns Menue -->\n\n<!-- Column Panel Item Template -->\n<ng-template #columnPanelItem let-col=\"col\">\n <!-- Group Column -->\n <ng-container *ngIf=\"col.children?.length\">\n <div class=\"column-group d-flex align-items-center mb-2\">\n <span class=\"filter-icon-wrapper me-2\">\n <span\n class=\"toggle-icon data-grid-svg-icon\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n [class.rotate]=\"col.expanded\"\n (click)=\"col.expanded = !col.expanded\"\n ></span>\n </span>\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2\"\n [id]=\"'group_' + col.header\"\n [checked]=\"isColumnVisible(col)\"\n (change)=\"toggleGroupVisibility(col)\"\n />\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\n ></span>\n <label\n class=\"d-flex align-items-center mb-0 w-100\"\n [for]=\"'group_' + col.header\"\n style=\"cursor: pointer\"\n >\n <span class=\"text-truncate\">{{ col.header }}</span>\n </label>\n </div>\n <div *ngIf=\"col.expanded\" class=\"ps-4\">\n <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\n <ng-container\n *ngTemplateOutlet=\"columnPanelItem; context: { col: child }\"\n ></ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Leaf Column -->\n <ng-container *ngIf=\"!col.children?.length\">\n <div class=\"d-flex align-items-center mb-2\">\n <span class=\"me-2\" style=\"width: 1.5rem\"></span>\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2\"\n [(ngModel)]=\"col.is_visible\"\n [id]=\"'col_' + col.field\"\n (change)=\"onSideMenuColumnsVisibilityChange()\"\n />\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center me-2\"\n ></span>\n <label\n class=\"d-flex align-items-center mb-0 w-100\"\n [for]=\"'col_' + col.field\"\n style=\"cursor: pointer\"\n >\n <span class=\"text-truncate\">{{ col.header }}</span>\n </label>\n </div>\n </ng-container>\n</ng-template>\n\n<!-- Columns Side Filter -->\n<ng-template #sideFilters>\n <div class=\"py-3 px-2 pe-3 h-100\">\n <div class=\"d-flex align-items-center mb-2\">\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\n <span\n class=\"toggle-icon data-grid-svg-icon\"\n [inlineSVG]=\"\n filterAccordionState === 'all'\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\n : filterAccordionState === 'some'\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n (click)=\"toggleAllFilterAccordions()\"\n ></span>\n </span>\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Search...\"\n [(ngModel)]=\"columnSearch\"\n />\n </div>\n <div\n class=\"overflow-auto side-filter-columns-wrapper\"\n style=\"height: calc(100% - 70px); scrollbar-width: thin\"\n >\n <ng-container\n *ngFor=\"\n let col of columns | filter : columnSearch : 'header';\n trackBy: trackByField\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"filterPannelItem; context: { col: col }\"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #filterPannelItem let-col=\"col\">\n <!-- Group Column -->\n <ng-container *ngIf=\"col.children?.length\">\n <div\n class=\"column-group d-flex align-items-center mb-2\"\n *ngIf=\"col.type !== 'image'\"\n >\n <!-- Chevron toggle -->\n <span class=\"filter-icon-wrapper me-2\">\n <span\n class=\"toggle-icon data-grid-svg-icon\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n [class.rotate]=\"col.expandedFilter\"\n (click)=\"col.expandedFilter = !col.expandedFilter\"\n ></span>\n </span>\n\n <!-- Group label toggle -->\n <label\n class=\"d-flex align-items-center mb-0 w-100\"\n style=\"cursor: pointer\"\n (click)=\"col.expandedFilter = !col.expandedFilter\"\n >\n <span class=\"fw-bold text-truncate\"\n >{{ col.header }}\n <span\n class=\"text-primary ms-1\"\n *ngIf=\"col?.query?._ids?.length || col?.query?._first_value\"\n >*</span\n >\n </span>\n </label>\n </div>\n\n <!-- Children columns -->\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4\">\n <ng-container *ngFor=\"let child of col.children; trackBy: trackByField\">\n <ng-container\n *ngTemplateOutlet=\"filterPannelItem; context: { col: child }\"\n ></ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Leaf Column -->\n <ng-container *ngIf=\"!col.children?.length\">\n <div class=\"d-flex align-items-center mb-2\" *ngIf=\"col.type !== 'image'\">\n <span\n class=\"me-2 filter-icon-wrapper me-2\"\n (click)=\"col.expandedFilter = !col.expandedFilter\"\n >\n <span\n class=\"toggle-icon data-grid-svg-icon\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n [class.rotate]=\"col.expandedFilter\"\n ></span>\n </span>\n\n <label\n class=\"d-flex align-items-center mb-0 w-100\"\n style=\"cursor: pointer\"\n (click)=\"col.expandedFilter = !col.expandedFilter\"\n >\n <span class=\"text-truncate fw-bold\">{{ col.header }}</span>\n </label>\n </div>\n\n <!-- Show filter when expanded -->\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4 pe-3\">\n <ng-container\n *ngTemplateOutlet=\"sideNestedFilter; context: { col: col }\"\n ></ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<!-- Side Nested Filters -->\n<ng-template #sideNestedFilter let-col=\"col\">\n <div class=\"\">\n <!-- Dropdown Type -->\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\n <div class=\"p-1\">\n <!-- Search -->\n <input\n type=\"text\"\n class=\"form-control form-control-sm mb-2\"\n placeholder=\"Search...\"\n [(ngModel)]=\"sideNestedFilterSearch\"\n />\n\n <!-- Select All -->\n <div class=\"form-check mb-1 ms-1\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [checked]=\"\n col.query?._ids?.length == col?.column_dropdown_value?.length\n \"\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\n id=\"selectAll_{{ col.field }}\"\n />\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\n Select All\n </label>\n </div>\n\n <!-- Options -->\n <!-- <div class=\"dropdown-options\">\n <div\n class=\"form-check mb-1 ms-1\"\n *ngFor=\"\n let option of col?.column_dropdown_value\n | filter : sideNestedFilterSearch : 'value'\n \"\n >\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [value]=\"option\"\n [checked]=\"\n col.query?._ids?.includes(option?._id || option?.id || option)\n \"\n (change)=\"onOptionToggle(col, option)\"\n id=\"option_{{ col.field }}_{{\n option?.id || option?._id || option\n }}\"\n />\n <label\n class=\"form-check-label\"\n [for]=\"\n 'option_' +\n col.field +\n '_' +\n (option?.id || option?._id || option)\n \"\n >\n {{ option.value || option }}\n </label>\n </div>\n </div> -->\n <cdk-virtual-scroll-viewport\n itemSize=\"32\"\n class=\"dropdown-viewport\"\n style=\"height: 120px\"\n >\n <div\n class=\"form-check mb-1 ms-1\"\n *cdkVirtualFor=\"\n let option of col?.column_dropdown_value\n | filter : sideNestedFilterSearch : 'value'\n \"\n >\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [value]=\"option\"\n [checked]=\"\n col.query?._ids?.includes(option?._id || option?.id || option)\n \"\n (change)=\"onOptionToggle(col, option)\"\n id=\"option_{{ col.field }}_{{\n option?.id || option?._id || option\n }}\"\n />\n\n <label\n class=\"form-check-label\"\n [for]=\"\n 'option_' +\n col.field +\n '_' +\n (option?.id || option?._id || option)\n \"\n >\n {{ option.value || option }}\n </label>\n </div>\n </cdk-virtual-scroll-viewport>\n\n\n <!-- Actions -->\n <!-- <div class=\"d-flex gap-2 mt-2\">\n <div\n class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center\"\n style=\"height: 22px;\"\n (click)=\"applySideFilter(col)\"\n >\n Apply\n </div>\n <div\n class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center\" \n style=\"height: 22px;\"\n (click)=\"resetSideFilter(col)\"\n >\n Reset\n </div>\n </div> -->\n </div>\n </ng-container>\n\n <!-- Text Filter Section -->\n <ng-template #textFilter>\n <div class=\"filter-text-section\">\n <div class=\"form-group mb-2\">\n <select\n class=\"form-select form-select-sm\"\n [(ngModel)]=\"col.query.first_condition\"\n >\n <ng-container *ngIf=\"col.type !== 'date'\">\n <option value=\"contain\">Contains</option>\n <option value=\"does_not_contain\">Does Not Contain</option>\n <option value=\"equal\">Equals</option>\n <option value=\"before\">Starts With</option>\n <option value=\"after\">Ends With</option>\n </ng-container>\n\n <ng-container *ngIf=\"col.type == 'date'\">\n <option value=\"equal\">Equals To</option>\n <option value=\"not_equal\">Not Equal</option>\n <option value=\"after\">After</option>\n <option value=\"before\">Before</option>\n </ng-container>\n </select>\n </div>\n\n <input\n [type]=\"col.type == 'date' ? 'date' : 'text'\"\n class=\"form-control form-control-sm mb-3\"\n placeholder=\"Value\"\n [(ngModel)]=\"col!.query!.first_value\"\n />\n\n <div\n class=\"form-group mb-3 d-flex flex-row muted\"\n style=\"font-size: 14px\"\n >\n <div\n class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input filter-radio-inputs\"\n type=\"radio\"\n name=\"condition\"\n [(ngModel)]=\"col!.query.condition\"\n value=\"and\"\n id=\"and_{{ col.field }}\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"and_{{ col.field }}\"\n >AND</label\n >\n </div>\n <div\n class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input filter-radio-inputs\"\n type=\"radio\"\n name=\"condition\"\n [(ngModel)]=\"col!.query.condition\"\n value=\"or\"\n id=\"or_{{ col.field }}\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"or_{{ col.field }}\"\n >OR</label\n >\n </div>\n <div\n class=\"form-check form-check-inline m-0 col-4 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input filter-radio-inputs\"\n type=\"radio\"\n name=\"condition\"\n [(ngModel)]=\"col!.query.condition\"\n value=\"none\"\n id=\"none_{{ col.field }}\"\n />\n <label\n class=\"nnonem-check-label mb-0 mt-1\"\n for=\"none_{{ col.field }}\"\n >None</label\n >\n </div>\n </div>\n <ng-container\n *ngIf=\"col?.query?.first_value && col?.query?.condition !== 'none'\"\n >\n <div class=\"form-group mb-2\">\n <select\n class=\"form-select form-select-sm\"\n [(ngModel)]=\"col!.query.second_condition\"\n >\n <ng-container *ngIf=\"col.type !== 'date'\">\n <option value=\"contain\">Contains</option>\n <option value=\"does_not_contain\">Does Not Contain</option>\n <option value=\"equal\">Equals</option>\n <option value=\"before\">Starts With</option>\n <option value=\"after\">Ends With</option>\n </ng-container>\n\n <ng-container *ngIf=\"col.type == 'date'\">\n <option value=\"equal\">Equals To</option>\n <option value=\"not_equal\">Not Equal</option>\n <option value=\"after\">After</option>\n <option value=\"before\">Before</option>\n </ng-container>\n </select>\n </div>\n\n <input\n [type]=\"col.type == 'date' ? 'date' : 'text'\"\n class=\"form-control form-control-sm mb-3\"\n placeholder=\"Second Value\"\n [(ngModel)]=\"col!.query.second_value\"\n />\n </ng-container>\n <!-- <div class=\"d-flex gap-2\">\n <div class=\"btn btn-sm btn-primary d-flex justify-content-center align-items-center\" style=\"height: 22px;\" (click)=\"applyDropdownFilter()\">apply</div>\n <div class=\"btn btn-sm btn-secondary d-flex justify-content-center align-items-center\" style=\"height: 22px;\" (click)=\"applyDropdownFilter()\">reset</div>\n\n </div> -->\n </div>\n </ng-template>\n <div\n class=\"d-flex justify-content-center gap-2 border-top\"\n style=\"height: 38px\"\n >\n <button\n type=\"button\"\n style=\"max-height: 30px\"\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\n (click)=\"$event.stopPropagation(); removeSideFilter(col)\"\n >\n <span>Clear</span>\n </button>\n <button\n type=\"button\"\n style=\"max-height: 30px\"\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\n (click)=\"applySideFilter(col)\"\n [class.disabled]=\"(col?.query.condition !== 'none' && !col?.query?.second_value)\"\n [class.pe-none]=\"(col!?.query.condition !== 'none' && !col?.query?.second_value)\"\n >\n <span style=\"margin-top: -1px\">Apply</span>\n </button>\n </div>\n </div>\n</ng-template>\n\n<!-- Centr Overlay for showing the chose columns -->\n\n<div *ngIf=\"showColumnPanel\" class=\"custom-modal-overlay\">\n <div\n class=\"custom-modal-content\"\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\n (click)=\"$event.stopPropagation()\"\n >\n <ng-container *ngTemplateOutlet=\"modalColumnPannel\"></ng-container>\n </div>\n</div>\n\n<!-- The existing ng-template you provided -->\n<ng-template #modalColumnPannel>\n <div class=\"column-panel-header\">\n <div\n class=\"d-flex justify-content-between align-items-center px-2 ps-3 rounded-top-2 moda-header\"\n [style.height.px]=\"48\"\n >\n Choose Columns\n <span class=\"filter-icon-wrapper\" (click)=\"closeModalColumnPanel()\"\n ><span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span\n ></span>\n </div>\n <hr class=\"my-0\" />\n <div>\n <div class=\"d-flex align-items-center px-2 pe-3\" [style.height.px]=\"48\">\n <span class=\"filter-icon-wrapper me-2\" *ngIf=\"showColumnsGrouping\">\n <span\n class=\"toggle-icon data-grid-svg-icon\"\n [inlineSVG]=\"\n accordionState === 'all'\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\n : accordionState === 'some'\n ? singleSpaAssetsPath + 'data-grid/icons/dash.svg'\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\n \"\n (click)=\"toggleAllAccordions()\"\n ></span>\n </span>\n <input\n type=\"checkbox\"\n class=\"form-check-input me-2\"\n [checked]=\"allColumnsSelected()\"\n (change)=\"toggleAllColumnsVisibility()\"\n />\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Search columns...\"\n [(ngModel)]=\"choseColumnsSearch\"\n />\n </div>\n\n <hr class=\"mt-0 mb-1\" />\n <div class=\"px-2 overlay-scrollable\">\n <ng-container\n *ngFor=\"\n let col of columns | filter : choseColumnsSearch : 'header';\n trackBy: trackByField\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"columnPanelItem; context: { col: col }\"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #sideMenuRowGroups>\n <div class=\"d-flex flex-column h-100 d-none\">\n <div class=\"px-3 h-100\">\n <div class=\"d-flex gap-3 mb-4\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n <span>Row Groups</span>\n </div>\n <div class=\"h-50\">\n <div\n class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\n style=\"font-size: 14px\"\n >\n Drag here to set row Groups\n </div>\n </div>\n </div>\n\n <hr class=\"mt-4\" />\n\n <div class=\"px-3 h-100\">\n <div class=\"d-flex gap-3 mb-4\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/justify.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n <span>Values</span>\n </div>\n <div class=\"h-50 d-flex\">\n <div\n class=\"px-3 py-2 border-dashed h-100 d-flex justify-content-center align-items-center\"\n style=\"font-size: 14px\"\n >\n Drag here aggregate\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- *************************************************** -->\n<!-- *************************************************** -->\n<!-- *************************************************** -->\n<!-- Drag Preview Template -->\n<!-- *************************************************** -->\n<!-- *************************************************** -->\n<ng-template #dragPreview let-col>\n <div class=\"p-2 border d-flex gap-2\">\n <div>\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div>{{ col.header }}</div>\n </div>\n</ng-template>\n\n<!-- Drag Placeholder Template -->\n<ng-template\n #dragPlaceholder\n let-col\n let-i=\"index\"\n let-section=\"section\"\n let-draggingInGroupArea=\"draggingInGroupArea\"\n>\n <div *ngIf=\"!draggingInGroupArea\">\n <div\n *ngTemplateOutlet=\"\n headerCell;\n context: { $implicit: col, index: i, section: section }\n \"\n ></div>\n </div>\n <div *ngIf=\"draggingInGroupArea\">New Placeholder</div>\n</ng-template>\n\n<!-- Top Group Row Placeholder -->\n<ng-template #topGroupingRowPlaceholder let-col let-showChevron=\"showChevron\">\n <div class=\"d-flex gap-2\">\n <div\n class=\"d-flex gap-2 top-row-grouping-placeholder\"\n [style.backgroundColor]=\"topGroupedBadgesBackgroundColor\"\n >\n <span\n cdkDragHandle\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/grid-3x2-gap.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n <span>{{ col.header }}</span>\n <span\n (click)=\"ungroupColumn(col)\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"\n class=\"cursor-pointer data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n <div *ngIf=\"showChevron\" style=\"opacity: 0.6; font-size: 14px\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n</ng-template>\n\n<ng-template\n #childHeaderPlaceholder\n let-col\n let-pinnedRight=\"pinnedRight\"\n let-i=\"index\"\n let-sections=\"sections\"\n>\n <div\n class=\"header-cell one-row-header-cells\"\n [class.border-right]=\"showVerticalBorder\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n [style.fontWeight]=\"headerFontWeight\"\n >\n <div class=\"d-flex justify-content-between h-100 align-items-center w-100\">\n <div\n class=\"d-flex justify-content-between align-items-center w-100\"\n [class.flex-row-reverse]=\"pinnedRight\"\n >\n <div\n class=\"text-ellipsis h-100 d-flex align-items-center\"\n [title]=\"col.header\"\n [class.w-100]=\"pinnedRight\"\n >\n {{ col.header }}\n </div>\n\n <div\n class=\"position-relative d-flex\"\n [class.flex-row-reverse]=\"pinnedRight\"\n >\n <div class=\"three-dots p-1\" style=\"cursor: pointer\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n\n <div class=\"resize-handle\">\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"showFilterRow\"\n [style.backgroundColor]=\"headerBackgroundColor\"\n class=\"header-cell filter-cell\"\n [class.border-right]=\"showVerticalBorder\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [style.height.px]=\"headerRowHeight\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n [class.border-right]=\"showVerticalBorder\"\n style=\"grid-row: 3\"\n >\n <div\n class=\"header-cell filter-cell\"\n [style.backgroundColor]=\"headerBackgroundColor\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.width\"\n [style.height.px]=\"headerRowHeight\"\n [style.min-height.px]=\"headerRowHeight\"\n [style.max-height.px]=\"headerRowHeight\"\n >\n <input\n type=\"text\"\n class=\"form-control form-control-sm\"\n placeholder=\"Filter\"\n [(ngModel)]=\"col.filterValue\"\n [readonly]=\"col?.type == 'dropdown' || col?.type == 'image'\"\n [class.disabled-search-input]=\"\n col?.type == 'dropdown' || col?.type == 'image'\n \"\n />\n <span\n class=\"filter-icon-wrapper\"\n (click)=\"activeFilterCell = col; activeCol = null\"\n ><span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span\n ></span>\n\n <div\n class=\"position-absolute\"\n *ngIf=\"activeFilterCell === col\"\n style=\"top: 100%; right: 0; z-index: 10; left: 0\"\n ></div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tableLayout>\n <div\n (click)=\"$event.stopPropagation()\"\n class=\"p-3 shadow actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\n style=\"width: 320px\"\n >\n <div class=\"d-flex align-items-center mb-3\">\n <button\n class=\"btn btn-link p-0\"\n style=\"margin-left: -10px\"\n (click)=\"toggleActions('setting')\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n </button>\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Layout</h6>\n </div>\n <hr class=\"my-2\" />\n <div class=\"w-100 mb-3 d-flex\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check layout-button-check\"\n name=\"layoutSize\"\n id=\"small\"\n autocomplete=\"off\"\n (change)=\"changeTableLayout($event, 'small')\"\n [checked]=\"selectedTableLayout == 'small'\"\n />\n <label\n class=\"border d-flex flex-column align-items-center layout-button\"\n for=\"small\"\n [ngStyle]=\"{\n color: selectedTableLayout == 'small' ? '#000' : '#727272'\n }\"\n >\n <div class=\"preview-box border mb-1\" style=\"height: 8px\"></div>\n Small\n </label>\n\n <input\n type=\"radio\"\n class=\"btn-check layout-button-check\"\n name=\"layoutSize\"\n id=\"medium\"\n autocomplete=\"off\"\n [checked]=\"selectedTableLayout == 'medium'\"\n (change)=\"changeTableLayout($event, 'medium')\"\n />\n <label\n class=\"border mx-3 d-flex flex-column align-items-center layout-button\"\n for=\"medium\"\n [ngStyle]=\"{\n color: selectedTableLayout == 'medium' ? '#000' : '#727272'\n }\"\n >\n <div class=\"preview-box border mb-1\" style=\"height: 12px\"></div>\n Medium\n </label>\n\n <input\n type=\"radio\"\n class=\"btn-check layout-button-check\"\n name=\"layoutSize\"\n id=\"large\"\n autocomplete=\"off\"\n (change)=\"changeTableLayout($event, 'large')\"\n [checked]=\"selectedTableLayout == 'large'\"\n />\n <label\n class=\"border d-flex flex-column align-items-center layout-button\"\n for=\"large\"\n [ngStyle]=\"{\n color: selectedTableLayout == 'large' ? '#000' : '#727272'\n }\"\n >\n <div class=\"preview-box border mb-1\" style=\"height: 16px\"></div>\n Large\n </label>\n </div>\n\n <hr class=\"my-2\" />\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span>Show separators</span>\n <div class=\"form-check form-switch m-0\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"separators\"\n [(ngModel)]=\"showVerticalBorder\"\n (change)=\"onFontChange()\"\n />\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>Row shading</span>\n <div class=\"form-check form-switch m-0\">\n <input\n class=\"form-check-input\"\n [(ngModel)]=\"rowShadingEnabled\"\n (change)=\"toggleRowShading()\"\n type=\"checkbox\"\n id=\"rowShading\"\n />\n </div>\n </div>\n <!-- <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span>Show Side Menu</span>\n <div class=\"form-check form-switch m-0\">\n <input\n class=\"form-check-input\"\n [(ngModel)]=\"showSideMenu\"\n type=\"checkbox\"\n id=\"rowShading\"\n />\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <span>Show Filter Row</span>\n <div class=\"form-check form-switch m-0\">\n <input\n class=\"form-check-input\"\n [(ngModel)]=\"showFilterRow\"\n type=\"checkbox\"\n id=\"rowShading\"\n />\n </div>\n </div> -->\n </div>\n</ng-template>\n\n<ng-template #tablePreset>\n <div\n *ngIf=\"activeSubButton !== 'save-preset'\"\n (click)=\"$event.stopPropagation()\"\n class=\"p-3 shadow actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\n style=\"width: 280px\"\n >\n <!-- Header -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div class=\"d-flex align-items-center\">\n <button\n class=\"btn btn-link p-0\"\n style=\"margin-left: -10px\"\n (click)=\"toggleActions('setting')\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\n class=\"data-grid-svg-icon\"\n ></span>\n </button>\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Table Presets</h6>\n </div>\n <!-- Save Preset Button with Dropdown -->\n <div>\n <a\n class=\"text-decoration-none text-primary\"\n type=\"button\"\n id=\"savePresetDropdown\"\n (click)=\"$event.stopPropagation(); toggleSubActions('save-preset')\"\n >\n {{ isTablePresetNotChanged ? \"Save preset\" : \"Update Preset\" }}\n </a>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"mb-3\">\n <div class=\"col-12 global-search position-relative\">\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\n ></span>\n <input\n class=\"form-control form-control-sm\"\n placeholder=\"Search...\"\n [(ngModel)]=\"searchTextPresetTable\"\n type=\"search\"/>\n </div>\n </div>\n\n <!-- Preset List -->\n <ng-container\n *ngIf=\"\n tableView | filter : searchTextPresetTable : 'name' as filteredList\n \"\n >\n <!-- If filteredList exists and none is default -> show fallback -->\n <div\n class=\" pb-5 overflow-auto\"\n [style.maxHeight.px]=\"dataGridContainer.offsetHeight - 250\"\n >\n <div\n class=\"cursor-pointer\"\n (click)=\"\n clearAllFilters();\n openIndex = null;\n temp_state.id = '';\n activeTopButton = '';\n curretaTablePresetForUpdate = null\n \"\n >\n <div class=\"fw-semibold\">Default View</div>\n </div>\n <div class=\"d-flex justify-content-between\">\n <small class=\"text-dark\">Created by system</small>\n <span\n *ngIf=\"!tableFilterViewId && !hasAnyDefaultView()\"\n class=\"badge bg-light text-primary ms-2\"\n >Default</span\n >\n <span\n *ngIf=\"!tableFilterViewId && !hasAnyDefaultView()\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\"\n class=\"me-2\"\n ></span>\n <div\n class=\"dropdown d-flex justify-content-end\"\n *ngIf=\"tableFilterViewId\"\n ></div>\n </div>\n\n <!-- The list: render each table from filteredList -->\n <div\n class=\"list-group list-group-flush\"\n *ngFor=\"\n let table of filteredList;\n let i = index;\n trackBy: trackByTable\n \"\n >\n <!-- Item -->\n <div\n (click)=\"\n $event.stopPropagation(); openIndex = null; activeTopButton = ''\n \"\n class=\"list-group-item px-0 d-flex justify-content-between align-items-center\"\n >\n <div (click)=\"selectFilter(table); openIndex = null\">\n <div class=\"fw-semibold\" style=\"cursor: pointer\">\n {{ table?.name }}\n <!-- {{table?.is_temp}} -->\n <span\n *ngIf=\"\n (table?.is_temp && !temp_state.id) ||\n temp_state.id == table.id\n \"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\n \"\n class=\"me-2\"\n ></span>\n <span\n *ngIf=\"table?.is_default\"\n class=\"badge bg-light text-primary ms-2\"\n >Default</span\n >\n </div>\n <small class=\"text-dark\" *ngIf=\"table?.config?.filterNames\" [title]=\"table?.config?.filterNames\">\n {{\n table?.config?.filterNames?.length > 25\n ? (table?.config?.filterNames | slice:0:25) + '...'\n : table?.config?.filterNames\n }}\n ({{ table?.config?.totalCount }})\n </small>\n <small class=\"text-dark\" *ngIf=\"!table?.config?.filterNames\">{{ table?.createdAt | date : \"MMM d, y\" }}</small>\n </div>\n\n <div class=\"d-flex align-items-center\">\n <span\n *ngIf=\"table?.is_default\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/check-blue.svg'\n \"\n class=\"me-2\"\n ></span>\n\n <div class=\"dropdown\" *ngIf=\"!table?.is_default\">\n <div\n class=\"dropdown-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n type=\"button\"\n class=\"btn-icon muted-text\"\n (click)=\"toggleMenu(i, $event)\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"openIndex === i\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/horizontal-dots.svg'\n \"\n class=\"me-2\"\n ></span>\n </button>\n\n <!-- menu -->\n <ul\n *ngIf=\"openIndex === i\"\n class=\"custom-dropdown-menu position-fixed top-auto\"\n role=\"menu\"\n [style.right.px]=\"'auto'\"\n [style.left.px]=\"dataGridContainer.offsetWidth - 100\"\n style=\"top: unset; right: unset\"\n >\n <li role=\"none\">\n <button\n role=\"menuitem\"\n class=\"dropdown-item\"\n (click)=\"\n actionPreset(table, 'setPreset'); temp_state.id = ''\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/star.svg'\n \"\n class=\"me-2\"\n ></span>\n Set as default\n </button>\n </li>\n\n <li role=\"none\" *ngIf=\"!table.confirmDelete\">\n <button\n role=\"menuitem\"\n class=\"dropdown-item text-danger\"\n (click)=\"table.confirmDelete = true\"\n >\n <span\n style=\"margin-top: -4px\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/trash-red.svg'\n \"\n class=\"me-2\"\n ></span>\n Delete\n </button>\n </li>\n\n <li\n role=\"none\"\n *ngIf=\"table.confirmDelete\"\n class=\"confirm-block\"\n >\n <div class=\"px-3 py-2 text-center\">\n <div class=\"mb-2\">\n Are you sure you want to delete <br /><b\n >“{{ table?.name }}”</b\n >?\n </div>\n <div class=\"d-flex gap-2\">\n <button\n class=\"btn btn-sm btn-light me-2\"\n (click)=\"table.confirmDelete = false\"\n >\n Cancel\n </button>\n <button\n class=\"btn btn-sm btn-danger\"\n (click)=\"actionPreset(table, 'deletePreset')\"\n >\n Delete\n </button>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <!-- Item End Here -->\n </div>\n </div>\n </ng-container>\n </div>\n\n <div\n (click)=\"$event.stopPropagation()\"\n *ngIf=\"activeSubButton == 'save-preset'\"\n class=\"dropdown-menu p-3 badge mt-4 save-preset-dropdown mt-1\"\n aria-labelledby=\"savePresetDropdown\"\n style=\"min-width: 250px\"\n >\n <div class=\"fw-bold fs-14px mb-2\">\n {{ isTablePresetNotChanged ? \"Save preset\" : \"Update Preset\" }}\n </div>\n <div class=\"fs-14px mb-2\" style=\"line-height: 20px\">\n This will save the current table adjustments as a preset.\n </div>\n <!-- Input -->\n <div class=\"mb-2\">\n <label for=\"presetName\" class=\"form-label fs-12px fw-bold\"\n >Preset Name</label\n >\n <div class=\"col-12 global-search position-relative\">\n <input\n #presetNameCtrl=\"ngModel\"\n required\n [(ngModel)]=\"presetName\"\n [ngClass]=\"{\n 'is-invalid':\n presetNameCtrl.invalid &&\n (presetNameCtrl.dirty || presetNameCtrl.touched)\n }\"\n class=\"form-control form-control-sm ps-2\"\n placeholder=\"Enter preset name\"\n type=\"text\"\n />\n </div>\n </div>\n\n <!-- Checkbox -->\n <div class=\"form-check mb-2\">\n <input\n class=\"form-check-input\"\n [(ngModel)]=\"presetFilter\"\n type=\"checkbox\"\n id=\"saveFilters\"\n />\n <label class=\"form-check-label mt-1\" for=\"saveFilters\">\n Save active filters\n </label>\n </div>\n\n <!-- Save Button -->\n <div class=\"d-flex justify-content-center gap-2\" style=\"height: 32px\">\n <button\n type=\"button\"\n style=\"height: 32px\"\n class=\"btn border w-100 d-flex align-items-center justify-content-center btn-light\"\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\n style=\"margin-top: -2px\"\n >\n <span>Cancel</span>\n </button>\n <button\n [disabled]=\"closeDropdown.preset.loading\"\n (click)=\"savePreset(presetNameCtrl)\"\n type=\"button\"\n style=\"height: 32px\"\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center\"\n >\n <span style=\"margin-top: -2px\" *ngIf=\"isTablePresetNotChanged\">\n <ng-container *ngIf=\"!closeDropdown.preset.loading\"\n >Save</ng-container\n >\n <ng-container *ngIf=\"closeDropdown.preset.loading\"\n ><span class=\"spinner-border spinner-border-sm\"></span\n ></ng-container>\n </span>\n <span style=\"white-space: nowrap\" *ngIf=\"!isTablePresetNotChanged\"\n >Update Preset</span\n >\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #showHideColumns>\n <div\n (click)=\"$event.stopPropagation()\"\n class=\"p-3 shadow actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\n style=\"width: 280px\"\n >\n <!-- Header -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div class=\"d-flex align-items-center\">\n <button\n class=\"btn btn-link p-0\"\n style=\"margin-left: -10px\"\n (click)=\"toggleActions('setting')\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\n class=\"data-grid-svg-icon\"\n ></span>\n </button>\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Columns</h6>\n </div>\n <a\n (click)=\"resetColumns()\"\n href=\"javascript:void(0)\"\n class=\"text-primary text-decoration-none\"\n >Reset</a\n >\n </div>\n\n <!-- Search -->\n <div class=\"mb-3\">\n <div class=\"col-12 global-search position-relative\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\n class=\"mx-2 position-absolute icon data-grid-svg-icon\"\n ></span>\n <input\n class=\"form-control form-control-sm\"\n placeholder=\"Search column\"\n type=\"search\"\n [(ngModel)]=\"topShowHideColumns\"\n />\n </div>\n </div>\n <!-- Preset List -->\n <div\n class=\"list-group list-group-flush\"\n style=\"overflow: auto; scrollbar-width: thin\"\n [style.maxHeight.px]=\"dataGridContainer.offsetHeight - 220\"\n >\n <div class=\"muted-text show-hide-table-label d-flex justify-content-between\" *ngIf=\"hasAnyVisibleColumn\">\n Show in table\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"hide_all\"\n [checked]=\"allColumnsSelected()\"\n (change)=\"toggleAllColumnsVisibility()\"\n />\n <label class=\"form-check-label fw-semibold\" for=\"hide_all\">\n Show/Hide All \n </label>\n </div>\n </div>\n <!-- Item -->\n <ng-container\n *ngFor=\"\n let col of columns | filter : topShowHideColumns : 'header';\n trackBy: trackByField\n \"\n >\n <div\n *ngIf=\"col.is_visible\"\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\n >\n <div class=\"d-flex gap-1\">\n <div>\n <span\n *ngIf=\"!col?.pinned\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\n \"\n class=\"cursor-grap data-grid-svg-icon\"\n (mousedown)=\"$event.preventDefault()\"\n ></span>\n <span\n *ngIf=\"col?.pinned\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\n \"\n class=\"cursor-grap data-grid-svg-icon\"\n (mousedown)=\"$event.preventDefault()\"\n ></span>\n </div>\n <div class=\"fw-semibold\">\n {{ col.header }}\n </div>\n </div>\n <div\n *ngIf=\"!col?.query?.first_value && !col?.query?._ids?.length\"\n class=\"d-flex align-items-center cursor-pointer\"\n (click)=\"toggleColumnVisibility(col, false)\"\n [class.disabled]=\"visibleColumns().length <= 2 || col?.is_always_visible\"\n [class.pe-none]=\"visibleColumns().length <= 2 || col?.is_always_visible\"\n [class.opacity-50]=\"visibleColumns().length <= 2 || col?.is_always_visible\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n </div>\n <div\n *ngIf=\"col?.query?.first_value || col?.query?._ids?.length\"\n class=\"d-flex align-items-center\"\n style=\"opacity: 0.5\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n </div>\n </div>\n </ng-container>\n\n <!-- Item End Here -->\n\n <div\n class=\"dropdown-divider\"\n *ngIf=\"hasAnyVisibleColumn && hasAnyInVisibleColumn\"\n ></div>\n\n <div\n class=\"muted-text show-hide-table-label d-flex justify-content-between\"\n *ngIf=\"hasAnyInVisibleColumn\"\n >\n Hide in table\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"show_all\"\n [checked]=\"allColumnsSelected()\"\n (change)=\"toggleAllColumnsVisibility()\"\n />\n <label class=\"form-check-label fw-semibold\" for=\"show_all\">\n Show/Hide All \n </label>\n </div>\n </div>\n <div class=\"list-group list-group-flush\">\n <ng-container *ngFor=\"let col of columns; trackBy: trackByField\">\n <div\n *ngIf=\"!col.is_visible\"\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center\"\n >\n <div class=\"d-flex gap-1\">\n <div>\n <span\n *ngIf=\"!col?.pinned\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/grip-vertical.svg'\n \"\n class=\"data-grid-svg-icon cursor-grap\"\n (mousedown)=\"$event.preventDefault()\"\n ></span>\n <span\n *ngIf=\"col?.pinned\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\n \"\n class=\"data-grid-svg-icon cursor-grap\"\n (mousedown)=\"$event.preventDefault()\"\n ></span>\n </div>\n <div class=\"fw-semibold\">\n {{ col.header }}\n </div>\n </div>\n <div\n class=\"d-flex align-items-center cursor-pointer\"\n (click)=\"toggleColumnVisibility(col, true)\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\n \"\n class=\"data-grid-svg-icon me-2\"\n ></span>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Item End Here -->\n </div>\n </div>\n</ng-template>\n\n<ng-template #filterColumns let-col=\"column\">\n <div\n @slideToggle\n *ngIf=\"!isFilterOpen && activeTopButton == 'filter-columns'\"\n (click)=\"$event.stopPropagation()\"\n class=\"shadow actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\n style=\"width: 280px; right: unset; max-width: 230px\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n >\n <div class=\"mb-2 px-3\">\n <div class=\"col-12 global-search position-relative\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\n ></span>\n <input\n class=\"form-control form-control-sm\"\n placeholder=\"Filter by\"\n type=\"search\"\n [(ngModel)]=\"addFilterColumnInput\"\n />\n </div>\n </div>\n <div\n class=\"list-group list-group-flush\"\n style=\"max-height: calc(100vh - 500px); overflow: auto\"\n >\n <ng-container\n *ngFor=\"\n let col of columns | filter : addFilterColumnInput : 'header';\n trackBy: trackByField\n \"\n >\n <div\n (click)=\"openFilter(col)\"\n *ngIf=\"\n col.is_visible &&\n !col?.query?.first_value &&\n !col?.query?._ids?.length && col.type !== 'image'\n \"\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\n >\n <div class=\"d-flex gap-1\">\n <div style=\"margin-top: -3px\"></div>\n <div class=\"fw-semibold\">\n {{ col.header }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Dropdown -->\n <div\n @slideToggle\n *ngIf=\"isFilterOpen && selectedColumnForFilter.type == 'dropdown'\"\n (click)=\"$event.stopPropagation()\"\n class=\"shadow actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns pb-2\"\n style=\"width: 280px; right: unset; max-width: 230px\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n >\n <div class=\"px-3 my-2 border-below py-1 pb-2 mb-3 d-flex ps-1\">\n <span\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\n ></span\n ><b>{{ selectedColumnForFilter?.header }}</b>\n </div>\n <div class=\"mb-2 px-3\">\n <div\n class=\"col-12 position-relative border rounded d-flex align-items-center flex-wrap px-2 filter-serach-inpt\"\n >\n <span\n *ngFor=\"let selected of selectedFilterOptions\"\n class=\"badge d-flex align-items-center gap-1 me-1 mb-1 top-row-filter-dropdown\"\n >\n {{ selected?.value ? selected.value : selected }}\n <span\n (click)=\"toggleSelectionInFilter(selected)\"\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\n \"\n class=\"me-2\"\n ></span>\n </span>\n <input\n class=\"form-control form-control-sm border-0 flex-grow-1\"\n style=\"padding: 0\"\n [placeholder]=\"selectedFilterOptions?.length ? '' : 'Filter by'\"\n type=\"search\"\n [(ngModel)]=\"searchTextForFilterDropDown\"\n (keydown.backspace)=\"handleBackspace($event)\"\n />\n </div>\n </div>\n <div\n class=\"list-group list-group-flush\"\n style=\"max-height: calc(100vh - 600px); overflow: auto\"\n >\n <ng-container\n *ngFor=\"\n let col of selectedColumnForFilter.column_dropdown_value\n | filter : searchTextForFilterDropDown : 'value';\n let i = index\n \"\n >\n <div\n class=\"list-group-item border-0 px-2 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\n >\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [id]=\"i\"\n [checked]=\"currentFilterSelectedIds.has(col.id || col._id || col)\"\n (change)=\"toggleSelectionInFilter(col)\"\n />\n <label class=\"form-check-label fw-semibold\" [for]=\"i\">\n {{ col?.value || col?.name || col }}\n </label>\n </div>\n </div>\n </ng-container>\n </div>\n <div\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\n style=\"height: 38px\"\n >\n <button\n type=\"button\"\n style=\"height: 32px\"\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\n (click)=\"$event.stopPropagation(); resetFilterChanges()\"\n >\n <span>Cancel</span>\n </button>\n <button\n type=\"button\"\n style=\"height: 32px\"\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\n (click)=\"applyDropdownFilter()\"\n >\n <span style=\"margin-top: -2px\">Save</span>\n </button>\n </div>\n </div>\n\n <!-- For Text fields and number fields-->\n\n <div\n @slideToggle\n *ngIf=\"\n isFilterOpen &&\n (selectedColumnForFilter.type == 'string' ||\n selectedColumnForFilter.type == 'number' ||\n selectedColumnForFilter.type == 'date')\n \"\n (click)=\"$event.stopPropagation()\"\n class=\"shadow actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns pb-2\"\n style=\"width: 210px; right: unset; max-width: 230px\"\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\n >\n <div class=\"px-3 border-below py-1 pb-2 d-flex ps-1\">\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\n ></span\n ><b>{{ selectedColumnForFilter?.header }}</b>\n </div>\n <div class=\"col-12 position-relative p-2 text-filter\">\n <div class=\"mb-2\">\n <select\n class=\"form-select form-select-sm custom-select border\"\n [(ngModel)]=\"firstCondition\"\n >\n <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\n <option value=\"contain\">Contains</option>\n <option value=\"does_not_contain\">Does Not Contain</option>\n <option value=\"equal\">Equals</option>\n <option value=\"before\">Starts With</option>\n <option value=\"after\">Ends With</option>\n </ng-container>\n\n <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\n <option value=\"equal\">Equals To</option>\n <option value=\"not_equal\">Not Equal</option>\n <option value=\"after\">After</option>\n <option value=\"before\">Before</option>\n </ng-container>\n </select>\n </div>\n <div class=\"mb-2\">\n <input\n class=\"form-control form-control-sm\"\n placeholder=\"Enter first value\"\n type=\"search\"\n [type]=\"\n selectedColumnForFilter.type == 'string'\n ? 'text'\n : selectedColumnForFilter.type\n \"\n [(ngModel)]=\"firstValue\"\n (keydown.enter)=\"applyDropdownFilter()\"\n />\n </div>\n <div>\n <div class=\"d-flex my-3 d-flex flex-row\" style=\"font-size: 14px\">\n <div\n class=\"form-check form-check-inline col-4 m-0 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input\"\n type=\"radio\"\n id=\"logicalAnd\"\n name=\"logicalOperator\"\n value=\"and\"\n [(ngModel)]=\"condition\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"logicalAnd\"\n >AND</label\n >\n </div>\n\n <div\n class=\"form-check form-check-inline col-4 m-0 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input\"\n type=\"radio\"\n id=\"logicalOr\"\n name=\"logicalOperator\"\n value=\"or\"\n [(ngModel)]=\"condition\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"logicalOr\">OR</label>\n </div>\n\n <div\n class=\"form-check form-check-inline col-4 m-0 d-flex align-items-center gap-1\"\n >\n <input\n class=\"form-check-input\"\n type=\"radio\"\n id=\"logicalNone\"\n name=\"logicalOperator\"\n value=\"none\"\n [(ngModel)]=\"condition\"\n />\n <label class=\"form-check-label mb-0 mt-1\" for=\"logicalNone\"\n >None</label\n >\n </div>\n </div>\n\n <ng-container *ngIf=\"condition !== 'none' && firstValue\">\n <div class=\"mb-2 mt-3\">\n <!-- Second condition select -->\n <select\n class=\"form-select form-select-sm border\"\n [(ngModel)]=\"secondCondition\"\n >\n <ng-container *ngIf=\"selectedColumnForFilter.type !== 'date'\">\n <option value=\"contain\">Contains</option>\n <option value=\"does_not_contain\">Does Not Contain</option>\n <option value=\"equal\">Equals</option>\n <option value=\"before\">Starts With</option>\n <option value=\"after\">Ends With</option>\n </ng-container>\n\n <ng-container *ngIf=\"selectedColumnForFilter.type == 'date'\">\n <option value=\"equal\">Equals To</option>\n <option value=\"not_equal\">Not Equal</option>\n <option value=\"after\">After</option>\n <option value=\"before\">Before</option>\n </ng-container>\n </select>\n </div>\n\n <div class=\"mb-2\">\n <!-- Second value input -->\n <input\n [type]=\"\n selectedColumnForFilter.type == 'string'\n ? 'text'\n : selectedColumnForFilter.type\n \"\n class=\"form-control form-control-sm\"\n placeholder=\"Enter second value\"\n type=\"search\"\n [(ngModel)]=\"secondValue\"\n (keydown.enter)=\"applyDropdownFilter()\"\n />\n </div>\n </ng-container>\n </div>\n </div>\n\n <div\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\n style=\"height: 38px\"\n >\n <button\n [disabled]=\"!currentFilterSelectedIds?.size && !firstValue\"\n type=\"button\"\n style=\"height: 32px\"\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\n (click)=\"$event.stopPropagation(); resetTextFilterChanges()\"\n >\n <span>Cancel</span>\n </button>\n <button\n [disabled]=\"(currentFilterSelectedIds?.size === 0 && !firstValue) || (condition !== 'none' && !secondValue)\"\n type=\"button\"\n style=\"height: 32px\"\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\n (click)=\"applyDropdownFilter()\"\n >\n <span style=\"margin-top: -2px\">Apply</span>\n </button>\n </div>\n </div>\n</ng-template>\n\n<!-- Edit dropdown here -->\n<ng-template let-col>\n <div class=\"drop-down-edit\"></div>\n</ng-template>\n\n<ng-template\n #fullTextTemplate\n let-row=\"row\"\n let-col=\"col\"\n let-isArray=\"isArray\"\n>\n <div\n class=\"full-text-box\"\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault()\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n [style.maxHeight.px]=\"dataGridContainer.offsetHeight / 2\"\n >\n <ng-container *ngIf=\"!isEditing(row, col)\">\n <div\n *ngIf=\"!isArray\"\n class=\"full-text-content\"\n [style.maxHeight.px]=\"dataGridContainer.offsetHeight / 2\"\n (dblclick)=\"\n $event.stopPropagation();\n $event.preventDefault();\n enableEdit(row, col, true)\n \"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n >\n {{\n getNestedValue(row, col.field)?.value ||\n getNestedValue(row, col.field)?.name ||\n getNestedValue(row, col.field)\n }}\n </div>\n <div *ngIf=\"isArray\">\n <ul>\n <ng-container\n *ngFor=\"let item of getNestedValue(row, col.field); let i = index\"\n >\n <li *ngIf=\"i !== 0\">\n <ng-container>\n {{\n item?.department_name ||\n item?.roleName ||\n item?.full_name ||\n \"-\"\n }}\n </ng-container>\n </li>\n </ng-container>\n </ul>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isEditing(row, col)\">\n <textarea\n (dblclick)=\"\n $event.stopPropagation();\n $event.preventDefault();\n enableEdit(row, col, true)\n \"\n #textModel=\"ngModel\"\n rows=\"4\"\n #textAreadInput\n [(ngModel)]=\"row[col.field]\"\n name=\"{{ col.field }}\"\n required\n (blur)=\"disableEdit(row, col, textModel)\"\n (keydown.enter)=\"textAreadInput.blur()\"\n autofocus\n class=\"form-control\"\n [ngClass]=\"{\n 'is-invalid': textModel.invalid\n }\"\n (mousedown)=\"$event.stopPropagation()\"\n ></textarea>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #defaultImagePlaceholder let-row=\"row\" let-col=\"col\">\n <span\n class=\"px-2 d-flex w-100 cell-content image-placeholder\"\n [title]=\"row?.full_name || row?.name || 'N/A'\"\n >\n <ng-container\n *ngIf=\"\n row?.logo ||\n row?.assetImage ||\n row?.invoice?.invoice_image ||\n row?.invoice_image;\n else placeholder\n \"\n >\n <span\n (click)=\"fullscreenImage = row?.profile_pictures?.[4]?.path ||\n row?.logo ||\n row?.assetImage ||\n row?.invoice_image\"\n class=\"pic\"\n [style.width.px]=\"rowHeight - 10\"\n [style.height.px]=\"rowHeight - 10\"\n [class.assets-pic]=\"gridType == 'Assets'\"\n >\n <img\n [width]=\"rowHeight - 12\"\n [height]=\"rowHeight - 12\"\n [style.width.px]=\"rowHeight - 10\"\n [style.height.px]=\"rowHeight - 10\"\n [src]=\"\n row?.profile_pictures?.[4]?.path ||\n row?.logo ||\n row?.assetImage ||\n row?.invoice_image\n \"\n alt=\"icon\"\n class=\"option-icon\"\n loading=\"lazy\"\n />\n </span>\n </ng-container>\n <!-- <div\n class=\"fullscreen-overlay\"\n *ngIf=\"fullscreenImage\"\n (click)=\"fullscreenImage = null\"\n >\n <img [src]=\"fullscreenImage\" class=\"fullscreen-img\" />\n </div> -->\n\n <ng-template #placeholder>\n <span\n [ngClass]=\"getDynamicClass(row?.full_name || row?.name)\"\n class=\"pic d-flex align-items-center rounded-circle\"\n [style.width.px]=\"rowHeight - 12\"\n [style.height.px]=\"rowHeight - 12\"\n [style.fontSize.px]=\"rowHeight / 3\"\n [class.assets-pic]=\"gridType == 'Assets'\"\n >\n {{ getInitials(row?.full_name) }}\n </span>\n </ng-template>\n </span>\n</ng-template>\n\n<!-- Right Click Menue -->\n<div\n [class.invisible]=\"!positionedYet\"\n class=\"context-menu p-2\"\n *ngIf=\"actionHide && actions?.length\"\n [ngStyle]=\"{ 'top.px': yPos, 'left.px': xPos }\"\n [class.show]=\"isVisible\"\n appendTo=\"body\"\n>\n <ul>\n <li\n *ngFor=\"let action of actions\"\n class=\"rounded d-flex align-items-center\"\n (click)=\"onActionClick(action)\"\n >\n <span\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/' + action + '.svg'\"\n class=\"data-grid-svg-icon right-click-menu-icons me-2\"\n ></span>\n <span class=\"text-capitalize fw-500\">{{ action }}</span>\n </li>\n </ul>\n</div>\n\n<!-- Details Toggle from bottom -->\n\n<ng-template #nestedTableTemplate let-row>\n <div\n class=\"nested-table table table-sm w-100 mb-0 center-nested-table w-100\"\n style=\"table-layout: fixed !important\"\n #nestedTableContainer\n >\n <thead\n #nestedHeader\n [style.backgroundColor]=\"nestedTableHeaderBackgroundColor\"\n >\n <div\n cdkDropList\n [cdkDropListData]=\"row?.detail.columns\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"dropColumn($event, row)\"\n (cdkDropListSorted)=\"onNestedColSort($event, previewNestedCols)\"\n [style.height.px]=\"nestedTableHeaderRowHeight\"\n class=\"d-flex tr border-below\"\n >\n <div\n *ngFor=\"let col of row.detail.columns; let i = index\"\n [style.width.px]=\"col?.width || 250\"\n [style.minWidth.px]=\"col?.width || 250\"\n [style.maxWidth.px]=\"col?.width || 250\"\n class=\"px-4 th\"\n [attr.field]=\"col.field\"\n [style.backgroundColor]=\"nestedTableHeaderBackgroundColor\"\n cdkDrag\n >\n <div\n class=\"d-flex h-100 justify-content-between position-relative align-items-center\"\n >\n <div class=\"text-ellipsis\" (click)=\"sortNestedCol(col, row)\">\n {{ col.header }}\n </div>\n <div class=\"d-flex gap-2\">\n <span\n *ngIf=\"currentSubSortColumn == col.field\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n (col?.order_by == 'desc'\n ? 'data-grid/icons/sort-desc.svg'\n : 'data-grid/icons/sort-asc.svg')\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center ms-2 start-50\"\n >\n </span>\n <!-- <div\n class=\"three-dots p-1\"\n (click)=\"openThreeDotsMenu($event, col)\"\n style=\"cursor: pointer\"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/icons/three-dots-vertical.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div> -->\n\n <!-- Only show menu if this column is active -->\n <div\n class=\"position-absolute\"\n *ngIf=\"activeCol === col\"\n style=\"top: -50%; z-index: 21; left: 0\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n columnMenu;\n context: {\n col: col,\n isNestedTable: true,\n columns: row?.detail.columns\n }\n \"\n ></ng-container>\n </div>\n <div\n class=\"resize-handle\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"\n $event.preventDefault();\n onResizeColumn($event, col);\n $event.stopPropagation()\n \"\n >\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n </div>\n </div>\n <ng-template cdkDragPreview>\n <div class=\"p-2 border d-flex gap-2\">\n <div>\n <span\n [inlineSVG]=\"\n singleSpaAssetsPath + 'data-grid/icons/arrows-move.svg'\n \"\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"\n ></span>\n </div>\n <div>{{ col.header }}</div>\n </div>\n </ng-template>\n </div>\n </div>\n </thead>\n <div\n [style.width.px]=\"nestedHeader.offsetWidth - 10\"\n [style.minWidth.px]=\"nestedHeader.offsetWidth - 10\"\n >\n <cdk-virtual-scroll-viewport\n [itemSize]=\"nestedTablerowHeight\"\n class=\"viewport\"\n [style.height.px]=\"\n (row?.detail?.result?.length < 5\n ? nestedTablerowHeight * row?.detail?.result?.length + 40\n : 300) + (hasHorizontalScroll ? -12 : 1)\n \"\n [style.width.px]=\"nestedHeader.offsetWidth - 10\"\n [style.minWidth.px]=\"nestedHeader.offsetWidth - 10\"\n >\n <div\n class=\"cursor-pointer border-below d-flex tr\"\n *cdkVirtualFor=\"let d of row?.detail?.result; trackBy: trackById\"\n [style.height.px]=\"nestedTablerowHeight\"\n [style.width.px]=\"nestedHeader?.offsetWidth\"\n [style.minWidth.px]=\"nestedHeader?.offsetWidth\"\n [style.backgroundColor]=\"bodyBackgroundColor\"\n (contextmenu)=\"onRightClick($event, d)\"\n >\n <div\n class=\"px-4 py-0 td\"\n *ngFor=\"let col of previewNestedCols; let j = index\"\n [style.fontSize.px]=\"nestedTablerowFontsize\"\n [attr.field]=\"col.field\"\n [style.width.px]=\"col?.width || 250\"\n [style.minWidth.px]=\"col?.width || 250\"\n [style.maxWidth.px]=\"col?.width || 250\"\n >\n <div\n [style.height.px]=\"nestedTablerowHeight - 1\"\n [style.max-width.px]=\"col?.width\"\n class=\"d-flex align-items-center\"\n >\n <!-- {{ d[col.field] || (col.is_amount ? 0 : \"-\") }} -->\n <div\n #cellText\n class=\"text-ellipsis flex-grow-1\"\n [title]=\"\n col.type === 'date'\n ? (getNestedValue(d, col.field) | date : dateFormat)\n : getNestedValue(d, col.field) || '-'\n \"\n >\n <ng-container *ngIf=\"col.type !== 'image'\">\n <ng-container *ngIf=\"col.is_amount\">{{\n currencySymbol\n }}</ng-container>\n {{\n !isNestedValueArray(d, col.field)\n ? col.type === 'date'\n ? (isDate(getNestedValue(d, col.field))\n ? (getNestedValue(d, col.field) | date: dateFormat)\n : (getNestedValue(d, col.field)?.value ||\n getNestedValue(d, col.field)?.name ||\n getNestedValue(d, col.field) ||\n '-'))\n : (getNestedValue(d, col.field)?.value ||\n getNestedValue(d, col.field)?.name ||\n getNestedValue(d, col.field) ||\n (col.is_amount ? 0: '-'))\n : (getNestedValue(d, col.field)?.[0]?.department_name ||\n getNestedValue(d, col.field)?.[0]?.roleName || getNestedValue(d, col.field)?.[0]?.full_name ||\n '-')\n }}\n </ng-container>\n <ng-container *ngIf=\"false\">\n {{ getTotalAmount(col) }}\n </ng-container>\n <ng-container *ngIf=\"col.type == 'image'\">\n <ng-container\n *ngTemplateOutlet=\"\n defaultImagePlaceholder;\n context: {\n row: d,\n col: col,\n }\n \"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </cdk-virtual-scroll-viewport>\n </div>\n </div>\n</ng-template>\n\n<ng-template #leftRightNestedPlaceholder let-row>\n <table\n class=\"nested-table table table-sm w-100 mb-0\"\n [style.backgroundColor]=\"bodyBackgroundColor\"\n [style.height.px]=\"\n gridType == 'Assets'\n ? (nestedTableContainer?.nativeElement?.offsetHeight ?? 0) + 12\n : (taskManagementContainer?.nativeElement?.offsetHeight ?? 0)\n \"\n >\n <!-- <div class=\"thead\">\n <div\n class=\"tr d-flex border-below\"\n [style.height.px]=\"nestedTableHeaderRowHeight\"\n [style.backgroundColor]=\"headerBackgroundColor\"\n >\n <div class=\"th\" *ngFor=\"let _ of [1, 2, 3, 4, 5]\"></div>\n </div>\n </div> -->\n <!-- <div class=\"tbody\">\n <div\n class=\"tr border-below\"\n [style.height.px]=\"nestedTablerowHeight\"\n *ngFor=\"let _ of row?.detail?.result\"\n [style.backgroundColor]=\"headerBackgroundColor\"\n >\n <div class=\"td\" *ngFor=\"let __ of [1, 2, 3, 4, 5]\" class=\"py-0\">\n <span\n [style.height.px]=\"nestedTablerowHeight\"\n [style.max-width.px]=\"nestedTablerowHeight\"\n ></span>\n </div>\n </div>\n </div> -->\n </table>\n</ng-template>\n\n<ng-template #taskManagementTemplate let-taskDetails=\"taskDetails\">\n <div\n class=\"p-4\"\n #taskManagementContainer\n [style.backgroundColor]=\"nestedTableHeaderBackgroundColor\"\n [style.fontFaimly]=\"fontFaimly\"\n >\n <div class=\"d-flex justify-content-between\">\n <div class=\"col-4\">\n <div class=\"item-title\">Description</div>\n <!-- <div class=\"item-content firstDiv\">\n {{ taskDetails.description }}\n </div> -->\n <p\n [style.fontSize]=\"bodyTextFontsSize\"\n class=\"item-content firstDiv taskDescription pe-4\"\n [innerHTML]=\"getSafeComment(taskDetails?.editor_description)\"\n (click)=\"openFullImage($event)\"\n ></p>\n </div>\n <div class=\"col-4\">\n <div class=\"item-title\">Attachments</div>\n <h5 *ngIf=\"taskDetails?.attachments?.length == 0\">\n No Attachments found\n </h5>\n <div\n *ngIf=\"taskDetails?.attachments?.length\"\n class=\"item-content d-flex flex-wrap\"\n style=\"gap: 10px\"\n >\n <a\n *ngFor=\"let attachement of taskDetails?.attachments; let i = index\"\n class=\"symbol-label fs-2 fw-semibold text-success cursor-pointer\"\n >\n <span\n title=\"{{ taskDetails?.attachments_name[i] || 'Attachment' }}\"\n (click)=\"downloadAttchment(attachement)\"\n [inlineSVG]=\"\n singleSpaAssetsPath +\n 'data-grid/document-icons/' +\n getExtention(attachement) +\n '.svg'\n \"\n >\n </span>\n </a>\n </div>\n </div>\n <div class=\"col-4\">\n <div class=\"item-title\">\n Comments ({{ taskDetails?.comments?.length }})\n </div>\n <h5 *ngIf=\"taskDetails?.comments?.length == 0\">No Comments found</h5>\n <div *ngIf=\"taskDetails?.comments?.length\" class=\"item-content\">\n <div class=\"comment\" *ngFor=\"let comment of taskDetails.comments\">\n <div class=\"d-flex align-items-center pe-3\">\n <img\n class=\"pic image-input-wrapper\"\n [style.width.px]=\"rowHeight - 12\"\n [style.height.px]=\"rowHeight - 12\"\n *ngIf=\"comment?.comment_by.logo\"\n src=\"{{ comment?.comment_by.logo }}\"\n alt=\"{{ comment.comment_by.full_name }}\"\n />\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> -->\n <span\n *ngIf=\"!comment?.comment_by.logo\"\n [ngClass]=\"getDynamicClass(comment.comment_by.full_name)\"\n class=\"pic d-flex align-items-center rounded-circle\"\n [style.width.px]=\"rowHeight - 12\"\n [style.height.px]=\"rowHeight - 12\"\n [style.fontSize.px]=\"rowHeight / 3\"\n title=\"{{ comment.comment_by.full_name }}\"\n >\n {{ getInitials(comment.comment_by.full_name) }}\n </span>\n </div>\n <div>\n <div class=\"comment-author fs-14px\">\n {{ comment?.comment_by.full_name }}\n </div>\n <div\n class=\"comment-content forCommentImg\"\n [innerHTML]=\"getSafeComment(comment.comment)\"\n ></div>\n <div class=\"comment-timestamp\">\n {{ comment.comment_date | date }}\n </div>\n <div class=\"comment-timestamp\">\n Replies: ({{ comment.replies.length }})\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n","import {\n Directive,\n Input,\n OnInit,\n ViewContainerRef,\n Injector,\n ComponentRef,\n Type,\n EventEmitter,\n Output\n} from '@angular/core';\n\n@Directive({\n selector: '[cellEditor]'\n})\nexport class CellEditorDirective implements OnInit {\n\n // Component type\n @Input('cellEditor') componentType!: Type<any>;\n\n // Inputs passed to the editor component\n @Input() rowData: any;\n @Input() colData: any;\n @Input() cellValue: any;\n\n // Parent component listens using:\n // (editorEvent)=\"finishEdit($event)\"\n @Output() editorEvent = new EventEmitter<{\n eventName: string;\n data: any;\n }>();\n\n constructor(\n private vcr: ViewContainerRef,\n private injector: Injector\n ) {}\n\n ngOnInit(): void {\n if (!this.componentType) return;\n\n // ✅ Dynamically create the editor component\n const componentRef: ComponentRef<any> = this.vcr.createComponent(\n this.componentType,\n {\n injector: Injector.create({\n providers: [\n { provide: 'rowData', useValue: this.rowData },\n { provide: 'colData', useValue: this.colData },\n { provide: 'cellValue', useValue: this.cellValue }\n ],\n parent: this.injector\n })\n }\n );\n\n // -----------------------------------------------\n // 1️⃣ Call custom lifecycle hook if it exists\n // -----------------------------------------------\n if (typeof componentRef.instance.editorInit === 'function') {\n componentRef.instance.editorInit({\n row: this.rowData,\n col: this.colData,\n value: this.cellValue\n });\n }\n\n // -----------------------------------------------\n // 2️⃣ Auto-detect all @Output() EventEmitters\n // -----------------------------------------------\n for (const key of Object.keys(componentRef.instance)) {\n const property = componentRef.instance[key];\n\n // Check if any property is an EventEmitter\n if (property instanceof EventEmitter) {\n property.subscribe((value: any) => {\n this.editorEvent.emit({\n eventName: key,\n data: {\n row: this.rowData,\n col: this.colData,\n value\n }\n });\n });\n }\n }\n }\n}\n","// format-index.pipe.ts\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'formatIndex'\n})\nexport class FormatIndexPipe implements PipeTransform {\n\n transform(value: number): string {\n if (value === null || value === undefined) return '';\n\n if (value > 9999) {\n // divide by 1000 and keep two decimals\n return (value / 1000).toFixed(2) + 'k';\n }\n\n return value.toString();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { DataGridComponent } from './data-grid/data-grid.component';\nimport { CommonModule, DatePipe, TitleCasePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FilterPipe } from './pipes/filter.pipe';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { InlineSVGModule } from 'ng-inline-svg';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\nimport { ScrollingModule } from '@angular/cdk/scrolling'; \nimport { CellHostDirective } from './directives/cellHost.directive'; \nimport { CellRenderInitDirective } from './directives/cell-render-init.directive'; \nimport { FormatCurrencyPipe } from './pipes/format-currency.pipe';\nimport { CellEditorDirective } from './directives/cell-editor.directive';\nimport { FormatIndexPipe } from './pipes/format-index.pipe';\n\n\n@NgModule({\n declarations: [DataGridComponent, FilterPipe, FormatIndexPipe, CellHostDirective, CellRenderInitDirective, CellEditorDirective, FormatCurrencyPipe ],\n imports: [CommonModule, FormsModule, DragDropModule, InlineSVGModule.forRoot(), ScrollingModule, TitleCasePipe],\nexports: [DataGridComponent],\n providers: [FormatCurrencyPipe, DatePipe],\n})\nexport class DataGridModule {}\n","/*\n * Public API Surface of data-grid\n */\n\nexport * from './lib/data-grid.module';\nexport * from './lib/data-grid/data-grid.component';\nexport * from './lib/interfaces/data-grid-config.ts';\nexport * from './lib/services/common.service';\n// import './lib/styles/styles.css';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SplitColumnsService","i2.CommonService","i3.CopyServiceService","i5.ExportService","i7.FormatCurrencyPipe","i12.CellRenderInitDirective","i13.FilterPipe","i1"],"mappings":"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"}
|
|
1
|
+
{"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/pipes/format-currency.pipe.ts","../../../projects/data-grid/src/lib/directives/cell-render-init.directive.ts","../../../projects/data-grid/src/lib/directives/cell-editor.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/pipes/format-index.pipe.ts","../../../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 // ✅ Columns that already have width\r\n const fixedCols = visibleLeafCols.filter(\r\n col => col.width && col.width > 0\r\n );\r\n\r\n // ✅ Columns that need width\r\n const flexibleCols = visibleLeafCols.filter(\r\n col => !col.width && col.is_visible !== false\r\n );\r\n\r\n // ✅ Total width already consumed\r\n const usedWidth = fixedCols.reduce(\r\n (sum, col) => sum + col.width,\r\n 0\r\n );\r\n\r\n // ✅ Remaining width after fixed columns\r\n let remainingWidth = containerWidth - (usedWidth + 50);\r\n if (remainingWidth < 0) remainingWidth = 0;\r\n\r\n // ✅ Average width for columns without width\r\n let defaultWidth =\r\n flexibleCols.length > 0\r\n ? Math.floor(remainingWidth / flexibleCols.length)\r\n : 0;\r\n\r\n // ✅ Enforce minimum\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 return {\r\n ...col,\r\n children: cloneColumns(col.children)\r\n };\r\n }\r\n\r\n // ✅ Keep existing width\r\n if (col.width) {\r\n return { ...col };\r\n }\r\n\r\n // ✅ Hidden columns → fixed small width\r\n if (col.is_visible === false) {\r\n return { ...col, width: 150 };\r\n }\r\n\r\n // ✅ Assign calculated default width\r\n return { ...col, width: defaultWidth };\r\n });\r\n\r\n return cloneColumns(columns);\r\n}\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 { DatePipe } from '@angular/common';\r\nimport { inject, Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CommonService {\r\n\r\n private datePipe = inject(DatePipe); \r\n constructor() { }\r\n\r\n public mainContainerLeft = 0;\r\n\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\n getFiltersFromColumns(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.type == 'array') ? col.query?._ids : [],\r\n query: (col.type == 'dropdown' || col.type == 'array') ? 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\n async 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' && col.type !== 'number' ? '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' || col.type == 'array') {\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' && col.type != 'number' ? '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\n activeFilteredColumns: any[] = [];\r\n updateActiveFilteredColumns(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\n hasFieldChanged(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' || col.type == 'array') {\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 formatDateValue(value: any, momentFormat?: string): string {\r\n const tryFormat = (date: Date) => {\r\n const angularFormat = momentFormat\r\n ? this.convertMomentToAngularDateFormat(momentFormat)\r\n : 'dd/MM/yyyy';\r\n return this.datePipe.transform(date, angularFormat) ?? '-';\r\n };\r\n\r\n if (value instanceof Date && !isNaN(value.getTime())) {\r\n return tryFormat(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n let cleanedValue = value.replace(/^DD/, '01');\r\n\r\n const parsedDDMM = this.parseDDMMYYYY(cleanedValue);\r\n if (parsedDDMM) return tryFormat(parsedDDMM);\r\n\r\n if (!isNaN(Date.parse(cleanedValue))) {\r\n return tryFormat(new Date(cleanedValue));\r\n }\r\n }\r\n\r\n\r\n if (typeof value === 'string' && !isNaN(Date.parse(value))) {\r\n return tryFormat(new Date(value));\r\n }\r\n\r\n if (value?.name || value?.value) {\r\n return value.value ?? value.name ?? '-';\r\n }\r\n\r\n if (value != null) return String(value);\r\n\r\n return '-';\r\n }\r\n\r\n\r\n\r\n\r\n private convertMomentToAngularDateFormat(momentFormat: string): string {\r\n if (!momentFormat) return 'mediumDate';\r\n\r\n return momentFormat\r\n .replace(/DD/g, 'dd')\r\n .replace(/D/g, 'd')\r\n .replace(/YYYY/g, 'yyyy')\r\n .replace(/YY/g, 'yy')\r\n .replace(/MMMM/g, 'MMMM')\r\n .replace(/MMM/g, 'MMM')\r\n .replace(/MM/g, 'MM')\r\n .replace(/M/g, 'M')\r\n .replace(/dddd/g, 'EEEE')\r\n .replace(/ddd/g, 'EEE')\r\n .replace(/HH/g, 'HH')\r\n .replace(/H/g, 'H')\r\n .replace(/hh/g, 'hh')\r\n .replace(/h/g, 'h')\r\n .replace(/mm/g, 'mm')\r\n .replace(/m/g, 'm')\r\n .replace(/ss/g, 'ss')\r\n .replace(/s/g, 's')\r\n .replace(/A/g, 'a')\r\n .replace(/a/g, 'a');\r\n }\r\n\r\n private parseDDMMYYYY(value: string): Date | null {\r\n const match = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/);\r\n if (!match) return null;\r\n\r\n const day = +match[1];\r\n const month = +match[2] - 1;\r\n const year = +match[3];\r\n\r\n const date = new Date(year, month, day);\r\n\r\n return (date.getFullYear() === year &&\r\n date.getMonth() === month &&\r\n date.getDate() === day)\r\n ? date\r\n : null;\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 { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'formatCurrencies',\r\n})\r\nexport class FormatCurrencyPipe implements PipeTransform {\r\n transform(value: number | string, currencyFormat: string): string {\r\n if (value == null || value === '' || !value) return '';\r\n\r\n const numericValue = typeof value === 'string' ? parseFloat(value) : value;\r\n if (isNaN(numericValue)) return '';\r\n\r\n\r\n let [integerPart, decimalPart] = numericValue.toFixed(2).split('.');\r\n\r\n\r\n let formattedInteger = integerPart;\r\n\r\n switch (currencyFormat) {\r\n case '1,234,567.89':\r\n formattedInteger = new Intl.NumberFormat('en-US', {\r\n style: 'decimal',\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(Number(integerPart));\r\n break;\r\n\r\n case '12,34,567.89':\r\n formattedInteger = new Intl.NumberFormat('en-IN', {\r\n style: 'decimal',\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(Number(integerPart)).replace(/(\\d)(?=(\\d{2})+\\d)/g, '$1,');\r\n break;\r\n\r\n case '1234567,89':\r\n formattedInteger = new Intl.NumberFormat('fr-FR', {\r\n style: 'decimal',\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(Number(integerPart)).replace(',', '.');\r\n break;\r\n\r\n case '1.234.567,89':\r\n formattedInteger = new Intl.NumberFormat('de-DE', {\r\n style: 'decimal',\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(Number(integerPart)).replace('.', ',');\r\n break;\r\n\r\n default:\r\n formattedInteger = integerPart;\r\n }\r\n\r\n return `${formattedInteger}.${decimalPart}`;\r\n }\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 {\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: '[cellEditor]'\r\n})\r\nexport class CellEditorDirective implements OnInit {\r\n\r\n // Component type\r\n @Input('cellEditor') componentType!: Type<any>;\r\n\r\n // Inputs passed to the editor component\r\n @Input() rowData: any;\r\n @Input() colData: any;\r\n @Input() cellValue: any;\r\n\r\n // Parent component listens using:\r\n // (editorEvent)=\"finishEdit($event)\"\r\n @Output() editorEvent = new EventEmitter<{\r\n eventName: string;\r\n data: any;\r\n }>();\r\n\r\n constructor(\r\n private vcr: ViewContainerRef,\r\n private injector: Injector\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (!this.componentType) return;\r\n\r\n // ✅ Dynamically create the editor component\r\n const componentRef: ComponentRef<any> = this.vcr.createComponent(\r\n this.componentType,\r\n {\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\r\n // -----------------------------------------------\r\n // 1️⃣ Call custom lifecycle hook if it exists\r\n // -----------------------------------------------\r\n if (typeof componentRef.instance.editorInit === 'function') {\r\n componentRef.instance.editorInit({\r\n row: this.rowData,\r\n col: this.colData,\r\n value: this.cellValue\r\n });\r\n }\r\n\r\n // -----------------------------------------------\r\n // 2️⃣ Auto-detect all @Output() EventEmitters\r\n // -----------------------------------------------\r\n for (const key of Object.keys(componentRef.instance)) {\r\n const property = componentRef.instance[key];\r\n\r\n // Check if any property is an EventEmitter\r\n if (property instanceof EventEmitter) {\r\n property.subscribe((value: any) => {\r\n this.editorEvent.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 { firstValueFrom, 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\nimport { DatePipe } from '@angular/common';\r\nimport { FormatCurrencyPipe } from '../pipes/format-currency.pipe';\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 = ''\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 @Input() currencyFormat: string = '';\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 @Input() pageSizeOptions = [10, 25, 50, 75, 100, 150, 200, 250, 300, 500];\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 storePresetName: string = '';\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 private secretKey = 'tb-super-admin'\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 private datePipe: DatePipe,\r\n private formatCurrency: FormatCurrencyPipe,\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\r\n shouldRestoreScroll = false;\r\n ngAfterViewChecked(): void {\r\n this.addStylesToImages();\r\n this.hasScroll = this.hasHorizontalScrollbar();\r\n this.cdr.detectChanges();\r\n if (\r\n this.shouldRestoreScroll &&\r\n this.centerScrollableBody?.nativeElement\r\n ) {\r\n setTimeout(() => {\r\n const left = this.commonSevice.mainContainerLeft;\r\n this.centerScrollableBody.nativeElement.scrollLeft = left;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = left;\r\n this.shouldRestoreScroll = false;\r\n }, 1000);\r\n }\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 if (!this.curretaTablePresetForUpdate) {\r\n // this.autoSizeColumnsByRatio();\r\n }\r\n\r\n // const user = this.getDecrypt('user');\r\n // this.currencyFormat = user?.currency_format;\r\n // this.currencySymbol = user?.currency_symbol;\r\n // this.dateFormat = user?.date_format;\r\n if (!this.dateFormat) {\r\n const storedDateFormat = localStorage.getItem('dateformat');\r\n if (storedDateFormat) {\r\n this.dateFormat = storedDateFormat ? JSON.parse(storedDateFormat) : 'dd/MM/yyyy';\r\n }\r\n }\r\n\r\n if (!this.currencyFormat) {\r\n const storedCurrencyFormat = localStorage.getItem('currencyFormat');\r\n if (storedCurrencyFormat) {\r\n this.currencyFormat = storedCurrencyFormat ? JSON.parse(storedCurrencyFormat) : '1,234,567.89';\r\n }\r\n }\r\n\r\n if (!this.currencySymbol) {\r\n const storedCurrencySymbol = localStorage.getItem('currencySymbol');\r\n if (storedCurrencySymbol) {\r\n this.currencySymbol = storedCurrencySymbol ? JSON.parse(storedCurrencySymbol) : '$';\r\n }\r\n }\r\n\r\n }\r\n\r\n // private getDecrypt(key:string){\r\n // const value = localStorage.getItem(key)\r\n // try {\r\n // return JSON.parse(CryptoJS.AES.decrypt(value as string, this.secretKey).toString(CryptoJS.enc.Utf8))\r\n // } catch (e) {\r\n // return null;\r\n // }\r\n // }\r\n\r\n dataSetLoading = false;\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 if (this.tabs.includes('Current Policy')) {\r\n this.activeTab = this.tabs?.[1] || 'Current Policy';\r\n } else {\r\n this.activeTab = savedTab || this.tabs?.[0];\r\n }\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 if(this.commonSevice?.mainContainerLeft > 200)\r\n this.shouldRestoreScroll = true;\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 this.dataSetLoading = true;\r\n setTimeout(() => {\r\n if (this.centerScrollableBody?.nativeElement) {\r\n this.centerScrollableBody.nativeElement.scrollLeft =\r\n this.centerPinnedHeader.nativeElement.scrollLeft;\r\n }\r\n this.dataSetLoading = false;\r\n this.cdr.detectChanges();\r\n }, 500);\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.storePresetName = 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.setTableLayout(this.selectedTableLayout);\r\n this.oddRowsBackgroundColor = temprorySelected?.config?.oddRowsBackgroundColor || '#f1f1f1';\r\n const groupedColumns = temprorySelected?.config?.groupedColumns;\r\n if(groupedColumns?.length){\r\n this.groupedColumns = structuredClone(groupedColumns);\r\n this.groupDataAsync(this.dataSet, this.groupedColumns);\r\n }\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 = 'medium';\r\n this.bodyTextFontsSize = 14;\r\n this.globalSearchText = '';\r\n // this.autoSizeColumnsByRatio();\r\n this.presetName = ''\r\n }\r\n this.cdr.detectChanges();\r\n }, 0);\r\n }\r\n\r\n }\r\n\r\n\r\n \r\n\r\n async setColumnsColumnDropdownValus(): Promise<void> {\r\n if (!this.columns) return;\r\n // Just removed temporary for super admin will set it again\r\n if (this.columns?.length) {\r\n this.columns = this.columns?.filter(c => c?.field?.trim() !== 'is_deleted')\r\n }\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 let containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\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 const visibleColumns = this.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 // 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 return columns.map((col) => {\r\n const {\r\n __typename,\r\n _id,\r\n column_dropdown_value,\r\n filterValue,\r\n expandedFilter,\r\n query,\r\n isRowGrouped,\r\n ...rest\r\n } = col;\r\n\r\n // Clean dropdown values (__typename removed)\r\n const cleanedDropdown = Array.isArray(column_dropdown_value)\r\n ? column_dropdown_value.map(({ __typename, ...dRest }) => dRest)\r\n : column_dropdown_value\r\n ? (({ __typename, ...dRest }) => dRest)(column_dropdown_value)\r\n : null;\r\n\r\n // Clean query (__typename removed)\r\n const cleanedQuery = Array.isArray(query)\r\n ? query.map(({ __typename, ...qRest }) => qRest)\r\n : query\r\n ? (({ __typename, _ids, ...qRest }) => qRest)(query)\r\n : null;\r\n\r\n return {\r\n ...rest,\r\n column_dropdown_value: cleanedDropdown,\r\n query: cleanedQuery,\r\n };\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 private 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(...this.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 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 visibleColumns = this.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 leafRows = this.getAllLeafRows(data);\r\n const allIds = leafRows.map(r => this.getRowId(r));\r\n\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 const leafRows = this.getAllLeafRows(data);\r\n return leafRows.length > 0 && leafRows.every(r => this.selectedRows.has(this.getRowId(r)));\r\n }\r\n\r\n\r\n isIndeterminateState(data: any[]): boolean {\r\n const leafRows = this.getAllLeafRows(data);\r\n const selectedCount = leafRows.filter(r => this.selectedRows.has(this.getRowId(r))).length;\r\n\r\n return selectedCount > 0 && selectedCount < leafRows.length;\r\n }\r\n\r\n\r\n getAllLeafRows(data: any[]): any[] {\r\n const leaf: any[] = [];\r\n\r\n const traverse = (node: any) => {\r\n if (!node) return;\r\n\r\n if (node.isGroup) {\r\n node.children?.forEach(traverse);\r\n } else {\r\n leaf.push(node);\r\n }\r\n };\r\n\r\n data.forEach(traverse);\r\n return leaf;\r\n }\r\n\r\n\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\nallColumnsSelected(): boolean {\r\n const flatten = this.flattenColumns(this.columns);\r\n const nonAlwaysVisible = flatten.filter(col => !col.is_always_visible);\r\n \r\n // Return true if all non-always-visible columns are visible\r\n return nonAlwaysVisible.length > 0 && nonAlwaysVisible.every(col => col.is_visible);\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 && column.is_visible || (column?.is_always_visible)) {\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\nasync toggleAllColumnsVisibility(): Promise<void> {\r\n this.loading = true;\r\n\r\n try {\r\n const flatten = this.flattenColumns(this.columns);\r\n const visibleColumns = flatten.filter(col => col.is_visible);\r\n \r\n // Get columns that are not always visible\r\n const nonAlwaysVisible = flatten.filter(col => !col.is_always_visible);\r\n \r\n // Check if all non-always-visible columns are currently visible\r\n const allNonAlwaysVisibleAreVisible = nonAlwaysVisible.every(col => col.is_visible);\r\n\r\n if (allNonAlwaysVisibleAreVisible) {\r\n // HIDE ALL (but keep minimum 2 visible)\r\n // First, hide all non-always-visible columns\r\n nonAlwaysVisible.forEach(col => {\r\n col.is_visible = false;\r\n });\r\n \r\n // Then, make sure at least 2 columns are visible (including always-visible ones)\r\n const alwaysVisibleCount = flatten.filter(col => col.is_always_visible).length;\r\n const columnsNeeded = Math.max(0, 2 - alwaysVisibleCount);\r\n \r\n if (columnsNeeded > 0) {\r\n // Show the first 'columnsNeeded' non-always-visible columns\r\n for (let i = 0; i < Math.min(columnsNeeded, nonAlwaysVisible.length); i++) {\r\n nonAlwaysVisible[i].is_visible = true;\r\n }\r\n }\r\n } else {\r\n // SHOW ALL - make all columns visible\r\n flatten.forEach(col => {\r\n col.is_visible = true;\r\n });\r\n }\r\n\r\n await this.updateColumnWidthsAndGroups();\r\n await this.refreshPreviewColumns();\r\n \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 } finally {\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n private wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n\r\n\r\n visibleColumns() {\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 if (!this.curretaTablePresetForUpdate) this.autoSizeColumnsByRatio();\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 autoSizeColumnsByRatio(): 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 return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n\r\n if (visibleColumns.length === 0) return;\r\n let containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\r\n\r\n if (this.showSerialNumber) containerWidth -= 55;\r\n if (this.showSideMenu) containerWidth -= 29;\r\n if (this.gridType == 'Assets' || this.gridType == 'Tasks')\r\n containerWidth -= 30;\r\n containerWidth -= 55;\r\n const totalOldWidth = visibleColumns.reduce(\r\n (sum, col) => sum + (col.width || 0),\r\n 0\r\n );\r\n if (totalOldWidth === 0) return;\r\n visibleColumns.forEach((col) => {\r\n const ratio = col.width / totalOldWidth;\r\n const newWidth = Math.max(Math.floor(containerWidth * ratio), 100);\r\n col.width = newWidth;\r\n this.updateColumnWidthInSourceByField(col.field, newWidth);\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 }, 400);\r\n }\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 await firstValueFrom(this.ngZone.onStable);\r\n // this.ngZone.runOutsideAngular(() => {\r\n // Wait a tick to make sure elements are rendered\r\n requestAnimationFrame(() => {\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 oldLeft = firstPositions.get(el);\r\n if (oldLeft == null) return; // skip if old position not available\r\n\r\n const newLeft = el.getBoundingClientRect().left;\r\n const deltaX = oldLeft - newLeft;\r\n\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\r\n // Force reflow\r\n void el.offsetWidth;\r\n\r\n el.style.transition = 'transform 250ms 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 });\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\r\n await firstValueFrom(this.ngZone.onStable);\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\r\n this.ngZone.runOutsideAngular(() => {\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 oldLeft = firstPositions.get(el);\r\n if (oldLeft == null) return; // safety check\r\n\r\n const newLeft = el.getBoundingClientRect().left;\r\n const deltaX = oldLeft - newLeft;\r\n\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\r\n // Force reflow\r\n void el.offsetWidth;\r\n\r\n el.style.transition = 'transform 250ms 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 });\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 } \r\n // Check for Date object OR date string\r\n else if (keyValue instanceof Date || (typeof keyValue === 'string' && !isNaN(Date.parse(keyValue)))) {\r\n const dateObj = keyValue instanceof Date ? keyValue : new Date(keyValue);\r\n groupKey = this.commonSevice.formatDateValue(dateObj, this.dateFormat || 'dd/MM/yyyy');\r\n } \r\n else {\r\n groupKey = keyValue ? this.toTitleCase(String(keyValue).trim()) : \"_Blank\";\r\n }\r\n \r\n // if (typeof keyValue === 'string' && !isNaN(Date.parse(keyValue))) {\r\n // const dateObj = new Date(keyValue);\r\n // groupKey = this.commonSevice.formatDateValue(dateObj, this.dateFormat || 'dd/MM/yyyy');\r\n // }\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 toTitleCase(str: string): string {\r\n return str\r\n ?.toLowerCase()\r\n ?.split(' ')\r\n ?.map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n ?.join(' ');\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 this.isTablePresetNotChanged ? (this.presetName = '') : ( this.presetName = this.storePresetName)\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 this.setTableLayout(layoutType)\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 setTableLayout(layoutType: string) {\r\n if (!layoutType) return;\r\n if (layoutType === 'small') {\r\n this.rowHeight = 36;\r\n this.headerRowHeight = 40;\r\n this.bodyTextFontsSize = this.bodyTextFontsSize || 10;\r\n this.headerTextFontsSize = 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 = this.bodyTextFontsSize || 14;\r\n this.headerTextFontsSize = this.headerTextFontsSize || 14;\r\n\r\n } else {\r\n this.rowHeight = 60;\r\n this.headerRowHeight = 52;\r\n this.bodyTextFontsSize = this.bodyTextFontsSize || 16;\r\n this.headerTextFontsSize = this.headerTextFontsSize || 16;\r\n }\r\n }\r\n\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 || !col.is_search_able) return;\r\n this.selectedColumnForFilter = col;\r\n this.isThreeDotsFilterOpen = true;\r\n this.addFilterColumnInput = '';\r\n if (col.type === 'dropdown' || col.type === 'array') {\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' || col.type == 'number') ? 'equal' : 'contain');\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col.query.first_condition ? col.query.first_condition : ((col.type == 'date' || col.type == 'number') ? 'equal' : 'contain');\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\r\n openFilterFromDisabledSearchedInput(col: any) {\r\n if (col.type !== 'dropdown' && col.type !== 'array' || !col.is_search_able) return;\r\n this.openFilter(col);\r\n }\r\n\r\n openFilter(col: any) {\r\n if(!col.is_search_able) return;\r\n this.activeFilterCell = col;\r\n this.activeCol = null\r\n this.isFilterOpen = true;\r\n this.searchTextForFilterDropDown = '';\r\n this.addFilterColumnInput = '';\r\n this.selectedColumnForFilter = col;\r\n\r\n if (col.type === 'dropdown' || col.type == 'array') {\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 || (col.type == 'number' || 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 ||(col.type == 'number' || col.type == 'date') ? 'equal' : 'contain';\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: string | null = null;\r\n condition: string | null = '';\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' || column.type == 'array') {\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.secondValue ? this.condition : 'none',\r\n second_condition: this.secondValue ? 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.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\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.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\r\n this.filterOptions.emit(filters);\r\n }, 200);\r\n }\r\n\r\n\r\n clearAllFilters() {\r\n this.groupedColumns = [];\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: [],\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 this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\r\n this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\r\n setTimeout(() => {\r\n const filteredColumns = this.cleanFilterdColumns();\r\n this.genericEvent.emit(event);\r\n this.filterOptions.emit(filteredColumns);\r\n }, 300);\r\n this.cdr.detectChanges();\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 this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\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 this.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\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'|| column.type == 'array') {\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 if (control && control.pristine) {\r\n this.editingKey = null;\r\n return;\r\n }\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.commonSevice.mainContainerLeft = this.centerScrollableBody.nativeElement.scrollLeft;\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\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 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 this.genericEvent.emit(event)\r\n }, 500);\r\n }\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 =this.dataGridContainer.nativeElement.offsetHeight;\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 > this.dataGridContainer.nativeElement.offsetHeight) {\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 text = type?.toLowerCase();\r\n if (text == 'archive' || text == 'unarchive'\r\n // || text == 'delete' || text == 'restore' || text == 'remove' || text == 'deactivate' || text == 'activate' || text == 'block' || text == 'unblock'\r\n // || text == 'enable' || text == 'disable' || text == 'approve' || text == 'reject' || text == 'publish' || text == 'unpublish' || text == 'lock' || text == 'unlock' || text == 'complete' || text == 'incomplete'\r\n // || text == 'send to review' || text == 'mark as paid' || text == 'mark as unpaid' || text == 'fulfill' || text == 'unfulfill' || text == 'refund' || text == 'cancel' || text == 'resend' || text == 'chargeback'\r\n // || text == 'dispute' || text == 'escalate' || text == 'deescalate' || text == 'flag' || text == 'unflag' || text == 'verify' || text == 'unverify' || text == 'subscribe' || text == 'unsubscribe' || text == 'follow' || text == 'unfollow'\r\n // || text == 'like' || text == 'unlike' || text == 'share' || text == 'unshare' || text == 'comment' || text == 'uncomment' || text == 'tag' || text == 'untag' || text == 'assign' || text == 'unassign' || text == 'link' || text == 'unlink'\r\n // || text == 'sync' || text == 'unsync' || text == 'backup' || text == 'restore backup' || text == 'migrate' || text == 'import' || text == 'export' || text == 'generate report' || text == 'download report' || text == 'view details'\r\n // || text == 'edit details' || text == 'update details' || text == 'change status' || text == 'reset password' || text == 'send notification' || text == 'schedule' || text == 'reschedule' || text == 'cancel schedule' || text == 'start' || text == 'stop' || text == 'pause' || text == 'resume'\r\n ) {\r\n this.clearSelectionState(this.tableType);\r\n this.selectedRows.clear();\r\n }\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 || column?.cellRenderer) 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 ) {\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'|| column.type == 'array') {\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 if(!this.enableCut) return;\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 if (!total) return `${this.currencySymbol} 0.00`\r\n return `${this.currencySymbol} ${this.formatCurrency.transform(total, this.currencyFormat)}`;\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 || x.is_temp);\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)\r\n && (this.bodyTextFontsSize == currPreset.config.bodyTextFontsSize) &&\r\n (this.headerTextFontsSize == this.headerTextFontsSize)\r\n && this.curretaTablePresetForUpdate.config.showVerticalBorder == this.showVerticalBorder\r\n && this.curretaTablePresetForUpdate.config.fontFaimly == this.fontFaimly\r\n && this.curretaTablePresetForUpdate.config.selectedTableLayout == this.selectedTableLayout\r\n && this.curretaTablePresetForUpdate.config.bodyTextFontsSize == this.bodyTextFontsSize\r\n && this.curretaTablePresetForUpdate.config.rowShadingEnabled == this.rowShadingEnabled);\r\n\r\n // return false\r\n }\r\n\r\n onActionButtonClick(button: string) {\r\n const text = button?.toLocaleLowerCase();\r\n if (text == 'active data' || text == 'active' || text == 'data active' || text == 'unarchived data' || text == 'unarchive data') this.clearSelectionState(this.tableType);\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.centerPinnedHeader?.nativeElement) return false;\r\n const el = this.centerPinnedHeader.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(/ /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 private flattenGroup(row: any): any[] {\r\n const result: any[] = [];\r\n const traverse = (node: any) => {\r\n if (!node) return;\r\n if (node.isGroup) {\r\n node.children?.forEach((child: any) => traverse(child));\r\n } else {\r\n result.push(node);\r\n }\r\n };\r\n traverse(row);\r\n return result;\r\n }\r\n\r\n selectGroupRow(e: Event, row: any) {\r\n const checkbox = e.target as HTMLInputElement;\r\n const isChecked = checkbox.checked;\r\n // Get all deep data rows (leaf rows)\r\n const leafRows = this.flattenGroup(row);\r\n if (isChecked) {\r\n leafRows.forEach(r => {\r\n const id = r._id || r.id;\r\n if (id) this.selectedRows.add(id);\r\n });\r\n } else {\r\n leafRows.forEach(r => {\r\n const id = r._id || r.id;\r\n if (id) this.selectedRows.delete(id);\r\n });\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 this.genericEvent.emit(event);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n getGroupCheckedState(row: any): boolean | undefined {\r\n if (!row.isGroup) return false;\r\n const leafRows = this.flattenGroup(row);\r\n let checkedCount = 0;\r\n leafRows.forEach(r => {\r\n const id = r._id || r.id;\r\n if (this.selectedRows.has(id)) checkedCount++;\r\n });\r\n if (checkedCount === 0) return false;\r\n if (checkedCount === leafRows.length) return true;\r\n return undefined;\r\n }\r\n\r\n getCellTitle(row: any, col: any): string {\r\n const val = this.getNestedValue(row, col.field);\r\n\r\n if (!this.isNestedValueArray(row, col.field)) {\r\n if (col.type === 'date') {\r\n return this.commonSevice.formatDateValue(val, this.dateFormat);\r\n } else if (col?.is_amount) {\r\n if (!val) return `0.00`\r\n return this.formatCurrency.transform(val, this.currencyFormat);\r\n }\r\n\r\n return (\r\n val?.value ??\r\n val?.name ??\r\n val ??\r\n (col.is_amount ? '0' : '-')\r\n ) + '';\r\n }\r\n\r\n const first = val?.[0];\r\n\r\n return (\r\n first?.department_name ??\r\n first?.roleName ??\r\n first?.full_name ??\r\n '-'\r\n );\r\n }\r\n\r\n\r\n finishEdit(event: any) {\r\n console.log('cell editeddddddddddddddd: ', event)\r\n }\r\n\r\n\r\n getDynamicRight(col: any, section: string, colIndex: number, subColIndex: number){\r\n if(section == 'right' && this.previewRightPinnedColumns?.length == 1 && col.width < 200){\r\n return 100;\r\n }else if(section == 'right'){\r\n return null;\r\n }\r\n else if(section == 'previewCenterColumns' && colIndex == (this.previewCenterColumns?.length - 1) && col.width < 200){\r\n return 200\r\n }else{\r\n return col.width - 45;\r\n }\r\n }\r\n\r\n blurInput(event: Event, row: any, col: any): void {\r\n const input = event?.target as HTMLInputElement;\r\n input?.blur();\r\n this.setActiveCell(row, col);\r\n setTimeout(() => {\r\n this.editingKey = '';\r\n this.cdr.detectChanges();\r\n }, 0);\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 class=\"align-items-center d-flex\"\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 style=\"width: 16px; height: 16px\"\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 && !dataSetLoading\"\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 || dataSetLoading\"\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 && !dataSetLoading\"\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 >\r\n <div [@rowDynamic]=\"rowAnimation\" *ngIf=\"!loading && !dataSetLoading\">\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 </div>\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 && !dataSetLoading\"\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 mt-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=\"hasScroll && !shouldRestoreScroll\"\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-columnIndex=\"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 columnIndex: columnIndex,\r\n childColIndex: i\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' || child?.type == 'array'\r\n \"\r\n [class.disabled-search-input]=\"\r\n child?.type == 'dropdown' || child?.type == 'image' || child?.type == 'array'\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 columnIndex: columnIndex,\r\n childColIndex: 0\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' || col?.type == 'array'\"\r\n [class.disabled-search-input]=\"\r\n col?.type == 'dropdown' || col?.type == 'image' || col?.type == 'array'\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?.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 *ngIf=\"showCheckboxes\"\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\r\n style=\"width: 16px; height: 16px\"\r\n type=\"checkbox\"\r\n [checked]=\"getGroupCheckedState(row) === true\"\r\n [indeterminate]=\"getGroupCheckedState(row) === undefined\"\r\n (change)=\"selectGroupRow($event, row)\"\r\n />\r\n\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 align-items-center d-flex\"\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 style=\"width: 16px; height: 16px\"\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\r\n <ng-container *ngIf=\"col.cellEditor; else builtInEditors\">\r\n <ng-container\r\n [cellEditor]=\"col.cellEditor\"\r\n [rowData]=\"row\"\r\n [colData]=\"col\"\r\n [cellValue]=\"getNestedValue(row, col.field)\"\r\n (editorEvent)=\"finishEdit($event)\"\r\n ></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #builtInEditors>\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 (keydown.enter)=\"blurInput($event, row, col)\"\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, numberInput)\"\r\n autofocus\r\n (keydown.enter)=\"blurInput($event, row, col)\"\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, dateInput)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n #dateInput=\"ngModel\"\r\n (keydown.enter)=\"blurInput($event, row, col)\"\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\" *ngIf=\"col?.column_dropdown_value?.length > 5\">\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 <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.selected]=\"getNestedValue(row, col.field) == option?.value || getNestedValue(row, col.field) == option\"\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 \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)=\"blurInput($event, row, col)\"\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 (keydown.enter)=\"blurInput($event, row, col)\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\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 </ng-template>\r\n\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]=\"getCellTitle(row, col)\"\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 {{getCellTitle(row, col)}}\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 let-columnIndex=\"columnIndex\"\r\n let-childColIndex=\"childColIndex\"\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\" [class.disable-sorting]=\"col?.type == 'image' || !col.is_search_able\">\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 && col?.is_search_able\"\r\n class=\"three-dots-col-menu position-relative\"\r\n [style.right.px]=\"getDynamicRight(col, section, columnIndex, childColIndex)\"\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'|| col?.type == 'array'; 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 ms-1 select-all-filter\">\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 ms-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) | titlecase ) }}\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 == 'string'\">\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\r\n <ng-container *ngIf=\"selectedColumnForFilter?.type == 'number'\">\r\n <option value=\"equal\">Equals To</option>\r\n <option value=\"before\">Less Then </option>\r\n <option value=\"after\">Greater Then </option>\r\n <option value=\"less_then_equal\">less then Equal to</option>\r\n <option value=\"greater_then_equal\">Greater then Equal to </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 == 'string'\">\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\r\n <ng-container *ngIf=\"selectedColumnForFilter?.type == 'number'\">\r\n <option value=\"equal\">Equals To</option>\r\n <option value=\"before\">Less Then </option>\r\n <option value=\"after\">Greater Then </option>\r\n <option value=\"less_then_equal\">less then Equal to</option>\r\n <option value=\"greater_then_equal\">Greater then Equal to </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=\"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' || col?.type == 'array'; 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 select-all-filter\">\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) | titlecase ) }}\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 == 'string'\">\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\r\n <ng-container *ngIf=\"col?.type == 'number'\">\r\n <option value=\"equal\">Equals To</option>\r\n <option value=\"before\">Less Then </option>\r\n <option value=\"after\">Greater Then </option>\r\n <option value=\"less_then_equal\">less then Equal to</option>\r\n <option value=\"greater_then_equal\">Greater then Equal to </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 == 'string'\">\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\r\n <ng-container *ngIf=\"col?.type == 'number'\">\r\n <option value=\"equal\">Equals To</option>\r\n <option value=\"before\">Less Then </option>\r\n <option value=\"after\">Greater Then </option>\r\n <option value=\"less_then_equal\">less then Equal to</option>\r\n <option value=\"greater_then_equal\">Greater then Equal to </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 [class.disabled]=\"(col?.query.condition !== 'none' && !col?.query?.second_value)\"\r\n [class.pe-none]=\"(col!?.query.condition !== 'none' && !col?.query?.second_value)\"\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' || col?.type == 'array'\"\r\n [class.disabled-search-input]=\"\r\n col?.type == 'dropdown' || col?.type == 'image' || col?.type == 'array'\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 overflow-auto\"\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 position-fixed top-auto\"\r\n role=\"menu\"\r\n [style.right.px]=\"'unset'\"\r\n [style.left.px]=\"dataGridContainer.offsetWidth - 200\"\r\n style=\"top: unset; right: unset\"\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 d-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 && col?.type !== 'image' && col.is_search_able\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' || selectedColumnForFilter?.type == 'array'\"\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 top-row-filter-dropdown\"\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 == 'string'\">\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\r\n <ng-container *ngIf=\"selectedColumnForFilter?.type == 'number'\">\r\n <option value=\"equal\">Equals To</option>\r\n <option value=\"before\">Less Then </option>\r\n <option value=\"after\">Greater Then </option>\r\n <option value=\"less_then_equal\">less then Equal to</option>\r\n <option value=\"greater_then_equal\">Greater then Equal to </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 == 'string'\">\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 <ng-container *ngIf=\"selectedColumnForFilter?.type == 'number'\">\r\n <option value=\"equal\">Equals To</option>\r\n <option value=\"before\">Less Then </option>\r\n <option value=\"after\">Greater Then </option>\r\n <option value=\"less_then_equal\">less then Equal to</option>\r\n <option value=\"greater_then_equal\">Greater then Equal to </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) || (condition !== 'none' && !secondValue)\"\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","// format-index.pipe.ts\r\nimport { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'formatIndex'\r\n})\r\nexport class FormatIndexPipe implements PipeTransform {\r\n\r\n transform(value: number): string {\r\n if (value === null || value === undefined) return '';\r\n\r\n if (value > 9999) {\r\n // divide by 1000 and keep two decimals\r\n return (value / 1000).toFixed(2) + 'k';\r\n }\r\n\r\n return value.toString();\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { DataGridComponent } from './data-grid/data-grid.component';\r\nimport { CommonModule, DatePipe, TitleCasePipe } 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\nimport { FormatCurrencyPipe } from './pipes/format-currency.pipe';\r\nimport { CellEditorDirective } from './directives/cell-editor.directive';\r\nimport { FormatIndexPipe } from './pipes/format-index.pipe';\r\n\r\n\r\n@NgModule({\r\n declarations: [DataGridComponent, FilterPipe, FormatIndexPipe, CellHostDirective, CellRenderInitDirective, CellEditorDirective, FormatCurrencyPipe ],\r\n imports: [CommonModule, FormsModule, DragDropModule, InlineSVGModule.forRoot(), ScrollingModule, TitleCasePipe],\r\nexports: [DataGridComponent],\r\n providers: [FormatCurrencyPipe, DatePipe],\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\nexport * from './lib/interfaces/data-grid-config.ts';\r\nexport * from './lib/services/common.service';\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","i7.FormatCurrencyPipe","i12.CellRenderInitDirective","i13.CellEditorDirective","i14.FilterPipe","i1"],"mappings":"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"}
|