@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.
- package/README.md +2 -3
- package/all.js +1063 -1024
- package/all.js.map +1 -1
- package/index.js +1078 -912
- package/index.js.map +1 -1
- package/lib/core/grid.d.ts +28 -0
- package/lib/core/grid.d.ts.map +1 -1
- package/lib/core/internal/dom-builder.d.ts +2 -0
- package/lib/core/internal/dom-builder.d.ts.map +1 -1
- package/lib/core/internal/event-delegation.d.ts +21 -0
- package/lib/core/internal/event-delegation.d.ts.map +1 -1
- package/lib/core/internal/header.d.ts.map +1 -1
- package/lib/core/internal/resize.d.ts.map +1 -1
- package/lib/core/internal/rows.d.ts +1 -1
- package/lib/core/internal/rows.d.ts.map +1 -1
- package/lib/core/internal/shell.d.ts +19 -13
- package/lib/core/internal/shell.d.ts.map +1 -1
- package/lib/core/plugin/base-plugin.d.ts +13 -2
- package/lib/core/plugin/base-plugin.d.ts.map +1 -1
- package/lib/core/plugin/expander-column.d.ts.map +1 -1
- package/lib/core/plugin/plugin-manager.d.ts +6 -2
- package/lib/core/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/core/types.d.ts +41 -3
- package/lib/core/types.d.ts.map +1 -1
- package/lib/plugins/clipboard/index.js +22 -11
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/index.js +59 -48
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js +71 -60
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/editing/EditingPlugin.d.ts +1 -0
- package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
- package/lib/plugins/editing/index.js +93 -80
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/export/index.js +29 -18
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/FilteringPlugin.d.ts +9 -1
- package/lib/plugins/filtering/FilteringPlugin.d.ts.map +1 -1
- package/lib/plugins/filtering/index.js +199 -165
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts +1 -0
- package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts.map +1 -1
- package/lib/plugins/grouping-columns/index.js +79 -49
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/GroupingRowsPlugin.d.ts.map +1 -1
- package/lib/plugins/grouping-rows/index.js +98 -87
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js +70 -57
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/index.js +48 -37
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts.map +1 -1
- package/lib/plugins/pinned-columns/index.js +71 -66
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-columns/pinned-columns.d.ts +2 -2
- package/lib/plugins/pinned-columns/pinned-columns.d.ts.map +1 -1
- package/lib/plugins/pinned-rows/PinnedRowsPlugin.d.ts.map +1 -1
- package/lib/plugins/pinned-rows/index.js +63 -52
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/PivotPlugin.d.ts.map +1 -1
- package/lib/plugins/pivot/index.js +310 -299
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/reorder/ReorderPlugin.d.ts.map +1 -1
- package/lib/plugins/reorder/index.d.ts +1 -1
- package/lib/plugins/reorder/index.d.ts.map +1 -1
- package/lib/plugins/reorder/index.js +79 -68
- package/lib/plugins/reorder/index.js.map +1 -1
- package/lib/plugins/selection/SelectionPlugin.d.ts.map +1 -1
- package/lib/plugins/selection/index.js +115 -105
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js +15 -4
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/tree/TreePlugin.d.ts.map +1 -1
- package/lib/plugins/tree/index.js +41 -30
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/index.js +29 -18
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/visibility/VisibilityPlugin.d.ts.map +1 -1
- package/lib/plugins/visibility/index.js +59 -47
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +6 -6
- package/public.d.ts +42 -0
- package/public.d.ts.map +1 -1
- package/themes/dg-theme-bootstrap.css +55 -53
- package/themes/dg-theme-contrast.css +42 -40
- package/themes/dg-theme-large.css +38 -37
- package/themes/dg-theme-material.css +54 -52
- package/themes/dg-theme-standard.css +19 -17
- package/themes/dg-theme-vibrant.css +16 -14
- package/umd/grid.all.umd.js +23 -22
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +15 -14
- package/umd/grid.umd.js.map +1 -1
- package/umd/plugins/column-virtualization.umd.js +1 -1
- package/umd/plugins/column-virtualization.umd.js.map +1 -1
- package/umd/plugins/context-menu.umd.js +1 -1
- package/umd/plugins/context-menu.umd.js.map +1 -1
- package/umd/plugins/editing.umd.js +1 -1
- package/umd/plugins/editing.umd.js.map +1 -1
- package/umd/plugins/filtering.umd.js +1 -1
- package/umd/plugins/filtering.umd.js.map +1 -1
- package/umd/plugins/grouping-columns.umd.js +1 -1
- package/umd/plugins/grouping-columns.umd.js.map +1 -1
- package/umd/plugins/grouping-rows.umd.js +1 -1
- package/umd/plugins/grouping-rows.umd.js.map +1 -1
- package/umd/plugins/master-detail.umd.js +1 -1
- package/umd/plugins/master-detail.umd.js.map +1 -1
- package/umd/plugins/multi-sort.umd.js +1 -1
- package/umd/plugins/multi-sort.umd.js.map +1 -1
- package/umd/plugins/pinned-columns.umd.js +1 -1
- package/umd/plugins/pinned-columns.umd.js.map +1 -1
- package/umd/plugins/pinned-rows.umd.js +1 -1
- package/umd/plugins/pinned-rows.umd.js.map +1 -1
- package/umd/plugins/pivot.umd.js +1 -1
- package/umd/plugins/pivot.umd.js.map +1 -1
- package/umd/plugins/reorder.umd.js +1 -1
- package/umd/plugins/reorder.umd.js.map +1 -1
- package/umd/plugins/selection.umd.js +1 -1
- package/umd/plugins/selection.umd.js.map +1 -1
- package/umd/plugins/tree.umd.js +1 -1
- package/umd/plugins/tree.umd.js.map +1 -1
- package/umd/plugins/visibility.umd.js +1 -1
- 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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
296
|
-
if (!
|
|
297
|
-
const e = /* @__PURE__ */ new Map(), r = [], t = (o,
|
|
298
|
-
if (!
|
|
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(...
|
|
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:
|
|
318
|
+
columns: l,
|
|
308
319
|
firstIndex: o,
|
|
309
320
|
implicit: !0
|
|
310
321
|
});
|
|
311
322
|
};
|
|
312
|
-
let
|
|
313
|
-
return
|
|
323
|
+
let i = [], n = 0;
|
|
324
|
+
return u.forEach((o, l) => {
|
|
314
325
|
const s = o.group;
|
|
315
326
|
if (!s) {
|
|
316
|
-
|
|
327
|
+
i.length === 0 && (n = l), i.push(o);
|
|
317
328
|
return;
|
|
318
329
|
}
|
|
319
|
-
|
|
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:
|
|
337
|
+
firstIndex: l
|
|
327
338
|
}, e.set(d, a), r.push(a)), a.columns.push(o);
|
|
328
|
-
}),
|
|
339
|
+
}), i.length && t(n, i), r.length === 1 && r[0].implicit && r[0].columns.length === u.length ? [] : r;
|
|
329
340
|
}
|
|
330
|
-
function
|
|
331
|
-
if (!e.length || !
|
|
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
|
|
337
|
-
|
|
338
|
-
const o = n.getAttribute("data-field") || "",
|
|
339
|
-
|
|
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],
|
|
343
|
-
|
|
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(
|
|
347
|
-
if (
|
|
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
|
|
351
|
-
const
|
|
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__"),
|
|
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 =
|
|
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(
|
|
359
|
-
return
|
|
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:
|
|
362
|
-
class w extends
|
|
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
|
|
399
|
-
n.set(
|
|
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
|
|
402
|
-
return
|
|
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
|
|
407
|
-
return
|
|
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.
|
|
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.
|
|
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,
|
|
420
|
-
if (
|
|
421
|
-
const n = f(
|
|
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
|
|
425
|
-
|
|
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),
|
|
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
|