@toolbox-web/grid 0.4.2 → 0.6.0

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.
Files changed (123) hide show
  1. package/README.md +2 -3
  2. package/all.js +1063 -1024
  3. package/all.js.map +1 -1
  4. package/index.js +1078 -912
  5. package/index.js.map +1 -1
  6. package/lib/core/grid.d.ts +28 -0
  7. package/lib/core/grid.d.ts.map +1 -1
  8. package/lib/core/internal/dom-builder.d.ts +2 -0
  9. package/lib/core/internal/dom-builder.d.ts.map +1 -1
  10. package/lib/core/internal/event-delegation.d.ts +21 -0
  11. package/lib/core/internal/event-delegation.d.ts.map +1 -1
  12. package/lib/core/internal/header.d.ts.map +1 -1
  13. package/lib/core/internal/resize.d.ts.map +1 -1
  14. package/lib/core/internal/rows.d.ts +1 -1
  15. package/lib/core/internal/rows.d.ts.map +1 -1
  16. package/lib/core/internal/shell.d.ts +19 -13
  17. package/lib/core/internal/shell.d.ts.map +1 -1
  18. package/lib/core/plugin/base-plugin.d.ts +13 -2
  19. package/lib/core/plugin/base-plugin.d.ts.map +1 -1
  20. package/lib/core/plugin/expander-column.d.ts.map +1 -1
  21. package/lib/core/plugin/plugin-manager.d.ts +6 -2
  22. package/lib/core/plugin/plugin-manager.d.ts.map +1 -1
  23. package/lib/core/types.d.ts +41 -3
  24. package/lib/core/types.d.ts.map +1 -1
  25. package/lib/plugins/clipboard/index.js +22 -11
  26. package/lib/plugins/clipboard/index.js.map +1 -1
  27. package/lib/plugins/column-virtualization/index.js +59 -48
  28. package/lib/plugins/column-virtualization/index.js.map +1 -1
  29. package/lib/plugins/context-menu/index.js +71 -60
  30. package/lib/plugins/context-menu/index.js.map +1 -1
  31. package/lib/plugins/editing/EditingPlugin.d.ts +1 -0
  32. package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
  33. package/lib/plugins/editing/index.js +93 -80
  34. package/lib/plugins/editing/index.js.map +1 -1
  35. package/lib/plugins/export/index.js +29 -18
  36. package/lib/plugins/export/index.js.map +1 -1
  37. package/lib/plugins/filtering/FilteringPlugin.d.ts +9 -1
  38. package/lib/plugins/filtering/FilteringPlugin.d.ts.map +1 -1
  39. package/lib/plugins/filtering/index.js +199 -165
  40. package/lib/plugins/filtering/index.js.map +1 -1
  41. package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts +1 -0
  42. package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts.map +1 -1
  43. package/lib/plugins/grouping-columns/index.js +79 -49
  44. package/lib/plugins/grouping-columns/index.js.map +1 -1
  45. package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts.map +1 -1
  46. package/lib/plugins/grouping-rows/index.js +98 -87
  47. package/lib/plugins/grouping-rows/index.js.map +1 -1
  48. package/lib/plugins/master-detail/index.js +70 -57
  49. package/lib/plugins/master-detail/index.js.map +1 -1
  50. package/lib/plugins/multi-sort/index.js +48 -37
  51. package/lib/plugins/multi-sort/index.js.map +1 -1
  52. package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts.map +1 -1
  53. package/lib/plugins/pinned-columns/index.js +71 -66
  54. package/lib/plugins/pinned-columns/index.js.map +1 -1
  55. package/lib/plugins/pinned-columns/pinned-columns.d.ts +2 -2
  56. package/lib/plugins/pinned-columns/pinned-columns.d.ts.map +1 -1
  57. package/lib/plugins/pinned-rows/PinnedRowsPlugin.d.ts.map +1 -1
  58. package/lib/plugins/pinned-rows/index.js +63 -52
  59. package/lib/plugins/pinned-rows/index.js.map +1 -1
  60. package/lib/plugins/pivot/PivotPlugin.d.ts.map +1 -1
  61. package/lib/plugins/pivot/index.js +310 -299
  62. package/lib/plugins/pivot/index.js.map +1 -1
  63. package/lib/plugins/reorder/ReorderPlugin.d.ts.map +1 -1
  64. package/lib/plugins/reorder/index.d.ts +1 -1
  65. package/lib/plugins/reorder/index.d.ts.map +1 -1
  66. package/lib/plugins/reorder/index.js +79 -68
  67. package/lib/plugins/reorder/index.js.map +1 -1
  68. package/lib/plugins/selection/SelectionPlugin.d.ts.map +1 -1
  69. package/lib/plugins/selection/index.js +115 -105
  70. package/lib/plugins/selection/index.js.map +1 -1
  71. package/lib/plugins/server-side/index.js +15 -4
  72. package/lib/plugins/server-side/index.js.map +1 -1
  73. package/lib/plugins/tree/TreePlugin.d.ts.map +1 -1
  74. package/lib/plugins/tree/index.js +41 -30
  75. package/lib/plugins/tree/index.js.map +1 -1
  76. package/lib/plugins/undo-redo/index.js +29 -18
  77. package/lib/plugins/undo-redo/index.js.map +1 -1
  78. package/lib/plugins/visibility/VisibilityPlugin.d.ts.map +1 -1
  79. package/lib/plugins/visibility/index.js +59 -47
  80. package/lib/plugins/visibility/index.js.map +1 -1
  81. package/package.json +6 -6
  82. package/public.d.ts +42 -0
  83. package/public.d.ts.map +1 -1
  84. package/themes/dg-theme-bootstrap.css +55 -53
  85. package/themes/dg-theme-contrast.css +42 -40
  86. package/themes/dg-theme-large.css +38 -37
  87. package/themes/dg-theme-material.css +54 -52
  88. package/themes/dg-theme-standard.css +19 -17
  89. package/themes/dg-theme-vibrant.css +16 -14
  90. package/umd/grid.all.umd.js +23 -22
  91. package/umd/grid.all.umd.js.map +1 -1
  92. package/umd/grid.umd.js +15 -14
  93. package/umd/grid.umd.js.map +1 -1
  94. package/umd/plugins/column-virtualization.umd.js +1 -1
  95. package/umd/plugins/column-virtualization.umd.js.map +1 -1
  96. package/umd/plugins/context-menu.umd.js +1 -1
  97. package/umd/plugins/context-menu.umd.js.map +1 -1
  98. package/umd/plugins/editing.umd.js +1 -1
  99. package/umd/plugins/editing.umd.js.map +1 -1
  100. package/umd/plugins/filtering.umd.js +1 -1
  101. package/umd/plugins/filtering.umd.js.map +1 -1
  102. package/umd/plugins/grouping-columns.umd.js +1 -1
  103. package/umd/plugins/grouping-columns.umd.js.map +1 -1
  104. package/umd/plugins/grouping-rows.umd.js +1 -1
  105. package/umd/plugins/grouping-rows.umd.js.map +1 -1
  106. package/umd/plugins/master-detail.umd.js +1 -1
  107. package/umd/plugins/master-detail.umd.js.map +1 -1
  108. package/umd/plugins/multi-sort.umd.js +1 -1
  109. package/umd/plugins/multi-sort.umd.js.map +1 -1
  110. package/umd/plugins/pinned-columns.umd.js +1 -1
  111. package/umd/plugins/pinned-columns.umd.js.map +1 -1
  112. package/umd/plugins/pinned-rows.umd.js +1 -1
  113. package/umd/plugins/pinned-rows.umd.js.map +1 -1
  114. package/umd/plugins/pivot.umd.js +1 -1
  115. package/umd/plugins/pivot.umd.js.map +1 -1
  116. package/umd/plugins/reorder.umd.js +1 -1
  117. package/umd/plugins/reorder.umd.js.map +1 -1
  118. package/umd/plugins/selection.umd.js +1 -1
  119. package/umd/plugins/selection.umd.js.map +1 -1
  120. package/umd/plugins/tree.umd.js +1 -1
  121. package/umd/plugins/tree.umd.js.map +1 -1
  122. package/umd/plugins/visibility.umd.js +1 -1
  123. package/umd/plugins/visibility.umd.js.map +1 -1
@@ -13,6 +13,7 @@ import { ColumnGroup, GroupingColumnsConfig } from './types';
13
13
  * ```
14
14
  */
15
15
  export declare class GroupingColumnsPlugin extends BaseGridPlugin<GroupingColumnsConfig> {
16
+ #private;
16
17
  readonly name = "groupingColumns";
17
18
  readonly styles: string;
18
19
  protected get defaultConfig(): Partial<GroupingColumnsConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupingColumnsPlugin.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/grouping-columns/GroupingColumnsPlugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQrD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;;;;;;GAUG;AACH,qBAAa,qBAAsB,SAAQ,cAAc,CAAC,qBAAqB,CAAC;IAC9E,QAAQ,CAAC,IAAI,qBAAqB;IAClC,SAAkB,MAAM,SAAU;IAElC,cAAuB,aAAa,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAIrE;IAGD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAS;IAKhB,MAAM,IAAI,IAAI;IAQvB;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO;IAchD,cAAc,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE;IA0ChE,WAAW,IAAI,IAAI;IAgD5B;;;OAGG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACH,SAAS,IAAI,WAAW,EAAE;IAI1B;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAKhD;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
1
+ {"version":3,"file":"GroupingColumnsPlugin.d.ts","sourceRoot":"","sources":["../../../../../../libs/grid/src/lib/plugins/grouping-columns/GroupingColumnsPlugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQrD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;;;;;;GAUG;AACH,qBAAa,qBAAsB,SAAQ,cAAc,CAAC,qBAAqB,CAAC;;IAC9E,QAAQ,CAAC,IAAI,qBAAqB;IAClC,SAAkB,MAAM,SAAU;IAElC,cAAuB,aAAa,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAIrE;IAGD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAS;IAKhB,MAAM,IAAI,IAAI;IAQvB;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO;IAchD,cAAc,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE;IA0ChE,WAAW,IAAI,IAAI;IAkF5B;;;OAGG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACH,SAAS,IAAI,WAAW,EAAE;IAI1B;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAKhD;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -8,7 +8,7 @@ const g = {
8
8
  dragHandle: "⋮⋮",
9
9
  toolPanel: "☰"
10
10
  };
11
- class h {
11
+ class p {
12
12
  /**
13
13
  * Plugin dependencies - declare other plugins this one requires.
14
14
  *
@@ -185,10 +185,21 @@ class h {
185
185
  return this.grid;
186
186
  }
187
187
  /**
188
- * Get the shadow root of the grid.
188
+ * Get the render root of the grid for DOM queries.
189
+ * @deprecated Use `gridElement` instead. This getter exists only for backward compatibility.
190
+ *
191
+ * With Shadow DOM removed, the grid element itself is the render root.
192
+ * All new code should use `this.gridElement` for DOM queries.
193
+ *
194
+ * @example
195
+ * // OLD (deprecated)
196
+ * const rows = this.shadowRoot?.querySelector('.rows');
197
+ *
198
+ * // NEW (preferred)
199
+ * const rows = this.gridElement.querySelector('.rows');
189
200
  */
190
201
  get shadowRoot() {
191
- return this.grid?.shadowRoot ?? null;
202
+ return this.gridElement;
192
203
  }
193
204
  /**
194
205
  * Get the disconnect signal for event listener cleanup.
@@ -239,7 +250,7 @@ class h {
239
250
  const e = this.grid?.effectiveConfig?.animation?.mode ?? "reduced-motion";
240
251
  if (e === !1 || e === "off") return !1;
241
252
  if (e === !0 || e === "on") return !0;
242
- const r = this.shadowRoot?.host;
253
+ const r = this.gridElement;
243
254
  return r ? getComputedStyle(r).getPropertyValue("--tbw-animation-enabled").trim() !== "0" : !0;
244
255
  }
245
256
  /**
@@ -255,7 +266,7 @@ class h {
255
266
  * ```
256
267
  */
257
268
  get animationDuration() {
258
- const e = this.shadowRoot?.host;
269
+ const e = this.gridElement;
259
270
  if (e) {
260
271
  const r = getComputedStyle(e).getPropertyValue("--tbw-animation-duration").trim(), t = parseInt(r, 10);
261
272
  if (!isNaN(t)) return t;
@@ -292,74 +303,74 @@ class h {
292
303
  }
293
304
  // #endregion
294
305
  }
295
- function c(l) {
296
- if (!l.length) return [];
297
- const e = /* @__PURE__ */ new Map(), r = [], t = (o, i) => {
298
- if (!i.length) return;
306
+ function c(u) {
307
+ if (!u.length) return [];
308
+ const e = /* @__PURE__ */ new Map(), r = [], t = (o, l) => {
309
+ if (!l.length) return;
299
310
  const s = r[r.length - 1];
300
311
  if (s && s.implicit && s.firstIndex + s.columns.length === o) {
301
- s.columns.push(...i);
312
+ s.columns.push(...l);
302
313
  return;
303
314
  }
304
315
  r.push({
305
316
  id: "__implicit__" + o,
306
317
  label: void 0,
307
- columns: i,
318
+ columns: l,
308
319
  firstIndex: o,
309
320
  implicit: !0
310
321
  });
311
322
  };
312
- let u = [], n = 0;
313
- return l.forEach((o, i) => {
323
+ let i = [], n = 0;
324
+ return u.forEach((o, l) => {
314
325
  const s = o.group;
315
326
  if (!s) {
316
- u.length === 0 && (n = i), u.push(o);
327
+ i.length === 0 && (n = l), i.push(o);
317
328
  return;
318
329
  }
319
- u.length && (t(n, u.slice()), u = []);
330
+ i.length && (t(n, i.slice()), i = []);
320
331
  const d = typeof s == "string" ? s : s.id;
321
332
  let a = e.get(d);
322
333
  a || (a = {
323
334
  id: d,
324
335
  label: typeof s == "string" ? void 0 : s.label,
325
336
  columns: [],
326
- firstIndex: i
337
+ firstIndex: l
327
338
  }, e.set(d, a), r.push(a)), a.columns.push(o);
328
- }), u.length && t(n, u), r.length === 1 && r[0].implicit && r[0].columns.length === l.length ? [] : r;
339
+ }), i.length && t(n, i), r.length === 1 && r[0].implicit && r[0].columns.length === u.length ? [] : r;
329
340
  }
330
- function p(l, e, r) {
331
- if (!e.length || !l) return;
341
+ function h(u, e, r) {
342
+ if (!e.length || !u) return;
332
343
  const t = /* @__PURE__ */ new Map();
333
344
  for (const n of e)
334
345
  for (const o of n.columns)
335
346
  o.field && t.set(o.field, n.id);
336
- const u = Array.from(l.querySelectorAll(".cell[data-field]"));
337
- u.forEach((n) => {
338
- const o = n.getAttribute("data-field") || "", i = t.get(o);
339
- i && (n.classList.add("grouped"), n.getAttribute("data-group") || n.setAttribute("data-group", i));
347
+ const i = Array.from(u.querySelectorAll(".cell[data-field]"));
348
+ i.forEach((n) => {
349
+ const o = n.getAttribute("data-field") || "", l = t.get(o);
350
+ l && (n.classList.add("grouped"), n.getAttribute("data-group") || n.setAttribute("data-group", l));
340
351
  });
341
352
  for (const n of e) {
342
- const o = n.columns[n.columns.length - 1], i = u.find((s) => s.getAttribute("data-field") === o.field);
343
- i && i.classList.add("group-end");
353
+ const o = n.columns[n.columns.length - 1], l = i.find((s) => s.getAttribute("data-field") === o.field);
354
+ l && l.classList.add("group-end");
344
355
  }
345
356
  }
346
- function f(l, e) {
347
- if (l.length === 0) return null;
357
+ function f(u, e) {
358
+ if (u.length === 0) return null;
348
359
  const r = document.createElement("div");
349
360
  r.className = "header-group-row", r.setAttribute("role", "row");
350
- for (const t of l) {
351
- const u = t.columns[0], n = u ? e.findIndex((d) => d.field === u.field) : -1;
361
+ for (const t of u) {
362
+ const i = t.columns[0], n = i ? e.findIndex((d) => d.field === i.field) : -1;
352
363
  if (n === -1) continue;
353
- const o = String(t.id).startsWith("__implicit__"), i = o ? "" : t.label || t.id, s = document.createElement("div");
354
- s.className = "cell header-group-cell", o && s.classList.add("implicit-group"), s.setAttribute("data-group", String(t.id)), s.style.gridColumn = `${n + 1} / span ${t.columns.length}`, s.textContent = i, r.appendChild(s);
364
+ const o = String(t.id).startsWith("__implicit__"), l = o ? "" : t.label || t.id, s = document.createElement("div");
365
+ s.className = "cell header-group-cell", o && s.classList.add("implicit-group"), s.setAttribute("data-group", String(t.id)), s.style.gridColumn = `${n + 1} / span ${t.columns.length}`, s.textContent = l, r.appendChild(s);
355
366
  }
356
367
  return r;
357
368
  }
358
- function m(l) {
359
- return l.some((e) => e.group != null);
369
+ function m(u) {
370
+ return u.some((e) => e.group != null);
360
371
  }
361
- const b = ".header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:4px 8px;font-weight:600;font-size:.9em;text-transform:uppercase;letter-spacing:.5px;border-right:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong))}.header-row .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}";
362
- class w extends h {
372
+ const b = "@layer tbw-plugins{.header-group-row{display:grid;grid-auto-flow:column;background:var(--tbw-grouping-columns-header-bg, var(--tbw-color-header-bg));border-bottom:1px solid var(--tbw-grouping-columns-border, var(--tbw-color-border))}.header-group-cell{display:flex;align-items:center;justify-content:center;padding:var(--tbw-button-padding-sm, .25rem .5rem);font-weight:600;font-size:var(--tbw-font-size-sm, .9em);text-transform:uppercase;letter-spacing:.5px;border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-group-cell:last-child{border-right:none}.header-row .cell.grouped{border-top:none}.header-row .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.header-row .cell.group-end:last-child{border-right:none}.rows .cell.group-end{border-right:2px solid var(--tbw-grouping-columns-separator, var(--tbw-color-border-strong, var(--tbw-color-border)))}.rows .cell.group-end:last-child{border-right:none}.header-group-row.no-borders{border-bottom:none}.header-group-row.no-borders .header-group-cell{border-right:none}.header-row.no-group-borders .cell.group-end{border-right:1px solid var(--tbw-color-border)}}";
373
+ class w extends p {
363
374
  name = "groupingColumns";
364
375
  styles = b;
365
376
  get defaultConfig() {
@@ -395,37 +406,56 @@ class w extends h {
395
406
  if (r && Array.isArray(r) && r.length > 0) {
396
407
  const n = /* @__PURE__ */ new Map();
397
408
  for (const o of r)
398
- for (const i of o.children)
399
- n.set(i, { id: o.id, label: o.header });
409
+ for (const l of o.children)
410
+ n.set(l, { id: o.id, label: o.header });
400
411
  t = e.map((o) => {
401
- const i = n.get(o.field);
402
- return i && !o.group ? { ...o, group: i } : o;
412
+ const l = n.get(o.field);
413
+ return l && !o.group ? { ...o, group: l } : o;
403
414
  });
404
415
  } else
405
416
  t = [...e];
406
- const u = c(t);
407
- return u.length === 0 ? (this.isActive = !1, this.groups = [], t) : (this.isActive = !0, this.groups = u, t);
417
+ const i = c(t);
418
+ return i.length === 0 ? (this.isActive = !1, this.groups = [], t) : (this.isActive = !0, this.groups = i, t);
408
419
  }
409
420
  afterRender() {
410
421
  if (!this.isActive) {
411
- const s = this.shadowRoot?.querySelector(".header")?.querySelector(".header-group-row");
422
+ const s = this.gridElement?.querySelector(".header")?.querySelector(".header-group-row");
412
423
  s && s.remove();
413
424
  return;
414
425
  }
415
- const e = this.shadowRoot?.querySelector(".header");
426
+ const e = this.gridElement?.querySelector(".header");
416
427
  if (!e) return;
417
428
  const r = e.querySelector(".header-group-row");
418
429
  r && r.remove();
419
- const t = this.columns, u = c(t);
420
- if (u.length === 0) return;
421
- const n = f(u, t);
430
+ const t = this.columns, i = c(t);
431
+ if (i.length === 0) return;
432
+ const n = f(i, t);
422
433
  if (n) {
423
434
  n.classList.toggle("no-borders", !this.config.showGroupBorders);
424
- const i = e.querySelector(".header-row");
425
- i ? e.insertBefore(n, i) : e.appendChild(n);
435
+ const l = e.querySelector(".header-row");
436
+ l ? e.insertBefore(n, l) : e.appendChild(n);
426
437
  }
427
438
  const o = e.querySelector(".header-row");
428
- o && (o.classList.toggle("no-group-borders", !this.config.showGroupBorders), p(o, u));
439
+ o && (o.classList.toggle("no-group-borders", !this.config.showGroupBorders), h(o, i)), this.#e(i);
440
+ }
441
+ /**
442
+ * Apply group-end class to all data cells in the last column of each group.
443
+ * This extends the strong border separator through all data rows.
444
+ */
445
+ #e(e) {
446
+ if (!this.config.showGroupBorders) return;
447
+ const r = this.gridElement;
448
+ if (!r) return;
449
+ const t = /* @__PURE__ */ new Set();
450
+ for (const n of e) {
451
+ const o = n.columns[n.columns.length - 1];
452
+ o?.field && t.add(o.field);
453
+ }
454
+ const i = r.querySelectorAll(".rows .cell[data-field]");
455
+ for (const n of i) {
456
+ const o = n.getAttribute("data-field");
457
+ o && t.has(o) ? n.classList.add("group-end") : n.classList.remove("group-end");
458
+ }
429
459
  }
430
460
  // #endregion
431
461
  // #region Public API