@@ -28,7 +28,7 @@ interface CopilotUsageItem {
28
28
} )
29
29
export class TableCopilotUsageComponent implements OnChanges , AfterViewInit {
30
30
columns = [ ] as UsageColumn [ ] ;
31
- displayedColumns = this . columns . map ( c => c . columnDef ) ;
31
+ displayedColumns : string [ ] = [ ] ;
32
32
@Input ( ) data ! : CustomUsageReportLine [ ] ;
33
33
@Input ( ) currency ! : string ;
34
34
dataSource : MatTableDataSource < CopilotUsageItem > = new MatTableDataSource < any > ( ) ; // Initialize the dataSource property
@@ -40,9 +40,15 @@ export class TableCopilotUsageComponent implements OnChanges, AfterViewInit {
40
40
constructor (
41
41
private usageReportService : UsageReportService ,
42
42
private cdr : ChangeDetectorRef
43
- ) { }
43
+ ) {
44
+ this . initializeColumns ( ) ;
45
+ }
44
46
45
47
ngOnChanges ( ) {
48
+ if ( ! this . data ) {
49
+ return ; // Avoid processing if data is not available yet
50
+ }
51
+
46
52
this . initializeColumns ( ) ;
47
53
let usage : CopilotUsageItem [ ] = [ ] ;
48
54
let usageItems : CopilotUsageItem [ ] = ( usage as CopilotUsageItem [ ] ) ;
@@ -96,21 +102,34 @@ export class TableCopilotUsageComponent implements OnChanges, AfterViewInit {
96
102
}
97
103
} ) ;
98
104
} ) ;
99
- usage = usageItems
105
+ usage = usageItems ;
100
106
101
- // Update dataSource first
102
- this . dataSource . data = usage ;
107
+ // Update displayedColumns first
108
+ this . displayedColumns = this . columns . map ( c => c . columnDef ) ;
103
109
104
- // Then update displayedColumns in the next tick to avoid ExpressionChangedAfterItHasBeenCheckedError
105
- setTimeout ( ( ) => {
106
- this . displayedColumns = this . columns . map ( c => c . columnDef ) ;
107
- this . cdr . detectChanges ( ) ;
108
- } ) ;
110
+ // Then update the data source
111
+ this . dataSource = new MatTableDataSource < CopilotUsageItem > ( usage ) ;
112
+
113
+ // Apply sort and pagination immediately, without setTimeout
114
+ if ( this . sort ) {
115
+ this . dataSource . sort = this . sort ;
116
+ }
117
+ if ( this . paginator ) {
118
+ this . dataSource . paginator = this . paginator ;
119
+ }
120
+
121
+ // Mark for check to ensure proper change detection
122
+ this . cdr . markForCheck ( ) ;
109
123
}
110
124
111
125
ngAfterViewInit ( ) {
112
- this . dataSource . paginator = this . paginator ;
113
- this . dataSource . sort = this . sort ;
126
+ // We use next tick to avoid the ExpressionChangedAfterItHasBeenCheckedError
127
+ Promise . resolve ( ) . then ( ( ) => {
128
+ if ( this . dataSource ) {
129
+ this . dataSource . paginator = this . paginator ;
130
+ this . dataSource . sort = this . sort ;
131
+ }
132
+ } ) ;
114
133
}
115
134
116
135
applyFilter ( event : Event ) {
@@ -155,7 +174,15 @@ export class TableCopilotUsageComponent implements OnChanges, AfterViewInit {
155
174
} ) ;
156
175
}
157
176
}
177
+
178
+ // Important: Clear columns before setting new ones
179
+ this . columns = [ ] ;
180
+
181
+ // Set new columns
158
182
this . columns = columns ;
183
+
184
+ // Update displayedColumns immediately after updating columns
185
+ this . displayedColumns = this . columns . map ( c => c . columnDef ) ;
159
186
}
160
187
}
161
188
0 commit comments