eru-grid 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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 // 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 // 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 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 console.log(columns)\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 // Generate subtotals for EACH level of column dimensions separately\n // This creates subtotals for Priority, Rating, etc. individually\n for (let dimIndex = 0; dimIndex < subtotalDimensions.length; dimIndex++) {\n const currentDimension = subtotalDimensions[dimIndex];\n const currentDimensionValues = dimensionValues[dimIndex];\n \n // For each value in this dimension\n currentDimensionValues.forEach(dimValue => {\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 = `_${dimValue}_subtotal_${aggregation.name}`;\n columns.push({\n name: columnName,\n label: `${dimValue} 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\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 // Extract unique values for each column dimension\n const dimensionValues = columnDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n // Extract unique values from pivot column names\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 // Generate hierarchical subtotal combinations \n const subtotalCombinations = this.generateSubtotalCombinations(dimensionValues, columnDimensions.length - 1);\n \n subtotalCombinations.forEach(combination => {\n const { dimensionPath, level } = combination;\n \n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n const subtotalColumnName = `_${dimensionPath.join('_')}_subtotal_${aggregation.name}`;\n const subtotalLabel = level === 0 \n ? `${dimensionPath[0]} Subtotal - ${aggregation.label || aggregation.name}`\n : `${dimensionPath.join('+')} Subtotal - ${aggregation.label || aggregation.name}`;\n \n columns.push({\n name: subtotalColumnName,\n label: subtotalLabel,\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,gridConfiguration);\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 // 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 dataType: fields.find((col: Field) => col.name === dimension)?.datatype || 'textbox' as DataTypes\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 dataType: this.getAggregationDataType(aggregation.aggregationFunction)\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 dataType: this.getAggregationDataType(aggregation.aggregationFunction)\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 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 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 const column = gridConfiguration?.fields.find((col: Field) => col.name === dimension)\n // Add the priority header\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 enableDrilldown: column?.enableDrilldown || false,\n dataType: column?.datatype || 'textbox' as DataTypes\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 dataType: agg.datatype || 'textbox' as DataTypes\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 - GENERIC VERSION\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 \n // If subtotals are not enabled, use original logic\n if (!isColumnSubtotalsEnabled || dimensionValues.length <= 1) {\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 // With subtotals enabled, calculate based on interleaved structure - GENERIC\n const subtotalAggregations = aggregations.filter(agg => agg.showSubtotals);\n let colspan = 0;\n \n // Calculate child columns recursively for all remaining levels\n let childColumns = aggregationCount; // Base aggregation columns\n for (let i = currentLevel + 1; i < dimensionValues.length; i++) {\n childColumns *= dimensionValues[i].length;\n }\n \n // Calculate subtotal columns for each level below current level (not including final level)\n let subtotalColumns = 0;\n for (let subtotalLevel = currentLevel + 1; subtotalLevel < dimensionValues.length - 1; subtotalLevel++) {\n // Count unique combinations of all levels from currentLevel+1 to subtotalLevel (inclusive)\n let combinations = 1;\n for (let i = currentLevel + 1; i <= subtotalLevel; i++) {\n combinations *= dimensionValues[i].length;\n }\n subtotalColumns += combinations * subtotalAggregations.length;\n }\n \n // Add own subtotal for this level (except final level)\n let ownSubtotal = 0;\n if (currentLevel < dimensionValues.length - 1) {\n ownSubtotal = subtotalAggregations.length;\n }\n \n colspan = childColumns + subtotalColumns + ownSubtotal;\n \n return colspan;\n }\n\n /**\n * Generate leaf columns for the actual data with collapsible support\n */\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 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 // Handle column subtotals positioning if enabled\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n \n // Add column subtotal columns with proper interleaved positioning\n if (enableColumnSubtotals && columnDimensions.length > 1) {\n \n // Store all regular columns first\n const regularColumns = columns.filter(col => !col.name.includes('_subtotal_'));\n const nonPivotColumns = regularColumns.filter(col => !col.name.includes('|'));\n const pivotColumns = regularColumns.filter(col => col.name.includes('|'));\n \n \n // Clear columns array and rebuild with interleaved subtotals\n columns.length = 0;\n columnIndex = 0;\n \n // Add non-pivot columns first (Location, Email, etc.)\n nonPivotColumns.forEach(col => {\n col.grid_index = columnIndex++;\n columns.push(col);\n });\n \n // Now add pivot columns with interleaved subtotals\n const interleavedColumns = this.addInterleavedSubtotals(\n pivotColumns,\n dimensionValues,\n aggregations,\n columnDimensions,\n gridConfiguration,\n columnIndex,\n subtotalPositionColumn\n );\n \n columns.push(...interleavedColumns);\n \n // Add column grand total columns if enabled (after pivot columns) - for subtotal case\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 // 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 \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 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 \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 console.log(combinations)\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 const column = columns.find((col: Field) => col.name === dimension)\n headerRows[0].push({\n label: this.formatColumnLabel(column?.label || dimension),\n name: dimension,\n level: 0,\n colspan: 1,\n rowspan: 1,\n enableDrilldown: column?.enableDrilldown || false,\n dataType: column?.datatype || 'textbox' as DataTypes\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 dataType: 'textbox' as DataTypes\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 // 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 // Calculate subtotals for ALL dimensions except the last one\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\n const dimensionValues = configuration.cols.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n // Extract unique values from pivot column names\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 \n // Generate all possible subtotal combinations for each dimension level\n const subtotalCombinations = this.generateSubtotalCombinations(dimensionValues, subtotalDimensions.length);\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 subtotal combination\n subtotalCombinations.forEach(combination => {\n const { dimensionPath, level } = combination;\n \n // For each aggregation, calculate subtotal for this combination\n configuration.aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n // Create subtotal column name based on the dimension path\n const subtotalColumnName = `_${dimensionPath.join('_')}_subtotal_${aggregation.name}`;\n let measureTotal = 0;\n const matchedColumns: string[] = [];\n \n // Find all columns that match this dimension combination and sum their values\n Object.keys(row).forEach(key => {\n if (key.endsWith(`_${aggregation.name}`) && typeof row[key] === 'number') {\n // The key format is \"Priority|Rating|Status_measure\" (e.g., \"Low|0|Open_number\")\n const columnKey = key.split('_')[0]; // Get the part before the aggregation name\n const columnParts = columnKey.split('|');\n \n // Check if this column matches the current dimension path exactly\n let isMatch = true;\n for (let i = 0; i <= level; i++) {\n if (columnParts[i] !== dimensionPath[i]) {\n isMatch = false;\n break;\n }\n }\n \n if (isMatch) {\n measureTotal += row[key];\n matchedColumns.push(key);\n }\n }\n });\n \n newRow[subtotalColumnName] = measureTotal;\n }\n });\n });\n \n result.push(newRow);\n }\n\n return result;\n }\n\n /**\n * Generate all possible subtotal combinations for hierarchical column dimensions\n */\n private generateSubtotalCombinations(\n dimensionValues: string[][],\n subtotalLevels: number\n ): Array<{ dimensionPath: string[], level: number }> {\n const combinations: Array<{ dimensionPath: string[], level: number }> = [];\n \n // For each level that should have subtotals (0 to subtotalLevels-1)\n for (let level = 0; level < subtotalLevels; level++) {\n // Generate all combinations up to this level\n const pathsAtLevel = this.generateCombinationsAtLevel(dimensionValues, level);\n \n pathsAtLevel.forEach(path => {\n combinations.push({\n dimensionPath: path,\n level: level\n });\n });\n }\n \n return combinations;\n }\n\n /**\n * Generate all possible dimension paths at a specific level\n */\n private generateCombinationsAtLevel(\n dimensionValues: string[][],\n targetLevel: number\n ): string[][] {\n if (targetLevel === 0) {\n // For level 0, return individual values from first dimension\n return dimensionValues[0].map(value => [value]);\n }\n \n // For higher levels, generate cartesian product up to targetLevel\n const relevantDimensions = dimensionValues.slice(0, targetLevel + 1);\n return this.generateCombinations(relevantDimensions);\n }\n\n /**\n * Generate columns with properly positioned subtotal columns\n */\n private generateColumnsWithInterleavedSubtotals(\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration,\n startingColumnIndex: number = 0\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = startingColumnIndex;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n \n // Generate all pivot combinations in proper order\n const allCombinations = this.generateCombinations(dimensionValues);\n \n // Group by first level (Priority: Low, Medium, Urgent)\n const priorityGroups = new Map<string, string[][]>();\n allCombinations.forEach(combination => {\n const priority = combination[0];\n if (!priorityGroups.has(priority)) {\n priorityGroups.set(priority, []);\n }\n priorityGroups.get(priority)!.push(combination);\n });\n \n // Process each priority group\n Array.from(priorityGroups.keys()).sort().forEach(priority => {\n const priorityCombinations = priorityGroups.get(priority)!;\n \n // If we have multiple dimension levels, group by second level within this priority\n if (columnDimensions.length > 2) {\n const ratingGroups = new Map<string, string[][]>();\n priorityCombinations.forEach(combination => {\n if (combination.length >= 2) {\n const rating = combination[1];\n const ratingKey = `${priority}|${rating}`;\n if (!ratingGroups.has(ratingKey)) {\n ratingGroups.set(ratingKey, []);\n }\n ratingGroups.get(ratingKey)!.push(combination);\n }\n });\n \n // Process each rating group within this priority\n Array.from(ratingGroups.keys()).sort().forEach(ratingKey => {\n const ratingCombinations = ratingGroups.get(ratingKey)!;\n \n // Add all columns for this rating group\n ratingCombinations.forEach(combination => {\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 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 // Add rating subtotal after this rating group\n if (subtotalPositionColumn === 'after') {\n const ratingParts = ratingKey.split('|');\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const subtotalColumnName = `_${ratingParts.join('_')}_subtotal_${aggregation.name}`;\n const subtotalLabel = `${ratingParts.join('+')} Subtotal - ${aggregation.label || aggregation.name}`;\n \n columns.push({\n name: subtotalColumnName,\n label: subtotalLabel,\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: ratingParts,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n }\n });\n }\n });\n } else {\n // For 2 dimensions, just add all columns for this priority\n priorityCombinations.forEach(combination => {\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 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 priority subtotal after all rating groups for this priority\n if (subtotalPositionColumn === 'after') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const subtotalColumnName = `_${priority}_subtotal_${aggregation.name}`;\n const subtotalLabel = `${priority} Subtotal - ${aggregation.label || aggregation.name}`;\n \n columns.push({\n name: subtotalColumnName,\n label: subtotalLabel,\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: [priority],\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n }\n });\n }\n });\n \n // Add column grand totals if positioned after\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n const grandTotalPositionColumn = gridConfiguration?.config?.grandTotalPositionColumn ?? 'after';\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 * Group combinations by dimension levels for subtotal insertion\n */\n private groupCombinationsByDimensions(\n allCombinations: string[][],\n maxLevel: number\n ): Array<Array<{ prefix: string[], combinations: string[][] }>> {\n const groupedByLevel: Array<Array<{ prefix: string[], combinations: string[][] }>> = [];\n \n // For each level (0 to maxLevel-1)\n for (let level = 0; level < maxLevel; level++) {\n const levelGroups: Array<{ prefix: string[], combinations: string[][] }> = [];\n const groupMap = new Map<string, string[][]>();\n \n // Group combinations by prefix at this level\n allCombinations.forEach(combination => {\n if (combination.length > level) {\n const prefix = combination.slice(0, level + 1);\n const prefixKey = prefix.join('|');\n \n if (!groupMap.has(prefixKey)) {\n groupMap.set(prefixKey, []);\n }\n groupMap.get(prefixKey)!.push(combination);\n }\n });\n \n // Convert map to array format\n groupMap.forEach((combinations, prefixKey) => {\n const prefix = prefixKey.split('|');\n levelGroups.push({ prefix, combinations });\n });\n \n groupedByLevel.push(levelGroups);\n }\n \n return groupedByLevel;\n }\n\n /**\n * Add interleaved subtotals within column groups\n */\n private addInterleavedSubtotals(\n pivotColumns: Field[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration,\n startingIndex: number = 0,\n subtotalPosition: 'before' | 'after' = 'after'\n ): Field[] {\n const result: Field[] = [];\n let columnIndex = startingIndex;\n \n \n // For now, let's implement a simpler approach - group by Priority first\n const priorityGroups = new Map<string, Field[]>();\n \n // Group columns by Priority (first dimension)\n pivotColumns.forEach(column => {\n const columnKey = column.name.split('_')[0]; // Get part before aggregation\n const parts = columnKey.split('|');\n const priority = parts[0]; // Low, Medium, Urgent\n \n if (!priorityGroups.has(priority)) {\n priorityGroups.set(priority, []);\n }\n priorityGroups.get(priority)!.push(column);\n });\n \n \n // Process each priority group\n Array.from(priorityGroups.keys()).sort().forEach(priority => {\n const priorityColumns = priorityGroups.get(priority)!;\n \n // Add priority subtotal before if configured\n if (subtotalPosition === 'before') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n [priority],\n 0,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n \n // Group priority columns by Rating (second dimension)\n const ratingGroups = new Map<string, Field[]>();\n priorityColumns.forEach(column => {\n const columnKey = column.name.split('_')[0];\n const parts = columnKey.split('|');\n if (parts.length >= 2) {\n const rating = parts[1]; // 0, 1, 3, 5\n const ratingKey = `${priority}|${rating}`;\n \n if (!ratingGroups.has(ratingKey)) {\n ratingGroups.set(ratingKey, []);\n }\n ratingGroups.get(ratingKey)!.push(column);\n }\n });\n \n // Process each rating group within this priority\n Array.from(ratingGroups.keys()).sort().forEach(ratingKey => {\n const ratingColumns = ratingGroups.get(ratingKey)!;\n const ratingParts = ratingKey.split('|'); // [priority, rating]\n \n // Add rating subtotal before if configured\n if (subtotalPosition === 'before') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n ratingParts,\n 1,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n \n // Add the actual columns for this rating group\n ratingColumns.forEach(col => {\n col.grid_index = columnIndex++;\n result.push(col);\n });\n \n // Add rating subtotal after if configured \n if (subtotalPosition === 'after') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n ratingParts,\n 1,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n });\n \n // Add priority subtotal after if configured\n if (subtotalPosition === 'after') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n [priority],\n 0,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n });\n \n return result;\n }\n\n /**\n * Group pivot columns by dimension prefixes for subtotal insertion\n */\n private groupPivotColumnsByDimensions(\n pivotColumns: Field[],\n maxLevel: number\n ): Array<Array<{ prefix: string[], columns: Field[] }>> {\n const groupedByLevel: Array<Array<{ prefix: string[], columns: Field[] }>> = [];\n \n // For each level that should have subtotals\n for (let level = 0; level < maxLevel; level++) {\n const levelGroups: Array<{ prefix: string[], columns: Field[] }> = [];\n const groupMap = new Map<string, Field[]>();\n \n // Group columns by their dimension prefix at this level\n pivotColumns.forEach(column => {\n const columnKey = column.name.split('_')[0]; // Get part before aggregation\n const parts = columnKey.split('|');\n \n if (parts.length > level) {\n const prefix = parts.slice(0, level + 1);\n const prefixKey = prefix.join('|');\n \n if (!groupMap.has(prefixKey)) {\n groupMap.set(prefixKey, []);\n }\n groupMap.get(prefixKey)!.push(column);\n }\n });\n \n // Convert map to array format and sort\n Array.from(groupMap.keys()).sort().forEach(prefixKey => {\n const prefix = prefixKey.split('|');\n const columns = groupMap.get(prefixKey)!;\n levelGroups.push({ prefix, columns });\n });\n \n groupedByLevel.push(levelGroups);\n }\n \n return groupedByLevel;\n }\n\n /**\n * Create a subtotal column for a specific dimension prefix\n */\n private createSubtotalColumn(\n prefix: string[],\n level: number,\n aggregation: any,\n gridConfiguration?: GridConfiguration,\n gridIndex: number = 0\n ): Field {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const subtotalColumnName = `_${prefix.join('_')}_subtotal_${aggregation.name}`;\n const subtotalLabel = level === 0 \n ? `${prefix[0]} Subtotal - ${aggregation.label || aggregation.name}`\n : `${prefix.join('+')} Subtotal - ${aggregation.label || aggregation.name}`;\n \n return {\n name: subtotalColumnName,\n label: subtotalLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: gridIndex,\n isLeaf: true,\n level: level + 1,\n parentPath: prefix,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n };\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 // Excel/CSV export methods removed\n // Export functionality should be implemented in the consuming application\n // Previously removed methods: exportToCsv, exportToExcel, exportToExcelFile, createXlsxSheet,\n // createSimplifiedXlsxSheet, addXlsxHeaders, addXlsxDataRows, setXlsxColumnWidths,\n // applyXlsxStyling, getXlsxHeaderStyle, getXlsxDataStyle, formatXlsxValue,\n // getXlsxValueType, getXlsxRange, generateRowKeyForExcel, and all xlsx helper methods\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 // Get all dimension values the same way as leaf columns\n const allDimensionValues = columnDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n if (sourceData && sourceData.length > 0) {\n sourceData.forEach(row => {\n const value = row[dimension]?.toString();\n if (value !== undefined && value !== null) {\n values.add(value);\n }\n });\n } else {\n // No fallback - if no source data, return empty values\n // Generic pivot grid should not have hardcoded dimension values\n }\n return Array.from(values).sort();\n });\n\n // Add subtotal headers at correct row levels, then rearrange to match leaf column order\n this.addSubtotalHeadersAtCorrectLevels(headerRows, allDimensionValues, aggregations, columnDimensions);\n this.rearrangeHeadersToMatchLeafColumns(headerRows, columnDimensions, subtotalPositionColumn, sourceData || []);\n }\n\n /**\n * Add subtotal headers at their correct row levels\n */\n private addSubtotalHeadersAtCorrectLevels(\n headerRows: PivotColumnHeader[][],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[]\n ): void {\n \n // Generate hierarchical subtotal combinations\n const subtotalCombinations = this.generateSubtotalCombinations(dimensionValues, columnDimensions.length - 1);\n \n subtotalCombinations.forEach(combination => {\n const { dimensionPath, level } = combination;\n \n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalHeader: PivotColumnHeader = {\n name: `_${dimensionPath.join('_')}_subtotal_${aggregation.name}`,\n label: level === 0 \n ? `${dimensionPath[0]} Subtotal - ${aggregation.label || aggregation.name}`\n : `${dimensionPath.join('+')} Subtotal - ${aggregation.label || aggregation.name}`,\n level: level + 1, // Place subtotal at the next level down from its dimension\n colspan: 1,\n rowspan: headerRows.length - (level + 1), // Span remaining rows\n parentGroupKey: level === 0 ? dimensionPath[0] : dimensionPath.join('+'), // Parent group identifier for target row\n parentValue: level === 0 ? dimensionPath[0] : dimensionPath.join('+'), // Parent group value for easier identification\n isSubtotal: true,\n dataType: aggregation.datatype || 'textbox' as DataTypes\n };\n \n // Add to the appropriate row based on dimension level\n // Priority subtotals go to Rating row (level 1), Rating subtotals go to Status row (level 2)\n const targetRow = Math.min(level + 1, headerRows.length - 1);\n headerRows[targetRow].push(subtotalHeader);\n }\n });\n });\n }\n\n /**\n * Rearrange headers in each row to match the leaf column order\n */\n private rearrangeHeadersToMatchLeafColumns(\n headerRows: PivotColumnHeader[][],\n columnDimensions: string[],\n subtotalPositionColumn: 'before' | 'after',\n sourceData: any[]\n ): void {\n \n // Process each header row to reorder headers to match leaf column structure\n headerRows.forEach((headerRow, rowIndex) => {\n if (rowIndex >= columnDimensions.length) return; // Skip aggregation level\n \n \n // Separate pivot headers from row dimension headers\n const rowDimensionHeaders = headerRow.filter(h => !columnDimensions.includes(h.name) && !h.name.includes('|') && !h.name.includes('_subtotal_'));\n const pivotHeaders = headerRow.filter(h => columnDimensions.includes(h.name) || h.name.includes('|'));\n const subtotalHeaders = headerRow.filter(h => h.name.includes('_subtotal_'));\n \n // Group headers by their hierarchical position to match leaf column order\n const reorderedHeaders = this.reorderHeadersByHierarchy(pivotHeaders, subtotalHeaders, rowIndex, columnDimensions, subtotalPositionColumn, sourceData || []);\n \n // Clear and rebuild the header row\n headerRow.length = 0;\n headerRow.push(...rowDimensionHeaders, ...reorderedHeaders);\n \n });\n }\n\n /**\n * Reorder headers by hierarchy to match leaf column interleaved positioning - GENERIC VERSION\n */\n private reorderHeadersByHierarchy(\n pivotHeaders: PivotColumnHeader[],\n subtotalHeaders: PivotColumnHeader[],\n rowIndex: number,\n columnDimensions: string[],\n subtotalPositionColumn: 'before' | 'after',\n sourceData: any[]\n ): PivotColumnHeader[] {\n const reordered: PivotColumnHeader[] = [];\n \n if (rowIndex === 0) {\n // Priority level - just add priority headers as they are\n reordered.push(...pivotHeaders);\n } else if (rowIndex === 1) {\n // Rating level - interleave rating headers with priority subtotals\n // Add parentGroupKey to regular headers based on their position\n this.addParentGroupKeysToHeaders(pivotHeaders, rowIndex, sourceData, columnDimensions);\n \n // Group rating headers by their priority parent using parentGroupKey\n const ratingGroups = this.groupHeadersByParentKey(pivotHeaders);\n const prioritySubtotals = this.groupSubtotalsByParentKey(subtotalHeaders);\n \n // Process each first dimension group in correct order (dynamically extracted)\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n firstDimensionValues.forEach(firstDimensionValue => {\n const ratingHeaders = ratingGroups[firstDimensionValue] || [];\n const subtotals = prioritySubtotals[firstDimensionValue] || [];\n \n // Add rating headers for this priority\n if (subtotalPositionColumn === 'before') {\n // Add subtotals first, then rating headers\n reordered.push(...subtotals);\n reordered.push(...ratingHeaders);\n } else {\n // Add rating headers first, then subtotals\n reordered.push(...ratingHeaders);\n reordered.push(...subtotals);\n }\n });\n } else if (rowIndex === 2) {\n // Status level - interleave status headers with rating subtotals \n this.addParentGroupKeysToHeaders(pivotHeaders, rowIndex, sourceData, columnDimensions);\n \n const statusGroups = this.groupHeadersByParentKey(pivotHeaders);\n const ratingSubtotals = this.groupSubtotalsByParentKey(subtotalHeaders);\n \n console.log(`DEBUG: Status groups with parentKey: ${Object.keys(statusGroups).length}, Rating subtotals: ${Object.keys(ratingSubtotals).length}`);\n \n // Process each dimension combination dynamically\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n const secondDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[1]);\n firstDimensionValues.forEach(firstDimensionValue => {\n secondDimensionValues.forEach(secondDimensionValue => {\n const groupKey = `${firstDimensionValue}+${secondDimensionValue}`;\n const statusHeaders = statusGroups[groupKey] || [];\n const subtotals = ratingSubtotals[groupKey] || [];\n \n if (subtotalPositionColumn === 'before') {\n // Add subtotals first, then status headers\n reordered.push(...subtotals);\n reordered.push(...statusHeaders);\n } else {\n // Add status headers first, then subtotals\n reordered.push(...statusHeaders);\n reordered.push(...subtotals);\n }\n });\n });\n }\n \n return reordered;\n }\n\n /**\n * Extract unique values for a specific column dimension from source data\n */\n private extractDimensionValues(sourceData: any[], dimension: string): string[] {\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 * Extract all dimension values arrays from headers or source data\n */\n private extractAllDimensionValues(sourceData: any[], columnDimensions: string[]): string[][] {\n return columnDimensions.map(dimension => this.extractDimensionValues(sourceData, dimension));\n }\n\n /**\n * Group rating headers by their priority parent - GENERIC VERSION\n */\n private groupRatingHeadersByPriority(headers: PivotColumnHeader[], sourceData: any[], columnDimensions: string[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n if (columnDimensions.length >= 2) {\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n const secondDimensionCount = this.extractDimensionValues(sourceData, columnDimensions[1]).length;\n \n headers.forEach(header => {\n const headerIndex = headers.indexOf(header);\n const firstDimensionIndex = Math.floor(headerIndex / secondDimensionCount);\n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n \n if (!groups[firstDimensionValue]) groups[firstDimensionValue] = [];\n groups[firstDimensionValue].push(header);\n });\n }\n \n return groups;\n }\n\n /**\n * Group subtotals by their priority\n */\n private groupSubtotalsByPriority(subtotals: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n subtotals.forEach(subtotal => {\n if (subtotal.label && subtotal.label.includes('Subtotal')) {\n const priority = subtotal.label.split(' ')[0]; // Extract \"Low\", \"Medium\", \"Urgent\"\n if (!groups[priority]) groups[priority] = [];\n groups[priority].push(subtotal);\n }\n });\n \n return groups;\n }\n\n /**\n * Group status headers by their rating parent (combination) - GENERIC VERSION\n */\n private groupStatusHeadersByRating(headers: PivotColumnHeader[], sourceData: any[], columnDimensions: string[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n if (columnDimensions.length >= 3) {\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n const secondDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[1]);\n const thirdDimensionCount = this.extractDimensionValues(sourceData, columnDimensions[2]).length;\n \n headers.forEach(header => {\n const headerIndex = headers.indexOf(header);\n const secondDimensionIndex = Math.floor(headerIndex / thirdDimensionCount);\n const firstDimensionIndex = Math.floor(secondDimensionIndex / secondDimensionValues.length);\n \n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n const secondDimensionValue = secondDimensionValues[secondDimensionIndex % secondDimensionValues.length] || secondDimensionValues[0] || '';\n const groupKey = `${firstDimensionValue}+${secondDimensionValue}`;\n \n if (!groups[groupKey]) groups[groupKey] = [];\n groups[groupKey].push(header);\n });\n }\n \n return groups;\n }\n\n /**\n * Group subtotals by their rating (Priority+Rating combination)\n */\n private groupSubtotalsByRating(subtotals: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n subtotals.forEach(subtotal => {\n if (subtotal.label && subtotal.label.includes('+') && subtotal.label.includes('Subtotal')) {\n const parts = subtotal.label.split(' ')[0]; // Extract \"Low+0\", \"Medium+1\", etc.\n if (!groups[parts]) groups[parts] = [];\n groups[parts].push(subtotal);\n }\n });\n \n return groups;\n }\n\n /**\n * Add parent group keys to headers based on their position and row level - GENERIC VERSION\n */\n private addParentGroupKeysToHeaders(headers: PivotColumnHeader[], rowIndex: number, sourceData: any[], columnDimensions: string[]): void {\n if (!columnDimensions || columnDimensions.length === 0 || rowIndex < 1) {\n return;\n }\n\n // Extract all dimension values dynamically\n const dimensionValues = this.extractAllDimensionValues(sourceData, columnDimensions);\n \n if (rowIndex === 1) {\n // Second level (e.g., Rating level) - assign parent first dimension group keys\n const firstDimensionValues = dimensionValues[0] || [];\n if (dimensionValues.length >= 2) {\n const secondDimensionCount = dimensionValues[1].length;\n headers.forEach((header, index) => {\n const firstDimensionIndex = Math.floor(index / secondDimensionCount);\n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n header.parentGroupKey = firstDimensionValue;\n header.parentValue = firstDimensionValue;\n });\n }\n } else if (rowIndex === 2) {\n // Third level (e.g., Status level) - assign parent combination group keys\n if (dimensionValues.length >= 3) {\n const firstDimensionValues = dimensionValues[0] || [];\n const secondDimensionValues = dimensionValues[1] || [];\n const thirdDimensionCount = dimensionValues[2].length;\n \n headers.forEach((header, index) => {\n const secondDimensionIndex = Math.floor(index / thirdDimensionCount);\n const firstDimensionIndex = Math.floor(secondDimensionIndex / secondDimensionValues.length);\n \n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n const secondDimensionValue = secondDimensionValues[secondDimensionIndex % secondDimensionValues.length] || secondDimensionValues[0] || '';\n \n const parentKey = `${firstDimensionValue}+${secondDimensionValue}`;\n header.parentGroupKey = parentKey;\n header.parentValue = parentKey;\n });\n }\n }\n }\n\n /**\n * Group headers by their parentGroupKey\n */\n private groupHeadersByParentKey(headers: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n headers.forEach(header => {\n const parentKey = header.parentGroupKey || 'Unknown';\n if (!groups[parentKey]) groups[parentKey] = [];\n groups[parentKey].push(header);\n });\n \n return groups;\n }\n\n /**\n * Group subtotals by their parentGroupKey\n */\n private groupSubtotalsByParentKey(subtotals: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n subtotals.forEach(subtotal => {\n const parentKey = subtotal.parentGroupKey || 'Unknown';\n if (!groups[parentKey]) groups[parentKey] = [];\n groups[parentKey].push(subtotal);\n });\n \n return groups;\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 Drilldown,\n PivotRow,\n RowDataRequest,\n RowDataResponse\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()\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 _drilldown = signal<Drilldown | null>(null);\n\n // Data request signal for virtual scrolling pagination\n private readonly _dataRequest = signal<RowDataRequest | null>(null);\n\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 drilldown = this._drilldown.asReadonly();\n\n // Data request readonly signal (exposed to consumers)\n readonly dataRequest = this._dataRequest.asReadonly();\n\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 \n this._configuration.set(this.validateAndEnforceConfiguration(newConfiguration));\n console.log(\"setColumns\",configuration.fields);\n this.setColumns(configuration.fields);\n \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 - REMOVED\n // This method has been removed as part of refactoring to signal-based architecture\n // Data fetching is now handled by the consuming application via dataRequest signal\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 } else {\n this._pivotConfiguration.set(null);\n this.setConfiguration(this._configuration());\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 console.log('🔄 SET PIVOT CONFIGURATION: Setting pivot configuration', pivotConfig);\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 // Excel/CSV export methods removed\n // Export functionality should be implemented in the consuming application\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 setDrilldown(drilldown: Drilldown,columnValues:string) {\n if(this.isPivotMode()){\n if (drilldown.frozenGrandTotalCell) {\n drilldown.rowData = this.pivotGrandTotalData()[0]\n } else {\n drilldown.rowData = this.pivotDisplayData()[parseInt(drilldown.rowId)]\n }\n } else {\n drilldown.rowData = this.rows()[parseInt(drilldown.rowId)-2]\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 console.log('🔄 SET DRILLDOWN: Drilldown', drilldown);\n this._drilldown.set(drilldown);\n }\n clearPivotDrilldown() {\n this._drilldown.set(null);\n }\n\n // Data request methods for signal-based virtual scrolling\n\n /**\n * Emit a data request signal (called by grid component)\n */\n setDataRequest(request: RowDataRequest) {\n console.log('📤 Grid Store: Emitting data request', request);\n this._dataRequest.set(request);\n }\n\n /**\n * Clear the data request signal (called by consumer after handling)\n */\n clearDataRequest() {\n this._dataRequest.set(null);\n }\n\n /**\n * Mark a group as loading (called by grid component before requesting)\n */\n startGroupLoading(groupId: string) {\n this.updateGroupLoadingState(groupId, true);\n }\n\n /**\n * Complete loading for a group (called by consumer after data received)\n */\n completeGroupLoading(groupId: string) {\n this.updateGroupLoadingState(groupId, false);\n }\n\n /**\n * Add rows for a specific group (called by consumer with API data)\n */\n addRowsForGroup(groupId: string, rows: Row[], hasMore: boolean) {\n console.log(`✅ Grid Store: Received ${rows.length} rows for group ${groupId}`);\n\n // Add rows to existing rows\n const existingRows = this.rows();\n const newRows = [...existingRows, ...rows];\n this._rows.set(newRows);\n\n // Update group state\n this.updateGroupAfterLoading(groupId, rows.length, !hasMore);\n }\n\n /**\n * Handle error for data request (called by consumer when API fails)\n */\n handleDataRequestError(groupId: string, error: any) {\n console.error(`❌ Grid Store: Data request failed for group ${groupId}`, error);\n this.updateGroupLoadingState(groupId, false);\n this.setError(`Failed to load data for group ${groupId}`);\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()\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.setGridMode('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 // Excel/CSV export methods removed\n // Export functionality should be implemented in the consuming application\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 eruGridStore = input.required<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().replace('pivot_', '').replace('_default|','')\n // Split on first underscore to get first part and rest\n const [rowId, ...columnName] = idSplit.split('_')\n const columnValues = columnName.join('_')\n const columnValuesSplit = columnValues.split('|')\n const colName = columnValuesSplit[columnValuesSplit.length - 1]\n console.log({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: colName,\n rowId: rowId,\n columnValue: this.currentValue()\n })\n console.log(columnValues)\n this.eruGridStore().setDrilldown({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: colName,\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('|').pop() : 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 //console.log(this.getColumnValue())\n //const columnValue = this.getColumnValue().replace('default|', '');\n //const columnValues = columnValue.split('|')\n //const colName = columnValues[columnValues.length - 1]\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\"><a class=\"drillable-link\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</a></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\"><a class=\"drillable-link\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</a></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\"><a class=\"drillable-link\"(click)=\"onDrillableClick($event)\">{{currentValue()}}/{{columnCellConfiguration()?.end_value || 5}}</a></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, GridConfiguration, RowDataRequest } from './model/grid.model';\nimport { EruGridService } from './eru-grid.service';\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 providers: [EruGridStore, EruGridService],\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 gridService: EruGridService = inject(EruGridService);\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 @Input() gridConfig: GridConfiguration | undefined;\n initialMinHeight = 400;\n initialTotalWidth = 0;\n @ViewChild('vp')\n vp!: CdkVirtualScrollViewport;\n groups = computed(() => this.gridStore.groups());\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 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 if(this.gridStore.isPivotMode()) {\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 // Ensure minimum usable height\n minHeight = Math.min(minHeight, rowHeight);\n minHeight = minHeight + 1;\n // Don't exceed parent height\n return minHeight;\n } else {\n return this.gridHeight();\n }\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 if(this.gridConfig) {\n this.gridService.set_table_configuration(this.gridConfig!);\n }\n if (this.gridConfig?.mode === 'pivot') {\n this.gridService.set_grid_mode(this.gridConfig.mode);\n }\n this.initializeColumnWidths();\n this.initializeGroups();\n this.firstDataRowIndex.set(this.maxDepth()+1);\n this.initialMinHeight = this.getMinHeightPx();\n this.initialTotalWidth = this.getTotalTableWidth();\n \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 \n private createGroupedRows(): GroupItem[] {\n const rows = this.gridStore.rows();\n const groups = this.gridStore.groups();\n console.log(\"groups\",groups);\n console.log(\"rows\",rows?.length);\n const flattenedRows: GroupItem[] = [];\n\n \n if(groups.length > 0) {\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 } else {\n rows.forEach(row => {\n flattenedRows.push({ type: 'row', group: undefined, row });\n });\n }\n console.log(\"flattenedRows\",flattenedRows?.length);\n return flattenedRows;\n }\n\n\n initializeGroups() {\n this.fetchInitialRows();\n }\n\n private fetchInitialRows() {\n console.log(\"fetchInitialRows\" , this.gridStore.groups());\n this.gridStore.groups().forEach(group => {\n if (group.isExpanded) {\n this.requestRowsForGroup(group);\n }\n });\n }\n\n // fetchRowsForGroup - REMOVED\n // Data fetching is now handled by the consuming application via signal\n // See requestRowsForGroup() method below for the new approach\n\n\n onScroll(scrollIndex: number) {\n console.log(\"onScroll called\" , scrollIndex);\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.groupedRows();\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 console.log(\"isNearEnd\" , renderedRange, dataLength, isNearEnd);\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 console.log(\"sortedGroupsToLoad\" , sortedGroupsToLoad);\n if (sortedGroupsToLoad.length > 0) {\n const groupToLoad = sortedGroupsToLoad[0];\n console.log(\"groupToLoad\" , groupToLoad);\n this.requestRowsForGroup(groupToLoad);\n }\n }\n\n\n // queueRowLoading - REPLACED with requestRowsForGroup\n // This method has been replaced with direct signal emission\n\n /**\n * Request rows for a specific group via signal\n */\n private requestRowsForGroup(group: RowGroup) {\n // Prevent duplicate requests\n console.log(\"requestRowsForGroup\" , group);\n if (this.lastLoadedGroupIds.has(group.id)) return;\n\n const request: RowDataRequest = {\n groupId: group.id,\n page: group.currentPage || 0,\n pageSize: group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE,\n timestamp: Date.now(),\n groupTitle: group.title\n };\n\n console.log('📤 Grid Component: Emitting data request', request);\n\n // Emit signal via store\n this.gridStore.setDataRequest(request);\n\n // Mark group as loading\n this.gridStore.startGroupLoading(group.id);\n\n // Prevent duplicate requests for 5 seconds\n this.lastLoadedGroupIds.add(group.id);\n setTimeout(() => {\n this.lastLoadedGroupIds.delete(group.id);\n }, 1000);\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 // Request data when expanding group with no data\n if (newExpandedState && (!group.rows || group.rows.length === 0)) {\n this.requestRowsForGroup(group);\n }\n }\n\n\n // processRowLoadQueue - REMOVED\n // Queue-based loading is replaced with direct signal emission\n // See requestRowsForGroup() method for the new approach\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 groupSeperatorColSpan(): number {\n if(this.gridStore.configuration().config.allowSelection) {\n return this.columns().length + 1;\n }\n return this.columns().length;\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 [eruGridStore]=\"gridStore\">\n </data-cell>\n </div>\n </td>\n }\n }\n } @else {\n <td [style.height.px]=\"50\" [attr.colspan]=\"getLeafColumns().length\"> </td>\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]=\"30\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event)\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n >\n <div class=\"table-wrapper\">\n \n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <thead>\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\"></th>\n }\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header table-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' && groups().length > 1\"\n class=\"group-header\"\n (click)=\"toggleGroupExpansion(groupItem.group?.id || '')\"\n >\n \n <td class=\"checkbox-column\" style=\"border: none;\">\n {{ groupItem.group?.isExpanded ? '▼' : '▶' }}\n </td>\n \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' && groups().length > 1\" style=\"background:#fafafa\">\n @if(gridStore.configuration().config.allowSelection) {\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 }\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 @if(gridStore.configuration().config.allowSelection) {\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 }\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]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\"\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 @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\"></th>\n }\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]=\"groupSeperatorColSpan()\" 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 \n <data-cell\n [fieldSize]=\"header.field_size\"\n [columnDatatype]=\"header.dataType\"\n [columnName]=\"header.name\"\n [value]=\"header.label\"\n [column]=\"header\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"header.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + $index + '_' + header.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\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 [eruGridStore]=\"gridStore\">\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 // 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 // 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 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 console.log(columns)\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 // Generate subtotals for EACH level of column dimensions separately\n // This creates subtotals for Priority, Rating, etc. individually\n for (let dimIndex = 0; dimIndex < subtotalDimensions.length; dimIndex++) {\n const currentDimension = subtotalDimensions[dimIndex];\n const currentDimensionValues = dimensionValues[dimIndex];\n \n // For each value in this dimension\n currentDimensionValues.forEach(dimValue => {\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 = `_${dimValue}_subtotal_${aggregation.name}`;\n columns.push({\n name: columnName,\n label: `${dimValue} 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\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 // Extract unique values for each column dimension\n const dimensionValues = columnDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n // Extract unique values from pivot column names\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 // Generate hierarchical subtotal combinations \n const subtotalCombinations = this.generateSubtotalCombinations(dimensionValues, columnDimensions.length - 1);\n \n subtotalCombinations.forEach(combination => {\n const { dimensionPath, level } = combination;\n \n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = fields.find(field => field.name === aggregation.name);\n const subtotalColumnName = `_${dimensionPath.join('_')}_subtotal_${aggregation.name}`;\n const subtotalLabel = level === 0 \n ? `${dimensionPath[0]} Subtotal - ${aggregation.label || aggregation.name}`\n : `${dimensionPath.join('+')} Subtotal - ${aggregation.label || aggregation.name}`;\n \n columns.push({\n name: subtotalColumnName,\n label: subtotalLabel,\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,gridConfiguration);\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 // 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 dataType: fields.find((col: Field) => col.name === dimension)?.datatype || 'textbox' as DataTypes\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 dataType: this.getAggregationDataType(aggregation.aggregationFunction)\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 dataType: this.getAggregationDataType(aggregation.aggregationFunction)\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 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 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 const column = gridConfiguration?.fields.find((col: Field) => col.name === dimension)\n // Add the priority header\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 enableDrilldown: column?.enableDrilldown || false,\n dataType: column?.datatype || 'textbox' as DataTypes\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 dataType: agg.datatype || 'textbox' as DataTypes\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 - GENERIC VERSION\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 \n // If subtotals are not enabled, use original logic\n if (!isColumnSubtotalsEnabled || dimensionValues.length <= 1) {\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 // With subtotals enabled, calculate based on interleaved structure - GENERIC\n const subtotalAggregations = aggregations.filter(agg => agg.showSubtotals);\n let colspan = 0;\n \n // Calculate child columns recursively for all remaining levels\n let childColumns = aggregationCount; // Base aggregation columns\n for (let i = currentLevel + 1; i < dimensionValues.length; i++) {\n childColumns *= dimensionValues[i].length;\n }\n \n // Calculate subtotal columns for each level below current level (not including final level)\n let subtotalColumns = 0;\n for (let subtotalLevel = currentLevel + 1; subtotalLevel < dimensionValues.length - 1; subtotalLevel++) {\n // Count unique combinations of all levels from currentLevel+1 to subtotalLevel (inclusive)\n let combinations = 1;\n for (let i = currentLevel + 1; i <= subtotalLevel; i++) {\n combinations *= dimensionValues[i].length;\n }\n subtotalColumns += combinations * subtotalAggregations.length;\n }\n \n // Add own subtotal for this level (except final level)\n let ownSubtotal = 0;\n if (currentLevel < dimensionValues.length - 1) {\n ownSubtotal = subtotalAggregations.length;\n }\n \n colspan = childColumns + subtotalColumns + ownSubtotal;\n \n return colspan;\n }\n\n /**\n * Generate leaf columns for the actual data with collapsible support\n */\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 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 // Handle column subtotals positioning if enabled\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n \n // Add column subtotal columns with proper interleaved positioning\n if (enableColumnSubtotals && columnDimensions.length > 1) {\n \n // Store all regular columns first\n const regularColumns = columns.filter(col => !col.name.includes('_subtotal_'));\n const nonPivotColumns = regularColumns.filter(col => !col.name.includes('|'));\n const pivotColumns = regularColumns.filter(col => col.name.includes('|'));\n \n \n // Clear columns array and rebuild with interleaved subtotals\n columns.length = 0;\n columnIndex = 0;\n \n // Add non-pivot columns first (Location, Email, etc.)\n nonPivotColumns.forEach(col => {\n col.grid_index = columnIndex++;\n columns.push(col);\n });\n \n // Now add pivot columns with interleaved subtotals\n const interleavedColumns = this.addInterleavedSubtotals(\n pivotColumns,\n dimensionValues,\n aggregations,\n columnDimensions,\n gridConfiguration,\n columnIndex,\n subtotalPositionColumn\n );\n \n columns.push(...interleavedColumns);\n \n // Add column grand total columns if enabled (after pivot columns) - for subtotal case\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 // 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 \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 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 \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 console.log(combinations)\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 const column = columns.find((col: Field) => col.name === dimension)\n headerRows[0].push({\n label: this.formatColumnLabel(column?.label || dimension),\n name: dimension,\n level: 0,\n colspan: 1,\n rowspan: 1,\n enableDrilldown: column?.enableDrilldown || false,\n dataType: column?.datatype || 'textbox' as DataTypes\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 dataType: 'textbox' as DataTypes\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 // 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 // Calculate subtotals for ALL dimensions except the last one\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\n const dimensionValues = configuration.cols.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n // Extract unique values from pivot column names\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 \n // Generate all possible subtotal combinations for each dimension level\n const subtotalCombinations = this.generateSubtotalCombinations(dimensionValues, subtotalDimensions.length);\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 subtotal combination\n subtotalCombinations.forEach(combination => {\n const { dimensionPath, level } = combination;\n \n // For each aggregation, calculate subtotal for this combination\n configuration.aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n // Create subtotal column name based on the dimension path\n const subtotalColumnName = `_${dimensionPath.join('_')}_subtotal_${aggregation.name}`;\n let measureTotal = 0;\n const matchedColumns: string[] = [];\n \n // Find all columns that match this dimension combination and sum their values\n Object.keys(row).forEach(key => {\n if (key.endsWith(`_${aggregation.name}`) && typeof row[key] === 'number') {\n // The key format is \"Priority|Rating|Status_measure\" (e.g., \"Low|0|Open_number\")\n const columnKey = key.split('_')[0]; // Get the part before the aggregation name\n const columnParts = columnKey.split('|');\n \n // Check if this column matches the current dimension path exactly\n let isMatch = true;\n for (let i = 0; i <= level; i++) {\n if (columnParts[i] !== dimensionPath[i]) {\n isMatch = false;\n break;\n }\n }\n \n if (isMatch) {\n measureTotal += row[key];\n matchedColumns.push(key);\n }\n }\n });\n \n newRow[subtotalColumnName] = measureTotal;\n }\n });\n });\n \n result.push(newRow);\n }\n\n return result;\n }\n\n /**\n * Generate all possible subtotal combinations for hierarchical column dimensions\n */\n private generateSubtotalCombinations(\n dimensionValues: string[][],\n subtotalLevels: number\n ): Array<{ dimensionPath: string[], level: number }> {\n const combinations: Array<{ dimensionPath: string[], level: number }> = [];\n \n // For each level that should have subtotals (0 to subtotalLevels-1)\n for (let level = 0; level < subtotalLevels; level++) {\n // Generate all combinations up to this level\n const pathsAtLevel = this.generateCombinationsAtLevel(dimensionValues, level);\n \n pathsAtLevel.forEach(path => {\n combinations.push({\n dimensionPath: path,\n level: level\n });\n });\n }\n \n return combinations;\n }\n\n /**\n * Generate all possible dimension paths at a specific level\n */\n private generateCombinationsAtLevel(\n dimensionValues: string[][],\n targetLevel: number\n ): string[][] {\n if (targetLevel === 0) {\n // For level 0, return individual values from first dimension\n return dimensionValues[0].map(value => [value]);\n }\n \n // For higher levels, generate cartesian product up to targetLevel\n const relevantDimensions = dimensionValues.slice(0, targetLevel + 1);\n return this.generateCombinations(relevantDimensions);\n }\n\n /**\n * Generate columns with properly positioned subtotal columns\n */\n private generateColumnsWithInterleavedSubtotals(\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration,\n startingColumnIndex: number = 0\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = startingColumnIndex;\n const subtotalPositionColumn = gridConfiguration?.config?.subtotalPositionColumn ?? 'after';\n \n // Generate all pivot combinations in proper order\n const allCombinations = this.generateCombinations(dimensionValues);\n \n // Group by first level (Priority: Low, Medium, Urgent)\n const priorityGroups = new Map<string, string[][]>();\n allCombinations.forEach(combination => {\n const priority = combination[0];\n if (!priorityGroups.has(priority)) {\n priorityGroups.set(priority, []);\n }\n priorityGroups.get(priority)!.push(combination);\n });\n \n // Process each priority group\n Array.from(priorityGroups.keys()).sort().forEach(priority => {\n const priorityCombinations = priorityGroups.get(priority)!;\n \n // If we have multiple dimension levels, group by second level within this priority\n if (columnDimensions.length > 2) {\n const ratingGroups = new Map<string, string[][]>();\n priorityCombinations.forEach(combination => {\n if (combination.length >= 2) {\n const rating = combination[1];\n const ratingKey = `${priority}|${rating}`;\n if (!ratingGroups.has(ratingKey)) {\n ratingGroups.set(ratingKey, []);\n }\n ratingGroups.get(ratingKey)!.push(combination);\n }\n });\n \n // Process each rating group within this priority\n Array.from(ratingGroups.keys()).sort().forEach(ratingKey => {\n const ratingCombinations = ratingGroups.get(ratingKey)!;\n \n // Add all columns for this rating group\n ratingCombinations.forEach(combination => {\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 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 // Add rating subtotal after this rating group\n if (subtotalPositionColumn === 'after') {\n const ratingParts = ratingKey.split('|');\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const subtotalColumnName = `_${ratingParts.join('_')}_subtotal_${aggregation.name}`;\n const subtotalLabel = `${ratingParts.join('+')} Subtotal - ${aggregation.label || aggregation.name}`;\n \n columns.push({\n name: subtotalColumnName,\n label: subtotalLabel,\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: ratingParts,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n }\n });\n }\n });\n } else {\n // For 2 dimensions, just add all columns for this priority\n priorityCombinations.forEach(combination => {\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 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 priority subtotal after all rating groups for this priority\n if (subtotalPositionColumn === 'after') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const subtotalColumnName = `_${priority}_subtotal_${aggregation.name}`;\n const subtotalLabel = `${priority} Subtotal - ${aggregation.label || aggregation.name}`;\n \n columns.push({\n name: subtotalColumnName,\n label: subtotalLabel,\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: [priority],\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n });\n }\n });\n }\n });\n \n // Add column grand totals if positioned after\n const enableColumnGrandTotal = gridConfiguration?.config?.enableColumnGrandTotal ?? false;\n const grandTotalPositionColumn = gridConfiguration?.config?.grandTotalPositionColumn ?? 'after';\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 * Group combinations by dimension levels for subtotal insertion\n */\n private groupCombinationsByDimensions(\n allCombinations: string[][],\n maxLevel: number\n ): Array<Array<{ prefix: string[], combinations: string[][] }>> {\n const groupedByLevel: Array<Array<{ prefix: string[], combinations: string[][] }>> = [];\n \n // For each level (0 to maxLevel-1)\n for (let level = 0; level < maxLevel; level++) {\n const levelGroups: Array<{ prefix: string[], combinations: string[][] }> = [];\n const groupMap = new Map<string, string[][]>();\n \n // Group combinations by prefix at this level\n allCombinations.forEach(combination => {\n if (combination.length > level) {\n const prefix = combination.slice(0, level + 1);\n const prefixKey = prefix.join('|');\n \n if (!groupMap.has(prefixKey)) {\n groupMap.set(prefixKey, []);\n }\n groupMap.get(prefixKey)!.push(combination);\n }\n });\n \n // Convert map to array format\n groupMap.forEach((combinations, prefixKey) => {\n const prefix = prefixKey.split('|');\n levelGroups.push({ prefix, combinations });\n });\n \n groupedByLevel.push(levelGroups);\n }\n \n return groupedByLevel;\n }\n\n /**\n * Add interleaved subtotals within column groups\n */\n private addInterleavedSubtotals(\n pivotColumns: Field[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[],\n gridConfiguration?: GridConfiguration,\n startingIndex: number = 0,\n subtotalPosition: 'before' | 'after' = 'after'\n ): Field[] {\n const result: Field[] = [];\n let columnIndex = startingIndex;\n \n \n // For now, let's implement a simpler approach - group by Priority first\n const priorityGroups = new Map<string, Field[]>();\n \n // Group columns by Priority (first dimension)\n pivotColumns.forEach(column => {\n const columnKey = column.name.split('_')[0]; // Get part before aggregation\n const parts = columnKey.split('|');\n const priority = parts[0]; // Low, Medium, Urgent\n \n if (!priorityGroups.has(priority)) {\n priorityGroups.set(priority, []);\n }\n priorityGroups.get(priority)!.push(column);\n });\n \n \n // Process each priority group\n Array.from(priorityGroups.keys()).sort().forEach(priority => {\n const priorityColumns = priorityGroups.get(priority)!;\n \n // Add priority subtotal before if configured\n if (subtotalPosition === 'before') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n [priority],\n 0,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n \n // Group priority columns by Rating (second dimension)\n const ratingGroups = new Map<string, Field[]>();\n priorityColumns.forEach(column => {\n const columnKey = column.name.split('_')[0];\n const parts = columnKey.split('|');\n if (parts.length >= 2) {\n const rating = parts[1]; // 0, 1, 3, 5\n const ratingKey = `${priority}|${rating}`;\n \n if (!ratingGroups.has(ratingKey)) {\n ratingGroups.set(ratingKey, []);\n }\n ratingGroups.get(ratingKey)!.push(column);\n }\n });\n \n // Process each rating group within this priority\n Array.from(ratingGroups.keys()).sort().forEach(ratingKey => {\n const ratingColumns = ratingGroups.get(ratingKey)!;\n const ratingParts = ratingKey.split('|'); // [priority, rating]\n \n // Add rating subtotal before if configured\n if (subtotalPosition === 'before') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n ratingParts,\n 1,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n \n // Add the actual columns for this rating group\n ratingColumns.forEach(col => {\n col.grid_index = columnIndex++;\n result.push(col);\n });\n \n // Add rating subtotal after if configured \n if (subtotalPosition === 'after') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n ratingParts,\n 1,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n });\n \n // Add priority subtotal after if configured\n if (subtotalPosition === 'after') {\n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalColumn = this.createSubtotalColumn(\n [priority],\n 0,\n aggregation,\n gridConfiguration,\n columnIndex++\n );\n result.push(subtotalColumn);\n }\n });\n }\n });\n \n return result;\n }\n\n /**\n * Group pivot columns by dimension prefixes for subtotal insertion\n */\n private groupPivotColumnsByDimensions(\n pivotColumns: Field[],\n maxLevel: number\n ): Array<Array<{ prefix: string[], columns: Field[] }>> {\n const groupedByLevel: Array<Array<{ prefix: string[], columns: Field[] }>> = [];\n \n // For each level that should have subtotals\n for (let level = 0; level < maxLevel; level++) {\n const levelGroups: Array<{ prefix: string[], columns: Field[] }> = [];\n const groupMap = new Map<string, Field[]>();\n \n // Group columns by their dimension prefix at this level\n pivotColumns.forEach(column => {\n const columnKey = column.name.split('_')[0]; // Get part before aggregation\n const parts = columnKey.split('|');\n \n if (parts.length > level) {\n const prefix = parts.slice(0, level + 1);\n const prefixKey = prefix.join('|');\n \n if (!groupMap.has(prefixKey)) {\n groupMap.set(prefixKey, []);\n }\n groupMap.get(prefixKey)!.push(column);\n }\n });\n \n // Convert map to array format and sort\n Array.from(groupMap.keys()).sort().forEach(prefixKey => {\n const prefix = prefixKey.split('|');\n const columns = groupMap.get(prefixKey)!;\n levelGroups.push({ prefix, columns });\n });\n \n groupedByLevel.push(levelGroups);\n }\n \n return groupedByLevel;\n }\n\n /**\n * Create a subtotal column for a specific dimension prefix\n */\n private createSubtotalColumn(\n prefix: string[],\n level: number,\n aggregation: any,\n gridConfiguration?: GridConfiguration,\n gridIndex: number = 0\n ): Field {\n const aggregationColumn = gridConfiguration?.fields.find((col: Field) => col.name === aggregation.name);\n const subtotalColumnName = `_${prefix.join('_')}_subtotal_${aggregation.name}`;\n const subtotalLabel = level === 0 \n ? `${prefix[0]} Subtotal - ${aggregation.label || aggregation.name}`\n : `${prefix.join('+')} Subtotal - ${aggregation.label || aggregation.name}`;\n \n return {\n name: subtotalColumnName,\n label: subtotalLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: aggregation.field_size || aggregationColumn?.field_size || 120,\n grid_index: gridIndex,\n isLeaf: true,\n level: level + 1,\n parentPath: prefix,\n rowspan: 1,\n colspan: 1,\n aggregationFunction: aggregation.aggregationFunction,\n enableDrilldown: aggregation.enableDrilldown || false\n };\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 // Excel/CSV export methods removed\n // Export functionality should be implemented in the consuming application\n // Previously removed methods: exportToCsv, exportToExcel, exportToExcelFile, createXlsxSheet,\n // createSimplifiedXlsxSheet, addXlsxHeaders, addXlsxDataRows, setXlsxColumnWidths,\n // applyXlsxStyling, getXlsxHeaderStyle, getXlsxDataStyle, formatXlsxValue,\n // getXlsxValueType, getXlsxRange, generateRowKeyForExcel, and all xlsx helper methods\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 // Get all dimension values the same way as leaf columns\n const allDimensionValues = columnDimensions.map((dimension: string, dimIndex: number) => {\n const values = new Set<string>();\n \n if (sourceData && sourceData.length > 0) {\n sourceData.forEach(row => {\n const value = row[dimension]?.toString();\n if (value !== undefined && value !== null) {\n values.add(value);\n }\n });\n } else {\n // No fallback - if no source data, return empty values\n // Generic pivot grid should not have hardcoded dimension values\n }\n return Array.from(values).sort();\n });\n\n // Add subtotal headers at correct row levels, then rearrange to match leaf column order\n this.addSubtotalHeadersAtCorrectLevels(headerRows, allDimensionValues, aggregations, columnDimensions);\n this.rearrangeHeadersToMatchLeafColumns(headerRows, columnDimensions, subtotalPositionColumn, sourceData || []);\n }\n\n /**\n * Add subtotal headers at their correct row levels\n */\n private addSubtotalHeadersAtCorrectLevels(\n headerRows: PivotColumnHeader[][],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[]\n ): void {\n \n // Generate hierarchical subtotal combinations\n const subtotalCombinations = this.generateSubtotalCombinations(dimensionValues, columnDimensions.length - 1);\n \n subtotalCombinations.forEach(combination => {\n const { dimensionPath, level } = combination;\n \n aggregations.forEach(aggregation => {\n if (aggregation.showSubtotals) {\n const subtotalHeader: PivotColumnHeader = {\n name: `_${dimensionPath.join('_')}_subtotal_${aggregation.name}`,\n label: level === 0 \n ? `${dimensionPath[0]} Subtotal - ${aggregation.label || aggregation.name}`\n : `${dimensionPath.join('+')} Subtotal - ${aggregation.label || aggregation.name}`,\n level: level + 1, // Place subtotal at the next level down from its dimension\n colspan: 1,\n rowspan: headerRows.length - (level + 1), // Span remaining rows\n parentGroupKey: level === 0 ? dimensionPath[0] : dimensionPath.join('+'), // Parent group identifier for target row\n parentValue: level === 0 ? dimensionPath[0] : dimensionPath.join('+'), // Parent group value for easier identification\n isSubtotal: true,\n dataType: aggregation.datatype || 'textbox' as DataTypes\n };\n \n // Add to the appropriate row based on dimension level\n // Priority subtotals go to Rating row (level 1), Rating subtotals go to Status row (level 2)\n const targetRow = Math.min(level + 1, headerRows.length - 1);\n headerRows[targetRow].push(subtotalHeader);\n }\n });\n });\n }\n\n /**\n * Rearrange headers in each row to match the leaf column order\n */\n private rearrangeHeadersToMatchLeafColumns(\n headerRows: PivotColumnHeader[][],\n columnDimensions: string[],\n subtotalPositionColumn: 'before' | 'after',\n sourceData: any[]\n ): void {\n \n // Process each header row to reorder headers to match leaf column structure\n headerRows.forEach((headerRow, rowIndex) => {\n if (rowIndex >= columnDimensions.length) return; // Skip aggregation level\n \n \n // Separate pivot headers from row dimension headers\n const rowDimensionHeaders = headerRow.filter(h => !columnDimensions.includes(h.name) && !h.name.includes('|') && !h.name.includes('_subtotal_'));\n const pivotHeaders = headerRow.filter(h => columnDimensions.includes(h.name) || h.name.includes('|'));\n const subtotalHeaders = headerRow.filter(h => h.name.includes('_subtotal_'));\n \n // Group headers by their hierarchical position to match leaf column order\n const reorderedHeaders = this.reorderHeadersByHierarchy(pivotHeaders, subtotalHeaders, rowIndex, columnDimensions, subtotalPositionColumn, sourceData || []);\n \n // Clear and rebuild the header row\n headerRow.length = 0;\n headerRow.push(...rowDimensionHeaders, ...reorderedHeaders);\n \n });\n }\n\n /**\n * Reorder headers by hierarchy to match leaf column interleaved positioning - GENERIC VERSION\n */\n private reorderHeadersByHierarchy(\n pivotHeaders: PivotColumnHeader[],\n subtotalHeaders: PivotColumnHeader[],\n rowIndex: number,\n columnDimensions: string[],\n subtotalPositionColumn: 'before' | 'after',\n sourceData: any[]\n ): PivotColumnHeader[] {\n const reordered: PivotColumnHeader[] = [];\n \n if (rowIndex === 0) {\n // Priority level - just add priority headers as they are\n reordered.push(...pivotHeaders);\n } else if (rowIndex === 1) {\n // Rating level - interleave rating headers with priority subtotals\n // Add parentGroupKey to regular headers based on their position\n this.addParentGroupKeysToHeaders(pivotHeaders, rowIndex, sourceData, columnDimensions);\n \n // Group rating headers by their priority parent using parentGroupKey\n const ratingGroups = this.groupHeadersByParentKey(pivotHeaders);\n const prioritySubtotals = this.groupSubtotalsByParentKey(subtotalHeaders);\n \n // Process each first dimension group in correct order (dynamically extracted)\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n firstDimensionValues.forEach(firstDimensionValue => {\n const ratingHeaders = ratingGroups[firstDimensionValue] || [];\n const subtotals = prioritySubtotals[firstDimensionValue] || [];\n \n // Add rating headers for this priority\n if (subtotalPositionColumn === 'before') {\n // Add subtotals first, then rating headers\n reordered.push(...subtotals);\n reordered.push(...ratingHeaders);\n } else {\n // Add rating headers first, then subtotals\n reordered.push(...ratingHeaders);\n reordered.push(...subtotals);\n }\n });\n } else if (rowIndex === 2) {\n // Status level - interleave status headers with rating subtotals \n this.addParentGroupKeysToHeaders(pivotHeaders, rowIndex, sourceData, columnDimensions);\n \n const statusGroups = this.groupHeadersByParentKey(pivotHeaders);\n const ratingSubtotals = this.groupSubtotalsByParentKey(subtotalHeaders);\n \n console.log(`DEBUG: Status groups with parentKey: ${Object.keys(statusGroups).length}, Rating subtotals: ${Object.keys(ratingSubtotals).length}`);\n \n // Process each dimension combination dynamically\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n const secondDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[1]);\n firstDimensionValues.forEach(firstDimensionValue => {\n secondDimensionValues.forEach(secondDimensionValue => {\n const groupKey = `${firstDimensionValue}+${secondDimensionValue}`;\n const statusHeaders = statusGroups[groupKey] || [];\n const subtotals = ratingSubtotals[groupKey] || [];\n \n if (subtotalPositionColumn === 'before') {\n // Add subtotals first, then status headers\n reordered.push(...subtotals);\n reordered.push(...statusHeaders);\n } else {\n // Add status headers first, then subtotals\n reordered.push(...statusHeaders);\n reordered.push(...subtotals);\n }\n });\n });\n }\n \n return reordered;\n }\n\n /**\n * Extract unique values for a specific column dimension from source data\n */\n private extractDimensionValues(sourceData: any[], dimension: string): string[] {\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 * Extract all dimension values arrays from headers or source data\n */\n private extractAllDimensionValues(sourceData: any[], columnDimensions: string[]): string[][] {\n return columnDimensions.map(dimension => this.extractDimensionValues(sourceData, dimension));\n }\n\n /**\n * Group rating headers by their priority parent - GENERIC VERSION\n */\n private groupRatingHeadersByPriority(headers: PivotColumnHeader[], sourceData: any[], columnDimensions: string[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n if (columnDimensions.length >= 2) {\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n const secondDimensionCount = this.extractDimensionValues(sourceData, columnDimensions[1]).length;\n \n headers.forEach(header => {\n const headerIndex = headers.indexOf(header);\n const firstDimensionIndex = Math.floor(headerIndex / secondDimensionCount);\n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n \n if (!groups[firstDimensionValue]) groups[firstDimensionValue] = [];\n groups[firstDimensionValue].push(header);\n });\n }\n \n return groups;\n }\n\n /**\n * Group subtotals by their priority\n */\n private groupSubtotalsByPriority(subtotals: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n subtotals.forEach(subtotal => {\n if (subtotal.label && subtotal.label.includes('Subtotal')) {\n const priority = subtotal.label.split(' ')[0]; // Extract \"Low\", \"Medium\", \"Urgent\"\n if (!groups[priority]) groups[priority] = [];\n groups[priority].push(subtotal);\n }\n });\n \n return groups;\n }\n\n /**\n * Group status headers by their rating parent (combination) - GENERIC VERSION\n */\n private groupStatusHeadersByRating(headers: PivotColumnHeader[], sourceData: any[], columnDimensions: string[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n if (columnDimensions.length >= 3) {\n const firstDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[0]);\n const secondDimensionValues = this.extractDimensionValues(sourceData, columnDimensions[1]);\n const thirdDimensionCount = this.extractDimensionValues(sourceData, columnDimensions[2]).length;\n \n headers.forEach(header => {\n const headerIndex = headers.indexOf(header);\n const secondDimensionIndex = Math.floor(headerIndex / thirdDimensionCount);\n const firstDimensionIndex = Math.floor(secondDimensionIndex / secondDimensionValues.length);\n \n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n const secondDimensionValue = secondDimensionValues[secondDimensionIndex % secondDimensionValues.length] || secondDimensionValues[0] || '';\n const groupKey = `${firstDimensionValue}+${secondDimensionValue}`;\n \n if (!groups[groupKey]) groups[groupKey] = [];\n groups[groupKey].push(header);\n });\n }\n \n return groups;\n }\n\n /**\n * Group subtotals by their rating (Priority+Rating combination)\n */\n private groupSubtotalsByRating(subtotals: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n subtotals.forEach(subtotal => {\n if (subtotal.label && subtotal.label.includes('+') && subtotal.label.includes('Subtotal')) {\n const parts = subtotal.label.split(' ')[0]; // Extract \"Low+0\", \"Medium+1\", etc.\n if (!groups[parts]) groups[parts] = [];\n groups[parts].push(subtotal);\n }\n });\n \n return groups;\n }\n\n /**\n * Add parent group keys to headers based on their position and row level - GENERIC VERSION\n */\n private addParentGroupKeysToHeaders(headers: PivotColumnHeader[], rowIndex: number, sourceData: any[], columnDimensions: string[]): void {\n if (!columnDimensions || columnDimensions.length === 0 || rowIndex < 1) {\n return;\n }\n\n // Extract all dimension values dynamically\n const dimensionValues = this.extractAllDimensionValues(sourceData, columnDimensions);\n \n if (rowIndex === 1) {\n // Second level (e.g., Rating level) - assign parent first dimension group keys\n const firstDimensionValues = dimensionValues[0] || [];\n if (dimensionValues.length >= 2) {\n const secondDimensionCount = dimensionValues[1].length;\n headers.forEach((header, index) => {\n const firstDimensionIndex = Math.floor(index / secondDimensionCount);\n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n header.parentGroupKey = firstDimensionValue;\n header.parentValue = firstDimensionValue;\n });\n }\n } else if (rowIndex === 2) {\n // Third level (e.g., Status level) - assign parent combination group keys\n if (dimensionValues.length >= 3) {\n const firstDimensionValues = dimensionValues[0] || [];\n const secondDimensionValues = dimensionValues[1] || [];\n const thirdDimensionCount = dimensionValues[2].length;\n \n headers.forEach((header, index) => {\n const secondDimensionIndex = Math.floor(index / thirdDimensionCount);\n const firstDimensionIndex = Math.floor(secondDimensionIndex / secondDimensionValues.length);\n \n const firstDimensionValue = firstDimensionValues[firstDimensionIndex] || firstDimensionValues[0] || '';\n const secondDimensionValue = secondDimensionValues[secondDimensionIndex % secondDimensionValues.length] || secondDimensionValues[0] || '';\n \n const parentKey = `${firstDimensionValue}+${secondDimensionValue}`;\n header.parentGroupKey = parentKey;\n header.parentValue = parentKey;\n });\n }\n }\n }\n\n /**\n * Group headers by their parentGroupKey\n */\n private groupHeadersByParentKey(headers: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n headers.forEach(header => {\n const parentKey = header.parentGroupKey || 'Unknown';\n if (!groups[parentKey]) groups[parentKey] = [];\n groups[parentKey].push(header);\n });\n \n return groups;\n }\n\n /**\n * Group subtotals by their parentGroupKey\n */\n private groupSubtotalsByParentKey(subtotals: PivotColumnHeader[]): Record<string, PivotColumnHeader[]> {\n const groups: Record<string, PivotColumnHeader[]> = {};\n \n subtotals.forEach(subtotal => {\n const parentKey = subtotal.parentGroupKey || 'Unknown';\n if (!groups[parentKey]) groups[parentKey] = [];\n groups[parentKey].push(subtotal);\n });\n \n return groups;\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 Drilldown,\n PivotRow,\n RowDataRequest,\n RowDataResponse\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()\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 _drilldown = signal<Drilldown | null>(null);\n\n // Data request signal for virtual scrolling pagination\n private readonly _dataRequest = signal<RowDataRequest | null>(null);\n\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 drilldown = this._drilldown.asReadonly();\n\n // Data request readonly signal (exposed to consumers)\n readonly dataRequest = this._dataRequest.asReadonly();\n\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 \n this._configuration.set(this.validateAndEnforceConfiguration(newConfiguration));\n console.log(\"setColumns\",configuration.fields);\n this.setColumns(configuration.fields);\n \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 - REMOVED\n // This method has been removed as part of refactoring to signal-based architecture\n // Data fetching is now handled by the consuming application via dataRequest signal\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 } else {\n this._pivotConfiguration.set(null);\n this.setConfiguration(this._configuration());\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 console.log('🔄 SET PIVOT CONFIGURATION: Setting pivot configuration', pivotConfig);\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 // Excel/CSV export methods removed\n // Export functionality should be implemented in the consuming application\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 setDrilldown(drilldown: Drilldown,columnValues:string) {\n if(this.isPivotMode()){\n if (drilldown.frozenGrandTotalCell) {\n drilldown.rowData = this.pivotGrandTotalData()[0]\n } else {\n drilldown.rowData = this.pivotDisplayData()[parseInt(drilldown.rowId)]\n }\n } else {\n drilldown.rowData = this.rows()[parseInt(drilldown.rowId)-2]\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 console.log('🔄 SET DRILLDOWN: Drilldown', drilldown);\n this._drilldown.set(drilldown);\n }\n clearPivotDrilldown() {\n this._drilldown.set(null);\n }\n\n // Data request methods for signal-based virtual scrolling\n\n /**\n * Emit a data request signal (called by grid component)\n */\n setDataRequest(request: RowDataRequest) {\n console.log('📤 Grid Store: Emitting data request', request);\n this._dataRequest.set(request);\n }\n\n /**\n * Clear the data request signal (called by consumer after handling)\n */\n clearDataRequest() {\n this._dataRequest.set(null);\n }\n\n /**\n * Mark a group as loading (called by grid component before requesting)\n */\n startGroupLoading(groupId: string) {\n this.updateGroupLoadingState(groupId, true);\n }\n\n /**\n * Complete loading for a group (called by consumer after data received)\n */\n completeGroupLoading(groupId: string) {\n this.updateGroupLoadingState(groupId, false);\n }\n\n /**\n * Add rows for a specific group (called by consumer with API data)\n */\n addRowsForGroup(groupId: string, rows: Row[], hasMore: boolean) {\n console.log(`✅ Grid Store: Received ${rows.length} rows for group ${groupId}`);\n\n // Add rows to existing rows\n const existingRows = this.rows();\n const newRows = [...existingRows, ...rows];\n this._rows.set(newRows);\n\n // Update group state\n this.updateGroupAfterLoading(groupId, rows.length, !hasMore);\n }\n\n /**\n * Handle error for data request (called by consumer when API fails)\n */\n handleDataRequestError(groupId: string, error: any) {\n console.error(`❌ Grid Store: Data request failed for group ${groupId}`, error);\n this.updateGroupLoadingState(groupId, false);\n this.setError(`Failed to load data for group ${groupId}`);\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()\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.setGridMode('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 // Excel/CSV export methods removed\n // Export functionality should be implemented in the consuming application\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 eruGridStore = input.required<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 if (typeof value === 'string') {\n return value;\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().replace('pivot_', '').replace('_default|','')\n // Split on first underscore to get first part and rest\n const [rowId, ...columnName] = idSplit.split('_')\n const columnValues = columnName.join('_')\n const columnValuesSplit = columnValues.split('|')\n const colName = columnValuesSplit[columnValuesSplit.length - 1]\n console.log({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: colName,\n rowId: rowId,\n columnValue: this.currentValue()\n })\n console.log(columnValues)\n this.eruGridStore().setDrilldown({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: colName,\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('|').pop() : 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 //console.log(this.getColumnValue())\n //const columnValue = this.getColumnValue().replace('default|', '');\n //const columnValues = columnValue.split('|')\n //const colName = columnValues[columnValues.length - 1]\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\"><a class=\"drillable-link\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</a></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\"><a class=\"drillable-link\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</a></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\"><a class=\"drillable-link\"(click)=\"onDrillableClick($event)\">{{currentValue()}}/{{columnCellConfiguration()?.end_value || 5}}</a></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, GridConfiguration, RowDataRequest } from './model/grid.model';\nimport { EruGridService } from './eru-grid.service';\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 providers: [EruGridStore, EruGridService],\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 gridService: EruGridService = inject(EruGridService);\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 @Input() gridConfig: GridConfiguration | undefined;\n initialMinHeight = 400;\n initialTotalWidth = 0;\n @ViewChild('vp')\n vp!: CdkVirtualScrollViewport;\n groups = computed(() => this.gridStore.groups());\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 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 if(this.gridStore.isPivotMode()) {\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 // Ensure minimum usable height\n minHeight = Math.min(minHeight, rowHeight);\n minHeight = minHeight + 1;\n // Don't exceed parent height\n return minHeight;\n } else {\n return this.gridHeight();\n }\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 if(this.gridConfig) {\n this.gridService.set_table_configuration(this.gridConfig!);\n }\n if (this.gridConfig?.mode === 'pivot') {\n this.gridService.set_grid_mode(this.gridConfig.mode);\n }\n this.initializeColumnWidths();\n this.initializeGroups();\n this.firstDataRowIndex.set(this.maxDepth()+1);\n this.initialMinHeight = this.getMinHeightPx();\n this.initialTotalWidth = this.getTotalTableWidth();\n \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 \n private createGroupedRows(): GroupItem[] {\n const rows = this.gridStore.rows();\n const groups = this.gridStore.groups();\n console.log(\"groups\",groups);\n console.log(\"rows\",rows?.length);\n const flattenedRows: GroupItem[] = [];\n\n \n if(groups.length > 0) {\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 } else {\n rows.forEach(row => {\n flattenedRows.push({ type: 'row', group: undefined, row });\n });\n }\n console.log(\"flattenedRows\",flattenedRows?.length);\n return flattenedRows;\n }\n\n\n initializeGroups() {\n this.fetchInitialRows();\n }\n\n private fetchInitialRows() {\n console.log(\"fetchInitialRows\" , this.gridStore.groups());\n this.gridStore.groups().forEach(group => {\n if (group.isExpanded) {\n this.requestRowsForGroup(group);\n }\n });\n }\n\n // fetchRowsForGroup - REMOVED\n // Data fetching is now handled by the consuming application via signal\n // See requestRowsForGroup() method below for the new approach\n\n\n onScroll(scrollIndex: number) {\n console.log(\"onScroll called\" , scrollIndex);\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.groupedRows();\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 console.log(\"isNearEnd\" , renderedRange, dataLength, isNearEnd);\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 console.log(\"sortedGroupsToLoad\" , sortedGroupsToLoad);\n if (sortedGroupsToLoad.length > 0) {\n const groupToLoad = sortedGroupsToLoad[0];\n console.log(\"groupToLoad\" , groupToLoad);\n this.requestRowsForGroup(groupToLoad);\n }\n }\n\n\n // queueRowLoading - REPLACED with requestRowsForGroup\n // This method has been replaced with direct signal emission\n\n /**\n * Request rows for a specific group via signal\n */\n private requestRowsForGroup(group: RowGroup) {\n // Prevent duplicate requests\n console.log(\"requestRowsForGroup\" , group);\n if (this.lastLoadedGroupIds.has(group.id)) return;\n\n const request: RowDataRequest = {\n groupId: group.id,\n page: group.currentPage || 0,\n pageSize: group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE,\n timestamp: Date.now(),\n groupTitle: group.title\n };\n\n console.log('📤 Grid Component: Emitting data request', request);\n\n // Emit signal via store\n this.gridStore.setDataRequest(request);\n\n // Mark group as loading\n this.gridStore.startGroupLoading(group.id);\n\n // Prevent duplicate requests for 5 seconds\n this.lastLoadedGroupIds.add(group.id);\n setTimeout(() => {\n this.lastLoadedGroupIds.delete(group.id);\n }, 1000);\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 // Request data when expanding group with no data\n if (newExpandedState && (!group.rows || group.rows.length === 0)) {\n this.requestRowsForGroup(group);\n }\n }\n\n\n // processRowLoadQueue - REMOVED\n // Queue-based loading is replaced with direct signal emission\n // See requestRowsForGroup() method for the new approach\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 groupSeperatorColSpan(): number {\n if(this.gridStore.configuration().config.allowSelection) {\n return this.columns().length + 1;\n }\n return this.columns().length;\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 [eruGridStore]=\"gridStore\">\n </data-cell>\n </div>\n </td>\n }\n }\n } @else {\n <td [style.height.px]=\"50\" [attr.colspan]=\"getLeafColumns().length\"> </td>\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]=\"30\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event)\"\n [style]=\"'--table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n >\n <div class=\"table-wrapper\">\n \n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <thead>\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\"></th>\n }\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header table-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' && groups().length > 1\"\n class=\"group-header\"\n (click)=\"toggleGroupExpansion(groupItem.group?.id || '')\"\n >\n \n <td class=\"checkbox-column\" style=\"border: none;\">\n {{ groupItem.group?.isExpanded ? '▼' : '▶' }}\n </td>\n \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' && groups().length > 1\" style=\"background:#fafafa\">\n @if(gridStore.configuration().config.allowSelection) {\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 }\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 @if(gridStore.configuration().config.allowSelection) {\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 }\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]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\"\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 @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column\"></th>\n }\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]=\"groupSeperatorColSpan()\" 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 \n <data-cell\n [fieldSize]=\"header.field_size\"\n [columnDatatype]=\"header.dataType\"\n [columnName]=\"header.name\"\n [value]=\"header.label\"\n [column]=\"header\"\n [frozenGrandTotalCell]=\"true\"\n [drillable]=\"header.enableDrilldown || false\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"'pivot_' + $index + '_' + header.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\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 [eruGridStore]=\"gridStore\">\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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"}
|