ms-time-sheet 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ms-time-sheet.mjs","sources":["../../../projects/ms-time-sheet/src/lib/ms-time-sheet.service.ts","../../../projects/ms-time-sheet/src/lib/statuses.ts","../../../projects/ms-time-sheet/src/lib/pipes/filter.pipe.ts","../../../projects/ms-time-sheet/src/lib/pipes/pinned-columns.pipe.ts","../../../projects/ms-time-sheet/src/lib/services/split-columns.service.ts","../../../projects/ms-time-sheet/src/lib/services/common.service.ts","../../../projects/ms-time-sheet/src/lib/services/copy-service.service.ts","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.ts","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.html","../../../projects/ms-time-sheet/src/public-api.ts","../../../projects/ms-time-sheet/src/ms-time-sheet.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MsTimeSheetService {\r\n\r\n constructor() { }\r\n}\r\n","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","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'filter',\r\n standalone: true\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 searchText = searchText.toLowerCase();\r\n\r\nreturn items.filter(item => {\r\n const value = key ? item?.[key] : item;\r\n return value?.toString().toLowerCase().includes(searchText);\r\n });\r\n}}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({ name: 'pinnedColumns', pure: true, standalone: true })\r\nexport class PinnedColumnsPipe implements PipeTransform {\r\n transform(columns: any[], pinned: 'left' | 'right' | null): any[] {\r\n if (!columns) return [];\r\n return columns.filter(col => col.is_visible !== false && col.pinned === pinned);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SplitColumnsService {\r\n prepareColumns(columns: any[], containerWidth: number): any {\r\n const left: any[] = [];\r\n const center: any[] = [];\r\n const right: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const leftChildren: any[] = [];\r\n const centerChildren: any[] = [];\r\n const rightChildren: any[] = [];\r\n\r\n for (const child of col.children) {\r\n if (child.is_visible === false) continue;\r\n\r\n const pinned = child.pinned ?? col.pinned ?? null;\r\n const childWithPinned = { ...child, pinned };\r\n\r\n if (pinned === 'left') leftChildren.push(childWithPinned);\r\n else if (pinned === 'right') rightChildren.push(childWithPinned);\r\n else centerChildren.push(childWithPinned);\r\n }\r\n\r\n if (leftChildren.length) {\r\n left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });\r\n }\r\n if (centerChildren.length) {\r\n center.push({\r\n header: col.header,\r\n children: centerChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n if (rightChildren.length) {\r\n right.push({\r\n header: col.header,\r\n children: rightChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n } else if (col.is_visible !== false) {\r\n const pinned = col.pinned ?? null;\r\n if (pinned === 'left') left.push(col);\r\n else if (pinned === 'right') right.push(col);\r\n else center.push(col);\r\n }\r\n }\r\n\r\n return { left, center, right };\r\n }\r\n\r\n setColumnsQuery(columns: any[]) {\r\n for (const col of columns) {\r\n // if (col.children?.length) {\r\n // for (const child of col.children) {\r\n // if (!child?.query?.firt_value && !child?.query?._ids?.length) {\r\n // child['query'] = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n // }\r\n // }\r\n // if (!col?.query?.firt_value && !col?.query?._ids?.length) {\r\n // col.query = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n }\r\n\r\n console.log('Updated Columns: ', columns);\r\n\r\n return columns;\r\n }\r\n\r\n assignDefaultWidths(columns: any[], containerWidth: number): any[] {\r\n const visibleLeafCols = this.getVisibleLeafColumns(columns);\r\n\r\n if (!visibleLeafCols.length) return columns;\r\n\r\n let defaultWidth = Math.floor(containerWidth / visibleLeafCols.length);\r\n if (defaultWidth < 80) defaultWidth = 80;\r\n\r\n const cloneColumns = (cols: any[]): any[] =>\r\n cols.map((col) => {\r\n if (col.children?.length) {\r\n const newChildren = col.children.map((child: any) => {\r\n // If visible → dynamic default width\r\n // If invisible → fixed 150px\r\n if (!child.width) {\r\n if (child.is_visible === false) {\r\n return { ...child, width: 150 };\r\n } else {\r\n return { ...child, width: defaultWidth };\r\n }\r\n }\r\n return { ...child };\r\n });\r\n\r\n return { ...col, children: newChildren };\r\n }\r\n\r\n if (!col.width) {\r\n if (col.is_visible === false) {\r\n return { ...col, width: 150 };\r\n } else {\r\n return { ...col, width: defaultWidth };\r\n }\r\n }\r\n\r\n return { ...col };\r\n });\r\n\r\n return cloneColumns(columns);\r\n}\r\n\r\n\r\n private getVisibleLeafColumns(columns: any[]): any[] {\r\n const result: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const visibleChildren = col.children.filter(\r\n (c: any) => c.is_visible !== false\r\n );\r\n result.push(...visibleChildren);\r\n } else if (col.is_visible !== false) {\r\n result.push(col);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommonService {\r\n\r\n constructor() { }\r\n gethasVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n gethasInVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (!col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n\r\n getTotalColumnsLength(columns: any[]): number {\r\n let count = 0;\r\n\r\n columns.forEach(col => {\r\n if (col.children && Array.isArray(col.children) && col.children.length) {\r\n count += col.children.length; // count children instead of parent\r\n } else {\r\n count += 1; // count parent directly\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n gethasRightPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'right' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n gethasLeftPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'left' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n\r\n getExpandedRowCount(data: any[]): number {\r\n let groupCount = 0;\r\n let rowCount = 0;\r\n\r\n data.forEach(group => {\r\n if (group?.isGroup) {\r\n groupCount++;\r\n\r\n if (group?.isExpand && Array.isArray(group?.children)) {\r\n group.children.forEach((child: any) => {\r\n if (child.isGroup) {\r\n if (child.isExpand && Array.isArray(child.children)) {\r\n rowCount += child.children.length;\r\n }\r\n } else {\r\n rowCount++;\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (groupCount === 0) {\r\n return data.length;\r\n }\r\n\r\n return groupCount + rowCount;\r\n }\r\n\r\n\r\ngetFiltersFromColumns(columns: any[], filtersConfig:any []): any[] {\r\n const result: any[] = [];\r\n \r\n const checkColumn = (col: any) => {\r\n const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== \"\" && filtersConfig.some((ele)=> ele.field == col.field);\r\n const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele)=> ele.field == col.field);\r\n if (hasFirstValue || hasIds) {\r\n result.push({\r\n search: col.search ?? \"\",\r\n field: col.field,\r\n type: col.type,\r\n _ids: col.type == 'dropdown'? col.query?._ids: [],\r\n query: col.type == 'dropdown'? null : (col?.query?.first_value ? col?.query : null)\r\n });\r\n }\r\n \r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n col.children.forEach(checkColumn);\r\n }\r\n };\r\n columns.forEach(checkColumn);\r\n \r\n return result;\r\n}\r\n\r\nasync applyFiltersToColumns(columns: any[], filters: any[]): Promise<any[]> {\r\n debugger\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: 'contain',\r\n second_condition: null,\r\n condition: 'none',\r\n _ids: []\r\n };\r\n }\r\n\r\n const filter = filters.find(f => f.field === col.field);\r\n\r\n if (filter) {\r\n if (col.type === 'dropdown') {\r\n col.filterValue = filter._ids ?? [];\r\n col.search = filter.search ?? '';\r\n col.query._ids = filter._ids ?? [];\r\n } else {\r\n col.filterValue = filter.search ?? null;\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 = filter.query?.first_condition ?? 'contain';\r\n col.query.second_condition = filter.query?.second_condition ?? 'contain';\r\n col.query.condition = filter.query?.condition ?? 'none';\r\n }\r\n }\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 return columns;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nactiveFilteredColumns: any[] = [];\r\nupdateActiveFilteredColumns(columns: any[]): any[] {\r\n const collectFiltered = (cols: any[]): any[] => {\r\n let result: any[] = [];\r\n\r\n for (let i = 0; i < cols.length; i++) {\r\n const col = cols[i];\r\n if (col.children && col.children.length > 0) {\r\n result = result.concat(collectFiltered(col.children));\r\n }\r\n\r\n if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0;\r\n\r\n const hasValueFilter =\r\n (col.query.first_value && col.query.first_value !== '') ||\r\n (col.query.second_value && col.query.second_value !== '');\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n }\r\n return result;\r\n };\r\n this.activeFilteredColumns = [...collectFiltered(columns)];\r\n return this.activeFilteredColumns;\r\n}\r\n\r\n\r\n\r\nhasFieldChanged(current: any, original: any, type: string): boolean {\r\n switch (type) {\r\n case 'number':\r\n return Number(current) !== Number(original);\r\n\r\n case 'string':\r\n return String(current || '') !== String(original || '');\r\n\r\n case 'dropdown':\r\n if (typeof current === 'object' && typeof original === 'object') {\r\n return current?.id !== original?.id || current?.value !== original?.value;\r\n }\r\n return current !== original;\r\n\r\n case 'boolean':\r\n return Boolean(current) !== Boolean(original);\r\n\r\n case 'date':\r\n const currentDate = new Date(current).getTime();\r\n const originalDate = new Date(original).getTime();\r\n return isNaN(currentDate) || isNaN(originalDate)\r\n ? current !== original\r\n : currentDate !== originalDate;\r\n\r\n default:\r\n return JSON.stringify(current) !== JSON.stringify(original);\r\n }\r\n }\r\n\r\n\r\n}\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 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 ?? ''\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\n updateRows: 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 this.setNestedValue(row, targetColumn, value);\r\n });\r\n });\r\n\r\n return this.updateRows;\r\n }\r\n\r\n\r\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n debugger\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","\r\nimport {\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 ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { SplitColumnsService } from './services/split-columns.service';\r\nimport { CommonService } from './services/common.service';\r\n// import { SwapColumnsService } from './services/swap-columns.service';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { BsDatepickerModule, BsDaterangepickerDirective, BsDaterangepickerConfig } from 'ngx-bootstrap/datepicker';\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} 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 { FormsModule } from '@angular/forms';\r\nimport { InlineSVGModule } from 'ng-inline-svg';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { FilterPipe } from './pipes/filter.pipe';\r\n// import { DraggableHeaderDirective } from './directives/draggable-header.directive';\r\nimport { PinnedColumnsPipe } from './pipes/pinned-columns.pipe';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\n\r\n\r\n\r\n\r\n\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\n\r\n\r\n\r\n@Component({\r\n selector: 'time-sheet',\r\n templateUrl: './ms-time-sheet.component.html',\r\n styleUrls: ['./ms-time-sheet.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, DragDropModule, ScrollingModule, InlineSVGModule, FilterPipe, PinnedColumnsPipe, BsDatepickerModule],\r\n animations: [ \r\n trigger('accordionToggle', [\r\n state(\r\n 'collapsed',\r\n style({ height: '0px', overflow: 'hidden' })\r\n ),\r\n state('expanded', style({ height: '*', overflow: 'visible' })),\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 ],\r\n})\r\n\r\nexport class TimeSheetComponent implements OnChanges, AfterViewInit {\r\n\r\n // **************************************//\r\n // ********** Input Goes Here *********** //\r\n // **************************************//\r\n // **************************************//\r\n// Add a new property to track expanded rows\r\n expandedRows: Set<string> = new Set();\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 // 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 = 44;\r\n\r\n // Show Vertical Borders;\r\n @Input() showVerticalBorder: boolean = true;\r\n\r\n // Even Rows Background Color;\r\n @Input() evenRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Even Rows Background Color;\r\n @Input() oddRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Header Rows Background Color;\r\n @Input() headerBackgroundColor: string = '#eaeaea';\r\n\r\n // Header Rows Background Color;\r\n @Input() checkboxesBackgroundColor: string = '#eaeaea';\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 = '#000';\r\n\r\n // Body Background color;\r\n @Input() bodyBackgroundColor: string | undefined = '#fff';\r\n\r\n // Right Pinned Background color;\r\n @Input() rightPinnedBackgroundColor: string | undefined = '#000';\r\n\r\n // Side Menu Background color;\r\n @Input() sidemenuBackgroundColor: string | undefined = '#000';\r\n\r\n // Body text color;\r\n @Input() bodyTextColor: string | undefined = '#000';\r\n\r\n // Header text color;\r\n @Input() headerTextColor: string | undefined = '#000';\r\n\r\n // Header text size;\r\n @Input() headerTextFontsSize: number | undefined = 16;\r\n\r\n // Body text color;\r\n @Input() bodyTextFontsSize: number | undefined = 16;\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 = '';\r\n\r\n // dropdowns Background Color;\r\n @Input() dropdownsBackgroundColor: string | undefined = '';\r\n\r\n // Footer row Height;\r\n @Input() footerRowHeight: number = 46;\r\n\r\n // Footer row Height;\r\n @Input() topGroupedBadgesBackgroundColor: string | undefined = '';\r\n\r\n // Show Row wise grouping;\r\n @Input() showRowsGrouping: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() showFilterRow: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() fontFaimly: string | undefined = 'sans-serif';\r\n\r\n // Show SideColumn;\r\n @Input() showSideMenu: boolean = false;\r\n\r\n // Footer Padding\r\n @Input() footerPadding: number = 3\r\n\r\n\r\n // Footer Padding\r\n @Input() topFilterRowHeight: number = 50;\r\n\r\n // Show Rows shading\r\n @Input() rowShadingEnabled: boolean = false;\r\n\r\n // Show Rows shading\r\n @Input() showSerialNumber: boolean = false;\r\n\r\n // Single Spa Url Attach to icons\r\n @Input() singleSpaAssetsPath: string = 'assets/';\r\n\r\n\r\n // Applied Filters\r\n @Input() filtersConfig: any[] = [];\r\n\r\n\r\n // Applied Filters\r\n @Input() loading: boolean = false;\r\n\r\n //Vertical Scrollbar style\r\n @Input() verticalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n //Horizintal Scrollbar style\r\n @Input() horizintalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n // Show Cell details box\r\n @Input() showCellDetailsBox: boolean = false;\r\n\r\n //Date format\r\n\r\n @Input() dateFormat: string = 'dd/MM/yyyy'\r\n\r\n //Date format\r\n @Input() tableSearch: string = '';\r\n\r\n\r\n //Date format\r\n @Input() actions: any[] = ['edit', 'delete', 'download', 'add Leave'];\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 = 36;\r\n\r\n\r\n @Input() gridType: string = 'TimeSheet';\r\n\r\n @Input() isSingleDay: boolean = false;\r\n\r\n @Input() leftPinnedBoxshadow: string = '#4b4b4b 1px 1px 5px 0px';\r\n\r\n @Input() rightPinnedBoxshadow: string = '#4b4b4b 4px 1px 6px 0px';\r\n\r\n // GlobalSearch\r\n @Input() selectedRowsBackgroundColor: string = '#8ac5ff';\r\n\r\n // GlobalSearch\r\n @Input() nestedTableHeaderBAckgroundColor: string = '#eaeaea';\r\n\r\n @Input() tableView: any[] = [];\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: true,\r\n showChoseColumns: true,\r\n showResetColumns: true,\r\n\r\n\r\n };\r\n\r\n // Infinite scroll inputs/outputs\r\n @Input() enableInfiniteScroll = false;\r\n @Input() hasMoreData = true;\r\n @Input() loadingMore = false;\r\n @Output() loadMoreData = new EventEmitter<void>();\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 @Output() public changeLayout = 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 bsRangeValue: Date[] = [new Date(), new Date()];\r\nshowPicker = false;\r\nbsConfig: any;\r\n\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: any = '';\r\n searchTextPresetTable = '';\r\n addFilterColumnInput = '';\r\n searchInDropdown = '';\r\n addFilterDropdownSearch = ''\r\n topShowHideColumns = '';\r\n choseColumnsSearch = ''\r\n editinDropdownSearch = '';\r\n isThreeDotsFilterOpen = false;\r\n confirmDelete = false;\r\n subMenueOpendField = ''\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 '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 ];\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\r\n\r\n\r\n constructor(\r\n private columnService: SplitColumnsService,\r\n private cdr: ChangeDetectorRef,\r\n public commonSevice: CommonService,\r\n // private swapColumnService: SwapColumnsService,\r\n private elementRef: ElementRef,\r\n private ngZone: NgZone,\r\n private copyService: CopyServiceService\r\n ) {\r\n this.bsConfig = {\r\n containerClass: 'theme-default',\r\n rangeInputFormat: 'DD/MM/YYYY',\r\n showWeekNumbers: false\r\n };\r\n }\r\n\r\n @ViewChild('cellText', { static: false }) cellText!: ElementRef;\r\n async ngAfterViewInit() {\r\n setTimeout(async () => {\r\n // this.updateFlattenedData();\r\n // this.computeViewportRows();\r\n // this.updateVisibleRows(0);\r\n // this.cdr.detectChanges();\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 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 this.cdr.detectChanges();\r\n }, 300);\r\n\r\n // const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\r\n // tooltipTriggerList.map((tooltipTriggerEl: any) => {\r\n // return new bootstrap.Tooltip(tooltipTriggerEl);\r\n // });\r\n\r\n\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if (changes['filtersConfig']) {\r\n await this.applyFilteroptionList();\r\n this.checkFilterChangesEffect();\r\n }\r\n if (changes['columns']?.currentValue?.length) {\r\n // this.columns = this.columnService.setColumnsQuery(this.columns);\r\n this.originalColumns = structuredClone(this.columns);\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 this.cdr.detectChanges();\r\n }\r\n this.generateDropListIds();\r\n this.cdr.detectChanges();\r\n\r\n requestAnimationFrame(() => {\r\n\r\n this.cdr.detectChanges();\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 this.cdr.detectChanges();\r\n setTimeout(() => {\r\n if (this.mainScroll?.nativeElement) {\r\n this.computeViewportRows();\r\n this.updateVisibleRows(0);\r\n }\r\n }, 100);\r\n if (this.centerPinnedHeader?.nativeElement) {\r\n void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n if(this.centerScrollableBody?.nativeElement){\r\n this.centerScrollableBody.nativeElement.scrollLeft = this.centerPinnedHeader?.nativeElement?.scrollLeft;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n if (this.enableInfiniteScroll && this.groupedColumns.length > 0) {\r\n console.warn('Grouping with infinite scroll may not work as expected');\r\n }\r\n\r\n }\r\n if (changes['checkboxState']?.currentValue?.reset) {\r\n this.selectedRows.clear();\r\n this.cdr.detectChanges();\r\n }\r\n if (changes['closeDropdown']) {\r\n if (this.closeDropdown.preset.closed) {\r\n this.activeTopButton = null;\r\n }\r\n }\r\n if (changes['oddRowsBackgroundColor']) {\r\n this.rowShadingEnabled = this.oddRowsBackgroundColor ? this.rowShadingEnabled = true : false;\r\n }\r\n }\r\n\r\n\r\n\r\n async applyFilteroptionList() {\r\n debugger\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\r\n // Body Template References\r\n @ViewChild('leftPinnedBody')\r\n leftPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedBody')\r\n centerPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedBody')\r\n rightPinnedBody!: ElementRef<HTMLDivElement>;\r\n\r\n // Headers Template References\r\n @ViewChild('leftPinnedHeader')\r\n leftPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedHeader')\r\n centerPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedHeader')\r\n rightPinnedHeader!: ElementRef<HTMLDivElement>;\r\n\r\n @ViewChild('columnsGroupedBox')\r\n columnsGroupedBox!: ElementRef<HTMLDivElement>;\r\n\r\n // Center Fake scrollbard\r\n @ViewChild('centerFakeScrollbar')\r\n centerFakeScrollbar!: ElementRef<HTMLDivElement>;\r\n async updateColumnWidthsAndGroups(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap in a promise so we can await\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.leftPinnedColumns = left;\r\n this.centerColumns = center;\r\n this.rightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 0));\r\n this.cdr.detectChanges();\r\n }\r\n\r\n async refreshPreviewColumns(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap prepareColumns in a Promise to make it awaitable\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.previewLeftPinnedColumns = left;\r\n this.previewCenterColumns = center;\r\n this.previewRightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n async SetColumnsDefaultWidth() {\r\n const containerWidth = this.dataGridContainer?.nativeElement.offsetWidth;\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 this.cdr.detectChanges();\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\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 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 };\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\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\r\n onFilterChange(col: any): void {\r\n const filterValue = col.filterValue?.toLowerCase() || '';\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 + 17;\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 isBreaksArray(value: any): boolean {\r\n return Array.isArray(value);\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 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('.custom-tooltip') && !target.closest('.circle-value')) {\r\n // this.tooltipVisible = false;\r\n // }\r\n\r\n// if (!target.closest('.popover__content') && !target.closest('[class*=\"popover__wrapper\"]')) {\r\n// this.restrictionTooltipVisible = false;\r\n// this.manualLogsTooltipVisible = false;\r\n// this.cdr.detectChanges();\r\n // }\r\n\r\n // Close detail column menu when clicking outside\r\n if (!this.hasParentWithClass(event.target as HTMLElement, ['detail-column-menu', 'three-dots'])) {\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n }\r\n\r\n\r\n const insideDetailTable = target.closest('.accordion-details-wrapper');\r\n if (!insideDetailTable) {\r\n this.detailSelectionState.clear();\r\n this.cdr.detectChanges();\r\n }\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) {\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 ) {\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n autosizeColumn(cols: any | any[]): void {\r\n this.activeCol = null;\r\n\r\n // Normalize input to an array\r\n const columnsToResize = Array.isArray(cols) ? cols : [cols];\r\n\r\n // Helper: Flatten all visible leaf columns\r\n const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n const result: any[] = [];\r\n for (const column of columns) {\r\n if (column.children && Array.isArray(column.children)) {\r\n result.push(...getVisibleLeafColumns(column.children));\r\n } else if (column.is_visible) {\r\n result.push(column);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n const visibleCount = visibleColumns.length;\r\n\r\n if (visibleCount === 0) return;\r\n\r\n const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\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 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 const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\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.cdr.detectChanges();\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.activeCol = null;\r\n if (!col) return;\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n if (col?.isGroupable) {\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\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 }\r\n\r\n resetColumns() {\r\n this.activeCol = null;\r\n\r\n this.columns = structuredClone(this.originalColumns);\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 = 'contains';\r\n col.secondCondition = 'contains';\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 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 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 toggleSelectAll(data: any[]): void {\r\n const allIds = this.originalDataSet.map((row) => this.getRowId(row));\r\n const allSelected = allIds.every((id) => this.selectedRows.has(id));\r\n\r\n if (allSelected) {\r\n allIds.forEach((id) => this.selectedRows.delete(id));\r\n } else {\r\n allIds.forEach((id) => this.selectedRows.add(id));\r\n }\r\n this.cdr.detectChanges();\r\n const ids = Array.from(this.selectedRows);\r\n const event = {\r\n data: {\r\n listingType: this.listingType,\r\n obj: ids\r\n },\r\n eventType: \"onSelectRow\",\r\n }\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n isRowSelected(row: any): boolean {\r\n return this.selectedRows.has(this.getRowId(row));\r\n }\r\n\r\n isAllSelected(data: any[]): boolean {\r\n return (data?.every((row) => this.selectedRows.has(this.getRowId(row))) && (this.dataSet?.length > 0));\r\n }\r\n\r\n isIndeterminateState(data: any[]): boolean {\r\n if (!data || data.length === 0) return false;\r\n const selectedCount = data.filter(row => this.selectedRows.has(this.getRowId(row))).length;\r\n return selectedCount > 0 && selectedCount < data.length;\r\n }\r\n\r\n // Side Menu Working Goes Here\r\n toggleSideMenu(clickedOn: 'cols' | 'filtrs') {\r\n if (this.currentOpenedSideMenue == clickedOn) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n } else if (\r\n this.sideMenuVisible &&\r\n clickedOn != this.currentOpenedSideMenue\r\n ) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n return;\r\n } else {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n }\r\n }\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.SetColumnsDefaultWidth();\r\n this.cdr.detectChanges();\r\n }, 10);\r\n }\r\n\r\n isColumnVisible(columns: any) {\r\n if (columns?.children) {\r\n return columns.children.every((element: any) => element.is_visible);\r\n }\r\n\r\n return columns?.is_visible;\r\n }\r\n\r\n allColumnsSelected(): boolean {\r\n const flatten = this.flattenColumns(this.columns);\r\n return flatten.every((col) => col.is_visible);\r\n }\r\n\r\n\r\n private findColumnByField(field: string, cols: any[]): any | null {\r\n for (const col of cols) {\r\n if (col.field === field) {\r\n return col;\r\n }\r\n if (col.children && Array.isArray(col.children)) {\r\n const found = this.findColumnByField(field, col.children);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n\r\n\r\n async toggleColumnVisibility(column: any, isVisible: boolean) {\r\n 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\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n };\r\n this.createUpdateConfigListing.emit(event);\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n\r\n\r\n toggleAllColumnsVisibility(): void {\r\n const flatten = this.flattenColumns(this.columns);\r\n const allSelected = flatten.every((col: any) => col.is_visible);\r\n flatten.forEach((col: any) => (col.is_visible = !allSelected));\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n setTimeout(() => {\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }, 100);\r\n }\r\n\r\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 }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n onEscape(event: KeyboardEvent) {\r\n this.closeModalColumnPanel();\r\n }\r\n\r\n // Check If Any column have right pinned\r\n get hasRightPinnedColumns() {\r\n return this.commonSevice.gethasRightPinnedColumns(this.columns);\r\n }\r\n\r\n get hasLeftPinnedColumns() {\r\n return this.commonSevice.gethasLeftPinnedColumns(this.columns);\r\n }\r\n\r\n get dataSetLength() {\r\n return this.commonSevice.getExpandedRowCount(this.dataSet);\r\n }\r\n\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: UIEvent) {\r\n this.autosizeAllColumns();\r\n const h = this.mainScroll?.nativeElement?.clientHeight ?? 0;\r\n this.viewportRows = Math.max(1, Math.ceil(h / this.rowHeight));\r\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n this.cdr.detectChanges();\r\n setTimeout(() => { }, 100);\r\n }\r\n\r\n async refreshHeaders() {\r\n this.ngZone.runOutsideAngular(async () => {\r\n await new Promise(r => setTimeout(r, 0));\r\n await this.updateColumnWidthsAndGroups();\r\n await this.refreshPreviewColumns();\r\n\r\n this.ngZone.run(() => this.cdr.detectChanges());\r\n });\r\n }\r\n\r\n get hasAnyVisibleColumn() {\r\n return this.commonSevice.gethasVisibleColumns(this.columns);\r\n }\r\n\r\n get hasAnyInVisibleColumn() {\r\n return this.commonSevice.gethasInVisibleColumns(this.columns);\r\n }\r\n\r\n get columnsCount() {\r\n return this.commonSevice.getTotalColumnsLength(this.columns);\r\n }\r\n\r\n tableHeaderAndBodyHeight() {\r\n return `calc(100% - ${this.footerRowHeight})`;\r\n }\r\n\r\n draggingInGroupArea = false;\r\n\r\n @ViewChild('centerScroll') centerScroll!: ElementRef<HTMLDivElement>;\r\n visibleRowCount = 25;\r\n startIndex = 0;\r\n visibleRows: any[] = [];\r\n\r\n private flattenGroupedRows(\r\n rows: any[] = [],\r\n level = 0,\r\n result: any[] = []\r\n ): any[] {\r\n for (const row of rows) {\r\n result.push({ ...row, __depth: level });\r\n if (row.isGroup && row.isExpand && row.children?.length) {\r\n this.flattenGroupedRows(row.children, level + 1, []);\r\n }\r\n }\r\n this.assignVirtualIndexes(this.visibleRows);\r\n return result;\r\n }\r\n\r\n assignVirtualIndexes(data: any[]): any[] {\r\n let currentIndex = 1;\r\n const walk = (items: any[]): void => {\r\n for (const item of items) {\r\n item.__virtualIndex = currentIndex++;\r\n if (item?.isGroup) {\r\n const group = item;\r\n if (group.isExpand && Array.isArray(group.children)) {\r\n walk(group.children);\r\n }\r\n }\r\n }\r\n };\r\n walk(data);\r\n console.log('This dataset: ', this.visibleRows)\r\n return data;\r\n }\r\n\r\n\r\n updateVisibleRows(scrollTop: number) {\r\n\r\n const flatData = this.flattenGroupedRows(this.dataSet);\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@Output() loadMore = new EventEmitter<void>();\r\n onMainScroll(event: Event): void {\r\n // const flatData = this.flattenGroupedRows(this.dataSet);\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 (this.fakeScrollRaf) cancelAnimationFrame(this.fakeScrollRaf);\r\n this.fakeScrollRaf = requestAnimationFrame(() => {\r\n // this.isSyncingFromMain = true;\r\n // this.fakeScroll.nativeElement.scrollTop = 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 = 30;\r\n const newStartIndex = Math.floor(scrollTop / this.rowHeight);\r\n const start = Math.max(0, newStartIndex - overscan);\r\n const end = Math.min(\r\n this.flattenedData.length,\r\n newStartIndex + this.viewportRows + overscan\r\n );\r\n this.translateY = start * (this.rowHeight - 1);\r\n this.startIndex = start;\r\n this.visibleRows = this.dataSet.slice(start, end);\r\n this.cdr.detectChanges();\r\n\r\n // Infinite scroll check\r\n const el = this.mainScroll.nativeElement;\r\n if (this.enableInfiniteScroll && !this.loadingMore && this.hasMoreData) {\r\n const threshold = 300;\r\n if (el.scrollTop + el.clientHeight >= el.scrollHeight - threshold) {\r\n this.loadMore.emit();\r\n }\r\n }\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\r\n // // setTimeout(() => {\r\n // // this.cdr.detectChanges();\r\n // // }, 100);\r\n // }\r\n\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand) {\r\n// if (!row.details.originalColumns) {\r\n// row.details.originalColumns = structuredClone(row.details.columns);\r\n// }\r\n// // 👇 Prefer originalFlatData, fallback to current data only if needed\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = structuredClone(\r\n// row.details.originalFlatData || row.details.data\r\n// );\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\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<any>;\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 * 2;\r\n\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n\r\n onHorizintalFakeScroll(event: Event) {\r\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n this.centerScrollableBody.nativeElement.scrollLeft = scrollLeft;\r\n }\r\n\r\n onCenterBodyScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n if (this.centerPinnedHeader) {\r\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n }\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.isGroupable\r\n );\r\n }\r\n return data.is_visible && data.isGroupable;\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\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.isGroupable;\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.isGroupable;\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.isGroupable;\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 // 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.isGroupable === false\r\n );\r\n this.isDisableColumnGrouping = allChildrenDisabled;\r\n } else {\r\n this.isDisableColumnGrouping = col.isGroupable === false;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n currentDraggingColumn: any = null;\r\n dragStartOnGroup(col: any) {\r\n this.currentDraggingColumn = col;\r\n }\r\n\r\n onSortGroup = async (event: CdkDragSortEvent<any>, section: string) => {\r\n const columns = (this as any)[section];\r\n if (event.previousIndex === event.currentIndex) return;\r\n const visibleColumns = columns.filter((col: any) => {\r\n if (col?.children && Array.isArray(col.children)) {\r\n return col.children.some((child: any) => child.is_visible);\r\n }\r\n return col.is_visible;\r\n });\r\n const previousHeader = visibleColumns[event.previousIndex].header;\r\n const currentHeader = visibleColumns[event.currentIndex].header;\r\n const visiblePrevIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === previousHeader\r\n );\r\n const visibleCurrIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === currentHeader\r\n );\r\n const getFields = (item: any): string[] => {\r\n if (item?.children && Array.isArray(item.children)) {\r\n return item.children.map((child: any) => child.field);\r\n }\r\n return [item.field];\r\n };\r\n const prevFields = getFields(visibleColumns[visiblePrevIndex]);\r\n const currFields = getFields(visibleColumns[visibleCurrIndex]);\r\n const allFields = [...prevFields, ...currFields];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n console.log(\"this .coluns\", this.columns);\r\n moveItemInArray((this as any)[section], visiblePrevIndex, visibleCurrIndex);\r\n\r\n const prevColIndexInColumns = this.columns.findIndex(item => item.header === previousHeader);\r\n const currColIndexInColumns = this.columns.findIndex(item => item.header === currentHeader);\r\n moveItemInArray(this.columns, prevColIndexInColumns, currColIndexInColumns);\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n 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 const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n onDropGroup() {\r\n this.leftPinnedColumns = structuredClone(this.previewLeftPinnedColumns);\r\n this.centerColumns = structuredClone(this.previewCenterColumns);\r\n this.rightPinnedColumns = structuredClone(this.previewRightPinnedColumns);\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n async onDropTopGroup(event: CdkDragDrop<any>) {\r\n this.loading = true;\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.isGroupable) {\r\n this.groupedColumns.push(col);\r\n }\r\n });\r\n } else {\r\n if (draggedData.is_visible && draggedData.isGroupable) {\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 setTimeout(() => {\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\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 }, 100);\r\n\r\n } catch (err) {\r\n console.error(\"Error in ungroupColumn:\", err);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n\r\n shouldTheGroupHeaderShow(group: any) {\r\n if (group?.children && group.children.length) {\r\n return group.children.some(\r\n (col: any) => col.is_visible && !col?.isRowGrouped\r\n );\r\n }\r\n return group?.is_visible && !group?.isRowGrouped;\r\n }\r\n\r\n\r\n onChildDragStart() {\r\n debugger;\r\n }\r\n\r\n dropListIds: string[] = [];\r\n\r\n generateDropListIds() {\r\n this.dropListIds = [];\r\n\r\n const sectionKeys = [\r\n 'leftPinnedColumns',\r\n 'centerColumns',\r\n 'rightPinnedColumns',\r\n ];\r\n\r\n sectionKeys.forEach((sectionKey) => {\r\n const sectionCols = (this as any)[sectionKey];\r\n\r\n this.columns.forEach((col: any, i: number) => {\r\n if (col?.children?.length > 0) {\r\n col.children.forEach((child: any, childIndex: number) => {\r\n if (child?.is_visible && !child.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n } else if (col?.is_visible && !col.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n });\r\n }\r\n\r\n onChildDroplistSorted = async (event: CdkDragSortEvent<any>, section: string) => {\r\n if (event.previousIndex === event.currentIndex) return;\r\n\r\n const pinned =\r\n section == 'previewLeftPinnedColumns'\r\n ? 'left'\r\n : section == 'previewRightPinnedColumns'\r\n ? 'right'\r\n : \"\";\r\n\r\n const column = event.item.data;\r\n let group = this.columns.find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n const groupIndex = this.columns.findIndex(\r\n (col) => col.header === group.header\r\n );\r\n const filteredGroup = group?.children.filter((col: any) => {\r\n const isPinnedMatch =\r\n (pinned === \"\" && (!col?.pinned || col?.pinned === \"\")) || col?.pinned === pinned;\r\n return isPinnedMatch && col?.is_visible;\r\n });\r\n\r\n const previousField = filteredGroup[event.previousIndex].field;\r\n const currentField = filteredGroup[event.currentIndex].field;\r\n const visiblePrevIndex = group.children.findIndex(\r\n (col: any) => col.field == previousField\r\n );\r\n const visibleCurrIndex = group.children.findIndex(\r\n (col: any) => col.field == currentField\r\n );\r\n const allFields = [previousField, currentField];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n\r\n const groupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const filterGroupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const groupInSectionIndex = (this as any)[section].findIndex(\r\n (col: any) => col.header === groupInSection.header\r\n );\r\n\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n moveItemInArray(\r\n this.columns[groupIndex]?.children,\r\n visiblePrevIndex,\r\n visibleCurrIndex\r\n );\r\n\r\n moveItemInArray(\r\n (this as any)[section]?.[groupInSectionIndex].children,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n updatedCells.forEach((el) => {\r\n const newLeft = el.getBoundingClientRect().left;\r\n const oldLeft = firstPositions.get(el)!;\r\n const deltaX = oldLeft - newLeft;\r\n if (deltaX !== 0) {\r\n el.style.willChange = 'transform';\r\n el.style.transition = 'none';\r\n el.style.transform = `translateX(${deltaX}px)`;\r\n void el.offsetWidth;\r\n el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n el.style.transform = 'translateX(0)';\r\n\r\n const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n console.group('Group: ', group);\r\n }\r\n\r\n\r\n onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>) {\r\n this.updateColumnWidthsAndGroups();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\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) ?? \"_Blank\")\r\n .join(\",\");\r\n } else {\r\n groupKey = keyValue\r\n .map(val => val ?? \"_Blank\")\r\n .join(\",\");\r\n }\r\n } else {\r\n groupKey = keyValue ?? \"_Blank\";\r\n }\r\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n groupedMap.get(groupKey)!.push(item);\r\n }\r\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n isGroup: true,\r\n groupField: currentField,\r\n groupValue,\r\n children: this.groupData(groupItems, restFields),\r\n isExpand: false,\r\n }));\r\n }\r\n\r\n\r\n countLeafRows(group: any): number {\r\n if (!group.children || !group.children.length) return 0;\r\n\r\n return group.children.reduce((count: number, child: any) => {\r\n return count + (child.isGroup ? this.countLeafRows(child) : 1);\r\n }, 0);\r\n }\r\n\r\n isActiveFilterOpen = false;\r\n toggleActiveFilter() {\r\n this.isActiveFilterOpen = !this.isActiveFilterOpen;\r\n }\r\n\r\n toggleActions(type: string) {\r\n if (type === this.activeTopButton) this.activeTopButton = type;\r\n else this.activeTopButton = type;\r\n this.activeSubButton = '';\r\n this.isFilterOpen = false;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n activeSubButton = '';\r\n toggleSubActions(type: string) {\r\n if (type === this.activeSubButton) this.activeSubButton = '';\r\n else this.activeSubButton = type;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n toggleActionsDropdown() {\r\n this.showActionsDropDown = !this.showActionsDropDown;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n async changeTableLayout(event: Event, layoutType: string) {\r\n let target = event.target as HTMLInputElement;\r\n\r\n if (target.checked) {\r\n this.selectedTableLayout = layoutType;\r\n if (layoutType === 'small') {\r\n this.rowHeight = 36;\r\n this.headerRowHeight = 40;\r\n this.bodyTextFontsSize = 10;\r\n this.headerTextFontsSize = 10;\r\n\r\n } else if (layoutType === 'medium') {\r\n this.rowHeight = 44;\r\n this.headerRowHeight = 44;\r\n this.bodyTextFontsSize = 14;\r\n this.headerTextFontsSize = 14;\r\n\r\n } else {\r\n this.rowHeight = 60;\r\n this.headerRowHeight = 52;\r\n this.bodyTextFontsSize = 16;\r\n this.headerTextFontsSize = 16;\r\n }\r\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n await this.refreshHeaders();\r\n }\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n this.onFontChange()\r\n }\r\n\r\n\r\n pageSizeOptions = [5, 25, 50, 75, 100, 150, 200, 250, 300, 500];\r\n get startIndexData() {\r\n return (this.paginationConfig.page - 1) * this.paginationConfig.limit;\r\n }\r\n\r\n get endIndex() {\r\n return Math.min(this.startIndex + this.paginationConfig.limit, this.paginationConfig.totalResults);\r\n }\r\n\r\n get visiblePages(): (number | string)[] {\r\n const pages: (number | string)[] = [];\r\n\r\n if (this.paginationConfig.totalPages <= 7) {\r\n for (let i = 1; i <= this.paginationConfig.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n if (this.paginationConfig.page > 3) {\r\n pages.push('...');\r\n }\r\n let start = Math.max(2, this.paginationConfig.page - 1);\r\n let end = Math.min(this.paginationConfig.totalPages - 1, this.paginationConfig.page + 1);\r\n\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n if (this.paginationConfig.page < this.paginationConfig.totalPages - 2) {\r\n pages.push('...');\r\n }\r\n pages.push(this.paginationConfig.totalPages);\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n\r\n searchTextForFilterDropDown = '';\r\n toggleColumnInFilterDropdown(col: any) {\r\n\r\n }\r\n\r\n removeColumnFromFilter(option: any) {\r\n\r\n }\r\n\r\n handleBackspace(event: Event) {\r\n // If search is empty, remove last tag\r\n if (!this.searchTextForFilterDropDown && this.selectedFilterOptions.length) {\r\n const last = this.selectedFilterOptions[this.selectedFilterOptions.length - 1];\r\n this.toggleSelectionInFilter(last);\r\n }\r\n }\r\n\r\n @ViewChild('filterMenueSearchInput') filterMenueSearchInput!: ElementRef<HTMLInputElement>\r\n @ViewChild('filterMenueTextchInput') filterMenueTextchInput!: ElementRef<HTMLInputElement>\r\n\r\n openFilteronThreeDotsClick(col: any) {\r\n if(col.type == 'image') return;\r\n this.selectedColumnForFilter = col;\r\n this.isThreeDotsFilterOpen = true;\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\r\n );\r\n setTimeout(() => {\r\n this.filterMenueSearchInput.nativeElement.focus();\r\n }, 100);\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || '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 }\r\n\r\n isFilterOpen = false\r\n selectedColumnForFilter: any;\r\n showFilters = this.showSideMenu ? false : false;\r\n\r\n openFilter(col: any) {\r\n this.activeFilterCell = col;\r\n this.activeCol = null\r\n this.isFilterOpen = true;\r\n this.selectedColumnForFilter = col;\r\n\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value?.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\r\n );\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || '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 = '';\r\n condition = '';\r\n\r\n resetTextFilterChanges() {\r\n this.firstCondition = 'contain';\r\n this.firstValue = '';\r\n this.condition = 'none';\r\n this.secondCondition = '';\r\n this.secondValue = '';\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\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 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 const findColumn = (columns: any[], field: string): any => {\r\n for (const col of columns) {\r\n if (col.field === field) return col;\r\n if (col.children && col.children.length) {\r\n const found = findColumn(col.children, field);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const column = findColumn(this.columns, this.selectedColumnForFilter.field);\r\n if (column) {\r\n if (column.type === 'dropdown') {\r\n column.query = column.query || {};\r\n column.query._ids = column.query._ids || [];\r\n\r\n // Remove stale IDs (not present in Set)\r\n column.query._ids = column.query._ids.filter(\r\n (id: any) => this.currentFilterSelectedIds.has(id) // <-- use .has()\r\n );\r\n\r\n // Add new ones if missing\r\n this.currentFilterSelectedIds.forEach(id => {\r\n if (!column.query._ids.includes(id)) {\r\n column.query._ids.push(id);\r\n }\r\n });\r\n\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: this.firstCondition || 'contain',\r\n first_value: this.firstValue || null,\r\n condition: this.condition || 'none',\r\n second_condition: this.secondCondition || null,\r\n second_value: this.secondValue || null,\r\n };\r\n }\r\n }\r\n\r\n const filter = {\r\n field: column.field,\r\n search: column.search,\r\n query: column.query,\r\n type: column.type,\r\n _ids: column._ids\r\n };\r\n\r\n this.filtersConfig.push(filter);\r\n\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\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\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 } else {\r\n col.query._ids = [];\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\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 this.activeFilterCell = null;\r\n this.cdr.detectChanges();\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n\r\n clearAllFilters() {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n const resetAllRecursively = (columns: any[]) => {\r\n for (const column of columns) {\r\n if (column.query) {\r\n column.query = {\r\n _ids: [],\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: 'contain',\r\n second_value: null\r\n };\r\n }\r\n if (Array.isArray(column?.children) && column.children.length) {\r\n resetAllRecursively(column.children);\r\n }\r\n }\r\n };\r\n resetAllRecursively(this.columns);\r\n this.activeFilterCell = null;\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n const event = { eventType: 'reset' };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n\r\n applySideFilter() {\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\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 if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0 && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n const hasValueFilter =\r\n col.query.first_value !== null && col.query.first_value !== undefined && col.query.first_value !== '' && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n };\r\n return [...collectFiltered(this.columns)];\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 enableEdit(row: any, column: any) {\r\n this.editinDropdownSearch = '';\r\n if (column.type == 'image' || !column?.is_editable) return;\r\n this.editingKey = ((row.id || row._id) + '-' + column.field);\r\n\r\n if (column.type === 'dropdown') {\r\n setTimeout(() => {\r\n const dropdownMenu = document.querySelector('.cell-editing-dropdown-menu') as HTMLElement;\r\n if (dropdownMenu) {\r\n const rect = dropdownMenu.getBoundingClientRect();\r\n const windowHeight = this.dataGridContainer.nativeElement?.offsetHeight;\r\n\r\n if (rect.bottom > windowHeight) {\r\n dropdownMenu.style.top = `-${rect.height}px`;\r\n } else {\r\n dropdownMenu.style.top = '100%';\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n disableEdit(row: any, column: any, controk?: any) {\r\n this.rowSelectedIndexes.clear();\r\n if (!this.editingKey) return\r\n this.checkRowEditAndEmitValue(row, column, null)\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 hasChanged = this.commonSevice.hasFieldChanged(currentValue, originalValue, column.type);\r\n if (!hasChanged) return;\r\n this.setNestedValue(originalRow, column, value);\r\n const sendObj = {\r\n data: { ...row },\r\n eventType: 'onCellEdit',\r\n value: value\r\n };\r\n 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;\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 }\r\n\r\n\r\n\r\n\r\n\r\n\r\n goToPage(page: any) {\r\n if (page < 1 || page > this.paginationConfig.totalPages) return;\r\n this.paginationConfig.page = page;\r\n const event = {\r\n obj: {\r\n limit: this.paginationConfig.limit,\r\n page: page,\r\n },\r\n eventType: 'pageChange',\r\n };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n onPageSizeChange() {\r\n this.paginationConfig.page = 1;\r\n const 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 }\r\n\r\n actionPreset(data: any, type: any) {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\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 selectFilter(data:any){\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 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 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,\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 }\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.columns,\r\n filters: this.presetFilter ? this.filtersConfig : [],\r\n config: config,\r\n id: this.tableFilterViewId,\r\n loadingCall: control == 'mouseUp' ? false : true\r\n },\r\n eventType: this.tableFilterViewId ? 'updatePreset' : 'createPreset'\r\n }\r\n this.genericEvent.emit(event)\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 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 if (typeof text === 'string' && text.length > 50) {\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 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) {\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 if (Array.isArray(row.children) && row.children.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 this.cdr.detectChanges();\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 getFirstTwoWords(name: string): string {\r\n if (!name) return '';\r\n const words = name.trim().split(/\\s+/).filter(word => /^[a-zA-Z]+$/.test(word));\r\n return words.slice(0, 2).map(word => word.charAt(0).toUpperCase()).join('');\r\n }\r\n\r\n onEmployeeClick(row: any): void {\r\n const event = {\r\n data: row,\r\n eventType: 'openEmployeeModal'\r\n };\r\n this.genericEvent.emit(event);\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 (!(event instanceof MouseEvent)) {\r\n event.preventDefault();\r\n }\r\n event.preventDefault();\r\n this.xPos = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX;\r\n this.yPos = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY;\r\n // this.xPos = event.clientX;\r\n // this.yPos = event.clientY;\r\n this.isVisible = true;\r\n this.positionedYet = false;\r\n this.deatilsList = deatilsList;\r\n setTimeout(() => {\r\n const menuElement = document.querySelector('.context-menu') as HTMLElement;\r\n if (!menuElement) return;\r\n const menuWidth = menuElement.offsetWidth;\r\n const menuHeight = menuElement.offsetHeight;\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n let x = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX; //event.clientX;\r\n let y = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY; //event.clientY;\r\n if (x + menuWidth > viewportWidth) {\r\n x = viewportWidth - menuWidth - 10;\r\n }\r\n if (y + menuHeight > viewportHeight) {\r\n y = viewportHeight - menuHeight - 10;\r\n }\r\n this.xPos = x;\r\n this.yPos = y;\r\n this.isVisible = true;\r\n\r\n setTimeout(() => {\r\n this.positionedYet = true;\r\n this.cdr.detectChanges();\r\n });\r\n\r\n this.cdr.detectChanges();\r\n });\r\n this.cdr.detectChanges()\r\n return false;\r\n }\r\n\r\n onActionClick(action: string) {\r\n const sendObj = {\r\n obj: this.deatilsList,\r\n eventType: action,\r\n };\r\n this.positionedYet = false;\r\n this.cdr.detectChanges();\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n\r\n onVerifyClick(type: string) {\r\n const idsArray = Array.from(this.selectedRows);\r\n const arrayOfObjectsWithTableType: any[] = [];\r\n this.selectedRows.forEach(id => {\r\n arrayOfObjectsWithTableType.push({\r\n id: id,\r\n listingType: this.listingType,\r\n });\r\n });\r\n const sendObj = {\r\n data: {\r\n obj: idsArray,\r\n tableName: this.tableName,\r\n listingType: this.listingType,\r\n },\r\n eventType: type,\r\n };\r\n this.genericEvent.emit(sendObj)\r\n }\r\n\r\n\r\n\r\n getCellClasses(column: any, value: any): string {\r\n if (!value) return '';\r\n let val: any;\r\n if (typeof value === 'object') {\r\n val = value?.value;\r\n } else {\r\n val = value;\r\n }\r\n const field = column?.field?.toLowerCase();\r\n const status = val?.toString().toLowerCase();\r\n if (field === 'status' || field === 'account_status' || field === 'availStatus' || field === 'is_custom_grade') {\r\n return STATUSES_BADGE_MAP[status] || 'badge badge-secondary';\r\n }\r\n return '';\r\n }\r\n\r\n removeColumnFilterFromColumn(column: any) {\r\n if (!column) return\r\n if (column.type === 'dropdown') {\r\n column.query._ids = [];\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: null,\r\n second_value: null,\r\n }\r\n }\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n onSideMenuColumnsVisibilityChange() {\r\n this.refreshHeaders();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n downloadCsv() {\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 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 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\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 = 100;\r\n private scrollMargin = 150;\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 }, 16);\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\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.visibleRows,\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\r\n const focus = this.findFocusedDetailRowAndSection();\r\n if (focus) {\r\n this.handleDetailShortcuts(event, focus.row, focus.section);\r\n return;\r\n }\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\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 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 event.preventDefault();\r\n this.undo();\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.redo();\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 event.preventDefault();\r\n const text = event.clipboardData?.getData('text');\r\n if (!text) return;\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 console.log(\"Updated Rows: \", updatedRows);\r\n if (updatedRows?.length) {\r\n const sendObj = {\r\n data: updatedRows,\r\n eventType: 'onCellEdit',\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n this.cdr.detectChanges();\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// For Detail Row Editing\r\ndetailEditingKey: string | null = null; // e.g., \"rowId-dataIndex-fieldName\"\r\nactiveDetailRow: any = null;\r\nactiveDetailCol: any = null;\r\n\r\n// For Detail Row Filtering\r\ndetailFilterValue: string = '';\r\ndetailFilterCondition: string = 'contain';\r\ndetailFilters: Map<string, { condition: string, value: any }> = new Map(); // key: `${rowId}-${colField}`\r\n\r\n// For Detail Row Drag & Drop\r\ncurrentDetailDraggingColumn: any = null;\r\ncurrentDetailRow: any = null;\r\n// Detail Row - Three Dots Menu\r\nopenDetailThreeDotsMenu(event: MouseEvent, row: any, col: any) {\r\n event.stopPropagation();\r\n this.activeDetailRow = row;\r\n this.activeDetailCol = col;\r\n // Positioning logic can be added here if needed\r\n // For now, it will appear right below the header\r\n}\r\n\r\n// Detail Row - Inline Editing\r\nenableDetailEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\nisDetailEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCell(row: any, dataItem: any, col: any): boolean {\r\n return this.isDetailEditing(row, dataItem, col);\r\n}\r\n\r\n// Detail Row - Drag & Drop\r\n\r\n\r\n\r\n\r\n\r\ngetDetailFilterMenuLeft(row: any, col: any): number {\r\n // Find the header cell and return its left position\r\n const headerCell = document.querySelector(`[field=\"${col.field}\"]`);\r\n if (headerCell) {\r\n const rect = headerCell.getBoundingClientRect();\r\n return rect.left;\r\n }\r\n return 0;\r\n}\r\n\r\n// Detail Row - Filtering\r\napplyDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.set(filterKey, {\r\n condition: this.detailFilterCondition,\r\n value: this.detailFilterValue\r\n });\r\n\r\n // Apply filter to data\r\n this.filterDetailData(row);\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\ntoggleSelectAllDetailFilters(col: any, row: any, event: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n const allOptions = col.column_dropdown_value || [];\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const allSelected = allOptions.every((option: any) =>\r\n filter.value.includes(option._id || option.id || option)\r\n );\r\n\r\n if (allSelected) {\r\n // Deselect all\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n // Select all\r\n filter.value = allOptions.map((option: any) => option._id || option.id || option);\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nonDetailOptionToggle(col: any, option: any, row: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const optionId = option._id || option.id || option;\r\n const index = filter.value.indexOf(optionId);\r\n\r\n if (index > -1) {\r\n filter.value.splice(index, 1);\r\n } else {\r\n filter.value.push(optionId);\r\n }\r\n\r\n if (filter.value.length === 0) {\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nresetDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.delete(filterKey);\r\n this.filterDetailData(row); // Re-filter to show all data\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nfilterDetailData(row: any) {\r\n if (!row.details?.originalData) {\r\n // Store original data on first filter\r\n row.details.originalData = [...row.details.data];\r\n }\r\n\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n let passes = true;\r\n for (let [filterKey, filter] of this.detailFilters.entries()) {\r\n if (filterKey.startsWith(`${row._id || row.id}-`)) {\r\n const colField = filterKey.split('-')[1];\r\n const cellValue = String(item[colField] || '').toLowerCase();\r\n const filterValue = String(filter.value || '').toLowerCase();\r\n\r\n switch (filter.condition) {\r\n case 'contain':\r\n passes = passes && cellValue.includes(filterValue);\r\n break;\r\n case 'equals':\r\n passes = passes && cellValue === filterValue;\r\n break;\r\n case 'startsWith':\r\n passes = passes && cellValue.startsWith(filterValue);\r\n break;\r\n case 'endsWith':\r\n passes = passes && cellValue.endsWith(filterValue);\r\n break;\r\n}\r\n\r\n if (!passes) break;\r\n }\r\n }\r\n return passes;\r\n});\r\n}\r\n\r\n\r\n// For Detail Row Drag & Drop\r\n\r\n\r\nonDetailDragStart(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n}\r\n\r\nonDetailDragMoved(event: CdkDragMove, row: any) {\r\n // Let CDK handle visual preview — no manual DOM manipulation needed\r\n}\r\n\r\nonDetailDragDropped(event: CdkDragDrop<any>, row: any) {\r\n if (!this.currentDetailDraggingColumn || !row.details || !row.details.columns) return;\r\n\r\n const previousIndex = row.details.columns.findIndex((c: any) => c.field === this.currentDetailDraggingColumn.field);\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.cdr.detectChanges();\r\n\r\n\r\n }\r\n\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n}\r\n\r\n\r\n@Input() detailsIconPosition: 'start' | 'end' = 'start';\r\n\r\n@Input() detailsPosition: 'top' | 'bottom' = 'top';\r\n\r\n\r\n\r\ndropColumn(event: CdkDragDrop<any[]>, row: any) {\r\n if (!row?.details?.columns) return;\r\n\r\n moveItemInArray(row.details.columns, event.previousIndex, event.currentIndex);\r\n\r\n // Optional: if you want to also reorder the data inside each row\r\n if (row.details.data?.length) {\r\n row.details.data.forEach((dataRow: any) => {\r\n const values = [...row.details.columns.map((c: any) => dataRow[c.field])];\r\n // reassign values in new order\r\n row.details.columns.forEach((col: any, i: number) => {\r\n dataRow[col.field] = values[i];\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\nopenSubMenue(col: any){\r\n this.subMenueOpendField = col.field;\r\n}\r\n\r\ndetailDragState = {\r\n isDragging: false,\r\n sourceRow: null as any,\r\n sourceColumn: null as any,\r\n originalColumns: [] as any[],\r\n originalIndex: -1\r\n};\r\n\r\n\r\n\r\nonDetailDragEnd(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const currentContainer = event.source.dropContainer;\r\n\r\n if (this.detailDragState.originalIndex === event.source.data) {\r\n row.details.columns = [...this.detailDragState.originalColumns];\r\n this.cdr.detectChanges();\r\n }\r\n\r\n event.source.element.nativeElement.style.opacity = '1';\r\n}\r\n\r\nonDetailDragEndSimple(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n event.source.element.nativeElement.style.opacity = '1';\r\n\r\n\r\n}\r\n\r\nreorderDetailData(row: any, oldIndex: number, newIndex: number) {\r\n if (!row.details.data) return;\r\n\r\n row.details.data.forEach((dataRow: any) => {\r\n const keys = row.details.columns.map((col: any) => col.field);\r\n const values = keys.map((key: string) => dataRow[key]);\r\n\r\n const movedValue = values[oldIndex];\r\n\r\n values.splice(oldIndex, 1);\r\n\r\n values.splice(newIndex, 0, movedValue);\r\n\r\n const newData: any = {};\r\n keys.forEach((key: string, index: number) => {\r\n newData[key] = values[index];\r\n });\r\n\r\n Object.assign(dataRow, newData);\r\n });\r\n}\r\n\r\nemitDetailColumnReorderEvent(row: any) {\r\n const eventObj = {\r\n rowId: row._id || row.id,\r\n columns: row.details.columns,\r\n eventType: 'onDetailColumnReorder'\r\n };\r\n this.genericEvent.emit(eventObj);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\noriginalDetailValues: Map<string, any> = new Map(); // Track original detail cell values for compare\r\ndetailAccordionStates: Map<string, boolean> = new Map(); // Track accordion expand states\r\n\r\n// Line ~1620: Update onDetailDragStart (add animation class)\r\nonDetailDragStarts(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n\r\n // NEW: Add real-time drag animation\r\n event.source.element.nativeElement.classList.add('dragging'); // Add class for opacity/transform\r\n requestAnimationFrame(() => {\r\n // Preview move\r\n event.source.element.nativeElement.style.transform = 'translateX(10px)';\r\n });\r\n}\r\n\r\n// Line ~1640: Update onDetailDragDropped (add animation + revert if same position)\r\nonDetailDragDroppeds(event: CdkDragDrop<any[]>, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const previousIndex = event.previousIndex;\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n // NEW: Animate reorder\r\n const headerRow = document.querySelector('.detail-header-row') as HTMLElement;\r\n if (headerRow) {\r\n headerRow.classList.add('dragging'); // Start animation\r\n setTimeout(() => {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.reorderDetailData(row, previousIndex, currentIndex);\r\n this.emitDetailColumnReorderEvent(row);\r\n headerRow.classList.remove('dragging'); // End animation\r\n this.cdr.detectChanges();\r\n }, 300); // Delay for smooth real-time feel\r\n }\r\n } else {\r\n // Revert if same position (with animation)\r\n requestAnimationFrame(() => {\r\n event.item.element.nativeElement.style.transform = 'translateX(0)';\r\n });\r\n }\r\n\r\n // Reset\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n event.item.element.nativeElement.classList.remove('dragging');\r\n}\r\n\r\n// NEW METHOD: Add around line ~1700 (after existing drag methods)\r\nhandleDetailDoubleClick(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${col.field}`;\r\n\r\n // Toggle accordion expand\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n this.detailAccordionStates.set(key, row.isDetailsExpand);\r\n\r\n // Emit generic event for accordion toggle (send to API)\r\n const eventObj = {\r\n data: { row, col, dataItem },\r\n eventType: 'expandAccordion',\r\n isExpanded: row.isDetailsExpand\r\n };\r\n this.genericEvent.emit(eventObj);\r\n\r\n // If not expanded, stop here; else proceed to edit if applicable\r\n if (!row.isDetailsExpand) return;\r\n\r\n // Proceed to edit (with compare logic in disable)\r\n this.enableDetailEdit(row, dataItem, col);\r\n\r\n // NEW: Store original value for compare on save\r\n const originalValue = dataItem[col.field];\r\n this.originalDetailValues.set(key, originalValue);\r\n}\r\n\r\n// Line ~1740: Update disableDetailEdit (add compare + emit if changed)\r\ndisableDetailEdit(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Compare and emit if changed\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue },\r\n eventType: 'onDetailCellEdit',\r\n changed: true\r\n };\r\n this.genericEvent.emit(sendObj); // Send to API\r\n }\r\n\r\n // Cleanup\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Enable inline editing for accordion cells\r\nenableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Disable inline editing for accordion cells\r\ndisableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue, rowId: row._id || row.id, field: col.field },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Check if accordion cell is being edited\r\nisDetailCellEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\ntooltipVisible = false;\r\ntooltipEditing = false; // NEW\r\ncurrentTooltipField: string | null = null;\r\ncurrentTooltipData: any = null;\r\ntooltipPosition = { x: 0, y: 0 };\r\n\r\n\r\nenableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndisableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Check if value changed\r\n if (newValue !== originalValue) {\r\n // Send update to API\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n\r\ntooltipElement: HTMLElement | null = null;\r\n\r\n\r\ngetDisplayValue(dataItem: any, field: string): string {\r\n if (field === 'breaks') {\r\n const breaks = dataItem[field] || [];\r\n if (!Array.isArray(breaks) || breaks.length === 0) {\r\n return '0';\r\n }\r\n const totalMinutes = breaks.reduce((sum: number, b: any) => sum + (b.duration || 0), 0);\r\n return totalMinutes > 0 ? `${totalMinutes}m` : '0';\r\n } else if (field === 'short_breaks') {\r\n const shortBreak = dataItem[field];\r\n if (!shortBreak || !shortBreak.duration) {\r\n return '0';\r\n }\r\n return `${shortBreak.duration}m`;\r\n }\r\n return '0';\r\n}\r\n\r\n\r\n\r\nenableDetailEditss(row: any, dataItem: any, col: any, breakItem?: any) {\r\n this.hideCustomTooltip();\r\n\r\n // Special case for breaks / short_breaks\r\n if (col.field === 'breaks' || col.field === 'short_breaks') {\r\n this.currentTooltipData = breakItem || dataItem[col.field];\r\n this.currentTooltipField = 'single_break';\r\n this.enableTooltipEdit(); // reuse tooltip editor\r\n return;\r\n }\r\n\r\n // default editing (strings, numbers, etc.)\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n\r\n setTimeout(() => {\r\n const input = document.querySelector(`input[data-edit-key=\"${key}\"]`) as HTMLInputElement;\r\n if (input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }, 0);\r\n}\r\n\r\n\r\ndisableDetailEditss(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\nisDetailEditings(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCells(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\n\r\n\r\nshowCustomTooltip(event: MouseEvent, dataItem: any, field: string) {\r\n if (this.tooltipEditing) return; // don't override while editing\r\n this.currentTooltipData = dataItem;\r\n this.currentTooltipField = field;\r\n this.tooltipPosition = {\r\n x: event.clientX + 15,\r\n y: event.clientY + 15\r\n };\r\n this.tooltipVisible = true;\r\n}\r\n\r\n\r\n\r\ngetTooltipContent(dataItem: any, field: string): string {\r\n if (!dataItem || !field) {\r\n return '<div class=\"tooltip-content\">No details available</div>';\r\n }\r\n let html = '';\r\n\r\n // Handle single break tooltip\r\n if (field === 'single_break') {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Break Details</h4>';\r\n html += '<ul class=\"tooltip-list\">';\r\n const name = dataItem.name || 'Unnamed Break';\r\n const type = dataItem.type ? ` (${dataItem.type})` : '';\r\n const duration = dataItem.duration || 0;\r\n html += `<li><strong>${name}${type}</strong></li>`;\r\n html += `<li>Duration: ${duration} minutes</li>`;\r\n html += '</ul>';\r\n html += '</div>';\r\n return html;\r\n }\r\n\r\n // Handle 'breaks' array (existing logic, slightly modified)\r\n if (field === 'breaks') {\r\n const breaks = dataItem[field] || [];\r\n if (!Array.isArray(breaks) || breaks.length === 0) {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Break Details</h4>';\r\n html += '<p style=\"color: #666; font-style: italic;\">No breaks recorded for this day</p>';\r\n html += '</div>';\r\n return html;\r\n }\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">All Breaks</h4>';\r\n html += '<ul class=\"tooltip-list\">';\r\n let totalMinutes = 0;\r\n breaks.forEach((b: any, index: number) => {\r\n const duration = b.duration || 0;\r\n totalMinutes += duration;\r\n const name = b.name || `Break ${index + 1}`;\r\n const type = b.type ? ` (${b.type})` : '';\r\n html += `<li>${name}${type}: ${duration} minutes</li>`;\r\n });\r\n html += '</ul>';\r\n html += `<p class=\"tooltip-total\">Total Break Time: ${totalMinutes} minutes</p>`;\r\n html += '</div>';\r\n }\r\n // Handle 'short_breaks' single object (existing logic)\r\n else if (field === 'short_breaks') {\r\n const shortBreak = dataItem[field];\r\n if (!shortBreak || !shortBreak.duration) {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Short Break Details</h4>';\r\n html += '<p style=\"color: #666; font-style: italic;\">No short break recorded for this day</p>';\r\n html += '</div>';\r\n return html;\r\n }\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Short Break Details</h4>';\r\n html += '<ul class=\"tooltip-list\">';\r\n const name = shortBreak.name || 'Quick Break';\r\n const type = shortBreak.type ? ` (${shortBreak.type})` : '';\r\n html += `<li>${name}${type}: ${shortBreak.duration} minutes</li>`;\r\n html += '</ul>';\r\n html += '</div>';\r\n } else {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<p style=\"color: #666; font-style: italic;\">No details available for this field</p>';\r\n html += '</div>';\r\n }\r\n return html;\r\n}\r\n\r\ngetBreakColor(type: string): string {\r\n switch (type?.toLowerCase()) {\r\n case 'paid':\r\n return '#4CAF50'; // Green\r\n case 'unpaid':\r\n return '#F44336'; // Red\r\n case 'lunch':\r\n return '#2196F3'; // Blue\r\n default:\r\n return '#9C27B0'; // Purple (default)\r\n }\r\n}\r\n\r\nminuteOptions = Array.from({ length: 60 }, (_, i) => i); // 0–59\r\n\r\n\r\ntooltipMinutes: number = 0;\r\nformattedDuration: string = '0m';\r\n\r\nenableTooltipEdit() {\r\n this.tooltipEditing = true;\r\n this.tooltipMinutes = this.currentTooltipData.duration || 0;\r\n this.updateFormattedDuration();\r\n}\r\n\r\nupdateFormattedDuration() {\r\n const total = this.tooltipMinutes || 0;\r\n const hours = Math.floor(total / 60);\r\n const minutes = total % 60;\r\n\r\n if (hours > 0) {\r\n this.formattedDuration = `${hours}h ${minutes}m`;\r\n } else {\r\n this.formattedDuration = `${minutes}m`;\r\n }\r\n}\r\n\r\nsaveTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.currentTooltipData.duration = this.tooltipMinutes;\r\n\r\n const sendObj = {\r\n data: {\r\n ...this.currentTooltipData,\r\n rowId: this.currentTooltipData?.rowId,\r\n field: this.currentTooltipField\r\n },\r\n eventType: 'onTooltipEdit'\r\n };\r\n\r\n this.genericEvent.emit(sendObj);\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\ncancelTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\nshowRestrictionTooltip(event: MouseEvent, parentRow: any, dataItem: any) {\r\n if (!parentRow.attendance_log_detail?.length) {\r\n return;\r\n }\r\n\r\n this.currentRestrictionLogs = [...parentRow.attendance_log_detail];\r\n this.restrictionTooltipPosition = {\r\n x: event.clientX - 160,\r\n y: event.clientY - 150\r\n };\r\n this.restrictionTooltipVisible = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// Add these for delayed hide\r\nprivate customTooltipHideTimeout: any = null;\r\nprivate restrictionTooltipHideTimeout: any = null;\r\nprivate manualLogsTooltipHideTimeout: any = null;\r\n\r\nshowManualLogsTooltip(event: MouseEvent, parentRow: any, dataItem: any) {\r\n if (!parentRow.logs?.length) {\r\n return;\r\n }\r\n this.currentManualLogs = [...parentRow.logs];\r\n this.manualLogsTooltipPosition = {\r\n x: event.clientX - 160,\r\n y: event.clientY - 150\r\n };\r\n this.manualLogsTooltipVisible = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\n\r\nhideRestrictionTooltip() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n }\r\n this.restrictionTooltipHideTimeout = setTimeout(() => {\r\n this.restrictionTooltipVisible = false;\r\n this.currentRestrictionLogs = [];\r\n this.cdr.detectChanges();\r\n }, 200);\r\n}\r\n\r\nhideManualLogsTooltip() {\r\n if (this.manualLogsTooltipHideTimeout) {\r\n clearTimeout(this.manualLogsTooltipHideTimeout);\r\n }\r\n this.manualLogsTooltipHideTimeout = setTimeout(() => {\r\n this.manualLogsTooltipVisible = false;\r\n this.currentManualLogs = [];\r\n this.cdr.detectChanges();\r\n }, 200);\r\n}\r\n\r\n\r\n\r\npreventRestrictionTooltipHide() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n this.restrictionTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\npreventManualLogsTooltipHide() {\r\n if (this.manualLogsTooltipHideTimeout) {\r\n clearTimeout(this.manualLogsTooltipHideTimeout);\r\n this.manualLogsTooltipHideTimeout = null;\r\n }\r\n}\r\nhideCustomTooltip() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n }\r\n this.customTooltipHideTimeout = setTimeout(() => {\r\n this.tooltipVisible = false;\r\n this.currentTooltipData = null;\r\n this.currentTooltipField = null;\r\n this.cdr.detectChanges();\r\n }, 200); // 200ms delay\r\n}\r\n\r\npreventCustomTooltipHide() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n this.customTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\n\r\nrestrictionTooltipVisible = false;\r\nrestrictionTooltipPosition = { x: 0, y: 0 };\r\ncurrentRestrictionLogs: any[] = [];\r\n\r\nmanualLogsTooltipVisible = false;\r\nmanualLogsTooltipPosition = { x: 0, y: 0 };\r\ncurrentManualLogs: any[] = [];\r\n\r\n\r\n\r\n\r\n// New properties for detail column menu\r\n// activeDetailCol: any = null;\r\n// activeDetailRow: any = null;\r\nisDetailMenueHidden = false;\r\n\r\n// Detail column menu methods\r\nopenDetailThreeDotsMenus(event: MouseEvent, col: any, row: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.isDetailMenueHidden = true;\r\n this.activeDetailCol = col;\r\n this.activeDetailRow = row;\r\n\r\n setTimeout(() => {\r\n const element = document.querySelector('.detail-column-menu') as HTMLElement | null;\r\n const target = event.currentTarget as HTMLElement | null;\r\n\r\n if (element && target) {\r\n const rect = target.getBoundingClientRect(); // ✅ no error now\r\n element.style.left = `${rect.left}px`;\r\n element.style.top = `${rect.bottom}px`;\r\n }\r\n\r\n this.isDetailMenueHidden = false;\r\n this.cdr.detectChanges();\r\n }, 0);\r\n}\r\n\r\n\r\n// Detail sorting methods\r\nsortDetailAsc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'asc';\r\n this.sortDetailData(row, col.field, 'asc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nsortDetailDesc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'desc';\r\n this.sortDetailData(row, col.field, 'desc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailSort(col: any, row: any) {\r\n col.sortOrder = null;\r\n // Reset to original order - you might need to store original order\r\n if (row.details.originalData) {\r\n row.details.data = [...row.details.originalData];\r\n }\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate sortDetailData(row: any, field: string, order: 'asc' | 'desc') {\r\n if (!row.details?.data) return;\r\n\r\n row.details.data.sort((a: any, b: any) => {\r\n const aValue = this.getNestedValue(a, field);\r\n const bValue = this.getNestedValue(b, field);\r\n\r\n if (order === 'asc') {\r\n return aValue < bValue ? -1 : aValue > bValue ? 1 : 0;\r\n } else {\r\n return aValue > bValue ? -1 : aValue < bValue ? 1 : 0;\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail pinning methods\r\nupdateDetailColumnPin(col: any, row: any, pinned: 'left' | 'right' | null) {\r\n col.pinned = pinned;\r\n this.reorderDetailColumns(row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate reorderDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const leftPinned = row.details.columns.filter((col: any) => col.pinned === 'left');\r\n const rightPinned = row.details.columns.filter((col: any) => col.pinned === 'right');\r\n const centerColumns = row.details.columns.filter((col: any) => !col.pinned);\r\n\r\n row.details.columns = [...leftPinned, ...centerColumns, ...rightPinned];\r\n}\r\n\r\n// Detail autosize methods\r\nautosizeDetailColumn(col: any, row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((c: any) => c.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.floor(containerWidth / visibleColumns.length);\r\n\r\n col.width = Math.max(equalWidth, 80);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nautosizeAllDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((col: any) => col.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.max(Math.floor(containerWidth / visibleColumns.length), 80);\r\n\r\n visibleColumns.forEach((col: any) => {\r\n col.width = equalWidth;\r\n });\r\n\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail column visibility methods\r\nchooseDetailColumns(row: any) {\r\n // Implement choose columns modal for detail table\r\n console.log('Choose detail columns for row:', row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailColumns(row: any) {\r\n if (!row.details?.originalColumns) {\r\n console.warn('Original columns not found for this row', row);\r\n return;\r\n }\r\n\r\n row.details.columns = JSON.parse(JSON.stringify(row.details.originalColumns));\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nshowDetailColumnPanel = false;\r\ncurrentDetailRowForColumnSelection: any = null;\r\n\r\n\r\nopenDetailChooseColumns(row: any) {\r\n this.currentDetailRowForColumnSelection = row;\r\n this.showDetailColumnPanel = true;\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\ncloseDetailColumnPanel() {\r\n this.showDetailColumnPanel = false;\r\n this.currentDetailRowForColumnSelection = null;\r\n}\r\n\r\ntoggleDetailColumnVisibility(column: any, isVisible: boolean) {\r\n if (!this.currentDetailRowForColumnSelection?.details?.columns) return;\r\n\r\n const col = this.currentDetailRowForColumnSelection.details.columns.find(\r\n (c: any) => c.field === column.field\r\n );\r\n if (col) {\r\n col.is_visible = isVisible;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\nallDetailColumnsSelected(): boolean {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n return cols.every((col: any) => col.is_visible !== false);\r\n}\r\n\r\n// resetDetailColumnsInModal() {\r\n// if (!this.currentDetailRowForColumnSelection?.details?.originalColumns) {\r\n// console.warn('Original detail columns not found');\r\n// return;\r\n// }\r\n// this.currentDetailRowForColumnSelection.details.columns =\r\n// JSON.parse(JSON.stringify(this.currentDetailRowForColumnSelection.details.originalColumns));\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\ntoggleAllDetailColumnsVisibility() {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n const allVisible = this.allDetailColumnsSelected();\r\n cols.forEach((col: any) => col.is_visible = !allVisible);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ngroupByDetailColumn(col: any, row: any) {\r\n if (!col || !row?.details) return;\r\n\r\n // Initialize groupedColumns for detail if not exists\r\n if (!row.details.groupedColumns) {\r\n row.details.groupedColumns = [];\r\n }\r\n\r\n // Avoid duplicate grouping\r\n const exists = row.details.groupedColumns.some((g: any) => g.field === col.field);\r\n if (exists) return;\r\n\r\n // Mark column as grouped\r\n col.isRowGrouped = true;\r\n row.details.groupedColumns.push({ ...col });\r\n\r\n // Perform grouping on detail data\r\n this.groupDetailData(row);\r\n}\r\n\r\ngroupDetailData(row: any) {\r\n const fields = row.details.groupedColumns.map((col: any) => col.field);\r\n const originalData = row.details.originalData || row.details.data;\r\n row.details.data = this.groupData(originalData, fields);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nungroupDetailColumn(col: any, row: any) {\r\n const index = row.details.groupedColumns.findIndex((g: any) => g.field === col.field);\r\n if (index !== -1) {\r\n row.details.groupedColumns.splice(index, 1);\r\n }\r\n\r\n // Find and unmark in columns\r\n const detailCol = row.details.columns.find((c: any) => c.field === col.field);\r\n if (detailCol) detailCol.isRowGrouped = false;\r\n\r\n // Use originalData if exists, else fallback to current data\r\n const sourceData = row.details.originalData || row.details.data;\r\n row.details.data = JSON.parse(JSON.stringify(sourceData));\r\n\r\n // Re-apply remaining groups (if any)\r\n if (row.details.groupedColumns.length > 0) {\r\n this.groupDetailData(row);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// const sm = row.details.sideMenu || (row.details.sideMenu = { visible: true, currentTab: null });\r\n// if (sm.currentTab === tab) {\r\n// sm.visible = !sm.visible;\r\n// } else {\r\n// sm.currentTab = tab;\r\n// sm.visible = true;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// // Optional: emit event or re-render\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// applyDetailRowFilter(row: any) {\r\n// // if (!row.details.originalData) {\r\n// // row.details.originalData = [...row.details.data];\r\n// // }\r\n// // const filters = row.details.filters || {};\r\n// // row.details.data = row.details.originalData.filter(item: => {\r\n// // return Object.keys(filters).every(field => {\r\n// // const term = (filters[field] || '').toLowerCase();\r\n// // if (!term) return true;\r\n// // const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// // return value.includes(term);\r\n// // });\r\n// // });\r\n// }\r\n\r\n\r\n// Initialize side menu when expanding\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand && !row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// // Ensure sideMenu object exists\r\n// if (!row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// // Optional: preserve original data for filtering\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n\r\n// const sm = row.details.sideMenu;\r\n// if (sm.currentTab === tab) {\r\n// sm.currentTab = null; // close panel\r\n// } else {\r\n// sm.currentTab = tab; // open selected tab\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Column visibility change handler\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// // Apply filter to detail data\r\n// applyDetailRowFilter(row: any) {\r\n// const filters = row.details.filters || {};\r\n// row.details.data = row.details.originalData.filter((item: any) => {\r\n// return Object.keys(filters).every(field => {\r\n// const term = (filters[field] || '').toLowerCase();\r\n// if (!term) return true;\r\n// const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// return value.includes(term);\r\n// });\r\n// });\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n\r\n// Initialize detail row + side menu\r\ntoggleExpand(row: any) {\r\n if (row.details) {\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n if (row.isDetailsExpand) {\r\n // ✅ Initialize filters & visibility\r\n if (!row.details.filters) row.details.filters = {};\r\n if (!row.details.originalData) {\r\n row.details.originalData = [...row.details.data];\r\n }\r\n row.details.columns.forEach((col: any) => {\r\n if (col.is_visible === undefined) col.is_visible = true;\r\n });\r\n // ✅ Initialize sideMenu if not exists\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = {\r\n currentTab: null,\r\n columnSearch: ''\r\n };\r\n }\r\n }\r\n } else {\r\n row.isExpand = !row.isExpand;\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\ntoggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = { currentTab: null, columnSearch: '' };\r\n if (!row.details.filters) row.details.filters = {};\r\n }\r\n const sm = row.details.sideMenu;\r\n sm.currentTab = sm.currentTab === tab ? null : tab;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Column visibility change\r\nonDetailColumnVisibilityChange(row: any) {\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Apply filter to detail data\r\napplyDetailRowFilter(row: any) {\r\n const filters = row.details.filters || {};\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n return Object.keys(filters).every(field => {\r\n const config = filters[field] || {};\r\n const term = (config.value || '').toLowerCase();\r\n if (!term) return true;\r\n const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n const condition = config.condition || 'contain';\r\n switch (condition) {\r\n case 'equal': return value === term;\r\n case 'start': return value.startsWith(term);\r\n case 'end': return value.endsWith(term);\r\n default: return value.includes(term);\r\n }\r\n });\r\n });\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\nonResizeDetailColumn(event: MouseEvent, row: any, col: any): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n const initialWidth = col.width || 150;\r\n\r\n // Find all matching header and data cells in this detail table\r\n const headerCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] th[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n const dataCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] td[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n\r\n const allCells = [...headerCells, ...dataCells];\r\n\r\n // Optional: highlight during resize\r\n allCells.forEach(el => el.classList.add('resizing-highlight'));\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const deltaX = moveEvent.clientX - startX;\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 80) newWidth = 80; // min width\r\n\r\n // Apply to DOM\r\n allCells.forEach(el => {\r\n el.style.width = `${newWidth}px`;\r\n el.style.minWidth = `${newWidth}px`;\r\n });\r\n\r\n // Update model\r\n col.width = newWidth;\r\n };\r\n\r\n const onMouseUp = () => {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n allCells.forEach(el => el.classList.remove('resizing-highlight'));\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n}\r\n\r\n// In your component\r\ngetDetailViewportHeight(row: any): number {\r\n const rowCount = row.details?.data?.length || 0;\r\n const rowHeight = this.nestedTablerowHeight || 40;\r\n const maxHeight = 350;\r\n return Math.min(rowCount * rowHeight, maxHeight);\r\n}\r\n\r\n\r\n\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = target.scrollTop;\r\n// if (right) right.scrollTop = target.scrollTop;\r\n// }\r\n\r\nonDetailLeftScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (right) right.scrollTop = target.scrollTop;\r\n}\r\n\r\nonDetailRightScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (left) left.scrollTop = target.scrollTop;\r\n}\r\n\r\n\r\n\r\n\r\n// NEW: Sync vertical scroll from body → header (so header moves down with data)\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n\r\n// // Sync vertical scroll to left/right sections\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = scrollTop;\r\n// if (right) right.scrollTop = scrollTop;\r\n\r\n// // ✅ Sync vertical scroll to HEADER (so it scrolls down with data)\r\n// const headerTable = document.querySelector(`.accordion-center-section table[style*=\"table-layout\"]`) as HTMLElement;\r\n// if (headerTable) {\r\n// headerTable.scrollTop = scrollTop;\r\n// }\r\n// }\r\n\r\n// Optional: Handle header scroll (rarely needed, but safe)\r\n// onDetailHeaderScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n// const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (viewport) viewport.scrollTop = scrollTop;\r\n// }\r\n\r\n\r\n// Sync: Body scroll → Header scroll (vertical)\r\nonDetailCenterScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n // Sync vertical scroll to LEFT/RIGHT sections\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (left) left.scrollTop = scrollTop;\r\n if (right) right.scrollTop = scrollTop;\r\n\r\n // ✅ NEW: Sync vertical scroll to HEADER\r\n const headerScrollContainer = document.querySelector(`.detail-header-scroll-container[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (headerScrollContainer) {\r\n headerScrollContainer.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Sync: Header scroll → Body scroll (in case user scrolls header manually)\r\nonDetailHeaderScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) {\r\n viewport.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n@ViewChild('headerContainer', { static: false }) headerContainer: ElementRef<HTMLDivElement> | null = null;\r\n@ViewChild('dataContainer', { static: false }) dataContainer!: CdkVirtualScrollViewport;\r\n\r\nsyncScroll(event: Event) {\r\n if (!this.headerContainer || !this.dataContainer) return;\r\n\r\n const target = event.target as HTMLElement;\r\n const dataEl = this.dataContainer.elementRef.nativeElement as HTMLElement;\r\n const headerEl = this.headerContainer.nativeElement;\r\n\r\n if (target === headerEl) {\r\n dataEl.scrollLeft = headerEl.scrollLeft;\r\n } else if (target === dataEl) {\r\n headerEl.scrollLeft = dataEl.scrollLeft;\r\n }\r\n }\r\n\r\n\r\n // @ViewChild('dataContainer') dataContainer!: CdkVirtualScrollViewport;\r\n@ViewChild('leftContainer') leftContainer!: ElementRef<HTMLDivElement>;\r\n@ViewChild('rightContainer') rightContainer!: ElementRef<HTMLDivElement>;\r\n\r\nsyncVerticalScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n if (this.leftContainer) {\r\n this.leftContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n if (this.rightContainer) {\r\n this.rightContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Map: detailRowId → selection state\r\n// detailSelectionState = new Map<string, {\r\n// selectedCells: CellPosition[];\r\n// selectedKeys: Set<string>;\r\n// rowSelectedIndexes: Set<number>;\r\n// undoStack: any[][];\r\n// redoStack: any[][];\r\n// }>();\r\n\r\nprivate getDetailRowId(row: any): string {\r\n return row._id || row.id;\r\n}\r\n\r\n\r\nstartDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n event.preventDefault();\r\n this.isDetailDragging = false;\r\n\r\n this.clearOtherDetailSections(detailRow, section);\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n state.selectedCells = [{ rowIndex, colIndex: globalColIndex, subColIndex: 0, field, key }];\r\n state.selectedKeys.clear();\r\n state.selectedKeys.add(key);\r\n\r\n const mouseMove = () => {\r\n this.isDetailDragging = true;\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mousemove', mouseMove);\r\n\r\n const mouseUp = () => {\r\n document.removeEventListener('mouseup', mouseUp);\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mouseup', mouseUp);\r\n}\r\n\r\n\r\nextendDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n if (!this.isDetailDragging) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const start = state.selectedCells[0];\r\n const minRow = Math.min(start.rowIndex, rowIndex);\r\n const maxRow = Math.max(start.rowIndex, rowIndex);\r\n const minCol = Math.min(start.colIndex, globalColIndex);\r\n const maxCol = Math.max(start.colIndex, globalColIndex);\r\n\r\n const newKeys = new Set<string>();\r\n const newCells: CellPosition[] = [];\r\n\r\n // Use FULL columns, but filter by section visibility\r\n const allColumns = detailRow.details.columns;\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const col = allColumns[c];\r\n if (!col) continue;\r\n\r\n // Check if this column belongs to the current section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (inSection && col.is_visible !== false) {\r\n const k = `${r}-${c}-${col.field}`;\r\n newKeys.add(k);\r\n newCells.push({\r\n rowIndex: r,\r\n colIndex: c, // ✅ Keep global index\r\n subColIndex: 0,\r\n field: col.field,\r\n key: k\r\n });\r\n }\r\n }\r\n }\r\n\r\n state.selectedKeys = newKeys;\r\n state.selectedCells = newCells;\r\n}\r\n\r\nprivate getSectionColumns(row: any, section: 'left' | 'center' | 'right') {\r\n if (section === 'left') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'left');\r\n } else if (section === 'right') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'right');\r\n } else {\r\n return row.details.columns.filter((col: any) => !col.pinned);\r\n }\r\n}\r\n\r\nisDetailCellSelected(detailRow: any, rowIndex: number, globalColIndex: number, field: string, section: 'left' | 'center' | 'right'): boolean {\r\n const col = detailRow.details.columns[globalColIndex];\r\n if (!col) return false;\r\n\r\n // Verify column belongs to section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (!inSection || col.is_visible === false) return false;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n return state.selectedKeys.has(key);\r\n}\r\n\r\n\r\ngetSelectedDetailData(detailRow: any, section: 'left' | 'center' | 'right'): any[][] {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return [];\r\n\r\n const dataMap = new Map<number, any[]>();\r\n for (const cell of state.selectedCells) {\r\n if (!dataMap.has(cell.rowIndex)) {\r\n dataMap.set(cell.rowIndex, []);\r\n }\r\n const value = this.getNestedValue(detailRow.details.data[cell.rowIndex], cell.field);\r\n\r\n // Find LOCAL index in section for paste alignment\r\n const allColumns = detailRow.details.columns;\r\n let localIndex = 0;\r\n for (let i = 0; i < cell.colIndex; i++) {\r\n const col = allColumns[i];\r\n if (!col) continue;\r\n let inSection = false;\r\n if (section === 'left') inSection = col.pinned === 'left';\r\n else if (section === 'right') inSection = col.pinned === 'right';\r\n else inSection = !col.pinned;\r\n\r\n if (inSection && col.is_visible !== false) {\r\n localIndex++;\r\n }\r\n }\r\n dataMap.get(cell.rowIndex)![localIndex] = value ?? '';\r\n }\r\n\r\n return Array.from(dataMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(entry => entry[1]);\r\n}\r\n\r\n\r\nprivate isAnyDetailFocused(): boolean {\r\n return !!document.querySelector('.detail-virtual-scroll .selected-cell');\r\n}\r\n\r\nprivate handleDetailShortcuts(event: KeyboardEvent, detailRow: any, section: 'left' | 'center' | 'right') {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n this.performDetailCut(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'v') {\r\n event.preventDefault();\r\n this.performDetailPaste(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n event.preventDefault();\r\n this.detailUndo(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.detailRedo(detailRow, section);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\nperformDetailCut(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n state.redoStack = [];\r\n\r\n for (const cell of state.selectedCells) {\r\n const dataRow = detailRow.details.data[cell.rowIndex];\r\n this.setNestedValue(dataRow, { field: cell.field }, null, false);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\nasync performDetailPaste(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const text = await navigator.clipboard.readText();\r\n if (!text) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const startCell = state.selectedCells[0];\r\n const rows = text.split('\\n').map(r => r.split('\\t'));\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const rIdx = startCell.rowIndex + i;\r\n if (rIdx >= detailRow.details.data.length) break;\r\n const dataRow = detailRow.details.data[rIdx];\r\n for (let j = 0; j < rows[i].length; j++) {\r\n const cIdx = startCell.colIndex + j;\r\n const columns = this.getSectionColumns(detailRow, section);\r\n if (cIdx >= columns.length) break;\r\n const col = columns[cIdx];\r\n if (col?.is_visible !== false) {\r\n this.setNestedValue(dataRow, { field: col.field }, rows[i][j], false);\r\n }\r\n }\r\n }\r\n\r\n // ✅ Fix breaks/short_breaks after paste\r\n detailRow.details.data.forEach((row: any) => {\r\n if (!Array.isArray(row.breaks)) row.breaks = [];\r\n if (row.short_breaks && typeof row.short_breaks === 'string') {\r\n row.short_breaks = { duration: 0, type: 'none' };\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\ndetailUndo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.undoStack.length === 0) return;\r\n\r\n state.redoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.undoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndetailRedo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.redoStack.length === 0) return;\r\n\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.redoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate isDetailDragging = false;\r\n\r\n\r\n// Map: detailRowId → section → selection state\r\n// Map: detailRowId → section → selection state\r\ndetailSelectionState = new Map<string, Map<string, {\r\n selectedCells: CellPosition[];\r\n selectedKeys: Set<string>;\r\n undoStack: any[][];\r\n redoStack: any[][];\r\n}>>();\r\n\r\nprivate getDetailSelectionState(row: any, section: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(row);\r\n let rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) {\r\n rowMap = new Map();\r\n this.detailSelectionState.set(rowId, rowMap);\r\n }\r\n let state = rowMap.get(section);\r\n if (!state) {\r\n state = {\r\n selectedCells: [],\r\n selectedKeys: new Set(),\r\n undoStack: [],\r\n redoStack: []\r\n };\r\n rowMap.set(section, state);\r\n }\r\n return state;\r\n}\r\n\r\n\r\nprivate findFocusedDetailRowAndSection(): { row: any; section: 'left' | 'center' | 'right' } | null {\r\n const left = document.querySelector('.accordion-left-section .selected-cell');\r\n const center = document.querySelector('.detail-virtual-scroll .selected-cell');\r\n const right = document.querySelector('.accordion-right-section .selected-cell');\r\n\r\n const getRow = (el: Element | null) => {\r\n if (!el) return null;\r\n const rowId = el.closest('[data-detail-row-id]')?.getAttribute('data-detail-row-id');\r\n return this.visibleRows.find((r: any) => (r._id || r.id) === rowId);\r\n };\r\n\r\n if (left) return { row: getRow(left), section: 'left' };\r\n if (center) return { row: getRow(center), section: 'center' };\r\n if (right) return { row: getRow(right), section: 'right' };\r\n return null;\r\n}\r\n\r\nprivate clearOtherDetailSections(currentRow: any, currentSection: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(currentRow);\r\n const rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) return;\r\n\r\n // Clear the two sections that are NOT currentSection\r\n const sections: ('left' | 'center' | 'right')[] = ['left', 'center', 'right'];\r\n for (const section of sections) {\r\n if (section !== currentSection) {\r\n const state = rowMap.get(section);\r\n if (state) {\r\n state.selectedCells = [];\r\n state.selectedKeys.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Getter to check if any accordion is open\r\nget hasOpenAccordion(): boolean {\r\n return this.dataSet.some(row => row.isDetailsExpand);\r\n}\r\n\r\n// getFirstTwoWords(name: string): string {\r\n// if (!name) return '';\r\n// const words = name.trim().split(/\\s+/);\r\n// return words.slice(0, 2).join(' ').toUpperCase();\r\n// }\r\n\r\n togglePicker(picker: BsDaterangepickerDirective) {\r\n this.showPicker = !this.showPicker;\r\n this.showPicker ? picker.show() : picker.hide();\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\r\n","<div class=\"position-relative h-100\">\r\n <div\r\n class=\"d-flex justify-content-between mb-3 align-items-center position-relative\"\r\n >\r\n <div class=\"col-4 global-search\">\r\n\r\n <span\r\n\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 style=\"height: 36px\"\r\n class=\"form-control\"\r\n placeholder=\"Search all columns and press Enter\"\r\n [(ngModel)]=\"tableSearch\"\r\n (keydown.enter)=\"onGlobalSearch()\"\r\n type=\"search\"\r\n />\r\n <div class=\"row\">\r\n <div class=\"col-xs-12 col-12 col-md-4 form-group mb-3\">\r\n <div class=\"icon-container\" (click)=\"togglePicker(picker)\">\r\n <i class=\"bi bi-calendar3\"></i>\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Select date range\"\r\n bsDaterangepicker\r\n #picker=\"bsDaterangepicker\"\r\n [(ngModel)]=\"bsRangeValue\"\r\n [bsConfig]=\"bsConfig\"\r\n [bsConfig]=\"{ adaptivePosition: true }\"\r\n readonly\r\n />\r\n </div>\r\n\r\n <p class=\"mt-2 small text-muted\">\r\n Selected: {{ bsRangeValue[0] | date: 'mediumDate' }} – {{ bsRangeValue[1] | date: 'mediumDate' }}\r\n </p>\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 <div\r\n *ngIf=\"!showFilterRow\"\r\n class=\"cursor-pointer position-relative\"\r\n (click)=\"toggleOpenFilter()\"\r\n [class.active]=\"showFilters\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon top-icon me-2\"\r\n ></span>\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: 2px;\r\n top: 2px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"cursor-pointer\"\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\"\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\r\n <div\r\n *ngIf=\"activeTopButton === 'setting'\"\r\n class=\"actions-dropdown mt-1 actions-dropdown-setting\"\r\n >\r\n <div class=\"dropdown-menu show shadow custom-menu\">\r\n <!-- Table Layout -->\r\n <a\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n (click)=\"$event.stopPropagation(); toggleActions('table-layout')\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/table-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Layout</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n <!-- Table Presets -->\r\n <a\r\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/list-details.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Presets</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n\r\n <!-- Columns -->\r\n <a\r\n *ngIf=\"!showSideMenu\"\r\n (click)=\"\r\n $event.stopPropagation(); toggleActions('show-hide-columns')\r\n \"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Columns</span\r\n >\r\n <div class=\"d-flex gap-2\">\r\n <span class=\"muted-text\">{{ columnsCount }}</span>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"dropdown-divider\"></div>\r\n\r\n <!-- Filter -->\r\n <a class=\"dropdown-item\">\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 class=\"dropdown-item\" (click)=\"downloadCsv()\">\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 Download as CSV\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 ></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 ></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 ></div>\r\n </ng-container>\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 *ngIf=\"activeFilteredColumns?.length\">\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 >\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 class=\"d-flex gap-2 align-items-center\">\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 <ng-container\r\n *ngFor=\"\r\n let child of groupedColumns;\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 groupedColumns.length > 1 && i != groupedColumns.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\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 class=\"data-grid-header left-pinned\" #leftPinnedHeader>\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]=\"65\"\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 ></div>\r\n <div\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell border-below\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [indeterminate]=\"isIndeterminateState(dataSet)\"\r\n [checked]=\"isAllSelected(dataSet)\"\r\n (change)=\"toggleSelectAll(dataSet)\"\r\n />\r\n </div>\r\n <div\r\n 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: 0.2px\"\r\n [style.background-color]=\"headerBackgroundColor\"\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 [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)=\"onCenterHeaderScroll($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)=\"openThreeDotsMenu($event, 'group')\"\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)=\"onResizeGroupBox($event)\"\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 === 'TimeSheet'\"\r\n >\r\n </span>\r\n <div\r\n class=\"dragable-header\"\r\n (cdkDragStarted)=\"\r\n checkColumnGroupingStatus(col); dragStartOnGroup(col)\r\n \"\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 [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: 'centerColumns'\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 *ngIf=\"child?.isGroupable\">\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?.isGroupable\">\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 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: 'previewRightPinnedColumns'\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 [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: 'centerColumns'\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!-- Data Grid Body starts here -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <div\r\n class=\"h-100 d-flex justify-content-center align-items-center\"\r\n *ngIf=\"!dataSet.length && !loading\"\r\n >\r\n No Record Found\r\n </div>\r\n\r\n <div\r\n class=\"position-absolute w-100 h-100 d-flex justify-content-center align-items-center loading-overlay\"\r\n *ngIf=\"loading\"\r\n style=\"\r\n z-index: 999;\r\n background: rgba(255, 255, 255, 0.8);\r\n backdrop-filter: blur(1px);\r\n \"\r\n >\r\n <div *ngIf=\"loadingMore && enableInfiniteScroll\" class=\"text-center p-2\" [style.height.px]=\"rowHeight\">\r\n <div class=\"spinner-border text-primary\" role=\"status\"></div> Loading more...\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 *ngIf=\"dataSet.length\"\r\n >\r\n <!-- LEFT PINNED -->\r\n <div [style.height.px]=\"!groupedColumns.length ? originalDataSet.length * rowHeight: 0\"></div>\r\n <div [class.h-100]=\"originalDataSet.length <= 10\">\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]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\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 }\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=\"\"\r\n [style.width.px]=\"centerPinnedHeader.clientWidth\"\r\n >\r\n <div\r\n class=\"data-grid-body center-scrollable\"\r\n\r\n style=\"overflow-y: hidden; overflow-x: auto\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.backgroundColor]=\"bodyBackgroundColor\"\r\n #centerScrollableBody\r\n (scroll)=\"onCenterBodyScroll($event)\"\r\n [style.boxShadow]=\"leftPinnedBoxshadow\"\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: previewCenterColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n section: 'center'\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 <= 10\"\r\n [style.max-width.px]=\"isScrollbarVisible ? rightPinnedHeader.offsetWidth - 15: rightPinnedHeader.offsetWidth\"\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]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.boxShadow]=\"rightPinnedBoxshadow\"\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 }\r\n \"\r\n ></ng-container>\r\n </ng-container>\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 * (paginationConfig.totalResults || flattenedData.length) + (hasMoreData ? 1000 : 0)\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Horizintal Fake Scrollbars -->\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"dataSet.length\">\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)=\"onHorizintalFakeScroll($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\"></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 && !hasOpenAccordion\"\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-white]=\"\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-white]=\"\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 [style.height.px]=\"footerRowHeight\" class=\"border-top\">\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: {{ paginationConfig.page }}-{{\r\n paginationConfig.page * paginationConfig.limit\r\n }}\r\n of\r\n {{ paginationConfig.totalResults }}\r\n </div>\r\n\r\n <div class=\"page-buttons\">\r\n <button\r\n (click)=\"goToPage(paginationConfig.page - 1)\"\r\n [disabled]=\"paginationConfig.page === 1\"\r\n >\r\n ‹\r\n </button>\r\n\r\n <ng-container *ngFor=\"let page of visiblePages\">\r\n <button\r\n *ngIf=\"page !== '...'\"\r\n (click)=\"goToPage(page)\"\r\n [class.active]=\"page === paginationConfig.page\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span *ngIf=\"page === '...'\">...</span>\r\n </ng-container>\r\n\r\n <button\r\n (click)=\"goToPage(paginationConfig.page + 1)\"\r\n [disabled]=\"paginationConfig.page === paginationConfig.totalResults\"\r\n >\r\n ›\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- Header Cell Template -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n\r\n<ng-template\r\n #headerCell\r\n let-col\r\n let-pinnedRight=\"pinnedRight\"\r\n let-i=\"index\"\r\n let-sections=\"section\"\r\n let-calledFromNestedPlaceholder=\"calledFromNestedPlaceholder\"\r\n>\r\n <div>\r\n <!-- Group Header -->\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatHeader\">\r\n <div cdkDroplistGroup class=\"group-column-wrapper\">\r\n <!-- Parent Header -->\r\n <div\r\n *ngIf=\"shouldTheGroupHeaderShow(col)\"\r\n class=\"header-cell group-header\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.gridColumn]=\"'span ' + col.children.length\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n [class.justify-content-end]=\"pinnedRight\"\r\n style=\"grid-row: 1\"\r\n >\r\n <div\r\n class=\"group-header-content\"\r\n [title]=\"col.header\"\r\n [class.ms-2]=\"pinnedRight\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n <div\r\n class=\"resize-handle\"\r\n (dblclick)=\"autosizeColumn(col.children)\"\r\n (mousedown)=\"onResizeGroup($event, col, pinnedRight)\"\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 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)=\"openThreeDotsMenu($event, child); openFilteronThreeDotsClick(child)\"\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)=\"openThreeDotsMenu($event, child)\"\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 >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n columnMenu;\r\n context: { col: child }\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)=\"onResizeColumn($event, child)\"\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)]=\"col.filterValue\"\r\n (ngModelChange)=\"onFilterChange(col)\"\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 ><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.isGroupable && 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.isGroupable\">\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?.isGroupable\"\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 class=\"group-column-wrapper\">\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\"\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)=\"openThreeDotsMenu($event, col); openFilteronThreeDotsClick(col)\"\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 <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n (sortingConfig?.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 mt-1\"\r\n ></span>\r\n </div>\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\"\r\n [style.left.px]=\"\r\n -(!col?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnMenu; context: { col: col }\"\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)=\"onResizeColumn($event, col)\"\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 />\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 ><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>\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 border-below d-flex align-items-center\"\r\n [style.height.px]=\"rowHeight\"\r\n [style.width]=\"\r\n section == 'center'\r\n ? centerScrollableBody!.nativeElement?.scrollWidth + '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]=\"65\"\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 >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\r\n style=\"width: 50px\"\r\n class=\"d-flex align-items-center justify-content-center h-100 border-right\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.left-selection-border]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n \"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <input style=\"width: 16px; height: 16px\" type=\"checkbox\" />\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'center'\"\r\n [style.width.px]=\"centerPinnedHeader.scrollWidth\"\r\n class=\"d-flex align-items-center ps-2 h-100\"\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 * 16 : 0\"\r\n >\r\n <span class=\"me-2 filter-icon-wrapper\" (click)=\"toggleExpand(row)\">\r\n <span\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n <strong (click)=\"toggleExpand(row)\" class=\"cursor-pointer\">\r\n {{ row.groupValue }} ({{ countLeafRows(row) }})\r\n </strong>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'right'\"\r\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Recursive Children -->\r\n <div class=\"group-children\" *ngIf=\"row.isExpand\">\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 }\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 class=\"d-flex\" [style.height.px]=\"rowHeight\">\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=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'start' && !isSingleDay\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length && !isSingleDay\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\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':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\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':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\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]=\"65\"\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 >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\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\"\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 >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [checked]=\"isRowSelected(row)\"\r\n (change)=\"toggleRowSelection(row)\"\r\n />\r\n </div>\r\n\r\n <!-- Render all columns -->\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns;\r\n trackBy: trackByField;\r\n let colIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatColumn\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n trackBy: trackByField;\r\n let subColIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"child?.is_visible && !child?.isRowGrouped\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellTemplate;\r\n context: {\r\n col: child,\r\n row: row,\r\n rowIndex: rowIndex,\r\n colIndex: colIndex,\r\n subColIndex: subColIndex,\r\n section: section\r\n }\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\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 }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </div>\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=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'end' && !isSingleDay\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\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 <!-- LEFT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'left' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" style=\"max-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n<!-- CENTER SECTION: Actual details table -->\r\n\r\n<div *ngIf=\"section === 'center' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details-wrapper data-grid-accordion\" [style.fontFamily]=\"fontFaimly\" [style.fontSize.px]=\"bodyTextFontsSize\" style=\"display: flex; width: 100%; max-height: 350px; overflow: hidden;\">\r\n <!-- LEFT SECTION OF ACCORDION -->\r\n <div #leftContainer class=\"accordion-left-section data-pin-body-wrapper data-grid-accordion-section\" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailLeftScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table table-sm mb-0 data-grid-accordion-table\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"nestedTableHeaderBAckgroundColor\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4 border-right\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'left')\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n [style.fontSize.px]=\"nestedTablerowFontsize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n {{ getNestedValue(d, col.field) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- CENTER SECTION OF ACCORDION (WITH VIRTUAL SCROLL) -->\r\n\r\n<div class=\"accordion-center-section data-grid-accordion-section\" style=\"flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden;\">\r\n <!-- Header Section -->\r\n <div class=\"header-container\" style=\"overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none;\" #headerContainer (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table table-sm mb-0 data-grid-accordion-table\" style=\"table-layout: fixed; width: 100%;\">\r\n <thead>\r\n <tr\r\n [style.height.px]=\"nestedTableHeaderRowHeight\"\r\n cdkDropList\r\n [cdkDropListData]=\"row?.details.columns\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"dropColumn($event, row)\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let i = index\">\r\n <th\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n cdkDrag\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.backgroundColor]=\"nestedTableHeaderBAckgroundColor\"\r\n style=\"cursor: move; position: relative;\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span>{{ col.header }}</span>\r\n <span\r\n class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n </div>\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\" [style.top.px]=\"nestedTableHeaderRowHeight\" [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n\r\n <!-- Group Badges (if any) -->\r\n <div *ngIf=\"row.details?.groupedColumns?.length\" class=\"detail-group-badges\">\r\n <span *ngFor=\"let g of row.details.groupedColumns; trackBy: trackByField\" class=\"badge bg-light text-dark me-1\">\r\n {{ g.header }}\r\n <span class=\"ms-1 cursor-pointer\" (click)=\"ungroupDetailColumn(g, row)\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"></span>\r\n </span>\r\n </div>\r\n\r\n <!-- Data Table Section with Virtual Scroll -->\r\n <cdk-virtual-scroll-viewport\r\n itemSize=\"{{ nestedTablerowHeight }}\"\r\n minBufferPx=\"200\"\r\n maxBufferPx=\"400\"\r\n class=\"detail-virtual-scroll\"\r\n [attr.data-detail-row-id]=\"row._id || row.id\"\r\n style=\"flex: 1; overflow: auto;\"\r\n #dataContainer\r\n (scroll)=\"syncVerticalScroll($event)\"\r\n (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table table-sm mb-0 data-grid-accordion-table\" style=\"table-layout: fixed; width: 100%;\">\r\n <tbody>\r\n <tr\r\n class=\"cursor-pointer data-grid-accordion-row\"\r\n *cdkVirtualFor=\"let d of row.details.data; trackBy: trackById; let j = index\"\r\n [style.height.px]=\"nestedTablerowHeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let k = index\">\r\n <td\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, k, col.field, 'center')\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\"\r\n style=\"cursor: pointer; position: relative; overflow: visible; cursor: cell; \">\r\n <div class=\"time-sheet-container\" style=\"overflow: visible; display: flex; gap: 4px; align-items: center; height: 100%;\">\r\n <ng-container *ngIf=\"col.field === 'breaks' || col.field === 'short_breaks'; else defaultDetailCell\">\r\n <ng-container *ngIf=\"col.field === 'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaks\">\r\n <div *ngFor=\"let breakItem of d[col.field]; let breakIndex = index\" class=\"circle-value\" [style.backgroundColor]=\"getBreakColor(breakItem.type)\" (mouseenter)=\"showCustomTooltip($event, breakItem, 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">\r\n {{ breakItem.duration }}m\r\n </div>\r\n </ng-container>\r\n <ng-template #noBreaks>\r\n <div class=\"circle-value\" (mouseenter)=\"showCustomTooltip($event, {duration: 0, type: 'none'}, 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">0m</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"col.field === 'short_breaks' && !isDetailEditing(row, d, col)\">\r\n <div *ngIf=\"d[col.field]?.duration; else noShortBreak\" class=\"circle-value\" [style.backgroundColor]=\"getBreakColor(d[col.field].type)\" (mouseenter)=\"showCustomTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n <ng-template #noShortBreak>\r\n <div class=\"circle-value\" (mouseenter)=\"showCustomTooltip($event, {duration: 0, type: 'none'}, 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">0m</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <input #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" [attr.data-edit-key]=\"row._id + '-' + j + '-' + col.field\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto; position: absolute; top: 0; left: 0; z-index: 10;\" />\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultDetailCell>\r\n <span class=\"d-flex align-items-center h-100\">\r\n <ng-container *ngIf=\"!isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n <div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"popover__wrapper\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted }}\r\n </span>\r\n </div>\r\n <div *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\" (mouseenter)=\"row.logs?.length > 0 && showManualLogsTooltip($event, row, d); preventManualLogsTooltipHide()\" (mouseleave)=\"hideManualLogsTooltip()\">\r\n <ng-container *ngIf=\"row.logs?.length > 0; else noLogsIcon\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\" class=\"data-grid-svg-icon text-primary\" style=\"cursor: pointer; font-size: 16px;\"></span>\r\n </ng-container>\r\n <ng-template #noLogsIcon>\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\" class=\"data-grid-svg-icon text-muted\" style=\"font-size: 16px; cursor: not-allowed;\"></span>\r\n </ng-template>\r\n </div>\r\n <span *ngSwitchDefault>{{ getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-' }}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <input *ngSwitchCase=\"'string'\" #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'number'\" #detailInput type=\"number\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'date'\" #detailInput type=\"date\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'time'\" #detailInput type=\"time\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'currency'\" #detailInput type=\"number\" step=\"0.01\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm text-end\" style=\"width: 100%; height: auto;\" />\r\n <select *ngSwitchCase=\"'dropdown'\" #detailInput [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\">\r\n <option *ngFor=\"let option of col.column_dropdown_value\" [ngValue]=\"option?.value || option\">\r\n {{ option?.label || option?.name || option }}\r\n </option>\r\n </select>\r\n <input *ngSwitchDefault #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n\r\n <!-- RIGHT SECTION OF ACCORDION -->\r\n <div #rightContainer class=\"accordion-right-section data-pin-body-wrapper \" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailRightScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table table-sm mb-0\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"nestedTableHeaderBAckgroundColor\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"rowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'right')\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n {{ getNestedValue(d, col.field) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n\r\n </div>\r\n\r\n <!-- DETAIL SIDE MENU (Sticky on right end) -->\r\n <div class=\"detail-side-menu-wrapper\" >\r\n <div style=\"width: 30px\" class=\"d-flex flex-column align-items-center bg-light\">\r\n <div (click)=\"toggleDetailSideMenu(row, 'cols')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'cols'\" class=\"columns-button d-flex flex-column align-items-center border-below\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Columns</div>\r\n </div>\r\n <div (click)=\"toggleDetailSideMenu(row, 'filtrs')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'filtrs'\" class=\"columns-button d-flex flex-column align-items-center\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Filter</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"row.details.sideMenu?.currentTab\" class=\"detail-side-menu-content\" [style.backgroundColor]=\"sidemenuBackgroundColor\" style=\"width: 250px; box-shadow: -2px 0 5px rgba(0,0,0,0.1);\">\r\n <!-- COLUMNS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'cols'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Columns</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"d-flex align-items-center mb-2\">\r\n <input type=\"checkbox\" class=\"form-check-input me-2\" [(ngModel)]=\"col.is_visible\" (change)=\"onDetailColumnVisibilityChange(row)\" />\r\n <span>{{ col.header }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- FILTERS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'filtrs'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Filters</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center cursor-pointer\" (click)=\"col.expandedFilter = !col.expandedFilter\">\r\n <label class=\"mb-0 small\">{{ col.header }}</label>\r\n <span class=\"toggle-icon data-grid-svg-icon\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\" [class.rotate]=\"col.expandedFilter\"></span>\r\n </div>\r\n <div *ngIf=\"col.expandedFilter\" class=\"mt-2 filter-input-container ps-3 pe-3\">\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n row.details.filters[col.field]?._ids?.length == col.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllDetailFilters(col, row, $event)\"\r\n id=\"detail_selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_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 : col.searchValue : 'value';\r\n trackBy: trackById\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 row.details.filters[col.field]?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n (change)=\"onDetailOptionToggle(col, option, row)\"\r\n id=\"detail_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 'detail_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 </div>\r\n </ng-container>\r\n\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)]=\"row.details.filters[col.field].first_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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)]=\"row.details.filters[col.field].first_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n />\r\n\r\n <ng-container *ngIf=\"row.details.filters[col.field]?.first_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"and\"\r\n id=\"detail_and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"or\"\r\n id=\"detail_or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"none\"\r\n id=\"detail_none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\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 </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Side Menu -->\r\n\r\n\r\n\r\n<!-- Popover for Restriction Logs (is_un_restricted) -->\r\n<div\r\n *ngIf=\"restrictionTooltipVisible\"\r\n class=\"popover__content m-l-10 popoverRestriction position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"restrictionTooltipPosition.x\"\r\n [style.top.px]=\"restrictionTooltipPosition.y\"\r\n (mouseenter)=\"preventRestrictionTooltipHide()\"\r\n (mouseleave)=\"hideRestrictionTooltip()\"\r\n style=\"z-index: 1000; min-width: 300px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\">Clock in</th>\r\n <th class=\"center\">Clock out</th>\r\n <th class=\"center\">Log Hr</th>\r\n <th class=\"center\">Log Min</th>\r\n <th class=\"center pe-2\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of currentRestrictionLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\"> {{ item?.clock_in_time}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.clock_out_time}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_hours }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_minutes }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ item?.status ? (item.status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Popover for Manual Logs -->\r\n<div\r\n *ngIf=\"manualLogsTooltipVisible\"\r\n class=\"popover__content position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"manualLogsTooltipPosition.x\"\r\n [style.top.px]=\"manualLogsTooltipPosition.y\"\r\n (mouseenter)=\"preventManualLogsTooltipHide()\"\r\n (mouseleave)=\"hideManualLogsTooltip()\"\r\n style=\"z-index: 1000; min-width: 500px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <ng-container *ngIf=\"currentManualLogs.length > 0; else noManualLogs\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\" style=\"width: 18%;\">Name</th>\r\n <th class=\"center\">Date/Time</th>\r\n <th class=\"center\">Previous Time</th>\r\n <th class=\"center\">Updated Time</th>\r\n <th class=\"center\">Status</th>\r\n <th class=\"center pe-2\">Remarks</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let log of currentManualLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\">{{ log.name }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.date_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.previous_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.updated_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ log.log_status ? (log.log_status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n <td class=\"center pe-2\">\r\n <span class=\"text-primary\">{{ log.remarks }}</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-template #noManualLogs>\r\n <div class=\"text-center p-3\">\r\n <p class=\"text-muted mb-0\">No manual logs available for this record.</p>\r\n </div>\r\n </ng-template>\r\n</div>\r\n\r\n\r\n\r\n\r\n<!-- Existing Custom Tooltip for Breaks -->\r\n<div\r\n *ngIf=\"tooltipVisible\"\r\n class=\"custom-tooltip bg- border rounded-3 p-3\"\r\n [style.left.px]=\"tooltipPosition.x - 150\"\r\n [style.top.px]=\"tooltipPosition.y - 155\"\r\n (mouseenter)=\"preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideCustomTooltip()\"\r\n (dblclick)=\"enableTooltipEdit()\"\r\n style=\"z-index: 1000; min-width: 280px; font-size: 12px;\"\r\n>\r\n <!-- Display mode -->\r\n <ng-container *ngIf=\"!tooltipEditing\">\r\n <div [innerHTML]=\"getTooltipContent(currentTooltipData, currentTooltipField || '')\"></div>\r\n </ng-container>\r\n\r\n <!-- Edit mode -->\r\n <ng-container *ngIf=\"tooltipEditing\">\r\n <div class=\"tooltip-edit-form\">\r\n <div class=\"mb-2\">\r\n <label class=\"form-label fw-semibold small mb-1\">Duration</label>\r\n <input\r\n type=\"number\"\r\n [(ngModel)]=\"tooltipMinutes\"\r\n (ngModelChange)=\"updateFormattedDuration()\"\r\n class=\"form-control form-control-sm\"\r\n />\r\n <div class=\"form-text text-muted small\">{{ formattedDuration }}</div>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label fw-semibold small mb-1\">Type</label>\r\n <select\r\n [(ngModel)]=\"currentTooltipData.type\"\r\n class=\"form-select form-select-sm\"\r\n >\r\n <option value=\"paid\">Paid</option>\r\n <option value=\"unpaid\">Unpaid</option>\r\n <option value=\"lunch\">Lunch</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button class=\"btn btn-sm btn-primary px-3\" (click)=\"saveTooltipEdit()\">💾 Save</button>\r\n <button class=\"btn btn-sm btn-light border px-3\" (click)=\"cancelTooltipEdit()\">✖ Cancel</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n\r\n\r\n\r\n <!-- RIGHT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'right' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" style=\"max-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\"> </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\"> </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\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>\r\n <div\r\n (click)=\"disableEdit(row, col); setActiveCell(row, col)\"\r\n [style.fontWeight]=\"bodyFontWeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n class=\"cell overflow-visible position-relative\"\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 [class.active-cell]=\"\r\n isActiveCell(row, col) && !isEditing(row, col) && selectedKeys.size == 1\r\n \"\r\n (dblclick)=\"$event.preventDefault(); enableEdit(row, col)\"\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=\"0\"\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 class=\"table-cell\" [class.active-for-editing]=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50\">\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50; else viewMode\"\r\n >\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <!-- Text Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 10\"\r\n *ngSwitchCase=\"'input'\"\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Number Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'number'\"\r\n #numberInput=\"ngModel\"\r\n #numberRef\r\n (keypress)=\"allowOnlyNumbers($event)\"\r\n type=\"number\"\r\n required\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n (keydown.enter)=\"numberRef.blur()\"\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': numberInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Date Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'date'\"\r\n type=\"date\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n #dateInput=\"ngModel\"\r\n [ngClass]=\"{\r\n 'is-invalid': dateInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Dropdown -->\r\n <!-- ng-select like dropdown -->\r\n <div\r\n *ngSwitchCase=\"'dropdown'\"\r\n class=\"dropdown w-100\"\r\n (blur)=\"disableEdit(row, col)\"\r\n >\r\n <!-- Trigger -->\r\n <button\r\n class=\"form-select form-select-sm text-start w-100 text-ellipsis\"\r\n type=\"button\"\r\n data-bs-toggle=\"dropdown\"\r\n aria-expanded=\"false\"\r\n [style.minHeight.px]=\"rowHeight - 10\"\r\n data-bs-display=\"static\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container>\r\n {{\r\n getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field)\r\n }}\r\n </ng-container>\r\n <ng-template #placeholder> Select options... </ng-template>\r\n </button>\r\n\r\n <!-- Menu -->\r\n <div\r\n class=\"dropdown-menu w-100 p-0 cell-editing-dropdown-menu rounded-3\"\r\n [class.show]=\"isEditing(row, col)\"\r\n >\r\n <!-- Search -->\r\n <div class=\"px-2 py-1\">\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 />\r\n </div>\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"cell-editin-dropdown\"\r\n style=\"max-height: 200px; overflow: auto\"\r\n >\r\n <div\r\n (click)=\"\r\n setNestedValue(row, col, option, true);\r\n disableEdit(row, col)\r\n \"\r\n class=\"px-2 py-1 d-flex align-items-center item\"\r\n *ngFor=\"\r\n let option of col.column_dropdown_value\r\n | filter : editinDropdownSearch : 'value'\r\n \"\r\n >\r\n <label\r\n class=\"form-check-label d-flex align-items-center mb-0\"\r\n [for]=\"col.field + '-' + option.value || option\"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <input\r\n *ngSwitchCase=\"'email'\"\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #emailModel=\"ngModel\"\r\n #emailInput\r\n type=\"email\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n pattern=\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\r\n (blur)=\"disableEdit(row, col, emailModel)\"\r\n (keydown.enter)=\"\r\n emailModel.control.markAsTouched(); emailInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': emailModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n <!-- Default fallback -->\r\n <input\r\n *ngSwitchDefault\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #textModel=\"ngModel\"\r\n #textInput\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\r\n (keydown.enter)=\"\r\n textModel.control.markAsTouched(); textInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': textModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Display mode -->\r\n <ng-template #viewMode>\r\n <div\r\n class=\"d-flex justify-between items-center w-100\"\r\n [ngClass]=\"getCellClasses(col, getNestedValue(row, col.field))\"\r\n >\r\n <!-- Text cell -->\r\n <div\r\n #cellText\r\n class=\"text-ellipsis flex-grow-1\"\r\n [title]=\"\r\n col.type === 'date'\r\n ? (getNestedValue(row, col.field) | date : dateFormat)\r\n : getNestedValue(row, col.field)\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.type !== 'image'\">\r\n {{\r\n !isNestedValueArray(row, col.field)\r\n ? col.type === 'date'\r\n ? (isDate(getNestedValue(row, col.field))\r\n ? (getNestedValue(row, col.field) | date: dateFormat)\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-'))\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-')\r\n : (getNestedValue(row, col.field)?.[0]?.department_name ||\r\n getNestedValue(row, col.field)?.[0]?.roleName ||\r\n '-')\r\n }}\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: row,\r\n col: col,\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Expand / Collapse icon -->\r\n <span\r\n *ngIf=\"\r\n (isOverflowing(cellText) &&\r\n showCellDetailsBox &&\r\n getNestedValue(row, col.field)?.length > 50) ||\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 </div>\r\n\r\n <!-- Expanded text -->\r\n <div\r\n class=\"position-absolute w-100\"\r\n *ngIf=\"isExpanded(row, col)\"\r\n [style.zIndex]=\"getZIndex(row, col)\"\r\n style=\"top: 100%; left: 0\"\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 #columnMenu let-col=\"col\">\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 >\r\n <!-- Sort Ascending -->\r\n <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showAscending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortAsc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Ascending\r\n </div>\r\n\r\n <!-- Sort Descending -->\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showDescending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'asc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDesc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Descending\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n sortingConfig?.field === col.field &&\r\n (sortingConfig?.order_by === 'asc' ||\r\n sortingConfig?.order_by === 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"resetSort(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Reset Sort\r\n </div>\r\n </div>\r\n <div class=\"py-2 border-below three-dots-filter\">\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showFilter\"\r\n class=\"column-menu-item three-dots-filter\"\r\n (click)=\"openFilteronThreeDotsClick(col)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Filter\r\n </div>\r\n </div>\r\n\r\n <div class=\"py-2 border-below\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, 'left')\"\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)=\"updateColumnPinInSourceByField(activeCol, 'right')\"\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)=\"updateColumnPinInSourceByField(activeCol, null)\"\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 >\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 *ngIf=\"isThreeDotsFilterOpen\" class=\"three-dots-col-menu position-relative\" [style.left.px]=\"-140\" [class.visually-hidden]=\"isMenueHidden\">\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\r\n\r\n<!-- Filter Menue -->\r\n<ng-template #filterMenu let-col=\"col\">\r\n <div\r\n class=\"filter-menu-container filter-menu\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"filter-dropdown-section p-1\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"addFilterDropdownSearch\"\r\n #filterMenueSearchInput\r\n />\r\n\r\n <div class=\"form-check mb-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isAllSideFilterOptionsSelected(col)\"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'value';\r\n trackBy: trackById\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n [value]=\"option\"\r\n id=\"option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n (change)=\"onOptionToggle(col, option)\"\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 </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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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)]=\"col.query.first_value\"\r\n #filterMenueTextchInput\r\n />\r\n\r\n <ng-container *ngIf=\"col.query?.first_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\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\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\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\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\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 class=\"form-check-label\" for=\"none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"col.query.second_value\"\r\n />\r\n </ng-container>\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: 22px\"\r\n (click)=\"applyFilterFromFilterRow(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 w-100\"\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-template>\r\n\r\n<!-- Side Menue -->\r\n\r\n<!-- Add this new template for accordion detail column menu -->\r\n<ng-template #detailColumnMenu let-col=\"col\" let-row=\"row\">\r\n <div\r\n class=\"column-menu three-dots-col-menu detail-column-menu\"\r\n [class.visually-hidden]=\"isDetailMenueHidden\"\r\n *ngIf=\"activeDetailCol\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\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=\"columnThreedotsMunuConfig?.showAscending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailAsc(activeDetailCol, row)\"\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=\"columnThreedotsMunuConfig?.showDescending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailDesc(activeDetailCol, row)\"\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=\"col?.sortOrder\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetDetailSort(activeDetailCol, row)\"\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\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)=\"updateDetailColumnPin(activeDetailCol, row, 'left')\"\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)=\"updateDetailColumnPin(activeDetailCol, row, 'right')\"\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)=\"updateDetailColumnPin(activeDetailCol, row, null)\"\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)=\"autosizeDetailColumn(activeDetailCol, row)\"\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)=\"autosizeAllDetailColumns(row)\"\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 (Detail Row) -->\r\n<div\r\n *ngIf=\"showRowsGrouping && col?.isGroupable\"\r\n class=\"column-menu-item\"\r\n (click)=\"groupByDetailColumn(activeDetailCol, activeDetailRow)\"\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)=\"openDetailChooseColumns(row)\"\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)=\"resetDetailColumns(row)\"\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</ng-template>\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\"\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\">\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\">\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 class=\"column-group d-flex align-items-center mb-2\">\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\">\r\n <span\r\n class=\"me-2 filter-icon-wrapper me-2\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expandedFilter\"\r\n ></span>\r\n </span>\r\n\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n style=\"cursor: pointer\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span class=\"text-truncate fw-bold\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Show filter when expanded -->\r\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4 pe-3\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sideNestedFilter; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Side Nested Filters -->\r\n<ng-template #sideNestedFilter let-col=\"col\">\r\n <div class=\"\">\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.length == col?.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1 ms-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'header'\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\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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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!.firt_value\"\r\n />\r\n\r\n <ng-container *ngIf=\"col?.query?.firt_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\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\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\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\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n </div>\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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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-2\"\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</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\">\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 [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 [class.border-right]=\"showVerticalBorder\"\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 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 />\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 rounded-3 bg-white 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>\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 rounded-3 bg-white 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\"\r\n type=\"button\"\r\n id=\"savePresetDropdown\"\r\n (click)=\"$event.stopPropagation(); toggleSubActions('save-preset')\"\r\n >\r\n Save 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 class=\"\">\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\"\r\n class=\"badge bg-light text-primary ms-2\"\r\n >Default</span\r\n >\r\n <span\r\n *ngIf=\"!tableFilterViewId\"\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 >\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end\">\r\n <a\r\n (click)=\"clearAllFilters()\"\r\n class=\"dropdown-item d-flex align-items-center\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/star.svg'\"\r\n class=\"me-2\"\r\n ></span>\r\n Set as default\r\n </a>\r\n </ul>\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=\"let table of filteredList; trackBy: trackByTable\"\r\n >\r\n <!-- Item -->\r\n <div\r\n class=\"list-group-item px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div (click)=\"selectFilter(table)\">\r\n <div class=\"fw-semibold\" style=\"cursor: pointer;\">\r\n {{ table?.name }}\r\n <!-- {{table?.is_temp}} -->\r\n <span\r\n *ngIf=\"table?.is_temp\"\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_deafult\"\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\"\r\n >Created {{ table?.createdAt | date : \"MMM d, y\" }}</small\r\n >\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center\">\r\n <span\r\n *ngIf=\"table?.is_deafult\"\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_deafult\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n id=\"dropdownMenuButton2\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end set-default-preset\" aria-labelledby=\"dropdownMenuButton2\">\r\n <a\r\n [class.d-none]=\"confirmDelete\"\r\n (click)=\"actionPreset(table, 'setPreset')\"\r\n class=\"dropdown-item d-flex align-items-center\"\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 </a>\r\n\r\n <!-- Delete with confirmation -->\r\n <ng-container *ngIf=\"!confirmDelete; else confirmBlock\">\r\n <a\r\n (click)=\"confirmDelete = true\"\r\n class=\"dropdown-item d-flex align-items-center text-danger\"\r\n >\r\n <span\r\n style=\"margin-top: -4px\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Delete\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Confirmation block -->\r\n </ul>\r\n <ng-template #confirmBlock>\r\n <div class=\"dropdown-item\"><b>Delete preset</b></div>\r\n <div class=\"dropdown-item text-center\">\r\n <div class=\"mb-2\">\r\n Are you sure you want to delete the <br />\r\n <b>“{{ table?.name }}”</b> preset?\r\n </div>\r\n <button\r\n class=\"btn btn-sm btn-light me-2\"\r\n (click)=\"confirmDelete = false\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-danger delete-preset\"\r\n (click)=\"actionPreset(table, 'deletePreset')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"confirm-preset-delete\"\r\n ></span>\r\n Delete\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Item End Here -->\r\n </div>\r\n\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\">Save preset</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\">\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 </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 rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 280px\"\r\n >\r\n <!-- Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"d-flex align-items-center\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Columns</h6>\r\n </div>\r\n <a\r\n (click)=\"resetColumns()\"\r\n href=\"javascript:void(0)\"\r\n class=\"text-primary text-decoration-none\"\r\n >Reset</a\r\n >\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"mb-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"mx-2 position-absolute icon data-grid-svg-icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search column\"\r\n type=\"search\"\r\n [(ngModel)]=\"topShowHideColumns\"\r\n />\r\n </div>\r\n </div>\r\n <!-- Preset List -->\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"\r\n max-height: calc(100vh - 300px);\r\n overflow: auto;\r\n scrollbar-width: thin;\r\n \"\r\n >\r\n <div class=\"muted-text show-hide-table-label\" *ngIf=\"hasAnyVisibleColumn\">\r\n Show in table\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 >\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\"\r\n *ngIf=\"hasAnyInVisibleColumn\"\r\n >\r\n Hide in table\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 rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"mb-2 px-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter by\"\r\n type=\"search\"\r\n [(ngModel)]=\"addFilterColumnInput\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 500px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : addFilterColumnInput : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div\r\n (click)=\"openFilter(col)\"\r\n *ngIf=\"\r\n col.is_visible &&\r\n !col?.query?.first_value &&\r\n !col?.query?._ids?.length\r\n \"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div style=\"margin-top: -3px\"></div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <div\r\n @slideToggle\r\n *ngIf=\"isFilterOpen && selectedColumnForFilter.type == 'dropdown'\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"px-3 my-2 border-below py-1 pb-2 mb-3 d-flex ps-1\">\r\n <span\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span\r\n ><b>{{ selectedColumnForFilter?.header }}</b>\r\n </div>\r\n <div class=\"mb-2 px-3\">\r\n <div\r\n class=\"col-12 global-search position-relative border rounded d-flex align-items-center flex-wrap px-2 filter-serach-inpt\"\r\n >\r\n <span\r\n *ngFor=\"let selected of selectedFilterOptions\"\r\n class=\"badge d-flex align-items-center gap-1 me-1 mb-1\"\r\n >\r\n {{ selected?.value ? selected.value : selected }}\r\n <span\r\n (click)=\"toggleSelectionInFilter(selected)\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </span>\r\n <input\r\n class=\"form-control form-control-sm border-0 flex-grow-1\"\r\n style=\"padding: 0\"\r\n [placeholder]=\"selectedFilterOptions!.length ? '' : 'Filter by'\"\r\n type=\"search\"\r\n [(ngModel)]=\"searchTextForFilterDropDown\"\r\n (keydown.backspace)=\"handleBackspace($event)\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 600px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of selectedColumnForFilter.column_dropdown_value\r\n | filter : searchTextForFilterDropDown : 'value';\r\n let i = index\r\n \"\r\n >\r\n <div\r\n class=\"list-group-item border-0 px-2 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"i\"\r\n [checked]=\"currentFilterSelectedIds.has(col.id || col._id || col)\"\r\n (change)=\"toggleSelectionInFilter(col)\"\r\n />\r\n <label class=\"form-check-label fw-semibold\" [for]=\"i\">\r\n {{ col?.value || col?.name || col }}\r\n </label>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div\r\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n style=\"height: 38px\"\r\n >\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n (click)=\"$event.stopPropagation(); resetFilterChanges()\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n (click)=\"applyDropdownFilter()\"\r\n >\r\n <span style=\"margin-top: -2px\">Save</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For Text fields and number fields-->\r\n\r\n <div\r\n @slideToggle\r\n *ngIf=\"\r\n isFilterOpen &&\r\n (selectedColumnForFilter.type == 'string' ||\r\n selectedColumnForFilter.type == 'number' ||\r\n selectedColumnForFilter.type == 'date')\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\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\"\r\n [(ngModel)]=\"firstCondition\"\r\n >\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Starts With</option>\r\n <option value=\"after\">Ends With</option>\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 />\r\n </div>\r\n <div *ngIf=\"firstValue\">\r\n <div class=\"d-flex my-3\">\r\n <div class=\"form-check form-check-inline\">\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\" for=\"logicalAnd\">AND</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\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\" for=\"logicalOr\">OR</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\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\" for=\"logicalNone\">None</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"my-3\">\r\n <!-- Second condition select -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"secondCondition\"\r\n >\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Starts With</option>\r\n <option value=\"after\">Ends With</option>\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 />\r\n </div>\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 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 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</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 >\r\n <ng-container *ngIf=\"!isEditing(row, col)\">\r\n <div\r\n *ngIf=\"!isArray\"\r\n class=\"full-text-content\"\r\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault(); enableEdit(row, col)\"\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 {{ item?.department_name || item?.roleName || \"-\" }}\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 #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\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 align-items-center w-100 cell-content image-placeholder cursor-pointer\"\r\n [title]=\"row?.full_name || row?.name || 'N/A'\"\r\n (click)=\"onEmployeeClick(row)\"\r\n >\r\n <ng-container\r\n *ngIf=\"\r\n row?.logo || row?.assetImage || row?.invoice?.invoice_image;\r\n else placeholder\r\n \"\r\n >\r\n <span class=\"pic\">\r\n <img\r\n [width]=\"rowHeight - 12\"\r\n [height]=\"rowHeight - 12\"\r\n [src]=\"row?.profile_pictures?.[4]?.path || row?.logo || row?.assetImage || row?.invoice?.invoice_image\"\r\n alt=\"icon\"\r\n class=\"option-icon\"\r\n />\r\n </span>\r\n </ng-container>\r\n\r\n <ng-template #placeholder>\r\n <span\r\n [ngClass]=\"getDynamicClass(row?.User?.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 >\r\n {{ getInitials(row?.User?.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 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<div\r\n [style.bottom.px]=\"footerRowHeight + 50\"\r\n *ngIf=\"selectedRows.size > 0 && showTaskbar\"\r\n class=\"taskbar\"\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 {{ config?.paginationParams?.totalItems }} Total\r\n </span>\r\n <div class=\"action-buttons\">\r\n <ng-container *ngFor=\"let action of taskbarActions; let i = index\">\r\n <span\r\n class=\"action-btn verified btn {{ action }}\"\r\n (click)=\"onVerifyClick(action)\"\r\n >{{ action }}</span\r\n >\r\n <span\r\n *ngIf=\"taskbarActions.length > 1 && i !== taskbarActions.length - 1\"\r\n class=\"separator\"\r\n >|</span\r\n >\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Row Choose Columns Modal -->\r\n<div *ngIf=\"showDetailColumnPanel\" 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=\"detailModalColumnPannel\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<ng-template #detailModalColumnPannel>\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 Detail Columns\r\n <span class=\"filter-icon-wrapper\" (click)=\"closeDetailColumnPanel()\">\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 <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allDetailColumnsSelected()\"\r\n (change)=\"toggleAllDetailColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search detail columns...\"\r\n [(ngModel)]=\"choseColumnsSearch\"\r\n />\r\n </div>\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 (currentDetailRowForColumnSelection?.details?.columns || [])\r\n | filter : choseColumnsSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"col.is_visible !== false\"\r\n (change)=\"toggleDetailColumnVisibility(col, !col.is_visible)\"\r\n [id]=\"'detail_col_' + col.field\"\r\n />\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'detail_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 </div>\r\n </div>\r\n <!-- <div class=\"px-3 py-2 border-top d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"resetDetailColumnsInModal()\">Reset</button>\r\n </div> -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/*\r\n * Public API Surface of ms-time-sheet\r\n */\r\n\r\nexport * from './lib/ms-time-sheet.service';\r\nexport * from './lib/ms-time-sheet.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SplitColumnsService","i2.CommonService","i3.CopyServiceService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ms-time-sheet.mjs","sources":["../../../projects/ms-time-sheet/src/lib/ms-time-sheet.service.ts","../../../projects/ms-time-sheet/src/lib/statuses.ts","../../../projects/ms-time-sheet/src/lib/pipes/filter.pipe.ts","../../../projects/ms-time-sheet/src/lib/pipes/pinned-columns.pipe.ts","../../../projects/ms-time-sheet/src/lib/services/split-columns.service.ts","../../../projects/ms-time-sheet/src/lib/services/common.service.ts","../../../projects/ms-time-sheet/src/lib/services/copy-service.service.ts","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.ts","../../../projects/ms-time-sheet/src/lib/ms-time-sheet.component.html","../../../projects/ms-time-sheet/src/public-api.ts","../../../projects/ms-time-sheet/src/ms-time-sheet.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MsTimeSheetService {\r\n\r\n constructor() { }\r\n}\r\n","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","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'filter',\r\n standalone: true\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 searchText = searchText.toLowerCase();\r\n\r\nreturn items.filter(item => {\r\n const value = key ? item?.[key] : item;\r\n return value?.toString().toLowerCase().includes(searchText);\r\n });\r\n}}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({ name: 'pinnedColumns', pure: true, standalone: true })\r\nexport class PinnedColumnsPipe implements PipeTransform {\r\n transform(columns: any[], pinned: 'left' | 'right' | null): any[] {\r\n if (!columns) return [];\r\n return columns.filter(col => col.is_visible !== false && col.pinned === pinned);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SplitColumnsService {\r\n prepareColumns(columns: any[], containerWidth: number): any {\r\n const left: any[] = [];\r\n const center: any[] = [];\r\n const right: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const leftChildren: any[] = [];\r\n const centerChildren: any[] = [];\r\n const rightChildren: any[] = [];\r\n\r\n for (const child of col.children) {\r\n if (child.is_visible === false) continue;\r\n\r\n const pinned = child.pinned ?? col.pinned ?? null;\r\n const childWithPinned = { ...child, pinned };\r\n\r\n if (pinned === 'left') leftChildren.push(childWithPinned);\r\n else if (pinned === 'right') rightChildren.push(childWithPinned);\r\n else centerChildren.push(childWithPinned);\r\n }\r\n\r\n if (leftChildren.length) {\r\n left.push({ header: col.header, children: leftChildren, id: col?.id || col?._id });\r\n }\r\n if (centerChildren.length) {\r\n center.push({\r\n header: col.header,\r\n children: centerChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n if (rightChildren.length) {\r\n right.push({\r\n header: col.header,\r\n children: rightChildren,\r\n id: col.id || col._id,\r\n });\r\n }\r\n } else if (col.is_visible !== false) {\r\n const pinned = col.pinned ?? null;\r\n if (pinned === 'left') left.push(col);\r\n else if (pinned === 'right') right.push(col);\r\n else center.push(col);\r\n }\r\n }\r\n\r\n return { left, center, right };\r\n }\r\n\r\n setColumnsQuery(columns: any[]) {\r\n for (const col of columns) {\r\n // if (col.children?.length) {\r\n // for (const child of col.children) {\r\n // if (!child?.query?.firt_value && !child?.query?._ids?.length) {\r\n // child['query'] = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n // }\r\n // }\r\n // if (!col?.query?.firt_value && !col?.query?._ids?.length) {\r\n // col.query = {\r\n // first_condition: 'contain',\r\n // first_value: null,\r\n // condition: 'none',\r\n // second_condition: 'contain',\r\n // second_value: null,\r\n // _ids: [],\r\n // };\r\n // }\r\n }\r\n\r\n console.log('Updated Columns: ', columns);\r\n\r\n return columns;\r\n }\r\n\r\n assignDefaultWidths(columns: any[], containerWidth: number): any[] {\r\n const visibleLeafCols = this.getVisibleLeafColumns(columns);\r\n\r\n if (!visibleLeafCols.length) return columns;\r\n\r\n let defaultWidth = Math.floor(containerWidth / visibleLeafCols.length);\r\n if (defaultWidth < 80) defaultWidth = 80;\r\n\r\n const cloneColumns = (cols: any[]): any[] =>\r\n cols.map((col) => {\r\n if (col.children?.length) {\r\n const newChildren = col.children.map((child: any) => {\r\n // If visible → dynamic default width\r\n // If invisible → fixed 150px\r\n if (!child.width) {\r\n if (child.is_visible === false) {\r\n return { ...child, width: 150 };\r\n } else {\r\n return { ...child, width: defaultWidth };\r\n }\r\n }\r\n return { ...child };\r\n });\r\n\r\n return { ...col, children: newChildren };\r\n }\r\n\r\n if (!col.width) {\r\n if (col.is_visible === false) {\r\n return { ...col, width: 150 };\r\n } else {\r\n return { ...col, width: defaultWidth };\r\n }\r\n }\r\n\r\n return { ...col };\r\n });\r\n\r\n return cloneColumns(columns);\r\n}\r\n\r\n\r\n private getVisibleLeafColumns(columns: any[]): any[] {\r\n const result: any[] = [];\r\n\r\n for (const col of columns) {\r\n if (col.children?.length) {\r\n const visibleChildren = col.children.filter(\r\n (c: any) => c.is_visible !== false\r\n );\r\n result.push(...visibleChildren);\r\n } else if (col.is_visible !== false) {\r\n result.push(col);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CommonService {\r\n\r\n constructor() { }\r\n gethasVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n gethasInVisibleColumns(columns: any[]): boolean {\r\n const checkVisible = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (!col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkVisible(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkVisible(columns);\r\n }\r\n\r\n\r\n getTotalColumnsLength(columns: any[]): number {\r\n let count = 0;\r\n\r\n columns.forEach(col => {\r\n if (col.children && Array.isArray(col.children) && col.children.length) {\r\n count += col.children.length; // count children instead of parent\r\n } else {\r\n count += 1; // count parent directly\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n gethasRightPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'right' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n gethasLeftPinnedColumns(columns: any[]): boolean {\r\n const checkPinnedRight = (columns: any[]): boolean => {\r\n return columns.some((col) => {\r\n if (col?.pinned === 'left' && col?.is_visible) return true;\r\n if (col?.children?.length) {\r\n return checkPinnedRight(col.children);\r\n }\r\n return false;\r\n });\r\n };\r\n return checkPinnedRight(columns);\r\n }\r\n\r\n\r\n getExpandedRowCount(data: any[]): number {\r\n let groupCount = 0;\r\n let rowCount = 0;\r\n\r\n data.forEach(group => {\r\n if (group?.isGroup) {\r\n groupCount++;\r\n\r\n if (group?.isExpand && Array.isArray(group?.children)) {\r\n group.children.forEach((child: any) => {\r\n if (child.isGroup) {\r\n if (child.isExpand && Array.isArray(child.children)) {\r\n rowCount += child.children.length;\r\n }\r\n } else {\r\n rowCount++;\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (groupCount === 0) {\r\n return data.length;\r\n }\r\n\r\n return groupCount + rowCount;\r\n }\r\n\r\n\r\ngetFiltersFromColumns(columns: any[], filtersConfig:any []): any[] {\r\n const result: any[] = [];\r\n \r\n const checkColumn = (col: any) => {\r\n const hasFirstValue = col.query?.first_value != null && col.query?.first_value !== \"\" && filtersConfig.some((ele)=> ele.field == col.field);\r\n const hasIds = Array.isArray(col.query?._ids) && col.query._ids.length > 0 && filtersConfig.some((ele)=> ele.field == col.field);\r\n if (hasFirstValue || hasIds) {\r\n result.push({\r\n search: col.search ?? \"\",\r\n field: col.field,\r\n type: col.type,\r\n _ids: col.type == 'dropdown'? col.query?._ids: [],\r\n query: col.type == 'dropdown'? null : (col?.query?.first_value ? col?.query : null)\r\n });\r\n }\r\n \r\n if (Array.isArray(col.children) && col.children.length > 0) {\r\n col.children.forEach(checkColumn);\r\n }\r\n };\r\n columns.forEach(checkColumn);\r\n \r\n return result;\r\n}\r\n\r\nasync applyFiltersToColumns(columns: any[], filters: any[]): Promise<any[]> {\r\n debugger\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: 'contain',\r\n second_condition: null,\r\n condition: 'none',\r\n _ids: []\r\n };\r\n }\r\n\r\n const filter = filters.find(f => f.field === col.field);\r\n\r\n if (filter) {\r\n if (col.type === 'dropdown') {\r\n col.filterValue = filter._ids ?? [];\r\n col.search = filter.search ?? '';\r\n col.query._ids = filter._ids ?? [];\r\n } else {\r\n col.filterValue = filter.search ?? null;\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 = filter.query?.first_condition ?? 'contain';\r\n col.query.second_condition = filter.query?.second_condition ?? 'contain';\r\n col.query.condition = filter.query?.condition ?? 'none';\r\n }\r\n }\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 return columns;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nactiveFilteredColumns: any[] = [];\r\nupdateActiveFilteredColumns(columns: any[]): any[] {\r\n const collectFiltered = (cols: any[]): any[] => {\r\n let result: any[] = [];\r\n\r\n for (let i = 0; i < cols.length; i++) {\r\n const col = cols[i];\r\n if (col.children && col.children.length > 0) {\r\n result = result.concat(collectFiltered(col.children));\r\n }\r\n\r\n if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0;\r\n\r\n const hasValueFilter =\r\n (col.query.first_value && col.query.first_value !== '') ||\r\n (col.query.second_value && col.query.second_value !== '');\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n }\r\n return result;\r\n };\r\n this.activeFilteredColumns = [...collectFiltered(columns)];\r\n return this.activeFilteredColumns;\r\n}\r\n\r\n\r\n\r\nhasFieldChanged(current: any, original: any, type: string): boolean {\r\n switch (type) {\r\n case 'number':\r\n return Number(current) !== Number(original);\r\n\r\n case 'string':\r\n return String(current || '') !== String(original || '');\r\n\r\n case 'dropdown':\r\n if (typeof current === 'object' && typeof original === 'object') {\r\n return current?.id !== original?.id || current?.value !== original?.value;\r\n }\r\n return current !== original;\r\n\r\n case 'boolean':\r\n return Boolean(current) !== Boolean(original);\r\n\r\n case 'date':\r\n const currentDate = new Date(current).getTime();\r\n const originalDate = new Date(original).getTime();\r\n return isNaN(currentDate) || isNaN(originalDate)\r\n ? current !== original\r\n : currentDate !== originalDate;\r\n\r\n default:\r\n return JSON.stringify(current) !== JSON.stringify(original);\r\n }\r\n }\r\n\r\n\r\n}\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 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 ?? ''\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\n updateRows: 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 this.setNestedValue(row, targetColumn, value);\r\n });\r\n });\r\n\r\n return this.updateRows;\r\n }\r\n\r\n\r\n setNestedValue(obj: any, column: any, option: any, calledFromInput = false): void {\r\n debugger\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","\r\nimport {\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 ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { SplitColumnsService } from './services/split-columns.service';\r\nimport { CommonService } from './services/common.service';\r\n// import { SwapColumnsService } from './services/swap-columns.service';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { BsDatepickerModule, BsDaterangepickerDirective, BsDaterangepickerConfig } from 'ngx-bootstrap/datepicker';\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} 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 { FormsModule } from '@angular/forms';\r\nimport { InlineSVGModule } from 'ng-inline-svg';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { FilterPipe } from './pipes/filter.pipe';\r\n// import { DraggableHeaderDirective } from './directives/draggable-header.directive';\r\nimport { PinnedColumnsPipe } from './pipes/pinned-columns.pipe';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport moment from 'moment';\r\n\r\n\r\n\r\n\r\n\r\n\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\n\r\n\r\n\r\n@Component({\r\n selector: 'time-sheet',\r\n templateUrl: './ms-time-sheet.component.html',\r\n styleUrls: ['./ms-time-sheet.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, DragDropModule, ScrollingModule, InlineSVGModule, FilterPipe, PinnedColumnsPipe, BsDatepickerModule],\r\n animations: [\r\n trigger('accordionToggle', [\r\n state(\r\n 'collapsed',\r\n style({ height: '0px', overflow: 'hidden' })\r\n ),\r\n state('expanded', style({ height: '*', overflow: 'visible' })),\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 ],\r\n})\r\n\r\nexport class TimeSheetComponent implements OnChanges, AfterViewInit {\r\n\r\n // **************************************//\r\n // ********** Input Goes Here *********** //\r\n // **************************************//\r\n // **************************************//\r\n// Add a new property to track expanded rows\r\n expandedRows: Set<string> = new Set();\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 // 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 = 44;\r\n\r\n // Show Vertical Borders;\r\n @Input() showVerticalBorder: boolean = true;\r\n\r\n // Even Rows Background Color;\r\n @Input() evenRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Even Rows Background Color;\r\n @Input() oddRowsBackgroundColor: string | undefined = undefined;\r\n\r\n // Header Rows Background Color;\r\n @Input() headerBackgroundColor: string = '#eaeaea';\r\n\r\n // Header Rows Background Color;\r\n @Input() checkboxesBackgroundColor: string = '#eaeaea';\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 = '#000';\r\n\r\n // Body Background color;\r\n @Input() bodyBackgroundColor: string | undefined = '#fff';\r\n\r\n // Right Pinned Background color;\r\n @Input() rightPinnedBackgroundColor: string | undefined = '#000';\r\n\r\n // Side Menu Background color;\r\n @Input() sidemenuBackgroundColor: string | undefined = '#000';\r\n\r\n // Body text color;\r\n @Input() bodyTextColor: string | undefined = '#000';\r\n\r\n // Header text color;\r\n @Input() headerTextColor: string | undefined = '#000';\r\n\r\n // Header text size;\r\n @Input() headerTextFontsSize: number | undefined = 16;\r\n\r\n // Body text color;\r\n @Input() bodyTextFontsSize: number | undefined = 16;\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 = '';\r\n\r\n // dropdowns Background Color;\r\n @Input() dropdownsBackgroundColor: string | undefined = '';\r\n\r\n // Footer row Height;\r\n @Input() footerRowHeight: number = 46;\r\n\r\n // Footer row Height;\r\n @Input() topGroupedBadgesBackgroundColor: string | undefined = '';\r\n\r\n // Show Row wise grouping;\r\n @Input() showRowsGrouping: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() showFilterRow: boolean | undefined = false;\r\n\r\n // Show Row wise grouping;\r\n @Input() fontFaimly: string | undefined = 'sans-serif';\r\n\r\n // Show SideColumn;\r\n @Input() showSideMenu: boolean = false;\r\n\r\n // Footer Padding\r\n @Input() footerPadding: number = 3\r\n\r\n\r\n // Footer Padding\r\n @Input() topFilterRowHeight: number = 50;\r\n\r\n // Show Rows shading\r\n @Input() rowShadingEnabled: boolean = false;\r\n\r\n // Show Rows shading\r\n @Input() showSerialNumber: boolean = false;\r\n\r\n // Single Spa Url Attach to icons\r\n @Input() singleSpaAssetsPath: string = 'assets/';\r\n\r\n\r\n // Applied Filters\r\n @Input() filtersConfig: any[] = [];\r\n\r\n\r\n // Applied Filters\r\n @Input() loading: boolean = false;\r\n\r\n //Vertical Scrollbar style\r\n @Input() verticalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n //Horizintal Scrollbar style\r\n @Input() horizintalScrollbarWidth: 'auto' | 'thin' = 'auto';\r\n\r\n // Show Cell details box\r\n @Input() showCellDetailsBox: boolean = false;\r\n\r\n //Date format\r\n\r\n @Input() dateFormat: string = 'dd/MM/yyyy'\r\n\r\n //Date format\r\n @Input() tableSearch: string = '';\r\n\r\n\r\n //Date format\r\n @Input() actions: any[] = ['edit', 'delete', 'download', 'add Leave'];\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 = 36;\r\n\r\n\r\n @Input() gridType: string = 'TimeSheet';\r\n\r\n @Input() isSingleDay: boolean = false;\r\n\r\n @Input() leftPinnedBoxshadow: string = '#4b4b4b 1px 1px 5px 0px';\r\n\r\n @Input() rightPinnedBoxshadow: string = '#4b4b4b 4px 1px 6px 0px';\r\n\r\n // GlobalSearch\r\n @Input() selectedRowsBackgroundColor: string = '#8ac5ff';\r\n\r\n // GlobalSearch\r\n @Input() nestedTableHeaderBAckgroundColor: string = '#eaeaea';\r\n\r\n @Input() tableView: any[] = [];\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: true,\r\n showChoseColumns: true,\r\n showResetColumns: true,\r\n\r\n\r\n };\r\n\r\n // Infinite scroll inputs/outputs\r\n @Input() enableInfiniteScroll = false;\r\n @Input() hasMoreData = true;\r\n @Input() loadingMore = false;\r\n @Output() loadMoreData = new EventEmitter<void>();\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 @Output() public changeLayout = new EventEmitter<any>();\r\n\r\n // Filter Apply event;\r\n @Output() public filterOptions = new EventEmitter<any>();\r\n\r\n @Output() genericEvent: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output() tablePresetConfig: EventEmitter<any> = new EventEmitter();\r\n\r\n @Output() sortingOrderOptions: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n @Output() createUpdateConfigListing: EventEmitter<any> = new EventEmitter<any>();\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n 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: any = '';\r\n searchTextPresetTable = '';\r\n addFilterColumnInput = '';\r\n searchInDropdown = '';\r\n addFilterDropdownSearch = ''\r\n topShowHideColumns = '';\r\n choseColumnsSearch = ''\r\n editinDropdownSearch = '';\r\n isThreeDotsFilterOpen = false;\r\n confirmDelete = false;\r\n subMenueOpendField = ''\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 '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 ];\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\r\n\r\n\r\n constructor(\r\n private columnService: SplitColumnsService,\r\n private cdr: ChangeDetectorRef,\r\n public commonSevice: CommonService,\r\n // private swapColumnService: SwapColumnsService,\r\n private elementRef: ElementRef,\r\n private ngZone: NgZone,\r\n private copyService: CopyServiceService\r\n ) {\r\n // this.bsConfig = {\r\n // containerClass: 'theme-default',\r\n // rangeInputFormat: 'DD/MM/YYYY',\r\n // showWeekNumbers: false,\r\n // ranges: {\r\n // 'Last 3 Months': [moment().subtract(3, 'months').startOf('month').toDate(), moment().subtract(1, 'months').endOf('month').toDate()],\r\n // 'Last Month': [moment().subtract(1, 'months').startOf('month').toDate(), moment().subtract(1, 'months').endOf('month').toDate()],\r\n // 'This Month': [moment().startOf('month').toDate(), moment().endOf('month').toDate()],\r\n // 'Yesterday': [moment().subtract(1, 'days').toDate(), moment().subtract(1, 'days').toDate()],\r\n // 'Last 7 Days': [moment().subtract(6, 'days').toDate(), moment().toDate()],\r\n // 'Last Year': [moment().subtract(1, 'years').startOf('year').toDate(), moment().subtract(1, 'years').endOf('year').toDate()]\r\n // }\r\n // };\r\n }\r\n\r\n @ViewChild('cellText', { static: false }) cellText!: ElementRef;\r\n async ngAfterViewInit() {\r\n setTimeout(async () => {\r\n // this.updateFlattenedData();\r\n // this.computeViewportRows();\r\n // this.updateVisibleRows(0);\r\n // this.cdr.detectChanges();\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 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 this.cdr.detectChanges();\r\n }, 300);\r\n\r\n // const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\r\n // tooltipTriggerList.map((tooltipTriggerEl: any) => {\r\n // return new bootstrap.Tooltip(tooltipTriggerEl);\r\n // });\r\n\r\n\r\n }\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if (changes['filtersConfig']) {\r\n await this.applyFilteroptionList();\r\n this.checkFilterChangesEffect();\r\n }\r\n if (changes['columns']?.currentValue?.length) {\r\n // this.columns = this.columnService.setColumnsQuery(this.columns);\r\n this.originalColumns = structuredClone(this.columns);\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 this.cdr.detectChanges();\r\n }\r\n this.generateDropListIds();\r\n this.cdr.detectChanges();\r\n\r\n requestAnimationFrame(() => {\r\n\r\n this.cdr.detectChanges();\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 this.cdr.detectChanges();\r\n setTimeout(() => {\r\n if (this.mainScroll?.nativeElement) {\r\n this.computeViewportRows();\r\n this.updateVisibleRows(0);\r\n }\r\n }, 100);\r\n if (this.centerPinnedHeader?.nativeElement) {\r\n void this.centerPinnedHeader.nativeElement.offsetWidth;\r\n if(this.centerScrollableBody?.nativeElement){\r\n this.centerScrollableBody.nativeElement.scrollLeft = this.centerPinnedHeader?.nativeElement?.scrollLeft;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n if (this.enableInfiniteScroll && this.groupedColumns.length > 0) {\r\n console.warn('Grouping with infinite scroll may not work as expected');\r\n }\r\n\r\n }\r\n if (changes['checkboxState']?.currentValue?.reset) {\r\n this.selectedRows.clear();\r\n this.cdr.detectChanges();\r\n }\r\n if (changes['closeDropdown']) {\r\n if (this.closeDropdown.preset.closed) {\r\n this.activeTopButton = null;\r\n }\r\n }\r\n if (changes['oddRowsBackgroundColor']) {\r\n this.rowShadingEnabled = this.oddRowsBackgroundColor ? this.rowShadingEnabled = true : false;\r\n }\r\n if (changes['isSingleDay']?.currentValue === true) {\r\n this.dataSet.forEach(row => {\r\n if (row.isDetailsExpand) row.isDetailsExpand = false;\r\n });\r\n this.cdr.detectChanges();\r\n}\r\n }\r\n\r\n\r\n\r\n async applyFilteroptionList() {\r\n debugger\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\r\n // Body Template References\r\n @ViewChild('leftPinnedBody')\r\n leftPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedBody')\r\n centerPinnedBody!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedBody')\r\n rightPinnedBody!: ElementRef<HTMLDivElement>;\r\n\r\n // Headers Template References\r\n @ViewChild('leftPinnedHeader')\r\n leftPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('centerPinnedHeader')\r\n centerPinnedHeader!: ElementRef<HTMLDivElement>;\r\n @ViewChild('rightPinnedHeader')\r\n rightPinnedHeader!: ElementRef<HTMLDivElement>;\r\n\r\n @ViewChild('columnsGroupedBox')\r\n columnsGroupedBox!: ElementRef<HTMLDivElement>;\r\n\r\n // Center Fake scrollbard\r\n @ViewChild('centerFakeScrollbar')\r\n centerFakeScrollbar!: ElementRef<HTMLDivElement>;\r\n async updateColumnWidthsAndGroups(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap in a promise so we can await\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.leftPinnedColumns = left;\r\n this.centerColumns = center;\r\n this.rightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 0));\r\n this.cdr.detectChanges();\r\n }\r\n\r\n async refreshPreviewColumns(columns: any = null) {\r\n if (!this.dataGridContainer) return;\r\n\r\n const containerWidth = this.dataGridContainer.nativeElement.offsetWidth;\r\n\r\n // Wrap prepareColumns in a Promise to make it awaitable\r\n const { left, center, right }: any = await new Promise(resolve => {\r\n const prepared = this.columnService.prepareColumns(\r\n columns ? columns : this.columns,\r\n containerWidth\r\n );\r\n resolve(prepared);\r\n });\r\n\r\n this.previewLeftPinnedColumns = left;\r\n this.previewCenterColumns = center;\r\n this.previewRightPinnedColumns = right;\r\n await new Promise(r => setTimeout(r, 10));\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n async SetColumnsDefaultWidth() {\r\n const containerWidth = this.dataGridContainer?.nativeElement.offsetWidth;\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 this.cdr.detectChanges();\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\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 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 };\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\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\r\n onFilterChange(col: any): void {\r\n const filterValue = col.filterValue?.toLowerCase() || '';\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 + 17;\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 isBreaksArray(value: any): boolean {\r\n return Array.isArray(value);\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 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('.custom-tooltip') && !target.closest('.circle-value')) {\r\n // this.tooltipVisible = false;\r\n // }\r\n\r\n// if (!target.closest('.popover__content') && !target.closest('[class*=\"popover__wrapper\"]')) {\r\n// this.restrictionTooltipVisible = false;\r\n// this.manualLogsTooltipVisible = false;\r\n// this.cdr.detectChanges();\r\n // }\r\n\r\n // Close detail column menu when clicking outside\r\n if (!this.hasParentWithClass(event.target as HTMLElement, ['detail-column-menu', 'three-dots'])) {\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n }\r\n\r\n\r\n const insideDetailTable = target.closest('.accordion-details-wrapper');\r\n if (!insideDetailTable) {\r\n this.detailSelectionState.clear();\r\n this.cdr.detectChanges();\r\n }\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) {\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 ) {\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n autosizeColumn(cols: any | any[]): void {\r\n this.activeCol = null;\r\n\r\n // Normalize input to an array\r\n const columnsToResize = Array.isArray(cols) ? cols : [cols];\r\n\r\n // Helper: Flatten all visible leaf columns\r\n const getVisibleLeafColumns = (columns: any[]): any[] => {\r\n const result: any[] = [];\r\n for (const column of columns) {\r\n if (column.children && Array.isArray(column.children)) {\r\n result.push(...getVisibleLeafColumns(column.children));\r\n } else if (column.is_visible) {\r\n result.push(column);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n const visibleColumns = getVisibleLeafColumns(this.columns);\r\n const visibleCount = visibleColumns.length;\r\n\r\n if (visibleCount === 0) return;\r\n\r\n const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\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 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 const containerWidth =\r\n this.dataGridContainer?.nativeElement?.offsetWidth ?? 0;\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.cdr.detectChanges();\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.activeCol = null;\r\n if (!col) return;\r\n this.loading = true;\r\n this.cdr.detectChanges();\r\n if (col?.isGroupable) {\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\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 }\r\n\r\n resetColumns() {\r\n this.activeCol = null;\r\n\r\n this.columns = structuredClone(this.originalColumns);\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 = 'contains';\r\n col.secondCondition = 'contains';\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 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 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 toggleSelectAll(data: any[]): void {\r\n const allIds = this.originalDataSet.map((row) => this.getRowId(row));\r\n const allSelected = allIds.every((id) => this.selectedRows.has(id));\r\n\r\n if (allSelected) {\r\n allIds.forEach((id) => this.selectedRows.delete(id));\r\n } else {\r\n allIds.forEach((id) => this.selectedRows.add(id));\r\n }\r\n this.cdr.detectChanges();\r\n const ids = Array.from(this.selectedRows);\r\n const event = {\r\n data: {\r\n listingType: this.listingType,\r\n obj: ids\r\n },\r\n eventType: \"onSelectRow\",\r\n }\r\n this.genericEvent.emit(event);\r\n }\r\n\r\n isRowSelected(row: any): boolean {\r\n return this.selectedRows.has(this.getRowId(row));\r\n }\r\n\r\n isAllSelected(data: any[]): boolean {\r\n return (data?.every((row) => this.selectedRows.has(this.getRowId(row))) && (this.dataSet?.length > 0));\r\n }\r\n\r\n isIndeterminateState(data: any[]): boolean {\r\n if (!data || data.length === 0) return false;\r\n const selectedCount = data.filter(row => this.selectedRows.has(this.getRowId(row))).length;\r\n return selectedCount > 0 && selectedCount < data.length;\r\n }\r\n\r\n // Side Menu Working Goes Here\r\n toggleSideMenu(clickedOn: 'cols' | 'filtrs') {\r\n if (this.currentOpenedSideMenue == clickedOn) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n } else if (\r\n this.sideMenuVisible &&\r\n clickedOn != this.currentOpenedSideMenue\r\n ) {\r\n this.currentOpenedSideMenue = clickedOn;\r\n return;\r\n } else {\r\n this.currentOpenedSideMenue = clickedOn;\r\n this.sideMenuVisible = !this.sideMenuVisible;\r\n }\r\n }\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 event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n this.refreshPreviewColumns();\r\n this.SetColumnsDefaultWidth();\r\n this.cdr.detectChanges();\r\n }, 10);\r\n }\r\n\r\n isColumnVisible(columns: any) {\r\n if (columns?.children) {\r\n return columns.children.every((element: any) => element.is_visible);\r\n }\r\n\r\n return columns?.is_visible;\r\n }\r\n\r\n allColumnsSelected(): boolean {\r\n const flatten = this.flattenColumns(this.columns);\r\n return flatten.every((col) => col.is_visible);\r\n }\r\n\r\n\r\n private findColumnByField(field: string, cols: any[]): any | null {\r\n for (const col of cols) {\r\n if (col.field === field) {\r\n return col;\r\n }\r\n if (col.children && Array.isArray(col.children)) {\r\n const found = this.findColumnByField(field, col.children);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n\r\n\r\n async toggleColumnVisibility(column: any, isVisible: boolean) {\r\n 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\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n };\r\n this.createUpdateConfigListing.emit(event);\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n }\r\n\r\n\r\n toggleAllColumnsVisibility(): void {\r\n const flatten = this.flattenColumns(this.columns);\r\n const allSelected = flatten.every((col: any) => col.is_visible);\r\n flatten.forEach((col: any) => (col.is_visible = !allSelected));\r\n setTimeout(() => {\r\n this.updateColumnWidthsAndGroups();\r\n setTimeout(() => {\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n }, 100);\r\n }, 100);\r\n }\r\n\r\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 }\r\n\r\n @HostListener('document:keydown.escape', ['$event'])\r\n onEscape(event: KeyboardEvent) {\r\n this.closeModalColumnPanel();\r\n }\r\n\r\n // Check If Any column have right pinned\r\n get hasRightPinnedColumns() {\r\n return this.commonSevice.gethasRightPinnedColumns(this.columns);\r\n }\r\n\r\n get hasLeftPinnedColumns() {\r\n return this.commonSevice.gethasLeftPinnedColumns(this.columns);\r\n }\r\n\r\n get dataSetLength() {\r\n return this.commonSevice.getExpandedRowCount(this.dataSet);\r\n }\r\n\r\n\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event: UIEvent) {\r\n this.autosizeAllColumns();\r\n const h = this.mainScroll?.nativeElement?.clientHeight ?? 0;\r\n this.viewportRows = Math.max(1, Math.ceil(h / this.rowHeight));\r\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n this.cdr.detectChanges();\r\n setTimeout(() => { }, 100);\r\n }\r\n\r\n async refreshHeaders() {\r\n this.ngZone.runOutsideAngular(async () => {\r\n await new Promise(r => setTimeout(r, 0));\r\n await this.updateColumnWidthsAndGroups();\r\n await this.refreshPreviewColumns();\r\n\r\n this.ngZone.run(() => this.cdr.detectChanges());\r\n });\r\n }\r\n\r\n get hasAnyVisibleColumn() {\r\n return this.commonSevice.gethasVisibleColumns(this.columns);\r\n }\r\n\r\n get hasAnyInVisibleColumn() {\r\n return this.commonSevice.gethasInVisibleColumns(this.columns);\r\n }\r\n\r\n get columnsCount() {\r\n return this.commonSevice.getTotalColumnsLength(this.columns);\r\n }\r\n\r\n tableHeaderAndBodyHeight() {\r\n return `calc(100% - ${this.footerRowHeight})`;\r\n }\r\n\r\n draggingInGroupArea = false;\r\n\r\n @ViewChild('centerScroll') centerScroll!: ElementRef<HTMLDivElement>;\r\n visibleRowCount = 25;\r\n startIndex = 0;\r\n visibleRows: any[] = [];\r\n\r\n private flattenGroupedRows(\r\n rows: any[] = [],\r\n level = 0,\r\n result: any[] = []\r\n ): any[] {\r\n for (const row of rows) {\r\n result.push({ ...row, __depth: level });\r\n if (row.isGroup && row.isExpand && row.children?.length) {\r\n this.flattenGroupedRows(row.children, level + 1, []);\r\n }\r\n }\r\n this.assignVirtualIndexes(this.visibleRows);\r\n return result;\r\n }\r\n\r\n assignVirtualIndexes(data: any[]): any[] {\r\n let currentIndex = 1;\r\n const walk = (items: any[]): void => {\r\n for (const item of items) {\r\n item.__virtualIndex = currentIndex++;\r\n if (item?.isGroup) {\r\n const group = item;\r\n if (group.isExpand && Array.isArray(group.children)) {\r\n walk(group.children);\r\n }\r\n }\r\n }\r\n };\r\n walk(data);\r\n console.log('This dataset: ', this.visibleRows)\r\n return data;\r\n }\r\n\r\n\r\n updateVisibleRows(scrollTop: number) {\r\n\r\n const flatData = this.flattenGroupedRows(this.dataSet);\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@Output() loadMore = new EventEmitter<void>();\r\n onMainScroll(event: Event): void {\r\n // const flatData = this.flattenGroupedRows(this.dataSet);\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 (this.fakeScrollRaf) cancelAnimationFrame(this.fakeScrollRaf);\r\n this.fakeScrollRaf = requestAnimationFrame(() => {\r\n // this.isSyncingFromMain = true;\r\n // this.fakeScroll.nativeElement.scrollTop = 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 = 30;\r\n const newStartIndex = Math.floor(scrollTop / this.rowHeight);\r\n const start = Math.max(0, newStartIndex - overscan);\r\n const end = Math.min(\r\n this.flattenedData.length,\r\n newStartIndex + this.viewportRows + overscan\r\n );\r\n this.translateY = start * (this.rowHeight - 1);\r\n this.startIndex = start;\r\n this.visibleRows = this.dataSet.slice(start, end);\r\n this.cdr.detectChanges();\r\n\r\n // Infinite scroll check\r\n const el = this.mainScroll.nativeElement;\r\n if (this.enableInfiniteScroll && !this.loadingMore && this.hasMoreData) {\r\n const threshold = 300;\r\n if (el.scrollTop + el.clientHeight >= el.scrollHeight - threshold) {\r\n this.loadMore.emit();\r\n }\r\n }\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\r\n // // setTimeout(() => {\r\n // // this.cdr.detectChanges();\r\n // // }, 100);\r\n // }\r\n\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand) {\r\n// if (!row.details.originalColumns) {\r\n// row.details.originalColumns = structuredClone(row.details.columns);\r\n// }\r\n// // 👇 Prefer originalFlatData, fallback to current data only if needed\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = structuredClone(\r\n// row.details.originalFlatData || row.details.data\r\n// );\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\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<any>;\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 * 2;\r\n\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n\r\n onHorizintalFakeScroll(event: Event) {\r\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\r\n this.centerPinnedHeader.nativeElement.scrollLeft = scrollLeft;\r\n this.centerScrollableBody.nativeElement.scrollLeft = scrollLeft;\r\n }\r\n\r\n onCenterBodyScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n this.horizintalFakeScroll.nativeElement.scrollLeft = target.scrollLeft;\r\n if (this.centerPinnedHeader) {\r\n this.centerPinnedHeader.nativeElement.scrollLeft = target.scrollLeft;\r\n }\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.isGroupable\r\n );\r\n }\r\n return data.is_visible && data.isGroupable;\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\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.isGroupable;\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.isGroupable;\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.isGroupable;\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 // 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.isGroupable === false\r\n );\r\n this.isDisableColumnGrouping = allChildrenDisabled;\r\n } else {\r\n this.isDisableColumnGrouping = col.isGroupable === false;\r\n }\r\n this.cdr.detectChanges();\r\n }\r\n\r\n currentDraggingColumn: any = null;\r\n dragStartOnGroup(col: any) {\r\n this.currentDraggingColumn = col;\r\n }\r\n\r\n onSortGroup = async (event: CdkDragSortEvent<any>, section: string) => {\r\n const columns = (this as any)[section];\r\n if (event.previousIndex === event.currentIndex) return;\r\n const visibleColumns = columns.filter((col: any) => {\r\n if (col?.children && Array.isArray(col.children)) {\r\n return col.children.some((child: any) => child.is_visible);\r\n }\r\n return col.is_visible;\r\n });\r\n const previousHeader = visibleColumns[event.previousIndex].header;\r\n const currentHeader = visibleColumns[event.currentIndex].header;\r\n const visiblePrevIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === previousHeader\r\n );\r\n const visibleCurrIndex = visibleColumns.findIndex(\r\n (col: any) => col.header === currentHeader\r\n );\r\n const getFields = (item: any): string[] => {\r\n if (item?.children && Array.isArray(item.children)) {\r\n return item.children.map((child: any) => child.field);\r\n }\r\n return [item.field];\r\n };\r\n const prevFields = getFields(visibleColumns[visiblePrevIndex]);\r\n const currFields = getFields(visibleColumns[visibleCurrIndex]);\r\n const allFields = [...prevFields, ...currFields];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n console.log(\"this .coluns\", this.columns);\r\n moveItemInArray((this as any)[section], visiblePrevIndex, visibleCurrIndex);\r\n\r\n const prevColIndexInColumns = this.columns.findIndex(item => item.header === previousHeader);\r\n const currColIndexInColumns = this.columns.findIndex(item => item.header === currentHeader);\r\n moveItemInArray(this.columns, prevColIndexInColumns, currColIndexInColumns);\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n 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 const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n\r\n onDropGroup() {\r\n this.leftPinnedColumns = structuredClone(this.previewLeftPinnedColumns);\r\n this.centerColumns = structuredClone(this.previewCenterColumns);\r\n this.rightPinnedColumns = structuredClone(this.previewRightPinnedColumns);\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n async onDropTopGroup(event: CdkDragDrop<any>) {\r\n this.loading = true;\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.isGroupable) {\r\n this.groupedColumns.push(col);\r\n }\r\n });\r\n } else {\r\n if (draggedData.is_visible && draggedData.isGroupable) {\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 setTimeout(() => {\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\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 }, 100);\r\n\r\n } catch (err) {\r\n console.error(\"Error in ungroupColumn:\", err);\r\n this.loading = false;\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n\r\n shouldTheGroupHeaderShow(group: any) {\r\n if (group?.children && group.children.length) {\r\n return group.children.some(\r\n (col: any) => col.is_visible && !col?.isRowGrouped\r\n );\r\n }\r\n return group?.is_visible && !group?.isRowGrouped;\r\n }\r\n\r\n\r\n onChildDragStart() {\r\n debugger;\r\n }\r\n\r\n dropListIds: string[] = [];\r\n\r\n generateDropListIds() {\r\n this.dropListIds = [];\r\n\r\n const sectionKeys = [\r\n 'leftPinnedColumns',\r\n 'centerColumns',\r\n 'rightPinnedColumns',\r\n ];\r\n\r\n sectionKeys.forEach((sectionKey) => {\r\n const sectionCols = (this as any)[sectionKey];\r\n\r\n this.columns.forEach((col: any, i: number) => {\r\n if (col?.children?.length > 0) {\r\n col.children.forEach((child: any, childIndex: number) => {\r\n if (child?.is_visible && !child.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n } else if (col?.is_visible && !col.isRowGrouped) {\r\n const id = `${sectionKey}${i}`;\r\n this.dropListIds.push(id);\r\n }\r\n });\r\n });\r\n }\r\n\r\n onChildDroplistSorted = async (event: CdkDragSortEvent<any>, section: string) => {\r\n if (event.previousIndex === event.currentIndex) return;\r\n\r\n const pinned =\r\n section == 'previewLeftPinnedColumns'\r\n ? 'left'\r\n : section == 'previewRightPinnedColumns'\r\n ? 'right'\r\n : \"\";\r\n\r\n const column = event.item.data;\r\n let group = this.columns.find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n const groupIndex = this.columns.findIndex(\r\n (col) => col.header === group.header\r\n );\r\n const filteredGroup = group?.children.filter((col: any) => {\r\n const isPinnedMatch =\r\n (pinned === \"\" && (!col?.pinned || col?.pinned === \"\")) || col?.pinned === pinned;\r\n return isPinnedMatch && col?.is_visible;\r\n });\r\n\r\n const previousField = filteredGroup[event.previousIndex].field;\r\n const currentField = filteredGroup[event.currentIndex].field;\r\n const visiblePrevIndex = group.children.findIndex(\r\n (col: any) => col.field == previousField\r\n );\r\n const visibleCurrIndex = group.children.findIndex(\r\n (col: any) => col.field == currentField\r\n );\r\n const allFields = [previousField, currentField];\r\n const cells = allFields.length\r\n ? ([] as HTMLElement[]).concat(\r\n ...allFields.map((field) =>\r\n Array.from(document.querySelectorAll(`[field=\"${field}\"]`)) as HTMLElement[]\r\n )\r\n )\r\n : [];\r\n\r\n const groupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const filterGroupInSection = (this as any)[section].find(\r\n (col: any) =>\r\n Array.isArray(col.children) &&\r\n col.children.some((child: any) => child?.field === column?.field)\r\n );\r\n\r\n const groupInSectionIndex = (this as any)[section].findIndex(\r\n (col: any) => col.header === groupInSection.header\r\n );\r\n\r\n const firstPositions = new Map<HTMLElement, number>();\r\n cells.forEach((el) => firstPositions.set(el, el.getBoundingClientRect().left));\r\n moveItemInArray(\r\n this.columns[groupIndex]?.children,\r\n visiblePrevIndex,\r\n visibleCurrIndex\r\n );\r\n\r\n moveItemInArray(\r\n (this as any)[section]?.[groupInSectionIndex].children,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n\r\n // await this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n allFields.forEach((field) => {\r\n const updatedCells = Array.from(\r\n document.querySelectorAll(`[field=\"${field}\"]`)\r\n ) as HTMLElement[];\r\n updatedCells.forEach((el) => {\r\n const newLeft = el.getBoundingClientRect().left;\r\n const oldLeft = firstPositions.get(el)!;\r\n const deltaX = oldLeft - newLeft;\r\n if (deltaX !== 0) {\r\n el.style.willChange = 'transform';\r\n el.style.transition = 'none';\r\n el.style.transform = `translateX(${deltaX}px)`;\r\n void el.offsetWidth;\r\n el.style.transition = 'transform 400ms cubic-bezier(0.4, 0, 0.2, 1)';\r\n el.style.transform = 'translateX(0)';\r\n\r\n const handle = () => {\r\n el.style.transition = '';\r\n el.style.transform = '';\r\n el.style.willChange = '';\r\n el.removeEventListener('transitionend', handle);\r\n };\r\n el.addEventListener('transitionend', handle);\r\n }\r\n });\r\n });\r\n console.group('Group: ', group);\r\n }\r\n\r\n\r\n onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>) {\r\n this.updateColumnWidthsAndGroups();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\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) ?? \"_Blank\")\r\n .join(\",\");\r\n } else {\r\n groupKey = keyValue\r\n .map(val => val ?? \"_Blank\")\r\n .join(\",\");\r\n }\r\n } else {\r\n groupKey = keyValue ?? \"_Blank\";\r\n }\r\n if (!groupedMap.has(groupKey)) groupedMap.set(groupKey, []);\r\n groupedMap.get(groupKey)!.push(item);\r\n }\r\n return Array.from(groupedMap.entries()).map(([groupValue, groupItems]) => ({\r\n isGroup: true,\r\n groupField: currentField,\r\n groupValue,\r\n children: this.groupData(groupItems, restFields),\r\n isExpand: false,\r\n }));\r\n }\r\n\r\n\r\n countLeafRows(group: any): number {\r\n if (!group.children || !group.children.length) return 0;\r\n\r\n return group.children.reduce((count: number, child: any) => {\r\n return count + (child.isGroup ? this.countLeafRows(child) : 1);\r\n }, 0);\r\n }\r\n\r\n isActiveFilterOpen = false;\r\n toggleActiveFilter() {\r\n this.isActiveFilterOpen = !this.isActiveFilterOpen;\r\n }\r\n\r\n toggleActions(type: string) {\r\n if (type === this.activeTopButton) this.activeTopButton = type;\r\n else this.activeTopButton = type;\r\n this.activeSubButton = '';\r\n this.isFilterOpen = false;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n activeSubButton = '';\r\n toggleSubActions(type: string) {\r\n if (type === this.activeSubButton) this.activeSubButton = '';\r\n else this.activeSubButton = type;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n toggleActionsDropdown() {\r\n this.showActionsDropDown = !this.showActionsDropDown;\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n\r\n async changeTableLayout(event: Event, layoutType: string) {\r\n let target = event.target as HTMLInputElement;\r\n\r\n if (target.checked) {\r\n this.selectedTableLayout = layoutType;\r\n if (layoutType === 'small') {\r\n this.rowHeight = 36;\r\n this.headerRowHeight = 40;\r\n this.bodyTextFontsSize = 10;\r\n this.headerTextFontsSize = 10;\r\n\r\n } else if (layoutType === 'medium') {\r\n this.rowHeight = 44;\r\n this.headerRowHeight = 44;\r\n this.bodyTextFontsSize = 14;\r\n this.headerTextFontsSize = 14;\r\n\r\n } else {\r\n this.rowHeight = 60;\r\n this.headerRowHeight = 52;\r\n this.bodyTextFontsSize = 16;\r\n this.headerTextFontsSize = 16;\r\n }\r\n this.updateVisibleRows(this.mainScroll?.nativeElement?.scrollTop);\r\n await this.refreshHeaders();\r\n }\r\n if (this.tableFilterViewId) {\r\n this.savePreset('mouseUp');\r\n }\r\n this.onFontChange()\r\n }\r\n\r\n\r\n pageSizeOptions = [5, 25, 50, 75, 100, 150, 200, 250, 300, 500];\r\n get startIndexData() {\r\n return (this.paginationConfig.page - 1) * this.paginationConfig.limit;\r\n }\r\n\r\n get endIndex() {\r\n return Math.min(this.startIndex + this.paginationConfig.limit, this.paginationConfig.totalResults);\r\n }\r\n\r\n get visiblePages(): (number | string)[] {\r\n const pages: (number | string)[] = [];\r\n\r\n if (this.paginationConfig.totalPages <= 7) {\r\n for (let i = 1; i <= this.paginationConfig.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n if (this.paginationConfig.page > 3) {\r\n pages.push('...');\r\n }\r\n let start = Math.max(2, this.paginationConfig.page - 1);\r\n let end = Math.min(this.paginationConfig.totalPages - 1, this.paginationConfig.page + 1);\r\n\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n if (this.paginationConfig.page < this.paginationConfig.totalPages - 2) {\r\n pages.push('...');\r\n }\r\n pages.push(this.paginationConfig.totalPages);\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n\r\n searchTextForFilterDropDown = '';\r\n toggleColumnInFilterDropdown(col: any) {\r\n\r\n }\r\n\r\n removeColumnFromFilter(option: any) {\r\n\r\n }\r\n\r\n handleBackspace(event: Event) {\r\n // If search is empty, remove last tag\r\n if (!this.searchTextForFilterDropDown && this.selectedFilterOptions.length) {\r\n const last = this.selectedFilterOptions[this.selectedFilterOptions.length - 1];\r\n this.toggleSelectionInFilter(last);\r\n }\r\n }\r\n\r\n @ViewChild('filterMenueSearchInput') filterMenueSearchInput!: ElementRef<HTMLInputElement>\r\n @ViewChild('filterMenueTextchInput') filterMenueTextchInput!: ElementRef<HTMLInputElement>\r\n\r\n openFilteronThreeDotsClick(col: any) {\r\n if(col.type == 'image') return;\r\n this.selectedColumnForFilter = col;\r\n this.isThreeDotsFilterOpen = true;\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\r\n );\r\n setTimeout(() => {\r\n this.filterMenueSearchInput.nativeElement.focus();\r\n }, 100);\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || '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 }\r\n\r\n isFilterOpen = false\r\n selectedColumnForFilter: any;\r\n showFilters = this.showSideMenu ? false : false;\r\n\r\n openFilter(col: any) {\r\n this.activeFilterCell = col;\r\n this.activeCol = null\r\n this.isFilterOpen = true;\r\n this.selectedColumnForFilter = col;\r\n\r\n if (col.type === 'dropdown') {\r\n this.currentFilterSelectedIds.clear();\r\n const savedIds = col?.query?._ids || [];\r\n savedIds.forEach((id: string) => this.currentFilterSelectedIds.add(id));\r\n\r\n this.selectedFilterOptions = this.selectedColumnForFilter?.column_dropdown_value?.filter(\r\n (option: any) => this.currentFilterSelectedIds.has(option?.id || option?._id || option)\r\n );\r\n } else if (['string', 'number', 'date'].includes(col.type)) {\r\n this.firstCondition = col?.query?.first_condition || 'contain';\r\n this.firstValue = col?.query?.first_value || '';\r\n this.condition = col?.query?.condition || 'none';\r\n this.secondCondition = col?.query?.second_condition || '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 = '';\r\n condition = '';\r\n\r\n resetTextFilterChanges() {\r\n this.firstCondition = 'contain';\r\n this.firstValue = '';\r\n this.condition = 'none';\r\n this.secondCondition = '';\r\n this.secondValue = '';\r\n this.isFilterOpen = false;\r\n this.isActiveFilterOpen = false;\r\n this.activeTopButton = '';\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 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 const findColumn = (columns: any[], field: string): any => {\r\n for (const col of columns) {\r\n if (col.field === field) return col;\r\n if (col.children && col.children.length) {\r\n const found = findColumn(col.children, field);\r\n if (found) return found;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const column = findColumn(this.columns, this.selectedColumnForFilter.field);\r\n if (column) {\r\n if (column.type === 'dropdown') {\r\n column.query = column.query || {};\r\n column.query._ids = column.query._ids || [];\r\n\r\n // Remove stale IDs (not present in Set)\r\n column.query._ids = column.query._ids.filter(\r\n (id: any) => this.currentFilterSelectedIds.has(id) // <-- use .has()\r\n );\r\n\r\n // Add new ones if missing\r\n this.currentFilterSelectedIds.forEach(id => {\r\n if (!column.query._ids.includes(id)) {\r\n column.query._ids.push(id);\r\n }\r\n });\r\n\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: this.firstCondition || 'contain',\r\n first_value: this.firstValue || null,\r\n condition: this.condition || 'none',\r\n second_condition: this.secondCondition || null,\r\n second_value: this.secondValue || null,\r\n };\r\n }\r\n }\r\n\r\n const filter = {\r\n field: column.field,\r\n search: column.search,\r\n query: column.query,\r\n type: column.type,\r\n _ids: column._ids\r\n };\r\n\r\n this.filtersConfig.push(filter);\r\n\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\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\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 } else {\r\n col.query._ids = [];\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\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 this.activeFilterCell = null;\r\n this.cdr.detectChanges();\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n\r\n clearAllFilters() {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\r\n const resetAllRecursively = (columns: any[]) => {\r\n for (const column of columns) {\r\n if (column.query) {\r\n column.query = {\r\n _ids: [],\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: 'contain',\r\n second_value: null\r\n };\r\n }\r\n if (Array.isArray(column?.children) && column.children.length) {\r\n resetAllRecursively(column.children);\r\n }\r\n }\r\n };\r\n resetAllRecursively(this.columns);\r\n this.activeFilterCell = null;\r\n this.refreshPreviewColumns();\r\n this.cdr.detectChanges();\r\n const event = { eventType: 'reset' };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n\r\n applySideFilter() {\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\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 if (col.query) {\r\n const hasDropdownFilter =\r\n Array.isArray(col.query._ids) && col.query._ids.length > 0 && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n const hasValueFilter =\r\n col.query.first_value !== null && col.query.first_value !== undefined && col.query.first_value !== '' && this.filtersConfig.some((ele) => ele.field == col.field);\r\n\r\n if (hasDropdownFilter || hasValueFilter) {\r\n result.push(col);\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n };\r\n return [...collectFiltered(this.columns)];\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 enableEdit(row: any, column: any) {\r\n this.editinDropdownSearch = '';\r\n if (column.type == 'image' || !column?.is_editable) return;\r\n this.editingKey = ((row.id || row._id) + '-' + column.field);\r\n\r\n if (column.type === 'dropdown') {\r\n setTimeout(() => {\r\n const dropdownMenu = document.querySelector('.cell-editing-dropdown-menu') as HTMLElement;\r\n if (dropdownMenu) {\r\n const rect = dropdownMenu.getBoundingClientRect();\r\n const windowHeight = this.dataGridContainer.nativeElement?.offsetHeight;\r\n\r\n if (rect.bottom > windowHeight) {\r\n dropdownMenu.style.top = `-${rect.height}px`;\r\n } else {\r\n dropdownMenu.style.top = '100%';\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n\r\n disableEdit(row: any, column: any, controk?: any) {\r\n this.rowSelectedIndexes.clear();\r\n if (!this.editingKey) return\r\n this.checkRowEditAndEmitValue(row, column, null)\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 hasChanged = this.commonSevice.hasFieldChanged(currentValue, originalValue, column.type);\r\n if (!hasChanged) return;\r\n this.setNestedValue(originalRow, column, value);\r\n const sendObj = {\r\n data: { ...row },\r\n eventType: 'onCellEdit',\r\n value: value\r\n };\r\n 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;\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 }\r\n\r\n\r\n\r\n\r\n\r\n\r\n goToPage(page: any) {\r\n if (page < 1 || page > this.paginationConfig.totalPages) return;\r\n this.paginationConfig.page = page;\r\n const event = {\r\n obj: {\r\n limit: this.paginationConfig.limit,\r\n page: page,\r\n },\r\n eventType: 'pageChange',\r\n };\r\n this.genericEvent.emit(event)\r\n }\r\n\r\n onPageSizeChange() {\r\n this.paginationConfig.page = 1;\r\n const 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 }\r\n\r\n actionPreset(data: any, type: any) {\r\n this.tableView?.forEach((ele)=>{ele.is_temp = false});\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 selectFilter(data:any){\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 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 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,\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 }\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.columns,\r\n filters: this.presetFilter ? this.filtersConfig : [],\r\n config: config,\r\n id: this.tableFilterViewId,\r\n loadingCall: control == 'mouseUp' ? false : true\r\n },\r\n eventType: this.tableFilterViewId ? 'updatePreset' : 'createPreset'\r\n }\r\n this.genericEvent.emit(event)\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 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 if (typeof text === 'string' && text.length > 50) {\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 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) {\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 if (Array.isArray(row.children) && row.children.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 this.cdr.detectChanges();\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 getFirstTwoWords(name: string): string {\r\n if (!name) return '';\r\n const words = name.trim().split(/\\s+/).filter(word => /^[a-zA-Z]+$/.test(word));\r\n return words.slice(0, 2).map(word => word.charAt(0).toUpperCase()).join('');\r\n }\r\n\r\n onEmployeeClick(row: any): void {\r\n const event = {\r\n data: row,\r\n eventType: 'openEmployeeModal'\r\n };\r\n this.genericEvent.emit(event);\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 (!(event instanceof MouseEvent)) {\r\n event.preventDefault();\r\n }\r\n event.preventDefault();\r\n this.xPos = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX;\r\n this.yPos = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY;\r\n // this.xPos = event.clientX;\r\n // this.yPos = event.clientY;\r\n this.isVisible = true;\r\n this.positionedYet = false;\r\n this.deatilsList = deatilsList;\r\n setTimeout(() => {\r\n const menuElement = document.querySelector('.context-menu') as HTMLElement;\r\n if (!menuElement) return;\r\n const menuWidth = menuElement.offsetWidth;\r\n const menuHeight = menuElement.offsetHeight;\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n let x = (event instanceof MouseEvent) ? event.clientX : event.touches[0].clientX; //event.clientX;\r\n let y = (event instanceof MouseEvent) ? event.clientY : event.touches[0].clientY; //event.clientY;\r\n if (x + menuWidth > viewportWidth) {\r\n x = viewportWidth - menuWidth - 10;\r\n }\r\n if (y + menuHeight > viewportHeight) {\r\n y = viewportHeight - menuHeight - 10;\r\n }\r\n this.xPos = x;\r\n this.yPos = y;\r\n this.isVisible = true;\r\n\r\n setTimeout(() => {\r\n this.positionedYet = true;\r\n this.cdr.detectChanges();\r\n });\r\n\r\n this.cdr.detectChanges();\r\n });\r\n this.cdr.detectChanges()\r\n return false;\r\n }\r\n\r\n onActionClick(action: string) {\r\n const sendObj = {\r\n obj: this.deatilsList,\r\n eventType: action,\r\n };\r\n this.positionedYet = false;\r\n this.cdr.detectChanges();\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n\r\n onVerifyClick(type: string) {\r\n const idsArray = Array.from(this.selectedRows);\r\n const arrayOfObjectsWithTableType: any[] = [];\r\n this.selectedRows.forEach(id => {\r\n arrayOfObjectsWithTableType.push({\r\n id: id,\r\n listingType: this.listingType,\r\n });\r\n });\r\n const sendObj = {\r\n data: {\r\n obj: idsArray,\r\n tableName: this.tableName,\r\n listingType: this.listingType,\r\n },\r\n eventType: type,\r\n };\r\n this.genericEvent.emit(sendObj)\r\n }\r\n\r\n\r\n\r\n getCellClasses(column: any, value: any): string {\r\n if (!value) return '';\r\n let val: any;\r\n if (typeof value === 'object') {\r\n val = value?.value;\r\n } else {\r\n val = value;\r\n }\r\n const field = column?.field?.toLowerCase();\r\n const status = val?.toString().toLowerCase();\r\n if (field === 'status' || field === 'account_status' || field === 'availStatus' || field === 'is_custom_grade') {\r\n return STATUSES_BADGE_MAP[status] || 'badge badge-secondary';\r\n }\r\n return '';\r\n }\r\n\r\n removeColumnFilterFromColumn(column: any) {\r\n if (!column) return\r\n if (column.type === 'dropdown') {\r\n column.query._ids = [];\r\n } else if (['string', 'number', 'date'].includes(column.type)) {\r\n column.query = {\r\n first_condition: 'contain',\r\n first_value: null,\r\n condition: 'none',\r\n second_condition: null,\r\n second_value: null,\r\n }\r\n }\r\n const filteredColumns = this.commonSevice.getFiltersFromColumns(this.columns, this.filtersConfig);\r\n this.filterOptions.emit(filteredColumns);\r\n }\r\n\r\n onSideMenuColumnsVisibilityChange() {\r\n this.refreshHeaders();\r\n const event = {\r\n columns: this.columns,\r\n type: 'createUpdateConfigListing',\r\n }\r\n this.createUpdateConfigListing.emit(event);\r\n }\r\n\r\n downloadCsv() {\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 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 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\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 = 100;\r\n private scrollMargin = 150;\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 }, 16);\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\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.visibleRows,\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\r\n const focus = this.findFocusedDetailRowAndSection();\r\n if (focus) {\r\n this.handleDetailShortcuts(event, focus.row, focus.section);\r\n return;\r\n }\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\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 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 event.preventDefault();\r\n this.undo();\r\n\r\n } else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.redo();\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 event.preventDefault();\r\n const text = event.clipboardData?.getData('text');\r\n if (!text) return;\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 console.log(\"Updated Rows: \", updatedRows);\r\n if (updatedRows?.length) {\r\n const sendObj = {\r\n data: updatedRows,\r\n eventType: 'onCellEdit',\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n this.cdr.detectChanges();\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// For Detail Row Editing\r\ndetailEditingKey: string | null = null; // e.g., \"rowId-dataIndex-fieldName\"\r\nactiveDetailRow: any = null;\r\nactiveDetailCol: any = null;\r\n\r\n// For Detail Row Filtering\r\ndetailFilterValue: string = '';\r\ndetailFilterCondition: string = 'contain';\r\ndetailFilters: Map<string, { condition: string, value: any }> = new Map(); // key: `${rowId}-${colField}`\r\n\r\n// For Detail Row Drag & Drop\r\ncurrentDetailDraggingColumn: any = null;\r\ncurrentDetailRow: any = null;\r\n// Detail Row - Three Dots Menu\r\nopenDetailThreeDotsMenu(event: MouseEvent, row: any, col: any) {\r\n event.stopPropagation();\r\n this.activeDetailRow = row;\r\n this.activeDetailCol = col;\r\n // Positioning logic can be added here if needed\r\n // For now, it will appear right below the header\r\n}\r\n\r\n// Detail Row - Inline Editing\r\nenableDetailEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\nisDetailEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCell(row: any, dataItem: any, col: any): boolean {\r\n return this.isDetailEditing(row, dataItem, col);\r\n}\r\n\r\n// Detail Row - Drag & Drop\r\n\r\n\r\n\r\n\r\n\r\ngetDetailFilterMenuLeft(row: any, col: any): number {\r\n // Find the header cell and return its left position\r\n const headerCell = document.querySelector(`[field=\"${col.field}\"]`);\r\n if (headerCell) {\r\n const rect = headerCell.getBoundingClientRect();\r\n return rect.left;\r\n }\r\n return 0;\r\n}\r\n\r\n// Detail Row - Filtering\r\napplyDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.set(filterKey, {\r\n condition: this.detailFilterCondition,\r\n value: this.detailFilterValue\r\n });\r\n\r\n // Apply filter to data\r\n this.filterDetailData(row);\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\ntoggleSelectAllDetailFilters(col: any, row: any, event: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n const allOptions = col.column_dropdown_value || [];\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const allSelected = allOptions.every((option: any) =>\r\n filter.value.includes(option._id || option.id || option)\r\n );\r\n\r\n if (allSelected) {\r\n // Deselect all\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n // Select all\r\n filter.value = allOptions.map((option: any) => option._id || option.id || option);\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nonDetailOptionToggle(col: any, option: any, row: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n let filter: { condition: string; value: any[] } = this.detailFilters.get(filterKey) || { condition: 'in', value: [] };\r\n\r\n if (!Array.isArray(filter.value)) filter.value = [];\r\n\r\n const optionId = option._id || option.id || option;\r\n const index = filter.value.indexOf(optionId);\r\n\r\n if (index > -1) {\r\n filter.value.splice(index, 1);\r\n } else {\r\n filter.value.push(optionId);\r\n }\r\n\r\n if (filter.value.length === 0) {\r\n this.detailFilters.delete(filterKey);\r\n } else {\r\n this.detailFilters.set(filterKey, filter);\r\n }\r\n\r\n this.filterDetailData(row);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nresetDetailFilter(row: any, col: any) {\r\n const filterKey = `${row._id || row.id}-${col.field}`;\r\n this.detailFilters.delete(filterKey);\r\n this.filterDetailData(row); // Re-filter to show all data\r\n\r\n this.activeDetailCol = null;\r\n this.detailFilterValue = '';\r\n this.detailFilterCondition = 'contain';\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nfilterDetailData(row: any) {\r\n if (!row.details?.originalData) {\r\n // Store original data on first filter\r\n row.details.originalData = [...row.details.data];\r\n }\r\n\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n let passes = true;\r\n for (let [filterKey, filter] of this.detailFilters.entries()) {\r\n if (filterKey.startsWith(`${row._id || row.id}-`)) {\r\n const colField = filterKey.split('-')[1];\r\n const cellValue = String(item[colField] || '').toLowerCase();\r\n const filterValue = String(filter.value || '').toLowerCase();\r\n\r\n switch (filter.condition) {\r\n case 'contain':\r\n passes = passes && cellValue.includes(filterValue);\r\n break;\r\n case 'equals':\r\n passes = passes && cellValue === filterValue;\r\n break;\r\n case 'startsWith':\r\n passes = passes && cellValue.startsWith(filterValue);\r\n break;\r\n case 'endsWith':\r\n passes = passes && cellValue.endsWith(filterValue);\r\n break;\r\n}\r\n\r\n if (!passes) break;\r\n }\r\n }\r\n return passes;\r\n});\r\n}\r\n\r\n\r\n// For Detail Row Drag & Drop\r\n\r\n\r\nonDetailDragStart(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n}\r\n\r\nonDetailDragMoved(event: CdkDragMove, row: any) {\r\n // Let CDK handle visual preview — no manual DOM manipulation needed\r\n}\r\n\r\nonDetailDragDropped(event: CdkDragDrop<any>, row: any) {\r\n if (!this.currentDetailDraggingColumn || !row.details || !row.details.columns) return;\r\n\r\n const previousIndex = row.details.columns.findIndex((c: any) => c.field === this.currentDetailDraggingColumn.field);\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.cdr.detectChanges();\r\n\r\n\r\n }\r\n\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n}\r\n\r\n\r\n@Input() detailsIconPosition: 'start' | 'end' = 'start';\r\n\r\n@Input() detailsPosition: 'top' | 'bottom' = 'top';\r\n\r\n\r\n\r\ndropColumn(event: CdkDragDrop<any[]>, row: any) {\r\n if (!row?.details?.columns) return;\r\n\r\n moveItemInArray(row.details.columns, event.previousIndex, event.currentIndex);\r\n\r\n // Optional: if you want to also reorder the data inside each row\r\n if (row.details.data?.length) {\r\n row.details.data.forEach((dataRow: any) => {\r\n const values = [...row.details.columns.map((c: any) => dataRow[c.field])];\r\n // reassign values in new order\r\n row.details.columns.forEach((col: any, i: number) => {\r\n dataRow[col.field] = values[i];\r\n });\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\nopenSubMenue(col: any){\r\n this.subMenueOpendField = col.field;\r\n}\r\n\r\ndetailDragState = {\r\n isDragging: false,\r\n sourceRow: null as any,\r\n sourceColumn: null as any,\r\n originalColumns: [] as any[],\r\n originalIndex: -1\r\n};\r\n\r\n\r\n\r\nonDetailDragEnd(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const currentContainer = event.source.dropContainer;\r\n\r\n if (this.detailDragState.originalIndex === event.source.data) {\r\n row.details.columns = [...this.detailDragState.originalColumns];\r\n this.cdr.detectChanges();\r\n }\r\n\r\n event.source.element.nativeElement.style.opacity = '1';\r\n}\r\n\r\nonDetailDragEndSimple(event: CdkDragEnd, row: any) {\r\n this.detailDragState.isDragging = false;\r\n event.source.element.nativeElement.style.opacity = '1';\r\n\r\n\r\n}\r\n\r\nreorderDetailData(row: any, oldIndex: number, newIndex: number) {\r\n if (!row.details.data) return;\r\n\r\n row.details.data.forEach((dataRow: any) => {\r\n const keys = row.details.columns.map((col: any) => col.field);\r\n const values = keys.map((key: string) => dataRow[key]);\r\n\r\n const movedValue = values[oldIndex];\r\n\r\n values.splice(oldIndex, 1);\r\n\r\n values.splice(newIndex, 0, movedValue);\r\n\r\n const newData: any = {};\r\n keys.forEach((key: string, index: number) => {\r\n newData[key] = values[index];\r\n });\r\n\r\n Object.assign(dataRow, newData);\r\n });\r\n}\r\n\r\nemitDetailColumnReorderEvent(row: any) {\r\n const eventObj = {\r\n rowId: row._id || row.id,\r\n columns: row.details.columns,\r\n eventType: 'onDetailColumnReorder'\r\n };\r\n this.genericEvent.emit(eventObj);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\noriginalDetailValues: Map<string, any> = new Map(); // Track original detail cell values for compare\r\ndetailAccordionStates: Map<string, boolean> = new Map(); // Track accordion expand states\r\n\r\n// Line ~1620: Update onDetailDragStart (add animation class)\r\nonDetailDragStarts(event: CdkDragStart, row: any, col: any, index: number) {\r\n this.currentDetailDraggingColumn = col;\r\n this.currentDetailRow = row;\r\n\r\n // NEW: Add real-time drag animation\r\n event.source.element.nativeElement.classList.add('dragging'); // Add class for opacity/transform\r\n requestAnimationFrame(() => {\r\n // Preview move\r\n event.source.element.nativeElement.style.transform = 'translateX(10px)';\r\n });\r\n}\r\n\r\n// Line ~1640: Update onDetailDragDropped (add animation + revert if same position)\r\nonDetailDragDroppeds(event: CdkDragDrop<any[]>, row: any) {\r\n this.detailDragState.isDragging = false;\r\n\r\n const previousIndex = event.previousIndex;\r\n const currentIndex = event.currentIndex;\r\n\r\n if (previousIndex !== currentIndex) {\r\n // NEW: Animate reorder\r\n const headerRow = document.querySelector('.detail-header-row') as HTMLElement;\r\n if (headerRow) {\r\n headerRow.classList.add('dragging'); // Start animation\r\n setTimeout(() => {\r\n moveItemInArray(row.details.columns, previousIndex, currentIndex);\r\n this.reorderDetailData(row, previousIndex, currentIndex);\r\n this.emitDetailColumnReorderEvent(row);\r\n headerRow.classList.remove('dragging'); // End animation\r\n this.cdr.detectChanges();\r\n }, 300); // Delay for smooth real-time feel\r\n }\r\n } else {\r\n // Revert if same position (with animation)\r\n requestAnimationFrame(() => {\r\n event.item.element.nativeElement.style.transform = 'translateX(0)';\r\n });\r\n }\r\n\r\n // Reset\r\n this.currentDetailDraggingColumn = null;\r\n this.currentDetailRow = null;\r\n event.item.element.nativeElement.classList.remove('dragging');\r\n}\r\n\r\n// NEW METHOD: Add around line ~1700 (after existing drag methods)\r\nhandleDetailDoubleClick(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${col.field}`;\r\n\r\n // Toggle accordion expand\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n this.detailAccordionStates.set(key, row.isDetailsExpand);\r\n\r\n // Emit generic event for accordion toggle (send to API)\r\n const eventObj = {\r\n data: { row, col, dataItem },\r\n eventType: 'expandAccordion',\r\n isExpanded: row.isDetailsExpand\r\n };\r\n this.genericEvent.emit(eventObj);\r\n\r\n // If not expanded, stop here; else proceed to edit if applicable\r\n if (!row.isDetailsExpand) return;\r\n\r\n // Proceed to edit (with compare logic in disable)\r\n this.enableDetailEdit(row, dataItem, col);\r\n\r\n // NEW: Store original value for compare on save\r\n const originalValue = dataItem[col.field];\r\n this.originalDetailValues.set(key, originalValue);\r\n}\r\n\r\n// Line ~1740: Update disableDetailEdit (add compare + emit if changed)\r\ndisableDetailEdit(row: any, dataItem: any, col: any) {\r\n const rowId = row._id || row.id;\r\n const key = `${rowId}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Compare and emit if changed\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue },\r\n eventType: 'onDetailCellEdit',\r\n changed: true\r\n };\r\n this.genericEvent.emit(sendObj); // Send to API\r\n }\r\n\r\n // Cleanup\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Enable inline editing for accordion cells\r\nenableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Disable inline editing for accordion cells\r\ndisableDetailCellEdit(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: { ...dataItem, originalValue, newValue, rowId: row._id || row.id, field: col.field },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n// Check if accordion cell is being edited\r\nisDetailCellEditing(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\ntooltipVisible = false;\r\ntooltipEditing = false; // NEW\r\ncurrentTooltipField: string | null = null;\r\ncurrentTooltipData: any = null;\r\ntooltipPosition = { x: 0, y: 0 };\r\n\r\n\r\nenableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndisableDetailEdits(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n // Check if value changed\r\n if (newValue !== originalValue) {\r\n // Send update to API\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\n\r\ntooltipElement: HTMLElement | null = null;\r\n\r\n\r\ngetDisplayValue(dataItem: any, field: string): string {\r\n if (field === 'breaks') {\r\n const breaks = dataItem[field] || [];\r\n if (!Array.isArray(breaks) || breaks.length === 0) {\r\n return '0';\r\n }\r\n const totalMinutes = breaks.reduce((sum: number, b: any) => sum + (b.duration || 0), 0);\r\n return totalMinutes > 0 ? `${totalMinutes}m` : '0';\r\n } else if (field === 'short_breaks') {\r\n const shortBreak = dataItem[field];\r\n if (!shortBreak || !shortBreak.duration) {\r\n return '0';\r\n }\r\n return `${shortBreak.duration}m`;\r\n }\r\n return '0';\r\n}\r\n\r\n\r\n\r\nenableDetailEditss(row: any, dataItem: any, col: any, breakItem?: any) {\r\n this.hideCustomTooltip();\r\n\r\n // Special case for breaks / short_breaks\r\n if (col.field === 'breaks' || col.field === 'short_breaks') {\r\n this.currentTooltipData = breakItem || dataItem[col.field];\r\n this.currentTooltipField = 'single_break';\r\n this.enableTooltipEdit(); // reuse tooltip editor\r\n return;\r\n }\r\n\r\n // default editing (strings, numbers, etc.)\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n this.detailEditingKey = key;\r\n\r\n this.originalDetailValues.set(key, dataItem[col.field]);\r\n\r\n this.cdr.detectChanges();\r\n\r\n setTimeout(() => {\r\n const input = document.querySelector(`input[data-edit-key=\"${key}\"]`) as HTMLInputElement;\r\n if (input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }, 0);\r\n}\r\n\r\n\r\ndisableDetailEditss(row: any, dataItem: any, col: any) {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n\r\n if (this.detailEditingKey === key) {\r\n const newValue = dataItem[col.field];\r\n const originalValue = this.originalDetailValues.get(key);\r\n\r\n if (newValue !== originalValue) {\r\n const sendObj = {\r\n data: {\r\n ...dataItem,\r\n originalValue,\r\n newValue,\r\n rowId: row._id || row.id,\r\n field: col.field\r\n },\r\n eventType: 'onDetailCellEdit'\r\n };\r\n this.genericEvent.emit(sendObj);\r\n }\r\n\r\n this.originalDetailValues.delete(key);\r\n this.detailEditingKey = null;\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n\r\nisDetailEditings(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\nisActiveDetailCells(row: any, dataItem: any, col: any): boolean {\r\n const key = `${row._id || row.id}-${row.details.data.indexOf(dataItem)}-${col.field}`;\r\n return this.detailEditingKey === key;\r\n}\r\n\r\n\r\n\r\n\r\nshowCustomTooltip(event: MouseEvent, dataItem: any, field: string) {\r\n if (this.tooltipEditing) return; // don't override while editing\r\n this.currentTooltipData = dataItem;\r\n this.currentTooltipField = field;\r\n this.tooltipPosition = {\r\n x: event.clientX + 15,\r\n y: event.clientY + 15\r\n };\r\n this.tooltipVisible = true;\r\n}\r\n\r\n\r\n\r\ngetTooltipContent(dataItem: any, field: string): string {\r\n if (!dataItem || !field) {\r\n return '<div class=\"tooltip-content\">No details available</div>';\r\n }\r\n let html = '';\r\n\r\n // Handle single break tooltip\r\n if (field === 'single_break') {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Break Details</h4>';\r\n html += '<ul class=\"tooltip-list\">';\r\n const name = dataItem.name || 'Unnamed Break';\r\n const type = dataItem.type ? ` (${dataItem.type})` : '';\r\n const duration = dataItem.duration || 0;\r\n html += `<li><strong>${name}${type}</strong></li>`;\r\n html += `<li>Duration: ${duration} minutes</li>`;\r\n html += '</ul>';\r\n html += '</div>';\r\n return html;\r\n }\r\n\r\n // Handle 'breaks' array (existing logic, slightly modified)\r\n if (field === 'breaks') {\r\n const breaks = dataItem[field] || [];\r\n if (!Array.isArray(breaks) || breaks.length === 0) {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Break Details</h4>';\r\n html += '<p style=\"color: #666; font-style: italic;\">No breaks recorded for this day</p>';\r\n html += '</div>';\r\n return html;\r\n }\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">All Breaks</h4>';\r\n html += '<ul class=\"tooltip-list\">';\r\n let totalMinutes = 0;\r\n breaks.forEach((b: any, index: number) => {\r\n const duration = b.duration || 0;\r\n totalMinutes += duration;\r\n const name = b.name || `Break ${index + 1}`;\r\n const type = b.type ? ` (${b.type})` : '';\r\n html += `<li>${name}${type}: ${duration} minutes</li>`;\r\n });\r\n html += '</ul>';\r\n html += `<p class=\"tooltip-total\">Total Break Time: ${totalMinutes} minutes</p>`;\r\n html += '</div>';\r\n }\r\n // Handle 'short_breaks' single object (existing logic)\r\n else if (field === 'short_breaks') {\r\n const shortBreak = dataItem[field];\r\n if (!shortBreak || !shortBreak.duration) {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Short Break Details</h4>';\r\n html += '<p style=\"color: #666; font-style: italic;\">No short break recorded for this day</p>';\r\n html += '</div>';\r\n return html;\r\n }\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<h4 class=\"tooltip-title\">Short Break Details</h4>';\r\n html += '<ul class=\"tooltip-list\">';\r\n const name = shortBreak.name || 'Quick Break';\r\n const type = shortBreak.type ? ` (${shortBreak.type})` : '';\r\n html += `<li>${name}${type}: ${shortBreak.duration} minutes</li>`;\r\n html += '</ul>';\r\n html += '</div>';\r\n } else {\r\n html += '<div class=\"tooltip-content\">';\r\n html += '<p style=\"color: #666; font-style: italic;\">No details available for this field</p>';\r\n html += '</div>';\r\n }\r\n return html;\r\n}\r\n\r\ngetBreakColor(type: string): string {\r\n switch (type?.toLowerCase()) {\r\n case 'paid':\r\n return '#4CAF50'; // Green\r\n case 'unpaid':\r\n return '#F44336'; // Red\r\n case 'lunch':\r\n return '#2196F3'; // Blue\r\n default:\r\n return '#9C27B0'; // Purple (default)\r\n }\r\n}\r\n\r\nminuteOptions = Array.from({ length: 60 }, (_, i) => i); // 0–59\r\n\r\n\r\ntooltipMinutes: number = 0;\r\nformattedDuration: string = '0m';\r\n\r\nenableTooltipEdit() {\r\n this.tooltipEditing = true;\r\n this.tooltipMinutes = this.currentTooltipData.duration || 0;\r\n this.updateFormattedDuration();\r\n}\r\n\r\nupdateFormattedDuration() {\r\n const total = this.tooltipMinutes || 0;\r\n const hours = Math.floor(total / 60);\r\n const minutes = total % 60;\r\n\r\n if (hours > 0) {\r\n this.formattedDuration = `${hours}h ${minutes}m`;\r\n } else {\r\n this.formattedDuration = `${minutes}m`;\r\n }\r\n}\r\n\r\nsaveTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.currentTooltipData.duration = this.tooltipMinutes;\r\n\r\n const sendObj = {\r\n data: {\r\n ...this.currentTooltipData,\r\n rowId: this.currentTooltipData?.rowId,\r\n field: this.currentTooltipField\r\n },\r\n eventType: 'onTooltipEdit'\r\n };\r\n\r\n this.genericEvent.emit(sendObj);\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\ncancelTooltipEdit() {\r\n this.tooltipEditing = false;\r\n this.tooltipVisible = false;\r\n}\r\n\r\n\r\n\r\nshowRestrictionTooltip(event: MouseEvent, parentRow: any, dataItem: any) {\r\n if (!parentRow.attendance_log_detail?.length) {\r\n return;\r\n }\r\n\r\n this.currentRestrictionLogs = [...parentRow.attendance_log_detail];\r\n this.restrictionTooltipPosition = {\r\n x: event.clientX - 160,\r\n y: event.clientY - 150\r\n };\r\n this.restrictionTooltipVisible = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// Add these for delayed hide\r\nprivate customTooltipHideTimeout: any = null;\r\nprivate restrictionTooltipHideTimeout: any = null;\r\nprivate manualLogsTooltipHideTimeout: any = null;\r\n\r\nshowManualLogsTooltip(event: MouseEvent, parentRow: any, dataItem: any) {\r\n if (!parentRow.logs?.length) {\r\n return;\r\n }\r\n this.currentManualLogs = [...parentRow.logs];\r\n this.manualLogsTooltipPosition = {\r\n x: event.clientX - 160,\r\n y: event.clientY - 150\r\n };\r\n this.manualLogsTooltipVisible = true;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\n\r\nhideRestrictionTooltip() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n }\r\n this.restrictionTooltipHideTimeout = setTimeout(() => {\r\n this.restrictionTooltipVisible = false;\r\n this.currentRestrictionLogs = [];\r\n this.cdr.detectChanges();\r\n }, 200);\r\n}\r\n\r\nhideManualLogsTooltip() {\r\n if (this.manualLogsTooltipHideTimeout) {\r\n clearTimeout(this.manualLogsTooltipHideTimeout);\r\n }\r\n this.manualLogsTooltipHideTimeout = setTimeout(() => {\r\n this.manualLogsTooltipVisible = false;\r\n this.currentManualLogs = [];\r\n this.cdr.detectChanges();\r\n }, 200);\r\n}\r\n\r\n\r\n\r\npreventRestrictionTooltipHide() {\r\n if (this.restrictionTooltipHideTimeout) {\r\n clearTimeout(this.restrictionTooltipHideTimeout);\r\n this.restrictionTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\npreventManualLogsTooltipHide() {\r\n if (this.manualLogsTooltipHideTimeout) {\r\n clearTimeout(this.manualLogsTooltipHideTimeout);\r\n this.manualLogsTooltipHideTimeout = null;\r\n }\r\n}\r\nhideCustomTooltip() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n }\r\n this.customTooltipHideTimeout = setTimeout(() => {\r\n this.tooltipVisible = false;\r\n this.currentTooltipData = null;\r\n this.currentTooltipField = null;\r\n this.cdr.detectChanges();\r\n }, 200); // 200ms delay\r\n}\r\n\r\npreventCustomTooltipHide() {\r\n if (this.customTooltipHideTimeout) {\r\n clearTimeout(this.customTooltipHideTimeout);\r\n this.customTooltipHideTimeout = null;\r\n }\r\n}\r\n\r\n\r\nrestrictionTooltipVisible = false;\r\nrestrictionTooltipPosition = { x: 0, y: 0 };\r\ncurrentRestrictionLogs: any[] = [];\r\n\r\nmanualLogsTooltipVisible = false;\r\nmanualLogsTooltipPosition = { x: 0, y: 0 };\r\ncurrentManualLogs: any[] = [];\r\n\r\n\r\n\r\n\r\n// New properties for detail column menu\r\n// activeDetailCol: any = null;\r\n// activeDetailRow: any = null;\r\nisDetailMenueHidden = false;\r\n\r\n// Detail column menu methods\r\nopenDetailThreeDotsMenus(event: MouseEvent, col: any, row: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.isDetailMenueHidden = true;\r\n this.activeDetailCol = col;\r\n this.activeDetailRow = row;\r\n\r\n setTimeout(() => {\r\n const element = document.querySelector('.detail-column-menu') as HTMLElement | null;\r\n const target = event.currentTarget as HTMLElement | null;\r\n\r\n if (element && target) {\r\n const rect = target.getBoundingClientRect(); // ✅ no error now\r\n element.style.left = `${rect.left}px`;\r\n element.style.top = `${rect.bottom}px`;\r\n }\r\n\r\n this.isDetailMenueHidden = false;\r\n this.cdr.detectChanges();\r\n }, 0);\r\n}\r\n\r\n\r\n// Detail sorting methods\r\nsortDetailAsc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'asc';\r\n this.sortDetailData(row, col.field, 'asc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nsortDetailDesc(col: any, row: any) {\r\n if (!col.is_sortable) return;\r\n\r\n col.sortOrder = 'desc';\r\n this.sortDetailData(row, col.field, 'desc');\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailSort(col: any, row: any) {\r\n col.sortOrder = null;\r\n // Reset to original order - you might need to store original order\r\n if (row.details.originalData) {\r\n row.details.data = [...row.details.originalData];\r\n }\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate sortDetailData(row: any, field: string, order: 'asc' | 'desc') {\r\n if (!row.details?.data) return;\r\n\r\n row.details.data.sort((a: any, b: any) => {\r\n const aValue = this.getNestedValue(a, field);\r\n const bValue = this.getNestedValue(b, field);\r\n\r\n if (order === 'asc') {\r\n return aValue < bValue ? -1 : aValue > bValue ? 1 : 0;\r\n } else {\r\n return aValue > bValue ? -1 : aValue < bValue ? 1 : 0;\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail pinning methods\r\nupdateDetailColumnPin(col: any, row: any, pinned: 'left' | 'right' | null) {\r\n col.pinned = pinned;\r\n this.reorderDetailColumns(row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate reorderDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const leftPinned = row.details.columns.filter((col: any) => col.pinned === 'left');\r\n const rightPinned = row.details.columns.filter((col: any) => col.pinned === 'right');\r\n const centerColumns = row.details.columns.filter((col: any) => !col.pinned);\r\n\r\n row.details.columns = [...leftPinned, ...centerColumns, ...rightPinned];\r\n}\r\n\r\n// Detail autosize methods\r\nautosizeDetailColumn(col: any, row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((c: any) => c.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.floor(containerWidth / visibleColumns.length);\r\n\r\n col.width = Math.max(equalWidth, 80);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\nautosizeAllDetailColumns(row: any) {\r\n if (!row.details?.columns) return;\r\n\r\n const visibleColumns = row.details.columns.filter((col: any) => col.is_visible !== false);\r\n const containerWidth = 800; // Adjust based on your accordion width\r\n const equalWidth = Math.max(Math.floor(containerWidth / visibleColumns.length), 80);\r\n\r\n visibleColumns.forEach((col: any) => {\r\n col.width = equalWidth;\r\n });\r\n\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Detail column visibility methods\r\nchooseDetailColumns(row: any) {\r\n // Implement choose columns modal for detail table\r\n console.log('Choose detail columns for row:', row);\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\nresetDetailColumns(row: any) {\r\n if (!row.details?.originalColumns) {\r\n console.warn('Original columns not found for this row', row);\r\n return;\r\n }\r\n\r\n row.details.columns = JSON.parse(JSON.stringify(row.details.originalColumns));\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\nshowDetailColumnPanel = false;\r\ncurrentDetailRowForColumnSelection: any = null;\r\n\r\n\r\nopenDetailChooseColumns(row: any) {\r\n this.currentDetailRowForColumnSelection = row;\r\n this.showDetailColumnPanel = true;\r\n this.activeDetailCol = null;\r\n this.activeDetailRow = null;\r\n}\r\n\r\ncloseDetailColumnPanel() {\r\n this.showDetailColumnPanel = false;\r\n this.currentDetailRowForColumnSelection = null;\r\n}\r\n\r\ntoggleDetailColumnVisibility(column: any, isVisible: boolean) {\r\n if (!this.currentDetailRowForColumnSelection?.details?.columns) return;\r\n\r\n const col = this.currentDetailRowForColumnSelection.details.columns.find(\r\n (c: any) => c.field === column.field\r\n );\r\n if (col) {\r\n col.is_visible = isVisible;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n\r\nallDetailColumnsSelected(): boolean {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n return cols.every((col: any) => col.is_visible !== false);\r\n}\r\n\r\n// resetDetailColumnsInModal() {\r\n// if (!this.currentDetailRowForColumnSelection?.details?.originalColumns) {\r\n// console.warn('Original detail columns not found');\r\n// return;\r\n// }\r\n// this.currentDetailRowForColumnSelection.details.columns =\r\n// JSON.parse(JSON.stringify(this.currentDetailRowForColumnSelection.details.originalColumns));\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\ntoggleAllDetailColumnsVisibility() {\r\n const cols = this.currentDetailRowForColumnSelection?.details?.columns || [];\r\n const allVisible = this.allDetailColumnsSelected();\r\n cols.forEach((col: any) => col.is_visible = !allVisible);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ngroupByDetailColumn(col: any, row: any) {\r\n if (!col || !row?.details) return;\r\n\r\n // Initialize groupedColumns for detail if not exists\r\n if (!row.details.groupedColumns) {\r\n row.details.groupedColumns = [];\r\n }\r\n\r\n // Avoid duplicate grouping\r\n const exists = row.details.groupedColumns.some((g: any) => g.field === col.field);\r\n if (exists) return;\r\n\r\n // Mark column as grouped\r\n col.isRowGrouped = true;\r\n row.details.groupedColumns.push({ ...col });\r\n\r\n // Perform grouping on detail data\r\n this.groupDetailData(row);\r\n}\r\n\r\ngroupDetailData(row: any) {\r\n const fields = row.details.groupedColumns.map((col: any) => col.field);\r\n const originalData = row.details.originalData || row.details.data;\r\n row.details.data = this.groupData(originalData, fields);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nungroupDetailColumn(col: any, row: any) {\r\n const index = row.details.groupedColumns.findIndex((g: any) => g.field === col.field);\r\n if (index !== -1) {\r\n row.details.groupedColumns.splice(index, 1);\r\n }\r\n\r\n // Find and unmark in columns\r\n const detailCol = row.details.columns.find((c: any) => c.field === col.field);\r\n if (detailCol) detailCol.isRowGrouped = false;\r\n\r\n // Use originalData if exists, else fallback to current data\r\n const sourceData = row.details.originalData || row.details.data;\r\n row.details.data = JSON.parse(JSON.stringify(sourceData));\r\n\r\n // Re-apply remaining groups (if any)\r\n if (row.details.groupedColumns.length > 0) {\r\n this.groupDetailData(row);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// const sm = row.details.sideMenu || (row.details.sideMenu = { visible: true, currentTab: null });\r\n// if (sm.currentTab === tab) {\r\n// sm.visible = !sm.visible;\r\n// } else {\r\n// sm.currentTab = tab;\r\n// sm.visible = true;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// // Optional: emit event or re-render\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// applyDetailRowFilter(row: any) {\r\n// // if (!row.details.originalData) {\r\n// // row.details.originalData = [...row.details.data];\r\n// // }\r\n// // const filters = row.details.filters || {};\r\n// // row.details.data = row.details.originalData.filter(item: => {\r\n// // return Object.keys(filters).every(field => {\r\n// // const term = (filters[field] || '').toLowerCase();\r\n// // if (!term) return true;\r\n// // const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// // return value.includes(term);\r\n// // });\r\n// // });\r\n// }\r\n\r\n\r\n// Initialize side menu when expanding\r\n// toggleExpand(row: any) {\r\n// if (row.details) {\r\n// row.isDetailsExpand = !row.isDetailsExpand;\r\n// if (row.isDetailsExpand && !row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n// } else {\r\n// row.isExpand = !row.isExpand;\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\n// toggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n// // Ensure sideMenu object exists\r\n// if (!row.details.sideMenu) {\r\n// row.details.sideMenu = {\r\n// currentTab: null,\r\n// filters: {}\r\n// };\r\n// // Optional: preserve original data for filtering\r\n// if (!row.details.originalData) {\r\n// row.details.originalData = [...row.details.data];\r\n// }\r\n// }\r\n\r\n// const sm = row.details.sideMenu;\r\n// if (sm.currentTab === tab) {\r\n// sm.currentTab = null; // close panel\r\n// } else {\r\n// sm.currentTab = tab; // open selected tab\r\n// }\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// Column visibility change handler\r\n// onDetailColumnVisibilityChange(row: any) {\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n// // Apply filter to detail data\r\n// applyDetailRowFilter(row: any) {\r\n// const filters = row.details.filters || {};\r\n// row.details.data = row.details.originalData.filter((item: any) => {\r\n// return Object.keys(filters).every(field => {\r\n// const term = (filters[field] || '').toLowerCase();\r\n// if (!term) return true;\r\n// const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n// return value.includes(term);\r\n// });\r\n// });\r\n// this.cdr.detectChanges();\r\n// }\r\n\r\n\r\n// Initialize detail row + side menu\r\ntoggleExpand(row: any) {\r\n if (row.details) {\r\n row.isDetailsExpand = !row.isDetailsExpand;\r\n if (row.isDetailsExpand) {\r\n // ✅ Initialize filters & visibility\r\n if (!row.details.filters) row.details.filters = {};\r\n if (!row.details.originalData) {\r\n row.details.originalData = [...row.details.data];\r\n }\r\n row.details.columns.forEach((col: any) => {\r\n if (col.is_visible === undefined) col.is_visible = true;\r\n });\r\n // ✅ Initialize sideMenu if not exists\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = {\r\n currentTab: null,\r\n columnSearch: ''\r\n };\r\n }\r\n }\r\n } else {\r\n row.isExpand = !row.isExpand;\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Toggle side menu tab (close if same tab clicked)\r\ntoggleDetailSideMenu(row: any, tab: 'cols' | 'filtrs') {\r\n if (!row.details.sideMenu) {\r\n row.details.sideMenu = { currentTab: null, columnSearch: '' };\r\n if (!row.details.filters) row.details.filters = {};\r\n }\r\n const sm = row.details.sideMenu;\r\n sm.currentTab = sm.currentTab === tab ? null : tab;\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Column visibility change\r\nonDetailColumnVisibilityChange(row: any) {\r\n this.cdr.detectChanges();\r\n}\r\n\r\n// Apply filter to detail data\r\napplyDetailRowFilter(row: any) {\r\n const filters = row.details.filters || {};\r\n row.details.data = row.details.originalData.filter((item: any) => {\r\n return Object.keys(filters).every(field => {\r\n const config = filters[field] || {};\r\n const term = (config.value || '').toLowerCase();\r\n if (!term) return true;\r\n const value = String(this.getNestedValue(item, field) || '').toLowerCase();\r\n const condition = config.condition || 'contain';\r\n switch (condition) {\r\n case 'equal': return value === term;\r\n case 'start': return value.startsWith(term);\r\n case 'end': return value.endsWith(term);\r\n default: return value.includes(term);\r\n }\r\n });\r\n });\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\n\r\nonResizeDetailColumn(event: MouseEvent, row: any, col: any): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const startX = event.clientX;\r\n const initialWidth = col.width || 150;\r\n\r\n // Find all matching header and data cells in this detail table\r\n const headerCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] th[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n const dataCells = Array.from(\r\n document.querySelectorAll(`[data-detail-row-id=\"${row._id || row.id}\"] td[field=\"${col.field}\"]`)\r\n ) as HTMLElement[];\r\n\r\n const allCells = [...headerCells, ...dataCells];\r\n\r\n // Optional: highlight during resize\r\n allCells.forEach(el => el.classList.add('resizing-highlight'));\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const deltaX = moveEvent.clientX - startX;\r\n let newWidth = initialWidth + deltaX;\r\n if (newWidth < 80) newWidth = 80; // min width\r\n\r\n // Apply to DOM\r\n allCells.forEach(el => {\r\n el.style.width = `${newWidth}px`;\r\n el.style.minWidth = `${newWidth}px`;\r\n });\r\n\r\n // Update model\r\n col.width = newWidth;\r\n };\r\n\r\n const onMouseUp = () => {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('mouseup', onMouseUp);\r\n allCells.forEach(el => el.classList.remove('resizing-highlight'));\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('mouseup', onMouseUp);\r\n}\r\n\r\n// In your component\r\ngetDetailViewportHeight(row: any): number {\r\n const rowCount = row.details?.data?.length || 0;\r\n const rowHeight = this.nestedTablerowHeight || 40;\r\n const maxHeight = 350;\r\n return Math.min(rowCount * rowHeight, maxHeight);\r\n}\r\n\r\n\r\n\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = target.scrollTop;\r\n// if (right) right.scrollTop = target.scrollTop;\r\n// }\r\n\r\nonDetailLeftScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (right) right.scrollTop = target.scrollTop;\r\n}\r\n\r\nonDetailRightScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) viewport.scrollTop = target.scrollTop;\r\n if (left) left.scrollTop = target.scrollTop;\r\n}\r\n\r\n\r\n\r\n\r\n// NEW: Sync vertical scroll from body → header (so header moves down with data)\r\n// onDetailCenterScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n\r\n// // Sync vertical scroll to left/right sections\r\n// const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (left) left.scrollTop = scrollTop;\r\n// if (right) right.scrollTop = scrollTop;\r\n\r\n// // ✅ Sync vertical scroll to HEADER (so it scrolls down with data)\r\n// const headerTable = document.querySelector(`.accordion-center-section table[style*=\"table-layout\"]`) as HTMLElement;\r\n// if (headerTable) {\r\n// headerTable.scrollTop = scrollTop;\r\n// }\r\n// }\r\n\r\n// Optional: Handle header scroll (rarely needed, but safe)\r\n// onDetailHeaderScroll(event: Event, row: any) {\r\n// const target = event.target as HTMLElement;\r\n// const scrollTop = target.scrollTop;\r\n// const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n// if (viewport) viewport.scrollTop = scrollTop;\r\n// }\r\n\r\n\r\n// Sync: Body scroll → Header scroll (vertical)\r\nonDetailCenterScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n // Sync vertical scroll to LEFT/RIGHT sections\r\n const left = document.querySelector(`.accordion-left-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n const right = document.querySelector(`.accordion-right-section[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (left) left.scrollTop = scrollTop;\r\n if (right) right.scrollTop = scrollTop;\r\n\r\n // ✅ NEW: Sync vertical scroll to HEADER\r\n const headerScrollContainer = document.querySelector(`.detail-header-scroll-container[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (headerScrollContainer) {\r\n headerScrollContainer.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Sync: Header scroll → Body scroll (in case user scrolls header manually)\r\nonDetailHeaderScroll(event: Event, row: any) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n const viewport = document.querySelector(`.detail-virtual-scroll[data-detail-row-id=\"${row._id || row.id}\"]`) as HTMLElement;\r\n if (viewport) {\r\n viewport.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n@ViewChild('headerContainer', { static: false }) headerContainer: ElementRef<HTMLDivElement> | null = null;\r\n@ViewChild('dataContainer', { static: false }) dataContainer!: CdkVirtualScrollViewport;\r\n\r\nsyncScroll(event: Event) {\r\n if (!this.headerContainer || !this.dataContainer) return;\r\n\r\n const target = event.target as HTMLElement;\r\n const dataEl = this.dataContainer.elementRef.nativeElement as HTMLElement;\r\n const headerEl = this.headerContainer.nativeElement;\r\n\r\n if (target === headerEl) {\r\n dataEl.scrollLeft = headerEl.scrollLeft;\r\n } else if (target === dataEl) {\r\n headerEl.scrollLeft = dataEl.scrollLeft;\r\n }\r\n }\r\n\r\n\r\n // @ViewChild('dataContainer') dataContainer!: CdkVirtualScrollViewport;\r\n@ViewChild('leftContainer') leftContainer!: ElementRef<HTMLDivElement>;\r\n@ViewChild('rightContainer') rightContainer!: ElementRef<HTMLDivElement>;\r\n\r\nsyncVerticalScroll(event: Event) {\r\n const target = event.target as HTMLElement;\r\n const scrollTop = target.scrollTop;\r\n\r\n if (this.leftContainer) {\r\n this.leftContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n if (this.rightContainer) {\r\n this.rightContainer.nativeElement.scrollTop = scrollTop;\r\n }\r\n}\r\n\r\n// Map: detailRowId → selection state\r\n// detailSelectionState = new Map<string, {\r\n// selectedCells: CellPosition[];\r\n// selectedKeys: Set<string>;\r\n// rowSelectedIndexes: Set<number>;\r\n// undoStack: any[][];\r\n// redoStack: any[][];\r\n// }>();\r\n\r\nprivate getDetailRowId(row: any): string {\r\n return row._id || row.id;\r\n}\r\n\r\n\r\nstartDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n event.preventDefault();\r\n this.isDetailDragging = false;\r\n\r\n this.clearOtherDetailSections(detailRow, section);\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n state.selectedCells = [{ rowIndex, colIndex: globalColIndex, subColIndex: 0, field, key }];\r\n state.selectedKeys.clear();\r\n state.selectedKeys.add(key);\r\n\r\n const mouseMove = () => {\r\n this.isDetailDragging = true;\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mousemove', mouseMove);\r\n\r\n const mouseUp = () => {\r\n document.removeEventListener('mouseup', mouseUp);\r\n document.removeEventListener('mousemove', mouseMove);\r\n };\r\n document.addEventListener('mouseup', mouseUp);\r\n}\r\n\r\n\r\nextendDetailSelection(\r\n detailRow: any,\r\n rowIndex: number,\r\n globalColIndex: number,\r\n field: string,\r\n event: MouseEvent,\r\n section: 'left' | 'center' | 'right'\r\n) {\r\n if (!this.isDetailDragging) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const start = state.selectedCells[0];\r\n const minRow = Math.min(start.rowIndex, rowIndex);\r\n const maxRow = Math.max(start.rowIndex, rowIndex);\r\n const minCol = Math.min(start.colIndex, globalColIndex);\r\n const maxCol = Math.max(start.colIndex, globalColIndex);\r\n\r\n const newKeys = new Set<string>();\r\n const newCells: CellPosition[] = [];\r\n\r\n // Use FULL columns, but filter by section visibility\r\n const allColumns = detailRow.details.columns;\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const col = allColumns[c];\r\n if (!col) continue;\r\n\r\n // Check if this column belongs to the current section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (inSection && col.is_visible !== false) {\r\n const k = `${r}-${c}-${col.field}`;\r\n newKeys.add(k);\r\n newCells.push({\r\n rowIndex: r,\r\n colIndex: c, // ✅ Keep global index\r\n subColIndex: 0,\r\n field: col.field,\r\n key: k\r\n });\r\n }\r\n }\r\n }\r\n\r\n state.selectedKeys = newKeys;\r\n state.selectedCells = newCells;\r\n}\r\n\r\nprivate getSectionColumns(row: any, section: 'left' | 'center' | 'right') {\r\n if (section === 'left') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'left');\r\n } else if (section === 'right') {\r\n return row.details.columns.filter((col: any) => col.pinned === 'right');\r\n } else {\r\n return row.details.columns.filter((col: any) => !col.pinned);\r\n }\r\n}\r\n\r\nisDetailCellSelected(detailRow: any, rowIndex: number, globalColIndex: number, field: string, section: 'left' | 'center' | 'right'): boolean {\r\n const col = detailRow.details.columns[globalColIndex];\r\n if (!col) return false;\r\n\r\n // Verify column belongs to section\r\n let inSection = false;\r\n if (section === 'left') {\r\n inSection = col.pinned === 'left';\r\n } else if (section === 'right') {\r\n inSection = col.pinned === 'right';\r\n } else {\r\n inSection = !col.pinned;\r\n }\r\n\r\n if (!inSection || col.is_visible === false) return false;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n const key = `${rowIndex}-${globalColIndex}-${field}`;\r\n return state.selectedKeys.has(key);\r\n}\r\n\r\n\r\ngetSelectedDetailData(detailRow: any, section: 'left' | 'center' | 'right'): any[][] {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return [];\r\n\r\n const dataMap = new Map<number, any[]>();\r\n for (const cell of state.selectedCells) {\r\n if (!dataMap.has(cell.rowIndex)) {\r\n dataMap.set(cell.rowIndex, []);\r\n }\r\n const value = this.getNestedValue(detailRow.details.data[cell.rowIndex], cell.field);\r\n\r\n // Find LOCAL index in section for paste alignment\r\n const allColumns = detailRow.details.columns;\r\n let localIndex = 0;\r\n for (let i = 0; i < cell.colIndex; i++) {\r\n const col = allColumns[i];\r\n if (!col) continue;\r\n let inSection = false;\r\n if (section === 'left') inSection = col.pinned === 'left';\r\n else if (section === 'right') inSection = col.pinned === 'right';\r\n else inSection = !col.pinned;\r\n\r\n if (inSection && col.is_visible !== false) {\r\n localIndex++;\r\n }\r\n }\r\n dataMap.get(cell.rowIndex)![localIndex] = value ?? '';\r\n }\r\n\r\n return Array.from(dataMap.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(entry => entry[1]);\r\n}\r\n\r\n\r\nprivate isAnyDetailFocused(): boolean {\r\n return !!document.querySelector('.detail-virtual-scroll .selected-cell');\r\n}\r\n\r\nprivate handleDetailShortcuts(event: KeyboardEvent, detailRow: any, section: 'left' | 'center' | 'right') {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'x') {\r\n event.preventDefault();\r\n const data = this.getSelectedDetailData(detailRow, section);\r\n this.copyService.copyToClipboard(data);\r\n this.performDetailCut(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'v') {\r\n event.preventDefault();\r\n this.performDetailPaste(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') {\r\n event.preventDefault();\r\n this.detailUndo(detailRow, section);\r\n }\r\n else if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') {\r\n event.preventDefault();\r\n this.detailRedo(detailRow, section);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\nperformDetailCut(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n state.redoStack = [];\r\n\r\n for (const cell of state.selectedCells) {\r\n const dataRow = detailRow.details.data[cell.rowIndex];\r\n this.setNestedValue(dataRow, { field: cell.field }, null, false);\r\n }\r\n this.cdr.detectChanges();\r\n}\r\n\r\nasync performDetailPaste(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const text = await navigator.clipboard.readText();\r\n if (!text) return;\r\n\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.selectedCells.length === 0) return;\r\n\r\n const startCell = state.selectedCells[0];\r\n const rows = text.split('\\n').map(r => r.split('\\t'));\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n const rIdx = startCell.rowIndex + i;\r\n if (rIdx >= detailRow.details.data.length) break;\r\n const dataRow = detailRow.details.data[rIdx];\r\n for (let j = 0; j < rows[i].length; j++) {\r\n const cIdx = startCell.colIndex + j;\r\n const columns = this.getSectionColumns(detailRow, section);\r\n if (cIdx >= columns.length) break;\r\n const col = columns[cIdx];\r\n if (col?.is_visible !== false) {\r\n this.setNestedValue(dataRow, { field: col.field }, rows[i][j], false);\r\n }\r\n }\r\n }\r\n\r\n // ✅ Fix breaks/short_breaks after paste\r\n detailRow.details.data.forEach((row: any) => {\r\n if (!Array.isArray(row.breaks)) row.breaks = [];\r\n if (row.short_breaks && typeof row.short_breaks === 'string') {\r\n row.short_breaks = { duration: 0, type: 'none' };\r\n }\r\n });\r\n\r\n this.cdr.detectChanges();\r\n}\r\n\r\n\r\ndetailUndo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.undoStack.length === 0) return;\r\n\r\n state.redoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.undoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\ndetailRedo(detailRow: any, section: 'left' | 'center' | 'right') {\r\n const state = this.getDetailSelectionState(detailRow, section);\r\n if (!state || state.redoStack.length === 0) return;\r\n\r\n state.undoStack.push(this.cloneData(detailRow.details.data));\r\n detailRow.details.data = this.cloneData(state.redoStack.pop()!);\r\n this.cdr.detectChanges();\r\n}\r\n\r\nprivate isDetailDragging = false;\r\n\r\n\r\n// Map: detailRowId → section → selection state\r\n// Map: detailRowId → section → selection state\r\ndetailSelectionState = new Map<string, Map<string, {\r\n selectedCells: CellPosition[];\r\n selectedKeys: Set<string>;\r\n undoStack: any[][];\r\n redoStack: any[][];\r\n}>>();\r\n\r\nprivate getDetailSelectionState(row: any, section: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(row);\r\n let rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) {\r\n rowMap = new Map();\r\n this.detailSelectionState.set(rowId, rowMap);\r\n }\r\n let state = rowMap.get(section);\r\n if (!state) {\r\n state = {\r\n selectedCells: [],\r\n selectedKeys: new Set(),\r\n undoStack: [],\r\n redoStack: []\r\n };\r\n rowMap.set(section, state);\r\n }\r\n return state;\r\n}\r\n\r\n\r\nprivate findFocusedDetailRowAndSection(): { row: any; section: 'left' | 'center' | 'right' } | null {\r\n const left = document.querySelector('.accordion-left-section .selected-cell');\r\n const center = document.querySelector('.detail-virtual-scroll .selected-cell');\r\n const right = document.querySelector('.accordion-right-section .selected-cell');\r\n\r\n const getRow = (el: Element | null) => {\r\n if (!el) return null;\r\n const rowId = el.closest('[data-detail-row-id]')?.getAttribute('data-detail-row-id');\r\n return this.visibleRows.find((r: any) => (r._id || r.id) === rowId);\r\n };\r\n\r\n if (left) return { row: getRow(left), section: 'left' };\r\n if (center) return { row: getRow(center), section: 'center' };\r\n if (right) return { row: getRow(right), section: 'right' };\r\n return null;\r\n}\r\n\r\nprivate clearOtherDetailSections(currentRow: any, currentSection: 'left' | 'center' | 'right') {\r\n const rowId = this.getDetailRowId(currentRow);\r\n const rowMap = this.detailSelectionState.get(rowId);\r\n if (!rowMap) return;\r\n\r\n // Clear the two sections that are NOT currentSection\r\n const sections: ('left' | 'center' | 'right')[] = ['left', 'center', 'right'];\r\n for (const section of sections) {\r\n if (section !== currentSection) {\r\n const state = rowMap.get(section);\r\n if (state) {\r\n state.selectedCells = [];\r\n state.selectedKeys.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Getter to check if any accordion is open\r\nget hasOpenAccordion(): boolean {\r\n return this.dataSet.some(row => row.isDetailsExpand);\r\n}\r\n\r\n// getFirstTwoWords(name: string): string {\r\n// if (!name) return '';\r\n// const words = name.trim().split(/\\s+/);\r\n// return words.slice(0, 2).join(' ').toUpperCase();\r\n// }\r\n\r\n selectRange(range: Date[], drp: BsDaterangepickerDirective) {\r\n this.bsRangeValue = range;\r\n // Auto-apply when selecting from predefined ranges\r\n // Determine if it's a single day selection for predefined ranges\r\n const isSingleDaySelected = range.length === 2 &&\r\n range[0] && range[1] &&\r\n range[0].getTime() === range[1].getTime();\r\n\r\n // Emit event with selected range and single day flag\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: range,\r\n isSingleDay: isSingleDaySelected\r\n }\r\n };\r\n console.log('Predefined Range Selected Event:', eventData);\r\n this.genericEvent.emit(eventData);\r\n\r\n drp.hide();\r\n }\r\n\r\n onClear(drp: BsDaterangepickerDirective) {\r\n this.bsRangeValue = [];\r\n drp.hide();\r\n }\r\n\r\n onApply(drp: BsDaterangepickerDirective) {\r\n // Determine if it's a single day selection\r\n const isSingleDaySelected = this.bsRangeValue.length === 2 &&\r\n this.bsRangeValue[0] && this.bsRangeValue[1] &&\r\n this.bsRangeValue[0].getTime() === this.bsRangeValue[1].getTime();\r\n\r\n // Emit event with selected range and single day flag\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: this.bsRangeValue,\r\n isSingleDay: isSingleDaySelected\r\n }\r\n };\r\n console.log('Date Range Selected Event:', eventData);\r\n this.genericEvent.emit(eventData);\r\n\r\n drp.hide();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n // @Output() genericEvent = new EventEmitter<any>();\r\n bsRangeValue: Date[] = []; // Empty by default\r\n showPicker = false;\r\n bsConfig: Partial<BsDaterangepickerConfig> = {\r\n adaptivePosition: true,\r\n rangeInputFormat: 'DD/MM/YYYY',\r\n showWeekNumbers: false,\r\n containerClass: 'theme-default',\r\n ranges: this.getCustomRanges(), // Updated with new range\r\n showClearButton: true, // Attempts to show clear (using external button)\r\n returnFocusToInput: true,\r\n displayMonths: 2 // Show two months\r\n };\r\n\r\n // Define custom ranges including new \"Last 30 Days\"\r\n private getCustomRanges() {\r\n const today = new Date();\r\n const yesterday = new Date(today);\r\n yesterday.setDate(today.getDate() - 1);\r\n\r\n const last7DaysStart = new Date(today);\r\n last7DaysStart.setDate(today.getDate() - 7);\r\n\r\n const last30DaysStart = new Date(today);\r\n last30DaysStart.setDate(today.getDate() - 30);\r\n\r\n const thisMonthStart = new Date(today.getFullYear(), today.getMonth(), 1);\r\n const thisMonthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0);\r\n\r\n const lastMonthEnd = new Date(today.getFullYear(), today.getMonth(), 0);\r\n const lastMonthStart = new Date(today.getFullYear(), today.getMonth() - 1, 1);\r\n\r\n const last3MonthsStart = new Date(today);\r\n last3MonthsStart.setMonth(today.getMonth() - 3);\r\n\r\n const thisYearStart = new Date(today.getFullYear(), 0, 1);\r\n const thisYearEnd = new Date(today.getFullYear(), 11, 31);\r\n\r\n return [\r\n {\r\n value: [yesterday, yesterday],\r\n label: 'Yesterday'\r\n },\r\n {\r\n value: [last7DaysStart, yesterday],\r\n label: 'Last 7 Days'\r\n },\r\n {\r\n value: [last30DaysStart, yesterday],\r\n label: 'Last 30 Days'\r\n },\r\n {\r\n value: [thisMonthStart, thisMonthEnd],\r\n label: 'This Month'\r\n },\r\n {\r\n value: [lastMonthStart, lastMonthEnd],\r\n label: 'Last Month'\r\n },\r\n {\r\n value: [last3MonthsStart, yesterday],\r\n label: 'Last 3 Months'\r\n },\r\n {\r\n value: [thisYearStart, thisYearEnd],\r\n label: 'This Year'\r\n }\r\n ];\r\n }\r\n\r\n // Handle range change when Apply is clicked\r\n onRangeChange(value: Date[]) {\r\n this.bsRangeValue = value;\r\n const event = {\r\n obj: { dateRange: value || [] },\r\n eventType: 'dateRangeChange'\r\n };\r\n this.genericEvent.emit(event); // Emit event to trigger updates (e.g., filter)\r\n }\r\n\r\n // Clear the selected range\r\n clearDateRange() {\r\n this.bsRangeValue = []; // Clear the model\r\n const event = {\r\n obj: { dateRange: [] },\r\n eventType: 'dateRangeChange'\r\n };\r\n this.genericEvent.emit(event); // Emit event to reset filters\r\n }\r\n\r\n // Toggle picker\r\n togglePicker(picker: BsDaterangepickerDirective) {\r\n this.showPicker = !this.showPicker;\r\n this.showPicker ? picker.show() : picker.hide();\r\n }\r\n\r\n\r\nonRangeSelected(range: (Date | undefined)[] | undefined, picker: BsDaterangepickerDirective) {\r\n\r\n if (!range || range.length !== 2 || !range[0] || !range[1]) {\r\n\r\n return;\r\n }\r\n\r\n const isSingleDay = range[0].getTime() === range[1].getTime();\r\n const eventData = {\r\n eventType: 'dateRangeSelected',\r\n data: {\r\n range: [range[0], range[1]],\r\n isSingleDay\r\n }\r\n };\r\n this.genericEvent.emit(eventData);\r\n picker.hide(); \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\r\n// }\r\n\r\n","<div class=\"position-relative h-100\">\r\n <div\r\n class=\"d-flex justify-content-between mb-3 align-items-center position-relative\"\r\n >\r\n <div class=\"col-4 global-search\">\r\n\r\n <span\r\n\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 style=\"height: 36px\"\r\n class=\"form-control\"\r\n placeholder=\"Search all columns and press Enter\"\r\n [(ngModel)]=\"tableSearch\"\r\n (keydown.enter)=\"onGlobalSearch()\"\r\n type=\"search\"\r\n />\r\n <div class=\"row\">\r\n<div class=\"col-xs-12 col-12 col-md-4 form-group mb-3\">\r\n\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n style=\"display: none\"\r\n placeholder=\"Select date range\"\r\n bsDaterangepicker\r\n #picker=\"bsDaterangepicker\"\r\n [(ngModel)]=\"bsRangeValue\"\r\n [bsConfig]=\"bsConfig\"\r\n readonly\r\n (bsValueChange)=\"onRangeSelected($event, picker)\"\r\n/>\r\n <!-- ✅ NEW: Apply & Clear buttons -->\r\n <!-- <div class=\"mt-2 d-flex gap-2\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"onApply(picker)\" [disabled]=\"!bsRangeValue.length\">\r\n Apply\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"clearDateRange()\">\r\n Clear\r\n </button>\r\n </div> -->\r\n</div>\r\n <!-- <p class=\"mt-2 small text-muted\">\r\n Selected:\r\n {{ bsRangeValue[0] ? (bsRangeValue[0] | date: 'mediumDate') : 'None' }}\r\n –\r\n {{ bsRangeValue[1] ? (bsRangeValue[1] | date: 'mediumDate') : 'None' }}\r\n <button\r\n class=\"btn btn-sm btn-link text-danger ms-2\"\r\n (click)=\"clearDateRange()\"\r\n *ngIf=\"bsRangeValue.length > 0\"\r\n >\r\n Clear\r\n </button>\r\n </p> -->\r\n</div>\r\n </div>\r\n <div class=\"d-flex gap-2 align-items-center table-right-top-actions\">\r\n <div\r\n *ngIf=\"!showFilterRow\"\r\n class=\"cursor-pointer position-relative\"\r\n (click)=\"toggleOpenFilter()\"\r\n [class.active]=\"showFilters\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon top-icon me-2\"\r\n ></span>\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: 2px;\r\n top: 2px;\r\n \"\r\n class=\"rounded-circle d-block\"\r\n ></span>\r\n </div>\r\n <div\r\n class=\"cursor-pointer\"\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\"\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\r\n <div\r\n *ngIf=\"activeTopButton === 'setting'\"\r\n class=\"actions-dropdown mt-1 actions-dropdown-setting\"\r\n >\r\n <div class=\"dropdown-menu show shadow custom-menu\">\r\n <!-- Table Layout -->\r\n <a\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n (click)=\"$event.stopPropagation(); toggleActions('table-layout')\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/table-2.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Layout</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n <!-- Table Presets -->\r\n <a\r\n (click)=\"$event.stopPropagation(); toggleActions('table-presets')\"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/list-details.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Table Presets</span\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </a>\r\n\r\n <!-- Columns -->\r\n <a\r\n *ngIf=\"!showSideMenu\"\r\n (click)=\"\r\n $event.stopPropagation(); toggleActions('show-hide-columns')\r\n \"\r\n class=\"dropdown-item d-flex justify-content-between align-items-center cursor-pointer\"\r\n >\r\n <span\r\n ><span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Columns</span\r\n >\r\n <div class=\"d-flex gap-2\">\r\n <span class=\"muted-text\">{{ columnsCount }}</span>\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"dropdown-divider\"></div>\r\n\r\n <!-- Filter -->\r\n <a class=\"dropdown-item\">\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 class=\"dropdown-item\" (click)=\"downloadCsv()\">\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 Download as CSV\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 ></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 ></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 ></div>\r\n </ng-container>\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 *ngIf=\"activeFilteredColumns?.length\">\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 >\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 class=\"d-flex gap-2 align-items-center\">\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 <ng-container\r\n *ngFor=\"\r\n let child of groupedColumns;\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 groupedColumns.length > 1 && i != groupedColumns.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"icon-container position-absolute end-0 me-2\" (click)=\"togglePicker(picker)\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/calendar.svg'\"\r\n class=\"data-grid-svg-icon top-icon\"\r\n ></span>\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 class=\"data-grid-header left-pinned\" #leftPinnedHeader>\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]=\"65\"\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 ></div>\r\n <div\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n class=\"select-all-checkbox-cell border-below\"\r\n [style.height.px]=\"\r\n showColumnsGrouping && showFilterRow\r\n ? headerRowHeight * 3\r\n : showColumnsGrouping || showFilterRow\r\n ? headerRowHeight * 2\r\n : headerRowHeight\r\n \"\r\n >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [indeterminate]=\"isIndeterminateState(dataSet)\"\r\n [checked]=\"isAllSelected(dataSet)\"\r\n (change)=\"toggleSelectAll(dataSet)\"\r\n />\r\n </div>\r\n <div\r\n 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: 0.2px\"\r\n [style.background-color]=\"headerBackgroundColor\"\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 [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)=\"onCenterHeaderScroll($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)=\"openThreeDotsMenu($event, 'group')\"\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)=\"onResizeGroupBox($event)\"\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 === 'TimeSheet'\"\r\n >\r\n </span>\r\n <div\r\n class=\"dragable-header\"\r\n (cdkDragStarted)=\"\r\n checkColumnGroupingStatus(col); dragStartOnGroup(col)\r\n \"\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 [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: 'centerColumns'\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 *ngIf=\"child?.isGroupable\">\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?.isGroupable\">\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 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: 'previewRightPinnedColumns'\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 [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: 'centerColumns'\r\n }\r\n \"\r\n ></div>\r\n </div>\r\n <div\r\n *ngIf=\"draggingInGroupArea\"\r\n class=\"d-flex gap-2 ms-2\"\r\n style=\"opacity: 0.6\"\r\n >\r\n <ng-container *ngIf=\"col?.children?.length; else singleCol\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n let i = index;\r\n trackBy: trackById\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: child,\r\n showChevron:\r\n col.children.length > 1 &&\r\n i != col.children.length - 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #singleCol>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n topGroupingRowPlaceholder;\r\n context: {\r\n $implicit: col,\r\n showChevron: col?.children?.length > 1\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!-- Data Grid Body starts here -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <!--########################################################################################################################################################################################################################### -->\r\n <div\r\n class=\"h-100 d-flex justify-content-center align-items-center\"\r\n *ngIf=\"!dataSet.length && !loading\"\r\n >\r\n No Record Found\r\n </div>\r\n\r\n <div\r\n class=\"position-absolute w-100 h-100 d-flex justify-content-center align-items-center loading-overlay\"\r\n *ngIf=\"loading\"\r\n style=\"\r\n z-index: 999;\r\n background: rgba(255, 255, 255, 0.8);\r\n backdrop-filter: blur(1px);\r\n \"\r\n >\r\n <div *ngIf=\"loadingMore && enableInfiniteScroll\" class=\"text-center p-2\" [style.height.px]=\"rowHeight\">\r\n <div class=\"spinner-border text-primary\" role=\"status\"></div> Loading more...\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 *ngIf=\"dataSet.length\"\r\n >\r\n <!-- LEFT PINNED -->\r\n <div [style.height.px]=\"!groupedColumns.length ? originalDataSet.length * rowHeight: 0\"></div>\r\n <div [class.h-100]=\"originalDataSet.length <= 10\">\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]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\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 }\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=\"\"\r\n [style.width.px]=\"centerPinnedHeader.clientWidth\"\r\n >\r\n <div\r\n class=\"data-grid-body center-scrollable\"\r\n\r\n style=\"overflow-y: hidden; overflow-x: auto\"\r\n [style.transform]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.backgroundColor]=\"bodyBackgroundColor\"\r\n #centerScrollableBody\r\n (scroll)=\"onCenterBodyScroll($event)\"\r\n [style.boxShadow]=\"leftPinnedBoxshadow\"\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: previewCenterColumns,\r\n isEven: (startIndex + i) % 2 === 0,\r\n isOdd: (startIndex + i) % 2 !== 0,\r\n section: 'center'\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 <= 10\"\r\n [style.max-width.px]=\"isScrollbarVisible ? rightPinnedHeader.offsetWidth - 15: rightPinnedHeader.offsetWidth\"\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]=\"\r\n 'translateY(' + startIndex * rowHeight + 'px)'\r\n \"\r\n [style.boxShadow]=\"rightPinnedBoxshadow\"\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 }\r\n \"\r\n ></ng-container>\r\n </ng-container>\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 * (paginationConfig.totalResults || flattenedData.length) + (hasMoreData ? 1000 : 0)\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Horizintal Fake Scrollbars -->\r\n <div class=\"d-flex justify-content-between\" *ngIf=\"dataSet.length\">\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)=\"onHorizintalFakeScroll($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\"></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 && !hasOpenAccordion\"\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-white]=\"\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-white]=\"\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 [style.height.px]=\"footerRowHeight\" class=\"border-top\">\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: {{ paginationConfig.page }}-{{\r\n paginationConfig.page * paginationConfig.limit\r\n }}\r\n of\r\n {{ paginationConfig.totalResults }}\r\n </div>\r\n\r\n <div class=\"page-buttons\">\r\n <button\r\n (click)=\"goToPage(paginationConfig.page - 1)\"\r\n [disabled]=\"paginationConfig.page === 1\"\r\n >\r\n ‹\r\n </button>\r\n\r\n <ng-container *ngFor=\"let page of visiblePages\">\r\n <button\r\n *ngIf=\"page !== '...'\"\r\n (click)=\"goToPage(page)\"\r\n [class.active]=\"page === paginationConfig.page\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span *ngIf=\"page === '...'\">...</span>\r\n </ng-container>\r\n\r\n <button\r\n (click)=\"goToPage(paginationConfig.page + 1)\"\r\n [disabled]=\"paginationConfig.page === paginationConfig.totalResults\"\r\n >\r\n ›\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- Header Cell Template -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n<!-- ------------------------------------------------------------------------------------------------------------------------ -->\r\n\r\n<ng-template\r\n #headerCell\r\n let-col\r\n let-pinnedRight=\"pinnedRight\"\r\n let-i=\"index\"\r\n let-sections=\"section\"\r\n let-calledFromNestedPlaceholder=\"calledFromNestedPlaceholder\"\r\n>\r\n <div>\r\n <!-- Group Header -->\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatHeader\">\r\n <div cdkDroplistGroup class=\"group-column-wrapper\">\r\n <!-- Parent Header -->\r\n <div\r\n *ngIf=\"shouldTheGroupHeaderShow(col)\"\r\n class=\"header-cell group-header\"\r\n [style.height.px]=\"headerRowHeight\"\r\n [style.min-height.px]=\"headerRowHeight\"\r\n [style.max-height.px]=\"headerRowHeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n [style.gridColumn]=\"'span ' + col.children.length\"\r\n [style.fontWeight]=\"headerFontWeight\"\r\n [class.flex-row-reverse]=\"pinnedRight\"\r\n [class.justify-content-end]=\"pinnedRight\"\r\n style=\"grid-row: 1\"\r\n >\r\n <div\r\n class=\"group-header-content\"\r\n [title]=\"col.header\"\r\n [class.ms-2]=\"pinnedRight\"\r\n >\r\n {{ col.header }}\r\n </div>\r\n <div\r\n class=\"resize-handle\"\r\n (dblclick)=\"autosizeColumn(col.children)\"\r\n (mousedown)=\"onResizeGroup($event, col, pinnedRight)\"\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 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)=\"openThreeDotsMenu($event, child); openFilteronThreeDotsClick(child)\"\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)=\"openThreeDotsMenu($event, child)\"\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 >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n columnMenu;\r\n context: { col: child }\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)=\"onResizeColumn($event, child)\"\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)]=\"col.filterValue\"\r\n (ngModelChange)=\"onFilterChange(col)\"\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 ><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.isGroupable && 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.isGroupable\">\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?.isGroupable\"\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 class=\"group-column-wrapper\">\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\"\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)=\"openThreeDotsMenu($event, col); openFilteronThreeDotsClick(col)\"\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 <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath +\r\n (sortingConfig?.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 mt-1\"\r\n ></span>\r\n </div>\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\"\r\n [style.left.px]=\"\r\n -(!col?.pinned ? centerPinnedHeader.scrollLeft : 0)\r\n \"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"columnMenu; context: { col: col }\"\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)=\"onResizeColumn($event, col)\"\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 />\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 ><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>\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 border-below d-flex align-items-center\"\r\n [style.height.px]=\"rowHeight\"\r\n [style.width]=\"\r\n section == 'center'\r\n ? centerScrollableBody!.nativeElement?.scrollWidth + '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]=\"65\"\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 >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\r\n style=\"width: 50px\"\r\n class=\"d-flex align-items-center justify-content-center h-100 border-right\"\r\n [style.backgroundColor]=\"checkboxesBackgroundColor\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.left-selection-border]=\"\r\n rowSelectedIndexes.has(row.__virtualIndex)\r\n \"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n >\r\n <input style=\"width: 16px; height: 16px\" type=\"checkbox\" />\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'center'\"\r\n [style.width.px]=\"centerPinnedHeader.scrollWidth\"\r\n class=\"d-flex align-items-center ps-2 h-100\"\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 * 16 : 0\"\r\n >\r\n <span class=\"me-2 filter-icon-wrapper\" (click)=\"toggleExpand(row)\">\r\n <span\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isExpand\r\n ? singleSpaAssetsPath + 'data-grid/icons/chevron-down.svg'\r\n : singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n ></span>\r\n </span>\r\n <strong (click)=\"toggleExpand(row)\" class=\"cursor-pointer\">\r\n {{ row.groupValue }} ({{ countLeafRows(row) }})\r\n </strong>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"section == 'right'\"\r\n [style.width.px]=\"rightPinnedHeader.offsetWidth\"\r\n [class.row-selected]=\"rowSelectedIndexes.has(row.__virtualIndex)\"\r\n [class.first-row-selected]=\"firstSelectedRow == row.__virtualIndex\"\r\n [class.last-row-selected]=\"lastSelectedRow == row.__virtualIndex\"\r\n ></div>\r\n </div>\r\n\r\n <!-- Recursive Children -->\r\n <div class=\"group-children\" *ngIf=\"row.isExpand\">\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 }\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 class=\"d-flex\" [style.height.px]=\"rowHeight\">\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=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'start' && !isSingleDay\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length && !isSingleDay\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\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':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\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':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\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]=\"65\"\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 >\r\n {{ row.__virtualIndex }}\r\n </div>\r\n <div\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\"\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 >\r\n <input\r\n *ngIf=\"hasAnyVisibleColumn\"\r\n type=\"checkbox\"\r\n [checked]=\"isRowSelected(row)\"\r\n (change)=\"toggleRowSelection(row)\"\r\n />\r\n </div>\r\n\r\n <!-- Render all columns -->\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns;\r\n trackBy: trackByField;\r\n let colIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.children?.length > 0; else flatColumn\">\r\n <ng-container\r\n *ngFor=\"\r\n let child of col.children;\r\n trackBy: trackByField;\r\n let subColIndex = index\r\n \"\r\n >\r\n <ng-container *ngIf=\"child?.is_visible && !child?.isRowGrouped\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n cellTemplate;\r\n context: {\r\n col: child,\r\n row: row,\r\n rowIndex: rowIndex,\r\n colIndex: colIndex,\r\n subColIndex: subColIndex,\r\n section: section\r\n }\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\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 }\r\n \"\r\n ></ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </div>\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=\"section == 'center' && gridType === 'TimeSheet' && detailsIconPosition === 'end' && !isSingleDay\"\r\n [ngStyle]=\"{\r\n 'background-color':\r\n hoveredRowId === (row._id || row.id)\r\n ? rowHoverColor\r\n : isRowSelected(row)\r\n ? checkedRowBackgroundColor\r\n : isEven\r\n ? evenRowsBackgroundColor\r\n : oddRowsBackgroundColor\r\n }\"\r\n >\r\n <span\r\n (click)=\"row.isDetailsExpand = !row.isDetailsExpand\"\r\n *ngIf=\"row?.details?.data?.length\"\r\n class=\"data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n row.isDetailsExpand\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 <!-- LEFT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'left' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" style=\"max-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\"></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n<!-- CENTER SECTION: Actual details table -->\r\n\r\n<div *ngIf=\"section === 'center' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details-wrapper data-grid-accordion\" [style.fontFamily]=\"fontFaimly\" [style.fontSize.px]=\"bodyTextFontsSize\" style=\"display: flex; width: 100%; max-height: 350px; overflow: hidden;\">\r\n <!-- LEFT SECTION OF ACCORDION -->\r\n <div #leftContainer class=\"accordion-left-section data-pin-body-wrapper data-grid-accordion-section\" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailLeftScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table table-sm mb-0 data-grid-accordion-table\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"nestedTableHeaderBAckgroundColor\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4 border-right\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'left'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'left')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'left')\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n [style.fontSize.px]=\"nestedTablerowFontsize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n {{ getNestedValue(d, col.field) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- CENTER SECTION OF ACCORDION (WITH VIRTUAL SCROLL) -->\r\n\r\n<div class=\"accordion-center-section data-grid-accordion-section\" style=\"flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden;\">\r\n <!-- Header Section -->\r\n <div class=\"header-container\" style=\"overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none;\" #headerContainer (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table table-sm mb-0 data-grid-accordion-table\" style=\"table-layout: fixed; width: 100%;\">\r\n <thead>\r\n <tr\r\n [style.height.px]=\"nestedTableHeaderRowHeight\"\r\n cdkDropList\r\n [cdkDropListData]=\"row?.details.columns\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"dropColumn($event, row)\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let i = index\">\r\n <th\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n cdkDrag\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.backgroundColor]=\"nestedTableHeaderBAckgroundColor\"\r\n style=\"cursor: move; position: relative;\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span>{{ col.header }}</span>\r\n <span\r\n class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n </div>\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\" [style.top.px]=\"nestedTableHeaderRowHeight\" [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n\r\n <!-- Group Badges (if any) -->\r\n <div *ngIf=\"row.details?.groupedColumns?.length\" class=\"detail-group-badges\">\r\n <span *ngFor=\"let g of row.details.groupedColumns; trackBy: trackByField\" class=\"badge bg-light text-dark me-1\">\r\n {{ g.header }}\r\n <span class=\"ms-1 cursor-pointer\" (click)=\"ungroupDetailColumn(g, row)\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/x.svg'\"></span>\r\n </span>\r\n </div>\r\n\r\n <!-- Data Table Section with Virtual Scroll -->\r\n <cdk-virtual-scroll-viewport\r\n itemSize=\"{{ nestedTablerowHeight }}\"\r\n minBufferPx=\"200\"\r\n maxBufferPx=\"400\"\r\n class=\"detail-virtual-scroll\"\r\n [attr.data-detail-row-id]=\"row._id || row.id\"\r\n style=\"flex: 1; overflow: auto;\"\r\n #dataContainer\r\n (scroll)=\"syncVerticalScroll($event)\"\r\n (scroll)=\"syncScroll($event)\">\r\n <table class=\"nested-table table table-sm mb-0 data-grid-accordion-table\" style=\"table-layout: fixed; width: 100%;\">\r\n <tbody>\r\n <tr\r\n class=\"cursor-pointer data-grid-accordion-row\"\r\n *cdkVirtualFor=\"let d of row.details.data; trackBy: trackById; let j = index\"\r\n [style.height.px]=\"nestedTablerowHeight\">\r\n <ng-container *ngFor=\"let col of row.details.columns; let k = index\">\r\n <td\r\n *ngIf=\"col.is_visible !== false && !col.pinned\"\r\n class=\"px-4\"\r\n (mousedown)=\"startDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, k, col.field, $event, 'center')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, k, col.field, 'center')\"\r\n [attr.field]=\"col.field\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\"\r\n style=\"cursor: pointer; position: relative; overflow: visible; cursor: cell; \">\r\n <div class=\"time-sheet-container\" style=\"overflow: visible; display: flex; gap: 4px; align-items: center; height: 100%;\">\r\n <ng-container *ngIf=\"col.field === 'breaks' || col.field === 'short_breaks'; else defaultDetailCell\">\r\n <ng-container *ngIf=\"col.field === 'breaks'\">\r\n <ng-container *ngIf=\"d[col.field]?.length; else noBreaks\">\r\n <div *ngFor=\"let breakItem of d[col.field]; let breakIndex = index\" class=\"circle-value\" [style.backgroundColor]=\"getBreakColor(breakItem.type)\" (mouseenter)=\"showCustomTooltip($event, breakItem, 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">\r\n {{ breakItem.duration }}m\r\n </div>\r\n </ng-container>\r\n <ng-template #noBreaks>\r\n <div class=\"circle-value\" (mouseenter)=\"showCustomTooltip($event, {duration: 0, type: 'none'}, 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">0m</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"col.field === 'short_breaks' && !isDetailEditing(row, d, col)\">\r\n <div *ngIf=\"d[col.field]?.duration; else noShortBreak\" class=\"circle-value\" [style.backgroundColor]=\"getBreakColor(d[col.field].type)\" (mouseenter)=\"showCustomTooltip($event, d[col.field], 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">\r\n {{ d[col.field].duration }}m\r\n </div>\r\n <ng-template #noShortBreak>\r\n <div class=\"circle-value\" (mouseenter)=\"showCustomTooltip($event, {duration: 0, type: 'none'}, 'single_break'); preventCustomTooltipHide()\" (mouseleave)=\"hideCustomTooltip()\">0m</div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <input #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" [attr.data-edit-key]=\"row._id + '-' + j + '-' + col.field\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto; position: absolute; top: 0; left: 0; z-index: 10;\" />\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultDetailCell>\r\n <span class=\"d-flex align-items-center h-100\">\r\n <ng-container *ngIf=\"!isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.field\">\r\n <div *ngSwitchCase=\"'is_un_restricted'\" class=\"d-flex justify-content-start flex-column pointer position-relative\" (mouseenter)=\"showRestrictionTooltip($event, row, d); preventRestrictionTooltipHide()\" (mouseleave)=\"hideRestrictionTooltip()\">\r\n <span class=\"popover__wrapper\" [class.restriction-indicator]=\"row.attendance_log_detail?.length > 0\">\r\n {{ d.is_un_restricted }}\r\n </span>\r\n </div>\r\n <div *ngSwitchCase=\"'manually_logs'\" class=\"d-flex justify-content-start align-items-center pointer position-relative\" (mouseenter)=\"row.logs?.length > 0 && showManualLogsTooltip($event, row, d); preventManualLogsTooltipHide()\" (mouseleave)=\"hideManualLogsTooltip()\">\r\n <ng-container *ngIf=\"row.logs?.length > 0; else noLogsIcon\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye.svg'\" class=\"data-grid-svg-icon text-primary\" style=\"cursor: pointer; font-size: 16px;\"></span>\r\n </ng-container>\r\n <ng-template #noLogsIcon>\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/eye-cross.svg'\" class=\"data-grid-svg-icon text-muted\" style=\"font-size: 16px; cursor: not-allowed;\"></span>\r\n </ng-template>\r\n </div>\r\n <span *ngSwitchDefault>{{ getNestedValue(d, col.field)?.value || getNestedValue(d, col.field)?.name || getNestedValue(d, col.field) || '-' }}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isDetailEditing(row, d, col)\">\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <input *ngSwitchCase=\"'string'\" #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'number'\" #detailInput type=\"number\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'date'\" #detailInput type=\"date\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'time'\" #detailInput type=\"time\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n <input *ngSwitchCase=\"'currency'\" #detailInput type=\"number\" step=\"0.01\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm text-end\" style=\"width: 100%; height: auto;\" />\r\n <select *ngSwitchCase=\"'dropdown'\" #detailInput [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\">\r\n <option *ngFor=\"let option of col.column_dropdown_value\" [ngValue]=\"option?.value || option\">\r\n {{ option?.label || option?.name || option }}\r\n </option>\r\n </select>\r\n <input *ngSwitchDefault #detailInput type=\"text\" [ngModel]=\"getNestedValue(d, col.field)\" (blur)=\"disableDetailEdits(row, d, col)\" (keydown.enter)=\"disableDetailEdits(row, d, col)\" (keydown.escape)=\"disableDetailEdits(row, d, col)\" class=\"form-control form-control-sm\" style=\"width: 100%; height: auto;\" />\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </cdk-virtual-scroll-viewport>\r\n</div>\r\n\r\n <!-- RIGHT SECTION OF ACCORDION -->\r\n <div #rightContainer class=\"accordion-right-section data-pin-body-wrapper \" [attr.data-detail-row-id]=\"row._id || row.id\" (scroll)=\"onDetailRightScroll($event, row)\" style=\"flex-shrink: 0; overflow-y: auto; overflow-x: hidden;\">\r\n <table class=\"nested-table table table-sm mb-0\" style=\"table-layout: fixed; width: auto;\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"nestedTableHeaderBAckgroundColor\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; trackBy: trackByField\">\r\n <th *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [style.width.px]=\"col.width || 150\"\r\n [style.min-width.px]=\"col.width || 150\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width: 100%;\">\r\n <span class=\"d-flex align-items-center gap-1\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/pin-blue.svg'\"\r\n class=\"data-grid-svg-icon d-flex justify-content-center align-items-center\"></span>\r\n {{ col.header }}\r\n </span>\r\n <span class=\"three-dots p-1\"\r\n (click)=\"openDetailThreeDotsMenus($event, col, row); activeDetailCol = col; activeDetailRow = row\"\r\n style=\"cursor: pointer;\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/three-dots-vertical.svg'\" class=\"data-grid-svg-icon\"></span>\r\n </span>\r\n</div>\r\n\r\n <div class=\"resize-handle\" (mousedown)=\"onResizeDetailColumn($event, row, col)\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/resize-handle.svg'\" class=\"data-grid-svg-icon text-primary\"></span>\r\n </div>\r\n <ng-container *ngIf=\"activeDetailCol?.field == col.field && activeDetailRow === row\">\r\n <div class=\"position-absolute detail-column-menu-wrapper\"\r\n [style.top.px]=\"nestedTableHeaderRowHeight\"\r\n [style.left.px]=\"0\">\r\n <ng-container *ngTemplateOutlet=\"detailColumnMenu; context: { col: col, row: row }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"rowHeight\" *ngFor=\"let d of row.details.data; let j = index; trackBy: trackById\">\r\n <ng-container *ngFor=\"let col of row.details.columns | pinnedColumns:'right'; let localK = index; trackBy: trackByField\">\r\n <td *ngIf=\"col.is_visible !== false\"\r\n class=\"px-4\"\r\n [attr.field]=\"col.field\"\r\n [attr.pinned]=\"col.pinned\"\r\n (mousedown)=\"startDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n (mouseenter)=\"extendDetailSelection(row, j, localK, col.field, $event, 'right')\"\r\n [class.selected-cell]=\"isDetailCellSelected(row, j, localK, col.field, 'right')\"\r\n [style.fontSize.px]=\"bodyTextFontsSize\"\r\n (dblclick)=\"enableDetailEdits(row, d, col)\"\r\n [class.active-cell-detail]=\"isActiveDetailCell(row, d, col)\">\r\n {{ getNestedValue(d, col.field) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</tbody>\r\n </table>\r\n\r\n </div>\r\n\r\n <!-- DETAIL SIDE MENU (Sticky on right end) -->\r\n <div class=\"detail-side-menu-wrapper\" >\r\n <div style=\"width: 30px\" class=\"d-flex flex-column align-items-center bg-light\">\r\n <div (click)=\"toggleDetailSideMenu(row, 'cols')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'cols'\" class=\"columns-button d-flex flex-column align-items-center border-below\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/ui-checks-grid.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Columns</div>\r\n </div>\r\n <div (click)=\"toggleDetailSideMenu(row, 'filtrs')\" [class.bg-white]=\"row.details.sideMenu?.currentTab === 'filtrs'\" class=\"columns-button d-flex flex-column align-items-center\">\r\n <span [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\" class=\"data-grid-svg-icon\"></span>\r\n <div class=\"side-menue-text\">Filter</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"row.details.sideMenu?.currentTab\" class=\"detail-side-menu-content\" [style.backgroundColor]=\"sidemenuBackgroundColor\" style=\"width: 250px; box-shadow: -2px 0 5px rgba(0,0,0,0.1);\">\r\n <!-- COLUMNS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'cols'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Columns</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"d-flex align-items-center mb-2\">\r\n <input type=\"checkbox\" class=\"form-check-input me-2\" [(ngModel)]=\"col.is_visible\" (change)=\"onDetailColumnVisibilityChange(row)\" />\r\n <span>{{ col.header }}</span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- FILTERS TAB -->\r\n <ng-container *ngIf=\"row.details.sideMenu.currentTab === 'filtrs'\">\r\n <div class=\"px-3 py-2 border-bottom d-flex align-items-center\">\r\n <strong class=\"me-auto\">Filters</strong>\r\n <input type=\"text\" class=\"form-control form-control-sm\" placeholder=\"Search...\" [(ngModel)]=\"row.details.sideMenu.columnSearch\" style=\"width: 120px; font-size: 12px;\" />\r\n </div>\r\n <div class=\"side-menu-scrollable\">\r\n <div *ngFor=\"let col of row.details.columns | filter: row.details.sideMenu.columnSearch:'header'; trackBy: trackByField\" class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center cursor-pointer\" (click)=\"col.expandedFilter = !col.expandedFilter\">\r\n <label class=\"mb-0 small\">{{ col.header }}</label>\r\n <span class=\"toggle-icon data-grid-svg-icon\" [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\" [class.rotate]=\"col.expandedFilter\"></span>\r\n </div>\r\n <div *ngIf=\"col.expandedFilter\" class=\"mt-2 filter-input-container ps-3 pe-3\">\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n row.details.filters[col.field]?._ids?.length == col.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllDetailFilters(col, row, $event)\"\r\n id=\"detail_selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_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 : col.searchValue : 'value';\r\n trackBy: trackById\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 row.details.filters[col.field]?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n (change)=\"onDetailOptionToggle(col, option, row)\"\r\n id=\"detail_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 'detail_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 </div>\r\n </ng-container>\r\n\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)]=\"row.details.filters[col.field].first_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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)]=\"row.details.filters[col.field].first_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n />\r\n\r\n <ng-container *ngIf=\"row.details.filters[col.field]?.first_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"and\"\r\n id=\"detail_and_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"or\"\r\n id=\"detail_or_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\r\n <input\r\n class=\"form-check-input filter-radio-inputs\"\r\n type=\"radio\"\r\n name=\"detail_condition_{{ col.field }}\"\r\n [(ngModel)]=\"row.details.filters[col.field].condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n value=\"none\"\r\n id=\"detail_none_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"detail_none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-2\">\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_condition\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\r\n >\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"row.details.filters[col.field].second_value\"\r\n (ngModelChange)=\"applyDetailRowFilter(row)\"\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 </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Side Menu -->\r\n\r\n\r\n\r\n<!-- Popover for Restriction Logs (is_un_restricted) -->\r\n<div\r\n *ngIf=\"restrictionTooltipVisible\"\r\n class=\"popover__content m-l-10 popoverRestriction position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"restrictionTooltipPosition.x\"\r\n [style.top.px]=\"restrictionTooltipPosition.y\"\r\n (mouseenter)=\"preventRestrictionTooltipHide()\"\r\n (mouseleave)=\"hideRestrictionTooltip()\"\r\n style=\"z-index: 1000; min-width: 300px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\">Clock in</th>\r\n <th class=\"center\">Clock out</th>\r\n <th class=\"center\">Log Hr</th>\r\n <th class=\"center\">Log Min</th>\r\n <th class=\"center pe-2\">Status</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of currentRestrictionLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\"> {{ item?.clock_in_time}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.clock_out_time}}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_hours }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ item?.logged_minutes }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ item?.status ? (item.status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Popover for Manual Logs -->\r\n<div\r\n *ngIf=\"manualLogsTooltipVisible\"\r\n class=\"popover__content position-absolute border rounded bg-white p-3\"\r\n [style.left.px]=\"manualLogsTooltipPosition.x\"\r\n [style.top.px]=\"manualLogsTooltipPosition.y\"\r\n (mouseenter)=\"preventManualLogsTooltipHide()\"\r\n (mouseleave)=\"hideManualLogsTooltip()\"\r\n style=\"z-index: 1000; min-width: 500px; font-size: 12px;\"\r\n>\r\n <div class=\"modal-area px-0 py-0\">\r\n <ng-container *ngIf=\"currentManualLogs.length > 0; else noManualLogs\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-row-primary-100 gs-0 gy-2 mb-0\">\r\n <thead>\r\n <tr class=\"fw-bolder text-muted bg-light\">\r\n <th class=\"center ps-2\" style=\"width: 18%;\">Name</th>\r\n <th class=\"center\">Date/Time</th>\r\n <th class=\"center\">Previous Time</th>\r\n <th class=\"center\">Updated Time</th>\r\n <th class=\"center\">Status</th>\r\n <th class=\"center pe-2\">Remarks</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let log of currentManualLogs\">\r\n <td class=\"center ps-2\">\r\n <span class=\"text-primary\">{{ log.name }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.date_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.previous_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"text-primary\">{{ log.updated_time }}</span>\r\n </td>\r\n <td class=\"center\">\r\n <span class=\"badge bg-light text-dark border\">\r\n {{ log.log_status ? (log.log_status | titlecase) : 'N/A' }}\r\n </span>\r\n </td>\r\n <td class=\"center pe-2\">\r\n <span class=\"text-primary\">{{ log.remarks }}</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-template #noManualLogs>\r\n <div class=\"text-center p-3\">\r\n <p class=\"text-muted mb-0\">No manual logs available for this record.</p>\r\n </div>\r\n </ng-template>\r\n</div>\r\n\r\n\r\n\r\n\r\n<!-- Existing Custom Tooltip for Breaks -->\r\n<div\r\n *ngIf=\"tooltipVisible\"\r\n class=\"custom-tooltip bg- border rounded-3 p-3\"\r\n [style.left.px]=\"tooltipPosition.x - 150\"\r\n [style.top.px]=\"tooltipPosition.y - 155\"\r\n (mouseenter)=\"preventCustomTooltipHide()\"\r\n (mouseleave)=\"hideCustomTooltip()\"\r\n (dblclick)=\"enableTooltipEdit()\"\r\n style=\"z-index: 1000; min-width: 280px; font-size: 12px;\"\r\n>\r\n <!-- Display mode -->\r\n <ng-container *ngIf=\"!tooltipEditing\">\r\n <div [innerHTML]=\"getTooltipContent(currentTooltipData, currentTooltipField || '')\"></div>\r\n </ng-container>\r\n\r\n <!-- Edit mode -->\r\n <ng-container *ngIf=\"tooltipEditing\">\r\n <div class=\"tooltip-edit-form\">\r\n <div class=\"mb-2\">\r\n <label class=\"form-label fw-semibold small mb-1\">Duration</label>\r\n <input\r\n type=\"number\"\r\n [(ngModel)]=\"tooltipMinutes\"\r\n (ngModelChange)=\"updateFormattedDuration()\"\r\n class=\"form-control form-control-sm\"\r\n />\r\n <div class=\"form-text text-muted small\">{{ formattedDuration }}</div>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label fw-semibold small mb-1\">Type</label>\r\n <select\r\n [(ngModel)]=\"currentTooltipData.type\"\r\n class=\"form-select form-select-sm\"\r\n >\r\n <option value=\"paid\">Paid</option>\r\n <option value=\"unpaid\">Unpaid</option>\r\n <option value=\"lunch\">Lunch</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button class=\"btn btn-sm btn-primary px-3\" (click)=\"saveTooltipEdit()\">💾 Save</button>\r\n <button class=\"btn btn-sm btn-light border px-3\" (click)=\"cancelTooltipEdit()\">✖ Cancel</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n\r\n\r\n\r\n <!-- RIGHT PINNED: Empty table to keep alignment -->\r\n <div *ngIf=\"section === 'right' && row.isDetailsExpand && !isSingleDay\" class=\"accordion-details data-grid-accordion-section\" style=\"max-height: 350px; overflow: hidden;\">\r\n <table class=\"nested-table table table-sm w-100 mb-0 data-grid-accordion-table\">\r\n <thead>\r\n <tr [style.height.px]=\"nestedTableHeaderRowHeight\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <th *ngFor=\"let _ of [1, 2, 3, 4, 5]\"> </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr [style.height.px]=\"nestedTablerowHeight\" *ngFor=\"let _ of row.details.data\" [style.backgroundColor]=\"headerBackgroundColor\">\r\n <td *ngFor=\"let __ of [1, 2, 3, 4, 5]\"> </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\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>\r\n <div\r\n (click)=\"disableEdit(row, col); setActiveCell(row, col)\"\r\n [style.fontWeight]=\"bodyFontWeight\"\r\n [class.border-right]=\"showVerticalBorder\"\r\n class=\"cell overflow-visible position-relative\"\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 [class.active-cell]=\"\r\n isActiveCell(row, col) && !isEditing(row, col) && selectedKeys.size == 1\r\n \"\r\n (dblclick)=\"$event.preventDefault(); enableEdit(row, col)\"\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=\"0\"\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 class=\"table-cell\" [class.active-for-editing]=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50\">\r\n <div\r\n (click)=\"$event.stopPropagation()\"\r\n *ngIf=\"isEditing(row, col) && getNestedValue(row, col.field)?.length <= 50; else viewMode\"\r\n >\r\n <ng-container [ngSwitch]=\"col.type\">\r\n <!-- Text Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 10\"\r\n *ngSwitchCase=\"'input'\"\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Number Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'number'\"\r\n #numberInput=\"ngModel\"\r\n #numberRef\r\n (keypress)=\"allowOnlyNumbers($event)\"\r\n type=\"number\"\r\n required\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n (keydown.enter)=\"numberRef.blur()\"\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': numberInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Date Input -->\r\n <input\r\n [style.height.px]=\"rowHeight - 8\"\r\n *ngSwitchCase=\"'date'\"\r\n type=\"date\"\r\n [(ngModel)]=\"row[col.field]\"\r\n (blur)=\"disableEdit(row, col)\"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n #dateInput=\"ngModel\"\r\n [ngClass]=\"{\r\n 'is-invalid': dateInput.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n\r\n <!-- Dropdown -->\r\n <!-- ng-select like dropdown -->\r\n <div\r\n *ngSwitchCase=\"'dropdown'\"\r\n class=\"dropdown w-100\"\r\n (blur)=\"disableEdit(row, col)\"\r\n >\r\n <!-- Trigger -->\r\n <button\r\n class=\"form-select form-select-sm text-start w-100 text-ellipsis\"\r\n type=\"button\"\r\n data-bs-toggle=\"dropdown\"\r\n aria-expanded=\"false\"\r\n [style.minHeight.px]=\"rowHeight - 10\"\r\n data-bs-display=\"static\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container>\r\n {{\r\n getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field)\r\n }}\r\n </ng-container>\r\n <ng-template #placeholder> Select options... </ng-template>\r\n </button>\r\n\r\n <!-- Menu -->\r\n <div\r\n class=\"dropdown-menu w-100 p-0 cell-editing-dropdown-menu rounded-3\"\r\n [class.show]=\"isEditing(row, col)\"\r\n >\r\n <!-- Search -->\r\n <div class=\"px-2 py-1\">\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 />\r\n </div>\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"cell-editin-dropdown\"\r\n style=\"max-height: 200px; overflow: auto\"\r\n >\r\n <div\r\n (click)=\"\r\n setNestedValue(row, col, option, true);\r\n disableEdit(row, col)\r\n \"\r\n class=\"px-2 py-1 d-flex align-items-center item\"\r\n *ngFor=\"\r\n let option of col.column_dropdown_value\r\n | filter : editinDropdownSearch : 'value'\r\n \"\r\n >\r\n <label\r\n class=\"form-check-label d-flex align-items-center mb-0\"\r\n [for]=\"col.field + '-' + option.value || option\"\r\n >\r\n {{ option.value || option }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <input\r\n *ngSwitchCase=\"'email'\"\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #emailModel=\"ngModel\"\r\n #emailInput\r\n type=\"email\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n pattern=\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\r\n (blur)=\"disableEdit(row, col, emailModel)\"\r\n (keydown.enter)=\"\r\n emailModel.control.markAsTouched(); emailInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': emailModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n <!-- Default fallback -->\r\n <input\r\n *ngSwitchDefault\r\n [style.height.px]=\"rowHeight - 10\"\r\n [style.maxHeight.px]=\"rowHeight - 10\"\r\n #textModel=\"ngModel\"\r\n #textInput\r\n type=\"text\"\r\n [(ngModel)]=\"row[col.field]\"\r\n name=\"{{ col.field }}\"\r\n required\r\n (blur)=\"disableEdit(row, col, textModel)\"\r\n (keydown.enter)=\"\r\n textModel.control.markAsTouched(); textInput.blur()\r\n \"\r\n autofocus\r\n class=\"form-control form-control-sm\"\r\n [ngClass]=\"{\r\n 'is-invalid': textModel.invalid\r\n }\"\r\n (mousedown)=\"$event.stopPropagation()\"\r\n />\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Display mode -->\r\n <ng-template #viewMode>\r\n <div\r\n class=\"d-flex justify-between items-center w-100\"\r\n [ngClass]=\"getCellClasses(col, getNestedValue(row, col.field))\"\r\n >\r\n <!-- Text cell -->\r\n <div\r\n #cellText\r\n class=\"text-ellipsis flex-grow-1\"\r\n [title]=\"\r\n col.type === 'date'\r\n ? (getNestedValue(row, col.field) | date : dateFormat)\r\n : getNestedValue(row, col.field)\r\n \"\r\n >\r\n <ng-container *ngIf=\"col.type !== 'image'\">\r\n {{\r\n !isNestedValueArray(row, col.field)\r\n ? col.type === 'date'\r\n ? (isDate(getNestedValue(row, col.field))\r\n ? (getNestedValue(row, col.field) | date: dateFormat)\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-'))\r\n : (getNestedValue(row, col.field)?.value ||\r\n getNestedValue(row, col.field)?.name ||\r\n getNestedValue(row, col.field) ||\r\n '-')\r\n : (getNestedValue(row, col.field)?.[0]?.department_name ||\r\n getNestedValue(row, col.field)?.[0]?.roleName ||\r\n '-')\r\n }}\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: row,\r\n col: col,\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Expand / Collapse icon -->\r\n <span\r\n *ngIf=\"\r\n (isOverflowing(cellText) &&\r\n showCellDetailsBox &&\r\n getNestedValue(row, col.field)?.length > 50) ||\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 </div>\r\n\r\n <!-- Expanded text -->\r\n <div\r\n class=\"position-absolute w-100\"\r\n *ngIf=\"isExpanded(row, col)\"\r\n [style.zIndex]=\"getZIndex(row, col)\"\r\n style=\"top: 100%; left: 0\"\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 #columnMenu let-col=\"col\">\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 >\r\n <!-- Sort Ascending -->\r\n <div class=\"border-below pb-2\" [class.disable-sorting]=\"!col.is_sortable\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Sort</span>\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showAscending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortAsc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-up.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Ascending\r\n </div>\r\n\r\n <!-- Sort Descending -->\r\n <div\r\n *ngIf=\"\r\n columnThreedotsMunuConfig?.showDescending &&\r\n (sortingConfig?.field != col.field ||\r\n sortingConfig?.order_by == 'asc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDesc(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-down.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Sort Descending\r\n </div>\r\n\r\n <div\r\n *ngIf=\"\r\n sortingConfig?.field === col.field &&\r\n (sortingConfig?.order_by === 'asc' ||\r\n sortingConfig?.order_by === 'desc')\r\n \"\r\n class=\"column-menu-item\"\r\n (click)=\"resetSort(activeCol)\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/arrow-counterclockwise.svg'\r\n \"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Reset Sort\r\n </div>\r\n </div>\r\n <div class=\"py-2 border-below three-dots-filter\">\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showFilter\"\r\n class=\"column-menu-item three-dots-filter\"\r\n (click)=\"openFilteronThreeDotsClick(col)\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/filter-2.svg'\"\r\n class=\"data-grid-svg-icon me-2\"\r\n ></span>\r\n Filter\r\n </div>\r\n </div>\r\n\r\n <div class=\"py-2 border-below\">\r\n <span class=\"muted-text fs-7\" style=\"margin-left: 12px\">Pin</span>\r\n <div\r\n *ngIf=\"columnThreedotsMunuConfig?.showPinleft && col?.pinned !== 'left'\"\r\n class=\"column-menu-item\"\r\n (click)=\"updateColumnPinInSourceByField(activeCol, 'left')\"\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)=\"updateColumnPinInSourceByField(activeCol, 'right')\"\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)=\"updateColumnPinInSourceByField(activeCol, null)\"\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 >\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 *ngIf=\"isThreeDotsFilterOpen\" class=\"three-dots-col-menu position-relative\" [style.left.px]=\"-140\" [class.visually-hidden]=\"isMenueHidden\">\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\r\n\r\n<!-- Filter Menue -->\r\n<ng-template #filterMenu let-col=\"col\">\r\n <div\r\n class=\"filter-menu-container filter-menu\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\r\n >\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"filter-dropdown-section p-1\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"addFilterDropdownSearch\"\r\n #filterMenueSearchInput\r\n />\r\n\r\n <div class=\"form-check mb-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isAllSideFilterOptionsSelected(col)\"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'value';\r\n trackBy: trackById\r\n \"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.includes(option?._id || option?.id || option)\r\n \"\r\n [value]=\"option\"\r\n id=\"option_{{ col.field }}_{{\r\n option?.id || option?._id || option\r\n }}\"\r\n (change)=\"onOptionToggle(col, option)\"\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 </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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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)]=\"col.query.first_value\"\r\n #filterMenueTextchInput\r\n />\r\n\r\n <ng-container *ngIf=\"col.query?.first_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\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\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\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\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\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 class=\"form-check-label\" for=\"none_{{ col.field }}\"\r\n >None</label\r\n >\r\n </div>\r\n </div>\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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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-2\"\r\n placeholder=\"Second Value\"\r\n [(ngModel)]=\"col.query.second_value\"\r\n />\r\n </ng-container>\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: 22px\"\r\n (click)=\"applyFilterFromFilterRow(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 w-100\"\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-template>\r\n\r\n<!-- Side Menue -->\r\n\r\n<!-- Add this new template for accordion detail column menu -->\r\n<ng-template #detailColumnMenu let-col=\"col\" let-row=\"row\">\r\n <div\r\n class=\"column-menu three-dots-col-menu detail-column-menu\"\r\n [class.visually-hidden]=\"isDetailMenueHidden\"\r\n *ngIf=\"activeDetailCol\"\r\n [style.backgroundColor]=\"dropdownsBackgroundColor\"\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=\"columnThreedotsMunuConfig?.showAscending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailAsc(activeDetailCol, row)\"\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=\"columnThreedotsMunuConfig?.showDescending\"\r\n class=\"column-menu-item\"\r\n (click)=\"sortDetailDesc(activeDetailCol, row)\"\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=\"col?.sortOrder\"\r\n class=\"column-menu-item\"\r\n (click)=\"resetDetailSort(activeDetailCol, row)\"\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\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)=\"updateDetailColumnPin(activeDetailCol, row, 'left')\"\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)=\"updateDetailColumnPin(activeDetailCol, row, 'right')\"\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)=\"updateDetailColumnPin(activeDetailCol, row, null)\"\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)=\"autosizeDetailColumn(activeDetailCol, row)\"\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)=\"autosizeAllDetailColumns(row)\"\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 (Detail Row) -->\r\n<div\r\n *ngIf=\"showRowsGrouping && col?.isGroupable\"\r\n class=\"column-menu-item\"\r\n (click)=\"groupByDetailColumn(activeDetailCol, activeDetailRow)\"\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)=\"openDetailChooseColumns(row)\"\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)=\"resetDetailColumns(row)\"\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</ng-template>\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\"\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\">\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\">\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 class=\"column-group d-flex align-items-center mb-2\">\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\">\r\n <span\r\n class=\"me-2 filter-icon-wrapper me-2\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span\r\n class=\"toggle-icon data-grid-svg-icon\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/chevron-right.svg'\r\n \"\r\n [class.rotate]=\"col.expandedFilter\"\r\n ></span>\r\n </span>\r\n\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n style=\"cursor: pointer\"\r\n (click)=\"col.expandedFilter = !col.expandedFilter\"\r\n >\r\n <span class=\"text-truncate fw-bold\">{{ col.header }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Show filter when expanded -->\r\n <div *ngIf=\"col.expandedFilter\" class=\"ps-4 pe-3\">\r\n <ng-container\r\n *ngTemplateOutlet=\"sideNestedFilter; context: { col: col }\"\r\n ></ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Side Nested Filters -->\r\n<ng-template #sideNestedFilter let-col=\"col\">\r\n <div class=\"\">\r\n <!-- Dropdown Type -->\r\n <ng-container *ngIf=\"col.type === 'dropdown'; else textFilter\">\r\n <div class=\"p-1\">\r\n <!-- Search -->\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm mb-2\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"col.searchValue\"\r\n />\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check mb-1 ms-1\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"\r\n col.query?._ids?.length == col?.column_dropdown_value?.length\r\n \"\r\n (change)=\"toggleSelectAllSideFilters(col, $event)\"\r\n id=\"selectAll_{{ col.field }}\"\r\n />\r\n <label class=\"form-check-label\" for=\"selectAll_{{ col.field }}\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"dropdown-options\">\r\n <div\r\n class=\"form-check mb-1 ms-1\"\r\n *ngFor=\"\r\n let option of col?.column_dropdown_value\r\n | filter : addFilterDropdownSearch : 'header'\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\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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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!.firt_value\"\r\n />\r\n\r\n <ng-container *ngIf=\"col?.query?.firt_value\">\r\n <div class=\"form-group mb-2\">\r\n <div class=\"form-check form-check-inline\">\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\" for=\"and_{{ col.field }}\"\r\n >AND</label\r\n >\r\n </div>\r\n <div class=\"form-check form-check-inline\">\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\" for=\"or_{{ col.field }}\"\r\n >OR</label\r\n >\r\n </div>\r\n </div>\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 <option value=\"contain\">Contains</option>\r\n <option value=\"equals\">Equals</option>\r\n <option value=\"startsWith\">Starts With</option>\r\n <option value=\"endsWith\">Ends With</option>\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-2\"\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</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\">\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 [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 [class.border-right]=\"showVerticalBorder\"\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 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 />\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 rounded-3 bg-white 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>\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 rounded-3 bg-white 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\"\r\n type=\"button\"\r\n id=\"savePresetDropdown\"\r\n (click)=\"$event.stopPropagation(); toggleSubActions('save-preset')\"\r\n >\r\n Save 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 class=\"\">\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\"\r\n class=\"badge bg-light text-primary ms-2\"\r\n >Default</span\r\n >\r\n <span\r\n *ngIf=\"!tableFilterViewId\"\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 >\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end\">\r\n <a\r\n (click)=\"clearAllFilters()\"\r\n class=\"dropdown-item d-flex align-items-center\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/star.svg'\"\r\n class=\"me-2\"\r\n ></span>\r\n Set as default\r\n </a>\r\n </ul>\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=\"let table of filteredList; trackBy: trackByTable\"\r\n >\r\n <!-- Item -->\r\n <div\r\n class=\"list-group-item px-0 d-flex justify-content-between align-items-center\"\r\n >\r\n <div (click)=\"selectFilter(table)\">\r\n <div class=\"fw-semibold\" style=\"cursor: pointer;\">\r\n {{ table?.name }}\r\n <!-- {{table?.is_temp}} -->\r\n <span\r\n *ngIf=\"table?.is_temp\"\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_deafult\"\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\"\r\n >Created {{ table?.createdAt | date : \"MMM d, y\" }}</small\r\n >\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center\">\r\n <span\r\n *ngIf=\"table?.is_deafult\"\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_deafult\">\r\n <a\r\n href=\"javascript:void(0)\"\r\n class=\"muted-text\"\r\n data-bs-toggle=\"dropdown\"\r\n id=\"dropdownMenuButton2\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/horizontal-dots.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </a>\r\n <ul class=\"dropdown-menu dropdown-menu-end set-default-preset\" aria-labelledby=\"dropdownMenuButton2\">\r\n <a\r\n [class.d-none]=\"confirmDelete\"\r\n (click)=\"actionPreset(table, 'setPreset')\"\r\n class=\"dropdown-item d-flex align-items-center\"\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 </a>\r\n\r\n <!-- Delete with confirmation -->\r\n <ng-container *ngIf=\"!confirmDelete; else confirmBlock\">\r\n <a\r\n (click)=\"confirmDelete = true\"\r\n class=\"dropdown-item d-flex align-items-center text-danger\"\r\n >\r\n <span\r\n style=\"margin-top: -4px\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n Delete\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Confirmation block -->\r\n </ul>\r\n <ng-template #confirmBlock>\r\n <div class=\"dropdown-item\"><b>Delete preset</b></div>\r\n <div class=\"dropdown-item text-center\">\r\n <div class=\"mb-2\">\r\n Are you sure you want to delete the <br />\r\n <b>“{{ table?.name }}”</b> preset?\r\n </div>\r\n <button\r\n class=\"btn btn-sm btn-light me-2\"\r\n (click)=\"confirmDelete = false\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n class=\"btn btn-sm btn-danger delete-preset\"\r\n (click)=\"actionPreset(table, 'deletePreset')\"\r\n >\r\n <span\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/trash-red.svg'\r\n \"\r\n class=\"confirm-preset-delete\"\r\n ></span>\r\n Delete\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Item End Here -->\r\n </div>\r\n\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\">Save preset</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\">\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 </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 rounded-3 bg-white actions-dropdown mt-1 dropdown-menu show shadow custom-menu table-layout\"\r\n style=\"width: 280px\"\r\n >\r\n <!-- Header -->\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"d-flex align-items-center\">\r\n <button\r\n class=\"btn btn-link p-0\"\r\n style=\"margin-left: -10px\"\r\n (click)=\"toggleActions('setting')\"\r\n >\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon\"\r\n ></span>\r\n </button>\r\n <h6 class=\"mb-0 ms-2\" style=\"font-weight: 500\">Columns</h6>\r\n </div>\r\n <a\r\n (click)=\"resetColumns()\"\r\n href=\"javascript:void(0)\"\r\n class=\"text-primary text-decoration-none\"\r\n >Reset</a\r\n >\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"mb-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"mx-2 position-absolute icon data-grid-svg-icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search column\"\r\n type=\"search\"\r\n [(ngModel)]=\"topShowHideColumns\"\r\n />\r\n </div>\r\n </div>\r\n <!-- Preset List -->\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"\r\n max-height: calc(100vh - 300px);\r\n overflow: auto;\r\n scrollbar-width: thin;\r\n \"\r\n >\r\n <div class=\"muted-text show-hide-table-label\" *ngIf=\"hasAnyVisibleColumn\">\r\n Show in table\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 >\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\"\r\n *ngIf=\"hasAnyInVisibleColumn\"\r\n >\r\n Hide in table\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 rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"mb-2 px-3\">\r\n <div class=\"col-12 global-search\">\r\n <span\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/search.svg'\"\r\n class=\"data-grid-svg-icon mx-2 position-absolute icon\"\r\n ></span>\r\n <input\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Filter by\"\r\n type=\"search\"\r\n [(ngModel)]=\"addFilterColumnInput\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 500px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of columns | filter : addFilterColumnInput : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div\r\n (click)=\"openFilter(col)\"\r\n *ngIf=\"\r\n col.is_visible &&\r\n !col?.query?.first_value &&\r\n !col?.query?._ids?.length\r\n \"\r\n class=\"list-group-item border-0 px-0 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"d-flex gap-1\">\r\n <div style=\"margin-top: -3px\"></div>\r\n <div class=\"fw-semibold\">\r\n {{ col.header }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <div\r\n @slideToggle\r\n *ngIf=\"isFilterOpen && selectedColumnForFilter.type == 'dropdown'\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\r\n >\r\n <div class=\"px-3 my-2 border-below py-1 pb-2 mb-3 d-flex ps-1\">\r\n <span\r\n (click)=\"toggleActions('filter-columns'); isActiveFilterOpen = false\"\r\n [inlineSVG]=\"singleSpaAssetsPath + 'data-grid/icons/arrow-left.svg'\"\r\n class=\"data-grid-svg-icon me-2 cursor-pointer\"\r\n ></span\r\n ><b>{{ selectedColumnForFilter?.header }}</b>\r\n </div>\r\n <div class=\"mb-2 px-3\">\r\n <div\r\n class=\"col-12 global-search position-relative border rounded d-flex align-items-center flex-wrap px-2 filter-serach-inpt\"\r\n >\r\n <span\r\n *ngFor=\"let selected of selectedFilterOptions\"\r\n class=\"badge d-flex align-items-center gap-1 me-1 mb-1\"\r\n >\r\n {{ selected?.value ? selected.value : selected }}\r\n <span\r\n (click)=\"toggleSelectionInFilter(selected)\"\r\n [inlineSVG]=\"\r\n singleSpaAssetsPath + 'data-grid/icons/cross-primary.svg'\r\n \"\r\n class=\"me-2\"\r\n ></span>\r\n </span>\r\n <input\r\n class=\"form-control form-control-sm border-0 flex-grow-1\"\r\n style=\"padding: 0\"\r\n [placeholder]=\"selectedFilterOptions!.length ? '' : 'Filter by'\"\r\n type=\"search\"\r\n [(ngModel)]=\"searchTextForFilterDropDown\"\r\n (keydown.backspace)=\"handleBackspace($event)\"\r\n />\r\n </div>\r\n </div>\r\n <div\r\n class=\"list-group list-group-flush\"\r\n style=\"max-height: calc(100vh - 600px); overflow: auto\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let col of selectedColumnForFilter.column_dropdown_value\r\n | filter : searchTextForFilterDropDown : 'value';\r\n let i = index\r\n \"\r\n >\r\n <div\r\n class=\"list-group-item border-0 px-2 d-flex justify-content-between align-items-center dropdown-item cursor-pointer\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"i\"\r\n [checked]=\"currentFilterSelectedIds.has(col.id || col._id || col)\"\r\n (change)=\"toggleSelectionInFilter(col)\"\r\n />\r\n <label class=\"form-check-label fw-semibold\" [for]=\"i\">\r\n {{ col?.value || col?.name || col }}\r\n </label>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div\r\n class=\"d-flex justify-content-center gap-2 px-2 border-top\"\r\n style=\"height: 38px\"\r\n >\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-outline-secondary btn-light border w-100 d-flex align-items-center justify-content-center mt-1 btn-light\"\r\n (click)=\"$event.stopPropagation(); resetFilterChanges()\"\r\n >\r\n <span>Cancel</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n style=\"height: 32px\"\r\n class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center mt-1\"\r\n (click)=\"applyDropdownFilter()\"\r\n >\r\n <span style=\"margin-top: -2px\">Save</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- For Text fields and number fields-->\r\n\r\n <div\r\n @slideToggle\r\n *ngIf=\"\r\n isFilterOpen &&\r\n (selectedColumnForFilter.type == 'string' ||\r\n selectedColumnForFilter.type == 'number' ||\r\n selectedColumnForFilter.type == 'date')\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"shadow rounded-3 bg-white actions-dropdown mt-1 show shadow custom-menu table-layout filter-columns\"\r\n style=\"width: 280px; right: unset; max-width: 230px\"\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\"\r\n [(ngModel)]=\"firstCondition\"\r\n >\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Starts With</option>\r\n <option value=\"after\">Ends With</option>\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 />\r\n </div>\r\n <div *ngIf=\"firstValue\">\r\n <div class=\"d-flex my-3\">\r\n <div class=\"form-check form-check-inline\">\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\" for=\"logicalAnd\">AND</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\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\" for=\"logicalOr\">OR</label>\r\n </div>\r\n\r\n <div class=\"form-check form-check-inline\">\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\" for=\"logicalNone\">None</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"my-3\">\r\n <!-- Second condition select -->\r\n <select\r\n class=\"form-select form-select-sm\"\r\n [(ngModel)]=\"secondCondition\"\r\n >\r\n <option value=\"equal\">Equals</option>\r\n <!-- <option value=\"not_equal\">Not Equals</option> -->\r\n <option value=\"contain\">Contains</option>\r\n <option value=\"before\">Starts With</option>\r\n <option value=\"after\">Ends With</option>\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 />\r\n </div>\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 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 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</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 >\r\n <ng-container *ngIf=\"!isEditing(row, col)\">\r\n <div\r\n *ngIf=\"!isArray\"\r\n class=\"full-text-content\"\r\n (dblclick)=\"$event.stopPropagation(); $event.preventDefault(); enableEdit(row, col)\"\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 {{ item?.department_name || item?.roleName || \"-\" }}\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 #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\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 align-items-center w-100 cell-content image-placeholder cursor-pointer\"\r\n [title]=\"row?.full_name || row?.name || 'N/A'\"\r\n (click)=\"onEmployeeClick(row)\"\r\n >\r\n <ng-container\r\n *ngIf=\"\r\n row?.logo || row?.assetImage || row?.invoice?.invoice_image;\r\n else placeholder\r\n \"\r\n >\r\n <span class=\"pic\">\r\n <img\r\n [width]=\"rowHeight - 12\"\r\n [height]=\"rowHeight - 12\"\r\n [src]=\"row?.profile_pictures?.[4]?.path || row?.logo || row?.assetImage || row?.invoice?.invoice_image\"\r\n alt=\"icon\"\r\n class=\"option-icon\"\r\n />\r\n </span>\r\n </ng-container>\r\n\r\n <ng-template #placeholder>\r\n <span\r\n [ngClass]=\"getDynamicClass(row?.User?.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 >\r\n {{ getInitials(row?.User?.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 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<div\r\n [style.bottom.px]=\"footerRowHeight + 50\"\r\n *ngIf=\"selectedRows.size > 0 && showTaskbar\"\r\n class=\"taskbar\"\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 {{ config?.paginationParams?.totalItems }} Total\r\n </span>\r\n <div class=\"action-buttons\">\r\n <ng-container *ngFor=\"let action of taskbarActions; let i = index\">\r\n <span\r\n class=\"action-btn verified btn {{ action }}\"\r\n (click)=\"onVerifyClick(action)\"\r\n >{{ action }}</span\r\n >\r\n <span\r\n *ngIf=\"taskbarActions.length > 1 && i !== taskbarActions.length - 1\"\r\n class=\"separator\"\r\n >|</span\r\n >\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Detail Row Choose Columns Modal -->\r\n<div *ngIf=\"showDetailColumnPanel\" 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=\"detailModalColumnPannel\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<ng-template #detailModalColumnPannel>\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 Detail Columns\r\n <span class=\"filter-icon-wrapper\" (click)=\"closeDetailColumnPanel()\">\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 <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"allDetailColumnsSelected()\"\r\n (change)=\"toggleAllDetailColumnsVisibility()\"\r\n />\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search detail columns...\"\r\n [(ngModel)]=\"choseColumnsSearch\"\r\n />\r\n </div>\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 (currentDetailRowForColumnSelection?.details?.columns || [])\r\n | filter : choseColumnsSearch : 'header';\r\n trackBy: trackByField\r\n \"\r\n >\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input me-2\"\r\n [checked]=\"col.is_visible !== false\"\r\n (change)=\"toggleDetailColumnVisibility(col, !col.is_visible)\"\r\n [id]=\"'detail_col_' + col.field\"\r\n />\r\n <label\r\n class=\"d-flex align-items-center mb-0 w-100\"\r\n [for]=\"'detail_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 </div>\r\n </div>\r\n <!-- <div class=\"px-3 py-2 border-top d-flex justify-content-end\">\r\n <button class=\"btn btn-sm btn-link\" (click)=\"resetDetailColumnsInModal()\">Reset</button>\r\n </div> -->\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/*\r\n * Public API Surface of ms-time-sheet\r\n */\r\n\r\nexport * from './lib/ms-time-sheet.service';\r\nexport * from './lib/ms-time-sheet.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SplitColumnsService","i2.CommonService","i3.CopyServiceService"],"mappings":";;;;;;;;;;;;;;;;MAKa,kBAAkB,CAAA;AAE7B,IAAA,WAAA,GAAA,EAAgB;+GAFL,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACJM,MAAM,kBAAkB,GAA8B;;AAE3D,IAAA,QAAQ,EAAE,qBAAqB;AAC/B,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,WAAW,EAAE,qBAAqB;AAClC,IAAA,WAAW,EAAE,qBAAqB;AAClC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,OAAO,EAAE,qBAAqB;AAC9B,IAAA,gBAAgB,EAAE,qBAAqB;AACvC,IAAA,eAAe,EAAE,qBAAqB;;AAGtC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,WAAW,EAAE,qBAAqB;AAClC,IAAA,QAAQ,EAAE,qBAAqB;AAC/B,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,aAAa,EAAE,qBAAqB;AACpC,IAAA,iBAAiB,EAAE,qBAAqB;AACxC,IAAA,kBAAkB,EAAE,qBAAqB;AACzC,IAAA,uBAAuB,EAAE,qBAAqB;AAC9C,IAAA,SAAS,EAAE,qBAAqB;AAChC,IAAA,OAAO,EAAE,qBAAqB;;AAG9B,IAAA,UAAU,EAAE,oBAAoB;AAChC,IAAA,UAAU,EAAE,oBAAoB;AAChC,IAAA,YAAY,EAAE,oBAAoB;AAClC,IAAA,SAAS,EAAE,oBAAoB;AAC/B,IAAA,QAAQ,EAAE,oBAAoB;AAC9B,IAAA,gBAAgB,EAAE,oBAAoB;AACtC,IAAA,iBAAiB,EAAE,oBAAoB;AACvC,IAAA,aAAa,EAAE,oBAAoB;AACnC,IAAA,YAAY,EAAE,oBAAoB;AAClC,IAAA,QAAQ,EAAE,oBAAoB;AAC9B,IAAA,QAAQ,EAAE,oBAAoB;;AAG9B,IAAA,WAAW,EAAE,kBAAkB;AAC/B,IAAA,SAAS,EAAE,kBAAkB;;AAG7B,IAAA,SAAS,EAAE,kBAAkB;AAC7B,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,SAAS,EAAE;CACZ;;MCxCY,UAAU,CAAA;AACvB,IAAA,SAAS,CAAC,KAAY,EAAE,UAAkB,EAAG,GAAY,EAAA;AACvD,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAEvC,QAAA,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE;AAEvC,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,IAAG;AACvB,YAAA,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI;AACtC,YAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC7D,QAAA,CAAC,CAAC;IACJ;+GAVa,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,CAAA;;4FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAJtB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCFY,iBAAiB,CAAA;IAC5B,SAAS,CAAC,OAAc,EAAE,MAA+B,EAAA;AACvD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;IACjF;+GAJW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,IAAI;mBAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAI,UAAU,EAAE,IAAI,EAAE;;;MCGlD,mBAAmB,CAAA;IAC9B,cAAc,CAAC,OAAc,EAAE,cAAsB,EAAA;QACnD,MAAM,IAAI,GAAU,EAAE;QACtB,MAAM,MAAM,GAAU,EAAE;QACxB,MAAM,KAAK,GAAU,EAAE;AAEvB,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,MAAM,YAAY,GAAU,EAAE;gBAC9B,MAAM,cAAc,GAAU,EAAE;gBAChC,MAAM,aAAa,GAAU,EAAE;AAE/B,gBAAA,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE;AAChC,oBAAA,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK;wBAAE;oBAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI;oBACjD,MAAM,eAAe,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE;oBAE5C,IAAI,MAAM,KAAK,MAAM;AAAE,wBAAA,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;yBACpD,IAAI,MAAM,KAAK,OAAO;AAAE,wBAAA,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;;AAC3D,wBAAA,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;gBAC3C;AAEA,gBAAA,IAAI,YAAY,CAAC,MAAM,EAAE;oBACvB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;gBACpF;AACA,gBAAA,IAAI,cAAc,CAAC,MAAM,EAAE;oBACzB,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,wBAAA,QAAQ,EAAE,cAAc;AACxB,wBAAA,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;AACtB,qBAAA,CAAC;gBACJ;AACA,gBAAA,IAAI,aAAa,CAAC,MAAM,EAAE;oBACxB,KAAK,CAAC,IAAI,CAAC;wBACT,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,wBAAA,QAAQ,EAAE,aAAa;AACvB,wBAAA,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;AACtB,qBAAA,CAAC;gBACJ;YACF;AAAO,iBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;AACnC,gBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI;gBACjC,IAAI,MAAM,KAAK,MAAM;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;qBAChC,IAAI,MAAM,KAAK,OAAO;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;AACvC,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB;QACF;AAEA,QAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAChC;AAEA,IAAA,eAAe,CAAC,OAAc,EAAA;AAC5B,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;QAyB3B;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC;AAEzC,QAAA,OAAO,OAAO;IAChB;IAEC,mBAAmB,CAAC,OAAc,EAAE,cAAsB,EAAA;QAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAE3D,IAAI,CAAC,eAAe,CAAC,MAAM;AAAE,YAAA,OAAO,OAAO;AAE3C,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;QACtE,IAAI,YAAY,GAAG,EAAE;YAAE,YAAY,GAAG,EAAE;AAExC,QAAA,MAAM,YAAY,GAAG,CAAC,IAAW,KAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AACf,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAU,KAAI;;;AAGlD,oBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAChB,wBAAA,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,EAAE;4BAC9B,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE;wBACjC;6BAAO;4BACL,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;wBAC1C;oBACF;AACA,oBAAA,OAAO,EAAE,GAAG,KAAK,EAAE;AACrB,gBAAA,CAAC,CAAC;gBAEF,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE;YAC1C;AAEA,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AACd,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;oBAC5B,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC/B;qBAAO;oBACL,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE;gBACxC;YACF;AAEA,YAAA,OAAO,EAAE,GAAG,GAAG,EAAE;AACnB,QAAA,CAAC,CAAC;AAEJ,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;AAGU,IAAA,qBAAqB,CAAC,OAAc,EAAA;QAC1C,MAAM,MAAM,GAAU,EAAE;AAExB,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CACzC,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,KAAK,KAAK,CACnC;AACD,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;YACjC;AAAO,iBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAClB;QACF;AAEA,QAAA,OAAO,MAAM;IACf;+GA7IW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCCY,aAAa,CAAA;AAExB,IAAA,WAAA,GAAA;QAsKF,IAAA,CAAA,qBAAqB,GAAU,EAAE;IAtKf;AAChB,IAAA,oBAAoB,CAAC,OAAc,EAAA;AACjC,QAAA,MAAM,YAAY,GAAG,CAAC,OAAc,KAAa;AAC/C,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AAChC,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACnC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;AAEA,IAAA,sBAAsB,CAAC,OAAc,EAAA;AACnC,QAAA,MAAM,YAAY,GAAG,CAAC,OAAc,KAAa;AAC/C,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,CAAC,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AACjC,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACnC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;IAC9B;AAGA,IAAA,qBAAqB,CAAC,OAAc,EAAA;QAClC,IAAI,KAAK,GAAG,CAAC;AAEb,QAAA,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;gBACtE,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/B;iBAAO;AACL,gBAAA,KAAK,IAAI,CAAC,CAAC;YACb;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,wBAAwB,CAAC,OAAc,EAAA;AACrC,QAAA,MAAM,gBAAgB,GAAG,CAAC,OAAc,KAAa;AACnD,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,GAAG,EAAE,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AAC3D,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACvC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC;IAClC;AAEA,IAAA,uBAAuB,CAAC,OAAc,EAAA;AACpC,QAAA,MAAM,gBAAgB,GAAG,CAAC,OAAc,KAAa;AACnD,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,GAAG,EAAE,MAAM,KAAK,MAAM,IAAI,GAAG,EAAE,UAAU;AAAE,oBAAA,OAAO,IAAI;AAC1D,gBAAA,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzB,oBAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACvC;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC;IAClC;AAGA,IAAA,mBAAmB,CAAC,IAAW,EAAA;QAC7B,IAAI,UAAU,GAAG,CAAC;QAClB,IAAI,QAAQ,GAAG,CAAC;AAEhB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAG;AACnB,YAAA,IAAI,KAAK,EAAE,OAAO,EAAE;AAClB,gBAAA,UAAU,EAAE;AAEZ,gBAAA,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;oBACrD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AACpC,wBAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,4BAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACnD,gCAAA,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM;4BACnC;wBACF;6BAAO;AACL,4BAAA,QAAQ,EAAE;wBACZ;AACF,oBAAA,CAAC,CAAC;gBACJ;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,UAAU,KAAK,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC,MAAM;QACpB;QAEA,OAAO,UAAU,GAAG,QAAQ;IAC9B;IAGF,qBAAqB,CAAC,OAAc,EAAE,aAAoB,EAAA;QACxD,MAAM,MAAM,GAAU,EAAE;AAExB,QAAA,MAAM,WAAW,GAAG,CAAC,GAAQ,KAAI;AAC/B,YAAA,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AAC3I,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AAChI,YAAA,IAAI,aAAa,IAAI,MAAM,EAAE;gBAC3B,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;oBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,oBAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU,GAAE,GAAG,CAAC,KAAK,EAAE,IAAI,GAAE,EAAE;AACjD,oBAAA,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU,GAAE,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI;AACnF,iBAAA,CAAC;YACJ;AAEA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;YACnC;AACF,QAAA,CAAC;AACD,QAAA,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;AAE5B,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,MAAM,qBAAqB,CAAC,OAAc,EAAE,OAAc,EAAA;AACxD,QAAA;AACA,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;gBACd,GAAG,CAAC,KAAK,GAAG;AACV,oBAAA,WAAW,EAAE,IAAI;AACjB,oBAAA,YAAY,EAAE,IAAI;AAClB,oBAAA,eAAe,EAAE,SAAS;AAC1B,oBAAA,gBAAgB,EAAE,IAAI;AACtB,oBAAA,SAAS,EAAE,MAAM;AACjB,oBAAA,IAAI,EAAE;iBACP;YACH;AAEA,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;YAEvD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;oBAC3B,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE;oBACnC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE;oBAChC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE;gBACpC;qBAAO;oBACL,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI;oBACvC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE;AAChC,oBAAA,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,IAAI;AACzD,oBAAA,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,IAAI;AAC3D,oBAAA,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,eAAe,IAAI,SAAS;AACtE,oBAAA,GAAG,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,EAAE,gBAAgB,IAAI,SAAS;AACxE,oBAAA,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,MAAM;gBACzD;YACF;AACA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,GAAG,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;YACxE;QACF;AACA,QAAA,OAAO,OAAO;IAChB;AAOA,IAAA,2BAA2B,CAAC,OAAc,EAAA;AACxC,QAAA,MAAM,eAAe,GAAG,CAAC,IAAW,KAAW;YAC7C,IAAI,MAAM,GAAU,EAAE;AAEtB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,gBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD;AAEA,gBAAA,IAAI,GAAG,CAAC,KAAK,EAAE;oBACb,MAAM,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;AAE5D,oBAAA,MAAM,cAAc,GAClB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE;AACtD,yBAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,EAAE,CAAC;AAE3D,oBAAA,IAAI,iBAAiB,IAAI,cAAc,EAAE;AACvC,wBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAClB;gBACF;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QACD,IAAI,CAAC,qBAAqB,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,qBAAqB;IACnC;AAIA,IAAA,eAAe,CAAC,OAAY,EAAE,QAAa,EAAE,IAAY,EAAA;QACrD,QAAQ,IAAI;AACV,YAAA,KAAK,QAAQ;gBACX,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC;AAE7C,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAEzD,YAAA,KAAK,UAAU;gBACb,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC/D,oBAAA,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ,EAAE,EAAE,IAAI,OAAO,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK;gBAC3E;gBACA,OAAO,OAAO,KAAK,QAAQ;AAE7B,YAAA,KAAK,SAAS;gBACZ,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC;AAE/C,YAAA,KAAK,MAAM;gBACT,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;gBAC/C,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;gBACjD,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,YAAY;sBAC3C,OAAO,KAAK;AACd,sBAAE,WAAW,KAAK,YAAY;AAElC,YAAA;AACE,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;IAEjE;+GAnOW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCCY,kBAAkB,CAAA;AAE7B,IAAA,WAAA,GAAA;QA0GA,IAAA,CAAA,UAAU,GAAU,EAAE;IA1GN;IAChB,sBAAsB,CACpB,OAAc,EACd,OAAc,EACd,kBAA+B,EAC/B,aAAoB,EACpB,cAA+C,EAAA;QAE/C,MAAM,UAAU,GAAY,EAAE;QAC9B,MAAM,qBAAqB,GAAG,CAAC,MAAc,KAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,cAAc,KAAK,MAAM,CAAC;QACvD,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE;YACrD,MAAM,aAAa,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnE,YAAA,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;AAClC,gBAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC;AACzC,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,YAAY,GAAG,CAAC,KAAa,KAAY;oBAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;AACzC,oBAAA,MAAM,KAAK,GACT,MAAM,EAAE,KAAK;AACb,wBAAA,MAAM,EAAE,IAAI;wBACZ,MAAM;AACN,wBAAA,GAAG;AAEL,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,wBAAA,OAAO;6BACJ,GAAG,CAAC,CAAC,IACJ,OAAO,CAAC,KAAK;+BACR,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE;+BACpC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;6BAE1B,IAAI,CAAC,IAAI,CAAC;oBACf;oBACA,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAG;AAC/B,oBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC/C,wBAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAoB,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC1E;oBACA,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClC,gBAAA,CAAC,CAAC;gBACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAW,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AAC9E,gBAAA,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5B;QACF;QACA,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB;AACxC,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;gBAChC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChD,gBAAA,IAAI,CAAC,GAAG;oBAAE;gBACV,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClC,gBAAA,IAAI,SAAS,GAAG,GAAG,EAAE,KAAK;AAC1B,gBAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBACnD,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK;gBAClD;gBACA,IAAI,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,GAAG;AAC3H,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,oBAAA,KAAK,GAAG;yBACL,GAAG,CAAC,CAAC,IACJ,OAAO,CAAC,KAAK;0BACT,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,IAAI;AACpC,0BAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;yBAExB,IAAI,CAAC,IAAI,CAAC;gBACf;qBAAO;AACL,oBAAA,KAAK,GAAG,KAAK,IAAI,EAAE;gBACrB;gBACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC/D,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACzC;YACA,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE;AACtC,iBAAA,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACxB,iBAAA,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AACrB,YAAA,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;QACjC;AACA,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC;AACzD,YAAA,IAAI,UAAU;AAAE,gBAAA,OAAO,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE;QAEA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC7E,QAAA,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,IAAG;AAC1B,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC;AACvB,YAAA,OAAO,MAAM,CAAC,MAAM,GAAG,OAAO;AAAE,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/C,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,CAAC;IACJ;AAGA,IAAA,eAAe,CACb,YAAqB,EACrB,QAAQ,GAAG,6CAA6C,EAAA;AAExD,QAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;QAChD,MAAM,UAAU,GAAG;aAChB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC9D,IAAI,CAAC,IAAI,CAAC;QACb,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACvD,QAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,UAAU,CAAC,MAAK;AACd,YAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC,EAAE,IAAI,CAAC;IACV;AAIA,IAAA,MAAM,sBAAsB,CAC1B,IAAY,EACZ,OAAc,EACd,OAAc,EACd,aAAqB,EACrB,aAAqB,EACrB,mBAA2B,CAAC,EAAA;AAE5B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,gBAAgB,GAAU,EAAE;AAClC,QAAA,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAK,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACxF;iBAAO;AACL,gBAAA,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;QACF,IAAI,mBAAmB,GAAG,CAAC;AAC3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;YACtB,mBAAmB,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;QAClD;AACA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC9B,YAAA,mBAAmB,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACjF;QAEA,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,OAAO,KAAI;AAClC,YAAA,MAAM,cAAc,GAAG,aAAa,GAAG,OAAO;AAC9C,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,cAAc,KAAK,cAAc,CAAC;AACnE,YAAA,IAAI,CAAC,GAAG;gBAAE;YAEV,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,KAAI;AACnC,gBAAA,MAAM,WAAW,GAAG,mBAAmB,GAAG,OAAO;gBACjD,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,gBAAgB,CAAC,MAAM;oBAAE;AAE/D,gBAAA,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC;gBAClD,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC;AAC/C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,UAAU;IACxB;IAGA,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAE,MAAW,EAAE,eAAe,GAAG,KAAK,EAAA;AACxE,QAAA;QACA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;YAAE;AACvD,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;AACzB,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,GAAW,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC;AAC7E,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;YACrB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;gBACjD,MAAM,CAAC,OAAO,CAAC,GAAG;AAChB,oBAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;AAClB,oBAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM;iBAC9B;YACH;iBAAO;AACL,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM;YAC1B;QACF;AACA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;AAChB,YAAA,SAAS,EAAE,YAAY;SACxB;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B;IAGA,uBAAuB,CACrB,OAAc,EACd,kBAA+B,EAC/B,aAAoB,EACpB,OAAc,EACd,cAA2D,EAAA;AAE3D,QAAA,IAAI,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC;AAC9B,QAAA,IAAI,kBAAkB,EAAE,IAAI,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,kBAAkB,CAAC;YACvC,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,GAAQ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CACpD;;QAEH;AACK,aAAA,IAAI,aAAa,EAAE,MAAM,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;AAChC,gBAAA,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,QAAQ,CAAC;AACrE,gBAAA,IAAI,CAAC,GAAG;oBAAE;gBACV,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChC,gBAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBACnD,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;gBACtC;gBACA,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;YACnC;;QAEF;QACA,OAAO,EAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAC;IACjE;AAGA,IAAA,gBAAgB,CACd,YAAqB,EACrB,QAAQ,GAAG,6CAA6C,EAAA;AAExD,QAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhD,MAAM,UAAU,GAAG;aAChB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC9D,IAAI,CAAC,IAAI,CAAC;QAEb,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;QAG1E,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AACvD,QAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3D,UAAU,CAAC,MAAK;AACd,YAAA,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC,EAAE,IAAI,CAAC;IACV;+GAxOW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCqGY,kBAAkB,CAAA;AAuW7B,IAAA,WAAA,CACW,aAAkC,EAClC,GAAsB,EACvB,YAA2B;;IAE1B,UAAsB,EACtB,MAAc,EACd,WAA+B,EAAA;QAN/B,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,GAAG,GAAH,GAAG;QACJ,IAAA,CAAA,YAAY,GAAZ,YAAY;QAEX,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,WAAW,GAAX,WAAW;;;;;;AAvWtB,QAAA,IAAA,CAAA,YAAY,GAAgB,IAAI,GAAG,EAAE;;QAG5B,IAAA,CAAA,gBAAgB,GAAQ,EAAE;;QAG1B,IAAA,CAAA,OAAO,GAAU,EAAE;;QAEnB,IAAA,CAAA,OAAO,GAAU,EAAE;;QAGnB,IAAA,CAAA,SAAS,GAAW,EAAE;;QAGtB,IAAA,CAAA,eAAe,GAAW,EAAE;;QAG5B,IAAA,CAAA,kBAAkB,GAAY,IAAI;;QAGlC,IAAA,CAAA,uBAAuB,GAAuB,SAAS;;QAGvD,IAAA,CAAA,sBAAsB,GAAuB,SAAS;;QAGtD,IAAA,CAAA,qBAAqB,GAAW,SAAS;;QAGzC,IAAA,CAAA,yBAAyB,GAAW,SAAS;;QAG7C,IAAA,CAAA,mBAAmB,GAAY,KAAK;;QAGpC,IAAA,CAAA,aAAa,GAAuB,wBAAwB;;QAG5D,IAAA,CAAA,yBAAyB,GAAuB,MAAM;;QAGtD,IAAA,CAAA,mBAAmB,GAAuB,MAAM;;QAGhD,IAAA,CAAA,0BAA0B,GAAuB,MAAM;;QAGvD,IAAA,CAAA,uBAAuB,GAAuB,MAAM;;QAGpD,IAAA,CAAA,aAAa,GAAuB,MAAM;;QAG1C,IAAA,CAAA,eAAe,GAAuB,MAAM;;QAG5C,IAAA,CAAA,mBAAmB,GAAuB,EAAE;;QAG5C,IAAA,CAAA,iBAAiB,GAAuB,EAAE;;QAG1C,IAAA,CAAA,gBAAgB,GAAuB,GAAG;;QAG1C,IAAA,CAAA,cAAc,GAAuB,GAAG;;QAGxC,IAAA,CAAA,yBAAyB,GAAuB,EAAE;;QAGlD,IAAA,CAAA,wBAAwB,GAAuB,EAAE;;QAGjD,IAAA,CAAA,eAAe,GAAW,EAAE;;QAG5B,IAAA,CAAA,+BAA+B,GAAuB,EAAE;;QAGxD,IAAA,CAAA,gBAAgB,GAAwB,KAAK;;QAG7C,IAAA,CAAA,aAAa,GAAwB,KAAK;;QAG1C,IAAA,CAAA,UAAU,GAAuB,YAAY;;QAG7C,IAAA,CAAA,YAAY,GAAY,KAAK;;QAG7B,IAAA,CAAA,aAAa,GAAW,CAAC;;QAIzB,IAAA,CAAA,kBAAkB,GAAW,EAAE;;QAG/B,IAAA,CAAA,iBAAiB,GAAY,KAAK;;QAGlC,IAAA,CAAA,gBAAgB,GAAY,KAAK;;QAGjC,IAAA,CAAA,mBAAmB,GAAW,SAAS;;QAIvC,IAAA,CAAA,aAAa,GAAU,EAAE;;QAIzB,IAAA,CAAA,OAAO,GAAY,KAAK;;QAGxB,IAAA,CAAA,sBAAsB,GAAoB,MAAM;;QAGhD,IAAA,CAAA,wBAAwB,GAAoB,MAAM;;QAGlD,IAAA,CAAA,kBAAkB,GAAY,KAAK;;QAInC,IAAA,CAAA,UAAU,GAAW,YAAY;;QAGjC,IAAA,CAAA,WAAW,GAAW,EAAE;;QAIxB,IAAA,CAAA,OAAO,GAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC;;QAQ5D,IAAA,CAAA,WAAW,GAAG,KAAK;;QAGnB,IAAA,CAAA,SAAS,GAAG,IAAI;;QAIhB,IAAA,CAAA,WAAW,GAAqB,EAAE;;AAIlC,QAAA,IAAA,CAAA,aAAa,GAAuB;AAC3C,YAAA,KAAK,EAAE;SACR;;QAGQ,IAAA,CAAA,cAAc,GAAU,EAAE;;QAI1B,IAAA,CAAA,aAAa,GAA+C,IAAI;QAGhE,IAAA,CAAA,iBAAiB,GAAQ,EAAE;QAG3B,IAAA,CAAA,mBAAmB,GAAQ,QAAQ;AAEnC,QAAA,IAAA,CAAA,aAAa,GAAsD,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;;;QAKhH,IAAA,CAAA,gBAAgB,GAAW,EAAE;;QAG7B,IAAA,CAAA,sBAAsB,GAAG,EAAE;;QAG3B,IAAA,CAAA,0BAA0B,GAAG,EAAE;;QAG/B,IAAA,CAAA,oBAAoB,GAAG,EAAE;QAGzB,IAAA,CAAA,QAAQ,GAAW,WAAW;QAE9B,IAAA,CAAA,WAAW,GAAY,KAAK;QAE5B,IAAA,CAAA,mBAAmB,GAAW,yBAAyB;QAEvD,IAAA,CAAA,oBAAoB,GAAW,yBAAyB;;QAGxD,IAAA,CAAA,2BAA2B,GAAW,SAAS;;QAG/C,IAAA,CAAA,gCAAgC,GAAW,SAAS;QAEpD,IAAA,CAAA,SAAS,GAAU,EAAE;AAGrB,QAAA,IAAA,CAAA,yBAAyB,GAAG;AACnC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,gBAAgB,EAAE,IAAI;SAGvB;;QAGQ,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAC5B,IAAA,CAAA,WAAW,GAAG,IAAI;QAClB,IAAA,CAAA,WAAW,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAQ;;;;;;;AAehC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAO;;AAGtC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAO;AAE9C,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAE;AAEpD,QAAA,IAAA,CAAA,iBAAiB,GAAsB,IAAI,YAAY,EAAE;AAEzD,QAAA,IAAA,CAAA,mBAAmB,GAAsB,IAAI,YAAY,EAAO;AAEhE,QAAA,IAAA,CAAA,yBAAyB,GAAsB,IAAI,YAAY,EAAO;QAQhF,IAAA,CAAA,cAAc,GAAU,EAAE;QAC1B,IAAA,CAAA,SAAS,GAAQ,IAAI;QACrB,IAAA,CAAA,gBAAgB,GAAQ,IAAI;QAC5B,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAC3B,IAAA,CAAA,eAAe,GAAG,KAAK;QACvB,IAAA,CAAA,SAAS,GAAY,KAAK;QAC1B,IAAA,CAAA,YAAY,GAAW,EAAE;QACzB,IAAA,CAAA,mBAAmB,GAAG,IAAI;QAC1B,IAAA,CAAA,sBAAsB,GAA6B,IAAI;QACvD,IAAA,CAAA,eAAe,GAAU,EAAE;QAC3B,IAAA,CAAA,eAAe,GAAU,EAAE;QAC3B,IAAA,CAAA,eAAe,GAAkB,EAAE;QACnC,IAAA,CAAA,iBAAiB,GAAU,EAAE;QAC7B,IAAA,CAAA,eAAe,GAAG,GAAG;QACrB,IAAA,CAAA,UAAU,GAAW,EAAE;QACvB,IAAA,CAAA,YAAY,GAAQ,EAAE;QACtB,IAAA,CAAA,qBAAqB,GAAG,EAAE;QAC1B,IAAA,CAAA,oBAAoB,GAAG,EAAE;QACzB,IAAA,CAAA,gBAAgB,GAAG,EAAE;QACrB,IAAA,CAAA,uBAAuB,GAAG,EAAE;QAC5B,IAAA,CAAA,kBAAkB,GAAG,EAAE;QACvB,IAAA,CAAA,kBAAkB,GAAG,EAAE;QACvB,IAAA,CAAA,oBAAoB,GAAG,EAAE;QACzB,IAAA,CAAA,qBAAqB,GAAG,KAAK;QAC7B,IAAA,CAAA,aAAa,GAAG,KAAK;QACrB,IAAA,CAAA,kBAAkB,GAAG,EAAE;AACvB,QAAA,IAAA,CAAA,YAAY,GAAa;;YAEvB,OAAO;YACP,aAAa;YACb,aAAa;YACb,SAAS;YACT,SAAS;YACT,cAAc;YACd,SAAS;YACT,eAAe;YACf,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,aAAa;YACb,QAAQ;YACR,wBAAwB;YACxB,UAAU;YACV,QAAQ;YACR,SAAS;YACT,QAAQ;YACR,UAAU;YACV,eAAe;YACf,eAAe;YACf,gBAAgB;YAChB,qBAAqB;YACrB,eAAe;YACf,oBAAoB;YACpB,oBAAoB;YACpB,uBAAuB;YACvB,mBAAmB;YACnB,sBAAsB;YACtB,kBAAkB;YAClB,iBAAiB;YACjB,oBAAoB;YACpB,iBAAiB;YACjB,WAAW;YACX,YAAY;YACZ,cAAc;YACd,SAAS;YACT,YAAY;YACZ,mBAAmB;YACnB,aAAa;YACb,cAAc;YACd,UAAU;YACV,mBAAmB;YACnB,gBAAgB;YAChB,iBAAiB;YACjB,QAAQ;YACR,aAAa;YACb,SAAS;YACT,QAAQ;YACR,QAAQ;YACR,iBAAiB;YACjB,cAAc;YACd,SAAS;YACT,UAAU;YACV,WAAW;YACX,WAAW;YACX,YAAY;YACZ,OAAO;YACP;SACD;AAED,QAAA,IAAA,CAAA,SAAS,GAAa;YACpB,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;SACjE;QAyID,IAAA,CAAA,iBAAiB,GAAU,EAAE;QAC7B,IAAA,CAAA,aAAa,GAAU,EAAE;QACzB,IAAA,CAAA,kBAAkB,GAAU,EAAE;QAE9B,IAAA,CAAA,wBAAwB,GAAU,EAAE;QACpC,IAAA,CAAA,oBAAoB,GAAU,EAAE;QAChC,IAAA,CAAA,yBAAyB,GAAU,EAAE;QA2HrC,IAAA,CAAA,uBAAuB,GAAG,CAAC;;QAwO3B,IAAA,CAAA,YAAY,GAA2B,IAAI;QAqG3C,IAAA,CAAA,aAAa,GAAG,KAAK;;AA4PrB,QAAA,IAAA,CAAA,YAAY,GAAgB,IAAI,GAAG,EAAE;QA6PrC,IAAA,CAAA,eAAe,GAAG,KAAK;QA8DvB,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAG3B,IAAA,CAAA,eAAe,GAAG,EAAE;QACpB,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,WAAW,GAAU,EAAE;AA8DvB,QAAA,IAAA,CAAA,oBAAoB,GAAG,CAAC,CAAS,EAAE,IAAS,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC;QAE7D,IAAA,CAAA,iBAAiB,GAAG,KAAK;QACzB,IAAA,CAAA,iBAAiB,GAAG,KAAK;QACzB,IAAA,CAAA,aAAa,GAAkB,IAAI;QAM3C,IAAA,CAAA,aAAa,GAAU,EAAE;;QAUjB,IAAA,CAAA,aAAa,GAAkB,IAAI;;;;;;;;;;;;;;;;QAkB3C,IAAA,CAAA,UAAU,GAAG,CAAC;AAEN,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AA+G3C,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,IAAA,CAAA,UAAU,GAAG,CAAC,CAAC;AACf,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,CAAC;QAER,IAAA,CAAA,SAAS,GAAkB,IAAI;QAC/B,IAAA,CAAA,gBAAgB,GAAG,CAAC;AAQpB,QAAA,IAAA,CAAA,QAAQ,GAAG,EAAE,CAAC;QAkDtB,IAAA,CAAA,cAAc,GAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDvB,QAAA,IAAA,CAAA,sBAAsB,GAAG,CAAC,IAAkB,EAAE,IAAsB,KAAI;;AAEtE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;YACtB,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE;AAC3C,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW,CAChD;YACH;AACA,YAAA,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW;AAC5C,QAAA,CAAC;QAiLD,IAAA,CAAA,4BAA4B,GAAG,KAAK;QACpC,IAAA,CAAA,uBAAuB,GAAG,KAAK;QAa/B,IAAA,CAAA,qBAAqB,GAAQ,IAAI;AAKjC,QAAA,IAAA,CAAA,WAAW,GAAG,OAAO,KAA4B,EAAE,OAAe,KAAI;AACpE,YAAA,MAAM,OAAO,GAAI,IAAY,CAAC,OAAO,CAAC;AACtC,YAAA,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,YAAY;gBAAE;YAChD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAI;AACjD,gBAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAChD,oBAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,CAAC,UAAU,CAAC;gBAC5D;gBACA,OAAO,GAAG,CAAC,UAAU;AACvB,YAAA,CAAC,CAAC;YACF,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM;YACjE,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM;AAC/D,YAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,cAAc,CAC5C;AACD,YAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,aAAa,CAC3C;AACD,YAAA,MAAM,SAAS,GAAG,CAAC,IAAS,KAAc;AACxC,gBAAA,IAAI,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AAClD,oBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,CAAC;gBACvD;AACA,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACrB,YAAA,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC;AAChD,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACtB,kBAAG,EAAoB,CAAC,MAAM,CAC5B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAAkB,CAC7E;kBAED,EAAE;AACN,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB;YACrD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC;YACzC,eAAe,CAAE,IAAY,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;AAE3E,YAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC;AAC5F,YAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;YAC3F,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,CAAC;;AAE3E,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAC7B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAC/B;AAClB,gBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;oBAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI;oBAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAE;AACvC,oBAAA,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO;AAChC,oBAAA,IAAI,MAAM,KAAK,CAAC,EAAE;AAChB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACjC,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;wBAC5B,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,WAAA,EAAc,MAAM,KAAK;wBAC9C,KAAK,EAAE,CAAC,WAAW;AACnB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,8CAA8C;AACpE,wBAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe;wBACpC,MAAM,MAAM,GAAG,MAAK;AAClB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AACvB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;AACjD,wBAAA,CAAC;AACD,wBAAA,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC;oBAC9C;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;QAiGD,IAAA,CAAA,WAAW,GAAa,EAAE;AA8B1B,QAAA,IAAA,CAAA,qBAAqB,GAAG,OAAO,KAA4B,EAAE,OAAe,KAAI;AAC9E,YAAA,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,YAAY;gBAAE;AAEhD,YAAA,MAAM,MAAM,GACV,OAAO,IAAI;AACT,kBAAE;kBACA,OAAO,IAAI;AACX,sBAAE;sBACA,EAAE;AAEV,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC3B,CAAC,GAAQ,KACP,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,gBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,CACpE;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CACvC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CACrC;YACD,MAAM,aAAa,GAAG,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAI;gBACxD,MAAM,aAAa,GACjB,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,KAAK,EAAE,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,MAAM;AACnF,gBAAA,OAAO,aAAa,IAAI,GAAG,EAAE,UAAU;AACzC,YAAA,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK;YAC9D,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK;AAC5D,YAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,IAAI,aAAa,CACzC;AACD,YAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAC/C,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,IAAI,YAAY,CACxC;AACD,YAAA,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC;AAC/C,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACtB,kBAAG,EAAoB,CAAC,MAAM,CAC5B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAAkB,CAC7E;kBAED,EAAE;YAEN,MAAM,cAAc,GAAI,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAChD,CAAC,GAAQ,KACP,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,gBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,CACpE;YAED,MAAM,oBAAoB,GAAI,IAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CACtD,CAAC,GAAQ,KACP,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,gBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAU,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,CACpE;YAED,MAAM,mBAAmB,GAAI,IAAY,CAAC,OAAO,CAAC,CAAC,SAAS,CAC1D,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,CACnD;AAED,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB;YACrD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC;AAC9E,YAAA,eAAe,CACb,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAClC,gBAAgB,EAChB,gBAAgB,CACjB;YAED,eAAe,CACZ,IAAY,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,CAAC,QAAQ,EACtD,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CACnB;;AAGD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAC7B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAC,CAC/B;AAClB,gBAAA,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;oBAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,IAAI;oBAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAE;AACvC,oBAAA,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO;AAChC,oBAAA,IAAI,MAAM,KAAK,CAAC,EAAE;AAChB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW;AACjC,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;wBAC5B,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,WAAA,EAAc,MAAM,KAAK;wBAC9C,KAAK,EAAE,CAAC,WAAW;AACnB,wBAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,8CAA8C;AACpE,wBAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe;wBAEpC,MAAM,MAAM,GAAG,MAAK;AAClB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AACvB,4BAAA,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACxB,4BAAA,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC;AACjD,wBAAA,CAAC;AACD,wBAAA,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC;oBAC9C;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;AACjC,QAAA,CAAC;QA8DD,IAAA,CAAA,kBAAkB,GAAG,KAAK;QAa1B,IAAA,CAAA,eAAe,GAAG,EAAE;QA+CpB,IAAA,CAAA,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAsC/D,IAAA,CAAA,2BAA2B,GAAG,EAAE;QA+ChC,IAAA,CAAA,YAAY,GAAG,KAAK;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,KAAK;QA2B/C,IAAA,CAAA,UAAU,GAAQ,EAAE;QACpB,IAAA,CAAA,cAAc,GAAG,EAAE;QACnB,IAAA,CAAA,WAAW,GAAQ,EAAE;QACrB,IAAA,CAAA,eAAe,GAAG,EAAE;QACpB,IAAA,CAAA,SAAS,GAAG,EAAE;QAcd,IAAA,CAAA,qBAAqB,GAAU,EAAE;AAEjC,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,GAAG,EAAU;;QA4P5C,IAAA,CAAA,UAAU,GAAkB,IAAI;QAChC,IAAA,CAAA,UAAU,GAAkB,IAAI;QAmDhC,IAAA,CAAA,UAAU,GAAG,kDAAkD;AA6K/D,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAkB;QACjC,IAAA,CAAA,QAAQ,GAAG,EAAE;;QAqFrB,IAAA,CAAA,gBAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;QA6B1D,IAAA,CAAA,UAAU,GAAY,IAAI;QAC1B,IAAA,CAAA,IAAI,GAAG,CAAC;QACR,IAAA,CAAA,IAAI,GAAG,CAAC;QACR,IAAA,CAAA,SAAS,GAAG,KAAK;QAGjB,IAAA,CAAA,aAAa,GAAG,KAAK;;;;;;;;;;QAkPrB,IAAA,CAAA,aAAa,GAAU,EAAE;AACzB,QAAA,IAAA,CAAA,YAAY,GAAgB,IAAI,GAAG,EAAE;QACrC,IAAA,CAAA,cAAc,GAAQ,IAAI;QAC1B,IAAA,CAAA,WAAW,GAAG,KAAK;AA2JX,QAAA,IAAA,CAAA,eAAe,GAKnB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAiFxD,IAAA,CAAA,+BAA+B,GAAQ,IAAI;QACnC,IAAA,CAAA,WAAW,GAAG,GAAG;QACjB,IAAA,CAAA,YAAY,GAAG,GAAG;;;;;;;;;;AAoD1B,QAAA,IAAA,CAAA,kBAAkB,GAAgB,IAAI,GAAG,EAAE;QAC3C,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,sBAAsB,GAAkB,IAAI;QAC5C,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QAqF9B,IAAA,CAAA,SAAS,GAAY,EAAE;QACvB,IAAA,CAAA,SAAS,GAAY,EAAE;;AAoHzB,QAAA,IAAA,CAAA,gBAAgB,GAAkB,IAAI,CAAC;QACvC,IAAA,CAAA,eAAe,GAAQ,IAAI;QAC3B,IAAA,CAAA,eAAe,GAAQ,IAAI;;QAG3B,IAAA,CAAA,iBAAiB,GAAW,EAAE;QAC9B,IAAA,CAAA,qBAAqB,GAAW,SAAS;AACzC,QAAA,IAAA,CAAA,aAAa,GAAmD,IAAI,GAAG,EAAE,CAAC;;QAG1E,IAAA,CAAA,2BAA2B,GAAQ,IAAI;QACvC,IAAA,CAAA,gBAAgB,GAAQ,IAAI;QA6LnB,IAAA,CAAA,mBAAmB,GAAoB,OAAO;QAE9C,IAAA,CAAA,eAAe,GAAqB,KAAK;AA2BlD,QAAA,IAAA,CAAA,eAAe,GAAG;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE,IAAW;AACtB,YAAA,YAAY,EAAE,IAAW;AACzB,YAAA,eAAe,EAAE,EAAW;YAC5B,aAAa,EAAE,CAAC;SACjB;AA6DD,QAAA,IAAA,CAAA,oBAAoB,GAAqB,IAAI,GAAG,EAAE,CAAC;AACnD,QAAA,IAAA,CAAA,qBAAqB,GAAyB,IAAI,GAAG,EAAE,CAAC;QA2IxD,IAAA,CAAA,cAAc,GAAG,KAAK;AACtB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC;QACvB,IAAA,CAAA,mBAAmB,GAAkB,IAAI;QACzC,IAAA,CAAA,kBAAkB,GAAQ,IAAI;QAC9B,IAAA,CAAA,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QA0ChC,IAAA,CAAA,cAAc,GAAuB,IAAI;QA8LzC,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAGxD,IAAA,CAAA,cAAc,GAAW,CAAC;QAC1B,IAAA,CAAA,iBAAiB,GAAW,IAAI;;QA8DxB,IAAA,CAAA,wBAAwB,GAAQ,IAAI;QACpC,IAAA,CAAA,6BAA6B,GAAQ,IAAI;QACzC,IAAA,CAAA,4BAA4B,GAAQ,IAAI;QA2EhD,IAAA,CAAA,yBAAyB,GAAG,KAAK;QACjC,IAAA,CAAA,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC3C,IAAA,CAAA,sBAAsB,GAAU,EAAE;QAElC,IAAA,CAAA,wBAAwB,GAAG,KAAK;QAChC,IAAA,CAAA,yBAAyB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC1C,IAAA,CAAA,iBAAiB,GAAU,EAAE;;;;QAQ7B,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAgJ3B,IAAA,CAAA,qBAAqB,GAAG,KAAK;QAC7B,IAAA,CAAA,kCAAkC,GAAQ,IAAI;QA2YG,IAAA,CAAA,eAAe,GAAsC,IAAI;QAiTlG,IAAA,CAAA,gBAAgB,GAAG,KAAK;;;AAKhC,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,GAAG,EAKzB;;AAyHH,QAAA,IAAA,CAAA,YAAY,GAAW,EAAE,CAAC;QAC1B,IAAA,CAAA,UAAU,GAAG,KAAK;AAClB,QAAA,IAAA,CAAA,QAAQ,GAAqC;AAC3C,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,gBAAgB,EAAE,YAAY;AAC9B,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,cAAc,EAAE,eAAe;AAC/B,YAAA,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE;YAC9B,eAAe,EAAE,IAAI;AACrB,YAAA,kBAAkB,EAAE,IAAI;YACxB,aAAa,EAAE,CAAC;SACjB;;;;;;;;;;;;;;IA3wKA;AAGD,IAAA,MAAM,eAAe,GAAA;QACnB,UAAU,CAAC,YAAW;;;;;AAKpB,YAAA,MAAM,IAAI,CAAC,sBAAsB,EAAE;AACnC,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAK;AACvC,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,gBAAA,CAAC,CAAC;gBACF,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC/C;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;;;;;IAQT;IAEA,MAAM,WAAW,CAAC,OAAsB,EAAA;AACtC,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;AAC5B,YAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;YAClC,IAAI,CAAC,wBAAwB,EAAE;QACjC;QACA,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE;;YAE5C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;YACpD,IAAI,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE;AACtD,gBAAA,MAAM,IAAI,CAAC,sBAAsB,EAAE;AACnC,gBAAA,MAAM,IAAI,CAAC,2BAA2B,EAAE;AACxC,gBAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;gBAClC,IAAI,CAAC,gBAAgB,EAAE;AACvB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;YACA,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAExB,qBAAqB,CAAC,MAAK;AAEzB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM;AAC5C,gBAAA,GAAG,GAAG;gBACN,cAAc,EAAE,CAAC,GAAG;AACrB,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;AACpD,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;oBAClC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,oBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC3B;YACF,CAAC,EAAE,GAAG,CAAC;AACP,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE;AAC1C,gBAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,WAAW;AACtD,gBAAA,IAAG,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAC;AAC1C,oBAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE,UAAU;gBACzG;AACA,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AAEA,YAAA,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/D,gBAAA,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC;YACxE;QAEF;QACA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE;AACjD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;AACA,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE;AACpC,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;YAC7B;QACF;AACA,QAAA,IAAI,OAAO,CAAC,wBAAwB,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,KAAK;QAC9F;QACA,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,KAAK,IAAI,EAAE;AACrD,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;gBACzB,IAAI,GAAG,CAAC,eAAe;AAAE,oBAAA,GAAG,CAAC,eAAe,GAAG,KAAK;AACtD,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACE;AAIA,IAAA,MAAM,qBAAqB,GAAA;AACzB,QAAA;AACA,QAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACtG,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAmCA,IAAA,MAAM,2BAA2B,CAAC,OAAA,GAAe,IAAI,EAAA;QACnD,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;QAE7B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW;;AAGvE,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAQ,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAChD,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,EAChC,cAAc,CACf;YACD,OAAO,CAAC,QAAQ,CAAC;AACnB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM;AAC3B,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,MAAM,qBAAqB,CAAC,OAAA,GAAe,IAAI,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;QAE7B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW;;AAGvE,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAQ,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAChD,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,EAChC,cAAc,CACf;YACD,OAAO,CAAC,QAAQ,CAAC;AACnB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,oBAAoB,GAAG,MAAM;AAClC,QAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;AACtC,QAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,MAAM,sBAAsB,GAAA;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,WAAW;AACxE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CACnD,IAAI,CAAC,OAAO,EACZ,cAAc,CACf;AACD,QAAA,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAGA,gBAAgB,GAAA;QACd,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAgB;QACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CACnC,yBAAyB,CACX;QAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAgB;QACzE,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,WAAW,EAAE;QAC5E;QACA,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,WAAW,EAAE;QAC9E;QACA,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW,EAAE;QAC7E;IACF;;;;;;;;;;;IAeA,gBAAgB,GAAA;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS;QAC7D,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACzD,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;IAC1D;IACA,iBAAiB,GAAA;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS;QAC9D,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACzD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;IACzD;AAGA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,UAAU;QAChD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QAClE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;IACtE;IAKA,cAAc,CAAC,GAAQ,EAAE,KAAa,EAAA;QACpC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IACtE;IAEA,kBAAkB,CAAC,GAAQ,EAAE,KAAa,EAAA;AACxC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAChC,MAAM,KAAK,GAAG;aACX,KAAK,CAAC,GAAG;AACT,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC;AACvF,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,aAAa,CAAC,KAAiB,EAAE,GAAQ,EAAE,aAAuB,EAAA;QAChE,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE;QACnC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE;QAEtB,MAAM,WAAW,GAAuC,QAAQ,CAAC,GAAG,CAClE,CAAC,KAAU,KAAI;AACb,YAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAC/B,CAAA,QAAA,EAAW,KAAK,CAAC,KAAK,CAAA,EAAA,CAAI,CACZ;YAChB,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,gBAAA,KAAK,EAAE,EAAE,EAAE,WAAW,IAAI,CAAC;aAC5B;AACH,QAAA,CAAC,CACF;QAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAC1C,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,KAAK,EAC7B,CAAC,CACF;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,IAAI,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;YAEvC,IAAI,aAAa,EAAE;gBACjB,MAAM,GAAG,CAAC,MAAM;YAClB;;YAGA,IAAI,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE;gBAAE;YAEvD,IAAI,aAAa,GAAG,CAAC;AAErB,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC5B,gBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,iBAAiB;AAC7C,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,KAAK,EAAE,EAAE,CAAC;gBAC3D,aAAa,IAAI,QAAQ;AAEzB,gBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,KAAK,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;AACtE,gBAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAW,KAAI;oBAC/B,MAAM,MAAM,GAAG,EAAiB;oBAChC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;oBACvC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;AACtC,gBAAA,CAAC,CAAC;gBAEF,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;AAC9D,YAAA,CAAC,CAAC;;AAGF,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAC1C,CAAA,QAAA,EAAW,GAAG,CAAC,MAAM,CAAA,EAAA,CAAI,CACX;YAChB,IAAI,aAAa,EAAE;gBACjB,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,aAAa,IAAI;AAChD,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AACF,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC5B;YACA,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAChD,YAAA,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,IAAI,EAAE,2BAA2B;aAClC;AACD,YAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAC5C,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;IAEQ,gCAAgC,CAAC,KAAa,EAAE,KAAa,EAAA;AACnE,QAAA,MAAM,MAAM,GAAG,CAAC,OAAc,KAAI;AAChC,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,oBAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACtB;AAAO,qBAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE;AAC9B,oBAAA,GAAG,CAAC,KAAK,GAAG,KAAK;gBACnB;YACF;AACF,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,cAAc,CAAC,KAAiB,EAAE,GAAQ,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAE5B,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,CAAA,QAAA,EAAW,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CACV;AAChB,QAAA,MAAM,YAAY,GAAG,QAAQ,EAAE,WAAW,IAAI,GAAG;AAEjD,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;;AAGvE,QAAA,IAAI,GAAG,EAAE,MAAM,IAAI,OAAO,EAAE;AAC1B,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAW,KAAI;AACjC,gBAAA,EAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;AAC/D,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAW,KAAI;AACjC,gBAAA,EAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;AACzD,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,IAAI,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;;AAGvC,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE;gBAC1B,MAAM,GAAG,CAAC,MAAM;YAClB;AAEA,YAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,MAAM;YACpC,IAAI,QAAQ,GAAG,EAAE;gBAAE;AAEnB,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAW,KAAI;gBAClC,MAAM,OAAO,GAAG,EAAiB;gBACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;gBACxC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;AACvC,YAAA,CAAC,CAAC;YAEF,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;AAC5D,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC5B;YACA,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,IAAI,EAAE,2BAA2B;aAClC;AACD,YAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAE1C,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAW,KAAI;AACjC,gBAAA,EAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;AACzD,gBAAA,EAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC;AAClE,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAClD,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;AAIA,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC;AAC7D,QAAA,MAAM,YAAY,GAAG,QAAQ,EAAE,WAAW,IAAI,GAAG;AAEjD,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;AAEzC,YAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,MAAM;YACpC,IAAI,QAAQ,GAAG,GAAG;gBAAE,QAAQ,GAAG,GAAG;YAElC,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;gBACtC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;AACzC,gBAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;YACjC;AACF,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAClD,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;AAGA,IAAA,cAAc,CAAC,GAAQ,EAAA;QACrB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE;IAC1D;;AAGA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE;QAC/C,OAAO,CAAA,YAAA,EAAe,MAAM,CAAA,GAAA,CAAK;IACnC;AAIA,IAAA,UAAU,CAAC,GAAQ,EAAA;QACjB,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;IACvC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;AAEA,IAAA,aAAa,CAAC,KAAU,EAAA;AACxB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B;AAGE,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IACE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC/B,YAAY;YACZ,qBAAqB;YACrB,aAAa;YACb,aAAa;AACd,SAAA,CAAC,EACF;AACA,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACzD,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAClC;AACA,QAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC;AACtG,YAAA,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;AAC7H,QAAA,MAAM,8BAA8B,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;QACvH,IAAI,CAAC,8BAA8B,EAAE;YACnC,IAAI,CAAC,wBAAwB,EAAE;QACjC;QACA,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAClC;QACA,IAAG,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAC;AACxC,YAAA,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1E;;;;;;;;;;AAaF,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAqB,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,EAAE;AAC/F,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;QAGC,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;QACvE,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACjC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IAEA;IAGA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;IACpC;AAGA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;AACpC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IAEQ,kBAAkB,CACxB,OAAoB,EACpB,SAAmB,EAAA;QAEnB,IAAI,EAAE,GAAuB,OAAO;AAEpC,QAAA,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IACE,EAAE,CAAC,SAAS;AACZ,gBAAA,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAChE;AACA,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,EAAE,GAAG,EAAE,CAAC,aAAa;QACvB;AAEA,QAAA,OAAO,KAAK;IACd;IAGA,iBAAiB,CAAC,KAAiB,EAAE,KAAU,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW;AACzE,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO;QACvB,UAAU,CAAC,MAAK;YACd,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAgB;YACrE,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,EAAE;oBAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA,EAAA,CAAI;gBACrC;qBAAO;oBACL,OAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,CAAC,IAAI;gBAChC;YACF;AACA,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,CAAC,CAAC;IACP;;;;;;AAMA,IAAA,OAAO,CAAC,GAAQ,EAAA;QACd,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AACtB,QAAA,GAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE;SACT;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,QAAQ,CAAC,GAAQ,EAAA;QACf,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AACtB,QAAA,GAAI,CAAC,QAAQ,GAAG,MAAM;AACtB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,MAAM,EAAE;SACT;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,SAAS,CAAC,GAAQ,EAAA;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC7C,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC;AAGA,IAAA,MAAM,8BAA8B,CAClC,MAAW,EACX,MAA+B,EAAA;AAE/B,QAAA,MAAM,MAAM,GAAG,CAAC,OAAc,KAAI;AAChC,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,oBAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACtB;qBAAO,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AACrC,oBAAA,GAAG,CAAC,MAAM,GAAG,MAAM;gBACrB;YACF;AACF,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACpB,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5C;AAEA,IAAA,cAAc,CAAC,IAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;AAGrB,QAAA,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;;AAG3D,QAAA,MAAM,qBAAqB,GAAG,CAAC,OAAc,KAAW;YACtD,MAAM,MAAM,GAAU,EAAE;AACxB,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxD;AAAO,qBAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AAC5B,oBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrB;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1D,QAAA,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM;QAE1C,IAAI,YAAY,KAAK,CAAC;YAAE;QAExB,MAAM,cAAc,GAClB,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;;AAG5D,QAAA,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE;AACjC,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;AACpB,gBAAA,GAAG,CAAC,KAAK,GAAG,UAAU;gBACtB,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC;YAC9D;QACF;QAEA,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;AAEA,IAAA,aAAa,CAAC,KAAU,EAAA;QACtB,QACE,KAAK,EAAE;cACH,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,EAAE,UAAU;cACpC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAQ,KAAK,GAAG,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;IAE1E;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AAErB,QAAA,MAAM,qBAAqB,GAAG,CAAC,OAAc,KAAW;YACtD,MAAM,MAAM,GAAU,EAAE;AAExB,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxD;AAAO,qBAAA,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE;AACtC,oBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrB;YACF;AAEA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1D,QAAA,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM;QAE1C,IAAI,YAAY,KAAK,CAAC;YAAE;QAExB,MAAM,cAAc,GAClB,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC;AACzD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,EAAE,GAAG,CAAC;;AAG3E,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC7B,YAAA,GAAG,CAAC,KAAK,GAAG,UAAU;YACtB,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC;AAC9D,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEQ,mBAAmB,CAAC,OAAc,EAAE,KAAa,EAAA;AACvD,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE;AACvB,gBAAA,GAAG,CAAC,YAAY,GAAG,IAAI;gBACvB;YACF;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC/C;QACF;IACF;IAEA,MAAM,OAAO,CAAC,GAAQ,EAAA;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,GAAG,EAAE,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC;QACnD;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;QACtE,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;QAEP,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,WAAW;AACxE,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,EAAE,CAAC;IACR;AAEA,IAAA,MAAM,cAAc,CAAC,IAAW,EAAE,WAAqB,EAAA;AACrD,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;YAC3B,UAAU,CAAC,MAAK;gBACd,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC;YACjB,CAAC,EAAE,CAAC,CAAC;AACP,QAAA,CAAC,CAAC;IACJ;IAKA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QAErB,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;QACpD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;AAEA,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,GAAG,CAAC,UAAU,GAAG,EAAE;AACnB,QAAA,GAAG,CAAC,WAAW,GAAG,EAAE;AACpB,QAAA,GAAG,CAAC,cAAc,GAAG,UAAU;AAC/B,QAAA,GAAG,CAAC,eAAe,GAAG,UAAU;AAChC,QAAA,GAAG,CAAC,KAAK,GAAG,KAAK;AACjB,QAAA,GAAG,CAAC,SAAS,GAAG,KAAK;AACrB,QAAA,GAAG,CAAC,eAAe,GAAG,EAAE;AACxB,QAAA,GAAG,CAAC,WAAW,GAAG,EAAE;IAEtB;AAGA,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;IAClC;AAMA;;AAEG;AACK,IAAA,QAAQ,CAAC,GAAQ,EAAA;AACvB,QAAA,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG;IAC1B;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,GAAQ,EAAA;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B;QAEA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACzC,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE;gBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,GAAG,EAAE;AACN,aAAA;AACD,YAAA,SAAS,EAAE,aAAa;SACzB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAGA,IAAA,eAAe,CAAC,IAAW,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnE,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD;aAAO;AACL,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AACzC,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE;gBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,gBAAA,GAAG,EAAE;AACN,aAAA;AACD,YAAA,SAAS,EAAE,aAAa;SACzB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,aAAa,CAAC,GAAQ,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD;AAEA,IAAA,aAAa,CAAC,IAAW,EAAA;AACvB,QAAA,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;IACvG;AAEA,IAAA,oBAAoB,CAAC,IAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM;QAC1F,OAAO,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM;IACzD;;AAGA,IAAA,cAAc,CAAC,SAA4B,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,sBAAsB,IAAI,SAAS,EAAE;AAC5C,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;AACvC,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe;QAC9C;aAAO,IACL,IAAI,CAAC,eAAe;AACpB,YAAA,SAAS,IAAI,IAAI,CAAC,sBAAsB,EACxC;AACA,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;YACvC;QACF;aAAO;AACL,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;AACvC,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe;QAC9C;IACF;AAEA,IAAA,qBAAqB,CAAC,GAAQ,EAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAU,KAAK,KAAK,CAAC,UAAU,CAAC;AACvE,QAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC,CAAC;AACtE,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1C,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,sBAAsB,EAAE;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,EAAE,CAAC;IACR;AAEA,IAAA,eAAe,CAAC,OAAY,EAAA;AAC1B,QAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;AACrB,YAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAY,KAAK,OAAO,CAAC,UAAU,CAAC;QACrE;QAEA,OAAO,OAAO,EAAE,UAAU;IAC5B;IAEA,kBAAkB,GAAA;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACjD,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,UAAU,CAAC;IAC/C;IAGQ,iBAAiB,CAAC,KAAa,EAAE,IAAW,EAAA;AAClD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE;AACvB,gBAAA,OAAO,GAAG;YACZ;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC/C,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC;AACzD,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAIA,IAAA,MAAM,sBAAsB,CAAC,MAAW,EAAE,SAAkB,EAAA;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;QAC9D,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,UAAU,GAAG,SAAS;QAC5B;AACA,QAAA,MAAM,IAAI,CAAC,cAAc,EAAE;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B;IACF;IAGA,0BAA0B,GAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AACjD,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,CAAC;AAC/D,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,MAAM,GAAG,CAAC,UAAU,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9D,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,qBAAqB,EAAE;AAC5B,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B,CAAC,EAAE,GAAG,CAAC;QACT,CAAC,EAAE,GAAG,CAAC;IACT;AAEA,IAAA,cAAc,CAAC,IAAW,EAAA;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAU,EAAE,GAAQ,KAAI;YAC1C,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;;AAExC,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD;iBAAO;;AAEL,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;YACxB;QACF,CAAC,EAAE,EAAE,CAAC;IACR;AAGA,IAAA,eAAe,CAAC,IAAW,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC9C,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,GAAG,KAAI;AACX,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;gBAChB,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC3D,IACE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACzC,gBAAgB,CAAC,MAAM,EACvB;oBACA,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE;gBAC/C;AACA,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI;YAC/D;AACF,QAAA,CAAC;aACA,MAAM,CAAC,OAAO,CAAC;IACpB;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM;QAEjE,IAAI,aAAa,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,IAAI,aAAa,KAAK,MAAM,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM;QAEvE,IAAI,aAAa,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,IAAI,aAAa,KAAK,MAAM,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,OAAO,MAAM;IACf;;AAGQ,IAAA,kBAAkB,CAAC,IAAW,EAAA;QACpC,IAAI,MAAM,GAAU,EAAE;AACtB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAChB,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/D;QACF;AACA,QAAA,OAAO,MAAM;IACf;;IAGA,mBAAmB,GAAA;AACjB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI;QAC9D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;IACjD;IAEA,yBAAyB,GAAA;AACvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI;QACpE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;IACvD;IAEQ,iBAAiB,CAAC,IAAW,EAAE,KAAc,EAAA;AACnD,QAAA,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,GAAG,CAAC,QAAQ,GAAG,KAAK;gBACpB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC9C;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IACQ,uBAAuB,CAAC,IAAW,EAAE,KAAc,EAAA;AACzD,QAAA,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACxB,gBAAA,GAAG,CAAC,cAAc,GAAG,KAAK;gBAC1B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpD;QACF;IACF;IAIA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;IAC9B;AAGA,IAAA,QAAQ,CAAC,KAAoB,EAAA;QAC3B,IAAI,CAAC,qBAAqB,EAAE;IAC9B;;AAGA,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;IACjE;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;IAChE;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5D;AAKA,IAAA,QAAQ,CAAC,KAAc,EAAA;QACrB,IAAI,CAAC,kBAAkB,EAAE;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,CAAC;AACjE,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QACxB,UAAU,CAAC,MAAK,EAAG,CAAC,EAAE,GAAG,CAAC;IAC5B;AAEA,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAW;AACvC,YAAA,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,YAAA,MAAM,IAAI,CAAC,2BAA2B,EAAE;AACxC,YAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;AAElC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;AACjD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7D;AAEA,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/D;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9D;IAEA,wBAAwB,GAAA;AACtB,QAAA,OAAO,CAAA,YAAA,EAAe,IAAI,CAAC,eAAe,GAAG;IAC/C;IASQ,kBAAkB,CACxB,OAAc,EAAE,EAChB,KAAK,GAAG,CAAC,EACT,MAAA,GAAgB,EAAE,EAAA;AAElB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACvC,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;AACvD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;YACtD;QACF;AACA,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3C,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,oBAAoB,CAAC,IAAW,EAAA;QAC9B,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,MAAM,IAAI,GAAG,CAAC,KAAY,KAAU;AAClC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IAAI,CAAC,cAAc,GAAG,YAAY,EAAE;AACpC,gBAAA,IAAI,IAAI,EAAE,OAAO,EAAE;oBACjB,MAAM,KAAK,GAAG,IAAI;AAClB,oBAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACnD,wBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACtB;gBACF;YACF;AACF,QAAA,CAAC;QACD,IAAI,CAAC,IAAI,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC;AAC/C,QAAA,OAAO,IAAI;IACb;AAGA,IAAA,iBAAiB,CAAC,SAAiB,EAAA;QAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QACtD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE;AAC9B,YAAA,IAAI,CAAC,WAAW,GAAG,QAAQ;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB;QACF;AACA,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM;AAC7B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;AACvD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;AAEtD,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AAC7C,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IASA,SAAS,CAAC,KAAa,EAAE,IAAS,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG;IAC5B;IAIA,mBAAmB,GAAA;QACjB,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1D,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,EAAE,CAAC;IACR;AAwBA,IAAA,YAAY,CAAC,KAAY,EAAA;;AAEvB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAC9B;QACF;AACA,QAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAAsB,CAAC,SAAS;QACzD,IAAI,IAAI,CAAC,aAAa;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;AAChE,QAAA,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,MAAK;;;YAG9C,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;gBACxB;YACF;YACA,MAAM,QAAQ,GAAG,EAAE;AACnB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AAC5D,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,aAAa,CAAC,MAAM,EACzB,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,QAAQ,CAC7C;AACD,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AACjD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;;AAGxB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACxC,YAAA,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE;gBACtE,MAAM,SAAS,GAAG,GAAG;AACrB,gBAAA,IAAI,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,YAAY,GAAG,SAAS,EAAE;AACjE,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACtB;YACF;AACF,QAAA,CAAC,CAAC;IACJ;AAGA,IAAA,IAAI,kBAAkB,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAClC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACxC,QAAA,OAAO,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY;IAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAC9B;QACF;QACE,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB;QACF;AACF,QAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAAsB,CAAC,SAAS;QACzD,IAAI,IAAI,CAAC,aAAa;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC;AAChE,QAAA,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;YAC7B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;AACnD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACxD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,aAAa,CAAC,MAAM,EACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,GAAG,QAAQ,CAC/C;AACD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AACvD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;IAqBA,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;QAC7C;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,IAAI,CAAC;;AAGzD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;;YAGjE,IAAI,CAAC,YAAY,GAAG,cAAc,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;AAEtD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAGA,IAAA,sBAAsB,CAAC,KAAY,EAAA;AACjC,QAAA,MAAM,UAAU,GAAI,KAAK,CAAC,MAAsB,CAAC,UAAU;QAC3D,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU;QAC7D,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU;IACjE;AAEA,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACtE,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACtE;IACF;AAEA,IAAA,oBAAoB,CAAC,KAAY,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE;YAC5C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACxE;AACA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,aAAa,EAAE;YAC5C,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACxE;IACF;AAoEA,IAAA,WAAW,CAAC,KAAuB,EAAA;AACjC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AACxC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;QAExC,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAC3C,6BAA6B,CAC9B;QAED,IAAI,aAAa,EAAE;AACjB,YAAA,MAAM,IAAI,GAAG,aAAa,CAAC,qBAAqB,EAAE;AAElD,YAAA,MAAM,YAAY,GAChB,QAAQ,IAAI,IAAI,CAAC,IAAI;gBACrB,QAAQ,IAAI,IAAI,CAAC,KAAK;gBACtB,QAAQ,IAAI,IAAI,CAAC,GAAG;AACpB,gBAAA,QAAQ,IAAI,IAAI,CAAC,MAAM;YAEzB,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;YACjC;iBAAO;AACL,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAClC;QACF;IACF;AAEA,IAAA,qBAAqB,CAAC,QAA2B,EAAA;AAC/C,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;AACvC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QAE/B,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACnC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC5C;YACD,IAAI,WAAW,EAAE;gBACf,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAiB,KAAI;oBAClD,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAC7C,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;oBACD,IAAI,aAAa,EAAE;wBACjB,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,aAAa,CAAC,WAAW;oBAC1D;AACF,gBAAA,CAAC,CAAC;YACJ;QACF;aACK;;YAEH,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAClC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAC/C;YAED,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,WAAW;YACxD;iBAAO;AACL,gBAAA,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;oBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;wBACjC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;wBACD,IAAI,aAAa,EAAE;4BACjB,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,aAAa,CAAC,WAAW;4BACxD;wBACF;oBACF;gBACF;YACF;QACF;;QAGA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,eAAe,CACb,QAA2B,EAC3B,OAAoC,EAAA;AAEpC,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;QAEvC,MAAM,YAAY,GAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CACzC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAC3C;AAED,QAAA,IAAI,CAAC,YAAY;YAAE;AAEnB,QAAA,IACE,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EACrC;YACA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAiB,KAAI;gBAClD,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAC9C,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;gBACD,IAAI,aAAa,EAAE;AACjB,oBAAA,aAAa,CAAC,MAAM,GAAG,OAAO,KAAK,QAAQ,GAAG,IAAI,GAAG,OAAO;AAC5D,oBAAA,aAAa,CAAC,cAAc,CAAC,GAAG,KAAK;gBACvC;AACF,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,YAAY,CAAC,MAAM,GAAG,OAAO,KAAK,QAAQ,GAAG,IAAI,GAAG,OAAO;AAC3D,YAAA,YAAY,CAAC,cAAc,CAAC,GAAG,KAAK;QACtC;QAEA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,qBAAqB,CAAC,QAA2B,EAAA;AAC/C,QAAA,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,uBAAuB;AAChE,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;;;;;;;;;;;;;;;;;;;AAoB/B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,mBAAmB,CAAC,QAA0B,EAAA;AAC5C,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK;AACpC,QAAA,IAAI,CAAC,4BAA4B,GAAG,KAAK;AACzC,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACnC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC5C;YACD,IAAI,WAAW,EAAE;gBACf,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAiB,KAAI;oBAClD,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAC7C,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;oBACD,IAAI,aAAa,EAAE;AACjB,wBAAA,aAAa,CAAC,YAAY,GAAG,KAAK;oBACpC;AACF,gBAAA,CAAC,CAAC;YACJ;QACF;aAAO;YACL,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAClC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAC/C;YAED,IAAI,YAAY,EAAE;AAChB,gBAAA,YAAY,CAAC,YAAY,GAAG,KAAK;YACnC;iBAAO;AACL,gBAAA,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;oBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;wBACjC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,KAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CACnD;wBACD,IAAI,aAAa,EAAE;AACjB,4BAAA,aAAa,CAAC,YAAY,GAAG,KAAK;4BAClC;wBACF;oBACF;gBACF;YACF;QACF;QACA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,yBAAyB,CAAC,GAAQ,EAAA;AAChC,QAAA,IAAI,GAAG,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAChD,YAAA,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAC5C,CAAC,KAAU,KAAK,KAAK,CAAC,WAAW,KAAK,KAAK,CAC5C;AACD,YAAA,IAAI,CAAC,uBAAuB,GAAG,mBAAmB;QACpD;aAAO;YACL,IAAI,CAAC,uBAAuB,GAAG,GAAG,CAAC,WAAW,KAAK,KAAK;QAC1D;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,gBAAgB,CAAC,GAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG;IAClC;IAyEA,WAAW,GAAA;QACT,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC;QACvE,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAC/D,IAAI,CAAC,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,yBAAyB,CAAC;AACzE,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAE1C,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,MAAM,cAAc,CAAC,KAAuB,EAAA;AAC1C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI;AACnC,QAAA,IAAI,WAAW,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;YAChE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;gBACxC,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW,EAAE;AACrC,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC/B;AACF,YAAA,CAAC,CAAC;QACJ;aAAO;YACL,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,WAAW,EAAE;AACrD,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YACvC;QACF;AACA,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;QACtE,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,MAAM,aAAa,CAAC,MAAW,EAAA;AAC7B,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CACzC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CACpC;AACD,YAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBAChB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC;AACA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;AAC5D,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;YACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC7B,gBAAA,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACpD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;wBACpC,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AAChC,4BAAA,KAAK,CAAC,YAAY,GAAG,KAAK;wBAC5B;AACF,oBAAA,CAAC,CAAC;gBACJ;qBAAO,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AACvC,oBAAA,KAAK,CAAC,YAAY,GAAG,KAAK;gBAC5B;AACF,YAAA,CAAC,CAAC;YACF,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,mBAAmB,EAAE;gBAC1B,IAAI,CAAC,2BAA2B,EAAE;gBAClC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B,CAAC,EAAE,GAAG,CAAC;QAET;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;AAC7C,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAGA,IAAA,wBAAwB,CAAC,KAAU,EAAA;QACjC,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CACxB,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,YAAY,CACnD;QACH;QACA,OAAO,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,YAAY;IAClD;IAGA,gBAAgB,GAAA;AACd,QAAA;IACF;IAIA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AAErB,QAAA,MAAM,WAAW,GAAG;YAClB,mBAAmB;YACnB,eAAe;YACf,oBAAoB;SACrB;AAED,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;AACjC,YAAA,MAAM,WAAW,GAAI,IAAY,CAAC,UAAU,CAAC;YAE7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,CAAS,KAAI;gBAC3C,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE;oBAC7B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,UAAkB,KAAI;wBACtD,IAAI,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC5C,4BAAA,MAAM,EAAE,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,CAAC,EAAE;AAC9B,4BAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3B;AACF,oBAAA,CAAC,CAAC;gBACJ;qBAAO,IAAI,GAAG,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AAC/C,oBAAA,MAAM,EAAE,GAAG,CAAA,EAAG,UAAU,CAAA,EAAG,CAAC,EAAE;AAC9B,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AA0GA,IAAA,qBAAqB,CAAC,gBAAkC,EAAA;QACtD,IAAI,CAAC,2BAA2B,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAE1C,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,CAAC,CAAC;IACP;;IAIA,SAAS,CAAC,IAAW,EAAE,WAAqB,EAAA;AAC1C,QAAA,IAAI,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACpC,MAAM,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC,GAAG,WAAW;AACjD,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiB;AAC3C,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;YAC1B,IAAI,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;AACzE,YAAA,IAAI,QAAgB;AACpB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;oBACzB,QAAQ,GAAG,QAAQ;gBACrB;qBAAO,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AAC1C,oBAAA,QAAQ,GAAG;AACR,yBAAA,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;yBAC7D,IAAI,CAAC,GAAG,CAAC;gBACd;qBAAO;AACL,oBAAA,QAAQ,GAAG;yBACR,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,QAAQ;yBAC1B,IAAI,CAAC,GAAG,CAAC;gBACd;YACF;iBAAO;AACL,gBAAA,QAAQ,GAAG,QAAQ,IAAI,QAAQ;YACjC;AACA,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAAE,gBAAA,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC;QACA,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM;AACzE,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,UAAU,EAAE,YAAY;YACxB,UAAU;YACV,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;AAChD,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;IACL;AAGA,IAAA,aAAa,CAAC,KAAU,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,OAAO,CAAC;QAEvD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAa,EAAE,KAAU,KAAI;YACzD,OAAO,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC,EAAE,CAAC,CAAC;IACP;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB;IACpD;AAEA,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,eAAe;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AACzD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,gBAAgB,CAAC,IAAY,EAAA;AAC3B,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,eAAe;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;;AACvD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,mBAAmB;AACpD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,MAAM,iBAAiB,CAAC,KAAY,EAAE,UAAkB,EAAA;AACtD,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,MAA0B;AAE7C,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU;AACrC,YAAA,IAAI,UAAU,KAAK,OAAO,EAAE;AAC1B,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAE/B;AAAO,iBAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAClC,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAE/B;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAC/B;YACA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,CAAC;AACjE,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B;QACA,IAAI,CAAC,YAAY,EAAE;IACrB;AAIA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK;IACvE;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IACpG;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,KAAK,GAAwB,EAAE;QAErC,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,IAAI,CAAC,EAAE;AACzC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AAC1D,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;QACF;aAAO;AACL,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACb,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE;AAClC,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACnB;AACA,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;YACvD,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;AAExF,YAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;AAEA,YAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,EAAE;AACrE,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACnB;YACA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC9C;AAEA,QAAA,OAAO,KAAK;IACd;AAIA,IAAA,4BAA4B,CAAC,GAAQ,EAAA;IAErC;AAEA,IAAA,sBAAsB,CAAC,MAAW,EAAA;IAElC;AAEA,IAAA,eAAe,CAAC,KAAY,EAAA;;QAE1B,IAAI,CAAC,IAAI,CAAC,2BAA2B,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE;AAC1E,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,YAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;QACpC;IACF;AAKA,IAAA,0BAA0B,CAAC,GAAQ,EAAA;AACjC,QAAA,IAAG,GAAG,CAAC,IAAI,IAAI,OAAO;YAAE;AACxB,QAAA,IAAI,CAAC,uBAAuB,GAAG,GAAG;AAClC,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAC3B,YAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE;AACvC,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAU,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAEvE,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,MAAM,CACrF,CAAC,MAAW,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CACxF;YACD,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,EAAE;YACnD,CAAC,EAAE,GAAG,CAAC;QACT;AAAO,aAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1D,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,KAAK,EAAE,eAAe,IAAI,SAAS;YAC9D,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE;YAC/C,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM;YAChD,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,KAAK,EAAE,gBAAgB,IAAI,SAAS;YAChE,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;YAChD,UAAU,CAAC,MAAK;AACf,gBAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,KAAK,EAAE;YACnD,CAAC,EAAE,GAAG,CAAC;QACT;IACF;AAMA,IAAA,UAAU,CAAC,GAAQ,EAAA;AACjB,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,uBAAuB,GAAG,GAAG;AAElC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAC3B,YAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE;AACvC,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAU,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAEvE,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,CACtF,CAAC,MAAW,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CACxF;QACH;AAAO,aAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1D,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,KAAK,EAAE,eAAe,IAAI,SAAS;YAC9D,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE;YAC/C,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM;YAChD,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,KAAK,EAAE,gBAAgB,IAAI,SAAS;YAChE,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;QACnD;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IASA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAOA,IAAA,uBAAuB,CAAC,MAAW,EAAA;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM;QAC5C,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C;aAAO;AACL,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC;AACA,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,MAAW,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;AAC9K,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;AACrC,QAAA,IAAI,CAAC,qBAAsB,CAAC,MAAM,GAAG,CAAC;AACtC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;;;IAG3B;IAEA,mBAAmB,GAAA;AACjB,QAAA,MAAM,UAAU,GAAG,CAAC,OAAc,EAAE,KAAa,KAAS;AACxD,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK;AAAE,oBAAA,OAAO,GAAG;gBACnC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;oBACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;AAC7C,oBAAA,IAAI,KAAK;AAAE,wBAAA,OAAO,KAAK;gBACzB;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QAC3E,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC9B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;AACjC,gBAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;;gBAG3C,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAC1C,CAAC,EAAO,KAAK,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;iBACnD;;AAGD,gBAAA,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,IAAG;AACzC,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;wBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B;AACF,gBAAA,CAAC,CAAC;YAEJ;AAAO,iBAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAC7D,MAAM,CAAC,KAAK,GAAG;AACb,oBAAA,eAAe,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;AACjD,oBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;AACpC,oBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,MAAM;AACnC,oBAAA,gBAAgB,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI;AAC9C,oBAAA,YAAY,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;iBACvC;YACH;QACF;AAEA,QAAA,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;SACd;AAED,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAE/B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAElC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;AAEA,IAAA,wBAAwB,CAAC,MAAW,EAAA;AAClC,QAAA,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC;SACd;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;AAEA,IAAA,uBAAuB,CAAC,MAAW,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;IACnE;;IAIA,0BAA0B,CAAC,GAAQ,EAAE,KAAY,EAAA;AAC/C,QAAA,MAAM,OAAO,GAAI,KAAK,EAAE,MAA2B,EAAE,OAAO;QAE5D,IAAI,OAAO,EAAE;YACX,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAC5C,CAAC,GAAQ,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CACvC;QACH;aAAO;AACL,YAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;QACrB;IACF;AAGA,IAAA,8BAA8B,CAAC,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAAE,YAAA,OAAO,KAAK;AAChF,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,qBAAqB,CAAC,MAAM;IACnE;IAEA,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM;AAClD,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,YAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;QACrB;AACA,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,QAAA,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B;aAAO;YACL,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAOA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,MAAM,sBAAsB,GAAG,CAAC,OAAc,KAAa;AACzD,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE;oBAC9B,MAAM,CAAC,KAAK,GAAG;AACb,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,eAAe,EAAE,SAAS;AAC1B,wBAAA,WAAW,EAAE,IAAI;AACjB,wBAAA,SAAS,EAAE,MAAM;AACjB,wBAAA,gBAAgB,EAAE,SAAS;AAC3B,wBAAA,YAAY,EAAE;qBACf;AACD,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC/D,oBAAA,IAAI,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAC3C,wBAAA,OAAO,IAAI;oBACb;gBACF;YACF;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC;AACD,QAAA,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;IAGA,eAAe,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAA,CAAC,CAAC;AACnD,QAAA,MAAM,mBAAmB,GAAG,CAAC,OAAc,KAAI;AAC7C,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;oBAChB,MAAM,CAAC,KAAK,GAAG;AACb,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,eAAe,EAAE,SAAS;AAC1B,wBAAA,WAAW,EAAE,IAAI;AACjB,wBAAA,SAAS,EAAE,MAAM;AACjB,wBAAA,gBAAgB,EAAE,SAAS;AAC3B,wBAAA,YAAY,EAAE;qBACf;gBACH;AACA,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC7D,oBAAA,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACtC;YACF;AACF,QAAA,CAAC;AACD,QAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;AACjC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC5B,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAGA,eAAe,GAAA;AACb,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;IAGA,YAAY,CAAC,KAAa,EAAE,GAAQ,EAAA;QAClC,OAAO,GAAG,EAAE,KAAK;IACnB;AAEA,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,MAAM,eAAe,GAAG,CAAC,OAAc,KAAW;YAChD,IAAI,MAAM,GAAU,EAAE;AAEtB,YAAA,OAAO,CAAC,OAAO,CAAC,GAAG,IAAG;gBACpB,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;AACvC,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD;AAEA,gBAAA,IAAI,GAAG,CAAC,KAAK,EAAE;AACb,oBAAA,MAAM,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;oBAExH,MAAM,cAAc,GAClB,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AAEnK,oBAAA,IAAI,iBAAiB,IAAI,cAAc,EAAE;AACvC,wBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAClB;gBACF;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;QACD,OAAO,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C;IAIA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAUA,aAAa,CAAC,GAAQ,EAAE,MAAW,EAAA;QACjC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,YAAY,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC7B,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACpE;IAEA,UAAU,CAAC,GAAQ,EAAE,MAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;QAC9B,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW;YAAE;QACpD,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;AAE5D,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;YAC9B,UAAU,CAAC,MAAK;gBACd,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,6BAA6B,CAAgB;gBACzF,IAAI,YAAY,EAAE;AAChB,oBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,qBAAqB,EAAE;oBACjD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,YAAY;AAEvE,oBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE;wBAC9B,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI;oBAC9C;yBAAO;AACL,wBAAA,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM;oBACjC;gBACF;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,WAAW,CAAC,GAAQ,EAAE,MAAW,EAAE,OAAa,EAAA;AAC9C,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;AAChD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE;AACxE,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC;AAC9F,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;YAChE,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC;AAC1C,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;AACA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO;QAC1D,IAAI,QAAQ,GAAG,EAAE,IAAI,QAAQ,GAAG,EAAE,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;AAEA,IAAA,wBAAwB,CAAC,GAAQ,EAAE,MAAW,EAAE,KAAW,EAAA;QACzD,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAC5C,CAAC,CAAM,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CACjD;AACD,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,MAAM,KAAK,GAAG,CAAC,GAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC3D,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;AAC3D,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;AACpE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;AAC9F,YAAA,IAAI,CAAC,UAAU;gBAAE;YACjB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;AAC/C,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;AAChB,gBAAA,SAAS,EAAE,YAAY;AACvB,gBAAA,KAAK,EAAE;aACR;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,EAAE,GAAG,CAAC;IACT;IAGA,SAAS,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC1B,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACpE;IAEA,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAE,MAAW,EAAE,eAAe,GAAG,KAAK,EAAA;AACxE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAyB,EAAE,GAAoB,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC;AAErG,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;YACrB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;;;AAGjD,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM;YAC1B;iBAAO;;AAEL,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM;YAC1B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE;AAChB,YAAA,SAAS,EAAE,YAAY;SACxB;QAED,IAAI,eAAe,EAAE;YACnB,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC;QACpD;IACF;AAOA,IAAA,QAAQ,CAAC,IAAS,EAAA;QAChB,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU;YAAE;AACzD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,IAAI;AACjC,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;AAClC,gBAAA,IAAI,EAAE,IAAI;AACX,aAAA;AACD,YAAA,SAAS,EAAE,YAAY;SACxB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC;AAC9B,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;AAClC,gBAAA,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI;AACjC,aAAA;AACD,YAAA,SAAS,EAAE,YAAY;SACxB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,YAAY,CAAC,IAAS,EAAE,IAAS,EAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAA,CAAC,CAAC;AACrD,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE;AACP,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEC,IAAA,YAAY,CAAC,IAAQ,EAAA;AACpB,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,OAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA,CAAA,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,KAAK;AAC3C,YAAA,GAAG,IAAI;AACP,YAAA,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;AAC3B,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;YACpB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC;QAC7C;AACA,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE;AACP,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,UAAU,CAAC,OAAa,EAAA;AACtB,QAAA,IAAI,OAAO,EAAE,OAAO,EAAE;AACpB,YAAA,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;YAChC;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC,YAAY;QACrE,IAAI,YAAY,GAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;AACtF,QAAA,IAAI,MAAM,GAAG;YACX,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC7C,YAAA,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,GAAG,SAAS;YACxF,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,YAAY,EAAE,IAAI,CAAC;SAEpB;AACD,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE,IAAI,CAAC,iBAAiB,GAAG,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC,UAAU;gBACnE,aAAa,EAAE,IAAI,CAAC,YAAY;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,GAAG,EAAE;AACpD,gBAAA,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,IAAI,CAAC,iBAAiB;gBAC1B,WAAW,EAAE,OAAO,IAAI,SAAS,GAAG,KAAK,GAAG;AAC7C,aAAA;YACD,SAAS,EAAE,IAAI,CAAC,iBAAiB,GAAG,cAAc,GAAG;SACtD;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,GAAG,SAAS,GAAG,SAAS;QAC5E,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,KAAK;IACd;;IAMA,UAAU,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAC3B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,GAAG,EAAE,KAAK,CAAA,CAAE;IAC9C;IAKA,0BAA0B,CACxB,GAAQ,EACR,GAAQ,EACR,OAAc,EACd,cAAc,GAAG,KAAK,EAAA;AAEtB,QAAA,MAAM,WAAW,GAAG,CAAC,SAAc,KAAI;AACrC,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE;gBACxB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;AAChD,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK;oBACpD,IAAI,CAAC,QAAQ,EAAE;oBACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;gBAC5C;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,iBAAiB,GAAG,CAAC,SAAc,KAAI;YAC3C,MAAM,IAAI,GAAa,EAAE;AACzB,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE;gBAExB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;AAChD,oBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;gBACrD;AACF,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;QAED,IAAI,cAAc,EAAE;YAClB,IAAI,OAAO,GAAa,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC;gBAChC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;oBAClC,OAAO,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC;YAClC;AACA,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1D,WAAW,CAAC,GAAG,CAAC;AAChB,oBAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC1D;qBAAO;oBACL,WAAW,CAAC,GAAG,CAAC;gBAClB;YACF;QACF;aAAO;AACL,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK;AAChD,YAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;gBAAE;YAE1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAChC,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBAC1B,IAAI,CAAC,QAAQ,EAAE;gBACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC5C;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YAChC;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAIA,UAAU,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACrE;IAEA,SAAS,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;IAC3E;AAEA,IAAA,aAAa,CAAC,OAA2B,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAC1B,QAAA,OAAO,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;IAClD;AAKA,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC1C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM;AAClD,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IACrC;AAEA,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE;IAC5D;AAEA,IAAA,gBAAgB,CAAC,IAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/E,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7E;AAEA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAWA,YAAY,CAAC,KAAoC,EAAE,WAAgB,EAAA;AACjE,QAAA,IAAI,EAAE,KAAK,YAAY,UAAU,CAAC,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;QACxB;QACA,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;QACpF,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;;;AAGpF,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;QAC9B,UAAU,CAAC,MAAK;YACd,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAgB;AAC1E,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW;AACzC,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY;AAC3C,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU;AACvC,YAAA,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;YACzC,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACjF,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACjF,YAAA,IAAI,CAAC,GAAG,SAAS,GAAG,aAAa,EAAE;AACjC,gBAAA,CAAC,GAAG,aAAa,GAAG,SAAS,GAAG,EAAE;YACpC;AACA,YAAA,IAAI,CAAC,GAAG,UAAU,GAAG,cAAc,EAAE;AACnC,gBAAA,CAAC,GAAG,cAAc,GAAG,UAAU,GAAG,EAAE;YACtC;AACA,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YAErB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,IAAI,CAAC,WAAW;AACrB,YAAA,SAAS,EAAE,MAAM;SAClB;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;IACjC;AAGA,IAAA,aAAa,CAAC,IAAY,EAAA;QACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAC9C,MAAM,2BAA2B,GAAU,EAAE;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAG;YAC7B,2BAA2B,CAAC,IAAI,CAAC;AAC/B,gBAAA,EAAE,EAAE,EAAE;gBACN,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,EAAE,QAAQ;gBACb,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA;AACD,YAAA,SAAS,EAAE,IAAI;SAChB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;IACjC;IAIA,cAAc,CAAC,MAAW,EAAE,KAAU,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,IAAI,GAAQ;AACZ,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,GAAG,GAAG,KAAK,EAAE,KAAK;QACpB;aAAO;YACL,GAAG,GAAG,KAAK;QACb;QACA,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE;QAC1C,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;AAC5C,QAAA,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,iBAAiB,EAAE;AAC9G,YAAA,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,uBAAuB;QAC9D;AACA,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,4BAA4B,CAAC,MAAW,EAAA;AACtC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;AAC9B,YAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;QACxB;AAAO,aAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC7D,MAAM,CAAC,KAAK,GAAG;AACb,gBAAA,eAAe,EAAE,SAAS;AAC1B,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,SAAS,EAAE,MAAM;AACjB,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,YAAY,EAAE,IAAI;aACnB;QACH;AACA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACjG,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IAC1C;IAEA,iCAAiC,GAAA;QAC/B,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,YAAA,IAAI,EAAE,2BAA2B;SAClC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5C;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;gBACH,OAAO,EAAE,IAAI,CAAC,OAAO;AACrB,gBAAA,OAAO,EAAE;AACV,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAE/B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,iBAAiB;AACjD,QAAA,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC7C,YAAA,sBAAsB,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,GAAG,SAAS;YACxF,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,YAAY,EAAE,IAAI,CAAC;SACpB;AACC,QAAA,MAAM,KAAK,GAAG;AACd,YAAA,GAAG,EAAE;AACH,gBAAA,IAAI,EAAE;AACP,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE;gBACH,WAAW,EAAE,IAAI,CAAC;AACnB,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC5B;IACF;IAEA,wBAAwB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB;AAAE,YAAA,OAAO,IAAI;QACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAQ,KAAK,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC;AAC/F,QAAA,MAAM,gBAAgB,GAAG,CAAC,OAA0B,KAAW;AAC7D,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;AAAE,gBAAA,OAAO,EAAE;YACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;AAC7B,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,oBAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AAC7C,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;oBACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,OAAO,CAAC,GAAG,CAAC;AAChE,oBAAA,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AACvC,gBAAA,CAAC,CAAC;AAEF,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;gBACzB;AAAO,qBAAA,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAAE,wBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;oBACzD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;wBAChE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;4BAAE,OAAO,CAAC,GAAG,CAAC;AAChE,wBAAA,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AACvC,oBAAA,CAAC,CAAC;gBACJ;AAEA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;AAC7B,gBAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACjD,gBAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACjD,gBAAA,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;AAC7B,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM;AACf,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,CAAM,KAAa;YAC5C,IAAI,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAExB,YAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;gBAC9E,OAAO,CAAC,KAAK,CAAC;YAChB;AAEA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK;AAEvD,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACpB,gBAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,oBAAA,OAAO,KAAK;AACvC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,oBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,wBAAA,OAAO,KAAK;gBAC1C;AACA,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,gBAAA,OAAO,KAAK;AAE/C,YAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,oBAAA,OAAO,KAAK;AACtC,gBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC9C;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;QACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAChE,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;QACxD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;AAClD,QAAA,OAAO,MAAM;IACf;IAkBA,cAAc,CACZ,QAAgB,EAChB,QAAgB,EAChB,WAA0B,EAC1B,KAAa,EACb,KAAiB,EACjB,OAAe,EAAA;QAEf,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;QAChC,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AAEzD,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;AAC9E,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1C,MAAM,cAAc,GAAG,MAAK;YAC1B,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;AACzD,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;QACpD,IAAI,CAAC,yBAAyB,EAAE;IAClC;IAGA,eAAe,CACb,QAAgB,EAChB,QAAgB,EAChB,WAA0B,EAC1B,KAAa,EACb,KAAiB,EACjB,OAAe,EAAA;QAEf,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;AACjC,QAAA,MAAM,iBAAiB,GAAG,WAAW,IAAI,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAU,EAAE;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC;AAEpH,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE;AACrC,gBAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAC,WAAW,CAAA,CAAA,EAAI,OAAO,EAAE;AACtE,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC;AACZ,oBAAA,QAAQ,EAAE,CAAC;oBACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,KAAK;AACL,oBAAA,GAAG,EAAE;AACN,iBAAA,CAAC;YACJ;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;QAC7B,IAAI,CAAC,yBAAyB,EAAE;;AAGhC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAClC;AAKA,IAAA,uBAAuB,CACrB,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,MAAc,EAAA;QAEd,MAAM,MAAM,GAAgD,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;AAEzC,QAAA,MAAM,aAAa,GAAG,QAAQ,IAAI,MAAM;AACxC,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAE7C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM,EAAE;gBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;AACzC,gBAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACxD,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C;YACF;AACK,iBAAA,IAAI,CAAC,KAAK,QAAQ,EAAE;gBACvB,IAAI,aAAa,EAAE;AACjB,oBAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AAC3C,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;qBAAO;AACL,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACrD,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;YACF;AACK,iBAAA,IAAI,CAAC,KAAK,MAAM,EAAE;gBACrB,IAAI,aAAa,EAAE;AACjB,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACnD,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;qBAAO;AACL,oBAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACzC,wBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;oBAC9C;gBACF;YACF;iBACK;AACH,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9C;YACF;QACF;AAEA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,iBAAiB,CAAC,QAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACpE,YAAA,OAAO,CAAC;QACV;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AACrC,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AACrD,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC/B;AACA,QAAA,OAAO,CAAC;IACV;AACA,IAAA,aAAa,CAAC,QAAgB,EAAA;QAC5B,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC7C;IACA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,yBAAyB,EAAE;IAClC;IACA,UAAU,CACR,QAAgB,EAChB,QAAgB,EAChB,WAA0B,EAC1B,KAAa,EACb,OAAe,EAAA;AAEf,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;QAChC,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE;QAC3D,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC;IAUA,yBAAyB,GAAA;QACvB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YACnC,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YAC3E;QACF;;QAGA,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;;AAGrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACxC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAE1C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,QAAQ;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,SAAS;IACxC;IACA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9E,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC;QACrF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;QAE9E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE;IAC/D;IACA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9E,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC;QACtF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE;IAC/D;AACA,IAAA,WAAW,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AACzF,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;AACzF,QAAA,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG;IACjG;AACA,IAAA,cAAc,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AAC5F,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;AACzF,QAAA,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM;IACvG;AACA,IAAA,YAAY,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AAC1F,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;QACzF,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,IAAI;AACrD,YAAA,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ;YAC/C,OAAO,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW;IACrD;AAEA,IAAA,aAAa,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;AAC3F,QAAA,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;QACzF,OAAO,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,IAAI;AACtD,YAAA,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ;YAChD,OAAO,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW;IACtD;AAEA,IAAA,eAAe,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QAC7F,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IAClI;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QAC9F,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IACnI;AAEA,IAAA,kBAAkB,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QAChG,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IACrI;AAEA,IAAA,mBAAmB,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAA0B,EAAE,OAAe,EAAA;QACjG,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;IACtI;AAMA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,+BAA+B,EAAE;AACxC,YAAA,aAAa,CAAC,IAAI,CAAC,+BAA+B,CAAC;AACnD,YAAA,IAAI,CAAC,+BAA+B,GAAG,IAAI;QAC7C;AACA,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa;AACnE,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AACvD,QAAA,IAAI,CAAC,mBAAmB,IAAI,CAAC,iBAAiB;YAAE;AAChD,QAAA,MAAM,cAAc,GAAG,mBAAmB,CAAC,qBAAqB,EAAE;AAClE,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,qBAAqB,EAAE;AAC9D,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY;QAC7D,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;QACnE,MAAM,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY;QACjE,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY;QACnE,IAAI,OAAO,GAAG,CAAC;QACf,IAAI,OAAO,GAAG,CAAC;AACf,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW;AACxC,QAAA,IAAI,UAAU;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,WAAW;AAC1C,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW;AACzC,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,WAAW;QACzC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,+BAA+B,GAAG,WAAW,CAAC,MAAK;AACtD,gBAAA,IAAI,OAAO,KAAK,CAAC,EAAE;AACjB,oBAAA,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1C;AACA,gBAAA,IAAI,OAAO,KAAK,CAAC,EAAE;AACjB,oBAAA,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;gBACxC;YACF,CAAC,EAAE,EAAE,CAAC;QACR;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,+BAA+B,EAAE;AACxC,YAAA,aAAa,CAAC,IAAI,CAAC,+BAA+B,CAAC;AACnD,YAAA,IAAI,CAAC,+BAA+B,GAAG,IAAI;QAC7C;IACF;AAiBA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC7C;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC7C;IAGA,cAAc,CAAC,KAAa,EAAE,KAAiB,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,MAAM,gBAAgB,GAAG,CAAC,CAAa,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpE,MAAM,cAAc,GAAG,MAAK;YAC1B,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC;AACvD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,CAAC;AAC3D,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC7C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;YAChC;AACF,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC;AACpD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC;IAC1D;IAEA,cAAc,CAAC,KAAa,EAAE,KAAiB,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI;YAAE;AAChE,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC;AACxD,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC;QACA,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3C;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;IACpC;AACA,IAAA,gBAAgB,CAAC,CAAa,EAAA;AAC5B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,aAA4B;AAC/D,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE;QAC9C,MAAM,QAAQ,GAAG,EAAE;QACnB,IAAI,YAAY,GAAG,CAAC;QAEpB,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,QAAQ,EAAE;YACnC,YAAY,GAAG,CAAC,GAAG;QACrB;aAAO,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE;YAC7C,YAAY,GAAG,GAAG;QACpB;AAEA,QAAA,IAAI,YAAY,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC5B,MAAM,IAAI,GAAG,MAAK;AAChB,oBAAA,SAAS,CAAC,SAAS,IAAI,YAAY;AACnC,oBAAA,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,CAAC;AACvD,gBAAA,CAAC;AACD,gBAAA,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,CAAC;YACvD;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC7C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;YAChC;QACF;IACF;AAOQ,IAAA,SAAS,CAAC,IAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC;AAEA,IAAA,UAAU,CAAC,YAAqB,EAAA;;AAE9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;;AAGpB,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAC/C,QAAA,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAC9D,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B;AAED,QAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC;IAC5C;IAIA,sBAAsB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAC5C,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B;IACH;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAE5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,8BAA8B,EAAE;QACnD,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3D;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AACvE,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC;QAEhD;AAAO,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AAC9E,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAE/B;AAAO,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC9E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QAEb;AAAO,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC9E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QACb;IACF;IAEA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAC9C;IACF;IAEA,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAC9C;IACF;IAKA,MAAM,OAAO,CAAC,KAAqB,EAAA;QACjC,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;AACjD,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAC/D,IAAI,EACJ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,EACZ,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,WAAW,CACtB;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC;AAC1C,QAAA,IAAI,WAAW,EAAE,MAAM,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,SAAS,EAAE,YAAY;aACxB;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,MAAM,CAAC,KAAU,EAAA;AACf,QAAA,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3C;;AAgBF,IAAA,uBAAuB,CAAC,KAAiB,EAAE,GAAQ,EAAE,GAAQ,EAAA;QAC3D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;;;IAG5B;;AAGA,IAAA,gBAAgB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAChD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,eAAe,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAC/C,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAEA,IAAA,kBAAkB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAClD,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC;IACjD;;IAQA,uBAAuB,CAAC,GAAQ,EAAE,GAAQ,EAAA;;AAExC,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,QAAA,EAAW,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC;QACnE,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,EAAE;YAC/C,OAAO,IAAI,CAAC,IAAI;QAClB;AACA,QAAA,OAAO,CAAC;IACV;;IAGA,iBAAiB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAClC,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AACrD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE;YAChC,SAAS,EAAE,IAAI,CAAC,qBAAqB;YACrC,KAAK,EAAE,IAAI,CAAC;AACb,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAE1B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,4BAA4B,CAAC,GAAQ,EAAE,GAAQ,EAAE,KAAU,EAAA;AACzD,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AACrD,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,qBAAqB,IAAI,EAAE;QAClD,IAAI,MAAM,GAAwC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAErH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE;AAEnD,QAAA,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAW,KAC/C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,CACzD;QAED,IAAI,WAAW,EAAE;;AAEf,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC;aAAO;;YAEL,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAW,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;YACjF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3C;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,oBAAoB,CAAC,GAAQ,EAAE,MAAW,EAAE,GAAQ,EAAA;AAClD,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;QACrD,IAAI,MAAM,GAAwC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAErH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE;QAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;AAE5C,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/B;aAAO;AACL,YAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7B;QAEA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;QACtC;aAAO;YACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3C;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,iBAAiB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAClC,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AACrD,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAE3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAGA,IAAA,gBAAgB,CAAC,GAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE;;AAE9B,YAAA,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD;AAEA,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAS,KAAI;YACjE,IAAI,MAAM,GAAG,IAAI;AACjB,YAAA,KAAK,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAC5D,gBAAA,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,CAAG,CAAC,EAAE;oBACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACxC,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AAC5D,oBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AAE5D,oBAAA,QAAQ,MAAM,CAAC,SAAS;AAC5B,wBAAA,KAAK,SAAS;4BACZ,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;4BAClD;AACF,wBAAA,KAAK,QAAQ;AACX,4BAAA,MAAM,GAAG,MAAM,IAAI,SAAS,KAAK,WAAW;4BAC5C;AACF,wBAAA,KAAK,YAAY;4BACf,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC;4BACpD;AACF,wBAAA,KAAK,UAAU;4BACb,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;4BAClD;;AAGE,oBAAA,IAAI,CAAC,MAAM;wBAAE;gBACf;YACF;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,CAAC;IACF;;AAMA,IAAA,iBAAiB,CAAC,KAAmB,EAAE,GAAQ,EAAE,GAAQ,EAAE,KAAa,EAAA;AACtE,QAAA,IAAI,CAAC,2BAA2B,GAAG,GAAG;AACtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;IAC7B;IAEA,iBAAiB,CAAC,KAAkB,EAAE,GAAQ,EAAA;;IAE9C;IAEA,mBAAmB,CAAC,KAAuB,EAAE,GAAQ,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;YAAE;QAE/E,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC;AACnH,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;AAEvC,QAAA,IAAI,aAAa,KAAK,YAAY,EAAE;YAClC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC;AACjE,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAG1B;AAEA,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;AACvC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IASA,UAAU,CAAC,KAAyB,EAAE,GAAQ,EAAA;AAC5C,QAAA,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO;YAAE;AAE5B,QAAA,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;;QAG7E,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE;YAC5B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAY,KAAI;gBACxC,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;;AAEzE,gBAAA,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,CAAS,KAAI;oBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAChC,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;IACF;AAIA,IAAA,YAAY,CAAC,GAAQ,EAAA;AACnB,QAAA,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,KAAK;IACrC;IAYA,eAAe,CAAC,KAAiB,EAAE,GAAQ,EAAA;AACzC,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK;AAEvC,QAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa;AAEnD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;AAC5D,YAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;AAC/D,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;AAEA,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;IACxD;IAEA,qBAAqB,CAAC,KAAiB,EAAE,GAAQ,EAAA;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK;AACvC,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;IAGxD;AAEA,IAAA,iBAAiB,CAAC,GAAQ,EAAE,QAAgB,EAAE,QAAgB,EAAA;AAC5D,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI;YAAE;QAEvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAY,KAAI;AACxC,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;AAC7D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAW,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEtD,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEnC,YAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,CAAC;YAEtC,MAAM,OAAO,GAAQ,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,KAAa,KAAI;gBAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,4BAA4B,CAAC,GAAQ,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;AAC5B,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClC;;AAYA,IAAA,kBAAkB,CAAC,KAAmB,EAAE,GAAQ,EAAE,GAAQ,EAAE,KAAa,EAAA;AACvE,QAAA,IAAI,CAAC,2BAA2B,GAAG,GAAG;AACtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;;AAG3B,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7D,qBAAqB,CAAC,MAAK;;AAEzB,YAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB;AACzE,QAAA,CAAC,CAAC;IACJ;;IAGA,oBAAoB,CAAC,KAAyB,EAAE,GAAQ,EAAA;AACtD,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK;AAEvC,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa;AACzC,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY;AAEvC,QAAA,IAAI,aAAa,KAAK,YAAY,EAAE;;YAElC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAgB;YAC7E,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACpC,UAAU,CAAC,MAAK;oBACd,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC;oBACjE,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,CAAC;AACxD,oBAAA,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC;oBACtC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACvC,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,gBAAA,CAAC,EAAE,GAAG,CAAC,CAAC;YACV;QACF;aAAO;;YAEL,qBAAqB,CAAC,MAAK;AACzB,gBAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe;AACpE,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI;AACvC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/D;;AAGA,IAAA,uBAAuB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;QAC/B,MAAM,GAAG,GAAG,CAAA,EAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAA,CAAE;;AAGnC,QAAA,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe;QAC1C,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC;;AAGxD,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC5B,YAAA,SAAS,EAAE,iBAAiB;YAC5B,UAAU,EAAE,GAAG,CAAC;SACjB;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;;QAGhC,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE;;QAG1B,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC;;QAGzC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC;IACnD;;AAGA,IAAA,iBAAiB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACjD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;QAC/B,MAAM,GAAG,GAAG,CAAA,EAAG,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE;AAEzE,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;;AAGxD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG;oBACd,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE;AAC9C,oBAAA,SAAS,EAAE,kBAAkB;AAC7B,oBAAA,OAAO,EAAE;iBACV;gBACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC;;AAGA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;;AAGA,IAAA,oBAAoB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACpD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,qBAAqB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACrD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAErF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;AAExD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG;oBACd,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AAC1F,oBAAA,SAAS,EAAE;iBACZ;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACnD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAUA,IAAA,iBAAiB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACjD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,kBAAkB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAClD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAErF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;;AAGxD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;;AAE9B,gBAAA,MAAM,OAAO,GAAG;AACd,oBAAA,IAAI,EAAE;AACJ,wBAAA,GAAG,QAAQ;wBACX,aAAa;wBACb,QAAQ;AACR,wBAAA,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;wBACxB,KAAK,EAAE,GAAG,CAAC;AACZ,qBAAA;AACD,oBAAA,SAAS,EAAE;iBACZ;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;IAMA,eAAe,CAAC,QAAa,EAAE,KAAa,EAAA;AAC1C,QAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;YACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACpC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACjD,gBAAA,OAAO,GAAG;YACZ;YACA,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,KAAK,GAAG,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACvF,YAAA,OAAO,YAAY,GAAG,CAAC,GAAG,CAAA,EAAG,YAAY,CAAA,CAAA,CAAG,GAAG,GAAG;QACpD;AAAO,aAAA,IAAI,KAAK,KAAK,cAAc,EAAE;AACnC,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AACvC,gBAAA,OAAO,GAAG;YACZ;AACA,YAAA,OAAO,CAAA,EAAG,UAAU,CAAC,QAAQ,GAAG;QAClC;AACA,QAAA,OAAO,GAAG;IACZ;AAIA,IAAA,kBAAkB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAE,SAAe,EAAA;QACnE,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,cAAc,EAAE;YAC1D,IAAI,CAAC,kBAAkB,GAAG,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1D,YAAA,IAAI,CAAC,mBAAmB,GAAG,cAAc;AACzC,YAAA,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB;QACF;;QAGA,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAExB,UAAU,CAAC,MAAK;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAA,EAAA,CAAI,CAAqB;YACzF,IAAI,KAAK,EAAE;gBACT,KAAK,CAAC,KAAK,EAAE;gBACb,KAAK,CAAC,MAAM,EAAE;YAChB;QACF,CAAC,EAAE,CAAC,CAAC;IACP;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACnD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAErF,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;AAExD,YAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC9B,gBAAA,MAAM,OAAO,GAAG;AACd,oBAAA,IAAI,EAAE;AACJ,wBAAA,GAAG,QAAQ;wBACX,aAAa;wBACb,QAAQ;AACR,wBAAA,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;wBACxB,KAAK,EAAE,GAAG,CAAC;AACZ,qBAAA;AACD,oBAAA,SAAS,EAAE;iBACZ;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;AAEA,IAAA,gBAAgB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QAChD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAEA,IAAA,mBAAmB,CAAC,GAAQ,EAAE,QAAa,EAAE,GAAQ,EAAA;QACnD,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AACrF,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,GAAG;IACtC;AAKA,IAAA,iBAAiB,CAAC,KAAiB,EAAE,QAAa,EAAE,KAAa,EAAA;QAC/D,IAAI,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO;AAChC,QAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ;AAClC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAChC,IAAI,CAAC,eAAe,GAAG;AACrB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,EAAE;AACrB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG;SACpB;AACD,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;IAC5B;IAIA,iBAAiB,CAAC,QAAa,EAAE,KAAa,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;AACvB,YAAA,OAAO,yDAAyD;QAClE;QACA,IAAI,IAAI,GAAG,EAAE;;AAGb,QAAA,IAAI,KAAK,KAAK,cAAc,EAAE;YAC5B,IAAI,IAAI,+BAA+B;YACvC,IAAI,IAAI,8CAA8C;YACtD,IAAI,IAAI,2BAA2B;AACnC,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,eAAe;AAC7C,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAA,EAAA,EAAK,QAAQ,CAAC,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE;AACvD,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,CAAC;AACvC,YAAA,IAAI,IAAI,CAAA,YAAA,EAAe,IAAI,CAAA,EAAG,IAAI,gBAAgB;AAClD,YAAA,IAAI,IAAI,CAAA,cAAA,EAAiB,QAAQ,CAAA,aAAA,CAAe;YAChD,IAAI,IAAI,OAAO;YACf,IAAI,IAAI,QAAQ;AAChB,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;YACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACpC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACjD,IAAI,IAAI,+BAA+B;gBACvC,IAAI,IAAI,8CAA8C;gBACtD,IAAI,IAAI,iFAAiF;gBACzF,IAAI,IAAI,QAAQ;AAChB,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,IAAI,+BAA+B;YACvC,IAAI,IAAI,2CAA2C;YACnD,IAAI,IAAI,2BAA2B;YACnC,IAAI,YAAY,GAAG,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,KAAa,KAAI;AACvC,gBAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC;gBAChC,YAAY,IAAI,QAAQ;gBACxB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA,MAAA,EAAS,KAAK,GAAG,CAAC,CAAA,CAAE;AAC3C,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE;gBACzC,IAAI,IAAI,OAAO,IAAI,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,QAAQ,eAAe;AACxD,YAAA,CAAC,CAAC;YACF,IAAI,IAAI,OAAO;AACf,YAAA,IAAI,IAAI,CAAA,2CAAA,EAA8C,YAAY,CAAA,YAAA,CAAc;YAChF,IAAI,IAAI,QAAQ;QAClB;;AAEK,aAAA,IAAI,KAAK,KAAK,cAAc,EAAE;AACjC,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACvC,IAAI,IAAI,+BAA+B;gBACvC,IAAI,IAAI,oDAAoD;gBAC5D,IAAI,IAAI,sFAAsF;gBAC9F,IAAI,IAAI,QAAQ;AAChB,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,IAAI,+BAA+B;YACvC,IAAI,IAAI,oDAAoD;YAC5D,IAAI,IAAI,2BAA2B;AACnC,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,aAAa;AAC7C,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,CAAA,EAAA,EAAK,UAAU,CAAC,IAAI,CAAA,CAAA,CAAG,GAAG,EAAE;YAC3D,IAAI,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,EAAG,IAAI,KAAK,UAAU,CAAC,QAAQ,CAAA,aAAA,CAAe;YACjE,IAAI,IAAI,OAAO;YACf,IAAI,IAAI,QAAQ;QAClB;aAAO;YACL,IAAI,IAAI,+BAA+B;YACvC,IAAI,IAAI,qFAAqF;YAC7F,IAAI,IAAI,QAAQ;QAClB;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,QAAQ,IAAI,EAAE,WAAW,EAAE;AACzB,YAAA,KAAK,MAAM;gBACT,OAAO,SAAS,CAAC;AACnB,YAAA,KAAK,QAAQ;gBACX,OAAO,SAAS,CAAC;AACnB,YAAA,KAAK,OAAO;gBACV,OAAO,SAAS,CAAC;AACnB,YAAA;gBACE,OAAO,SAAS,CAAC;;IAEvB;IAQA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,IAAI,CAAC;QAC3D,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAEA,uBAAuB,GAAA;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;AACpC,QAAA,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE;AAE1B,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,IAAI,CAAC,iBAAiB,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,GAAG;QAClD;aAAO;AACL,YAAA,IAAI,CAAC,iBAAiB,GAAG,CAAA,EAAG,OAAO,GAAG;QACxC;IACF;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc;AAEtD,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,IAAI,EAAE;gBACJ,GAAG,IAAI,CAAC,kBAAkB;AAC1B,gBAAA,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,KAAK;gBACrC,KAAK,EAAE,IAAI,CAAC;AACb,aAAA;AACD,YAAA,SAAS,EAAE;SACZ;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;IAC7B;IAIA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;IAC7B;AAIA,IAAA,sBAAsB,CAAC,KAAiB,EAAE,SAAc,EAAE,QAAa,EAAA;AACrE,QAAA,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,MAAM,EAAE;YAC5C;QACF;QAEA,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,SAAS,CAAC,qBAAqB,CAAC;QAClE,IAAI,CAAC,0BAA0B,GAAG;AAChC,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG;AACtB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG;SACpB;AACD,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAQA,IAAA,qBAAqB,CAAC,KAAiB,EAAE,SAAc,EAAE,QAAa,EAAA;AACpE,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE;YAC3B;QACF;QACA,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,yBAAyB,GAAG;AAC/B,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,GAAG;AACtB,YAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG;SACpB;AACD,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAKA,sBAAsB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,6BAA6B,EAAE;AACtC,YAAA,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;QAClD;AACA,QAAA,IAAI,CAAC,6BAA6B,GAAG,UAAU,CAAC,MAAK;AACnD,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;AACtC,YAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE;AAChC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE;AACrC,YAAA,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC;QACjD;AACA,QAAA,IAAI,CAAC,4BAA4B,GAAG,UAAU,CAAC,MAAK;AAClD,YAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK;AACrC,YAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;IAIA,6BAA6B,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,6BAA6B,EAAE;AACtC,YAAA,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;AAChD,YAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI;QAC3C;IACF;IAEA,4BAA4B,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE;AACrC,YAAA,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC;AAC/C,YAAA,IAAI,CAAC,4BAA4B,GAAG,IAAI;QAC1C;IACF;IACA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC;QAC7C;AACA,QAAA,IAAI,CAAC,wBAAwB,GAAG,UAAU,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,EAAE,GAAG,CAAC,CAAC;IACV;IAEA,wBAAwB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC3C,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;QACtC;IACF;;AAoBA,IAAA,wBAAwB,CAAC,KAAiB,EAAE,GAAQ,EAAE,GAAQ,EAAA;QAC5D,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;QAE1B,UAAU,CAAC,MAAK;YACd,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAuB;AACnF,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAmC;AAExD,YAAA,IAAI,OAAO,IAAI,MAAM,EAAE;gBACrB,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;gBACrC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI;YACxC;AAEA,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,CAAC,CAAC;IACP;;IAIA,aAAa,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC9B,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AAEtB,QAAA,GAAG,CAAC,SAAS,GAAG,KAAK;QACrB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAC1C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,cAAc,CAAC,GAAQ,EAAE,GAAQ,EAAA;QAC/B,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE;AAEtB,QAAA,GAAG,CAAC,SAAS,GAAG,MAAM;QACtB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,eAAe,CAAC,GAAQ,EAAE,GAAQ,EAAA;AAChC,QAAA,GAAG,CAAC,SAAS,GAAG,IAAI;;AAEpB,QAAA,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;AAC5B,YAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QAClD;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEQ,IAAA,cAAc,CAAC,GAAQ,EAAE,KAAa,EAAE,KAAqB,EAAA;AACnE,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI;YAAE;AAExB,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC;AAE5C,YAAA,IAAI,KAAK,KAAK,KAAK,EAAE;gBACnB,OAAO,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YACvD;iBAAO;gBACL,OAAO,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;YACvD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,qBAAqB,CAAC,GAAQ,EAAE,GAAQ,EAAE,MAA+B,EAAA;AACvE,QAAA,GAAG,CAAC,MAAM,GAAG,MAAM;AACnB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEQ,IAAA,oBAAoB,CAAC,GAAQ,EAAA;AACnC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE;QAE3B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;QAClF,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;QACpF,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AAE3E,QAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC;IACzE;;IAGA,oBAAoB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE;QAE3B,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;QAErE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,wBAAwB,CAAC,GAAQ,EAAA;AAC/B,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO;YAAE;QAE3B,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC;AACzF,QAAA,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AAEnF,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;AAClC,YAAA,GAAG,CAAC,KAAK,GAAG,UAAU;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,mBAAmB,CAAC,GAAQ,EAAA;;AAE1B,QAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC;AAClD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;AAEA,IAAA,kBAAkB,CAAC,GAAQ,EAAA;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,CAAC;YAC5D;QACF;QAEA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC7E,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAOA,IAAA,uBAAuB,CAAC,GAAQ,EAAA;AAC9B,QAAA,IAAI,CAAC,kCAAkC,GAAG,GAAG;AAC7C,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,QAAA,IAAI,CAAC,kCAAkC,GAAG,IAAI;IAChD;IAEA,4BAA4B,CAAC,MAAW,EAAE,SAAkB,EAAA;AAC1D,QAAA,IAAI,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO;YAAE;QAEhE,MAAM,GAAG,GAAG,IAAI,CAAC,kCAAkC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CACtE,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CACrC;QACD,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,UAAU,GAAG,SAAS;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,wBAAwB,GAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;AAC5E,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC;IAC3D;;;;;;;;;;IAYA,gCAAgC,GAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;AAC5E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAClD,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC;AACxD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,mBAAmB,CAAC,GAAQ,EAAE,GAAQ,EAAA;AACpC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE;;AAG3B,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE;AAC/B,YAAA,GAAG,CAAC,OAAO,CAAC,cAAc,GAAG,EAAE;QACjC;;QAGA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AACjF,QAAA,IAAI,MAAM;YAAE;;AAGZ,QAAA,GAAG,CAAC,YAAY,GAAG,IAAI;AACvB,QAAA,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;;AAG3C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IAC3B;AAEA,IAAA,eAAe,CAAC,GAAQ,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;AACtE,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI;AACjE,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;AACvD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,mBAAmB,CAAC,GAAQ,EAAE,GAAQ,EAAA;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AACrF,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C;;QAGA,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AAC7E,QAAA,IAAI,SAAS;AAAE,YAAA,SAAS,CAAC,YAAY,GAAG,KAAK;;AAG7C,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI;AAC/D,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;;QAGzD,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC3B;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiGA,IAAA,YAAY,CAAC,GAAQ,EAAA;AACnB,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,YAAA,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe;AAC1C,YAAA,IAAI,GAAG,CAAC,eAAe,EAAE;;AAEvB,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;AAAE,oBAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;AAC7B,oBAAA,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClD;gBACA,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;AACvC,oBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;AAAE,wBAAA,GAAG,CAAC,UAAU,GAAG,IAAI;AACzD,gBAAA,CAAC,CAAC;;AAEF,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;AACzB,oBAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG;AACrB,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,YAAY,EAAE;qBACf;gBACH;YACF;QACF;aAAO;AACL,YAAA,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ;QAC9B;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;IAGA,oBAAoB,CAAC,GAAQ,EAAE,GAAsB,EAAA;AACnD,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;AACzB,YAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;AAC7D,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO;AAAE,gBAAA,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE;QACpD;AACA,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ;AAC/B,QAAA,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG;AAClD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,8BAA8B,CAAC,GAAQ,EAAA;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;;AAGA,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;AACzC,QAAA,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAS,KAAI;YAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;gBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;AACnC,gBAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE;AAC/C,gBAAA,IAAI,CAAC,IAAI;AAAE,oBAAA,OAAO,IAAI;AACtB,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AAC1E,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS;gBAC/C,QAAQ,SAAS;AACf,oBAAA,KAAK,OAAO,EAAE,OAAO,KAAK,KAAK,IAAI;oBACnC,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;oBAC3C,KAAK,KAAK,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACvC,SAAS,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAExC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAIA,IAAA,oBAAoB,CAAC,KAAiB,EAAE,GAAQ,EAAE,GAAQ,EAAA;QACxD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG;;QAGrC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,aAAA,EAAgB,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC,CACjF;QAClB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,QAAQ,CAAC,gBAAgB,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,aAAA,EAAgB,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI,CAAC,CACjF;QAElB,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC;;AAG/C,QAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAE9D,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;AAC5C,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM;AACzC,YAAA,IAAI,QAAQ,GAAG,YAAY,GAAG,MAAM;YACpC,IAAI,QAAQ,GAAG,EAAE;AAAE,gBAAA,QAAQ,GAAG,EAAE,CAAC;;AAGjC,YAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAG;gBACpB,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,QAAQ,IAAI;gBAChC,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAA,EAAG,QAAQ,IAAI;AACrC,YAAA,CAAC,CAAC;;AAGF,YAAA,GAAG,CAAC,KAAK,GAAG,QAAQ;AACtB,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACpD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAChD,YAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnE,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACjD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;;AAGA,IAAA,uBAAuB,CAAC,GAAQ,EAAA;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,GAAG;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,SAAS,CAAC;IAClD;;;;;;;;IAYA,kBAAkB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACvC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC3H,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,6CAAA,EAAgD,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC1H,QAAA,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnD,QAAA,IAAI,KAAK;AAAE,YAAA,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;IAC/C;IAEA,mBAAmB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACxC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC3H,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,4CAAA,EAA+C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AACxH,QAAA,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACnD,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;IAC7C;;;;;;;;;;;;;;;;;;;;;;;;IAiCA,oBAAoB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;;AAGlC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,4CAAA,EAA+C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AACxH,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,6CAAA,EAAgD,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;AAC1H,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AACpC,QAAA,IAAI,KAAK;AAAE,YAAA,KAAK,CAAC,SAAS,GAAG,SAAS;;AAGtC,QAAA,MAAM,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,oDAAA,EAAuD,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;QACjJ,IAAI,qBAAqB,EAAE;AACzB,YAAA,qBAAqB,CAAC,SAAS,GAAG,SAAS;QAC7C;IACF;;IAGA,oBAAoB,CAAC,KAAY,EAAE,GAAQ,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAElC,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAA,EAAA,CAAI,CAAgB;QAC3H,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,SAAS,GAAG,SAAS;QAChC;IACF;AAKA,IAAA,UAAU,CAAC,KAAY,EAAA;QACnB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAElD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,aAA4B;AACzE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa;AAEnD,QAAA,IAAI,MAAM,KAAK,QAAQ,EAAE;AACvB,YAAA,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;QACzC;AAAO,aAAA,IAAI,MAAM,KAAK,MAAM,EAAE;AAC5B,YAAA,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;QACzC;IACF;AAOF,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAElC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACxD;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,GAAG,SAAS;QACzD;IACF;;;;;;;;;AAWQ,IAAA,cAAc,CAAC,GAAQ,EAAA;AAC7B,QAAA,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE;IAC1B;IAGA,oBAAoB,CAClB,SAAc,EACd,QAAgB,EAChB,cAAsB,EACtB,KAAa,EACb,KAAiB,EACjB,OAAoC,EAAA;QAEpC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAE7B,QAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC;QAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,IAAI,cAAc,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACpD,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC1F,QAAA,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE;AAC1B,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAE3B,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC;AACtD,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;AAChD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC;AACtD,QAAA,CAAC;AACD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC/C;IAGA,qBAAqB,CACnB,SAAc,EACd,QAAgB,EAChB,cAAsB,EACtB,KAAa,EACb,KAAiB,EACjB,OAAoC,EAAA;QAEpC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhD,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC;AAEvD,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;QACjC,MAAM,QAAQ,GAAmB,EAAE;;AAGnC,QAAA,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO;AAC5C,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,GAAG;oBAAE;;gBAGV,IAAI,SAAS,GAAG,KAAK;AACrB,gBAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM;gBACnC;AAAO,qBAAA,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;gBACpC;qBAAO;AACL,oBAAA,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM;gBACzB;gBAEA,IAAI,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;oBACzC,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAA,CAAE;AAClC,oBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;oBACd,QAAQ,CAAC,IAAI,CAAC;AACZ,wBAAA,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,CAAC;AACX,wBAAA,WAAW,EAAE,CAAC;wBACd,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,wBAAA,GAAG,EAAE;AACN,qBAAA,CAAC;gBACJ;YACF;QACF;AAEA,QAAA,KAAK,CAAC,YAAY,GAAG,OAAO;AAC5B,QAAA,KAAK,CAAC,aAAa,GAAG,QAAQ;IAChC;IAEQ,iBAAiB,CAAC,GAAQ,EAAE,OAAoC,EAAA;AACtE,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;QACxE;AAAO,aAAA,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,YAAA,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;QACzE;aAAO;AACL,YAAA,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAQ,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAC9D;IACF;IAEA,oBAAoB,CAAC,SAAc,EAAE,QAAgB,EAAE,cAAsB,EAAE,KAAa,EAAE,OAAoC,EAAA;QAChI,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;AACrD,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;;QAGtB,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM;QACnC;AAAO,aAAA,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,YAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;QACpC;aAAO;AACL,YAAA,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM;QACzB;AAEA,QAAA,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;QAExD,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,IAAI,cAAc,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACpD,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IACpC;IAGA,qBAAqB,CAAC,SAAc,EAAE,OAAoC,EAAA;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAEzD,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB;AACxC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChC;YACA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;;AAGpF,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO;YAC5C,IAAI,UAAU,GAAG,CAAC;AAClB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;AACtC,gBAAA,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,GAAG;oBAAE;gBACV,IAAI,SAAS,GAAG,KAAK;gBACrB,IAAI,OAAO,KAAK,MAAM;AAAE,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM;qBACpD,IAAI,OAAO,KAAK,OAAO;AAAE,oBAAA,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,OAAO;;AAC3D,oBAAA,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM;gBAE5B,IAAI,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE;AACzC,oBAAA,UAAU,EAAE;gBACd;YACF;AACA,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,UAAU,CAAC,GAAG,KAAK,IAAI,EAAE;QACvD;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAChC,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC1B,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B;IAGQ,kBAAkB,GAAA;QACxB,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,uCAAuC,CAAC;IAC1E;AAEQ,IAAA,qBAAqB,CAAC,KAAoB,EAAE,SAAc,EAAE,OAAoC,EAAA;AACtG,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC;QACxC;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC3C;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC7C;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC;QACrC;AACK,aAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAC5E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC;QACrC;IACF;IAKA,gBAAgB,CAAC,SAAc,EAAE,OAAoC,EAAA;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC9D,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,KAAK,CAAC,SAAS,GAAG,EAAE;AAEpB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACrD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;QAClE;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,MAAM,kBAAkB,CAAC,SAAc,EAAE,OAAoC,EAAA;QAC3E,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;AACjD,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE;QAEhD,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAErD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC;YACnC,IAAI,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;gBAAE;YAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gBAAA,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC1D,gBAAA,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM;oBAAE;AAC5B,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;AACzB,gBAAA,IAAI,GAAG,EAAE,UAAU,KAAK,KAAK,EAAE;oBAC7B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBACvE;YACF;QACF;;QAGA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,KAAI;YAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,gBAAA,GAAG,CAAC,MAAM,GAAG,EAAE;YAC/C,IAAI,GAAG,CAAC,YAAY,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE;AAC5D,gBAAA,GAAG,CAAC,YAAY,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAClD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAGA,UAAU,CAAC,SAAc,EAAE,OAAoC,EAAA;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE;AAE5C,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAG,CAAC;AAC/D,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAEA,UAAU,CAAC,SAAc,EAAE,OAAoC,EAAA;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE;AAE5C,QAAA,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAG,CAAC;AAC/D,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;IAcQ,uBAAuB,CAAC,GAAQ,EAAE,OAAoC,EAAA;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QACtC,IAAI,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,GAAG,IAAI,GAAG,EAAE;YAClB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;QAC9C;QACA,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,KAAK,GAAG;AACN,gBAAA,aAAa,EAAE,EAAE;gBACjB,YAAY,EAAE,IAAI,GAAG,EAAE;AACvB,gBAAA,SAAS,EAAE,EAAE;AACb,gBAAA,SAAS,EAAE;aACZ;AACD,YAAA,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QAC5B;AACA,QAAA,OAAO,KAAK;IACd;IAGQ,8BAA8B,GAAA;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,wCAAwC,CAAC;QAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,uCAAuC,CAAC;QAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,yCAAyC,CAAC;AAE/E,QAAA,MAAM,MAAM,GAAG,CAAC,EAAkB,KAAI;AACpC,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI;AACpB,YAAA,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC;YACpF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC;AACrE,QAAA,CAAC;AAED,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;AACvD,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE;AAC7D,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;AAC1D,QAAA,OAAO,IAAI;IACb;IAEQ,wBAAwB,CAAC,UAAe,EAAE,cAA2C,EAAA;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnD,QAAA,IAAI,CAAC,MAAM;YAAE;;QAGb,MAAM,QAAQ,GAAoC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC7E,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,IAAI,OAAO,KAAK,cAAc,EAAE;gBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;gBACjC,IAAI,KAAK,EAAE;AACT,oBAAA,KAAK,CAAC,aAAa,GAAG,EAAE;AACxB,oBAAA,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE;gBAC5B;YACF;QACF;IACF;;AAGA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC;IACtD;;;;;;IAQC,WAAW,CAAC,KAAa,EAAE,GAA+B,EAAA;AACxD,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;;AAGzB,QAAA,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;AAC5C,YAAA,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AACpB,YAAA,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;;AAG3C,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,WAAW,EAAE;AACd;SACF;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,SAAS,CAAC;AAC1D,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAEjC,GAAG,CAAC,IAAI,EAAE;IACZ;AAEA,IAAA,OAAO,CAAC,GAA+B,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACtB,GAAG,CAAC,IAAI,EAAE;IACZ;AAEA,IAAA,OAAO,CAAC,GAA+B,EAAA;;QAErC,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YACxD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;;AAGnE,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,YAAY;AACxB,gBAAA,WAAW,EAAE;AACd;SACF;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,SAAS,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAEjC,GAAG,CAAC,IAAI,EAAE;IACZ;;IAqBS,eAAe,GAAA;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACjC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEtC,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACtC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAE3C,QAAA,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACvC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;AAE7C,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACzE,QAAA,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAE3E,QAAA,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvE,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAE7E,QAAA,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAE/C,QAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACzD,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAEzD,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;AAC7B,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC;AAClC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC;AACnC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;AACrC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;AACrC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC;AACpC,gBAAA,KAAK,EAAE;AACR,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;AACnC,gBAAA,KAAK,EAAE;AACR;SACF;IACH;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,EAAE;AAC/B,YAAA,SAAS,EAAE;SACZ;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;AACvB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;AACtB,YAAA,SAAS,EAAE;SACZ;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC;;AAGA,IAAA,YAAY,CAAC,MAAkC,EAAA;AAC7C,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE;IACjD;IAGF,eAAe,CAAC,KAAuC,EAAE,MAAkC,EAAA;QAEzF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAE1D;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AAC7D,QAAA,MAAM,SAAS,GAAG;AAChB,YAAA,SAAS,EAAE,mBAAmB;AAC9B,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B;AACD;SACF;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,CAAC,IAAI,EAAE;IACf;+GA9uLa,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,85KCzG/B,oqyNA+2KA,EAAA,MAAA,EAAA,CAAA,08rBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnyKY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,q6DAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAG,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,UAAU,0CAAE,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,+BAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,UAAA,EAC7H;YACV,OAAO,CAAC,iBAAiB,EAAE;AACzB,gBAAA,KAAK,CACH,WAAW,EACX,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAC7C;AACD,gBAAA,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9D,gBAAA,UAAU,CAAC,wBAAwB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;aAC/D,CAAC;YACF,OAAO,CAAC,aAAa,EAAE;gBACrB,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACxD,oBAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBAC7D,CAAC;gBACF,UAAU,CAAC,QAAQ,EAAE;AACnB,oBAAA,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtD,oBAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBAC9D;aACF,CAAC;YACF,OAAO,CAAC,SAAS,EAAE;AACjB,gBAAA,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACnE,gBAAA,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,gBAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAClD,gBAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;aAClD;AACF,SAAA,EAAA,CAAA,CAAA;;4FAGU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAlC9B,SAAS;+BACE,YAAY,EAAA,UAAA,EAGV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAG,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,EAAA,UAAA,EAC9H;wBACV,OAAO,CAAC,iBAAiB,EAAE;AACzB,4BAAA,KAAK,CACH,WAAW,EACX,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAC7C;AACD,4BAAA,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9D,4BAAA,UAAU,CAAC,wBAAwB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;yBAC/D,CAAC;wBACF,OAAO,CAAC,aAAa,EAAE;4BACrB,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACxD,gCAAA,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;6BAC7D,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtD,gCAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;6BAC9D;yBACF,CAAC;wBACF,OAAO,CAAC,SAAS,EAAE;AACjB,4BAAA,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACnE,4BAAA,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7D,4BAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAClD,4BAAA,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;yBAClD;AACF,qBAAA,EAAA,QAAA,EAAA,oqyNAAA,EAAA,MAAA,EAAA,CAAA,08rBAAA,CAAA,EAAA;0NAaQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,OAAO,EAAA,CAAA;sBAAf;gBAEQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAGQ,uBAAuB,EAAA,CAAA;sBAA/B;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,qBAAqB,EAAA,CAAA;sBAA7B;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAGQ,0BAA0B,EAAA,CAAA;sBAAlC;gBAGQ,uBAAuB,EAAA,CAAA;sBAA/B;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAGQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,cAAc,EAAA,CAAA;sBAAtB;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAGQ,wBAAwB,EAAA,CAAA;sBAAhC;gBAGQ,eAAe,EAAA,CAAA;sBAAvB;gBAGQ,+BAA+B,EAAA,CAAA;sBAAvC;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,YAAY,EAAA,CAAA;sBAApB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAIQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAGQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAGQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAIQ,aAAa,EAAA,CAAA;sBAArB;gBAIQ,OAAO,EAAA,CAAA;sBAAf;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,wBAAwB,EAAA,CAAA;sBAAhC;gBAGQ,kBAAkB,EAAA,CAAA;sBAA1B;gBAIQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;gBAIQ,OAAO,EAAA,CAAA;sBAAf;gBAIQ,MAAM,EAAA,CAAA;sBAAd;gBAIQ,WAAW,EAAA,CAAA;sBAAnB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAIQ,WAAW,EAAA,CAAA;sBAAnB;gBAIQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,cAAc,EAAA,CAAA;sBAAtB;gBAIQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAGQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAEQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAGQ,sBAAsB,EAAA,CAAA;sBAA9B;gBAGQ,0BAA0B,EAAA,CAAA;sBAAlC;gBAGQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEQ,WAAW,EAAA,CAAA;sBAAnB;gBAEQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAEQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAGQ,2BAA2B,EAAA,CAAA;sBAAnC;gBAGQ,gCAAgC,EAAA,CAAA;sBAAxC;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,yBAAyB,EAAA,CAAA;sBAAjC;gBAgBQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBAegB,YAAY,EAAA,CAAA;sBAA5B;gBAGgB,aAAa,EAAA,CAAA;sBAA7B;gBAES,YAAY,EAAA,CAAA;sBAArB;gBAES,iBAAiB,EAAA,CAAA;sBAA1B;gBAES,mBAAmB,EAAA,CAAA;sBAA5B;gBAES,yBAAyB,EAAA,CAAA;sBAAlC;gBAgIyC,QAAQ,EAAA,CAAA;sBAAjD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBAsHxC,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB;gBAK9B,cAAc,EAAA,CAAA;sBADb,SAAS;uBAAC,gBAAgB;gBAG3B,gBAAgB,EAAA,CAAA;sBADf,SAAS;uBAAC,kBAAkB;gBAG7B,eAAe,EAAA,CAAA;sBADd,SAAS;uBAAC,iBAAiB;gBAK5B,gBAAgB,EAAA,CAAA;sBADf,SAAS;uBAAC,kBAAkB;gBAG7B,kBAAkB,EAAA,CAAA;sBADjB,SAAS;uBAAC,oBAAoB;gBAG/B,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB;gBAI9B,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB;gBAK9B,mBAAmB,EAAA,CAAA;sBADlB,SAAS;uBAAC,qBAAqB;gBAuVhC,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAwlB1C,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,yBAAyB,EAAE,CAAC,QAAQ,CAAC;gBAqBnD,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;gBAsCd,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc;gBAyGjB,QAAQ,EAAA,CAAA;sBAAjB;gBAsH0B,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;gBACE,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;gBAEvB,oBAAoB,EAAA,CAAA;sBADnB,SAAS;uBAAC,sBAAsB;gBAGjC,oBAAoB,EAAA,CAAA;sBADnB,SAAS;uBAAC,sBAAsB;gBA6wBI,sBAAsB,EAAA,CAAA;sBAA1D,SAAS;uBAAC,wBAAwB;gBACE,sBAAsB,EAAA,CAAA;sBAA1D,SAAS;uBAAC,wBAAwB;gBA8zCnC,SAAS,EAAA,CAAA;sBADR,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;gBA+CtC,OAAO,EAAA,CAAA;sBADZ,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBA0OnC,mBAAmB,EAAA,CAAA;sBAA3B;gBAEQ,eAAe,EAAA,CAAA;sBAAvB;gBA+oCgD,eAAe,EAAA,CAAA;sBAA/D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBACA,aAAa,EAAA,CAAA;sBAA3D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;gBAkBjB,aAAa,EAAA,CAAA;sBAAxC,SAAS;uBAAC,eAAe;gBACG,cAAc,EAAA,CAAA;sBAA1C,SAAS;uBAAC,gBAAgB;;;AEt0K3B;;AAEG;;ACFH;;AAEG;;;;"}
|