@toolbox-web/grid 1.0.0 → 1.1.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 (87) hide show
  1. package/all.d.ts +1 -0
  2. package/all.d.ts.map +1 -1
  3. package/all.js +1655 -1444
  4. package/all.js.map +1 -1
  5. package/index.js +438 -401
  6. package/index.js.map +1 -1
  7. package/lib/core/grid.d.ts.map +1 -1
  8. package/lib/core/internal/rows.d.ts.map +1 -1
  9. package/lib/core/internal/validate-config.d.ts +10 -0
  10. package/lib/core/internal/validate-config.d.ts.map +1 -1
  11. package/lib/core/plugin/base-plugin.d.ts +101 -0
  12. package/lib/core/plugin/base-plugin.d.ts.map +1 -1
  13. package/lib/core/plugin/index.d.ts +1 -1
  14. package/lib/core/plugin/index.d.ts.map +1 -1
  15. package/lib/plugins/clipboard/index.js +22 -0
  16. package/lib/plugins/clipboard/index.js.map +1 -1
  17. package/lib/plugins/column-virtualization/index.js +48 -26
  18. package/lib/plugins/column-virtualization/index.js.map +1 -1
  19. package/lib/plugins/context-menu/index.js +64 -42
  20. package/lib/plugins/context-menu/index.js.map +1 -1
  21. package/lib/plugins/editing/EditingPlugin.d.ts +6 -1
  22. package/lib/plugins/editing/EditingPlugin.d.ts.map +1 -1
  23. package/lib/plugins/editing/index.js +50 -4
  24. package/lib/plugins/editing/index.js.map +1 -1
  25. package/lib/plugins/export/index.js +36 -14
  26. package/lib/plugins/export/index.js.map +1 -1
  27. package/lib/plugins/filtering/index.js +63 -41
  28. package/lib/plugins/filtering/index.js.map +1 -1
  29. package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts +6 -1
  30. package/lib/plugins/grouping-columns/GroupingColumnsPlugin.d.ts.map +1 -1
  31. package/lib/plugins/grouping-columns/index.js +47 -6
  32. package/lib/plugins/grouping-columns/index.js.map +1 -1
  33. package/lib/plugins/grouping-rows/index.js +22 -0
  34. package/lib/plugins/grouping-rows/index.js.map +1 -1
  35. package/lib/plugins/master-detail/index.js +22 -0
  36. package/lib/plugins/master-detail/index.js.map +1 -1
  37. package/lib/plugins/multi-sort/index.js +22 -0
  38. package/lib/plugins/multi-sort/index.js.map +1 -1
  39. package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts +6 -1
  40. package/lib/plugins/pinned-columns/PinnedColumnsPlugin.d.ts.map +1 -1
  41. package/lib/plugins/pinned-columns/index.js +36 -0
  42. package/lib/plugins/pinned-columns/index.js.map +1 -1
  43. package/lib/plugins/pinned-rows/index.js +22 -0
  44. package/lib/plugins/pinned-rows/index.js.map +1 -1
  45. package/lib/plugins/pivot/index.js +22 -0
  46. package/lib/plugins/pivot/index.js.map +1 -1
  47. package/lib/plugins/reorder/index.js +22 -0
  48. package/lib/plugins/reorder/index.js.map +1 -1
  49. package/lib/plugins/responsive/ResponsivePlugin.d.ts +123 -0
  50. package/lib/plugins/responsive/ResponsivePlugin.d.ts.map +1 -0
  51. package/lib/plugins/responsive/index.d.ts +11 -0
  52. package/lib/plugins/responsive/index.d.ts.map +1 -0
  53. package/lib/plugins/responsive/index.js +589 -0
  54. package/lib/plugins/responsive/index.js.map +1 -0
  55. package/lib/plugins/responsive/types.d.ts +133 -0
  56. package/lib/plugins/responsive/types.d.ts.map +1 -0
  57. package/lib/plugins/selection/SelectionPlugin.d.ts +6 -1
  58. package/lib/plugins/selection/SelectionPlugin.d.ts.map +1 -1
  59. package/lib/plugins/selection/index.d.ts +1 -1
  60. package/lib/plugins/selection/index.d.ts.map +1 -1
  61. package/lib/plugins/selection/index.js +105 -63
  62. package/lib/plugins/selection/index.js.map +1 -1
  63. package/lib/plugins/selection/types.d.ts +26 -0
  64. package/lib/plugins/selection/types.d.ts.map +1 -1
  65. package/lib/plugins/server-side/index.js +22 -0
  66. package/lib/plugins/server-side/index.js.map +1 -1
  67. package/lib/plugins/tree/index.js +22 -0
  68. package/lib/plugins/tree/index.js.map +1 -1
  69. package/lib/plugins/undo-redo/index.js +27 -5
  70. package/lib/plugins/undo-redo/index.js.map +1 -1
  71. package/lib/plugins/visibility/index.js +22 -0
  72. package/lib/plugins/visibility/index.js.map +1 -1
  73. package/package.json +1 -1
  74. package/umd/grid.all.umd.js +28 -22
  75. package/umd/grid.all.umd.js.map +1 -1
  76. package/umd/grid.umd.js +18 -14
  77. package/umd/grid.umd.js.map +1 -1
  78. package/umd/plugins/editing.umd.js +1 -1
  79. package/umd/plugins/editing.umd.js.map +1 -1
  80. package/umd/plugins/grouping-columns.umd.js +1 -1
  81. package/umd/plugins/grouping-columns.umd.js.map +1 -1
  82. package/umd/plugins/pinned-columns.umd.js +1 -1
  83. package/umd/plugins/pinned-columns.umd.js.map +1 -1
  84. package/umd/plugins/responsive.umd.js +2 -0
  85. package/umd/plugins/responsive.umd.js.map +1 -0
  86. package/umd/plugins/selection.umd.js +3 -1
  87. package/umd/plugins/selection.umd.js.map +1 -1
@@ -25,6 +25,28 @@ class I {
25
25
  * ```
26
26
  */
27
27
  static dependencies;
28
+ /**
29
+ * Plugin manifest - declares owned properties, config rules, and hook priorities.
30
+ *
31
+ * This is read by the configuration validator to:
32
+ * - Validate that required plugins are loaded when their properties are used
33
+ * - Execute configRules to detect invalid/conflicting settings
34
+ * - Order hook execution based on priority
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * static override readonly manifest: PluginManifest<MyConfig> = {
39
+ * ownedProperties: [
40
+ * { property: 'myProp', level: 'column', description: 'the "myProp" column property' },
41
+ * ],
42
+ * configRules: [
43
+ * { id: 'myPlugin/conflict', severity: 'warn', message: '...', check: (c) => c.a && c.b },
44
+ * ],
45
+ * };
46
+ * ```
47
+ */
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ static manifest;
28
50
  /**
29
51
  * Plugin version - defaults to grid version for built-in plugins.
30
52
  * Third-party plugins can override with their own semver.
@@ -296,46 +318,46 @@ function M(r, e) {
296
318
  function x(r, e, t, n = C.submenuArrow) {
297
319
  const l = document.createElement("div");
298
320
  l.className = "tbw-context-menu", l.setAttribute("role", "menu");
299
- for (const o of r) {
300
- if (o.separator) {
301
- const s = document.createElement("div");
302
- s.className = "tbw-context-menu-separator", s.setAttribute("role", "separator"), l.appendChild(s);
321
+ for (const s of r) {
322
+ if (s.separator) {
323
+ const o = document.createElement("div");
324
+ o.className = "tbw-context-menu-separator", o.setAttribute("role", "separator"), l.appendChild(o);
303
325
  continue;
304
326
  }
305
327
  const i = document.createElement("div");
306
- i.className = "tbw-context-menu-item", o.cssClass && i.classList.add(o.cssClass), i.setAttribute("role", "menuitem"), i.setAttribute("data-id", o.id);
307
- const d = M(o, e);
308
- if (d && (i.classList.add("disabled"), i.setAttribute("aria-disabled", "true")), o.icon) {
309
- const s = document.createElement("span");
310
- s.className = "tbw-context-menu-icon", s.innerHTML = o.icon, i.appendChild(s);
328
+ i.className = "tbw-context-menu-item", s.cssClass && i.classList.add(s.cssClass), i.setAttribute("role", "menuitem"), i.setAttribute("data-id", s.id);
329
+ const d = M(s, e);
330
+ if (d && (i.classList.add("disabled"), i.setAttribute("aria-disabled", "true")), s.icon) {
331
+ const o = document.createElement("span");
332
+ o.className = "tbw-context-menu-icon", o.innerHTML = s.icon, i.appendChild(o);
311
333
  }
312
- const a = document.createElement("span");
313
- if (a.className = "tbw-context-menu-label", a.textContent = o.name, i.appendChild(a), o.shortcut) {
314
- const s = document.createElement("span");
315
- s.className = "tbw-context-menu-shortcut", s.textContent = o.shortcut, i.appendChild(s);
334
+ const u = document.createElement("span");
335
+ if (u.className = "tbw-context-menu-label", u.textContent = s.name, i.appendChild(u), s.shortcut) {
336
+ const o = document.createElement("span");
337
+ o.className = "tbw-context-menu-shortcut", o.textContent = s.shortcut, i.appendChild(o);
316
338
  }
317
- if (o.subMenu?.length) {
318
- const s = document.createElement("span");
319
- s.className = "tbw-context-menu-arrow", typeof n == "string" ? s.innerHTML = n : n instanceof HTMLElement && s.appendChild(n.cloneNode(!0)), i.appendChild(s), i.addEventListener("mouseenter", () => {
320
- if (i.querySelector(".tbw-context-menu") || !o.subMenu) return;
321
- const f = v(o.subMenu, e), c = x(f, e, t, n);
339
+ if (s.subMenu?.length) {
340
+ const o = document.createElement("span");
341
+ o.className = "tbw-context-menu-arrow", typeof n == "string" ? o.innerHTML = n : n instanceof HTMLElement && o.appendChild(n.cloneNode(!0)), i.appendChild(o), i.addEventListener("mouseenter", () => {
342
+ if (i.querySelector(".tbw-context-menu") || !s.subMenu) return;
343
+ const f = v(s.subMenu, e), c = x(f, e, t, n);
322
344
  c.classList.add("tbw-context-submenu"), c.style.position = "absolute", c.style.left = "100%", c.style.top = "0", i.style.position = "relative", i.appendChild(c);
323
345
  }), i.addEventListener("mouseleave", () => {
324
- const u = i.querySelector(".tbw-context-menu");
325
- u && u.remove();
346
+ const a = i.querySelector(".tbw-context-menu");
347
+ a && a.remove();
326
348
  });
327
349
  }
328
- !d && o.action && !o.subMenu && i.addEventListener("click", (s) => {
329
- s.stopPropagation(), t(o);
350
+ !d && s.action && !s.subMenu && i.addEventListener("click", (o) => {
351
+ o.stopPropagation(), t(s);
330
352
  }), l.appendChild(i);
331
353
  }
332
354
  return l;
333
355
  }
334
356
  function y(r, e, t) {
335
357
  r.style.position = "fixed", r.style.left = `${e}px`, r.style.top = `${t}px`, r.style.visibility = "hidden", r.style.zIndex = "10000";
336
- const n = r.getBoundingClientRect(), l = window.innerWidth, o = window.innerHeight;
358
+ const n = r.getBoundingClientRect(), l = window.innerWidth, s = window.innerHeight;
337
359
  let i = e, d = t;
338
- e + n.width > l && (i = e - n.width), t + n.height > o && (d = t - n.height), i = Math.max(0, i), d = Math.max(0, d), r.style.left = `${i}px`, r.style.top = `${d}px`, r.style.visibility = "visible";
360
+ e + n.width > l && (i = e - n.width), t + n.height > s && (d = t - n.height), i = Math.max(0, i), d = Math.max(0, d), r.style.left = `${i}px`, r.style.top = `${d}px`, r.style.visibility = "visible";
339
361
  }
340
362
  let h = null, b = null, m = null, p = 0;
341
363
  const w = [
@@ -406,13 +428,13 @@ class H extends I {
406
428
  t && t.getAttribute("data-context-menu-bound") !== "true" && (t.setAttribute("data-context-menu-bound", "true"), t.addEventListener("contextmenu", (n) => {
407
429
  const l = n;
408
430
  l.preventDefault();
409
- const o = l.target, i = o.closest("[data-row][data-col]"), d = o.closest(".header-cell");
410
- let a;
431
+ const s = l.target, i = s.closest("[data-row][data-col]"), d = s.closest(".header-cell");
432
+ let u;
411
433
  if (i) {
412
- const u = parseInt(i.getAttribute("data-row") ?? "-1", 10), f = parseInt(i.getAttribute("data-col") ?? "-1", 10), c = this.columns[f], E = this.rows[u];
413
- a = {
434
+ const a = parseInt(i.getAttribute("data-row") ?? "-1", 10), f = parseInt(i.getAttribute("data-col") ?? "-1", 10), c = this.columns[f], E = this.rows[a];
435
+ u = {
414
436
  row: E,
415
- rowIndex: u,
437
+ rowIndex: a,
416
438
  column: c,
417
439
  columnIndex: f,
418
440
  field: c?.field ?? "",
@@ -421,12 +443,12 @@ class H extends I {
421
443
  event: l
422
444
  };
423
445
  } else if (d) {
424
- const u = parseInt(d.getAttribute("data-col") ?? "-1", 10), f = this.columns[u];
425
- a = {
446
+ const a = parseInt(d.getAttribute("data-col") ?? "-1", 10), f = this.columns[a];
447
+ u = {
426
448
  row: null,
427
449
  rowIndex: -1,
428
450
  column: f,
429
- columnIndex: u,
451
+ columnIndex: a,
430
452
  field: f?.field ?? "",
431
453
  value: null,
432
454
  isHeader: !0,
@@ -434,16 +456,16 @@ class H extends I {
434
456
  };
435
457
  } else
436
458
  return;
437
- this.params = a, this.position = { x: l.clientX, y: l.clientY };
438
- const s = v(this.config.items ?? w, a);
439
- s.length && (this.menuElement && this.menuElement.remove(), this.menuElement = x(
440
- s,
441
- a,
442
- (u) => {
443
- u.action && u.action(a), this.menuElement?.remove(), this.menuElement = null, this.isOpen = !1;
459
+ this.params = u, this.position = { x: l.clientX, y: l.clientY };
460
+ const o = v(this.config.items ?? w, u);
461
+ o.length && (this.menuElement && this.menuElement.remove(), this.menuElement = x(
462
+ o,
463
+ u,
464
+ (a) => {
465
+ a.action && a.action(u), this.menuElement?.remove(), this.menuElement = null, this.isOpen = !1;
444
466
  },
445
467
  this.gridIcons.submenuArrow
446
- ), document.body.appendChild(this.menuElement), y(this.menuElement, l.clientX, l.clientY), this.isOpen = !0, this.emit("context-menu-open", { params: a, items: s }));
468
+ ), document.body.appendChild(this.menuElement), y(this.menuElement, l.clientX, l.clientY), this.isOpen = !0, this.emit("context-menu-open", { params: u, items: o }));
447
469
  }));
448
470
  }
449
471
  // #endregion
@@ -464,9 +486,9 @@ class H extends I {
464
486
  value: n.value ?? null,
465
487
  isHeader: n.isHeader ?? !1,
466
488
  event: n.event ?? new MouseEvent("contextmenu")
467
- }, o = v(this.config.items ?? w, l);
489
+ }, s = v(this.config.items ?? w, l);
468
490
  this.menuElement && this.menuElement.remove(), this.menuElement = x(
469
- o,
491
+ s,
470
492
  l,
471
493
  (i) => {
472
494
  i.action && i.action(l), this.menuElement?.remove(), this.menuElement = null, this.isOpen = !1;