@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.
Files changed (50) hide show
  1. package/all.js +33 -11
  2. package/all.js.map +1 -1
  3. package/index.js +877 -865
  4. package/index.js.map +1 -1
  5. package/lib/core/internal/columns.d.ts +0 -5
  6. package/lib/core/internal/columns.d.ts.map +1 -1
  7. package/lib/core/internal/rows.d.ts.map +1 -1
  8. package/lib/core/types.d.ts +12 -0
  9. package/lib/core/types.d.ts.map +1 -1
  10. package/lib/plugins/clipboard/index.js.map +1 -1
  11. package/lib/plugins/column-virtualization/index.js.map +1 -1
  12. package/lib/plugins/context-menu/index.js +59 -49
  13. package/lib/plugins/context-menu/index.js.map +1 -1
  14. package/lib/plugins/context-menu/menu.d.ts.map +1 -1
  15. package/lib/plugins/context-menu/types.d.ts +4 -4
  16. package/lib/plugins/context-menu/types.d.ts.map +1 -1
  17. package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
  18. package/lib/plugins/editing/index.js +228 -216
  19. package/lib/plugins/editing/index.js.map +1 -1
  20. package/lib/plugins/export/index.js.map +1 -1
  21. package/lib/plugins/filtering/filter-model.d.ts.map +1 -1
  22. package/lib/plugins/filtering/index.js +4 -5
  23. package/lib/plugins/filtering/index.js.map +1 -1
  24. package/lib/plugins/grouping-columns/index.js.map +1 -1
  25. package/lib/plugins/grouping-rows/index.js.map +1 -1
  26. package/lib/plugins/master-detail/index.js.map +1 -1
  27. package/lib/plugins/multi-sort/index.js.map +1 -1
  28. package/lib/plugins/pinned-columns/index.js.map +1 -1
  29. package/lib/plugins/pinned-rows/index.js.map +1 -1
  30. package/lib/plugins/pivot/index.js.map +1 -1
  31. package/lib/plugins/print/index.js.map +1 -1
  32. package/lib/plugins/reorder/index.js.map +1 -1
  33. package/lib/plugins/responsive/index.js.map +1 -1
  34. package/lib/plugins/row-reorder/index.js.map +1 -1
  35. package/lib/plugins/selection/index.js.map +1 -1
  36. package/lib/plugins/server-side/index.js.map +1 -1
  37. package/lib/plugins/tree/index.js.map +1 -1
  38. package/lib/plugins/undo-redo/index.js.map +1 -1
  39. package/lib/plugins/visibility/index.js.map +1 -1
  40. package/package.json +1 -1
  41. package/umd/grid.all.umd.js +26 -26
  42. package/umd/grid.all.umd.js.map +1 -1
  43. package/umd/grid.umd.js +21 -21
  44. package/umd/grid.umd.js.map +1 -1
  45. package/umd/plugins/context-menu.umd.js +1 -1
  46. package/umd/plugins/context-menu.umd.js.map +1 -1
  47. package/umd/plugins/editing.umd.js +1 -1
  48. package/umd/plugins/editing.umd.js.map +1 -1
  49. package/umd/plugins/filtering.umd.js +1 -1
  50. 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 u = l.some((o) => !o.separator && o.icon);
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 a = H(o, e);
406
- if (a && (i.classList.add("disabled"), i.setAttribute("aria-disabled", "true")), o.icon) {
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 (u) {
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", r.textContent = o.shortcut, i.appendChild(r);
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 h = v(o.subMenu, e), d = y(h, e, t, n);
423
- d.classList.add("tbw-context-submenu"), d.style.position = "absolute", d.style.left = "100%", d.style.top = "0", i.style.position = "relative", i.appendChild(d);
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 c = i.querySelector(".tbw-context-menu");
426
- c && c.remove();
435
+ const u = i.querySelector(".tbw-context-menu");
436
+ u && u.remove();
427
437
  });
428
438
  }
429
- !a && o.action && !o.subMenu && i.addEventListener("click", (r) => {
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, u = window.innerHeight;
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 > u && (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";
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, m = null, w = 0;
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 = [], u = n.getPropertyValue("color-scheme").trim();
561
- u && s.push(`color-scheme: ${u}`);
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
- !m && typeof document < "u" && typeof p == "string" && p && (m = document.createElement("style"), m.id = "tbw-context-menu-styles", m.textContent = p, document.head.appendChild(m)), f || (f = () => {
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), m && (m.remove(), m = 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, u) => (s.order ?? 100) - (u.order ?? 100)), this.insertGroupSeparators(n);
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 u = Math.floor((s.order ?? 100) / 10);
610
- n >= 0 && u !== n && t.push({
611
- id: `__sep-${n}-${u}`,
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 = u, t.push(s);
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 u = s.target, o = u.closest("[data-row][data-col]"), i = u.closest('[part~="header-cell"]');
646
- let a;
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 c = parseInt(o.getAttribute("data-row") ?? "-1", 10), h = parseInt(o.getAttribute("data-col") ?? "-1", 10), d = this.visibleColumns[h], E = this.rows[c], A = this.syncSelectionOnContextMenu(c);
649
- a = {
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: c,
652
- column: d,
653
- columnIndex: h,
654
- field: d?.field ?? "",
655
- value: E?.[d?.field] ?? null,
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 c = parseInt(i.getAttribute("data-col") ?? "-1", 10), h = this.visibleColumns[c];
662
- a = {
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: h,
666
- columnIndex: c,
667
- field: h?.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 = a, this.position = { x: s.clientX, y: s.clientY };
676
- const b = this.collectPluginItems(a);
677
- let r = v(this.config.items ?? x, a);
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 c = this.convertPluginItems(b);
680
- r.length > 0 && c.length > 0 ? r = [...r, { id: "__plugin-sep", name: "", separator: !0 }, ...c] : r = [...r, ...c];
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
- a,
685
- (c) => {
686
- c.action && c.action(a), this.menuElement?.remove(), this.menuElement = null, this.isOpen = !1;
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: a, items: r }));
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
- }, u = this.collectPluginItems(s);
721
+ }, c = this.collectPluginItems(s);
712
722
  let o = v(this.config.items ?? x, s);
713
- if (u.length > 0) {
714
- const i = this.convertPluginItems(u);
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(