intable 0.0.26 → 0.0.28

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 (41) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +378 -378
  3. package/dist/__uno.css +1 -1
  4. package/dist/components/AndOrFields.d.ts +1 -1
  5. package/dist/components/AndOrFields.js +193 -74
  6. package/dist/components/Filter.d.ts +0 -1
  7. package/dist/hooks/useVirtualizer.d.ts +3 -0
  8. package/dist/hooks/useVirtualizer.js +12 -2
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.js +17 -11
  11. package/dist/loading-bold.js +6 -0
  12. package/dist/plugins/CellMergePlugin.js +15 -16
  13. package/dist/plugins/CellSelectionPlugin.js +97 -69
  14. package/dist/plugins/CommandPlugin.js +3 -1
  15. package/dist/plugins/CopyPastePlugin.js +1 -1
  16. package/dist/plugins/DiffPlugin.d.ts +0 -1
  17. package/dist/plugins/DiffPlugin.js +2 -2
  18. package/dist/plugins/EditablePlugin.js +74 -74
  19. package/dist/plugins/ExpandPlugin.js +0 -1
  20. package/dist/plugins/FilterPlugin.js +95 -53
  21. package/dist/plugins/ImportExportPlugin.d.ts +9 -0
  22. package/dist/plugins/ImportExportPlugin.js +37 -0
  23. package/dist/plugins/LoadMorePlugin.js +1 -1
  24. package/dist/plugins/MenuPlugin.d.ts +1 -0
  25. package/dist/plugins/MenuPlugin.js +7 -0
  26. package/dist/plugins/RenderPlugin/index.d.ts +3 -3
  27. package/dist/plugins/RenderPlugin/index.js +12 -12
  28. package/dist/plugins/ResizePlugin.js +45 -36
  29. package/dist/plugins/RowGroupPlugin.js +1 -1
  30. package/dist/plugins/TreePlugin.js +25 -23
  31. package/dist/plugins/ValidatorPlugin.js +14 -12
  32. package/dist/plugins/VirtualScrollPlugin.js +16 -2
  33. package/dist/style.css +2 -2
  34. package/dist/theme/antd.scss +41 -41
  35. package/dist/theme/dark.scss +46 -46
  36. package/dist/theme/element-plus.scss +38 -38
  37. package/dist/theme/github.scss +80 -80
  38. package/dist/theme/material.scss +73 -73
  39. package/dist/theme/shadcn.scss +66 -66
  40. package/dist/theme/stripe.scss +57 -57
  41. package/package.json +3 -2
@@ -1,3 +1,4 @@
1
+ import { toArr } from "../utils.js";
1
2
  import { normalizeType } from "../components/AndOrFields.js";
2
3
  import { Filter } from "../components/Filter.js";
3
4
  import { createComponent, memo, mergeProps } from "solid-js/web";
@@ -6,32 +7,41 @@ function isBlank(e) {
6
7
  return e == null || String(e).trim() === "";
7
8
  }
8
9
  function toNum(e) {
9
- let c = Number(e);
10
- return Number.isNaN(c) ? null : c;
10
+ let a = Number(e);
11
+ return Number.isNaN(a) ? null : a;
11
12
  }
12
13
  function toDateTs(e) {
13
14
  if (isBlank(e)) return null;
14
- let c = new Date(String(e)).getTime();
15
- return Number.isNaN(c) ? null : c;
15
+ let a = new Date(String(e)).getTime();
16
+ return Number.isNaN(a) ? null : a;
16
17
  }
17
18
  function toBool(e) {
18
19
  if (typeof e == "boolean") return e;
19
20
  if (typeof e == "number") return e !== 0;
20
- let c = String(e ?? "").trim().toLowerCase();
21
+ let a = String(e ?? "").trim().toLowerCase();
21
22
  return [
22
23
  "1",
23
24
  "true",
24
25
  "yes",
25
26
  "y",
26
27
  "on"
27
- ].includes(c) ? !0 : [
28
+ ].includes(a) ? !0 : [
28
29
  "0",
29
30
  "false",
30
31
  "no",
31
32
  "n",
32
33
  "off",
33
34
  ""
34
- ].includes(c) ? !1 : !!e;
35
+ ].includes(a) ? !1 : !!e;
36
+ }
37
+ function toList(e) {
38
+ return Array.isArray(e) ? e : e == null || String(e).trim() === "" ? [] : String(e).split(",").map((e) => e.trim()).filter(Boolean);
39
+ }
40
+ function toPair(e) {
41
+ if (Array.isArray(e)) return [e[0], e[1]];
42
+ if (e == null || String(e).trim() === "") return [void 0, void 0];
43
+ let a = String(e).split(",").map((e) => e.trim());
44
+ return [a[0], a[1]];
35
45
  }
36
46
  function isRuleNode(e) {
37
47
  return "field" in e;
@@ -42,76 +52,108 @@ function hasActiveRule(e) {
42
52
  function hasActiveTree(e) {
43
53
  return e ? isRuleNode(e) ? hasActiveRule(e) : (e.children ?? []).some(hasActiveTree) : !1;
44
54
  }
45
- function matchFilter(e, c, l) {
46
- let u = c.op;
47
- if (u === "blank") return isBlank(e);
48
- if (u === "noblank") return !isBlank(e);
49
- if (u === "true") return toBool(e);
50
- if (u === "false") return !toBool(e);
51
- let d = c.value;
52
- if (l === "number") {
53
- let c = toNum(e), l = toNum(d);
54
- if (c == null || l == null) return !1;
55
- if (u === "eq") return c === l;
56
- if (u === "lt") return c < l;
57
- if (u === "gt") return c > l;
58
- if (u === "lte") return c <= l;
59
- if (u === "gte") return c >= l;
55
+ function matchFilter(e, a, o) {
56
+ let s = a.op;
57
+ if (s === "blank") return isBlank(e);
58
+ if (s === "noblank") return !isBlank(e);
59
+ if (s === "true") return toBool(e);
60
+ if (s === "false") return !toBool(e);
61
+ let c = a.value;
62
+ if (o === "number") {
63
+ let a = toNum(e), o = toNum(c), l = toList(c).map(toNum).filter((e) => e != null), [u, d] = toPair(c), p = toNum(u), m = toNum(d);
64
+ if (a == null) return !1;
65
+ if (s === "eq") return a === o;
66
+ if (s === "ne") return a !== o;
67
+ if (s === "in") return l.includes(a);
68
+ if (s === "not_in") return !l.includes(a);
69
+ if (s === "between") return p != null && m != null && a >= Math.min(p, m) && a <= Math.max(p, m);
70
+ if (s === "not_between") return p != null && m != null && (a < Math.min(p, m) || a > Math.max(p, m));
71
+ if (o == null) return !1;
72
+ if (s === "lt") return a < o;
73
+ if (s === "gt") return a > o;
74
+ if (s === "lte") return a <= o;
75
+ if (s === "gte") return a >= o;
60
76
  }
61
- if (l === "date") {
62
- let c = toDateTs(e), l = toDateTs(d);
63
- if (c == null || l == null) return !1;
64
- if (u === "eq") return c === l;
65
- if (u === "lt") return c < l;
66
- if (u === "gt") return c > l;
67
- if (u === "lte") return c <= l;
68
- if (u === "gte") return c >= l;
77
+ if (o === "date") {
78
+ let a = toDateTs(e), o = toDateTs(c), l = toList(c).map(toDateTs).filter((e) => e != null), [u, d] = toPair(c), f = toDateTs(u), m = toDateTs(d);
79
+ if (a == null) return !1;
80
+ if (s === "eq") return a === o;
81
+ if (s === "ne") return a !== o;
82
+ if (s === "in") return l.includes(a);
83
+ if (s === "not_in") return !l.includes(a);
84
+ if (s === "between") return f != null && m != null && a >= Math.min(f, m) && a <= Math.max(f, m);
85
+ if (s === "not_between") return f != null && m != null && (a < Math.min(f, m) || a > Math.max(f, m));
86
+ if (o == null) return !1;
87
+ if (s === "lt") return a < o;
88
+ if (s === "gt") return a > o;
89
+ if (s === "lte") return a <= o;
90
+ if (s === "gte") return a >= o;
69
91
  }
70
- let f = String(e ?? "").toLowerCase(), g = String(d ?? "").toLowerCase();
71
- return u === "eq" ? f === g : u === "neq" ? f !== g : u === "startwith" ? f.startsWith(g) : u === "endwith" ? f.endsWith(g) : f.includes(g);
92
+ let l = String(e ?? "").toLowerCase(), u = String(c ?? "").toLowerCase(), h = toList(c).map((e) => String(e).toLowerCase()), [g, _] = toPair(c), v = String(g ?? "").toLowerCase(), y = String(_ ?? "").toLowerCase();
93
+ return s === "eq" ? l === u : s === "ne" ? l !== u : s === "in" ? h.includes(l) : s === "not_in" ? !h.includes(l) : s === "between" ? v !== "" && y !== "" && l >= (v < y ? v : y) && l <= (v < y ? y : v) : s === "not_between" ? v !== "" && y !== "" && (l < (v < y ? v : y) || l > (v < y ? y : v)) : s === "startwith" ? l.startsWith(u) : s === "endwith" ? l.endsWith(u) : l.includes(u);
72
94
  }
73
- function evaluateFilterTree(e, c, l) {
74
- if (isRuleNode(c)) return hasActiveRule(c) ? matchFilter(e, c, l) : !0;
75
- let u = (c.children ?? []).filter(hasActiveTree);
76
- return u.length ? c.op === "or" ? u.some((c) => evaluateFilterTree(e, c, l)) : u.every((c) => evaluateFilterTree(e, c, l)) : !0;
95
+ function evaluateFilterTree(e, a, o) {
96
+ if (isRuleNode(a)) return hasActiveRule(a) ? matchFilter(e, a, o) : !0;
97
+ let s = (a.children ?? []).filter(hasActiveTree);
98
+ return s.length ? a.op === "or" ? s.some((a) => evaluateFilterTree(e, a, o)) : s.every((a) => evaluateFilterTree(e, a, o)) : !0;
77
99
  }
78
- function passesFilters(c, l, u, d) {
79
- return u.every((u) => {
80
- if (u[d] || !u.filterable) return !0;
81
- let f = l[u.id];
82
- return !f || !hasActiveTree(f) ? !0 : evaluateFilterTree(c[u.id], f, normalizeType(u));
100
+ function passesFilters(e, o, s, c) {
101
+ return s.every((s) => {
102
+ if (s[c] || !s.filterable) return !0;
103
+ let l = o[s.id];
104
+ return !l || !hasActiveTree(l) ? !0 : evaluateFilterTree(e[s.id], l, normalizeType(s));
83
105
  });
84
106
  }
85
107
  const FilterPlugin = {
86
108
  name: "filter",
87
109
  store: () => ({ filters: {} }),
88
110
  rewriteProps: {
89
- filter: ({ filter: e }, { store: c }) => ({
111
+ filter: ({ filter: e }) => ({
90
112
  autoMatch: !0,
91
113
  ...e
92
114
  }),
93
- data: ({ data: e }, { store: c }) => {
115
+ newRow: ({ newRow: a }, { store: o }) => function(...s) {
116
+ let c = a(...s), { filters: l, props: u } = o, { columns: d } = u;
117
+ return d.forEach((a) => {
118
+ if (a[o.internal] || !a.filterable) return;
119
+ let s = l[a.id];
120
+ s && isRuleNode(s) && (c[a.id] = {
121
+ ne: `not ${s.value}`,
122
+ between: toArr(s.value)[0],
123
+ not_between: NaN,
124
+ in: toArr(s.value)[0],
125
+ not_in: "",
126
+ lt: s.value - 1,
127
+ gt: s.value + 1,
128
+ blank: "",
129
+ noblank: "default",
130
+ true: !0,
131
+ false: !1
132
+ }[s.op] ?? s.value);
133
+ }), c;
134
+ },
135
+ data: ({ data: e }, { store: a }) => {
94
136
  if (!e) return e;
95
- let { filters: l } = c, { columns: u, filter: d } = c.props;
96
- return !d.autoMatch || !Object.values(l).some(hasActiveTree) ? e : e.filter((e) => passesFilters(e, l, u, c.internal));
137
+ let { filters: o } = a, { columns: s, filter: c } = a.props;
138
+ return !c.autoMatch || !Object.values(o).some(hasActiveTree) ? e : e.filter((e) => passesFilters(e, o, s, a.internal));
97
139
  },
98
- Th: ({ Th: e }, { store: p }) => (m) => {
99
- let h = () => !!m.col.filterable && !m.col[p.internal];
100
- return createComponent(e, mergeProps(m, { get children() {
101
- return [memo(() => m.children), createComponent(Show, {
140
+ Th: ({ Th: e }, { store: a }) => (d) => {
141
+ let f = () => !!d.col.filterable && !d.col[a.internal];
142
+ return createComponent(e, mergeProps(d, { get children() {
143
+ return [memo(() => d.children), createComponent(Show, {
102
144
  get when() {
103
- return h();
145
+ return f();
104
146
  },
105
147
  get children() {
106
148
  return createComponent(Filter, {
107
149
  get col() {
108
- return m.col;
150
+ return d.col;
109
151
  },
110
152
  get tree() {
111
- return p.filters[m.col.id];
153
+ return a.filters[d.col.id];
112
154
  },
113
155
  setTree: (e) => {
114
- e ? p.filters[m.col.id] = e : delete p.filters[m.col.id], p.props.filter?.onChange?.(Object.values(p.filters));
156
+ e ? a.filters[d.col.id] = e : delete a.filters[d.col.id], a.props.filter?.onChange?.(Object.values(a.filters));
115
157
  }
116
158
  });
117
159
  }
@@ -0,0 +1,9 @@
1
+ import type { Plugin } from "..";
2
+ declare module '../index' {
3
+ interface Commands {
4
+ createExcel(data?: any[]): Promise<Blob>;
5
+ exportExcel(data?: any[]): Promise<void>;
6
+ readExcel(file?: File): Promise<any[]>;
7
+ }
8
+ }
9
+ export declare const ImportExportPlugin: Plugin;
@@ -0,0 +1,37 @@
1
+ import { chooseFile } from "../utils.js";
2
+ function readFileAsArrayBuffer(e) {
3
+ return new Promise((t, n) => {
4
+ let r = new FileReader();
5
+ r.onload = () => t(r.result), r.onerror = n, r.readAsArrayBuffer(e);
6
+ });
7
+ }
8
+ function downloadBlob(e, t) {
9
+ let n = URL.createObjectURL(e), r = document.createElement("a");
10
+ r.href = n, r.download = t, document.body.appendChild(r), r.click(), document.body.removeChild(r), URL.revokeObjectURL(n);
11
+ }
12
+ const ImportExportPlugin = {
13
+ name: "ImportExportPlugin",
14
+ commands: (r) => ({
15
+ createExcel: async (e = r.props.data) => {
16
+ let t = await import("xlsx"), n = r.props.columns.filter((e) => !e[r.internal]), i = e.map((e) => Object.fromEntries(n.map((t) => [t.name, e[t.id]]))), a = t.utils.json_to_sheet(i), o = t.utils.book_new();
17
+ t.utils.book_append_sheet(o, a, "Data");
18
+ let s = t.write(o, {
19
+ bookType: "xlsx",
20
+ type: "array"
21
+ });
22
+ return new Blob([s], { type: "application/octet-stream" });
23
+ },
24
+ exportExcel: async (e = r.props.data) => {
25
+ let t = await r.commands.createExcel(e);
26
+ downloadBlob(t, "data.xlsx");
27
+ },
28
+ readExcel: async (n) => {
29
+ n ??= await chooseFile({ accept: ".xlsx,.xls,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" });
30
+ let i = await readFileAsArrayBuffer(n), a = await import("xlsx"), o = a.read(i, { type: "array" }), s = o.Sheets[o.SheetNames[0]], c = a.utils.sheet_to_json(s, { header: 1 });
31
+ if (c.length < 1) return;
32
+ let l = r.props.columns.filter((e) => !e[r.internal]);
33
+ return c.slice(1).map((e) => Object.fromEntries(l.map((t) => [t.id, e[t.name]])));
34
+ }
35
+ })
36
+ };
37
+ export { ImportExportPlugin };
@@ -28,7 +28,7 @@ const LoadMorePlugin = {
28
28
  rewriteProps: {
29
29
  loadMore: ({ loadMore: e }, { store: o }) => ({
30
30
  enable: !1,
31
- threshold: 40,
31
+ threshold: 100,
32
32
  debounce: 200,
33
33
  ...e
34
34
  }),
@@ -11,6 +11,7 @@ declare module '../index' {
11
11
  rowEquals: (a: any, b: any) => boolean;
12
12
  rowIndexOf: (data: any[], row: any) => number;
13
13
  rowChange: (row: any, i?: any) => void;
14
+ rowsChange: (rows: any) => void;
14
15
  addRows: (i: number, rows: any[], before?: boolean) => void;
15
16
  deleteRows: (i: number[]) => void;
16
17
  moveRows: (ii: number[], to: number) => void;
@@ -82,6 +82,13 @@ const MenuPlugin = {
82
82
  let a = [...e.rawProps.data || []];
83
83
  i = i == null ? e.commands.rowIndexOf(a, r) : a.findIndex((r) => e.commands.rowEquals(r, e.props.data[i])), i > -1 && (a[i] = r, e.props.onDataChange?.(a));
84
84
  },
85
+ rowsChange(r) {
86
+ let i = [...e.rawProps.data || []];
87
+ r.forEach((r) => {
88
+ let a = e.commands.rowIndexOf(i, r);
89
+ a > -1 && (i[a] = r);
90
+ }), e.props.onDataChange?.(i);
91
+ },
85
92
  addRows(r, i, a = !0) {
86
93
  addRows(e, r, i, a);
87
94
  },
@@ -1,11 +1,11 @@
1
1
  import { type JSX } from 'solid-js';
2
- import { type Plugin, type TD } from '../..';
2
+ import { type Plugin, type TDProps } from '../..';
3
3
  declare module '../../index' {
4
4
  interface TableProps {
5
5
  }
6
6
  interface TableColumn {
7
7
  type?: string;
8
- render?: Render;
8
+ render?: string | Render;
9
9
  enum?: Record<string, any> | {
10
10
  label?: string;
11
11
  value: any;
@@ -17,7 +17,7 @@ declare module '../../index' {
17
17
  };
18
18
  }
19
19
  }
20
- export type RenderProps = Parameters<TD>[0] & {
20
+ export type RenderProps = TDProps & {
21
21
  onChange: (v: any) => void;
22
22
  };
23
23
  export type Render = (props: RenderProps) => JSX.Element | any;
@@ -8,36 +8,36 @@ const RenderPlugin = {
8
8
  name: "render",
9
9
  priority: -Infinity,
10
10
  store: () => ({ renders: { ...renders } }),
11
- rewriteProps: { Td: ({ Td: e }, { store: p }) => (m) => createComponent(e, mergeProps(m, { get children() {
11
+ rewriteProps: { Td: ({ Td: e }, { store: m }) => (h) => createComponent(e, mergeProps(h, { get children() {
12
12
  return (() => {
13
- let e = ((e) => typeof e == "string" ? p.renders[e] : e)(m.col.render ?? m.col.type) || text;
14
- return renderComponent(e, mergeProps$1(m, { onChange: (e) => p.commands.rowChange({
15
- ...m.data,
16
- [m.col.id]: e
17
- }, m.y) }), p);
13
+ let e = ((e) => typeof e == "string" ? m.renders[e] : e)(h.col.render ?? h.col.type) || text;
14
+ return renderComponent(e, mergeProps$1(h, { onChange: (e) => m.commands.rowChange({
15
+ ...h.data,
16
+ [h.col.id]: e
17
+ }) }), m);
18
18
  })();
19
19
  } })) }
20
20
  };
21
- var text = (m) => memo(() => ((h) => m.col.enum ? toArr(h).map((p) => resolveOptions(m.col.enum).find((e) => e.value == p)?.label ?? p).join(", ") : h)(m.data[m.col.id]));
21
+ var text = (h) => memo(() => memo(() => !!h.col.enum)() ? toArr(h.value).map((m) => resolveOptions(h.col.enum).find((e) => e.value == m)?.label ?? m).join(", ") : h.value);
22
22
  const renders = {
23
23
  text,
24
24
  number: text,
25
25
  date: text,
26
26
  checkbox: (e) => (() => {
27
- var p = _tmpl$();
28
- return insert(p, createComponent(Checkbox, {
27
+ var m = _tmpl$();
28
+ return insert(m, createComponent(Checkbox, {
29
29
  class: "",
30
30
  get value() {
31
- return e.data[e.col.id];
31
+ return e.value;
32
32
  },
33
33
  get onChange() {
34
34
  return e.onChange;
35
35
  }
36
- })), p;
36
+ })), m;
37
37
  })(),
38
38
  file: (e) => createComponent(Files, {
39
39
  get value() {
40
- return e.data[e.col.id];
40
+ return e.value;
41
41
  },
42
42
  get onChange() {
43
43
  return e.onChange;
@@ -4,38 +4,37 @@ import { Ctx } from "../index.js";
4
4
  import { className, createComponent, effect, memo, mergeProps, template, use } from "solid-js/web";
5
5
  import { batch, untrack, useContext } from "solid-js";
6
6
  import { reconcile } from "solid-js/store";
7
- import { combineProps } from "@solid-primitives/props";
8
7
  import { clamp } from "es-toolkit";
9
8
  import { createEventListener } from "@solid-primitives/event-listener";
10
9
  import { defaultsDeep } from "es-toolkit/compat";
11
- var _tmpl$ = /* @__PURE__ */ template("<div>"), COL = Symbol("col_size"), ROW = Symbol("row_size"), ColHandle = (p) => {
12
- let { props: g, store: v } = useContext(Ctx), y;
13
- return usePointerDrag(() => y, { start(e, m, h) {
10
+ var _tmpl$ = /* @__PURE__ */ template("<div>"), COL = Symbol("col_size"), ROW = Symbol("row_size"), ColHandle = (f) => {
11
+ let { props: h, store: _ } = useContext(Ctx), v;
12
+ return usePointerDrag(() => v, { start(e, p, m) {
14
13
  e.stopPropagation();
15
- let _ = p.x, { min: b, max: x } = g.resizable.col, S = y.parentElement, C = S.offsetWidth;
16
- m((e, { ox: m }) => v[COL][p.x] = clamp(C + m, b, x)), h(() => {
17
- let e = g.columns[_], p = [...v.rawProps.columns || []], m = p.findIndex((p) => p[v.ID] === e[v.ID]);
18
- m > -1 && (p[m] = {
19
- ...p[m],
20
- width: S.offsetWidth
21
- }, g.onColumnsChange?.(p)), e.onWidthChange?.(S.offsetWidth);
14
+ let g = f.x, { min: y, max: b } = h.resizable.col, x = v.parentElement, S = x.offsetWidth;
15
+ p((e, { ox: p }) => _[COL][f.x] = clamp(S + p, y, b)), m(() => {
16
+ let e = h.columns[g], f = [..._.rawProps.columns || []], p = f.findIndex((f) => f[_.ID] === e[_.ID]);
17
+ p > -1 && (f[p] = {
18
+ ...f[p],
19
+ width: x.offsetWidth
20
+ }, h.onColumnsChange?.(f)), e.onWidthChange?.(x.offsetWidth);
22
21
  });
23
22
  } }), (() => {
24
- var e = _tmpl$(), m = y;
25
- return typeof m == "function" ? use(m, e) : y = e, effect(() => className(e, `in-cell__resize-handle absolute top-0 right-0 flex justify-center w-10px! ${p.x == g.columns.length - 1 ? "justify-end!" : "w-10px! translate-x-1/2"} after:w-1 cursor-w-resize z-1`)), e;
23
+ var e = _tmpl$(), p = v;
24
+ return typeof p == "function" ? use(p, e) : v = e, effect(() => className(e, `in-cell__resize-handle absolute top-0 right-0 flex justify-center w-10px! ${f.x == h.columns.length - 1 ? "justify-end!" : "w-10px! translate-x-1/2"} after:w-1 cursor-w-resize z-1`)), e;
26
25
  })();
27
- }, RowHandle = (p) => {
28
- let { props: g, store: v } = useContext(Ctx), y;
29
- return usePointerDrag(() => y, { start(e, m, h) {
26
+ }, RowHandle = (f) => {
27
+ let { props: h, store: _ } = useContext(Ctx), v;
28
+ return usePointerDrag(() => v, { start(e, p, m) {
30
29
  e.stopPropagation();
31
- let _ = p.y, { min: b, max: x } = g.resizable.row, S = y.parentElement.offsetHeight;
32
- m((e, { oy: m }) => v[ROW][p.y] = clamp(S + m, b, x)), h(() => {
33
- let e = g.data[_];
34
- [...v.rawProps.data || []].findIndex((p) => p[v.ID] === e[v.ID]);
30
+ let g = f.y, { min: y, max: b } = h.resizable.row, x = v.parentElement.offsetHeight;
31
+ p((e, { oy: p }) => _[ROW][f.y] = clamp(x + p, y, b)), m(() => {
32
+ let e = h.data[g];
33
+ [..._.rawProps.data || []].findIndex((f) => f[_.ID] === e[_.ID]);
35
34
  });
36
- } }), createEventListener(() => y, "dblclick", () => p.data[COL] = void 0), (() => {
37
- var e = _tmpl$(), m = y;
38
- return typeof m == "function" ? use(m, e) : y = e, effect(() => className(e, `in-cell__resize-handle absolute bottom-0 left-0 flex flex-col justify-center h-1! ${p.y == g.data.length - 1 ? "justify-end!" : ""} after:h-1 cursor-s-resize z-1`)), e;
35
+ } }), createEventListener(() => v, "dblclick", () => f.data[COL] = void 0), (() => {
36
+ var e = _tmpl$(), p = v;
37
+ return typeof p == "function" ? use(p, e) : v = e, effect(() => className(e, `in-cell__resize-handle absolute bottom-0 left-0 flex flex-col justify-center h-1! ${f.y == h.data.length - 1 ? "justify-end!" : ""} after:h-1 cursor-s-resize z-2`)), e;
39
38
  })();
40
39
  };
41
40
  const ResizePlugin = {
@@ -58,23 +57,33 @@ const ResizePlugin = {
58
57
  max: 400
59
58
  }
60
59
  }),
61
- columns: ({ columns: e }, { store: p }) => (e = e.map((e, m) => ({
60
+ columns: ({ columns: e }, { store: f }) => (e = e.map((e, p) => ({
62
61
  ...e,
63
- [p.ID]: e[p.ID] ??= Symbol()
62
+ [f.ID]: e[f.ID] ??= Symbol()
64
63
  })), e = e.map((e) => e.resizable === void 0 ? {
65
64
  ...e,
66
- resizable: p.props?.resizable?.col.enable
67
- } : e), e = e.map((e, m) => p[COL][m] ? {
65
+ resizable: f.props?.resizable?.col.enable
66
+ } : e), e = e.map((e, p) => f[COL][p] ? {
68
67
  ...e,
69
- width: p[COL][m]
70
- } : e), untrack(() => batch(() => reconcile(e, { key: p.ID })(p.__resize__cols ??= [])))),
71
- Th: ({ Th: e }, { store: p }) => (p) => (p = combineProps({ class: "relative" }, p), createComponent(e, mergeProps(p, { get children() {
72
- return [memo(() => p.children), memo(() => memo(() => !!p.col.resizable)() && createComponent(ColHandle, p))];
73
- } }))),
74
- Td: ({ Td: e }, { store: p }) => p.props?.resizable?.row.enable ? (m) => (m = combineProps({ class: "relative" }, m), createComponent(e, mergeProps(m, { get children() {
75
- return [memo(() => m.children), memo(() => memo(() => !!(m.x == 0 && p.props?.resizable?.row.enable))() && createComponent(RowHandle, m))];
76
- } }))) : e,
77
- cellStyle: ({ cellStyle: e }, { store: m }) => (h) => `${unFn(e, h)};` + (m[ROW][h.y] ? `height: ${m[ROW][h.y]}px` : "")
68
+ width: f[COL][p]
69
+ } : e), untrack(() => batch(() => reconcile(e, { key: f.ID })(f.__resize__cols ??= [])))),
70
+ Th: ({ Th: e }, { store: f }) => (f) => createComponent(e, mergeProps(f, {
71
+ get class() {
72
+ return `relative ${f.class}`;
73
+ },
74
+ get children() {
75
+ return [f.children, memo(() => memo(() => !!f.col.resizable)() && createComponent(ColHandle, f))];
76
+ }
77
+ })),
78
+ Td: ({ Td: e }, { store: f }) => f.props?.resizable?.row.enable ? (p) => createComponent(e, mergeProps(p, {
79
+ get class() {
80
+ return `relative ${p.class}`;
81
+ },
82
+ get children() {
83
+ return [p.children, memo(() => memo(() => !!(p.x == 0 && f.props?.resizable?.row.enable))() && createComponent(RowHandle, p))];
84
+ }
85
+ })) : e,
86
+ cellStyle: ({ cellStyle: e }, { store: p }) => (m) => `${unFn(e, m)};` + (p[ROW][m.y] ? `height: ${p[ROW][m.y]}px` : "")
78
87
  }
79
88
  };
80
89
  export { ResizePlugin };
@@ -50,7 +50,7 @@ const RowGroupPlugin = {
50
50
  return d;
51
51
  },
52
52
  Td: ({ Td: d }, { store: _ }) => (v) => {
53
- if (!v.data?.[GROUP]) return createComponent(d, v);
53
+ if (!v.data?.[GROUP]) return d(v);
54
54
  let { props: y } = useContext(Ctx), b = createMemo(() => _.rowGroup.isExpand(v.data));
55
55
  return createComponent(d, mergeProps(v, { get children() {
56
56
  return memo(() => y.columns?.findIndex((e) => !e[_.internal]) == v.x)() ? (() => {
@@ -1,7 +1,6 @@
1
1
  import { useSelector } from "../hooks/useSelector.js";
2
2
  import chevron_right_default from "../chevron-right.js";
3
3
  import { createComponent, effect, insert, memo, mergeProps, style, template } from "solid-js/web";
4
- import { combineProps } from "@solid-primitives/props";
5
4
  import { createLazyMemo } from "@solid-primitives/memo";
6
5
  var _tmpl$ = /* @__PURE__ */ template("<div class=\"flex items-center\">"), _tmpl$2 = /* @__PURE__ */ template("<span style=display:inline-block;width:16px;flex-shrink:0;margin-right:4px>");
7
6
  function flattenTree(e, t, n, r, i = 0, a = null, o = [], s = /* @__PURE__ */ new Map()) {
@@ -19,7 +18,7 @@ function flattenTree(e, t, n, r, i = 0, a = null, o = [], s = /* @__PURE__ */ ne
19
18
  };
20
19
  }
21
20
  const TreePlugin = (c) => {
22
- let m = createLazyMemo(() => c.props.columns?.findIndex((e) => !e[c.internal]) ?? -1);
21
+ let p = createLazyMemo(() => c.props.columns?.findIndex((e) => !e[c.internal]) ?? -1);
23
22
  return {
24
23
  name: "tree",
25
24
  store: (t) => ({
@@ -37,27 +36,30 @@ const TreePlugin = (c) => {
37
36
  let n = t.props.tree.children || "children", r = t.props.rowKey, { flat: i, meta: a } = flattenTree(e, n, r, (e) => t.tree.has(e));
38
37
  return t._treeMeta = a, t._haschildren = Object.values(Object.fromEntries(a)).some((e) => e.hasChildren), i;
39
38
  },
40
- Td: ({ Td: e }, { store: c }) => (u) => {
41
- let p = () => c.props.rowKey, h = () => c._treeMeta?.get(u.data?.[p()]);
42
- return u = combineProps(u, { onDblClick() {
43
- h()?.hasChildren && c.tree.toggle(u.data?.[p()]);
44
- } }), createComponent(e, mergeProps(u, { get children() {
45
- return memo(() => !!(c._haschildren && u.x === m()))() ? (() => {
46
- var e = _tmpl$();
47
- return insert(e, (() => {
48
- var e = memo(() => !!h()?.hasChildren);
49
- return () => e() ? createComponent(chevron_right_default, {
50
- class: "icon-clickable mr-1",
51
- get style() {
52
- return `transform: rotate(${c.tree.has(u.data?.[p()]) ? 90 : 0}deg); opacity: .6; flex-shrink: 0; transition: transform .15s`;
53
- },
54
- onClick: (e) => {
55
- e.stopPropagation(), c.tree.toggle(u.data?.[p()]);
56
- }
57
- }) : _tmpl$2();
58
- })(), null), insert(e, () => u.children, null), effect((t) => style(e, `padding-left: ${h()?.depth * 16}px`, t)), e;
59
- })() : u.children;
60
- } }));
39
+ Td: ({ Td: e }, { store: c }) => (l) => {
40
+ let f = () => c.props.rowKey, m = () => c._treeMeta?.get(l.data?.[f()]);
41
+ return createComponent(e, mergeProps(l, {
42
+ onDblClick: (e) => {
43
+ l.onDblClick?.(e), m()?.hasChildren && c.tree.toggle(l.data?.[f()]);
44
+ },
45
+ get children() {
46
+ return memo(() => !!(c._haschildren && l.x === p()))() ? (() => {
47
+ var e = _tmpl$();
48
+ return insert(e, (() => {
49
+ var e = memo(() => !!m()?.hasChildren);
50
+ return () => e() ? createComponent(chevron_right_default, {
51
+ class: "icon-clickable mr-1",
52
+ get style() {
53
+ return `transform: rotate(${c.tree.has(l.data?.[f()]) ? 90 : 0}deg); opacity: .6; flex-shrink: 0; transition: transform .15s`;
54
+ },
55
+ onClick: (e) => {
56
+ e.stopPropagation(), c.tree.toggle(l.data?.[f()]);
57
+ }
58
+ }) : _tmpl$2();
59
+ })(), null), insert(e, () => l.children, null), effect((t) => style(e, `padding-left: ${m()?.depth * 16}px`, t)), e;
60
+ })() : l.children;
61
+ }
62
+ }));
61
63
  }
62
64
  },
63
65
  commands: (e, { addRows: t }) => ({ addRows(n, r, i = !0) {
@@ -1,6 +1,5 @@
1
1
  import { isEmpty } from "../utils.js";
2
2
  import { createComponent, insert, memo, mergeProps, template } from "solid-js/web";
3
- import { combineProps } from "@solid-primitives/props";
4
3
  var _tmpl$ = /* @__PURE__ */ template("<div class=cell-validation-error>"), _tmpl$2 = /* @__PURE__ */ template("<span class=\"mr-1 c-red/75\">*");
5
4
  const ValidatorPlugin = {
6
5
  name: "validator",
@@ -55,19 +54,22 @@ const ValidatorPlugin = {
55
54
  }
56
55
  }),
57
56
  rewriteProps: {
58
- Td: ({ Td: e }, { store: a }) => (c) => {
59
- let l = () => a.cellValidationErrors[c.data[a.props.rowKey]]?.[c.col.id], u = combineProps(c, { get class() {
60
- return l() == null ? "" : "is-invalid";
61
- } });
62
- return createComponent(e, mergeProps(u, { get children() {
63
- return [memo(() => c.children), memo(() => memo(() => l() != null)() && (() => {
64
- var e = _tmpl$();
65
- return insert(e, l), e;
66
- })())];
67
- } }));
57
+ Td: ({ Td: e }, { store: a }) => (s) => {
58
+ let c = () => a.cellValidationErrors[s.data[a.props.rowKey]]?.[s.col.id];
59
+ return createComponent(e, mergeProps(s, {
60
+ get class() {
61
+ return s.class + " " + (c() == null ? "" : "is-invalid");
62
+ },
63
+ get children() {
64
+ return [s.children, memo(() => memo(() => c() != null)() && (() => {
65
+ var e = _tmpl$();
66
+ return insert(e, c), e;
67
+ })())];
68
+ }
69
+ }));
68
70
  },
69
71
  Th: ({ Th: e }, { store: n }) => (n) => createComponent(e, mergeProps(n, { get children() {
70
- return [memo(() => memo(() => !!n.col.required)() && _tmpl$2()), memo(() => n.children)];
72
+ return [memo(() => memo(() => !!n.col.required)() && _tmpl$2()), n.children];
71
73
  } }))
72
74
  }
73
75
  };
@@ -9,10 +9,24 @@ import { defaultRangeExtractor } from "@tanstack/solid-virtual";
9
9
  var $ML = Symbol();
10
10
  const VirtualScrollPlugin = {
11
11
  name: "virtual-scroll",
12
+ store: (e) => ({
13
+ scrollToCell(r, i, a) {
14
+ r = typeof r == "object" ? e.props.columns.indexOf(r) : r, i = typeof i == "object" ? e.props.data.indexOf(i) : i;
15
+ let o = e.virtualizerX, s = e.virtualizerY;
16
+ o.scrollToIndex(r, !0), s.scrollToIndex(i, !0);
17
+ },
18
+ scrollCellIfNeeded(r, i, a) {
19
+ r = typeof r == "object" ? e.props.columns.indexOf(r) : r, i = typeof i == "object" ? e.props.data.indexOf(i) : i;
20
+ let o = e.virtualizerX, s = e.virtualizerY, c = e.table.querySelector(`[x="${r}"][y="${i}"]`);
21
+ if (!c) return e.scrollToCell(r, i);
22
+ let l = c.getBoundingClientRect(), u = e.scroll_el.getBoundingClientRect();
23
+ (l.top < u.top || l.bottom > u.bottom) && s.scrollToIndex(i, !0), (l.left < u.left || l.right > u.right) && o.scrollToIndex(r, !0);
24
+ }
25
+ }),
12
26
  rewriteProps: {
13
27
  virtual: ({ virtual: e }) => defaultsDeep(e, {
14
- x: { overscan: 5 },
15
- y: { overscan: 10 }
28
+ x: { overscan: 2 },
29
+ y: { overscan: 2 }
16
30
  }),
17
31
  Scroll: ({ Scroll: e }, { store: r }) => (r) => (r = combineProps({ class: "virtual" }, r), createComponent(e, r)),
18
32
  Table: ({ Table: r }, { store: o }) => (d) => {