intable 0.0.63 → 0.0.64

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.
@@ -0,0 +1,161 @@
1
+ import { toArr } from "../utils.js";
2
+ import { Tags } from "./RenderPlugin/components.js";
3
+ import { editors } from "./EditablePlugin.js";
4
+ import { renders } from "./RenderPlugin/index.js";
5
+ import { Dialog } from "../components/Dialog.js";
6
+ import { Intable } from "../index.js";
7
+ import { createComponent, delegateEvents, insert, memo, mergeProps, template } from "solid-js/web";
8
+ import { createComputed, createResource, createRoot, createSignal, mergeProps as mergeProps$1, splitProps, untrack } from "solid-js";
9
+ import { createMutable } from "solid-js/store";
10
+ import { get, set } from "es-toolkit/compat";
11
+ var _tmpl$ = /* @__PURE__ */ template("<div class><div class=\"flex items-center p-3\"><div class=\"flex items-center gap-2\"><span class=\"text-sm text-gray-500\">已选择 <!> 项</span><button type=button class=\"text-xs text-gray-400 hover:text-red-500 transition-colors\">清空</button></div></div><div class=\"border-t border-gray/20 p-3\">");
12
+ const OrmPlugin = {
13
+ name: "orm",
14
+ priority: -Infinity,
15
+ store: (e) => ({}),
16
+ rewriteProps: { Table: ({ Table: e }, { store: p }) => (m) => {
17
+ let h = createMutable({});
18
+ return createComputed(() => {
19
+ let e = p.props.columns?.filter((e) => (e.type == "fk" || e.type == "fks") && e.foreignField);
20
+ if (e.length) for (let m of e) for (let e of p.props.data) {
21
+ if (m.foreignField in e) continue;
22
+ Object.defineProperty(e, m.foreignField, {
23
+ get: () => get(h, [m.id, e[p.props.rowKey]]),
24
+ set: (g) => untrack(() => set(h, [m.id, e[p.props.rowKey]], g)),
25
+ enumerable: !0,
26
+ configurable: !0
27
+ });
28
+ }
29
+ }), createComponent(e, m);
30
+ } }
31
+ };
32
+ var createDialogEditor = (e, p) => (m) => createRoot((h) => {
33
+ let { eventKey: _, value: v, col: y, ok: b, cancel: x, props: S, onChange: C } = m, w = p?.out ?? ((e) => e), [E, D] = createSignal(_ || v), O = createComponent(e, mergeProps({
34
+ get value() {
35
+ return E();
36
+ },
37
+ onChange: (e) => (D(w(e)), C?.(E()), b())
38
+ }, p, S, { aaa: m }));
39
+ return {
40
+ el: createComponent(Dialog, {
41
+ get title() {
42
+ return `选择 ${y.name}`;
43
+ },
44
+ onCancel: x,
45
+ onOk: b,
46
+ class: "min-w-[40vw]",
47
+ children: O
48
+ }),
49
+ getValue: E,
50
+ destroy: h,
51
+ dialog: !0
52
+ };
53
+ }), ObjTags = (m) => {
54
+ let h;
55
+ [m, h] = splitProps(m, [
56
+ "col",
57
+ "data",
58
+ "value",
59
+ "onChange",
60
+ "multiple"
61
+ ]);
62
+ let g = () => m.col.table?.columns?.[0].id, _ = () => m.col.table?.rowKey ?? "id";
63
+ return createComponent(Tags, mergeProps({
64
+ get value() {
65
+ return toArr(m.value).map((e) => ({
66
+ label: e[g()],
67
+ value: e[_()]
68
+ }));
69
+ },
70
+ onChange: (e) => m.onChange?.(m.multiple ? e : e[0])
71
+ }, h));
72
+ }, FKTags = (m) => {
73
+ let h;
74
+ [m, h] = splitProps(m, [
75
+ "col",
76
+ "data",
77
+ "value",
78
+ "onChange",
79
+ "multiple"
80
+ ]);
81
+ let g = () => m.col.table?.columns?.[0].id, _ = () => m.col.table?.rowKey ?? "id", [v] = createResource(() => m.value, () => fetchDataByKeys(toArr(m.value).map((e) => e && typeof e != "object" ? e : e[_()]), m.col.table), { initialValue: [] });
82
+ return createComputed(() => {
83
+ v(), untrack(() => set(m.data, m.col.foreignField, m.multiple ? v() : v()[0]));
84
+ }), createComponent(Tags, mergeProps({
85
+ get value() {
86
+ return v().map((e) => ({
87
+ label: e[g()],
88
+ value: e[_()]
89
+ }));
90
+ },
91
+ onChange: (e) => m.onChange?.(m.multiple ? e : e[0])
92
+ }, h));
93
+ }, ObjEditor = createDialogEditor((p) => {
94
+ let m = mergeProps$1(() => p.aaa.col), h = () => m.table?.rowKey ?? "id", g = () => m.type == "objs" || m.type == "fks", v = () => m.type == "fk" || m.type == "fks", x = () => v() ? toArr(p.value).map((e) => ({ [h()]: e })) : toArr(p.value), S = (e) => p.onChange(v() ? g() ? e.map((e) => e[h()]) : e?.[h()] ?? null : e);
95
+ return (() => {
96
+ var e = _tmpl$(), h = e.firstChild, C = h.firstChild, w = C.firstChild, T = w.firstChild, E = T.nextSibling;
97
+ E.nextSibling;
98
+ var D = w.nextSibling, O = h.nextSibling;
99
+ return insert(w, () => x().length, E), D.$$click = () => p.onChange?.(g() ? [] : null), insert(h, (() => {
100
+ var e = memo(() => !!v());
101
+ return () => e() ? createComponent(FKTags, mergeProps(p, {
102
+ class: "ml-2",
103
+ col: m,
104
+ get value() {
105
+ return x();
106
+ },
107
+ onChange: S,
108
+ get multiple() {
109
+ return g();
110
+ }
111
+ })) : createComponent(ObjTags, mergeProps(p, {
112
+ class: "ml-2",
113
+ col: m,
114
+ get value() {
115
+ return x();
116
+ },
117
+ onChange: S,
118
+ get multiple() {
119
+ return g();
120
+ }
121
+ }));
122
+ })(), null), insert(O, createComponent(Intable, mergeProps(() => p.aaa.col.table, { get rowSelection() {
123
+ return {
124
+ ...p.aaa.col.table?.rowSelection,
125
+ enable: !0,
126
+ multiple: g(),
127
+ value: p.value,
128
+ onChange: S
129
+ };
130
+ } }))), e;
131
+ })();
132
+ });
133
+ editors.obj = ObjEditor, editors.objs = ObjEditor, editors.fk = ObjEditor, editors.fks = ObjEditor, renders.fk = (e) => createComponent(FKTags, mergeProps(e, { disabled: !0 })), renders.fks = (e) => createComponent(FKTags, mergeProps(e, {
134
+ disabled: !0,
135
+ multiple: !0
136
+ })), renders.obj = (e) => createComponent(ObjTags, mergeProps(e, { disabled: !0 })), renders.objs = (e) => createComponent(ObjTags, mergeProps(e, {
137
+ disabled: !0,
138
+ multiple: !0
139
+ }));
140
+ var fetchDataByKeys = (() => {
141
+ let e = /* @__PURE__ */ new WeakMap(), p = (p) => {
142
+ let m = e.get(p.request) || e.set(p.request, {}).get(p.request);
143
+ return m[p.rowKey] ??= [{}, {}];
144
+ };
145
+ return async (e, m) => {
146
+ let [h, g] = p(m), _ = e.filter((e) => !h[e]);
147
+ if (_.length) {
148
+ let e = _.filter((e) => !g[e]), p = m.request?.({ filters: [{
149
+ field: m.rowKey,
150
+ op: "in",
151
+ value: e
152
+ }] });
153
+ e.forEach((e, m) => {
154
+ g[e] = p.then((p) => h[e] = p.data[m]).finally(() => delete g[e]);
155
+ }), await Promise.all(_.map((e) => g[e]));
156
+ }
157
+ return e.map((e) => h[e]);
158
+ };
159
+ })();
160
+ delegateEvents(["click"]);
161
+ export { OrmPlugin };
@@ -20,7 +20,10 @@ const Checkbox = (e) => {
20
20
  })();
21
21
  }, Files = (e) => {
22
22
  let x;
23
- return [e, x] = splitProps(e, []), createComponent(Tags, mergeProps(x, { color: "" }));
23
+ return [e, x] = splitProps(e, []), createComponent(Tags, mergeProps(x, {
24
+ color: "",
25
+ addable: !0
26
+ }));
24
27
  }, Tags = (x) => {
25
28
  let S;
26
29
  [x, S] = splitProps(x, [
@@ -29,7 +32,8 @@ const Checkbox = (e) => {
29
32
  "disabled",
30
33
  "onChange",
31
34
  "onAdd",
32
- "color"
35
+ "color",
36
+ "addable"
33
37
  ]), S = combineProps({ class: "in-tags flex flex-wrap items-center gap-2 h-full" }, S);
34
38
  let w = (e) => Array.isArray(e) ? e : e == null ? [] : [e];
35
39
  return (() => {
@@ -54,7 +58,7 @@ const Checkbox = (e) => {
54
58
  }
55
59
  })
56
60
  }), null), insert(T, (() => {
57
- var S = memo(() => !x.disabled);
61
+ var S = memo(() => !!(!x.disabled && x.addable));
58
62
  return () => S() && createComponent(Tag, {
59
63
  disabled: !0,
60
64
  get onClick() {
@@ -22,13 +22,4 @@ declare module '../../index' {
22
22
  export type Render = (props: TDProps) => JSX.Element | any;
23
23
  export declare const RenderPlugin: Plugin;
24
24
  export { text2colorMap } from './components';
25
- export declare const renders: {
26
- text: Render;
27
- switch: Render;
28
- checkbox: Render;
29
- file: Render;
30
- rate: Render;
31
- progress: Render;
32
- obj: Render;
33
- objs: Render;
34
- };
25
+ export declare const renders: Record<string, Render>;
@@ -9,19 +9,19 @@ const RenderPlugin = {
9
9
  name: "render",
10
10
  priority: -Infinity,
11
11
  store: () => ({ renders: { ...renders } }),
12
- rewriteProps: { Td: ({ Td: x }, { store: S }) => (C) => (S.props.cpu && (C = mergeProps$2(() => ({}), C)), createComponent(x, mergeProps$2(C, { children: createMemo(() => {
13
- let x = ((e) => typeof e == "string" ? S.renders[e] : e)(C.col.render ?? (C.col.enum && text) ?? C.col.type) ?? text;
14
- return x == text ? text(C) : renderComponent(x, C, S);
12
+ rewriteProps: { Td: ({ Td: _ }, { store: v }) => (y) => (v.props.cpu && (y = mergeProps$2(() => ({}), y)), createComponent(_, mergeProps$2(y, { children: createMemo(() => {
13
+ let _ = ((e) => typeof e == "string" ? v.renders[e] : e)(y.col.render ?? (y.col.enum && text) ?? y.col.type) ?? text;
14
+ return _ == text ? text(y) : renderComponent(_, y, v);
15
15
  }) }))) }
16
16
  };
17
17
  var text = (e) => e.col.enum ? createComponent(Tags, {
18
18
  disabled: !0,
19
19
  get value() {
20
- return toArr(e.value).map((x) => getOpt(e.col.enum, x) ?? x);
20
+ return toArr(e.value).map((_) => getOpt(e.col.enum, _) ?? _);
21
21
  }
22
22
  }) : e.value, checkbox = (e) => (() => {
23
- var x = _tmpl$();
24
- return insert(x, createComponent(Checkbox, {
23
+ var _ = _tmpl$();
24
+ return insert(_, createComponent(Checkbox, {
25
25
  class: "",
26
26
  get value() {
27
27
  return e.value;
@@ -29,54 +29,41 @@ var text = (e) => e.col.enum ? createComponent(Tags, {
29
29
  get onChange() {
30
30
  return e.onChange;
31
31
  }
32
- })), x;
33
- })(), file = (e) => createComponent(Files, {
34
- get value() {
35
- return e.value;
36
- },
37
- get onChange() {
38
- return e.onChange;
39
- },
40
- disabled: !0
41
- }), rate = (e) => createComponent(Rate, {
42
- get value() {
43
- return e.value;
44
- },
45
- get max() {
46
- return e.col.max ?? 5;
47
- },
48
- get onChange() {
49
- return e.onChange;
50
- },
51
- disabled: !0
52
- }), progress = (e) => createComponent(Progress, {
53
- get value() {
54
- return e.value;
55
- },
56
- get onChange() {
57
- return e.onChange;
58
- }
59
- }), obj = (e) => {
60
- let x = () => e.col.table?.columns?.[0].id, S = () => e.col.table?.rowKey ?? "id";
61
- return createComponent(Tags, {
62
- disabled: !0,
63
- get value() {
64
- return toArr(e.value).map((e) => ({
65
- label: e[x()],
66
- value: e[S()]
67
- }));
68
- }
69
- });
70
- };
32
+ })), _;
33
+ })();
71
34
  const renders = {
72
35
  text,
73
36
  switch: checkbox,
74
37
  checkbox,
75
- file,
76
- rate,
77
- progress,
78
- obj,
79
- objs: obj
38
+ file: (e) => createComponent(Files, {
39
+ get value() {
40
+ return e.value;
41
+ },
42
+ get onChange() {
43
+ return e.onChange;
44
+ },
45
+ disabled: !0
46
+ }),
47
+ rate: (e) => createComponent(Rate, {
48
+ get value() {
49
+ return e.value;
50
+ },
51
+ get max() {
52
+ return e.col.max ?? 5;
53
+ },
54
+ get onChange() {
55
+ return e.onChange;
56
+ },
57
+ disabled: !0
58
+ }),
59
+ progress: (e) => createComponent(Progress, {
60
+ get value() {
61
+ return e.value;
62
+ },
63
+ get onChange() {
64
+ return e.onChange;
65
+ }
66
+ })
80
67
  };
81
68
  for (let e in renders) renders[e] = solidComponent(renders[e]);
82
69
  export { RenderPlugin, renders, text2colorMap };
@@ -1,24 +1,22 @@
1
1
  import { usePointerDrag } from "../hooks/index.js";
2
- import { unFn } from "../utils.js";
2
+ import { deepChange2, unFn } from "../utils.js";
3
3
  import { mergeProps as mergeProps$2 } from "../mergeProps2.js";
4
4
  import { Ctx } from "../index.js";
5
5
  import { className, createComponent, delegateEvents, effect, memo, template, use } from "solid-js/web";
6
6
  import { batch, untrack, useContext } from "solid-js";
7
- import { reconcile } from "solid-js/store";
8
- import { clamp } from "es-toolkit";
7
+ import { clamp, toMerged } from "es-toolkit";
9
8
  import { createEventListener } from "@solid-primitives/event-listener";
10
- import { defaultsDeep } from "es-toolkit/compat";
11
9
  var _tmpl$ = /* @__PURE__ */ template("<div>"), COL = Symbol("col_size"), ROW = Symbol("row_size"), findParentEl = (e, m) => {
12
10
  for (; e = e.parentElement;) if (m(e)) return e;
13
11
  }, ColHandle = (m) => {
14
- let { props: h, store: v } = useContext(Ctx), y;
15
- return usePointerDrag(() => y, { start(e, g, _) {
12
+ let { props: h, store: g } = useContext(Ctx), y;
13
+ return usePointerDrag(() => y, { start(e, _, v) {
16
14
  e.stopPropagation();
17
15
  let b = m.x, { min: x, max: S } = h.resizable.col, C = findParentEl(y, (e) => e.tagName === "TH"), w = C.offsetWidth;
18
- g((e, { ox: h }) => v[COL][m.x] = clamp(w + h, x, S)), _(() => {
19
- let e = h.columns[b], m = [...v.rawProps.columns || []], g = m.findIndex((m) => m[v.ID] === e[v.ID]);
20
- g > -1 && (m[g] = {
21
- ...m[g],
16
+ _((e, { ox: h }) => g[COL][m.x] = clamp(w + h, x, S)), v(() => {
17
+ let e = h.columns[b], m = [...g.rawProps.columns || []], _ = m.findIndex((m) => m[g.ID] === e[g.ID]);
18
+ _ > -1 && (m[_] = {
19
+ ...m[_],
22
20
  width: C.offsetWidth
23
21
  }, h.onColumnsChange?.(m)), e.onWidthChange?.(C.offsetWidth);
24
22
  });
@@ -29,13 +27,13 @@ var _tmpl$ = /* @__PURE__ */ template("<div>"), COL = Symbol("col_size"), ROW =
29
27
  return typeof g == "function" ? use(g, e) : y = e, effect(() => className(e, `in-cell__resize-handle absolute top-0 right-0 flex justify-center w-10px! ${m.x == h.columns.length - 1 ? "justify-end!" : "w-10px! translate-x-1/2"} after:w-1 cursor-w-resize z-1`)), e;
30
28
  })();
31
29
  }, RowHandle = (m) => {
32
- let { props: h, store: v } = useContext(Ctx), y;
33
- return usePointerDrag(() => y, { start(e, g, _) {
30
+ let { props: h, store: g } = useContext(Ctx), y;
31
+ return usePointerDrag(() => y, { start(e, _, v) {
34
32
  e.stopPropagation();
35
33
  let b = m.y, { min: x, max: S } = h.resizable.row, C = findParentEl(y, (e) => e.tagName === "TD").offsetHeight;
36
- g((e, { oy: h }) => v[ROW][m.y] = clamp(C + h, x, S)), _(() => {
34
+ _((e, { oy: h }) => g[ROW][m.y] = clamp(C + h, x, S)), v(() => {
37
35
  let e = h.data[b];
38
- [...v.rawProps.data || []].findIndex((m) => m[v.ID] === e[v.ID]);
36
+ [...g.rawProps.data || []].findIndex((m) => m[g.ID] === e[g.ID]);
39
37
  });
40
38
  } }), createEventListener(() => y, "dblclick", () => m.data[COL] = void 0), (() => {
41
39
  var e = _tmpl$(), g = y;
@@ -50,7 +48,7 @@ const ResizePlugin = {
50
48
  [ROW]: []
51
49
  }),
52
50
  rewriteProps: {
53
- resizable: ({ resizable: e }) => defaultsDeep(e, {
51
+ resizable: ({ resizable: e }) => toMerged(e ?? {}, {
54
52
  col: {
55
53
  enable: !0,
56
54
  min: 45,
@@ -62,16 +60,16 @@ const ResizePlugin = {
62
60
  max: 400
63
61
  }
64
62
  }),
65
- columns: ({ columns: e }, { store: m }) => (e = e.map((e, h) => ({
63
+ columns: ({ columns: e }, { store: h }) => (e = e.map((e, m) => ({
66
64
  ...e,
67
- [m.ID]: e[m.ID] ??= Symbol()
65
+ [h.ID]: e[h.ID] ??= Symbol()
68
66
  })), e = e.map((e) => e.resizable === void 0 ? {
69
67
  ...e,
70
- resizable: m.props?.resizable?.col.enable
71
- } : e), e = e.map((e, h) => m[COL][h] ? {
68
+ resizable: h.props?.resizable?.col?.enable
69
+ } : e), e = e.map((e, m) => h[COL][m] ? {
72
70
  ...e,
73
- width: m[COL][h]
74
- } : e), untrack(() => batch(() => reconcile(e, { key: m.ID })(m.__resize__cols ??= [])))),
71
+ width: h[COL][m]
72
+ } : e), untrack(() => batch(() => deepChange2(h.__resize__cols ??= [], e)))),
75
73
  Th: ({ Th: e }, { store: m }) => (m) => createComponent(e, mergeProps$2(m, {
76
74
  get class() {
77
75
  return `relative ${m.class}`;
@@ -80,15 +78,15 @@ const ResizePlugin = {
80
78
  return [m.children, memo(() => memo(() => !!m.col.resizable)() && createComponent(ColHandle, m))];
81
79
  }
82
80
  })),
83
- Td: ({ Td: e }, { store: m }) => m.props?.resizable?.row.enable ? (g) => createComponent(e, mergeProps$2(g, {
81
+ Td: ({ Td: e }, { store: m }) => m.props?.resizable?.row?.enable ? (h) => createComponent(e, mergeProps$2(h, {
84
82
  get class() {
85
- return `relative ${g.class}`;
83
+ return `relative ${h.class}`;
86
84
  },
87
85
  get children() {
88
- return [g.children, memo(() => memo(() => !!(g.x == 0 && m.props?.resizable?.row.enable))() && createComponent(RowHandle, g))];
86
+ return [h.children, memo(() => memo(() => !!(h.x == 0 && m.props?.resizable?.row?.enable))() && createComponent(RowHandle, h))];
89
87
  }
90
88
  })) : e,
91
- cellStyle: ({ cellStyle: e }, { store: h }) => (g) => `${unFn(e, g)};` + (h[ROW][g.y] ? `height: ${h[ROW][g.y]}px` : "")
89
+ cellStyle: ({ cellStyle: e }, { store: m }) => (g) => `${unFn(e, g)};` + (m[ROW][g.y] ? `height: ${m[ROW][g.y]}px` : "")
92
90
  }
93
91
  };
94
92
  delegateEvents(["click"]);
@@ -5,6 +5,10 @@ declare module '../index' {
5
5
  tree?: {
6
6
  /** Field name that holds children rows. Default: `'children'`. */
7
7
  children?: string;
8
+ /** Indentation width per tree level in px. Default: `16`. */
9
+ indent?: number;
10
+ /** Show vertical indent guide lines. Default: `false`. */
11
+ indentLine?: boolean;
8
12
  };
9
13
  }
10
14
  interface TableStore {
@@ -1,9 +1,9 @@
1
1
  import { mergeProps as mergeProps$1 } from "../mergeProps2.js";
2
2
  import { useSelector } from "../hooks/useSelector.js";
3
3
  import chevron_right_default from "../chevron-right.js";
4
- import { createComponent, effect, insert, memo, style, template } from "solid-js/web";
4
+ import { createComponent, effect, insert, memo, setStyleProperty, style, template } from "solid-js/web";
5
5
  import { createLazyMemo } from "@solid-primitives/memo";
6
- 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>");
6
+ var _tmpl$ = /* @__PURE__ */ template("<span class=in-tree-indent-line>"), _tmpl$2 = /* @__PURE__ */ template("<div class=\"flex items-center\">"), _tmpl$3 = /* @__PURE__ */ template("<span>");
7
7
  function flattenTree(e, t, n, r, i = 0, a = null, o = [], s = /* @__PURE__ */ new Map()) {
8
8
  for (let c of e || []) {
9
9
  let e = c[n], l = c[t], u = Array.isArray(l) && l.length > 0;
@@ -19,8 +19,8 @@ function flattenTree(e, t, n, r, i = 0, a = null, o = [], s = /* @__PURE__ */ ne
19
19
  meta: s
20
20
  };
21
21
  }
22
- const TreePlugin = (c) => {
23
- let p = createLazyMemo(() => c.props.columns?.findIndex((e) => !e[c.internal]) ?? -1);
22
+ const TreePlugin = (l) => {
23
+ let h = createLazyMemo(() => l.props.columns?.findIndex((e) => !e[l.internal]) ?? -1);
24
24
  return {
25
25
  name: "tree",
26
26
  store: (e) => ({
@@ -30,6 +30,8 @@ const TreePlugin = (c) => {
30
30
  rewriteProps: {
31
31
  tree: ({ tree: e }) => ({
32
32
  children: "children",
33
+ indent: 16,
34
+ indentLine: !1,
33
35
  ...e
34
36
  }),
35
37
  data: ({ data: e }, { store: t }) => {
@@ -37,28 +39,35 @@ const TreePlugin = (c) => {
37
39
  let n = t.props.tree.children || "children", r = t.props.rowKey, { flat: i, meta: a } = flattenTree(e, n, r, (e) => t.commands.tree.has(e));
38
40
  return t._treeMeta = a, t._haschildren = Object.values(Object.fromEntries(a)).some((e) => e.hasChildren), i;
39
41
  },
40
- Td: ({ Td: t }, { store: c }) => c._haschildren ? (l) => {
41
- let f = () => c.props.rowKey, m = () => c._treeMeta?.get(l.data?.[f()]);
42
- return createComponent(t, mergeProps$1(l, {
43
- onDblClick: (e) => {
44
- l.onDblClick?.(e), l.x == p() && m()?.hasChildren && c.commands.tree.toggle(l.data);
45
- },
42
+ Td: ({ Td: t }, { store: l }) => l._haschildren ? (u) => {
43
+ let m = () => l.props.rowKey, g = () => l._treeMeta?.get(u.data?.[m()]), _ = () => l.props.tree?.indent ?? 16, v = () => l.props.tree?.indentLine, y = (e) => {
44
+ u.onDblClick?.(e), u.x == h() && g()?.hasChildren && l.commands.tree.toggle(u.data);
45
+ }, b = (e) => !v() || e === 0 ? null : Array.from({ length: e }, (e, t) => (() => {
46
+ var e = _tmpl$();
47
+ return effect((n) => setStyleProperty(e, "left", `${t * _() + _() / 2 + 10}px`)), e;
48
+ })());
49
+ return createComponent(t, mergeProps$1(u, {
50
+ onDblClick: y,
51
+ class: "relative",
46
52
  get children() {
47
- return memo(() => !!(c._haschildren && l.x === p()))() ? (() => {
48
- var e = _tmpl$();
53
+ return memo(() => !!(l._haschildren && u.x === h()))() ? [memo(() => b(g()?.depth ?? 0)), (() => {
54
+ var e = _tmpl$2();
49
55
  return insert(e, (() => {
50
- var e = memo(() => !!m()?.hasChildren);
56
+ var e = memo(() => !!g()?.hasChildren);
51
57
  return () => e() ? createComponent(chevron_right_default, {
52
58
  class: "icon-clickable mr-1",
53
59
  get style() {
54
- return `transform: rotate(${c.commands.tree.has(l.data) ? 90 : 0}deg); opacity: .6; flex-shrink: 0; transition: transform .15s`;
60
+ return `transform: rotate(${l.commands.tree.has(u.data) ? 90 : 0}deg); opacity: .6; flex-shrink: 0; transition: transform .15s`;
55
61
  },
56
62
  onClick: (e) => {
57
- e.stopPropagation(), c.commands.tree.toggle(l.data);
63
+ e.stopPropagation(), l.commands.tree.toggle(u.data);
58
64
  }
59
- }) : _tmpl$2();
60
- })(), null), insert(e, () => l.children, null), effect((t) => style(e, `padding-left: ${m()?.depth * 16}px`, t)), e;
61
- })() : l.children;
65
+ }) : (() => {
66
+ var e = _tmpl$3();
67
+ return effect((t) => style(e, `display: inline-block; width: ${_()}px; flex-shrink: 0; margin-right: 4px`, t)), e;
68
+ })();
69
+ })(), null), insert(e, () => u.children, null), effect((t) => style(e, `padding-left: ${g()?.depth * _()}px`, t)), e;
70
+ })()] : u.children;
62
71
  }
63
72
  }));
64
73
  } : t
@@ -1,79 +1,94 @@
1
1
  import { isEmpty } from "../utils.js";
2
2
  import { mergeProps as mergeProps$1 } from "../mergeProps2.js";
3
- import { createComponent, insert, memo, template } from "solid-js/web";
4
- var _tmpl$ = /* @__PURE__ */ template("<div class=cell-validation-error>"), _tmpl$2 = /* @__PURE__ */ template("<span class=\"mr-1 c-red/75\">*");
3
+ import { createComponent, insert, memo, mergeProps, template, use } from "solid-js/web";
4
+ import { delay } from "es-toolkit";
5
+ var _tmpl$ = /* @__PURE__ */ template("<input class=hidden placeholder=\"Intable 内部隐藏校验输入框\">"), _tmpl$2 = /* @__PURE__ */ template("<div class=cell-validation-error>"), _tmpl$3 = /* @__PURE__ */ template("<span class=\"mr-1 c-red/75\">*");
5
6
  const ValidatorPlugin = {
6
7
  name: "validator",
7
- store: (t) => ({
8
+ store: (o) => ({
8
9
  cellValidationErrors: {},
9
- validateCell: async (n, r, i, a) => {
10
- if (r[t.internal] || i[t.internal]) return;
11
- let o = [
10
+ validateCell: async (s, c, l, u) => {
11
+ if (c[o.internal] || l[o.internal]) return;
12
+ let d = [
12
13
  () => {
13
- if (i.required && isEmpty(n)) throw Error("Required");
14
+ if (l.required && isEmpty(s)) throw Error("Required");
14
15
  },
15
- i.validator,
16
- t.props.validator
17
- ], s = r[t.props.rowKey];
18
- for (let e of o) {
16
+ l.validator,
17
+ o.props.validator
18
+ ], f = c[o.props.rowKey];
19
+ for (let e of d) {
19
20
  if (!e) continue;
20
21
  try {
21
- await e(n, r, i);
22
+ await e(s, c, l);
22
23
  } catch (e) {
23
- let n = e.message || "Error";
24
- throw t.cellValidationErrors[s] ??= {}, t.cellValidationErrors[s][i.id] = n, a && t.scrollToCell?.(i, r), Error(n);
24
+ let s = e.message || "Error";
25
+ throw o.cellValidationErrors[f] ??= {}, o.cellValidationErrors[f][l.id] = s, u && o.scrollToCell?.(l, c), Error(s);
25
26
  }
26
27
  }
27
- t.cellValidationErrors[s] ??= {}, t.cellValidationErrors[s][i.id] = null;
28
+ o.cellValidationErrors[f] ??= {}, o.cellValidationErrors[f][l.id] = null;
28
29
  },
29
- validateRow: async (e, n) => {
30
- let r = t.props.columns, i = r.map((n) => t.validateCell(e[n.id], e, n)), a = await Promise.all(i.map((e) => e.catch((e) => e))), o = a.map((e, t) => e instanceof Error ? [r[t].id, e] : null).filter((e) => e);
31
- if (o.length) {
32
- if (n) {
33
- let n = r[a.findIndex((e) => e instanceof Error)];
34
- t.scrollToCell?.(n, e);
30
+ validateRow: async (e, s) => {
31
+ let c = o.props.columns, l = c.map((s) => o.validateCell(e[s.id], e, s)), u = await Promise.all(l.map((e) => e.catch((e) => e))), d = u.map((e, o) => e instanceof Error ? [c[o].id, e] : null).filter((e) => e);
32
+ if (d.length) {
33
+ if (s) {
34
+ let s = c[u.findIndex((e) => e instanceof Error)];
35
+ o.scrollToCell?.(s, e);
35
36
  }
36
- throw Object.fromEntries(o);
37
+ throw Object.fromEntries(d);
37
38
  }
38
39
  },
39
40
  validate: async () => {
40
- let e = (t.rawProps.data || []).map((e) => t.validateRow(e)), n = (await Promise.all(e.map((e) => e.catch((e) => e)))).map((e, t) => e ? [t, e] : null).filter((e) => e);
41
- if (n.length) throw t.scrollToCell?.(t.props.columns.findIndex((e) => e.id === Object.keys(n[0][1])[0]), t.props.data?.[n[0][0]]), n[0][1];
41
+ let e = (o.rawProps.data || []).map((e) => o.validateRow(e)), s = (await Promise.all(e.map((e) => e.catch((e) => e)))).map((e, o) => e ? [o, e] : null).filter((e) => e);
42
+ if (s.length) throw o.scrollToCell?.(o.props.columns.findIndex((e) => e.id === Object.keys(s[0][1])[0]), o.props.data?.[s[0][0]]), s[0][1];
42
43
  },
43
- clearCellValidation: (e, n) => {
44
- let r = e[t.props.rowKey];
45
- t.cellValidationErrors[r] && (t.cellValidationErrors[r][n.id] = null);
44
+ clearCellValidation: (e, s) => {
45
+ let c = e[o.props.rowKey];
46
+ o.cellValidationErrors[c] && (o.cellValidationErrors[c][s.id] = null);
46
47
  },
47
48
  clearRowValidation: (e) => {
48
- let n = e[t.props.rowKey];
49
- if (!t.cellValidationErrors[n]) return;
50
- let r = t.props.columns;
51
- for (let e of r) t.cellValidationErrors[n][e.id] = null;
49
+ let s = e[o.props.rowKey];
50
+ if (!o.cellValidationErrors[s]) return;
51
+ let c = o.props.columns;
52
+ for (let e of c) o.cellValidationErrors[s][e.id] = null;
52
53
  },
53
54
  clearValidation: () => {
54
- t.cellValidationErrors = {};
55
+ o.cellValidationErrors = {};
55
56
  }
56
57
  }),
57
58
  rewriteProps: {
58
- Td: ({ Td: e }, { store: a }) => (s) => {
59
- let c = () => a.cellValidationErrors[s.data[a.props.rowKey]]?.[s.col.id];
60
- return createComponent(e, mergeProps$1(s, {
59
+ Table: ({ Table: e }, { store: o }) => (c) => createComponent(e, mergeProps(c, { get children() {
60
+ return [(() => {
61
+ var e = _tmpl$();
62
+ return e.addEventListener("invalid", ({ currentTarget: e }) => {
63
+ o.validate().then(() => {
64
+ e.setCustomValidity(""), e.reportValidity(), delay(0).then(() => e.form?.requestSubmit());
65
+ }).catch(() => {
66
+ e.setCustomValidity("error");
67
+ });
68
+ }), use((e) => {
69
+ e.setCustomValidity("……"), e.form?.addEventListener("submit", () => e.setCustomValidity("……"));
70
+ }, e), e;
71
+ })(), memo(() => c.children)];
72
+ } })),
73
+ Td: ({ Td: e }, { store: u }) => (d) => {
74
+ let f = () => u.cellValidationErrors[d.data[u.props.rowKey]]?.[d.col.id];
75
+ return createComponent(e, mergeProps$1(d, {
61
76
  get class() {
62
- return s.class + " " + (c() == null ? "" : "is-invalid");
77
+ return d.class + " " + (f() == null ? "" : "is-invalid");
63
78
  },
64
79
  get children() {
65
- return [s.children, memo(() => memo(() => c() != null)() && (() => {
66
- var e = _tmpl$();
80
+ return [d.children, memo(() => memo(() => f() != null)() && (() => {
81
+ var e = _tmpl$2();
67
82
  return insert(e, () => {
68
- let e = s.data[s.col.id];
69
- return queueMicrotask(() => a.validateCell(e, s.data, s.col).catch(() => {})), c();
83
+ let e = d.data[d.col.id];
84
+ return queueMicrotask(() => u.validateCell(e, d.data, d.col).catch(() => {})), f();
70
85
  }), e;
71
86
  })())];
72
87
  }
73
88
  }));
74
89
  },
75
- Th: ({ Th: e }, { store: r }) => (r) => createComponent(e, mergeProps$1(r, { get children() {
76
- return [memo(() => memo(() => !!r.col.required)() && _tmpl$2()), r.children];
90
+ Th: ({ Th: e }, { store: c }) => (c) => createComponent(e, mergeProps$1(c, { get children() {
91
+ return [memo(() => memo(() => !!c.col.required)() && _tmpl$3()), c.children];
77
92
  } }))
78
93
  }
79
94
  };