intable 0.0.63 → 0.0.65
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/dist/__uno.css +1 -1
- package/dist/components/Dialog.d.ts +9 -0
- package/dist/components/Dialog.js +23 -0
- package/dist/components/utils.d.ts +1 -1
- package/dist/components/utils.js +4 -5
- package/dist/index.d.ts +13 -1
- package/dist/index.js +25 -8
- package/dist/plugins/EditablePlugin.d.ts +1 -0
- package/dist/plugins/EditablePlugin.js +73 -75
- package/dist/plugins/FilterPlugin.d.ts +2 -1
- package/dist/plugins/FilterPlugin.js +1 -1
- package/dist/plugins/OrmPlugin.d.ts +15 -0
- package/dist/plugins/OrmPlugin.js +161 -0
- package/dist/plugins/RenderPlugin/components.js +7 -3
- package/dist/plugins/RenderPlugin/index.d.ts +1 -10
- package/dist/plugins/RenderPlugin/index.js +37 -50
- package/dist/plugins/ResizePlugin.js +23 -25
- package/dist/plugins/TreePlugin.d.ts +4 -0
- package/dist/plugins/TreePlugin.js +27 -18
- package/dist/plugins/ValidatorPlugin.js +57 -42
- package/dist/style.css +2 -2
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +52 -41
- package/package.json +1 -1
|
@@ -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, {
|
|
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:
|
|
13
|
-
let
|
|
14
|
-
return
|
|
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((
|
|
20
|
+
return toArr(e.value).map((_) => getOpt(e.col.enum, _) ?? _);
|
|
21
21
|
}
|
|
22
22
|
}) : e.value, checkbox = (e) => (() => {
|
|
23
|
-
var
|
|
24
|
-
return insert(
|
|
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
|
-
})),
|
|
33
|
-
})()
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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 {
|
|
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:
|
|
15
|
-
return usePointerDrag(() => y, { start(e,
|
|
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
|
-
|
|
19
|
-
let e = h.columns[b], m = [...
|
|
20
|
-
|
|
21
|
-
...m[
|
|
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:
|
|
33
|
-
return usePointerDrag(() => y, { start(e,
|
|
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
|
-
|
|
34
|
+
_((e, { oy: h }) => g[ROW][m.y] = clamp(C + h, x, S)), v(() => {
|
|
37
35
|
let e = h.data[b];
|
|
38
|
-
[...
|
|
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 }) =>
|
|
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:
|
|
63
|
+
columns: ({ columns: e }, { store: h }) => (e = e.map((e, m) => ({
|
|
66
64
|
...e,
|
|
67
|
-
[
|
|
65
|
+
[h.ID]: e[h.ID] ??= Symbol()
|
|
68
66
|
})), e = e.map((e) => e.resizable === void 0 ? {
|
|
69
67
|
...e,
|
|
70
|
-
resizable:
|
|
71
|
-
} : e), e = e.map((e,
|
|
68
|
+
resizable: h.props?.resizable?.col?.enable
|
|
69
|
+
} : e), e = e.map((e, m) => h[COL][m] ? {
|
|
72
70
|
...e,
|
|
73
|
-
width:
|
|
74
|
-
} : e), untrack(() => batch(() =>
|
|
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
|
|
81
|
+
Td: ({ Td: e }, { store: m }) => m.props?.resizable?.row?.enable ? (h) => createComponent(e, mergeProps$2(h, {
|
|
84
82
|
get class() {
|
|
85
|
-
return `relative ${
|
|
83
|
+
return `relative ${h.class}`;
|
|
86
84
|
},
|
|
87
85
|
get children() {
|
|
88
|
-
return [
|
|
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:
|
|
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$
|
|
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 = (
|
|
23
|
-
let
|
|
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:
|
|
41
|
-
let
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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(() => !!(
|
|
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(() => !!
|
|
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(${
|
|
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(),
|
|
63
|
+
e.stopPropagation(), l.commands.tree.toggle(u.data);
|
|
58
64
|
}
|
|
59
|
-
}) :
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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: (
|
|
8
|
+
store: (o) => ({
|
|
8
9
|
cellValidationErrors: {},
|
|
9
|
-
validateCell: async (
|
|
10
|
-
if (
|
|
11
|
-
let
|
|
10
|
+
validateCell: async (s, c, l, u) => {
|
|
11
|
+
if (c[o.internal] || l[o.internal]) return;
|
|
12
|
+
let d = [
|
|
12
13
|
() => {
|
|
13
|
-
if (
|
|
14
|
+
if (l.required && isEmpty(s)) throw Error("Required");
|
|
14
15
|
},
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
],
|
|
18
|
-
for (let e of
|
|
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(
|
|
22
|
+
await e(s, c, l);
|
|
22
23
|
} catch (e) {
|
|
23
|
-
let
|
|
24
|
-
throw
|
|
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
|
-
|
|
28
|
+
o.cellValidationErrors[f] ??= {}, o.cellValidationErrors[f][l.id] = null;
|
|
28
29
|
},
|
|
29
|
-
validateRow: async (e,
|
|
30
|
-
let
|
|
31
|
-
if (
|
|
32
|
-
if (
|
|
33
|
-
let
|
|
34
|
-
|
|
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(
|
|
37
|
+
throw Object.fromEntries(d);
|
|
37
38
|
}
|
|
38
39
|
},
|
|
39
40
|
validate: async () => {
|
|
40
|
-
let e = (
|
|
41
|
-
if (
|
|
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,
|
|
44
|
-
let
|
|
45
|
-
|
|
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
|
|
49
|
-
if (!
|
|
50
|
-
let
|
|
51
|
-
for (let e of
|
|
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
|
-
|
|
55
|
+
o.cellValidationErrors = {};
|
|
55
56
|
}
|
|
56
57
|
}),
|
|
57
58
|
rewriteProps: {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
|
77
|
+
return d.class + " " + (f() == null ? "" : "is-invalid");
|
|
63
78
|
},
|
|
64
79
|
get children() {
|
|
65
|
-
return [
|
|
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 =
|
|
69
|
-
return queueMicrotask(() =>
|
|
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:
|
|
76
|
-
return [memo(() => memo(() => !!
|
|
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
|
};
|