eru-grid 0.0.1

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.
@@ -0,0 +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 * Validates and enforces rules for grid configuration\n */\n validateAndEnforceConfiguration(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 /**\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 { 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';\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 * Main method to transform flat data into pivot table\n */\n transformData(\n sourceData: any[], \n configuration: PivotConfiguration,\n gridConfiguration?: GridConfiguration\n ): PivotResult {\n const startTime = performance.now();\n \n \n // Step 2: Group data by row dimensions\n const rowDimensionFields = configuration.rows;\n \n const groupedData = this.groupByDimensions(sourceData, rowDimensionFields);\n \n \n // Step 3: Generate pivot columns from column dimensions\n const columnDimensionFields = configuration.cols;\n const pivotColumns = this.generatePivotColumns(sourceData, columnDimensionFields);\n \n // Step 4: Create pivot rows with aggregated data\n let pivotRows = this.createPivotRows(\n groupedData, \n pivotColumns, \n configuration\n );\n \n // Step 4a: Add subtotals and grand totals if configured\n const enableRowSubtotals = gridConfiguration?.config?.enableRowSubtotals ?? false;\n const enableColumnSubtotals = gridConfiguration?.config?.enableColumnSubtotals ?? false;\n const enableGrandTotal = gridConfiguration?.config?.enableGrandTotal ?? false;\n if (enableRowSubtotals || enableColumnSubtotals || enableGrandTotal) {\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 );\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 );\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\n return {\n data: pivotRows,\n columnDefinitions,\n rowCount: pivotRows.length,\n metadata,\n configuration,\n headerStructure,\n columnGroupState: this.columnGroupState\n };\n }\n\n\n /**\n * Group data by row dimensions\n */\n private groupByDimensions(data: any[], dimensions: string[]): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n \n data.forEach(row => {\n // Create a key from row dimension values\n // Use null/undefined check to preserve boolean false values\n const key = dimensions.map(dim => row[dim] != null ? String(row[dim]) : '').join('|');\n \n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n });\n \n // Sort the groups hierarchically to ensure proper parent-child ordering\n return this.sortGroupsHierarchically(groups, dimensions);\n }\n\n /**\n * Sort grouped data hierarchically so parent dimensions appear with their children grouped together\n */\n private sortGroupsHierarchically(groups: Map<string, any[]>, dimensions: string[]): Map<string, any[]> {\n // Convert to array for sorting\n const groupEntries = Array.from(groups.entries());\n \n // Sort by hierarchical structure - each dimension level sorted separately\n groupEntries.sort((a, b) => {\n const aValues = a[0].split('|');\n const bValues = b[0].split('|');\n \n // Compare each dimension level in order\n for (let i = 0; i < dimensions.length; i++) {\n const aVal = aValues[i] || '';\n const bVal = bValues[i] || '';\n \n // Natural sort to handle numbers properly (0, 1, 10 instead of 0, 10, 1)\n const comparison = this.naturalSort(aVal, bVal);\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n \n // Convert back to Map with sorted order\n const sortedGroups = new Map<string, any[]>();\n groupEntries.forEach(([key, value]) => {\n sortedGroups.set(key, value);\n });\n \n return sortedGroups;\n }\n\n /**\n * Natural sort that handles numbers properly\n */\n private naturalSort(a: string, b: string): number {\n // Handle numeric values\n const aNum = parseFloat(a);\n const bNum = parseFloat(b);\n \n if (!isNaN(aNum) && !isNaN(bNum)) {\n return aNum - bNum;\n }\n \n // String comparison for non-numeric values\n return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });\n }\n\n /**\n * Generate unique pivot column values using cartesian product of all dimension values\n */\n private generatePivotColumns(data: any[], columnDimensions: string[]): string[] {\n if (columnDimensions.length === 0) {\n return ['_value']; // Default column for aggregations\n }\n\n // Get all unique values for each dimension\n const dimensionValues = columnDimensions.map(dimension => {\n const values = new Set<string>();\n data.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(value);\n });\n return Array.from(values).sort();\n });\n\n // Generate cartesian product of all dimension combinations\n const generateCombinations = (arrays: string[][], index: number = 0, current: string[] = []): string[] => {\n if (index === arrays.length) {\n return [current.join('|')];\n }\n \n const results: string[] = [];\n for (const value of arrays[index]) {\n results.push(...generateCombinations(arrays, index + 1, [...current, value]));\n }\n return results;\n };\n\n return generateCombinations(dimensionValues).sort();\n }\n\n /**\n * Create pivot rows with aggregated data (PERFORMANCE OPTIMIZED)\n */\n private createPivotRows(\n groupedData: Map<string, any[]>,\n pivotColumns: string[],\n configuration: PivotConfiguration\n ): PivotRow[] {\n const pivotRows: PivotRow[] = [];\n const startTime = performance.now();\n\n // Pre-calculate column dimension mapping for performance\n const columnDataMap = new Map<string, Map<string, any[]>>();\n \n // Build column data mapping once for all rows\n groupedData.forEach((rowData, rowKey) => {\n const columnMapping = new Map<string, any[]>();\n \n // Group row data by column dimensions\n rowData.forEach(row => {\n const rowColumnKey = configuration.cols.length > 0\n ? configuration.cols\n .map(fieldName => row[fieldName] != null ? String(row[fieldName]) : '').join('|')\n : '_default';\n \n if (!columnMapping.has(rowColumnKey)) {\n columnMapping.set(rowColumnKey, []);\n }\n columnMapping.get(rowColumnKey)!.push(row);\n });\n \n columnDataMap.set(rowKey, columnMapping);\n });\n\n let processedRows = 0;\n groupedData.forEach((rowData, rowKey) => {\n const pivotRow: PivotRow = {\n _rowKey: rowKey,\n _sourceCount: rowData.length\n };\n\n // Add row dimension values to the pivot row\n const rowDimensionValues = rowKey.split('|');\n configuration.rows.forEach((fieldName: string, index: number) => {\n pivotRow[fieldName] = rowDimensionValues[index] || '';\n });\n\n\n // Get pre-calculated column mapping for this row\n const columnMapping = columnDataMap.get(rowKey)!;\n\n // Calculate aggregations for each pivot column (optimized)\n pivotColumns.forEach(pivotColumn => {\n configuration.aggregations.forEach(aggregation => {\n const columnKey = configuration.cols.length > 0 \n ? `${pivotColumn}_${aggregation.name}`\n : 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 console.log(`✅ Created ${pivotRows.length} pivot rows in ${(endTime - startTime).toFixed(2)}ms`);\n console.log(`⚡ Performance: ${((endTime - startTime) / pivotRows.length).toFixed(2)}ms per row`);\n \n return pivotRows;\n }\n\n /**\n * Calculate aggregation for a field (PERFORMANCE OPTIMIZED)\n */\n private calculateAggregationOptimized(\n data: any[],\n field: string,\n aggregationFunction: AggregationFunction\n ): number {\n if (data.length === 0) {\n return 0;\n }\n\n // Optimized single-pass value processing\n let sum = 0;\n let count = 0;\n let min = Number.MAX_VALUE;\n let max = Number.MIN_VALUE;\n let validCount = 0;\n\n for (const row of data) {\n const rawValue = row[field];\n if (rawValue !== null && rawValue !== undefined && rawValue !== '') {\n const numValue = Number(rawValue);\n if (!isNaN(numValue)) {\n sum += numValue;\n validCount++;\n if (numValue < min) min = numValue;\n if (numValue > max) max = numValue;\n }\n }\n count++;\n }\n\n switch (aggregationFunction) {\n case 'sum':\n return sum;\n \n case 'count':\n return count; // Count all rows, not just numeric values\n \n case 'avg':\n return validCount > 0 ? sum / validCount : 0;\n \n case 'min':\n return validCount > 0 ? min : 0;\n \n case 'max':\n return validCount > 0 ? max : 0;\n \n default:\n return 0;\n }\n }\n\n /**\n * Calculate aggregation for a field (ORIGINAL - kept for compatibility)\n */\n private calculateAggregation(\n data: any[],\n field: string,\n aggregationFunction: AggregationFunction\n ): number {\n // Call optimized version\n return this.calculateAggregationOptimized(data, field, aggregationFunction);\n }\n\n /**\n * Generate column definitions for the pivot table\n */\n private generateColumnDefinitions(\n rowDimensions: string[],\n pivotColumns: string[],\n aggregations: any[],\n gridConfiguration?: GridConfiguration\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(dimension),\n datatype: 'textbox' as DataTypes,\n field_size: 150,\n grid_index: columnIndex++\n });\n });\n\n // Add pivot value columns\n pivotColumns.forEach(pivotColumn => {\n aggregations.forEach(aggregation => {\n // CRITICAL FIX: Always use consistent naming pattern\n const columnName = `${pivotColumn}_${aggregation.name}`;\n\n const columnLabel = pivotColumns.length > 1 || pivotColumns[0] !== '_value'\n ? `${this.formatColumnLabel(pivotColumn)} - ${aggregation.label || aggregation.name}`\n : aggregation.label || this.formatColumnLabel(aggregation.name);\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++\n });\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(/[_|]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n /**\n * Get appropriate data type for aggregation function\n */\n private getAggregationDataType(aggregationFunction: AggregationFunction): DataTypes {\n switch (aggregationFunction) {\n case 'count':\n return 'number';\n case 'sum':\n case 'avg':\n case 'min':\n case 'max':\n return 'number'; // Could be 'currency' based on source field\n default:\n return 'number';\n }\n }\n\n /**\n * Optimize data for large datasets by processing in chunks\n */\n async transformDataAsync(\n sourceData: any[], \n configuration: PivotConfiguration,\n chunkSize: number = 1000\n ): Promise<PivotResult> {\n const startTime = performance.now();\n \n // Process data in chunks to avoid blocking the UI\n const chunks = this.chunkArray(sourceData, chunkSize);\n let processedData: any[] = [];\n \n for (const chunk of chunks) {\n // Data is already filtered by the application layer\n processedData = processedData.concat(chunk);\n \n // Allow other tasks to run\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n \n // Continue with normal processing\n return this.transformData(processedData, configuration);\n }\n\n /**\n * Split array into chunks\n */\n private chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n /**\n * Generate nested header structure for multi-dimensional columns\n */\n private generateNestedHeaderStructure(\n rowDimensions: string[],\n columnDimensions: string[],\n aggregations: any[],\n sourceData: any[]\n ): PivotHeaderStructure {\n // Use flat structure only if no column dimensions AND single aggregation\n if (columnDimensions.length === 0 && aggregations.length <= 1) {\n return this.generateFlatHeaderStructure(rowDimensions, columnDimensions, aggregations, sourceData);\n }\n\n // Get unique values for each column dimension\n const dimensionValues = columnDimensions.map(dimension => {\n const values = new Set<string>();\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(String(value));\n });\n return Array.from(values).sort();\n });\n\n\n // Build hierarchical header structure\n const headerRows: PivotColumnHeader[][] = [];\n const maxDepth = columnDimensions.length + (aggregations.length > 1 ? 1 : 0);\n \n // Initialize header rows\n for (let i = 0; i < maxDepth; i++) {\n headerRows.push([]);\n }\n\n // Add row dimension headers (they span all header rows)\n rowDimensions.forEach(dimension => {\n headerRows[0].push({\n label: this.formatColumnLabel(dimension),\n level: 0,\n colspan: 1,\n rowspan: maxDepth\n });\n });\n\n // Generate nested column headers with collapsible support\n this.buildNestedHeaders(\n dimensionValues,\n aggregations,\n headerRows,\n 0,\n columnDimensions\n );\n\n // Generate leaf columns for actual data with collapsible support\n const leafColumns = this.generateLeafColumnsWithCollapsible(\n rowDimensions,\n dimensionValues,\n aggregations,\n columnDimensions\n );\n\n\n return {\n maxDepth,\n headerRows,\n leafColumns\n };\n }\n\n /**\n * Build nested column headers recursively - generates complete cartesian product structure\n */\n private buildNestedHeaders(\n dimensionValues: string[][],\n aggregations: any[],\n headerRows: PivotColumnHeader[][],\n currentLevel: number,\n columnDimensions: string[]\n ): void {\n if (currentLevel >= dimensionValues.length) {\n return;\n }\n\n const currentDimensionValues = dimensionValues[currentLevel];\n const isLastDimension = currentLevel === dimensionValues.length - 1;\n const hasMultipleAggregations = aggregations.length > 1;\n \n // Calculate how many times this level should repeat based on parent combinations\n const parentCombinations = currentLevel === 0 ? 1 : \n dimensionValues.slice(0, currentLevel).reduce((acc, values) => acc * values.length, 1);\n \n // Generate headers for this level - repeat for each parent combination\n for (let parentIndex = 0; parentIndex < parentCombinations; parentIndex++) {\n currentDimensionValues.forEach(value => {\n const colspan = this.calculateColspan(\n dimensionValues,\n currentLevel,\n aggregations.length\n );\n \n const rowspan = (isLastDimension && !hasMultipleAggregations) ? 2 : 1;\n\n const dimension = columnDimensions[currentLevel];\n const groupKey = this.generateColumnGroupKey(dimension, currentLevel);\n const isExpanded = this.isColumnGroupExpanded(groupKey);\n \n headerRows[currentLevel].push({\n label: value,\n level: currentLevel,\n colspan,\n rowspan,\n // Collapsible properties\n isCollapsible: true,\n isExpanded: isExpanded,\n groupKey: groupKey,\n parentGroupKey: currentLevel > 0 ? this.generateColumnGroupKey(columnDimensions[currentLevel - 1], currentLevel - 1) : undefined,\n collapsedDisplayMode: 'aggregated'\n });\n\n // If this is the last dimension and we have multiple aggregations,\n // add aggregation headers for this dimension value\n if (isLastDimension && hasMultipleAggregations) {\n aggregations.forEach(agg => {\n headerRows[currentLevel + 1].push({\n label: agg.label || agg.name,\n level: currentLevel + 1,\n colspan: 1,\n rowspan: 1\n });\n });\n }\n });\n }\n\n // Recursively build next level only if not the last dimension\n if (!isLastDimension) {\n this.buildNestedHeaders(\n dimensionValues,\n aggregations,\n headerRows,\n currentLevel + 1,\n columnDimensions\n );\n }\n }\n\n /**\n * Calculate colspan for a header at given level\n */\n private calculateColspan(\n dimensionValues: string[][],\n currentLevel: number,\n aggregationCount: number\n ): number {\n let colspan = 1;\n \n // Multiply by values in deeper levels\n for (let i = currentLevel + 1; i < dimensionValues.length; i++) {\n colspan *= dimensionValues[i].length;\n }\n \n // Multiply by aggregation count if multiple aggregations\n if (aggregationCount > 1) {\n colspan *= aggregationCount;\n }\n \n return colspan;\n }\n\n /**\n * Generate leaf columns for the actual data with collapsible support\n */\n private generateLeafColumnsWithCollapsible(\n rowDimensions: string[],\n dimensionValues: string[][],\n aggregations: any[],\n columnDimensions: string[]\n ): Field[] {\n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(dimension),\n datatype: 'textbox' as DataTypes,\n field_size: 150,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1\n });\n });\n\n // Generate combinations respecting collapse state\n const combinations = this.generateCombinations(dimensionValues);\n \n combinations.forEach(combination => {\n // Check if any parent groups are collapsed\n const collapsedLevels = this.getCollapsedLevels(combination, columnDimensions);\n \n if (collapsedLevels.length > 0) {\n // Generate collapsed column\n const collapsedLevel = Math.min(...collapsedLevels);\n const collapsedDimension = columnDimensions[collapsedLevel];\n const groupKey = this.generateColumnGroupKey(collapsedDimension, collapsedLevel);\n \n // Only add one column per collapsed group\n const collapsedColumnKey = combination.slice(0, collapsedLevel + 1).join('|');\n if (!columns.find(col => col.name.startsWith(`${collapsedColumnKey}_collapsed_`))) {\n aggregations.forEach(aggregation => {\n const columnName = `${collapsedColumnKey}_collapsed_${aggregation.name}`;\n const columnLabel = `${combination.slice(0, collapsedLevel + 1).join(' - ')} (Total)`;\n \n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1\n });\n });\n }\n } else {\n // Generate normal expanded columns\n aggregations.forEach(aggregation => {\n const columnKey = combination.join('|');\n const columnName = `${columnKey}_${aggregation.name}`;\n \n const columnLabel = aggregations.length > 1\n ? `${combination.join(' - ')} (${aggregation.label})`\n : combination.join(' - ');\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1\n });\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 ): Field[] {\n console.log(`DEBUG: generateLeafColumns called with:`, {\n rowDimensions,\n dimensionValuesLength: dimensionValues.length,\n aggregationsLength: aggregations.length,\n columnDimensions\n });\n \n const columns: Field[] = [];\n let columnIndex = 0;\n\n // Add row dimension columns\n rowDimensions.forEach(dimension => {\n columns.push({\n name: dimension,\n label: this.formatColumnLabel(dimension),\n datatype: 'textbox' as DataTypes,\n field_size: 150,\n grid_index: columnIndex++,\n isLeaf: true,\n level: 0,\n rowspan: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n colspan: 1\n });\n });\n\n // Generate all combinations of column dimension values\n const combinations = this.generateCombinations(dimensionValues);\n \n combinations.forEach(combination => {\n aggregations.forEach(aggregation => {\n const columnKey = combination.join('|');\n // CRITICAL FIX: Use the same naming convention as data calculation\n // Data is stored as 'Feb_sales', 'Jan_sales' but columns were named 'Feb', 'Jan'\n const columnName = `${columnKey}_${aggregation.name}`;\n \n const columnLabel = aggregations.length > 1\n ? `${combination.join(' - ')} (${aggregation.label})`\n : combination.join(' - ');\n\n\n columns.push({\n name: columnName,\n label: columnLabel,\n datatype: this.getAggregationDataType(aggregation.aggregationFunction),\n field_size: 120,\n grid_index: columnIndex++,\n isLeaf: true,\n level: dimensionValues.length + (aggregations.length > 1 ? 1 : 0),\n parentPath: combination,\n rowspan: 1,\n colspan: 1\n });\n });\n });\n\n console.log(`DEBUG: generateLeafColumns generated ${columns.length} columns:`);\n columns.forEach((col, index) => {\n console.log(` [${index}] ${col.name} (label: \"${col.label}\")`);\n });\n\n return columns;\n }\n\n /**\n * Generate all combinations of dimension values\n */\n private generateCombinations(dimensionValues: string[][]): string[][] {\n if (dimensionValues.length === 0) return [[]];\n if (dimensionValues.length === 1) return dimensionValues[0].map(v => [v]);\n\n const [first, ...rest] = dimensionValues;\n const restCombinations = this.generateCombinations(rest);\n \n const combinations: string[][] = [];\n first.forEach(value => {\n restCombinations.forEach(restCombo => {\n combinations.push([value, ...restCombo]);\n });\n });\n \n return combinations;\n }\n\n /**\n * Generate flat header structure for single dimension\n */\n private generateFlatHeaderStructure(\n rowDimensions: string[],\n columnDimensions: string[],\n aggregations: any[],\n sourceData?: any[]\n ): PivotHeaderStructure {\n // Simple flat structure - existing logic\n const headerRows: PivotColumnHeader[][] = [[]];\n \n // Add headers for flat structure\n rowDimensions.forEach(dimension => {\n headerRows[0].push({\n label: this.formatColumnLabel(dimension),\n level: 0,\n colspan: 1,\n rowspan: 1\n });\n });\n\n // For single dimension, add column headers\n if (columnDimensions.length === 1) {\n // This would need the actual column values, simplified for now\n headerRows[0].push({\n label: 'Pivot Data',\n level: 0,\n colspan: aggregations.length || 1,\n rowspan: 1\n });\n }\n\n // Extract dimension values from source data if available\n const dimensionValues = columnDimensions.map(dimension => {\n if (!sourceData) return [];\n const values = new Set<string>();\n sourceData.forEach(row => {\n const value = row[dimension] != null ? String(row[dimension]) : '';\n values.add(String(value));\n });\n return Array.from(values).sort();\n });\n\n\n // Generate leaf columns for flat structure with collapsible support\n const leafColumns = this.generateLeafColumnsWithCollapsible(\n rowDimensions,\n dimensionValues,\n aggregations,\n columnDimensions\n );\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 enableGrandTotal = gridConfiguration?.config?.enableGrandTotal ?? false;\n \n if (!enableRowSubtotals && !enableGrandTotal) {\n return pivotRows;\n }\n\n let result = [...pivotRows];\n\n // Add row subtotals\n if (enableRowSubtotals) {\n result = this.addRowSubtotals(result, configuration, gridConfiguration);\n }\n\n // Add grand total row\n if (enableGrandTotal) {\n result = this.addGrandTotalRow(result, configuration, pivotColumns, gridConfiguration);\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 console.log('subtotalGroups', subtotalGroups);\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 console.log('subtotalRows', subtotalRows);\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 console.log('locationGroups', locationGroups);\n \n for (const [locationKey, rows] of locationGroups) {\n // Add all rows for this location\n result.push(...rows);\n \n // Add subtotal row if it exists for this location\n const subtotalRow = subtotalRows.get(locationKey);\n if (subtotalRow) {\n result.push(subtotalRow);\n } \n }\n \n \n return result;\n }\n\n /**\n * Add grand total row\n */\n private addGrandTotalRow(\n pivotRows: PivotRow[], \n configuration: PivotConfiguration, \n pivotColumns: string[],\n gridConfiguration?: GridConfiguration\n ): 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 return [...pivotRows, grandTotalRow];\n }\n\n /**\n * Calculate grand total values for all rows (ignores showSubtotals flag)\n */\n private calculateGrandTotalRow(\n rows: PivotRow[], \n configuration: PivotConfiguration, \n groupKey: string,\n gridConfiguration?: GridConfiguration\n ): PivotRow {\n const defaultLabel = gridConfiguration?.config?.subtotalLabel || 'Subtotal';\n const grandTotalRow: PivotRow = {\n _rowKey: `grand_total_${groupKey}`,\n _sourceCount: rows.reduce((sum, row) => sum + (row._sourceCount || 0), 0),\n _isGrandTotal: true,\n _subtotalLabel: `Grand Total`\n };\n\n // Calculate aggregated values for ALL aggregation fields per column (ignore showSubtotals)\n if (rows.length > 0) {\n // Get all column keys that contain aggregation data\n const allColumnKeys = Object.keys(rows[0]).filter(key => \n !key.startsWith('_') && \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 !key.startsWith('_') && \n configuration.aggregations.some(agg => key.includes(agg.name))\n );\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\n return subtotalRow;\n }\n\n /**\n * Apply aggregation function to array of values\n */\n private applyAggregationFunction(\n func: AggregationFunction, \n values: number[]\n ): number {\n switch (func) {\n case 'sum':\n return values.reduce((sum, val) => sum + val, 0);\n case 'avg':\n return values.length > 0 ? values.reduce((sum, val) => sum + val, 0) / values.length : 0;\n case 'count':\n return values.length;\n case 'min':\n return values.length > 0 ? Math.min(...values) : 0;\n case 'max':\n return values.length > 0 ? Math.max(...values) : 0;\n default:\n return 0;\n }\n }\n\n /**\n * Group rows by dimension values\n */\n private groupRowsByDimensions(\n rows: PivotRow[], \n dimensions: string[]\n ): Map<string, PivotRow[]> {\n const groups = new Map<string, PivotRow[]>();\n \n for (const row of rows) {\n const groupKey = dimensions\n .map(dim => row[dim])\n .join('|');\n \n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(row);\n }\n \n return groups;\n }\n\n /**\n * Export pivot data to CSV format\n */\n exportToCsv(pivotResult: PivotResult): string {\n const headers = pivotResult.columnDefinitions.map(col => col.label).join(',');\n const rows = pivotResult.data.map(row => {\n return pivotResult.columnDefinitions.map(col => {\n const value = row[col.name];\n return typeof value === 'string' && value.includes(',') \n ? `\"${value}\"` \n : value || '';\n }).join(',');\n });\n \n return [headers, ...rows].join('\\n');\n }\n\n /**\n * Initialize column group state based on configuration\n */\n/* private initializeColumnGroupState(\n configuration: PivotConfiguration, \n columnDimensions: string[]\n ): void {\n const defaultExpansion = configuration.defaultColumnGroupExpansion ?? 1;\n const columnGroups = configuration.columnGroups || [];\n \n // Reset state\n this.columnGroupState = {};\n \n // Create group configurations for each column dimension\n columnDimensions.forEach((dimension, level) => {\n const groupConfig = columnGroups.find(g => g.field === dimension) || {\n field: dimension,\n collapsible: true,\n defaultExpanded: defaultExpansion === -1 || level < defaultExpansion,\n collapsedDisplayMode: 'aggregated',\n collapsedAggregation: 'sum'\n };\n \n const groupKey = this.generateColumnGroupKey(dimension, level);\n \n this.columnGroupState[groupKey] = {\n isExpanded: groupConfig.defaultExpanded ?? true,\n level: level,\n childGroups: [],\n parentGroup: level > 0 ? this.generateColumnGroupKey(columnDimensions[level - 1], level - 1) : undefined\n };\n });\n \n // Link parent-child relationships\n Object.keys(this.columnGroupState).forEach(groupKey => {\n const group = this.columnGroupState[groupKey];\n if (group.parentGroup && this.columnGroupState[group.parentGroup]) {\n this.columnGroupState[group.parentGroup].childGroups = \n this.columnGroupState[group.parentGroup].childGroups || [];\n this.columnGroupState[group.parentGroup].childGroups!.push(groupKey);\n }\n });\n } */\n\n /**\n * Generate unique key for column group\n */\n private generateColumnGroupKey(dimension: string, level: number): string {\n return `${dimension}_level_${level}`;\n }\n\n /**\n * Toggle collapse/expand state of a column group\n */\n toggleColumnGroup(groupKey: string, configuration: PivotConfiguration): void {\n if (!this.columnGroupState[groupKey]) {\n console.warn(`Column group ${groupKey} not found`);\n return;\n }\n \n const group = this.columnGroupState[groupKey];\n group.isExpanded = !group.isExpanded;\n \n // Auto-collapse child groups when parent is collapsed\n if (!group.isExpanded && group.childGroups) {\n group.childGroups.forEach(childKey => {\n if (this.columnGroupState[childKey]) {\n this.columnGroupState[childKey].isExpanded = false;\n }\n });\n }\n \n // Auto-expand parent groups when child is expanded\n if (group.isExpanded && group.parentGroup) {\n let parentKey: string | undefined = group.parentGroup;\n while (parentKey && this.columnGroupState[parentKey]) {\n this.columnGroupState[parentKey].isExpanded = true;\n parentKey = this.columnGroupState[parentKey].parentGroup;\n }\n }\n }\n\n /**\n * Check if a column group is expanded\n */\n isColumnGroupExpanded(groupKey: string): boolean {\n return this.columnGroupState[groupKey]?.isExpanded ?? true;\n }\n\n /**\n * Get collapsed value for a column group\n */\n /* getCollapsedValue(\n groupKey: string, \n data: PivotRow[], \n configuration: PivotConfiguration,\n aggregations: any[]\n ): any {\n const group = this.columnGroupState[groupKey];\n if (!group) return null;\n \n const columnGroupConfig = configuration.columnGroups?.find(g => \n this.generateColumnGroupKey(g.field, group.level) === groupKey\n );\n \n const displayMode = columnGroupConfig?.collapsedDisplayMode || 'aggregated';\n const aggregationFunc = columnGroupConfig?.collapsedAggregation || 'sum';\n \n switch (displayMode) {\n case 'subtotal':\n // Use existing subtotal if available\n return this.calculateGroupSubtotal(groupKey, data, aggregations, aggregationFunc);\n \n case 'aggregated':\n // Calculate aggregated value for all child columns\n return this.calculateGroupAggregation(groupKey, data, aggregations, aggregationFunc);\n \n case 'first-value':\n // Return the first child column value\n return this.getFirstChildValue(groupKey, data);\n \n case 'count':\n // Return count of non-null values\n return this.getGroupValueCount(groupKey, data);\n \n default:\n return null;\n }\n } */\n\n /**\n * Calculate subtotal for a column group\n */\n private calculateGroupSubtotal(\n groupKey: string, \n data: PivotRow[], \n aggregations: any[], \n aggregationFunc: AggregationFunction\n ): number {\n // For now, sum all relevant column values\n // This could be enhanced to use existing subtotal calculations\n return this.calculateGroupAggregation(groupKey, data, aggregations, aggregationFunc);\n }\n\n /**\n * Calculate aggregated value for a column group\n */\n private calculateGroupAggregation(\n groupKey: string, \n data: PivotRow[], \n aggregations: any[], \n aggregationFunc: AggregationFunction\n ): number {\n const group = this.columnGroupState[groupKey];\n if (!group || data.length === 0) return 0;\n \n // Get all column keys that belong to this group\n const relevantColumns = this.getGroupColumnKeys(groupKey, aggregations);\n \n // Aggregate values across all rows and relevant columns\n let allValues: number[] = [];\n \n data.forEach(row => {\n relevantColumns.forEach(columnKey => {\n const value = row[columnKey];\n if (typeof value === 'number' && !isNaN(value)) {\n allValues.push(value);\n }\n });\n });\n \n return this.applyAggregationFunction(aggregationFunc, allValues);\n }\n\n /**\n * Get column keys that belong to a specific group\n */\n private getGroupColumnKeys(groupKey: string, aggregations: any[]): string[] {\n // This is a simplified implementation\n // In a real scenario, you'd map the groupKey to actual column keys\n const group = this.columnGroupState[groupKey];\n if (!group) return [];\n \n // For now, return a pattern-based approach\n // This would need to be enhanced based on actual column generation logic\n const groupField = groupKey.split('_level_')[0];\n return aggregations.map(agg => `${groupField}_${agg.name}`);\n }\n\n /**\n * Get first child value for a column group\n */\n private getFirstChildValue(groupKey: string, data: PivotRow[]): any {\n const relevantColumns = this.getGroupColumnKeys(groupKey, []);\n if (relevantColumns.length === 0 || data.length === 0) return null;\n \n return data[0][relevantColumns[0]] || null;\n }\n\n /**\n * Get count of non-null values in a column group\n */\n private getGroupValueCount(groupKey: string, data: PivotRow[]): number {\n const relevantColumns = this.getGroupColumnKeys(groupKey, []);\n \n let count = 0;\n data.forEach(row => {\n relevantColumns.forEach(columnKey => {\n if (row[columnKey] != null && row[columnKey] !== '') {\n count++;\n }\n });\n });\n \n return count;\n }\n\n /**\n * Get current column group state\n */\n getColumnGroupState(): PivotColumnGroupState {\n return { ...this.columnGroupState };\n }\n\n /**\n * Set column group state (for restoring state)\n */\n setColumnGroupState(state: PivotColumnGroupState): void {\n this.columnGroupState = { ...state };\n }\n\n /**\n * Calculate rowspan information for pivot rows to merge cells with same values\n * in earlier dimensions\n */\n calculateRowspanInfo(pivotRows: PivotRow[], rowDimensions: string[]): Map<string, { rowspan: number; skip: boolean; parentSpan: number }> {\n const rowspanInfo = new Map<string, { rowspan: number; skip: boolean; parentSpan: number }>();\n \n if (rowDimensions.length <= 1) {\n // No rowspan needed for single dimension\n return rowspanInfo;\n }\n \n for (let dimIndex = 0; dimIndex < rowDimensions.length - 1; dimIndex++) {\n const dimension = rowDimensions[dimIndex];\n let currentRowIndex = 0;\n \n while (currentRowIndex < pivotRows.length) {\n const currentRow = pivotRows[currentRowIndex];\n const currentValue = currentRow[dimension];\n // Skip subtotal and grand total rows for rowspan calculation\n if (currentRow._isSubtotal || currentRow._isGrandTotal) {\n currentRowIndex++;\n continue;\n }\n \n // Count consecutive rows with the same value for this dimension\n let spanCount = 1;\n let nextRowIndex = currentRowIndex + 1;\n \n while (nextRowIndex < pivotRows.length) {\n const nextRow = pivotRows[nextRowIndex];\n \n // Stop if we hit a subtotal or grand total row\n if (nextRow._isSubtotal || nextRow._isGrandTotal) {\n break;\n }\n \n // Check if this dimension value matches\n if (nextRow[dimension] === currentValue) {\n spanCount++;\n nextRowIndex++;\n } else {\n break;\n }\n }\n \n // Only add rowspan if we have more than one row to span\n if (spanCount > 1) {\n // First row gets the rowspan\n const firstRowKey = `${currentRowIndex}_${dimension}`;\n rowspanInfo.set(firstRowKey, { rowspan: spanCount, skip: false, parentSpan: spanCount });\n \n // Subsequent rows should be skipped (hidden)\n for (let i = 1; i < spanCount; i++) {\n const skipRowKey = `${currentRowIndex + i}_${dimension}`;\n rowspanInfo.set(skipRowKey, { rowspan: 0, skip: true, parentSpan: spanCount-i });\n }\n }\n \n // Move to the next group\n currentRowIndex = nextRowIndex;\n }\n }\n return rowspanInfo;\n }\n}","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { \n Field, \n Row, \n RowGroup, \n GridConfiguration, \n GridMode,\n GridFeatures,\n PivotConfiguration,\n PivotResult\n} from '../model/grid.model';\nimport { delay, of, Observable } from 'rxjs';\nimport { GridConfigService } from '../services/grid-config.service';\nimport { PivotTransformService } from '../services/pivot-transform.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GridStore {\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 config: {\n editable: true,\n columnResizable: true,\n columnReorderable: true,\n cellSelection: true,\n rowSelection: true,\n exportable: true,\n filtering: 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\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\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(() => this.configuration().mode || 'table');\n \n readonly isPivotMode = computed(() => this.currentMode() === 'pivot');\n \n readonly isEditingEnabled = computed(() => \n this.configuration().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 pivotDisplayData = computed(() => {\n if (this.isPivotMode() && this.pivotResult()) {\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 }\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 this._configuration.set(configuration);\n }\n\n gridConfiguration(): GridConfiguration {\n return this.configuration();\n }\n\n // Active cell methods\n setActiveCell(activeCell: any) {\n this._activeCell.set(activeCell);\n }\n\n // Loading and error methods\n setLoading(isLoading: boolean) {\n this._isLoading.set(isLoading);\n }\n\n setError(error: string | null) {\n this._error.set(error);\n }\n\n // Data fetching method\n fetchNewRowData(pageSize: number, page: number, group: RowGroup): Observable<any[]> {\n console.log(group.id, pageSize, page);\n const startIndex = (group.currentPage || 0) * pageSize;\n const endIndex = startIndex + pageSize;\n const data = this.configuration().data?.slice(startIndex, endIndex) || [];\n return of(data).pipe(delay(1000));\n }\n\n // Helper methods\n isRowSelected(rowId: string): boolean {\n return this.selectedRowIds().has(rowId);\n }\n\n isGroupSelected(groupId: string): boolean {\n const groupRows = this.rows().filter(row => row.groupId === groupId);\n return groupRows.length > 0 && \n groupRows.every(row => this.selectedRowIds().has(row.entity_id));\n }\n\n getRowsForGroup(groupId: string): Row[] {\n return this.rows().filter(row => row.groupId === groupId);\n }\n\n // Pivot methods\n setGridMode(mode: GridMode) {\n const currentConfig = this.configuration();\n const newConfig = {\n ...currentConfig,\n mode\n };\n // Validate and enforce mode-specific rules\n this._configuration.set(this.gridConfigService.validateAndEnforceConfiguration(newConfig));\n if (mode === 'pivot') {\n // Extract and set pivot configuration from main configuration\n if (currentConfig.pivot) {\n this._pivotConfiguration.set(currentConfig.pivot);\n }\n this.transformToPivot();\n }\n }\n\n updateGridConfiguration(updates: Partial<GridConfiguration>) {\n const currentConfig = this.configuration();\n const mergedConfig = {\n ...currentConfig,\n ...updates,\n // Merge nested config object properly\n config: {\n ...currentConfig.config,\n ...updates.config\n }\n };\n // Validate and enforce mode-specific rules\n this._configuration.set(this.gridConfigService.validateAndEnforceConfiguration(mergedConfig));\n }\n\n setPivotConfiguration(pivotConfig: PivotConfiguration) {\n this._pivotConfiguration.set(pivotConfig);\n // Also store in the main configuration for consistency\n this.updateGridConfiguration({ pivot: pivotConfig });\n // Auto-switch to pivot mode if pivot configuration is provided\n if (this.currentMode() !== 'pivot') {\n this.setGridMode('pivot');\n }\n // Transform data if source data is available in gridConfiguration.data\n if ((this.configuration().data || []).length > 0) {\n this.transformToPivot();\n }\n }\n\n setSourceData(data: any[]) {\n // Store data in gridConfiguration.data instead of separate signal\n this.updateGridConfiguration({ data });\n // If in pivot mode and pivot configuration exists, transform data\n if (this.isPivotMode() && this.pivotConfiguration()) {\n this.transformToPivot();\n }\n }\n\n private transformToPivot() {\n const pivotConfig = this.pivotConfiguration();\n const sourceData = this.configuration().data || [];\n \n \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 console.log('🔄 TRANSFORM DEBUG: Pivot result', result);\n this._pivotResult.set(result);\n this.setLoading(false);\n }\n } catch (error: any) {\n this.setError(`Pivot transformation failed: ${error.message}`);\n this.setLoading(false);\n }\n }\n\n clearPivot() {\n this._pivotConfiguration.set(null);\n this._pivotResult.set(null);\n this.setGridMode('table');\n }\n\n // Force refresh pivot transformation (for debugging)\n forceRefreshPivot() {\n console.log('🔄 FORCE REFRESH: Clearing pivot result and re-transforming');\n this._pivotResult.set(null);\n this.transformToPivot();\n }\n\n exportPivotToCsv(): string | null {\n const pivotResult = this.pivotResult();\n if (!pivotResult) {\n return null;\n }\n return this.pivotTransformService.exportToCsv(pivotResult);\n }\n\n validatePivotConfiguration(config: PivotConfiguration): { isValid: boolean; errors: string[] } {\n return this.gridConfigService.validatePivotConfiguration(config);\n }\n\n isFeatureEnabled(feature: keyof Omit<GridFeatures, 'subtotalPosition' | 'subtotalLabel' | 'freezeField'>): boolean {\n const config = this.configuration();\n return 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}","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 { GridStore } from './stores/grid.store';\nimport { ThemeService } from './services/theme.service';\nimport { ColumnConstraintsService } from './services/column-constraints.service';\nimport { \n Field, \n RowGroup, \n GridConfiguration, \n PivotConfiguration, \n GridMode,\n DataTypes,\n GridFeatures\n} from './model/grid.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EruGridService {\n\n constructor(\n private gridStore: GridStore,\n private themeService: ThemeService,\n private columnConstraintsService: ColumnConstraintsService\n ) { }\n \n set_table_configuration(data: GridConfiguration) {\n this.gridStore.setConfiguration(data);\n }\n \n set_table_column(data: Field[]) {\n this.gridStore.setColumns(data);\n }\n \n set_table_group(data: RowGroup[]) {\n this.gridStore.setGroups(data);\n }\n \n // Expose additional methods for external use\n get columns() {\n return this.gridStore.columns;\n }\n \n get groups() {\n return this.gridStore.groups;\n }\n \n get rows() {\n return this.gridStore.rows;\n }\n \n get selectedRowIds() {\n return this.gridStore.selectedRowIds;\n }\n \n get hasSelection() {\n return this.gridStore.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.gridStore.gridConfiguration());\n }\n \n constrainColumnWidth(width: number, column: Field | undefined) {\n return this.columnConstraintsService.constrainWidth(width, column, this.gridStore.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.gridStore.setPivotConfiguration(pivotConfig);\n \n if (sourceData && sourceData.length > 0) {\n // Store data in gridConfiguration.data for unified storage\n this.gridStore.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.gridStore.setGridMode('pivot');\n } else if (mode === 'table') {\n this.gridStore.clearPivot();\n }\n }\n\n /**\n * Update grid configuration with new settings\n */\n update_grid_configuration(updates: Partial<GridConfiguration>) {\n this.gridStore.updateGridConfiguration(updates);\n }\n\n /**\n * Enable or disable specific grid features\n */\n set_grid_features(features: Partial<GridFeatures>) {\n const currentConfig = this.gridStore.configuration();\n this.gridStore.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.gridStore.clearPivot();\n }\n\n /**\n * Export pivot data to CSV format\n */\n export_pivot_to_csv(): string | null {\n return this.gridStore.exportPivotToCsv();\n }\n\n /**\n * Validate pivot configuration\n */\n validate_pivot_configuration(config: PivotConfiguration): { isValid: boolean; errors: string[] } {\n return this.gridStore.validatePivotConfiguration(config);\n }\n\n // Getters for pivot functionality\n \n get currentMode() {\n return this.gridStore.currentMode;\n }\n\n get isPivotMode() {\n return this.gridStore.isPivotMode;\n }\n\n get pivotConfiguration() {\n return this.gridStore.pivotConfiguration;\n }\n\n get pivotResult() {\n return this.gridStore.pivotResult;\n }\n\n get displayColumns() {\n return this.gridStore.displayColumns;\n }\n\n get displayData() {\n return this.gridStore.displayData;\n }\n\n get isEditingEnabled() {\n return this.gridStore.isEditingEnabled;\n }\n\n get configuration() {\n return this.gridStore.configuration;\n }\n\n get isLoading() {\n return this.gridStore.isLoading;\n }\n\n get error() {\n return this.gridStore.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.gridStore.isFeatureEnabled(feature);\n }\n\n /**\n * Get direct access to grid store (for debugging purposes)\n */\n getGridStore() {\n return this.gridStore;\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 {GridStore} 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 '(dblclick)': 'onDoubleClick()',\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 sanitize: DomSanitizer = inject(DomSanitizer);\n private gridStore: GridStore = inject(GridStore);\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 td= model()\n currentValue = signal<string | number | null| any>(null);\n \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.gridStore.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.gridStore.columns();\n return columns?.find((columnConfig) => columnConfig.name === this.columnName()) || 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.gridStore.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 const numConfig = config as any;\n const separator = numConfig.separator;\n const decimalPlaces = numConfig.decimal;\n\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\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 console.log()\n this.currentValue.set(formattedDate);\n }\n\n ngAfterViewInit() {\n // currentValue is now automatically synchronized via effect in constructor\n }\n isActive = computed(() => this.gridStore.activeCell() === this.el.nativeElement);\n\n setActive(active: boolean): void {\n if (active) {\n this.gridStore.setActiveCell(this.el.nativeElement);\n } else {\n this.gridStore.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.gridStore.setActiveCell(this.el.nativeElement);\n // Let Angular's change detection handle the input rendering naturally\n this.focusAndPositionCursor();\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 console.log(\"Found visible input, focusing...\");\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 }\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.gridStore.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.gridStore.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}\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 {{currentValue()}}\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 {{formatNumberSignal()}}\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 {{formatNumberSignal()}}\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 {{currentValue()}}\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 {{currentValue()}}\n </div>\n }\n }\n @case ('dropdown_multi_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" #multiSelectTrigger>\n {{formattedMultiSelectValue(currentColumnWidth()) || 'Click to select'}}\n </div>\n }\n\n @case ('dropdown_single_select') {\n <div class=\"cell-display-text\" (dblclick)=\"toggleOverlayMenu($event)\" [cdkMenuTriggerFor]=\"singleSelectTrigger\" #singleSelectTrigger>\n {{currentValue()}}\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 @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 </div>\n }\n\n\n @case ('date') {\n <div class=\"cell-date-container\">\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 </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 <div>{{currentValue()}}</div>\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 <span class=\"progress-text\">{{currentValue()}}%</span>\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 </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 <span class=\"status-text\">\n {{getStatusButtonDisplay(currentValue()).text}}\n </span>\n </div>\n </button>\n }\n\n @case ('tag') {\n <div class=\"tag-container\" [cdkMenuTriggerFor]=\"tagSelectMenu\">\n\n <div class=\"tag-display\">\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 </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 <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 </div>\n }@else {\n <div class=\"cell-attachment-container\">\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 </div>\n }\n \n \n </div>\n }\n @default {\n <div class=\"cell-default-display\">\n {{value()}}\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&#64;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&#64;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&#64;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&#64;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&#64;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&#64;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 { GridStore } 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 gridStore = inject(GridStore);\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.gridStore.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.gridStore.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 { GridStore } 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 gridStore: GridStore\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.gridStore.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 { GridStore } from './stores/grid.store';\nimport { Field, RowGroup, Row, PivotRow } from './model/grid.model';\n\n\n@Component({\n selector: 'eru-grid',\n templateUrl: './eru-grid.component.html',\n styleUrls: ['./eru-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [\n DataCellComponent,\n ScrollingModule,\n CommonModule,\n MatTooltipModule,\n ResizeColumnDirective,\n ColumnDragDirective\n ],\n})\nexport class EruGridComponent implements OnInit, AfterViewInit, OnDestroy {\n public gridStore: GridStore = inject(GridStore);\n private resizeObserver: ResizeObserver | null = null;\n isColumnReordering = signal(false);\n\n @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\n @ViewChild('rowContainer') rowContainer?: ElementRef;\n\n private rowLoadQueue: { groupId: string, page: number, pageSize: number }[] = [];\n private isProcessingQueue = false;\n \n // Computed properties using the new GridStore\n groupedRows = computed(() => this.createGroupedRows());\n columns = computed(() => this.gridStore.columns());\n selectedRowIds = this.gridStore.selectedRowIds;\n \n // Track current scroll index for pivot mode\n currentPivotScrollIndex = signal(0);\n firstDataRowIndex = signal(0);\n \n // Enhanced rowspan tracking for virtual scrolling\n private _virtualRowspanCache: Map<string, {\n firstVisibleRowIndex: number;\n actualRowspan: number;\n virtualRowspan: number;\n parentValue: any;\n isContinuation: boolean;\n }> = new Map();\n \n // Gridlines configuration computed properties\n showColumnLines = computed(() => this.gridStore.configuration().config.showColumnLines ?? false);\n showRowLines = computed(() => this.gridStore.configuration().config.showRowLines ?? false);\n gridLineColor = computed(() => this.gridStore.configuration().styles?.gridLineColor ?? '#e0e0e0');\n gridLineWidth = computed(() => this.gridStore.configuration().styles?.gridLineWidth ?? 1);\n maxDepth = computed(() => this.gridStore.pivotResult()?.headerStructure?.maxDepth ?? 0);\n //maxDepth = signal(0);\n // Subtotal and Grand Total styling computed properties\n subtotalStyle = computed(() => this.gridStore.configuration().styles?.subtotalStyle ?? 'bold');\n grandTotalStyle = computed(() => this.gridStore.configuration().styles?.grandTotalStyle ?? 'bold');\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 * Check if a specific row is the first visible row by comparing with scroll index\n * @param rowIndex The index of the row to check\n * @returns true if this row is the first visible row\n */\n isRowFirstVisible(rowIndex: number): boolean {\n return this.isFirstVisiblePivotRow(rowIndex);\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 // Get scroll information using the helper method\n //const scrollInfo = this.getCurrentScrollInfo();\n \n /* console.log('=== SCROLL ANALYSIS ===');\n console.log('Rendered range (DOM):', scrollInfo.renderedRange.start, 'to', scrollInfo.renderedRange.end - 1, `(${scrollInfo.renderedRange.count} items)`);\n console.log('Visible range (screen):', scrollInfo.visibleRange.start, 'to', scrollInfo.visibleRange.end - 1, `(${scrollInfo.visibleRange.count} items)`);\n console.log('CDK Viewport size:', scrollInfo.cdkViewportSize, 'items');\n console.log('Actual visible count:', scrollInfo.actualVisibleCount, 'items');\n console.log('Viewport height:', scrollInfo.viewportHeight, 'px');\n console.log('Scroll index:', scrollInfo.scrollIndex);\n console.log('Total data length:', scrollInfo.dataLength); */\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 \n /**\n * Get the actual data index of the first visible row in the pivot data array\n * @returns The actual index in the pivot data array, or -1 if not available\n */\n getFirstVisiblePivotDataIndex(): number {\n return this.firstDataRowIndex();\n }\n\n /**\n * Get the truly visible range (what's actually visible on screen)\n * @returns Object with start, end, and count of visible items\n */\n getVisibleRange(): { start: number; end: number; count: number } {\n if (!this.viewport) {\n return { start: 0, end: 0, count: 0 };\n }\n \n const scrollIndex = this.currentPivotScrollIndex();\n const dataLength = this.viewport.getDataLength();\n \n // Calculate actual visible items based on viewport height and item size\n const actualVisibleCount = this.getActualVisibleItemCount();\n \n const visibleStart = scrollIndex;\n const visibleEnd = Math.min(scrollIndex + actualVisibleCount, dataLength);\n const visibleCount = visibleEnd - visibleStart;\n \n return { start: visibleStart, end: visibleEnd, count: visibleCount };\n }\n\n /**\n * Calculate the actual number of items visible in the viewport\n * This accounts for headers, padding, and actual viewport dimensions\n */\n private getActualVisibleItemCount(): number {\n if (!this.viewport) return 0;\n \n const viewportElement = this.viewport.elementRef.nativeElement;\n const viewportRect = viewportElement.getBoundingClientRect();\n const itemSize = 50; // This matches [itemSize]=\"50\" in template\n \n // Get the actual available height for data rows\n const availableHeight = viewportRect.height;\n \n // Calculate how many items can fit in the available height\n const visibleCount = Math.floor(availableHeight / itemSize);\n \n return Math.max(1, visibleCount); // At least 1 item should be visible\n }\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 /**\n * Get current scroll and visibility information for debugging\n * @returns Object with current scroll state and ranges\n */\n getCurrentScrollInfo(): {\n scrollIndex: number;\n visibleRange: { start: number; end: number; count: number };\n renderedRange: { start: number; end: number; count: number };\n cdkViewportSize: number;\n actualVisibleCount: number;\n dataLength: number;\n viewportHeight: number;\n } {\n if (!this.viewport) {\n return {\n scrollIndex: 0,\n visibleRange: { start: 0, end: 0, count: 0 },\n renderedRange: { start: 0, end: 0, count: 0 },\n cdkViewportSize: 0,\n actualVisibleCount: 0,\n dataLength: 0,\n viewportHeight: 0\n };\n }\n\n const viewportElement = this.viewport.elementRef.nativeElement;\n const viewportRect = viewportElement.getBoundingClientRect();\n\n return {\n scrollIndex: this.currentPivotScrollIndex(),\n visibleRange: this.getVisibleRange(),\n renderedRange: this.getRenderedRange(),\n cdkViewportSize: this.viewport.getViewportSize(),\n actualVisibleCount: this.getActualVisibleItemCount(),\n dataLength: this.viewport.getDataLength(),\n viewportHeight: viewportRect.height\n };\n }\n \n // Update CSS custom properties when config changes\n private updateGridLineStyles() {\n if (this.rowContainer?.nativeElement) {\n const element = this.rowContainer.nativeElement;\n element.style.setProperty('--grid-line-color', this.gridLineColor());\n element.style.setProperty('--grid-line-width', `${this.gridLineWidth()}px`);\n }\n }\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 // Animation handling can be managed through signals now\n \n // Effect to update gridline styles when configuration changes\n effect(() => {\n this.updateGridLineStyles();\n });\n \n // Effect to clear rowspan cache when pivot data changes\n effect(() => {\n // Track pivot result changes\n this.gridStore.pivotResult();\n // Clear cache when pivot data changes\n this.clearRowspanCache();\n });\n }\n\n ngOnInit() {\n this.initializeColumnWidths();\n this.initializeGroups();\n this.firstDataRowIndex.set(this.maxDepth()+1);\n }\n\n ngAfterViewInit() {\n /* if (this.viewport) {\n this.viewport.checkViewportSize();\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.recalculateViewport();\n });\n\n if (this.rowContainer?.nativeElement) {\n this.resizeObserver.observe(this.rowContainer.nativeElement);\n }\n\n setTimeout(() => {\n if (this.viewport) {\n this.checkAndLoadMoreRows();\n\n this.viewport.scrolledIndexChange.subscribe(index => {\n \n this.onScroll(index);\n this.checkAndLoadMoreRows();\n });\n }\n }, 100);\n\n setTimeout(() => {\n this.adjustColumnWidths();\n }, 200);\n\n setTimeout(() => {\n this.ensureHorizontalScroll();\n }, 200);\n \n // Initialize gridline styles after view is ready\n this.updateGridLineStyles();\n \n // Setup scroll synchronization for pivot mode\n this.setupScrollSync();*/\n } \n\n ngOnDestroy() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n private createGroupedRows(): GroupItem[] {\n const rows = this.gridStore.rows();\n const groups = this.gridStore.groups();\n const flattenedRows: GroupItem[] = [];\n\n groups.forEach(group => {\n // Add group header\n flattenedRows.push({ type: 'header', group });\n\n if (group.isExpanded) {\n const groupRows = rows.filter(row => row.groupId === group.id);\n flattenedRows.push({ type: 'table-header', group });\n\n groupRows.forEach(row => {\n flattenedRows.push({ type: 'row', group, row });\n });\n\n if (group.isLoading) {\n const ghostRowCount = 5;\n for (let i = 0; i < ghostRowCount; i++) {\n flattenedRows.push({\n type: 'ghost-loading',\n group\n });\n }\n }\n\n flattenedRows.push({ type: 'row-place-holder', group });\n }\n });\n\n return flattenedRows;\n }\n\n\n // Column observable is now handled by GridStore signals\n\n\n\n\n private recalculateViewport() {\n if (this.viewport) {\n this.viewport.checkViewportSize();\n this.changeDetectorRef.markForCheck();\n }\n }\n\n initializeGroups() {\n this.fetchInitialRows();\n }\n\n private fetchInitialRows() {\n this.gridStore.groups().forEach(group => {\n if (group.isExpanded) {\n this.fetchRowsForGroup(group.id, 0, group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE);\n }\n });\n }\n\n fetchRowsForGroup(groupId: string, page: number, pageSize: number = this.ROWS_PER_PAGE): Promise<void> {\n return new Promise((resolve, reject) => {\n const group = this.gridStore.groups().find(g => g.id === groupId);\n if (!group || !group.hasMoreRows) {\n resolve();\n return;\n }\n\n if (group.isLoading) {\n resolve();\n return;\n }\n\n this.gridStore.updateGroupLoadingState(groupId, true);\n\n const skip = page * pageSize;\n\n const loadTimeout = setTimeout(() => {\n this.gridStore.updateGroupLoadingState(groupId, false);\n reject(new Error('Task loading timed out'));\n }, 10000);\n\n this.gridStore.fetchNewRowData(pageSize, skip, group).subscribe({\n next: (response) => {\n clearTimeout(loadTimeout);\n\n if (!response || response.length === 0) {\n this.gridStore.updateGroupAfterLoading(groupId, 0, true);\n resolve();\n return;\n }\n\n const newRows: any[] = this.normalizeRowData(\n response.map((r: any) => ({ ...r, groupId })),\n group\n );\n\n this.gridStore.addRows(newRows);\n this.gridStore.updateGroupAfterLoading(groupId, newRows.length);\n this.changeDetectorRef.markForCheck();\n\n resolve();\n },\n error: (error) => {\n clearTimeout(loadTimeout);\n console.error(`Error loading tasks for group ${groupId}:`, error);\n \n this.gridStore.updateGroupLoadingState(groupId, false);\n this.markGroupAsNoMoreRows(groupId);\n \n reject(error);\n }\n });\n });\n }\n\n // Group loading state is now managed by GridStore\n private updateGroupLoadingState(groupId: string, isLoading: boolean) {\n this.gridStore.updateGroupLoadingState(groupId, isLoading);\n }\n\n // Group after loading is now managed by GridStore\n private updateGroupAfterLoading(\n groupId: string, \n loadedCount: number, \n fullyExhausted: boolean = false\n ) {\n this.gridStore.updateGroupAfterLoading(groupId, loadedCount, fullyExhausted);\n }\n\n onScroll(scrollIndex: number) {\n const groups = this.gridStore.groups();\n const visibleGroups = this.getVisibleGroups();\n\n visibleGroups.forEach(group => {\n if (\n group.isExpanded && \n group.hasMoreRows && \n !group.isLoading\n ) {\n this.checkGroupRowLoading(group);\n }\n });\n\n this.checkAndLoadMoreRows();\n }\n\n\n private getVisibleGroups(): RowGroup[] {\n if (!this.viewport) return [];\n\n const renderedRange = this.viewport.getRenderedRange();\n const visibleGroups = new Set<string>();\n\n for (let i = renderedRange.start; i < renderedRange.end; i++) {\n const groupItem = this.getGroupItemAtIndex(i);\n if (groupItem?.group) {\n visibleGroups.add(groupItem.group.id);\n }\n }\n\n return Array.from(visibleGroups)\n .map(groupId => \n this.gridStore.groups().find(g => g.id === groupId)\n )\n .filter((group): group is RowGroup => group !== undefined);\n }\n\n\n private getGroupItemAtIndex(index: number): GroupItem | undefined {\n const groupItems = this.createGroupedRows();\n return groupItems[index];\n }\n\n\n private checkAndLoadMoreRows() {\n if (!this.viewport) return;\n\n const renderedRange = this.viewport.getRenderedRange();\n const dataLength = this.viewport.getDataLength();\n\n\n const isNearEnd = renderedRange.end >= (dataLength - this.SCROLL_THRESHOLD);\n\n if (isNearEnd) {\n this.intelligentRowLoading();\n }\n }\n\n\n private intelligentRowLoading() {\n const visibleGroups = this.getVisibleGroups();\n\n const groupsToLoad = visibleGroups.filter(group => \n group.isExpanded && \n group.hasMoreRows && \n !group.isLoading && \n !this.lastLoadedGroupIds.has(group.id) \n );\n\n const sortedGroupsToLoad = groupsToLoad.sort((a, b) => \n (a.currentLoadedRows || 0) - (b.currentLoadedRows || 0)\n );\n\n if (sortedGroupsToLoad.length > 0) {\n const groupToLoad = sortedGroupsToLoad[0];\n \n this.lastLoadedGroupIds.add(groupToLoad.id);\n this.queueRowLoading(groupToLoad);\n\n setTimeout(() => {\n this.lastLoadedGroupIds.delete(groupToLoad.id);\n }, 5000); \n }\n }\n\n\n private checkGroupRowLoading(group: RowGroup) {\n \n const shouldLoadRows = \n group.currentLoadedRows < group.totalRowCount &&\n !this.lastLoadedGroupIds.has(group.id);\n\n if (shouldLoadRows) {\n \n this.queueRowLoading(group);\n }\n }\n\n\n private queueRowLoading(group?: RowGroup) {\n if (!group) {\n const groups = this.gridStore.groups();\n group = groups.find(g => \n g.isExpanded && \n g.hasMoreRows && \n !g.isLoading\n );\n }\n\n if (group) {\n this.rowLoadQueue.push({\n groupId: group.id,\n page: group.currentPage || 0,\n pageSize: group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE\n });\n\n this.processRowLoadQueue();\n }\n }\n\n private adjustColumnWidths() {\n // Disabled: This method was constraining columns to fit container width\n // Instead, let columns maintain their configured widths and allow horizontal scroll\n if (this.viewport && this.rowContainer) {\n const table = this.rowContainer.nativeElement.querySelector('.row-table');\n if (table) {\n // Calculate total width of all columns\n const columns = table.querySelectorAll('th');\n let totalWidth = 0;\n \n columns.forEach((col: HTMLElement) => {\n // Don't constrain width - let it use the configured width\n const configuredWidth = col.style.width;\n if (configuredWidth) {\n totalWidth += parseInt(configuredWidth) || 150;\n } else {\n totalWidth += 150; // default width\n }\n });\n \n // Set table minimum width to sum of all column widths\n table.style.minWidth = `${totalWidth}px`;\n }\n }\n }\n\n\n private ensureHorizontalScroll() {\n if (this.rowContainer && this.viewport) {\n const tableWrapper = this.rowContainer.nativeElement.querySelector('.table-wrapper');\n const table = this.rowContainer.nativeElement.querySelector('.row-table');\n const container = this.rowContainer.nativeElement;\n \n if (tableWrapper && table) {\n // Fix container height and overflow to ensure scrollbar is visible\n container.style.setProperty('height', '600px', 'important');\n container.style.setProperty('overflow', 'visible', 'important');\n container.style.setProperty('overflow-x', 'visible', 'important');\n container.style.setProperty('overflow-y', 'visible', 'important');\n \n // Force table layout and width styles to override old compiled CSS\n table.style.setProperty('table-layout', 'auto', 'important');\n table.style.setProperty('width', 'auto', 'important');\n table.style.setProperty('min-width', 'max-content', 'important');\n \n // Ensure the viewport handles horizontal scrolling with proper settings\n const viewportEl = this.viewport!.elementRef.nativeElement;\n viewportEl.style.setProperty('overflow-x', 'auto', 'important');\n viewportEl.style.setProperty('overflow-y', 'auto', 'important');\n \n // Calculate total column width based on configured widths\n const columns = this.gridStore.columns();\n const totalWidth = columns.reduce((sum, col) => sum + (col.field_size || 150), 0);\n const checkboxWidth = 50; // checkbox column width\n const finalWidth = totalWidth + checkboxWidth;\n \n // Set table minimum width to force horizontal scroll if needed\n table.style.setProperty('min-width', `${finalWidth}px`, 'important');\n tableWrapper.style.setProperty('min-width', `${finalWidth}px`, 'important');\n }\n }\n }\n\n\n trackByColumnFn(index: number, column: Field): string {\n return column.name;\n }\n\n\n trackByGroupItemFn(index: number, groupItem: GroupItem): string {\n switch (groupItem.type) {\n case 'header':\n return `header-${groupItem.group?.id}`;\n case 'row':\n return `row-${groupItem.row?.entity_id}`;\n case 'ghost-loading':\n return `ghost-${groupItem.group?.id}-${index}`;\n case 'row-place-holder':\n return `separator-${groupItem.group?.id}`;\n default:\n return `${groupItem.type}-${index}`;\n }\n }\n\n trackByPivotRowFn(index: number, pivotRow: PivotRow): string {\n return pivotRow._rowKey || `pivot-row-${index}`;\n }\n\n trackByHeaderFn(index: number, header: any): string {\n return `${header.level}-${header.label}-${index}`;\n }\n\n // Nested header support methods\n hasNestedHeaders(): boolean {\n const pivotResult = this.gridStore.pivotResult();\n return !!(pivotResult?.headerStructure && pivotResult.headerStructure.maxDepth > 1);\n }\n\n getHeaderRows(): any[][] {\n const pivotResult = this.gridStore.pivotResult();\n return pivotResult?.headerStructure?.headerRows || [];\n }\n\n getLeafColumns(): Field[] {\n const pivotResult = this.gridStore.pivotResult();\n if (pivotResult?.headerStructure?.leafColumns) {\n return pivotResult.headerStructure.leafColumns;\n }\n // Fallback to regular columns\n return this.gridStore.displayColumns();\n }\n\n isRowDimensionHeader(header: any): boolean {\n // Row dimension headers typically have rowspan > 1 and are in the first few columns\n return header.rowspan > 1;\n }\n\n getPivotGridColumns(): string {\n const columns = this.getLeafColumns();\n return columns.map(col => `${col.field_size}px`).join(' ');\n }\n\n\n private initializeColumnWidths() {\n 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\n this.gridStore.setColumns(normalizedColumns);\n }\n\n\n private measureAndSetContainerDimensions() {\n if (this.rowContainer && this.rowContainer.nativeElement) {\n const container = this.rowContainer.nativeElement;\n container.style.height = `${container.offsetHeight}px`;\n container.style.width = `${container.offsetWidth}px`;\n }\n }\n\n // Enhanced method to normalize task data\n private normalizeRowData(rows: any[], group?: RowGroup): any[] {\n return rows.map(row => ({\n ...row,\n\n groupTitle: group?.title,\n\n displayValue: this.getDisplayValue(row),\n height: 50 \n }));\n }\n\n\n private getDisplayValue(row: any, column?: string): string {\n if (!column) {\n return this.getGenericRowDisplay(row);\n }\n\n const value = row[column];\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value.trim();\n if (typeof value === 'number') return value.toString();\n \n return JSON.stringify(value);\n }\n\n\n private getGenericRowDisplay(row: any): string {\n const displayProps = ['title', 'id', 'status'];\n return displayProps\n .map(prop => row[prop])\n .filter(value => value != null)\n .join(' - ')\n .trim();\n }\n\n toggleRowSelection(event: Event, row: any) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n const rowId = row.id;\n\n if (checkbox.checked) {\n this.gridStore.selectRow(rowId);\n } else {\n this.gridStore.deselectRow(rowId);\n }\n }\n\n\n toggleGroupSelection(event: Event, groupId: string) {\n event.stopPropagation();\n const checkbox = event.target as HTMLInputElement;\n\n if (checkbox.checked) {\n this.gridStore.selectAllRowsInGroup(groupId);\n } else {\n this.gridStore.deselectAllRowsInGroup(groupId);\n }\n }\n\n\n toggleAllGroups(event: Event) {\n const checkbox = event.target as HTMLInputElement;\n\n if (checkbox.checked) {\n this.gridStore.rows().forEach(row => this.gridStore.selectRow(row.entity_id));\n } else {\n this.gridStore.clearSelection();\n }\n }\n\n\n isRowSelected(rowId?: string): boolean {\n return rowId ? this.gridStore.isRowSelected(rowId) : false;\n }\n\n\n isGroupSelected(groupId: string): boolean {\n return this.gridStore.isGroupSelected(groupId);\n }\n\n\n isAllGroupsSelected(): boolean {\n const allRows = this.gridStore.rows();\n return allRows.length > 0 &&\n allRows.every(row =>\n this.gridStore.isRowSelected(row.entity_id)\n );\n }\n\n\n getSelectedRows(): any[] {\n return Array.from(this.gridStore.selectedRowIds());\n }\n\n\n private markGroupAsNoMoreRows(groupId: string) {\n // This functionality is now handled by GridStore.updateGroupAfterLoading\n this.gridStore.updateGroupAfterLoading(groupId, 0, true);\n }\n\n toggleGroupExpansion(groupId: string) {\n const group = this.gridStore.groups().find(g => g.id === groupId);\n if (!group) return;\n\n const newExpandedState = !group.isExpanded;\n this.gridStore.toggleGroupExpansion(groupId);\n\n if (newExpandedState && (!group.rows || group.rows.length === 0)) {\n this.fetchRowsForGroup(groupId, 0, group.totalRowCount < this.ROWS_PER_PAGE ? group.totalRowCount : this.ROWS_PER_PAGE)\n .catch(error => {\n console.error(`Error loading rows for expanded group ${groupId}:`, error);\n });\n }\n }\n\n\n private processRowLoadQueue() {\n \n if (this.isProcessingQueue) return;\n\n \n if (this.rowLoadQueue.length === 0) {\n this.isProcessingQueue = false;\n return;\n }\n\n\n this.isProcessingQueue = true;\n\n \n const nextLoad = this.rowLoadQueue.shift();\n\n if (nextLoad) {\n \n this.fetchRowsForGroup(nextLoad.groupId, nextLoad.page, nextLoad.pageSize)\n .then(() => {\n \n this.isProcessingQueue = false;\n this.processRowLoadQueue();\n })\n .catch(error => {\n console.error('Error loading rows:', error);\n this.isProcessingQueue = false;\n this.processRowLoadQueue();\n });\n }\n }\n\n // Collapsible column methods\n \n /**\n * Toggle collapse/expand state of a column group\n */\n toggleColumnGroup(groupKey: string) {\n const pivotTransformService = this.gridStore.getPivotTransformService();\n const configuration = this.gridStore.pivotConfiguration();\n \n if (pivotTransformService && configuration) {\n pivotTransformService.toggleColumnGroup(groupKey, configuration);\n // Regenerate pivot data with new collapse state\n this.gridStore.regeneratePivotData();\n }\n }\n\n /**\n * Check if a column group is expanded\n */\n isColumnGroupExpanded(groupKey: string): boolean {\n const pivotTransformService = this.gridStore.getPivotTransformService();\n return pivotTransformService?.isColumnGroupExpanded(groupKey) ?? true;\n }\n\n // Rowspan functionality\n \n /**\n * Get rowspan information for pivot table cells\n */\n private _rowspanInfo: Map<string, { rowspan: number; skip: boolean; parentSpan: number }> | null = null;\n \n /**\n * Debug counter for sticky column debugging\n */\n private _stickyDebugCount: number = 0;\n \n getRowspanInfo(): Map<string, { rowspan: number; skip: boolean; parentSpan: number }> {\n if (!this._rowspanInfo) {\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 pivotResult.data, \n pivotConfig.rows\n );\n } else {\n this._rowspanInfo = new Map();\n }\n }\n return this._rowspanInfo;\n }\n \n /**\n * Clear rowspan cache when pivot data changes\n */\n clearRowspanCache() {\n this._rowspanInfo = null;\n this._virtualRowspanCache.clear();\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 const cacheKey = `${columnName}_${visibleRowIndex}`;\n \n // Check cache first\n if (this._virtualRowspanCache.has(cacheKey)) {\n const cached = this._virtualRowspanCache.get(cacheKey)!;\n return cached.virtualRowspan >= 1 ? cached.virtualRowspan : null;\n }\n \n const pivotData = this.gridStore.pivotDisplayData();\n const fullPivotData = this.gridStore.pivotResult()?.data || [];\n // const rowspanInfo = this.getRowspanInfo();\n \n if (!pivotData || pivotData.length === 0 || !fullPivotData || fullPivotData.length === 0) {\n return null;\n }\n \n // Find the actual row index in the full dataset\n const currentVisibleRow = pivotData[visibleRowIndex];\n if (!currentVisibleRow) {\n return null;\n }\n \n let actualRowIndex = -1;\n for (let i = 0; i < fullPivotData.length; i++) {\n if (fullPivotData[i] === currentVisibleRow) {\n actualRowIndex = i;\n break;\n }\n }\n \n if (actualRowIndex === -1) {\n return null;\n }\n \n // Check if this row has a direct rowspan\n const currentKey = `${actualRowIndex}_${columnName}`;\n const currentInfo = rowspanInfo.get(currentKey);\n \n if (currentInfo?.rowspan && currentInfo?.rowspan || 1 > 0) {\n // This row has a direct rowspan - calculate virtual rowspan\n const actualRowspan = currentInfo?.rowspan || 1;\n const remainingRows = fullPivotData.length - actualRowIndex;\n const visibleRowsRemaining = pivotData.length - visibleRowIndex;\n \n // Virtual rowspan is limited by what's visible\n const virtualRowspan = Math.min(actualRowspan, remainingRows, visibleRowsRemaining);\n \n // Cache the result\n this._virtualRowspanCache.set(cacheKey, {\n firstVisibleRowIndex: visibleRowIndex,\n actualRowspan: actualRowspan,\n virtualRowspan: virtualRowspan,\n parentValue: currentVisibleRow[columnName],\n isContinuation: false\n });\n \n return virtualRowspan > 1 ? virtualRowspan : null;\n }\n \n // This row doesn't have a direct rowspan - check if it should inherit from a parent\n const virtualParentInfo = this.findVirtualParent(actualRowIndex, columnName, fullPivotData, rowspanInfo);\n \n if (virtualParentInfo) {\n // Cache the result\n this._virtualRowspanCache.set(cacheKey, {\n firstVisibleRowIndex: virtualParentInfo?.firstVisibleRowIndex || 0,\n actualRowspan: virtualParentInfo?.actualRowspan || 1,\n virtualRowspan: virtualParentInfo?.virtualRowspan || 1,\n parentValue: virtualParentInfo?.parentValue || null,\n isContinuation: true\n });\n \n return virtualParentInfo?.virtualRowspan || 1 > 1 ? virtualParentInfo?.virtualRowspan || 1 : null;\n }\n \n // No rowspan found\n this._virtualRowspanCache.set(cacheKey, {\n firstVisibleRowIndex: visibleRowIndex,\n actualRowspan: 1,\n virtualRowspan: 1,\n parentValue: null,\n isContinuation: false\n });\n \n return null;\n }\n \n /**\n * Find virtual parent information for cells that inherit rowspan from a parent row\n */\n private findVirtualParent(actualRowIndex: number, columnName: string, fullPivotData: any[], rowspanInfo: Map<string, { rowspan: number; skip: boolean }>): {\n firstVisibleRowIndex: number;\n actualRowspan: number;\n virtualRowspan: number;\n parentValue: any;\n } | null {\n // Look backwards to find the parent row that started this rowspan group\n let parentRowIndex = actualRowIndex - 1;\n \n while (parentRowIndex >= 0) {\n const parentKey = `${parentRowIndex}_${columnName}`;\n const parentInfo = rowspanInfo.get(parentKey);\n \n // Found the parent row that has the actual value\n if (parentInfo?.rowspan && parentInfo.rowspan > 0) {\n // Check if current row is within the rowspan range of this parent\n const rowspanEndIndex = parentRowIndex + parentInfo.rowspan - 1;\n \n if (actualRowIndex <= rowspanEndIndex) {\n // Get the actual value from the full dataset\n const parentRow = fullPivotData[parentRowIndex];\n \n if (parentRow) {\n // Calculate how many rows of the rowspan are visible in current viewport\n const remainingRowspan = rowspanEndIndex - actualRowIndex + 1;\n const pivotData = this.gridStore.pivotDisplayData();\n const visibleRowsCount = Math.min(remainingRowspan, pivotData.length - this.currentPivotScrollIndex());\n \n // Find the first visible row index for this column\n const firstVisibleRowIndex = this.findFirstVisibleRowForColumn(columnName, parentRowIndex, fullPivotData, rowspanInfo);\n \n return {\n firstVisibleRowIndex: firstVisibleRowIndex,\n actualRowspan: parentInfo.rowspan,\n virtualRowspan: visibleRowsCount,\n parentValue: parentRow[columnName]\n };\n }\n }\n break; // Found parent but current row is outside its range\n }\n parentRowIndex--;\n }\n \n return null;\n }\n \n /**\n * Find the first visible row index that should show the value for a given column\n */\n private findFirstVisibleRowForColumn(columnName: string, parentRowIndex: number, fullPivotData: any[], rowspanInfo: Map<string, { rowspan: number; skip: boolean }>): number {\n const pivotData = this.gridStore.pivotDisplayData();\n const scrollIndex = this.currentPivotScrollIndex();\n \n // Find the parent row in the visible data\n const parentRow = fullPivotData[parentRowIndex];\n if (!parentRow) return scrollIndex;\n \n // Look for the parent row in the visible data\n for (let i = scrollIndex; i < pivotData.length; i++) {\n if (pivotData[i] === parentRow) {\n return i;\n }\n }\n \n // If parent row is not visible, return the first visible row\n return scrollIndex;\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 (columnName === 'priority' && rowIndex > 651 && rowIndex < 656) {\n console.log('shouldSkipCell', rowIndex, columnName, this.isFirstVisiblePivotRow(rowIndex), this.getRowspanInfo().get(`${rowIndex}_${columnName}`));\n }\n if (this.isFirstVisiblePivotRow(rowIndex) && !(currentRowspan > previousRowspan)) {\n \n if (columnName === 'priority' && rowIndex > 651 && rowIndex < 656) {\n console.log('inside 1');\n }\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.getFirstVisiblePivotDataIndex()) {\n if (columnName === 'priority' && rowIndex > 651 && rowIndex < 656) {\n console.log('inside 2a' , currentRowspan , previousRowspan);\n }\n return false;\n } else {\n if (columnName === 'priority' && rowIndex > 651 && rowIndex < 656) {\n console.log('inside 2b' , this.getRowspanInfo().get(`${rowIndex}_${columnName}`));\n }\n return true;\n }\n }\n } else if (!this.getRowspanInfo().get(`${rowIndex}_${columnName}`)) {\n if (columnName === 'priority' && rowIndex > 651 && rowIndex < 656) {\n console.log('inside 3');\n }\n return false;\n } else {\n if (columnName === 'priority' && rowIndex > 651 && rowIndex < 656) {\n console.log('inside 4');\n }\n return true;\n } \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 // First try to get the direct value\n \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 private setupScrollSync() {\n setTimeout(() => {\n if (!this.gridStore.isPivotMode()) return;\n \n if (this.gridStore.isFreezeEnabled()) {\n // Setup scroll sync for split layout (frozen + scrollable)\n const scrollableHeader = document.querySelector('.pivot-scrollable-header');\n const scrollableViewport = document.querySelector('.pivot-scrollable-viewport');\n const frozenViewport = document.querySelector('.pivot-frozen-viewport');\n \n if (scrollableHeader && scrollableViewport && frozenViewport) {\n let isScrolling = false;\n \n // Sync horizontal scroll between scrollable header and data\n scrollableViewport.addEventListener('scroll', () => {\n if (!isScrolling) {\n isScrolling = true;\n // Sync horizontal scroll to header\n (scrollableHeader as HTMLElement).scrollLeft = (scrollableViewport as HTMLElement).scrollLeft;\n // Sync vertical scroll to frozen section\n (frozenViewport as HTMLElement).scrollTop = (scrollableViewport as HTMLElement).scrollTop;\n requestAnimationFrame(() => {\n isScrolling = false;\n });\n }\n });\n \n // Sync header scroll to data scroll\n scrollableHeader.addEventListener('scroll', () => {\n if (!isScrolling) {\n isScrolling = true;\n (scrollableViewport as HTMLElement).scrollLeft = (scrollableHeader as HTMLElement).scrollLeft;\n requestAnimationFrame(() => {\n isScrolling = false;\n });\n }\n });\n \n // Sync frozen viewport vertical scroll to scrollable viewport\n frozenViewport.addEventListener('scroll', () => {\n if (!isScrolling) {\n isScrolling = true;\n (scrollableViewport as HTMLElement).scrollTop = (frozenViewport as HTMLElement).scrollTop;\n requestAnimationFrame(() => {\n isScrolling = false;\n });\n }\n });\n \n console.log('Scroll sync setup completed for pivot split layout (freeze enabled)');\n }\n } else {\n // Setup scroll sync for single table layout (no freeze)\n const singleHeader = document.querySelector('.pivot-single-layout .pivot-header-section');\n const singleViewport = document.querySelector('.pivot-single-layout .pivot-viewport');\n \n if (singleHeader && singleViewport) {\n let isScrolling = false;\n \n // Sync horizontal scroll between header and data\n singleViewport.addEventListener('scroll', () => {\n if (!isScrolling) {\n isScrolling = true;\n (singleHeader as HTMLElement).scrollLeft = (singleViewport as HTMLElement).scrollLeft;\n requestAnimationFrame(() => {\n isScrolling = false;\n });\n }\n });\n \n // Sync header scroll to data scroll\n singleHeader.addEventListener('scroll', () => {\n if (!isScrolling) {\n isScrolling = true;\n (singleViewport as HTMLElement).scrollLeft = (singleHeader as HTMLElement).scrollLeft;\n requestAnimationFrame(() => {\n isScrolling = false;\n });\n }\n });\n \n console.log('Scroll sync setup completed for pivot single layout (freeze disabled)');\n }\n }\n }, 200);\n }\n\n}\n\n// Interfaces moved to list.model.ts\ninterface GroupItem {\n type: 'header' | 'row' | 'table-header' | 'row-place-holder' | 'ghost-loading';\n group?: RowGroup;\n row?: Row;\n}\n","<div style=\"background: #f0f0f0; font-size: 12px; border-bottom: 1px solid #ccc;\">\n First Visible Row: Virtual Index {{currentPivotScrollIndex()}} | \n Data Index {{getFirstVisiblePivotDataIndex()}} | \n Total Rows {{gridStore.pivotDisplayData().length}}\n</div>\n<div class=\"incremental-row-container eru-grid\" #rowContainer \n [class.show-column-lines]=\"showColumnLines()\" \n [class.show-row-lines]=\"showRowLines()\"\n [class.pivot-mode]=\"gridStore.isPivotMode()\"\n [class.table-mode]=\"!gridStore.isPivotMode()\">\n \n <!-- Pivot Mode Template -->\n <ng-container *ngIf=\"gridStore.isPivotMode(); else tableMode\">\n <div class=\"pivot-container\" style=\"display: flex; flex-direction: column; height: 100%; width: 100%;\">\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 \n <!-- Virtual Scrolled Table Body -->\n <div style=\"flex: 1; overflow: hidden;\">\n <cdk-virtual-scroll-viewport\n [itemSize]=\"50\"\n class=\"viewport pivot-viewport\"\n (scrolledIndexChange)=\"onPivotScroll($event)\"\n style=\"height: 100%; overflow: auto;\">\n <table class=\"eru-grid-table pivot-table\" style=\"width: 100%;\">\n <!-- Hidden column sizing row to match header -->\n <tr style=\"visibility:hidden; height:0;\">\n <th *ngFor=\"let column of getLeafColumns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n style=\"padding:0; margin:0; border:none; height:0;\">\n </th>\n </tr>\n\n <ng-container *ngIf=\"hasNestedHeaders(); else simpleHeader\">\n <tr *ngFor=\"let headerRow of getHeaderRows(); let rowIndex = index\" \n class=\"pivot-header\" \n [class.pivot-header-level]=\"'level-' + rowIndex\">\n <th *ngFor=\"let header of headerRow; trackBy: trackByHeaderFn; let colIndex = index\"\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.sticky-column]=\"isStickyColumn(header.name, colIndex)\"\n [class.expanded]=\"header.isExpanded\"\n [class.collapsed]=\"!header.isExpanded\"\n [style.position]=\"isStickyColumn(header.name, colIndex) ? 'sticky' : 'static'\"\n [style.left.px]=\"getStickyColumnLeft(header.name, colIndex)\"\n [style.z-index]=\"isStickyColumn(header.name, colIndex) ? 100 : 1\"\n style=\"min-height: 40px; height: auto; padding: 8px 6px;\">\n <div class=\"header-content\">\n <span class=\"header-label\">{{header.label}}</span>\n <button *ngIf=\"!isRowDimensionHeader(header)\" \n class=\"collapse-toggle-btn\"\n [title]=\"header.isExpanded ? 'Collapse group' : 'Expand group'\"\n (click)=\"toggleColumnGroup(header.groupKey)\"\n type=\"button\">\n <span class=\"collapse-icon\">+</span>\n </button>\n </div>\n </th>\n </tr>\n </ng-container> \n <!-- Simple header fallback -->\n <ng-template #simpleHeader>\n <tr class=\"pivot-header\">\n <th *ngFor=\"let column of getLeafColumns(); trackBy: trackByColumnFn; let colIndex = index\"\n [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 {{column.label}}\n </th>\n </tr>\n </ng-template>\n <!-- Table Body with Virtual Scrolling -->\n <tbody class=\"pivot-tbody\">\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 <!-- <td colspan=\"20\">{{pivotRow | json}}</td> -->\n <ng-container *ngFor=\"let column of getLeafColumns(); trackBy: trackByColumnFn; let colIndex = index\">\n <td *ngIf=\"!shouldSkipCell(i, column.name)\"\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 [id]=\"'pivot_' + i + '_' + column.name\">\n </data-cell>\n </div>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Table Mode Template -->\n <ng-template #tableMode>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"50\"\n class=\"viewport table-viewport\"\n (scrolledIndexChange)=\"onScroll($event)\"\n >\n <div class=\"table-wrapper\">\n <table class=\"eru-grid-table\">\n <thead>\n <tr style=\"visibility:hidden;\">\n <th class=\"checkbox-column\"></th>\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"column-header\">\n {{column.label}}\n </th>\n </tr>\n </thead>\n <tbody *ngIf=\"columns() as columnsList\">\n <ng-container *cdkVirtualFor=\"let groupItem of groupedRows();\n trackBy: trackByGroupItemFn;\n let i = index;\n let first=first\">\n <!-- Group Header -->\n <tr\n *ngIf=\"groupItem.type === 'header'\"\n class=\"group-header\"\n (click)=\"toggleGroupExpansion(groupItem.group?.id || '')\"\n >\n <td class=\"checkbox-column\" style=\"border: none;\">\n {{ groupItem.group?.isExpanded ? '▼' : '▶' }}\n </td>\n <td [attr.colspan]=\"2\" style=\"border: none;\">\n <span class=\"group-title\">\n {{ groupItem.group?.title }}\n </span>\n <span class=\"group-row-count\">\n ({{ groupItem.group?.currentLoadedRows || 0 }}/{{ groupItem.group?.totalRowCount || 0 }})\n </span>\n </td>\n </tr>\n <!-- Column Header -->\n <tr *ngIf=\"groupItem.type === 'table-header'\" style=\"background:#fafafa\">\n <th class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupSelected(groupItem.group?.id || '')\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection($event, groupItem.group?.id || '')\"\n >\n </th>\n <th *ngFor=\"let column of columns(); trackBy: trackByColumnFn;let i =index\"\n style=\"text-align: center;\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n [resizeColumn]=\"true\"\n [columnConfig]=\"column\"\n [columnDraggable]=\"i\"\n class=\"column-header\">\n <div class=\"column-drag-handle\"></div>\n {{column.label}} {{column.symbol}}\n </th>\n </tr>\n <!-- Row -->\n <tr\n *ngIf=\"groupItem.type === 'row' && groupItem.group?.isExpanded\"\n class=\"row-item\"\n [attr.data-row-id]=\"groupItem.row?.entity_id\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n <td class=\"checkbox-column\" style=\"text-align: center;\">\n <input\n type=\"checkbox\"\n [checked]=\"isRowSelected(groupItem.row?.entity_id)\"\n (change)=\"toggleRowSelection($event, groupItem.row)\"\n >\n </td>\n <td #cell *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"data-cell\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n [matTooltipClass]=\"'error-message'\"\n [matTooltip]=\"datacell.error()?'Error: ' + datacell.error():''\"\n matTooltipPosition=\"below\"\n >\n <div class=\"cell-content\">\n <data-cell\n #datacell \n [td]=cell\n [fieldSize]=\"column.field_size\"\n [columnDatatype]=\"column.datatype\"\n [columnName]=\"column.name\"\n [value]=\"groupItem.row?.[column.name] || ''\"\n [column]=\"column\"\n [id]=\"groupItem.row?.['entity_id'] || '_' ||column.name\"\n ></data-cell>\n </div>\n </td>\n </tr>\n\n <!-- Ghost Loading Rows -->\n <tr\n *ngIf=\"groupItem.type === 'ghost-loading' && groupItem.group?.isExpanded\"\n class=\"ghost-loading-row\"\n [style.height.px]=\"30\"\n [style.minHeight.px]=\"30\"\n [style.maxHeight.px]=\"30\"\n >\n <td class=\"checkbox-column\"></td>\n <td *ngFor=\"let column of columns(); trackBy: trackByColumnFn\"\n [style.width.px]=\"column.field_size\"\n [style.minWidth.px]=\"column.field_size\"\n class=\"ghost-cell-container\"\n >\n <div class=\"ghost-cell\"></div>\n </td>\n </tr>\n\n <!-- Group Separator Row -->\n <tr\n *ngIf=\"groupItem.type === 'row-place-holder'\"\n class=\"group-separator\"\n >\n <td [attr.colspan]=\"columns().length + 1\" class=\"separator-cell\"></td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n</div>","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';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GridStore","i2.ThemeService","i3.ColumnConstraintsService","i1","i2","i7","i8","i3","i4"],"mappings":"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"}