eru-grid 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/eru-grid.mjs +6186 -674
- package/fesm2022/eru-grid.mjs.map +1 -1
- package/package.json +19 -7
- package/src/lib/assets/images/down-arrow.png +0 -0
- package/src/lib/styles/grid.scss +322 -0
- package/src/lib/styles/index.scss +51 -0
- package/src/lib/styles/theme.scss +96 -0
- package/types/eru-grid.d.ts +1512 -0
- package/index.d.ts +0 -917
|
@@ -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/services/column-constraints.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/eru-grid.service.ts","../../../projects/eru-grid/src/lib/components/data-cell/data-cell.utils.ts","../../../projects/eru-grid/src/lib/services/overlay-menu.service.ts","../../../projects/eru-grid/src/lib/providers/material.providers.ts","../../../projects/eru-grid/src/lib/components/currency/currency.component.ts","../../../projects/eru-grid/src/lib/components/currency/currency.component.html","../../../projects/eru-grid/src/lib/components/number/number.component.ts","../../../projects/eru-grid/src/lib/components/number/number.component.html","../../../projects/eru-grid/src/lib/components/textbox/textbox.component.ts","../../../projects/eru-grid/src/lib/components/textbox/textbox.component.html","../../../projects/eru-grid/src/lib/components/email/email.component.ts","../../../projects/eru-grid/src/lib/components/email/email.component.html","../../../projects/eru-grid/src/lib/components/textarea/textarea.component.ts","../../../projects/eru-grid/src/lib/components/textarea/textarea.component.html","../../../projects/eru-grid/src/lib/components/website/website.component.ts","../../../projects/eru-grid/src/lib/components/website/website.component.html","../../../projects/eru-grid/src/lib/components/location/location.component.ts","../../../projects/eru-grid/src/lib/components/location/location.component.html","../../../projects/eru-grid/src/lib/components/checkbox/checkbox.component.ts","../../../projects/eru-grid/src/lib/components/checkbox/checkbox.component.html","../../../projects/eru-grid/src/lib/components/date/custom-date-picker.directive.ts","../../../projects/eru-grid/src/lib/components/date/date.component.ts","../../../projects/eru-grid/src/lib/components/date/date.component.html","../../../projects/eru-grid/src/lib/components/time-picker/time-picker-panel.component.ts","../../../projects/eru-grid/src/lib/components/time-picker/time-picker-panel.component.html","../../../projects/eru-grid/src/lib/components/time-picker/time-picker.component.ts","../../../projects/eru-grid/src/lib/components/time-picker/time-picker.component.html","../../../projects/eru-grid/src/lib/components/datetime/datetime.component.ts","../../../projects/eru-grid/src/lib/components/datetime/datetime.component.html","../../../projects/eru-grid/src/lib/components/duration/duration.component.ts","../../../projects/eru-grid/src/lib/components/duration/duration.component.html","../../../projects/eru-grid/src/lib/components/phone/country-data.ts","../../../projects/eru-grid/src/lib/components/phone/phone.component.ts","../../../projects/eru-grid/src/lib/components/phone/phone.component.html","../../../projects/eru-grid/src/lib/components/progress/progress.component.ts","../../../projects/eru-grid/src/lib/components/progress/progress.component.html","../../../projects/eru-grid/src/lib/components/rating/rating.component.ts","../../../projects/eru-grid/src/lib/components/rating/rating.component.html","../../../projects/eru-grid/src/lib/components/select/select.component.ts","../../../projects/eru-grid/src/lib/components/select/select.component.html","../../../projects/eru-grid/src/lib/components/status/status.component.ts","../../../projects/eru-grid/src/lib/components/status/status.component.html","../../../projects/eru-grid/src/lib/components/tag/tag.component.ts","../../../projects/eru-grid/src/lib/components/tag/tag.component.html","../../../projects/eru-grid/src/lib/components/people/people.component.ts","../../../projects/eru-grid/src/lib/components/people/people.component.html","../../../projects/eru-grid/src/lib/components/priority/priority.component.ts","../../../projects/eru-grid/src/lib/components/priority/priority.component.html","../../../projects/eru-grid/src/lib/components/attachment/attachment.component.ts","../../../projects/eru-grid/src/lib/components/attachment/attachment.component.html","../../../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/lib/components/hello-world/hello-world.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 } 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 datetime: { minWidth: 140, maxWidth: 220 },\n duration: { 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\n /**\n * Get default field_size for a column following fallback hierarchy\n * Priority: column.field_size > datatype config minWidth > global config minWidth > datatype default minWidth > 150\n */\n getDefaultFieldSize(column: Field | undefined, gridConfig?: GridConfiguration): number {\n // If column already has field_size, return it\n if (column?.field_size) {\n return column.field_size;\n }\n\n // Start with datatype defaults\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 // Fallback hierarchy: datatype-config minWidth > global minWidth > datatype-default minWidth > 150\n return datatypeConfigConstraints.minWidth ?? \n globalConstraints.minWidth ?? \n datatypeDefaults.minWidth ?? \n 150;\n }\n}","import { Injectable, signal, computed, inject } from '@angular/core';\nimport {\n Field,\n Row,\n RowGroup,\n RowGrandTotal,\n GridConfiguration,\n GridMode,\n GridFeatures,\n PivotConfiguration,\n PivotResult,\n Drilldown,\n ActionClick,\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';\nimport { ColumnConstraintsService } from '../services/column-constraints.service';\n\n@Injectable()\nexport class EruGridStore {\n // Inject services\n private readonly gridConfigService = inject(GridConfigService);\n private readonly pivotTransformService = inject(PivotTransformService);\n private readonly columnConstraintsService = inject(ColumnConstraintsService);\n\n // State signals\n private readonly _columns = signal<Field[]>([]);\n private readonly _groups = signal<RowGroup[]>([]);\n private readonly _rows = signal<Row[]>([]);\n private _groupRows = signal<Map<string, Row[]>>(new Map());\n private readonly _selectedRowIds = signal<Set<string>>(new Set());\n private readonly _rowGrandTotal = signal<RowGrandTotal | null>(null);\n private readonly _dynamicDataRequest = signal<string[] | null>(null);\n private readonly _dynamicData = signal<Map<string, any> | null>(null);\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 private readonly _actionClick = signal<ActionClick | null>(null);\n\n // Data request signal for virtual scrolling pagination\n private readonly _dataRequest = signal<RowDataRequest | null>(null);\n \n // Request queue to handle multiple simultaneous requests\n private readonly _requestQueue = signal<RowDataRequest[]>([]);\n\n // Computed signals\n readonly columns = this._columns.asReadonly();\n readonly groups = this._groups.asReadonly();\n readonly rows = this._rows.asReadonly();\n readonly groupRows = this._groupRows.asReadonly();\n readonly selectedRowIds = this._selectedRowIds.asReadonly();\n readonly configuration = this._configuration.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly requestQueue = this._requestQueue.asReadonly();\n readonly error = this._error.asReadonly();\n readonly activeCell = this._activeCell.asReadonly();\n readonly rowGrandTotal = this._rowGrandTotal.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 readonly actionClick = this._actionClick.asReadonly();\n\n // Data request readonly signal (exposed to consumers)\n readonly dataRequest = this._dataRequest.asReadonly();\n \n // Dynamic data readonly signals\n readonly dynamicDataRequest = this._dynamicDataRequest.asReadonly();\n readonly dynamicData = this._dynamicData.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\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\n if (this.isPivotMode() && this.pivotResult()) {\n return this.pivotResult()!.columnDefinitions;\n }\n \n // In table mode, filter out grouped columns if groups exist\n const columns = this.columns();\n if (!this.isPivotMode() && this.groups().length > 0) {\n const groupedColumnNames = this.detectGroupedColumns(columns);\n if (groupedColumnNames.size > 0) {\n return columns.filter(column => !groupedColumnNames.has(column.name));\n }\n }\n \n return 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 // Apply field_size fallback logic for columns missing field_size\n // Priority: column.field_size > datatype config minWidth > global config minWidth > datatype default minWidth > 150\n const config = this.configuration();\n const normalizedColumns = columns.map(column => ({\n ...column,\n field_size: column.field_size || this.columnConstraintsService.getDefaultFieldSize(column, config)\n }));\n \n // Sort columns by grid_index to ensure proper order in table mode\n // Handles missing/gapped grid_index values correctly (e.g., 1, 4, 5 instead of 1, 2, 3)\n // If grid_index is the same, sort by column name as secondary criteria\n // Note: We keep all columns here; filtering of grouped columns happens in displayColumns computed\n const sortedColumns = [...normalizedColumns].sort((a, b) => {\n // Primary sort: by grid_index (handles gaps correctly - numeric comparison)\n if (a.grid_index !== b.grid_index) {\n return a.grid_index - b.grid_index;\n }\n // Secondary sort: by column name (alphabetically) when grid_index is the same\n return (a.name || '').localeCompare(b.name || '');\n });\n console.log('Sorted columns', sortedColumns);\n this._columns.set(sortedColumns);\n }\n \n /**\n * Detect which columns are used for grouping by analyzing row data\n * A column is considered grouped if all rows within each group have the same value\n */\n private detectGroupedColumns(columns: Field[]): Set<string> {\n const groupedColumns = new Set<string>();\n const groups = this.groups();\n \n // Need at least 2 groups to determine grouping, or check if we have rows\n if (groups.length === 0) {\n return groupedColumns;\n }\n \n // For each column, check if all rows within each group have the same value\n columns.forEach(column => {\n let isGroupedColumn = true;\n \n // Check each group\n for (const group of groups) {\n const groupRows = this.getRowsForGroup(group.id);\n \n // Need at least 2 rows in a group to determine if column values are same\n if (groupRows.length < 2) {\n // If only one row, we can't determine, so skip this check\n continue;\n }\n \n // Get the value from first row\n const firstValue = this.getRowColumnValue(groupRows[0], column.name);\n \n // Check if all other rows in this group have the same value\n const allSame = groupRows.every(row => {\n const rowValue = this.getRowColumnValue(row, column.name);\n // Compare values, handling null/undefined\n return this.compareValues(firstValue, rowValue);\n });\n \n // If not all rows in this group have the same value, it's not a grouped column\n if (!allSame) {\n isGroupedColumn = false;\n break;\n }\n }\n \n // Only mark as grouped if we checked at least one group with multiple rows\n // and all checked groups had consistent values\n if (isGroupedColumn) {\n // Verify we actually checked some groups (not all had < 2 rows)\n const groupsWithMultipleRows = groups.filter(g => this.getRowsForGroup(g.id).length >= 2);\n if (groupsWithMultipleRows.length > 0) {\n groupedColumns.add(column.name);\n }\n }\n });\n \n return groupedColumns;\n }\n \n /**\n * Get column value from a row\n */\n private getRowColumnValue(row: Row, columnName: string): any {\n // Check entity_data first, then direct row properties\n if (row['entity_data'] && row['entity_data'][columnName] !== undefined) {\n return row['entity_data'][columnName];\n }\n return ;\n }\n \n /**\n * Compare two values for equality, handling null/undefined\n */\n private compareValues(value1: any, value2: any): boolean {\n // Handle null/undefined\n if (value1 == null && value2 == null) {\n return true;\n }\n if (value1 == null || value2 == null) {\n return false;\n }\n // String comparison for consistency\n return String(value1) === String(value2);\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 // When dragging, we need to adjust the target index based on the drag direction\n // This is because splice operations shift the array indices\n let adjustedToIndex = toIndex;\n \n // When dragging from left to right (forward), after removing the source column,\n // all columns to the right shift left by 1, so the target index also shifts left\n if (fromIndex < toIndex) {\n adjustedToIndex = toIndex - 1;\n }\n // When dragging from right to left (backward), indices remain the same\n // because we're inserting before columns that haven't been shifted yet\n\n const [removedColumn] = currentColumns.splice(fromIndex, 1);\n currentColumns.splice(adjustedToIndex, 0, removedColumn);\n \n // Update grid_index values to reflect new order\n // grid_index starts from 1 (1-based), so position 0 = grid_index 1\n const reorderedColumns = currentColumns.map((col, index) => ({\n ...col,\n grid_index: index + 1 // grid_index typically starts from 1\n }));\n \n console.log('Column reorder completed', {\n fromIndex,\n toIndex,\n adjustedToIndex,\n finalOrder: reorderedColumns.map((col, idx) => ({ name: col.name, position: idx, grid_index: col.grid_index }))\n });\n \n this._columns.set(reorderedColumns);\n }\n\n updateColumnRequired(columnName: string, required: boolean) {\n const columns = this.columns().map(col => \n col.name === columnName ? { ...col, required } : col\n );\n this.setColumns(columns);\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 console.log(\"setGroups from grid.store\", groups);\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 console.log(\"toggleGroupExpansion completed\");\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 group = this.groups().find(g => g.id === groupId);\n if (group) {\n // Mutate the existing group object instead of creating a new one\n group.isLoading = false;\n group.currentPage = (group.currentPage || 0) + 1;\n group.currentLoadedRows = (group.currentLoadedRows || 0) + loadedCount;\n group.hasMoreRows = fullyExhausted \n ? false \n : group.currentLoadedRows < group.totalRowCount;\n \n // Trigger signal update with the same groups array\n this._groups.set([...this.groups()]);\n }\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.getRowsForGroup(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.getRowsForGroup(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 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.getRowsForGroup(groupId);\n return groupRows.length > 0 && \n groupRows.every(row => this.selectedRowIds().has(row.entity_id));\n }\n\n getRowsForGroup(groupId: string): Row[] {\n console.log(\"getRowsForGroup called for group\", groupId);\n console.log(\"groupRows\", this.groupRows());\n return this.groupRows().get(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 setActionClick(actionClick: ActionClick) {\n // Use provided rowData, or fetch it if not provided\n if (!actionClick.rowData) {\n if (this.isPivotMode()) {\n actionClick.rowData = this.pivotDisplayData()[parseInt(actionClick.rowId)];\n } else {\n // Try to find row by entity_id\n const row = this.rows().find(r => r.entity_id === actionClick.rowId);\n actionClick.rowData = row || this.rows()[parseInt(actionClick.rowId) - 2];\n }\n }\n console.log('🔄 SET ACTION CLICK: ActionClick', actionClick);\n this._actionClick.set(actionClick);\n }\n\n clearActionClick() {\n this._actionClick.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 * Add request to queue (for handling multiple simultaneous requests)\n */\n addToRequestQueue(request: RowDataRequest) {\n const currentQueue = this._requestQueue();\n this._requestQueue.set([...currentQueue, request]);\n }\n\n /**\n * Remove request from queue (called by consumer after handling)\n */\n removeFromRequestQueue(requestId: string) {\n const currentQueue = this._requestQueue();\n this._requestQueue.set(currentQueue.filter(req => req.groupId !== requestId));\n }\n\n /**\n * Clear all requests from queue\n */\n clearRequestQueue() {\n this._requestQueue.set([]);\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 this._groupRows.update(\n (map: any) => {\n map.set(groupId, [...(this._groupRows().get(groupId) || []), ...rows]);\n return map;\n }\n );\n \n // Update group metadata\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\n // Grand Total methods for table mode\n /**\n * Set the row grand total for table mode\n */\n setRowGrandTotal(grandTotal: RowGrandTotal | null) {\n this._rowGrandTotal.set(grandTotal);\n }\n\n /**\n * Get the row grand total for table mode\n */\n getRowGrandTotal(): RowGrandTotal | null {\n return this._rowGrandTotal();\n }\n\n // Dynamic data methods\n /**\n * Set the dynamic data request\n */\n setDynamicDataRequest(request: string): void {\n const currentRequests = this._dynamicDataRequest() || [];\n this._dynamicDataRequest.set([...currentRequests, request]);\n }\n\n /**\n * Get the dynamic data request\n */\n getDynamicDataRequest(): string[] | null {\n return this._dynamicDataRequest();\n }\n\n removeDynamicDataRequest(key: string) {\n if(!this._dynamicDataRequest()) {\n return;\n }\n this._dynamicDataRequest.set(this._dynamicDataRequest()?.filter((k: string) => k !== key) || []);\n }\n\n /**\n * Set the dynamic data\n */\n setDynamicData(key: string, data: any): void {\n const currentMap = this._dynamicData();\n const newMap = new Map<string, any>(currentMap || []);\n newMap.set(key, data);\n this._dynamicData.set(newMap);\n }\n\n /**\n * Get the dynamic data for a specific API key\n */\n getDynamicData(key: string): any | null {\n if(!this._dynamicData()) {\n return null;\n }\n return this._dynamicData()?.get(key) || null;\n }\n removeDynamicData(key: string) {\n if(!this._dynamicData()) {\n return;\n }\n this._dynamicData()?.delete(key);\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 { 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 console.log(\"set_table_group from eru-grid.service\", data);\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 { 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 textarea: (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 maxLength = config.maxLength || config.data_length;\n if (maxLength && value.length > maxLength) {\n return { isValid: false, error: `Maximum length is ${maxLength} characters` };\n }\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 website: (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.trim().length > 0) {\n // URL validation - allow http://, https://, or protocol-relative URLs\n const urlPattern = /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$/i;\n if (!urlPattern.test(value.trim())) {\n return { isValid: false, error: 'Invalid URL 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}; ","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 { Provider } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\n\n// Mock implementation of _HighContrastModeDetector\nclass MockHighContrastModeDetector {\n isHighContrastMode(): boolean {\n return false;\n }\n}\n\nexport const MATERIAL_PROVIDERS: Provider[] = [\n MatCommonModule,\n {\n provide: '_HighContrastModeDetector',\n useClass: MockHighContrastModeDetector,\n multi: false\n }\n];\n\nexport const MATERIAL_MODULES = [\n MatCommonModule\n];","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Field } from '../../model/grid.model';\n\nexport interface CurrencyValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-currency',\n templateUrl: './currency.component.html',\n styleUrls: ['./currency.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class CurrencyComponent {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | number | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n replaceZeroValue = input<string | undefined>(undefined);\n placeholder = input<string>('0.00');\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | number | null>();\n @Output() blur = new EventEmitter<string | number | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | number | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | number | null>(null);\n error = signal('');\n\n constructor() {\n // Watch for changes in the value input and update currentValue\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n formatNumberSignal = computed(() => {\n const cfg = this.config();\n const value = this.currentValue();\n\n // Handle null/undefined/empty\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n // Convert string to number if it's a numeric string\n let numValue: number;\n if (typeof value === 'string') {\n // Try to parse the string as a number\n const parsed = Number(value);\n if (isNaN(parsed)) {\n // If it's not a valid number, return as-is\n return value;\n }\n numValue = parsed;\n } else {\n numValue = Number(value);\n }\n\n // Handle zero replacement\n if (numValue == 0 && this.replaceZeroValue() !== undefined) {\n return this.replaceZeroValue();\n }\n\n const separator = cfg?.seperator || 'thousands';\n const decimalPlaces = cfg?.decimal ?? 2;\n const symbol = cfg?.symbol || '';\n\n if (separator === 'none') {\n return `${symbol ? symbol + ' ' : ''}${numValue.toFixed(decimalPlaces)}`;\n }\n\n let locale = 'en-US';\n if (separator === 'thousands') {\n locale = 'en-IN';\n }\n\n return `${symbol ? symbol + ' ' : ''}${\n numValue.toLocaleString(locale, {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces\n })\n }`;\n });\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onBlur(): void {\n const value = this.currentValue();\n const numValue = Number(value);\n const cfg = this.config();\n\n const validation = this.validateField(numValue);\n \n if (!validation.isValid && validation.error) {\n this.error.set(validation.error);\n this.validationError.emit(validation.error);\n } else {\n this.error.set('');\n // Force decimal places as specified in config\n const decimalPlaces = cfg?.decimal ?? 2;\n const formattedValue = parseFloat(numValue.toFixed(decimalPlaces));\n this.currentValue.set(formattedValue);\n this.blur.emit(formattedValue);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n private validateField(value: string | number | null): CurrencyValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true };\n }\n\n const numValue = Number(value);\n const cfg = this.config();\n \n if (isNaN(numValue)) {\n return { \n isValid: false, \n error: 'Please enter a valid number' \n };\n }\n\n if (cfg?.num_val !== undefined && cfg?.num_val_check) {\n if (cfg.num_val_check === 'MIN' && numValue < cfg.num_val) {\n return {\n isValid: false,\n error: `Value must be at least ${cfg.num_val}`\n };\n }\n\n if (cfg.num_val_check === 'MAX' && numValue > cfg.num_val) {\n return {\n isValid: false,\n error: `Value must be at most ${cfg.num_val}`\n };\n }\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\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) {\n matInput.focus();\n\n try {\n matInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"currency-form-field\">\n <input matInput \n type=\"text\" \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"placeholder()\" \n (blur)=\"onBlur()\">\n <span matTextPrefix>{{ config()?.symbol || '$' }}</span>\n </mat-form-field>\n} @else {\n <div class=\"currency-display\" \n [class.currency-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"currency-drillable\" (click)=\"onDrillableClick($event)\">{{formatNumberSignal()}}</span>\n } @else {\n {{formatNumberSignal()}}\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Field } from '../../model/grid.model';\n\nexport interface NumberValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-number',\n templateUrl: './number.component.html',\n styleUrls: ['./number.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class NumberComponent {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | number | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n replaceZeroValue = input<string | undefined>(undefined);\n placeholder = input<string>('0');\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | number | null>();\n @Output() blur = new EventEmitter<string | number | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | number | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | number | null>(null);\n error = signal('');\n\n constructor() {\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n formatNumberSignal = computed(() => {\n const cfg = this.config();\n const value = this.currentValue();\n\n // Handle null/undefined/empty\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n // Convert string to number if it's a numeric string\n let numValue: number;\n if (typeof value === 'string') {\n // Try to parse the string as a number\n const parsed = Number(value);\n if (isNaN(parsed)) {\n // If it's not a valid number, return as-is\n return value;\n }\n numValue = parsed;\n } else {\n numValue = Number(value);\n }\n\n // Handle zero replacement\n if (numValue == 0 && this.replaceZeroValue() !== undefined) {\n return this.replaceZeroValue();\n }\n\n const separator = cfg?.seperator || 'thousands';\n const decimalPlaces = cfg?.decimal ?? 2;\n\n if (separator === 'none') {\n return numValue.toFixed(decimalPlaces);\n }\n\n let locale = 'en-US';\n if (separator === 'thousands') {\n locale = 'en-IN';\n }\n\n return numValue.toLocaleString(locale, {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces\n });\n });\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onBlur(): void {\n const value = this.currentValue();\n const numValue = Number(value);\n const cfg = this.config();\n\n const validation = this.validateField(numValue);\n \n if (!validation.isValid && validation.error) {\n this.error.set(validation.error);\n this.validationError.emit(validation.error);\n } else {\n this.error.set('');\n // Force decimal places as specified in config\n const decimalPlaces = cfg?.decimal ?? 2;\n const formattedValue = parseFloat(numValue.toFixed(decimalPlaces));\n this.currentValue.set(formattedValue);\n this.blur.emit(formattedValue);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n private validateField(value: string | number | null): NumberValidationResult {\n if (value === null || value === undefined || value === '') {\n return { isValid: true };\n }\n\n const numValue = Number(value);\n const cfg = this.config();\n \n if (isNaN(numValue)) {\n return { \n isValid: false, \n error: 'Please enter a valid number' \n };\n }\n\n if (cfg?.num_val !== undefined && cfg?.num_val_check) {\n if (cfg.num_val_check === 'MIN' && numValue < cfg.num_val) {\n return {\n isValid: false,\n error: `Value must be at least ${cfg.num_val}`\n };\n }\n\n if (cfg.num_val_check === 'MAX' && numValue > cfg.num_val) {\n return {\n isValid: false,\n error: `Value must be at most ${cfg.num_val}`\n };\n }\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\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) {\n matInput.focus();\n try {\n matInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"number-form-field\">\n <input matInput \n type=\"text\" \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"placeholder()\" \n (blur)=\"onBlur()\">\n </mat-form-field>\n} @else {\n <div class=\"number-display\" \n [class.number-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"number-drillable\" (click)=\"onDrillableClick($event)\">{{formatNumberSignal()}}</span>\n } @else {\n {{formatNumberSignal()}}\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\nexport interface TextboxValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-textbox',\n templateUrl: './textbox.component.html',\n styleUrls: ['./textbox.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TextboxComponent implements OnInit {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n externalError = input<string>(''); // Error from parent component\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n internalError = signal(''); // Error from textbox component validation\n \n // Computed error that prioritizes external error over internal error\n error = computed(() => {\n const extError = this.externalError();\n return extError || this.internalError();\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('mandatory') === true || this.getProperty('required') === true;\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onBlur(event: FocusEvent): void {\n const value = this.currentValue();\n const validation = this.validateField(value);\n \n if (!validation.isValid && validation.error) {\n this.internalError.set(validation.error);\n this.validationError.emit(validation.error);\n // Keep the control active when validation fails - don't emit blur event\n // Re-focus the input to keep it active\n setTimeout(() => {\n const matInput = this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && this.isActive()) {\n matInput.focus();\n }\n }, 0);\n } else {\n this.internalError.set('');\n this.blur.emit(value);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n \n // Clear internal error if value becomes valid\n const validation = this.validateField(event);\n if (validation.isValid) {\n this.internalError.set('');\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n private validateField(value: string | null): TextboxValidationResult {\n const cfg = this.config();\n const isRequired = this.hasRequiredValidation();\n const minLength = this.getProperty('minLength') || this.getProperty('data_length');\n const maxLength = this.getProperty('maxLength') || this.getProperty('data_length');\n const pattern = this.getProperty('pattern');\n\n if (isRequired && (!value || value.trim() === '')) {\n return {\n isValid: false,\n error: 'This field is required'\n };\n }\n\n if (value && minLength && value.length < minLength) {\n return {\n isValid: false,\n error: `Minimum length is ${minLength} characters`\n };\n }\n\n if (value && maxLength && value.length > maxLength) {\n return {\n isValid: false,\n error: `Maximum length is ${maxLength} characters`\n };\n }\n\n if (value && pattern) {\n const regex = new RegExp(pattern);\n if (!regex.test(value)) {\n return {\n isValid: false,\n error: 'Invalid format'\n };\n }\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\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) {\n matInput.focus();\n try {\n matInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"textbox-form-field\" [class.has-error]=\"error()\">\n <input matInput \n type=\"text\" \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"getProperty('placeholder')\" \n [maxlength]=\"getProperty('maxLength') || getProperty('data_length') || null\"\n (blur)=\"onBlur($event)\">\n @if(error()) {\n <mat-error>{{error()}}</mat-error>\n }\n </mat-form-field>\n} @else {\n <div class=\"textbox-display\" \n [class.textbox-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"textbox-drillable\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n computed,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\nexport interface EmailValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-email',\n templateUrl: './email.component.html',\n styleUrls: ['./email.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class EmailComponent implements OnInit {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n placeholder = input<string>('email@example.com');\n externalError = input<string>(''); // Error from parent component\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n internalError = signal(''); // Error from email component validation\n \n // Computed error that prioritizes external error over internal error\n error = computed(() => {\n const extError = this.externalError();\n return extError || this.internalError();\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('mandatory') === true || this.getProperty('required') === true;\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onBlur(event: FocusEvent): void {\n const value = this.currentValue();\n const validation = this.validateField(value);\n \n if (!validation.isValid && validation.error) {\n this.internalError.set(validation.error);\n this.validationError.emit(validation.error);\n // Keep the control active when validation fails - don't emit blur event\n // Re-focus the input to keep it active\n setTimeout(() => {\n const matInput = this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && this.isActive()) {\n matInput.focus();\n }\n }, 0);\n } else {\n this.internalError.set('');\n this.blur.emit(value);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n \n // Clear internal error if value becomes valid\n const validation = this.validateField(event);\n if (validation.isValid) {\n this.internalError.set('');\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n private validateField(value: string | null): EmailValidationResult {\n const cfg = this.config();\n const isRequired = this.hasRequiredValidation();\n\n if (isRequired && (!value || value.trim() === '')) {\n return {\n isValid: false,\n error: 'Email is required'\n };\n }\n\n if (value && value.trim() !== '') {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return {\n isValid: false,\n error: 'Please enter a valid email address'\n };\n }\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\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) {\n matInput.focus();\n try {\n matInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"email-form-field\" [class.has-error]=\"error()\">\n <input matInput \n type=\"email\" \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"getProperty('placeholder') || placeholder()\" \n (blur)=\"onBlur($event)\">\n @if(error()) {\n <mat-error>{{error()}}</mat-error>\n }\n </mat-form-field>\n} @else {\n <div class=\"email-display\" \n [class.email-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"email-drillable\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\nexport interface TextareaValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-textarea',\n templateUrl: './textarea.component.html',\n styleUrls: ['./textarea.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatTooltipModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TextareaComponent implements OnInit {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n externalError = input<string>(''); // Error from parent component\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n internalError = signal(''); // Error from textarea component validation\n \n // Computed error that prioritizes external error over internal error\n error = computed(() => {\n const extError = this.externalError();\n return extError || this.internalError();\n });\n\n // Computed rows with default value\n rows = computed(() => {\n const rowsValue = this.getProperty('rows');\n if (rowsValue !== null && rowsValue !== undefined && !isNaN(Number(rowsValue))) {\n return Number(rowsValue);\n }\n return 2; // Default rows\n });\n\n // Check if tooltip should be shown (when text exceeds 2 rows)\n shouldShowTooltip(): boolean {\n const value = this.currentValue();\n if (!value) return false;\n \n // Count lines in the text\n const lines = value.split('\\n').length;\n // If more than 2 lines, show tooltip\n if (lines > 2) return true;\n \n // Also check if text would wrap beyond 2 lines\n // This is a simple heuristic - if text is very long, it might wrap\n // We'll show tooltip if text length suggests it might exceed 2 rows\n // Approximate: assuming average 50 chars per line, 2 rows = ~100 chars\n // But this is just a heuristic - the CSS line-clamp will handle the actual truncation\n return value.length > 100;\n }\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('mandatory') === true || this.getProperty('required') === true;\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onBlur(event: FocusEvent): void {\n const value = this.currentValue();\n const validation = this.validateField(value);\n \n if (!validation.isValid && validation.error) {\n this.internalError.set(validation.error);\n this.validationError.emit(validation.error);\n // Keep the control active when validation fails - don't emit blur event\n // Re-focus the textarea to keep it active\n setTimeout(() => {\n const matTextarea = this.el.nativeElement.querySelector('textarea[matInput]') as HTMLTextAreaElement;\n if (matTextarea && this.isActive()) {\n matTextarea.focus();\n }\n }, 0);\n } else {\n this.internalError.set('');\n this.blur.emit(value);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n \n // Clear internal error if value becomes valid\n const validation = this.validateField(event);\n if (validation.isValid) {\n this.internalError.set('');\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n private validateField(value: string | null): TextareaValidationResult {\n const cfg = this.config();\n const isRequired = this.hasRequiredValidation();\n const minLength = this.getProperty('minLength') || this.getProperty('data_length');\n const maxLength = this.getProperty('maxLength') || this.getProperty('data_length');\n const pattern = this.getProperty('pattern');\n\n if (isRequired && (!value || value.trim() === '')) {\n return {\n isValid: false,\n error: 'This field is required'\n };\n }\n\n if (value && minLength && value.length < minLength) {\n return {\n isValid: false,\n error: `Minimum length is ${minLength} characters`\n };\n }\n\n if (value && maxLength && value.length > maxLength) {\n return {\n isValid: false,\n error: `Maximum length is ${maxLength} characters`\n };\n }\n\n if (value && pattern) {\n const regex = new RegExp(pattern);\n if (!regex.test(value)) {\n return {\n isValid: false,\n error: 'Invalid format'\n };\n }\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\n let attempts = 0;\n const maxAttempts = 20;\n\n const tryFocus = () => {\n const matTextarea = this.el.nativeElement.querySelector('textarea[matInput]') as HTMLTextAreaElement;\n if (matTextarea && matTextarea.offsetParent !== null) {\n matTextarea.focus();\n try {\n matTextarea.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"textarea-form-field\" [class.has-error]=\"error()\">\n <textarea matInput \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"getProperty('placeholder')\" \n [maxlength]=\"getProperty('maxLength') || getProperty('data_length') || null\"\n [rows]=\"rows()\"\n (blur)=\"onBlur($event)\"></textarea>\n @if(error()) {\n <mat-error>{{error()}}</mat-error>\n }\n </mat-form-field>\n} @else {\n <div class=\"textarea-display\" \n [class.textarea-display-editable]=\"isEditable()\"\n [matTooltip]=\"currentValue() || ''\"\n [matTooltipDisabled]=\"!currentValue() || !shouldShowTooltip()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"textarea-drillable\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\nexport interface WebsiteValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-website',\n templateUrl: './website.component.html',\n styleUrls: ['./website.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class WebsiteComponent implements OnInit {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n externalError = input<string>(''); // Error from parent component\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n internalError = signal(''); // Error from website component validation\n \n // Computed error that prioritizes external error over internal error\n error = computed(() => {\n const extError = this.externalError();\n return extError || this.internalError();\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('mandatory') === true || this.getProperty('required') === true;\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onBlur(event: FocusEvent): void {\n const value = this.currentValue();\n const validation = this.validateField(value);\n \n if (!validation.isValid && validation.error) {\n this.internalError.set(validation.error);\n this.validationError.emit(validation.error);\n // Keep the control active when validation fails - don't emit blur event\n // Re-focus the input to keep it active\n setTimeout(() => {\n const matInput = this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && this.isActive()) {\n matInput.focus();\n }\n }, 0);\n } else {\n this.internalError.set('');\n this.blur.emit(value);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n \n // Clear internal error if value becomes valid\n const validation = this.validateField(event);\n if (validation.isValid) {\n this.internalError.set('');\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n onWebsiteClick(event: Event): void {\n const value = this.currentValue();\n if (value && value.trim()) {\n event.stopPropagation();\n // Ensure URL has protocol\n let url = value.trim();\n if (!url.match(/^https?:\\/\\//i)) {\n url = 'https://' + url;\n }\n // Open URL in new window\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }\n\n private validateField(value: string | null): WebsiteValidationResult {\n const cfg = this.config();\n const isRequired = this.hasRequiredValidation();\n const maxLength = this.getProperty('maxLength') || this.getProperty('data_length');\n const pattern = this.getProperty('pattern');\n\n if (isRequired && (!value || value.trim() === '')) {\n return {\n isValid: false,\n error: 'This field is required'\n };\n }\n\n if (value && value.trim() !== '') {\n // URL validation\n try {\n // Basic URL validation - allow http://, https://, or protocol-relative URLs\n const urlPattern = /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$/i;\n if (!urlPattern.test(value.trim())) {\n return {\n isValid: false,\n error: 'Invalid URL format'\n };\n }\n } catch (error) {\n return {\n isValid: false,\n error: 'Invalid URL format'\n };\n }\n\n if (maxLength && value.length > maxLength) {\n return {\n isValid: false,\n error: `Maximum length is ${maxLength} characters`\n };\n }\n\n if (pattern) {\n const regex = new RegExp(pattern);\n if (!regex.test(value)) {\n return {\n isValid: false,\n error: 'Invalid format'\n };\n }\n }\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\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) {\n matInput.focus();\n try {\n matInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"website-form-field\" [class.has-error]=\"error()\">\n <input matInput \n type=\"url\" \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"getProperty('placeholder')\" \n [maxlength]=\"getProperty('maxLength') || getProperty('data_length') || null\"\n (blur)=\"onBlur($event)\">\n @if(error()) {\n <mat-error>{{error()}}</mat-error>\n }\n </mat-form-field>\n} @else {\n <div class=\"website-display\" \n [class.website-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"website-drillable\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n <span class=\"website-link\" (click)=\"onWebsiteClick($event)\">{{currentValue()}}</span>\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild,\n AfterViewInit\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\n// Declare Google Maps types for TypeScript\ndeclare global {\n interface Window {\n google: typeof google;\n }\n}\n\n// Type declaration for Google Maps API\ndeclare var google: {\n maps: {\n places: {\n Autocomplete: new (input: HTMLInputElement, options?: any) => {\n getPlace: () => any;\n addListener: (event: string, callback: () => void) => void;\n };\n AutocompleteOptions: any;\n };\n };\n};\n\nexport interface LocationConfig {\n required?: boolean;\n maxLength?: number;\n googleApiKey?: string; // Optional Google Places API key\n enableAutocomplete?: boolean; // Enable/disable autocomplete\n}\n\nexport interface LocationValidationResult {\n isValid: boolean;\n error?: string;\n}\n\n@Component({\n selector: 'eru-location',\n templateUrl: './location.component.html',\n styleUrls: ['./location.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class LocationComponent implements OnInit, AfterViewInit {\n private el = inject(ElementRef);\n @ViewChild('locationInput', { static: false }) locationInput?: ElementRef<HTMLInputElement>;\n \n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n externalError = input<string>(''); // Error from parent component\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() validationError = new EventEmitter<string>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n internalError = signal(''); // Error from location component validation\n autocomplete: any = null; // Google Maps Autocomplete instance\n \n // Computed error that prioritizes external error over internal error\n error = computed(() => {\n const extError = this.externalError();\n return extError || this.internalError();\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n ngAfterViewInit() {\n // Note: Autocomplete will be initialized when component becomes active\n // since ViewChild might not be available until the input is rendered\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('mandatory') === true || this.getProperty('required') === true;\n }\n\n shouldEnableAutocomplete(): boolean {\n const apiKey = this.getProperty('googleApiKey');\n const enableAutocomplete = this.getProperty('enableAutocomplete');\n return !!(apiKey && (enableAutocomplete !== false));\n }\n\n private initializeAutocomplete(): void {\n const apiKey = this.getProperty('googleApiKey');\n if (!apiKey) {\n console.warn('Google Places Autocomplete requires an API key. Please provide googleApiKey in the config.');\n return;\n }\n\n // Wait for the input element to be available\n if (!this.locationInput?.nativeElement) {\n // Retry after a short delay\n setTimeout(() => {\n if (this.locationInput?.nativeElement) {\n this.initializeAutocomplete();\n }\n }, 100);\n return;\n }\n\n // Load Google Maps script if not already loaded\n if (typeof (window as any).google === 'undefined' || !(window as any).google?.maps || !(window as any).google?.maps?.places) {\n this.loadGoogleMapsScript(apiKey).then(() => {\n this.setupAutocomplete();\n }).catch((error) => {\n console.warn('Failed to load Google Maps API:', error);\n });\n } else {\n this.setupAutocomplete();\n }\n }\n\n private loadGoogleMapsScript(apiKey: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loading or loaded\n const existingScript = document.querySelector(`script[src*=\"maps.googleapis.com\"]`);\n if (existingScript) {\n if (typeof (window as any).google !== 'undefined' && (window as any).google?.maps && (window as any).google?.maps?.places) {\n resolve();\n return;\n }\n // Wait for script to load\n existingScript.addEventListener('load', () => resolve());\n existingScript.addEventListener('error', () => reject(new Error('Failed to load Google Maps')));\n return;\n }\n\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Google Maps'));\n document.head.appendChild(script);\n });\n }\n\n private setupAutocomplete(): void {\n if (!this.locationInput?.nativeElement) {\n console.warn('Location input element not found');\n return;\n }\n\n const google = (window as any).google;\n if (typeof google === 'undefined' || !google.maps || !google.maps.places) {\n console.warn('Google Maps API not loaded');\n return;\n }\n\n try {\n const autocompleteOptions: any = {\n types: ['geocode', 'establishment'], // Restrict to addresses and businesses\n componentRestrictions: this.getProperty('countryRestrictions') || undefined\n };\n\n // Destroy existing autocomplete if any\n if (this.autocomplete) {\n google.maps.event.clearInstanceListeners(this.autocomplete);\n }\n\n this.autocomplete = new google.maps.places.Autocomplete(\n this.locationInput.nativeElement,\n autocompleteOptions\n );\n\n this.autocomplete.addListener('place_changed', () => {\n const place = this.autocomplete?.getPlace();\n if (place && place.formatted_address) {\n this.currentValue.set(place.formatted_address);\n this.valueChange.emit(place.formatted_address);\n this.internalError.set('');\n }\n });\n\n console.log('Google Places Autocomplete initialized successfully');\n } catch (error) {\n console.error('Error setting up Google Places Autocomplete:', error);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n \n // Initialize autocomplete when activated\n if (this.shouldEnableAutocomplete() && !this.autocomplete) {\n // Wait a bit for the input to be rendered\n setTimeout(() => {\n this.initializeAutocomplete();\n }, 200);\n }\n }\n }\n\n onBlur(event: FocusEvent): void {\n const value = this.currentValue();\n const validation = this.validateField(value);\n \n if (!validation.isValid && validation.error) {\n this.internalError.set(validation.error);\n this.validationError.emit(validation.error);\n // Keep the control active when validation fails - don't emit blur event\n // Re-focus the input to keep it active\n setTimeout(() => {\n const matInput = this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && this.isActive()) {\n matInput.focus();\n }\n }, 0);\n } else {\n this.internalError.set('');\n this.blur.emit(value);\n }\n }\n\n onValueChange(event: any): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n \n // Clear internal error if value becomes valid\n const validation = this.validateField(event);\n if (validation.isValid) {\n this.internalError.set('');\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n private validateField(value: string | null): LocationValidationResult {\n const cfg = this.config();\n const isRequired = this.hasRequiredValidation();\n const maxLength = this.getProperty('maxLength') || this.getProperty('data_length');\n\n if (isRequired && (!value || value.trim() === '')) {\n return {\n isValid: false,\n error: 'This field is required'\n };\n }\n\n if (value && maxLength && value.length > maxLength) {\n return {\n isValid: false,\n error: `Maximum length is ${maxLength} characters`\n };\n }\n\n return { isValid: true };\n }\n\n private focusAndPositionCursor(): void {\n let attempts = 0;\n const maxAttempts = 20;\n\n const tryFocus = () => {\n const matInput = this.locationInput?.nativeElement || \n this.el.nativeElement.querySelector('input[matInput]') as HTMLInputElement;\n if (matInput && matInput.offsetParent !== null) {\n matInput.focus();\n try {\n matInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n}\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"location-form-field\" [class.has-error]=\"error()\">\n <input #locationInput\n matInput \n type=\"text\" \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n [placeholder]=\"getProperty('placeholder') || 'Enter location'\" \n [maxlength]=\"getProperty('maxLength') || getProperty('data_length') || null\"\n (blur)=\"onBlur($event)\">\n @if(error()) {\n <mat-error>{{error()}}</mat-error>\n }\n </mat-form-field>\n} @else {\n <div class=\"location-display\" \n [class.location-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"location-drillable\" (click)=\"onDrillableClick($event)\">{{currentValue()}}</span>\n } @else {\n {{currentValue()}}\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\n\n@Component({\n selector: 'eru-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrls: ['./checkbox.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatCheckboxModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class CheckboxComponent {\n // Inputs\n value = input<boolean>(false);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n label = input<string>('');\n \n // Outputs\n @Output() valueChange = new EventEmitter<boolean>();\n @Output() change = new EventEmitter<boolean>();\n @Output() blur = new EventEmitter<boolean>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<boolean>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n }\n\n onValueChange(event: boolean): void {\n this.currentValue.set(event);\n this.valueChange.emit(event);\n this.change.emit(event);\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n }\n }\n\n onBlur(): void {\n const value = this.currentValue();\n this.blur.emit(value);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n}\n","<div \n class=\"checkbox-container\"\n [class.checkbox-active]=\"isActive()\"\n [class.checkbox-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable() && !isActive()) {\n <span class=\"checkbox-drillable\" (click)=\"onDrillableClick($event)\">\n <mat-checkbox \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\"\n [disabled]=\"true\">\n {{label()}}\n </mat-checkbox>\n </span>\n } @else {\n <mat-checkbox \n [ngModel]=\"currentValue()\" \n (ngModelChange)=\"onValueChange($event)\"\n (blur)=\"onBlur()\"\n [disabled]=\"!isEditable() || !isActive()\">\n {{label()}}\n </mat-checkbox>\n }\n</div>\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\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatDatepickerModule, MatDatepicker } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { CustomDatePickerDirective } from './custom-date-picker.directive';\n\n@Component({\n selector: 'eru-date',\n templateUrl: './date.component.html',\n styleUrls: ['./date.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatDatepickerModule,\n MatNativeDateModule,\n CustomDatePickerDirective\n],\n providers: [MatDatepickerModule, MatNativeDateModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class DateComponent {\n private el = inject(ElementRef);\n \n @ViewChild('picker') datepicker!: MatDatepicker<Date>;\n \n // Inputs\n value = input<string | Date | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n placeholder = input<string>('Select date');\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() dateChange = new EventEmitter<string | null>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<Date | null>(null);\n private shouldOpenPicker = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n const value = this.value();\n if (value instanceof Date) {\n this.currentValue.set(value);\n } else if (typeof value === 'string' && value) {\n const parsedDate = this.parseDateString(value);\n this.currentValue.set(parsedDate);\n } else {\n this.currentValue.set(null);\n }\n });\n\n // Watch for isActive changes and open picker if needed\n effect(() => {\n const isActive = this.isActive();\n const shouldOpen = this.shouldOpenPicker();\n \n if (isActive && shouldOpen) {\n // Use setTimeout to ensure the datepicker is fully rendered in the DOM\n setTimeout(() => {\n if (this.datepicker && !this.datepicker.opened) {\n this.datepicker.open();\n this.shouldOpenPicker.set(false);\n }\n }, 50);\n }\n });\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n // Set flag to open picker once isActive becomes true\n this.shouldOpenPicker.set(true);\n }\n }\n\n\n onDateChange(date: Date | null): void {\n this.currentValue.set(date ? new Date(date) : null);\n const formattedDate = date ? this.formatDate(date) : '';\n this.valueChange.emit(formattedDate);\n this.dateChange.emit(formattedDate);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.getDisplayValue());\n }\n }\n\n formatDate(date: Date | null): string {\n if (!date) return '';\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n const pad = (n: number): string => n < 10 ? '0' + n : n.toString();\n return `${pad(day)}-${pad(month)}-${year}`;\n }\n\n parseDateString(dateString: string): Date | null {\n // Parse dd-MM-yyyy format\n const parts = dateString.split('-');\n if (parts.length === 3) {\n const day = parseInt(parts[0], 10);\n const month = parseInt(parts[1], 10) - 1; // Month is 0-indexed\n const year = parseInt(parts[2], 10);\n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\n const date = new Date(year, month, day);\n // Validate the date\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\n return date;\n }\n }\n }\n return null;\n }\n\n getDisplayValue(): string {\n const current = this.currentValue();\n if (current) {\n return this.formatDate(current);\n }\n const inputVal = this.value();\n if (typeof inputVal === 'string') {\n return inputVal;\n }\n if (inputVal instanceof Date) {\n return this.formatDate(inputVal);\n }\n return '';\n }\n}\n","@if(isActive()){\n <mat-form-field appearance=\"outline\" class=\"date-form-field\">\n <input type=\"text\"\n matInput \n [matDatepicker]=\"picker\" \n appCustomDatePicker\n class=\"date-input\"\n [ngModel]=\"currentValue()\"\n (dateChange)=\"onDateChange($event.value)\"\n (click)=\"picker.open()\" \n readonly> \n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n} @else {\n <div class=\"date-display\" \n [class.date-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"date-drillable\" (click)=\"onDrillableClick($event)\">{{getDisplayValue()}}</span>\n } @else {\n {{getDisplayValue()}}\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n input,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'eru-time-picker-panel',\n templateUrl: './time-picker-panel.component.html',\n styleUrls: ['./time-picker-panel.component.scss'],\n standalone: true,\n imports: [\n MatButtonModule,\n MatIconModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TimePickerPanelComponent {\n // Inputs\n value = input<string>('00:00'); // HH:mm format\n hour = input<number | null>(null);\n minute = input<number | null>(null);\n \n // Outputs\n @Output() timeSelected = new EventEmitter<string>();\n @Output() close = new EventEmitter<void>();\n\n // Internal state\n selectedHour = signal<number>(0);\n selectedMinute = signal<number>(0);\n\n // Generate arrays for hours and minutes\n hours = Array.from({ length: 24 }, (_, i) => i);\n minutes = Array.from({ length: 60 }, (_, i) => i);\n\n constructor() {\n // Initialize from input value\n const value = this.value();\n if (value) {\n const [hour, minute] = value.split(':').map(Number);\n this.selectedHour.set(isNaN(hour) ? 0 : hour);\n this.selectedMinute.set(isNaN(minute) ? 0 : minute);\n } else {\n const hourInput = this.hour();\n const minuteInput = this.minute();\n this.selectedHour.set(hourInput !== null ? hourInput : 0);\n this.selectedMinute.set(minuteInput !== null ? minuteInput : 0);\n }\n }\n\n onHourSelect(hour: number): void {\n this.selectedHour.set(hour);\n this.emitTime();\n }\n\n onMinuteSelect(minute: number): void {\n this.selectedMinute.set(minute);\n this.emitTime();\n }\n\n emitTime(): void {\n const hour = this.selectedHour();\n const minute = this.selectedMinute();\n const timeString = `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;\n this.timeSelected.emit(timeString);\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n isHourSelected(hour: number): boolean {\n return this.selectedHour() === hour;\n }\n\n isMinuteSelected(minute: number): boolean {\n return this.selectedMinute() === minute;\n }\n\n formatNumber(num: number): string {\n return String(num).padStart(2, '0');\n }\n}\n\n","<div class=\"time-picker-panel\">\n <div class=\"time-picker-header\">\n <span class=\"time-picker-title\">Select Time</span>\n <button mat-icon-button class=\"close-button\" (click)=\"onClose()\" type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n \n <div class=\"time-picker-content\">\n <div class=\"time-column\">\n <div class=\"time-column-header\">Hour</div>\n <div class=\"time-scroll-container\">\n @for (hour of hours; track hour) {\n <button\n type=\"button\"\n class=\"time-option\"\n [class.selected]=\"isHourSelected(hour)\"\n (click)=\"onHourSelect(hour)\">\n {{formatNumber(hour)}}\n </button>\n }\n </div>\n </div>\n \n <div class=\"time-column\">\n <div class=\"time-column-header\">Minute</div>\n <div class=\"time-scroll-container\">\n @for (minute of minutes; track minute) {\n <button\n type=\"button\"\n class=\"time-option\"\n [class.selected]=\"isMinuteSelected(minute)\"\n (click)=\"onMinuteSelect(minute)\">\n {{formatNumber(minute)}}\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { OverlayModule, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { TimePickerPanelComponent } from './time-picker-panel.component';\n\n@Component({\n selector: 'eru-time-picker',\n templateUrl: './time-picker.component.html',\n styleUrls: ['./time-picker.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n OverlayModule,\n TimePickerPanelComponent\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TimePickerComponent {\n private el = inject(ElementRef);\n \n @ViewChild('timeInput', { static: false }) timeInput!: ElementRef<HTMLInputElement>;\n \n // Inputs\n value = input<string>('00:00'); // HH:mm format\n label = input<string>('');\n placeholder = input<string>('HH:mm');\n disabled = input<boolean>(false);\n \n // Outputs\n @Output() valueChange = new EventEmitter<string>();\n\n // Internal state\n isPanelOpen = signal<boolean>(false);\n\n onInputClick(event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (!this.disabled()) {\n this.openPanel();\n }\n }\n\n onIconClick(event: Event): void {\n event.stopPropagation();\n if (!this.disabled()) {\n this.openPanel();\n }\n }\n\n openPanel(): void {\n this.isPanelOpen.set(true);\n }\n\n closePanel(): void {\n this.isPanelOpen.set(false);\n }\n\n onTimeSelected(time: string): void {\n this.valueChange.emit(time);\n }\n\n onPanelClose(): void {\n this.closePanel();\n }\n\n onOverlayBackdropClick(event: Event): void {\n event.stopPropagation();\n this.closePanel();\n }\n\n onOverlayClick(event: Event): void {\n event.stopPropagation();\n }\n\n}\n\n","<div class=\"time-picker-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field appearance=\"outline\" class=\"time-picker-field\">\n @if (label()) {\n <mat-label>{{label()}}</mat-label>\n }\n <input \n matInput \n type=\"text\"\n #timeInput\n [value]=\"value()\" \n (click)=\"onInputClick($event)\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n readonly>\n <mat-icon matSuffix (click)=\"onIconClick($event)\" class=\"time-picker-icon\">access_time</mat-icon>\n </mat-form-field>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"timeInput\"\n [cdkConnectedOverlayOpen]=\"isPanelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'time-picker-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick($event)\">\n <div \n class=\"time-picker-overlay\" \n (click)=\"onOverlayClick($event)\"\n (mousedown)=\"onOverlayClick($event)\">\n <eru-time-picker-panel\n [value]=\"value()\"\n (timeSelected)=\"onTimeSelected($event)\"\n (close)=\"onPanelClose()\">\n </eru-time-picker-panel>\n </div>\n </ng-template>\n</div>\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatDatepickerModule, MatDatepicker } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CustomDatePickerDirective } from '../date/custom-date-picker.directive';\nimport { TimePickerComponent } from '../time-picker/time-picker.component';\nimport { Field } from '../../model/grid.model';\n@Component({\n selector: 'eru-datetime',\n templateUrl: './datetime.component.html',\n styleUrls: ['./datetime.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatIconModule,\n CustomDatePickerDirective,\n TimePickerComponent\n],\n providers: [MatDatepickerModule, MatNativeDateModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class DatetimeComponent {\n private el = inject(ElementRef);\n \n @ViewChild('picker') datepicker!: MatDatepicker<Date>;\n \n // Inputs\n value = input<string | Date | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n placeholder = input<string>('Select date and time');\n config = input<Field | null>(null);\n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() datetimeChange = new EventEmitter<string | null>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | Date | null>(null);\n selectedDate = signal<Date | null>(null);\n selectedTime = signal<string>('00:00'); // HH:mm format\n private shouldOpenPicker = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n const value = this.value();\n if (typeof value === 'string' && value) {\n // Parse datetime string (dd-MM-yyyy HH:mm format)\n const parsed = this.parseDateTimeString(value);\n if (parsed) {\n this.selectedDate.set(parsed.date);\n this.selectedTime.set(parsed.time);\n this.currentValue.set(parsed.date);\n } else {\n this.currentValue.set(value);\n }\n } else if (value instanceof Date) {\n this.selectedDate.set(value);\n this.selectedTime.set(this.formatTime(value));\n this.currentValue.set(value);\n } else {\n this.selectedDate.set(null);\n this.selectedTime.set('00:00');\n this.currentValue.set(null);\n }\n });\n\n // Watch for isActive changes and open picker if needed\n effect(() => {\n const isActive = this.isActive();\n const shouldOpen = this.shouldOpenPicker();\n \n if (isActive && shouldOpen) {\n setTimeout(() => {\n if (this.datepicker && !this.datepicker.opened) {\n this.datepicker.open();\n this.shouldOpenPicker.set(false);\n }\n }, 50);\n }\n });\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.shouldOpenPicker.set(true);\n }\n }\n\n onDateChange(date: Date | null): void {\n this.selectedDate.set(date ? new Date(date) : null);\n this.updateValue();\n }\n\n onTimeChange(time: string): void {\n if (this.isValidTimeFormat(time)) {\n this.selectedTime.set(time);\n this.updateValue();\n }\n }\n\n updateValue(): void {\n const date = this.selectedDate();\n const time = this.selectedTime();\n \n if (date && time) {\n const datetime = this.combineDateAndTime(date, time);\n const formatted = this.formatDateTime(datetime);\n this.currentValue.set(datetime);\n this.valueChange.emit(formatted);\n this.datetimeChange.emit(formatted);\n } else if (date) {\n // Only date selected, use default time 00:00\n const datetime = this.combineDateAndTime(date, '00:00');\n const formatted = this.formatDateTime(datetime);\n this.currentValue.set(datetime);\n this.valueChange.emit(formatted);\n this.datetimeChange.emit(formatted);\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n const value = typeof this.currentValue() === 'string' ? this.currentValue() as string : null;\n this.drilldownClick.emit(value);\n }\n }\n\n formatDateTime(date: Date): string {\n if (!date) return '';\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const pad = (n: number): string => n < 10 ? '0' + n : n.toString();\n return `${pad(day)}-${pad(month)}-${year} ${pad(hours)}:${pad(minutes)}`;\n }\n\n formatTime(date: Date): string {\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const pad = (n: number): string => n < 10 ? '0' + n : n.toString();\n return `${pad(hours)}:${pad(minutes)}`;\n }\n\n parseDateTimeString(dateTimeString: string): { date: Date; time: string } | null {\n // Parse dd-MM-yyyy HH:mm format\n const parts = dateTimeString.split(' ');\n if (parts.length === 2) {\n const datePart = parts[0]; // dd-MM-yyyy\n const timePart = parts[1]; // HH:mm\n \n const dateParts = datePart.split('-');\n if (dateParts.length === 3 && this.isValidTimeFormat(timePart)) {\n const day = parseInt(dateParts[0], 10);\n const month = parseInt(dateParts[1], 10) - 1; // Month is 0-indexed\n const year = parseInt(dateParts[2], 10);\n \n if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\n const timeParts = timePart.split(':');\n const hours = parseInt(timeParts[0], 10);\n const minutes = parseInt(timeParts[1], 10);\n \n const date = new Date(year, month, day, hours, minutes);\n // Validate the date\n if (date.getDate() === day && date.getMonth() === month && date.getFullYear() === year) {\n return { date, time: timePart };\n }\n }\n }\n }\n return null;\n }\n\n combineDateAndTime(date: Date, time: string): Date {\n const timeParts = time.split(':');\n const hours = parseInt(timeParts[0], 10) || 0;\n const minutes = parseInt(timeParts[1], 10) || 0;\n \n const combined = new Date(date);\n combined.setHours(hours);\n combined.setMinutes(minutes);\n combined.setSeconds(0);\n combined.setMilliseconds(0);\n \n return combined;\n }\n\n isValidTimeFormat(time: string): boolean {\n return /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(time);\n }\n\n getDisplayValue(): string {\n const val = this.currentValue();\n if (!val) return '';\n if (typeof val === 'string') return val;\n if (val instanceof Date) {\n return this.formatDateTime(val);\n }\n return '';\n }\n}\n\n","@if(isActive()){\n <div class=\"datetime-input-container\">\n <mat-form-field appearance=\"outline\" class=\"datetime-date-form-field\">\n <input type=\"text\"\n matInput \n [matDatepicker]=\"picker\" \n appCustomDatePicker\n class=\"datetime-date-input\" \n [ngModel]=\"selectedDate()\"\n (dateChange)=\"onDateChange($event.value)\" \n (click)=\"picker.open()\" \n readonly>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n <eru-time-picker\n [value]=\"selectedTime()\"\n (valueChange)=\"onTimeChange($event)\"\n class=\"datetime-time-picker\">\n </eru-time-picker>\n </div>\n} @else {\n <div class=\"datetime-display\" \n [class.datetime-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"datetime-drillable\" (click)=\"onDrillableClick($event)\">{{getDisplayValue()}}</span>\n } @else {\n {{getDisplayValue()}}\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { OverlayModule, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { TimePickerComponent } from '../time-picker/time-picker.component';\n\nexport interface DurationValue {\n hours: number;\n minutes: number;\n}\n\n@Component({\n selector: 'eru-duration',\n templateUrl: './duration.component.html',\n styleUrls: ['./duration.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatTabsModule,\n MatButtonModule,\n MatIconModule,\n OverlayModule,\n TimePickerComponent\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class DurationComponent {\n private el = inject(ElementRef);\n \n // Inputs\n value = input<string | number | null>(null); // Value in minutes or \"HH:MM\" format\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n placeholder = input<string>('0');\n \n // Outputs\n @Output() valueChange = new EventEmitter<string | number | null>();\n @Output() blur = new EventEmitter<string | number | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | number | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | number | null>(null);\n selectedTab = signal<number>(0); // 0 = Manual, 1 = Range\n isOverlayOpen = signal<boolean>(false);\n private timePickerOverlayCount = signal<number>(0);\n childOverlayOpen = computed(() => this.timePickerOverlayCount() > 0);\n \n // Manual mode\n manualMinutes = signal<number>(0);\n \n // Range mode\n startTime = signal<string>('00:00'); // HH:MM format\n endTime = signal<string>('00:00'); // HH:MM format\n\n constructor() {\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n \n // Parse initial value\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'number') {\n // Value is in minutes\n this.manualMinutes.set(value);\n } else if (typeof value === 'string') {\n // Check if it's HH:MM format\n if (this.isTimeFormat(value)) {\n const minutes = this.timeToMinutes(value);\n this.manualMinutes.set(minutes);\n } else {\n // Try to parse as number\n const numValue = parseInt(value, 10);\n if (!isNaN(numValue)) {\n this.manualMinutes.set(numValue);\n }\n }\n }\n } else {\n this.manualMinutes.set(0);\n }\n });\n\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.isOverlayOpen.set(true);\n }\n }\n\n onOverlayBackdropClick(): void {\n if (this.childOverlayOpen()) {\n return;\n }\n const value = this.getCurrentValueInMinutes();\n this.currentValue.set(value);\n this.blur.emit(value);\n this.isOverlayOpen.set(false);\n this.editModeChange.emit(false);\n }\n\n onOverlayClick(event: Event): void {\n event.stopPropagation();\n }\n\n onBlur(): void {\n const value = this.getCurrentValueInMinutes();\n this.currentValue.set(value);\n this.blur.emit(value);\n this.isOverlayOpen.set(false);\n this.editModeChange.emit(false);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n // Manual mode handlers\n onManualMinutesChange(value: string): void {\n const numValue = parseInt(value, 10) || 0;\n this.manualMinutes.set(numValue);\n const totalMinutes = this.manualMinutes();\n this.currentValue.set(totalMinutes);\n this.valueChange.emit(totalMinutes);\n }\n\n // Range mode handlers\n onStartTimeChange(time: string): void {\n if (this.isValidTimeFormat(time)) {\n this.startTime.set(time);\n this.calculateDurationFromRange();\n }\n }\n\n onEndTimeChange(time: string): void {\n if (this.isValidTimeFormat(time)) {\n this.endTime.set(time);\n this.calculateDurationFromRange();\n }\n }\n\n onTimePickerPanelOpenChange(opened: boolean): void {\n this.timePickerOverlayCount.update((count) => {\n const next = opened ? count + 1 : Math.max(0, count - 1);\n return next;\n });\n }\n\n calculateDurationFromRange(): void {\n const start = this.startTime();\n const end = this.endTime();\n \n if (this.isValidTimeFormat(start) && this.isValidTimeFormat(end)) {\n const startMinutes = this.timeToMinutes(start);\n const endMinutes = this.timeToMinutes(end);\n \n let durationMinutes = endMinutes - startMinutes;\n \n // Handle overnight (end time is next day)\n if (durationMinutes < 0) {\n durationMinutes += 24 * 60; // Add 24 hours\n }\n \n this.manualMinutes.set(durationMinutes);\n this.currentValue.set(durationMinutes);\n this.valueChange.emit(durationMinutes);\n }\n }\n\n onTabChange(index: number): void {\n this.selectedTab.set(index);\n if (index === 1) {\n // Switching to Range mode - initialize times from current duration\n const minutes = this.manualMinutes();\n this.startTime.set('00:00');\n this.endTime.set(this.minutesToTime(minutes));\n }\n }\n\n\n // Utility methods\n getCurrentValueInMinutes(): number {\n return this.manualMinutes();\n }\n\n getDisplayValue(): string {\n const minutes = this.getCurrentValueInMinutes();\n return this.formatDuration(minutes);\n }\n\n formatDuration(minutes: number): string {\n if (minutes === 0) return '0';\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n \n if (hours === 0) {\n return `${mins}m`;\n } else if (mins === 0) {\n return `${hours}h`;\n } else {\n return `${hours}h ${mins}m`;\n }\n }\n\n minutesToTime(minutes: number): string {\n const hours = Math.floor(minutes / 60) % 24;\n const mins = minutes % 60;\n return `${this.padZero(hours)}:${this.padZero(mins)}`;\n }\n\n timeToMinutes(time: string): number {\n const parts = time.split(':');\n if (parts.length === 2) {\n const hours = parseInt(parts[0], 10) || 0;\n const minutes = parseInt(parts[1], 10) || 0;\n return hours * 60 + minutes;\n }\n return 0;\n }\n\n isValidTimeFormat(time: string): boolean {\n return /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(time);\n }\n\n isTimeFormat(value: string): boolean {\n return this.isValidTimeFormat(value);\n }\n\n padZero(num: number): string {\n return num < 10 ? `0${num}` : `${num}`;\n }\n}\n\n","<div class=\"duration-overlay-container\">\n <div \n class=\"duration-cell-wrapper\"\n cdkOverlayOrigin \n #durationTrigger=\"cdkOverlayOrigin\"\n [class.duration-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n <div class=\"duration-display\">\n @if (isDrillable() && !isActive()) {\n <span class=\"duration-drillable\" (click)=\"onDrillableClick($event)\">{{getDisplayValue()}}</span>\n } @else {\n {{getDisplayValue()}}\n }\n </div>\n </div>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"durationTrigger\"\n [cdkConnectedOverlayOpen]=\"isOverlayOpen() && isActive()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'duration-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick()\">\n <div \n class=\"duration-editor\" \n (click)=\"onOverlayClick($event)\">\n <mat-tab-group \n [selectedIndex]=\"selectedTab()\" \n (selectedIndexChange)=\"onTabChange($event)\"\n class=\"duration-tabs\">\n <mat-tab label=\"Manual\">\n <div class=\"duration-tab-content\">\n <mat-form-field appearance=\"outline\" class=\"duration-input-field\">\n <mat-label>Minutes</mat-label>\n <input \n matInput \n type=\"number\" \n [ngModel]=\"manualMinutes()\" \n (ngModelChange)=\"onManualMinutesChange($event)\"\n [placeholder]=\"placeholder()\"\n min=\"0\">\n </mat-form-field>\n <div class=\"duration-preview\">\n {{formatDuration(manualMinutes())}}\n </div>\n </div>\n </mat-tab>\n \n <mat-tab label=\"Range\">\n <div class=\"duration-tab-content\">\n <div class=\"time-range-container\" (click)=\"$event.stopPropagation()\">\n <eru-time-picker\n [value]=\"startTime()\"\n [label]=\"'Start Time'\"\n (valueChange)=\"onStartTimeChange($event)\"\n class=\"time-picker-wrapper\">\n </eru-time-picker>\n \n <span class=\"time-separator\">-</span>\n \n <eru-time-picker\n [value]=\"endTime()\"\n [label]=\"'End Time'\"\n (valueChange)=\"onEndTimeChange($event)\"\n class=\"time-picker-wrapper\">\n </eru-time-picker>\n </div>\n <div class=\"duration-preview\">\n Duration: {{formatDuration(manualMinutes())}}\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </ng-template>\n</div>\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];\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n input,\n OnInit,\n AfterViewInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n inject,\n ViewChild\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatOptionModule } from '@angular/material/core';\nimport { COUNTRY_CODES, CountryCode } from './country-data';\nimport { polyfillCountryFlagEmojis } from 'country-flag-emoji-polyfill';\n\nfunction iso2ToFlagEmoji(iso2: string): string {\n const code = iso2?.toUpperCase();\n if (!code || code.length !== 2) {\n return '';\n }\n const REGIONAL_INDICATOR_A = 0x1f1e6;\n const first = REGIONAL_INDICATOR_A + code.charCodeAt(0) - 0x41;\n const second = REGIONAL_INDICATOR_A + code.charCodeAt(1) - 0x41;\n return String.fromCodePoint(first, second);\n}\n@Component({\n selector: 'eru-phone',\n templateUrl: './phone.component.html',\n styleUrls: ['./phone.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatOptionModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class PhoneComponent implements OnInit, AfterViewInit {\n private el = inject(ElementRef);\n\n @ViewChild('phoneContainer', { static: false }) phoneContainer!: ElementRef<HTMLElement>;\n\n // Signal-based inputs/outputs (for standalone usage)\n value = input<string | null>(null);\n defaultCountry = input<string>('US');\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n countryCodes = signal(COUNTRY_CODES);\n selectedCountry = signal(COUNTRY_CODES[0]);\n countrySearchText = signal('');\n phoneNumber = signal('');\n currentValue = signal<string | null>(null);\n isInputFocused = signal(false);\n isDropdownOpen = signal(false);\n\n filteredCountries = computed(() => {\n const searchText = this.countrySearchText().toLowerCase();\n if (!searchText) {\n return this.countryCodes();\n }\n return this.countryCodes().filter(country => \n country.name.toLowerCase().includes(searchText) ||\n country.dial_code.toLowerCase().includes(searchText) ||\n country.code.toLowerCase().includes(searchText)\n );\n });\n\n isFocused = computed(() => {\n return this.isInputFocused() || this.isDropdownOpen();\n });\n\n readonly fullPhoneValue = computed(() => {\n const country = this.selectedCountry();\n const number = this.phoneNumber();\n if (!number) return '';\n return `${country.dial_code}${number}`;\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n if (value !== null && value !== undefined) {\n this.parseAndSetValue(value);\n } else {\n this.phoneNumber.set('');\n this.currentValue.set(null);\n }\n });\n }\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 // Initialize value if provided\n const initialValue = this.value();\n if (initialValue) {\n this.parseAndSetValue(initialValue);\n }\n }\n\n ngAfterViewInit(): void {\n polyfillCountryFlagEmojis();\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.focusAndPositionCursor();\n }\n }\n\n onInputFocus(event: FocusEvent): void {\n this.isInputFocused.set(true);\n this.focus.emit();\n }\n\n onInputBlur(event: FocusEvent): void {\n // Only blur if the new focus target is not within the phone component or mat-select\n const relatedTarget = event.relatedTarget as HTMLElement;\n \n // Check if focus is moving to mat-select elements\n const isMovingToSelect = relatedTarget && (\n relatedTarget.closest('.mat-mdc-select-panel') !== null ||\n relatedTarget.closest('.country-select') !== null ||\n relatedTarget.closest('.mat-mdc-option') !== null\n );\n \n // Check if mat-select overlay is open (overlays are rendered at body level)\n const selectOverlay = document.querySelector('.cdk-overlay-pane');\n const isSelectOpen = selectOverlay !== null;\n \n if (!relatedTarget || (!this.el.nativeElement.contains(relatedTarget) && !isMovingToSelect && !isSelectOpen)) {\n // Small delay to allow select to open before blur\n setTimeout(() => {\n // Double-check select is still not open before blurring\n const stillOpen = document.querySelector('.cdk-overlay-pane');\n if (!stillOpen || !stillOpen.contains(document.activeElement)) {\n this.isInputFocused.set(false);\n const value = this.currentValue();\n this.blur.emit(value);\n }\n }, 150);\n }\n }\n\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n /**\n * Get the flag emoji for display\n * @returns The flag emoji string\n */\n getDisplayFlag(): string {\n const value = this.currentValue();\n if (!value) return '';\n \n const country = this.selectedCountry();\n const phoneNum = this.phoneNumber();\n \n // If we have both country and phone number, return flag\n if (country && phoneNum) {\n return this.displayFlag(country);\n }\n \n // Fallback: try to parse the value if it hasn't been parsed yet\n if (value && country) {\n const dialCode = country.dial_code;\n if (value.startsWith(dialCode)) {\n return this.displayFlag(country);\n }\n }\n \n // Return flag for selected country as fallback\n return country ? this.displayFlag(country) : '';\n }\n\n /**\n * Get the dial code and phone number together (without flag)\n * @returns The dial code and phone number formatted as \"dialCode phoneNumber\"\n */\n getDisplayPhoneNumber(): string {\n const value = this.currentValue();\n if (!value) return '';\n \n const country = this.selectedCountry();\n const phoneNum = this.phoneNumber();\n \n // If we have both country and phone number, format dial code and number\n if (country && phoneNum) {\n const dialCode = country.dial_code;\n return `${dialCode} ${phoneNum}`;\n }\n \n // Fallback: try to parse the value if it hasn't been parsed yet\n if (value && country) {\n const dialCode = country.dial_code;\n if (value.startsWith(dialCode)) {\n const phoneNum = value.replace(dialCode, '');\n return `${dialCode} ${phoneNum}`;\n }\n }\n \n // Return raw value as fallback\n return value;\n }\n\n /**\n * Format the complete display value (flag + dial code + number)\n * @returns The complete formatted phone number with flag\n */\n formatDisplayValue(): string {\n const flag = this.getDisplayFlag();\n const phoneNumber = this.getDisplayPhoneNumber();\n \n if (!flag && !phoneNumber) return '';\n if (!flag) return phoneNumber;\n if (!phoneNumber) return flag;\n \n return `${flag} ${phoneNumber}`;\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 console.log('selectedCountry', this.selectedCountry());\n this.countrySearchText.set('');\n // Update the value when country changes\n const phoneNum = this.phoneNumber();\n if (phoneNum) {\n this.emitValueChange(`${country.dial_code}${phoneNum}`);\n }\n }\n }\n\n onCountryChange(countryCode: string): void {\n this.selectCountry(countryCode);\n }\n\n onCountrySelectOpenedChange(opened: boolean): void {\n this.isDropdownOpen.set(opened);\n this.isInputFocused.set(opened);\n this.countrySearchText.set('');\n if (opened && this.phoneContainer) {\n setTimeout(() => {\n const panel = document.querySelector('.country-select-panel') as HTMLElement;\n if (panel) {\n const width = this.columnWidth();\n if (width > 0) {\n panel.style.width = `${width}px`;\n } else {\n panel.style.width = `100%`;\n }\n }\n }, 0);\n }\n }\n\n onCountrySearchChange(searchValue: string): void {\n this.countrySearchText.set(searchValue || '');\n }\n\n displayFlag(country?: CountryCode): string {\n if (!country) {\n country = this.selectedCountry();\n }\n return country?.flag || iso2ToFlagEmoji(country?.code || '');\n }\n\n onPhoneNumberInput(event: Event) {\n const input = event.target as HTMLInputElement;\n const cleanedValue = input.value.replace(/\\D/g, '');\n input.value = cleanedValue;\n this.phoneNumber.set(cleanedValue);\n \n // Emit the full phone number\n const fullPhoneNumber = `${this.selectedCountry().dial_code}${cleanedValue}`;\n this.emitValueChange(fullPhoneNumber);\n }\n\n\n private emitValueChange(value: string) {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n }\n\n private focusAndPositionCursor(): void {\n let attempts = 0;\n const maxAttempts = 20;\n\n const tryFocus = () => {\n const phoneInput = this.el.nativeElement.querySelector('.phone-input') as HTMLInputElement;\n if (phoneInput && phoneInput.offsetParent !== null) {\n phoneInput.focus();\n try {\n phoneInput.setSelectionRange(0, 0);\n } catch (error) {\n console.log(\"Could not set cursor position:\", error);\n }\n } else if (attempts < maxAttempts) {\n attempts++;\n setTimeout(tryFocus, 25);\n }\n };\n\n setTimeout(tryFocus, 50);\n }\n\n private parseAndSetValue(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 phoneNum = value.replace(matchedCountry.dial_code, '');\n this.phoneNumber.set(phoneNum);\n this.currentValue.set(value);\n } else {\n // If no country code matches, treat entire value as phone number\n this.phoneNumber.set(value.replace(/\\D/g, ''));\n this.currentValue.set(value);\n }\n } else {\n this.phoneNumber.set('');\n this.currentValue.set(null);\n }\n }\n}\n","@if(isActive()) {\n <mat-form-field\n appearance=\"outline\"\n class=\"phone-form-field\"\n [class.phone-form-field-focused]=\"isFocused()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div class=\"phone-input-container\" #phoneContainer>\n <mat-select\n class=\"country-select\"\n panelClass=\"country-select-panel\"\n [value]=\"selectedCountry().code\"\n [disabled]=\"!isEditable()\"\n (selectionChange)=\"onCountryChange($event.value)\"\n (openedChange)=\"onCountrySelectOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n <mat-select-trigger>\n <span class=\"country-option\">\n <span class=\"country-flag\">{{ displayFlag(selectedCountry()) }}</span>\n <span class=\"country-dial-code\">{{ selectedCountry().dial_code }}</span>\n </span>\n </mat-select-trigger>\n <mat-option disabled class=\"search-option\">\n <mat-form-field\n [appearance]=\"'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"countrySearchText()\"\n (input)=\"onCountrySearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n @for (country of filteredCountries(); track country.code) {\n <mat-option [value]=\"country.code\">\n <span class=\"country-option\">\n <span class=\"country-flag\">{{ displayFlag(country) }}</span>\n <span class=\"country-dial-code\">{{ country.dial_code }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n <input\n matInput\n type=\"tel\"\n class=\"phone-input\"\n placeholder=\"\"\n [value]=\"phoneNumber()\"\n (input)=\"onPhoneNumberInput($event)\"\n (focus)=\"onInputFocus($event)\"\n (blur)=\"onInputBlur($event)\"\n (click)=\"$event.stopPropagation()\">\n </div>\n </mat-form-field>\n} @else {\n <div class=\"phone-display\" \n [class.phone-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"phone-drillable\" (click)=\"onDrillableClick($event)\"><div class=\"phone-display-content\">\n <span class=\"phone-flag-display\">{{getDisplayFlag()}}</span> \n <span class=\"phone-number-display\">{{getDisplayPhoneNumber()}}</span>\n </div></span>\n } @else {\n <div class=\"phone-display-content\">\n <span class=\"phone-flag-display\">{{getDisplayFlag()}}</span> \n <span class=\"phone-number-display\">{{getDisplayPhoneNumber()}}</span>\n </div>\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\n@Component({\n selector: 'eru-progress',\n templateUrl: './progress.component.html',\n styleUrls: ['./progress.component.scss'],\n standalone: true,\n imports: [FormsModule, MatSliderModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class ProgressComponent implements OnInit {\n private el = inject(ElementRef);\n\n // Inputs\n value = input<number | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n\n // Outputs\n @Output() valueChange = new EventEmitter<number>();\n @Output() blur = new EventEmitter<number | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<number | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<number>(0);\n \n // Computed value that always returns a number (defaults to 0)\n displayValue = computed(() => {\n const val = this.currentValue();\n // Handle null, undefined, or invalid numbers - default to 0\n if (val === null || val === undefined) {\n return 0;\n }\n // Convert to number if needed\n const numVal = typeof val === 'number' ? val : Number(val);\n // Handle NaN or invalid numbers\n if (isNaN(numVal) || numVal < 0) {\n return 0;\n }\n // Clamp between 0 and 100\n return Math.max(0, Math.min(100, numVal));\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n // Always set to 0 if null/undefined/NaN/invalid, otherwise use the value\n if (value === null || value === undefined || isNaN(value) || value < 0) {\n this.currentValue.set(0);\n } else {\n this.currentValue.set(value);\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided, otherwise default to 0\n const initialValue = this.value();\n if (initialValue === null || initialValue === undefined || isNaN(initialValue) || initialValue < 0) {\n this.currentValue.set(0);\n } else {\n this.currentValue.set(initialValue);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n }\n }\n\n onBlur(): void {\n const value = this.currentValue();\n this.blur.emit(value);\n }\n\n onValueChange(value: number): void {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n}\n","<div class=\"progress-input-container\" [class.disabled]=\"!isActive()\" (dblclick)=\"onActivate(); $event.stopPropagation()\">\n <span class=\"progress-value\">{{displayValue()}}%</span>\n <mat-slider \n class=\"progress-slider\" \n [min]=\"0\" \n [max]=\"100\" \n [step]=\"1\" \n [discrete]=\"true\" \n [showTickMarks]=\"true\"\n [disabled]=\"!isActive()\">\n <input \n matSliderThumb \n [ngModel]=\"displayValue()\" \n (ngModelChange)=\"onValueChange($event)\" \n (blur)=\"onBlur()\"\n [disabled]=\"!isActive()\">\n </mat-slider>\n</div>\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n EventEmitter,\n input,\n Output,\n signal,\n ViewEncapsulation\n} from '@angular/core';\n\n\nexport interface RatingConfig {\n startValue?: number;\n endValue?: number;\n emojiValue?: 'star' | 'smile' | 'heart';\n}\n\n@Component({\n selector: 'eru-rating',\n templateUrl: './rating.component.html',\n styleUrls: ['./rating.component.scss'],\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class RatingComponent {\n value = input<number>(0);\n config = input<RatingConfig>({ startValue: 1, endValue: 5, emojiValue: 'star' });\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n @Output() valueChange = new EventEmitter<number>();\n @Output() editModeChange = new EventEmitter<boolean>();\n currentValue = signal<number>(0);\n hoverRating = signal(0);\n\n constructor() {\n effect(() => this.currentValue.set(this.value()));\n }\n\n getRatingStars = computed(() => {\n const cfg = this.config();\n const start = cfg.startValue || 1;\n const end = cfg.endValue || 5;\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n });\n\n getEmoji(star: number): string {\n const cfg = this.config();\n const val = this.currentValue();\n const hover = this.hoverRating();\n const isFilled = this.isActive() ? (hover > 0 ? star <= hover : star <= val) : star <= val;\n \n switch (cfg.emojiValue) {\n case 'star': return isFilled ? '★' : '☆';\n case 'smile': return isFilled ? '☻' : '☺';\n case 'heart': return isFilled ? '♥' : '♡';\n default: return isFilled ? '★' : '☆';\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) this.editModeChange.emit(true);\n }\n\n setRating(value: number): void {\n this.currentValue.set(this.currentValue() === value ? 0 : value);\n this.valueChange.emit(this.currentValue());\n this.hoverRating.set(0);\n }\n}\n","<div class=\"rating-container\" (dblclick)=\"onActivate()\">\n @for (star of getRatingStars(); track star) {\n <span class=\"rating-star\" \n [class.active]=\"currentValue() >= star\"\n [class.editable]=\"isActive() && isEditable()\"\n (click)=\"isActive() && isEditable() ? setRating(star) : null\"\n (mouseenter)=\"isActive() && isEditable() ? hoverRating.set(star) : null\"\n (mouseleave)=\"isActive() && isEditable() ? hoverRating.set(0) : null\">\n {{getEmoji(star)}}\n </span>\n }\n @if(isActive()) {\n <span class=\"rating-value\">{{currentValue()}}/{{config().endValue || 5}}</span>\n }\n</div>\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n AfterViewInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\n\n@Component({\n selector: 'eru-select',\n templateUrl: './select.component.html',\n styleUrls: ['./select.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatOptionModule,\n MatCheckboxModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class SelectComponent implements OnInit, AfterViewInit {\n private el = inject(ElementRef);\n \n @ViewChild('selectContainer', { static: false }) selectContainer!: ElementRef<HTMLElement>;\n\n // Inputs\n value = input<any | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n multiple = input<boolean>(false);\n eruGridStore = input<EruGridStore | null>(null);\n // Outputs\n @Output() valueChange = new EventEmitter<any | any[] | null>();\n @Output() blur = new EventEmitter<any | any[] | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<any | any[] | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<any | any[] | null>(null);\n searchText = signal('');\n error = signal('');\n\n // Computed properties for Select All functionality\n isAllSelected = computed(() => {\n if (!this.multiple()) return false;\n const value = this.currentValue();\n if (!Array.isArray(value) || value.length === 0) return false;\n const filteredOpts = this.filteredOptions();\n return filteredOpts.length > 0 && filteredOpts.every(opt => value.includes(opt.value));\n });\n\n isIndeterminate = computed(() => {\n if (!this.multiple()) return false;\n const value = this.currentValue();\n if (!Array.isArray(value) || value.length === 0) return false;\n const filteredOpts = this.filteredOptions();\n const selectedCount = filteredOpts.filter(opt => value.includes(opt.value)).length;\n return selectedCount > 0 && selectedCount < filteredOpts.length;\n });\n\n // Computed properties\n filteredOptions = computed(() => {\n const cfg = this.config();\n if (!cfg || !cfg.option_type) {\n return [];\n }\n const searchText = this.searchText().toLowerCase().trim();\n const optionType = cfg.option_type;\n \n if (optionType === 'STATIC') {\n const options = cfg.options || [];\n // Map and filter empty options\n let processedOptions = options\n .map((value: any) => ({ value: value.name, label: value.label || value.name }));\n // If searchText is blank, return all options\n if (!searchText) {\n return processedOptions;\n }\n \n // Filter on lowercase and return filtered options\n return processedOptions.filter((option: { value: string; label: string }) =>\n option.label.toLowerCase().includes(searchText) || option.value.toLowerCase().includes(searchText)\n );\n } else if (optionType === 'API' || optionType === 'ENTITY_DATA') {\n let apiName = cfg.api_name;\n if(optionType === 'ENTITY_DATA') {\n apiName = cfg.entity_name;\n }\n let apiField = cfg.api_field;\n if(optionType === 'ENTITY_DATA') {\n apiField = cfg.field_name;\n }\n if (apiName) {\n // Get store and read data (no side effects in computed)\n const store = this.eruGridStore();\n if (store) {\n // Access the dynamicData signal to make computed reactive\n const dynamicDataMap = store.dynamicData();\n if (dynamicDataMap && dynamicDataMap.has(apiName)) {\n const apiData = dynamicDataMap.get(apiName);\n if (apiData) {\n // Process API response data\n // Expected format: array of { name, label } or array of strings\n let processedOptions: Array<{ value: any; label: string }> = [];\n \n if (Array.isArray(apiData)) {\n processedOptions = apiData.map((item: any) => {\n if (typeof item === 'string') {\n return { value: item, label: item };\n } else if (item && typeof item === 'object') {\n return {\n value: item[apiField || ''],\n label: item[apiField || ''] \n };\n }\n return { value: item[apiField || ''], label: String(item[apiField || '']) };\n });\n }\n \n // Apply search filter if searchText is provided\n if (!searchText) {\n return processedOptions;\n }\n \n return processedOptions.filter((option: { value: string; label: string }) =>\n option.label.toLowerCase().includes(searchText) || String(option.value).toLowerCase().includes(searchText)\n );\n }\n }\n }\n }\n // Return empty array while waiting for API response\n return [];\n }\n\n // Handle other option types (API, ENTITY_DATA) if needed\n return [];\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n if (this.multiple() && !Array.isArray(value) && value !== null && value !== undefined) {\n // Convert single value to array for multiple mode\n this.currentValue.set([value]);\n } else if (this.multiple() && (value === null || value === undefined)) {\n // Initialize as empty array for multiple mode\n this.currentValue.set([]);\n } else {\n this.currentValue.set(value);\n }\n });\n \n // Re-sync value when isActive becomes true\n effect(() => {\n const active = this.isActive();\n if (active) {\n // Re-sync the value when component becomes active\n const value = this.value();\n if (this.multiple() && !Array.isArray(value) && value !== null && value !== undefined) {\n this.currentValue.set([value]);\n } else if (this.multiple() && (value === null || value === undefined)) {\n this.currentValue.set([]);\n } else {\n this.currentValue.set(value);\n }\n }\n });\n\n // Effect to request API data when needed (separate from computed to avoid signal write errors)\n effect(() => {\n const cfg = this.config();\n const store = this.eruGridStore();\n \n if (cfg && ((cfg.option_type === 'API' && cfg.api_name) || (cfg.option_type === 'ENTITY_DATA' && cfg.entity_name)) && store) {\n let apiName = cfg.api_name || '';\n if(cfg.option_type === 'ENTITY_DATA') {\n apiName = cfg.entity_name || '';\n }\n const currentRequests = store.getDynamicDataRequest() || [];\n \n // Request data if not already requested\n if (!currentRequests.includes(apiName)) {\n store.setDynamicDataRequest(apiName);\n }\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (this.multiple()) {\n if (Array.isArray(initialValue)) {\n this.currentValue.set(initialValue);\n } else if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set([initialValue]);\n } else {\n this.currentValue.set([]);\n }\n } else {\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n // Re-sync value when activating\n const value = this.value();\n if (this.multiple() && !Array.isArray(value) && value !== null && value !== undefined) {\n this.currentValue.set([value]);\n } else if (this.multiple() && (value === null || value === undefined)) {\n this.currentValue.set([]);\n } else {\n this.currentValue.set(value);\n }\n this.editModeChange.emit(true);\n this.focus.emit();\n }\n }\n\n // Compare function for mat-select to properly match values\n compareWith = (o1: any, o2: any): boolean => {\n if (o1 === o2) return true;\n if (o1 == null || o2 == null) return false;\n // Handle both string and number comparisons\n return String(o1) === String(o2);\n }\n\n onBlur(event: Event): void {\n // Only blur if the new focus target is not within the select component or mat-select panel\n const focusEvent = event as FocusEvent;\n const relatedTarget = focusEvent.relatedTarget as HTMLElement;\n \n // Check if focus is moving to mat-select elements\n const isMovingToSelect = relatedTarget && (\n relatedTarget.closest('.mat-mdc-select-panel') !== null ||\n relatedTarget.closest('.select-panel') !== null ||\n relatedTarget.closest('.mat-mdc-option') !== null ||\n relatedTarget.closest('.search-option') !== null\n );\n \n // Check if mat-select overlay is open (overlays are rendered at body level)\n const selectOverlay = document.querySelector('.cdk-overlay-pane');\n const isSelectOpen = selectOverlay !== null;\n \n // Check if the active element is within the select panel\n const activeElement = document.activeElement as HTMLElement;\n const isActiveInPanel = activeElement && (\n activeElement.closest('.mat-mdc-select-panel') !== null ||\n activeElement.closest('.select-panel') !== null ||\n activeElement.closest('.search-option') !== null\n );\n \n if (!relatedTarget || (!this.el.nativeElement.contains(relatedTarget) && !isMovingToSelect && !isSelectOpen && !isActiveInPanel)) {\n // Small delay to allow select to open before blur\n setTimeout(() => {\n // Double-check select is still not open before blurring\n const stillOpen = document.querySelector('.cdk-overlay-pane');\n const stillActiveInPanel = document.activeElement && (\n (document.activeElement as HTMLElement).closest('.mat-mdc-select-panel') !== null ||\n (document.activeElement as HTMLElement).closest('.select-panel') !== null\n );\n if (!stillOpen && !stillActiveInPanel) {\n const value = this.currentValue();\n this.blur.emit(value);\n }\n }, 150);\n }\n }\n\n onValueChange(value: any | any[] | null): void {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n }\n\n toggleSelectAll(checked: boolean): void {\n if (!this.multiple()) return;\n \n if (checked) {\n // Select all filtered options\n const filteredOpts = this.filteredOptions();\n const allValues = filteredOpts.map(opt => opt.value);\n this.currentValue.set(allValues);\n this.valueChange.emit(allValues);\n } else {\n // Deselect all\n this.currentValue.set([]);\n this.valueChange.emit([]);\n }\n }\n\n onSearchChange(searchValue: string): void {\n this.searchText.set(searchValue || '');\n }\n\n onOpenedChange(opened: boolean): void {\n if (!opened) {\n this.searchText.set('');\n } /* else {\n // Set panel width when opened\n setTimeout(() => {\n // Try both panel class selectors\n const panel = document.querySelector('.select-panel') as HTMLElement || \n document.querySelector('.mat-mdc-select-panel') as HTMLElement;\n if (panel) {\n const width = this.columnWidth();\n if (width > 0) {\n panel.style.width = `${width}px`;\n } else if (this.selectContainer) {\n // Fallback to container width if columnWidth not set\n const containerWidth = this.selectContainer.nativeElement.offsetWidth;\n if (containerWidth > 0) {\n panel.style.width = `${containerWidth}px`;\n }\n }\n }\n }, 0);\n } */\n }\n\n ngAfterViewInit(): void {\n // Component initialization after view\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n // Helper methods for config properties\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('required') === true;\n }\n\n formatDisplayValue(): string {\n const value = this.currentValue();\n const cfg = this.config();\n \n if (!cfg) {\n if (Array.isArray(value)) {\n return value.length > 0 ? value.join(', ') : '';\n }\n return value ? String(value) : '';\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n\n // Get filtered options to match against\n const filteredOpts = this.filteredOptions();\n \n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '';\n }\n const labels = value\n .map(v => {\n const option = filteredOpts.find(opt => opt.value === v);\n return option ? option.label : String(v);\n })\n .filter(Boolean);\n return labels.join(', ');\n }\n\n const option = filteredOpts.find(opt => opt.value === value);\n return option ? option.label : String(value);\n }\n}\n\n","@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"select-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"select-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"multiple()\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"select-panel\"\n class=\"select-input\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n @if (multiple()) {\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n }\n </mat-option>\n\n @for (option of filteredOptions(); track option.value) {\n @if (multiple()) {\n <mat-option [value]=\"option.value\" (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n {{ option.label }}\n </mat-option>\n } @else {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"select-display\" \n [class.select-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"select-drillable\" (click)=\"onDrillableClick($event)\">\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n </span>\n } @else {\n {{formatDisplayValue() || (getProperty('placeholder') || '')}}\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\n@Component({\n selector: 'eru-status',\n templateUrl: './status.component.html',\n styleUrls: ['./status.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatOptionModule,\n MatButtonModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class StatusComponent implements OnInit {\n private el = inject(ElementRef);\n \n @ViewChild('selectContainer', { static: false }) selectContainer!: ElementRef<HTMLElement>;\n\n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n\n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n searchText = signal('');\n\n // Computed properties\n filteredOptions = computed(() => {\n const cfg = this.config();\n if (!cfg) {\n return [];\n }\n const searchText = this.searchText().toLowerCase().trim();\n \n const options = cfg.options || [];\n let processedOptions = options\n .map((value: any) => ({ value: value.name, label: value.name, color: value.color }));\n \n if (!searchText) {\n return processedOptions;\n }\n \n return processedOptions.filter((option: { value: string; label: string }) =>\n option.label.toLowerCase().includes(searchText) || option.value.toLowerCase().includes(searchText)\n );\n });\n\n statusColors = computed(() => {\n const value = this.currentValue();\n return this.getStatusColor(value);\n });\n\n statusDisplay = computed(() => {\n const value = this.currentValue();\n return this.getStatusButtonDisplay(value);\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n\n // Effect to request API data when needed\n effect(() => {\n const cfg = this.config();\n const store = this.eruGridStore();\n \n if (cfg && ((cfg.option_type === 'API' && cfg.api_name) || (cfg.option_type === 'ENTITY_DATA' && cfg.entity_name)) && store) {\n let apiName = cfg.api_name || '';\n if(cfg.option_type === 'ENTITY_DATA') {\n apiName = cfg.entity_name || '';\n }\n const currentRequests = store.getDynamicDataRequest() || [];\n \n if (!currentRequests.includes(apiName)) {\n store.setDynamicDataRequest(apiName);\n }\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n }\n }\n\n onBlur(event: Event): void {\n // Only blur if the new focus target is not within the select component or mat-select panel\n const focusEvent = event as FocusEvent;\n const relatedTarget = focusEvent.relatedTarget as HTMLElement;\n \n // Check if focus is moving to mat-select elements\n const isMovingToSelect = relatedTarget && (\n relatedTarget.closest('.mat-mdc-select-panel') !== null ||\n relatedTarget.closest('.status-panel') !== null ||\n relatedTarget.closest('.mat-mdc-option') !== null ||\n relatedTarget.closest('.search-option') !== null\n );\n \n // Check if mat-select overlay is open (overlays are rendered at body level)\n const selectOverlay = document.querySelector('.cdk-overlay-pane');\n const isSelectOpen = selectOverlay !== null;\n \n // Check if the active element is within the select panel\n const activeElement = document.activeElement as HTMLElement;\n const isActiveInPanel = activeElement && (\n activeElement.closest('.mat-mdc-select-panel') !== null ||\n activeElement.closest('.status-panel') !== null ||\n activeElement.closest('.search-option') !== null\n );\n \n if (!relatedTarget || (!this.el.nativeElement.contains(relatedTarget) && !isMovingToSelect && !isSelectOpen && !isActiveInPanel)) {\n // Small delay to allow select to open before blur\n setTimeout(() => {\n // Double-check select is still not open before blurring\n const stillOpen = document.querySelector('.cdk-overlay-pane');\n const stillActiveInPanel = document.activeElement && (\n (document.activeElement as HTMLElement).closest('.mat-mdc-select-panel') !== null ||\n (document.activeElement as HTMLElement).closest('.status-panel') !== null\n );\n if (!stillOpen && !stillActiveInPanel) {\n const value = this.currentValue();\n this.blur.emit(value);\n }\n }, 150);\n }\n }\n\n onValueChange(value: string | null): void {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n }\n\n onSearchChange(searchValue: string): void {\n this.searchText.set(searchValue || '');\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('required') === true;\n }\n\n compareWith = (o1: any, o2: any): boolean => {\n if (o1 === o2) return true;\n if (o1 == null || o2 == null) return false;\n // Handle both string and number comparisons\n return String(o1) === String(o2);\n }\n\n onOpenedChange(opened: boolean): void {\n if (!opened) {\n this.searchText.set('');\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n trackByValueAndIndex(index: number, option: { value: string; label: string; color?: string }): string {\n return `${option.value}_${index}`;\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n getStatusColor(statusName: string | null): { background: string, border: string, text: string } {\n const cfg = this.config();\n if (!cfg || !cfg.options) {\n return {\n background: 'white',\n border: 'black',\n text: 'black'\n };\n }\n \n const options = cfg.options || [];\n // Find option by name (status value matches option.name)\n const statusOption = options.find((opt: any) => {\n return opt.name === statusName;\n });\n\n if (!statusOption || !statusOption.color) {\n return {\n background: 'white',\n border: 'black',\n text: 'black'\n };\n }\n\n // Advanced color manipulation function for rounded rectangle display\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(statusOption.color);\n }\n\n getStatusButtonDisplay(statusName: string | null): { text: string, color: string } {\n const cfg = this.config();\n if (!cfg || !cfg.options) {\n return { text: statusName || '', color: '' };\n }\n \n const options = cfg.options || [];\n const statusOption = options.find((opt: any) => opt.name === statusName);\n\n if (!statusOption) {\n return { text: statusName || '', color: '' };\n }\n\n return {\n text: statusOption.name,\n color: statusOption.color || ''\n };\n }\n\n getStatusColorForOption(statusValue: string): { background: string, color: string } {\n const cfg = this.config();\n if (!cfg || !cfg.options) {\n return { background: '#cccccc', color: '#000000' };\n }\n \n const options = cfg.options || [];\n // Find option by name (status value matches option.name)\n const statusOption = options.find((opt: any) => {\n return opt.name === statusValue;\n });\n\n if (!statusOption || !statusOption.color) {\n return { background: '#cccccc', color: '#000000' };\n }\n\n const backgroundColor = statusOption.color;\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 }\n\n getDarkerColor(color: string): string {\n if (!color) return '#000000';\n \n // Remove # if present\n const hex = color.replace('#', '');\n \n // Convert hex to RGB\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n \n // Darken by 20%\n const darkenFactor = 0.2;\n const darkerR = Math.max(0, Math.round(r * (1 - darkenFactor)));\n const darkerG = Math.max(0, Math.round(g * (1 - darkenFactor)));\n const darkerB = Math.max(0, Math.round(b * (1 - darkenFactor)));\n \n // Convert back to hex\n const toHex = (n: number) => {\n const hex = n.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n \n return `#${toHex(darkerR)}${toHex(darkerG)}${toHex(darkerB)}`;\n }\n}\n\n","@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"status-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"status-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || 'Select status...'\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"status-panel\"\n class=\"status-input\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <mat-option [value]=\"null\">\n None\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"status-option-content\">\n @if(option.color) {\n <span class=\"status-option-indicator\" \n [style.background-color]=\"option.color\"\n [style.border-color]=\"getDarkerColor(option.color)\"></span>\n }\n <span class=\"status-option-label\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n @if(currentValue()) {\n <div \n class=\"status-display\"\n [style.background-color]=\"statusColors().background\"\n [style.border-color]=\"statusColors().border\"\n [style.color]=\"statusColors().text\"\n (dblclick)=\"onActivate()\">\n <div class=\"status-display-content\">\n @if (isDrillable()) {\n <span class=\"status-text drillable-value\" (click)=\"onDrillableClick($event)\">\n {{statusDisplay().text}}\n </span>\n } @else {\n <span class=\"status-text\">\n {{statusDisplay().text}}\n </span>\n }\n </div>\n </div>\n } @else {\n <div class=\"status-empty\" (dblclick)=\"onActivate()\"></div>\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\n@Component({\n selector: 'eru-tag',\n templateUrl: './tag.component.html',\n styleUrls: ['./tag.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatOptionModule,\n MatChipsModule,\n MatCheckboxModule,\n MatButtonModule,\n MatIconModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class TagComponent implements OnInit {\n private el = inject(ElementRef);\n \n @ViewChild('selectContainer', { static: false }) selectContainer!: ElementRef<HTMLElement>;\n\n // Inputs\n value = input<string[] | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n\n // Outputs\n @Output() valueChange = new EventEmitter<string[] | null>();\n @Output() blur = new EventEmitter<string[] | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string[] | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n @Output() newTagAdded = new EventEmitter<{ name: string; color: string }>();\n\n // Internal state\n currentValue = signal<string[]>([]);\n searchText = signal('');\n newTagInput = signal('');\n newTagColor = signal<string>('#cccccc');\n newlyAddedTags = signal<Array<{ name: string; color: string }>>([]);\n\n // Computed properties for Select All functionality\n isAllSelected = computed(() => {\n const value = this.currentValue();\n if (!Array.isArray(value) || value.length === 0) return false;\n const filteredOpts = this.filteredOptions();\n return filteredOpts.length > 0 && filteredOpts.every(opt => value.includes(opt.value));\n });\n\n isIndeterminate = computed(() => {\n const value = this.currentValue();\n if (!Array.isArray(value) || value.length === 0) return false;\n const filteredOpts = this.filteredOptions();\n const selectedCount = filteredOpts.filter(opt => value.includes(opt.value)).length;\n return selectedCount > 0 && selectedCount < filteredOpts.length;\n });\n\n // Computed properties\n filteredOptions = computed(() => {\n const cfg = this.config();\n const searchText = this.searchText().toLowerCase().trim();\n const addedTags = this.newlyAddedTags();\n \n // Get options from config\n const configOptions = cfg?.options || [];\n \n // Merge config options with newly added tags\n // Create a map to avoid duplicates (newly added tags take precedence)\n const optionsMap = new Map<string, { name: string; color: string }>();\n \n // First add config options\n configOptions.forEach((opt: any) => {\n const name = opt.name || opt.value || '';\n if (name) {\n optionsMap.set(name.toLowerCase(), { name, color: opt.color || '#cccccc' });\n }\n });\n \n // Then add/override with newly added tags\n addedTags.forEach(tag => {\n optionsMap.set(tag.name.toLowerCase(), tag);\n });\n \n // Convert to processed options format\n let processedOptions = Array.from(optionsMap.values())\n .map((value: any) => ({ value: value.name, label: value.name, color: value.color }));\n \n if (!searchText) {\n return processedOptions;\n }\n \n return processedOptions.filter((option: { value: string; label: string }) =>\n option.label.toLowerCase().includes(searchText) || option.value.toLowerCase().includes(searchText)\n );\n });\n\n // Calculate max display tags based on column width\n maxDisplayTags = computed(() => {\n const columnWidth = this.columnWidth();\n if (columnWidth <= 0) {\n return 2; // Default fallback\n }\n \n // Estimate tag width: average tag is ~60px (text + padding)\n // Each tag has padding 4px 8px = 12px horizontal padding\n // Average tag text is ~40-50px\n // Gap between tags is 4px\n // Reserve space for \"+ X more\" indicator (~80px)\n // Reserve padding (24px total)\n const avgTagWidth = 30; // Estimated average tag width\n const gapBetweenTags = 4;\n const moreIndicatorWidth = 80; // Space for \"+ X more\" text\n const padding = 24;\n \n // Calculate how many tags can fit\n const availableWidth = columnWidth - padding - moreIndicatorWidth;\n const maxTags = Math.floor(availableWidth / (avgTagWidth + gapBetweenTags));\n \n // Ensure at least 1 tag can be shown, but cap at reasonable max\n return Math.max(1, Math.min(maxTags, 10));\n });\n\n tagDisplay = computed(() => {\n const tags = this.currentValue();\n const maxDisplay = this.maxDisplayTags();\n const displayTags = tags.slice(0, maxDisplay);\n const moreCount = Math.max(0, tags.length - maxDisplay);\n return { displayTags, moreCount };\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n if (Array.isArray(value)) {\n this.currentValue.set(value);\n } else if (value) {\n this.currentValue.set([value]);\n } else {\n this.currentValue.set([]);\n }\n });\n\n // Effect to request API data when needed\n effect(() => {\n const cfg = this.config();\n const store = this.eruGridStore();\n \n if (cfg && ((cfg.option_type === 'API' && cfg.api_name) || (cfg.option_type === 'ENTITY_DATA' && cfg.entity_name)) && store) {\n let apiName = cfg.api_name || '';\n if(cfg.option_type === 'ENTITY_DATA') {\n apiName = cfg.entity_name || '';\n }\n const currentRequests = store.getDynamicDataRequest() || [];\n \n if (!currentRequests.includes(apiName)) {\n store.setDynamicDataRequest(apiName);\n }\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (Array.isArray(initialValue)) {\n this.currentValue.set(initialValue);\n } else if (initialValue) {\n this.currentValue.set([initialValue]);\n } else {\n this.currentValue.set([]);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n }\n }\n\n onBlur(event: Event): void {\n // Only blur if the new focus target is not within the select component or mat-select panel\n const focusEvent = event as FocusEvent;\n const relatedTarget = focusEvent.relatedTarget as HTMLElement;\n \n // Check if focus is moving to mat-select elements\n const isMovingToSelect = relatedTarget && (\n relatedTarget.closest('.mat-mdc-select-panel') !== null ||\n relatedTarget.closest('.tag-panel') !== null ||\n relatedTarget.closest('.mat-mdc-option') !== null ||\n relatedTarget.closest('.search-option') !== null\n );\n \n // Check if mat-select overlay is open (overlays are rendered at body level)\n const selectOverlay = document.querySelector('.cdk-overlay-pane');\n const isSelectOpen = selectOverlay !== null;\n \n // Check if the active element is within the select panel\n const activeElement = document.activeElement as HTMLElement;\n const isActiveInPanel = activeElement && (\n activeElement.closest('.mat-mdc-select-panel') !== null ||\n activeElement.closest('.tag-panel') !== null ||\n activeElement.closest('.search-option') !== null\n );\n \n if (!relatedTarget || (!this.el.nativeElement.contains(relatedTarget) && !isMovingToSelect && !isSelectOpen && !isActiveInPanel)) {\n // Small delay to allow select to open before blur\n setTimeout(() => {\n // Double-check select is still not open before blurring\n const stillOpen = document.querySelector('.cdk-overlay-pane');\n const stillActiveInPanel = document.activeElement && (\n (document.activeElement as HTMLElement).closest('.mat-mdc-select-panel') !== null ||\n (document.activeElement as HTMLElement).closest('.tag-panel') !== null\n );\n if (!stillOpen && !stillActiveInPanel) {\n const value = this.currentValue();\n this.blur.emit(value.length > 0 ? value : null);\n }\n }, 150);\n }\n }\n\n onValueChange(value: string[] | null): void {\n const tags = value || [];\n this.currentValue.set(tags);\n this.valueChange.emit(tags.length > 0 ? tags : null);\n }\n\n onSearchChange(searchValue: string): void {\n this.searchText.set(searchValue || '');\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('required') === true;\n }\n compareWith = (o1: any, o2: any): boolean => {\n if (o1 === o2) return true;\n if (o1 == null || o2 == null) return false;\n // Handle both string and number comparisons\n return String(o1) === String(o2);\n }\n onOpenedChange(opened: boolean): void {\n if (!opened) {\n this.searchText.set('');\n }\n }\n\n toggleSelectAll(checked: boolean): void {\n const filteredOpts = this.filteredOptions();\n if (checked) {\n const currentTags = this.currentValue();\n const newTags = [...new Set([...currentTags, ...filteredOpts.map(opt => opt.value)])];\n this.currentValue.set(newTags);\n this.valueChange.emit(newTags.length > 0 ? newTags : null);\n } else {\n const filteredValues = filteredOpts.map(opt => opt.value);\n const newTags = this.currentValue().filter(tag => !filteredValues.includes(tag));\n this.currentValue.set(newTags);\n this.valueChange.emit(newTags.length > 0 ? newTags : null);\n }\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue().length > 0 ? this.currentValue() : null);\n }\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n removeTag(tag: string, event: Event): void {\n event.stopPropagation();\n const currentTags = this.currentValue();\n const updatedTags = currentTags.filter(t => t !== tag);\n this.currentValue.set(updatedTags);\n this.valueChange.emit(updatedTags.length > 0 ? updatedTags : null);\n }\n\n getTagColor(tag: string): { background: string, color: string } {\n const cfg = this.config();\n if (!cfg || !cfg.options) {\n return { background: '#cccccc', color: '#000000' };\n }\n \n const options = cfg.options || [];\n // Find option by name (tag value matches option.name)\n const tagOption = options.find((opt: any) => {\n return opt.name === tag;\n });\n\n if (!tagOption || !tagOption.color) {\n return { background: '#cccccc', color: '#000000' };\n }\n\n const backgroundColor = tagOption.color;\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 }\n\n isTagSelected(tagValue: string): boolean {\n return this.currentValue().includes(tagValue);\n }\n\n trackByValueAndIndex(index: number, option: { value: string; label: string; color?: string }): string {\n return `${option.value}_${index}`;\n }\n\n canAddNewTag = computed(() => {\n const input = this.newTagInput().trim();\n if (!input) return false;\n \n const inputLower = input.toLowerCase();\n \n // Check if tag already exists in config options\n const cfg = this.config();\n const configOptions = cfg?.options || [];\n const existsInConfig = configOptions.some((opt: any) => \n (opt.name || opt.value || '').toLowerCase() === inputLower\n );\n \n // Check if tag already exists in newly added tags\n const addedTags = this.newlyAddedTags();\n const existsInAdded = addedTags.some(tag => \n tag.name.toLowerCase() === inputLower\n );\n \n return !existsInConfig && !existsInAdded;\n });\n\n onNewTagInputChange(value: string): void {\n this.newTagInput.set(value);\n }\n\n onNewTagColorChange(color: string): void {\n this.newTagColor.set(color);\n }\n\n addNewTag(): void {\n const tagName = this.newTagInput().trim();\n if (!tagName || !this.canAddNewTag()) return;\n \n const tagColor = this.newTagColor();\n const newTag = { name: tagName, color: tagColor };\n \n // Add to newly added tags signal (this will trigger filteredOptions to update)\n const currentAddedTags = this.newlyAddedTags();\n this.newlyAddedTags.set([...currentAddedTags, newTag]);\n \n // Add to config options if config exists\n const cfg = this.config();\n if (cfg) {\n if (!cfg.options) {\n cfg.options = [];\n }\n // Check if tag already exists (shouldn't happen due to canAddNewTag check, but double-check)\n const existingIndex = cfg.options.findIndex((opt: any) => \n (opt.name || opt.value || '').toLowerCase() === tagName.toLowerCase()\n );\n if (existingIndex === -1) {\n cfg.options.push(newTag);\n }\n }\n \n // Automatically select the newly added tag\n const currentTags = this.currentValue();\n if (!currentTags.includes(tagName)) {\n const updatedTags = [...currentTags, tagName];\n this.currentValue.set(updatedTags);\n this.valueChange.emit(updatedTags.length > 0 ? updatedTags : null);\n }\n \n // Emit event to parent with name and color\n this.newTagAdded.emit(newTag);\n \n // Clear input and reset color to default\n this.newTagInput.set('');\n this.newTagColor.set('#cccccc');\n }\n}\n\n","@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"tag-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"tag-container\">\n <mat-select\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"true\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"tag-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"tag-option\" \n [style.background]=\"getTagColor(option.value).background\" \n [style.color]=\"getTagColor(option.value).color\">\n {{ option.label }}\n </span>\n </mat-option>\n }\n\n <mat-option class=\"add-tag-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"add-tag-container\" (click)=\"$event.stopPropagation()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"add-tag-form-field\">\n <mat-label>Add new tag</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"add-tag-input\"\n placeholder=\"Enter tag name...\"\n [value]=\"newTagInput()\"\n (input)=\"onNewTagInputChange($any($event.target).value)\"\n (keydown.enter)=\"addNewTag()\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"add-tag-actions\">\n <input\n type=\"color\"\n class=\"add-tag-color-picker\"\n [value]=\"newTagColor()\"\n (input)=\"onNewTagColorChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n title=\"Select tag color\">\n <button\n mat-icon-button\n class=\"add-tag-button\"\n [disabled]=\"!canAddNewTag()\"\n (click)=\"addNewTag(); $event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n </div>\n </mat-option>\n\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"tag-display\" \n [class.tag-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n </span>\n } @else {\n @for (tag of tagDisplay().displayTags; track tag) {\n <span class=\"tag\" \n [style.background]=\"getTagColor(tag).background\" \n [style.color]=\"getTagColor(tag).color\">\n {{tag}}\n </span>\n }\n @if(tagDisplay().moreCount > 0) {\n <span class=\"tag-more\">\n + {{tagDisplay().moreCount}}\n </span>\n }\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\nexport interface PeopleOption {\n value: string;\n label: string;\n disabled?: boolean;\n fn?: string; // First name for avatar initials\n ln?: string; // Last name for avatar initials\n}\n\n@Component({\n selector: 'eru-people',\n templateUrl: './people.component.html',\n styleUrls: ['./people.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatOptionModule,\n MatCheckboxModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class PeopleComponent implements OnInit {\n private el = inject(ElementRef);\n\n // Inputs\n value = input<string[] | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n\n // Outputs\n @Output() valueChange = new EventEmitter<string[] | null>();\n @Output() blur = new EventEmitter<string[] | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string[] | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string[]>([]);\n searchText = signal('');\n\n @ViewChild('selectContainer', { static: false }) selectContainer!: ElementRef<HTMLElement>;\n\n // Computed properties for Select All functionality\n isAllSelected = computed(() => {\n const value = this.currentValue();\n if (!Array.isArray(value) || value.length === 0) return false;\n const filteredOpts = this.filteredOptions();\n return filteredOpts.length > 0 && filteredOpts.every(opt => value.includes(opt.value));\n });\n\n isIndeterminate = computed(() => {\n const value = this.currentValue();\n if (!Array.isArray(value) || value.length === 0) return false;\n const filteredOpts = this.filteredOptions();\n const selectedCount = filteredOpts.filter(opt => value.includes(opt.value)).length;\n return selectedCount > 0 && selectedCount < filteredOpts.length;\n });\n\n // Computed properties\n filteredOptions = computed(() => {\n const cfg = this.config();\n if (!cfg) {\n return [];\n }\n \n const search = this.searchText().toLowerCase().trim();\n const store = this.eruGridStore();\n \n // People component always uses API type with api_name = \"people\"\n const apiName = 'people';\n \n if (store) {\n // Access the dynamicData signal to make computed reactive\n const dynamicDataMap = store.dynamicData();\n if (dynamicDataMap && dynamicDataMap.has(apiName)) {\n const apiData = dynamicDataMap.get(apiName);\n if (apiData && Array.isArray(apiData)) {\n // Process API response: { fn, ln, id } -> label = fn + ln, value = id\n let processedOptions: PeopleOption[] = apiData.map((item: any) => {\n const fn = item.fn || '';\n const ln = item.ln || '';\n const fullName = `${fn} ${ln}`.trim() || String(item.id || '');\n return {\n value: String(item.id || ''),\n label: fullName,\n fn: fn,\n ln: ln\n };\n });\n \n // Apply search filter if searchText is provided\n if (!search) {\n return processedOptions;\n }\n \n return processedOptions.filter((option: PeopleOption) =>\n option.label.toLowerCase().includes(search) ||\n option.value.toLowerCase().includes(search) ||\n (option.fn && option.fn.toLowerCase().includes(search)) ||\n (option.ln && option.ln.toLowerCase().includes(search))\n );\n }\n }\n }\n \n // Return empty array while waiting for API response\n return [];\n });\n\n // Calculate max display avatars based on column width\n maxDisplayAvatars = computed(() => {\n const columnWidth = this.columnWidth();\n if (columnWidth <= 0) {\n return 3; // Default fallback\n }\n \n // Each avatar is 28px wide with -8px margin (so effectively 20px per avatar)\n // Plus space for count circle if needed (28px)\n // Reserve some padding (16px total)\n const avatarWidth = 20; // 28px - 8px margin\n const countCircleWidth = 28;\n const padding = 28;\n \n // Calculate how many avatars can fit\n const availableWidth = columnWidth - padding;\n const maxAvatars = (Math.floor(availableWidth / avatarWidth) -1);\n \n // Ensure at least 1 avatar can be shown, but cap at reasonable max\n return Math.max(1, Math.min(maxAvatars, 10));\n });\n\n displayAvatars = computed(() => {\n const people = this.currentValue();\n const maxDisplay = this.maxDisplayAvatars();\n return people.slice(0, maxDisplay);\n });\n\n remainingCount = computed(() => {\n const people = this.currentValue();\n const maxDisplay = this.maxDisplayAvatars();\n return Math.max(0, people.length - maxDisplay);\n });\n \n // Get option by value for display\n getOptionByValue(value: string): PeopleOption | undefined {\n return this.filteredOptions().find(opt => opt.value === value);\n }\n \n // Get display name for a value (for avatar initials)\n getDisplayName(value: string): string {\n const option = this.getOptionByValue(value);\n if (option) {\n return option.label;\n }\n return value; // Fallback to value if option not found\n }\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n if (Array.isArray(value)) {\n this.currentValue.set(value);\n } else if (value) {\n this.currentValue.set([value]);\n } else {\n this.currentValue.set([]);\n }\n });\n\n // Effect to request API data when needed (people component always uses API)\n effect(() => {\n const store = this.eruGridStore();\n \n if (store) {\n const apiName = 'people';\n const currentRequests = store.getDynamicDataRequest() || [];\n \n // Request data if not already requested\n if (!currentRequests.includes(apiName)) {\n store.setDynamicDataRequest(apiName);\n }\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (Array.isArray(initialValue)) {\n this.currentValue.set(initialValue);\n } else if (initialValue) {\n this.currentValue.set([initialValue]);\n } else {\n this.currentValue.set([]);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n }\n }\n\n onBlur(event: Event): void {\n // Only blur if the new focus target is not within the select component or mat-select panel\n const focusEvent = event as FocusEvent;\n const relatedTarget = focusEvent.relatedTarget as HTMLElement;\n \n // Check if focus is moving to mat-select elements\n const isMovingToSelect = relatedTarget && (\n relatedTarget.closest('.mat-mdc-select-panel') !== null ||\n relatedTarget.closest('.people-select-panel') !== null ||\n relatedTarget.closest('.mat-mdc-option') !== null\n );\n \n // Check if mat-select overlay is open (overlays are rendered at body level)\n const selectOverlay = document.querySelector('.cdk-overlay-pane');\n const isSelectOpen = selectOverlay !== null;\n \n // Check if the active element is within the select panel\n const activeElement = document.activeElement as HTMLElement;\n const isActiveInPanel = activeElement && (\n activeElement.closest('.mat-mdc-select-panel') !== null ||\n activeElement.closest('.people-select-panel') !== null\n );\n \n if (!relatedTarget || (!this.el.nativeElement.contains(relatedTarget) && !isMovingToSelect && !isSelectOpen && !isActiveInPanel)) {\n // Small delay to allow select to open before blur\n setTimeout(() => {\n // Double-check select is still not open before blurring\n const stillOpen = document.querySelector('.cdk-overlay-pane');\n const stillActiveInPanel = document.activeElement && (\n (document.activeElement as HTMLElement).closest('.mat-mdc-select-panel') !== null ||\n (document.activeElement as HTMLElement).closest('.people-select-panel') !== null\n );\n if (!stillOpen && !stillActiveInPanel) {\n const value = this.currentValue();\n this.blur.emit(value.length > 0 ? value : null);\n }\n }, 150);\n }\n }\n\n onValueChange(value: string[]): void {\n this.currentValue.set(value);\n this.valueChange.emit(value.length > 0 ? value : null);\n }\n\n onSearchChange(searchValue: string): void {\n this.searchText.set(searchValue || '');\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue().length > 0 ? this.currentValue() : null);\n }\n }\n\n onOpenedChange(opened: boolean): void {\n if (!opened) {\n this.searchText.set('');\n } /* else {\n // Set panel width when opened\n setTimeout(() => {\n const panel = document.querySelector('.people-select-panel') as HTMLElement;\n if (panel) {\n const width = this.columnWidth();\n if (width > 0) {\n panel.style.width = `${width}px`;\n } else if (this.selectContainer) {\n // Fallback to container width if columnWidth not set\n const containerWidth = this.selectContainer.nativeElement.offsetWidth;\n if (containerWidth > 0) {\n panel.style.width = `${containerWidth}px`;\n }\n }\n }\n }, 0);\n } */\n }\n\n isOptionSelected(optionValue: string): boolean {\n return this.currentValue().includes(optionValue);\n }\n\n toggleSelectAll(checked: boolean): void {\n if (checked) {\n // Select all filtered options\n const filteredOpts = this.filteredOptions();\n const allValues = filteredOpts.map(opt => opt.value);\n this.currentValue.set(allValues);\n this.valueChange.emit(allValues.length > 0 ? allValues : null);\n } else {\n // Deselect all filtered options\n const filteredOpts = this.filteredOptions();\n const filteredValues = new Set(filteredOpts.map(opt => opt.value));\n const currentValues = this.currentValue();\n const remainingValues = currentValues.filter(val => !filteredValues.has(val));\n this.currentValue.set(remainingValues);\n this.valueChange.emit(remainingValues.length > 0 ? remainingValues : null);\n }\n }\n\n getInitials(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\n isAssigneeArray(value: any): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string');\n }\n\n selectedMultiSelect(value: string[]): void {\n this.onValueChange(value);\n }\n}\n\n","@if(isActive()) {\n <mat-form-field \n appearance=\"outline\"\n class=\"people-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"people-select-container\">\n <mat-select\n [multiple]=\"true\"\n [disabled]=\"!isEditable()\"\n [value]=\"currentValue()\"\n panelClass=\"people-select-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n <div class=\"people-trigger-content\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">Select people...</span>\n }\n </div>\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n appearance=\"outline\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n <div class=\"select-all-container\" (click)=\"$event.stopPropagation()\">\n <mat-checkbox \n [checked]=\"isAllSelected()\" \n [indeterminate]=\"isIndeterminate()\"\n (change)=\"toggleSelectAll($event.checked)\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <span class=\"select-all-text\">Select All</span>\n </mat-checkbox>\n </div>\n </mat-option>\n\n @for (option of filteredOptions(); track option.value) {\n <mat-option [value]=\"option.value\" \n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\" \n (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <div class=\"option-content\">\n <div class=\"option-avatar\">{{ getInitials(option.label) }}</div>\n <span class=\"option-text\">{{ option.label }}</span>\n </div>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"people-display\" \n [class.people-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"people-drillable\" (click)=\"onDrillableClick($event)\">\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n </span>\n } @else {\n @if (isAssigneeArray(currentValue()) && currentValue().length > 0) {\n @for (assigneeId of displayAvatars(); track assigneeId) {\n <div class=\"avatar-circle\" [style.z-index]=\"currentValue().length - $index\">\n {{ getInitials(getDisplayName(assigneeId)) }}\n </div>\n }\n @if (remainingCount() > 0) {\n <div class=\"avatar-circle count-circle\" [style.z-index]=\"1\">\n +{{ remainingCount() }}\n </div>\n }\n } @else {\n <span class=\"no-people-text\">No people assigned</span>\n }\n }\n </div>\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Field } from '../../model/grid.model';\nimport { EruGridStore } from '../../stores/grid.store';\n\n@Component({\n selector: 'eru-priority',\n templateUrl: './priority.component.html',\n styleUrls: ['./priority.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatOptionModule,\n MatIconModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class PriorityComponent implements OnInit {\n private el = inject(ElementRef);\n \n @ViewChild('selectContainer', { static: false }) selectContainer!: ElementRef<HTMLElement>;\n @ViewChild('matSelect', { static: false }) matSelect: any;\n\n // Inputs\n value = input<string | null>(null);\n config = input<Field | null>(null);\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n fieldSize = input<number>(0);\n eruGridStore = input<EruGridStore | null>(null);\n\n // Outputs\n @Output() valueChange = new EventEmitter<string | null>();\n @Output() blur = new EventEmitter<string | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n\n // Internal state\n currentValue = signal<string | null>(null);\n searchText = signal('');\n\n // Computed properties\n filteredOptions = computed(() => {\n const cfg = this.config();\n if (!cfg) {\n return [];\n }\n const searchText = this.searchText().toLowerCase().trim();\n const optionType = cfg.option_type;\n \n \n const options = cfg.options || [];\n let processedOptions = options\n .map((value: any) => ({ \n value: value.name || value.value, \n label: value.label || value.name || value.value, \n color: value.color\n }));\n \n if (!searchText) {\n return processedOptions;\n }\n \n return processedOptions.filter((option: { value: string; label: string }) =>\n option.label.toLowerCase().includes(searchText) || option.value.toLowerCase().includes(searchText)\n );\n \n\n return [];\n });\n\n priorityIcon = computed(() => {\n const value = this.currentValue();\n if (!value) return null;\n \n const cfg = this.config();\n if (!cfg || !cfg.options) return null;\n \n const option = cfg.options.find((opt: any) => (opt.name || opt.value) === value);\n return option || null;\n });\n\n priorityColor = computed(() => {\n const value = this.currentValue();\n if (!value) return '';\n \n const cfg = this.config();\n if (!cfg || !cfg.options) return '';\n \n const option = cfg.options.find((opt: any) => (opt.name || opt.value) === value);\n return option?.color || '';\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n this.currentValue.set(value);\n });\n\n // Effect to request API data when needed\n effect(() => {\n const cfg = this.config();\n const store = this.eruGridStore();\n \n if (cfg && ((cfg.option_type === 'API' && cfg.api_name) || (cfg.option_type === 'ENTITY_DATA' && cfg.entity_name)) && store) {\n let apiName = cfg.api_name || '';\n if(cfg.option_type === 'ENTITY_DATA') {\n apiName = cfg.entity_name || '';\n }\n const currentRequests = store.getDynamicDataRequest() || [];\n \n if (!currentRequests.includes(apiName)) {\n store.setDynamicDataRequest(apiName);\n }\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (initialValue !== null && initialValue !== undefined) {\n this.currentValue.set(initialValue);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n // Open the select panel when activated\n setTimeout(() => {\n if (this.matSelect) {\n this.matSelect.open();\n }\n }, 0);\n }\n }\n\n onBlur(event: Event): void {\n // Only blur if the new focus target is not within the select component or mat-select panel\n const focusEvent = event as FocusEvent;\n const relatedTarget = focusEvent.relatedTarget as HTMLElement;\n \n // Check if focus is moving to mat-select elements\n const isMovingToSelect = relatedTarget && (\n relatedTarget.closest('.mat-mdc-select-panel') !== null ||\n relatedTarget.closest('.priority-panel') !== null ||\n relatedTarget.closest('.mat-mdc-option') !== null ||\n relatedTarget.closest('.search-option') !== null\n );\n \n // Check if mat-select overlay is open (overlays are rendered at body level)\n const selectOverlay = document.querySelector('.cdk-overlay-pane');\n const isSelectOpen = selectOverlay !== null;\n \n // Check if the active element is within the select panel\n const activeElement = document.activeElement as HTMLElement;\n const isActiveInPanel = activeElement && (\n activeElement.closest('.mat-mdc-select-panel') !== null ||\n activeElement.closest('.priority-panel') !== null ||\n activeElement.closest('.search-option') !== null\n );\n \n if (!relatedTarget || (!this.el.nativeElement.contains(relatedTarget) && !isMovingToSelect && !isSelectOpen && !isActiveInPanel)) {\n // Small delay to allow select to open before blur\n setTimeout(() => {\n // Double-check select is still not open before blurring\n const stillOpen = document.querySelector('.cdk-overlay-pane');\n const stillActiveInPanel = document.activeElement && (\n (document.activeElement as HTMLElement).closest('.mat-mdc-select-panel') !== null ||\n (document.activeElement as HTMLElement).closest('.priority-panel') !== null\n );\n if (!stillOpen && !stillActiveInPanel) {\n const value = this.currentValue();\n this.blur.emit(value);\n }\n }, 150);\n }\n }\n\n onValueChange(value: string | null): void {\n this.currentValue.set(value);\n this.valueChange.emit(value);\n }\n\n onSearchChange(searchValue: string): void {\n this.searchText.set(searchValue || '');\n }\n\n onOpenedChange(opened: boolean): void {\n if (!opened) {\n this.searchText.set('');\n } /* else {\n // Set panel width when opened\n setTimeout(() => {\n const panel = document.querySelector('.priority-panel') as HTMLElement;\n if (panel) {\n const width = this.columnWidth();\n if (width > 0) {\n panel.style.width = `${width}px`;\n } else if (this.selectContainer) {\n // Fallback to container width if columnWidth not set\n const containerWidth = this.selectContainer.nativeElement.offsetWidth;\n if (containerWidth > 0) {\n panel.style.width = `${containerWidth}px`;\n }\n }\n }\n }, 0);\n } */\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue());\n }\n }\n\n hasRequiredValidation(): boolean {\n return this.getProperty('required') === true;\n }\n\n compareWith = (o1: any, o2: any): boolean => {\n if (o1 === o2) return true;\n if (o1 == null || o2 == null) return false;\n // Handle both string and number comparisons\n return String(o1) === String(o2);\n }\n\n getProperty(property: string): any {\n const cfg = this.config();\n if (!cfg) return undefined;\n return (cfg as any)[property];\n }\n\n getOptionColor(option: { value: string; label: string; color?: string }): string {\n return option.color || '#000000';\n }\n\n getSelectedLabel(): string {\n const value = this.currentValue();\n if (!value) return '';\n \n const cfg = this.config();\n if (!cfg || !cfg.options) return String(value);\n \n const option = cfg.options.find((opt: any) => (opt.name || opt.value) === value);\n return option ? (option.label || option.name || option.value) : String(value);\n }\n\n trackByValueAndIndex(index: number, option: { value: string; label: string; color?: string }): string {\n return `${option.value}_${index}`;\n }\n}\n\n","@if(isActive()) {\n <mat-form-field \n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"priority-form-field\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <div #selectContainer class=\"priority-container\">\n <mat-select\n #matSelect\n [placeholder]=\"getProperty('placeholder') || ''\"\n [multiple]=\"false\"\n [disabled]=\"getProperty('disabled') || !isEditable()\"\n [required]=\"hasRequiredValidation()\"\n [value]=\"currentValue()\"\n [compareWith]=\"compareWith\"\n panelClass=\"priority-panel\"\n (selectionChange)=\"onValueChange($event.value)\"\n (blur)=\"onBlur($event)\"\n (openedChange)=\"onOpenedChange($event)\"\n (click)=\"$event.stopPropagation()\">\n \n <mat-select-trigger>\n @if(priorityIcon()) {\n <span class=\"priority-trigger\">\n <mat-icon class=\"priority-icon-trigger\" [style.color]=\"priorityColor()\">flag</mat-icon>\n <span>{{ getSelectedLabel() }}</span>\n </span>\n } @else {\n <span>{{ getSelectedLabel() }}</span>\n }\n </mat-select-trigger>\n \n <mat-option disabled class=\"search-option\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n (mousedown)=\"$event.stopPropagation(); $event.preventDefault()\">\n <mat-form-field\n [appearance]=\"getProperty('appearance') || 'outline'\"\n class=\"search-form-field\">\n <mat-label>Search</mat-label>\n <input\n matInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"filter options...\"\n [value]=\"searchText()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (focus)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n @for (option of filteredOptions(); track trackByValueAndIndex($index, option)) {\n <mat-option [value]=\"option.value\">\n <span class=\"priority-option\">\n <mat-icon class=\"priority-icon\" [style.color]=\"getOptionColor(option)\">flag</mat-icon>\n <span class=\"priority-label\">{{ option.label }}</span>\n </span>\n </mat-option>\n }\n </mat-select>\n </div>\n </mat-form-field>\n} @else {\n <div \n class=\"priority-display\" \n [class.priority-display-editable]=\"isEditable()\"\n (dblclick)=\"onActivate()\">\n @if (isDrillable()) {\n <span class=\"drillable-value\" (click)=\"onDrillableClick($event)\">\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n </span>\n } @else {\n @if(priorityIcon()) {\n <mat-icon class=\"priority-icon-display\" [style.color]=\"priorityColor()\">flag</mat-icon>\n }\n <span>{{currentValue()}}</span>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnInit,\n Output,\n signal,\n computed,\n ViewEncapsulation,\n ViewChild\n} from '@angular/core';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { OverlayModule, CdkConnectedOverlay } from '@angular/cdk/overlay';\nimport { ChangeDetectorRef } from '@angular/core';\n\nexport interface AttachmentConfig {\n disabled?: boolean;\n required?: boolean;\n maxFiles?: number;\n allowedFileTypes?: string[];\n maxFileSize?: number; // in bytes\n columnWidth?: number;\n}\n\n@Component({\n selector: 'eru-attachment',\n templateUrl: './attachment.component.html',\n styleUrls: ['./attachment.component.scss'],\n standalone: true,\n imports: [\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n OverlayModule\n],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class AttachmentComponent implements OnInit {\n private el = inject(ElementRef);\n private cdr = inject(ChangeDetectorRef);\n\n // Inputs\n value = input<string[] | null>(null);\n config = input<AttachmentConfig>({});\n isEditable = input<boolean>(true);\n isActive = input<boolean>(false);\n isDrillable = input<boolean>(false);\n columnWidth = input<number>(0);\n\n // Outputs\n @Output() valueChange = new EventEmitter<string[] | null>();\n @Output() blur = new EventEmitter<string[] | null>();\n @Output() focus = new EventEmitter<void>();\n @Output() drilldownClick = new EventEmitter<string[] | null>();\n @Output() editModeChange = new EventEmitter<boolean>();\n @Output() fileAdded = new EventEmitter<string>();\n @Output() fileDeleted = new EventEmitter<string>();\n @Output() fileViewed = new EventEmitter<string>();\n\n // Internal state\n currentValue = signal<string[]>([]);\n isOverlayOpen = signal(false);\n isDragging = signal(false);\n\n // ViewChild for file input\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n // Computed properties\n hasFiles = computed(() => {\n return this.currentValue().length > 0;\n });\n\n constructor() {\n // Sync signal-based input with internal state\n effect(() => {\n const value = this.value();\n if (Array.isArray(value)) {\n this.currentValue.set(value);\n } else if (value) {\n this.currentValue.set([value]);\n } else {\n this.currentValue.set([]);\n }\n });\n }\n\n ngOnInit() {\n // Initialize value if provided\n const initialValue = this.value();\n if (Array.isArray(initialValue)) {\n this.currentValue.set(initialValue);\n } else if (initialValue) {\n this.currentValue.set([initialValue]);\n } else {\n this.currentValue.set([]);\n }\n }\n\n onActivate(): void {\n if (this.isEditable()) {\n this.editModeChange.emit(true);\n this.focus.emit();\n this.toggleOverlay();\n }\n }\n\n onBlur(): void {\n const value = this.currentValue();\n this.blur.emit(value.length > 0 ? value : null);\n }\n\n onValueChange(value: string[]): void {\n this.currentValue.set(value);\n this.valueChange.emit(value.length > 0 ? value : null);\n }\n\n onDrillableClick(event: Event): void {\n if (this.isDrillable()) {\n event.stopPropagation();\n this.drilldownClick.emit(this.currentValue().length > 0 ? this.currentValue() : null);\n }\n }\n\n toggleOverlay(): void {\n this.isOverlayOpen.set(!this.isOverlayOpen());\n }\n\n closeOverlay(): void {\n // Only close if clicking outside the overlay\n // This method is called by CDK overlay's detach event\n // We'll handle closing manually via click outside detection\n }\n\n onOverlayClick(event: Event): void {\n // Prevent clicks inside the overlay from closing it\n event.stopPropagation();\n }\n\n onOverlayBackdropClick(): void {\n // Close overlay when clicking outside\n this.isOverlayOpen.set(false);\n this.isDragging.set(false);\n this.onBlur();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.isDragging.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragging.set(false);\n }\n\n onFileDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.isDragging.set(false);\n \n if (!e.dataTransfer?.items) return;\n \n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n this.processFile(file);\n }\n }\n }\n }\n\n async onPaste(event: ClipboardEvent): Promise<void> {\n event.preventDefault();\n if (!event.clipboardData?.files.length) {\n return;\n }\n \n Array.from(event.clipboardData.files).forEach(async (file) => {\n await this.processFile(file);\n });\n }\n\n onFileInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files) {\n Array.from(input.files).forEach((file) => {\n this.processFile(file);\n });\n // Reset input\n input.value = '';\n }\n }\n\n onUploadClick(): void {\n if (this.fileInput?.nativeElement) {\n this.fileInput.nativeElement.click();\n }\n }\n\n processFile(file: File): void {\n const cfg = this.config();\n \n // Check file type if restrictions exist\n if (cfg.allowedFileTypes && cfg.allowedFileTypes.length > 0) {\n if (!cfg.allowedFileTypes.includes(file.type)) {\n console.warn(`File type ${file.type} is not allowed`);\n return;\n }\n }\n \n // Check file size if restriction exists\n if (cfg.maxFileSize && file.size > cfg.maxFileSize) {\n console.warn(`File size ${file.size} exceeds maximum ${cfg.maxFileSize}`);\n return;\n }\n \n // Check max files if restriction exists\n if (cfg.maxFiles && this.currentValue().length >= cfg.maxFiles) {\n console.warn(`Maximum number of files (${cfg.maxFiles}) reached`);\n return;\n }\n \n const newFileName = file.name.replace(/_/g, '');\n const reader = new FileReader();\n \n reader.onload = () => {\n const base64String = reader.result as string;\n const base64Content = base64String.split(',')[1];\n \n // Process the file (you can emit an event or call a service here)\n this.uploadFile(base64Content, newFileName);\n \n // Add file to current value\n const currentFiles = this.currentValue();\n if (!currentFiles.includes(newFileName)) {\n const updatedFiles = [...currentFiles, newFileName];\n this.currentValue.set(updatedFiles);\n this.valueChange.emit(updatedFiles);\n // Emit file added event\n this.fileAdded.emit(newFileName);\n this.cdr.markForCheck();\n }\n };\n \n reader.readAsDataURL(file);\n }\n\n uploadFile(base64String: string, fileName: string): void {\n // This can be extended to call an upload service\n // For now, just emit the file data\n console.log('Upload file:', fileName);\n }\n\n viewFile(file: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Emit file viewed event\n this.fileViewed.emit(file);\n }\n\n deleteFile(file: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n const currentFiles = this.currentValue();\n const updatedFiles = currentFiles.filter(f => f !== file);\n this.currentValue.set(updatedFiles);\n this.valueChange.emit(updatedFiles.length > 0 ? updatedFiles : null);\n // Emit file deleted event\n this.fileDeleted.emit(file);\n this.cdr.markForCheck();\n }\n\n trackByFile(index: number, file: string): string {\n return file;\n }\n\n getFileName(file: string): string {\n // Extract filename from path or return as is\n if (file.includes('_')) {\n const parts = file.split('_');\n return parts[parts.length - 1] || file;\n }\n return file;\n }\n}\n\n","<div class=\"attachment-overlay-container\">\n <div \n class=\"attachment-cell-wrapper\"\n cdkOverlayOrigin \n #attachmentTrigger=\"cdkOverlayOrigin\"\n [class.attachment-display-editable]=\"isEditable() && !isActive()\"\n (dblclick)=\"onActivate()\">\n @if(hasFiles()) {\n <div class=\"cell-attachment-container\">\n @if (isDrillable() && !isActive()) {\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 (isDrillable() && !isActive()) {\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 </div>\n\n <ng-template \n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"attachmentTrigger\"\n [cdkConnectedOverlayOpen]=\"isOverlayOpen() && isActive()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'attachment-backdrop'\"\n (backdropClick)=\"onOverlayBackdropClick()\"\n (detach)=\"closeOverlay()\">\n <div \n class=\"attachment-menu-overlay\" \n [style.width.px]=\"columnWidth() || config().columnWidth || 300\" \n [style.min-width.px]=\"300\"\n (click)=\"onOverlayClick($event)\">\n <div class=\"attachment-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header Section -->\n <div class=\"attachment-header\">\n <span class=\"attachment-title\">Add or Drag files</span>\n <button \n mat-flat-button \n (click)=\"onUploadClick(); $event.stopPropagation()\" \n class=\"attachment-upload-btn\"\n [disabled]=\"config().disabled || !isEditable()\">\n Upload\n </button>\n </div>\n \n <!-- Drop zone -->\n <div \n class=\"attachment-drop-zone\" \n (drop)=\"onFileDrop($event)\" \n (dragover)=\"onDragOver($event)\" \n (dragleave)=\"onDragLeave($event)\"\n (paste)=\"onPaste($event)\"\n (click)=\"onUploadClick(); $event.stopPropagation()\"\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 \n #fileInput\n type=\"file\" \n multiple \n (change)=\"onFileInputChange($event)\" \n style=\"display: none;\">\n \n <!-- File list -->\n @if (hasFiles()) {\n <div class=\"attachment-file-list\">\n @for (file of currentValue(); track trackByFile($index, file)) {\n <div class=\"attachment-file-item\">\n <div class=\"file-info\">\n <span class=\"file-icon\">📎</span>\n <span class=\"file-name\">{{ getFileName(file) }}</span>\n </div>\n <div class=\"file-actions\">\n <button \n class=\"action-btn\" \n (click)=\"viewFile(file, $event)\" \n title=\"View\"\n type=\"button\">\n 👁️\n </button>\n <button \n class=\"action-btn\" \n (click)=\"deleteFile(file, $event)\" \n title=\"Delete\"\n type=\"button\">\n 🗑️\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </ng-template>\n</div>\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';\n\nimport {FormsModule} from '@angular/forms';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {MatSliderModule} from '@angular/material/slider';\nimport {MatIconModule} from '@angular/material/icon';\nimport { DatePipe } from '@angular/common';\nimport {MatDatepickerModule} 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 { OverlayMenuService } from '../../services/overlay-menu.service';\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport { MATERIAL_MODULES ,MATERIAL_PROVIDERS} from '../../providers/material.providers';\nimport { CurrencyComponent } from '../currency/currency.component';\nimport { NumberComponent } from '../number/number.component';\nimport { TextboxComponent } from '../textbox/textbox.component';\nimport { EmailComponent } from '../email/email.component';\nimport { TextareaComponent } from '../textarea/textarea.component';\nimport { WebsiteComponent } from '../website/website.component';\nimport { LocationComponent } from '../location/location.component';\nimport { CheckboxComponent } from '../checkbox/checkbox.component';\nimport { DateComponent } from '../date/date.component';\nimport { DatetimeComponent } from '../datetime/datetime.component';\nimport { DurationComponent } from '../duration/duration.component';\nimport { PhoneComponent } from '../phone/phone.component';\nimport { ProgressComponent } from '../progress/progress.component';\nimport { RatingComponent, RatingConfig } from '../rating/rating.component';\nimport { SelectComponent } from '../select/select.component';\nimport { StatusComponent } from '../status/status.component';\nimport { TagComponent } from '../tag/tag.component';\nimport { PeopleComponent } from '../people/people.component';\nimport { PriorityComponent } from '../priority/priority.component';\nimport { AttachmentComponent, AttachmentConfig } from '../attachment/attachment.component';\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 ...MATERIAL_MODULES,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatSliderModule,\n MatIconModule,\n FormsModule,\n OverlayModule,\n MatDatepickerModule,\n MatNativeDateModule,\n CurrencyComponent,\n NumberComponent,\n TextboxComponent,\n EmailComponent,\n TextareaComponent,\n WebsiteComponent,\n LocationComponent,\n CheckboxComponent,\n DateComponent,\n DatetimeComponent,\n DurationComponent,\n PhoneComponent,\n ProgressComponent,\n RatingComponent,\n SelectComponent,\n StatusComponent,\n TagComponent,\n PeopleComponent,\n PriorityComponent,\n AttachmentComponent\n],\n providers: [MatDatepickerModule,\n MatNativeDateModule,\n DatePipe,\n {\n provide: CELL_VALIDATORS,\n useValue: cellValidators\n },\n ...MATERIAL_PROVIDERS \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 // Currency component configuration\n\n // Event handlers for currency component\n onCurrencyValueChange(value: string | number | null): void {\n this.currentValue.set(value);\n }\n\n onCurrencyBlur(value: string | number | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onCurrencyEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onCurrencyDrilldown(value: string | number | null): void {\n this.handleDrilldown(value);\n }\n\n // Number component configuration and handlers\n\n onNumberValueChange(value: string | number | null): void {\n this.currentValue.set(value);\n }\n\n onNumberBlurHandler(value: string | number | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onNumberEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onNumberDrilldown(value: string | number | null): void {\n this.handleDrilldown(value);\n }\n\n // Textbox component handlers\n onTextboxValueChange(value: string | null): void {\n this.currentValue.set(value);\n // Validate and clear error if value becomes valid (without deactivating the cell)\n this.validateField(value, false);\n }\n\n onTextboxBlur(value: string | null): void {\n this.currentValue.set(value);\n // Only deactivate if validation passes\n const config = this.columnCellConfiguration();\n if (config) {\n const validator = cellValidators[config.datatype as keyof typeof cellValidators];\n if (validator) {\n const result = validator(value, config);\n if (result.isValid) {\n this.eruGridStore().setActiveCell(null);\n }\n // If validation fails, keep the cell active\n }\n } else {\n // No config, safe to deactivate\n this.eruGridStore().setActiveCell(null);\n }\n }\n\n onTextboxEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onTextboxDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Email component handlers\n onEmailValueChange(value: string | null): void {\n this.currentValue.set(value);\n // Validate and clear error if value becomes valid (without deactivating the cell)\n this.validateField(value, false);\n }\n\n onEmailBlurHandler(value: string | null): void {\n this.currentValue.set(value);\n // Only deactivate if validation passes\n const config = this.columnCellConfiguration();\n if (config) {\n const validator = cellValidators[config.datatype as keyof typeof cellValidators];\n if (validator) {\n const result = validator(value, config);\n if (result.isValid) {\n this.eruGridStore().setActiveCell(null);\n }\n // If validation fails, keep the cell active\n }\n } else {\n // No config, safe to deactivate\n this.eruGridStore().setActiveCell(null);\n }\n }\n\n onEmailEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onEmailDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Textarea component handlers\n onTextareaValueChange(value: string | null): void {\n this.currentValue.set(value);\n // Validate and clear error if value becomes valid (without deactivating the cell)\n this.validateField(value, false);\n }\n\n onTextareaBlur(value: string | null): void {\n this.currentValue.set(value);\n // Only deactivate if validation passes\n const config = this.columnCellConfiguration();\n if (config) {\n const validator = cellValidators[config.datatype as keyof typeof cellValidators];\n if (validator) {\n const result = validator(value, config);\n if (result.isValid) {\n this.eruGridStore().setActiveCell(null);\n }\n // If validation fails, keep the cell active\n }\n } else {\n // No config, safe to deactivate\n this.eruGridStore().setActiveCell(null);\n }\n }\n\n onTextareaEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onTextareaDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Website component handlers\n onWebsiteValueChange(value: string | null): void {\n this.currentValue.set(value);\n // Validate and clear error if value becomes valid (without deactivating the cell)\n this.validateField(value, false);\n }\n\n onWebsiteBlur(value: string | null): void {\n this.currentValue.set(value);\n // Only deactivate if validation passes\n const config = this.columnCellConfiguration();\n if (config) {\n const validator = cellValidators[config.datatype as keyof typeof cellValidators];\n if (validator) {\n const result = validator(value, config);\n if (result.isValid) {\n this.eruGridStore().setActiveCell(null);\n }\n // If validation fails, keep the cell active\n }\n } else {\n // No config, safe to deactivate\n this.eruGridStore().setActiveCell(null);\n }\n }\n\n onWebsiteEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onWebsiteDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Location component handlers\n onLocationValueChange(value: string | null): void {\n this.currentValue.set(value);\n // Validate and clear error if value becomes valid (without deactivating the cell)\n this.validateField(value, false);\n }\n\n onLocationBlurHandler(value: string | null): void {\n this.currentValue.set(value);\n // Only deactivate if validation passes\n const config = this.columnCellConfiguration();\n if (config) {\n const validator = cellValidators[config.datatype as keyof typeof cellValidators];\n if (validator) {\n const result = validator(value, config);\n if (result.isValid) {\n this.eruGridStore().setActiveCell(null);\n }\n // If validation fails, keep the cell active\n }\n } else {\n // No config, safe to deactivate\n this.eruGridStore().setActiveCell(null);\n }\n }\n\n onLocationEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onLocationDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Checkbox component handlers\n onCheckboxValueChange(value: boolean): void {\n this.currentValue.set(value);\n }\n\n onCheckboxBlur(value: boolean): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onCheckboxEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onCheckboxDrilldown(value: boolean): void {\n this.handleDrilldown(value);\n }\n\n // Date component handlers\n onDateValueChange(value: string | null): void {\n this.currentValue.set(value);\n }\n\n onDateEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onDateDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Datetime component handlers\n onDatetimeValueChange(value: string | null): void {\n this.currentValue.set(value);\n }\n\n onDatetimeEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onDatetimeDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Duration component handlers\n onDurationValueChange(value: string | number | null): void {\n this.currentValue.set(value);\n }\n\n onDurationBlur(value: string | number | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onDurationEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onDurationDrilldown(value: string | number | null): void {\n this.handleDrilldown(value);\n }\n\n // Phone component handlers\n onPhoneValueChange(value: string | null): void {\n this.currentValue.set(value);\n }\n\n onPhoneBlur(value: string | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onPhoneEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onPhoneDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Select component handlers\n getSelectConfig = computed<Field | null>(() => {\n const config = this.columnCellConfiguration();\n return config;\n });\n\n onSelectValueChange(value: any | any[] | null): void {\n this.currentValue.set(value);\n }\n\n onSelectBlur(value: any | any[] | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onSelectEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onSelectDrilldown(value: any | any[] | null): void {\n this.handleDrilldown(value);\n }\n\n // Status component handlers\n getStatusConfig = computed<Field | null>(() => {\n const config = this.columnCellConfiguration();\n if (!config || config.datatype !== 'status') {\n return null;\n }\n\n // Combine open and close status\n const combinedStatus = [\n ...(config.open_status || []),\n ...(config.close_status || [])\n ];\n\n // Transform to Field format with options array\n // Each option should have 'name' and 'color' properties\n const options = combinedStatus.map((status: any) => ({\n name: status.name,\n color: status.color || '',\n df: status.df || false\n }));\n\n // Return Field object with combined options\n return {\n ...config,\n options: options\n } as Field;\n });\n\n onStatusValueChange(value: string | null): void {\n this.currentValue.set(value);\n }\n\n onStatusBlur(value: string | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onStatusEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onStatusDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Tag component handlers\n getTagConfig = computed<Field | null>(() => {\n const config = this.columnCellConfiguration();\n if (!config || config.datatype !== 'tag') {\n return null;\n }\n return config;\n });\n\n onTagValueChange(value: string[] | null): void {\n this.currentValue.set(value);\n }\n\n onTagBlur(value: string[] | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onTagEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onTagDrilldown(value: string[] | null): void {\n this.handleDrilldown(value);\n }\n\n // People component handlers\n getPeopleConfig = computed<Field | null>(() => {\n const config = this.columnCellConfiguration();\n return config;\n });\n\n onPeopleValueChange(value: string[] | null): void {\n this.currentValue.set(value);\n }\n\n onPeopleBlur(value: string[] | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onPeopleEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onPeopleDrilldown(value: string[] | null): void {\n this.handleDrilldown(value);\n }\n\n // Priority component handlers\n getPriorityConfig = computed<Field | null>(() => {\n const config = this.columnCellConfiguration();\n if (!config || config.datatype !== 'priority') {\n return null;\n }\n return config;\n });\n\n onPriorityValueChange(value: string | null): void {\n this.currentValue.set(value);\n }\n\n onPriorityBlur(value: string | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onPriorityEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onPriorityDrilldown(value: string | null): void {\n this.handleDrilldown(value);\n }\n\n // Attachment component handlers\n getAttachmentConfig = computed<AttachmentConfig>(() => {\n const config = this.columnCellConfiguration();\n if (!config || config.datatype !== 'attachment') {\n return {};\n }\n\n return {\n disabled: config?.disabled || false,\n required: config?.mandatory || false,\n maxFiles: config?.max_files,\n allowedFileTypes: config?.allowed_file_types,\n maxFileSize: config?.max_file_size,\n columnWidth: config?.column_width || this.currentColumnWidth()\n };\n });\n\n onAttachmentValueChange(value: string[] | null): void {\n this.currentValue.set(value);\n }\n\n onAttachmentBlur(value: string[] | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onAttachmentEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onAttachmentDrilldown(value: string[] | null): void {\n this.handleDrilldown(value);\n }\n\n // Progress component handlers\n onProgressValueChange(value: number): void {\n this.currentValue.set(value);\n }\n\n onProgressBlur(value: number | null): void {\n this.currentValue.set(value);\n this.eruGridStore().setActiveCell(null);\n }\n\n onProgressFocus(): void {\n // Focus handler if needed\n }\n\n onProgressEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n onProgressDrilldown(value: number | null): void {\n this.handleDrilldown(value);\n }\n\n // Rating component handlers\n getRatingConfig = computed<RatingConfig>(() => {\n const config = this.columnCellConfiguration();\n return {\n startValue: config?.start_value || 1,\n endValue: config?.end_value || 5,\n emojiValue: config?.emoji_value || 'star'\n };\n });\n\n onRatingValueChange(value: number): void {\n this.currentValue.set(value);\n }\n\n onRatingEditModeChange(isActive: boolean): void {\n if (isActive && this.mode() === 'table') {\n this.eruGridStore().setActiveCell(this.el.nativeElement);\n }\n }\n\n // Common drilldown handler\n private handleDrilldown(value: any): void {\n const idSplit = this.id().toString().replace('pivot_', '').replace('_default|','');\n const [rowId, ...columnName] = idSplit.split('_');\n const columnValues = columnName.join('_');\n const columnValuesSplit = columnValues.split('|');\n const colName = columnValuesSplit[columnValuesSplit.length - 1];\n \n this.eruGridStore().setDrilldown({\n frozenGrandTotalCell: this.frozenGrandTotalCell(),\n columnName: colName,\n rowId: rowId,\n columnValue: value\n }, columnValues);\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, shouldDeactivate: boolean = true): 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 && shouldDeactivate) {\n this.eruGridStore().setActiveCell(null);\n }\n }\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 const target = event.target as HTMLElement;\n \n // Don't deactivate if clicking on any Material overlay (datepicker, select, menu, etc.)\n const isMaterialOverlay = target.closest('.cdk-overlay-pane, .mat-datepicker-popup, .mat-calendar, .mat-select-panel, .mat-menu-panel');\n if (isMaterialOverlay) {\n return;\n }\n \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(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(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(this.currentValue());\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 \n // Get all options from config for single select dropdown\n getSingleSelectOptions() {\n const config = this.columnCellConfiguration();\n if (!config || !config.options || this.columnDatatype() !== 'dropdown_single_select') {\n return [];\n }\n return config.options || [];\n }\n\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 const searchText = this.optionSearchText().toLowerCase().trim();\n \n // If no search text, return all options\n if (!searchText) {\n return selectConfig.options || [];\n }\n\n // Filter by label (or name if label doesn't exist)\n return selectConfig.options.filter((c:any) =>\n (c.label?.toLowerCase().includes(searchText) || c.name?.toLowerCase().includes(searchText))\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 console.log('toggleOverlayMenu', this.getCellId()); \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 <eru-textbox\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onTextboxValueChange($event)\"\n (blur)=\"onTextboxBlur($event)\"\n (editModeChange)=\"onTextboxEditModeChange($event)\"\n (drilldownClick)=\"onTextboxDrilldown($event)\">\n </eru-textbox>\n }\n @case ('currency') {\n <eru-currency \n [value]=\"currentValue()\" \n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\"\n (valueChange)=\"onCurrencyValueChange($event)\"\n (blur)=\"onCurrencyBlur($event)\"\n (editModeChange)=\"onCurrencyEditModeChange($event)\"\n (drilldownClick)=\"onCurrencyDrilldown($event)\">\n </eru-currency>\n }\n @case ('number') {\n <eru-number\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [replaceZeroValue]=\"replaceZeroValue\"\n (valueChange)=\"onNumberValueChange($event)\"\n (blur)=\"onNumberBlurHandler($event)\"\n (editModeChange)=\"onNumberEditModeChange($event)\"\n (drilldownClick)=\"onNumberDrilldown($event)\">\n </eru-number>\n }\n @case ('location') {\n <eru-location\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onLocationValueChange($event)\"\n (blur)=\"onLocationBlurHandler($event)\"\n (editModeChange)=\"onLocationEditModeChange($event)\"\n (drilldownClick)=\"onLocationDrilldown($event)\">\n </eru-location>\n }\n @case ('email') {\n <eru-email\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onEmailValueChange($event)\"\n (blur)=\"onEmailBlurHandler($event)\"\n (editModeChange)=\"onEmailEditModeChange($event)\"\n (drilldownClick)=\"onEmailDrilldown($event)\">\n </eru-email>\n }\n @case ('textarea') {\n <eru-textarea\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onTextareaValueChange($event)\"\n (blur)=\"onTextareaBlur($event)\"\n (editModeChange)=\"onTextareaEditModeChange($event)\"\n (drilldownClick)=\"onTextareaDrilldown($event)\">\n </eru-textarea>\n }\n @case ('website') {\n <eru-website\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n [externalError]=\"error()\"\n (valueChange)=\"onWebsiteValueChange($event)\"\n (blur)=\"onWebsiteBlur($event)\"\n (editModeChange)=\"onWebsiteEditModeChange($event)\"\n (drilldownClick)=\"onWebsiteDrilldown($event)\">\n </eru-website>\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)\" cdkOverlayOrigin #singleSelectTrigger=\"cdkOverlayOrigin\"\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 <eru-checkbox\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onCheckboxValueChange($event)\"\n (blur)=\"onCheckboxBlur($event)\"\n (editModeChange)=\"onCheckboxEditModeChange($event)\"\n (drilldownClick)=\"onCheckboxDrilldown($event)\">\n </eru-checkbox>\n }\n\n @case ('people') {\n <eru-people\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onPeopleValueChange($event)\"\n (blur)=\"onPeopleBlur($event)\"\n (editModeChange)=\"onPeopleEditModeChange($event)\"\n (drilldownClick)=\"onPeopleDrilldown($event)\">\n </eru-people>\n }\n\n\n @case ('date') {\n <eru-date\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDateValueChange($event)\"\n (editModeChange)=\"onDateEditModeChange($event)\"\n (drilldownClick)=\"onDateDrilldown($event)\">\n </eru-date>\n }\n\n @case ('datetime') {\n <eru-datetime\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDatetimeValueChange($event)\"\n (editModeChange)=\"onDatetimeEditModeChange($event)\"\n (drilldownClick)=\"onDatetimeDrilldown($event)\">\n </eru-datetime>\n }\n\n @case ('duration') {\n <eru-duration\n [value]=\"currentValue()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onDurationValueChange($event)\"\n (blur)=\"onDurationBlur($event)\"\n (editModeChange)=\"onDurationEditModeChange($event)\"\n (drilldownClick)=\"onDurationDrilldown($event)\">\n </eru-duration>\n }\n\n\n @case ('priority') {\n <eru-priority\n [value]=\"currentValue()\"\n [config]=\"getPriorityConfig()\"\n [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onPriorityValueChange($event)\"\n (blur)=\"onPriorityBlur($event)\"\n (editModeChange)=\"onPriorityEditModeChange($event)\"\n (drilldownClick)=\"onPriorityDrilldown($event)\">\n </eru-priority>\n }\n @case ('progress') {\n <eru-progress\n [value]=\"currentValue()\"\n [config]=\"columnCellConfiguration()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onProgressValueChange($event)\"\n (blur)=\"onProgressBlur($event)\"\n (focus)=\"onProgressFocus()\"\n (editModeChange)=\"onProgressEditModeChange($event)\"\n (drilldownClick)=\"onProgressDrilldown($event)\">\n </eru-progress>\n }\n\n @case ('rating') {\n <eru-rating\n [value]=\"currentValue()\"\n [config]=\"getRatingConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n (valueChange)=\"onRatingValueChange($event)\"\n (editModeChange)=\"onRatingEditModeChange($event)\">\n </eru-rating>\n }\n\n @case ('status') {\n <eru-status\n [value]=\"currentValue()\"\n [config]=\"getStatusConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onStatusValueChange($event)\"\n (blur)=\"onStatusBlur($event)\"\n (editModeChange)=\"onStatusEditModeChange($event)\"\n (drilldownClick)=\"onStatusDrilldown($event)\">\n </eru-status>\n }\n\n @case ('tag') {\n <eru-tag\n [value]=\"currentValue()\"\n [config]=\"getTagConfig()\"\n [eruGridStore]=\"eruGridStore()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n (valueChange)=\"onTagValueChange($event)\"\n (blur)=\"onTagBlur($event)\"\n (editModeChange)=\"onTagEditModeChange($event)\"\n (drilldownClick)=\"onTagDrilldown($event)\">\n </eru-tag>\n }\n\n @case ('phone') {\n <eru-phone\n [value]=\"currentValue()\"\n [defaultCountry]=\"columnCellConfiguration()?.default_country || 'US'\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n (valueChange)=\"onPhoneValueChange($event)\"\n (blur)=\"onPhoneBlur($event)\"\n (editModeChange)=\"onPhoneEditModeChange($event)\"\n (drilldownClick)=\"onPhoneDrilldown($event)\">\n </eru-phone>\n }\n\n @case ('dropdown_single_select') {\n <eru-select\n [value]=\"currentValue()\"\n [config]=\"getSelectConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [multiple]=\"false\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onSelectValueChange($event)\"\n (blur)=\"onSelectBlur($event)\"\n (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n }\n @case ('dropdown_multi_select') {\n <eru-select\n [value]=\"currentValue()\"\n [config]=\"getSelectConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [multiple]=\"true\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n [fieldSize]=\"fieldSize()\"\n [eruGridStore]=\"eruGridStore()\"\n (valueChange)=\"onSelectValueChange($event)\"\n (blur)=\"onSelectBlur($event)\"\n (editModeChange)=\"onSelectEditModeChange($event)\"\n (drilldownClick)=\"onSelectDrilldown($event)\">\n </eru-select>\n } \n\n @case ('attachment') {\n <eru-attachment\n [value]=\"currentValue()\"\n [config]=\"getAttachmentConfig()\"\n [isEditable]=\"isEditable() && mode() === 'table'\"\n [isActive]=\"isActive()\"\n [isDrillable]=\"drillable()\"\n [columnWidth]=\"currentColumnWidth()\"\n (valueChange)=\"onAttachmentValueChange($event)\"\n (blur)=\"onAttachmentBlur($event)\"\n (editModeChange)=\"onAttachmentEditModeChange($event)\"\n (drilldownClick)=\"onAttachmentDrilldown($event)\">\n </eru-attachment>\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\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 (ngModelChange)=\"optionSearchText.set($event)\">\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 @for (option of filteredOptions(); track option.value || option.name) {\n <li [cdkOption]=\"option.value || option.name\" class=\"listbox-option notext-overflow\">\n {{option.label || option.name}}\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 <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","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 DOM index of the column (includes checkbox and action columns)\n const domColumnIndex = Array.from(this.columnElement.parentElement!.children).indexOf(this.columnElement);\n\n // Find all cells in this column (header and data cells) using DOM index\n const tableCells = Array.from(this.table.querySelectorAll(`th:nth-child(${domColumnIndex + 1}), td:nth-child(${domColumnIndex + 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 // Also update colgroup if it exists (important for pivot mode where colgroup has !important styles)\n // Note: colgroup only contains data columns, not checkbox or action columns\n // So we need to calculate the data column index by subtracting checkbox and action columns\n const colgroup = this.table.querySelector('colgroup');\n if (colgroup && this.columnConfig) {\n const colElements = Array.from(colgroup.querySelectorAll('col'));\n \n // Calculate data column index using grid configuration\n // Get configuration from store to check if checkbox and action columns exist\n const gridConfig = this.gridConfig || this.eruGridStore.gridConfiguration();\n const hasCheckboxColumn = gridConfig?.config?.allowSelection ?? false;\n const hasActionColumnBefore = (gridConfig?.config?.actionColumn ?? false) && \n (gridConfig?.config?.actionColumnPosition === 'before');\n \n // Calculate data column index: subtract checkbox (1) and action before (1) from DOM index\n let dataColumnIndex = domColumnIndex;\n if (hasCheckboxColumn) dataColumnIndex--;\n if (hasActionColumnBefore) dataColumnIndex--;\n \n // Match col element by data column index (not DOM index)\n if (dataColumnIndex >= 0 && colElements.length > dataColumnIndex && colElements[dataColumnIndex]) {\n const colElement = colElements[dataColumnIndex];\n this.renderer.setStyle(colElement, \"width\", `${newWidth}px !important`);\n this.renderer.setStyle(colElement, \"min-width\", `${newWidth}px !important`);\n this.renderer.setStyle(colElement, \"max-width\", `${newWidth}px !important`);\n // Update CSS variable if it exists\n this.renderer.setStyle(colElement, \"--col-width\", `${newWidth}px`);\n }\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, AfterViewInit, OnDestroy } from '@angular/core';\nimport { EruGridStore } from '../stores/grid.store';\n\n@Directive({\n selector: '[columnDraggable]',\n standalone: true\n})\nexport class ColumnDragDirective implements OnInit, AfterViewInit, OnDestroy {\n @Input('columnDraggable') columnIndex: number | null = null;\n \n private dragEl!: HTMLElement;\n private dragHandle!: HTMLElement;\n private isDragging = false;\n private mouseDownListener?: (e: Event) => void;\n private mouseUpListener?: () => void;\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\n ngAfterViewInit() {\n // Find the drag handle element - use setTimeout to ensure it's rendered\n setTimeout(() => {\n this.dragHandle = this.dragEl.querySelector('.column-drag-handle') as HTMLElement;\n \n if (this.columnIndex !== null && this.columnIndex !== undefined) {\n // Set draggable attribute on the entire column header\n this.renderer.setAttribute(this.dragEl, 'draggable', 'true');\n \n if (this.dragHandle) {\n // Add mousedown listener to the handle to track drag initiation\n this.mouseDownListener = (e: Event) => {\n const mouseEvent = e as MouseEvent;\n // Don't prevent default - let the browser handle drag naturally\n // Just mark that we're starting a drag from the handle\n this.isDragging = true;\n console.log('Drag handle mousedown, isDragging set to true', this.columnIndex);\n // Allow event to propagate so drag can start\n };\n this.dragHandle.addEventListener('mousedown', this.mouseDownListener, true); // Use capture phase\n \n // Add pointer-events style to ensure handle is clickable\n this.renderer.setStyle(this.dragHandle, 'pointer-events', 'auto');\n }\n \n // Add mouseup listener to document to reset dragging state\n this.mouseUpListener = () => {\n // Reset after a delay to allow dragend to fire first\n setTimeout(() => {\n this.isDragging = false;\n }, 50);\n };\n document.addEventListener('mouseup', this.mouseUpListener);\n } else if (this.columnIndex === null || this.columnIndex === undefined) {\n // If columnIndex is null, remove draggable attribute\n this.renderer.removeAttribute(this.dragEl, 'draggable');\n }\n }, 0);\n }\n\n ngOnDestroy() {\n // Clean up event listeners\n if (this.dragHandle && this.mouseDownListener) {\n this.dragHandle.removeEventListener('mousedown', this.mouseDownListener);\n }\n if (this.mouseUpListener) {\n document.removeEventListener('mouseup', this.mouseUpListener);\n }\n }\n\n @HostListener('dragstart', ['$event'])\n onDragStart(event: DragEvent) {\n console.log('dragstart triggered', { isDragging: this.isDragging, columnIndex: this.columnIndex });\n \n // Only allow drag if it was initiated by the handle OR if we have a valid columnIndex\n // Check if event originated from drag handle\n const target = event.target as HTMLElement;\n const isFromHandle = target.classList.contains('column-drag-handle') || \n target.closest('.column-drag-handle') !== null;\n \n // Allow drag if initiated from handle or if isDragging is true\n if (!isFromHandle && !this.isDragging) {\n console.log('Drag prevented: not from handle and isDragging is false');\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 // Set isDragging to true when drag starts (fallback)\n if (!this.isDragging) {\n this.isDragging = true;\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 { NgZone ,AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy, OnInit, ViewChild, ViewChildren, QueryList, computed, signal, ViewEncapsulation, effect, Injectable, Inject, forwardRef } from '@angular/core';\nimport { DataCellComponent } from './components/data-cell/data-cell.component';\nimport { CdkVirtualScrollViewport, ScrollingModule, FixedSizeVirtualScrollStrategy, VIRTUAL_SCROLL_STRATEGY} from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatCommonModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\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';\nimport { MATERIAL_PROVIDERS, MATERIAL_MODULES } from './providers/material.providers';\nimport { TitleStrategy } from '@angular/router';\n\n/**\n * Custom virtual scroll strategy optimized for catching every scroll event\n * Uses smaller buffer sizes (minBufferPx: 50, maxBufferPx: 150) to ensure\n * more frequent scroll detection, especially important when you have 4 grids\n * and need to catch every scroll event.\n * \n * The itemSize is set dynamically via the viewport's [itemSize] input binding\n * which uses averageGroupHeight(). The strategy's itemSize parameter here is\n * just a fallback default.\n */\nexport class CustomVirtualScrollStrategy extends FixedSizeVirtualScrollStrategy {\n constructor() {\n // Parameters: itemSize, minBufferPx, maxBufferPx\n // - itemSize: 200 (fallback, will be overridden by viewport [itemSize] binding)\n // - minBufferPx: 50 (smaller buffer = more frequent scroll events detected)\n // - maxBufferPx: 150 (smaller buffer = catches scrolls more often)\n // These smaller buffers ensure we catch every scroll event for all 4 grids\n super(200, 50, 150);\n }\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 ...MATERIAL_PROVIDERS\n ],\n imports: [\n DataCellComponent,\n ScrollingModule,\n CommonModule,\n ...MATERIAL_MODULES,\n MatTooltipModule,\n MatIconModule,\n MatCheckboxModule,\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 @ViewChildren(CdkVirtualScrollViewport) allViewports?: QueryList<CdkVirtualScrollViewport>;\n @ViewChild('rowContainer') rowContainer?: ElementRef;\n @ViewChild('headerScroller', { read: ElementRef })\n headerScroller!: ElementRef<HTMLDivElement>;\n @ViewChildren('headerScroller') headerScrollers?: QueryList<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') viewport!: CdkVirtualScrollViewport;\n @ViewChild('groupsViewport') groupsViewport!: CdkVirtualScrollViewport;\n previousOffset = signal<number>(0);\n groups = computed(() => this.gridStore.groups());\n ghostRows = signal<number>(5);\n // Computed properties using the new GridStore\n groupedRows = computed(() => this.createGroupedRows());\n columns = computed(() => this.gridStore.columns());\n selectedRowIds = this.gridStore.selectedRowIds;\n totalRowCount = computed(() => {\n const groups = this.groups();\n return groups.reduce((sum, group) => sum + group.totalRowCount, 0);\n });\n // Computed signal for average group height - recalculates when groups or group rows change\n averageGroupHeight = computed(() => {\n const groups = this.groups();\n if (groups.length === 0) {\n // Fallback to min height if no groups\n return Math.max(200, this.getMinHeightPx());\n }\n \n // Calculate average height considering all groups\n const totalHeight = groups.reduce((sum, group) => sum + this.getTotalGroupHeight(group), 0);\n const averageHeight = Math.ceil(totalHeight / groups.length);\n \n // Ensure it's at least the minimum height, but also reasonable\n // CDK virtual scroll works best with a reasonable average\n return Math.max(averageHeight, this.getMinHeightPx() + 100);\n });\n \n // Track current scroll index for pivot mode\n currentPivotScrollIndex = signal(0);\n firstDataRowIndex = signal(0);\n private ngZone = inject(NgZone);\n \n // Computed signal for group content heights - only recalculates when groupRows change\n groupContentHeightsMap = computed(() => {\n console.log(\"groupContentHeightsMap called\");\n const groups = this.groups();\n const groupRows = this.gridStore.groupRows();\n const minHeight = this.getMinHeightPx();\n const ROW_HEIGHT = 30;\n const MIN_CONTENT_HEIGHT = 50;\n \n const heightsMap = new Map<string, number>();\n \n groups.forEach(group => {\n const rows = groupRows.get(group.id);\n const rowCount = rows?.length || 0;\n const rowsHeight = rowCount * ROW_HEIGHT;\n \n let height: number;\n if (rowCount === 0) {\n height = Math.min(minHeight / 2, 200);\n } else if (rowCount < 50) {\n height = rowsHeight;\n } else {\n // For groups with 50+ rows: allow table to grow up to maximum allowed height (minHeight)\n height = Math.min(rowsHeight, 500) //Math.min(rowsHeight, minHeight);\n }\n \n heightsMap.set(group.id, height);\n });\n \n return heightsMap;\n });\n \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.enableColumnGrandTotal() && 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 grandTotalPositionColumn = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.grandTotalPositionColumn ?? 'after';\n });\n\n enableColumnGrandTotal = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.enableColumnGrandTotal ?? false;\n });\n \n // Subtotal configuration computed properties\n enableColumnSubtotals = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.enableColumnSubtotals ?? false;\n });\n \n subtotalPositionColumn = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.subtotalPositionColumn ?? 'after';\n });\n \n subtotalLabel = computed(() => {\n const config = this.gridStore.configuration();\n return config?.config?.subtotalLabel ?? 'Subtotal';\n });\n \n /**\n * Check if a group has subtotal data\n * @param group The group to check\n * @returns true if the group has subtotal data\n */\n hasSubtotalData(group: RowGroup): boolean {\n return !!group.subtotal && Object.keys(group.subtotal).length > 0;\n }\n \n /**\n * Get subtotal value for a column in a group\n * @param group The group containing the subtotal\n * @param columnName The column name to get the subtotal for\n * @returns The subtotal value or null if not available\n */\n getSubtotalValue(group: RowGroup, columnName: string): number | null {\n if (!group.subtotal) {\n return null;\n }\n return group.subtotal[columnName] ?? null;\n }\n\n /**\n * Check if grand total data is available (computed signal for reactivity)\n */\n hasGrandTotalData = computed(() => {\n const grandTotal = this.gridStore.rowGrandTotal();\n return !!grandTotal && Object.keys(grandTotal).length > 0;\n });\n\n /**\n * Get grand total value for a column\n * @param columnName The column name to get the grand total for\n * @returns The grand total value or null if not available\n */\n getGrandTotalValue(columnName: string): number | null {\n const grandTotal = this.gridStore.rowGrandTotal();\n if (!grandTotal) {\n return null;\n }\n return grandTotal[columnName] ?? null;\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 private requestedGroupIds = new Set<string>(); // Track which groups have been requested for data\n private columnsInitialized = signal(false);\n \n /**\n * Get content height for a specific group from the computed signal\n * This is efficient as it uses the cached computed signal instead of recalculating\n */\n getGroupContentHeight(groupId: string): number {\n this.updateViewportSize(groupId);\n return this.groupContentHeightsMap().get(groupId) || 200; // Default to 200 if not found\n }\n \n \n /**\n * Calculate total height of a group including header and content\n * This is used for the outer groups virtual scroll viewport\n */\n protected getTotalGroupHeight(group: RowGroup): number {\n const headerHeight = 50; // Height of sticky header (custom-collapse-header)\n const freezeHeaderHeight = this.freezeHeader() ? 40 : 0; // Additional header height if freeze header is enabled\n let subtotalHeight = this.subtotalPositionColumn() === 'before' && this.hasSubtotalData(group) ? 50 : 0;\n const contentHeight = this.getGroupContentHeight(group.id);\n //const contentHeight = group.totalRowCount * 30;\n return headerHeight + freezeHeaderHeight + contentHeight + subtotalHeight;\n }\n\n /**\n * Calculate average group height for the outer virtual scroll viewport itemSize\n * Uses getMinHeightPx() to ensure proper height calculation\n */\n/* protected getAverageGroupHeight(): number {\n const groups = this.groups();\n console.log(\"getAverageGroupHeight: groups\", groups.length);\n if (groups.length === 0) {\n // Fallback to min height if no groups\n console.log(\"getAverageGroupHeight: no groups, returning max of 200 and min height\", Math.max(200, this.getMinHeightPx()));\n return Math.max(200, this.getMinHeightPx());\n }\n // Calculate average height considering all groups\n const totalHeight = groups.reduce((sum, group) => sum + this.getTotalGroupHeight(group), 0);\n const averageHeight = Math.ceil(totalHeight / groups.length);\n console.log(\"getAverageGroupHeight: totalHeight\", totalHeight, \"groups.length\", groups.length, \"averageHeight\", averageHeight, 'final', Math.max(200, Math.min(averageHeight, this.getMinHeightPx() + 100)));\n // Ensure it's at least the minimum height, but also reasonable\n // CDK virtual scroll works best with a reasonable average\n return Math.max(200, Math.min(averageHeight, this.getMinHeightPx() + 100));\n } */\n\n constructor(private changeDetectorRef: ChangeDetectorRef) {\n \n effect(() => {\n if(this.columnsInitialized()) {\n return;\n }\n const columns = this.gridStore.columns();\n if(columns && columns.length > 0) {\n this.initializeColumnWidths();\n this.firstDataRowIndex.set(this.maxDepth()+1);\n this.initialMinHeight = this.getMinHeightPx();\n this.initialTotalWidth = this.getTotalTableWidth();\n this.columnsInitialized.set(true);\n }\n });\n \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 // Effect to watch for groups changes and initialize when groups are available\n /* effect(() => {\n // Always access the signal first to ensure it's tracked, even if we return early\n const groups = this.gridStore.groups();\n console.log(\"groups effect triggered for\", groups);\n \n if (groups && groups.length > 0) { \n // Use setTimeout to make this asynchronous and prevent UI blocking\n setTimeout(() => {\n console.log(\"calling initializeGroups\" , groups);\n this.initializeGroups();\n //this.intelligentGroupLoading();\n }, 0);\n }\n }); */\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 // Apply gridHeight as CSS variable if configured\n const gridHeight = this.gridHeight();\n if (gridHeight) {\n this.elementRef.nativeElement.style.setProperty('--grid-height', `${gridHeight}px`, 'important');\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 // initializeGroups() moved to effect in constructor to handle timing\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 // Mark component as initialized after a short delay to allow viewport to settle\n /* setTimeout(() => {\n this.isComponentInitialized = true;\n console.log(\"Component initialized - scroll events will now be processed\");\n }, 100); */\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 // Clear scroll timeout if it exists\n if (this.groupsScrollTimeout) {\n clearTimeout(this.groupsScrollTimeout);\n this.groupsScrollTimeout = null;\n }\n }\n set_table_group(data: RowGroup[]) {\n console.log(\"set_table_group from eru-grid.component\", data);\n this.gridStore.setGroups(data);\n this.initializeGroups();\n }\n getInitialMinHeightPx(): number {\n return this.initialMinHeight;\n }\n\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 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 const groupRows = this.gridStore.getRowsForGroup(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 return flattenedRows;\n }\n\n\n\n initializeGroups() {\n this.requestedGroupIds.clear();\n this.lastLoadedGroupIds.clear();\n \n \n console.log(\"initializeGroups\" , this.gridStore.groups());\n if(this.gridStore.groups().length > 0) {\n this.fetchInitialRows();\n }\n }\n\n private fetchInitialRows() {\n console.log(\"fetchInitialRows\" , this.gridStore.groups());\n // Fetch data for initially visible groups\n this.fetchDataForVisibleGroups();\n }\n\n /**\n * Fetch data for currently visible groups that haven't been requested yet\n * This is called on initial load and when groups become visible during scrolling\n */\n private fetchDataForVisibleGroups() {\n const visibleGroups = this.getVisibleGroups();\n visibleGroups.forEach(group => {\n // Only fetch if:\n // 1. Group is expanded\n // 2. Group hasn't been requested yet\n // 3. Group has rows to load (totalRowCount > 0)\n if (group && group.isExpanded && \n !this.requestedGroupIds.has(group.id) && \n group.totalRowCount > 0 && !group.isLoading && group.hasMoreRows) {\n console.log(\"📥 Requesting rows for newly visible group:\", group.id, group.title);\n this.requestedGroupIds.add(group.id);\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 private updateViewportSize(groupId: string): void {\n // Use setTimeout to ensure this runs after Angular's change detection\n setTimeout(() => {\n const viewport = this.getViewportByGroupId(groupId);\n if (viewport) {\n // checkViewportSize() recalculates the viewport dimensions when content height changes\n // This is the proper way to update the viewport when total height changes\n viewport.checkViewportSize();\n }\n this.groupsViewport.checkViewportSize();\n }, 0);\n }\n addRowsForGroup(groupId: string, rows: Row[], hasMore: boolean) {\n this.gridStore.addRowsForGroup(groupId, rows, hasMore);\n this.updateViewportSize(groupId);\n /* var viewport = this.getViewportByGroupId(groupId);\n console.log(\"viewport from addRowsForGroup\", viewport);\n if (viewport) {\n this.gridStore.addRowsForGroup(groupId, rows, hasMore);\n this.ngZone.runOutsideAngular(() => {\n queueMicrotask(() => { \n if (viewport) {\n viewport.scrollToOffset(this.previousOffset());\n }\n });\n }); \n }*/\n \n }\n onScroll(scrollIndex: number, group: RowGroup) {\n // Skip scroll events during component initialization\n /* if (!this.isComponentInitialized) {\n console.log(\"Skipping scroll event - component not initialized yet\");\n return;\n } */\n var viewport = this.getViewportByGroupId(group.id);\n if (!group || !group.isExpanded || !viewport) {\n return;\n }\n const currentOffset = viewport.measureScrollOffset();\n if (currentOffset > 0) {\n this.previousOffset.set(viewport.measureScrollOffset());\n } else if (currentOffset === 0) {\n viewport.scrollToOffset(this.previousOffset());\n }\n const dataLength = viewport.getDataLength();\n \n if (dataLength === 0) {\n return;\n }\n \n this.checkAndLoadMoreRows(group, viewport);\n }\n\n /**\n * Get viewport by group ID using the data-group-id attribute\n */\n private getViewportByGroupId(groupId: string): CdkVirtualScrollViewport | undefined {\n if (!this.allViewports) return undefined;\n \n return this.allViewports.find(viewport => {\n const element = viewport.elementRef.nativeElement;\n return element.getAttribute('data-group-id') === groupId;\n });\n }\n\n protected getVisibleGroups(): RowGroup[] {\n // Use groups viewport for table mode, pivot viewport for pivot mode\n const viewport = !this.gridStore.isPivotMode() ? this.groupsViewport : this.viewport;\n if (!viewport) {\n // If viewport not initialized yet, return empty array\n return [];\n }\n\n try {\n const renderedRange = viewport.getRenderedRange();\n \n const visibleGroups = new Set<string>();\n console.log(\"renderedRange\", renderedRange, viewport.checkViewportSize(), viewport.getDataLength(), viewport.measureScrollOffset());\n if (!this.gridStore.isPivotMode()) {\n // For table mode, rendered range indexes directly correspond to groups\n // Only include groups that are actually in the rendered range\n const groups = this.groups();\n if (renderedRange.end == 0 && groups.length > 0) {\n visibleGroups.add(groups[0].id);\n }\n for (let i = renderedRange.start; i < renderedRange.end && i < groups.length; i++) {\n const group = groups[i];\n if (group) {\n visibleGroups.add(group.id);\n }\n }\n } else {\n // For pivot mode, use the existing logic with group items\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 \n console.log(\"Visible Groups IDs:\", Array.from(visibleGroups));\n if (!visibleGroups || visibleGroups.size === 0) {\n return [this.gridStore.groups().find(g => g.id === 'root') as RowGroup];\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 } catch (error) {\n // If viewport methods throw (e.g., not fully initialized), return empty\n console.warn(\"Error getting visible groups:\", error);\n return [];\n }\n }\n\n\n private getGroupItemAtIndex(index: number): GroupItem | undefined {\n const groupItems = this.groupedRows();\n console.log(\"groupItems\", groupItems);\n return groupItems[index];\n }\n\n\n private checkAndLoadMoreRows(group: RowGroup, viewport: CdkVirtualScrollViewport) {\n if (!viewport) return;\n\n const renderedRange = viewport.getRenderedRange();\n const dataLength = viewport.getDataLength();\n\n\n const isNearEnd = renderedRange.end >= (dataLength - this.SCROLL_THRESHOLD);\n \n if (isNearEnd && group.hasMoreRows && !group.isLoading) {\n this.requestRowsForGroup(group);\n }\n }\n\n\n \n\n private intelligentGroupLoading() {\n const visibleGroups = this.getVisibleGroups();\n console.log(\"visibleGroups intelligentGroupLoading\", visibleGroups, this.lastLoadedGroupIds);\n const groupsToLoad = visibleGroups.filter(group =>\n group.isExpanded &&\n group.hasMoreRows &&\n !group.isLoading \n /* && !this.lastLoadedGroupIds.has(group.id) */\n );\n console.log(\"groupsToLoad intelligentGroupLoading\", groupsToLoad);\n const sortedGroupsToLoad = groupsToLoad.sort((a, b) =>\n (a.currentLoadedRows || 0) - (b.currentLoadedRows || 0)\n );\n if (sortedGroupsToLoad.length > 0) {\n const groupToLoad = sortedGroupsToLoad[0];\n this.requestRowsForGroup(groupToLoad);\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 console.log(\"requestRowsForGroup\", group, this.lastLoadedGroupIds);\n // Prevent duplicate requests\n \n //if (this.lastLoadedGroupIds.has(group.id)) return;\n \n const request: RowDataRequest = {\n groupId: group.id,\n groupKey: group.key,\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: Adding to request queue', request);\n\n // Add to queue instead of overwriting signal\n this.gridStore.addToRequestQueue(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 console.log(\"lastLoadedGroupIds\", this.lastLoadedGroupIds);\n setTimeout(() => {\n this.lastLoadedGroupIds.delete(group.id);\n }, 1000);\n }\n\n shouldShowRequiredToggleRow(): boolean {\n const config = this.gridStore.configuration();\n return config?.config?.designMode === true && this.mode() === 'table';\n }\n\n onColumnRequiredChange(columnName: string, required: boolean): void {\n this.gridStore.updateColumnRequired(columnName, required);\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 trackByRowFn(index: number, row: any): string {\n // Use both entity_id and index to ensure uniqueness even with duplicate entity_ids\n return `${row.entity_id} - ${index}`;\n }\n\n trackByGroupFn(index: number, group: RowGroup): string {\n return group.id;\n }\n\n getRowsForGroup(groupId: string): Row[] {\n return this.gridStore.getRowsForGroup(groupId);\n }\n\n // Create a computed signal for each group's rows to avoid function calls in template\n getRowsForGroupSignal(groupId: string) {\n console.log(\"getRowsForGroupSignal called for group\", groupId);\n console.log(this.gridStore.getRowsForGroup(groupId));\n return computed(() => this.gridStore.getRowsForGroup(groupId));\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 /**\n * Get the Field corresponding to a PivotColumnHeader\n * For nested headers, finds the first matching leaf column\n */\n getFieldForPivotHeader(header: any): Field | undefined {\n if (!header) return undefined;\n \n const leafColumns = this.getLeafColumns();\n \n // If header has leafColumns array, find matching fields\n if (header.leafColumns && header.leafColumns.length > 0) {\n // Return the first matching leaf column field\n return leafColumns.find(col => header.leafColumns.includes(col.name));\n }\n \n // Fallback: try to find by name\n return leafColumns.find(col => col.name === header.name);\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 // Note: field_size fallback is now handled in setColumns() in the store\n // This method is kept for backward compatibility but mainly just ensures columns are set\n const columns = this.gridStore.columns();\n console.log(\"columns from gridStore\",columns);\n \n if (columns && columns.length > 0) {\n // Re-apply setColumns to ensure field_size fallback is applied if columns were set before configuration\n // This handles the case where columns might have been set before columnConstraints were available\n this.gridStore.setColumns(columns);\n }\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 onActionClick(event: Event, row: any) {\n event.stopPropagation();\n const rowId = row?.entity_id || row?._rowKey || '';\n this.gridStore.setActionClick({\n rowId: rowId,\n rowData: row\n });\n }\n\n /**\n * Check if action column is enabled\n * @returns true if actionColumn is enabled, false otherwise (default: false)\n */\n isActionColumnEnabled = computed(() => {\n return this.gridStore.configuration()?.config?.actionColumn ?? false;\n });\n\n /**\n * Get action column position\n * @returns 'before' | 'after' (default: 'after')\n */\n getActionColumnPosition = computed(() => {\n return this.gridStore.configuration()?.config?.actionColumnPosition ?? 'after';\n });\n\n /**\n * Check if action column should be shown at a specific position\n * @param position The position to check ('before' | 'after')\n * @returns true if action column is enabled and matches the position\n */\n shouldShowActionColumn(position: 'before' | 'after'): boolean {\n return this.isActionColumnEnabled() && this.getActionColumnPosition() === position;\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 && this.getRowsForGroup(groupId).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 /**\n * Handle scroll events on the groups viewport\n * This detects when new groups become visible and fetches their data\n * Can be called with either Event (from scroll event) or number (from scrolledIndexChange)\n */\n onGroupsViewportScroll(event: Event | number) {\n // Debounce to avoid too many calls during scrolling\n // Using a simple timeout mechanism\n if (this.groupsScrollTimeout) {\n clearTimeout(this.groupsScrollTimeout);\n }\n \n this.groupsScrollTimeout = setTimeout(() => {\n this.fetchDataForVisibleGroups();\n }, 100); // 100ms debounce\n }\n\n private groupsScrollTimeout: ReturnType<typeof setTimeout> | null = null;\n\n onTableBodyScroll(event: Event) {\n const target = event.target as HTMLElement;\n if (!target) return;\n const groupId = target.getAttribute('data-group-id');\n \n const headerScroller = this.headerScrollers?.find(headerScroller => headerScroller.nativeElement.getAttribute('data-group-id') === 'header-shell-' + groupId)?.nativeElement;\n const scrollLeft = target.scrollLeft;\n \n // Sync header if freezeHeader is enabled\n if (this.freezeHeader() && headerScroller) {\n const headerScrollLeft = headerScroller.scrollLeft;\n // Only sync if there's a difference to avoid infinite loops\n if (Math.abs(scrollLeft - headerScrollLeft) > 1) {\n headerScroller.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 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 // 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 toggleGroupCollapse(groupId: string) {\n this.gridStore.toggleGroupExpansion(groupId);\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 var viewport = container.querySelector('.pivot-viewport') as HTMLElement;\n if (!viewport) {\n viewport = container.querySelector('.table-viewport') as HTMLElement;\n }\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;\">\ncurrentPivotScrollIndex {{currentPivotScrollIndex()}} |\nfirstDataRowIndex {{firstDataRowIndex()}} |\nfirstTr {{firstTr}} |\nmaxDepth {{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 <!-- 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 <!-- Outer virtual scroll viewport for groups -->\n\n <cdk-virtual-scroll-viewport\n #groupsViewport\n [itemSize]=\"200\"\n class=\"viewport groups-viewport\"\n (scrolledIndexChange)=\"onGroupsViewportScroll($event)\"\n >\n\n <div class=\"group-container\" *cdkVirtualFor=\"let group of groups(); trackBy: trackByGroupFn; let i = index\"\n >\n <!-- Combined sitcky header with group info and table -->\n <div style=\"\n background:var(--grid-surface);\n position: sticky;\n top: 0;\n z-index: 115;\n \">\n <div class=\"custom-collapse-header\"\n (click)=\"toggleGroupCollapse(group.id)\">\n <span class=\"collapse-arrow\" [ngClass]=\"{\n 'rotate-arrow': group.isExpanded,\n }\">▼</span>\n <span class=\"f-12\">\n {{ group?.title || \"\" }}\n {{ group?.currentLoadedRows || 0 }} -\n {{ group?.totalRowCount || 0 }} rows...</span>\n </div>\n\n @if(freezeHeader() && group.isExpanded) {\n <div #headerScroller class=\"header-shell\"\n [attr.data-group-id]=\"'header-shell-' + group.id\"\n [style]=\"'--table-total-width: ' + getInitialTotalWidth() + 'px'\">\n <table class=\"eru-grid-table\"\n [class.show-column-lines]=\"showColumnLines()\"\n [class.show-row-lines]=\"showRowLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n <!-- Grand Total row after sticky header (position: before) - only for first group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after sticky header (position: before) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n </table>\n </div>\n }\n </div>\n @if(group.isExpanded) {\n <ng-container>\n <cdk-virtual-scroll-viewport\n [attr.data-group-id]=\"group.id\"\n [itemSize]=\"30\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event, group)\"\n (scroll)=\"onTableBodyScroll($event)\"\n [style]=\"'--table-height: ' + getGroupContentHeight(group.id) + 'px; --table-min-height: ' + getInitialMinHeightPx() + 'px; --table-total-width: ' + getInitialTotalWidth() + 'px'\"\n >\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\" [class.show-column-lines]=\"showColumnLines()\" [class.show-column-lines]=\"showColumnLines()\">\n <ng-container *ngTemplateOutlet=\"tableColGroup\"></ng-container>\n @if(!freezeHeader()) {\n <ng-container *ngTemplateOutlet=\"tableHeader\"></ng-container>\n }\n <!-- Grand Total row after normal header (position: before) - only for first group -->\n @if(!freezeHeader() && enableColumnGrandTotal() && grandTotalPositionColumn() === 'before' && hasGrandTotalData() && i === 0) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n </tbody>\n }\n <!-- Subtotal row after normal header (position: before) -->\n @if(!freezeHeader() && enableColumnSubtotals() && subtotalPositionColumn() === 'before' && hasSubtotalData(group)) {\n <tbody>\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n </tbody>\n }\n <tbody>\n @if (columns(); as columnsList) {\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 <!-- @if(getRowsForGroup(group.id).length > 0 && group.isExpanded) { -->\n <!-- *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id)(); \n trackBy: trackByRowFn; \n let i = index\" -->\n <!-- @for(row of getRowsForGroupSignal(group.id)(); track trackByRowFn($index, row); let i = $index) { -->\n <tr *cdkVirtualFor=\"let row of getRowsForGroupSignal(group.id || '')(); trackBy: trackByRowFn; let i = index\"\n class=\"row-item\"\n [attr.data-row-id]=\"i\"\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(row?.entity_id)\"\n (change)=\"toggleRowSelection($event, row)\"\n >\n </td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td #cell\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]=\"row?.['entity_data']?.[column.name] || 'xx'\"\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 }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px; text-align: center; cursor: pointer;\">\n <mat-icon (click)=\"onActionClick($event, row)\">more_horiz</mat-icon>\n </td>\n }\n </tr>\n <!-- } -->\n <!-- } -->\n @if(group.isLoading && group.isExpanded) {\n @for(i of [].constructor(ghostRows()); let j = $index; track j) {\n <tr\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 <td class=\"checkbox-column ghost-cell-container\">\n <div class=\"ghost-cell\"></div>\n </td>\n\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n @for (column of columns(); track trackByColumnFn($index, column)) {\n <td\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 }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column ghost-cell-container\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n <div class=\"ghost-cell\"></div>\n </td>\n }\n </tr>\n }\n }\n <!-- <tr\n *ngIf=\"getRowsForGroup(group.id).length === 0 && !group.isExpanded\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"groupSeperatorColSpan()\" class=\"separator-cell\"></td>\n </tr> -->\n <!-- Subtotal row at end of group (position: after) -->\n @if(enableColumnSubtotals() && subtotalPositionColumn() === 'after' && hasSubtotalData(group)) {\n <ng-container *ngTemplateOutlet=\"tableSubtotal; context: { group: group }\"></ng-container>\n }\n <!-- Grand Total row at end of group (position: after) - only for last group -->\n @if(enableColumnGrandTotal() && grandTotalPositionColumn() === 'after' && hasGrandTotalData() && i === groups().length - 1) {\n <ng-container *ngTemplateOutlet=\"tableGrandTotal\"></ng-container>\n }\n }\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-container>\n }\n </div>\n</cdk-virtual-scroll-viewport>\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 && !isRowDimensionHeader(header)\"\n [columnConfig]=\"getFieldForPivotHeader(header)\"\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\n<!-- Column Group Template for consistent column widths -->\n<ng-template #tableColGroup>\n <colgroup>\n @for (column of columns(); 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\n<ng-template #tableHeader>\n\n <thead>\n @if(shouldShowRequiredToggleRow()) {\n <tr class=\"required-toggle-row\">\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllGroupsSelected()\"\n (change)=\"toggleAllGroups($event)\"\n >\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"required-toggle-cell\">\n @if(i === 0) {\n <span class=\"required-label\">required</span>\n }\n <mat-checkbox\n [checked]=\"column.required || false\"\n (change)=\"onColumnRequiredChange(column.name, $event.checked)\"\n [title]=\"'Make ' + column.label + ' required'\">\n </mat-checkbox>\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">\n Action\n </th>\n }\n </tr>\n }\n <tr>\n @if(gridStore.configuration().config.allowSelection) {\n <th class=\"checkbox-column column-header table-column-header\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllGroupsSelected()\"\n (change)=\"toggleAllGroups($event)\"\n >\n </th>\n }\n @if(shouldShowActionColumn('before')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n @for (column of columns(); track trackByColumnFn(i, column); let i = $index) {\n <th\n [style.width.px]=\"column.field_size\"\n [resizeColumn]=\"gridStore.isFeatureEnabled('columnResizable')\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"gridStore.isFeatureEnabled('columnReorderable') ? i : null\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header table-column-header\">\n @if(gridStore.isFeatureEnabled('columnReorderable')) {\n <div class=\"column-drag-handle\"></div>\n }\n <!-- <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"column.label\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"isEditable()\"\n [id]=\"i + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell> -->\n {{column.label}}\n </th>\n }\n @if(shouldShowActionColumn('after')) {\n <th class=\"action-column column-header table-column-header\" style=\"width: 40px; min-width: 40px; max-width: 40px;\">Action</th>\n }\n </tr>\n</thead>\n</ng-template>\n\n<!-- Table Subtotal Row Template -->\n<ng-template #tableSubtotal let-group=\"group\">\n <tr class=\"subtotal-row\"\n [class.subtotal-bold]=\"subTotalStyle() === 'bold'\"\n [class.subtotal-italic]=\"subTotalStyle() === 'italic'\"\n [class.subtotal-highlighted]=\"subTotalStyle() === 'highlighted'\"\n [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"subtotal-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getSubtotalValue(group, column.name) === null) {\n <span class=\"subtotal-label\">{{subtotalLabel()}}</span>\n } @else {\n @if(getSubtotalValue(group, column.name) !== null) {\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getSubtotalValue(group, column.name)\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"false\"\n [id]=\"'subtotal_' + group.id + '_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>\n\n<!-- Table Grand Total Row Template -->\n<ng-template #tableGrandTotal>\n <tr class=\"grand-total-row\"\n [class.grand-total-bold]=\"grandTotalStyle() === 'bold'\"\n [class.grand-total-italic]=\"grandTotalStyle() === 'italic'\"\n [class.grand-total-highlighted]=\"grandTotalStyle() === 'highlighted'\"\n [style.height.px]=\"30\">\n @if(gridStore.configuration().config.allowSelection) {\n <td class=\"checkbox-column\"></td>\n }\n @if(shouldShowActionColumn('before')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n @for(column of columns(); track trackByColumnFn($index, column); let colIndex = $index) {\n <td [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"grand-total-cell\"\n [style.height.px]=\"30\">\n <div class=\"cell-content\">\n @if(colIndex === 0 && getGrandTotalValue(column.name) === null) {\n <span class=\"grand-total-label\">Grand Total</span>\n } @else {\n @if(getGrandTotalValue(column.name) !== null) {\n <data-cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"getGrandTotalValue(column.name)\"\n [column]=\"column\"\n [mode]=\"mode()\"\n [isEditable]=\"false\"\n [id]=\"'grandtotal_' + column.name\"\n [eruGridStore]=\"gridStore\">\n </data-cell>\n }\n }\n </div>\n </td>\n }\n @if(shouldShowActionColumn('after')) {\n <td class=\"action-column\" style=\"width: 40px; min-width: 40px; max-width: 40px;\"></td>\n }\n </tr>\n</ng-template>","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\n\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';\nimport { MATERIAL_MODULES, MATERIAL_PROVIDERS } from '../../providers/material.providers';\n@Component({\n selector: 'eru-theme-toggle',\n standalone: true,\n imports: [\n ...MATERIAL_MODULES,\n MatButtonModule,\n MatIconModule,\n MatMenuModule\n],\n providers: [...MATERIAL_PROVIDERS],\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 @for (theme of availableThemes; track theme) {\n <button\n mat-menu-item\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 @if (isActiveTheme(theme.value)) {\n <mat-icon class=\"check-icon\">check</mat-icon>\n }\n </button>\n }\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}","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n\n@Component({\n selector: 'eru-hello-world',\n standalone: true,\n imports: [],\n template: `\n <div class=\"hello-world-container\">\n <h2 class=\"hello-world-title\">Hello World!</h2>\n <p class=\"hello-world-message\">Welcome to the Eru Grid Library</p>\n </div>\n `,\n styles: [`\n .hello-world-container {\n padding: 20px;\n text-align: center;\n background-color: var(--grid-surface, #f5f5f5);\n border-radius: 8px;\n margin: 10px 0;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n \n .hello-world-title {\n color: var(--grid-primary-color, #1976d2);\n margin: 0 0 10px 0;\n font-size: 24px;\n font-weight: 600;\n }\n \n .hello-world-message {\n color: var(--grid-on-surface, #333);\n margin: 0;\n font-size: 16px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class HelloWorldComponent {\n constructor() {}\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/components/hello-world/hello-world.component';\nexport * from './lib/components/currency/currency.component';\nexport * from './lib/components/number/number.component';\nexport * from './lib/components/textbox/textbox.component';\nexport * from './lib/components/email/email.component';\nexport * from './lib/components/location/location.component';\nexport * from './lib/components/checkbox/checkbox.component';\nexport * from './lib/components/date/date.component';\nexport * from './lib/components/phone/phone.component';\nexport * from './lib/components/progress/progress.component';\nexport * from './lib/components/rating/rating.component';\nexport * from './lib/model/grid.model';\nexport * from './lib/stores/grid.store';\nexport * from './lib/providers/material.providers';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EruGridStore","i2.ThemeService","i3.ColumnConstraintsService","i2","i1","i4","i3","i6"],"mappings":"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"}
|