eru-grid 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/eru-grid.mjs +620 -62
- package/fesm2022/eru-grid.mjs.map +1 -1
- package/index.d.ts +36 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eru-grid.mjs","sources":["../../../projects/eru-grid/src/lib/services/grid-config.service.ts","../../../projects/eru-grid/src/lib/services/pivot-transform.service.ts","../../../projects/eru-grid/src/lib/stores/grid.store.ts","../../../projects/eru-grid/src/lib/services/theme.service.ts","../../../projects/eru-grid/src/lib/services/column-constraints.service.ts","../../../projects/eru-grid/src/lib/eru-grid.service.ts","../../../projects/eru-grid/src/lib/components/data-cell/custom-date-picker.directive.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.utils.ts","../../../projects/eru-grid/src/lib/components/data-cell/country-data.ts","../../../projects/eru-grid/src/lib/components/data-cell/mobile-input.component.ts","../../../projects/eru-grid/src/lib/services/overlay-menu.service.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.component.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.component.html","../../../projects/eru-grid/src/lib/directives/resize.directive.ts","../../../projects/eru-grid/src/lib/directives/column-drag.directive.ts","../../../projects/eru-grid/src/lib/eru-grid.component.ts","../../../projects/eru-grid/src/lib/eru-grid.component.html","../../../projects/eru-grid/src/lib/components/theme-toggle/theme-toggle.component.ts","../../../projects/eru-grid/src/public-api.ts","../../../projects/eru-grid/src/eru-grid.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { \n GridConfiguration, \n GridMode, \n GridFeatures, \n PivotConfiguration \n} from '../model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GridConfigService {\n\n\n\n \n\n /**\n * Detects if pivot mode should be automatically enabled based on configuration\n */\n detectPivotMode(pivotConfig?: PivotConfiguration): GridMode {\n if (!pivotConfig) {\n return 'table';\n }\n\n // If pivot configuration is provided with dimensions, enable pivot mode\n if (pivotConfig.cols.length > 0 || pivotConfig.rows.length > 0) {\n return 'pivot';\n }\n\n return 'table';\n }\n\n /**\n * Validates pivot configuration for completeness\n */\n validatePivotConfiguration(config: PivotConfiguration): { \n isValid: boolean; \n errors: string[] \n } {\n const errors: string[] = [];\n\n // Must have at least one aggregation\n if (!config.aggregations || config.aggregations.length === 0) {\n errors.push('At least one aggregation must be specified for pivot mode');\n }\n\n // Must have at least one dimension (row or column)\n if ((!config.rows || config.rows.length === 0) && \n (!config.cols || config.cols.length === 0)) {\n errors.push('At least one row dimension or column dimension must be specified');\n }\n\n // Validate aggregation functions\n const validFunctions = ['sum', 'count', 'avg', 'min', 'max'];\n config.aggregations?.forEach((agg, index) => {\n if (!agg.aggregationFunction || !validFunctions.includes(agg.aggregationFunction)) {\n errors.push(`Invalid aggregation function '${agg.aggregationFunction}' at index ${index}`);\n }\n if (!agg.name || agg.name.trim() === '') {\n errors.push(`Aggregation field cannot be empty at index ${index}`);\n }\n });\n\n return {\n isValid: errors.length === 0,\n errors\n };\n }\n\n\n /**\n * Checks if a feature is available in the current mode\n */\n isFeatureAvailable(feature: keyof GridFeatures, mode: GridMode): boolean {\n const restrictions = {\n pivot: {\n editable: false,\n columnReorderable: false\n }\n };\n\n if (mode === 'pivot' && feature in restrictions.pivot) {\n return restrictions.pivot[feature as keyof typeof restrictions.pivot];\n }\n\n return true;\n }\n\n \n}","import { inject, Injectable } from '@angular/core';\nimport { \n PivotConfiguration, \n PivotResult, \n PivotRow, \n PivotMetadata,\n AggregationFunction,\n Field,\n DataTypes,\n PivotColumnHeader,\n PivotHeaderStructure,\n PivotColumnGroupState,\n GridConfiguration\n} from '../model/grid.model';\nimport { EruGridStore } from '../stores/grid.store';\n\ninterface AggregationState {\n sum: number;\n count: number;\n min: number;\n max: number;\n values: number[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PivotTransformService {\n \n private columnGroupState: PivotColumnGroupState = {};\n\n\n\n /**\n * Main method to transform flat data into pivot table\n */\n transformData(\n sourceData: any[], \n configuration: PivotConfiguration,\n gridConfiguration?: GridConfiguration\n ): PivotResult {\n const startTime = performance.now();\n \n // Step 2: Group data by row dimensions\n const rowDimensionFields = configuration.rows;\n \n const groupedData = this.groupByDimensions(sourceData, rowDimensionFields);\n \n // Step 3: Generate pivot columns from column dimensions\n const columnDimensionFields = configuration.cols;\n const pivotColumns = this.generatePivotColumns(sourceData, columnDimensionFields);\n \n // Step 4: Create pivot rows with aggregated data\n let pivotRows = this.createPivotRows(\n groupedData, \n pivotColumns, \n configuration\n );\n \n // Step 4a: Add subtotals and grand totals if configured\n const enableRowSubtotals = gridConfiguration?.config?.enableRowSubtotals ?? false;\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const enableGrandTotal = gridConfiguration?.config?.enableGrandTotal ?? false;\n const grandTotalPosition = gridConfiguration?.config?.grandTotalPosition ?? 'after';\n if (enableRowSubtotals || enableColumnSubtotals || enableGrandTotal) {\n pivotRows = this.addSubtotals(pivotRows, configuration, pivotColumns, gridConfiguration, grandTotalPosition);\n }\n \n // Step 5: Generate column definitions (including subtotal columns)\n const columnDefinitions = this.generateColumnDefinitions(\n rowDimensionFields,\n pivotColumns,\n configuration.aggregations,\n gridConfiguration\n );\n \n // Step 6: Initialize column group state for collapsible columns\n //this.initializeColumnGroupState(configuration, columnDimensionFields);\n \n // Step 7: Generate nested header structure with collapsible support\n const headerStructure = this.generateNestedHeaderStructure(\n rowDimensionFields,\n columnDimensionFields,\n configuration.aggregations,\n sourceData,\n gridConfiguration\n );\n \n const endTime = performance.now();\n \n const metadata: PivotMetadata = {\n totalRows: pivotRows.length,\n totalColumns: columnDefinitions.length,\n processingTime: endTime - startTime,\n dataSize: sourceData.length\n };\n /* console.log({\n data: pivotRows,\n columnDefinitions,\n rowCount: pivotRows.length,\n metadata,\n configuration,\n headerStructure,\n columnGroupState: this.columnGroupState\n }); */\n return {\n data: pivotRows,\n columnDefinitions,\n rowCount: pivotRows.length,\n metadata,\n configuration,\n headerStructure,\n columnGroupState: this.columnGroupState\n };\n }\n\n\n /**\n * Group data by row dimensions\n */\n private groupByDimensions(data: any[], dimensions: string[]): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n \n data.forEach(row => {\n // Create a key from row dimension values\n // Use null/undefined check to preserve boolean false values\n const key = dimensions.map(dim => row[dim] != null ? String(row[dim]) : '').join('|');\n \n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n });\n \n // Sort the groups hierarchically to ensure proper parent-child ordering\n return this.sortGroupsHierarchically(groups, dimensions);\n }\n\n /**\n * Sort grouped data hierarchically so parent dimensions appear with their children grouped together\n */\n private sortGroupsHierarchically(groups: Map<string, any[]>, dimensions: string[]): Map<string, any[]> {\n // Convert to array for sorting\n const groupEntries = Array.from(groups.entries());\n \n // Sort by hierarchical structure - each dimension level sorted separately\n groupEntries.sort((a, b) => {\n const aValues = a[0].split('|');\n const bValues = b[0].split('|');\n \n // Compare each dimension level in order\n for (let i = 0; i < dimensions.length; i++) {\n const aVal = aValues[i] || '';\n const bVal = bValues[i] || '';\n \n // Natural sort to handle numbers properly (0, 1, 10 instead of 0, 10, 1)\n const comparison = this.naturalSort(aVal, bVal);\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n \n // Convert back to Map with sorted order\n const sortedGroups = new Map<string, any[]>();\n groupEntries.forEach(([key, value]) => {\n sortedGroups.set(key, value);\n });\n \n return sortedGroups;\n }\n\n /**\n * Natural sort that handles numbers properly\n */\n private naturalSort(a: string, b: string): number {\n // Handle numeric values\n const aNum = parseFloat(a);\n const bNum = parseFloat(b);\n \n if (!isNaN(aNum) && !isNaN(bNum)) {\n return aNum - bNum;\n }\n \n // String comparison for non-numeric values\n return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });\n }\n\n /**\n * Generate unique pivot column values using cartesian product of all dimension values\n */\n private generatePivotColumns(data: any[], columnDimensions: string[]): string[] {\n if (columnDimensions.length === 0) {\n return ['_default']; // Default column for aggregations\n }\n\n // Get all unique values for each dimension\n const dimensionValues = columnDimensions.map(dimension => {\n const values = new Set<string>();\n data.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(value);\n });\n return Array.from(values).sort();\n });\n\n // Generate cartesian product of all dimension combinations\n const generateCombinations = (arrays: string[][], index: number = 0, current: string[] = []): string[] => {\n if (index === arrays.length) {\n return [current.join('|')];\n }\n \n const results: string[] = [];\n for (const value of arrays[index]) {\n results.push(...generateCombinations(arrays, index + 1, [...current, value]));\n }\n return results;\n };\n\n return generateCombinations(dimensionValues).sort();\n }\n\n /**\n * Create pivot rows with aggregated data (PERFORMANCE OPTIMIZED)\n */\n private createPivotRows(\n groupedData: Map<string, any[]>,\n pivotColumns: string[],\n configuration: PivotConfiguration\n ): PivotRow[] {\n const pivotRows: PivotRow[] = [];\n const startTime = performance.now();\n\n // Pre-calculate column dimension mapping for performance\n const columnDataMap = new Map<string, Map<string, any[]>>();\n \n // Build column data mapping once for all rows\n groupedData.forEach((rowData, rowKey) => {\n const columnMapping = new Map<string, any[]>();\n \n // Group row data by column dimensions\n rowData.forEach(row => {\n const rowColumnKey = configuration.cols.length > 0\n ? configuration.cols\n .map(fieldName => row[fieldName] != null ? String(row[fieldName]) : '').join('|')\n : '_default';\n \n if (!columnMapping.has(rowColumnKey)) {\n columnMapping.set(rowColumnKey, []);\n }\n columnMapping.get(rowColumnKey)!.push(row);\n });\n \n columnDataMap.set(rowKey, columnMapping);\n });\n\n let processedRows = 0;\n groupedData.forEach((rowData, rowKey) => {\n const pivotRow: PivotRow = {\n _rowKey: rowKey,\n _sourceCount: rowData.length\n };\n\n // Add row dimension values to the pivot row\n const rowDimensionValues = rowKey.split('|');\n configuration.rows.forEach((fieldName: string, index: number) => {\n pivotRow[fieldName] = rowDimensionValues[index] || '';\n });\n\n\n // Get pre-calculated column mapping for this row\n const columnMapping = columnDataMap.get(rowKey)!;\n\n // Calculate aggregations for each pivot column (optimized)\n pivotColumns.forEach(pivotColumn => {\n configuration.aggregations.forEach(aggregation => {\n const columnKey = `${pivotColumn}_${aggregation.name}`;\n\n // Get filtered data from pre-calculated mapping\n const columnData = configuration.cols.length > 0\n ? columnMapping.get(pivotColumn) || []\n : rowData;\n\n const aggregatedValue = this.calculateAggregationOptimized(\n columnData,\n aggregation.name,\n aggregation.aggregationFunction || 'sum'\n );\n\n pivotRow[columnKey] = aggregatedValue;\n });\n });\n\n\n pivotRows.push(pivotRow);\n processedRows++; \n \n });\n\n const endTime = performance.now();\n \n return pivotRows;\n }\n\n /**\n * Calculate aggregation for a field (PERFORMANCE OPTIMIZED)\n */\n private calculateAggregationOptimized(\n data: any[],\n field: string,\n aggregationFunction: AggregationFunction\n ): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Optimized single-pass value processing\n let sum = 0;\n let count = 0;\n let min = Number.MAX_VALUE;\n let max = Number.MIN_VALUE;\n let validCount = 0;\n\n for (const row of data) {\n const rawValue = row[field];\n if (rawValue !== null && rawValue !== undefined && rawValue !== '') {\n const numValue = Number(rawValue);\n if (!isNaN(numValue)) {\n sum += numValue;\n validCount++;\n if (numValue < min) min = numValue;\n if (numValue > max) max = numValue;\n }\n }\n count++;\n }\n\n switch (aggregationFunction) {\n case 'sum':\n return sum;\n \n case 'count':\n return count; // Count all rows, not just numeric values\n \n case 'avg':\n return validCount > 0 ? sum / validCount : 0;\n \n case 'min':\n return validCount > 0 ? min : 0;\n \n case 'max':\n return validCount > 0 ? max : 0;\n \n default:\n return 0;\n }\n }\n\n /**\n * Calculate aggregation for a field (ORIGINAL - kept for compatibility)\n */\n private calculateAggregation(\n data: any[],\n field: string,\n aggregationFunction: AggregationFunction\n ): number {\n // Call optimized version\n return this.calculateAggregationOptimized(data, field, aggregationFunction);\n }\n\n /**\n * Generate column definitions for the pivot table\n */\n private generateColumnDefinitions(\n rowDimensions: string[],\n pivotColumns: string[],\n aggregations: any[],\n gridConfiguration?: GridConfiguration\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n const fields = gridConfiguration?.fields || [];\n rowDimensions.forEach(dimension => {\n const field : Field | undefined = fields.find((col: Field) => col.name === dimension)\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(field?.label || dimension),\n datatype: 'textbox' as DataTypes,\n field_size: 150,\n grid_index: columnIndex++,\n enableDrilldown:field?.enableDrilldown || false\n });\n });\n\n // Add pivot value columns\n pivotColumns.forEach(pivotColumn => {\n aggregations.forEach(aggregation => {\n // CRITICAL FIX: Always use consistent naming pattern\n const columnName = `${pivotColumn}_${aggregation.name}`;\n\n // For no column dimensions, just show the aggregation label\n const columnLabel = pivotColumns.length > 1 || pivotColumns[0] !== '_default'\n ? `${this.formatColumnLabel(pivotColumn)} - ${aggregation.label || aggregation.name}`\n : aggregation.label || this.formatColumnLabel(aggregation.name);\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n });\n\n return columns;\n }\n\n /**\n * Format column label for display\n */\n private formatColumnLabel(name: string): string {\n return name\n .split(/[_|\\s]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Get appropriate data type for aggregation function\n */\n private getAggregationDataType(aggregationFunction: AggregationFunction): DataTypes {\n switch (aggregationFunction) {\n case 'count':\n return 'number';\n case 'sum':\n case 'avg':\n case 'min':\n case 'max':\n return 'number'; // Could be 'currency' based on source field\n default:\n return 'number';\n }\n }\n\n /**\n * Optimize data for large datasets by processing in chunks\n */\n async transformDataAsync(\n sourceData: any[], \n configuration: PivotConfiguration,\n chunkSize: number = 1000\n ): Promise<PivotResult> {\n const startTime = performance.now();\n \n // Process data in chunks to avoid blocking the UI\n const chunks = this.chunkArray(sourceData, chunkSize);\n let processedData: any[] = [];\n \n for (const chunk of chunks) {\n // Data is already filtered by the application layer\n processedData = processedData.concat(chunk);\n \n // Allow other tasks to run\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n \n // Continue with normal processing\n return this.transformData(processedData, configuration);\n }\n\n /**\n * Split array into chunks\n */\n private chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n /**\n * Generate nested header structure for multi-dimensional columns\n */\n private generateNestedHeaderStructure(\n rowDimensions: string[],\n columnDimensions: string[],\n aggregations: any[],\n sourceData: any[],\n gridConfiguration?: GridConfiguration\n ): PivotHeaderStructure {\n // Use flat structure only if no column dimensions AND single aggregation\n if (columnDimensions.length === 0 && aggregations.length <= 1) {\n return this.generateFlatHeaderStructure(rowDimensions, columnDimensions, aggregations, sourceData);\n }\n\n // Get unique values for each column dimension\n const dimensionValues = columnDimensions.map(dimension => {\n const values = new Set<string>();\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(String(value));\n });\n return Array.from(values).sort();\n });\n\n\n // Build hierarchical header structure\n const headerRows: PivotColumnHeader[][] = [];\n const maxDepth = columnDimensions.length + (aggregations.length > 1 ? 1 : 0);\n \n // Initialize header rows\n for (let i = 0; i < maxDepth; i++) {\n headerRows.push([]);\n }\n\n // Add row dimension headers (they span all header rows)\n const fields = gridConfiguration?.fields || [];\n rowDimensions.forEach(dimension => {\n headerRows[0].push({\n name: dimension,\n label: this.formatColumnLabel(fields.find((col: Field) => col.name === dimension)?.label || dimension),\n level: 0,\n colspan: 1,\n rowspan: maxDepth\n });\n });\n\n // Generate nested column headers with collapsible support\n this.buildNestedHeaders(\n dimensionValues,\n aggregations,\n headerRows,\n 0,\n columnDimensions\n );\n\n // Generate leaf columns for actual data with collapsible support\n const leafColumns = this.generateLeafColumnsWithCollapsible(\n rowDimensions,\n dimensionValues,\n aggregations,\n columnDimensions,\n gridConfiguration\n );\n\n\n return {\n maxDepth,\n headerRows,\n leafColumns\n };\n }\n\n /**\n * Build nested column headers recursively - generates complete cartesian product structure\n */\n private buildNestedHeaders(\n dimensionValues: string[][],\n aggregations: any[],\n headerRows: PivotColumnHeader[][],\n currentLevel: number,\n columnDimensions: string[]\n ): void {\n if (currentLevel >= dimensionValues.length) {\n return;\n }\n\n const currentDimensionValues = dimensionValues[currentLevel];\n const isLastDimension = currentLevel === dimensionValues.length - 1;\n const hasMultipleAggregations = aggregations.length > 1;\n \n // Calculate how many times this level should repeat based on parent combinations\n const parentCombinations = currentLevel === 0 ? 1 : \n dimensionValues.slice(0, currentLevel).reduce((acc, values) => acc * values.length, 1);\n \n // Generate headers for this level - repeat for each parent combination\n for (let parentIndex = 0; parentIndex < parentCombinations; parentIndex++) {\n currentDimensionValues.forEach(value => {\n const colspan = this.calculateColspan(\n dimensionValues,\n currentLevel,\n aggregations.length\n );\n \n const rowspan = (isLastDimension && !hasMultipleAggregations) ? 2 : 1;\n\n const dimension = columnDimensions[currentLevel];\n const groupKey = this.generateColumnGroupKey(dimension, currentLevel);\n const isExpanded = this.isColumnGroupExpanded(groupKey);\n \n headerRows[currentLevel].push({\n name: dimension,\n label: value,\n level: currentLevel,\n colspan,\n rowspan,\n // Collapsible properties\n isCollapsible: true,\n isExpanded: isExpanded,\n groupKey: groupKey,\n parentGroupKey: currentLevel > 0 ? this.generateColumnGroupKey(columnDimensions[currentLevel - 1], currentLevel - 1) : undefined,\n collapsedDisplayMode: 'aggregated'\n });\n\n // If this is the last dimension and we have multiple aggregations,\n // add aggregation headers for this dimension value\n if (isLastDimension && hasMultipleAggregations) {\n aggregations.forEach(agg => {\n headerRows[currentLevel + 1].push({\n name: agg.name,\n label: agg.label || agg.name,\n level: currentLevel + 1,\n colspan: 1,\n rowspan: 1\n });\n });\n }\n });\n }\n\n // Recursively build next level only if not the last dimension\n if (!isLastDimension) {\n this.buildNestedHeaders(\n dimensionValues,\n aggregations,\n headerRows,\n currentLevel + 1,\n columnDimensions\n );\n }\n }\n\n /**\n * Calculate colspan for a header at given level\n */\n private calculateColspan(\n dimensionValues: string[][],\n currentLevel: number,\n aggregationCount: number\n ): number {\n let colspan = 1;\n \n // Multiply by values in deeper levels\n for (let i = currentLevel + 1; i < dimensionValues.length; i++) {\n colspan *= dimensionValues[i].length;\n }\n \n // Multiply by aggregation count if multiple aggregations\n if (aggregationCount > 1) {\n colspan *= aggregationCount;\n }\n \n return colspan;\n }\n\n /**\n * Generate leaf columns for the actual data with collapsible support\n */\n private generateLeafColumnsWithCollapsible(\n rowDimensions: string[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n const field : Field | undefined = gridConfiguration?.fields.find((col: Field) => col.name === dimension)\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(field?.label || dimension),\n datatype: 'textbox' as DataTypes,\n field_size: 150,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n enableDrilldown:field?.enableDrilldown || false\n });\n });\n\n // Handle case when there are no column dimensions\n if (columnDimensions.length === 0) {\n aggregations.forEach(aggregation => {\n const columnName = `_default_${aggregation.name}`;\n const columnLabel = aggregation.label || this.formatColumnLabel(aggregation.name);\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 1,\n parentPath: [],\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n return columns;\n }\n \n // Generate combinations respecting collapse state\n const combinations = this.generateCombinations(dimensionValues);\n \n combinations.forEach(combination => {\n // Check if any parent groups are collapsed\n const collapsedLevels = this.getCollapsedLevels(combination, columnDimensions);\n \n if (collapsedLevels.length > 0) {\n // Generate collapsed column\n const collapsedLevel = Math.min(...collapsedLevels);\n const collapsedDimension = columnDimensions[collapsedLevel];\n const groupKey = this.generateColumnGroupKey(collapsedDimension, collapsedLevel);\n \n // Only add one column per collapsed group\n const collapsedColumnKey = combination.slice(0, collapsedLevel + 1).join('|');\n if (!columns.find(col => col.name.startsWith(`${collapsedColumnKey}_collapsed_`))) {\n aggregations.forEach(aggregation => {\n const columnName = `${collapsedColumnKey}_collapsed_${aggregation.name}`;\n const columnLabel = `${combination.slice(0, collapsedLevel + 1).join(' - ')} (Total)`;\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n }\n } else {\n // Generate normal expanded columns\n aggregations.forEach(aggregation => {\n const columnKey = combination.join('|');\n const columnName = `${columnKey}_${aggregation.name}`;\n \n const columnLabel = aggregations.length > 1\n ? `${combination.join(' - ')} (${aggregation.label})`\n : combination.join(' - ');\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n }\n });\n\n return columns;\n }\n\n /**\n * Get collapsed levels for a combination path\n */\n private getCollapsedLevels(combination: string[], columnDimensions: string[]): number[] {\n const collapsedLevels: number[] = [];\n \n combination.forEach((value, index) => {\n if (index < columnDimensions.length) {\n const dimension = columnDimensions[index];\n const groupKey = this.generateColumnGroupKey(dimension, index);\n if (!this.isColumnGroupExpanded(groupKey)) {\n collapsedLevels.push(index);\n }\n }\n });\n \n return collapsedLevels;\n }\n\n /**\n * Generate leaf columns for the actual data\n */\n private generateLeafColumns(\n rowDimensions: string[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration\n ): Field[] {\n console.log(`DEBUG: generateLeafColumns called with:`, {\n rowDimensions,\n dimensionValuesLength: dimensionValues.length,\n aggregationsLength: aggregations.length,\n columnDimensions\n });\n \n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n const field : Field | undefined = gridConfiguration?.fields.find((col: Field) => col.name === dimension)\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(field?.label || dimension),\n datatype: 'textbox' as DataTypes,\n field_size: 150,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n enableDrilldown:field?.enableDrilldown || false\n });\n });\n\n // Handle case when there are no column dimensions\n if (columnDimensions.length === 0) {\n aggregations.forEach(aggregation => {\n const columnName = `_default_${aggregation.name}`;\n const columnLabel = aggregation.label || this.formatColumnLabel(aggregation.name);\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 1,\n parentPath: [],\n rowspan: 1,\n colspan: 1,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n return columns;\n }\n \n // Generate all combinations of column dimension values\n const combinations = this.generateCombinations(dimensionValues);\n \n combinations.forEach(combination => {\n aggregations.forEach(aggregation => {\n const columnKey = combination.join('|');\n // CRITICAL FIX: Use the same naming convention as data calculation\n // Data is stored as 'Feb_sales', 'Jan_sales' but columns were named 'Feb', 'Jan'\n const columnName = `${columnKey}_${aggregation.name}`;\n \n const columnLabel = aggregations.length > 1\n ? `${combination.join(' - ')} (${aggregation.label})`\n : combination.join(' - ');\n\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n });\n\n console.log(`DEBUG: generateLeafColumns generated ${columns.length} columns:`);\n columns.forEach((col, index) => {\n console.log(` [${index}] ${col.name} (label: \"${col.label}\")`);\n });\n\n return columns;\n }\n\n /**\n * Generate all combinations of dimension values\n */\n private generateCombinations(dimensionValues: string[][]): string[][] {\n if (dimensionValues.length === 0) return [[]];\n if (dimensionValues.length === 1) return dimensionValues[0].map(v => [v]);\n\n const [first, ...rest] = dimensionValues;\n const restCombinations = this.generateCombinations(rest);\n \n const combinations: string[][] = [];\n first.forEach(value => {\n restCombinations.forEach(restCombo => {\n combinations.push([value, ...restCombo]);\n });\n });\n \n return combinations;\n }\n\n /**\n * Generate flat header structure for single dimension\n */\n private generateFlatHeaderStructure(\n rowDimensions: string[],\n columnDimensions: string[],\n aggregations: any[],\n sourceData?: any[],\n gridConfiguration?: GridConfiguration\n ): PivotHeaderStructure {\n // Simple flat structure - existing logic\n const headerRows: PivotColumnHeader[][] = [[]];\n \n // Add headers for flat structure\n const columns = gridConfiguration?.fields || [];\n rowDimensions.forEach(dimension => {\n headerRows[0].push({\n label: this.formatColumnLabel(columns.find((col: Field) => col.name === dimension)?.label || dimension),\n name: dimension,\n level: 0,\n colspan: 1,\n rowspan: 1\n });\n });\n\n // For single dimension, add column headers\n if (columnDimensions.length === 1) {\n // This would need the actual column values, simplified for now\n headerRows[0].push({\n label: 'Pivot Data',\n name: 'Pivot Data',\n level: 0,\n colspan: aggregations.length || 1,\n rowspan: 1\n });\n }\n\n // Extract dimension values from source data if available\n const dimensionValues = columnDimensions.map(dimension => {\n if (!sourceData) return [];\n const values = new Set<string>();\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(String(value));\n });\n return Array.from(values).sort();\n });\n\n\n // Generate leaf columns for flat structure with collapsible support\n const leafColumns = this.generateLeafColumnsWithCollapsible(\n rowDimensions,\n dimensionValues,\n aggregations,\n columnDimensions,\n gridConfiguration\n );\n\n return {\n maxDepth: 1,\n headerRows,\n leafColumns\n };\n }\n\n /**\n * Add subtotals to pivot data based on configuration\n */\n private addSubtotals(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration,\n grandTotalPosition?: 'before' | 'after'\n ): PivotRow[] {\n const enableRowSubtotals = gridConfiguration?.config?.enableRowSubtotals ?? false;\n const enableGrandTotal = gridConfiguration?.config?.enableGrandTotal ?? false;\n \n if (!enableRowSubtotals && !enableGrandTotal) {\n return pivotRows;\n }\n\n let result = [...pivotRows];\n\n // Add row subtotals\n if (enableRowSubtotals) {\n result = this.addRowSubtotals(result, configuration, gridConfiguration);\n }\n\n // Add grand total row\n if (enableGrandTotal) {\n result = this.addGrandTotalRow(result, configuration, pivotColumns, gridConfiguration, grandTotalPosition);\n }\n\n return result;\n }\n\n /**\n * Add subtotal rows for row dimensions\n */\n private addRowSubtotals(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration,\n gridConfiguration?: GridConfiguration\n ): PivotRow[] {\n const rowDimensions = configuration.rows;\n \n \n // Only show subtotals for parent dimensions (not leaf dimensions)\n // Leaf dimension subtotals are redundant since they equal the single row\n const subtotalLevels = rowDimensions.length > 1 \n ? rowDimensions.slice(0, -1).map((_, index) => index) // Exclude last dimension (leaf)\n : []; // No subtotals if only one dimension\n\n\n let result: PivotRow[] = [];\n const subtotalGroups = new Map<string, PivotRow[]>();\n\n // Group rows by dimension values for subtotal calculation\n for (const row of pivotRows) {\n for (const level of subtotalLevels) {\n if (level < rowDimensions.length) {\n const groupKey = rowDimensions.slice(0, level + 1)\n .map(dim => row[dim])\n .join('|');\n \n if (!subtotalGroups.has(groupKey)) {\n subtotalGroups.set(groupKey, []);\n }\n subtotalGroups.get(groupKey)!.push(row);\n }\n }\n }\n // Calculate subtotals for each group\n const subtotalRows = new Map<string, PivotRow>();\n for (const [groupKey, groupRows] of subtotalGroups) {\n const subtotalRow = this.calculateSubtotalRow(groupRows, configuration, groupKey, gridConfiguration);\n subtotalRows.set(groupKey, subtotalRow);\n }\n \n // Insert subtotal rows at appropriate positions\n // Group rows by first dimension (location) to insert subtotals correctly\n const locationGroups = new Map<string, PivotRow[]>();\n for (const row of pivotRows) {\n const locationKey = String(row[rowDimensions[0]]);\n if (!locationGroups.has(locationKey)) {\n locationGroups.set(locationKey, []);\n }\n locationGroups.get(locationKey)!.push(row);\n }\n \n for (const [locationKey, rows] of locationGroups) {\n // Add all rows for this location\n result.push(...rows);\n \n // Add subtotal row if it exists for this location\n const subtotalRow = subtotalRows.get(locationKey);\n if (subtotalRow) {\n result.push(subtotalRow);\n } \n }\n \n \n return result;\n }\n\n /**\n * Add grand total row\n */\n private addGrandTotalRow(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration,\n grandTotalPosition?: 'before' | 'after'\n ): PivotRow[] {\n const grandTotalRow = this.calculateGrandTotalRow(\n pivotRows.filter(row => !row._isSubtotal), // Exclude existing subtotals\n configuration,\n 'Grand Total',\n gridConfiguration\n );\n \n grandTotalRow._isGrandTotal = true;\n // The label is already set by calculateGrandTotalRow, but ensure it shows \"Grand Total\"\n grandTotalRow._subtotalLabel = 'Grand Total';\n \n // Set dimension columns to show \"Grand Total\"\n if (configuration.rows.length > 0) {\n const firstDimField = configuration.rows[0];\n grandTotalRow[firstDimField] = 'Grand Total';\n \n // Clear other dimension values\n for (let i = 1; i < configuration.rows.length; i++) {\n const dimField = configuration.rows[i];\n grandTotalRow[dimField] = '';\n }\n }\n\n if (grandTotalPosition === 'before') {\n return [grandTotalRow, ...pivotRows];\n }\n return [...pivotRows, grandTotalRow];\n }\n\n /**\n * Calculate grand total values for all rows (ignores showSubtotals flag)\n */\n private calculateGrandTotalRow(\n rows: PivotRow[], \n configuration: PivotConfiguration, \n groupKey: string,\n gridConfiguration?: GridConfiguration\n ): PivotRow {\n const defaultLabel = gridConfiguration?.config?.subtotalLabel || 'Subtotal';\n const grandTotalRow: PivotRow = {\n _rowKey: `grand_total_${groupKey}`,\n _sourceCount: rows.reduce((sum, row) => sum + (row._sourceCount || 0), 0),\n _isGrandTotal: true,\n _subtotalLabel: `Grand Total`\n };\n\n // Calculate aggregated values for ALL aggregation fields per column (ignore showSubtotals)\n if (rows.length > 0) {\n // Get all column keys that contain aggregation data\n const allColumnKeys = Object.keys(rows[0]).filter(key => \n configuration.aggregations.some(agg => key.includes(agg.name))\n );\n\n // Calculate grand total for each column separately\n for (const columnKey of allColumnKeys) {\n const values = rows\n .map(row => parseFloat(row[columnKey]) || 0)\n .filter(val => !isNaN(val));\n\n if (values.length > 0) {\n // Find which aggregation this column belongs to\n const aggregation = configuration.aggregations.find(agg => \n columnKey.includes(agg.name)\n );\n \n if (aggregation) {\n const aggregatedValue = this.applyAggregationFunction(\n aggregation.aggregationFunction || 'sum', \n values\n );\n grandTotalRow[columnKey] = aggregatedValue;\n }\n }\n }\n }\n\n return grandTotalRow;\n }\n\n /**\n * Calculate subtotal values for a group of rows\n */\n private calculateSubtotalRow(\n rows: PivotRow[], \n configuration: PivotConfiguration, \n groupKey: string,\n gridConfiguration?: GridConfiguration\n ): PivotRow {\n const defaultLabel = gridConfiguration?.config?.subtotalLabel || 'Subtotal';\n const subtotalRow: PivotRow = {\n _rowKey: `subtotal_${groupKey}`,\n _sourceCount: rows.reduce((sum, row) => sum + (row._sourceCount || 0), 0),\n _isSubtotal: true,\n _subtotalLabel: `${defaultLabel} (${rows.length} items)`\n };\n\n // Set the subtotal label in the row dimension columns\n if (configuration.rows.length > 0) {\n const firstDimField = configuration.rows[0];\n subtotalRow[firstDimField] = `${defaultLabel} - ${groupKey}`;\n \n // Clear other dimension values\n for (let i = 1; i < configuration.rows.length; i++) {\n const dimField = configuration.rows[i];\n subtotalRow[dimField] = '';\n }\n }\n\n // Calculate aggregated values for each aggregation field per column (respects showSubtotals)\n if (rows.length > 0) {\n // Get all column keys that contain aggregation data\n const allColumnKeys = Object.keys(rows[0]).filter(key => \n configuration.aggregations.some(agg => key.includes(agg.name))\n );\n // Calculate subtotal for each column separately\n for (const columnKey of allColumnKeys) {\n const values = rows\n .map(row => parseFloat(row[columnKey]) || 0)\n .filter(val => !isNaN(val));\n\n if (values.length > 0) {\n // Find which aggregation this column belongs to\n const aggregation = configuration.aggregations.find(agg => \n columnKey.includes(agg.name)\n );\n \n // Only calculate if showSubtotals is true for this aggregation\n if (aggregation && aggregation.showSubtotals) {\n const aggregatedValue = this.applyAggregationFunction(\n aggregation.aggregationFunction || 'sum', \n values\n );\n subtotalRow[columnKey] = aggregatedValue;\n }\n }\n }\n }\n return subtotalRow;\n }\n\n /**\n * Apply aggregation function to array of values\n */\n private applyAggregationFunction(\n func: AggregationFunction, \n values: number[]\n ): number {\n switch (func) {\n case 'sum':\n return values.reduce((sum, val) => sum + val, 0);\n case 'avg':\n return values.length > 0 ? values.reduce((sum, val) => sum + val, 0) / values.length : 0;\n case 'count':\n return values.length;\n case 'min':\n return values.length > 0 ? Math.min(...values) : 0;\n case 'max':\n return values.length > 0 ? Math.max(...values) : 0;\n default:\n return 0;\n }\n }\n\n /**\n * Group rows by dimension values\n */\n private groupRowsByDimensions(\n rows: PivotRow[], \n dimensions: string[]\n ): Map<string, PivotRow[]> {\n const groups = new Map<string, PivotRow[]>();\n \n for (const row of rows) {\n const groupKey = dimensions\n .map(dim => row[dim])\n .join('|');\n \n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(row);\n }\n \n return groups;\n }\n\n /**\n * Export pivot data to CSV format\n */\n exportToCsv(pivotResult: PivotResult): string {\n const headers = pivotResult.columnDefinitions.map(col => col.label).join(',');\n const rows = pivotResult.data.map(row => {\n return pivotResult.columnDefinitions.map(col => {\n const value = row[col.name];\n return typeof value === 'string' && value.includes(',') \n ? `\"${value}\"` \n : value || '';\n }).join(',');\n });\n \n return [headers, ...rows].join('\\n');\n }\n\n /**\n * Initialize column group state based on configuration\n */\n/* private initializeColumnGroupState(\n configuration: PivotConfiguration, \n columnDimensions: string[]\n ): void {\n const defaultExpansion = configuration.defaultColumnGroupExpansion ?? 1;\n const columnGroups = configuration.columnGroups || [];\n \n // Reset state\n this.columnGroupState = {};\n \n // Create group configurations for each column dimension\n columnDimensions.forEach((dimension, level) => {\n const groupConfig = columnGroups.find(g => g.field === dimension) || {\n field: dimension,\n collapsible: true,\n defaultExpanded: defaultExpansion === -1 || level < defaultExpansion,\n collapsedDisplayMode: 'aggregated',\n collapsedAggregation: 'sum'\n };\n \n const groupKey = this.generateColumnGroupKey(dimension, level);\n \n this.columnGroupState[groupKey] = {\n isExpanded: groupConfig.defaultExpanded ?? true,\n level: level,\n childGroups: [],\n parentGroup: level > 0 ? this.generateColumnGroupKey(columnDimensions[level - 1], level - 1) : undefined\n };\n });\n \n // Link parent-child relationships\n Object.keys(this.columnGroupState).forEach(groupKey => {\n const group = this.columnGroupState[groupKey];\n if (group.parentGroup && this.columnGroupState[group.parentGroup]) {\n this.columnGroupState[group.parentGroup].childGroups = \n this.columnGroupState[group.parentGroup].childGroups || [];\n this.columnGroupState[group.parentGroup].childGroups!.push(groupKey);\n }\n });\n } */\n\n /**\n * Generate unique key for column group\n */\n private generateColumnGroupKey(dimension: string, level: number): string {\n return `${dimension}_level_${level}`;\n }\n\n /**\n * Toggle collapse/expand state of a column group\n */\n toggleColumnGroup(groupKey: string, configuration: PivotConfiguration): void {\n if (!this.columnGroupState[groupKey]) {\n console.warn(`Column group ${groupKey} not found`);\n return;\n }\n \n const group = this.columnGroupState[groupKey];\n group.isExpanded = !group.isExpanded;\n \n // Auto-collapse child groups when parent is collapsed\n if (!group.isExpanded && group.childGroups) {\n group.childGroups.forEach(childKey => {\n if (this.columnGroupState[childKey]) {\n this.columnGroupState[childKey].isExpanded = false;\n }\n });\n }\n \n // Auto-expand parent groups when child is expanded\n if (group.isExpanded && group.parentGroup) {\n let parentKey: string | undefined = group.parentGroup;\n while (parentKey && this.columnGroupState[parentKey]) {\n this.columnGroupState[parentKey].isExpanded = true;\n parentKey = this.columnGroupState[parentKey].parentGroup;\n }\n }\n }\n\n /**\n * Check if a column group is expanded\n */\n isColumnGroupExpanded(groupKey: string): boolean {\n return this.columnGroupState[groupKey]?.isExpanded ?? true;\n }\n\n /**\n * Get collapsed value for a column group\n */\n /* getCollapsedValue(\n groupKey: string, \n data: PivotRow[], \n configuration: PivotConfiguration,\n aggregations: any[]\n ): any {\n const group = this.columnGroupState[groupKey];\n if (!group) return null;\n \n const columnGroupConfig = configuration.columnGroups?.find(g => \n this.generateColumnGroupKey(g.field, group.level) === groupKey\n );\n \n const displayMode = columnGroupConfig?.collapsedDisplayMode || 'aggregated';\n const aggregationFunc = columnGroupConfig?.collapsedAggregation || 'sum';\n \n switch (displayMode) {\n case 'subtotal':\n // Use existing subtotal if available\n return this.calculateGroupSubtotal(groupKey, data, aggregations, aggregationFunc);\n \n case 'aggregated':\n // Calculate aggregated value for all child columns\n return this.calculateGroupAggregation(groupKey, data, aggregations, aggregationFunc);\n \n case 'first-value':\n // Return the first child column value\n return this.getFirstChildValue(groupKey, data);\n \n case 'count':\n // Return count of non-null values\n return this.getGroupValueCount(groupKey, data);\n \n default:\n return null;\n }\n } */\n\n /**\n * Calculate subtotal for a column group\n */\n private calculateGroupSubtotal(\n groupKey: string, \n data: PivotRow[], \n aggregations: any[], \n aggregationFunc: AggregationFunction\n ): number {\n // For now, sum all relevant column values\n // This could be enhanced to use existing subtotal calculations\n return this.calculateGroupAggregation(groupKey, data, aggregations, aggregationFunc);\n }\n\n /**\n * Calculate aggregated value for a column group\n */\n private calculateGroupAggregation(\n groupKey: string, \n data: PivotRow[], \n aggregations: any[], \n aggregationFunc: AggregationFunction\n ): number {\n const group = this.columnGroupState[groupKey];\n if (!group || data.length === 0) return 0;\n \n // Get all column keys that belong to this group\n const relevantColumns = this.getGroupColumnKeys(groupKey, aggregations);\n \n // Aggregate values across all rows and relevant columns\n let allValues: number[] = [];\n \n data.forEach(row => {\n relevantColumns.forEach(columnKey => {\n const value = row[columnKey];\n if (typeof value === 'number' && !isNaN(value)) {\n allValues.push(value);\n }\n });\n });\n \n return this.applyAggregationFunction(aggregationFunc, allValues);\n }\n\n /**\n * Get column keys that belong to a specific group\n */\n private getGroupColumnKeys(groupKey: string, aggregations: any[]): string[] {\n // This is a simplified implementation\n // In a real scenario, you'd map the groupKey to actual column keys\n const group = this.columnGroupState[groupKey];\n if (!group) return [];\n \n // For now, return a pattern-based approach\n // This would need to be enhanced based on actual column generation logic\n const groupField = groupKey.split('_level_')[0];\n return aggregations.map(agg => `${groupField}_${agg.name}`);\n }\n\n /**\n * Get first child value for a column group\n */\n private getFirstChildValue(groupKey: string, data: PivotRow[]): any {\n const relevantColumns = this.getGroupColumnKeys(groupKey, []);\n if (relevantColumns.length === 0 || data.length === 0) return null;\n \n return data[0][relevantColumns[0]] || null;\n }\n\n /**\n * Get count of non-null values in a column group\n */\n private getGroupValueCount(groupKey: string, data: PivotRow[]): number {\n const relevantColumns = this.getGroupColumnKeys(groupKey, []);\n \n let count = 0;\n data.forEach(row => {\n relevantColumns.forEach(columnKey => {\n if (row[columnKey] != null && row[columnKey] !== '') {\n count++;\n }\n });\n });\n \n return count;\n }\n\n /**\n * Get current column group state\n */\n getColumnGroupState(): PivotColumnGroupState {\n return { ...this.columnGroupState };\n }\n\n /**\n * Set column group state (for restoring state)\n */\n setColumnGroupState(state: PivotColumnGroupState): void {\n this.columnGroupState = { ...state };\n }\n\n /**\n * Calculate rowspan information for pivot rows to merge cells with same values\n * in earlier dimensions\n */\n calculateRowspanInfo(pivotRows: PivotRow[], rowDimensions: string[]): Map<string, { rowspan: number; skip: boolean; parentSpan: number }> {\n const rowspanInfo = new Map<string, { rowspan: number; skip: boolean; parentSpan: number }>();\n if (rowDimensions.length <= 1) {\n // No rowspan needed for single dimension\n return rowspanInfo;\n }\n \n for (let dimIndex = 0; dimIndex < rowDimensions.length - 1; dimIndex++) {\n const dimension = rowDimensions[dimIndex];\n let currentRowIndex = 0;\n \n while (currentRowIndex < pivotRows.length) {\n const currentRow = pivotRows[currentRowIndex];\n const currentValue = currentRow[dimension];\n // Skip subtotal and grand total rows for rowspan calculation\n if (currentRow._isSubtotal || currentRow._isGrandTotal) {\n currentRowIndex++;\n continue;\n }\n \n // Count consecutive rows with the same value for this dimension\n let spanCount = 1;\n let nextRowIndex = currentRowIndex + 1;\n \n while (nextRowIndex < pivotRows.length) {\n const nextRow = pivotRows[nextRowIndex];\n \n // Stop if we hit a subtotal or grand total row\n if (nextRow._isSubtotal || nextRow._isGrandTotal) {\n break;\n }\n \n // Check if this dimension value matches\n if (nextRow[dimension] === currentValue) {\n spanCount++;\n nextRowIndex++;\n } else {\n break;\n }\n }\n \n // Only add rowspan if we have more than one row to span\n if (spanCount > 1) {\n // First row gets the rowspan\n const firstRowKey = `${currentRowIndex}_${dimension}`;\n rowspanInfo.set(firstRowKey, { rowspan: spanCount, skip: false, parentSpan: spanCount });\n \n // Subsequent rows should be skipped (hidden)\n for (let i = 1; i < spanCount; i++) {\n const skipRowKey = `${currentRowIndex + i}_${dimension}`;\n rowspanInfo.set(skipRowKey, { rowspan: 0, skip: true, parentSpan: spanCount-i });\n }\n }\n \n // Move to the next group\n currentRowIndex = nextRowIndex;\n }\n }\n return rowspanInfo;\n }\n}","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { \n Field, \n Row, \n RowGroup, \n GridConfiguration, \n GridMode,\n GridFeatures,\n PivotConfiguration,\n PivotResult,\n PivotDrilldown,\n PivotRow\n} from '../model/grid.model';\nimport { delay, of, Observable } from 'rxjs';\nimport { GridConfigService } from '../services/grid-config.service';\nimport { PivotTransformService } from '../services/pivot-transform.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EruGridStore {\n // Inject services\n private readonly gridConfigService = inject(GridConfigService);\n private readonly pivotTransformService = inject(PivotTransformService);\n\n // State signals\n private readonly _columns = signal<Field[]>([]);\n private readonly _groups = signal<RowGroup[]>([]);\n private readonly _rows = signal<Row[]>([]);\n private readonly _selectedRowIds = signal<Set<string>>(new Set());\n private readonly _configuration = signal<GridConfiguration>({\n mode: 'table',\n fields: [],\n config: {\n editable: true,\n columnResizable: true,\n columnReorderable: true,\n cellSelection: true,\n rowSelection: true,\n exportable: true,\n filtering: true,\n showColumnLines: true,\n showRowLines: true,\n }\n });\n private readonly _isLoading = signal<boolean>(false);\n private readonly _error = signal<string | null>(null);\n private readonly _activeCell = signal<any>(null);\n \n // Pivot-specific signals\n private readonly _pivotConfiguration = signal<PivotConfiguration | null>(null);\n private readonly _pivotResult = signal<PivotResult | null>(null);\n private readonly _pivotDrilldown = signal<PivotDrilldown | null>(null);\n // Computed signals\n readonly columns = this._columns.asReadonly();\n readonly groups = this._groups.asReadonly();\n readonly rows = this._rows.asReadonly();\n readonly selectedRowIds = this._selectedRowIds.asReadonly();\n readonly configuration = this._configuration.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly activeCell = this._activeCell.asReadonly();\n \n // Pivot-specific readonly signals\n readonly pivotConfiguration = this._pivotConfiguration.asReadonly();\n readonly pivotResult = this._pivotResult.asReadonly();\n readonly pivotDrilldown = this._pivotDrilldown.asReadonly();\n // Computed properties\n readonly selectedRows = computed(() => \n this.rows().filter(row => this.selectedRowIds().has(row.entity_id))\n );\n\n readonly totalSelectedCount = computed(() => this.selectedRowIds().size);\n\n readonly hasSelection = computed(() => this.selectedRowIds().size > 0);\n\n readonly expandedGroups = computed(() => \n this.groups().filter(group => group.isExpanded)\n );\n\n readonly visibleColumns = computed(() => \n this.columns().filter(col => col.field_size > 0)\n );\n\n readonly rowsByGroup = computed(() => {\n const rowMap = new Map<string,Row[]>();\n this.rows().forEach(row => {\n const groupRows = rowMap.get(row.groupId) || [];\n groupRows.push(row);\n rowMap.set(row.groupId, groupRows);\n });\n return rowMap;\n });\n\n // Pivot-specific computed properties\n readonly currentMode = computed(() => {\n const config = this.configuration();\n return config?.mode || 'table';\n });\n \n readonly isPivotMode = computed(() => this.currentMode() === 'pivot');\n \n readonly isEditingEnabled = computed(() => {\n const config = this.configuration();\n return config?.config?.editable ?? false;\n });\n \n readonly displayColumns = computed(() => {\n // In pivot mode, use pivot result columns; otherwise, use regular columns\n if (this.isPivotMode() && this.pivotResult()) {\n return this.pivotResult()!.columnDefinitions;\n }\n return this.columns();\n });\n \n readonly displayData = computed(() => {\n // In pivot mode, use pivot result data; otherwise, use rows\n if (this.isPivotMode() && this.pivotResult()) {\n return this.pivotResult()!.data;\n }\n return this.rows();\n });\n\n // Type-safe accessors for specific modes\n readonly pivotGrandTotalData = computed(() => {\n let pd: PivotRow[] = [];\n if (this.isPivotMode() && this.pivotResult()) {\n if (this.configuration().config?.enableGrandTotal) {\n if (this.configuration().config?.freezeGrandTotal) {\n if (this.configuration().config?.grandTotalPosition === 'before') {\n pd = [this.pivotResult()!.data[0]];\n } else {\n pd = [this.pivotResult()!.data[this.pivotResult()!.data.length - 1]];\n }\n }\n }\n }\n return pd;\n });\n // Type-safe accessors for specific modes\n readonly pivotDisplayData = computed(() => {\n if (this.isPivotMode() && this.pivotResult()) {\n if (this.configuration().config?.enableGrandTotal && this.configuration().config?.freezeGrandTotal) {\n if (this.configuration().config?.grandTotalPosition === 'before') {\n return this.pivotResult()!.data.slice(1);\n } else {\n return this.pivotResult()!.data;\n }\n }\n return this.pivotResult()!.data;\n }\n return [];\n });\n\n readonly tableDisplayData = computed(() => {\n if (!this.isPivotMode()) {\n return this.rows();\n }\n return [];\n });\n\n // Column methods\n setColumns(columns: Field[]) {\n // Sort columns by grid_index to ensure proper order in table mode\n const sortedColumns = [...columns].sort((a, b) => a.grid_index - b.grid_index);\n this._columns.set(sortedColumns);\n }\ngetConfiguration():GridConfiguration{\n return this.configuration();\n}\n reorderColumns(fromIndex: number, toIndex: number) {\n const currentColumns = [...this.columns()];\n \n if (fromIndex < 0 || fromIndex >= currentColumns.length || \n toIndex < 0 || toIndex >= currentColumns.length) {\n console.error('Invalid column indices', { fromIndex, toIndex });\n return;\n }\n\n const [removedColumn] = currentColumns.splice(fromIndex, 1);\n currentColumns.splice(toIndex, 0, removedColumn);\n \n // Update grid_index values to reflect new order\n const reorderedColumns = currentColumns.map((col, index) => ({\n ...col,\n grid_index: index + 1 // grid_index typically starts from 1\n }));\n \n this._columns.set(reorderedColumns);\n }\n\n updateColumnWidth(columnName: string, field_size: number) {\n const columns = this.columns().map(col => \n col.name === columnName ? { ...col, field_size: field_size } : col\n );\n this._columns.set(columns);\n }\n\n // Group methods\n setGroups(groups: RowGroup[]) {\n this._groups.set(groups);\n }\n\n toggleGroupExpansion(groupId: string) {\n const groups = this.groups().map(group => \n group.id === groupId \n ? { ...group, isExpanded: !group.isExpanded }\n : group\n );\n this._groups.set(groups);\n }\n\n updateGroupLoadingState(groupId: string, isLoading: boolean) {\n const groups = this.groups().map(group => \n group.id === groupId ? { ...group, isLoading } : group\n );\n this._groups.set(groups);\n }\n\n updateGroupAfterLoading(groupId: string, loadedCount: number, fullyExhausted = false) {\n const groups = this.groups().map(group => {\n if (group.id === groupId) {\n const newLoadedCount = (group.currentLoadedRows || 0) + loadedCount;\n return {\n ...group,\n isLoading: false,\n currentPage: (group.currentPage || 0) + 1,\n currentLoadedRows: newLoadedCount,\n hasMoreRows: fullyExhausted \n ? false \n : newLoadedCount < group.totalRowCount\n };\n }\n return group;\n });\n this._groups.set(groups);\n }\n\n // Row methods\n setRows(rows: Row[]) {\n this._rows.set(rows);\n }\n\n addRows(newRows: Row[]) {\n const rows = [...this.rows(), ...newRows];\n this._rows.set(rows);\n }\n\n updateRow(rowId: string, updates: Partial<Row>) {\n const rows = this.rows().map(row => \n row.entity_id === rowId ? { ...row, ...updates } : row\n );\n this._rows.set(rows);\n }\n\n // Selection methods\n selectRow(rowId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n selectedRowIds.add(rowId);\n this._selectedRowIds.set(selectedRowIds);\n }\n\n deselectRow(rowId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n selectedRowIds.delete(rowId);\n this._selectedRowIds.set(selectedRowIds);\n }\n\n toggleRowSelection(rowId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n if (selectedRowIds.has(rowId)) {\n selectedRowIds.delete(rowId);\n } else {\n selectedRowIds.add(rowId);\n }\n this._selectedRowIds.set(selectedRowIds);\n }\n\n selectAllRowsInGroup(groupId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n groupRows.forEach(row => selectedRowIds.add(row.entity_id));\n this._selectedRowIds.set(selectedRowIds);\n }\n\n deselectAllRowsInGroup(groupId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n groupRows.forEach(row => selectedRowIds.delete(row.entity_id));\n this._selectedRowIds.set(selectedRowIds);\n }\n\n clearSelection() {\n this._selectedRowIds.set(new Set<string>());\n }\n\n // Configuration methods\n setConfiguration(configuration: GridConfiguration) {\n // Ensure we create a new object reference to trigger signal updates\n const currentConfig = this.configuration();\n const newConfiguration = {\n ...currentConfig,\n ...configuration,\n // Preserve existing config properties that are not provided in the new configuration\n config: {\n ...currentConfig.config,\n ...configuration.config\n },\n // Preserve existing styles if not provided\n styles: configuration.styles ? { ...configuration.styles } : currentConfig.styles,\n // Completely replace data with what's passed (even if undefined)\n data: configuration.data\n };\n \n this._configuration.set(this.validateAndEnforceConfiguration(newConfiguration));\n \n this.setColumns(configuration.fields);\n }\n/**\n * Validates and enforces rules for grid configuration\n */\nvalidateAndEnforceConfiguration(config: GridConfiguration): GridConfiguration {\n const validatedConfig = { ...config };\n\n // Enforce mode-specific rules\n if (config.mode === 'pivot') {\n // Force disable editing for pivot mode\n validatedConfig.config = {\n ...config.config,\n editable: false, // Must be false for pivot\n columnReorderable: false // Breaks pivot structure\n };\n\n // Ensure pivot configuration exists with defaults\n if (!validatedConfig.pivot) {\n validatedConfig.pivot = {\n rows: [],\n cols: [],\n aggregations: [],\n clientSideThreshold: 10000\n };\n } else {\n // Ensure default values for optional properties\n validatedConfig.pivot = {\n ...validatedConfig.pivot,\n clientSideThreshold: validatedConfig.pivot.clientSideThreshold ?? 10000\n };\n }\n }\n\n return validatedConfig;\n}\n /**\n * Update specific configuration properties\n * This method ensures proper signal updates for nested properties\n */\n updateConfigurationProperties(updates: Partial<GridConfiguration['config']>) {\n const currentConfig = this.configuration();\n const newConfig = {\n ...currentConfig,\n config: {\n ...currentConfig.config,\n ...updates\n }\n };\n this._configuration.set(newConfig);\n }\n\n /**\n * Update grid lines configuration\n * This method specifically handles grid lines updates\n */\n updateGridLines(showColumnLines?: boolean, showRowLines?: boolean) {\n const updates: Partial<GridConfiguration['config']> = {};\n if (showColumnLines !== undefined) {\n updates.showColumnLines = showColumnLines;\n }\n if (showRowLines !== undefined) {\n updates.showRowLines = showRowLines;\n }\n this.updateConfigurationProperties(updates);\n }\n\n gridConfiguration(): GridConfiguration {\n return this.configuration();\n }\n\n // Active cell methods\n setActiveCell(activeCell: any) {\n this._activeCell.set(activeCell);\n }\n\n // Loading and error methods\n setLoading(isLoading: boolean) {\n this._isLoading.set(isLoading);\n }\n\n setError(error: string | null) {\n this._error.set(error);\n }\n\n // Data fetching method\n fetchNewRowData(pageSize: number, page: number, group: RowGroup): Observable<any[]> {\n const startIndex = (group.currentPage || 0) * pageSize;\n const endIndex = startIndex + pageSize;\n const data = this.configuration().data?.slice(startIndex, endIndex) || [];\n return of(data).pipe(delay(1000));\n }\n\n // Helper methods\n isRowSelected(rowId: string): boolean {\n return this.selectedRowIds().has(rowId);\n }\n\n isGroupSelected(groupId: string): boolean {\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n return groupRows.length > 0 && \n groupRows.every(row => this.selectedRowIds().has(row.entity_id));\n }\n\n getRowsForGroup(groupId: string): Row[] {\n return this.rows().filter(row => row.groupId === groupId);\n }\n\n // Pivot methods\n setGridMode(mode: GridMode) {\n const currentConfig = this.configuration();\n const newConfig = {\n ...currentConfig,\n mode\n };\n // Validate and enforce mode-specific rules\n this._configuration.set(this.validateAndEnforceConfiguration(newConfig));\n if (mode === 'pivot') {\n // Extract and set pivot configuration from main configuration\n if (currentConfig.pivot) {\n this._pivotConfiguration.set(currentConfig.pivot);\n }\n this.transformToPivot();\n }\n }\n\n updateGridConfiguration(updates: Partial<GridConfiguration>) {\n const currentConfig = this.configuration();\n const mergedConfig = {\n ...currentConfig,\n ...updates,\n // Merge nested config object properly\n config: {\n ...currentConfig.config,\n ...updates.config\n }\n };\n // Validate and enforce mode-specific rules\n this._configuration.set(this.validateAndEnforceConfiguration(mergedConfig));\n }\n\n setPivotConfiguration(pivotConfig: PivotConfiguration) {\n this._pivotConfiguration.set(pivotConfig);\n // Also store in the main configuration for consistency\n this.updateGridConfiguration({ pivot: pivotConfig });\n // Auto-switch to pivot mode if pivot configuration is provided\n if (this.currentMode() !== 'pivot') {\n this.setGridMode('pivot');\n }\n // Transform data if source data is available in gridConfiguration.data\n if ((this.configuration().data || []).length > 0) {\n this.transformToPivot();\n }\n }\n\n setSourceData(data: any[]) {\n // Store data in gridConfiguration.data instead of separate signal\n this.updateGridConfiguration({ data });\n // If in pivot mode and pivot configuration exists, transform data\n if (this.isPivotMode() && this.pivotConfiguration()) {\n this.transformToPivot();\n }\n }\n\n private transformToPivot() {\n const pivotConfig = this.pivotConfiguration();\n const sourceData = this.configuration().data || [];\n \n if (!pivotConfig || sourceData.length === 0) {\n console.log('🔄 TRANSFORM DEBUG: Skipping transformation - no config or data');\n return;\n }\n\n this.setLoading(true);\n this.setError(null);\n\n try {\n // For large datasets, we could use async transformation in the future\n // For now, use synchronous transformation for all datasets\n {\n // Synchronous transformation for smaller datasets\n const result = this.pivotTransformService.transformData(sourceData, pivotConfig, this.configuration());\n this._pivotResult.set(result);\n this.setLoading(false);\n }\n } catch (error: any) {\n this.setError(`Pivot transformation failed: ${error.message}`);\n this.setLoading(false);\n }\n }\n\n clearPivot() {\n this._pivotConfiguration.set(null);\n this._pivotResult.set(null);\n this.setGridMode('table');\n }\n\n // Force refresh pivot transformation (for debugging)\n forceRefreshPivot() {\n console.log('🔄 FORCE REFRESH: Clearing pivot result and re-transforming');\n this._pivotResult.set(null);\n this.transformToPivot();\n }\n\n exportPivotToCsv(): string | null {\n const pivotResult = this.pivotResult();\n if (!pivotResult) {\n return null;\n }\n return this.pivotTransformService.exportToCsv(pivotResult);\n }\n\n validatePivotConfiguration(config: PivotConfiguration): { isValid: boolean; errors: string[] } {\n return this.gridConfigService.validatePivotConfiguration(config);\n }\n\n isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean {\n const config = this.configuration();\n return Boolean(config.config?.[feature] ?? false);\n }\n\n // Collapsible columns support\n \n /**\n * Get access to the PivotTransformService for external manipulation\n */\n getPivotTransformService(): PivotTransformService {\n return this.pivotTransformService;\n }\n\n /**\n * Regenerate pivot data (useful after column group state changes)\n */\n regeneratePivotData() {\n if (this.isPivotMode() && this.pivotConfiguration() && (this.configuration().data || []).length > 0) {\n this.transformToPivot();\n }\n }\n\n /**\n * Update pivot configuration and regenerate if needed\n */\n updatePivotConfiguration(updates: Partial<PivotConfiguration>) {\n const currentConfig = this.pivotConfiguration();\n if (currentConfig) {\n const updatedConfig = { ...currentConfig, ...updates };\n this.setPivotConfiguration(updatedConfig);\n }\n }\n\n /**\n * Check if freeze is enabled and valid for current mode\n */\n isFreezeEnabled(): boolean {\n const freezeField = this.configuration().config?.freezeField;\n if (!freezeField) {\n return false;\n }\n\n if (this.isPivotMode()) {\n return this.isValidPivotFreezeField(freezeField);\n }\n \n // For table mode, any column can be frozen\n return this.displayColumns().some(col => col.name === freezeField);\n }\n\n /**\n * Validate freeze field for pivot mode\n */\n private isValidPivotFreezeField(freezeField: string): boolean {\n const pivotConfig = this.pivotConfiguration();\n if (!pivotConfig) {\n return false;\n }\n\n // Check if it's a row dimension\n if (pivotConfig.rows?.includes(freezeField)) {\n return true;\n }\n\n // Check if it's the root column dimension\n if (pivotConfig.cols?.length > 0 && pivotConfig.cols[0] === freezeField) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get the freeze field name\n */\n getFreezeField(): string | null {\n return this.configuration().config?.freezeField || null;\n }\n\n /**\n * Check if freeze header is enabled\n */\n isFreezeHeaderEnabled(): boolean {\n return this.configuration().config?.freezeHeader ?? false;\n }\n\n /**\n * Check if freeze grand total is enabled\n */\n isFreezeGrandTotalEnabled(): boolean {\n return this.configuration().config?.freezeGrandTotal ?? false;\n }\n setPivotDrilldown(drilldown: PivotDrilldown,columnValues:string) {\n if (drilldown.frozenGrandTotalCell) {\n drilldown.rowData = this.pivotGrandTotalData()[0]\n } else {\n drilldown.rowData = this.pivotDisplayData()[parseInt(drilldown.rowId)]\n }\n \n const columnValuesArray = columnValues.split('|')\n const cols = this.configuration()?.pivot?.cols\n columnValuesArray.forEach((value,index)=>{\n drilldown.rowData[cols![index]] = value\n })\n this._pivotDrilldown.set(drilldown);\n }\n clearPivotDrilldown() {\n this._pivotDrilldown.set(null);\n }\n}","import { Injectable, signal, effect, inject, DOCUMENT } from '@angular/core';\n\n\nexport type Theme = 'light' | 'dark' | 'high-contrast' | 'auto';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private document = inject(DOCUMENT) as Document;\n private readonly storageKey = 'eru-grid-theme';\n \n // Theme state\n private readonly _currentTheme = signal<Theme>('auto');\n private readonly _systemTheme = signal<'light' | 'dark'>('light');\n \n // Public readonly signals\n readonly currentTheme = this._currentTheme.asReadonly();\n readonly systemTheme = this._systemTheme.asReadonly();\n \n // Computed effective theme\n readonly effectiveTheme = signal<'light' | 'dark' | 'high-contrast'>('light');\n \n constructor() {\n // Initialize theme from localStorage or default to auto\n this.initializeTheme();\n \n // Listen for system theme changes\n this.setupSystemThemeListener();\n \n // Apply theme changes to DOM\n effect(() => {\n this.applyTheme();\n });\n }\n \n private initializeTheme() {\n const savedTheme = localStorage.getItem(this.storageKey) as Theme;\n if (savedTheme && ['light', 'dark', 'high-contrast', 'auto'].includes(savedTheme)) {\n this._currentTheme.set(savedTheme);\n }\n \n // Detect initial system theme\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n this._systemTheme.set(prefersDark ? 'dark' : 'light');\n }\n \n private setupSystemThemeListener() {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n \n const handleChange = (e: MediaQueryListEvent) => {\n this._systemTheme.set(e.matches ? 'dark' : 'light');\n };\n \n mediaQuery.addEventListener('change', handleChange);\n \n // Cleanup listener on service destroy would go here if needed\n }\n \n private applyTheme() {\n const theme = this._currentTheme();\n const systemTheme = this._systemTheme();\n \n // Determine effective theme\n let effectiveTheme: 'light' | 'dark' | 'high-contrast';\n \n if (theme === 'auto') {\n effectiveTheme = systemTheme;\n } else if (theme === 'high-contrast') {\n effectiveTheme = 'high-contrast';\n } else {\n effectiveTheme = theme;\n }\n \n this.effectiveTheme.set(effectiveTheme);\n \n // Apply theme classes to body\n const body = this.document.body;\n \n // Remove existing theme classes\n body.classList.remove('eru-grid-light', 'eru-grid-dark', 'eru-grid-high-contrast');\n \n // Add new theme class\n body.classList.add(`eru-grid-${effectiveTheme}`);\n \n // Update CSS custom properties for theme\n this.updateCSSVariables(effectiveTheme);\n }\n \n private updateCSSVariables(theme: 'light' | 'dark' | 'high-contrast') {\n const root = this.document.documentElement;\n \n // Theme-specific CSS variables can be set here\n // The main theme variables are already defined in theme.scss\n // This is for any dynamic adjustments\n \n if (theme === 'high-contrast') {\n root.style.setProperty('--grid-outline', '#000000');\n root.style.setProperty('--grid-on-surface', '#000000');\n } else {\n // Reset to default values (handled by CSS)\n root.style.removeProperty('--grid-outline');\n root.style.removeProperty('--grid-on-surface');\n }\n }\n \n // Public methods\n setTheme(theme: Theme) {\n this._currentTheme.set(theme);\n localStorage.setItem(this.storageKey, theme);\n }\n \n toggleTheme() {\n const current = this._currentTheme();\n const next = current === 'light' ? 'dark' : 'light';\n this.setTheme(next);\n }\n \n getAvailableThemes(): Array<{value: Theme, label: string}> {\n return [\n { value: 'auto', label: 'Auto' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n { value: 'high-contrast', label: 'High Contrast' }\n ];\n }\n \n // Theme detection utilities\n isLightTheme(): boolean {\n return this.effectiveTheme() === 'light';\n }\n \n isDarkTheme(): boolean {\n return this.effectiveTheme() === 'dark';\n }\n \n isHighContrastTheme(): boolean {\n return this.effectiveTheme() === 'high-contrast';\n }\n \n isAutoTheme(): boolean {\n return this._currentTheme() === 'auto';\n }\n}","import { Injectable } from '@angular/core';\nimport { DataTypes, ColumnWidthConstraints, GridConfiguration, Field } from '../model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColumnConstraintsService {\n \n // Sensible defaults for each datatype\n private readonly DATATYPE_DEFAULTS: Record<DataTypes, ColumnWidthConstraints> = {\n textbox: { minWidth: 80, maxWidth: 400 },\n email: { minWidth: 120, maxWidth: 300 },\n location: { minWidth: 100, maxWidth: 250 },\n number: { minWidth: 60, maxWidth: 150 },\n currency: { minWidth: 80, maxWidth: 150 },\n date: { minWidth: 100, maxWidth: 180 },\n dropdown_single_select: { minWidth: 80, maxWidth: 200 },\n dropdown_multi_select: { minWidth: 100, maxWidth: 250 },\n checkbox: { minWidth: 40, maxWidth: 60 },\n people: { minWidth: 100, maxWidth: 200 },\n phone: { minWidth: 120, maxWidth: 180 },\n priority: { minWidth: 80, maxWidth: 150 },\n status: { minWidth: 80, maxWidth: 150 },\n progress: { minWidth: 100, maxWidth: 200 },\n attachment: { minWidth: 60, maxWidth: 100 },\n tags: { minWidth: 100, maxWidth: 300 }\n };\n\n /**\n * Get effective constraints for a column, considering all override levels\n */\n getColumnConstraints(column: Field | undefined, gridConfig?: GridConfiguration): ColumnWidthConstraints {\n // Start with datatype defaults (fallback to generic if column is undefined)\n const datatype = column?.datatype as DataTypes;\n const datatypeDefaults = datatype && datatype in this.DATATYPE_DEFAULTS ? \n this.DATATYPE_DEFAULTS[datatype] :\n { minWidth: 60, maxWidth: 300 };\n \n // Apply global config overrides\n const globalConstraints = gridConfig?.columnConstraints?.global || {};\n \n // Apply datatype-specific config overrides\n const datatypeConfigConstraints = datatype && gridConfig?.columnConstraints?.byDatatype?.[datatype] ? \n gridConfig.columnConstraints.byDatatype[datatype] :\n {};\n \n // Apply column-specific overrides (highest priority)\n const columnSpecificConstraints = {\n minWidth: column?.minWidth,\n maxWidth: column?.maxWidth\n };\n\n // Merge in priority order (column-specific > datatype-config > global > datatype-defaults)\n return {\n minWidth: columnSpecificConstraints.minWidth ?? \n datatypeConfigConstraints.minWidth ?? \n globalConstraints.minWidth ?? \n datatypeDefaults.minWidth,\n maxWidth: columnSpecificConstraints.maxWidth ?? \n datatypeConfigConstraints.maxWidth ?? \n globalConstraints.maxWidth ?? \n datatypeDefaults.maxWidth\n };\n }\n\n /**\n * Validate and constrain a width value for a column\n */\n constrainWidth(width: number, column: Field | undefined, gridConfig?: GridConfiguration): number {\n const constraints = this.getColumnConstraints(column, gridConfig);\n \n if (constraints.minWidth && width < constraints.minWidth) {\n return constraints.minWidth;\n }\n \n if (constraints.maxWidth && width > constraints.maxWidth) {\n return constraints.maxWidth;\n }\n \n return width;\n }\n\n /**\n * Get all datatype defaults (for documentation/debugging)\n */\n getDatatypeDefaults(): Record<DataTypes, ColumnWidthConstraints> {\n return { ...this.DATATYPE_DEFAULTS };\n }\n}","import { Injectable } from '@angular/core';\nimport { EruGridStore } from './stores/grid.store';\nimport { ThemeService } from './services/theme.service';\nimport { ColumnConstraintsService } from './services/column-constraints.service';\nimport { \n Field, \n RowGroup, \n GridConfiguration, \n PivotConfiguration, \n GridMode,\n DataTypes,\n GridFeatures\n} from './model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EruGridService {\n\n constructor(\n private eruGridStore: EruGridStore,\n private themeService: ThemeService,\n private columnConstraintsService: ColumnConstraintsService\n ) { }\n \n set_table_configuration(data: GridConfiguration) {\n this.eruGridStore.setConfiguration(data);\n \n }\n \n /* set_table_column(data: Field[]) {\n this.gridStore.setColumns(data);\n } */\n \n set_table_group(data: RowGroup[]) {\n this.eruGridStore.setGroups(data);\n }\n \n // Expose additional methods for external use\n get columns() {\n return this.eruGridStore.columns;\n }\n \n get groups() {\n return this.eruGridStore.groups;\n }\n \n get rows() {\n return this.eruGridStore.rows;\n }\n \n get selectedRowIds() {\n return this.eruGridStore.selectedRowIds;\n }\n \n get hasSelection() {\n return this.eruGridStore.hasSelection;\n }\n \n // Theme management\n get theme() {\n return this.themeService;\n }\n \n // Column constraints management\n getColumnConstraints(column: Field | undefined) {\n return this.columnConstraintsService.getColumnConstraints(column, this.eruGridStore.gridConfiguration());\n }\n \n constrainColumnWidth(width: number, column: Field | undefined) {\n return this.columnConstraintsService.constrainWidth(width, column, this.eruGridStore.gridConfiguration());\n }\n \n getDatatypeDefaults() {\n return this.columnConstraintsService.getDatatypeDefaults();\n }\n\n // Pivot functionality methods\n \n /**\n * Configure the grid for pivot mode with pivot configuration\n */\n set_pivot_configuration(pivotConfig: PivotConfiguration, sourceData?: any[]) {\n this.eruGridStore.setPivotConfiguration(pivotConfig);\n \n if (sourceData && sourceData.length > 0) {\n // Store data in gridConfiguration.data for unified storage\n this.eruGridStore.updateGridConfiguration({ data: sourceData });\n }\n }\n\n\n /**\n * Switch grid to table mode or pivot mode\n */\n set_grid_mode(mode: GridMode) {\n if (mode === 'pivot') {\n // Pivot configuration and data are already stored in unified locations\n this.eruGridStore.setGridMode('pivot');\n } else if (mode === 'table') {\n this.eruGridStore.clearPivot();\n }\n }\n\n /**\n * Update grid configuration with new settings\n */\n update_grid_configuration(updates: Partial<GridConfiguration>) {\n console.log('🔄 update_grid_configuration from service:', updates);\n this.eruGridStore.updateGridConfiguration(updates);\n }\n\n /**\n * Enable or disable specific grid features\n */\n set_grid_features(features: Partial<GridFeatures>) {\n console.log('🔄 set_grid_features from service:', features);\n const currentConfig = this.eruGridStore.configuration();\n this.eruGridStore.updateGridConfiguration({\n config: {\n ...currentConfig.config,\n ...features\n }\n });\n }\n\n /**\n * Clear pivot configuration and return to table mode\n */\n clear_pivot() {\n this.eruGridStore.clearPivot();\n }\n\n /**\n * Export pivot data to CSV format\n */\n export_pivot_to_csv(): string | null {\n return this.eruGridStore.exportPivotToCsv();\n }\n\n /**\n * Validate pivot configuration\n */\n validate_pivot_configuration(config: PivotConfiguration): { isValid: boolean; errors: string[] } {\n return this.eruGridStore.validatePivotConfiguration(config);\n }\n\n // Getters for pivot functionality\n \n get currentMode() {\n return this.eruGridStore.currentMode;\n }\n\n get isPivotMode() {\n return this.eruGridStore.isPivotMode;\n }\n\n get pivotConfiguration() {\n return this.eruGridStore.pivotConfiguration;\n }\n\n get pivotResult() {\n return this.eruGridStore.pivotResult;\n }\n\n get displayColumns() {\n return this.eruGridStore.displayColumns;\n }\n\n get displayData() {\n return this.eruGridStore.displayData;\n }\n\n get isEditingEnabled() {\n return this.eruGridStore.isEditingEnabled;\n }\n\n get configuration() {\n return this.eruGridStore.configuration;\n }\n\n get isLoading() {\n return this.eruGridStore.isLoading;\n }\n\n get error() {\n return this.eruGridStore.error;\n }\n\n /**\n * Check if a specific feature is enabled\n */\n isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean {\n return this.eruGridStore.isFeatureEnabled(feature);\n }\n\n /**\n * Get direct access to grid store (for debugging purposes)\n */\n getGridStore() {\n return this.eruGridStore;\n }\n}\n","import { Directive, ElementRef, OnInit, Renderer2 } from '@angular/core';\nimport { MAT_DATE_FORMATS, NativeDateAdapter, DateAdapter } from '@angular/material/core';\n\nclass CustomDateAdapter extends NativeDateAdapter {\n override format(date: Date, displayFormat: Object): string {\n if (displayFormat === 'input') {\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n return `${this.pad(day)}-${this.pad(month)}-${year}`;\n }\n return date.toDateString();\n }\n\n private pad(n: number): string {\n return n < 10 ? '0' + n : n.toString();\n }\n}\n\n@Directive({\n selector: '[appCustomDatePicker]',\n standalone: true,\n providers: [\n {\n provide: DateAdapter,\n useClass: CustomDateAdapter\n },\n {\n provide: MAT_DATE_FORMATS,\n useValue: {\n parse: {\n dateInput: 'dd-MM-yyyy',\n },\n display: {\n dateInput: 'input',\n monthYearLabel: 'MMM yyyy',\n dateA11yLabel: 'dd-MM-yyyy',\n monthYearA11yLabel: 'MMMM yyyy',\n },\n },\n },\n ],\n})\nexport class CustomDatePickerDirective implements OnInit {\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n private dateAdapter: DateAdapter<Date>\n ) {\n this.dateAdapter.setLocale('en-GB');\n }\n\n ngOnInit() {\n this.renderer.setAttribute(this.el.nativeElement, 'placeholder', 'dd-mm-yyyy');\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n\nexport interface ValidationResult {\n isValid: boolean;\n error?: string;\n}\n\ntype ValidatorFn<T = any> = (value: any, config: T) => ValidationResult;\n\nexport const CELL_VALIDATORS = new InjectionToken<Record<any, ValidatorFn>>('CELL_VALIDATORS');\n\nexport const cellValidators: Partial<Record<any, ValidatorFn>> = {\n textbox: (value: string, config: any): ValidationResult => {\n if (config.mandatory && !value) {\n return { isValid: false, error: `${config.label} is required` };\n }\n\n if (value?.length > 0) {\n const length = Number(config.data_length);\n // Add length validation logic\n }\n\n return { isValid: true };\n },\n \n email: (value: string, config: any): ValidationResult => {\n if (config.mandatory && !value) {\n return { isValid: false, error: `${config.label} is required` };\n }\n\n if (value && value.length > 0) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return { isValid: false, error: 'Invalid email format' };\n }\n }\n\n return { isValid: true };\n },\n \n location: (value: string, config: any): ValidationResult => {\n if (config.mandatory && !value) {\n return { isValid: false, error: `${config.label} is required` };\n }\n\n return { isValid: true };\n },\n \n number: (value: number, config: any): ValidationResult => {\n if (config.mandatory && (value === null || value === undefined || isNaN(value))) {\n return { isValid: false, error: `${config.label} is mandatory` };\n }\n // Add number validation logic\n return { isValid: true };\n },\n \n currency: (value: number, config: any): ValidationResult => {\n if (config.mandatory && (value === null || value === undefined || isNaN(value))) {\n return { isValid: false, error: `${config.label} is mandatory` };\n }\n // Add currency validation logic\n return { isValid: true };\n }\n}; ","export interface CountryCode {\n name: string;\n code: string;\n dial_code: string;\n flag: string;\n}\n\nexport const COUNTRY_CODES: CountryCode[] = [\n { \n name: 'United States', \n code: 'US', \n dial_code: '+1', \n flag: '🇺🇸' \n },\n { \n name: 'India', \n code: 'IN', \n dial_code: '+91', \n flag: '🇮🇳' \n },\n { \n name: 'United Kingdom', \n code: 'GB', \n dial_code: '+44', \n flag: '🇬🇧' \n },\n { \n name: 'Canada', \n code: 'CA', \n dial_code: '+1', \n flag: '🇨🇦' \n },\n { \n name: 'Australia', \n code: 'AU', \n dial_code: '+61', \n flag: '🇦🇺' \n }\n]; ","import { \n Component, \n forwardRef, \n Input, \n OnInit, \n signal, \n computed,\n inject\n} from '@angular/core';\nimport { \n ControlValueAccessor, \n NG_VALUE_ACCESSOR, \n ReactiveFormsModule, \n FormControl, \n Validators,\n FormsModule\n} from '@angular/forms';\nimport { COUNTRY_CODES, CountryCode } from './country-data';\nimport { NgFor, NgIf, NgClass } from '@angular/common';\nimport { \n CdkMenuModule, \n CdkMenuTrigger \n} from '@angular/cdk/menu';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'app-mobile-input',\n standalone: true,\n imports: [\n ReactiveFormsModule, \n FormsModule,\n NgFor, \n NgIf,\n NgClass,\n CdkMenuModule\n ],\n template: `\n <div class=\"mobile-input-container\">\n <button \n [cdkMenuTriggerFor]=\"countryCodeMenu\"\n cdkMenuTrigger\n class=\"country-code-trigger\"\n >\n {{selectedCountry().flag}} {{selectedCountry().dial_code}}\n </button>\n\n <input \n type=\"tel\"\n [formControl]=\"phoneNumberControl\"\n (input)=\"onPhoneNumberInput($event)\"\n placeholder=\"Enter phone number\"\n class=\"phone-number-input\"\n />\n\n <ng-template #countryCodeMenu>\n <div class=\"dropdown-menu\" cdkMenu>\n <div class=\"listbox-container\">\n <label class=\"listbox-label\">\n <input \n type=\"search\" \n placeholder=\"Search country...\" \n [(ngModel)]=\"searchText\"\n >\n </label>\n\n <div \n cdkMenu \n role=\"listbox\"\n class=\"listbox\"\n >\n @for (country of filteredCountries(); track country.code) {\n <div \n cdkMenuItem\n (click)=\"selectCountry(country.code)\"\n class=\"listbox-option\"\n role=\"option\"\n >\n <span>{{country.flag}} {{country.name}} ({{country.dial_code}})</span>\n </div>\n }\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n `,\n styles: [`\n .mobile-input-container {\n display: flex;\n align-items: center;\n border: 1px solid #ccc;\n border-radius: 4px;\n width: 100%;\n }\n .country-code-trigger {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n white-space: nowrap;\n }\n .phone-number-input {\n flex-grow: 1;\n border: none;\n padding: 8px;\n outline: none;\n }\n .dropdown-menu {\n background-color: #fff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px;\n }\n .listbox-container {\n width: 300px;\n }\n .listbox-label input {\n width: 100%;\n padding: 8px;\n border: 1px solid #ccc;\n border-radius: 4px;\n margin-bottom: 8px;\n }\n .listbox {\n list-style: none;\n padding: 0;\n margin: 0;\n max-height: 200px;\n overflow-y: auto;\n }\n .listbox-option {\n padding: 8px;\n cursor: pointer;\n }\n .listbox-option:hover {\n background-color: #f0f0f0;\n }\n `],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MobileInputComponent),\n multi: true\n }\n ]\n})\nexport class MobileInputComponent implements ControlValueAccessor, OnInit {\n @Input() defaultCountry: string = 'US';\n\n private sanitizer = inject(DomSanitizer);\n\n countryCodes = signal(COUNTRY_CODES);\n selectedCountry = signal(COUNTRY_CODES[0]);\n searchText = signal('');\n\n filteredCountries = computed(() => {\n const searchText = this.searchText().toLowerCase();\n return this.countryCodes().filter(country => \n country.name.toLowerCase().includes(searchText) ||\n country.dial_code.includes(searchText)\n );\n });\n\n phoneNumberControl = new FormControl('', [\n Validators.required,\n Validators.pattern(/^\\d+$/)\n ]);\n\n private onChange: any = () => {};\n private onTouched: any = () => {};\n\n ngOnInit() {\n const defaultCountry = this.countryCodes().find(\n country => country.code === this.defaultCountry\n );\n if (defaultCountry) {\n this.selectedCountry.set(defaultCountry);\n }\n\n this.phoneNumberControl.valueChanges.subscribe(value => {\n this.onChange(`${this.selectedCountry().dial_code}${value}`);\n });\n }\n\n selectCountry(countryCode: string) {\n const country = this.countryCodes().find(c => c.code === countryCode);\n if (country) {\n this.selectedCountry.set(country);\n this.searchText.set('');\n }\n }\n\n onPhoneNumberInput(event: Event) {\n const input = event.target as HTMLInputElement;\n input.value = input.value.replace(/\\D/g, '');\n }\n\n writeValue(value: string): void {\n if (value) {\n const matchedCountry = this.countryCodes().find(country => \n value.startsWith(country.dial_code)\n );\n\n if (matchedCountry) {\n this.selectedCountry.set(matchedCountry);\n const phoneNumber = value.replace(matchedCountry.dial_code, '');\n this.phoneNumberControl.setValue(phoneNumber);\n } else {\n this.phoneNumberControl.setValue(value);\n }\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n isDisabled \n ? this.phoneNumberControl.disable() \n : this.phoneNumberControl.enable();\n }\n} ","import { computed, Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OverlayMenuService {\n private _activeOverlayCellId = signal<string | null>(null);\n readonly activeOverlayCellId = computed(() => this._activeOverlayCellId());\n\n setActiveOverlayCell(cellId: string | null): void {\n this._activeOverlayCellId.set(cellId);\n }\n\n getActiveOverlayCellId(): string | null {\n return this.activeOverlayCellId();\n }\n\n isActiveOverlayCell(cellId: string): boolean {\n return this.activeOverlayCellId() === cellId;\n }\n\n closeAllOverlayMenus(): void {\n this._activeOverlayCellId.set(null);\n }\n\n showOverlayMenu(cellId: string): boolean {\n return this.activeOverlayCellId() === cellId;\n }\n\n toggleOverlayMenu(cellId: string): void {\n if (this.activeOverlayCellId() === cellId) {\n this._activeOverlayCellId.set(null);\n } else {\n this._activeOverlayCellId.set(cellId);\n }\n }\n\n closeOverlayMenu(): void {\n this._activeOverlayCellId.set(null);\n }\n} ","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n ElementRef,\n HostBinding,\n inject,\n input,\n model,\n Renderer2,\n signal,\n ViewChild,\n AfterViewInit,\n ViewEncapsulation,\n effect\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {CdkListbox, CdkOption} from '@angular/cdk/listbox';\nimport {CdkMenu, CdkMenuTrigger} from '@angular/cdk/menu';\nimport {FormsModule} from '@angular/forms';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatInput} from '@angular/material/input';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {MatIconModule} from '@angular/material/icon';\nimport {DatePipe, NgFor, NgIf} from '@angular/common';\nimport {CustomDatePickerDirective} from './custom-date-picker.directive';\nimport {MatDatepickerModule, MatDatepickerToggle} from '@angular/material/datepicker';\nimport {MatNativeDateModule} from '@angular/material/core';\nimport {CELL_VALIDATORS, cellValidators} from './data-cell.utils';\nimport {EruGridStore} from '../../stores/grid.store';\nimport {Field} from '../../model/grid.model';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { MobileInputComponent } from './mobile-input.component';\nimport { OverlayMenuService } from '../../services/overlay-menu.service';\nimport {OverlayModule} from '@angular/cdk/overlay';\n// Move the interface outside the class\nexport interface TagOption {\n value: string;\n label: string;\n}\n\n// Define an interface for tag configuration\nexport interface TagConfig {\n value?: string;\n label: string;\n}\n\n@Component({\n selector: 'data-cell',\n templateUrl: './data-cell.component.html',\n styleUrls: ['./data-cell.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n CommonModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatSliderModule,\n MatIconModule,\n CdkMenuTrigger,\n FormsModule,\n CdkListbox,\n CdkOption,\n CdkMenu,\n NgFor,\n OverlayModule,\n CustomDatePickerDirective,\n MatDatepickerModule,\n MatNativeDateModule,\n MatDatepickerToggle,\n MobileInputComponent\n ],\n providers: [MatDatepickerModule,\n MatNativeDateModule,\n DatePipe,\n {\n provide: CELL_VALIDATORS,\n useValue: cellValidators\n }\n ],\n host: {\n '(document:click)': 'onDocumentClick($event)',\n 'class': 'data-cell-component'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class DataCellComponent {\n isOpen = false;\n @ViewChild('attachmentTrigger') attachmentTrigger: any;\n @ViewChild('singleSelectTrigger') singleSelectTrigger: any;\n @ViewChild('multiSelectTrigger') multiSelectTrigger: any;\n @ViewChild('peopleTrigger') peopleTrigger: any;\n private elementRef = inject(ElementRef);\n sanitize: DomSanitizer = inject(DomSanitizer);\n private eruGridStore: EruGridStore = inject(EruGridStore);\n overlayMenuService: OverlayMenuService = inject(OverlayMenuService);\n private el = inject(ElementRef)\n private cdr = inject(ChangeDetectorRef);\n error = signal('')\n fieldSize = input.required<number>();\n columnDatatype = input.required<any>();\n columnName = input.required<string>();\n column = input.required<any>();\n value = input.required<string | number | null>();\n id = input.required<string | number>();\n frozenGrandTotalCell = input<boolean>(false);\n replaceZeroValue: string | undefined = undefined;\n td= model()\n currentValue = signal<string | number | null| any>(null);\n drillable = input<boolean>(false);\n mode = input<string>('');\n isEditable = input<boolean>(false);\n constructor(){\n effect(() => {\n const columnWidth = this.currentColumnWidth();\n this.formattedMultiSelectValue(columnWidth);\n });\n\n // Watch for changes in the value input and update currentValue accordingly\n effect(() => {\n const value = this.value();\n const datatype = this.columnDatatype();\n \n if (datatype === 'people' || datatype === 'dropdown_multi_select') {\n // For multi-select fields, ensure value is an array\n if (Array.isArray(value)) {\n this.currentValue.set(value);\n } else if (value) {\n // If it's a single value, convert to array\n this.currentValue.set([value]);\n } else {\n // If no value, set empty array\n this.currentValue.set([]);\n }\n } else {\n // For single-select fields, set as is\n this.currentValue.set(value);\n }\n });\n }\n\n\n // Computed property to get current column width that updates on resize\n currentColumnWidth = computed(() => {\n const columns = this.eruGridStore.columns();\n const currentColumn = columns?.find(col => col.name === this.columnName());\n return currentColumn?.field_size || this.fieldSize();\n });\n\n formattedMultiSelectValue(columnWidth: number) {\n const currentValues = this.currentValue();\n if (!Array.isArray(currentValues) || currentValues.length === 0) {\n return '';\n } \n const availableWidth = columnWidth - 16; // Account for padding\n const valueWidth = 100; // 1 value per 50px as requested\n const maxVisibleValues = Math.floor(availableWidth / valueWidth);\n if (maxVisibleValues <= 0) {\n return `${currentValues.length} selected`;\n }\n \n if (currentValues.length <= maxVisibleValues) {\n return currentValues.join(',');\n }\n \n const visibleValues = currentValues.slice(0, maxVisibleValues);\n const hiddenCount = currentValues.length - maxVisibleValues;\n return `${visibleValues.join(',')} +${hiddenCount} more`;\n };\n\n\n columnCellConfiguration = computed<any>(() =>{\n const columns = this.eruGridStore.columns();\n return columns?.find((columnConfig) => columnConfig.name === this.getColumnValue().replace('default_','')) || null;\n }\n);\nprivate renderer = inject(Renderer2)\n\n\n private datePipe = inject(DatePipe);\n\n private validateField(value: string | number | null): void {\n const config = this.columnCellConfiguration();\n if (!config) return;\n \n const datatype = config.datatype as keyof typeof cellValidators;\n const validator = cellValidators[datatype];\n\n if (validator) {\n const result = validator(value, config);\n this.error.set(result.error || '');\n\n if (result.isValid) {\n this.eruGridStore.setActiveCell(null);\n }\n }\n }\n\n onTextboxBlur(): void {\n this.validateField(this.currentValue());\n }\n\n onEmailBlur(): void {\n this.validateField(this.currentValue());\n }\n\n onLocationBlur(): void {\n this.validateField(this.currentValue());\n }\n\n onNumberBlur(): void {\n const value = this.currentValue();\n const numValue = Number(value);\n\n this.validateField(numValue);\n\n if (!this.error()) {\n const config = this.columnCellConfiguration();\n const decimalPlaces = config?.decimal || 0;\n this.currentValue.set(numValue.toFixed(decimalPlaces));\n }\n }\n getPriorityIcon = computed(() => {\n \n if (this.currentValue()) {\n const config = this.columnCellConfiguration();\n if (!config?.options) return '';\n const icon = config.options.find((c: any) => c.value == this.currentValue())?.icon ?? ''\n return this.sanitize.bypassSecurityTrustHtml(icon)\n } else {\n return ''\n }\n })\n setField(event:any){\n this.currentValue.set(event)\n }\n formatNumberSignal = computed(() => {\n const config = this.columnCellConfiguration();\n const value = this.currentValue();\n if (config?.datatype !== 'number' && config?.datatype !== 'currency') {\n return value?.toString() || '';\n }\n \n if(value == 0 && this.replaceZeroValue !== undefined){\n return this.replaceZeroValue\n }\n const numConfig = config as any;\n const separator = numConfig.separator;\n const decimalPlaces = numConfig.decimal;\n if (!value) return '';\n if (separator === 'none') return value.toString();\n\n let locale = 'en-US';\n if (separator === 'thousands') {\n locale = 'en-IN';\n }\n return `${numConfig?.datatype === 'currency' ? numConfig.symbol+' ' || '' : ''}${\n Number(value).toLocaleString(locale, {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces\n })\n }`;\n });\n\n private formatNumber(\n value: string,\n separator: 'thousands' | 'millions' | 'none',\n decimalPlaces: number,\n ): string {\n if (!value) return '';\n if (separator === 'none') return value;\n let locale = 'en-US';\n if (separator === 'thousands') {\n locale = 'en-IN';\n }\n return Number(value).toLocaleString(locale, {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces\n });\n\n }\n\n formatDate(date: Date | null): string {\n if (!date) return '';\n return date.toISOString().split('T')[0];\n }\n\n onDateChange(event: any) {\n const formattedDate = this.formatDate(event);\n this.currentValue.set(formattedDate);\n }\n\n ngAfterViewInit() {\n this.setColumnTextAlign();\n // currentValue is now automatically synchronized via effect in constructor\n }\n isActive = computed(() => this.eruGridStore.activeCell() === this.el.nativeElement);\n\n setActive(active: boolean): void {\n if (active && this.isEditable() && this.mode() === 'table') {\n this.eruGridStore.setActiveCell(this.el.nativeElement);\n this.focusAndPositionCursor();\n } else {\n this.eruGridStore.setActiveCell(null);\n }\n }\n\n/* onDoubleClick(): void {\n const editableCellTypes = ['textbox', 'location', 'email', 'number', 'currency'];\n \n if (editableCellTypes.includes(this.columnDatatype())) {\n // Setting a new active cell automatically deactivates the previous one\n this.eruGridStore.setActiveCell(this.el.nativeElement);\n // Let Angular's change detection handle the input rendering naturally\n this.focusAndPositionCursor();\n }\n } */\n\n onDrillableClick(event: Event): void {\n if (this.drillable()) {\n event.stopPropagation();\n console.log('drillable click', this.id(),this.currentValue())\n // Handle drillable click - you can emit an event or call a service here\n const idSplit = this.id().toString().split('__')\n const columnName = this.getColumnValue().replace('default_', '')\n const columnValues = this.columnName().includes('_') ? this.columnName().split(/_(.*)/)[0] : ''\n const tmpStr = idSplit[0].replace('pivot_', '')\n const rowId = tmpStr.includes('_') ? tmpStr.split(/_(.*)/)[0] : tmpStr\n this.eruGridStore.setPivotDrilldown({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: columnName,\n rowId: rowId,\n columnValue: this.currentValue()\n },columnValues) \n }\n }\n\n private focusAndPositionCursor(): void {\n // Use a more reliable approach to wait for DOM updates\n let attempts = 0;\n const maxAttempts = 20;\n \n const tryFocus = () => {\n const matInput = this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && matInput.offsetParent !== null) { // Check if element is visible\n matInput.focus();\n \n // Position cursor at the beginning - handle different input types\n try {\n // For email inputs, try different approaches\n if (matInput.type === 'email') {\n // Method 1: Try setSelectionRange first (works in most modern browsers)\n try {\n matInput.setSelectionRange(0, 0);\n } catch (emailError) {\n // Method 2: Use a workaround by temporarily changing the type\n const originalType = matInput.type;\n matInput.type = 'text';\n matInput.setSelectionRange(0, 0);\n matInput.type = originalType;\n }\n } else {\n // Standard approach for other input types\n matInput.setSelectionRange(0, 0);\n }\n } catch (error) {\n console.log(\"Could not set cursor position for input type:\", matInput.type, error);\n // Final fallback: try to use value manipulation\n try {\n const currentValue = matInput.value;\n matInput.value = '';\n matInput.value = currentValue;\n matInput.setSelectionRange(0, 0);\n } catch (fallbackError) {\n console.log(\"All cursor positioning methods failed:\", fallbackError);\n }\n }\n } else if (attempts < maxAttempts) {\n // If input not found or not visible, try again after a short delay\n attempts++;\n setTimeout(tryFocus, 25);\n } else {\n console.log(\"Could not find visible input element after\", maxAttempts, \"attempts\");\n }\n };\n \n // Start trying to focus after allowing Angular to update the DOM\n setTimeout(tryFocus, 50);\n }\n\n ngOnInit() {\n // Add document click listener to close attachment menu\n document.addEventListener('click', this.onDocumentClick.bind(this));\n this.replaceZeroValue = this.eruGridStore.configuration().config?.replaceZeroValue\n }\n\n ngOnDestroy() {\n // Remove document click listener\n document.removeEventListener('click', this.onDocumentClick.bind(this));\n }\n\n onDocumentClick(event: Event): void {\n // Close attachment menu if clicking outside the cell (only for attachment cells)\n if (this.overlayMenuService.isActiveOverlayCell(this.getCellId()) && \n !this.el.nativeElement.contains(event.target as Node)) {\n this.overlayMenuService.closeOverlayMenu();\n }\n \n // If this cell is active and the click is outside this cell, deactivate it\n if (this.isActive() && !this.el.nativeElement.contains(event.target as Node)) {\n this.validateAndDeactivate();\n }\n }\n\n private validateAndDeactivate(): void {\n // Validate the current value before deactivating\n const datatype = this.columnDatatype();\n \n switch (datatype) {\n case 'number':\n case 'currency':\n this.onNumberBlur();\n break;\n case 'textbox':\n this.onTextboxBlur();\n break;\n case 'email':\n this.onEmailBlur();\n break;\n case 'location':\n this.onLocationBlur();\n break;\n default:\n // For other cell types, just deactivate\n this.eruGridStore.setActiveCell(null);\n break;\n }\n }\n\n optionSearchText = signal('')\n filteredOptions = computed(() => {\n this.cdr.markForCheck();\n const config = this.columnCellConfiguration();\n\n if (!config || !config.options || ![\"dropdown_multi_select\", 'dropdown_single_select','priority'].includes(this.columnDatatype()) ) {\n return [];\n }\n\n const selectConfig = config as any;\n return selectConfig.options.filter((c:any) =>\n c.label.toLowerCase().includes(this.optionSearchText().toLowerCase())\n );\n });\n\n selectedSingleSelect(value: string) {\n this.currentValue.set(value[0]);\n }\n singleOptionClosed() {\n\n this.optionSearchText.set('');\n const config = this.columnCellConfiguration();\n const value = this.currentValue() ;\n\n\n if (config?.mandatory && !value) {\n this.error.set(`${config.label} is required`);\n this.renderer.setStyle(this.td(), 'border', '1px solid red')\n return;\n } else {\n this.error.set(``);\n this.eruGridStore.setActiveCell(null)\n }\n }\n openDatePicker(){\n\n }\n selectedMultiSelect(event: string[]) {\n console.log('selectedMultiSelect event:', event);\n \n // Handle edge cases\n if (!event || !Array.isArray(event)) {\n console.warn('Invalid event received:', event);\n return;\n }\n \n // Filter out any invalid values\n const validValues = event.filter(value => value && typeof value === 'string');\n \n // Only update if we have valid values or if the array is intentionally empty\n if (validValues.length > 0 || event.length === 0) {\n this.currentValue.set(validValues);\n } else {\n console.warn('No valid values in event, keeping current selection');\n }\n }\n appendMultiSelect(event: string) {\n console.log(event)\n const currentValues = this.currentValue();\n if (Array.isArray(currentValues)) {\n if (currentValues.includes(event)) {\n // Remove the value if it already exists\n this.currentValue.set(currentValues.filter(value => value !== event));\n } else {\n // Add the value if it doesn't exist\n this.currentValue.set([...currentValues, event]);\n }\n } else {\n this.currentValue.set([event]);\n }\n }\n\n isAllSelected(): boolean {\n const currentValues = this.currentValue();\n const allOptions = this.getAllOptions();\n if (Array.isArray(currentValues) && allOptions.length > 0) {\n return allOptions.every(option => currentValues.includes(option));\n }\n return false;\n }\n\n isIndeterminate(): boolean {\n const currentValues = this.currentValue();\n const allOptions = this.getAllOptions();\n if (Array.isArray(currentValues) && allOptions.length > 0) {\n const selectedCount = allOptions.filter(option => currentValues.includes(option)).length;\n return selectedCount > 0 && selectedCount < allOptions.length;\n }\n return false;\n }\n\n toggleSelectAll(checked: boolean): void {\n if (checked) {\n // Select all options\n const allOptions = this.getAllOptions();\n this.currentValue.set(allOptions);\n } else {\n // Deselect all options\n this.currentValue.set([]);\n }\n }\n\n private getAllOptions(): string[] {\n // Get all available options (hardcoded + filtered options)\n const hardcodedOptions = ['None', 'option 1', 'option 2', 'option 3', 'option 4', 'option 5', 'option 6', 'option 7', 'option 8', 'option 9', 'option 10'];\n const filteredOptions = this.filteredOptions().map((option: any) => option.value);\n return [...hardcodedOptions, ...filteredOptions];\n }\n\n private getPeopleOptions(): string[] {\n // Get people-specific options for the people dropdown\n const hardcodedPeople = [\n 'person0@domain.com',\n 'person1@domain.com', \n 'person2@domain.com',\n 'person3@domain.com',\n 'person4@domain.com',\n 'person5@domain.com'\n ];\n const filteredPeople = this.filteredOptions().map((option: any) => option.value);\n return [...hardcodedPeople, ...filteredPeople];\n }\n\n isOptionSelected(optionValue: string): boolean {\n const currentValues = this.currentValue();\n if (Array.isArray(currentValues)) {\n return currentValues.includes(optionValue);\n }\n return false;\n }\n \n setProgressValue(value: number) {\n this.currentValue.set(value);\n this.validateField(value);\n }\n\n hoverRating = 0;\n\n setRatingValue(value: number) {\n const config = this.columnCellConfiguration();\n const startValue = config.start_value || 1;\n const endValue = config.end_value || 5;\n\n this.currentValue.set(this.currentValue() === value ? 0 : value);\n this.validateField(this.currentValue());\n this.hoverRating = 0;\n }\n\n getStarColor(starNumber: number): string {\n return this.hoverRating > 0 \n ? (starNumber <= this.hoverRating ? '#FFD700' : '#e0e0e0')\n : (starNumber <= this.currentValue() ? '#FFD700' : '#e0e0e0');\n }\n\n getRatingStars(): number[] {\n const config = this.columnCellConfiguration();\n const startValue = config.start_value || 1;\n const endValue = config.end_value || 5;\n \n return Array.from(\n {length: endValue - startValue + 1}, \n (_, i) => startValue + i\n );\n }\n\n getEmojiForRating(star: number): string {\n const config = this.columnCellConfiguration();\n const emojiValue = config.emoji_value;\n const currentValue = this.currentValue() || 0;\n const isActive = this.isActive();\n\n const isFilled = isActive \n ? (this.hoverRating > 0 ? star <= this.hoverRating : star <= currentValue)\n : star <= currentValue;\n\n switch (emojiValue) {\n case 'star':\n return isFilled ? '★' : '☆'; \n case 'smile':\n return isFilled ? '☻' : '☺';\n case 'heart':\n return isFilled ? '♥' : '♡'; \n default:\n return isFilled ? '★' : '☆';\n }\n }\n\n getStatusOptions() {\n const config = this.columnCellConfiguration();\n if (config.datatype !== 'status') return [];\n\n // Combine open and close status\n const combinedStatus = [\n ...(config.open_status || []),\n ...(config.close_status || [])\n ];\n\n return combinedStatus.map(status => ({\n value: status.name,\n label: status.name,\n color: status.color || '',\n isDefault: status.df\n }));\n }\n\n getStatusColor(statusName: string): { background: string, border: string, text: string } {\n const options = this.getStatusOptions();\n const status = options.find(opt => opt.value === statusName);\n\n if (!status || !status.color) {\n return {\n background: 'white',\n border: 'black',\n text: 'black'\n };\n }\n\n // Advanced color manipulation function\n const manipulateColor = (color: string) => {\n // Convert hex to RGB\n const hex = color.replace('#', '');\n const bigint = parseInt(hex, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n\n // Create lighter background\n const lightenFactor = 0.9; // 90% lighter\n const bgR = Math.min(255, Math.round(r + (255 - r) * lightenFactor));\n const bgG = Math.min(255, Math.round(g + (255 - g) * lightenFactor));\n const bgB = Math.min(255, Math.round(b + (255 - b) * lightenFactor));\n\n // Darken text color\n const darkenFactor = 0.3; // 30% darker\n const textR = Math.round(r * (1 - darkenFactor));\n const textG = Math.round(g * (1 - darkenFactor));\n const textB = Math.round(b * (1 - darkenFactor));\n\n return {\n background: `rgb(${bgR}, ${bgG}, ${bgB})`,\n border: color,\n text: `rgb(${textR}, ${textG}, ${textB})`\n };\n };\n\n return manipulateColor(status.color);\n }\n\n getStatusButtonDisplay(statusName: string): { text: string, color: string } {\n const options = this.getStatusOptions();\n const status = options.find(opt => opt.value === statusName);\n\n if (!status) {\n return { text: statusName || 'None', color: '' };\n }\n\n return {\n text: status.label,\n color: status.color || ''\n };\n }\n\n\n getTagOptions = computed(() => {\n this.cdr.markForCheck();\n const config = this.columnCellConfiguration();\n\n if (!config || !config.options || ![\"tag\"].includes(this.columnDatatype())) {\n return [];\n }\n\n const selectConfig = config as any;\n return selectConfig.options.filter((c: any) =>\n c.label.toLowerCase().includes(this.optionSearchText().toLowerCase())\n );\n });\n\n getTagDisplay(tags: string[] | null | undefined): { displayTags: string[], moreCount: number } {\n const maxDisplayTags = 2;\n const safeTagArray = tags || [];\n const displayTags = safeTagArray.slice(0, maxDisplayTags);\n const moreCount = Math.max(0, safeTagArray.length - maxDisplayTags);\n\n return { displayTags, moreCount };\n }\n\n addNewTag(newTag: string) {\n if (!newTag) return;\n\n const config = this.columnCellConfiguration();\n const currentTags: string[] = this.currentValue() || [];\n \n // Trim and convert to lowercase for comparison\n const normalizedNewTag = newTag.trim().toLowerCase();\n const existingTags: string[] = currentTags.map((tag: string) => tag.toLowerCase());\n\n // Check if new tags are allowed or tag exists in options\n const isValidNewTag = \n config.allow_new_tags || \n this.getTagOptions().some((opt: TagOption) => \n opt.value.toLowerCase() === normalizedNewTag || \n opt.label.toLowerCase() === normalizedNewTag\n );\n\n // Add tag if it's valid and not already present\n if (isValidNewTag && !existingTags.includes(normalizedNewTag)) {\n const updatedTags = [...currentTags, newTag];\n this.currentValue.set(updatedTags);\n this.optionSearchText.set(''); // Clear search text\n }\n }\n\n isNewTagAllowed(): boolean {\n const searchText = this.optionSearchText();\n if (!searchText) return false;\n\n const normalizedSearchText = searchText.trim().toLowerCase();\n const existingTagValues: string[] = this.getTagOptions().map((opt: TagOption) => \n opt.value.toLowerCase()\n );\n const currentTags: string[] = this.currentValue() || [];\n const currentTagsLower: string[] = currentTags.map((tag: string) => tag.toLowerCase());\n\n return (\n this.columnCellConfiguration().allow_new_tags && \n !currentTagsLower.includes(normalizedSearchText) &&\n !existingTagValues.includes(normalizedSearchText)\n );\n }\n getTagColor(tag: string): { background: string, color: string } {\n try {\n const config = this.columnCellConfiguration();\n if (!config?.options) {\n return { background: '#cccccc', color: '#000000' };\n }\n const tagOption = config.options.find((r: any) => r.value === tag);\n const backgroundColor = tagOption?.color || '#cccccc';\n\n // Function to determine text color based on background brightness\n const getContrastYIQ = (hexcolor: string) => {\n // Remove # if present\n hexcolor = hexcolor.replace('#', '');\n\n // Convert hex to RGB\n const r = parseInt(hexcolor.substr(0, 2), 16);\n const g = parseInt(hexcolor.substr(2, 2), 16);\n const b = parseInt(hexcolor.substr(4, 2), 16);\n\n // Calculate luminance\n const yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\n // Return black for light backgrounds, white for dark backgrounds\n return (yiq >= 128) ? '#000000' : '#ffffff';\n };\n\n return {\n background: backgroundColor,\n color: getContrastYIQ(backgroundColor)\n };\n } catch (error) {\n console.warn('Error in getTagColor:', error);\n return { background: '#cccccc', color: '#000000' };\n }\n }\n showOverlayMenu(datatype: string) {\n return this.overlayMenuService.isActiveOverlayCell(this.getCellId()) && this.columnDatatype() === datatype\n }\n isDragging = signal(false);\n\n getCellId(): string {\n return `${String(this.id())}-${this.columnName()}`;\n }\n\n toggleOverlayMenu(event: Event): void {\n event.stopPropagation();\n this.isOpen = !this.isOpen; \n this.overlayMenuService.toggleOverlayMenu(this.getCellId());\n }\n\n closeOverlayMenu(): void {\n this.overlayMenuService.closeOverlayMenu();\n }\n\n\n onDragOver(e: any) {\n e.preventDefault();\n this.isDragging.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.isDragging.set(false);\n }\n\n trackByFile(index: number, file: string): string {\n return file;\n }\n\n viewFile(file: string): void {\n // TODO: Implement file viewing functionality\n console.log('View file:', file);\n }\n\n deleteFile(file: string): void {\n // TODO: Implement file deletion functionality\n console.log('Delete file:', file);\n const currentFiles = this.currentValue() || [];\n const updatedFiles = currentFiles.filter((f: any) => f !== file);\n this.currentValue.set(updatedFiles);\n }\n onFileDrop(e: any) {\n e.preventDefault();\n this.isDragging.set(false);\n for (let r of e.dataTransfer.items) {\n if (r.kind === 'file') {\n let file = r.getAsFile();\n this.processFile(file);\n }\n }\n }\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.currentValue.set(Array.from(input.files));\n this.currentValue().forEach((file:any) => this.processFile(file));\n }\n }\n async onPaste(event: ClipboardEvent) {\n event.preventDefault();\n if (!event.clipboardData?.files.length) {\n return;\n }\n Array.from(event.clipboardData.files).forEach(async (file) => {\n this.processFile(file);\n });\n }\n processFile(file: File) {\n const newFileName = file.name.replace(/_/g, '');\n const reader = new FileReader();\n reader.onload = () => {\n const base64String = reader.result as string;\n const base64Content = base64String.split(',')[1];\n this.upload(base64Content, newFileName);\n this.currentValue().push(newFileName);\n this.cdr.detectChanges()\n\n console.log( this.currentValue());\n \n };\n reader.readAsDataURL(file);\n }\n\n upload(base64String: string, fileName: string) {\n const existing = this.currentValue()\n this.currentValue.set(existing)\n this.cdr.detectChanges()\n\n let payload = {\n file: base64String,\n file_name: fileName,\n // org_process_id: this.fieldProperties().org_process_id,\n };\n // this.workerService.fetchData('POST', `${environment.base_eru_routes_url}/processo/func/upload_file`, payload).subscribe({\n // next: (response) => {\n // this.valueSelected.emit(this.currentValue())\n // const existing = this.currentValue()\n // existing.push(response.file_name);\n // this.currentValue() = existing;\n\n \n // }\n // })\n }\n\n fileInputChange(e: any) {\n debugger\n console.log(e,'file');\n Array.from(e.target.files).forEach((file: any) => {\n this.processFile(file);\n console.log(file,'file');\n \n });\n }\n view(file: any,FNAME:string) {\n let payload = {\n file_name: file,\n // org_process_id: this.fieldProperties().org_process_id\n };\n\n // this.workerService.fetchData('POST', `${environment.base_eru_routes_url}/processo/func/download_file`, payload).subscribe({\n // next: (res) => {\n \n // if (res) {\n // let file = res.file;\n // let type = res.file_type;\n // let fileName = FNAME;\n // this.openFile(file, type, fileName);\n // }\n // }\n // })\n }\n\n supportedFileTypes: string[] = ['application/pdf', 'image/jpeg', 'image/png'];\n isSupportedFileType(fileType: string): boolean {\n return this.supportedFileTypes.includes(fileType);\n }\n openFile(file: any, type: any, fileName: any) {\n const data = {\n file: file,\n type: type,\n fileName: fileName,\n };\n if (!this.isSupportedFileType(type)) {\n this.downloadFile(data, fileName);\n\n return;\n }\n\n // this.nzModalService.create({\n // nzWidth: '394px',\n // nzTitle: '',\n // nzContent: ViewFileComponent,\n // nzMaskClosable: true,\n // nzFooter: null,\n // nzClosable: true,\n // nzData: {\n // data: data,\n // },\n // nzClassName: 'viewFile',\n // });\n }\n\n\n async downloadFile(data: any, fileName: any): Promise<void> {\n try {\n const dataUrl = `data:${data.type};base64,${data.file}`;\n const response = await fetch(dataUrl);\n const blob = await response.blob();\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(link.href);\n } catch (error) {\n console.error('Error downloading file:', error);\n }\n }\n\n\n async saveFile(res: any, name: any): Promise<void> {\n await this.downloadFile(res, name);\n }\n\n delete(file: any) {\n let data = this.currentValue().filter((e:any) => e !== file);\n this.currentValue.set(data)\n this.cdr.detectChanges()\n // this.valueSelected.emit(this.files)\n}\nisAssigneeArray(value: any): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string');\n}\ngetInitials(name: string): string {\n if (!name || typeof name !== 'string') return '';\n \n const words = name.trim().split(/\\s+/);\n if (words.length === 0) return '';\n \n const firstInitial = words[0].charAt(0).toUpperCase();\n const secondInitial = words.length > 1 ? words[1].charAt(0).toUpperCase() : '';\n \n return firstInitial + secondInitial;\n}\n getColumnValue(){\n return this.columnName().includes('_') ? this.columnName().split(/_(.*)/)[1] : this.columnName()\n }\n\n /**\n * Set column-specific CSS custom properties for text alignment\n * @param columnName The name of the column\n * @param textAlign The text alignment value ('left', 'center', 'right')\n * @param isAggregation Whether this is an aggregation column\n */\n setColumnTextAlign(): void {\n const hostElement = this.elementRef?.nativeElement;\n if (hostElement) {\n // Find the second div (cell-display-text or cell-display-number)\n const cellDisplayDiv = hostElement.querySelector('.cell-display-text, .cell-display-number');\n \n if (cellDisplayDiv) {\n if (!!this.column().aggregationFunction) {\n cellDisplayDiv.style.setProperty('text-align', `var(--grid-aggregation-text-align-${this.getColumnName()}, var(--grid-aggregation-text-align, ${this.getDefaultTextAlign()}))`);\n } else {\n cellDisplayDiv.style.setProperty('text-align', `var(--grid-number-text-align-${this.getColumnName()}, var(--grid-number-text-align, ${this.getDefaultTextAlign()}))`);\n }\n }\n }\n }\n getDefaultTextAlign(): string {\n if (this.column().datatype === 'currency' || this.column().datatype === 'number' || !!this.column().aggregationFunction) {\n return 'right';\n } else {\n return 'left';\n }\n }\n getColumnName(): string {\n return this.getColumnValue().replace('default_', '');\n }\n}\n","<div class=\"container\">\n @switch (columnDatatype()) {\n @case ('textbox') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'input-' + columnName()+ id()\" [name]=\"'input-' + columnName()+ id()\"\n [(ngModel)]=\"currentValue\" (blur)=\"onTextboxBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n }\n @case ('currency') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'currency-' + columnName()+ id()\" [name]=\"'currency-' + columnName()+ id()\"\n [ngModel]=\"currentValue()\" (ngModelChange)=\"setField($event)\" placeholder=\"Number\" (blur)=\"onNumberBlur()\">\n <span matTextPrefix>$</span>\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text cell-display-number\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formatNumberSignal()}}</span>\n } @else {\n {{formatNumberSignal()}}\n }\n </div>\n }\n }\n @case ('number') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'number-' + columnName()+ id()\" [name]=\"'number-' + columnName()+ id()\"\n [ngModel]=\"currentValue()\" (ngModelChange)=\"setField($event)\" placeholder=\"Number\" (blur)=\"onNumberBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text cell-display-number\" (dblclick)=\"setActive(true)\"\n[class.cell-display-text-editable]=\"isEditable()\"\n >\n @if (drillable() && currentValue() !== 0) {\n <span class=\"drillable-value\" ><a class=\"drillable-link\" (click)=\"onDrillableClick($event)\">{{formatNumberSignal()}}</a></span>\n } @else {\n {{formatNumberSignal()}}\n }\n </div>\n }\n }\n @case ('location') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'location-' + columnName()+ id()\" [name]=\"'location-' + columnName()+ id()\"\n [(ngModel)]=\"currentValue\" placeholder=\"location\" (blur)=\"onLocationBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n }\n @case ('email') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"email\" [id]=\"'email-' + columnName()+ id()\" [name]=\"'email-' + columnName()+ id()\"\n [(ngModel)]=\"currentValue\" placeholder=\"email\" matTooltipPosition=\"below\" (blur)=\"onEmailBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n }\n @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}</span>\n } @else {\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n }\n </div>\n }\n\n @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" [cdkMenuTriggerFor]=\"singleSelectTrigger\" #singleSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n\n @case ('checkbox') {\n <div class=\"cell-form-field cell-checkbox\">\n <mat-checkbox [(ngModel)]=\"currentValue\">\n </mat-checkbox>\n </div>\n }\n\n @case ('people') {\n <div class=\"assignee-avatars \" (dblclick)=\"toggleOverlayMenu($event)\" #peopleTrigger>\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (assignee of currentValue(); track $index) {\n @if ($index < 3) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(assignee) }}\n </div>\n }\n }\n @if (currentValue().length > 3) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ currentValue().length - 3 }}\n </div>\n }\n </span>\n } @else {\n @for (assignee of currentValue(); track $index) {\n @if ($index < 3) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(assignee) }}\n </div>\n }\n }\n @if (currentValue().length > 3) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ currentValue().length - 3 }}\n </div>\n }\n }\n }\n </div>\n }\n\n\n @case ('date') {\n <div class=\"cell-date-container\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <input type=\"text\" [id]=\"'date-' + columnName()+ id()\" [name]=\"'date-' + columnName()+ id()\"\n [matDatepicker]=\"picker\" appCustomDatePicker class=\"inputRef date-picker\" [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onDateChange($event)\" (click)=\"picker.open()\" readonly>\n <mat-datepicker-toggle hidden matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </span>\n } @else {\n <input type=\"text\" [id]=\"'date-' + columnName()+ id()\" [name]=\"'date-' + columnName()+ id()\"\n [matDatepicker]=\"picker\" appCustomDatePicker class=\"inputRef date-picker\" [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onDateChange($event)\" (click)=\"picker.open()\" readonly>\n <mat-datepicker-toggle hidden matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n }\n </div>\n }\n\n\n @case ('priority') {\n <button mat-stroked-button [cdkMenuTriggerFor]=\"prioritySelectMenu\" class=\"dropdown-trigger\">\n <div class=\"cell-priority-content\">\n <div [innerHTML]=\"getPriorityIcon()\"></div>\n @if (drillable()) {\n <div class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</div>\n } @else {\n <div>{{currentValue()}}</div>\n }\n </div>\n </button>\n }\n @case ('progress') {\n @if(isActive()){\n <div class=\"progress-input-container\">\n <mat-slider class=\"progress-slider\" [min]=\"0\" [max]=\"100\" [step]=\"1\" [discrete]=\"true\">\n <input matSliderThumb [ngModel]=\"currentValue()\" (ngModelChange)=\"setProgressValue($event)\">\n </mat-slider>\n <span class=\"progress-value\">{{currentValue()}}%</span>\n </div>\n } @else {\n <div class=\"progress-bar-container\" [attr.data-progress]=\"currentValue()\">\n <div class=\"progress-bar\" [style.width.%]=\"currentValue()\"></div>\n @if (drillable()) {\n <span class=\"progress-text drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}%</span>\n } @else {\n <span class=\"progress-text\">{{currentValue()}}%</span>\n }\n </div>\n }\n }\n\n @case ('rating') {\n @if(isActive()){\n <div class=\"rating-input-container\">\n @for (star of getRatingStars(); track star) {\n <span class=\"rating-star\" [class.active]=\"currentValue() >= star\" (click)=\"setRatingValue(star)\"\n (mouseenter)=\"hoverRating = star\" (mouseleave)=\"hoverRating = 0\">\n {{getEmojiForRating(star)}}\n </span>\n }\n <span class=\"rating-value\">{{currentValue()}}/{{columnCellConfiguration()?.end_value || 5}}</span>\n </div>\n } @else {\n <div class=\"rating-display-container\">\n @for (star of getRatingStars(); track star) {\n <span class=\"rating-star\" [class.active]=\"currentValue() >= star\">\n {{getEmojiForRating(star)}}\n </span>\n }\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}/{{columnCellConfiguration()?.end_value || 5}}</span>\n }\n </div>\n }\n }\n\n @case ('status') {\n <button mat-stroked-button [cdkMenuTriggerFor]=\"statusSelectMenu\" class=\"status-dropdown-trigger\"\n [style.background-color]=\"getStatusColor(currentValue()).background\"\n [style.border-color]=\"getStatusColor(currentValue()).border\" [style.color]=\"getStatusColor(currentValue()).text\"\n [style.height.px]=\"30\">\n <div class=\"status-button-content\">\n @if(getStatusButtonDisplay(currentValue()).color) {\n\n }\n @if (drillable()) {\n <span class=\"status-text drillable-value\" (click)=\"onDrillableClick($event)\">\n {{getStatusButtonDisplay(currentValue()).text}}\n </span>\n } @else {\n <span class=\"status-text\">\n {{getStatusButtonDisplay(currentValue()).text}}\n </span>\n }\n </div>\n </button>\n }\n\n @case ('tag') {\n <div class=\"tag-container\" [cdkMenuTriggerFor]=\"tagSelectMenu\">\n\n <div class=\"tag-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of getTagDisplay(currentValue()).displayTags; track tag) {\n @if (columnCellConfiguration()) {\n <span class=\"tag\" [style.background]=\"getTagColor(tag).background\" [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n } @else {\n <span class=\"tag cell-fallback-tag\">\n {{tag}}\n </span>\n }\n }\n @if(getTagDisplay(currentValue()).moreCount > 0) {\n <span class=\"tag-more\">\n + {{getTagDisplay(currentValue()).moreCount}} more\n </span>\n }\n </span>\n } @else {\n @for (tag of getTagDisplay(currentValue()).displayTags; track tag) {\n @if (columnCellConfiguration()) {\n <span class=\"tag\" [style.background]=\"getTagColor(tag).background\" [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n } @else {\n <span class=\"tag cell-fallback-tag\">\n {{tag}}\n </span>\n }\n }\n @if(getTagDisplay(currentValue()).moreCount > 0) {\n <span class=\"tag-more\">\n + {{getTagDisplay(currentValue()).moreCount}} more\n </span>\n }\n }\n </div>\n\n </div>\n }\n\n @case ('phone') {\n <app-mobile-input [(ngModel)]=\"currentValue\"\n [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"></app-mobile-input>\n }\n\n @case ('attachment') {\n <div class=\"attachment-cell-wrapper\" (dblclick)=\"toggleOverlayMenu($event)\" cdkOverlayOrigin #attachmentTrigger=\"cdkOverlayOrigin\">\n @if(currentValue()?.length > 0){\n <div class=\"cell-attachment-container\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }@else {\n <div class=\"cell-attachment-container\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n \n \n </div>\n }\n @default {\n <div class=\"cell-default-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{value()}}</span>\n } @else {\n {{value()}}\n }\n </div>\n }\n }\n\n</div>\n\n<ng-template #prioritySelectMenu>\n <div class=\"dropdown-menu\" cdkMenu [style.min-width.px]=\"fieldSize()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [(ngModel)]=\"optionSearchText\">\n </mat-form-field>\n\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"''\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option notext-overflow cell-priority-content\">\n <div [innerHTML]=\"sanitize.bypassSecurityTrustHtml(option.icon)\"></div>\n <div>{{option.label}}</div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"singleSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_single_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_single_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" (click)=\"$event.stopPropagation()\" [(ngModel)]=\"optionSearchText\">\n </mat-form-field>\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"'None'\" class=\"listbox-option notext-overflow\">\n None\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"listbox-option notext-overflow\">\n option 1\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"listbox-option notext-overflow\">\n option 2\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"listbox-option notext-overflow\">\n option 3\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"listbox-option notext-overflow\">\n option 4\n </li><li [cdkOption]=\"'option 5'\" class=\"listbox-option notext-overflow\">\n option 5\n </li><li [cdkOption]=\"'option 6'\" class=\"listbox-option notext-overflow\">\n option 6\n </li><li [cdkOption]=\"'option 7'\" class=\"listbox-option notext-overflow\">\n option 7\n </li><li [cdkOption]=\"'option 1'\" class=\"listbox-option notext-overflow\">\n option 1\n </li><li [cdkOption]=\"'option 9'\" class=\"listbox-option notext-overflow\">\n option 9\n </li><li [cdkOption]=\"'option 10'\" class=\"listbox-option notext-overflow\">\n option 10\n </li><li [cdkOption]=\"'option 11'\" class=\"listbox-option notext-overflow\">\n option 11\n </li><li [cdkOption]=\"'option 12'\" class=\"listbox-option notext-overflow\">\n option 12\n </li><li [cdkOption]=\"'option 13'\" class=\"listbox-option notext-overflow\">\n option 13\n </li><li [cdkOption]=\"'option 14'\" class=\"listbox-option notext-overflow\">\n option 14\n </li><li [cdkOption]=\"'option 15'\" class=\"listbox-option notext-overflow\">\n option 15\n </li><li [cdkOption]=\"'option 16'\" class=\"listbox-option notext-overflow\">\n option 16\n </li><li [cdkOption]=\"'option 17'\" class=\"listbox-option notext-overflow\">\n option 17\n </li><li [cdkOption]=\"'option 18'\" class=\"listbox-option notext-overflow\">\n option 18\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option notext-overflow\">\n {{option.label}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"multiSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_multi_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_multi_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (click)=\"$event.stopPropagation()\">\n </mat-form-field>\n \n <!-- Select All Checkbox -->\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n \n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\" (click)=\"$event.stopPropagation()\">\n <li [cdkOption]=\"'None'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('None')\" (click)=\"$event.stopPropagation();appendMultiSelect('None')\"></mat-checkbox>\n <span class=\"option-text\">None</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 1')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 1')\"></mat-checkbox>\n <span class=\"option-text\">option 1</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 2')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 2')\"></mat-checkbox>\n <span class=\"option-text\">option 2</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 3')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 3')\"></mat-checkbox>\n <span class=\"option-text\">option 3</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 4')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 4')\"></mat-checkbox>\n <span class=\"option-text\">option 4</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 5'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 5')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 5')\"></mat-checkbox>\n <span class=\"option-text\">option 5</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 6'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 6')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 6')\"></mat-checkbox>\n <span class=\"option-text\">option 6</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 7'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 7')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 7')\"></mat-checkbox>\n <span class=\"option-text\">option 7</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 8'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 8')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 8')\"></mat-checkbox>\n <span class=\"option-text\">option 8</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 9'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 9')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 9')\"></mat-checkbox>\n <span class=\"option-text\">option 9</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 10'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 10')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 10')\"></mat-checkbox>\n <span class=\"option-text\">option 10</span>\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected(option.value)\" (click)=\"$event.stopPropagation();appendMultiSelect(option.value)\"></mat-checkbox>\n <span class=\"option-text\">{{option.label}}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"peopleTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('people')\"\n(detach)=\"isOpen = showOverlayMenu('people')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\" (click)=\"$event.stopPropagation()\"\n (ngModelChange)=\"optionSearchText.set($event)\">\n </mat-form-field>\n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\">\n <li [cdkOption]=\"'person0@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person0@domain.com') }}</div>\n <span class=\"option-text\">person0@domain.com</span>\n @if (isOptionSelected('person0@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person1@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person1@domain.com') }}</div>\n <span class=\"option-text\">person1@domain.com</span>\n @if (isOptionSelected('person1@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person2@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person2@domain.com') }}</div>\n <span class=\"option-text\">person2@domain.com</span>\n @if (isOptionSelected('person2@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person3@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person3@domain.com') }}</div>\n <span class=\"option-text\">person3@domain.com</span>\n @if (isOptionSelected('person3@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person4@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person4@domain.com') }}</div>\n <span class=\"option-text\">person4@domain.com</span>\n @if (isOptionSelected('person4@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person5@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person5@domain.com') }}</div>\n <span class=\"option-text\">person5@domain.com</span>\n @if (isOptionSelected('person5@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow listbox-option_people\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials(option.value) }}</div>\n <span class=\"option-text\">{{option.label}}</span>\n @if (isOptionSelected(option.value)) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template #statusSelectMenu>\n <div class=\"dropdown-menu status-dropdown-menu\" cdkMenu [style.min-width.px]=\"fieldSize()\"\n (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [(ngModel)]=\"optionSearchText\">\n </mat-form-field>\n\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox status-listbox\">\n <li [cdkOption]=\"''\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of getStatusOptions(); track option.value) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option status-option\"\n [style.background-color]=\"getStatusColor(option.value).background\"\n [style.border-color]=\"getStatusColor(option.value).border\" [style.color]=\"getStatusColor(option.value).text\">\n @if(option.color) {\n <span class=\"status-color-indicator\" [style.background-color]=\"option.color\"></span>\n }\n {{option.label}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tagSelectMenu>\n <div class=\"dropdown-menu tag-dropdown-menu\" [style.min-width.px]=\"fieldSize()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search or add tag...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (keyup.enter)=\"addNewTag(optionSearchText())\"\n [style.min-width.px]=\"fieldSize()\">\n </mat-form-field>\n\n <ul cdkListboxMultiple=\"true\" cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedMultiSelect($event)\"\n class=\"listbox tag-listbox\" [style.min-width.px]=\"fieldSize()\">\n <!-- Predefined tags -->\n @for (option of getTagOptions(); track option.value) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option tag-option\">\n {{option.label}}\n </li>\n }\n\n <!-- New tag input -->\n\n\n\n </ul>\n\n </div>\n </div>\n</ng-template>\n\n<!-- Attachment Menu - Positioned relative to the cell -->\n<ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"attachmentTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('attachment')\"\n(detach)=\"isOpen = showOverlayMenu('attachment')\">\n <div class=\"attachment-menu-overlay\" [style.width.px]=\"currentColumnWidth()\" [style.min-width.px]=\"300\">\n <div class=\"attachment-container\">\n <!-- Header Section -->\n <div class=\"attachment-header\">\n <span class=\"attachment-title\">Add or Drag files</span>\n <button mat-flat-button \n (click)=\"fileInput.click()\" \n class=\"attachment-upload-btn\">\n Upload\n </button>\n </div>\n \n <!-- Drop zone -->\n <div class=\"attachment-drop-zone\" \n (drop)=\"onFileDrop($event)\" \n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\"\n (paste)=\"onPaste($event)\"\n (click)=\"fileInput.click()\"\n [class.dragging]=\"isDragging()\">\n <div class=\"attachment-drop-content\">\n <div class=\"attachment-drop-icon\">+</div>\n <div class=\"attachment-drop-text\">\n <div class=\"primary-text\">Click to upload or drag files here</div>\n <div class=\"secondary-text\">Support multiple files</div>\n </div>\n </div>\n </div>\n \n <!-- Hidden file input -->\n <input #fileInput \n type=\"file\" \n multiple \n (change)=\"fileInputChange($event)\" \n style=\"display: none;\">\n \n <!-- File list -->\n <div class=\"attachment-file-list\" *ngIf=\"currentValue()?.length > 0\">\n <div class=\"attachment-file-item\" *ngFor=\"let file of currentValue(); trackBy: trackByFile\">\n <div class=\"file-info\">\n <span class=\"file-icon\">📄</span>\n <span class=\"file-name\">{{ file?.split('_')?.[2] || file }}</span>\n </div>\n <div class=\"file-actions\">\n <button class=\"action-btn\" (click)=\"viewFile(file)\" title=\"View\">👁️</button>\n <button class=\"action-btn\" (click)=\"deleteFile(file)\" title=\"Delete\">🗑️</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>","import { Directive, OnInit, Renderer2, Input, ElementRef, inject } from \"@angular/core\";\nimport { ColumnConstraintsService } from '../services/column-constraints.service';\nimport { Field, GridConfiguration } from '../model/grid.model';\nimport { EruGridStore } from '../stores/grid.store';\n\n@Directive({\n selector: \"[resizeColumn]\",\n standalone: true\n})\nexport class ResizeColumnDirective implements OnInit {\n @Input(\"resizeColumn\") resizable!: boolean;\n\n @Input() index: number = 0;\n @Input() columnConfig?: Field;\n @Input() gridConfig?: GridConfiguration;\n \n private columnConstraintsService = inject(ColumnConstraintsService);\n private eruGridStore = inject(EruGridStore);\n\n private startX!: number;\n private startWidth!: number;\n private columnElement: HTMLElement;\n private table!: HTMLElement;\n private pressed!: boolean;\n private resizer!: HTMLElement;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {\n this.columnElement = this.el.nativeElement;\n }\n\n ngOnInit() {\n if (this.resizable) {\n const row = this.renderer.parentNode(this.columnElement);\n const thead = this.renderer.parentNode(row);\n this.table = this.renderer.parentNode(thead);\n\n // Create resizer element\n this.resizer = this.renderer.createElement(\"div\");\n this.renderer.addClass(this.resizer, \"column-resizer\");\n this.renderer.setStyle(this.resizer, \"position\", \"absolute\");\n this.renderer.setStyle(this.resizer, \"right\", \"0\");\n this.renderer.setStyle(this.resizer, \"top\", \"0\");\n this.renderer.setStyle(this.resizer, \"bottom\", \"0\");\n this.renderer.setStyle(this.resizer, \"width\", \"10px\");\n this.renderer.setStyle(this.resizer, \"cursor\", \"col-resize\");\n this.renderer.setStyle(this.resizer, \"zIndex\", \"1\");\n this.renderer.setStyle(this.columnElement, \"position\", \"relative\");\n\n this.renderer.appendChild(this.columnElement, this.resizer);\n\n // Add event listeners\n this.renderer.listen(this.resizer, \"mousedown\", this.onMouseDown);\n this.renderer.listen(this.table.ownerDocument, \"mousemove\", this.onMouseMove);\n this.renderer.listen(this.table.ownerDocument, \"mouseup\", this.onMouseUp);\n }\n }\n\n onMouseDown = (event: MouseEvent) => {\n // Prevent text selection during resize\n event.preventDefault();\n \n this.pressed = true;\n this.startX = event.pageX;\n this.startWidth = this.columnElement.offsetWidth;\n\n // Add visual feedback\n this.renderer.addClass(this.table, \"resizing\");\n this.renderer.setStyle(this.resizer, \"backgroundColor\", \"rgba(0,0,0,0.1)\");\n };\n\n onMouseMove = (event: MouseEvent) => {\n if (!this.pressed) return;\n\n // Calculate new width with proper constraints\n const offset = event.pageX - this.startX;\n let newWidth = this.startWidth + offset;\n \n // Apply column constraints - service handles all fallback scenarios\n const gridConfig = this.gridConfig || this.eruGridStore.gridConfiguration();\n newWidth = this.columnConstraintsService.constrainWidth(newWidth, this.columnConfig, gridConfig);\n \n // Find the actual index of the column, accounting for checkbox column\n const columnIndex = Array.from(this.columnElement.parentElement!.children).indexOf(this.columnElement);\n\n // Find all cells in this column (header and data cells)\n const tableCells = Array.from(this.table.querySelectorAll(`th:nth-child(${columnIndex + 1}), td:nth-child(${columnIndex + 1})`));\n\n // Apply new width to column header and all corresponding cells\n tableCells.forEach(cell => {\n this.renderer.setStyle(cell, \"width\", `${newWidth}px`);\n this.renderer.setStyle(cell, \"minWidth\", `${newWidth}px`);\n this.renderer.setStyle(cell, \"maxWidth\", `${newWidth}px`);\n });\n\n // Update the column width in the store if we have column information\n if (this.columnConfig) {\n this.eruGridStore.updateColumnWidth(this.columnConfig.name, newWidth);\n }\n\n // Optional: Add smooth transition for resizing\n this.renderer.setStyle(this.table, \"transition\", \"all 0.1s ease\");\n };\n\n onMouseUp = (event: MouseEvent) => {\n if (this.pressed) {\n this.pressed = false;\n this.renderer.removeClass(this.table, \"resizing\");\n this.renderer.setStyle(this.resizer, \"backgroundColor\", \"transparent\");\n \n // Remove transition after resize\n this.renderer.setStyle(this.table, \"transition\", \"none\");\n }\n };\n}\n","import { Directive, ElementRef, HostListener, Input, Renderer2, OnInit } from '@angular/core';\nimport { EruGridStore } from '../stores/grid.store';\n\n@Directive({\n selector: '[columnDraggable]',\n standalone: true\n})\nexport class ColumnDragDirective implements OnInit {\n @Input('columnDraggable') columnIndex: number | null = null;\n \n private dragEl!: HTMLElement;\n private dragHandle!: HTMLElement;\n private isDragging = false;\n\n constructor(\n private el: ElementRef, \n private renderer: Renderer2,\n private eruGridStore: EruGridStore\n ) {}\n\n ngOnInit() {\n this.dragEl = this.el.nativeElement;\n \n // Find the drag handle element\n this.dragHandle = this.dragEl.querySelector('.column-drag-handle') as HTMLElement;\n \n if (this.dragHandle) {\n // Set draggable attribute on the entire column header\n this.renderer.setAttribute(this.dragEl, 'draggable', 'true');\n \n // Add mousedown listener to the handle\n this.dragHandle.addEventListener('mousedown', () => {\n this.isDragging = true;\n });\n \n // Add mouseup listener to document to reset dragging state\n document.addEventListener('mouseup', () => {\n this.isDragging = false;\n });\n }\n\n }\n\n @HostListener('dragstart', ['$event'])\n onDragStart(event: DragEvent) {\n // Only allow drag if it was initiated by the handle\n if (!this.isDragging) {\n event.preventDefault();\n return;\n }\n\n // Validate column index\n if (this.columnIndex === null || this.columnIndex === undefined) {\n console.error('Invalid column index for drag');\n event.preventDefault();\n return;\n }\n\n console.log('Drag start', this.columnIndex);\n \n // Ensure dataTransfer exists\n if (event.dataTransfer) {\n try {\n // Allow moving\n event.dataTransfer.effectAllowed = 'move';\n \n // Set drag data\n event.dataTransfer.setData('text/plain', this.columnIndex.toString());\n \n // Set drag image to the entire column header\n event.dataTransfer.setDragImage(this.dragEl, 0, 0);\n } catch (error) {\n console.error('Error in dragstart', error);\n event.preventDefault();\n return;\n }\n } else {\n console.error('DataTransfer is undefined');\n event.preventDefault();\n return;\n }\n\n // Add visual feedback\n this.renderer.addClass(this.dragEl, 'dragging');\n }\n\n @HostListener('dragover', ['$event'])\n onDragOver(event: DragEvent) {\n // Prevent default to allow drop\n event.preventDefault();\n \n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n }\n\n @HostListener('drop', ['$event'])\n onDrop(event: DragEvent) {\n // Validate column index\n if (this.columnIndex === null || this.columnIndex === undefined) {\n console.error('Invalid column index for drop');\n event.preventDefault();\n return;\n }\n\n console.log('Drop', this.columnIndex);\n \n event.preventDefault();\n \n // Get the dragged column index\n let fromIndex: number;\n try {\n fromIndex = parseInt(\n event.dataTransfer?.getData('text/plain') || '0', \n 10\n );\n } catch (error) {\n console.error('Error parsing drag data', error);\n return;\n }\n\n const toIndex = this.columnIndex;\n \n console.log('Reordering', { fromIndex, toIndex });\n \n // Reorder columns if different\n if (fromIndex !== toIndex) {\n this.eruGridStore.reorderColumns(fromIndex, toIndex);\n }\n }\n\n @HostListener('dragend', ['$event'])\n onDragEnd(event: DragEvent) {\n // Remove dragging class\n this.renderer.removeClass(this.dragEl, 'dragging');\n this.isDragging = false;\n }\n\n // Add visual hover effect only for the handle area\n @HostListener('mouseenter')\n onMouseEnter() {\n if (!this.isDragging) {\n this.renderer.setStyle(this.dragEl, 'background-color', 'rgba(0,0,0,0.05)');\n }\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n if (!this.isDragging) {\n this.renderer.setStyle(this.dragEl, 'background-color', 'transparent');\n }\n }\n} ","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy, OnInit, ViewChild, computed, signal, ViewEncapsulation, effect } from '@angular/core';\nimport { DataCellComponent } from './components/data-cell/data-cell.component';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ResizeColumnDirective } from './directives/resize.directive';\nimport { ColumnDragDirective } from './directives/column-drag.directive';\nimport { EruGridStore } from './stores/grid.store';\nimport { Field, RowGroup, Row, PivotRow } from './model/grid.model';\n\n\n@Component({\n selector: 'eru-grid',\n templateUrl: './eru-grid.component.html',\n styleUrls: ['./eru-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [\n DataCellComponent,\n ScrollingModule,\n CommonModule,\n MatTooltipModule,\n ResizeColumnDirective,\n ColumnDragDirective\n ],\n})\nexport class EruGridComponent implements OnInit, AfterViewInit, OnDestroy {\n public gridStore: EruGridStore = inject(EruGridStore);\n private elementRef = inject(ElementRef);\n private resizeObserver: ResizeObserver | null = null;\n isColumnReordering = signal(false);\nfirstTr : number | null = 0;\n @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\n @ViewChild('rowContainer') rowContainer?: ElementRef;\n @ViewChild('headerScroller', { read: ElementRef })\n headerScroller!: ElementRef<HTMLDivElement>;\n @ViewChild('gtScroller', { read: ElementRef })\n gtScroller!: ElementRef<HTMLDivElement>;\n initialMinHeight = 400;\n initialTotalWidth = 0;\n initialAdjustScrollWidth = false;\n @ViewChild('vp')\n vp!: CdkVirtualScrollViewport;\n\n private rowLoadQueue: { groupId: string, page: number, pageSize: number }[] = [];\n private isProcessingQueue = false;\n \n // Computed properties using the new GridStore\n groupedRows = computed(() => this.createGroupedRows());\n columns = computed(() => this.gridStore.columns());\n selectedRowIds = this.gridStore.selectedRowIds;\n \n // Track current scroll index for pivot mode\n currentPivotScrollIndex = signal(0);\n firstDataRowIndex = signal(0);\n \n // Enhanced rowspan tracking for virtual scrolling\n private _virtualRowspanCache: Map<string, {\n firstVisibleRowIndex: number;\n actualRowspan: number;\n virtualRowspan: number;\n parentValue: any;\n isContinuation: boolean;\n }> = new Map();\n \n mode = computed(() => this.gridStore.currentMode());\n isResizable = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.columnResizable ?? false;\n });\n isEditable = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.editable ?? false;\n });\n gridHeight = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.gridHeight ?? 400;\n });\n // Gridlines configuration computed properties\n showColumnLines = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.showColumnLines ?? false;\n });\n showRowLines = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.showRowLines ?? false;\n });\n maxDepth = computed(() => {\n const maxDepth = this.gridStore.pivotResult()?.headerStructure?.maxDepth ?? 0;\n /* if (this.grandTotalPosition() === 'before' && this.freezeGrandTotal()) {\n return maxDepth + 1 ;\n } */\n return maxDepth;\n });\n //maxDepth = signal(0);\n // Subtotal and Grand Total styling computed properties\n subTotalStyle = computed(() => {\n const config = this.gridStore.configuration();\n return config?.styles?.subTotalStyle ?? 'bold';\n });\n grandTotalStyle = computed(() => {\n const config = this.gridStore.configuration();\n return config?.styles?.grandTotalStyle ?? 'bold';\n });\n \n // Freeze configuration computed properties\n freezeHeader = computed(() => {\n const config = this.gridStore.configuration();\n if (this.grandTotalPosition() === 'before' && this.freezeGrandTotal()) {\n return true;\n }\n return config?.config?.freezeHeader ?? false;\n });\n \n freezeGrandTotal = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.freezeGrandTotal ?? false;\n });\n\n grandTotalPosition = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.grandTotalPosition ?? 'after';\n });\n \n /**\n * Check if a row is the first visible row in the pivot viewport\n * @param rowIndex The index of the row in the virtual scroll\n * @returns true if this is the first visible row\n */\n isFirstVisiblePivotRow(rowIndex: number): boolean {\n return rowIndex === this.firstDataRowIndex();\n }\n \n /**\n * Handle scroll events for pivot mode\n * @param scrollIndex The current scroll index\n */\n onPivotScroll(scrollIndex: number) {\n this.currentPivotScrollIndex.set(scrollIndex);\n \n if (scrollIndex < this.maxDepth()) {\n this.firstDataRowIndex.set(0);\n } else {\n this.firstDataRowIndex.set(scrollIndex - this.maxDepth() + 1);\n }\n // Clear virtual rowspan cache when scrolling to recalculate\n this._virtualRowspanCache.clear();\n \n this.viewport?.getRenderedRange();\n this.firstTr = this.viewport?.getRenderedRange()?.start || 0;\n \n }\n \n getTotalTableWidth(): number {\n const columns = this.getLeafColumns();\n let totalWidth = columns.reduce((total, column) => total + column.field_size, 0);\n /* if (this.adjustScrollWidth()) {\n totalWidth = totalWidth - 8;\n } */\n return totalWidth;\n }\n getContainerHeight(): number {\n const element = this.rowContainer?.nativeElement;\n if (element) {\n return element.clientHeight;\n }\n return window.innerHeight; // Fallback to viewport height\n }\n \n getMinHeightPx(): number {\n //const parentHeight = this.getContainerHeight();\n let headerHeight = 0;\n let grandTotalHeight = 0;\n let rowHeight = this.gridStore.pivotDisplayData().length * 50;\n // Adjust based on frozen elements\n if (this.freezeHeader()) {\n headerHeight = this.maxDepth() * 35;\n }\n if (this.freezeGrandTotal() && this.grandTotalPosition() === 'before') {\n headerHeight = headerHeight + 50;\n }\n if (this.freezeGrandTotal() && this.grandTotalPosition() === 'after') {\n grandTotalHeight = 60;\n }\n let minHeight = (this.gridHeight()-headerHeight) ; // Start with 50% of parent\n \n \n \n // Ensure minimum usable height\n minHeight = Math.min(minHeight, rowHeight);\n minHeight = minHeight + 10;\n // Don't exceed parent height\n return minHeight;\n }\n\n adjustScrollWidth(): boolean {\n let headerHeight = 0;\n if (this.freezeHeader()) {\n headerHeight = this.maxDepth() * 35;\n }\n if (this.freezeGrandTotal() && this.grandTotalPosition() === 'before') {\n headerHeight = headerHeight + 50;\n }\n return (this.gridHeight() - headerHeight) <= this.getMinHeightPx();\n }\n /**\n * Get the rendered range (what's in the DOM including buffer)\n * @returns Object with start, end, and count of rendered items\n */\n getRenderedRange(): { start: number; end: number; count: number } {\n if (!this.viewport) {\n return { start: 0, end: 0, count: 0 };\n }\n \n const range = this.viewport.getRenderedRange();\n const count = range.end - range.start;\n \n return { start: range.start, end: range.end, count };\n }\n\n private readonly ROWS_PER_PAGE = 50; \n private readonly SCROLL_THRESHOLD = 10; \n private lastLoadedGroupIds = new Set<string>();\n\n constructor(private changeDetectorRef: ChangeDetectorRef) {\n effect(() => {\n const pivotResult = this.gridStore.pivotResult();\n const pivotConfig = this.gridStore.pivotConfiguration();\n const pivotTransformService = this.gridStore.getPivotTransformService();\n \n if (pivotResult && pivotConfig && pivotTransformService) {\n this._rowspanInfo = pivotTransformService.calculateRowspanInfo(\n this.gridStore.pivotDisplayData(), \n pivotConfig.rows\n );\n } else {\n this._rowspanInfo = new Map();\n }\n });\n \n // Effect to adjust header scrollbar compensation when freeze header changes\n effect(() => {\n // Track freeze header changes\n this.freezeHeader();\n // Adjust scrollbar compensation after DOM updates\n setTimeout(() => this.adjustHeaderScrollbarCompensation(), 200);\n });\n }\n applyTokens() {\n const tokens = this.gridStore.configuration()?.tokens;\n if (tokens) {\n Object.keys(tokens).forEach(key => {\n const value = tokens[key];\n this.rowContainer?.nativeElement.style.setProperty(`--${key}`, value, 'important');\n });\n }\n }\n\n ngOnInit() {\n this.initializeColumnWidths();\n this.initializeGroups();\n this.firstDataRowIndex.set(this.maxDepth()+1);\n this.initialMinHeight = this.getMinHeightPx();\n this.initialAdjustScrollWidth = this.adjustScrollWidth();\n this.initialTotalWidth = this.getTotalTableWidth();\n }\n\n ngAfterViewInit() {\n this.applyTokens();\n this.adjustHeaderScrollbarCompensation();\n \n // For debugging: expose method to window\n if (typeof window !== 'undefined') {\n (window as any).recalculateScrollbar = () => this.recalculateScrollbarCompensation();\n }\n } \n\n ngOnDestroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n getInitialMinHeightPx(): number {\n return this.initialMinHeight;\n }\n getInitialTotalWidth(): number {\n return this.initialTotalWidth;\n }\n applyCdkWidth(): boolean {\n const element = this.rowContainer?.nativeElement;\n if (element) {\n return element.clientWidth > this.initialTotalWidth;\n }\n return false;\n }\n getInitialAdjustScrollWidth(): boolean {\n return this.initialAdjustScrollWidth;\n }\n private createGroupedRows(): GroupItem[] {\n const rows = this.gridStore.rows();\n const groups = this.gridStore.groups();\n const flattenedRows: GroupItem[] = [];\n\n groups.forEach(group => {\n // Add group header\n flattenedRows.push({ type: 'header', group });\n\n if (group.isExpanded) {\n const groupRows = rows.filter(row => row.groupId === group.id);\n flattenedRows.push({ type: 'table-header', group });\n\n groupRows.forEach(row => {\n flattenedRows.push({ type: 'row', group, row });\n });\n\n if (group.isLoading) {\n const ghostRowCount = 5;\n for (let i = 0; i < ghostRowCount; i++) {\n flattenedRows.push({\n type: 'ghost-loading',\n group\n });\n }\n }\n\n flattenedRows.push({ type: 'row-place-holder', group });\n }\n });\n\n return flattenedRows;\n }\n\n\n initializeGroups() {\n this.fetchInitialRows();\n }\n\n private fetchInitialRows() {\n this.gridStore.groups().forEach(group => {\n if (group.isExpanded) {\n this.fetchRowsForGroup(group.id, 0, group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE);\n }\n });\n }\n\n fetchRowsForGroup(groupId: string, page: number, pageSize: number = this.ROWS_PER_PAGE): Promise<void> {\n return new Promise((resolve, reject) => {\n const group = this.gridStore.groups().find(g => g.id === groupId);\n if (!group || !group.hasMoreRows) {\n resolve();\n return;\n }\n\n if (group.isLoading) {\n resolve();\n return;\n }\n\n this.gridStore.updateGroupLoadingState(groupId, true);\n\n const skip = page * pageSize;\n\n const loadTimeout = setTimeout(() => {\n this.gridStore.updateGroupLoadingState(groupId, false);\n reject(new Error('Task loading timed out'));\n }, 10000);\n\n this.gridStore.fetchNewRowData(pageSize, skip, group).subscribe({\n next: (response) => {\n clearTimeout(loadTimeout);\n\n if (!response || response.length === 0) {\n this.gridStore.updateGroupAfterLoading(groupId, 0, true);\n resolve();\n return;\n }\n\n const newRows: any[] = this.normalizeRowData(\n response.map((r: any) => ({ ...r, groupId })),\n group\n );\n\n this.gridStore.addRows(newRows);\n this.gridStore.updateGroupAfterLoading(groupId, newRows.length);\n this.changeDetectorRef.markForCheck();\n\n resolve();\n },\n error: (error) => {\n clearTimeout(loadTimeout);\n console.error(`Error loading tasks for group ${groupId}:`, error);\n \n this.gridStore.updateGroupLoadingState(groupId, false);\n this.markGroupAsNoMoreRows(groupId);\n \n reject(error);\n }\n });\n });\n }\n\n\n onScroll(scrollIndex: number) {\n const groups = this.gridStore.groups();\n const visibleGroups = this.getVisibleGroups();\n\n visibleGroups.forEach(group => {\n if (\n group.isExpanded && \n group.hasMoreRows && \n !group.isLoading\n ) {\n this.checkGroupRowLoading(group);\n }\n });\n\n this.checkAndLoadMoreRows();\n }\n\n\n private getVisibleGroups(): RowGroup[] {\n if (!this.viewport) return [];\n\n const renderedRange = this.viewport.getRenderedRange();\n const visibleGroups = new Set<string>();\n\n for (let i = renderedRange.start; i < renderedRange.end; i++) {\n const groupItem = this.getGroupItemAtIndex(i);\n if (groupItem?.group) {\n visibleGroups.add(groupItem.group.id);\n }\n }\n\n return Array.from(visibleGroups)\n .map(groupId => \n this.gridStore.groups().find(g => g.id === groupId)\n )\n .filter((group): group is RowGroup => group !== undefined);\n }\n\n\n private getGroupItemAtIndex(index: number): GroupItem | undefined {\n const groupItems = this.createGroupedRows();\n return groupItems[index];\n }\n\n\n private checkAndLoadMoreRows() {\n if (!this.viewport) return;\n\n const renderedRange = this.viewport.getRenderedRange();\n const dataLength = this.viewport.getDataLength();\n\n\n const isNearEnd = renderedRange.end >= (dataLength - this.SCROLL_THRESHOLD);\n\n if (isNearEnd) {\n this.intelligentRowLoading();\n }\n }\n\n\n private intelligentRowLoading() {\n const visibleGroups = this.getVisibleGroups();\n\n const groupsToLoad = visibleGroups.filter(group => \n group.isExpanded && \n group.hasMoreRows && \n !group.isLoading && \n !this.lastLoadedGroupIds.has(group.id) \n );\n\n const sortedGroupsToLoad = groupsToLoad.sort((a, b) => \n (a.currentLoadedRows || 0) - (b.currentLoadedRows || 0)\n );\n\n if (sortedGroupsToLoad.length > 0) {\n const groupToLoad = sortedGroupsToLoad[0];\n \n this.lastLoadedGroupIds.add(groupToLoad.id);\n this.queueRowLoading(groupToLoad);\n\n setTimeout(() => {\n this.lastLoadedGroupIds.delete(groupToLoad.id);\n }, 5000); \n }\n }\n\n\n private checkGroupRowLoading(group: RowGroup) {\n \n const shouldLoadRows = \n group.currentLoadedRows < group.totalRowCount &&\n !this.lastLoadedGroupIds.has(group.id);\n\n if (shouldLoadRows) {\n \n this.queueRowLoading(group);\n }\n }\n\n\n private queueRowLoading(group?: RowGroup) {\n if (!group) {\n const groups = this.gridStore.groups();\n group = groups.find(g => \n g.isExpanded && \n g.hasMoreRows && \n !g.isLoading\n );\n }\n\n if (group) {\n this.rowLoadQueue.push({\n groupId: group.id,\n page: group.currentPage || 0,\n pageSize: group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE\n });\n\n this.processRowLoadQueue();\n }\n }\n\n trackByColumnFn(index: number, column: Field): string {\n return column.name;\n }\n\n\n trackByGroupItemFn(index: number, groupItem: GroupItem): string {\n switch (groupItem.type) {\n case 'header':\n return `header-${groupItem.group?.id}`;\n case 'row':\n return `row-${groupItem.row?.entity_id}`;\n case 'ghost-loading':\n return `ghost-${groupItem.group?.id}-${index}`;\n case 'row-place-holder':\n return `separator-${groupItem.group?.id}`;\n default:\n return `${groupItem.type}-${index}`;\n }\n }\n\n trackByPivotRowFn(index: number, pivotRow: PivotRow): string {\n return pivotRow._rowKey || `pivot-row-${index}`;\n }\n\n trackByHeaderFn(index: number, header: any): string {\n return `${header.level}-${header.label}-${index}`;\n }\n\n // Nested header support methods\n hasNestedHeaders(): boolean {\n const pivotResult = this.gridStore.pivotResult();\n return !!(pivotResult?.headerStructure && pivotResult.headerStructure.maxDepth > 1);\n }\n\n getHeaderRows(): any[][] {\n const pivotResult = this.gridStore.pivotResult();\n return pivotResult?.headerStructure?.headerRows || [];\n }\n\n getLeafColumns(): Field[] {\n const pivotResult = this.gridStore.pivotResult();\n if (pivotResult?.headerStructure?.leafColumns) {\n return pivotResult.headerStructure.leafColumns;\n }\n // Fallback to regular columns\n return this.gridStore.displayColumns();\n }\n\n isRowDimensionHeader(header: any): boolean {\n // Row dimension headers typically have rowspan > 1 and are in the first few columns\n return header.rowspan > 1;\n }\n\n getPivotGridColumns(): string {\n const columns = this.getLeafColumns();\n return columns.map(col => `${col.field_size}px`).join(' ');\n }\n\n\n private initializeColumnWidths() {\n\n const columns = this.gridStore.columns();\n\n // Ensure each column has a predefined width\n const normalizedColumns = columns.map(column => ({\n ...column,\n field_size: column.field_size || 150, \n minWidth: column.field_size || 150\n }));\n this.gridStore.setConfiguration({\n ...this.gridStore.configuration(),\n fields: normalizedColumns\n });\n this.gridStore.setColumns(normalizedColumns);\n }\n\n // Enhanced method to normalize row data\n private normalizeRowData(rows: any[], group?: RowGroup): any[] {\n return rows.map(row => ({\n ...row,\n\n groupTitle: group?.title,\n\n displayValue: this.getDisplayValue(row),\n height: 50 \n }));\n }\n\n\n private getDisplayValue(row: any, column?: string): string {\n if (!column) {\n return this.getGenericRowDisplay(row);\n }\n\n const value = row[column];\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number') return value.toString();\n \n return JSON.stringify(value);\n }\n\n\n private getGenericRowDisplay(row: any): string {\n const displayProps = ['title', 'id', 'status'];\n return displayProps\n .map(prop => row[prop])\n .filter(value => value != null)\n .join(' - ')\n .trim();\n }\n\n toggleRowSelection(event: Event, row: any) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n const rowId = row.id;\n\n if (checkbox.checked) {\n this.gridStore.selectRow(rowId);\n } else {\n this.gridStore.deselectRow(rowId);\n }\n }\n\n\n toggleGroupSelection(event: Event, groupId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n\n if (checkbox.checked) {\n this.gridStore.selectAllRowsInGroup(groupId);\n } else {\n this.gridStore.deselectAllRowsInGroup(groupId);\n }\n }\n\n\n toggleAllGroups(event: Event) {\n const checkbox = event.target as HTMLInputElement;\n\n if (checkbox.checked) {\n this.gridStore.rows().forEach(row => this.gridStore.selectRow(row.entity_id));\n } else {\n this.gridStore.clearSelection();\n }\n }\n\n\n isRowSelected(rowId?: string): boolean {\n return rowId ? this.gridStore.isRowSelected(rowId) : false;\n }\n\n\n isGroupSelected(groupId: string): boolean {\n return this.gridStore.isGroupSelected(groupId);\n }\n\n\n isAllGroupsSelected(): boolean {\n const allRows = this.gridStore.rows();\n return allRows.length > 0 &&\n allRows.every(row =>\n this.gridStore.isRowSelected(row.entity_id)\n );\n }\n\n\n getSelectedRows(): any[] {\n return Array.from(this.gridStore.selectedRowIds());\n }\n\n\n private markGroupAsNoMoreRows(groupId: string) {\n // This functionality is now handled by GridStore.updateGroupAfterLoading\n this.gridStore.updateGroupAfterLoading(groupId, 0, true);\n }\n\n toggleGroupExpansion(groupId: string) {\n const group = this.gridStore.groups().find(g => g.id === groupId);\n if (!group) return;\n\n const newExpandedState = !group.isExpanded;\n this.gridStore.toggleGroupExpansion(groupId);\n\n if (newExpandedState && (!group.rows || group.rows.length === 0)) {\n this.fetchRowsForGroup(groupId, 0, group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE)\n .catch(error => {\n console.error(`Error loading rows for expanded group ${groupId}:`, error);\n });\n }\n }\n\n\n private processRowLoadQueue() {\n \n if (this.isProcessingQueue) return;\n\n \n if (this.rowLoadQueue.length === 0) {\n this.isProcessingQueue = false;\n return;\n }\n\n\n this.isProcessingQueue = true;\n\n \n const nextLoad = this.rowLoadQueue.shift();\n\n if (nextLoad) {\n \n this.fetchRowsForGroup(nextLoad.groupId, nextLoad.page, nextLoad.pageSize)\n .then(() => {\n \n this.isProcessingQueue = false;\n this.processRowLoadQueue();\n })\n .catch(error => {\n console.error('Error loading rows:', error);\n this.isProcessingQueue = false;\n this.processRowLoadQueue();\n });\n }\n }\n\n // Collapsible column methods\n \n /**\n * Toggle collapse/expand state of a column group\n */\n toggleColumnGroup(groupKey: string) {\n const pivotTransformService = this.gridStore.getPivotTransformService();\n const configuration = this.gridStore.pivotConfiguration();\n \n if (pivotTransformService && configuration) {\n pivotTransformService.toggleColumnGroup(groupKey, configuration);\n // Regenerate pivot data with new collapse state\n this.gridStore.regeneratePivotData();\n }\n }\n\n /**\n * Check if a column group is expanded\n */\n isColumnGroupExpanded(groupKey: string): boolean {\n const pivotTransformService = this.gridStore.getPivotTransformService();\n return pivotTransformService?.isColumnGroupExpanded(groupKey) ?? true;\n }\n\n // Rowspan functionality\n \n /**\n * Get rowspan information for pivot table cells\n */\n private _rowspanInfo: Map<string, { rowspan: number; skip: boolean; parentSpan: number }> | null = null;\n \n /**\n * Debug counter for sticky column debugging\n */\n private _stickyDebugCount: number = 0;\n \n getRowspanInfo(): Map<string, { rowspan: number; skip: boolean; parentSpan: number }> {\n return this._rowspanInfo ?? new Map();\n }\n \n /**\n * Get the effective rowspan for a cell in virtual scrolling context\n * This method ensures proper rowspan continuity when scrolling\n */\n getEffectiveRowspan(visibleRowIndex: number, columnName: string): number | null {\n const rowspanInfo = this.getRowspanInfo();\n return rowspanInfo.get(`${visibleRowIndex}_${columnName}`)?.parentSpan || 1;\n }\n \n /**\n * Check if a cell should be skipped (hidden due to rowspan) - ENHANCED FOR VIRTUAL SCROLLING\n */\n shouldSkipCell(rowIndex: number, columnName: string): boolean {\n const currentRowspan = this.getRowspanInfo().get(`${rowIndex}_${columnName}`)?.rowspan || 1;\n const previousRowspan = this.getRowspanInfo().get(`${rowIndex-1}_${columnName}`)?.rowspan || 1;\n \n if (this.firstDataRowIndex() > rowIndex) {\n return true;\n }\n if (this.isFirstVisiblePivotRow(rowIndex) && !(currentRowspan > previousRowspan)) {\n return false;\n } else if (this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {\n if (this.getRowspanInfo().get(`${rowIndex}_${columnName}`)?.rowspan || 1 > 0) {\n if (currentRowspan > previousRowspan && rowIndex >= this.firstDataRowIndex()) {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 2a');} */\n return false;\n } else {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 2b');} */\n return true;\n }\n }\n } else if (!this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 3');} */\n return false;\n } else {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 4');} */\n return true;\n }\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 5');} */\n return true \n }\n \n /**\n * Get the effective cell value, considering virtual parents for virtual scrolling\n */\n getEffectiveCellValue( index: number, columnName: string, pivotRow: any): any {\n const directValue = pivotRow[columnName];\n return directValue;\n }\n\n /**\n * Get rowspan value for a specific cell - VIRTUAL SCROLLING COMPATIBLE\n * This is a compatibility wrapper around getEffectiveRowspan\n */\n getCellRowspan(rowIndex: number, columnName: string): number {\n const effectiveRowspan = this.getEffectiveRowspan(rowIndex, columnName);\n return effectiveRowspan || 1;\n }\n\n /**\n * Get columns that should be frozen on the left (all row dimensions up to and including freezeField)\n */\n getRowDimensionColumns(): any[] {\n if (!this.gridStore.isFreezeEnabled()) return [];\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return [];\n \n const allColumns = this.getLeafColumns();\n const pivotConfig = this.gridStore.pivotConfiguration();\n \n if (!pivotConfig?.rows) return [];\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return [];\n \n // Return all row dimension columns up to and including the freeze field\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n return allColumns.filter(col => rowDimensionsToFreeze.includes(col.name));\n }\n\n /**\n * Get columns that should be scrollable on the right (all except frozen fields)\n */\n getColumnDimensionColumns(): any[] {\n const allColumns = this.getLeafColumns();\n \n if (!this.gridStore.isFreezeEnabled()) return allColumns;\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return allColumns;\n \n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return allColumns;\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return allColumns;\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n // Return all columns except the frozen row dimensions\n return allColumns.filter(col => !rowDimensionsToFreeze.includes(col.name));\n }\n\n /**\n * Get headers that should be frozen (all row dimension headers up to and including freezeField)\n */\n getRowDimensionHeaders(headerRow: any[]): any[] {\n if (!this.gridStore.isFreezeEnabled()) return [];\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return [];\n \n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return [];\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return [];\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n return headerRow.filter(header => \n rowDimensionsToFreeze.includes(header.name) ||\n (header.name && rowDimensionsToFreeze.includes(header.name))\n );\n }\n\n /**\n * Get headers that should be scrollable (all except frozen fields)\n */\n getColumnDimensionHeaders(headerRow: any[]): any[] {\n if (!this.gridStore.isFreezeEnabled()) return headerRow;\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return headerRow;\n \n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return headerRow;\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return headerRow;\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n return headerRow.filter(header => \n !rowDimensionsToFreeze.includes(header.name)\n );\n }\n\n /**\n * Check if a column should be sticky (frozen on the left)\n */\n isStickyColumn(columnName: string, colIndex: number): boolean {\n const freezeEnabled = this.gridStore.isFreezeEnabled();\n const freezeField = this.gridStore.getFreezeField();\n const pivotConfig = this.gridStore.pivotConfiguration();\n \n // Debug logging for sticky column detection - log ALL calls for first few\n if (!this._stickyDebugCount) this._stickyDebugCount = 0;\n if (this._stickyDebugCount < 20) {\n this._stickyDebugCount++;\n }\n \n if (!freezeEnabled) {\n return false;\n }\n if (!freezeField) {\n return false;\n }\n if (!pivotConfig?.rows) {\n if (columnName === 'location' || columnName === 'Location') {\n console.log('❌ STICKY DEBUG: No pivot config rows');\n }\n return false;\n }\n if (!columnName) {\n return false;\n }\n \n // Find the index of the freeze field in the row dimensions (case-insensitive)\n const freezeFieldIndex = pivotConfig.rows.findIndex(row => \n row && typeof row === 'string' && row.toLowerCase() === freezeField.toLowerCase()\n );\n \n if (columnName === 'location' || columnName === 'Location') {\n console.log('🔧 STICKY DEBUG freezeFieldIndex:', {\n freezeFieldIndex,\n pivotRows: pivotConfig.rows,\n freezeField: freezeField\n });\n }\n \n if (freezeFieldIndex === -1) {\n if (columnName === 'location' || columnName === 'Location') {\n console.log('❌ STICKY DEBUG: Freeze field not found in pivot rows');\n }\n return false;\n }\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n // Case-insensitive comparison for column name\n const isSticky = rowDimensionsToFreeze.some(row => \n row && typeof row === 'string' && row.toLowerCase() === columnName.toLowerCase()\n );\n \n if (columnName === 'location' || columnName === 'Location') {\n console.log('🔧 STICKY DEBUG final result:', {\n rowDimensionsToFreeze,\n isSticky,\n columnNameLower: columnName.toLowerCase()\n });\n }\n \n return isSticky;\n }\n\n /**\n * Get the left position for sticky columns (CSS left value)\n */\n getStickyColumnLeft(columnName: string, colIndex: number): number {\n if (!this.isStickyColumn(columnName, colIndex)) return 0;\n \n const allColumns = this.getLeafColumns();\n const pivotConfig = this.gridStore.pivotConfiguration();\n \n if (!pivotConfig?.rows) return 0;\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return 0;\n \n const freezeFieldIndex = pivotConfig.rows.findIndex(row => \n row && typeof row === 'string' && row.toLowerCase() === freezeField.toLowerCase()\n );\n if (freezeFieldIndex === -1) return 0;\n \n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n // Calculate cumulative width for columns to the left\n let leftPosition = 0;\n for (const column of allColumns) {\n if (column.name && column.name.toLowerCase() === columnName.toLowerCase()) break;\n if (column.name && rowDimensionsToFreeze.some(row => \n row && typeof row === 'string' && row.toLowerCase() === column.name.toLowerCase()\n )) {\n leftPosition += column.field_size || 150;\n }\n }\n \n return leftPosition;\n }\n\n /**\n * Check if a column is a row dimension column\n */\n isRowDimensionColumn(columnName: string): boolean {\n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return false;\n \n return pivotConfig.rows.some(row => row.toLowerCase() === columnName.toLowerCase());\n }\n\n /**\n * Handle body scroll to synchronize header and grand total horizontal scroll\n */\n onBodyScroll(event: Event) {\n const target = event.target as HTMLElement;\n if (!target) return;\n \n const scrollLeft = target.scrollLeft;\n \n // Sync header if freezeHeader is enabled\n if (this.freezeHeader() && this.headerScroller?.nativeElement) {\n const headerScrollLeft = this.headerScroller.nativeElement.scrollLeft;\n // Only sync if there's a difference to avoid infinite loops\n if (Math.abs(scrollLeft - headerScrollLeft) > 1) {\n this.headerScroller.nativeElement.scrollLeft = scrollLeft;\n }\n }\n \n // Sync grand total footer if freezeGrandTotal is enabled\n if (this.freezeGrandTotal() && this.gtScroller?.nativeElement) {\n const gtScrollLeft = this.gtScroller.nativeElement.scrollLeft;\n // Only sync if there's a difference to avoid infinite loops\n if (Math.abs(scrollLeft - gtScrollLeft) > 1) {\n this.gtScroller.nativeElement.scrollLeft = scrollLeft;\n\n }\n }\n }\n\n /**\n * Handle header scroll to synchronize body horizontal scroll\n */\n onHeaderScroll(event: Event) {\n if (!this.freezeHeader() || !this.viewport) return;\n \n const target = event.target as HTMLElement;\n if (target && this.viewport?.elementRef?.nativeElement) {\n // Synchronize horizontal scroll only\n this.viewport.elementRef.nativeElement.scrollLeft = target.scrollLeft;\n }\n }\n\n\n\n /**\n * Manually trigger scrollbar compensation recalculation (for testing)\n */\n recalculateScrollbarCompensation() {\n console.log('Manual recalculation triggered');\n this.adjustHeaderScrollbarCompensation();\n }\n\n /**\n * Adjust header padding to compensate for body table scrollbar width\n * This ensures perfect column alignment between header and body tables\n */\n private adjustHeaderScrollbarCompensation() {\n if (!this.freezeHeader() || !this.rowContainer) return;\n \n setTimeout(() => {\n const container = this.rowContainer?.nativeElement;\n if (!container) return;\n \n const headerShell = container.querySelector('.header-shell') as HTMLElement;\n const gtShell = container.querySelector('.gt-shell') as HTMLElement;\n const viewport = container.querySelector('.pivot-viewport') as HTMLElement;\n \n if (headerShell && viewport) {\n // Calculate scrollbar width by comparing viewport dimensions\n let scrollbarWidth = viewport.offsetWidth - viewport.clientWidth;\n \n // Alternative method if the first one doesn't work or returns 0\n if (scrollbarWidth === 0) {\n // Create a temporary element to measure scrollbar width\n const scrollDiv = document.createElement('div');\n scrollDiv.style.cssText = `\n width: 100px;\n height: 100px;\n overflow: scroll;\n position: absolute;\n top: -9999px;\n `;\n document.body.appendChild(scrollDiv);\n scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n }\n \n // Apply the calculated scrollbar width as padding-right\n headerShell.style.setProperty('--scrollbar-width', `${scrollbarWidth}px`);\n if (gtShell) {\n gtShell.style.setProperty('--scrollbar-width', `${scrollbarWidth}px`);\n }\n // Debug: Log detailed measurements\n const headerTable = headerShell.querySelector('.eru-grid-table') as HTMLElement;\n const bodyTable = viewport.querySelector('.eru-grid-table') as HTMLElement;\n \n \n }\n }, 100);\n } \n\n}\n\n// Interfaces moved to list.model.ts\ninterface GroupItem {\n type: 'header' | 'row' | 'table-header' | 'row-place-holder' | 'ghost-loading';\n group?: RowGroup;\n row?: Row;\n}\n","<!-- <div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\n currentPivotScrollIndex {{currentPivotScrollIndex()}} | \n firstDataRowIndex {{firstDataRowIndex()}} | \n firstTr {{firstTr}} |\n maxDepth {{maxDepth()}}\n</div> -->\n<div class=\"incremental-row-container eru-grid\" #rowContainer \n [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode()\">\n \n <!-- Pivot Mode Template -->\n @if (gridStore.isPivotMode()) {\n <ng-container >\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%;\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <!-- Debug info for first visible row -->\n \n \n <div class=\"pivot-single-table\" style=\"height: 100%; width: 100%; overflow: hidden; display: flex; flex-direction: column;\">\n @if (freezeHeader()) {\n <div #headerScroller class=\"header-shell\">\n <table class=\"eru-grid-table pivot-table\" \n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n \n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n @if(grandTotalPosition() === 'before' && freezeGrandTotal()) {\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n }\n </table> \n </div>\n } \n <!-- Virtual Scrolled Table Body -->\n <div>\n <cdk-virtual-scroll-viewport\n #vp\n [itemSize]=\"50\"\n class=\"viewport pivot-viewport\"\n [class.apply-cdk-width]=\"applyCdkWidth()\"\n (scrolledIndexChange)=\"onPivotScroll($event)\"\n (scroll)=\"onBodyScroll($event)\"\n style=\"overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\" \n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\"\n >\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n \n @if (!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container> \n }\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\n \n <tr *cdkVirtualFor=\"let pivotRow of gridStore.pivotDisplayData(); \n trackBy: trackByPivotRowFn; \n let i = index\"\n class=\"pivot-row\"\n [class.subtotal-row]=\"pivotRow._isSubtotal\"\n [class.grand-total-row]=\"pivotRow._isGrandTotal\"\n [class.subtotal-bold]=\"pivotRow._isSubtotal && subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"pivotRow._isSubtotal && subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"pivotRow._isSubtotal && subTotalStyle() === 'highlighted'\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n @if ((!pivotRow._isGrandTotal && freezeGrandTotal() ) || (!freezeGrandTotal() )) { \n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n @if (!shouldSkipCell(i, column.name)) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\"> \n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [class.aggregation]=\"!!column.aggregationFunction\"\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\">\n </data-cell>\n </div>\n </td>\n }\n }\n }\n </tr> \n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n\n </div>\n @if (freezeGrandTotal() && grandTotalPosition() === 'after') {\n <div #gtScroller class=\"header-shell gt-shell\"\n [class.apply-cdk-width]=\"adjustScrollWidth()\">\n <table class=\"eru-grid-table pivot-table\" \n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n \n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n \n </table> \n </div>\n }\n \n\n </div>\n </div>\n </ng-container>\n} @else {\n \n<!-- Table Mode Template -->\n <ng-container>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"50\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event)\"\n >\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <thead>\n <tr style=\"visibility:hidden;\">\n <th class=\"checkbox-column\"></th>\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header\">\n {{column.label}}\n </th>\n </tr>\n </thead>\n <tbody *ngIf=\"columns() as columnsList\">\n <ng-container *cdkVirtualFor=\"let groupItem of groupedRows();\n trackBy: trackByGroupItemFn;\n let i = index;\n let first=first\">\n <tr\n *ngIf=\"groupItem.type === 'header'\"\n class=\"group-header\"\n (click)=\"toggleGroupExpansion(groupItem.group?.id || '')\"\n >\n <td class=\"checkbox-column\" style=\"border: none;\">\n {{ groupItem.group?.isExpanded ? '▼' : '▶' }}\n </td>\n <td [attr.colspan]=\"2\" style=\"border: none;\">\n <span class=\"group-title\">\n {{ groupItem.group?.title }}\n </span>\n <span class=\"group-row-count\">\n ({{ groupItem.group?.currentLoadedRows || 0 }}/{{ groupItem.group?.totalRowCount || 0 }})\n </span>\n </td>\n </tr>\n <tr *ngIf=\"groupItem.type === 'table-header'\" style=\"background:#fafafa\">\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr>\n <tr\n *ngIf=\"groupItem.type === 'row' && groupItem.group?.isExpanded\"\n class=\"row-item\"\n [attr.data-row-id]=\"groupItem.row?.entity_id\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isRowSelected(groupItem.row?.entity_id)\"\n (change)=\"toggleRowSelection($event, groupItem.row)\"\n >\n </td>\n <td #cell *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\"\n [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\"\n >\n <div class=\"cell-content\">\n <data-cell\n #datacell \n [td]=cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"groupItem.row?.[column.name] || ''\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [drillable]=\"column.enableDrilldown || false\"\n [id]=\"groupItem.row?.['entity_id'] || '_' ||column.name\"\n ></data-cell>\n </div>\n </td>\n </tr>\n\n <tr\n *ngIf=\"groupItem.type === 'ghost-loading' && groupItem.group?.isExpanded\"\n class=\"ghost-loading-row\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n <td class=\"checkbox-column\"></td>\n <td *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\"\n >\n <div class=\"ghost-cell\"></div>\n </td>\n </tr>\n\n <tr\n *ngIf=\"groupItem.type === 'row-place-holder'\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"columns().length + 1\" class=\"separator-cell\"></td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container> \n}\n</div>\n\n <!-- Pivot Table Header Template -->\n <ng-template #pivotTableHead>\n <thead>\n @if (hasNestedHeaders()) {\n <ng-container >\n @for (headerRow of getHeaderRows(); track headerRow; let rowIndex = $index) {\n <tr class=\"pivot-header pivot-header-container\" \n [class.pivot-header-level]=\"'level-' + rowIndex\">\n @for (header of headerRow; track trackByHeaderFn($index, header); let colIndex = $index) {\n <th\n [attr.colspan]=\"header.colspan\"\n [attr.rowspan]=\"header.rowspan\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable') && header.level === 0\"\n class=\"column-header pivot-column-header nested-header\"\n [class.row-dimension-header]=\"isRowDimensionHeader(header)\"\n [class.column-dimension-header]=\"!isRowDimensionHeader(header)\"\n [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\"\n [class.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n <span class=\"header-label\">{{header.label}}</span>\n <!-- <button *ngIf=\"!isRowDimensionHeader(header)\" \n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button> -->\n </div>\n </th>\n }\n </tr>\n }\n </ng-container>\n } @else {\n <!-- Simple header fallback -->\n <ng-container>\n <tr class=\"pivot-header\" [class.freeze-header-enabled]=\"freezeHeader()\">\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <th [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n class=\"column-header pivot-column-header\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 100 : 1\"\n style = \"min-height: 40px;height: auto;padding: 8px 6px;position: relative;left: 0px;z-index: 1\">\n {{column.label}}\n </th>\n }\n </tr>\n </ng-container>\n }\n \n </thead>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #pivotColGroup>\n <colgroup>\n @for (column of getLeafColumns(); track trackByColumnFn($index, column)) {\n <col [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n </colgroup>\n</ng-template>\n\n<ng-template #pivotGrandTotal>\n<tbody class=\"pivot-tbody\">\n @for (pivotRow of gridStore.pivotGrandTotalData(); track trackByPivotRowFn($index, pivotRow); let i = $index) {\n <tr \n class=\"pivot-row grand-total-row\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\" \n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\"> \n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\">\n </data-cell>\n </div>\n </td>\n }\n </tr>\n}\n</tbody>\n</ng-template>\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { ThemeService, Theme } from '../../services/theme.service';\n\n@Component({\n selector: 'eru-theme-toggle',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatMenuModule\n ],\n template: `\n <button \n mat-icon-button \n [matMenuTriggerFor]=\"themeMenu\"\n [attr.aria-label]=\"'Theme: ' + getCurrentThemeLabel()\"\n class=\"theme-toggle-button\">\n <mat-icon>{{ getCurrentThemeIcon() }}</mat-icon>\n </button>\n \n <mat-menu #themeMenu=\"matMenu\">\n <button \n mat-menu-item \n *ngFor=\"let theme of availableThemes\"\n [class.active]=\"isActiveTheme(theme.value)\"\n (click)=\"setTheme(theme.value)\">\n <mat-icon>{{ getThemeIcon(theme.value) }}</mat-icon>\n <span>{{ theme.label }}</span>\n <mat-icon *ngIf=\"isActiveTheme(theme.value)\" class=\"check-icon\">check</mat-icon>\n </button>\n </mat-menu>\n `,\n styles: [`\n .theme-toggle-button {\n color: var(--grid-on-surface);\n \n &:hover {\n background-color: var(--grid-surface-variant);\n }\n }\n \n .active {\n background-color: var(--grid-primary-light);\n color: var(--grid-primary-color);\n }\n \n .check-icon {\n margin-left: auto;\n color: var(--grid-primary-color);\n }\n \n mat-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ThemeToggleComponent {\n private themeService = inject(ThemeService);\n \n availableThemes = this.themeService.getAvailableThemes();\n \n getCurrentThemeLabel(): string {\n const currentTheme = this.themeService.currentTheme();\n return this.availableThemes.find(t => t.value === currentTheme)?.label || 'Auto';\n }\n \n getCurrentThemeIcon(): string {\n return this.getThemeIcon(this.themeService.currentTheme());\n }\n \n getThemeIcon(theme: Theme): string {\n switch (theme) {\n case 'light':\n return 'light_mode';\n case 'dark':\n return 'dark_mode';\n case 'high-contrast':\n return 'contrast';\n case 'auto':\n default:\n return 'brightness_auto';\n }\n }\n \n isActiveTheme(theme: Theme): boolean {\n return this.themeService.currentTheme() === theme;\n }\n \n setTheme(theme: Theme): void {\n this.themeService.setTheme(theme);\n }\n}","/*\n * Public API Surface of eru-grid\n */\n\nexport * from './lib/eru-grid.service';\nexport * from './lib/eru-grid.component';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/column-constraints.service';\nexport * from './lib/stores/grid.store';\nexport * from './lib/model/grid.model';\nexport * from './lib/components/theme-toggle/theme-toggle.component';\nexport * from './lib/model/grid.model';\nexport * from './lib/stores/grid.store';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EruGridStore","i2.ThemeService","i3.ColumnConstraintsService","i1","i2","i7","i8","i3","i4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eru-grid.mjs","sources":["../../../projects/eru-grid/src/lib/services/grid-config.service.ts","../../../projects/eru-grid/src/lib/services/pivot-transform.service.ts","../../../projects/eru-grid/src/lib/stores/grid.store.ts","../../../projects/eru-grid/src/lib/services/theme.service.ts","../../../projects/eru-grid/src/lib/services/column-constraints.service.ts","../../../projects/eru-grid/src/lib/eru-grid.service.ts","../../../projects/eru-grid/src/lib/components/data-cell/custom-date-picker.directive.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.utils.ts","../../../projects/eru-grid/src/lib/components/data-cell/country-data.ts","../../../projects/eru-grid/src/lib/components/data-cell/mobile-input.component.ts","../../../projects/eru-grid/src/lib/services/overlay-menu.service.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.component.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.component.html","../../../projects/eru-grid/src/lib/directives/resize.directive.ts","../../../projects/eru-grid/src/lib/directives/column-drag.directive.ts","../../../projects/eru-grid/src/lib/eru-grid.component.ts","../../../projects/eru-grid/src/lib/eru-grid.component.html","../../../projects/eru-grid/src/lib/components/theme-toggle/theme-toggle.component.ts","../../../projects/eru-grid/src/public-api.ts","../../../projects/eru-grid/src/eru-grid.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { \n GridConfiguration, \n GridMode, \n GridFeatures, \n PivotConfiguration \n} from '../model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GridConfigService {\n\n\n\n \n\n /**\n * Detects if pivot mode should be automatically enabled based on configuration\n */\n detectPivotMode(pivotConfig?: PivotConfiguration): GridMode {\n if (!pivotConfig) {\n return 'table';\n }\n\n // If pivot configuration is provided with dimensions, enable pivot mode\n if (pivotConfig.cols.length > 0 || pivotConfig.rows.length > 0) {\n return 'pivot';\n }\n\n return 'table';\n }\n\n /**\n * Validates pivot configuration for completeness\n */\n validatePivotConfiguration(config: PivotConfiguration): { \n isValid: boolean; \n errors: string[] \n } {\n const errors: string[] = [];\n\n // Must have at least one aggregation\n if (!config.aggregations || config.aggregations.length === 0) {\n errors.push('At least one aggregation must be specified for pivot mode');\n }\n\n // Must have at least one dimension (row or column)\n if ((!config.rows || config.rows.length === 0) && \n (!config.cols || config.cols.length === 0)) {\n errors.push('At least one row dimension or column dimension must be specified');\n }\n\n // Validate aggregation functions\n const validFunctions = ['sum', 'count', 'avg', 'min', 'max'];\n config.aggregations?.forEach((agg, index) => {\n if (!agg.aggregationFunction || !validFunctions.includes(agg.aggregationFunction)) {\n errors.push(`Invalid aggregation function '${agg.aggregationFunction}' at index ${index}`);\n }\n if (!agg.name || agg.name.trim() === '') {\n errors.push(`Aggregation field cannot be empty at index ${index}`);\n }\n });\n\n return {\n isValid: errors.length === 0,\n errors\n };\n }\n\n\n /**\n * Checks if a feature is available in the current mode\n */\n isFeatureAvailable(feature: keyof GridFeatures, mode: GridMode): boolean {\n const restrictions = {\n pivot: {\n editable: false,\n columnReorderable: false\n }\n };\n\n if (mode === 'pivot' && feature in restrictions.pivot) {\n return restrictions.pivot[feature as keyof typeof restrictions.pivot];\n }\n\n return true;\n }\n\n \n}","import { inject, Injectable } from '@angular/core';\nimport { \n PivotConfiguration, \n PivotResult, \n PivotRow, \n PivotMetadata,\n AggregationFunction,\n Field,\n DataTypes,\n PivotColumnHeader,\n PivotHeaderStructure,\n PivotColumnGroupState,\n GridConfiguration\n} from '../model/grid.model';\nimport { EruGridStore } from '../stores/grid.store';\n\ninterface AggregationState {\n sum: number;\n count: number;\n min: number;\n max: number;\n values: number[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PivotTransformService {\n \n private columnGroupState: PivotColumnGroupState = {};\n\n\n\n /**\n * Main method to transform flat data into pivot table\n */\n transformData(\n sourceData: any[], \n configuration: PivotConfiguration,\n gridConfiguration?: GridConfiguration\n ): PivotResult {\n const startTime = performance.now();\n \n // Step 2: Group data by row dimensions and collect unique column dimension values\n const rowDimensionFields = configuration.rows;\n const columnDimensionFields = configuration.cols;\n \n const groupedData = this.groupByDimensions(sourceData, rowDimensionFields, columnDimensionFields);\n \n // Step 3: Use pre-collected unique column values\n const pivotColumns = groupedData.uniqueColumnValues;\n console.log('pivotColumns', pivotColumns);\n // Step 4: Create pivot rows with aggregated data\n let pivotRows = this.createPivotRows(\n groupedData.groupedData, \n pivotColumns, \n configuration\n );\n \n // Step 4a: Add subtotals and grand totals if configured\n const enableRowSubtotals = gridConfiguration?.config?.enableRowSubtotals ?? false;\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const enableGrandTotal = gridConfiguration?.config?.enableGrandTotal ?? false;\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n if (enableRowSubtotals || enableColumnSubtotals || enableGrandTotal || enableColumnGrandTotal) {\n pivotRows = this.addSubtotals(pivotRows, configuration, pivotColumns, gridConfiguration);\n }\n \n // Step 5: Generate column definitions (including subtotal columns)\n const columnDefinitions = this.generateColumnDefinitions(\n rowDimensionFields,\n pivotColumns,\n configuration.aggregations,\n gridConfiguration,\n columnDimensionFields\n );\n \n // Step 6: Initialize column group state for collapsible columns\n //this.initializeColumnGroupState(configuration, columnDimensionFields);\n \n // Step 7: Generate nested header structure with collapsible support\n const headerStructure = this.generateNestedHeaderStructure(\n rowDimensionFields,\n columnDimensionFields,\n configuration.aggregations,\n sourceData,\n gridConfiguration\n );\n \n const endTime = performance.now();\n \n const metadata: PivotMetadata = {\n totalRows: pivotRows.length,\n totalColumns: columnDefinitions.length,\n processingTime: endTime - startTime,\n dataSize: sourceData.length\n };\n console.log({\n data: pivotRows,\n columnDefinitions,\n rowCount: pivotRows.length,\n metadata,\n configuration,\n headerStructure,\n columnGroupState: this.columnGroupState\n });\n return {\n data: pivotRows,\n columnDefinitions,\n rowCount: pivotRows.length,\n metadata,\n configuration,\n headerStructure,\n columnGroupState: this.columnGroupState\n };\n }\n\n\n /**\n * Group data by row dimensions and collect unique column dimension values\n */\n private groupByDimensions(\n data: any[], \n rowDimensions: string[], \n columnDimensions: string[] = []\n ): { groupedData: Map<string, any[]>, uniqueColumnValues: string[] } {\n const groups = new Map<string, any[]>();\n const columnDimensionValues = columnDimensions.map(() => new Set<string>());\n \n data.forEach(row => {\n // Create a key from row dimension values\n // Use null/undefined check to preserve boolean false values\n const key = rowDimensions.map(dim => row[dim] != null ? String(row[dim]) : '').join('|');\n \n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n \n // Collect unique column dimension values while iterating\n columnDimensions.forEach((dimension, index) => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n columnDimensionValues[index].add(value);\n });\n });\n \n // Sort the groups hierarchically to ensure proper parent-child ordering\n const sortedGroups = this.sortGroupsHierarchically(groups, rowDimensions);\n \n // Generate unique column values from collected sets\n const uniqueColumnValues = this.generatePivotColumnsFromSets(columnDimensionValues);\n \n return {\n groupedData: sortedGroups,\n uniqueColumnValues\n };\n }\n\n /**\n * Sort grouped data hierarchically so parent dimensions appear with their children grouped together\n */\n private sortGroupsHierarchically(groups: Map<string, any[]>, dimensions: string[]): Map<string, any[]> {\n // Convert to array for sorting\n const groupEntries = Array.from(groups.entries());\n \n // Sort by hierarchical structure - each dimension level sorted separately\n groupEntries.sort((a, b) => {\n const aValues = a[0].split('|');\n const bValues = b[0].split('|');\n \n // Compare each dimension level in order\n for (let i = 0; i < dimensions.length; i++) {\n const aVal = aValues[i] || '';\n const bVal = bValues[i] || '';\n \n // Natural sort to handle numbers properly (0, 1, 10 instead of 0, 10, 1)\n const comparison = this.naturalSort(aVal, bVal);\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n \n // Convert back to Map with sorted order\n const sortedGroups = new Map<string, any[]>();\n groupEntries.forEach(([key, value]) => {\n sortedGroups.set(key, value);\n });\n \n return sortedGroups;\n }\n\n /**\n * Natural sort that handles numbers properly\n */\n private naturalSort(a: string, b: string): number {\n // Handle numeric values\n const aNum = parseFloat(a);\n const bNum = parseFloat(b);\n \n if (!isNaN(aNum) && !isNaN(bNum)) {\n return aNum - bNum;\n }\n \n // String comparison for non-numeric values\n return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });\n }\n\n /**\n * Convert string to title case\n */\n private toTitleCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\b\\w/g, char => char.toUpperCase());\n }\n\n\n\n /**\n * Generate unique pivot column values from pre-collected dimension value sets\n */\n private generatePivotColumnsFromSets(dimensionValueSets: Set<string>[]): string[] {\n if (dimensionValueSets.length === 0) {\n return ['_default']; // Default column for aggregations\n }\n\n // Convert sets to sorted arrays\n const dimensionValues = dimensionValueSets.map(set => Array.from(set).sort());\n\n // Generate cartesian product of all dimension combinations\n const generateCombinations = (arrays: string[][], index: number = 0, current: string[] = []): string[] => {\n if (index === arrays.length) {\n return [current.join('|')];\n }\n \n const results: string[] = [];\n for (const value of arrays[index]) {\n results.push(...generateCombinations(arrays, index + 1, [...current, value]));\n }\n return results;\n };\n\n return generateCombinations(dimensionValues).sort();\n }\n\n /**\n * Create pivot rows with aggregated data (PERFORMANCE OPTIMIZED)\n */\n private createPivotRows(\n groupedData: Map<string, any[]>,\n pivotColumns: string[],\n configuration: PivotConfiguration\n ): PivotRow[] {\n const pivotRows: PivotRow[] = [];\n const startTime = performance.now();\n\n // Pre-calculate column dimension mapping for performance\n const columnDataMap = new Map<string, Map<string, any[]>>();\n \n // Build column data mapping once for all rows\n groupedData.forEach((rowData, rowKey) => {\n const columnMapping = new Map<string, any[]>();\n \n // Group row data by column dimensions\n rowData.forEach(row => {\n const rowColumnKey = configuration.cols.length > 0\n ? configuration.cols\n .map(fieldName => row[fieldName] != null ? String(row[fieldName]) : '').join('|')\n : '_default';\n \n if (!columnMapping.has(rowColumnKey)) {\n columnMapping.set(rowColumnKey, []);\n }\n columnMapping.get(rowColumnKey)!.push(row);\n });\n \n columnDataMap.set(rowKey, columnMapping);\n });\n\n let processedRows = 0;\n groupedData.forEach((rowData, rowKey) => {\n const pivotRow: PivotRow = {\n _rowKey: rowKey,\n _sourceCount: rowData.length\n };\n\n // Add row dimension values to the pivot row\n const rowDimensionValues = rowKey.split('|');\n configuration.rows.forEach((fieldName: string, index: number) => {\n pivotRow[fieldName] = rowDimensionValues[index] || '';\n });\n\n\n // Get pre-calculated column mapping for this row\n const columnMapping = columnDataMap.get(rowKey)!;\n\n // Calculate aggregations for each pivot column (optimized)\n pivotColumns.forEach(pivotColumn => {\n configuration.aggregations.forEach(aggregation => {\n const columnKey = `${pivotColumn}_${aggregation.name}`;\n\n // Get filtered data from pre-calculated mapping\n const columnData = configuration.cols.length > 0\n ? columnMapping.get(pivotColumn) || []\n : rowData;\n\n const aggregatedValue = this.calculateAggregationOptimized(\n columnData,\n aggregation.name,\n aggregation.aggregationFunction || 'sum'\n );\n\n pivotRow[columnKey] = aggregatedValue;\n });\n });\n\n\n pivotRows.push(pivotRow);\n processedRows++; \n \n });\n\n const endTime = performance.now();\n \n return pivotRows;\n }\n\n /**\n * Calculate aggregation for a field (PERFORMANCE OPTIMIZED)\n */\n private calculateAggregationOptimized(\n data: any[],\n field: string,\n aggregationFunction: AggregationFunction\n ): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Optimized single-pass value processing\n let sum = 0;\n let count = 0;\n let min = Number.MAX_VALUE;\n let max = Number.MIN_VALUE;\n let validCount = 0;\n\n for (const row of data) {\n const rawValue = row[field];\n if (rawValue !== null && rawValue !== undefined && rawValue !== '') {\n const numValue = Number(rawValue);\n if (!isNaN(numValue)) {\n sum += numValue;\n validCount++;\n if (numValue < min) min = numValue;\n if (numValue > max) max = numValue;\n }\n }\n count++;\n }\n\n switch (aggregationFunction) {\n case 'sum':\n return sum;\n \n case 'count':\n return count; // Count all rows, not just numeric values\n \n case 'avg':\n return validCount > 0 ? sum / validCount : 0;\n \n case 'min':\n return validCount > 0 ? min : 0;\n \n case 'max':\n return validCount > 0 ? max : 0;\n \n default:\n return 0;\n }\n }\n\n /**\n * Calculate aggregation for a field (ORIGINAL - kept for compatibility)\n */\n private calculateAggregation(\n data: any[],\n field: string,\n aggregationFunction: AggregationFunction\n ): number {\n // Call optimized version\n return this.calculateAggregationOptimized(data, field, aggregationFunction);\n }\n\n /**\n * Generate column definitions for the pivot table\n */\n private generateColumnDefinitions(\n rowDimensions: string[],\n pivotColumns: string[],\n aggregations: any[],\n gridConfiguration?: GridConfiguration,\n columnDimensions?: string[] // Add column dimensions parameter\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n const fields = gridConfiguration?.fields || [];\n rowDimensions.forEach(dimension => {\n const field : Field | undefined = fields.find((col: Field) => col.name === dimension)\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(field?.label || dimension),\n datatype: field?.datatype || 'textbox',\n field_size: field?.field_size || 150,\n grid_index: columnIndex++,\n enableDrilldown:field?.enableDrilldown || false\n });\n });\n\n // Check if column subtotals and grand totals are enabled\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n const grandTotalPositionColumn = gridConfiguration?.config?.grandTotalPositionColumn ?? 'after';\n \n // Add column subtotal columns if enabled (before pivot columns)\n if (enableColumnSubtotals && subtotalPositionColumn === 'before') {\n // Only add subtotals for dimensions that are not the last column dimension\n if (columnDimensions && columnDimensions.length > 1) {\n const subtotalDimensions = columnDimensions.slice(0, -1);\n \n // Extract unique values for each subtotal dimension from pivot columns\n const dimensionValues = subtotalDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n pivotColumns.forEach(pivotColumn => {\n if (pivotColumn !== '_default') {\n const parts = pivotColumn.split('|');\n if (parts[dimIndex]) {\n values.add(parts[dimIndex]);\n }\n }\n });\n return Array.from(values).sort();\n });\n \n const subtotalCombinations = this.generateCombinations(dimensionValues);\n \n subtotalCombinations.forEach(combination => {\n const combinationKey = combination.join('|');\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n // Find the column config for this aggregation\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n const columnName = `_${combinationKey}_subtotal_${aggregation.name}`;\n columns.push({\n name: columnName,\n label: `${combination.join(' ')} Subtotal - ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n }\n });\n });\n }\n }\n\n // Add column grand total columns if enabled (before pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'before') {\n aggregations.forEach(aggregation => {\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n const columnName = `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`;\n columns.push({\n name: columnName,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n });\n }\n\n // Add pivot value columns\n pivotColumns.forEach(pivotColumn => {\n aggregations.forEach(aggregation => {\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n // CRITICAL FIX: Always use consistent naming pattern\n const columnName = `${pivotColumn}_${aggregation.name}`;\n\n // For no column dimensions, just show the aggregation label\n const columnLabel = pivotColumns.length > 1 || pivotColumns[0] !== '_default'\n ? `${this.formatColumnLabel(pivotColumn)} - ${aggregation.label || aggregation.name}`\n : aggregation.label || this.formatColumnLabel(aggregation.name);\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n });\n\n // Add column subtotal columns if enabled (after pivot columns)\n if (enableColumnSubtotals && subtotalPositionColumn === 'after') {\n // Only add subtotals for dimensions that are not the last column dimension\n if (columnDimensions && columnDimensions.length > 1) {\n const subtotalDimensions = columnDimensions.slice(0, -1);\n \n // Extract unique values for each subtotal dimension from pivot columns\n const dimensionValues = subtotalDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n pivotColumns.forEach(pivotColumn => {\n if (pivotColumn !== '_default') {\n const parts = pivotColumn.split('|');\n if (parts[dimIndex]) {\n values.add(parts[dimIndex]);\n }\n }\n });\n return Array.from(values).sort();\n });\n \n const subtotalCombinations = this.generateCombinations(dimensionValues);\n \n subtotalCombinations.forEach(combination => {\n const combinationKey = combination.join('|');\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n const columnName = `_${combinationKey}_subtotal_${aggregation.name}`;\n columns.push({\n name: columnName,\n label: `${combination.join(' ')} Subtotal - ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n }\n });\n });\n }\n }\n\n // Add column grand total columns if enabled (after pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'after') {\n aggregations.forEach(aggregation => {\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n const columnName = `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`;\n columns.push({\n name: columnName,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n });\n }\n\n return columns;\n }\n\n /**\n * Format column label for display\n */\n private formatColumnLabel(name: string): string {\n return name\n .split(/[_|\\s]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Get appropriate data type for aggregation function\n */\n private getAggregationDataType(aggregationFunction: AggregationFunction): DataTypes {\n switch (aggregationFunction) {\n case 'count':\n return 'number';\n case 'sum':\n case 'avg':\n case 'min':\n case 'max':\n return 'number'; // Could be 'currency' based on source field\n default:\n return 'number';\n }\n }\n\n /**\n * Optimize data for large datasets by processing in chunks\n */\n async transformDataAsync(\n sourceData: any[], \n configuration: PivotConfiguration,\n chunkSize: number = 1000\n ): Promise<PivotResult> {\n const startTime = performance.now();\n \n // Process data in chunks to avoid blocking the UI\n const chunks = this.chunkArray(sourceData, chunkSize);\n let processedData: any[] = [];\n \n for (const chunk of chunks) {\n // Data is already filtered by the application layer\n processedData = processedData.concat(chunk);\n \n // Allow other tasks to run\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n \n // Continue with normal processing\n return this.transformData(processedData, configuration);\n }\n\n /**\n * Split array into chunks\n */\n private chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n /**\n * Generate nested header structure with collapsible support\n */\n private generateNestedHeaderStructure(\n rowDimensions: string[],\n columnDimensions: string[],\n aggregations: any[],\n sourceData: any[],\n gridConfiguration?: GridConfiguration\n ): PivotHeaderStructure {\n // Use flat structure only if no column dimensions AND single aggregation\n if (columnDimensions.length === 0 && aggregations.length <= 1) {\n return this.generateFlatHeaderStructure(rowDimensions, columnDimensions, aggregations, sourceData);\n }\n\n // Get unique values for each column dimension\n const dimensionValues = columnDimensions.map(dimension => {\n const values = new Set<string>();\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(String(value));\n });\n return Array.from(values).sort();\n });\n\n // Build hierarchical header structure\n const headerRows: PivotColumnHeader[][] = [];\n const maxDepth = columnDimensions.length + (aggregations.length > 1 ? 1 : 0);\n \n console.log('Header structure initialization:');\n console.log('columnDimensions:', columnDimensions);\n console.log('aggregations:', aggregations);\n console.log('maxDepth:', maxDepth);\n \n // Initialize header rows\n for (let i = 0; i < maxDepth; i++) {\n headerRows.push([]);\n console.log(`Initialized headerRows[${i}] with length:`, headerRows[i].length);\n }\n\n // Add row dimension headers (they span all header rows)\n const fields = gridConfiguration?.fields || [];\n rowDimensions.forEach(dimension => {\n headerRows[0].push({\n name: dimension,\n label: this.formatColumnLabel(fields.find((col: Field) => col.name === dimension)?.label || dimension),\n level: 0,\n colspan: 1,\n rowspan: maxDepth\n });\n });\n\n // Check if column subtotals and grand totals are enabled\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n const grandTotalPositionColumn = gridConfiguration?.config?.grandTotalPositionColumn ?? 'after';\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n\n // Add column grand total headers if enabled (before pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'before') {\n aggregations.forEach(aggregation => {\n headerRows[0].push({\n name: `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n level: 0,\n colspan: 1,\n rowspan: maxDepth\n });\n });\n }\n\n // Generate nested column headers with collapsible support\n this.buildNestedHeaders(\n dimensionValues,\n aggregations,\n headerRows,\n 0,\n columnDimensions,\n maxDepth,\n gridConfiguration\n );\n\n // Insert column subtotal headers at the correct positions within each priority group\n if (enableColumnSubtotals) {\n this.insertColumnSubtotalHeaders(headerRows, columnDimensions, aggregations, gridConfiguration, sourceData);\n }\n\n // Add column grand total headers if enabled (after pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'after') {\n aggregations.forEach(aggregation => {\n headerRows[0].push({\n name: `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n level: 0,\n colspan: 1,\n rowspan: maxDepth\n });\n });\n }\n\n // Generate leaf columns for actual data with collapsible support\n const leafColumns = this.generateLeafColumnsWithCollapsible(\n rowDimensions,\n dimensionValues,\n aggregations,\n columnDimensions,\n gridConfiguration\n );\n\n\n return {\n maxDepth,\n headerRows,\n leafColumns\n };\n }\n\n /**\n * Build nested column headers recursively - generates complete cartesian product structure\n */\n private buildNestedHeaders(\n dimensionValues: string[][],\n aggregations: any[],\n headerRows: PivotColumnHeader[][],\n currentLevel: number,\n columnDimensions: string[],\n maxDepth: number,\n gridConfiguration?: GridConfiguration\n ): void {\n if (currentLevel >= dimensionValues.length) {\n return;\n }\n\n const currentDimensionValues = dimensionValues[currentLevel];\n const isLastDimension = currentLevel === dimensionValues.length - 1;\n const hasMultipleAggregations = aggregations.length > 1;\n \n // Calculate how many times this level should repeat based on parent combinations\n const parentCombinations = currentLevel === 0 ? 1 : \n dimensionValues.slice(0, currentLevel).reduce((acc, values) => acc * values.length, 1);\n \n // Generate headers for this level - repeat for each parent combination\n for (let parentIndex = 0; parentIndex < parentCombinations; parentIndex++) {\n currentDimensionValues.forEach(value => {\n const colspan = this.calculateColspan(\n dimensionValues,\n currentLevel,\n aggregations.length,\n gridConfiguration?.config?.enableColumnSubtotals ?? false,\n gridConfiguration?.config?.subtotalPositionColumn ?? 'after',\n aggregations\n );\n \n const rowspan = (isLastDimension && !hasMultipleAggregations) ? 2 : 1;\n\n const dimension = columnDimensions[currentLevel];\n const groupKey = this.generateColumnGroupKey(dimension, currentLevel);\n const isExpanded = this.isColumnGroupExpanded(groupKey);\n \n // Calculate parentValue for positioning subtotals\n let parentValue: string | undefined = undefined;\n if (currentLevel > 0) {\n // For levels beyond the first, determine the parent combination values\n const parentDimensionIndex = Math.floor(parentIndex / \n dimensionValues.slice(currentLevel).reduce((acc, values) => acc * values.length, 1));\n const parentDimensionValues: string[] = [];\n \n // Build parent path by working backwards through dimensions\n let tempIndex = parentIndex;\n for (let level = currentLevel - 1; level >= 0; level--) {\n const levelSize = dimensionValues.slice(level + 1, currentLevel).reduce((acc, values) => acc * values.length, 1);\n const levelIndex = Math.floor(tempIndex / levelSize);\n parentDimensionValues.unshift(dimensionValues[level][levelIndex % dimensionValues[level].length]);\n tempIndex = tempIndex % levelSize;\n }\n \n parentValue = parentDimensionValues.join('+');\n }\n \n // Add the header with parentValue for N-dimensional support\n headerRows[currentLevel].push({\n name: dimension,\n label: value,\n level: currentLevel,\n colspan,\n rowspan,\n parentValue,\n // Collapsible properties\n isCollapsible: true,\n isExpanded: isExpanded,\n groupKey: groupKey,\n parentGroupKey: currentLevel > 0 ? this.generateColumnGroupKey(columnDimensions[currentLevel - 1], currentLevel - 1) : undefined,\n collapsedDisplayMode: 'aggregated'\n });\n\n // If this is the last dimension and we have multiple aggregations,\n // add aggregation headers for this dimension value\n if (isLastDimension && hasMultipleAggregations) {\n // For aggregation headers, the parentValue includes the current dimension value\n const aggParentValue = parentValue ? `${parentValue}+${value}` : value;\n \n aggregations.forEach(agg => {\n headerRows[currentLevel + 1].push({\n name: agg.name,\n label: agg.label || agg.name,\n level: currentLevel + 1,\n colspan: 1,\n rowspan: 1,\n parentValue: aggParentValue\n });\n });\n }\n });\n }\n\n // Recursively build next level only if not the last dimension\n if (!isLastDimension) {\n this.buildNestedHeaders(\n dimensionValues,\n aggregations,\n headerRows,\n currentLevel + 1,\n columnDimensions,\n maxDepth,\n gridConfiguration\n );\n }\n }\n\n /**\n * Calculate colspan for a header at given level\n */\n private calculateColspan(\n dimensionValues: string[][],\n currentLevel: number,\n aggregationCount: number,\n isColumnSubtotalsEnabled: boolean,\n subtotalPositionColumn: 'before' | 'after',\n aggregations: any[]\n ): number {\n let colspan = 1;\n \n // Multiply by values in deeper levels\n for (let i = currentLevel + 1; i < dimensionValues.length; i++) {\n colspan *= dimensionValues[i].length;\n }\n \n // Multiply by aggregation count if multiple aggregations\n if (aggregationCount > 1) {\n colspan *= aggregationCount;\n }\n \n // Add subtotal columns for levels that have subtotals (all except last dimension)\n if (isColumnSubtotalsEnabled && currentLevel < dimensionValues.length - 1) {\n // Calculate how many subtotal columns will be added at THIS level and all deeper levels\n const subtotalAggregations = aggregations.filter(agg => agg.showSubtotals);\n \n // For this level: add subtotal columns for this dimension combination\n // For deeper levels: add subtotal columns for all combinations at those levels\n let subtotalColumns = 0;\n \n // Add subtotal columns for current level (single dimension combination)\n subtotalColumns += subtotalAggregations.length;\n \n // Add subtotal columns for deeper level combinations\n for (let level = currentLevel + 1; level < dimensionValues.length - 1; level++) {\n // Calculate combinations at this deeper level that would be under current header\n let deeperCombinations = 1;\n for (let i = currentLevel; i <= level; i++) {\n deeperCombinations *= dimensionValues[i].length;\n }\n subtotalColumns += deeperCombinations * subtotalAggregations.length;\n }\n \n colspan += subtotalColumns;\n }\n \n return colspan;\n }\n\n /**\n * Generate leaf columns for the actual data with collapsible support\n */\n private generateLeafColumnsWithCollapsible(\n rowDimensions: string[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n const field : Field | undefined = gridConfiguration?.fields.find((col: Field) => col.name === dimension)\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(field?.label || dimension),\n datatype: field?.datatype || 'textbox' as DataTypes,\n field_size: field?.field_size || 150,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n enableDrilldown:field?.enableDrilldown || false\n });\n });\n\n // Check if column grand totals are enabled\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n const grandTotalPositionColumn = gridConfiguration?.config?.grandTotalPositionColumn ?? 'after';\n\n // Add column grand total columns if enabled (before pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'before') {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n columns.push({\n name: `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n });\n }\n\n // Handle case when there are no column dimensions\n if (columnDimensions.length === 0) {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const columnName = `_default_${aggregation.name}`;\n const columnLabel = aggregation.label || this.formatColumnLabel(aggregation.name);\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 1,\n parentPath: [],\n rowspan: 1,\n colspan: 1,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n \n // Add column grand total columns if enabled (after pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'after') {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n columns.push({\n name: `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n });\n }\n \n return columns;\n }\n \n // Generate combinations respecting collapse state\n const combinations = this.generateCombinations(dimensionValues);\n \n combinations.forEach(combination => {\n // Check if any parent groups are collapsed\n const collapsedLevels = this.getCollapsedLevels(combination, columnDimensions);\n \n if (collapsedLevels.length > 0) {\n // Generate collapsed column\n const collapsedLevel = Math.min(...collapsedLevels);\n const collapsedDimension = columnDimensions[collapsedLevel];\n const groupKey = this.generateColumnGroupKey(collapsedDimension, collapsedLevel);\n \n // Only add one column per collapsed group\n const collapsedColumnKey = combination.slice(0, collapsedLevel + 1).join('|');\n if (!columns.find(col => col.name.startsWith(`${collapsedColumnKey}_collapsed_`))) {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const columnName = `${collapsedColumnKey}_collapsed_${aggregation.name}`;\n const columnLabel = `${combination.slice(0, collapsedLevel + 1).join(' - ')} (Total)`;\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n }\n } else {\n // Generate normal expanded columns\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const columnKey = combination.join('|');\n const columnName = `${columnKey}_${aggregation.name}`;\n console.log('aggregation', aggregation);\n console.log('aggregationColumn', aggregationColumn);\n console.log('columnKey',columnKey);\n console.log('columnName', columnName);\n const columnLabel = aggregations.length > 1\n ? `${combination.join(' - ')} (${aggregation.label})`\n : combination.join(' - ');\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n }\n });\n\n // Add column grand total columns if enabled (after pivot columns)\n if (enableColumnGrandTotal && grandTotalPositionColumn === 'after') {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n columns.push({\n name: `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`,\n label: `${this.toTitleCase(aggregation.aggregationFunction)} of ${aggregation.label || aggregation.name}`,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n });\n }\n\n return columns;\n }\n\n /**\n * Get collapsed levels for a combination path\n */\n private getCollapsedLevels(combination: string[], columnDimensions: string[]): number[] {\n const collapsedLevels: number[] = [];\n \n combination.forEach((value, index) => {\n if (index < columnDimensions.length) {\n const dimension = columnDimensions[index];\n const groupKey = this.generateColumnGroupKey(dimension, index);\n if (!this.isColumnGroupExpanded(groupKey)) {\n collapsedLevels.push(index);\n }\n }\n });\n \n return collapsedLevels;\n }\n\n /**\n * Generate leaf columns for the actual data\n */\n private generateLeafColumns(\n rowDimensions: string[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration\n ): Field[] {\n console.log(`DEBUG: generateLeafColumns called with:`, {\n rowDimensions,\n dimensionValuesLength: dimensionValues.length,\n aggregationsLength: aggregations.length,\n columnDimensions\n });\n \n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n const field : Field | undefined = gridConfiguration?.fields.find((col: Field) => col.name === dimension)\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(field?.label || dimension),\n datatype: field?.datatype || 'textbox' as DataTypes,\n field_size: field?.field_size || 150,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1,\n enableDrilldown:field?.enableDrilldown || false\n });\n });\n\n // Handle case when there are no column dimensions\n if (columnDimensions.length === 0) {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const columnName = `_default_${aggregation.name}`;\n const columnLabel = aggregation.label || this.formatColumnLabel(aggregation.name);\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 1,\n parentPath: [],\n rowspan: 1,\n colspan: 1,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n return columns;\n }\n \n // Generate all combinations of column dimension values\n const combinations = this.generateCombinations(dimensionValues);\n \n combinations.forEach(combination => {\n aggregations.forEach(aggregation => {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const columnKey = combination.join('|');\n // CRITICAL FIX: Use the same naming convention as data calculation\n // Data is stored as 'Feb_sales', 'Jan_sales' but columns were named 'Feb', 'Jan'\n const columnName = `${columnKey}_${aggregation.name}`;\n \n const columnLabel = aggregations.length > 1\n ? `${combination.join(' - ')} (${aggregation.label})`\n : combination.join(' - ');\n\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1,\n enableDrilldown:aggregation.enableDrilldown || false\n });\n });\n });\n\n console.log(`DEBUG: generateLeafColumns generated ${columns.length} columns:`);\n columns.forEach((col, index) => {\n console.log(` [${index}] ${col.name} (label: \"${col.label}\")`);\n });\n\n return columns;\n }\n\n /**\n * Generate all combinations of dimension values\n */\n private generateCombinations(dimensionValues: string[][]): string[][] {\n if (dimensionValues.length === 0) return [[]];\n if (dimensionValues.length === 1) return dimensionValues[0].map(v => [v]);\n\n const [first, ...rest] = dimensionValues;\n const restCombinations = this.generateCombinations(rest);\n \n const combinations: string[][] = [];\n first.forEach(value => {\n restCombinations.forEach(restCombo => {\n combinations.push([value, ...restCombo]);\n });\n });\n \n return combinations;\n }\n\n /**\n * Generate hierarchical subtotal combinations - creates combinations at each level separately\n * For 3 dimensions [[\"Low\", \"Medium\"], [\"0\", \"1\"], [\"Open\", \"Closed\"]] this generates:\n * Level 0: [\"Low\"], [\"Medium\"] (first dimension only)\n * Level 1: [\"Low\", \"0\"], [\"Low\", \"1\"], [\"Medium\", \"0\"], [\"Medium\", \"1\"] (first + second dimensions)\n * This ensures subtotals are calculated for ALL dimension levels, not just full combinations\n */\n private generateHierarchicalSubtotalCombinations(dimensionValues: string[][]): string[][] {\n const allCombinations: string[][] = [];\n \n // For each level from 0 to dimensionValues.length - 1 (excluding the last level)\n for (let level = 0; level < dimensionValues.length; level++) {\n // Generate combinations up to this level (inclusive)\n const relevantDimensions = dimensionValues.slice(0, level + 1);\n \n if (level === 0) {\n // Level 0: Individual values from first dimension\n const levelCombinations = dimensionValues[0].map(value => [value]);\n allCombinations.push(...levelCombinations);\n } else {\n // Higher levels: Cartesian product of dimensions up to current level\n const levelCombinations = this.generateCombinations(relevantDimensions);\n allCombinations.push(...levelCombinations);\n }\n }\n \n return allCombinations;\n }\n\n /**\n * Generate flat header structure for single dimension\n */\n private generateFlatHeaderStructure(\n rowDimensions: string[],\n columnDimensions: string[],\n aggregations: any[],\n sourceData?: any[],\n gridConfiguration?: GridConfiguration\n ): PivotHeaderStructure {\n // Simple flat structure - existing logic\n const headerRows: PivotColumnHeader[][] = [[]];\n \n // Add headers for flat structure\n const columns = gridConfiguration?.fields || [];\n rowDimensions.forEach(dimension => {\n headerRows[0].push({\n label: this.formatColumnLabel(columns.find((col: Field) => col.name === dimension)?.label || dimension),\n name: dimension,\n level: 0,\n colspan: 1,\n rowspan: 1\n });\n });\n\n // For single dimension, add column headers\n if (columnDimensions.length === 1) {\n // This would need the actual column values, simplified for now\n headerRows[0].push({\n label: 'Pivot Data',\n name: 'Pivot Data',\n level: 0,\n colspan: aggregations.length || 1,\n rowspan: 1\n });\n }\n\n // Extract dimension values from source data if available\n const dimensionValues = columnDimensions.map(dimension => {\n if (!sourceData) return [];\n const values = new Set<string>();\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(String(value));\n });\n return Array.from(values).sort();\n });\n\n\n // Generate leaf columns for flat structure with collapsible support\n const leafColumns = this.generateLeafColumnsWithCollapsible(\n rowDimensions,\n dimensionValues,\n aggregations,\n columnDimensions,\n gridConfiguration\n );\n\n return {\n maxDepth: 1,\n headerRows,\n leafColumns\n };\n }\n\n /**\n * Add subtotals to pivot data based on configuration\n */\n private addSubtotals(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration\n ): PivotRow[] {\n const enableRowSubtotals = gridConfiguration?.config?.enableRowSubtotals ?? false;\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const enableGrandTotal = gridConfiguration?.config?.enableGrandTotal ?? false;\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n const grandTotalPosition = gridConfiguration?.config?.grandTotalPosition ?? 'after';\n const grandTotalPositionColumn = gridConfiguration?.config?.grandTotalPositionColumn ?? 'after';\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n \n if (!enableRowSubtotals && !enableColumnSubtotals && !enableGrandTotal && !enableColumnGrandTotal) {\n return pivotRows;\n }\n\n let result = [...pivotRows];\n\n // Add row subtotals\n if (enableRowSubtotals) {\n result = this.addRowSubtotals(result, configuration, gridConfiguration);\n }\n\n // Add column subtotals\n if (enableColumnSubtotals) {\n result = this.addColumnSubtotals(result, configuration, pivotColumns, gridConfiguration, subtotalPositionColumn);\n }\n\n // Add grand total row\n if (enableGrandTotal) {\n result = this.addGrandTotalRow(result, configuration, pivotColumns, gridConfiguration, grandTotalPosition);\n }\n\n // Add column grand totals\n if (enableColumnGrandTotal) {\n result = this.addColumnGrandTotals(result, configuration, pivotColumns, gridConfiguration, grandTotalPositionColumn);\n }\n\n return result;\n }\n\n /**\n * Add subtotal rows for row dimensions\n */\n private addRowSubtotals(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration,\n gridConfiguration?: GridConfiguration\n ): PivotRow[] {\n const rowDimensions = configuration.rows;\n \n \n // Only show subtotals for parent dimensions (not leaf dimensions)\n // Leaf dimension subtotals are redundant since they equal the single row\n const subtotalLevels = rowDimensions.length > 1 \n ? rowDimensions.slice(0, -1).map((_, index) => index) // Exclude last dimension (leaf)\n : []; // No subtotals if only one dimension\n\n\n let result: PivotRow[] = [];\n const subtotalGroups = new Map<string, PivotRow[]>();\n\n // Group rows by dimension values for subtotal calculation\n for (const row of pivotRows) {\n for (const level of subtotalLevels) {\n if (level < rowDimensions.length) {\n const groupKey = rowDimensions.slice(0, level + 1)\n .map(dim => row[dim])\n .join('|');\n \n if (!subtotalGroups.has(groupKey)) {\n subtotalGroups.set(groupKey, []);\n }\n subtotalGroups.get(groupKey)!.push(row);\n }\n }\n }\n // Calculate subtotals for each group\n const subtotalRows = new Map<string, PivotRow>();\n for (const [groupKey, groupRows] of subtotalGroups) {\n const subtotalRow = this.calculateSubtotalRow(groupRows, configuration, groupKey, gridConfiguration);\n subtotalRows.set(groupKey, subtotalRow);\n }\n \n // Insert subtotal rows at appropriate positions\n // Group rows by first dimension (location) to insert subtotals correctly\n const locationGroups = new Map<string, PivotRow[]>();\n for (const row of pivotRows) {\n const locationKey = String(row[rowDimensions[0]]);\n if (!locationGroups.has(locationKey)) {\n locationGroups.set(locationKey, []);\n }\n locationGroups.get(locationKey)!.push(row);\n }\n \n for (const [locationKey, rows] of locationGroups) {\n // Add all rows for this location\n result.push(...rows);\n \n // Add subtotal row if it exists for this location\n const subtotalRow = subtotalRows.get(locationKey);\n if (subtotalRow) {\n result.push(subtotalRow);\n } \n }\n \n \n return result;\n }\n\n /**\n * Add column subtotals as new columns\n */\n private addColumnSubtotals(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration,\n subtotalPositionColumn?: 'before' | 'after'\n ): PivotRow[] {\n // Only calculate subtotals if we have column dimensions\n if (configuration.cols.length === 0) {\n return pivotRows;\n }\n\n // Don't calculate subtotals for the last column dimension\n const subtotalDimensions = configuration.cols.slice(0, -1);\n \n if (subtotalDimensions.length === 0) {\n return pivotRows;\n }\n\n // Extract unique values for each column dimension that should have subtotals\n const dimensionValues = subtotalDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n // Extract unique values from pivot column names\n // Pivot columns are named like \"Low|0\", \"Low|1\", \"Medium|0\", etc.\n pivotColumns.forEach(pivotColumn => {\n if (pivotColumn !== '_default') {\n const parts = pivotColumn.split('|');\n if (parts[dimIndex] !== undefined) {\n values.add(parts[dimIndex]);\n }\n }\n });\n \n return Array.from(values).sort();\n });\n\n console.log('Column subtotal dimensions:', subtotalDimensions);\n console.log('Dimension values for subtotals:', dimensionValues);\n\n // Generate hierarchical subtotal combinations (for each level separately)\n const subtotalCombinations = this.generateHierarchicalSubtotalCombinations(dimensionValues);\n\n console.log('Hierarchical subtotal combinations:', subtotalCombinations);\n\n // Add column subtotal columns to each row\n const result: PivotRow[] = [];\n \n for (const row of pivotRows) {\n const newRow = { ...row };\n \n // For each combination of dimension values that should have subtotals\n subtotalCombinations.forEach(combination => {\n const combinationKey = combination.join('|');\n \n // For each aggregation, calculate subtotal for this combination\n configuration.aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumnName = `_${combinationKey}_subtotal_${aggregation.name}`;\n let measureTotal = 0;\n const matchedColumns: string[] = [];\n \n // Find all columns that match this combination and sum their values\n Object.keys(row).forEach(key => {\n if (key.endsWith(`_${aggregation.name}`) && typeof row[key] === 'number') {\n // Check if this column belongs to the combination\n // The key format is \"Priority|Rating_measure\" (e.g., \"Low|0_number\")\n const columnKey = key.split('_')[0]; // Get the part before the aggregation name\n const columnParts = columnKey.split('|'); // Split column key by delimiter\n \n // Check if this column matches the current combination\n let isMatch = false;\n \n if (combination.length === 1) {\n // Single dimension: check if first part of column matches (e.g., \"Low|0\" matches [\"Low\"])\n isMatch = columnParts[0] === combination[0];\n } else {\n // Multi-dimension: check if first N parts of column match the combination\n // e.g., for combination [\"Low\", \"0\"], check if column \"Low|0|Open\" starts with \"Low|0\"\n if (columnParts.length >= combination.length) {\n isMatch = true;\n for (let i = 0; i < combination.length; i++) {\n if (columnParts[i] !== combination[i]) {\n isMatch = false;\n break;\n }\n }\n }\n }\n \n if (isMatch) {\n measureTotal += row[key];\n matchedColumns.push(key);\n }\n }\n });\n \n console.log(`Subtotal for ${combinationKey} - ${aggregation.name}:`, {\n combinationKey,\n aggregationName: aggregation.name,\n matchedColumns,\n measureTotal\n });\n \n newRow[subtotalColumnName] = measureTotal;\n }\n });\n });\n \n result.push(newRow);\n }\n\n return result;\n }\n\n /**\n * Add grand total row\n */\n private addGrandTotalRow(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration,\n grandTotalPosition?: 'before' | 'after'\n ): PivotRow[] {\n const grandTotalRow = this.calculateGrandTotalRow(\n pivotRows.filter(row => !row._isSubtotal), // Exclude existing subtotals\n configuration,\n 'Grand Total',\n gridConfiguration\n );\n \n grandTotalRow._isGrandTotal = true;\n // The label is already set by calculateGrandTotalRow, but ensure it shows \"Grand Total\"\n grandTotalRow._subtotalLabel = 'Grand Total';\n \n // Set dimension columns to show \"Grand Total\"\n if (configuration.rows.length > 0) {\n const firstDimField = configuration.rows[0];\n grandTotalRow[firstDimField] = 'Grand Total';\n \n // Clear other dimension values\n for (let i = 1; i < configuration.rows.length; i++) {\n const dimField = configuration.rows[i];\n grandTotalRow[dimField] = '';\n }\n }\n\n if (grandTotalPosition === 'before') {\n return [grandTotalRow, ...pivotRows];\n }\n return [...pivotRows, grandTotalRow];\n }\n\n /**\n * Add column grand totals as new columns\n */\n private addColumnGrandTotals(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration,\n grandTotalPositionColumn?: 'before' | 'after'\n ): PivotRow[] {\n // Add column grand total columns to each row\n const result: PivotRow[] = [];\n \n for (const row of pivotRows) {\n const newRow = { ...row };\n \n // For each aggregation/measure, calculate the grand total across all column dimension values\n configuration.aggregations.forEach(aggregation => {\n const grandTotalColumnName = `_${aggregation.aggregationFunction}_column_grand_total_${aggregation.name}`;\n let measureTotal = 0;\n \n // Find all columns that end with this measure name and sum their values\n Object.keys(row).forEach(key => {\n if (key.endsWith(`_${aggregation.name}`) && typeof row[key] === 'number') {\n measureTotal += row[key];\n }\n });\n \n newRow[grandTotalColumnName] = measureTotal;\n });\n \n result.push(newRow);\n }\n\n return result;\n }\n\n /**\n * Calculate grand total values for all rows (ignores showSubtotals flag)\n */\n private calculateGrandTotalRow(\n rows: PivotRow[], \n configuration: PivotConfiguration, \n groupKey: string,\n gridConfiguration?: GridConfiguration\n ): PivotRow {\n const defaultLabel = gridConfiguration?.config?.subtotalLabel || 'Subtotal';\n const grandTotalRow: PivotRow = {\n _rowKey: `grand_total_${groupKey}`,\n _sourceCount: rows.reduce((sum, row) => sum + (row._sourceCount || 0), 0),\n _isGrandTotal: true,\n _subtotalLabel: `Grand Total`\n };\n\n // Calculate aggregated values for ALL aggregation fields per column (ignore showSubtotals)\n if (rows.length > 0) {\n // Get all column keys that contain aggregation data\n const allColumnKeys = Object.keys(rows[0]).filter(key => \n configuration.aggregations.some(agg => key.includes(agg.name))\n );\n\n // Calculate grand total for each column separately\n for (const columnKey of allColumnKeys) {\n const values = rows\n .map(row => parseFloat(row[columnKey]) || 0)\n .filter(val => !isNaN(val));\n\n if (values.length > 0) {\n // Find which aggregation this column belongs to\n const aggregation = configuration.aggregations.find(agg => \n columnKey.includes(agg.name)\n );\n \n if (aggregation) {\n const aggregatedValue = this.applyAggregationFunction(\n aggregation.aggregationFunction || 'sum', \n values\n );\n grandTotalRow[columnKey] = aggregatedValue;\n }\n }\n }\n }\n\n return grandTotalRow;\n }\n\n /**\n * Calculate subtotal values for a group of rows\n */\n private calculateSubtotalRow(\n rows: PivotRow[], \n configuration: PivotConfiguration, \n groupKey: string,\n gridConfiguration?: GridConfiguration\n ): PivotRow {\n const defaultLabel = gridConfiguration?.config?.subtotalLabel || 'Subtotal';\n const subtotalRow: PivotRow = {\n _rowKey: `subtotal_${groupKey}`,\n _sourceCount: rows.reduce((sum, row) => sum + (row._sourceCount || 0), 0),\n _isSubtotal: true,\n _subtotalLabel: `${defaultLabel} (${rows.length} items)`\n };\n\n // Set the subtotal label in the row dimension columns\n if (configuration.rows.length > 0) {\n const firstDimField = configuration.rows[0];\n subtotalRow[firstDimField] = `${defaultLabel} - ${groupKey}`;\n \n // Clear other dimension values\n for (let i = 1; i < configuration.rows.length; i++) {\n const dimField = configuration.rows[i];\n subtotalRow[dimField] = '';\n }\n }\n\n // Calculate aggregated values for each aggregation field per column (respects showSubtotals)\n if (rows.length > 0) {\n // Get all column keys that contain aggregation data\n const allColumnKeys = Object.keys(rows[0]).filter(key => \n configuration.aggregations.some(agg => key.includes(agg.name))\n );\n // Calculate subtotal for each column separately\n for (const columnKey of allColumnKeys) {\n const values = rows\n .map(row => parseFloat(row[columnKey]) || 0)\n .filter(val => !isNaN(val));\n\n if (values.length > 0) {\n // Find which aggregation this column belongs to\n const aggregation = configuration.aggregations.find(agg => \n columnKey.includes(agg.name)\n );\n \n // Only calculate if showSubtotals is true for this aggregation\n if (aggregation && aggregation.showSubtotals) {\n const aggregatedValue = this.applyAggregationFunction(\n aggregation.aggregationFunction || 'sum', \n values\n );\n subtotalRow[columnKey] = aggregatedValue;\n }\n }\n }\n }\n return subtotalRow;\n }\n\n /**\n * Apply aggregation function to array of values\n */\n private applyAggregationFunction(\n func: AggregationFunction, \n values: number[]\n ): number {\n switch (func) {\n case 'sum':\n return values.reduce((sum, val) => sum + val, 0);\n case 'avg':\n return values.length > 0 ? values.reduce((sum, val) => sum + val, 0) / values.length : 0;\n case 'count':\n return values.length;\n case 'min':\n return values.length > 0 ? Math.min(...values) : 0;\n case 'max':\n return values.length > 0 ? Math.max(...values) : 0;\n default:\n return 0;\n }\n }\n\n /**\n * Group rows by dimension values\n */\n private groupRowsByDimensions(\n rows: PivotRow[], \n dimensions: string[]\n ): Map<string, PivotRow[]> {\n const groups = new Map<string, PivotRow[]>();\n \n for (const row of rows) {\n const groupKey = dimensions\n .map(dim => row[dim])\n .join('|');\n \n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(row);\n }\n \n return groups;\n }\n\n /**\n * Export pivot data to CSV format\n */\n exportToCsv(pivotResult: PivotResult): string {\n const headers = pivotResult.columnDefinitions.map(col => col.label).join(',');\n const rows = pivotResult.data.map(row => {\n return pivotResult.columnDefinitions.map(col => {\n const value = row[col.name];\n return typeof value === 'string' && value.includes(',') \n ? `\"${value}\"` \n : value || '';\n }).join(',');\n });\n \n return [headers, ...rows].join('\\n');\n }\n\n /**\n * Initialize column group state based on configuration\n */\n/* private initializeColumnGroupState(\n configuration: PivotConfiguration, \n columnDimensions: string[]\n ): void {\n const defaultExpansion = configuration.defaultColumnGroupExpansion ?? 1;\n const columnGroups = configuration.columnGroups || [];\n \n // Reset state\n this.columnGroupState = {};\n \n // Create group configurations for each column dimension\n columnDimensions.forEach((dimension, level) => {\n const groupConfig = columnGroups.find(g => g.field === dimension) || {\n field: dimension,\n collapsible: true,\n defaultExpanded: defaultExpansion === -1 || level < defaultExpansion,\n collapsedDisplayMode: 'aggregated',\n collapsedAggregation: 'sum'\n };\n \n const groupKey = this.generateColumnGroupKey(dimension, level);\n \n this.columnGroupState[groupKey] = {\n isExpanded: groupConfig.defaultExpanded ?? true,\n level: level,\n childGroups: [],\n parentGroup: level > 0 ? this.generateColumnGroupKey(columnDimensions[level - 1], level - 1) : undefined\n };\n });\n \n // Link parent-child relationships\n Object.keys(this.columnGroupState).forEach(groupKey => {\n const group = this.columnGroupState[groupKey];\n if (group.parentGroup && this.columnGroupState[group.parentGroup]) {\n this.columnGroupState[group.parentGroup].childGroups = \n this.columnGroupState[group.parentGroup].childGroups || [];\n this.columnGroupState[group.parentGroup].childGroups!.push(groupKey);\n }\n });\n } */\n\n /**\n * Generate unique key for column group\n */\n private generateColumnGroupKey(dimension: string, level: number): string {\n return `${dimension}_level_${level}`;\n }\n\n /**\n * Toggle collapse/expand state of a column group\n */\n toggleColumnGroup(groupKey: string, configuration: PivotConfiguration): void {\n if (!this.columnGroupState[groupKey]) {\n console.warn(`Column group ${groupKey} not found`);\n return;\n }\n \n const group = this.columnGroupState[groupKey];\n group.isExpanded = !group.isExpanded;\n \n // Auto-collapse child groups when parent is collapsed\n if (!group.isExpanded && group.childGroups) {\n group.childGroups.forEach(childKey => {\n if (this.columnGroupState[childKey]) {\n this.columnGroupState[childKey].isExpanded = false;\n }\n });\n }\n \n // Auto-expand parent groups when child is expanded\n if (group.isExpanded && group.parentGroup) {\n let parentKey: string | undefined = group.parentGroup;\n while (parentKey && this.columnGroupState[parentKey]) {\n this.columnGroupState[parentKey].isExpanded = true;\n parentKey = this.columnGroupState[parentKey].parentGroup;\n }\n }\n }\n\n /**\n * Check if a column group is expanded\n */\n isColumnGroupExpanded(groupKey: string): boolean {\n return this.columnGroupState[groupKey]?.isExpanded ?? true;\n }\n\n /**\n * Get collapsed value for a column group\n */\n /* getCollapsedValue(\n groupKey: string, \n data: PivotRow[], \n configuration: PivotConfiguration,\n aggregations: any[]\n ): any {\n const group = this.columnGroupState[groupKey];\n if (!group) return null;\n \n const columnGroupConfig = configuration.columnGroups?.find(g => \n this.generateColumnGroupKey(g.field, group.level) === groupKey\n );\n \n const displayMode = columnGroupConfig?.collapsedDisplayMode || 'aggregated';\n const aggregationFunc = columnGroupConfig?.collapsedAggregation || 'sum';\n \n switch (displayMode) {\n case 'subtotal':\n // Use existing subtotal if available\n return this.calculateGroupSubtotal(groupKey, data, aggregations, aggregationFunc);\n \n case 'aggregated':\n // Calculate aggregated value for all child columns\n return this.calculateGroupAggregation(groupKey, data, aggregations, aggregationFunc);\n \n case 'first-value':\n // Return the first child column value\n return this.getFirstChildValue(groupKey, data);\n \n case 'count':\n // Return count of non-null values\n return this.getGroupValueCount(groupKey, data);\n \n default:\n return null;\n }\n } */\n\n /**\n * Calculate subtotal for a column group\n */\n private calculateGroupSubtotal(\n groupKey: string, \n data: PivotRow[], \n aggregations: any[], \n aggregationFunc: AggregationFunction\n ): number {\n // For now, sum all relevant column values\n // This could be enhanced to use existing subtotal calculations\n return this.calculateGroupAggregation(groupKey, data, aggregations, aggregationFunc);\n }\n\n /**\n * Calculate aggregated value for a column group\n */\n private calculateGroupAggregation(\n groupKey: string, \n data: PivotRow[], \n aggregations: any[], \n aggregationFunc: AggregationFunction\n ): number {\n const group = this.columnGroupState[groupKey];\n if (!group || data.length === 0) return 0;\n \n // Get all column keys that belong to this group\n const relevantColumns = this.getGroupColumnKeys(groupKey, aggregations);\n \n // Aggregate values across all rows and relevant columns\n let allValues: number[] = [];\n \n data.forEach(row => {\n relevantColumns.forEach(columnKey => {\n const value = row[columnKey];\n if (typeof value === 'number' && !isNaN(value)) {\n allValues.push(value);\n }\n });\n });\n \n return this.applyAggregationFunction(aggregationFunc, allValues);\n }\n\n /**\n * Get column keys that belong to a specific group\n */\n private getGroupColumnKeys(groupKey: string, aggregations: any[]): string[] {\n // This is a simplified implementation\n // In a real scenario, you'd map the groupKey to actual column keys\n const group = this.columnGroupState[groupKey];\n if (!group) return [];\n \n // For now, return a pattern-based approach\n // This would need to be enhanced based on actual column generation logic\n const groupField = groupKey.split('_level_')[0];\n return aggregations.map(agg => `${groupField}_${agg.name}`);\n }\n\n /**\n * Get first child value for a column group\n */\n private getFirstChildValue(groupKey: string, data: PivotRow[]): any {\n const relevantColumns = this.getGroupColumnKeys(groupKey, []);\n if (relevantColumns.length === 0 || data.length === 0) return null;\n \n return data[0][relevantColumns[0]] || null;\n }\n\n /**\n * Get count of non-null values in a column group\n */\n private getGroupValueCount(groupKey: string, data: PivotRow[]): number {\n const relevantColumns = this.getGroupColumnKeys(groupKey, []);\n \n let count = 0;\n data.forEach(row => {\n relevantColumns.forEach(columnKey => {\n if (row[columnKey] != null && row[columnKey] !== '') {\n count++;\n }\n });\n });\n \n return count;\n }\n\n /**\n * Get current column group state\n */\n getColumnGroupState(): PivotColumnGroupState {\n return { ...this.columnGroupState };\n }\n\n /**\n * Set column group state (for restoring state)\n */\n setColumnGroupState(state: PivotColumnGroupState): void {\n this.columnGroupState = { ...state };\n }\n\n /**\n * Calculate rowspan information for pivot rows to merge cells with same values\n * in earlier dimensions\n */\n calculateRowspanInfo(pivotRows: PivotRow[], rowDimensions: string[]): Map<string, { rowspan: number; skip: boolean; parentSpan: number }> {\n const rowspanInfo = new Map<string, { rowspan: number; skip: boolean; parentSpan: number }>();\n if (rowDimensions.length <= 1) {\n // No rowspan needed for single dimension\n return rowspanInfo;\n }\n \n for (let dimIndex = 0; dimIndex < rowDimensions.length - 1; dimIndex++) {\n const dimension = rowDimensions[dimIndex];\n let currentRowIndex = 0;\n \n while (currentRowIndex < pivotRows.length) {\n const currentRow = pivotRows[currentRowIndex];\n const currentValue = currentRow[dimension];\n // Skip subtotal and grand total rows for rowspan calculation\n if (currentRow._isSubtotal || currentRow._isGrandTotal) {\n currentRowIndex++;\n continue;\n }\n \n // Count consecutive rows with the same value for this dimension\n let spanCount = 1;\n let nextRowIndex = currentRowIndex + 1;\n \n while (nextRowIndex < pivotRows.length) {\n const nextRow = pivotRows[nextRowIndex];\n \n // Stop if we hit a subtotal or grand total row\n if (nextRow._isSubtotal || nextRow._isGrandTotal) {\n break;\n }\n \n // Check if this dimension value matches\n if (nextRow[dimension] === currentValue) {\n spanCount++;\n nextRowIndex++;\n } else {\n break;\n }\n }\n \n // Only add rowspan if we have more than one row to span\n if (spanCount > 1) {\n // First row gets the rowspan\n const firstRowKey = `${currentRowIndex}_${dimension}`;\n rowspanInfo.set(firstRowKey, { rowspan: spanCount, skip: false, parentSpan: spanCount });\n \n // Subsequent rows should be skipped (hidden)\n for (let i = 1; i < spanCount; i++) {\n const skipRowKey = `${currentRowIndex + i}_${dimension}`;\n rowspanInfo.set(skipRowKey, { rowspan: 0, skip: true, parentSpan: spanCount-i });\n }\n }\n \n // Move to the next group\n currentRowIndex = nextRowIndex;\n }\n }\n return rowspanInfo;\n }\n\n /**\n * Insert column subtotal headers at the correct positions within each priority group\n */\n private insertColumnSubtotalHeaders(\n headerRows: PivotColumnHeader[][],\n columnDimensions: string[],\n aggregations: any[],\n gridConfiguration?: GridConfiguration,\n sourceData?: any[]\n ): void {\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n\n if (!enableColumnSubtotals || columnDimensions.length <= 1) {\n return;\n }\n\n // N-DIMENSIONAL APPROACH: Get subtotal dimensions (all except last)\n const subtotalDimensions = columnDimensions.slice(0, -1);\n \n // Extract unique values for each subtotal dimension dynamically\n const dimensionValues = subtotalDimensions.map((dimension: string) => {\n const values = new Set<string>();\n \n if (sourceData && sourceData.length > 0) {\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n if (value) {\n values.add(value);\n }\n });\n }\n \n return Array.from(values).sort();\n });\n\n // Generate hierarchical combinations for subtotal headers (same as data subtotals)\n const subtotalCombinations = this.generateHierarchicalSubtotalCombinations(dimensionValues);\n \n // Process each header row that needs subtotal headers\n for (let rowIndex = 1; rowIndex < headerRows.length; rowIndex++) {\n // Get subtotal combinations for this specific row level\n const rowSubtotals = subtotalCombinations.filter(combination => combination.length === rowIndex);\n \n if (rowSubtotals.length === 0) continue;\n \n // Create subtotal headers for this row\n const subtotalHeadersForRow: Array<{header: PivotColumnHeader, insertPosition: number}> = [];\n \n rowSubtotals.forEach(combination => {\n const combinationKey = combination.join('|');\n const combinationLabel = combination.join(' ');\n const parentValue = combination.length > 1 ? combination.slice(0, -1).join('+') : undefined;\n \n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalHeader: PivotColumnHeader = {\n name: `_${combinationKey}_subtotal_${aggregation.name}`,\n label: `${combinationLabel} Subtotal - ${aggregation.label || aggregation.name}`,\n level: combination.length,\n colspan: 1,\n rowspan: 1,\n parentValue: parentValue,\n isSubtotal: true,\n subtotalLevel: combination.length - 1\n };\n \n // Find the correct insertion position for this subtotal header\n const insertPosition = this.findSubtotalInsertPosition(\n headerRows[rowIndex], \n subtotalHeader, \n combination, \n subtotalPositionColumn\n );\n \n \n subtotalHeadersForRow.push({ header: subtotalHeader, insertPosition });\n }\n });\n });\n \n // Sort by insertion position (highest to lowest to avoid index shifting)\n subtotalHeadersForRow.sort((a, b) => b.insertPosition - a.insertPosition);\n \n // Insert all subtotal headers at their correct positions\n subtotalHeadersForRow.forEach(({ header, insertPosition }) => {\n headerRows[rowIndex].splice(insertPosition, 0, header);\n });\n }\n }\n\n /**\n * Find the correct insertion position for a subtotal header based on parentValue and position config\n */\n private findSubtotalInsertPosition(\n headerRow: PivotColumnHeader[],\n subtotalHeader: PivotColumnHeader,\n combination: string[],\n subtotalPositionColumn: 'before' | 'after'\n ): number {\n console.log(`🔍 Finding position for combination [${combination.join(', ')}] in row with ${headerRow.length} headers`);\n console.log(` Looking for parentValue match. Subtotal parentValue: \"${subtotalHeader.parentValue}\"`);\n const headerSample = headerRow.slice(0, 10).map(h => `{name:\"${h.name}\", label:\"${h.label}\", parentValue:\"${h.parentValue}\"}`);\n console.log(` First 10 headers: ${headerSample.join(' | ')}`);\n // For single dimension subtotals (e.g., [\"Low\"]), find position relative to parent group\n if (combination.length === 1) {\n const dimensionValue = combination[0]; // e.g., \"Low\"\n \n // Find the range of headers that belong to this dimension value\n // Look for headers with parentValue matching this dimension value\n let startIndex = -1;\n let endIndex = -1;\n \n for (let i = 0; i < headerRow.length; i++) {\n const header = headerRow[i];\n \n // Check if this header belongs to our dimension group\n // For level 1 subtotals, we look for headers that have this dimension as their parent\n if (header.parentValue === dimensionValue) {\n if (startIndex === -1) startIndex = i;\n endIndex = i;\n }\n }\n \n if (startIndex !== -1) {\n // Found the range - insert based on position config\n if (subtotalPositionColumn === 'before') {\n return startIndex; // Insert before the group starts\n } else {\n return endIndex + 1; // Insert after the group ends\n }\n }\n \n // Fallback: if no parent match found, append at end\n return headerRow.length;\n }\n \n // For multi-dimension subtotals (e.g., [\"Low\", \"0\"]), find position relative to exact parent match\n else {\n const fullParentValueKey = combination.join('+'); // e.g., \"Low+0\" from [\"Low\", \"0\"]\n \n // Find headers that match the exact parent hierarchy\n let matchStart = -1;\n let matchEnd = -1;\n \n for (let i = 0; i < headerRow.length; i++) {\n const header = headerRow[i];\n \n // Check if this header belongs to our specific parent combination\n console.log(` Checking header ${i}: parentValue=\"${header.parentValue}\" vs expected=\"${fullParentValueKey}\"`);\n if (header.parentValue === fullParentValueKey) {\n if (matchStart === -1) matchStart = i;\n matchEnd = i;\n }\n }\n \n if (matchStart !== -1) {\n if (subtotalPositionColumn === 'before') {\n return matchStart;\n } else {\n return matchEnd + 1;\n }\n }\n \n // Fallback: append at end\n return headerRow.length;\n }\n }\n}","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { \n Field, \n Row, \n RowGroup, \n GridConfiguration, \n GridMode,\n GridFeatures,\n PivotConfiguration,\n PivotResult,\n PivotDrilldown,\n PivotRow\n} from '../model/grid.model';\nimport { delay, of, Observable } from 'rxjs';\nimport { GridConfigService } from '../services/grid-config.service';\nimport { PivotTransformService } from '../services/pivot-transform.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EruGridStore {\n // Inject services\n private readonly gridConfigService = inject(GridConfigService);\n private readonly pivotTransformService = inject(PivotTransformService);\n\n // State signals\n private readonly _columns = signal<Field[]>([]);\n private readonly _groups = signal<RowGroup[]>([]);\n private readonly _rows = signal<Row[]>([]);\n private readonly _selectedRowIds = signal<Set<string>>(new Set());\n private readonly _configuration = signal<GridConfiguration>({\n mode: 'table',\n fields: [],\n config: {\n editable: true,\n columnResizable: true,\n columnReorderable: true,\n cellSelection: true,\n rowSelection: true,\n exportable: true,\n filtering: true,\n showColumnLines: true,\n showRowLines: true,\n }\n });\n private readonly _isLoading = signal<boolean>(false);\n private readonly _error = signal<string | null>(null);\n private readonly _activeCell = signal<any>(null);\n \n // Pivot-specific signals\n private readonly _pivotConfiguration = signal<PivotConfiguration | null>(null);\n private readonly _pivotResult = signal<PivotResult | null>(null);\n private readonly _pivotDrilldown = signal<PivotDrilldown | null>(null);\n // Computed signals\n readonly columns = this._columns.asReadonly();\n readonly groups = this._groups.asReadonly();\n readonly rows = this._rows.asReadonly();\n readonly selectedRowIds = this._selectedRowIds.asReadonly();\n readonly configuration = this._configuration.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly error = this._error.asReadonly();\n readonly activeCell = this._activeCell.asReadonly();\n \n // Pivot-specific readonly signals\n readonly pivotConfiguration = this._pivotConfiguration.asReadonly();\n readonly pivotResult = this._pivotResult.asReadonly();\n readonly pivotDrilldown = this._pivotDrilldown.asReadonly();\n // Computed properties\n readonly selectedRows = computed(() => \n this.rows().filter(row => this.selectedRowIds().has(row.entity_id))\n );\n\n readonly totalSelectedCount = computed(() => this.selectedRowIds().size);\n\n readonly hasSelection = computed(() => this.selectedRowIds().size > 0);\n\n readonly expandedGroups = computed(() => \n this.groups().filter(group => group.isExpanded)\n );\n\n readonly visibleColumns = computed(() => \n this.columns().filter(col => col.field_size > 0)\n );\n\n readonly rowsByGroup = computed(() => {\n const rowMap = new Map<string,Row[]>();\n this.rows().forEach(row => {\n const groupRows = rowMap.get(row.groupId) || [];\n groupRows.push(row);\n rowMap.set(row.groupId, groupRows);\n });\n return rowMap;\n });\n\n // Pivot-specific computed properties\n readonly currentMode = computed(() => {\n const config = this.configuration();\n return config?.mode || 'table';\n });\n \n readonly isPivotMode = computed(() => this.currentMode() === 'pivot');\n \n readonly isEditingEnabled = computed(() => {\n const config = this.configuration();\n return config?.config?.editable ?? false;\n });\n \n readonly displayColumns = computed(() => {\n // In pivot mode, use pivot result columns; otherwise, use regular columns\n if (this.isPivotMode() && this.pivotResult()) {\n return this.pivotResult()!.columnDefinitions;\n }\n return this.columns();\n });\n \n readonly displayData = computed(() => {\n // In pivot mode, use pivot result data; otherwise, use rows\n if (this.isPivotMode() && this.pivotResult()) {\n return this.pivotResult()!.data;\n }\n return this.rows();\n });\n\n // Type-safe accessors for specific modes\n readonly pivotGrandTotalData = computed(() => {\n let pd: PivotRow[] = [];\n if (this.isPivotMode() && this.pivotResult()) {\n if (this.configuration().config?.enableGrandTotal) {\n if (this.configuration().config?.freezeGrandTotal) {\n if (this.configuration().config?.grandTotalPosition === 'before') {\n pd = [this.pivotResult()!.data[0]];\n } else {\n pd = [this.pivotResult()!.data[this.pivotResult()!.data.length - 1]];\n }\n }\n }\n }\n return pd;\n });\n // Type-safe accessors for specific modes\n readonly pivotDisplayData = computed(() => {\n if (this.isPivotMode() && this.pivotResult()) {\n if (this.configuration().config?.enableGrandTotal && this.configuration().config?.freezeGrandTotal) {\n if (this.configuration().config?.grandTotalPosition === 'before') {\n return this.pivotResult()!.data.slice(1);\n } else {\n return this.pivotResult()!.data;\n }\n }\n return this.pivotResult()!.data;\n }\n return [];\n });\n\n readonly tableDisplayData = computed(() => {\n if (!this.isPivotMode()) {\n return this.rows();\n }\n return [];\n });\n\n // Column methods\n setColumns(columns: Field[]) {\n // Sort columns by grid_index to ensure proper order in table mode\n const sortedColumns = [...columns].sort((a, b) => a.grid_index - b.grid_index);\n this._columns.set(sortedColumns);\n }\ngetConfiguration():GridConfiguration{\n return this.configuration();\n}\n reorderColumns(fromIndex: number, toIndex: number) {\n const currentColumns = [...this.columns()];\n \n if (fromIndex < 0 || fromIndex >= currentColumns.length || \n toIndex < 0 || toIndex >= currentColumns.length) {\n console.error('Invalid column indices', { fromIndex, toIndex });\n return;\n }\n\n const [removedColumn] = currentColumns.splice(fromIndex, 1);\n currentColumns.splice(toIndex, 0, removedColumn);\n \n // Update grid_index values to reflect new order\n const reorderedColumns = currentColumns.map((col, index) => ({\n ...col,\n grid_index: index + 1 // grid_index typically starts from 1\n }));\n \n this._columns.set(reorderedColumns);\n }\n\n updateColumnWidth(columnName: string, field_size: number) {\n const columns = this.columns().map(col => \n col.name === columnName ? { ...col, field_size: field_size } : col\n );\n this._columns.set(columns);\n }\n\n // Group methods\n setGroups(groups: RowGroup[]) {\n this._groups.set(groups);\n }\n\n toggleGroupExpansion(groupId: string) {\n const groups = this.groups().map(group => \n group.id === groupId \n ? { ...group, isExpanded: !group.isExpanded }\n : group\n );\n this._groups.set(groups);\n }\n\n updateGroupLoadingState(groupId: string, isLoading: boolean) {\n const groups = this.groups().map(group => \n group.id === groupId ? { ...group, isLoading } : group\n );\n this._groups.set(groups);\n }\n\n updateGroupAfterLoading(groupId: string, loadedCount: number, fullyExhausted = false) {\n const groups = this.groups().map(group => {\n if (group.id === groupId) {\n const newLoadedCount = (group.currentLoadedRows || 0) + loadedCount;\n return {\n ...group,\n isLoading: false,\n currentPage: (group.currentPage || 0) + 1,\n currentLoadedRows: newLoadedCount,\n hasMoreRows: fullyExhausted \n ? false \n : newLoadedCount < group.totalRowCount\n };\n }\n return group;\n });\n this._groups.set(groups);\n }\n\n // Row methods\n setRows(rows: Row[]) {\n this._rows.set(rows);\n }\n\n addRows(newRows: Row[]) {\n const rows = [...this.rows(), ...newRows];\n this._rows.set(rows);\n }\n\n updateRow(rowId: string, updates: Partial<Row>) {\n const rows = this.rows().map(row => \n row.entity_id === rowId ? { ...row, ...updates } : row\n );\n this._rows.set(rows);\n }\n\n // Selection methods\n selectRow(rowId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n selectedRowIds.add(rowId);\n this._selectedRowIds.set(selectedRowIds);\n }\n\n deselectRow(rowId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n selectedRowIds.delete(rowId);\n this._selectedRowIds.set(selectedRowIds);\n }\n\n toggleRowSelection(rowId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n if (selectedRowIds.has(rowId)) {\n selectedRowIds.delete(rowId);\n } else {\n selectedRowIds.add(rowId);\n }\n this._selectedRowIds.set(selectedRowIds);\n }\n\n selectAllRowsInGroup(groupId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n groupRows.forEach(row => selectedRowIds.add(row.entity_id));\n this._selectedRowIds.set(selectedRowIds);\n }\n\n deselectAllRowsInGroup(groupId: string) {\n const selectedRowIds = new Set(this.selectedRowIds());\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n groupRows.forEach(row => selectedRowIds.delete(row.entity_id));\n this._selectedRowIds.set(selectedRowIds);\n }\n\n clearSelection() {\n this._selectedRowIds.set(new Set<string>());\n }\n\n // Configuration methods\n setConfiguration(configuration: GridConfiguration) {\n // Ensure we create a new object reference to trigger signal updates\n const currentConfig = this.configuration();\n const newConfiguration = {\n ...currentConfig,\n ...configuration,\n // Preserve existing config properties that are not provided in the new configuration\n config: {\n ...currentConfig.config,\n ...configuration.config\n },\n // Preserve existing styles if not provided\n styles: configuration.styles ? { ...configuration.styles } : currentConfig.styles,\n // Completely replace data with what's passed (even if undefined)\n data: configuration.data\n };\n \n this._configuration.set(this.validateAndEnforceConfiguration(newConfiguration));\n \n this.setColumns(configuration.fields);\n }\n/**\n * Validates and enforces rules for grid configuration\n */\nvalidateAndEnforceConfiguration(config: GridConfiguration): GridConfiguration {\n const validatedConfig = { ...config };\n\n // Enforce mode-specific rules\n if (config.mode === 'pivot') {\n // Force disable editing for pivot mode\n validatedConfig.config = {\n ...config.config,\n editable: false, // Must be false for pivot\n columnReorderable: false // Breaks pivot structure\n };\n\n // Ensure pivot configuration exists with defaults\n if (!validatedConfig.pivot) {\n validatedConfig.pivot = {\n rows: [],\n cols: [],\n aggregations: [],\n clientSideThreshold: 10000\n };\n } else {\n // Ensure default values for optional properties\n validatedConfig.pivot = {\n ...validatedConfig.pivot,\n clientSideThreshold: validatedConfig.pivot.clientSideThreshold ?? 10000\n };\n }\n }\n\n return validatedConfig;\n}\n /**\n * Update specific configuration properties\n * This method ensures proper signal updates for nested properties\n */\n updateConfigurationProperties(updates: Partial<GridConfiguration['config']>) {\n const currentConfig = this.configuration();\n const newConfig = {\n ...currentConfig,\n config: {\n ...currentConfig.config,\n ...updates\n }\n };\n this._configuration.set(newConfig);\n }\n\n /**\n * Update grid lines configuration\n * This method specifically handles grid lines updates\n */\n updateGridLines(showColumnLines?: boolean, showRowLines?: boolean) {\n const updates: Partial<GridConfiguration['config']> = {};\n if (showColumnLines !== undefined) {\n updates.showColumnLines = showColumnLines;\n }\n if (showRowLines !== undefined) {\n updates.showRowLines = showRowLines;\n }\n this.updateConfigurationProperties(updates);\n }\n\n gridConfiguration(): GridConfiguration {\n return this.configuration();\n }\n\n // Active cell methods\n setActiveCell(activeCell: any) {\n this._activeCell.set(activeCell);\n }\n\n // Loading and error methods\n setLoading(isLoading: boolean) {\n this._isLoading.set(isLoading);\n }\n\n setError(error: string | null) {\n this._error.set(error);\n }\n\n // Data fetching method\n fetchNewRowData(pageSize: number, page: number, group: RowGroup): Observable<any[]> {\n const startIndex = (group.currentPage || 0) * pageSize;\n const endIndex = startIndex + pageSize;\n const data = this.configuration().data?.slice(startIndex, endIndex) || [];\n return of(data).pipe(delay(1000));\n }\n\n // Helper methods\n isRowSelected(rowId: string): boolean {\n return this.selectedRowIds().has(rowId);\n }\n\n isGroupSelected(groupId: string): boolean {\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n return groupRows.length > 0 && \n groupRows.every(row => this.selectedRowIds().has(row.entity_id));\n }\n\n getRowsForGroup(groupId: string): Row[] {\n return this.rows().filter(row => row.groupId === groupId);\n }\n\n // Pivot methods\n setGridMode(mode: GridMode) {\n const currentConfig = this.configuration();\n const newConfig = {\n ...currentConfig,\n mode\n };\n // Validate and enforce mode-specific rules\n this._configuration.set(this.validateAndEnforceConfiguration(newConfig));\n if (mode === 'pivot') {\n // Extract and set pivot configuration from main configuration\n if (currentConfig.pivot) {\n this._pivotConfiguration.set(currentConfig.pivot);\n }\n this.transformToPivot();\n }\n }\n\n updateGridConfiguration(updates: Partial<GridConfiguration>) {\n const currentConfig = this.configuration();\n const mergedConfig = {\n ...currentConfig,\n ...updates,\n // Merge nested config object properly\n config: {\n ...currentConfig.config,\n ...updates.config\n }\n };\n // Validate and enforce mode-specific rules\n this._configuration.set(this.validateAndEnforceConfiguration(mergedConfig));\n }\n\n setPivotConfiguration(pivotConfig: PivotConfiguration) {\n this._pivotConfiguration.set(pivotConfig);\n // Also store in the main configuration for consistency\n this.updateGridConfiguration({ pivot: pivotConfig });\n // Auto-switch to pivot mode if pivot configuration is provided\n if (this.currentMode() !== 'pivot') {\n this.setGridMode('pivot');\n }\n // Transform data if source data is available in gridConfiguration.data\n if ((this.configuration().data || []).length > 0) {\n this.transformToPivot();\n }\n }\n\n setSourceData(data: any[]) {\n // Store data in gridConfiguration.data instead of separate signal\n this.updateGridConfiguration({ data });\n // If in pivot mode and pivot configuration exists, transform data\n if (this.isPivotMode() && this.pivotConfiguration()) {\n this.transformToPivot();\n }\n }\n\n private transformToPivot() {\n const pivotConfig = this.pivotConfiguration();\n const sourceData = this.configuration().data || [];\n \n if (!pivotConfig || sourceData.length === 0) {\n console.log('🔄 TRANSFORM DEBUG: Skipping transformation - no config or data');\n return;\n }\n\n this.setLoading(true);\n this.setError(null);\n\n try {\n // For large datasets, we could use async transformation in the future\n // For now, use synchronous transformation for all datasets\n {\n // Synchronous transformation for smaller datasets\n const result = this.pivotTransformService.transformData(sourceData, pivotConfig, this.configuration());\n this._pivotResult.set(result);\n this.setLoading(false);\n }\n } catch (error: any) {\n this.setError(`Pivot transformation failed: ${error.message}`);\n this.setLoading(false);\n }\n }\n\n clearPivot() {\n this._pivotConfiguration.set(null);\n this._pivotResult.set(null);\n this.setGridMode('table');\n }\n\n // Force refresh pivot transformation (for debugging)\n forceRefreshPivot() {\n console.log('🔄 FORCE REFRESH: Clearing pivot result and re-transforming');\n this._pivotResult.set(null);\n this.transformToPivot();\n }\n\n exportPivotToCsv(): string | null {\n const pivotResult = this.pivotResult();\n if (!pivotResult) {\n return null;\n }\n return this.pivotTransformService.exportToCsv(pivotResult);\n }\n\n validatePivotConfiguration(config: PivotConfiguration): { isValid: boolean; errors: string[] } {\n return this.gridConfigService.validatePivotConfiguration(config);\n }\n\n isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean {\n const config = this.configuration();\n return Boolean(config.config?.[feature] ?? false);\n }\n\n // Collapsible columns support\n \n /**\n * Get access to the PivotTransformService for external manipulation\n */\n getPivotTransformService(): PivotTransformService {\n return this.pivotTransformService;\n }\n\n /**\n * Regenerate pivot data (useful after column group state changes)\n */\n regeneratePivotData() {\n if (this.isPivotMode() && this.pivotConfiguration() && (this.configuration().data || []).length > 0) {\n this.transformToPivot();\n }\n }\n\n /**\n * Update pivot configuration and regenerate if needed\n */\n updatePivotConfiguration(updates: Partial<PivotConfiguration>) {\n const currentConfig = this.pivotConfiguration();\n if (currentConfig) {\n const updatedConfig = { ...currentConfig, ...updates };\n this.setPivotConfiguration(updatedConfig);\n }\n }\n\n /**\n * Check if freeze is enabled and valid for current mode\n */\n isFreezeEnabled(): boolean {\n const freezeField = this.configuration().config?.freezeField;\n if (!freezeField) {\n return false;\n }\n\n if (this.isPivotMode()) {\n return this.isValidPivotFreezeField(freezeField);\n }\n \n // For table mode, any column can be frozen\n return this.displayColumns().some(col => col.name === freezeField);\n }\n\n /**\n * Validate freeze field for pivot mode\n */\n private isValidPivotFreezeField(freezeField: string): boolean {\n const pivotConfig = this.pivotConfiguration();\n if (!pivotConfig) {\n return false;\n }\n\n // Check if it's a row dimension\n if (pivotConfig.rows?.includes(freezeField)) {\n return true;\n }\n\n // Check if it's the root column dimension\n if (pivotConfig.cols?.length > 0 && pivotConfig.cols[0] === freezeField) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get the freeze field name\n */\n getFreezeField(): string | null {\n return this.configuration().config?.freezeField || null;\n }\n\n /**\n * Check if freeze header is enabled\n */\n isFreezeHeaderEnabled(): boolean {\n return this.configuration().config?.freezeHeader ?? false;\n }\n\n /**\n * Check if freeze grand total is enabled\n */\n isFreezeGrandTotalEnabled(): boolean {\n return this.configuration().config?.freezeGrandTotal ?? false;\n }\n setPivotDrilldown(drilldown: PivotDrilldown,columnValues:string) {\n if (drilldown.frozenGrandTotalCell) {\n drilldown.rowData = this.pivotGrandTotalData()[0]\n } else {\n drilldown.rowData = this.pivotDisplayData()[parseInt(drilldown.rowId)]\n }\n \n const columnValuesArray = columnValues.split('|')\n const cols = this.configuration()?.pivot?.cols\n columnValuesArray.forEach((value,index)=>{\n drilldown.rowData[cols![index]] = value\n })\n this._pivotDrilldown.set(drilldown);\n }\n clearPivotDrilldown() {\n this._pivotDrilldown.set(null);\n }\n}","import { Injectable, signal, effect, inject, DOCUMENT } from '@angular/core';\n\n\nexport type Theme = 'light' | 'dark' | 'high-contrast' | 'auto';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n private document = inject(DOCUMENT) as Document;\n private readonly storageKey = 'eru-grid-theme';\n \n // Theme state\n private readonly _currentTheme = signal<Theme>('auto');\n private readonly _systemTheme = signal<'light' | 'dark'>('light');\n \n // Public readonly signals\n readonly currentTheme = this._currentTheme.asReadonly();\n readonly systemTheme = this._systemTheme.asReadonly();\n \n // Computed effective theme\n readonly effectiveTheme = signal<'light' | 'dark' | 'high-contrast'>('light');\n \n constructor() {\n // Initialize theme from localStorage or default to auto\n this.initializeTheme();\n \n // Listen for system theme changes\n this.setupSystemThemeListener();\n \n // Apply theme changes to DOM\n effect(() => {\n this.applyTheme();\n });\n }\n \n private initializeTheme() {\n const savedTheme = localStorage.getItem(this.storageKey) as Theme;\n if (savedTheme && ['light', 'dark', 'high-contrast', 'auto'].includes(savedTheme)) {\n this._currentTheme.set(savedTheme);\n }\n \n // Detect initial system theme\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n this._systemTheme.set(prefersDark ? 'dark' : 'light');\n }\n \n private setupSystemThemeListener() {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n \n const handleChange = (e: MediaQueryListEvent) => {\n this._systemTheme.set(e.matches ? 'dark' : 'light');\n };\n \n mediaQuery.addEventListener('change', handleChange);\n \n // Cleanup listener on service destroy would go here if needed\n }\n \n private applyTheme() {\n const theme = this._currentTheme();\n const systemTheme = this._systemTheme();\n \n // Determine effective theme\n let effectiveTheme: 'light' | 'dark' | 'high-contrast';\n \n if (theme === 'auto') {\n effectiveTheme = systemTheme;\n } else if (theme === 'high-contrast') {\n effectiveTheme = 'high-contrast';\n } else {\n effectiveTheme = theme;\n }\n \n this.effectiveTheme.set(effectiveTheme);\n \n // Apply theme classes to body\n const body = this.document.body;\n \n // Remove existing theme classes\n body.classList.remove('eru-grid-light', 'eru-grid-dark', 'eru-grid-high-contrast');\n \n // Add new theme class\n body.classList.add(`eru-grid-${effectiveTheme}`);\n \n // Update CSS custom properties for theme\n this.updateCSSVariables(effectiveTheme);\n }\n \n private updateCSSVariables(theme: 'light' | 'dark' | 'high-contrast') {\n const root = this.document.documentElement;\n \n // Theme-specific CSS variables can be set here\n // The main theme variables are already defined in theme.scss\n // This is for any dynamic adjustments\n \n if (theme === 'high-contrast') {\n root.style.setProperty('--grid-outline', '#000000');\n root.style.setProperty('--grid-on-surface', '#000000');\n } else {\n // Reset to default values (handled by CSS)\n root.style.removeProperty('--grid-outline');\n root.style.removeProperty('--grid-on-surface');\n }\n }\n \n // Public methods\n setTheme(theme: Theme) {\n this._currentTheme.set(theme);\n localStorage.setItem(this.storageKey, theme);\n }\n \n toggleTheme() {\n const current = this._currentTheme();\n const next = current === 'light' ? 'dark' : 'light';\n this.setTheme(next);\n }\n \n getAvailableThemes(): Array<{value: Theme, label: string}> {\n return [\n { value: 'auto', label: 'Auto' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n { value: 'high-contrast', label: 'High Contrast' }\n ];\n }\n \n // Theme detection utilities\n isLightTheme(): boolean {\n return this.effectiveTheme() === 'light';\n }\n \n isDarkTheme(): boolean {\n return this.effectiveTheme() === 'dark';\n }\n \n isHighContrastTheme(): boolean {\n return this.effectiveTheme() === 'high-contrast';\n }\n \n isAutoTheme(): boolean {\n return this._currentTheme() === 'auto';\n }\n}","import { Injectable } from '@angular/core';\nimport { DataTypes, ColumnWidthConstraints, GridConfiguration, Field } from '../model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColumnConstraintsService {\n \n // Sensible defaults for each datatype\n private readonly DATATYPE_DEFAULTS: Record<DataTypes, ColumnWidthConstraints> = {\n textbox: { minWidth: 80, maxWidth: 400 },\n email: { minWidth: 120, maxWidth: 300 },\n location: { minWidth: 100, maxWidth: 250 },\n number: { minWidth: 60, maxWidth: 150 },\n currency: { minWidth: 80, maxWidth: 150 },\n date: { minWidth: 100, maxWidth: 180 },\n dropdown_single_select: { minWidth: 80, maxWidth: 200 },\n dropdown_multi_select: { minWidth: 100, maxWidth: 250 },\n checkbox: { minWidth: 40, maxWidth: 60 },\n people: { minWidth: 100, maxWidth: 200 },\n phone: { minWidth: 120, maxWidth: 180 },\n priority: { minWidth: 80, maxWidth: 150 },\n status: { minWidth: 80, maxWidth: 150 },\n progress: { minWidth: 100, maxWidth: 200 },\n attachment: { minWidth: 60, maxWidth: 100 },\n tags: { minWidth: 100, maxWidth: 300 }\n };\n\n /**\n * Get effective constraints for a column, considering all override levels\n */\n getColumnConstraints(column: Field | undefined, gridConfig?: GridConfiguration): ColumnWidthConstraints {\n // Start with datatype defaults (fallback to generic if column is undefined)\n const datatype = column?.datatype as DataTypes;\n const datatypeDefaults = datatype && datatype in this.DATATYPE_DEFAULTS ? \n this.DATATYPE_DEFAULTS[datatype] :\n { minWidth: 60, maxWidth: 300 };\n \n // Apply global config overrides\n const globalConstraints = gridConfig?.columnConstraints?.global || {};\n \n // Apply datatype-specific config overrides\n const datatypeConfigConstraints = datatype && gridConfig?.columnConstraints?.byDatatype?.[datatype] ? \n gridConfig.columnConstraints.byDatatype[datatype] :\n {};\n \n // Apply column-specific overrides (highest priority)\n const columnSpecificConstraints = {\n minWidth: column?.minWidth,\n maxWidth: column?.maxWidth\n };\n\n // Merge in priority order (column-specific > datatype-config > global > datatype-defaults)\n return {\n minWidth: columnSpecificConstraints.minWidth ?? \n datatypeConfigConstraints.minWidth ?? \n globalConstraints.minWidth ?? \n datatypeDefaults.minWidth,\n maxWidth: columnSpecificConstraints.maxWidth ?? \n datatypeConfigConstraints.maxWidth ?? \n globalConstraints.maxWidth ?? \n datatypeDefaults.maxWidth\n };\n }\n\n /**\n * Validate and constrain a width value for a column\n */\n constrainWidth(width: number, column: Field | undefined, gridConfig?: GridConfiguration): number {\n const constraints = this.getColumnConstraints(column, gridConfig);\n \n if (constraints.minWidth && width < constraints.minWidth) {\n return constraints.minWidth;\n }\n \n if (constraints.maxWidth && width > constraints.maxWidth) {\n return constraints.maxWidth;\n }\n \n return width;\n }\n\n /**\n * Get all datatype defaults (for documentation/debugging)\n */\n getDatatypeDefaults(): Record<DataTypes, ColumnWidthConstraints> {\n return { ...this.DATATYPE_DEFAULTS };\n }\n}","import { Injectable } from '@angular/core';\nimport { EruGridStore } from './stores/grid.store';\nimport { ThemeService } from './services/theme.service';\nimport { ColumnConstraintsService } from './services/column-constraints.service';\nimport { \n Field, \n RowGroup, \n GridConfiguration, \n PivotConfiguration, \n GridMode,\n DataTypes,\n GridFeatures\n} from './model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EruGridService {\n\n constructor(\n private eruGridStore: EruGridStore,\n private themeService: ThemeService,\n private columnConstraintsService: ColumnConstraintsService\n ) { }\n \n set_table_configuration(data: GridConfiguration) {\n this.eruGridStore.setConfiguration(data);\n \n }\n \n /* set_table_column(data: Field[]) {\n this.gridStore.setColumns(data);\n } */\n \n set_table_group(data: RowGroup[]) {\n this.eruGridStore.setGroups(data);\n }\n \n // Expose additional methods for external use\n get columns() {\n return this.eruGridStore.columns;\n }\n \n get groups() {\n return this.eruGridStore.groups;\n }\n \n get rows() {\n return this.eruGridStore.rows;\n }\n \n get selectedRowIds() {\n return this.eruGridStore.selectedRowIds;\n }\n \n get hasSelection() {\n return this.eruGridStore.hasSelection;\n }\n \n // Theme management\n get theme() {\n return this.themeService;\n }\n \n // Column constraints management\n getColumnConstraints(column: Field | undefined) {\n return this.columnConstraintsService.getColumnConstraints(column, this.eruGridStore.gridConfiguration());\n }\n \n constrainColumnWidth(width: number, column: Field | undefined) {\n return this.columnConstraintsService.constrainWidth(width, column, this.eruGridStore.gridConfiguration());\n }\n \n getDatatypeDefaults() {\n return this.columnConstraintsService.getDatatypeDefaults();\n }\n\n // Pivot functionality methods\n \n /**\n * Configure the grid for pivot mode with pivot configuration\n */\n set_pivot_configuration(pivotConfig: PivotConfiguration, sourceData?: any[]) {\n this.eruGridStore.setPivotConfiguration(pivotConfig);\n \n if (sourceData && sourceData.length > 0) {\n // Store data in gridConfiguration.data for unified storage\n this.eruGridStore.updateGridConfiguration({ data: sourceData });\n }\n }\n\n\n /**\n * Switch grid to table mode or pivot mode\n */\n set_grid_mode(mode: GridMode) {\n if (mode === 'pivot') {\n // Pivot configuration and data are already stored in unified locations\n this.eruGridStore.setGridMode('pivot');\n } else if (mode === 'table') {\n this.eruGridStore.clearPivot();\n }\n }\n\n /**\n * Update grid configuration with new settings\n */\n update_grid_configuration(updates: Partial<GridConfiguration>) {\n console.log('🔄 update_grid_configuration from service:', updates);\n this.eruGridStore.updateGridConfiguration(updates);\n }\n\n /**\n * Enable or disable specific grid features\n */\n set_grid_features(features: Partial<GridFeatures>) {\n console.log('🔄 set_grid_features from service:', features);\n const currentConfig = this.eruGridStore.configuration();\n this.eruGridStore.updateGridConfiguration({\n config: {\n ...currentConfig.config,\n ...features\n }\n });\n }\n\n /**\n * Clear pivot configuration and return to table mode\n */\n clear_pivot() {\n this.eruGridStore.clearPivot();\n }\n\n /**\n * Export pivot data to CSV format\n */\n export_pivot_to_csv(): string | null {\n return this.eruGridStore.exportPivotToCsv();\n }\n\n /**\n * Validate pivot configuration\n */\n validate_pivot_configuration(config: PivotConfiguration): { isValid: boolean; errors: string[] } {\n return this.eruGridStore.validatePivotConfiguration(config);\n }\n\n // Getters for pivot functionality\n \n get currentMode() {\n return this.eruGridStore.currentMode;\n }\n\n get isPivotMode() {\n return this.eruGridStore.isPivotMode;\n }\n\n get pivotConfiguration() {\n return this.eruGridStore.pivotConfiguration;\n }\n\n get pivotResult() {\n return this.eruGridStore.pivotResult;\n }\n\n get displayColumns() {\n return this.eruGridStore.displayColumns;\n }\n\n get displayData() {\n return this.eruGridStore.displayData;\n }\n\n get isEditingEnabled() {\n return this.eruGridStore.isEditingEnabled;\n }\n\n get configuration() {\n return this.eruGridStore.configuration;\n }\n\n get isLoading() {\n return this.eruGridStore.isLoading;\n }\n\n get error() {\n return this.eruGridStore.error;\n }\n\n /**\n * Check if a specific feature is enabled\n */\n isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean {\n return this.eruGridStore.isFeatureEnabled(feature);\n }\n\n /**\n * Get direct access to grid store (for debugging purposes)\n */\n getGridStore() {\n return this.eruGridStore;\n }\n}\n","import { Directive, ElementRef, OnInit, Renderer2 } from '@angular/core';\nimport { MAT_DATE_FORMATS, NativeDateAdapter, DateAdapter } from '@angular/material/core';\n\nclass CustomDateAdapter extends NativeDateAdapter {\n override format(date: Date, displayFormat: Object): string {\n if (displayFormat === 'input') {\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n return `${this.pad(day)}-${this.pad(month)}-${year}`;\n }\n return date.toDateString();\n }\n\n private pad(n: number): string {\n return n < 10 ? '0' + n : n.toString();\n }\n}\n\n@Directive({\n selector: '[appCustomDatePicker]',\n standalone: true,\n providers: [\n {\n provide: DateAdapter,\n useClass: CustomDateAdapter\n },\n {\n provide: MAT_DATE_FORMATS,\n useValue: {\n parse: {\n dateInput: 'dd-MM-yyyy',\n },\n display: {\n dateInput: 'input',\n monthYearLabel: 'MMM yyyy',\n dateA11yLabel: 'dd-MM-yyyy',\n monthYearA11yLabel: 'MMMM yyyy',\n },\n },\n },\n ],\n})\nexport class CustomDatePickerDirective implements OnInit {\n constructor(\n private el: ElementRef,\n private renderer: Renderer2,\n private dateAdapter: DateAdapter<Date>\n ) {\n this.dateAdapter.setLocale('en-GB');\n }\n\n ngOnInit() {\n this.renderer.setAttribute(this.el.nativeElement, 'placeholder', 'dd-mm-yyyy');\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n\nexport interface ValidationResult {\n isValid: boolean;\n error?: string;\n}\n\ntype ValidatorFn<T = any> = (value: any, config: T) => ValidationResult;\n\nexport const CELL_VALIDATORS = new InjectionToken<Record<any, ValidatorFn>>('CELL_VALIDATORS');\n\nexport const cellValidators: Partial<Record<any, ValidatorFn>> = {\n textbox: (value: string, config: any): ValidationResult => {\n if (config.mandatory && !value) {\n return { isValid: false, error: `${config.label} is required` };\n }\n\n if (value?.length > 0) {\n const length = Number(config.data_length);\n // Add length validation logic\n }\n\n return { isValid: true };\n },\n \n email: (value: string, config: any): ValidationResult => {\n if (config.mandatory && !value) {\n return { isValid: false, error: `${config.label} is required` };\n }\n\n if (value && value.length > 0) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return { isValid: false, error: 'Invalid email format' };\n }\n }\n\n return { isValid: true };\n },\n \n location: (value: string, config: any): ValidationResult => {\n if (config.mandatory && !value) {\n return { isValid: false, error: `${config.label} is required` };\n }\n\n return { isValid: true };\n },\n \n number: (value: number, config: any): ValidationResult => {\n if (config.mandatory && (value === null || value === undefined || isNaN(value))) {\n return { isValid: false, error: `${config.label} is mandatory` };\n }\n // Add number validation logic\n return { isValid: true };\n },\n \n currency: (value: number, config: any): ValidationResult => {\n if (config.mandatory && (value === null || value === undefined || isNaN(value))) {\n return { isValid: false, error: `${config.label} is mandatory` };\n }\n // Add currency validation logic\n return { isValid: true };\n }\n}; ","export interface CountryCode {\n name: string;\n code: string;\n dial_code: string;\n flag: string;\n}\n\nexport const COUNTRY_CODES: CountryCode[] = [\n { \n name: 'United States', \n code: 'US', \n dial_code: '+1', \n flag: '🇺🇸' \n },\n { \n name: 'India', \n code: 'IN', \n dial_code: '+91', \n flag: '🇮🇳' \n },\n { \n name: 'United Kingdom', \n code: 'GB', \n dial_code: '+44', \n flag: '🇬🇧' \n },\n { \n name: 'Canada', \n code: 'CA', \n dial_code: '+1', \n flag: '🇨🇦' \n },\n { \n name: 'Australia', \n code: 'AU', \n dial_code: '+61', \n flag: '🇦🇺' \n }\n]; ","import { \n Component, \n forwardRef, \n Input, \n OnInit, \n signal, \n computed,\n inject\n} from '@angular/core';\nimport { \n ControlValueAccessor, \n NG_VALUE_ACCESSOR, \n ReactiveFormsModule, \n FormControl, \n Validators,\n FormsModule\n} from '@angular/forms';\nimport { COUNTRY_CODES, CountryCode } from './country-data';\nimport { NgFor, NgIf, NgClass } from '@angular/common';\nimport { \n CdkMenuModule, \n CdkMenuTrigger \n} from '@angular/cdk/menu';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'app-mobile-input',\n standalone: true,\n imports: [\n ReactiveFormsModule, \n FormsModule,\n NgFor, \n NgIf,\n NgClass,\n CdkMenuModule\n ],\n template: `\n <div class=\"mobile-input-container\">\n <button \n [cdkMenuTriggerFor]=\"countryCodeMenu\"\n cdkMenuTrigger\n class=\"country-code-trigger\"\n >\n {{selectedCountry().flag}} {{selectedCountry().dial_code}}\n </button>\n\n <input \n type=\"tel\"\n [formControl]=\"phoneNumberControl\"\n (input)=\"onPhoneNumberInput($event)\"\n placeholder=\"Enter phone number\"\n class=\"phone-number-input\"\n />\n\n <ng-template #countryCodeMenu>\n <div class=\"dropdown-menu\" cdkMenu>\n <div class=\"listbox-container\">\n <label class=\"listbox-label\">\n <input \n type=\"search\" \n placeholder=\"Search country...\" \n [(ngModel)]=\"searchText\"\n >\n </label>\n\n <div \n cdkMenu \n role=\"listbox\"\n class=\"listbox\"\n >\n @for (country of filteredCountries(); track country.code) {\n <div \n cdkMenuItem\n (click)=\"selectCountry(country.code)\"\n class=\"listbox-option\"\n role=\"option\"\n >\n <span>{{country.flag}} {{country.name}} ({{country.dial_code}})</span>\n </div>\n }\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n `,\n styles: [`\n .mobile-input-container {\n display: flex;\n align-items: center;\n border: 1px solid #ccc;\n border-radius: 4px;\n width: 100%;\n }\n .country-code-trigger {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n white-space: nowrap;\n }\n .phone-number-input {\n flex-grow: 1;\n border: none;\n padding: 8px;\n outline: none;\n }\n .dropdown-menu {\n background-color: #fff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px;\n }\n .listbox-container {\n width: 300px;\n }\n .listbox-label input {\n width: 100%;\n padding: 8px;\n border: 1px solid #ccc;\n border-radius: 4px;\n margin-bottom: 8px;\n }\n .listbox {\n list-style: none;\n padding: 0;\n margin: 0;\n max-height: 200px;\n overflow-y: auto;\n }\n .listbox-option {\n padding: 8px;\n cursor: pointer;\n }\n .listbox-option:hover {\n background-color: #f0f0f0;\n }\n `],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MobileInputComponent),\n multi: true\n }\n ]\n})\nexport class MobileInputComponent implements ControlValueAccessor, OnInit {\n @Input() defaultCountry: string = 'US';\n\n private sanitizer = inject(DomSanitizer);\n\n countryCodes = signal(COUNTRY_CODES);\n selectedCountry = signal(COUNTRY_CODES[0]);\n searchText = signal('');\n\n filteredCountries = computed(() => {\n const searchText = this.searchText().toLowerCase();\n return this.countryCodes().filter(country => \n country.name.toLowerCase().includes(searchText) ||\n country.dial_code.includes(searchText)\n );\n });\n\n phoneNumberControl = new FormControl('', [\n Validators.required,\n Validators.pattern(/^\\d+$/)\n ]);\n\n private onChange: any = () => {};\n private onTouched: any = () => {};\n\n ngOnInit() {\n const defaultCountry = this.countryCodes().find(\n country => country.code === this.defaultCountry\n );\n if (defaultCountry) {\n this.selectedCountry.set(defaultCountry);\n }\n\n this.phoneNumberControl.valueChanges.subscribe(value => {\n this.onChange(`${this.selectedCountry().dial_code}${value}`);\n });\n }\n\n selectCountry(countryCode: string) {\n const country = this.countryCodes().find(c => c.code === countryCode);\n if (country) {\n this.selectedCountry.set(country);\n this.searchText.set('');\n }\n }\n\n onPhoneNumberInput(event: Event) {\n const input = event.target as HTMLInputElement;\n input.value = input.value.replace(/\\D/g, '');\n }\n\n writeValue(value: string): void {\n if (value) {\n const matchedCountry = this.countryCodes().find(country => \n value.startsWith(country.dial_code)\n );\n\n if (matchedCountry) {\n this.selectedCountry.set(matchedCountry);\n const phoneNumber = value.replace(matchedCountry.dial_code, '');\n this.phoneNumberControl.setValue(phoneNumber);\n } else {\n this.phoneNumberControl.setValue(value);\n }\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n isDisabled \n ? this.phoneNumberControl.disable() \n : this.phoneNumberControl.enable();\n }\n} ","import { computed, Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OverlayMenuService {\n private _activeOverlayCellId = signal<string | null>(null);\n readonly activeOverlayCellId = computed(() => this._activeOverlayCellId());\n\n setActiveOverlayCell(cellId: string | null): void {\n this._activeOverlayCellId.set(cellId);\n }\n\n getActiveOverlayCellId(): string | null {\n return this.activeOverlayCellId();\n }\n\n isActiveOverlayCell(cellId: string): boolean {\n return this.activeOverlayCellId() === cellId;\n }\n\n closeAllOverlayMenus(): void {\n this._activeOverlayCellId.set(null);\n }\n\n showOverlayMenu(cellId: string): boolean {\n return this.activeOverlayCellId() === cellId;\n }\n\n toggleOverlayMenu(cellId: string): void {\n if (this.activeOverlayCellId() === cellId) {\n this._activeOverlayCellId.set(null);\n } else {\n this._activeOverlayCellId.set(cellId);\n }\n }\n\n closeOverlayMenu(): void {\n this._activeOverlayCellId.set(null);\n }\n} ","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n ElementRef,\n HostBinding,\n inject,\n input,\n model,\n Renderer2,\n signal,\n ViewChild,\n AfterViewInit,\n ViewEncapsulation,\n effect\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {CdkListbox, CdkOption} from '@angular/cdk/listbox';\nimport {CdkMenu, CdkMenuTrigger} from '@angular/cdk/menu';\nimport {FormsModule} from '@angular/forms';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatInput} from '@angular/material/input';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {MatIconModule} from '@angular/material/icon';\nimport {DatePipe, NgFor, NgIf} from '@angular/common';\nimport {CustomDatePickerDirective} from './custom-date-picker.directive';\nimport {MatDatepickerModule, MatDatepickerToggle} from '@angular/material/datepicker';\nimport {MatNativeDateModule} from '@angular/material/core';\nimport {CELL_VALIDATORS, cellValidators} from './data-cell.utils';\nimport {EruGridStore} from '../../stores/grid.store';\nimport {Field} from '../../model/grid.model';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { MobileInputComponent } from './mobile-input.component';\nimport { OverlayMenuService } from '../../services/overlay-menu.service';\nimport {OverlayModule} from '@angular/cdk/overlay';\n// Move the interface outside the class\nexport interface TagOption {\n value: string;\n label: string;\n}\n\n// Define an interface for tag configuration\nexport interface TagConfig {\n value?: string;\n label: string;\n}\n\n@Component({\n selector: 'data-cell',\n templateUrl: './data-cell.component.html',\n styleUrls: ['./data-cell.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n CommonModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatSliderModule,\n MatIconModule,\n CdkMenuTrigger,\n FormsModule,\n CdkListbox,\n CdkOption,\n CdkMenu,\n NgFor,\n OverlayModule,\n CustomDatePickerDirective,\n MatDatepickerModule,\n MatNativeDateModule,\n MatDatepickerToggle,\n MobileInputComponent\n ],\n providers: [MatDatepickerModule,\n MatNativeDateModule,\n DatePipe,\n {\n provide: CELL_VALIDATORS,\n useValue: cellValidators\n }\n ],\n host: {\n '(document:click)': 'onDocumentClick($event)',\n 'class': 'data-cell-component'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class DataCellComponent {\n isOpen = false;\n @ViewChild('attachmentTrigger') attachmentTrigger: any;\n @ViewChild('singleSelectTrigger') singleSelectTrigger: any;\n @ViewChild('multiSelectTrigger') multiSelectTrigger: any;\n @ViewChild('peopleTrigger') peopleTrigger: any;\n private elementRef = inject(ElementRef);\n sanitize: DomSanitizer = inject(DomSanitizer);\n private eruGridStore: EruGridStore = inject(EruGridStore);\n overlayMenuService: OverlayMenuService = inject(OverlayMenuService);\n private el = inject(ElementRef)\n private cdr = inject(ChangeDetectorRef);\n error = signal('')\n fieldSize = input.required<number>();\n columnDatatype = input.required<any>();\n columnName = input.required<string>();\n column = input.required<any>();\n value = input.required<string | number | null>();\n id = input.required<string | number>();\n frozenGrandTotalCell = input<boolean>(false);\n replaceZeroValue: string | undefined = undefined;\n td= model()\n currentValue = signal<string | number | null| any>(null);\n drillable = input<boolean>(false);\n mode = input<string>('');\n isEditable = input<boolean>(false);\n constructor(){\n effect(() => {\n const columnWidth = this.currentColumnWidth();\n this.formattedMultiSelectValue(columnWidth);\n });\n\n // Watch for changes in the value input and update currentValue accordingly\n effect(() => {\n const value = this.value();\n const datatype = this.columnDatatype();\n \n if (datatype === 'people' || datatype === 'dropdown_multi_select') {\n // For multi-select fields, ensure value is an array\n if (Array.isArray(value)) {\n this.currentValue.set(value);\n } else if (value) {\n // If it's a single value, convert to array\n this.currentValue.set([value]);\n } else {\n // If no value, set empty array\n this.currentValue.set([]);\n }\n } else {\n // For single-select fields, set as is\n this.currentValue.set(value);\n }\n });\n }\n\n\n // Computed property to get current column width that updates on resize\n currentColumnWidth = computed(() => {\n const columns = this.eruGridStore.columns();\n const currentColumn = columns?.find(col => col.name === this.columnName());\n return currentColumn?.field_size || this.fieldSize();\n });\n\n formattedMultiSelectValue(columnWidth: number) {\n const currentValues = this.currentValue();\n if (!Array.isArray(currentValues) || currentValues.length === 0) {\n return '';\n } \n const availableWidth = columnWidth - 16; // Account for padding\n const valueWidth = 100; // 1 value per 50px as requested\n const maxVisibleValues = Math.floor(availableWidth / valueWidth);\n if (maxVisibleValues <= 0) {\n return `${currentValues.length} selected`;\n }\n \n if (currentValues.length <= maxVisibleValues) {\n return currentValues.join(',');\n }\n \n const visibleValues = currentValues.slice(0, maxVisibleValues);\n const hiddenCount = currentValues.length - maxVisibleValues;\n return `${visibleValues.join(',')} +${hiddenCount} more`;\n };\n\n\n columnCellConfiguration = computed<any>(() =>{\n const columns = this.eruGridStore.columns();\n return columns?.find((columnConfig) => columnConfig.name === this.getColumnValue().replace('default_','')) || null;\n }\n);\nprivate renderer = inject(Renderer2)\n\n\n private datePipe = inject(DatePipe);\n\n private validateField(value: string | number | null): void {\n const config = this.columnCellConfiguration();\n if (!config) return;\n \n const datatype = config.datatype as keyof typeof cellValidators;\n const validator = cellValidators[datatype];\n\n if (validator) {\n const result = validator(value, config);\n this.error.set(result.error || '');\n\n if (result.isValid) {\n this.eruGridStore.setActiveCell(null);\n }\n }\n }\n\n onTextboxBlur(): void {\n this.validateField(this.currentValue());\n }\n\n onEmailBlur(): void {\n this.validateField(this.currentValue());\n }\n\n onLocationBlur(): void {\n this.validateField(this.currentValue());\n }\n\n onNumberBlur(): void {\n const value = this.currentValue();\n const numValue = Number(value);\n\n this.validateField(numValue);\n\n if (!this.error()) {\n const config = this.columnCellConfiguration();\n const decimalPlaces = config?.decimal || 0;\n this.currentValue.set(numValue.toFixed(decimalPlaces));\n }\n }\n getPriorityIcon = computed(() => {\n \n if (this.currentValue()) {\n const config = this.columnCellConfiguration();\n if (!config?.options) return '';\n const icon = config.options.find((c: any) => c.value == this.currentValue())?.icon ?? ''\n return this.sanitize.bypassSecurityTrustHtml(icon)\n } else {\n return ''\n }\n })\n setField(event:any){\n this.currentValue.set(event)\n }\n formatNumberSignal = computed(() => {\n const config = this.columnCellConfiguration();\n const value = this.currentValue();\n if (config?.datatype !== 'number' && config?.datatype !== 'currency') {\n return value?.toString() || '';\n }\n\n if(value == 0 && this.replaceZeroValue !== undefined){\n return this.replaceZeroValue\n }\n const numConfig = config as any;\n const separator = numConfig.separator;\n const decimalPlaces = numConfig.decimal;\n if (!value) return '';\n if (separator === 'none') return value.toString();\n\n let locale = 'en-US';\n if (separator === 'thousands') {\n locale = 'en-IN';\n }\n return `${numConfig?.datatype === 'currency' ? numConfig.symbol+' ' || '' : ''}${\n Number(value).toLocaleString(locale, {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces\n })\n }`;\n });\n\n private formatNumber(\n value: string,\n separator: 'thousands' | 'millions' | 'none',\n decimalPlaces: number,\n ): string {\n if (!value) return '';\n if (separator === 'none') return value;\n let locale = 'en-US';\n if (separator === 'thousands') {\n locale = 'en-IN';\n }\n return Number(value).toLocaleString(locale, {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces\n });\n\n }\n\n formatDate(date: Date | null): string {\n if (!date) return '';\n return date.toISOString().split('T')[0];\n }\n\n onDateChange(event: any) {\n const formattedDate = this.formatDate(event);\n this.currentValue.set(formattedDate);\n }\n\n ngAfterViewInit() {\n this.setColumnTextAlign();\n // currentValue is now automatically synchronized via effect in constructor\n }\n isActive = computed(() => this.eruGridStore.activeCell() === this.el.nativeElement);\n\n setActive(active: boolean): void {\n if (active && this.isEditable() && this.mode() === 'table') {\n this.eruGridStore.setActiveCell(this.el.nativeElement);\n this.focusAndPositionCursor();\n } else {\n this.eruGridStore.setActiveCell(null);\n }\n }\n\n/* onDoubleClick(): void {\n const editableCellTypes = ['textbox', 'location', 'email', 'number', 'currency'];\n \n if (editableCellTypes.includes(this.columnDatatype())) {\n // Setting a new active cell automatically deactivates the previous one\n this.eruGridStore.setActiveCell(this.el.nativeElement);\n // Let Angular's change detection handle the input rendering naturally\n this.focusAndPositionCursor();\n }\n } */\n\n onDrillableClick(event: Event): void {\n if (this.drillable()) {\n event.stopPropagation();\n console.log('drillable click', this.id(),this.currentValue())\n // Handle drillable click - you can emit an event or call a service here\n const idSplit = this.id().toString().split('__')\n const columnName = this.getColumnValue().replace('default_', '')\n const columnValues = this.columnName().includes('_') ? this.columnName().split(/_(.*)/)[0] : ''\n const tmpStr = idSplit[0].replace('pivot_', '')\n const rowId = tmpStr.includes('_') ? tmpStr.split(/_(.*)/)[0] : tmpStr\n this.eruGridStore.setPivotDrilldown({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: columnName,\n rowId: rowId,\n columnValue: this.currentValue()\n },columnValues) \n }\n }\n\n private focusAndPositionCursor(): void {\n // Use a more reliable approach to wait for DOM updates\n let attempts = 0;\n const maxAttempts = 20;\n \n const tryFocus = () => {\n const matInput = this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && matInput.offsetParent !== null) { // Check if element is visible\n matInput.focus();\n \n // Position cursor at the beginning - handle different input types\n try {\n // For email inputs, try different approaches\n if (matInput.type === 'email') {\n // Method 1: Try setSelectionRange first (works in most modern browsers)\n try {\n matInput.setSelectionRange(0, 0);\n } catch (emailError) {\n // Method 2: Use a workaround by temporarily changing the type\n const originalType = matInput.type;\n matInput.type = 'text';\n matInput.setSelectionRange(0, 0);\n matInput.type = originalType;\n }\n } else {\n // Standard approach for other input types\n matInput.setSelectionRange(0, 0);\n }\n } catch (error) {\n console.log(\"Could not set cursor position for input type:\", matInput.type, error);\n // Final fallback: try to use value manipulation\n try {\n const currentValue = matInput.value;\n matInput.value = '';\n matInput.value = currentValue;\n matInput.setSelectionRange(0, 0);\n } catch (fallbackError) {\n console.log(\"All cursor positioning methods failed:\", fallbackError);\n }\n }\n } else if (attempts < maxAttempts) {\n // If input not found or not visible, try again after a short delay\n attempts++;\n setTimeout(tryFocus, 25);\n } else {\n console.log(\"Could not find visible input element after\", maxAttempts, \"attempts\");\n }\n };\n \n // Start trying to focus after allowing Angular to update the DOM\n setTimeout(tryFocus, 50);\n }\n\n ngOnInit() {\n // Add document click listener to close attachment menu\n document.addEventListener('click', this.onDocumentClick.bind(this));\n this.replaceZeroValue = this.eruGridStore.configuration().config?.replaceZeroValue\n }\n\n ngOnDestroy() {\n // Remove document click listener\n document.removeEventListener('click', this.onDocumentClick.bind(this));\n }\n\n onDocumentClick(event: Event): void {\n // Close attachment menu if clicking outside the cell (only for attachment cells)\n if (this.overlayMenuService.isActiveOverlayCell(this.getCellId()) && \n !this.el.nativeElement.contains(event.target as Node)) {\n this.overlayMenuService.closeOverlayMenu();\n }\n \n // If this cell is active and the click is outside this cell, deactivate it\n if (this.isActive() && !this.el.nativeElement.contains(event.target as Node)) {\n this.validateAndDeactivate();\n }\n }\n\n private validateAndDeactivate(): void {\n // Validate the current value before deactivating\n const datatype = this.columnDatatype();\n \n switch (datatype) {\n case 'number':\n case 'currency':\n this.onNumberBlur();\n break;\n case 'textbox':\n this.onTextboxBlur();\n break;\n case 'email':\n this.onEmailBlur();\n break;\n case 'location':\n this.onLocationBlur();\n break;\n default:\n // For other cell types, just deactivate\n this.eruGridStore.setActiveCell(null);\n break;\n }\n }\n\n optionSearchText = signal('')\n filteredOptions = computed(() => {\n this.cdr.markForCheck();\n const config = this.columnCellConfiguration();\n\n if (!config || !config.options || ![\"dropdown_multi_select\", 'dropdown_single_select','priority'].includes(this.columnDatatype()) ) {\n return [];\n }\n\n const selectConfig = config as any;\n return selectConfig.options.filter((c:any) =>\n c.label.toLowerCase().includes(this.optionSearchText().toLowerCase())\n );\n });\n\n selectedSingleSelect(value: string) {\n this.currentValue.set(value[0]);\n }\n singleOptionClosed() {\n\n this.optionSearchText.set('');\n const config = this.columnCellConfiguration();\n const value = this.currentValue() ;\n\n\n if (config?.mandatory && !value) {\n this.error.set(`${config.label} is required`);\n this.renderer.setStyle(this.td(), 'border', '1px solid red')\n return;\n } else {\n this.error.set(``);\n this.eruGridStore.setActiveCell(null)\n }\n }\n openDatePicker(){\n\n }\n selectedMultiSelect(event: string[]) {\n console.log('selectedMultiSelect event:', event);\n \n // Handle edge cases\n if (!event || !Array.isArray(event)) {\n console.warn('Invalid event received:', event);\n return;\n }\n \n // Filter out any invalid values\n const validValues = event.filter(value => value && typeof value === 'string');\n \n // Only update if we have valid values or if the array is intentionally empty\n if (validValues.length > 0 || event.length === 0) {\n this.currentValue.set(validValues);\n } else {\n console.warn('No valid values in event, keeping current selection');\n }\n }\n appendMultiSelect(event: string) {\n console.log(event)\n const currentValues = this.currentValue();\n if (Array.isArray(currentValues)) {\n if (currentValues.includes(event)) {\n // Remove the value if it already exists\n this.currentValue.set(currentValues.filter(value => value !== event));\n } else {\n // Add the value if it doesn't exist\n this.currentValue.set([...currentValues, event]);\n }\n } else {\n this.currentValue.set([event]);\n }\n }\n\n isAllSelected(): boolean {\n const currentValues = this.currentValue();\n const allOptions = this.getAllOptions();\n if (Array.isArray(currentValues) && allOptions.length > 0) {\n return allOptions.every(option => currentValues.includes(option));\n }\n return false;\n }\n\n isIndeterminate(): boolean {\n const currentValues = this.currentValue();\n const allOptions = this.getAllOptions();\n if (Array.isArray(currentValues) && allOptions.length > 0) {\n const selectedCount = allOptions.filter(option => currentValues.includes(option)).length;\n return selectedCount > 0 && selectedCount < allOptions.length;\n }\n return false;\n }\n\n toggleSelectAll(checked: boolean): void {\n if (checked) {\n // Select all options\n const allOptions = this.getAllOptions();\n this.currentValue.set(allOptions);\n } else {\n // Deselect all options\n this.currentValue.set([]);\n }\n }\n\n private getAllOptions(): string[] {\n // Get all available options (hardcoded + filtered options)\n const hardcodedOptions = ['None', 'option 1', 'option 2', 'option 3', 'option 4', 'option 5', 'option 6', 'option 7', 'option 8', 'option 9', 'option 10'];\n const filteredOptions = this.filteredOptions().map((option: any) => option.value);\n return [...hardcodedOptions, ...filteredOptions];\n }\n\n private getPeopleOptions(): string[] {\n // Get people-specific options for the people dropdown\n const hardcodedPeople = [\n 'person0@domain.com',\n 'person1@domain.com', \n 'person2@domain.com',\n 'person3@domain.com',\n 'person4@domain.com',\n 'person5@domain.com'\n ];\n const filteredPeople = this.filteredOptions().map((option: any) => option.value);\n return [...hardcodedPeople, ...filteredPeople];\n }\n\n isOptionSelected(optionValue: string): boolean {\n const currentValues = this.currentValue();\n if (Array.isArray(currentValues)) {\n return currentValues.includes(optionValue);\n }\n return false;\n }\n \n setProgressValue(value: number) {\n this.currentValue.set(value);\n this.validateField(value);\n }\n\n hoverRating = 0;\n\n setRatingValue(value: number) {\n const config = this.columnCellConfiguration();\n const startValue = config.start_value || 1;\n const endValue = config.end_value || 5;\n\n this.currentValue.set(this.currentValue() === value ? 0 : value);\n this.validateField(this.currentValue());\n this.hoverRating = 0;\n }\n\n getStarColor(starNumber: number): string {\n return this.hoverRating > 0 \n ? (starNumber <= this.hoverRating ? '#FFD700' : '#e0e0e0')\n : (starNumber <= this.currentValue() ? '#FFD700' : '#e0e0e0');\n }\n\n getRatingStars(): number[] {\n const config = this.columnCellConfiguration();\n const startValue = config.start_value || 1;\n const endValue = config.end_value || 5;\n \n return Array.from(\n {length: endValue - startValue + 1}, \n (_, i) => startValue + i\n );\n }\n\n getEmojiForRating(star: number): string {\n const config = this.columnCellConfiguration();\n const emojiValue = config.emoji_value;\n const currentValue = this.currentValue() || 0;\n const isActive = this.isActive();\n\n const isFilled = isActive \n ? (this.hoverRating > 0 ? star <= this.hoverRating : star <= currentValue)\n : star <= currentValue;\n\n switch (emojiValue) {\n case 'star':\n return isFilled ? '★' : '☆'; \n case 'smile':\n return isFilled ? '☻' : '☺';\n case 'heart':\n return isFilled ? '♥' : '♡'; \n default:\n return isFilled ? '★' : '☆';\n }\n }\n\n getStatusOptions() {\n const config = this.columnCellConfiguration();\n if (config.datatype !== 'status') return [];\n\n // Combine open and close status\n const combinedStatus = [\n ...(config.open_status || []),\n ...(config.close_status || [])\n ];\n\n return combinedStatus.map(status => ({\n value: status.name,\n label: status.name,\n color: status.color || '',\n isDefault: status.df\n }));\n }\n\n getStatusColor(statusName: string): { background: string, border: string, text: string } {\n const options = this.getStatusOptions();\n const status = options.find(opt => opt.value === statusName);\n\n if (!status || !status.color) {\n return {\n background: 'white',\n border: 'black',\n text: 'black'\n };\n }\n\n // Advanced color manipulation function\n const manipulateColor = (color: string) => {\n // Convert hex to RGB\n const hex = color.replace('#', '');\n const bigint = parseInt(hex, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n\n // Create lighter background\n const lightenFactor = 0.9; // 90% lighter\n const bgR = Math.min(255, Math.round(r + (255 - r) * lightenFactor));\n const bgG = Math.min(255, Math.round(g + (255 - g) * lightenFactor));\n const bgB = Math.min(255, Math.round(b + (255 - b) * lightenFactor));\n\n // Darken text color\n const darkenFactor = 0.3; // 30% darker\n const textR = Math.round(r * (1 - darkenFactor));\n const textG = Math.round(g * (1 - darkenFactor));\n const textB = Math.round(b * (1 - darkenFactor));\n\n return {\n background: `rgb(${bgR}, ${bgG}, ${bgB})`,\n border: color,\n text: `rgb(${textR}, ${textG}, ${textB})`\n };\n };\n\n return manipulateColor(status.color);\n }\n\n getStatusButtonDisplay(statusName: string): { text: string, color: string } {\n const options = this.getStatusOptions();\n const status = options.find(opt => opt.value === statusName);\n\n if (!status) {\n return { text: statusName || 'None', color: '' };\n }\n\n return {\n text: status.label,\n color: status.color || ''\n };\n }\n\n\n getTagOptions = computed(() => {\n this.cdr.markForCheck();\n const config = this.columnCellConfiguration();\n\n if (!config || !config.options || ![\"tag\"].includes(this.columnDatatype())) {\n return [];\n }\n\n const selectConfig = config as any;\n return selectConfig.options.filter((c: any) =>\n c.label.toLowerCase().includes(this.optionSearchText().toLowerCase())\n );\n });\n\n getTagDisplay(tags: string[] | null | undefined): { displayTags: string[], moreCount: number } {\n const maxDisplayTags = 2;\n const safeTagArray = tags || [];\n const displayTags = safeTagArray.slice(0, maxDisplayTags);\n const moreCount = Math.max(0, safeTagArray.length - maxDisplayTags);\n\n return { displayTags, moreCount };\n }\n\n addNewTag(newTag: string) {\n if (!newTag) return;\n\n const config = this.columnCellConfiguration();\n const currentTags: string[] = this.currentValue() || [];\n \n // Trim and convert to lowercase for comparison\n const normalizedNewTag = newTag.trim().toLowerCase();\n const existingTags: string[] = currentTags.map((tag: string) => tag.toLowerCase());\n\n // Check if new tags are allowed or tag exists in options\n const isValidNewTag = \n config.allow_new_tags || \n this.getTagOptions().some((opt: TagOption) => \n opt.value.toLowerCase() === normalizedNewTag || \n opt.label.toLowerCase() === normalizedNewTag\n );\n\n // Add tag if it's valid and not already present\n if (isValidNewTag && !existingTags.includes(normalizedNewTag)) {\n const updatedTags = [...currentTags, newTag];\n this.currentValue.set(updatedTags);\n this.optionSearchText.set(''); // Clear search text\n }\n }\n\n isNewTagAllowed(): boolean {\n const searchText = this.optionSearchText();\n if (!searchText) return false;\n\n const normalizedSearchText = searchText.trim().toLowerCase();\n const existingTagValues: string[] = this.getTagOptions().map((opt: TagOption) => \n opt.value.toLowerCase()\n );\n const currentTags: string[] = this.currentValue() || [];\n const currentTagsLower: string[] = currentTags.map((tag: string) => tag.toLowerCase());\n\n return (\n this.columnCellConfiguration().allow_new_tags && \n !currentTagsLower.includes(normalizedSearchText) &&\n !existingTagValues.includes(normalizedSearchText)\n );\n }\n getTagColor(tag: string): { background: string, color: string } {\n try {\n const config = this.columnCellConfiguration();\n if (!config?.options) {\n return { background: '#cccccc', color: '#000000' };\n }\n const tagOption = config.options.find((r: any) => r.value === tag);\n const backgroundColor = tagOption?.color || '#cccccc';\n\n // Function to determine text color based on background brightness\n const getContrastYIQ = (hexcolor: string) => {\n // Remove # if present\n hexcolor = hexcolor.replace('#', '');\n\n // Convert hex to RGB\n const r = parseInt(hexcolor.substr(0, 2), 16);\n const g = parseInt(hexcolor.substr(2, 2), 16);\n const b = parseInt(hexcolor.substr(4, 2), 16);\n\n // Calculate luminance\n const yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\n // Return black for light backgrounds, white for dark backgrounds\n return (yiq >= 128) ? '#000000' : '#ffffff';\n };\n\n return {\n background: backgroundColor,\n color: getContrastYIQ(backgroundColor)\n };\n } catch (error) {\n console.warn('Error in getTagColor:', error);\n return { background: '#cccccc', color: '#000000' };\n }\n }\n showOverlayMenu(datatype: string) {\n return this.overlayMenuService.isActiveOverlayCell(this.getCellId()) && this.columnDatatype() === datatype\n }\n isDragging = signal(false);\n\n getCellId(): string {\n return `${String(this.id())}-${this.columnName()}`;\n }\n\n toggleOverlayMenu(event: Event): void {\n event.stopPropagation();\n this.isOpen = !this.isOpen; \n this.overlayMenuService.toggleOverlayMenu(this.getCellId());\n }\n\n closeOverlayMenu(): void {\n this.overlayMenuService.closeOverlayMenu();\n }\n\n\n onDragOver(e: any) {\n e.preventDefault();\n this.isDragging.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.isDragging.set(false);\n }\n\n trackByFile(index: number, file: string): string {\n return file;\n }\n\n viewFile(file: string): void {\n // TODO: Implement file viewing functionality\n console.log('View file:', file);\n }\n\n deleteFile(file: string): void {\n // TODO: Implement file deletion functionality\n console.log('Delete file:', file);\n const currentFiles = this.currentValue() || [];\n const updatedFiles = currentFiles.filter((f: any) => f !== file);\n this.currentValue.set(updatedFiles);\n }\n onFileDrop(e: any) {\n e.preventDefault();\n this.isDragging.set(false);\n for (let r of e.dataTransfer.items) {\n if (r.kind === 'file') {\n let file = r.getAsFile();\n this.processFile(file);\n }\n }\n }\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n this.currentValue.set(Array.from(input.files));\n this.currentValue().forEach((file:any) => this.processFile(file));\n }\n }\n async onPaste(event: ClipboardEvent) {\n event.preventDefault();\n if (!event.clipboardData?.files.length) {\n return;\n }\n Array.from(event.clipboardData.files).forEach(async (file) => {\n this.processFile(file);\n });\n }\n processFile(file: File) {\n const newFileName = file.name.replace(/_/g, '');\n const reader = new FileReader();\n reader.onload = () => {\n const base64String = reader.result as string;\n const base64Content = base64String.split(',')[1];\n this.upload(base64Content, newFileName);\n this.currentValue().push(newFileName);\n this.cdr.detectChanges()\n\n console.log( this.currentValue());\n \n };\n reader.readAsDataURL(file);\n }\n\n upload(base64String: string, fileName: string) {\n const existing = this.currentValue()\n this.currentValue.set(existing)\n this.cdr.detectChanges()\n\n let payload = {\n file: base64String,\n file_name: fileName,\n // org_process_id: this.fieldProperties().org_process_id,\n };\n // this.workerService.fetchData('POST', `${environment.base_eru_routes_url}/processo/func/upload_file`, payload).subscribe({\n // next: (response) => {\n // this.valueSelected.emit(this.currentValue())\n // const existing = this.currentValue()\n // existing.push(response.file_name);\n // this.currentValue() = existing;\n\n \n // }\n // })\n }\n\n fileInputChange(e: any) {\n debugger\n console.log(e,'file');\n Array.from(e.target.files).forEach((file: any) => {\n this.processFile(file);\n console.log(file,'file');\n \n });\n }\n view(file: any,FNAME:string) {\n let payload = {\n file_name: file,\n // org_process_id: this.fieldProperties().org_process_id\n };\n\n // this.workerService.fetchData('POST', `${environment.base_eru_routes_url}/processo/func/download_file`, payload).subscribe({\n // next: (res) => {\n \n // if (res) {\n // let file = res.file;\n // let type = res.file_type;\n // let fileName = FNAME;\n // this.openFile(file, type, fileName);\n // }\n // }\n // })\n }\n\n supportedFileTypes: string[] = ['application/pdf', 'image/jpeg', 'image/png'];\n isSupportedFileType(fileType: string): boolean {\n return this.supportedFileTypes.includes(fileType);\n }\n openFile(file: any, type: any, fileName: any) {\n const data = {\n file: file,\n type: type,\n fileName: fileName,\n };\n if (!this.isSupportedFileType(type)) {\n this.downloadFile(data, fileName);\n\n return;\n }\n\n // this.nzModalService.create({\n // nzWidth: '394px',\n // nzTitle: '',\n // nzContent: ViewFileComponent,\n // nzMaskClosable: true,\n // nzFooter: null,\n // nzClosable: true,\n // nzData: {\n // data: data,\n // },\n // nzClassName: 'viewFile',\n // });\n }\n\n\n async downloadFile(data: any, fileName: any): Promise<void> {\n try {\n const dataUrl = `data:${data.type};base64,${data.file}`;\n const response = await fetch(dataUrl);\n const blob = await response.blob();\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(link.href);\n } catch (error) {\n console.error('Error downloading file:', error);\n }\n }\n\n\n async saveFile(res: any, name: any): Promise<void> {\n await this.downloadFile(res, name);\n }\n\n delete(file: any) {\n let data = this.currentValue().filter((e:any) => e !== file);\n this.currentValue.set(data)\n this.cdr.detectChanges()\n // this.valueSelected.emit(this.files)\n}\nisAssigneeArray(value: any): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string');\n}\ngetInitials(name: string): string {\n if (!name || typeof name !== 'string') return '';\n \n const words = name.trim().split(/\\s+/);\n if (words.length === 0) return '';\n \n const firstInitial = words[0].charAt(0).toUpperCase();\n const secondInitial = words.length > 1 ? words[1].charAt(0).toUpperCase() : '';\n \n return firstInitial + secondInitial;\n}\n getColumnValue(){\n return this.columnName().includes('_') ? this.columnName().split(/_(.*)/)[1] : this.columnName()\n }\n\n /**\n * Set column-specific CSS custom properties for text alignment\n * @param columnName The name of the column\n * @param textAlign The text alignment value ('left', 'center', 'right')\n * @param isAggregation Whether this is an aggregation column\n */\n setColumnTextAlign(): void {\n const hostElement = this.elementRef?.nativeElement;\n if (hostElement) {\n // Find the second div (cell-display-text or cell-display-number)\n const cellDisplayDiv = hostElement.querySelector('.cell-display-text, .cell-display-number');\n \n if (cellDisplayDiv) {\n if (!!this.column().aggregationFunction) {\n cellDisplayDiv.style.setProperty('text-align', `var(--grid-aggregation-text-align-${this.getColumnName()}, var(--grid-aggregation-text-align, ${this.getDefaultTextAlign()}))`);\n } else {\n cellDisplayDiv.style.setProperty('text-align', `var(--grid-number-text-align-${this.getColumnName()}, var(--grid-number-text-align, ${this.getDefaultTextAlign()}))`);\n }\n }\n }\n }\n getDefaultTextAlign(): string {\n if (this.column().datatype === 'currency' || this.column().datatype === 'number' || !!this.column().aggregationFunction) {\n return 'right';\n } else {\n return 'left';\n }\n }\n getColumnName(): string {\n return this.getColumnValue().replace('default_', '');\n }\n}\n","<div class=\"container\">\n @switch (columnDatatype()) {\n @case ('textbox') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'input-' + columnName()+ id()\" [name]=\"'input-' + columnName()+ id()\"\n [(ngModel)]=\"currentValue\" (blur)=\"onTextboxBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n }\n @case ('currency') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'currency-' + columnName()+ id()\" [name]=\"'currency-' + columnName()+ id()\"\n [ngModel]=\"currentValue()\" (ngModelChange)=\"setField($event)\" placeholder=\"Number\" (blur)=\"onNumberBlur()\">\n <span matTextPrefix>$</span>\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text cell-display-number\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formatNumberSignal()}}</span>\n } @else {\n {{formatNumberSignal()}}\n }\n </div>\n }\n }\n @case ('number') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'number-' + columnName()+ id()\" [name]=\"'number-' + columnName()+ id()\"\n [ngModel]=\"currentValue()\" (ngModelChange)=\"setField($event)\" placeholder=\"Number\" (blur)=\"onNumberBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text cell-display-number\" (dblclick)=\"setActive(true)\"\n[class.cell-display-text-editable]=\"isEditable()\"\n >\n @if (drillable() && currentValue() !== 0) {\n <span class=\"drillable-value\" ><a class=\"drillable-link\" (click)=\"onDrillableClick($event)\">{{formatNumberSignal()}}</a></span>\n } @else {\n {{formatNumberSignal()}}\n }\n </div>\n }\n }\n @case ('location') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"text\" [id]=\"'location-' + columnName()+ id()\" [name]=\"'location-' + columnName()+ id()\"\n [(ngModel)]=\"currentValue\" placeholder=\"location\" (blur)=\"onLocationBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n }\n @case ('email') {\n @if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"cell-form-field\">\n <input matInput type=\"email\" [id]=\"'email-' + columnName()+ id()\" [name]=\"'email-' + columnName()+ id()\"\n [(ngModel)]=\"currentValue\" placeholder=\"email\" matTooltipPosition=\"below\" (blur)=\"onEmailBlur()\">\n </mat-form-field>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n }\n @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}</span>\n } @else {\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n }\n </div>\n }\n\n @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" [cdkMenuTriggerFor]=\"singleSelectTrigger\" #singleSelectTrigger\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n\n @case ('checkbox') {\n <div class=\"cell-form-field cell-checkbox\">\n <mat-checkbox [(ngModel)]=\"currentValue\">\n </mat-checkbox>\n </div>\n }\n\n @case ('people') {\n <div class=\"assignee-avatars \" (dblclick)=\"toggleOverlayMenu($event)\" #peopleTrigger>\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (assignee of currentValue(); track $index) {\n @if ($index < 3) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(assignee) }}\n </div>\n }\n }\n @if (currentValue().length > 3) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ currentValue().length - 3 }}\n </div>\n }\n </span>\n } @else {\n @for (assignee of currentValue(); track $index) {\n @if ($index < 3) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(assignee) }}\n </div>\n }\n }\n @if (currentValue().length > 3) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ currentValue().length - 3 }}\n </div>\n }\n }\n }\n </div>\n }\n\n\n @case ('date') {\n <div class=\"cell-date-container\">\n @if(isActive()){\n <input type=\"text\" [id]=\"'date-' + columnName()+ id()\" [name]=\"'date-' + columnName()+ id()\"\n [matDatepicker]=\"picker\" appCustomDatePicker class=\"inputRef date-picker\" [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onDateChange($event)\" (click)=\"picker.open()\" readonly>\n <mat-datepicker-toggle hidden matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n } @else {\n <div class=\"cell-display-text\" (dblclick)=\"setActive(true)\"\n [class.cell-display-text-editable]=\"isEditable()\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n }\n </div>\n }\n\n\n @case ('priority') {\n <button mat-stroked-button [cdkMenuTriggerFor]=\"prioritySelectMenu\" class=\"dropdown-trigger\">\n <div class=\"cell-priority-content\">\n <div [innerHTML]=\"getPriorityIcon()\"></div>\n @if (drillable()) {\n <div class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</div>\n } @else {\n <div>{{currentValue()}}</div>\n }\n </div>\n </button>\n }\n @case ('progress') {\n @if(isActive()){\n <div class=\"progress-input-container\">\n <mat-slider class=\"progress-slider\" [min]=\"0\" [max]=\"100\" [step]=\"1\" [discrete]=\"true\">\n <input matSliderThumb [ngModel]=\"currentValue()\" (ngModelChange)=\"setProgressValue($event)\">\n </mat-slider>\n <span class=\"progress-value\">{{currentValue()}}%</span>\n </div>\n } @else {\n <div class=\"progress-bar-container\" [attr.data-progress]=\"currentValue()\">\n <div class=\"progress-bar\" [style.width.%]=\"currentValue()\"></div>\n @if (drillable()) {\n <span class=\"progress-text drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}%</span>\n } @else {\n <span class=\"progress-text\">{{currentValue()}}%</span>\n }\n </div>\n }\n }\n\n @case ('rating') {\n @if(isActive()){\n <div class=\"rating-input-container\">\n @for (star of getRatingStars(); track star) {\n <span class=\"rating-star\" [class.active]=\"currentValue() >= star\" (click)=\"setRatingValue(star)\"\n (mouseenter)=\"hoverRating = star\" (mouseleave)=\"hoverRating = 0\">\n {{getEmojiForRating(star)}}\n </span>\n }\n <span class=\"rating-value\">{{currentValue()}}/{{columnCellConfiguration()?.end_value || 5}}</span>\n </div>\n } @else {\n <div class=\"rating-display-container\">\n @for (star of getRatingStars(); track star) {\n <span class=\"rating-star\" [class.active]=\"currentValue() >= star\">\n {{getEmojiForRating(star)}}\n </span>\n }\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{currentValue()}}/{{columnCellConfiguration()?.end_value || 5}}</span>\n }\n </div>\n }\n }\n\n @case ('status') {\n <button mat-stroked-button [cdkMenuTriggerFor]=\"statusSelectMenu\" class=\"status-dropdown-trigger\"\n [style.background-color]=\"getStatusColor(currentValue()).background\"\n [style.border-color]=\"getStatusColor(currentValue()).border\" [style.color]=\"getStatusColor(currentValue()).text\"\n [style.height.px]=\"30\">\n <div class=\"status-button-content\">\n @if(getStatusButtonDisplay(currentValue()).color) {\n\n }\n @if (drillable()) {\n <span class=\"status-text drillable-value\" (click)=\"onDrillableClick($event)\">\n {{getStatusButtonDisplay(currentValue()).text}}\n </span>\n } @else {\n <span class=\"status-text\">\n {{getStatusButtonDisplay(currentValue()).text}}\n </span>\n }\n </div>\n </button>\n }\n\n @case ('tag') {\n <div class=\"tag-container\" [cdkMenuTriggerFor]=\"tagSelectMenu\">\n\n <div class=\"tag-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of getTagDisplay(currentValue()).displayTags; track tag) {\n @if (columnCellConfiguration()) {\n <span class=\"tag\" [style.background]=\"getTagColor(tag).background\" [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n } @else {\n <span class=\"tag cell-fallback-tag\">\n {{tag}}\n </span>\n }\n }\n @if(getTagDisplay(currentValue()).moreCount > 0) {\n <span class=\"tag-more\">\n + {{getTagDisplay(currentValue()).moreCount}} more\n </span>\n }\n </span>\n } @else {\n @for (tag of getTagDisplay(currentValue()).displayTags; track tag) {\n @if (columnCellConfiguration()) {\n <span class=\"tag\" [style.background]=\"getTagColor(tag).background\" [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n } @else {\n <span class=\"tag cell-fallback-tag\">\n {{tag}}\n </span>\n }\n }\n @if(getTagDisplay(currentValue()).moreCount > 0) {\n <span class=\"tag-more\">\n + {{getTagDisplay(currentValue()).moreCount}} more\n </span>\n }\n }\n </div>\n\n </div>\n }\n\n @case ('phone') {\n <app-mobile-input [(ngModel)]=\"currentValue\"\n [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"></app-mobile-input>\n }\n\n @case ('attachment') {\n <div class=\"attachment-cell-wrapper\" (dblclick)=\"toggleOverlayMenu($event)\" cdkOverlayOrigin #attachmentTrigger=\"cdkOverlayOrigin\">\n @if(currentValue()?.length > 0){\n <div class=\"cell-attachment-container\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19 12.5C19 14.985 15.866 17 12 17C8.134 17 5 14.985 5 12.5C5 10.015 8.134 8 12 8C15.866 8 19 10.015 19 12.5Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M13.75 12.5001C13.7716 13.1394 13.4429 13.7397 12.8925 14.0657C12.3422 14.3918 11.6578 14.3918 11.1075 14.0657C10.5571 13.7397 10.2284 13.1394 10.25 12.5001C10.2284 11.8608 10.5571 11.2606 11.1075 10.9345C11.6578 10.6084 12.3422 10.6084 12.8925 10.9345C13.4429 11.2606 13.7716 11.8608 13.75 12.5001V12.5001Z\"\n stroke=\"#7C818C\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }@else {\n <div class=\"cell-attachment-container\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n } @else {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14.67 11.053L10.68 15.315C10.3416 15.6932 9.85986 15.9119 9.35236 15.9178C8.84487 15.9237 8.35821 15.7162 8.01104 15.346C7.24412 14.5454 7.257 13.2788 8.04004 12.494L13.399 6.763C13.9902 6.10491 14.8315 5.72677 15.7161 5.72163C16.6006 5.71649 17.4463 6.08482 18.045 6.736C19.3222 8.14736 19.3131 10.2995 18.024 11.7L12.342 17.771C11.5334 18.5827 10.4265 19.0261 9.28113 18.9971C8.13575 18.9682 7.05268 18.4695 6.28604 17.618C4.5337 15.6414 4.57705 12.6549 6.38604 10.73L11.753 5\"\n stroke=\"#363B44\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n \n \n </div>\n }\n @default {\n <div class=\"cell-default-display\">\n @if (drillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">{{value()}}</span>\n } @else {\n {{value()}}\n }\n </div>\n }\n }\n\n</div>\n\n<ng-template #prioritySelectMenu>\n <div class=\"dropdown-menu\" cdkMenu [style.min-width.px]=\"fieldSize()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [(ngModel)]=\"optionSearchText\">\n </mat-form-field>\n\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"''\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option notext-overflow cell-priority-content\">\n <div [innerHTML]=\"sanitize.bypassSecurityTrustHtml(option.icon)\"></div>\n <div>{{option.label}}</div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"singleSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_single_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_single_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" (click)=\"$event.stopPropagation()\" [(ngModel)]=\"optionSearchText\">\n </mat-form-field>\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox\">\n <li [cdkOption]=\"'None'\" class=\"listbox-option notext-overflow\">\n None\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"listbox-option notext-overflow\">\n option 1\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"listbox-option notext-overflow\">\n option 2\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"listbox-option notext-overflow\">\n option 3\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"listbox-option notext-overflow\">\n option 4\n </li><li [cdkOption]=\"'option 5'\" class=\"listbox-option notext-overflow\">\n option 5\n </li><li [cdkOption]=\"'option 6'\" class=\"listbox-option notext-overflow\">\n option 6\n </li><li [cdkOption]=\"'option 7'\" class=\"listbox-option notext-overflow\">\n option 7\n </li><li [cdkOption]=\"'option 1'\" class=\"listbox-option notext-overflow\">\n option 1\n </li><li [cdkOption]=\"'option 9'\" class=\"listbox-option notext-overflow\">\n option 9\n </li><li [cdkOption]=\"'option 10'\" class=\"listbox-option notext-overflow\">\n option 10\n </li><li [cdkOption]=\"'option 11'\" class=\"listbox-option notext-overflow\">\n option 11\n </li><li [cdkOption]=\"'option 12'\" class=\"listbox-option notext-overflow\">\n option 12\n </li><li [cdkOption]=\"'option 13'\" class=\"listbox-option notext-overflow\">\n option 13\n </li><li [cdkOption]=\"'option 14'\" class=\"listbox-option notext-overflow\">\n option 14\n </li><li [cdkOption]=\"'option 15'\" class=\"listbox-option notext-overflow\">\n option 15\n </li><li [cdkOption]=\"'option 16'\" class=\"listbox-option notext-overflow\">\n option 16\n </li><li [cdkOption]=\"'option 17'\" class=\"listbox-option notext-overflow\">\n option 17\n </li><li [cdkOption]=\"'option 18'\" class=\"listbox-option notext-overflow\">\n option 18\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option notext-overflow\">\n {{option.label}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"multiSelectTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('dropdown_multi_select')\"\n(detach)=\"isOpen = showOverlayMenu('dropdown_multi_select')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (click)=\"$event.stopPropagation()\">\n </mat-form-field>\n \n <!-- Select All Checkbox -->\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n \n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\" (click)=\"$event.stopPropagation()\">\n <li [cdkOption]=\"'None'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('None')\" (click)=\"$event.stopPropagation();appendMultiSelect('None')\"></mat-checkbox>\n <span class=\"option-text\">None</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 1'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 1')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 1')\"></mat-checkbox>\n <span class=\"option-text\">option 1</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 2'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 2')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 2')\"></mat-checkbox>\n <span class=\"option-text\">option 2</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 3'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 3')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 3')\"></mat-checkbox>\n <span class=\"option-text\">option 3</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 4'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 4')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 4')\"></mat-checkbox>\n <span class=\"option-text\">option 4</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 5'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 5')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 5')\"></mat-checkbox>\n <span class=\"option-text\">option 5</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 6'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 6')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 6')\"></mat-checkbox>\n <span class=\"option-text\">option 6</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 7'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 7')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 7')\"></mat-checkbox>\n <span class=\"option-text\">option 7</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 8'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 8')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 8')\"></mat-checkbox>\n <span class=\"option-text\">option 8</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 9'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 9')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 9')\"></mat-checkbox>\n <span class=\"option-text\">option 9</span>\n </div>\n </li>\n <li [cdkOption]=\"'option 10'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected('option 10')\" (click)=\"$event.stopPropagation();appendMultiSelect('option 10')\"></mat-checkbox>\n <span class=\"option-text\">option 10</span>\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <mat-checkbox [checked]=\"isOptionSelected(option.value)\" (click)=\"$event.stopPropagation();appendMultiSelect(option.value)\"></mat-checkbox>\n <span class=\"option-text\">{{option.label}}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template cdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"peopleTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('people')\"\n(detach)=\"isOpen = showOverlayMenu('people')\">\n <div class=\"dropdown-menu\" cdkMenu [style.width.px]=\"currentColumnWidth()\" (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [ngModel]=\"optionSearchText()\" (click)=\"$event.stopPropagation()\"\n (ngModelChange)=\"optionSearchText.set($event)\">\n </mat-form-field>\n <ul cdkListboxMultiple=\"true\" cdkListboxUseActiveDescendant cdkListbox [ngModel]=\"currentValue()\"\n (ngModelChange)=\"selectedMultiSelect($event)\" aria-labelledby=\"listbox-labssel\" class=\"listbox\">\n <li [cdkOption]=\"'person0@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person0@domain.com') }}</div>\n <span class=\"option-text\">person0@domain.com</span>\n @if (isOptionSelected('person0@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person1@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person1@domain.com') }}</div>\n <span class=\"option-text\">person1@domain.com</span>\n @if (isOptionSelected('person1@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person2@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person2@domain.com') }}</div>\n <span class=\"option-text\">person2@domain.com</span>\n @if (isOptionSelected('person2@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person3@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person3@domain.com') }}</div>\n <span class=\"option-text\">person3@domain.com</span>\n @if (isOptionSelected('person3@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person4@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person4@domain.com') }}</div>\n <span class=\"option-text\">person4@domain.com</span>\n @if (isOptionSelected('person4@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n <li [cdkOption]=\"'person5@domain.com'\" class=\"multi-listbox-option notext-overflow\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials('person5@domain.com') }}</div>\n <span class=\"option-text\">person5@domain.com</span>\n @if (isOptionSelected('person5@domain.com')) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n @for (option of filteredOptions(); track option) {\n <li [cdkOption]=\"option.value\" class=\"multi-listbox-option notext-overflow listbox-option_people\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials(option.value) }}</div>\n <span class=\"option-text\">{{option.label}}</span>\n @if (isOptionSelected(option.value)) {\n <span class=\"checkmark\">✓</span>\n }\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template #statusSelectMenu>\n <div class=\"dropdown-menu status-dropdown-menu\" cdkMenu [style.min-width.px]=\"fieldSize()\"\n (closed)=\"singleOptionClosed()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search...\" [(ngModel)]=\"optionSearchText\">\n </mat-form-field>\n\n <ul cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedSingleSelect($event)\"\n aria-labelledby=\"listbox-label\" class=\"listbox status-listbox\">\n <li [cdkOption]=\"''\" class=\"listbox-option notext-overflow\">\n None\n </li>\n @for (option of getStatusOptions(); track option.value) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option status-option\"\n [style.background-color]=\"getStatusColor(option.value).background\"\n [style.border-color]=\"getStatusColor(option.value).border\" [style.color]=\"getStatusColor(option.value).text\">\n @if(option.color) {\n <span class=\"status-color-indicator\" [style.background-color]=\"option.color\"></span>\n }\n {{option.label}}\n </li>\n }\n </ul>\n </div>\n </div>\n</ng-template>\n\n<ng-template #tagSelectMenu>\n <div class=\"dropdown-menu tag-dropdown-menu\" [style.min-width.px]=\"fieldSize()\">\n <div class=\"listbox-container\">\n <mat-form-field appearance=\"outline\" class=\"search-form-field\">\n <input matInput type=\"search\" placeholder=\"Search or add tag...\" [ngModel]=\"optionSearchText()\"\n (ngModelChange)=\"optionSearchText.set($event)\" (keyup.enter)=\"addNewTag(optionSearchText())\"\n [style.min-width.px]=\"fieldSize()\">\n </mat-form-field>\n\n <ul cdkListboxMultiple=\"true\" cdkListbox [ngModel]=\"currentValue()\" (ngModelChange)=\"selectedMultiSelect($event)\"\n class=\"listbox tag-listbox\" [style.min-width.px]=\"fieldSize()\">\n <!-- Predefined tags -->\n @for (option of getTagOptions(); track option.value) {\n <li [cdkOption]=\"option.value\" class=\"listbox-option tag-option\">\n {{option.label}}\n </li>\n }\n\n <!-- New tag input -->\n\n\n\n </ul>\n\n </div>\n </div>\n</ng-template>\n\n<!-- Attachment Menu - Positioned relative to the cell -->\n<ng-template \ncdkConnectedOverlay\n[cdkConnectedOverlayOrigin]=\"attachmentTrigger\"\n[cdkConnectedOverlayOpen]=\"showOverlayMenu('attachment')\"\n(detach)=\"isOpen = showOverlayMenu('attachment')\">\n <div class=\"attachment-menu-overlay\" [style.width.px]=\"currentColumnWidth()\" [style.min-width.px]=\"300\">\n <div class=\"attachment-container\">\n <!-- Header Section -->\n <div class=\"attachment-header\">\n <span class=\"attachment-title\">Add or Drag files</span>\n <button mat-flat-button \n (click)=\"fileInput.click()\" \n class=\"attachment-upload-btn\">\n Upload\n </button>\n </div>\n \n <!-- Drop zone -->\n <div class=\"attachment-drop-zone\" \n (drop)=\"onFileDrop($event)\" \n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\"\n (paste)=\"onPaste($event)\"\n (click)=\"fileInput.click()\"\n [class.dragging]=\"isDragging()\">\n <div class=\"attachment-drop-content\">\n <div class=\"attachment-drop-icon\">+</div>\n <div class=\"attachment-drop-text\">\n <div class=\"primary-text\">Click to upload or drag files here</div>\n <div class=\"secondary-text\">Support multiple files</div>\n </div>\n </div>\n </div>\n \n <!-- Hidden file input -->\n <input #fileInput \n type=\"file\" \n multiple \n (change)=\"fileInputChange($event)\" \n style=\"display: none;\">\n \n <!-- File list -->\n <div class=\"attachment-file-list\" *ngIf=\"currentValue()?.length > 0\">\n <div class=\"attachment-file-item\" *ngFor=\"let file of currentValue(); trackBy: trackByFile\">\n <div class=\"file-info\">\n <span class=\"file-icon\">📄</span>\n <span class=\"file-name\">{{ file?.split('_')?.[2] || file }}</span>\n </div>\n <div class=\"file-actions\">\n <button class=\"action-btn\" (click)=\"viewFile(file)\" title=\"View\">👁️</button>\n <button class=\"action-btn\" (click)=\"deleteFile(file)\" title=\"Delete\">🗑️</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>","import { Directive, OnInit, Renderer2, Input, ElementRef, inject } from \"@angular/core\";\nimport { ColumnConstraintsService } from '../services/column-constraints.service';\nimport { Field, GridConfiguration } from '../model/grid.model';\nimport { EruGridStore } from '../stores/grid.store';\n\n@Directive({\n selector: \"[resizeColumn]\",\n standalone: true\n})\nexport class ResizeColumnDirective implements OnInit {\n @Input(\"resizeColumn\") resizable!: boolean;\n\n @Input() index: number = 0;\n @Input() columnConfig?: Field;\n @Input() gridConfig?: GridConfiguration;\n \n private columnConstraintsService = inject(ColumnConstraintsService);\n private eruGridStore = inject(EruGridStore);\n\n private startX!: number;\n private startWidth!: number;\n private columnElement: HTMLElement;\n private table!: HTMLElement;\n private pressed!: boolean;\n private resizer!: HTMLElement;\n\n constructor(private renderer: Renderer2, private el: ElementRef) {\n this.columnElement = this.el.nativeElement;\n }\n\n ngOnInit() {\n if (this.resizable) {\n const row = this.renderer.parentNode(this.columnElement);\n const thead = this.renderer.parentNode(row);\n this.table = this.renderer.parentNode(thead);\n\n // Create resizer element\n this.resizer = this.renderer.createElement(\"div\");\n this.renderer.addClass(this.resizer, \"column-resizer\");\n this.renderer.setStyle(this.resizer, \"position\", \"absolute\");\n this.renderer.setStyle(this.resizer, \"right\", \"0\");\n this.renderer.setStyle(this.resizer, \"top\", \"0\");\n this.renderer.setStyle(this.resizer, \"bottom\", \"0\");\n this.renderer.setStyle(this.resizer, \"width\", \"10px\");\n this.renderer.setStyle(this.resizer, \"cursor\", \"col-resize\");\n this.renderer.setStyle(this.resizer, \"zIndex\", \"1\");\n this.renderer.setStyle(this.columnElement, \"position\", \"relative\");\n\n this.renderer.appendChild(this.columnElement, this.resizer);\n\n // Add event listeners\n this.renderer.listen(this.resizer, \"mousedown\", this.onMouseDown);\n this.renderer.listen(this.table.ownerDocument, \"mousemove\", this.onMouseMove);\n this.renderer.listen(this.table.ownerDocument, \"mouseup\", this.onMouseUp);\n }\n }\n\n onMouseDown = (event: MouseEvent) => {\n // Prevent text selection during resize\n event.preventDefault();\n \n this.pressed = true;\n this.startX = event.pageX;\n this.startWidth = this.columnElement.offsetWidth;\n\n // Add visual feedback\n this.renderer.addClass(this.table, \"resizing\");\n this.renderer.setStyle(this.resizer, \"backgroundColor\", \"rgba(0,0,0,0.1)\");\n };\n\n onMouseMove = (event: MouseEvent) => {\n if (!this.pressed) return;\n\n // Calculate new width with proper constraints\n const offset = event.pageX - this.startX;\n let newWidth = this.startWidth + offset;\n \n // Apply column constraints - service handles all fallback scenarios\n const gridConfig = this.gridConfig || this.eruGridStore.gridConfiguration();\n newWidth = this.columnConstraintsService.constrainWidth(newWidth, this.columnConfig, gridConfig);\n \n // Find the actual index of the column, accounting for checkbox column\n const columnIndex = Array.from(this.columnElement.parentElement!.children).indexOf(this.columnElement);\n\n // Find all cells in this column (header and data cells)\n const tableCells = Array.from(this.table.querySelectorAll(`th:nth-child(${columnIndex + 1}), td:nth-child(${columnIndex + 1})`));\n\n // Apply new width to column header and all corresponding cells\n tableCells.forEach(cell => {\n this.renderer.setStyle(cell, \"width\", `${newWidth}px`);\n this.renderer.setStyle(cell, \"minWidth\", `${newWidth}px`);\n this.renderer.setStyle(cell, \"maxWidth\", `${newWidth}px`);\n });\n\n // Update the column width in the store if we have column information\n if (this.columnConfig) {\n this.eruGridStore.updateColumnWidth(this.columnConfig.name, newWidth);\n }\n\n // Optional: Add smooth transition for resizing\n this.renderer.setStyle(this.table, \"transition\", \"all 0.1s ease\");\n };\n\n onMouseUp = (event: MouseEvent) => {\n if (this.pressed) {\n this.pressed = false;\n this.renderer.removeClass(this.table, \"resizing\");\n this.renderer.setStyle(this.resizer, \"backgroundColor\", \"transparent\");\n \n // Remove transition after resize\n this.renderer.setStyle(this.table, \"transition\", \"none\");\n }\n };\n}\n","import { Directive, ElementRef, HostListener, Input, Renderer2, OnInit } from '@angular/core';\nimport { EruGridStore } from '../stores/grid.store';\n\n@Directive({\n selector: '[columnDraggable]',\n standalone: true\n})\nexport class ColumnDragDirective implements OnInit {\n @Input('columnDraggable') columnIndex: number | null = null;\n \n private dragEl!: HTMLElement;\n private dragHandle!: HTMLElement;\n private isDragging = false;\n\n constructor(\n private el: ElementRef, \n private renderer: Renderer2,\n private eruGridStore: EruGridStore\n ) {}\n\n ngOnInit() {\n this.dragEl = this.el.nativeElement;\n \n // Find the drag handle element\n this.dragHandle = this.dragEl.querySelector('.column-drag-handle') as HTMLElement;\n \n if (this.dragHandle) {\n // Set draggable attribute on the entire column header\n this.renderer.setAttribute(this.dragEl, 'draggable', 'true');\n \n // Add mousedown listener to the handle\n this.dragHandle.addEventListener('mousedown', () => {\n this.isDragging = true;\n });\n \n // Add mouseup listener to document to reset dragging state\n document.addEventListener('mouseup', () => {\n this.isDragging = false;\n });\n }\n\n }\n\n @HostListener('dragstart', ['$event'])\n onDragStart(event: DragEvent) {\n // Only allow drag if it was initiated by the handle\n if (!this.isDragging) {\n event.preventDefault();\n return;\n }\n\n // Validate column index\n if (this.columnIndex === null || this.columnIndex === undefined) {\n console.error('Invalid column index for drag');\n event.preventDefault();\n return;\n }\n\n console.log('Drag start', this.columnIndex);\n \n // Ensure dataTransfer exists\n if (event.dataTransfer) {\n try {\n // Allow moving\n event.dataTransfer.effectAllowed = 'move';\n \n // Set drag data\n event.dataTransfer.setData('text/plain', this.columnIndex.toString());\n \n // Set drag image to the entire column header\n event.dataTransfer.setDragImage(this.dragEl, 0, 0);\n } catch (error) {\n console.error('Error in dragstart', error);\n event.preventDefault();\n return;\n }\n } else {\n console.error('DataTransfer is undefined');\n event.preventDefault();\n return;\n }\n\n // Add visual feedback\n this.renderer.addClass(this.dragEl, 'dragging');\n }\n\n @HostListener('dragover', ['$event'])\n onDragOver(event: DragEvent) {\n // Prevent default to allow drop\n event.preventDefault();\n \n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n }\n\n @HostListener('drop', ['$event'])\n onDrop(event: DragEvent) {\n // Validate column index\n if (this.columnIndex === null || this.columnIndex === undefined) {\n console.error('Invalid column index for drop');\n event.preventDefault();\n return;\n }\n\n console.log('Drop', this.columnIndex);\n \n event.preventDefault();\n \n // Get the dragged column index\n let fromIndex: number;\n try {\n fromIndex = parseInt(\n event.dataTransfer?.getData('text/plain') || '0', \n 10\n );\n } catch (error) {\n console.error('Error parsing drag data', error);\n return;\n }\n\n const toIndex = this.columnIndex;\n \n console.log('Reordering', { fromIndex, toIndex });\n \n // Reorder columns if different\n if (fromIndex !== toIndex) {\n this.eruGridStore.reorderColumns(fromIndex, toIndex);\n }\n }\n\n @HostListener('dragend', ['$event'])\n onDragEnd(event: DragEvent) {\n // Remove dragging class\n this.renderer.removeClass(this.dragEl, 'dragging');\n this.isDragging = false;\n }\n\n // Add visual hover effect only for the handle area\n @HostListener('mouseenter')\n onMouseEnter() {\n if (!this.isDragging) {\n this.renderer.setStyle(this.dragEl, 'background-color', 'rgba(0,0,0,0.05)');\n }\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n if (!this.isDragging) {\n this.renderer.setStyle(this.dragEl, 'background-color', 'transparent');\n }\n }\n} ","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy, OnInit, ViewChild, computed, signal, ViewEncapsulation, effect } from '@angular/core';\nimport { DataCellComponent } from './components/data-cell/data-cell.component';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ResizeColumnDirective } from './directives/resize.directive';\nimport { ColumnDragDirective } from './directives/column-drag.directive';\nimport { EruGridStore } from './stores/grid.store';\nimport { Field, RowGroup, Row, PivotRow } from './model/grid.model';\n\n\n@Component({\n selector: 'eru-grid',\n templateUrl: './eru-grid.component.html',\n styleUrls: ['./eru-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [\n DataCellComponent,\n ScrollingModule,\n CommonModule,\n MatTooltipModule,\n ResizeColumnDirective,\n ColumnDragDirective\n ],\n})\nexport class EruGridComponent implements OnInit, AfterViewInit, OnDestroy {\n public gridStore: EruGridStore = inject(EruGridStore);\n private elementRef = inject(ElementRef);\n private resizeObserver: ResizeObserver | null = null;\n isColumnReordering = signal(false);\nfirstTr : number | null = 0;\n @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\n @ViewChild('rowContainer') rowContainer?: ElementRef;\n @ViewChild('headerScroller', { read: ElementRef })\n headerScroller!: ElementRef<HTMLDivElement>;\n @ViewChild('gtScroller', { read: ElementRef })\n gtScroller!: ElementRef<HTMLDivElement>;\n initialMinHeight = 400;\n initialTotalWidth = 0;\n initialAdjustScrollWidth = false;\n @ViewChild('vp')\n vp!: CdkVirtualScrollViewport;\n\n private rowLoadQueue: { groupId: string, page: number, pageSize: number }[] = [];\n private isProcessingQueue = false;\n \n // Computed properties using the new GridStore\n groupedRows = computed(() => this.createGroupedRows());\n columns = computed(() => this.gridStore.columns());\n selectedRowIds = this.gridStore.selectedRowIds;\n \n // Track current scroll index for pivot mode\n currentPivotScrollIndex = signal(0);\n firstDataRowIndex = signal(0);\n \n // Enhanced rowspan tracking for virtual scrolling\n private _virtualRowspanCache: Map<string, {\n firstVisibleRowIndex: number;\n actualRowspan: number;\n virtualRowspan: number;\n parentValue: any;\n isContinuation: boolean;\n }> = new Map();\n \n mode = computed(() => this.gridStore.currentMode());\n isResizable = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.columnResizable ?? false;\n });\n isEditable = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.editable ?? false;\n });\n gridHeight = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.gridHeight ?? 400;\n });\n // Gridlines configuration computed properties\n showColumnLines = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.showColumnLines ?? false;\n });\n showRowLines = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.showRowLines ?? false;\n });\n maxDepth = computed(() => {\n const maxDepth = this.gridStore.pivotResult()?.headerStructure?.maxDepth ?? 0;\n /* if (this.grandTotalPosition() === 'before' && this.freezeGrandTotal()) {\n return maxDepth + 1 ;\n } */\n return maxDepth;\n });\n //maxDepth = signal(0);\n // Subtotal and Grand Total styling computed properties\n subTotalStyle = computed(() => {\n const config = this.gridStore.configuration();\n return config?.styles?.subTotalStyle ?? 'bold';\n });\n grandTotalStyle = computed(() => {\n const config = this.gridStore.configuration();\n return config?.styles?.grandTotalStyle ?? 'bold';\n });\n \n // Freeze configuration computed properties\n freezeHeader = computed(() => {\n const config = this.gridStore.configuration();\n if (this.grandTotalPosition() === 'before' && this.freezeGrandTotal()) {\n return true;\n }\n return config?.config?.freezeHeader ?? false;\n });\n \n freezeGrandTotal = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.freezeGrandTotal ?? false;\n });\n\n grandTotalPosition = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.grandTotalPosition ?? 'after';\n });\n \n /**\n * Check if a row is the first visible row in the pivot viewport\n * @param rowIndex The index of the row in the virtual scroll\n * @returns true if this is the first visible row\n */\n isFirstVisiblePivotRow(rowIndex: number): boolean {\n return rowIndex === this.firstDataRowIndex();\n }\n \n /**\n * Handle scroll events for pivot mode\n * @param scrollIndex The current scroll index\n */\n onPivotScroll(scrollIndex: number) {\n this.currentPivotScrollIndex.set(scrollIndex);\n \n if (scrollIndex < this.maxDepth()) {\n this.firstDataRowIndex.set(0);\n } else {\n this.firstDataRowIndex.set(scrollIndex - this.maxDepth() + 1);\n }\n // Clear virtual rowspan cache when scrolling to recalculate\n this._virtualRowspanCache.clear();\n \n this.viewport?.getRenderedRange();\n this.firstTr = this.viewport?.getRenderedRange()?.start || 0;\n \n }\n \n getTotalTableWidth(): number {\n const columns = this.getLeafColumns();\n let totalWidth = columns.reduce((total, column) => total + column.field_size, 0);\n /* if (this.adjustScrollWidth()) {\n totalWidth = totalWidth - 8;\n } */\n return totalWidth;\n }\n getContainerHeight(): number {\n const element = this.rowContainer?.nativeElement;\n if (element) {\n return element.clientHeight;\n }\n return window.innerHeight; // Fallback to viewport height\n }\n \n getMinHeightPx(): number {\n //const parentHeight = this.getContainerHeight();\n let headerHeight = 0;\n let grandTotalHeight = 0;\n let rowHeight = this.gridStore.pivotDisplayData().length * 50;\n // Adjust based on frozen elements\n if (this.freezeHeader()) {\n headerHeight = this.maxDepth() * 35;\n }\n if (this.freezeGrandTotal() && this.grandTotalPosition() === 'before') {\n headerHeight = headerHeight + 50;\n }\n if (this.freezeGrandTotal() && this.grandTotalPosition() === 'after') {\n grandTotalHeight = 60;\n }\n let minHeight = (this.gridHeight()-headerHeight) ; // Start with 50% of parent\n \n \n \n // Ensure minimum usable height\n minHeight = Math.min(minHeight, rowHeight);\n minHeight = minHeight + 10;\n // Don't exceed parent height\n return minHeight;\n }\n\n adjustScrollWidth(): boolean {\n let headerHeight = 0;\n if (this.freezeHeader()) {\n headerHeight = this.maxDepth() * 35;\n }\n if (this.freezeGrandTotal() && this.grandTotalPosition() === 'before') {\n headerHeight = headerHeight + 50;\n }\n return (this.gridHeight() ) <= this.getInitialMinHeightPx();\n }\n /**\n * Get the rendered range (what's in the DOM including buffer)\n * @returns Object with start, end, and count of rendered items\n */\n getRenderedRange(): { start: number; end: number; count: number } {\n if (!this.viewport) {\n return { start: 0, end: 0, count: 0 };\n }\n \n const range = this.viewport.getRenderedRange();\n const count = range.end - range.start;\n \n return { start: range.start, end: range.end, count };\n }\n\n private readonly ROWS_PER_PAGE = 50; \n private readonly SCROLL_THRESHOLD = 10; \n private lastLoadedGroupIds = new Set<string>();\n\n constructor(private changeDetectorRef: ChangeDetectorRef) {\n effect(() => {\n const pivotResult = this.gridStore.pivotResult();\n const pivotConfig = this.gridStore.pivotConfiguration();\n const pivotTransformService = this.gridStore.getPivotTransformService();\n \n if (pivotResult && pivotConfig && pivotTransformService) {\n this._rowspanInfo = pivotTransformService.calculateRowspanInfo(\n this.gridStore.pivotDisplayData(), \n pivotConfig.rows\n );\n } else {\n this._rowspanInfo = new Map();\n }\n });\n \n // Effect to adjust header scrollbar compensation when freeze header changes\n effect(() => {\n // Track freeze header changes\n this.freezeHeader();\n // Adjust scrollbar compensation after DOM updates\n setTimeout(() => this.adjustHeaderScrollbarCompensation(), 200);\n });\n }\n applyTokens() {\n const tokens = this.gridStore.configuration()?.tokens;\n if (tokens) {\n Object.keys(tokens).forEach(key => {\n const value = tokens[key];\n this.rowContainer?.nativeElement.style.setProperty(`--${key}`, value, 'important');\n });\n }\n }\n\n ngOnInit() {\n this.initializeColumnWidths();\n this.initializeGroups();\n this.firstDataRowIndex.set(this.maxDepth()+1);\n this.initialMinHeight = this.getMinHeightPx();\n this.initialAdjustScrollWidth = this.adjustScrollWidth();\n this.initialTotalWidth = this.getTotalTableWidth();\n }\n\n ngAfterViewInit() {\n this.applyTokens();\n this.adjustHeaderScrollbarCompensation();\n \n // For debugging: expose method to window\n if (typeof window !== 'undefined') {\n (window as any).recalculateScrollbar = () => this.recalculateScrollbarCompensation();\n }\n } \n\n ngOnDestroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n getInitialMinHeightPx(): number {\n return this.initialMinHeight;\n }\n getInitialTotalWidth(): number {\n return this.initialTotalWidth;\n }\n applyCdkWidth(): boolean {\n const element = this.rowContainer?.nativeElement;\n if (element) {\n return element.clientWidth > this.initialTotalWidth;\n }\n return false;\n }\n getInitialAdjustScrollWidth(): boolean {\n return this.initialAdjustScrollWidth;\n }\n private createGroupedRows(): GroupItem[] {\n const rows = this.gridStore.rows();\n const groups = this.gridStore.groups();\n const flattenedRows: GroupItem[] = [];\n\n groups.forEach(group => {\n // Add group header\n flattenedRows.push({ type: 'header', group });\n\n if (group.isExpanded) {\n const groupRows = rows.filter(row => row.groupId === group.id);\n flattenedRows.push({ type: 'table-header', group });\n\n groupRows.forEach(row => {\n flattenedRows.push({ type: 'row', group, row });\n });\n\n if (group.isLoading) {\n const ghostRowCount = 5;\n for (let i = 0; i < ghostRowCount; i++) {\n flattenedRows.push({\n type: 'ghost-loading',\n group\n });\n }\n }\n\n flattenedRows.push({ type: 'row-place-holder', group });\n }\n });\n\n return flattenedRows;\n }\n\n\n initializeGroups() {\n this.fetchInitialRows();\n }\n\n private fetchInitialRows() {\n this.gridStore.groups().forEach(group => {\n if (group.isExpanded) {\n this.fetchRowsForGroup(group.id, 0, group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE);\n }\n });\n }\n\n fetchRowsForGroup(groupId: string, page: number, pageSize: number = this.ROWS_PER_PAGE): Promise<void> {\n return new Promise((resolve, reject) => {\n const group = this.gridStore.groups().find(g => g.id === groupId);\n if (!group || !group.hasMoreRows) {\n resolve();\n return;\n }\n\n if (group.isLoading) {\n resolve();\n return;\n }\n\n this.gridStore.updateGroupLoadingState(groupId, true);\n\n const skip = page * pageSize;\n\n const loadTimeout = setTimeout(() => {\n this.gridStore.updateGroupLoadingState(groupId, false);\n reject(new Error('Task loading timed out'));\n }, 10000);\n\n this.gridStore.fetchNewRowData(pageSize, skip, group).subscribe({\n next: (response) => {\n clearTimeout(loadTimeout);\n\n if (!response || response.length === 0) {\n this.gridStore.updateGroupAfterLoading(groupId, 0, true);\n resolve();\n return;\n }\n\n const newRows: any[] = this.normalizeRowData(\n response.map((r: any) => ({ ...r, groupId })),\n group\n );\n\n this.gridStore.addRows(newRows);\n this.gridStore.updateGroupAfterLoading(groupId, newRows.length);\n this.changeDetectorRef.markForCheck();\n\n resolve();\n },\n error: (error) => {\n clearTimeout(loadTimeout);\n console.error(`Error loading tasks for group ${groupId}:`, error);\n \n this.gridStore.updateGroupLoadingState(groupId, false);\n this.markGroupAsNoMoreRows(groupId);\n \n reject(error);\n }\n });\n });\n }\n\n\n onScroll(scrollIndex: number) {\n const groups = this.gridStore.groups();\n const visibleGroups = this.getVisibleGroups();\n\n visibleGroups.forEach(group => {\n if (\n group.isExpanded && \n group.hasMoreRows && \n !group.isLoading\n ) {\n this.checkGroupRowLoading(group);\n }\n });\n\n this.checkAndLoadMoreRows();\n }\n\n\n private getVisibleGroups(): RowGroup[] {\n if (!this.viewport) return [];\n\n const renderedRange = this.viewport.getRenderedRange();\n const visibleGroups = new Set<string>();\n\n for (let i = renderedRange.start; i < renderedRange.end; i++) {\n const groupItem = this.getGroupItemAtIndex(i);\n if (groupItem?.group) {\n visibleGroups.add(groupItem.group.id);\n }\n }\n\n return Array.from(visibleGroups)\n .map(groupId => \n this.gridStore.groups().find(g => g.id === groupId)\n )\n .filter((group): group is RowGroup => group !== undefined);\n }\n\n\n private getGroupItemAtIndex(index: number): GroupItem | undefined {\n const groupItems = this.createGroupedRows();\n return groupItems[index];\n }\n\n\n private checkAndLoadMoreRows() {\n if (!this.viewport) return;\n\n const renderedRange = this.viewport.getRenderedRange();\n const dataLength = this.viewport.getDataLength();\n\n\n const isNearEnd = renderedRange.end >= (dataLength - this.SCROLL_THRESHOLD);\n\n if (isNearEnd) {\n this.intelligentRowLoading();\n }\n }\n\n\n private intelligentRowLoading() {\n const visibleGroups = this.getVisibleGroups();\n\n const groupsToLoad = visibleGroups.filter(group => \n group.isExpanded && \n group.hasMoreRows && \n !group.isLoading && \n !this.lastLoadedGroupIds.has(group.id) \n );\n\n const sortedGroupsToLoad = groupsToLoad.sort((a, b) => \n (a.currentLoadedRows || 0) - (b.currentLoadedRows || 0)\n );\n\n if (sortedGroupsToLoad.length > 0) {\n const groupToLoad = sortedGroupsToLoad[0];\n \n this.lastLoadedGroupIds.add(groupToLoad.id);\n this.queueRowLoading(groupToLoad);\n\n setTimeout(() => {\n this.lastLoadedGroupIds.delete(groupToLoad.id);\n }, 5000); \n }\n }\n\n\n private checkGroupRowLoading(group: RowGroup) {\n \n const shouldLoadRows = \n group.currentLoadedRows < group.totalRowCount &&\n !this.lastLoadedGroupIds.has(group.id);\n\n if (shouldLoadRows) {\n \n this.queueRowLoading(group);\n }\n }\n\n\n private queueRowLoading(group?: RowGroup) {\n if (!group) {\n const groups = this.gridStore.groups();\n group = groups.find(g => \n g.isExpanded && \n g.hasMoreRows && \n !g.isLoading\n );\n }\n\n if (group) {\n this.rowLoadQueue.push({\n groupId: group.id,\n page: group.currentPage || 0,\n pageSize: group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE\n });\n\n this.processRowLoadQueue();\n }\n }\n\n trackByColumnFn(index: number, column: Field): string {\n return column.name;\n }\n\n\n trackByGroupItemFn(index: number, groupItem: GroupItem): string {\n switch (groupItem.type) {\n case 'header':\n return `header-${groupItem.group?.id}`;\n case 'row':\n return `row-${groupItem.row?.entity_id}`;\n case 'ghost-loading':\n return `ghost-${groupItem.group?.id}-${index}`;\n case 'row-place-holder':\n return `separator-${groupItem.group?.id}`;\n default:\n return `${groupItem.type}-${index}`;\n }\n }\n\n trackByPivotRowFn(index: number, pivotRow: PivotRow): string {\n return pivotRow._rowKey || `pivot-row-${index}`;\n }\n\n trackByHeaderFn(index: number, header: any): string {\n return `${header.level}-${header.label}-${index}`;\n }\n\n // Nested header support methods\n hasNestedHeaders(): boolean {\n const pivotResult = this.gridStore.pivotResult();\n return !!(pivotResult?.headerStructure && pivotResult.headerStructure.maxDepth > 1);\n }\n\n getHeaderRows(): any[][] {\n const pivotResult = this.gridStore.pivotResult();\n return pivotResult?.headerStructure?.headerRows || [];\n }\n\n getLeafColumns(): Field[] {\n const pivotResult = this.gridStore.pivotResult();\n if (pivotResult?.headerStructure?.leafColumns) {\n return pivotResult.headerStructure.leafColumns;\n }\n // Fallback to regular columns\n return this.gridStore.displayColumns();\n }\n\n isRowDimensionHeader(header: any): boolean {\n // Row dimension headers typically have rowspan > 1 and are in the first few columns\n return header.rowspan > 1;\n }\n\n getPivotGridColumns(): string {\n const columns = this.getLeafColumns();\n return columns.map(col => `${col.field_size}px`).join(' ');\n }\n\n\n private initializeColumnWidths() {\n\n const columns = this.gridStore.columns();\n\n // Ensure each column has a predefined width\n const normalizedColumns = columns.map(column => ({\n ...column,\n field_size: column.field_size || 150, \n minWidth: column.field_size || 150\n }));\n this.gridStore.setConfiguration({\n ...this.gridStore.configuration(),\n fields: normalizedColumns\n });\n this.gridStore.setColumns(normalizedColumns);\n }\n\n // Enhanced method to normalize row data\n private normalizeRowData(rows: any[], group?: RowGroup): any[] {\n return rows.map(row => ({\n ...row,\n\n groupTitle: group?.title,\n\n displayValue: this.getDisplayValue(row),\n height: 50 \n }));\n }\n\n\n private getDisplayValue(row: any, column?: string): string {\n if (!column) {\n return this.getGenericRowDisplay(row);\n }\n\n const value = row[column];\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number') return value.toString();\n \n return JSON.stringify(value);\n }\n\n\n private getGenericRowDisplay(row: any): string {\n const displayProps = ['title', 'id', 'status'];\n return displayProps\n .map(prop => row[prop])\n .filter(value => value != null)\n .join(' - ')\n .trim();\n }\n\n toggleRowSelection(event: Event, row: any) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n const rowId = row.id;\n\n if (checkbox.checked) {\n this.gridStore.selectRow(rowId);\n } else {\n this.gridStore.deselectRow(rowId);\n }\n }\n\n\n toggleGroupSelection(event: Event, groupId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n\n if (checkbox.checked) {\n this.gridStore.selectAllRowsInGroup(groupId);\n } else {\n this.gridStore.deselectAllRowsInGroup(groupId);\n }\n }\n\n\n toggleAllGroups(event: Event) {\n const checkbox = event.target as HTMLInputElement;\n\n if (checkbox.checked) {\n this.gridStore.rows().forEach(row => this.gridStore.selectRow(row.entity_id));\n } else {\n this.gridStore.clearSelection();\n }\n }\n\n\n isRowSelected(rowId?: string): boolean {\n return rowId ? this.gridStore.isRowSelected(rowId) : false;\n }\n\n\n isGroupSelected(groupId: string): boolean {\n return this.gridStore.isGroupSelected(groupId);\n }\n\n\n isAllGroupsSelected(): boolean {\n const allRows = this.gridStore.rows();\n return allRows.length > 0 &&\n allRows.every(row =>\n this.gridStore.isRowSelected(row.entity_id)\n );\n }\n\n\n getSelectedRows(): any[] {\n return Array.from(this.gridStore.selectedRowIds());\n }\n\n\n private markGroupAsNoMoreRows(groupId: string) {\n // This functionality is now handled by GridStore.updateGroupAfterLoading\n this.gridStore.updateGroupAfterLoading(groupId, 0, true);\n }\n\n toggleGroupExpansion(groupId: string) {\n const group = this.gridStore.groups().find(g => g.id === groupId);\n if (!group) return;\n\n const newExpandedState = !group.isExpanded;\n this.gridStore.toggleGroupExpansion(groupId);\n\n if (newExpandedState && (!group.rows || group.rows.length === 0)) {\n this.fetchRowsForGroup(groupId, 0, group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE)\n .catch(error => {\n console.error(`Error loading rows for expanded group ${groupId}:`, error);\n });\n }\n }\n\n\n private processRowLoadQueue() {\n \n if (this.isProcessingQueue) return;\n\n \n if (this.rowLoadQueue.length === 0) {\n this.isProcessingQueue = false;\n return;\n }\n\n\n this.isProcessingQueue = true;\n\n \n const nextLoad = this.rowLoadQueue.shift();\n\n if (nextLoad) {\n \n this.fetchRowsForGroup(nextLoad.groupId, nextLoad.page, nextLoad.pageSize)\n .then(() => {\n \n this.isProcessingQueue = false;\n this.processRowLoadQueue();\n })\n .catch(error => {\n console.error('Error loading rows:', error);\n this.isProcessingQueue = false;\n this.processRowLoadQueue();\n });\n }\n }\n\n // Collapsible column methods\n \n /**\n * Toggle collapse/expand state of a column group\n */\n toggleColumnGroup(groupKey: string) {\n const pivotTransformService = this.gridStore.getPivotTransformService();\n const configuration = this.gridStore.pivotConfiguration();\n \n if (pivotTransformService && configuration) {\n pivotTransformService.toggleColumnGroup(groupKey, configuration);\n // Regenerate pivot data with new collapse state\n this.gridStore.regeneratePivotData();\n }\n }\n\n /**\n * Check if a column group is expanded\n */\n isColumnGroupExpanded(groupKey: string): boolean {\n const pivotTransformService = this.gridStore.getPivotTransformService();\n return pivotTransformService?.isColumnGroupExpanded(groupKey) ?? true;\n }\n\n // Rowspan functionality\n \n /**\n * Get rowspan information for pivot table cells\n */\n private _rowspanInfo: Map<string, { rowspan: number; skip: boolean; parentSpan: number }> | null = null;\n \n /**\n * Debug counter for sticky column debugging\n */\n private _stickyDebugCount: number = 0;\n \n getRowspanInfo(): Map<string, { rowspan: number; skip: boolean; parentSpan: number }> {\n return this._rowspanInfo ?? new Map();\n }\n \n /**\n * Get the effective rowspan for a cell in virtual scrolling context\n * This method ensures proper rowspan continuity when scrolling\n */\n getEffectiveRowspan(visibleRowIndex: number, columnName: string): number | null {\n const rowspanInfo = this.getRowspanInfo();\n return rowspanInfo.get(`${visibleRowIndex}_${columnName}`)?.parentSpan || 1;\n }\n \n /**\n * Check if a cell should be skipped (hidden due to rowspan) - ENHANCED FOR VIRTUAL SCROLLING\n */\n shouldSkipCell(rowIndex: number, columnName: string): boolean {\n const currentRowspan = this.getRowspanInfo().get(`${rowIndex}_${columnName}`)?.rowspan || 1;\n const previousRowspan = this.getRowspanInfo().get(`${rowIndex-1}_${columnName}`)?.rowspan || 1;\n \n if (this.firstDataRowIndex() > rowIndex) {\n return true;\n }\n if (this.isFirstVisiblePivotRow(rowIndex) && !(currentRowspan > previousRowspan)) {\n return false;\n } else if (this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {\n if (this.getRowspanInfo().get(`${rowIndex}_${columnName}`)?.rowspan || 1 > 0) {\n if (currentRowspan > previousRowspan && rowIndex >= this.firstDataRowIndex()) {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 2a');} */\n return false;\n } else {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 2b');} */\n return true;\n }\n }\n } else if (!this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 3');} */\n return false;\n } else {\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 4');} */\n return true;\n }\n /* if (rowIndex >= 6 && rowIndex <= 7) {console.log('inside 5');} */\n return true \n }\n \n /**\n * Get the effective cell value, considering virtual parents for virtual scrolling\n */\n getEffectiveCellValue( index: number, columnName: string, pivotRow: any): any {\n const directValue = pivotRow[columnName];\n return directValue;\n }\n\n /**\n * Get rowspan value for a specific cell - VIRTUAL SCROLLING COMPATIBLE\n * This is a compatibility wrapper around getEffectiveRowspan\n */\n getCellRowspan(rowIndex: number, columnName: string): number {\n const effectiveRowspan = this.getEffectiveRowspan(rowIndex, columnName);\n return effectiveRowspan || 1;\n }\n\n /**\n * Get columns that should be frozen on the left (all row dimensions up to and including freezeField)\n */\n getRowDimensionColumns(): any[] {\n if (!this.gridStore.isFreezeEnabled()) return [];\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return [];\n \n const allColumns = this.getLeafColumns();\n const pivotConfig = this.gridStore.pivotConfiguration();\n \n if (!pivotConfig?.rows) return [];\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return [];\n \n // Return all row dimension columns up to and including the freeze field\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n return allColumns.filter(col => rowDimensionsToFreeze.includes(col.name));\n }\n\n /**\n * Get columns that should be scrollable on the right (all except frozen fields)\n */\n getColumnDimensionColumns(): any[] {\n const allColumns = this.getLeafColumns();\n \n if (!this.gridStore.isFreezeEnabled()) return allColumns;\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return allColumns;\n \n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return allColumns;\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return allColumns;\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n // Return all columns except the frozen row dimensions\n return allColumns.filter(col => !rowDimensionsToFreeze.includes(col.name));\n }\n\n /**\n * Get headers that should be frozen (all row dimension headers up to and including freezeField)\n */\n getRowDimensionHeaders(headerRow: any[]): any[] {\n if (!this.gridStore.isFreezeEnabled()) return [];\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return [];\n \n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return [];\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return [];\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n return headerRow.filter(header => \n rowDimensionsToFreeze.includes(header.name) ||\n (header.name && rowDimensionsToFreeze.includes(header.name))\n );\n }\n\n /**\n * Get headers that should be scrollable (all except frozen fields)\n */\n getColumnDimensionHeaders(headerRow: any[]): any[] {\n if (!this.gridStore.isFreezeEnabled()) return headerRow;\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return headerRow;\n \n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return headerRow;\n \n // Find the index of the freeze field in the row dimensions\n const freezeFieldIndex = pivotConfig.rows.indexOf(freezeField);\n if (freezeFieldIndex === -1) return headerRow;\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n return headerRow.filter(header => \n !rowDimensionsToFreeze.includes(header.name)\n );\n }\n\n /**\n * Check if a column should be sticky (frozen on the left)\n */\n isStickyColumn(columnName: string, colIndex: number): boolean {\n const freezeEnabled = this.gridStore.isFreezeEnabled();\n const freezeField = this.gridStore.getFreezeField();\n const pivotConfig = this.gridStore.pivotConfiguration();\n \n // Debug logging for sticky column detection - log ALL calls for first few\n if (!this._stickyDebugCount) this._stickyDebugCount = 0;\n if (this._stickyDebugCount < 20) {\n this._stickyDebugCount++;\n }\n \n if (!freezeEnabled) {\n return false;\n }\n if (!freezeField) {\n return false;\n }\n if (!pivotConfig?.rows) {\n if (columnName === 'location' || columnName === 'Location') {\n console.log('❌ STICKY DEBUG: No pivot config rows');\n }\n return false;\n }\n if (!columnName) {\n return false;\n }\n \n // Find the index of the freeze field in the row dimensions (case-insensitive)\n const freezeFieldIndex = pivotConfig.rows.findIndex(row => \n row && typeof row === 'string' && row.toLowerCase() === freezeField.toLowerCase()\n );\n \n if (columnName === 'location' || columnName === 'Location') {\n console.log('🔧 STICKY DEBUG freezeFieldIndex:', {\n freezeFieldIndex,\n pivotRows: pivotConfig.rows,\n freezeField: freezeField\n });\n }\n \n if (freezeFieldIndex === -1) {\n if (columnName === 'location' || columnName === 'Location') {\n console.log('❌ STICKY DEBUG: Freeze field not found in pivot rows');\n }\n return false;\n }\n \n // Get all row dimensions that should be frozen\n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n // Case-insensitive comparison for column name\n const isSticky = rowDimensionsToFreeze.some(row => \n row && typeof row === 'string' && row.toLowerCase() === columnName.toLowerCase()\n );\n \n if (columnName === 'location' || columnName === 'Location') {\n console.log('🔧 STICKY DEBUG final result:', {\n rowDimensionsToFreeze,\n isSticky,\n columnNameLower: columnName.toLowerCase()\n });\n }\n \n return isSticky;\n }\n\n /**\n * Get the left position for sticky columns (CSS left value)\n */\n getStickyColumnLeft(columnName: string, colIndex: number): number {\n if (!this.isStickyColumn(columnName, colIndex)) return 0;\n \n const allColumns = this.getLeafColumns();\n const pivotConfig = this.gridStore.pivotConfiguration();\n \n if (!pivotConfig?.rows) return 0;\n \n const freezeField = this.gridStore.getFreezeField();\n if (!freezeField) return 0;\n \n const freezeFieldIndex = pivotConfig.rows.findIndex(row => \n row && typeof row === 'string' && row.toLowerCase() === freezeField.toLowerCase()\n );\n if (freezeFieldIndex === -1) return 0;\n \n const rowDimensionsToFreeze = pivotConfig.rows.slice(0, freezeFieldIndex + 1);\n \n // Calculate cumulative width for columns to the left\n let leftPosition = 0;\n for (const column of allColumns) {\n if (column.name && column.name.toLowerCase() === columnName.toLowerCase()) break;\n if (column.name && rowDimensionsToFreeze.some(row => \n row && typeof row === 'string' && row.toLowerCase() === column.name.toLowerCase()\n )) {\n leftPosition += column.field_size || 150;\n }\n }\n \n return leftPosition;\n }\n\n /**\n * Check if a column is a row dimension column\n */\n isRowDimensionColumn(columnName: string): boolean {\n const pivotConfig = this.gridStore.pivotConfiguration();\n if (!pivotConfig?.rows) return false;\n \n return pivotConfig.rows.some(row => row.toLowerCase() === columnName.toLowerCase());\n }\n\n /**\n * Handle body scroll to synchronize header and grand total horizontal scroll\n */\n onBodyScroll(event: Event) {\n const target = event.target as HTMLElement;\n if (!target) return;\n \n const scrollLeft = target.scrollLeft;\n \n // Sync header if freezeHeader is enabled\n if (this.freezeHeader() && this.headerScroller?.nativeElement) {\n const headerScrollLeft = this.headerScroller.nativeElement.scrollLeft;\n // Only sync if there's a difference to avoid infinite loops\n if (Math.abs(scrollLeft - headerScrollLeft) > 1) {\n this.headerScroller.nativeElement.scrollLeft = scrollLeft;\n }\n }\n \n // Sync grand total footer if freezeGrandTotal is enabled\n if (this.freezeGrandTotal() && this.gtScroller?.nativeElement) {\n const gtScrollLeft = this.gtScroller.nativeElement.scrollLeft;\n // Only sync if there's a difference to avoid infinite loops\n if (Math.abs(scrollLeft - gtScrollLeft) > 1) {\n this.gtScroller.nativeElement.scrollLeft = scrollLeft;\n\n }\n }\n }\n\n /**\n * Handle header scroll to synchronize body horizontal scroll\n */\n onHeaderScroll(event: Event) {\n if (!this.freezeHeader() || !this.viewport) return;\n \n const target = event.target as HTMLElement;\n if (target && this.viewport?.elementRef?.nativeElement) {\n // Synchronize horizontal scroll only\n this.viewport.elementRef.nativeElement.scrollLeft = target.scrollLeft;\n }\n }\n\n\n\n /**\n * Manually trigger scrollbar compensation recalculation (for testing)\n */\n recalculateScrollbarCompensation() {\n console.log('Manual recalculation triggered');\n this.adjustHeaderScrollbarCompensation();\n }\n\n /**\n * Adjust header padding to compensate for body table scrollbar width\n * This ensures perfect column alignment between header and body tables\n */\n private adjustHeaderScrollbarCompensation() {\n if (!this.freezeHeader() || !this.rowContainer) return;\n \n setTimeout(() => {\n const container = this.rowContainer?.nativeElement;\n if (!container) return;\n \n const headerShell = container.querySelector('.header-shell') as HTMLElement;\n const gtShell = container.querySelector('.gt-shell') as HTMLElement;\n const viewport = container.querySelector('.pivot-viewport') as HTMLElement;\n \n if (headerShell && viewport) {\n // Calculate scrollbar width by comparing viewport dimensions\n let scrollbarWidth = viewport.offsetWidth - viewport.clientWidth;\n \n // Alternative method if the first one doesn't work or returns 0\n if (scrollbarWidth === 0) {\n // Create a temporary element to measure scrollbar width\n const scrollDiv = document.createElement('div');\n scrollDiv.style.cssText = `\n width: 100px;\n height: 100px;\n overflow: scroll;\n position: absolute;\n top: -9999px;\n `;\n document.body.appendChild(scrollDiv);\n scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n }\n \n // Apply the calculated scrollbar width as padding-right\n headerShell.style.setProperty('--scrollbar-width', `${scrollbarWidth}px`);\n if (gtShell) {\n gtShell.style.setProperty('--scrollbar-width', `${scrollbarWidth}px`);\n }\n // Debug: Log detailed measurements\n const headerTable = headerShell.querySelector('.eru-grid-table') as HTMLElement;\n const bodyTable = viewport.querySelector('.eru-grid-table') as HTMLElement;\n \n \n }\n }, 100);\n } \n\n}\n\n// Interfaces moved to list.model.ts\ninterface GroupItem {\n type: 'header' | 'row' | 'table-header' | 'row-place-holder' | 'ghost-loading';\n group?: RowGroup;\n row?: Row;\n}\n","<!-- <div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\n currentPivotScrollIndex {{currentPivotScrollIndex()}} | \n firstDataRowIndex {{firstDataRowIndex()}} | \n firstTr {{firstTr}} |\n maxDepth {{maxDepth()}}\n</div> -->\n<div class=\"incremental-row-container eru-grid\" #rowContainer \n [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode()\">\n \n <!-- Pivot Mode Template -->\n @if (gridStore.isPivotMode()) {\n <ng-container >\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%;\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <!-- Debug info for first visible row -->\n \n \n <div class=\"pivot-single-table\" style=\"height: 100%; width: 100%; overflow: hidden; display: flex; flex-direction: column;\">\n @if (freezeHeader()) {\n <div #headerScroller class=\"header-shell\">\n <table class=\"eru-grid-table pivot-table\" \n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\">\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n \n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container>\n @if(grandTotalPosition() === 'before' && freezeGrandTotal()) {\n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n }\n </table> \n </div>\n } \n <!-- Virtual Scrolled Table Body -->\n <div>\n <cdk-virtual-scroll-viewport\n #vp\n [itemSize]=\"50\"\n class=\"viewport pivot-viewport\"\n [class.apply-cdk-width]=\"applyCdkWidth()\"\n (scrolledIndexChange)=\"onPivotScroll($event)\"\n (scroll)=\"onBodyScroll($event)\"\n style=\"overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\" \n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\"\n >\n <!-- Column Groups for consistent width -->\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n \n @if (!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"pivotTableHead\"></ng-container> \n }\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\n \n <tr *cdkVirtualFor=\"let pivotRow of gridStore.pivotDisplayData(); \n trackBy: trackByPivotRowFn; \n let i = index\"\n class=\"pivot-row\"\n [class.subtotal-row]=\"pivotRow._isSubtotal\"\n [class.grand-total-row]=\"pivotRow._isGrandTotal\"\n [class.subtotal-bold]=\"pivotRow._isSubtotal && subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"pivotRow._isSubtotal && subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"pivotRow._isSubtotal && subTotalStyle() === 'highlighted'\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n @if ((!pivotRow._isGrandTotal && freezeGrandTotal() ) || (!freezeGrandTotal() )) { \n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n @if (!shouldSkipCell(i, column.name)) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\"> \n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [class.aggregation]=\"!!column.aggregationFunction\"\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\">\n </data-cell>\n </div>\n </td>\n }\n }\n }\n </tr> \n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n\n </div>\n @if (freezeGrandTotal() && grandTotalPosition() === 'after') {\n <div #gtScroller class=\"header-shell gt-shell\"\n [class.adjust-bottom]=\"!applyCdkWidth()\"\n [class.adjust-bottom-vs]=\"!adjustScrollWidth()\">\n <table class=\"eru-grid-table pivot-table\" \n [style]=\"'width: auto; min-width: 100%; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"pivotColGroup\"></ng-container>\n \n <ng-container *ngTemplateOutlet=\"pivotGrandTotal\"></ng-container>\n \n </table> \n </div>\n }\n \n\n </div>\n </div>\n </ng-container>\n} @else {\n \n<!-- Table Mode Template -->\n <ng-container>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"50\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event)\"\n >\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <thead>\n <tr style=\"visibility:hidden;\">\n <th class=\"checkbox-column\"></th>\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header\">\n {{column.label}}\n </th>\n </tr>\n </thead>\n <tbody *ngIf=\"columns() as columnsList\">\n <ng-container *cdkVirtualFor=\"let groupItem of groupedRows();\n trackBy: trackByGroupItemFn;\n let i = index;\n let first=first\">\n <tr\n *ngIf=\"groupItem.type === 'header'\"\n class=\"group-header\"\n (click)=\"toggleGroupExpansion(groupItem.group?.id || '')\"\n >\n <td class=\"checkbox-column\" style=\"border: none;\">\n {{ groupItem.group?.isExpanded ? '▼' : '▶' }}\n </td>\n <td [attr.colspan]=\"2\" style=\"border: none;\">\n <span class=\"group-title\">\n {{ groupItem.group?.title }}\n </span>\n <span class=\"group-row-count\">\n ({{ groupItem.group?.currentLoadedRows || 0 }}/{{ groupItem.group?.totalRowCount || 0 }})\n </span>\n </td>\n </tr>\n <tr *ngIf=\"groupItem.type === 'table-header'\" style=\"background:#fafafa\">\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr>\n <tr\n *ngIf=\"groupItem.type === 'row' && groupItem.group?.isExpanded\"\n class=\"row-item\"\n [attr.data-row-id]=\"groupItem.row?.entity_id\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isRowSelected(groupItem.row?.entity_id)\"\n (change)=\"toggleRowSelection($event, groupItem.row)\"\n >\n </td>\n <td #cell *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\"\n [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\"\n >\n <div class=\"cell-content\">\n <data-cell\n #datacell \n [td]=cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"groupItem.row?.[column.name] || ''\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [drillable]=\"column.enableDrilldown || false\"\n [id]=\"groupItem.row?.['entity_id'] || '_' ||column.name\"\n ></data-cell>\n </div>\n </td>\n </tr>\n\n <tr\n *ngIf=\"groupItem.type === 'ghost-loading' && groupItem.group?.isExpanded\"\n class=\"ghost-loading-row\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n <td class=\"checkbox-column\"></td>\n <td *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\"\n >\n <div class=\"ghost-cell\"></div>\n </td>\n </tr>\n\n <tr\n *ngIf=\"groupItem.type === 'row-place-holder'\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"columns().length + 1\" class=\"separator-cell\"></td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container> \n}\n</div>\n\n <!-- Pivot Table Header Template -->\n <ng-template #pivotTableHead>\n <thead>\n @if (hasNestedHeaders()) {\n <ng-container >\n @for (headerRow of getHeaderRows(); track headerRow; let rowIndex = $index) {\n <tr class=\"pivot-header pivot-header-container\" \n [class.pivot-header-level]=\"'level-' + rowIndex\">\n @for (header of headerRow; track trackByHeaderFn($index, header); let colIndex = $index) {\n <th\n [attr.colspan]=\"header.colspan\"\n [attr.rowspan]=\"header.rowspan\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable') && header.level === 0\"\n class=\"column-header pivot-column-header nested-header\"\n [class.row-dimension-header]=\"isRowDimensionHeader(header)\"\n [class.column-dimension-header]=\"!isRowDimensionHeader(header)\"\n [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\"\n [class.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n <span class=\"header-label header-wrap-text\">{{header.label}}</span>\n <!-- <button *ngIf=\"!isRowDimensionHeader(header)\" \n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button> -->\n </div>\n </th>\n }\n </tr>\n }\n </ng-container>\n } @else {\n <!-- Simple header fallback -->\n <ng-container>\n <tr class=\"pivot-header\" [class.freeze-header-enabled]=\"freezeHeader()\">\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <th [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n class=\"column-header pivot-column-header\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 100 : 1\"\n style = \"min-height: 40px;height: auto;padding: 8px 6px;position: relative;left: 0px;z-index: 1\">\n {{column.label}}\n </th>\n }\n </tr>\n </ng-container>\n }\n \n </thead>\n</ng-template>\n\n<!-- Column Group Template for consistent column widths -->\n<ng-template #pivotColGroup>\n <colgroup>\n @for (column of getLeafColumns(); track trackByColumnFn($index, column)) {\n <col [style]=\"'width: ' + column.field_size + 'px !important; min-width: ' + column.field_size + 'px !important; max-width: ' + column.field_size + 'px !important; --col-width: ' + column.field_size + 'px'\">\n }\n </colgroup>\n</ng-template>\n\n<ng-template #pivotGrandTotal>\n<tbody class=\"pivot-tbody\">\n @for (pivotRow of gridStore.pivotGrandTotalData(); track trackByPivotRowFn($index, pivotRow); let i = $index) {\n <tr \n class=\"pivot-row grand-total-row\"\n [class.grand-total-bold]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"pivotRow._isGrandTotal && grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"50\"\n [attr.data-pivot-row]=\"i\">\n <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n @for (column of getLeafColumns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td\n [attr.rowspan]=\"getEffectiveRowspan(i, column.name)\" \n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"pivot-cell\"\n [class.row-dimension-cell]=\"isRowDimensionColumn(column.name)\"\n [class.column-dimension-cell]=\"!isRowDimensionColumn(column.name)\"\n [class.aggregated-value]=\"!isRowDimensionColumn(column.name) && column.datatype === 'number'\"\n [class.rowspan-cell]=\"getEffectiveRowspan(i, column.name) || 1 > 1\"\n [class.sticky-column]=\"isStickyColumn(column.name, colIndex)\"\n [style.position]=\"isStickyColumn(column.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(column.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(column.name, colIndex) ? 99 : 1\"\n [style.height.px]=\"50\"\n [attr.xx]=\"i\"> \n <div class=\"cell-content pivot-cell-content\">\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getEffectiveCellValue(i,column.name, pivotRow)\"\n [column]=\"column\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"column.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + i + '_' + column.name\">\n </data-cell>\n </div>\n </td>\n }\n </tr>\n}\n</tbody>\n</ng-template>\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { ThemeService, Theme } from '../../services/theme.service';\n\n@Component({\n selector: 'eru-theme-toggle',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatMenuModule\n ],\n template: `\n <button \n mat-icon-button \n [matMenuTriggerFor]=\"themeMenu\"\n [attr.aria-label]=\"'Theme: ' + getCurrentThemeLabel()\"\n class=\"theme-toggle-button\">\n <mat-icon>{{ getCurrentThemeIcon() }}</mat-icon>\n </button>\n \n <mat-menu #themeMenu=\"matMenu\">\n <button \n mat-menu-item \n *ngFor=\"let theme of availableThemes\"\n [class.active]=\"isActiveTheme(theme.value)\"\n (click)=\"setTheme(theme.value)\">\n <mat-icon>{{ getThemeIcon(theme.value) }}</mat-icon>\n <span>{{ theme.label }}</span>\n <mat-icon *ngIf=\"isActiveTheme(theme.value)\" class=\"check-icon\">check</mat-icon>\n </button>\n </mat-menu>\n `,\n styles: [`\n .theme-toggle-button {\n color: var(--grid-on-surface);\n \n &:hover {\n background-color: var(--grid-surface-variant);\n }\n }\n \n .active {\n background-color: var(--grid-primary-light);\n color: var(--grid-primary-color);\n }\n \n .check-icon {\n margin-left: auto;\n color: var(--grid-primary-color);\n }\n \n mat-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ThemeToggleComponent {\n private themeService = inject(ThemeService);\n \n availableThemes = this.themeService.getAvailableThemes();\n \n getCurrentThemeLabel(): string {\n const currentTheme = this.themeService.currentTheme();\n return this.availableThemes.find(t => t.value === currentTheme)?.label || 'Auto';\n }\n \n getCurrentThemeIcon(): string {\n return this.getThemeIcon(this.themeService.currentTheme());\n }\n \n getThemeIcon(theme: Theme): string {\n switch (theme) {\n case 'light':\n return 'light_mode';\n case 'dark':\n return 'dark_mode';\n case 'high-contrast':\n return 'contrast';\n case 'auto':\n default:\n return 'brightness_auto';\n }\n }\n \n isActiveTheme(theme: Theme): boolean {\n return this.themeService.currentTheme() === theme;\n }\n \n setTheme(theme: Theme): void {\n this.themeService.setTheme(theme);\n }\n}","/*\n * Public API Surface of eru-grid\n */\n\nexport * from './lib/eru-grid.service';\nexport * from './lib/eru-grid.component';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/column-constraints.service';\nexport * from './lib/stores/grid.store';\nexport * from './lib/model/grid.model';\nexport * from './lib/components/theme-toggle/theme-toggle.component';\nexport * from './lib/model/grid.model';\nexport * from './lib/stores/grid.store';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EruGridStore","i2.ThemeService","i3.ColumnConstraintsService","i1","i2","i7","i8","i3","i4"],"mappings":"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"}
|