@toolbox-web/grid 1.15.0 → 1.16.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/all.js +33 -11
- package/all.js.map +1 -1
- package/index.js +877 -865
- package/index.js.map +1 -1
- package/lib/core/internal/columns.d.ts +0 -5
- package/lib/core/internal/columns.d.ts.map +1 -1
- package/lib/core/internal/rows.d.ts.map +1 -1
- package/lib/core/types.d.ts +12 -0
- package/lib/core/types.d.ts.map +1 -1
- package/lib/plugins/clipboard/index.js.map +1 -1
- package/lib/plugins/column-virtualization/index.js.map +1 -1
- package/lib/plugins/context-menu/index.js +59 -49
- package/lib/plugins/context-menu/index.js.map +1 -1
- package/lib/plugins/context-menu/menu.d.ts.map +1 -1
- package/lib/plugins/context-menu/types.d.ts +4 -4
- package/lib/plugins/context-menu/types.d.ts.map +1 -1
- package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
- package/lib/plugins/editing/index.js +228 -216
- package/lib/plugins/editing/index.js.map +1 -1
- package/lib/plugins/export/index.js.map +1 -1
- package/lib/plugins/filtering/filter-model.d.ts.map +1 -1
- package/lib/plugins/filtering/index.js +4 -5
- package/lib/plugins/filtering/index.js.map +1 -1
- package/lib/plugins/grouping-columns/index.js.map +1 -1
- package/lib/plugins/grouping-rows/index.js.map +1 -1
- package/lib/plugins/master-detail/index.js.map +1 -1
- package/lib/plugins/multi-sort/index.js.map +1 -1
- package/lib/plugins/pinned-columns/index.js.map +1 -1
- package/lib/plugins/pinned-rows/index.js.map +1 -1
- package/lib/plugins/pivot/index.js.map +1 -1
- package/lib/plugins/print/index.js.map +1 -1
- package/lib/plugins/reorder/index.js.map +1 -1
- package/lib/plugins/responsive/index.js.map +1 -1
- package/lib/plugins/row-reorder/index.js.map +1 -1
- package/lib/plugins/selection/index.js.map +1 -1
- package/lib/plugins/server-side/index.js.map +1 -1
- package/lib/plugins/tree/index.js.map +1 -1
- package/lib/plugins/undo-redo/index.js.map +1 -1
- package/lib/plugins/visibility/index.js.map +1 -1
- package/package.json +1 -1
- package/umd/grid.all.umd.js +26 -26
- package/umd/grid.all.umd.js.map +1 -1
- package/umd/grid.umd.js +21 -21
- package/umd/grid.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
|
@@ -377,7 +377,7 @@ class z {
|
|
|
377
377
|
}
|
|
378
378
|
// #endregion
|
|
379
379
|
}
|
|
380
|
-
const p = "@layer tbw-plugins{.tbw-context-menu{position:fixed;background:var(--tbw-context-menu-bg, var(--tbw-color-panel-bg));color:var(--tbw-context-menu-fg, var(--tbw-color-fg));border:1px solid var(--tbw-context-menu-border, var(--tbw-color-border));border-radius:var(--tbw-context-menu-radius, var(--tbw-border-radius));box-shadow:var(--tbw-context-menu-shadow, 0 2px 10px var(--tbw-color-shadow));min-width:var(--tbw-context-menu-min-width, var(--tbw-menu-min-width));padding:var(--tbw-spacing-xs) 0;z-index:10000;font-size:var(--tbw-context-menu-font-size, var(--tbw-font-size-sm));font-family:var(--tbw-context-menu-font-family, var(--tbw-font-family))}.tbw-context-menu-item{display:flex;align-items:center;padding:var(--tbw-context-menu-item-padding, var(--tbw-menu-item-padding));cursor:pointer;gap:var(--tbw-context-menu-item-gap, var(--tbw-menu-item-gap))}.tbw-context-menu-item:hover:not(.disabled){background:var(--tbw-context-menu-hover, var(--tbw-color-row-hover))}.tbw-context-menu-item.disabled{opacity:.5;cursor:default}.tbw-context-menu-item.danger{color:var(--tbw-context-menu-danger, var(--tbw-color-danger))}.tbw-context-menu-icon{width:var(--tbw-context-menu-icon-size, var(--tbw-icon-size));text-align:center}.tbw-context-menu-label{flex:1}.tbw-context-menu-shortcut{color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted));font-size:var(--tbw-context-menu-shortcut-size, var(--tbw-font-size-xs))}.tbw-context-menu-arrow{font-size:var(--tbw-context-menu-arrow-size, var(--tbw-font-size-2xs));color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted))}.tbw-context-menu-separator{height:1px;background:var(--tbw-context-menu-border, var(--tbw-color-border));margin:var(--tbw-spacing-xs) 0}}";
|
|
380
|
+
const p = "@layer tbw-plugins{.tbw-context-menu{position:fixed;background:var(--tbw-context-menu-bg, var(--tbw-color-panel-bg));color:var(--tbw-context-menu-fg, var(--tbw-color-fg));border:1px solid var(--tbw-context-menu-border, var(--tbw-color-border));border-radius:var(--tbw-context-menu-radius, var(--tbw-border-radius));box-shadow:var(--tbw-context-menu-shadow, 0 2px 10px var(--tbw-color-shadow));min-width:var(--tbw-context-menu-min-width, var(--tbw-menu-min-width));padding:var(--tbw-spacing-xs) 0;z-index:10000;font-size:var(--tbw-context-menu-font-size, var(--tbw-font-size-sm));font-family:var(--tbw-context-menu-font-family, var(--tbw-font-family))}.tbw-context-menu-item{display:flex;align-items:center;padding:var(--tbw-context-menu-item-padding, var(--tbw-menu-item-padding));cursor:pointer;gap:var(--tbw-context-menu-item-gap, var(--tbw-menu-item-gap))}.tbw-context-menu-item:hover:not(.disabled){background:var(--tbw-context-menu-hover, var(--tbw-color-row-hover))}.tbw-context-menu-item.disabled{opacity:.5;cursor:default}.tbw-context-menu-item.danger{color:var(--tbw-context-menu-danger, var(--tbw-color-danger))}.tbw-context-menu-icon{width:var(--tbw-context-menu-icon-size, var(--tbw-icon-size));text-align:center}.tbw-context-menu-label{flex:1}.tbw-context-menu-shortcut kbd{color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted));font-size:var(--tbw-context-menu-shortcut-size, var(--tbw-font-size-xs))}.tbw-context-menu-arrow{font-size:var(--tbw-context-menu-arrow-size, var(--tbw-font-size-2xs));color:var(--tbw-context-menu-muted, var(--tbw-color-fg-muted))}.tbw-context-menu-separator{height:1px;background:var(--tbw-context-menu-border, var(--tbw-color-border));margin:var(--tbw-spacing-xs) 0}}";
|
|
381
381
|
function v(l, e) {
|
|
382
382
|
return (typeof l == "function" ? l(e) : l).filter((n) => !(n.hidden === !0 || typeof n.hidden == "function" && n.hidden(e)));
|
|
383
383
|
}
|
|
@@ -393,7 +393,7 @@ function H(l, e) {
|
|
|
393
393
|
function y(l, e, t, n = R.submenuArrow) {
|
|
394
394
|
const s = document.createElement("div");
|
|
395
395
|
s.className = "tbw-context-menu", s.setAttribute("role", "menu");
|
|
396
|
-
const
|
|
396
|
+
const c = l.some((o) => !o.separator && o.icon);
|
|
397
397
|
for (const o of l) {
|
|
398
398
|
if (o.separator) {
|
|
399
399
|
const r = document.createElement("div");
|
|
@@ -402,31 +402,41 @@ function y(l, e, t, n = R.submenuArrow) {
|
|
|
402
402
|
}
|
|
403
403
|
const i = document.createElement("div");
|
|
404
404
|
i.className = "tbw-context-menu-item", o.cssClass && i.classList.add(o.cssClass), i.setAttribute("role", "menuitem"), i.setAttribute("data-id", o.id);
|
|
405
|
-
const
|
|
406
|
-
if (
|
|
405
|
+
const d = H(o, e);
|
|
406
|
+
if (d && (i.classList.add("disabled"), i.setAttribute("aria-disabled", "true")), o.icon) {
|
|
407
407
|
const r = document.createElement("span");
|
|
408
408
|
r.className = "tbw-context-menu-icon", r.innerHTML = o.icon, i.appendChild(r);
|
|
409
|
-
} else if (
|
|
409
|
+
} else if (c) {
|
|
410
410
|
const r = document.createElement("span");
|
|
411
411
|
r.className = "tbw-context-menu-icon", r.innerHTML = " ", i.appendChild(r);
|
|
412
412
|
}
|
|
413
413
|
const b = document.createElement("span");
|
|
414
414
|
if (b.className = "tbw-context-menu-label", b.textContent = o.name, i.appendChild(b), o.shortcut) {
|
|
415
415
|
const r = document.createElement("span");
|
|
416
|
-
r.className = "tbw-context-menu-shortcut",
|
|
416
|
+
if (r.className = "tbw-context-menu-shortcut", Array.isArray(o.shortcut))
|
|
417
|
+
o.shortcut.forEach((u, m) => {
|
|
418
|
+
m > 0 && r.appendChild(document.createTextNode("+"));
|
|
419
|
+
const a = document.createElement("kbd");
|
|
420
|
+
a.textContent = u, r.appendChild(a);
|
|
421
|
+
});
|
|
422
|
+
else {
|
|
423
|
+
const u = document.createElement("kbd");
|
|
424
|
+
u.textContent = o.shortcut, r.appendChild(u);
|
|
425
|
+
}
|
|
426
|
+
i.appendChild(r);
|
|
417
427
|
}
|
|
418
428
|
if (o.subMenu?.length) {
|
|
419
429
|
const r = document.createElement("span");
|
|
420
430
|
r.className = "tbw-context-menu-arrow", typeof n == "string" ? r.innerHTML = n : n instanceof HTMLElement && r.appendChild(n.cloneNode(!0)), i.appendChild(r), i.addEventListener("mouseenter", () => {
|
|
421
431
|
if (i.querySelector(".tbw-context-menu") || !o.subMenu) return;
|
|
422
|
-
const
|
|
423
|
-
|
|
432
|
+
const m = v(o.subMenu, e), a = y(m, e, t, n);
|
|
433
|
+
a.classList.add("tbw-context-submenu"), a.style.position = "absolute", a.style.left = "100%", a.style.top = "0", i.style.position = "relative", i.appendChild(a);
|
|
424
434
|
}), i.addEventListener("mouseleave", () => {
|
|
425
|
-
const
|
|
426
|
-
|
|
435
|
+
const u = i.querySelector(".tbw-context-menu");
|
|
436
|
+
u && u.remove();
|
|
427
437
|
});
|
|
428
438
|
}
|
|
429
|
-
!
|
|
439
|
+
!d && o.action && !o.subMenu && i.addEventListener("click", (r) => {
|
|
430
440
|
r.stopPropagation(), t(o);
|
|
431
441
|
}), s.appendChild(i);
|
|
432
442
|
}
|
|
@@ -434,12 +444,12 @@ function y(l, e, t, n = R.submenuArrow) {
|
|
|
434
444
|
}
|
|
435
445
|
function S(l, e, t) {
|
|
436
446
|
l.style.position = "fixed", l.style.left = `${e}px`, l.style.top = `${t}px`, l.style.visibility = "hidden", l.style.zIndex = "10000";
|
|
437
|
-
const n = l.getBoundingClientRect(), s = window.innerWidth,
|
|
447
|
+
const n = l.getBoundingClientRect(), s = window.innerWidth, c = window.innerHeight;
|
|
438
448
|
let o = e, i = t;
|
|
439
|
-
e + n.width > s && (o = e - n.width), t + n.height >
|
|
449
|
+
e + n.width > s && (o = e - n.width), t + n.height > c && (i = t - n.height), o = Math.max(0, o), i = Math.max(0, i), l.style.left = `${o}px`, l.style.top = `${i}px`, l.style.visibility = "visible";
|
|
440
450
|
}
|
|
441
451
|
const M = "getContextMenuItems";
|
|
442
|
-
let f = null, g = null,
|
|
452
|
+
let f = null, g = null, h = null, w = 0;
|
|
443
453
|
const x = [
|
|
444
454
|
{
|
|
445
455
|
id: "copy",
|
|
@@ -557,8 +567,8 @@ class _ extends z {
|
|
|
557
567
|
copyGridStyles(e) {
|
|
558
568
|
const t = this.gridElement;
|
|
559
569
|
if (!t) return;
|
|
560
|
-
const n = getComputedStyle(t), s = [],
|
|
561
|
-
|
|
570
|
+
const n = getComputedStyle(t), s = [], c = n.getPropertyValue("color-scheme").trim();
|
|
571
|
+
c && s.push(`color-scheme: ${c}`);
|
|
562
572
|
for (const o of _.CSS_VARS_TO_COPY) {
|
|
563
573
|
const i = n.getPropertyValue(o).trim();
|
|
564
574
|
i && s.push(`${o}: ${i}`);
|
|
@@ -569,7 +579,7 @@ class _ extends z {
|
|
|
569
579
|
}
|
|
570
580
|
}
|
|
571
581
|
installGlobalHandlers() {
|
|
572
|
-
!
|
|
582
|
+
!h && typeof document < "u" && typeof p == "string" && p && (h = document.createElement("style"), h.id = "tbw-context-menu-styles", h.textContent = p, document.head.appendChild(h)), f || (f = () => {
|
|
573
583
|
document.querySelectorAll(".tbw-context-menu").forEach((t) => t.remove());
|
|
574
584
|
}, document.addEventListener("click", f)), g || (g = (e) => {
|
|
575
585
|
e.key === "Escape" && document.querySelectorAll(".tbw-context-menu").forEach((n) => n.remove());
|
|
@@ -580,7 +590,7 @@ class _ extends z {
|
|
|
580
590
|
* Uses reference counting to ensure handlers persist while any grid uses the plugin.
|
|
581
591
|
*/
|
|
582
592
|
uninstallGlobalHandlers() {
|
|
583
|
-
w--, !(w > 0) && (f && (document.removeEventListener("click", f), f = null), g && (document.removeEventListener("keydown", g), g = null),
|
|
593
|
+
w--, !(w > 0) && (f && (document.removeEventListener("click", f), f = null), g && (document.removeEventListener("keydown", g), g = null), h && (h.remove(), h = null));
|
|
584
594
|
}
|
|
585
595
|
/**
|
|
586
596
|
* Query all plugins for context menu items via the query system.
|
|
@@ -591,7 +601,7 @@ class _ extends z {
|
|
|
591
601
|
const t = this.grid.query(M, e), n = [];
|
|
592
602
|
for (const s of t)
|
|
593
603
|
Array.isArray(s) && n.push(...s);
|
|
594
|
-
return n.sort((s,
|
|
604
|
+
return n.sort((s, c) => (s.order ?? 100) - (c.order ?? 100)), this.insertGroupSeparators(n);
|
|
595
605
|
}
|
|
596
606
|
/**
|
|
597
607
|
* Insert separators between groups of items with different order ranges.
|
|
@@ -606,14 +616,14 @@ class _ extends z {
|
|
|
606
616
|
t.push(s);
|
|
607
617
|
continue;
|
|
608
618
|
}
|
|
609
|
-
const
|
|
610
|
-
n >= 0 &&
|
|
611
|
-
id: `__sep-${n}-${
|
|
619
|
+
const c = Math.floor((s.order ?? 100) / 10);
|
|
620
|
+
n >= 0 && c !== n && t.push({
|
|
621
|
+
id: `__sep-${n}-${c}`,
|
|
612
622
|
label: "",
|
|
613
623
|
separator: !0,
|
|
614
624
|
action: () => {
|
|
615
625
|
}
|
|
616
|
-
}), n =
|
|
626
|
+
}), n = c, t.push(s);
|
|
617
627
|
}
|
|
618
628
|
return t;
|
|
619
629
|
}
|
|
@@ -642,29 +652,29 @@ class _ extends z {
|
|
|
642
652
|
t && t.getAttribute("data-context-menu-bound") !== "true" && (t.setAttribute("data-context-menu-bound", "true"), t.addEventListener("contextmenu", (n) => {
|
|
643
653
|
const s = n;
|
|
644
654
|
s.preventDefault();
|
|
645
|
-
const
|
|
646
|
-
let
|
|
655
|
+
const c = s.target, o = c.closest("[data-row][data-col]"), i = c.closest('[part~="header-cell"]');
|
|
656
|
+
let d;
|
|
647
657
|
if (o) {
|
|
648
|
-
const
|
|
649
|
-
|
|
658
|
+
const u = parseInt(o.getAttribute("data-row") ?? "-1", 10), m = parseInt(o.getAttribute("data-col") ?? "-1", 10), a = this.visibleColumns[m], E = this.rows[u], A = this.syncSelectionOnContextMenu(u);
|
|
659
|
+
d = {
|
|
650
660
|
row: E,
|
|
651
|
-
rowIndex:
|
|
652
|
-
column:
|
|
653
|
-
columnIndex:
|
|
654
|
-
field:
|
|
655
|
-
value: E?.[
|
|
661
|
+
rowIndex: u,
|
|
662
|
+
column: a,
|
|
663
|
+
columnIndex: m,
|
|
664
|
+
field: a?.field ?? "",
|
|
665
|
+
value: E?.[a?.field] ?? null,
|
|
656
666
|
isHeader: !1,
|
|
657
667
|
event: s,
|
|
658
668
|
selectedRows: A
|
|
659
669
|
};
|
|
660
670
|
} else if (i) {
|
|
661
|
-
const
|
|
662
|
-
|
|
671
|
+
const u = parseInt(i.getAttribute("data-col") ?? "-1", 10), m = this.visibleColumns[u];
|
|
672
|
+
d = {
|
|
663
673
|
row: null,
|
|
664
674
|
rowIndex: -1,
|
|
665
|
-
column:
|
|
666
|
-
columnIndex:
|
|
667
|
-
field:
|
|
675
|
+
column: m,
|
|
676
|
+
columnIndex: u,
|
|
677
|
+
field: m?.field ?? "",
|
|
668
678
|
value: null,
|
|
669
679
|
isHeader: !0,
|
|
670
680
|
event: s,
|
|
@@ -672,21 +682,21 @@ class _ extends z {
|
|
|
672
682
|
};
|
|
673
683
|
} else
|
|
674
684
|
return;
|
|
675
|
-
this.params =
|
|
676
|
-
const b = this.collectPluginItems(
|
|
677
|
-
let r = v(this.config.items ?? x,
|
|
685
|
+
this.params = d, this.position = { x: s.clientX, y: s.clientY };
|
|
686
|
+
const b = this.collectPluginItems(d);
|
|
687
|
+
let r = v(this.config.items ?? x, d);
|
|
678
688
|
if (b.length > 0) {
|
|
679
|
-
const
|
|
680
|
-
r.length > 0 &&
|
|
689
|
+
const u = this.convertPluginItems(b);
|
|
690
|
+
r.length > 0 && u.length > 0 ? r = [...r, { id: "__plugin-sep", name: "", separator: !0 }, ...u] : r = [...r, ...u];
|
|
681
691
|
}
|
|
682
692
|
r = I(r), r.length && (this.menuElement && this.menuElement.remove(), this.menuElement = y(
|
|
683
693
|
r,
|
|
684
|
-
|
|
685
|
-
(
|
|
686
|
-
|
|
694
|
+
d,
|
|
695
|
+
(u) => {
|
|
696
|
+
u.action && u.action(d), this.menuElement?.remove(), this.menuElement = null, this.isOpen = !1;
|
|
687
697
|
},
|
|
688
698
|
this.gridIcons.submenuArrow
|
|
689
|
-
), document.body.appendChild(this.menuElement), this.copyGridStyles(this.menuElement), S(this.menuElement, s.clientX, s.clientY), this.isOpen = !0, this.emit("context-menu-open", { params:
|
|
699
|
+
), document.body.appendChild(this.menuElement), this.copyGridStyles(this.menuElement), S(this.menuElement, s.clientX, s.clientY), this.isOpen = !0, this.emit("context-menu-open", { params: d, items: r }));
|
|
690
700
|
}));
|
|
691
701
|
}
|
|
692
702
|
// #endregion
|
|
@@ -708,10 +718,10 @@ class _ extends z {
|
|
|
708
718
|
isHeader: n.isHeader ?? !1,
|
|
709
719
|
event: n.event ?? new MouseEvent("contextmenu"),
|
|
710
720
|
selectedRows: n.selectedRows ?? []
|
|
711
|
-
},
|
|
721
|
+
}, c = this.collectPluginItems(s);
|
|
712
722
|
let o = v(this.config.items ?? x, s);
|
|
713
|
-
if (
|
|
714
|
-
const i = this.convertPluginItems(
|
|
723
|
+
if (c.length > 0) {
|
|
724
|
+
const i = this.convertPluginItems(c);
|
|
715
725
|
o.length > 0 && i.length > 0 ? o = [...o, { id: "__plugin-sep", name: "", separator: !0 }, ...i] : o = [...o, ...i];
|
|
716
726
|
}
|
|
717
727
|
o = I(o), this.menuElement && this.menuElement.remove(), this.menuElement = y(
|