intable 0.0.21 → 0.0.23
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/AndOr.d.ts +35 -0
- package/dist/components/AndOr.js +188 -0
- package/dist/components/AndOrFields.d.ts +38 -0
- package/dist/components/AndOrFields.js +280 -0
- package/dist/components/Filter.d.ts +10 -0
- package/dist/components/Filter.js +97 -0
- package/dist/filter.js +6 -0
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/useVirtualizer.js +55 -59
- package/dist/index.d.ts +1 -1
- package/dist/index.js +30 -26
- package/dist/plugins/CellSelectionPlugin.js +4 -0
- package/dist/plugins/CommandPlugin.js +19 -21
- package/dist/plugins/CopyPastePlugin.js +40 -26
- package/dist/plugins/DiffPlugin.js +33 -37
- package/dist/plugins/EditablePlugin.js +6 -10
- package/dist/plugins/FilterPlugin.d.ts +14 -0
- package/dist/plugins/FilterPlugin.js +138 -0
- package/dist/plugins/MenuPlugin.js +4 -3
- package/dist/plugins/RenderPlugin/index.d.ts +1 -0
- package/dist/plugins/RenderPlugin/index.js +1 -1
- package/dist/plugins/ValidatorPlugin.js +36 -35
- package/dist/style.css +2 -2
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +42 -31
- package/package.json +1 -1
- package/dist/plugins/CellChangeHighlightPlugin.d.ts +0 -2
- package/dist/plugins/CellChangeHighlightPlugin.js +0 -4
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Popover } from "./Popover.js";
|
|
2
|
+
import { AndOrFields, RuleValueEditor, isValueFreeOp, newRule } from "./AndOrFields.js";
|
|
3
|
+
import filter_default from "../filter.js";
|
|
4
|
+
import { addEventListener, className, createComponent, delegateEvents, effect, insert, template, use } from "solid-js/web";
|
|
5
|
+
import { Show } from "solid-js";
|
|
6
|
+
import { isEqual } from "es-toolkit";
|
|
7
|
+
import { autoPlacement, offset } from "floating-ui-solid";
|
|
8
|
+
var _tmpl$ = /* @__PURE__ */ template("<div class=\"mt-1 flex gap-1.5\"><button aria-label=筛选 title=筛选>"), _tmpl$2 = /* @__PURE__ */ template("<div class=\"filter-input min-w-24 op-60 select-none\">"), _tmpl$3 = /* @__PURE__ */ template("<div class=\"tt-menu p-4! z-2\">");
|
|
9
|
+
function isRuleNode(e) {
|
|
10
|
+
return e ? "field" in e : !1;
|
|
11
|
+
}
|
|
12
|
+
function firstRule(e) {
|
|
13
|
+
if (e) {
|
|
14
|
+
if (isRuleNode(e)) return e;
|
|
15
|
+
for (let _ of e.children ?? []) {
|
|
16
|
+
let e = firstRule(_);
|
|
17
|
+
if (e) return e;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const Filter = (y) => {
|
|
22
|
+
let b, x = () => y.tree, C = () => firstRule(x()), w = () => isValueFreeOp(C()?.op), T = (e) => {
|
|
23
|
+
if (isEqual({
|
|
24
|
+
...x(),
|
|
25
|
+
value: e
|
|
26
|
+
}, newRule(y.col))) {
|
|
27
|
+
y.setTree();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!x()) {
|
|
31
|
+
y.setTree(newRule(y.col, { value: e }));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
let _ = firstRule(x());
|
|
35
|
+
_ && (_.value = e);
|
|
36
|
+
};
|
|
37
|
+
return (() => {
|
|
38
|
+
var v = _tmpl$(), S = v.firstChild;
|
|
39
|
+
v.$$click = (e) => e.stopPropagation(), addEventListener(v, "pointerdown", (e) => e.stopPropagation()), addEventListener(v, "keydown", (e) => e.stopPropagation()), insert(v, createComponent(Show, {
|
|
40
|
+
get when() {
|
|
41
|
+
return !w();
|
|
42
|
+
},
|
|
43
|
+
get fallback() {
|
|
44
|
+
return _tmpl$2();
|
|
45
|
+
},
|
|
46
|
+
get children() {
|
|
47
|
+
return createComponent(RuleValueEditor, {
|
|
48
|
+
get field() {
|
|
49
|
+
return y.col;
|
|
50
|
+
},
|
|
51
|
+
get op() {
|
|
52
|
+
return C()?.op;
|
|
53
|
+
},
|
|
54
|
+
class: "filter-input",
|
|
55
|
+
get value() {
|
|
56
|
+
return C()?.value ?? "";
|
|
57
|
+
},
|
|
58
|
+
get enum() {
|
|
59
|
+
return y.col.enum;
|
|
60
|
+
},
|
|
61
|
+
onChange: (e) => T(String(e ?? ""))
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}), S);
|
|
65
|
+
var E = b;
|
|
66
|
+
return typeof E == "function" ? use(E, S) : b = S, insert(S, createComponent(filter_default, { class: "size-3.5 op-75" })), insert(v, createComponent(Popover, {
|
|
67
|
+
trigger: "click",
|
|
68
|
+
strategy: "fixed",
|
|
69
|
+
placement: "bottom",
|
|
70
|
+
get middleware() {
|
|
71
|
+
return [offset({ mainAxis: 6 }), autoPlacement({
|
|
72
|
+
boundary: document.body,
|
|
73
|
+
alignment: "start"
|
|
74
|
+
})];
|
|
75
|
+
},
|
|
76
|
+
reference: b,
|
|
77
|
+
get floating() {
|
|
78
|
+
return (() => {
|
|
79
|
+
var e = _tmpl$3();
|
|
80
|
+
return insert(e, createComponent(AndOrFields, {
|
|
81
|
+
get fields() {
|
|
82
|
+
return [y.col];
|
|
83
|
+
},
|
|
84
|
+
get value() {
|
|
85
|
+
return x() ?? newRule(y.col);
|
|
86
|
+
},
|
|
87
|
+
onChange: (e) => y.setTree(isEqual(e, newRule(y.col)) ? void 0 : e),
|
|
88
|
+
newRule: () => newRule(y.col),
|
|
89
|
+
hideFields: !0
|
|
90
|
+
})), e;
|
|
91
|
+
})();
|
|
92
|
+
}
|
|
93
|
+
}), null), effect(() => className(S, `filter-input w-a! flex items-center justify-center ${x() && "bg-blue/20! c-blue b-#00000000!"}`)), v;
|
|
94
|
+
})();
|
|
95
|
+
};
|
|
96
|
+
delegateEvents(["click"]);
|
|
97
|
+
export { Filter };
|
package/dist/filter.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { spread, template } from "solid-js/web";
|
|
2
|
+
var _tmpl$ = /* @__PURE__ */ template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"M22 3H2l8 9.46V19l4 2v-8.54z\">"), filter_default = (n = {}) => (() => {
|
|
3
|
+
var r = _tmpl$();
|
|
4
|
+
return spread(r, n, !0, !0), r;
|
|
5
|
+
})();
|
|
6
|
+
export { filter_default as default };
|
package/dist/hooks/index.js
CHANGED
|
@@ -111,7 +111,10 @@ function useMouseDown(h) {
|
|
|
111
111
|
}
|
|
112
112
|
function useClicked(h) {
|
|
113
113
|
let [B, V] = createSignal(!1), H = () => castArray(access(h));
|
|
114
|
-
return createEventListener(() => H().map((h) => h?.getRootNode()), "click", (h) =>
|
|
114
|
+
return createEventListener(() => H().map((h) => h?.getRootNode()), "click", (h) => {
|
|
115
|
+
let B = h.composedPath();
|
|
116
|
+
V(H().some((h) => B.includes(h)));
|
|
117
|
+
}), B;
|
|
115
118
|
}
|
|
116
119
|
function useMutation(h, B, V) {
|
|
117
120
|
let H = createSignal(V());
|
|
@@ -1,96 +1,92 @@
|
|
|
1
|
+
import { throttlePromise } from "../utils.js";
|
|
1
2
|
import { createComputed, createMemo, createSignal, mergeProps, untrack } from "solid-js";
|
|
2
3
|
import { createElementSize } from "@solid-primitives/resize-observer";
|
|
3
4
|
import { createScrollPosition } from "@solid-primitives/scroll";
|
|
4
|
-
import { uniqBy } from "es-toolkit";
|
|
5
|
+
import { keyBy, uniqBy } from "es-toolkit";
|
|
5
6
|
var FenwickTree = class e {
|
|
6
7
|
constructor(e) {
|
|
7
8
|
this.n = e, this.tree = new Float64Array(e + 1);
|
|
8
9
|
}
|
|
9
|
-
add(e,
|
|
10
|
-
for (e += 1; e <= this.n; e += e & -e) this.tree[e] +=
|
|
10
|
+
add(e, s) {
|
|
11
|
+
for (e += 1; e <= this.n; e += e & -e) this.tree[e] += s;
|
|
11
12
|
}
|
|
12
13
|
sum(e) {
|
|
13
|
-
let
|
|
14
|
-
for (e += 1; e > 0; e -= e & -e)
|
|
15
|
-
return
|
|
14
|
+
let s = 0;
|
|
15
|
+
for (e += 1; e > 0; e -= e & -e) s += this.tree[e];
|
|
16
|
+
return s;
|
|
16
17
|
}
|
|
17
18
|
total() {
|
|
18
19
|
return this.n > 0 ? this.sum(this.n - 1) : 0;
|
|
19
20
|
}
|
|
20
21
|
findByOffset(e) {
|
|
21
|
-
let
|
|
22
|
-
for (let
|
|
23
|
-
return Math.min(
|
|
22
|
+
let s = 0;
|
|
23
|
+
for (let c = 1 << Math.floor(Math.log2(this.n || 1)); c > 0; c >>= 1) s + c <= this.n && this.tree[s + c] <= e && (s += c, e -= this.tree[s]);
|
|
24
|
+
return Math.min(s, this.n - 1);
|
|
24
25
|
}
|
|
25
|
-
static build(
|
|
26
|
-
let
|
|
27
|
-
for (let e = 0; e <
|
|
28
|
-
|
|
29
|
-
let
|
|
30
|
-
|
|
26
|
+
static build(s) {
|
|
27
|
+
let c = s.length, l = new e(c);
|
|
28
|
+
for (let e = 0; e < c; e++) {
|
|
29
|
+
l.tree[e + 1] += s[e];
|
|
30
|
+
let u = e + 1 + (e + 1 & -(e + 1));
|
|
31
|
+
u <= c && (l.tree[u] += l.tree[e + 1]);
|
|
31
32
|
}
|
|
32
|
-
return
|
|
33
|
+
return l;
|
|
33
34
|
}
|
|
34
35
|
};
|
|
35
|
-
function useVirtualizer(
|
|
36
|
-
|
|
36
|
+
function useVirtualizer(d) {
|
|
37
|
+
d = mergeProps({
|
|
37
38
|
overscan: 0,
|
|
38
39
|
batch: 0,
|
|
39
40
|
enable: !0
|
|
40
|
-
},
|
|
41
|
-
let
|
|
41
|
+
}, d);
|
|
42
|
+
let f = createElementSize(d.getScrollElement), p = createScrollPosition(d.getScrollElement), m = createMemo(() => d.horizontal ? p.x : p.y), h = createMemo(() => d.horizontal ? f.width : f.height), g = [], _ = new FenwickTree(0), [v, y] = createSignal(void 0, { equals: !1 }), b = throttlePromise(queueMicrotask), x = () => b().then(y);
|
|
42
43
|
createComputed(() => {
|
|
43
|
-
let { count: e } =
|
|
44
|
+
let { count: e } = d;
|
|
44
45
|
untrack(() => {
|
|
45
|
-
if (e !==
|
|
46
|
-
if (e >
|
|
47
|
-
else
|
|
48
|
-
|
|
46
|
+
if (e !== g.length) {
|
|
47
|
+
if (e > g.length) for (let s = g.length; s < e; s++) g.push(d.estimateSize(s));
|
|
48
|
+
else g.length = e;
|
|
49
|
+
_ = FenwickTree.build(g.slice(0, e)), x();
|
|
49
50
|
}
|
|
50
51
|
});
|
|
51
52
|
});
|
|
52
|
-
let
|
|
53
|
+
let S = (e) => ({
|
|
53
54
|
index: e,
|
|
54
|
-
start:
|
|
55
|
-
end:
|
|
56
|
-
}),
|
|
57
|
-
|
|
58
|
-
let { batch:
|
|
59
|
-
return
|
|
60
|
-
}, 0),
|
|
61
|
-
|
|
62
|
-
let { batch:
|
|
63
|
-
return
|
|
64
|
-
}, 0),
|
|
65
|
-
if (
|
|
55
|
+
start: _.sum(e - 1),
|
|
56
|
+
end: _.sum(e)
|
|
57
|
+
}), C = createMemo((e) => {
|
|
58
|
+
v();
|
|
59
|
+
let { batch: s, overscan: c = 0 } = d, l = _.findByOffset(m()) - c;
|
|
60
|
+
return s && (l > e ? l = l <= e + s ? e : l > e + s * 2 ? l : e + s : l -= s), Math.max(l, 0);
|
|
61
|
+
}, 0), w = createMemo((e) => {
|
|
62
|
+
v();
|
|
63
|
+
let { batch: s, overscan: c = 0 } = d, l = _.findByOffset(m() + h()) + c;
|
|
64
|
+
return s && (l < e ? l = l >= e - s ? e : l < e - s * 2 ? l : e - s : l += s), Math.min(l, d.count - 1);
|
|
65
|
+
}, 0), T = createMemo(() => {
|
|
66
|
+
if (v(), !d.enable) return Array.from({ length: d.count }, (e, s) => S(s));
|
|
66
67
|
let e = [];
|
|
67
|
-
for (let
|
|
68
|
-
return
|
|
68
|
+
for (let s = C(); s <= w(); s++) e.push(S(s));
|
|
69
|
+
return d.extras && (e.push(...d.extras(C(), w())?.map((e) => S(e)) || []), e = uniqBy(e, (e) => e.index)), e;
|
|
69
70
|
});
|
|
70
71
|
return {
|
|
71
|
-
options:
|
|
72
|
-
startIdx:
|
|
73
|
-
endIdx:
|
|
74
|
-
getTotalSize: () => (
|
|
75
|
-
resizeItem: (e,
|
|
76
|
-
let
|
|
77
|
-
if (
|
|
78
|
-
if (e <
|
|
79
|
-
let e =
|
|
80
|
-
(
|
|
72
|
+
options: d,
|
|
73
|
+
startIdx: C,
|
|
74
|
+
endIdx: w,
|
|
75
|
+
getTotalSize: () => (v(), _.total()),
|
|
76
|
+
resizeItem: (e, s) => {
|
|
77
|
+
let c = g[e] ?? 0;
|
|
78
|
+
if (c !== s) {
|
|
79
|
+
if (e < C()) {
|
|
80
|
+
let e = d.getScrollElement();
|
|
81
|
+
(d.horizontal ? e.scrollLeft : e.scrollTop) !== 0 && (d.horizontal ? e.scrollLeft += s - c : e.scrollTop += s - c);
|
|
81
82
|
}
|
|
82
|
-
|
|
83
|
+
_.add(e, s - c), g[e] = s, x();
|
|
83
84
|
}
|
|
84
85
|
},
|
|
85
|
-
getVirtualItems:
|
|
86
|
+
getVirtualItems: T,
|
|
86
87
|
getVirtualItem: (() => {
|
|
87
|
-
let e = createMemo(() =>
|
|
88
|
-
|
|
89
|
-
let e = {};
|
|
90
|
-
for (let a of x()) e[a.index] = a;
|
|
91
|
-
return e;
|
|
92
|
-
});
|
|
93
|
-
return (a) => e()[a];
|
|
88
|
+
let e = createMemo(() => keyBy(T(), (e) => e.index));
|
|
89
|
+
return (s) => e()[s];
|
|
94
90
|
})()
|
|
95
91
|
};
|
|
96
92
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -116,7 +116,7 @@ export type TDProps = {
|
|
|
116
116
|
export type TD = Component<TDProps>;
|
|
117
117
|
type Obj = Record<string | symbol, any>;
|
|
118
118
|
export interface TableColumn extends Obj {
|
|
119
|
-
id
|
|
119
|
+
id: any;
|
|
120
120
|
name?: string;
|
|
121
121
|
width?: number;
|
|
122
122
|
fixed?: 'left' | 'right';
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ import { TreePlugin } from "./plugins/TreePlugin.js";
|
|
|
18
18
|
import { HeaderGroupPlugin } from "./plugins/HeaderGroup.js";
|
|
19
19
|
import { ValidatorPlugin } from "./plugins/ValidatorPlugin.js";
|
|
20
20
|
import { createComponent, insert, memo, mergeProps, spread, template, use } from "solid-js/web";
|
|
21
|
-
import { $PROXY, For, batch,
|
|
21
|
+
import { $PROXY, For, batch, createContext, createEffect, createMemo, createSignal, getOwner, mapArray, mergeProps as mergeProps$1, on, onCleanup, onMount, runWithOwner, untrack, useContext } from "solid-js";
|
|
22
22
|
import { createMutable, reconcile } from "solid-js/store";
|
|
23
23
|
import { combineProps } from "@solid-primitives/props";
|
|
24
24
|
import { createLazyMemo } from "@solid-primitives/memo";
|
|
@@ -38,17 +38,17 @@ const Ctx = createContext({
|
|
|
38
38
|
get plugins() {
|
|
39
39
|
return Z();
|
|
40
40
|
}
|
|
41
|
-
}), X = memoize((q) => runWithOwner(J, () => unFn(q, Y))), Z = createMemo(() =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let q = difference(Z(), v);
|
|
41
|
+
}), X = memoize((q) => runWithOwner(J, () => unFn(q, Y))), Z = createMemo((v) => {
|
|
42
|
+
let Z = [
|
|
43
|
+
...defaultsPlugins,
|
|
44
|
+
...q.plugins || [],
|
|
45
|
+
RenderPlugin
|
|
46
|
+
].map(X).sort((v, q) => (q.priority || 0) - (v.priority || 0)), $ = difference(Z, v);
|
|
48
47
|
return runWithOwner(J, () => {
|
|
49
|
-
|
|
50
|
-
}), Z
|
|
51
|
-
}, [])
|
|
48
|
+
$.forEach((v) => Object.assign(Y, v.store?.(Y)));
|
|
49
|
+
}), Z;
|
|
50
|
+
}, []);
|
|
51
|
+
Y.props = (() => {
|
|
52
52
|
let v = getOwner(), J = {}, X = (q) => J[q] ??= runWithOwner(v, () => createMemo(() => Q(q)));
|
|
53
53
|
function Q(v) {
|
|
54
54
|
return createMemo(() => Z().map((q) => q.rewriteProps?.[v]).filter((v) => v), void 0, { equals: isEqual })().reduce((q, J) => J({ [v]: q }, { store: Y }), q[v]);
|
|
@@ -167,21 +167,25 @@ function BasePlugin() {
|
|
|
167
167
|
priority: Infinity,
|
|
168
168
|
store: (v) => {
|
|
169
169
|
let q = makeResizeObserver((q) => {
|
|
170
|
-
|
|
171
|
-
let
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
170
|
+
batch(() => {
|
|
171
|
+
for (let J of q) {
|
|
172
|
+
let q = J.target, { inlineSize: Y, blockSize: X } = J.borderBoxSize[0], Z = q.getAttribute("x");
|
|
173
|
+
Z >= 0 && q.parentElement && (v.thSizes[Z] = {
|
|
174
|
+
width: Y,
|
|
175
|
+
height: X
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}), J = makeResizeObserver(async (q) => {
|
|
180
|
+
batch(() => {
|
|
181
|
+
for (let J of q) {
|
|
182
|
+
let q = J.target, { inlineSize: Y, blockSize: X } = J.borderBoxSize[0], Z = q.getAttribute("y");
|
|
183
|
+
Z >= 0 && q.parentElement && (v.trSizes[Z] = {
|
|
184
|
+
width: Y,
|
|
185
|
+
height: X
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
});
|
|
185
189
|
});
|
|
186
190
|
return {
|
|
187
191
|
thObs: q,
|
|
@@ -104,6 +104,10 @@ const CellSelectionPlugin = {
|
|
|
104
104
|
ArrowDown: () => {
|
|
105
105
|
let { start: i, end: a } = e.selected;
|
|
106
106
|
i.length && (i[1] = a[1] = Math.min(i[1] + 1, e.props.data.length - 1), a[0] = i[0], e.scrollCellIfNeeded(i[0], i[1]));
|
|
107
|
+
},
|
|
108
|
+
"$mod+a": () => {
|
|
109
|
+
let { columns: i, data: a } = e.props;
|
|
110
|
+
!i?.length || !a?.length || (e.selected.start = [0, 0], e.selected.end = [i.length - 1, a.length - 1], e.scrollCellIfNeeded(e.selected.start[0], e.selected.start[1]));
|
|
107
111
|
}
|
|
108
112
|
})
|
|
109
113
|
};
|
|
@@ -1,43 +1,41 @@
|
|
|
1
1
|
import { createComponent } from "solid-js/web";
|
|
2
2
|
import { createMemo, getOwner, runWithOwner } from "solid-js";
|
|
3
3
|
import { combineProps } from "@solid-primitives/props";
|
|
4
|
+
import { createLazyMemo } from "@solid-primitives/memo";
|
|
4
5
|
import { createEventListener } from "@solid-primitives/event-listener";
|
|
5
6
|
import { createKeybindingsHandler } from "tinykeys";
|
|
6
7
|
const CommandPlugin = {
|
|
7
8
|
name: "command",
|
|
8
9
|
priority: Infinity,
|
|
9
10
|
store: (e) => {
|
|
10
|
-
let
|
|
11
|
-
return {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
n = typeof n == "object" ? e.props.columns.indexOf(n) : n, r = typeof r == "object" ? e.props.data.indexOf(r) : r;
|
|
17
|
-
let a = e.table.querySelector(`[x="${n}"][y="${r}"]`);
|
|
18
|
-
a && a.scrollIntoView({
|
|
11
|
+
let r = getOwner(), o = createLazyMemo(() => e.plugins.reduce((i, o) => Object.assign(i, runWithOwner(r, () => o.commands?.(e, { ...i }))), {}));
|
|
12
|
+
return Object.defineProperty(e, "commands", { get: () => o() }), {
|
|
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.table.querySelector(`[x="${r}"][y="${i}"]`);
|
|
16
|
+
o && o.scrollIntoView({
|
|
19
17
|
behavior: "smooth",
|
|
20
|
-
...
|
|
18
|
+
...a
|
|
21
19
|
});
|
|
22
20
|
},
|
|
23
|
-
scrollCellIfNeeded(
|
|
24
|
-
|
|
25
|
-
let
|
|
26
|
-
|
|
21
|
+
scrollCellIfNeeded(r, i, a = !1) {
|
|
22
|
+
r = typeof r == "object" ? e.props.columns.indexOf(r) : r, i = typeof i == "object" ? e.props.data.indexOf(i) : i;
|
|
23
|
+
let o = e.table.querySelector(`[x="${r}"][y="${i}"]`);
|
|
24
|
+
o && (o.scrollIntoViewIfNeeded(a), o.focus());
|
|
27
25
|
}
|
|
28
26
|
};
|
|
29
27
|
},
|
|
30
28
|
rewriteProps: { Table: ({ Table: s }, { store: c }) => (l) => {
|
|
31
29
|
let u = getOwner(), d = createMemo(() => {
|
|
32
30
|
let e = {};
|
|
33
|
-
for (let
|
|
34
|
-
let
|
|
35
|
-
|
|
31
|
+
for (let r of c.plugins) {
|
|
32
|
+
let i = runWithOwner(u, () => r.keybindings?.(c));
|
|
33
|
+
i && Object.assign(e, i);
|
|
36
34
|
}
|
|
37
|
-
let
|
|
38
|
-
if (
|
|
39
|
-
return createKeybindingsHandler(Object.fromEntries(Object.entries(e).map(([e,
|
|
40
|
-
e.preventDefault(),
|
|
35
|
+
let r = c.props?.keybindings;
|
|
36
|
+
if (r) for (let [i, a] of Object.entries(r)) a === !1 ? delete e[i] : typeof a == "function" && (e[i] = a);
|
|
37
|
+
return createKeybindingsHandler(Object.fromEntries(Object.entries(e).map(([e, r]) => [e, (e) => {
|
|
38
|
+
e.preventDefault(), r(e);
|
|
41
39
|
}])));
|
|
42
40
|
});
|
|
43
41
|
return createEventListener(() => c.scroll_el, "keydown", (e) => d()(e)), l = combineProps({ tabindex: -1 }, l), createComponent(s, l);
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import { unFn } from "../utils.js";
|
|
2
2
|
import { createEffect } from "solid-js";
|
|
3
|
+
function formatTSVCell(e) {
|
|
4
|
+
return /[\t\r\n"]/.test(e) ? "\"" + e.replace(/"/g, "\"\"") + "\"" : e;
|
|
5
|
+
}
|
|
6
|
+
function parseTSV(e) {
|
|
7
|
+
let t = [], n = [], r = "", i = 0;
|
|
8
|
+
for (; i < e.length;) {
|
|
9
|
+
let a = e[i];
|
|
10
|
+
if (a === "\"") for (i++; i < e.length;) if (e[i] === "\"") if (e[i + 1] === "\"") r += "\"", i += 2;
|
|
11
|
+
else {
|
|
12
|
+
i++;
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
else e[i] === "\r" && e[i + 1] === "\n" ? (r += "\n", i += 2) : e[i] === "\r" ? (r += "\n", i++) : r += e[i++];
|
|
16
|
+
else a === " " ? (n.push(r), r = "", i++) : a === "\r" && e[i + 1] === "\n" ? (n.push(r), t.push(n), n = [], r = "", i += 2) : a === "\r" || a === "\n" ? (n.push(r), t.push(n), n = [], r = "", i++) : (r += a, i++);
|
|
17
|
+
}
|
|
18
|
+
return (r || n.length) && (n.push(r), t.push(n)), t.length && t[t.length - 1].length === 1 && t[t.length - 1][0] === "" && t.pop(), t;
|
|
19
|
+
}
|
|
3
20
|
const ClipboardPlugin = {
|
|
4
21
|
name: "clipboard",
|
|
5
22
|
keybindings: (e) => ({
|
|
@@ -16,43 +33,40 @@ const ClipboardPlugin = {
|
|
|
16
33
|
menus: (e) => [],
|
|
17
34
|
commands: (t) => ({
|
|
18
35
|
copy: () => {
|
|
19
|
-
let { start: e, end:
|
|
36
|
+
let { start: e, end: r } = t.selected;
|
|
20
37
|
if (!e?.length) return;
|
|
21
|
-
let [
|
|
22
|
-
|
|
23
|
-
return String(n).replace(/[\t\r\n]/g, " ");
|
|
24
|
-
}).join(" ")).join("\n");
|
|
25
|
-
navigator.clipboard.writeText(c);
|
|
38
|
+
let [i, a] = [e[0], r[0]].sort((e, t) => e - t), [o, s] = [e[1], r[1]].sort((e, t) => e - t), c = t.props.columns.slice(i, a + 1).filter((e) => !e[t.internal]), l = t.props.data.slice(o, s + 1).map((e) => c.map((t) => formatTSVCell(String(e[t.id] ?? ""))).join(" ")).join("\r\n");
|
|
39
|
+
navigator.clipboard.writeText(l);
|
|
26
40
|
},
|
|
27
41
|
paste: async () => {
|
|
28
|
-
let { start: n, end:
|
|
42
|
+
let { start: n, end: i } = t.selected;
|
|
29
43
|
if (!n?.length) return;
|
|
30
|
-
let
|
|
31
|
-
for (let e =
|
|
32
|
-
let
|
|
33
|
-
if (
|
|
44
|
+
let a = await navigator.clipboard.readText(), o = parseTSV(a), s = o.length, c = o[0].length, [l, u] = [n[0], i[0]].sort((e, t) => e - t), [d, f] = [n[1], i[1]].sort((e, t) => e - t), p = f - d + 1, m = u - l + 1, h = p > s && p % s === 0 ? p : s, g = m > c && m % c === 0 ? m : c, _ = t.props.columns, v = [];
|
|
45
|
+
for (let e = l; e < _.length && v.length < g; e++) _[e][t.internal] || v.push(_[e]);
|
|
46
|
+
let y = t.props.data.slice(), b = d + h;
|
|
47
|
+
if (b > y.length) for (let e = y.length; e < b; e++) {
|
|
34
48
|
let n = t.props.newRow?.(e) || {};
|
|
35
|
-
|
|
49
|
+
y.push(n);
|
|
36
50
|
}
|
|
37
|
-
let
|
|
38
|
-
for (let n = 0; n <=
|
|
51
|
+
let x = d + h - 1;
|
|
52
|
+
for (let n = 0; n <= x - d; n++) {
|
|
39
53
|
let r = {};
|
|
40
|
-
|
|
41
|
-
let
|
|
54
|
+
v.forEach((i, a) => {
|
|
55
|
+
let l = y[d + n];
|
|
42
56
|
unFn(t.props.editable, {
|
|
43
|
-
col:
|
|
44
|
-
data:
|
|
45
|
-
x:
|
|
46
|
-
y:
|
|
47
|
-
}) && (r[
|
|
48
|
-
}),
|
|
49
|
-
...
|
|
57
|
+
col: i,
|
|
58
|
+
data: l,
|
|
59
|
+
x: _.indexOf(i),
|
|
60
|
+
y: d + n
|
|
61
|
+
}) && (r[i.id] = o[n % s][a % c]);
|
|
62
|
+
}), y[d + n] = {
|
|
63
|
+
...y[d + n],
|
|
50
64
|
...r
|
|
51
65
|
};
|
|
52
66
|
}
|
|
53
|
-
let
|
|
54
|
-
for (let e =
|
|
55
|
-
t.selected.end = [
|
|
67
|
+
let S = l, C = 0;
|
|
68
|
+
for (let e = l; e < _.length && C < v.length; e++) _[e][t.internal] || (S = e, C++);
|
|
69
|
+
t.selected.end = [S, x], t.props.onDataChange?.(y);
|
|
56
70
|
}
|
|
57
71
|
})
|
|
58
72
|
};
|
|
@@ -1,32 +1,28 @@
|
|
|
1
1
|
import { className, createComponent, effect, memo, mergeProps, template } from "solid-js/web";
|
|
2
2
|
import { createMemo } from "solid-js";
|
|
3
|
-
import { unwrap } from "solid-js/store";
|
|
4
3
|
import { createLazyMemo } from "@solid-primitives/memo";
|
|
5
4
|
import { isEqual, keyBy } from "es-toolkit";
|
|
6
|
-
import { v4 } from "uuid";
|
|
7
5
|
import { diffArrays } from "diff";
|
|
8
6
|
var _tmpl$ = /* @__PURE__ */ template("<div>"), DEL = Symbol("del"), NEW = Symbol("new");
|
|
9
7
|
const DiffPlugin = {
|
|
10
8
|
name: "diff",
|
|
11
9
|
priority: Infinity,
|
|
12
|
-
store: (e) => (
|
|
10
|
+
store: (e) => ({
|
|
13
11
|
diffData: () => e.props.diff?.data ?? [],
|
|
14
|
-
diffDataKeyed: createLazyMemo(() => keyBy(e.diffData(), (
|
|
12
|
+
diffDataKeyed: createLazyMemo(() => keyBy(e.diffData(), (o) => o[e.props.rowKey]))
|
|
15
13
|
}),
|
|
16
|
-
commands: (e) => ({ async diffCommit(
|
|
17
|
-
let { rowKey:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
let c = e.diffDataKeyed()[d[l]];
|
|
22
|
-
c ? isEqual(d, c) || f.push(d) : u.push(d);
|
|
14
|
+
commands: (e) => ({ async diffCommit(o = e.rawProps.data || []) {
|
|
15
|
+
let { rowKey: s } = e.props || {}, c = [], l = [], u = [], d = keyBy(o, (e) => e[s]);
|
|
16
|
+
for (let l of o) {
|
|
17
|
+
let o = e.diffDataKeyed()[l[s]];
|
|
18
|
+
o ? isEqual(l, o) || u.push(l) : c.push(l);
|
|
23
19
|
}
|
|
24
|
-
for (let
|
|
25
|
-
await e.props.diff?.onCommit?.(
|
|
26
|
-
added:
|
|
27
|
-
removed:
|
|
28
|
-
changed:
|
|
29
|
-
}),
|
|
20
|
+
for (let o of e.diffData()) !d[o[s]] && l.push(o);
|
|
21
|
+
await e.props.diff?.onCommit?.(o, {
|
|
22
|
+
added: c,
|
|
23
|
+
removed: l,
|
|
24
|
+
changed: u
|
|
25
|
+
}), c[NEW] = 0;
|
|
30
26
|
} }),
|
|
31
27
|
rewriteProps: {
|
|
32
28
|
diff: ({ diff: e }) => ({
|
|
@@ -36,40 +32,40 @@ const DiffPlugin = {
|
|
|
36
32
|
changed: !0,
|
|
37
33
|
...e
|
|
38
34
|
}),
|
|
39
|
-
data: ({ data: e }, { store:
|
|
40
|
-
if (!
|
|
41
|
-
let { rowKey:
|
|
42
|
-
if (e.length ===
|
|
43
|
-
let
|
|
44
|
-
for (let
|
|
45
|
-
|
|
35
|
+
data: ({ data: e }, { store: o }) => {
|
|
36
|
+
if (!o.props.diff?.enable) return e;
|
|
37
|
+
let { rowKey: s, diff: c } = o.props || {}, l = o.diffData();
|
|
38
|
+
if (e.length === l.length && e.length > 0) {
|
|
39
|
+
let o = !0;
|
|
40
|
+
for (let c = 0; c < e.length; c++) if (e[c]?.[s] !== l[c]?.[s]) {
|
|
41
|
+
o = !1;
|
|
46
42
|
break;
|
|
47
43
|
}
|
|
48
|
-
if (
|
|
44
|
+
if (o) return e;
|
|
49
45
|
}
|
|
50
|
-
return diffArrays(
|
|
46
|
+
return diffArrays(l, e, { comparator: (e, o) => e == o || e[s] == o[s] }).flatMap((e) => e.added ? e.value.map((e) => (e[NEW] = 1, e)) : e.removed ? c.removed ? e.value.map((e) => ({
|
|
51
47
|
...e,
|
|
52
48
|
[DEL]: 1,
|
|
53
|
-
[
|
|
49
|
+
[o.internal]: 1
|
|
54
50
|
})) : [] : e.value);
|
|
55
51
|
},
|
|
56
|
-
Td: ({ Td:
|
|
57
|
-
let
|
|
58
|
-
let { diff: e } =
|
|
59
|
-
return [
|
|
52
|
+
Td: ({ Td: u }, { store: f }) => f.props.diff?.enable ? (p) => {
|
|
53
|
+
let m = createMemo(() => {
|
|
54
|
+
let { diff: e } = f.props, o = p.data[f.props.rowKey];
|
|
55
|
+
return [p.data[NEW] ? "bg-green!" : p.data[DEL] ? "bg-red!" : p.data[f.internal] ? "" : e.changed && p.data[p.col.id] != f.diffDataKeyed()[o]?.[p.col.id] ? "bg-green!" : ""].join(" ");
|
|
60
56
|
});
|
|
61
|
-
return createComponent(
|
|
57
|
+
return createComponent(u, mergeProps(p, {
|
|
62
58
|
get class() {
|
|
63
|
-
return
|
|
59
|
+
return p.class + (m() ? " relative z-1" : "");
|
|
64
60
|
},
|
|
65
61
|
get children() {
|
|
66
|
-
return [memo(() =>
|
|
67
|
-
var
|
|
68
|
-
return effect(() => className(
|
|
62
|
+
return [memo(() => p.children), memo(() => memo(() => !!m())() && (() => {
|
|
63
|
+
var o = _tmpl$();
|
|
64
|
+
return effect(() => className(o, m() + " absolute inset-0 z--1 op-15 pointer-events-none")), o;
|
|
69
65
|
})())];
|
|
70
66
|
}
|
|
71
67
|
}));
|
|
72
|
-
} :
|
|
68
|
+
} : u
|
|
73
69
|
},
|
|
74
70
|
keybindings: (e) => ({ "$mod+S": () => e.commands.diffCommit() })
|
|
75
71
|
};
|