@reforgium/data-grid 3.2.3 → 3.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,27 +1,60 @@
1
+ ## [3.2.4] - 16.07.2026
2
+
3
+ ### Added
4
+
5
+ - `GridPagedDataSource.loadPage()` stateless capability for safe parallel page loading, plus source buffer reset and `sourceError` request diagnostics.
6
+ - Controlled selection keys, explicit source revision/immutability semantics, and disabled paginator navigation support.
7
+
8
+ ### Fixed
9
+
10
+ - Sorting now performs its page reset atomically without issuing a competing `updatePage()` request.
11
+ - Source request failures, stale responses, infinity buffering, paginator normalization, row identity, and overlay drag cleanup are hardened with regression coverage.
12
+ - Ordinary grid cells no longer create duplicate tab stops; rows own grid navigation focus.
13
+
14
+ ### Deprecated
15
+
16
+ - `GridColumn.track` and declarative column `track` are not consumed by rendering. Use the grid-level `rowKey` instead.
17
+
18
+ ### Compatibility
19
+
20
+ - Supported Angular peer range is `>=18.0.0 <22.0.0`; `rxjs` is no longer a peer dependency of `@reforgium/data-grid`.
21
+
22
+ ### Test
23
+
24
+ - Added a cross-package smoke test using the built `@reforgium/data-grid` artifact with a real `PagedQueryStore` from `@reforgium/statum`.
25
+
26
+ ---
27
+
1
28
  ## [3.2.3]: 13.05.2026
2
29
 
3
30
  ### Fix:
4
- - `DataGrid`: source/infinity — `totalRowCount` no longer collapses to `0` (empty state) after the internal page buffer evicts early pages on long scrolls when the source does not return `totalElements`; row-count knowledge is now tracked via a monotonic high-water mark (`knownRowCount`) plus end-of-data state (`endReached` / `confirmedTotal`) updated when each page lands, instead of walking the eviction-bound `sourcePages` map
5
- - `DataGrid`: source/infinity buffer eviction now anchors `pageBase` and never evicts it, so `localToAbsolutePage` and contiguous-loaded-row accounting stay correct after scrolling past `MAX_BUFFERED_PAGES`
31
+
32
+ - `DataGrid`: source/infinity - `totalRowCount` no longer collapses to `0` (empty state) after the internal page buffer evicts early pages on long scrolls when the source does not return `totalElements`; row-count knowledge is now tracked via a monotonic high-water mark (`knownRowCount`) plus end-of-data state (`endReached` / `confirmedTotal`) updated when each page lands, instead of walking the eviction-bound `sourcePages` map
33
+ - `DataGrid`: source/infinity - buffer eviction now anchors `pageBase` and never evicts it, so `localToAbsolutePage` and contiguous-loaded-row accounting stay correct after scrolling past `MAX_BUFFERED_PAGES`
6
34
 
7
35
  ### Test:
36
+
8
37
  - added regression coverage: monotonic `totalRowCount` without `totalElements` (optimistic probe page, fixed end after short page, post-end full page does not unwind the total), 120-page scroll past `MAX_BUFFERED_PAGES` keeps `totalRowCount` stable, and anchor page survives eviction
9
38
 
10
39
  ### Docs:
11
- - `GridPagedDataSource.version`: tightened JSDoc — without `totalElements` the grid pins end-of-data on the first short/empty page, so the source must bump `version` on dataset growth/replacement to clear the pin; mutating `items()` in place without a bump leaves the grid with a stale row count
40
+
41
+ - `GridPagedDataSource.version`: tightened JSDoc - without `totalElements` the grid pins end-of-data on the first short/empty page, so the source must bump `version` on dataset growth/replacement to clear the pin; mutating `items()` in place without a bump leaves the grid with a stale row count
12
42
 
13
43
  ---
14
44
 
15
45
  ## [3.2.1]: 17.04.2026
16
46
 
17
47
  ### Fix:
48
+
18
49
  - `DataGrid`: source/pagination now respects exact `totalElements` when it is provided instead of collapsing paginator state to the current page payload length
19
50
  - `DataGrid`: source/pagination without `totalElements` now exposes one optimistic extra page when the current page is full (`items.length === pageSize`), so the consumer can perform the final probe request and detect the real end on the first short/empty page
20
51
 
21
52
  ### Docs:
53
+
22
54
  - `README`: documented `GridPagedDataSource.totalElements` behavior for source-driven pagination without a known total
23
55
 
24
56
  ### Test:
57
+
25
58
  - added regression coverage for source/pagination with exact `totalElements` and for the full-page-without-total probe flow
26
59
 
27
60
  ---
@@ -29,6 +62,7 @@
29
62
  ## [3.2.0]: 14.04.2026
30
63
 
31
64
  ### Feat:
65
+
32
66
  - `DataGrid`: added `getRowClass` input (`string | ((row: Data, index: number) => string)`) — applies CSS class(es) to data rows based on a static string or a resolver function; works alongside `isRowDisabled` and other row-level predicates
33
67
 
34
68
  ---
@@ -36,11 +70,13 @@
36
70
  ## [3.1.2]: 14.04.2026
37
71
 
38
72
  ### Fix:
73
+
39
74
  - `DataGrid`: source/infinity lifecycle for long-lived sources was stabilized; remounting a grid against the same `GridPagedDataSource` / `PagedQueryStore` instance now resets component-local source session state instead of reusing stale buffered pages, queued requests, or pending flags from the previous screen lifecycle
40
75
  - `DataGrid`: source/infinity now rebases correctly when a reused source reattaches on a non-zero page without `totalElements`; the current source page becomes the local starting point instead of rendering an empty grid
41
76
  - `DataGrid`: singleton-like source reuse now settles correctly after empty successful replacements and remounts, so stale rows are cleared and `loading` no longer depends on previous component-local source state
42
77
 
43
78
  ### Test:
79
+
44
80
  - added regression coverage for same-source remount, empty replacement after remount, non-zero-page reattach without `totalElements`, and source-session reset on version change
45
81
 
46
82
  ---
@@ -48,6 +84,7 @@
48
84
  ## [3.1.1]: 06.04.2026
49
85
 
50
86
  ### Fix:
87
+
51
88
  - `DataGrid`: source/infinity — grid no longer auto-requests pages before the first external fetch; `ensureBufferedRange` and `drainQueuedPages` are now gated by a `hasReceivedData` flag that is only raised after at least one non-empty page arrives via `sync()` outside of a reset cycle; guards stale-store (singleton re-bind), stale queued pages surviving a `clearBuffer()`, and the `queueMicrotask` drain-loop that ran after a buffer reset
52
89
 
53
90
  ---
@@ -55,9 +92,11 @@
55
92
  ## [3.1.0]: 02.04.2026
56
93
 
57
94
  ### Feat:
95
+
58
96
  - `DataGrid`: added `columnResizeEnd` output (`GridColumnResizeEndEvent`) — emits the column key and final pixel width when the user finishes a resize drag; use this to persist column widths
59
97
 
60
98
  ### Fix:
99
+
61
100
  - `DataGrid`: multi-sort — `sortOrder` was left stale (`'desc'`) after removing a sort key because `setSortOrder` was only called when `activeOrder` was truthy; now always resets to `'asc'` when no active order
62
101
  - `DataGrid`: multi-sort — `sortField` was not cleared after removing the last sort key, leaving a stale pointer to a column with no active sort; `sortField` is now set to `undefined` when `sorts` becomes empty
63
102
  - `DataGrid`: column layout — `roundAndFix` could leave a visual gap when all auto-sized columns had reached their `maxWidth`; remaining rounding pixels are now distributed even if `maxWidth` is exceeded by 1 px each (sub-pixel correction, not a layout concern)
@@ -67,6 +106,7 @@
67
106
  - `DataGrid`: selection reconcile — `selectChange` was not emitted when the grid automatically pruned selected keys after a data update removed rows that were previously selected; the event is now emitted with the surviving keys whenever the selected set shrinks
68
107
 
69
108
  ### Test:
109
+
70
110
  - added regression tests for all fixes above
71
111
 
72
112
  ---
@@ -74,6 +114,7 @@
74
114
  ## [3.0.0]: 17.03.2026
75
115
 
76
116
  ### Feat:
117
+
77
118
  - `DataGrid`: added global `provideDataGridHeaderTextResolver(...)` DI hook for resolving plain column/group header text (for example via Presentia) without per-table header templates
78
119
  - `DataGrid`: expanded `GridPagedDataSource` with source-level sorting and error state (`sort`, `error`, `updateSort(...)`, `updateSorts(...)`)
79
120
  - `DataGrid`: source mode now syncs current sort state from `source.sort` and delegates user sorting directly to source hooks when available
@@ -82,6 +123,7 @@
82
123
  - `DataGrid`: added gap-loader support for source/infinity mode to keep scroll continuity while pages are still loading
83
124
 
84
125
  ### Fix:
126
+
85
127
  - `DataGrid`: template cell rendering now applies column `align` by default (can still be overridden in custom template markup)
86
128
  - `DataGrid`: infinity `pageChange` no longer emits when `total` is empty (`0`) before first data load
87
129
  - `DataGrid`: header-group `title` now stays available in VM/template context when `titleTemplate` is used
@@ -94,6 +136,7 @@
94
136
  - `DataGrid`: removed lightweight RxJS-only listener plumbing from resize / scroll feature internals
95
137
 
96
138
  ### Docs:
139
+
97
140
  - `README`: clarified that `source` mode does not auto-fetch on mount; parent should configure filters/params first and then trigger the initial load explicitly
98
141
  - `README`: documented direct `PagedQueryStore` compatibility for source mode, including sort delegation and page-size updates
99
142
  - `README`: added global header-text resolver docs and expanded source-mode guidance
@@ -103,6 +146,7 @@
103
146
  ## [2.5.0]: 26.02.2026
104
147
 
105
148
  ### Feat:
149
+
106
150
  - `DataGrid`: extensible cell `type` support (`GridBuiltInCellType | string`) for custom type names
107
151
  - `DataGrid`: global type registries via DI:
108
152
  - `provideDataGridTypeTransformers(...)` (`type -> transformer`)
@@ -112,12 +156,14 @@
112
156
  - `DataGrid`: `isPinned` flag added to cell template contexts (`reDataGridTypeCell`, `reDataGridCell`, typed/global templates) and tooltip template context
113
157
 
114
158
  ### DX / API:
159
+
115
160
  - `GridCellRenderer` (`value`) now supports second argument context: `value(row, ctx)`
116
161
  - `GridCellTransformer` standardized as `transformer(row, ctx)`
117
162
  - `RenderTemplateData` now includes `isPinned`
118
163
  - `GridTooltipContext` now includes `isPinned`
119
164
 
120
165
  ### Docs:
166
+
121
167
  - `README`: added docs/examples for global type registries, renderer/value precedence, selection guidance for infinity mode, and `isPinned` callback/template context usage
122
168
 
123
169
  ---
@@ -125,6 +171,7 @@
125
171
  ## [2.4.0]: 20.02.2026
126
172
 
127
173
  ### Feat:
174
+
128
175
  - `DataGrid`: added header drag-resize for columns with `resizable` support (`minWidth` / `maxWidth` respected)
129
176
  - `DataGrid`: added provider defaults `resizable` and `translations.indexColumnHeader` for global resize behavior and index header text
130
177
 
@@ -133,6 +180,7 @@
133
180
  ## [2.3.6]: 19.02.2026
134
181
 
135
182
  ### Fix:
183
+
136
184
  - `ColumnManager`: pin action no longer reorders columns; pin now updates only sticky side while preserving current column order
137
185
  - `sort-ic`: added not sorted state
138
186
 
@@ -141,6 +189,7 @@
141
189
  ## [2.3.5]: 19.02.2026
142
190
 
143
191
  ### Fix:
192
+
144
193
  - `DataGrid`: fixed expander state reset when `pinnedRows` input changes (expanded groups now stay intact)
145
194
 
146
195
  ---
@@ -148,6 +197,7 @@
148
197
  ## [2.3.4]: 19.02.2026
149
198
 
150
199
  ### Fix:
200
+
151
201
  - `DataGrid`: fixed expander state handling for multiple independent `expandBy` groups (toggling one group no longer resets/opens other groups)
152
202
 
153
203
  ---
@@ -155,9 +205,11 @@
155
205
  ## [2.3.3]: 19.02.2026
156
206
 
157
207
  ### Feat:
208
+
158
209
  - `ColumnManager`: added `showAllLabel` and `hideAllLabel` inputs to customize controls text
159
210
 
160
211
  ### Fix:
212
+
161
213
  - `ColumnManager`: column visibility now toggles only on eye icon click (row/title click no longer toggles visibility)
162
214
 
163
215
  ---
@@ -165,6 +217,7 @@
165
217
  ## [2.3.1]: 18.02.2026
166
218
 
167
219
  ### Fix:
220
+
168
221
  - `ColumnManager`: custom trigger now supports `ng-template[reDataGridColumnManagerTrigger]` and works correctly with interactive projected content
169
222
 
170
223
  ---
@@ -172,33 +225,42 @@
172
225
  ## [2.3.0]: 18.02.2026
173
226
 
174
227
  ### Feat:
228
+
175
229
  - `ColumnManager`: pin action redesigned into compact current-state button with mini popover selection (`left` / `none` / `right`)
176
230
  - `ColumnManager`: custom trigger via projected content marker `reDataGridColumnManagerTrigger`
177
231
  - `ColumnManager`: custom column title template via projected `ng-template[reDataGridColumnManagerColumnTitle]`
178
232
  - `ColumnManager`: panel positioning now clamps to viewport to prevent right-edge overflow
179
233
 
180
234
  ### Refactor:
235
+
181
236
  - `ColumnManager`: component split into dedicated `.ts` / `.html` / `.scss` files
182
237
 
183
238
  ### Notes:
239
+
184
240
  - `ColumnManager`: trigger and list title customization APIs moved to projected content (`reDataGridColumnManagerTrigger`, `reDataGridColumnManagerColumnTitle`)
185
241
 
186
242
  ---
187
243
 
188
244
  ## [2.2.3]
245
+
189
246
  ### Fix:
247
+
190
248
  - `DataGrid`: fixed declarative columns initialization timing to avoid empty/incorrect state before content refs are ready
191
249
 
192
250
  ---
193
251
 
194
252
  ## [2.2.2]
253
+
195
254
  ### Fix:
255
+
196
256
  - `DataGrid`: fixed added missed merge columns helper
197
257
 
198
258
  ---
199
259
 
200
260
  ## [2.2.1]
261
+
201
262
  ### Feat:
263
+
202
264
  - `DataGrid`: `sortMode` with multi-sort flow
203
265
  - `DataGrid`: public API methods `clearSelection`, `selectAllLoaded`, `resetSort`, `setSort`, `setMultiSort`
204
266
  - `DataGrid`: `isRowDisabled` predicate for row-level disabling
@@ -207,21 +269,25 @@
207
269
  - `DataGrid`: auto tooltip by value via `tooltip: true`
208
270
 
209
271
  ### Perf/Opt:
272
+
210
273
  - `DataGrid`: multi-sort order lookup moved to hash map
211
274
  - `DataGrid`: selection and select-all optimizations for infinity mode
212
275
  - `DataGrid`: reduced infinity prefetch aggressiveness (`PREFETCH_FACTOR`)
213
276
  - `DataGrid`: effect/call orchestration cleanup to reduce unnecessary recalculations
214
277
 
215
278
  ### Refactor:
279
+
216
280
  - `DataGrid`: split large component logic into feature modules (selection/sort/sticky/tooltip/overlay/virtual-scroll/header/infinity orchestration)
217
281
  - `DataGrid`: additional orchestration extraction and cleanup in feature layer
218
282
 
219
283
  ### Fix:
284
+
220
285
  - `DataGrid`: select-all behavior fixes for loaded-only strategy in infinity scenarios
221
286
  - `DataGrid`: sorting behavior fixes (single/multi integration and state sync)
222
287
  - `DataGrid`: follow-up fixes for selection and scroll-driven flows
223
288
 
224
289
  ### Test:
290
+
225
291
  - expanded feature-level tests for refactored modules
226
292
  - added surface API tests for `DataGrid` sort methods delegation
227
293
 
@@ -230,9 +296,11 @@
230
296
  ## [2.1.1]: 11.02.2026
231
297
 
232
298
  ### Feat:
299
+
233
300
  - `DataGrid`: CSS vars for header/body gap and hover rounding
234
301
 
235
302
  ### Fix:
303
+
236
304
  - `DataGrid`: pinned rows use the same cell renderer pipeline as regular rows (align/sticky/type/templates/tooltip/width)
237
305
 
238
306
  ---
@@ -240,25 +308,31 @@
240
308
  ## [2.1.0]: 11.02.2026
241
309
 
242
310
  ### Feat:
311
+
243
312
  - `merge` declarative columns with column manager state (visible/disabled/sticky prioritized from state)
244
313
  - `DataGrid`: `lockVerticalScroll` flag to disable vertical scrolling
245
314
  - `DataGrid`: `defer*` flags to defer rendering
246
315
  - expanded public API exports for consumer typing
247
316
 
248
317
  ### Fix:
318
+
249
319
  - `DataGrid`: fix header width rendering
250
320
  - `ColumnManager`: fix hidden state color
251
321
 
252
322
  ### Test:
323
+
253
324
  - added unit tests for column merge helpers
254
325
 
255
326
  ### Docs:
327
+
256
328
  - updated README with missing CSS variables (grid + column manager), column manager inputs, and lock/defer inputs
257
329
 
258
330
  ---
259
331
 
260
332
  ## [2.0.1]: 09.02.2026
333
+
261
334
  ### Chore:
335
+
262
336
  - excluded source maps from the npm package
263
337
 
264
338
  ---
@@ -266,6 +340,7 @@
266
340
  ## [2.0.0]: 09.02.2026
267
341
 
268
342
  ### Feat:
343
+
269
344
  - Header groups (two-level headers)
270
345
  - Declarative columns DSL (`<re-dg-column>`)
271
346
  - Skeleton loading mode (pagination + infinity)
@@ -281,12 +356,14 @@
281
356
  - Default value support for cells
282
357
 
283
358
  ### Perf/Opt:
359
+
284
360
  - Sticky row/column calculations
285
361
  - Virtual scrolling performance
286
362
  - Resize handling
287
363
  - Render / change detection optimizations
288
364
 
289
365
  ### Fix:
366
+
290
367
  - Sticky column interface (left/right)
291
368
  - Type merge issues
292
369
  - Header cell template rendering (icons included)
@@ -294,10 +371,12 @@
294
371
  - Column visibility toggle now switches on first click
295
372
 
296
373
  ### Breaking:
374
+
297
375
  - `GridColumn.tooltip` is now opt-in popover content (string / fn / TemplateRef), replaces previous implicit tooltip behavior.
298
376
  - Column manager introduces new secondary entrypoint `@reforgium/data-grid/column-manager` (no runtime breaking changes, but new public API).
299
377
 
300
378
  ### Docs:
379
+
301
380
  - updated README (column manager + tooltip)
302
381
 
303
382
  ---
@@ -305,6 +384,7 @@
305
384
  ## [1.1.0]: 30.01.2026
306
385
 
307
386
  ### Feat:
387
+
308
388
  - improved height feature
309
389
  - `reDataGridSortIcon`, `reDataGridExpanderIcon`: sort & expander icons ref
310
390
  - `reDataGridCell`: data cell ref
@@ -314,8 +394,9 @@
314
394
  - `CSS customization`: added css variables: empty surface
315
395
 
316
396
  ### Fix:
397
+
317
398
  - code cleanup
318
- - rewrote sandbox minimized
399
+ - rewrote sandbox – minimized
319
400
  - height setting
320
401
  - improved loading and empty state layout
321
402
  - updated (corrected) readme
@@ -325,9 +406,11 @@
325
406
  ## [1.0.3]: 11.01.2026
326
407
 
327
408
  ### Fix:
409
+
328
410
  - fixed prefixes of directives
329
411
 
330
412
  ### Chore:
413
+
331
414
  - added more documentation
332
415
 
333
416
  ---
@@ -335,6 +418,7 @@
335
418
  ## [1.0.2]: 24.12.2025
336
419
 
337
420
  ### Fix:
421
+
338
422
  - fixed index forwarding in the template cell
339
423
 
340
424
  ---
@@ -342,6 +426,7 @@
342
426
  ## [1.0.1]: 24.12.2025
343
427
 
344
428
  ### Fix:
429
+
345
430
  - fixed transform types of inputs
346
431
 
347
432
  ---
@@ -349,6 +434,7 @@
349
434
  ## [1.0.0]: 24.12.2025
350
435
 
351
436
  ### Feat:
437
+
352
438
  - added base data grid functionality
353
439
  - implemented virtual scrolling for efficient work with large datasets
354
440
  - added single-column sorting