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.
@@ -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 };
@@ -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) => V(H().some((B) => B?.contains(h.target)))), B;
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, a) {
10
- for (e += 1; e <= this.n; e += e & -e) this.tree[e] += a;
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 a = 0;
14
- for (e += 1; e > 0; e -= e & -e) a += this.tree[e];
15
- return a;
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 a = 0;
22
- for (let o = 1 << Math.floor(Math.log2(this.n || 1)); o > 0; o >>= 1) a + o <= this.n && this.tree[a + o] <= e && (a += o, e -= this.tree[a]);
23
- return Math.min(a, this.n - 1);
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(a) {
26
- let o = a.length, s = new e(o);
27
- for (let e = 0; e < o; e++) {
28
- s.tree[e + 1] += a[e];
29
- let c = e + 1 + (e + 1 & -(e + 1));
30
- c <= o && (s.tree[c] += s.tree[e + 1]);
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 s;
33
+ return l;
33
34
  }
34
35
  };
35
- function useVirtualizer(l) {
36
- l = mergeProps({
36
+ function useVirtualizer(d) {
37
+ d = mergeProps({
37
38
  overscan: 0,
38
39
  batch: 0,
39
40
  enable: !0
40
- }, l);
41
- let u = createElementSize(l.getScrollElement), d = createScrollPosition(l.getScrollElement), f = createMemo(() => l.horizontal ? d.x : d.y), p = createMemo(() => l.horizontal ? u.width : u.height), m = [], h = new FenwickTree(0), [g, _] = createSignal(void 0, { equals: !1 });
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 } = l;
44
+ let { count: e } = d;
44
45
  untrack(() => {
45
- if (e !== m.length) {
46
- if (e > m.length) for (let a = m.length; a < e; a++) m.push(l.estimateSize(a));
47
- else m.length = e;
48
- h = FenwickTree.build(m.slice(0, e)), _();
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 v = (e) => ({
53
+ let S = (e) => ({
53
54
  index: e,
54
- start: e > 0 ? h.sum(e - 1) : 0,
55
- end: h.sum(e)
56
- }), y = createMemo((e) => {
57
- g();
58
- let { batch: a, overscan: o = 0 } = l, s = h.findByOffset(f()) - o;
59
- return a && (s > e ? s = s <= e + a ? e : s > e + a * 2 ? s : e + a : s -= a), Math.max(s, 0);
60
- }, 0), b = createMemo((e) => {
61
- g();
62
- let { batch: a, overscan: o = 0 } = l, s = h.findByOffset(f() + p()) + o;
63
- return a && (s < e ? s = s >= e - a ? e : s < e - a * 2 ? s : e - a : s += a), Math.min(s, l.count - 1);
64
- }, 0), x = createMemo(() => {
65
- if (g(), !l.enable) return Array.from({ length: l.count }, (e, a) => v(a));
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 a = y(); a <= b(); a++) e.push(v(a));
68
- return l.extras && (e.push(...l.extras(y(), b())?.map((e) => v(e)) || []), e = uniqBy(e, (e) => e.index).sort((e, a) => e.index - a.index)), e;
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: l,
72
- startIdx: y,
73
- endIdx: b,
74
- getTotalSize: () => (g(), h.total()),
75
- resizeItem: (e, a) => {
76
- let o = m[e] ?? 0;
77
- if (o !== a) {
78
- if (e < y()) {
79
- let e = l.getScrollElement();
80
- (l.horizontal ? e.scrollLeft : e.scrollTop) !== 0 && (l.horizontal ? e.scrollLeft += a - o : e.scrollTop += a - o);
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
- h.add(e, a - o), m[e] = a, _();
83
+ _.add(e, s - c), g[e] = s, x();
83
84
  }
84
85
  },
85
- getVirtualItems: x,
86
+ getVirtualItems: T,
86
87
  getVirtualItem: (() => {
87
- let e = createMemo(() => {
88
- g();
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?: any;
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, createComputed, createContext, createEffect, createMemo, createSignal, getOwner, mapArray, mergeProps as mergeProps$1, on, onCleanup, onMount, runWithOwner, untrack, useContext } from "solid-js";
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
- ...defaultsPlugins,
43
- ...q.plugins || [],
44
- RenderPlugin
45
- ].map(X).sort((v, q) => (q.priority || 0) - (v.priority || 0)));
46
- createComputed((v) => {
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
- q.forEach((v) => Object.assign(Y, v.store?.(Y)));
50
- }), Z();
51
- }, []), Y.props = (() => {
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
- for (let J of q) {
171
- let q = J.target, { inlineSize: Y, blockSize: X } = J.borderBoxSize[0], Z = v.ths.indexOf(q);
172
- Z >= 0 && q.parentElement && (v.thSizes[Z] = {
173
- width: Y,
174
- height: X
175
- });
176
- }
177
- }), J = makeResizeObserver((q) => {
178
- for (let J of q) {
179
- let q = J.target, { inlineSize: Y, blockSize: X } = J.borderBoxSize[0], Z = v.trs.indexOf(q);
180
- Z >= 0 && q.parentElement && (v.trSizes[Z] = {
181
- width: Y,
182
- height: X
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 a = getOwner(), o = createMemo(() => e.plugins.reduce((n, r) => Object.assign(n, runWithOwner(a, () => r.commands?.(e, { ...n }))), {}));
11
- return {
12
- get commands() {
13
- return o();
14
- },
15
- scrollToCell(n, r, i) {
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
- ...i
18
+ ...a
21
19
  });
22
20
  },
23
- scrollCellIfNeeded(n, r, i = !1) {
24
- n = typeof n == "object" ? e.props.columns.indexOf(n) : n, r = typeof r == "object" ? e.props.data.indexOf(r) : r;
25
- let a = e.table.querySelector(`[x="${n}"][y="${r}"]`);
26
- a && (a.scrollIntoViewIfNeeded(i), a.focus());
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 n of c.plugins) {
34
- let r = runWithOwner(u, () => n.keybindings?.(c));
35
- r && Object.assign(e, r);
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 n = c.props?.keybindings;
38
- if (n) for (let [r, i] of Object.entries(n)) i === !1 ? delete e[r] : typeof i == "function" && (e[r] = i);
39
- return createKeybindingsHandler(Object.fromEntries(Object.entries(e).map(([e, n]) => [e, (e) => {
40
- e.preventDefault(), n(e);
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: n } = t.selected;
36
+ let { start: e, end: r } = t.selected;
20
37
  if (!e?.length) return;
21
- let [r, i] = [e[0], n[0]].sort((e, t) => e - t), [a, o] = [e[1], n[1]].sort((e, t) => e - t), s = t.props.columns.slice(r, i + 1).filter((e) => !e[t.internal]), c = t.props.data.slice(a, o + 1).map((e) => s.map((t) => {
22
- let n = e[t.id] ?? "";
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: r } = t.selected;
42
+ let { start: n, end: i } = t.selected;
29
43
  if (!n?.length) return;
30
- let i = (await navigator.clipboard.readText()).replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\n$/, "").split("\n").map((e) => e.split(" ")), a = i.length, o = i[0].length, [s, c] = [n[0], r[0]].sort((e, t) => e - t), [l, u] = [n[1], r[1]].sort((e, t) => e - t), d = u - l + 1, f = c - s + 1, p = d > a && d % a === 0 ? d : a, m = f > o && f % o === 0 ? f : o, h = t.props.columns, g = [];
31
- for (let e = s; e < h.length && g.length < m; e++) h[e][t.internal] || g.push(h[e]);
32
- let _ = t.props.data.slice(), v = l + p;
33
- if (v > _.length) for (let e = _.length; e < v; e++) {
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
- _.push(n);
49
+ y.push(n);
36
50
  }
37
- let y = l + p - 1;
38
- for (let n = 0; n <= y - l; n++) {
51
+ let x = d + h - 1;
52
+ for (let n = 0; n <= x - d; n++) {
39
53
  let r = {};
40
- g.forEach((s, c) => {
41
- let u = _[l + n];
54
+ v.forEach((i, a) => {
55
+ let l = y[d + n];
42
56
  unFn(t.props.editable, {
43
- col: s,
44
- data: u,
45
- x: h.indexOf(s),
46
- y: l + n
47
- }) && (r[s.id] = i[n % a][c % o]);
48
- }), _[l + n] = {
49
- ..._[l + n],
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 b = s, x = 0;
54
- for (let e = s; e < h.length && x < g.length; e++) h[e][t.internal] || (b = e, x++);
55
- t.selected.end = [b, y], t.props.onDataChange?.(_);
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) => ((e.rawProps.data || []).forEach((c) => unwrap(c)[e.rawProps.rowKey] ??= v4()), {
10
+ store: (e) => ({
13
11
  diffData: () => e.props.diff?.data ?? [],
14
- diffDataKeyed: createLazyMemo(() => keyBy(e.diffData(), (c) => c[e.props.rowKey]))
12
+ diffDataKeyed: createLazyMemo(() => keyBy(e.diffData(), (o) => o[e.props.rowKey]))
15
13
  }),
16
- commands: (e) => ({ async diffCommit(c = e.rawProps.data || []) {
17
- let { rowKey: l } = e.props || {};
18
- c.forEach((e) => unwrap(e)[l] ??= v4()), c = structuredClone(unwrap(c));
19
- let u = [], d = [], f = [], p = keyBy(c, (e) => e[l]);
20
- for (let d of c) {
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 c of e.diffData()) !p[c[l]] && d.push(c);
25
- await e.props.diff?.onCommit?.(c, {
26
- added: u,
27
- removed: d,
28
- changed: f
29
- }), u[NEW] = 0;
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: c }) => {
40
- if (!c.props.diff?.enable) return e;
41
- let { rowKey: l, diff: u } = c.props || {}, d = c.diffData();
42
- if (e.length === d.length && e.length > 0) {
43
- let c = !0;
44
- for (let u = 0; u < e.length; u++) if (e[u]?.[l] !== d[u]?.[l]) {
45
- c = !1;
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 (c) return e;
44
+ if (o) return e;
49
45
  }
50
- return diffArrays(d, e, { comparator: (e, c) => e == c || e[l] == c[l] }).flatMap((e) => e.added ? e.value.map((e) => (e[NEW] = 1, e)) : e.removed ? u.removed ? e.value.map((e) => ({
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
- [c.internal]: 1
49
+ [o.internal]: 1
54
50
  })) : [] : e.value);
55
51
  },
56
- Td: ({ Td: f }, { store: m }) => m.props.diff?.enable ? (h) => {
57
- let g = createMemo(() => {
58
- let { diff: e } = m.props, c = h.data[m.props.rowKey];
59
- return [h.data[NEW] ? "bg-green!" : h.data[DEL] ? "bg-red!" : h.data[m.internal] ? "" : e.changed && h.data[h.col.id] != m.diffDataKeyed()[c]?.[h.col.id] ? "bg-green!" : ""].join(" ");
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(f, mergeProps(h, {
57
+ return createComponent(u, mergeProps(p, {
62
58
  get class() {
63
- return h.class + (g() ? " relative z-1" : "");
59
+ return p.class + (m() ? " relative z-1" : "");
64
60
  },
65
61
  get children() {
66
- return [memo(() => h.children), memo(() => memo(() => !!g())() && (() => {
67
- var c = _tmpl$();
68
- return effect(() => className(c, g() + " absolute inset-0 z--1 op-20 pointer-events-none")), c;
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
- } : f
68
+ } : u
73
69
  },
74
70
  keybindings: (e) => ({ "$mod+S": () => e.commands.diffCommit() })
75
71
  };