intable 0.0.3 → 0.0.5

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 (49) hide show
  1. package/README.md +2 -1
  2. package/dist/__uno.css +1 -1
  3. package/dist/chevron-right.js +3 -5
  4. package/dist/components/Columns.js +50 -84
  5. package/dist/components/DocTree.js +21 -29
  6. package/dist/components/Menu.js +81 -105
  7. package/dist/components/Popover.js +23 -31
  8. package/dist/components/Render.js +10 -11
  9. package/dist/components/Split.js +34 -46
  10. package/dist/components/Tree.js +38 -57
  11. package/dist/components/utils.js +4 -6
  12. package/dist/hooks/index.d.ts +1 -0
  13. package/dist/hooks/index.js +103 -130
  14. package/dist/hooks/useDir.js +22 -39
  15. package/dist/hooks/useSelector.d.ts +16 -0
  16. package/dist/hooks/useSelector.js +35 -0
  17. package/dist/hooks/useSort.js +47 -70
  18. package/dist/hooks/useVirtualizer.js +43 -68
  19. package/dist/index.d.ts +11 -4
  20. package/dist/index.js +194 -218
  21. package/dist/loading.js +3 -5
  22. package/dist/plugins/CellMergePlugin.d.ts +0 -2
  23. package/dist/plugins/CellSelectionPlugin.js +78 -117
  24. package/dist/plugins/CommandPlugin.js +11 -8
  25. package/dist/plugins/CopyPastePlugin.js +25 -37
  26. package/dist/plugins/DiffPlugin.js +33 -45
  27. package/dist/plugins/DragPlugin.d.ts +2 -2
  28. package/dist/plugins/DragPlugin.js +29 -45
  29. package/dist/plugins/EditablePlugin.js +89 -139
  30. package/dist/plugins/ExpandPlugin.d.ts +3 -5
  31. package/dist/plugins/ExpandPlugin.js +41 -47
  32. package/dist/plugins/HistoryPlugin.js +16 -21
  33. package/dist/plugins/MenuPlugin.js +52 -76
  34. package/dist/plugins/RenderPlugin/components.js +45 -63
  35. package/dist/plugins/RenderPlugin/index.js +30 -42
  36. package/dist/plugins/ResizePlugin.js +45 -80
  37. package/dist/plugins/RowGroupPlugin.js +58 -74
  38. package/dist/plugins/RowSelectionPlugin.d.ts +3 -15
  39. package/dist/plugins/RowSelectionPlugin.js +21 -48
  40. package/dist/plugins/VirtualScrollPlugin.js +54 -79
  41. package/dist/plus.js +3 -5
  42. package/dist/style.css +2 -192
  43. package/dist/theme/element-plus.scss +5 -0
  44. package/dist/utils.js +44 -65
  45. package/dist/wc.js +10 -13
  46. package/dist/x.js +3 -5
  47. package/package.json +2 -1
  48. package/dist/plugins/DragColumnPlugin.d.ts +0 -2
  49. package/dist/plugins/DragColumnPlugin.js +0 -4
@@ -7,171 +7,121 @@ import { createMutable } from "solid-js/store";
7
7
  import { combineProps } from "@solid-primitives/props";
8
8
  import { delay } from "es-toolkit";
9
9
  import { createAsyncMemo } from "@solid-primitives/memo";
10
- var _tmpl$ = /* @__PURE__ */ template(`<input style=position:absolute;margin-top:1em;width:0;height:0;pointer-events:none;opacity:0>`), _tmpl$2 = /* @__PURE__ */ template(`<div class=in-cell-edit-wrapper>`), _tmpl$3 = /* @__PURE__ */ template(`<input>`), _tmpl$4 = /* @__PURE__ */ template(`<select>`), _tmpl$5 = /* @__PURE__ */ template(`<option>`), _tmpl$6 = /* @__PURE__ */ template(`<label class="h-full flex items-center">`);
10
+ var _tmpl$ = /* @__PURE__ */ template("<input style=position:absolute;margin-top:1em;width:0;height:0;pointer-events:none;opacity:0>"), _tmpl$2 = /* @__PURE__ */ template("<div class=in-cell-edit-wrapper>"), _tmpl$3 = /* @__PURE__ */ template("<input>"), _tmpl$4 = /* @__PURE__ */ template("<select>"), _tmpl$5 = /* @__PURE__ */ template("<option>"), _tmpl$6 = /* @__PURE__ */ template("<label class=\"h-full flex items-center\">");
11
11
  const EditablePlugin = {
12
+ name: "editable",
12
13
  store: () => ({ editors: { ...editors } }),
13
- rewriteProps: { Td: ({ Td }, { store }) => (o) => {
14
- let el;
15
- const { props } = useContext(Ctx);
16
- const editable = createMemo(() => !!o.col.editable && !o.data[store.internal] && !o.col[store.internal]);
17
- const [editing, setEditing] = createSignal(false);
18
- let eventKey = "";
19
- const selected = createMemo(() => (([x, y]) => o.x == x && o.y == y)(store.selected.start || []));
20
- const preEdit = createMemo(() => selected() && editable() && !editing());
21
- const editorState = createAsyncMemo(async () => {
22
- if (editing()) {
23
- let canceled = false;
24
- const editor = ((editor$1) => typeof editor$1 == "string" ? store.editors[editor$1] : editor$1)(o.col.editor || "text");
25
- const opt = {
26
- props: o.col.editorProps,
27
- col: o.col,
28
- eventKey,
29
- data: o.data,
30
- value: o.data[o.col.id],
31
- ok: () => setEditing(false),
32
- cancel: () => (canceled = true, setEditing(false))
33
- };
34
- const ret = editor(opt);
35
- onCleanup(() => {
36
- if (!canceled && ret.getValue() !== o.data[o.col.id]) {
37
- const arr = [...props.data];
38
- arr[o.y] = {
39
- ...arr[o.y],
40
- [o.col.id]: ret.getValue()
41
- };
42
- props.onDataChange?.(arr);
14
+ rewriteProps: { Td: ({ Td: i }, { store: O }) => (k) => {
15
+ let A, { props: N } = useContext(Ctx), P = createMemo(() => !!k.col.editable && !k.data[O.internal] && !k.col[O.internal]), [I, L] = createSignal(!1), H = "", U = createMemo(() => (([i, O]) => k.x == i && k.y == O)(O.selected.start || [])), W = createMemo(() => U() && P() && !I()), G = createAsyncMemo(async () => {
16
+ if (I()) {
17
+ let i = !1, A = ((i) => typeof i == "string" ? O.editors[i] : i)(k.col.editor || "text"), j = {
18
+ props: k.col.editorProps,
19
+ col: k.col,
20
+ eventKey: H,
21
+ data: k.data,
22
+ value: k.data[k.col.id],
23
+ ok: () => L(!1),
24
+ cancel: () => (i = !0, L(!1))
25
+ }, M = A(j);
26
+ return onCleanup(() => {
27
+ if (!i && M.getValue() !== k.data[k.col.id]) {
28
+ let i = [...N.data];
29
+ i[k.y] = {
30
+ ...i[k.y],
31
+ [k.col.id]: M.getValue()
32
+ }, N.onDataChange?.(i);
43
33
  }
44
- ret.destroy();
45
- });
46
- return [opt, ret];
34
+ M.destroy();
35
+ }), [j, M];
47
36
  }
48
37
  });
49
38
  createEffect(() => {
50
- editorState()?.[1]?.focus?.();
51
- });
52
- createEffect(() => {
53
- if (editing()) {
54
- const sss = createMemo(() => JSON.stringify(store.selected));
55
- createEffect(on(sss, () => setEditing(false), { defer: true }));
39
+ G()?.[1]?.focus?.();
40
+ }), createEffect(() => {
41
+ if (I()) {
42
+ let i = createMemo(() => JSON.stringify(O.selected));
43
+ createEffect(on(i, () => L(!1), { defer: !0 }));
56
44
  }
57
45
  });
58
- let input;
59
- const size = createMutable({
46
+ let K, q = createMutable({
60
47
  w: 0,
61
48
  h: 0
62
49
  });
63
- createComputed(() => editing() && (size.w = el.getBoundingClientRect().width, size.h = el.getBoundingClientRect().height));
64
- o = combineProps(o, {
65
- ref: (v) => el = v,
50
+ return createComputed(() => I() && (q.w = A.getBoundingClientRect().width, q.h = A.getBoundingClientRect().height)), k = combineProps(k, {
51
+ ref: (i) => A = i,
66
52
  get class() {
67
- return editing() ? "is-editing" : "";
53
+ return I() ? "is-editing" : "";
68
54
  },
69
55
  get style() {
70
- return editing() ? `width: ${size.w}px; height: ${size.h}px; padding: 0; ` : "";
56
+ return I() ? `width: ${q.w}px; height: ${q.h}px; padding: 0; ` : "";
71
57
  },
72
- onClick: () => input?.focus?.(),
73
- onDblClick: () => setEditing(editable()),
74
- onKeyDown: (e) => e.key == "Escape" && editorState()?.[0].cancel()
75
- });
76
- return createComponent(Td, mergeProps(o, { get children() {
77
- return [memo(() => memo(() => !!preEdit())() && (() => {
78
- var _el$ = _tmpl$();
79
- _el$.addEventListener("compositionend", () => {
80
- setEditing(true);
81
- });
82
- _el$.$$input = (e) => {
83
- eventKey = e.target.value;
84
- setEditing(!e.isComposing);
85
- };
86
- _el$.$$keydown = (e) => {
87
- e.key == " " && e.preventDefault();
88
- };
89
- use((e) => {
90
- input = e;
91
- delay(0).then(() => e.focus({ preventScroll: true }));
92
- }, _el$);
93
- return _el$;
94
- })()), memo(() => memo(() => !!editorState()?.[1]?.el)() ? (() => {
95
- var _el$2 = _tmpl$2();
96
- insert(_el$2, () => editorState()?.[1]?.el);
97
- return _el$2;
98
- })() : o.children)];
58
+ onClick: () => K?.focus?.(),
59
+ onDblClick: () => L(P()),
60
+ onKeyDown: (i) => i.key == "Escape" && G()?.[0].cancel()
61
+ }), createComponent(i, mergeProps(k, { get children() {
62
+ return [memo(() => memo(() => !!W())() && (() => {
63
+ var i = _tmpl$();
64
+ return i.addEventListener("compositionend", () => {
65
+ L(!0);
66
+ }), i.$$input = (i) => {
67
+ H = i.target.value, L(!i.isComposing);
68
+ }, i.$$keydown = (i) => {
69
+ i.key == " " && i.preventDefault();
70
+ }, use((i) => {
71
+ K = i, delay(0).then(() => i.focus({ preventScroll: !0 }));
72
+ }, i), i;
73
+ })()), memo(() => memo(() => !!G()?.[1]?.el)() ? (() => {
74
+ var i = _tmpl$2();
75
+ return insert(i, () => G()?.[1]?.el), i;
76
+ })() : k.children)];
99
77
  } }));
100
78
  } }
101
79
  };
102
- var createEditor = (Comp, extra, isSelector) => ({ eventKey, value, col, ok, cancel, props }) => createRoot((destroy) => {
103
- const [v, setV] = createSignal(eventKey || value);
104
- let el;
105
- createComponent(Comp, mergeProps({
106
- ref: (e) => el = e,
107
- "class": "relative block px-2 size-full z-9 box-border resize-none outline-0",
80
+ var createEditor = (i, k, A) => ({ eventKey: j, value: N, col: P, ok: F, cancel: I, props: L }) => createRoot((R) => {
81
+ let [z, B] = createSignal(j || N), V;
82
+ return createComponent(i, mergeProps({
83
+ ref: (i) => V = i,
84
+ class: "relative block px-2 size-full z-9 box-border resize-none outline-0",
108
85
  get value() {
109
- return v();
86
+ return z();
110
87
  },
111
- onInput: (e) => setV(e instanceof Event ? e.target.value : e),
112
- onChange: (e) => (setV(e instanceof Event ? e.target.value : e), isSelector && ok()),
113
- "on:pointerdown": (e) => e.stopPropagation(),
114
- "on:keydown": (e) => {
115
- e.stopPropagation();
116
- e.key == "Enter" && ok();
117
- e.key == "Escape" && cancel();
88
+ onInput: (i) => B(i instanceof Event ? i.target.value : i),
89
+ onChange: (i) => (B(i instanceof Event ? i.target.value : i), A && F()),
90
+ "on:pointerdown": (i) => i.stopPropagation(),
91
+ "on:keydown": (i) => {
92
+ i.stopPropagation(), i.key == "Enter" && F(), i.key == "Escape" && I();
118
93
  },
119
94
  get options() {
120
- return memo(() => !!col.enum)() ? resolveOptions(col.enum ?? []) : void 0;
95
+ return memo(() => !!P.enum)() ? resolveOptions(P.enum ?? []) : void 0;
121
96
  }
122
- }, extra, props));
123
- return {
124
- el,
125
- getValue: v,
126
- focus: () => el.focus(),
127
- destroy
97
+ }, k, L)), {
98
+ el: V,
99
+ getValue: z,
100
+ focus: () => V.focus(),
101
+ destroy: R
128
102
  };
129
- });
130
- var Input = (o) => (() => {
131
- var _el$3 = _tmpl$3();
132
- spread(_el$3, o, false, false);
133
- return _el$3;
134
- })();
135
- var text = createEditor(Input);
136
- var number = createEditor(Input, { type: "number" });
137
- var range$1 = createEditor(Input, { type: "range" });
138
- var color = createEditor(Input, { type: "color" });
139
- var tel = createEditor(Input, { type: "tel" });
140
- var password = createEditor(Input, { type: "password" });
141
- var date = createEditor(Input, { type: "date" }, true);
142
- var time = createEditor(Input, { type: "time" }, true);
143
- var datetime = createEditor(Input, { type: "datetime-local" }, true);
144
- var select = createEditor((o) => (() => {
145
- var _el$4 = _tmpl$4();
146
- spread(_el$4, o, false, true);
147
- insert(_el$4, () => o.options?.map((e) => (() => {
148
- var _el$5 = _tmpl$5();
149
- insert(_el$5, () => e.label);
150
- effect(() => _el$5.value = e.value);
151
- return _el$5;
152
- })()));
153
- return _el$4;
154
- })(), {}, true);
155
- var file = createEditor((o) => {
156
- const onAdd = () => chooseFile({ multiple: true }).then((files) => o.onChange([...o.value || [], ...files.map((e) => ({
157
- name: e.name,
158
- size: e.size
159
- }))]));
160
- return createComponent(Files, mergeProps(o, {
161
- "class": "relative z-9 outline-2 outline-blue min-h-a! h-a! p-1 bg-#fff",
162
- onAdd
163
- }));
164
- });
165
- var checkbox = createEditor((o) => (() => {
166
- var _el$6 = _tmpl$6();
167
- var _ref$ = o.ref;
168
- typeof _ref$ === "function" ? use(_ref$, _el$6) : o.ref = _el$6;
169
- insert(_el$6, createComponent(Checkbox, mergeProps(o, {
103
+ }), Input = (i) => (() => {
104
+ var O = _tmpl$3();
105
+ return spread(O, i, !1, !1), O;
106
+ })(), text = createEditor(Input), number = createEditor(Input, { type: "number" }), range$1 = createEditor(Input, { type: "range" }), color = createEditor(Input, { type: "color" }), tel = createEditor(Input, { type: "tel" }), password = createEditor(Input, { type: "password" }), date = createEditor(Input, { type: "date" }, !0), time = createEditor(Input, { type: "time" }, !0), datetime = createEditor(Input, { type: "datetime-local" }, !0), select = createEditor((i) => (() => {
107
+ var O = _tmpl$4();
108
+ return spread(O, i, !1, !0), insert(O, () => i.options?.map((i) => (() => {
109
+ var O = _tmpl$5();
110
+ return insert(O, () => i.label), effect(() => O.value = i.value), O;
111
+ })())), O;
112
+ })(), {}, !0), file = createEditor((O) => createComponent(Files, mergeProps(O, {
113
+ class: "relative z-9 outline-2 outline-blue min-h-a! h-a! p-1 bg-#fff",
114
+ onAdd: () => chooseFile({ multiple: !0 }).then((i) => O.onChange([...O.value || [], ...i.map((i) => ({
115
+ name: i.name,
116
+ size: i.size
117
+ }))]))
118
+ }))), checkbox = createEditor((i) => (() => {
119
+ var O = _tmpl$6(), A = i.ref;
120
+ return typeof A == "function" ? use(A, O) : i.ref = O, insert(O, createComponent(Checkbox, mergeProps(i, {
170
121
  ref: () => {},
171
122
  onInput: () => {},
172
- "class": "mx-3!"
173
- })));
174
- return _el$6;
123
+ class: "mx-3!"
124
+ }))), O;
175
125
  })());
176
126
  const editors = {
177
127
  text,
@@ -1,5 +1,6 @@
1
1
  import type { JSX } from 'solid-js';
2
2
  import { type Plugin } from '..';
3
+ import { useSelector } from '../hooks/useSelector';
3
4
  declare module '../index' {
4
5
  interface TableProps {
5
6
  expand?: {
@@ -10,11 +11,8 @@ declare module '../index' {
10
11
  }) => JSX.Element;
11
12
  };
12
13
  }
13
- interface TableStore {
14
- expands: any[];
15
- expandCol: TableColumn;
16
- isExpand: (data: any) => boolean;
17
- toggleExpand: (data: any) => void;
14
+ interface Commands {
15
+ expand: ReturnType<typeof useSelector<any[]>>;
18
16
  }
19
17
  }
20
18
  export declare const ExpandPlugin: Plugin;
@@ -1,56 +1,50 @@
1
1
  import { renderComponent, solidComponent } from "../components/utils.js";
2
- import { Ctx } from "../index.js";
2
+ import { useSelector } from "../hooks/useSelector.js";
3
3
  import chevron_right_default from "../chevron-right.js";
4
+ import { Ctx } from "../index.js";
4
5
  import { createComponent, effect, insert, memo, mergeProps, setAttribute, template } from "solid-js/web";
5
- import { createMemo, useContext } from "solid-js";
6
- import { unwrap } from "solid-js/store";
7
- import { remove } from "es-toolkit";
8
- var _tmpl$ = /* @__PURE__ */ template(`<td style=width:100%>`), _tmpl$2 = /* @__PURE__ */ template(`<div style=display:flex;align-items:center;width:100%;height:100%;opacity:.4>`);
6
+ import { useContext } from "solid-js";
7
+ import { combineProps } from "@solid-primitives/props";
8
+ import { defaultsDeep } from "es-toolkit/compat";
9
+ var _tmpl$ = /* @__PURE__ */ template("<td style=width:100%>"), _tmpl$2 = /* @__PURE__ */ template("<div style=display:flex;align-items:center;width:100%;height:100%;opacity:.4>");
9
10
  const ExpandPlugin = {
10
- store: (store) => ({
11
- expands: [],
12
- expandCol: {
13
- id: Symbol("expand"),
14
- fixed: "left",
15
- width: 45,
16
- render: solidComponent((o) => createComponent(ArrowCell, {
17
- store,
18
- get data() {
19
- return o.data;
20
- }
21
- })),
22
- props: (o) => ({ onClick: () => store.toggleExpand(o.data) }),
23
- [store.internal]: 1
24
- },
25
- isExpand: (data) => !!store.expands.find((e) => unwrap(e) == unwrap(data)),
26
- toggleExpand: (data) => store.isExpand(data) ? remove(store.expands, (e) => unwrap(e) == unwrap(data)) : store.expands.push(unwrap(data))
27
- }),
11
+ store: (e) => ({ expandCol: {
12
+ id: Symbol("expand"),
13
+ fixed: "left",
14
+ width: 45,
15
+ render: solidComponent((h) => createComponent(ArrowCell, {
16
+ store: e,
17
+ get data() {
18
+ return h.data;
19
+ }
20
+ })),
21
+ props: (h) => ({ onClick: () => e.commands.expand.toggle(h.data) }),
22
+ [e.internal]: 1
23
+ } }),
24
+ commands: (e) => ({ expand: useSelector({ multiple: !0 }) }),
28
25
  rewriteProps: {
29
- columns: ({ columns }, { store }) => [store.expandCol, ...columns],
30
- Tr: ({ Tr }, { store }) => (o) => {
31
- const { props } = useContext(Ctx);
32
- if (!o.data?.[store.expandCol.id]) return createComponent(Tr, o);
33
- return createComponent(Tr, mergeProps(o, { get children() {
34
- var _el$ = _tmpl$();
35
- insert(_el$, (() => {
36
- var _c$ = memo(() => !!props.expand?.render);
37
- return () => _c$() && renderComponent(props.expand.render, o, props.renderer);
38
- })());
39
- effect(() => setAttribute(_el$, "colspan", props.columns?.length));
40
- return _el$;
26
+ expand: ({ expand: e }) => defaultsDeep(e, { enable: !1 }),
27
+ columns: ({ columns: e }, { store: h }) => h.props.expand?.enable ? [h.expandCol, ...e] : e,
28
+ Tr: ({ Tr: h }, { store: g }) => g.props.expand?.enable ? (_) => {
29
+ let { props: v } = useContext(Ctx);
30
+ return createComponent(h, mergeProps(_, { get children() {
31
+ return memo(() => !_.data?.[g.expandCol.id])() ? _.children : (() => {
32
+ var h = _tmpl$();
33
+ return insert(h, (() => {
34
+ var h = memo(() => !!v.expand?.render);
35
+ return () => h() && renderComponent(v.expand.render, _, v.renderer);
36
+ })()), effect(() => setAttribute(h, "colspan", v.columns?.length)), h;
37
+ })();
41
38
  } }));
42
- },
43
- data: ({ data }, { store }) => store.expands.length ? data?.flatMap((e) => store.isExpand(e) ? [e, { [store.expandCol.id]: 1 }] : e) : data
39
+ } : h,
40
+ Td: ({ Td: e }, { store: h }) => (g) => (g = combineProps(g, { onClick: () => g.col.id == h.expandCol.id && h.commands.expand.toggle(g.data) }), createComponent(e, g)),
41
+ data: ({ data: e }, { store: h }) => h.commands.expand.value.length ? e?.flatMap((e) => h.commands.expand.has(e) ? [e, { [h.expandCol.id]: 1 }] : e) : e
44
42
  }
45
43
  };
46
- var ArrowCell = (_props) => {
47
- const show = createMemo(() => _props.store.isExpand(_props.data));
48
- return (() => {
49
- var _el$2 = _tmpl$2();
50
- insert(_el$2, createComponent(chevron_right_default, { get style() {
51
- return `transform: rotate(${show() ? 90 : 0}deg);`;
52
- } }));
53
- return _el$2;
54
- })();
55
- };
44
+ var ArrowCell = (e) => (() => {
45
+ var h = _tmpl$2();
46
+ return insert(h, createComponent(chevron_right_default, { get style() {
47
+ return `transform: rotate(${e.store.commands.expand.has(e.data) ? 90 : 0}deg);`;
48
+ } })), h;
49
+ })();
56
50
  export { ExpandPlugin };
@@ -5,31 +5,26 @@ import { unwrap } from "solid-js/store";
5
5
  import { combineProps } from "@solid-primitives/props";
6
6
  import { captureStoreUpdates } from "@solid-primitives/deep";
7
7
  const HistoryPlugin = {
8
- store: (store) => {
9
- const getDelta = createMemo(() => captureStoreUpdates(store.rawProps.data || []));
10
- let clonedState;
8
+ store: (r) => {
9
+ let i = createMemo(() => captureStoreUpdates(r.rawProps.data || [])), s;
11
10
  return { history: useHistory([() => {
12
- const delta = getDelta()();
13
- if (!delta.length) return;
14
- for (const { path, value } of delta) if (path.length == 0) clonedState = structuredClone(unwrap(value));
15
- else {
16
- const target = [...clonedState];
17
- path.reduce((o, k, i) => o[k] = i < path.length - 1 ? Array.isArray(o[k]) ? [...o[k]] : { ...o[k] } : structuredClone(unwrap(value)), target);
18
- clonedState = target;
11
+ let e = i()();
12
+ if (e.length) {
13
+ for (let { path: r, value: i } of e) if (r.length == 0) s = structuredClone(unwrap(i));
14
+ else {
15
+ let e = [...s];
16
+ r.reduce((e, a, s) => e[a] = s < r.length - 1 ? Array.isArray(e[a]) ? [...e[a]] : { ...e[a] } : structuredClone(unwrap(i)), e), s = e;
17
+ }
18
+ return s;
19
19
  }
20
- return clonedState;
21
- }, (v) => store.props.onDataChange?.(v)]) };
20
+ }, (e) => r.props.onDataChange?.(e)]) };
22
21
  },
23
22
  rewriteProps: {
24
- Table: ({ Table }, { store }) => (o) => {
25
- useTinykeys(() => store.table, {
26
- "Control+Z": () => store.history.undo(),
27
- "Control+Y": () => store.history.redo()
28
- });
29
- o = combineProps({ tabindex: -1 }, o);
30
- return createComponent(Table, o);
31
- },
32
- tdProps: ({ tdProps }, { store }) => (o) => combineProps(tdProps?.(o) || {}, {})
23
+ Table: ({ Table: e }, { store: a }) => (o) => (useTinykeys(() => a.table, {
24
+ "Control+Z": () => a.history.undo(),
25
+ "Control+Y": () => a.history.redo()
26
+ }), o = combineProps({ tabindex: -1 }, o), createComponent(e, o)),
27
+ tdProps: ({ tdProps: e }, { store: r }) => (r) => combineProps(e?.(r) || {}, {})
33
28
  }
34
29
  };
35
30
  export { HistoryPlugin };
@@ -8,124 +8,100 @@ import { range, remove } from "es-toolkit";
8
8
  import { createEventListener } from "@solid-primitives/event-listener";
9
9
  import { autoPlacement, computePosition } from "@floating-ui/dom";
10
10
  const MenuPlugin = {
11
- store: (store) => ({}),
12
- rewriteProps: { Table: ({ Table }, { store }) => (o) => {
13
- const [menuEl, setMenuEl] = createSignal();
14
- const _menus = mapArray(() => store.plugins || [], (plugin) => createMemo(() => plugin.menus?.(store)));
15
- const menus = createMemo(() => _menus().flatMap((e) => e() || []));
16
- const [pos, setPos] = createSignal();
17
- function onContextMenu(e) {
18
- e.preventDefault();
19
- setPos({
11
+ name: "menu",
12
+ priority: Infinity,
13
+ store: (e) => ({}),
14
+ rewriteProps: { Table: ({ Table: e }, { store: d }) => (m) => {
15
+ let [h, g] = createSignal(), _ = mapArray(() => d.plugins || [], (e) => createMemo(() => e.menus?.(d))), v = createMemo(() => _().flatMap((e) => e() || [])), [y, b] = createSignal();
16
+ function x(e) {
17
+ e.preventDefault(), b({
20
18
  x: e.x,
21
19
  y: e.y
22
20
  });
23
21
  }
24
22
  createEventListener(document, "pointerdown", (e) => {
25
- menuEl()?.contains(e.target) || setPos();
23
+ h()?.contains(e.target) || b();
26
24
  });
27
- const style$1 = useMemoAsync(() => {
28
- const mel = menuEl();
29
- if (!mel) return;
30
- return computePosition({ getBoundingClientRect: () => DOMRect.fromRect(pos()) }, mel, {
25
+ let S = useMemoAsync(() => {
26
+ let e = h();
27
+ if (e) return computePosition({ getBoundingClientRect: () => DOMRect.fromRect(y()) }, e, {
31
28
  strategy: "fixed",
32
29
  placement: "top-start",
33
30
  middleware: [autoPlacement({
34
31
  boundary: document.body,
35
32
  alignment: "start"
36
33
  })]
37
- }).then(({ x, y }) => ({
34
+ }).then(({ x: e, y: o }) => ({
38
35
  position: "fixed",
39
- transform: `translate(${x}px, ${y}px)`,
36
+ transform: `translate(${e}px, ${o}px)`,
40
37
  top: 0,
41
38
  left: 0,
42
39
  "z-index": 10
43
40
  }));
44
41
  });
45
- o = combineProps({
42
+ return m = combineProps({
46
43
  tabindex: -1,
47
- onContextMenu
48
- }, o);
49
- return createComponent(Table, mergeProps(o, { get children() {
50
- return [memo(() => memo(() => !!pos())() && createComponent(Menu, {
51
- ref: setMenuEl,
44
+ onContextMenu: x
45
+ }, m), createComponent(e, mergeProps(m, { get children() {
46
+ return [memo(() => memo(() => !!y())() && createComponent(Menu, {
47
+ ref: g,
52
48
  get style() {
53
- return style$1() || "position: absolute";
49
+ return S() || "position: fixed";
54
50
  },
55
51
  get items() {
56
- return menus();
52
+ return v();
57
53
  },
58
- onAction: () => setPos()
59
- })), memo(() => o.children)];
54
+ onAction: () => b()
55
+ })), memo(() => m.children)];
60
56
  } }));
61
57
  } },
62
- menus: (store) => [
58
+ menus: (e) => [
63
59
  {
64
60
  label: "新增行 ↑",
65
- disabled: () => true,
66
- cb: () => store.commands.addRows(store.selected.end[1], [store.props.newRow(store.selected.end[1])])
61
+ cb: () => e.commands.addRows(e.selected.end[1], [e.props.newRow(e.selected.end[1])])
67
62
  },
68
63
  {
69
64
  label: "新增行 ↓",
70
- cb: () => store.commands.addRows(store.selected.end[1], [store.props.newRow(store.selected.end[1])], false)
65
+ cb: () => e.commands.addRows(e.selected.end[1], [e.props.newRow(e.selected.end[1])], !1)
71
66
  },
72
67
  {
73
68
  label: "删除行",
74
- cb: () => store.commands.deleteRows(range(...((e) => [e[0], e[1] + 1])([store.selected.start[1], store.selected.end[1]].sort((a, b) => a - b))))
69
+ cb: () => e.commands.deleteRows(range(...((e) => [e[0], e[1] + 1])([e.selected.start[1], e.selected.end[1]].sort((e, o) => e - o))))
75
70
  }
76
71
  ],
77
- commands: (store) => ({
78
- rowEquals(a, b) {
79
- return a == b;
72
+ commands: (o) => ({
73
+ rowEquals(e, o) {
74
+ return e == o;
80
75
  },
81
- rowIndexOf(data, row) {
82
- return data.findIndex((e) => store.commands.rowEquals(e, row));
76
+ rowIndexOf(e, s) {
77
+ return e.findIndex((e) => o.commands.rowEquals(e, s));
83
78
  },
84
- rowChange(row, i) {
85
- const data = [...store.rawProps.data || []];
86
- i = i != null ? data.findIndex((ee) => ee == store.props.data[i]) : store.commands.rowIndexOf(data, row);
87
- if (i > -1) {
88
- data[i] = row;
89
- store.props.onDataChange?.(data);
90
- }
79
+ rowChange(e, s) {
80
+ let c = [...o.rawProps.data || []];
81
+ s = s == null ? o.commands.rowIndexOf(c, e) : c.findIndex((e) => e == o.props.data[s]), s > -1 && (c[s] = e, o.props.onDataChange?.(c));
91
82
  },
92
- addRows(i, rows, before = true) {
93
- addRows(store, i, rows, before);
83
+ addRows(e, s, c = !0) {
84
+ addRows(o, e, s, c);
94
85
  },
95
- deleteRows(ii) {
96
- const { rowKey, data } = store.props;
97
- const val = [...store.rawProps.data || []];
98
- const ids = new Set(ii.map((i) => data[i]));
99
- log([...ids]);
100
- remove(val, (e) => ids.has(e));
101
- store.props?.onDataChange?.(val);
86
+ deleteRows(s) {
87
+ let { rowKey: c, data: l } = o.props, u = [...o.rawProps.data || []], d = new Set(s.map((e) => l[e]));
88
+ log([...d]), remove(u, (e) => d.has(e)), o.props?.onDataChange?.(u);
102
89
  }
103
90
  })
104
91
  };
105
- function addRows(store, i, rows, before) {
106
- const { data } = store.props;
107
- const prev = (i$1) => {
108
- before = false;
109
- while (--i$1 >= 0 && data[i$1]?.[store.internal]);
110
- return i$1 >= 0 ? data[i$1] : null;
111
- };
112
- const next = (i$1) => {
113
- before = true;
114
- while (++i$1 < data.length && data[i$1]?.[store.internal]);
115
- return i$1 < data.length ? data[i$1] : null;
116
- };
117
- const anchor = !data[i]?.[store.internal] ? data[i] : before ? prev(i) || next(i) : next(i) || prev(i);
118
- if (anchor) batch(() => {
119
- i = store.commands.rowIndexOf(data, anchor);
120
- if (!store.selected) return;
121
- store.selected.start = [0, i + (before ? 0 : 1)];
122
- store.selected.end = [Infinity, i + rows.length - 1 + (before ? 0 : 1)];
123
- });
124
- (() => {
125
- const data$1 = [...store.rawProps.data || []];
126
- const i$1 = anchor ? store.commands.rowIndexOf(data$1, anchor) + (before ? 0 : 1) : data$1.length;
127
- data$1.splice(i$1, 0, ...rows);
128
- store.props?.onDataChange?.(data$1);
92
+ function addRows(e, o, s, c) {
93
+ let { data: l } = e.props, u = (o) => {
94
+ for (c = !1; --o >= 0 && l[o]?.[e.internal];);
95
+ return o >= 0 ? l[o] : null;
96
+ }, f = (o) => {
97
+ for (c = !0; ++o < l.length && l[o]?.[e.internal];);
98
+ return o < l.length ? l[o] : null;
99
+ }, p = l[o]?.[e.internal] ? c ? u(o) || f(o) : f(o) || u(o) : l[o];
100
+ p && batch(() => {
101
+ o = e.commands.rowIndexOf(l, p), e.selected && (e.selected.start = [0, o + (c ? 0 : 1)], e.selected.end = [Infinity, o + s.length - 1 + (c ? 0 : 1)]);
102
+ }), (() => {
103
+ let o = [...e.rawProps.data || []], l = p ? e.commands.rowIndexOf(o, p) + (c ? 0 : 1) : o.length;
104
+ o.splice(l, 0, ...s), e.props?.onDataChange?.(o);
129
105
  })();
130
106
  }
131
107
  export { MenuPlugin };