intable 0.0.30 → 0.0.32

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.
@@ -1,8 +1,10 @@
1
1
  import { usePointerDrag } from "../hooks/index.js";
2
+ import { useFloating } from "../components/Popover.js";
2
3
  import { delegateEvents, effect, style, template, use } from "solid-js/web";
3
4
  import { createMemo, createSignal } from "solid-js";
4
5
  import { createScrollPosition } from "@solid-primitives/scroll";
5
- var _tmpl$ = /* @__PURE__ */ template("<div>"), _tmpl$2 = /* @__PURE__ */ template("<div title=\"Drag to fill\">");
6
+ import { offset } from "floating-ui-solid";
7
+ var _tmpl$ = /* @__PURE__ */ template("<div>"), _tmpl$2 = /* @__PURE__ */ template("<div title=\"Drag to fill\"class=\"pointer-events-auto w-2.5 h-2.5 bg-[--c-primary] b-2px b-solid b-[--table-bg] cursor-crosshair\">");
6
8
  function inferFill(e, t, n = 1) {
7
9
  if (!e.length) return Array(t).fill(null);
8
10
  let r = e.map((e) => typeof e == "number" ? e : Number(e));
@@ -20,7 +22,7 @@ function inferFill(e, t, n = 1) {
20
22
  return Array.from({ length: t }, (t, n) => e[n % e.length]);
21
23
  }
22
24
  function applyFill(e, t, n, r, i) {
23
- let { internal: a } = i, { data: o, columns: s } = i.props, c = r > 0 ? 1 : -1, l = Math.abs(r), u = /* @__PURE__ */ new Map(), f = (e) => (u.has(e) || u.set(e, { ...o[e] }), u.get(e)), p, m;
25
+ let { internal: a } = i, { data: o, columns: s } = i.props, c = r > 0 ? 1 : -1, l = Math.abs(r), u = /* @__PURE__ */ new Map(), d = (e) => (u.has(e) || u.set(e, { ...o[e] }), u.get(e)), f, m;
24
26
  if (n === "v") {
25
27
  let n = o.slice(t[0], t[1] + 1);
26
28
  for (let r = e[0]; r <= e[1] && r < s.length; r++) {
@@ -29,10 +31,10 @@ function applyFill(e, t, n, r, i) {
29
31
  let i = inferFill(n.map((t) => t[e.id]), l, c);
30
32
  for (let n = 0; n < l; n++) {
31
33
  let r = c === 1 ? t[1] + 1 + n : t[0] - l + n;
32
- r >= 0 && r < o.length && (f(r)[e.id] = i[n]);
34
+ r >= 0 && r < o.length && (d(r)[e.id] = i[n]);
33
35
  }
34
36
  }
35
- p = [e[0], c === 1 ? t[0] : Math.max(t[0] - l, 0)], m = [e[1], c === 1 ? Math.min(t[1] + l, o.length - 1) : t[1]];
37
+ f = [e[0], c === 1 ? t[0] : Math.max(t[0] - l, 0)], m = [e[1], c === 1 ? Math.min(t[1] + l, o.length - 1) : t[1]];
36
38
  } else {
37
39
  for (let n = t[0]; n <= t[1] && n < o.length; n++) {
38
40
  let t = s.slice(e[0], e[1] + 1).filter((e) => e && !e[a]).map((e) => o[n][e.id]), r = inferFill(t, l, c);
@@ -40,91 +42,96 @@ function applyFill(e, t, n, r, i) {
40
42
  let i = c === 1 ? e[1] + 1 + t : e[0] - l + t;
41
43
  if (i < 0 || i >= s.length) continue;
42
44
  let o = s[i];
43
- o && !o[a] && (f(n)[o.id] = r[t]);
45
+ o && !o[a] && (d(n)[o.id] = r[t]);
44
46
  }
45
47
  }
46
- p = [c === 1 ? e[0] : Math.max(e[0] - l, 0), t[0]], m = [c === 1 ? Math.min(e[1] + l, s.length - 1) : e[1], t[1]];
48
+ f = [c === 1 ? e[0] : Math.max(e[0] - l, 0), t[0]], m = [c === 1 ? Math.min(e[1] + l, s.length - 1) : e[1], t[1]];
47
49
  }
48
50
  return {
49
51
  rowsMap: u,
50
- newStart: p,
52
+ newStart: f,
51
53
  newEnd: m
52
54
  };
53
55
  }
54
56
  const AutoFillPlugin = {
55
57
  name: "auto-fill",
56
- layers: [(t) => {
57
- let i = createScrollPosition(() => t.scroll_el), d = createMemo(() => {
58
- let { start: e, end: n } = t.selected ?? {};
59
- if (!e?.length || !n?.length) return null;
60
- let r = [e[0], n[0]].sort((e, t) => e - t), i = [e[1], n[1]].sort((e, t) => e - t);
58
+ layers: [(n) => {
59
+ let a = createScrollPosition(() => n.scroll_el), p = createMemo(() => {
60
+ let { start: e, end: t } = n.selected ?? {};
61
+ if (!e?.length || !t?.length) return null;
62
+ let r = [e[0], t[0]].sort((e, t) => e - t), i = [e[1], t[1]].sort((e, t) => e - t);
61
63
  return Number.isFinite(r[1]) && Number.isFinite(i[1]) ? {
62
64
  xs: r,
63
65
  ys: i
64
66
  } : null;
65
- }), p = createMemo(() => {
66
- let e = t.thSizes ?? [], n = t.trSizes ?? [], r = e[0]?.height ?? 30, a = i.x, o = i.y, s = (t) => e.slice(0, t).reduce((e, t) => e + (t?.width ?? 0), 0) - a, c = (t) => s(t) + (e[t]?.width ?? 0), l = (e) => r + n.slice(0, e).reduce((e, t) => e + (t?.height ?? 28), 0) - o;
67
+ }), h = createMemo(() => {
68
+ let e = n.thSizes ?? [], t = n.trSizes ?? [], r = e[0]?.height ?? 30, i = a.x, o = a.y, s = (t) => e.slice(0, t).reduce((e, t) => e + (t?.width ?? 0), 0) - i, c = (t) => s(t) + (e[t]?.width ?? 0), l = (e) => r + t.slice(0, e).reduce((e, t) => e + (t?.height ?? 28), 0) - o;
67
69
  return {
68
70
  colX: s,
69
71
  colR: c,
70
72
  rowY: l,
71
- rowB: (e) => l(e) + (n[e]?.height ?? 28)
73
+ rowB: (e) => l(e) + (t[e]?.height ?? 28)
72
74
  };
73
- }), m = createMemo(() => {
74
- let e = t.props.autoFill;
75
- return e === !0 || e?.enable === !0;
76
- }), h = createMemo(() => {
77
- if (!m()) return "display:none;position:absolute";
78
- let e = d();
79
- if (!e) return "display:none;position:absolute";
80
- let { colR: t, rowB: n } = p(), r = t(e.xs[1]), i = n(e.ys[1]);
81
- return `position:absolute;left:${r - 4}px;top:${i - 4}px;width:8px;height:8px;background:var(--c-primary);border:2px solid var(--table-bg);border-radius:1px;box-shadow:0 0 0 1px var(--c-primary);z-index:3;cursor:crosshair`;
82
- }), [g, _] = createSignal(null), v = createMemo(() => {
83
- let e = g(), n = d();
84
- if (!e || !n || !e.delta) return "display:none;position:absolute";
85
- let { xs: r, ys: i } = n, { colX: a, colR: o, rowY: s, rowB: c } = p(), l = e.delta > 0 ? 1 : -1, u = Math.abs(e.delta), f = t.props.data.length, m = t.props.columns.length, h, _, v, y;
86
- e.axis === "v" ? (h = a(r[0]), v = o(r[1]), [_, y] = l > 0 ? [c(i[1]), c(Math.min(i[1] + u, f - 1))] : [s(Math.max(i[0] - u, 0)), s(i[0])]) : (_ = s(i[0]), y = c(i[1]), [h, v] = l > 0 ? [o(r[1]), o(Math.min(r[1] + u, m - 1))] : [a(Math.max(r[0] - u, 0)), a(r[0])]);
87
- let b = v - h, x = y - _;
88
- return b <= 0 || x <= 0 ? "display:none;position:absolute" : `position:absolute;left:${h}px;top:${_}px;width:${b}px;height:${x}px;border:1.5px dashed var(--c-primary);background:rgba(99,102,241,0.08);pointer-events:none;z-index:3`;
89
- }), y, b = (e, n, r, i) => {
90
- let { rowsMap: a, newStart: o, newEnd: s } = applyFill(e, n, r, i, t);
91
- a.size && (t.commands.rowsChange([...a.values()]), t.selected.start = o, t.selected.end = s);
92
- }, x = (e) => {
75
+ }), g = createMemo(() => {
76
+ if (!p()) return;
77
+ let { xs: e, ys: t } = p();
78
+ if (n.props.columns[e[1]][n.internal] || n.props.data[t[1]][n.internal]) return;
79
+ let r = n.props.autoFill;
80
+ return r === !0 || r?.enable === !0;
81
+ }), [_, v] = createSignal(null), y = createMemo(() => {
82
+ let e = _(), t = p();
83
+ if (!e || !t || !e.delta) return "display:none;position:absolute";
84
+ let { xs: r, ys: i } = t, { colX: a, colR: o, rowY: s, rowB: c } = h(), l = e.delta > 0 ? 1 : -1, u = Math.abs(e.delta), d = n.props.data.length, f = n.props.columns.length, m, g, v, y;
85
+ e.axis === "v" ? (m = a(r[0]), v = o(r[1]), [g, y] = l > 0 ? [c(i[1]), c(Math.min(i[1] + u, d - 1))] : [s(Math.max(i[0] - u, 0)), s(i[0])]) : (g = s(i[0]), y = c(i[1]), [m, v] = l > 0 ? [o(r[1]), o(Math.min(r[1] + u, f - 1))] : [a(Math.max(r[0] - u, 0)), a(r[0])]);
86
+ let b = v - m, x = y - g;
87
+ return b <= 0 || x <= 0 ? "display:none;position:absolute" : `position:absolute;left:${m}px;top:${g}px;width:${b}px;height:${x}px;border:1.5px dashed var(--c-primary);background:rgba(99,102,241,0.08);pointer-events:none;z-index:3`;
88
+ }), [b, x] = createSignal(), S = (e, t, r, i) => {
89
+ let { rowsMap: a, newStart: o, newEnd: s } = applyFill(e, t, r, i, n);
90
+ a.size && (n.commands.rowsChange([...a.values()]), n.selected.start = o, n.selected.end = s);
91
+ };
92
+ useFloating({
93
+ reference: () => g() ? (n.ths[p()?.xs[1]], n.trs[p()?.ys[1]]?.querySelector(`[x="${p()?.xs[1]}"]`)) : null,
94
+ floating: b,
95
+ placement: "bottom-end",
96
+ middleware: [offset({
97
+ crossAxis: 5,
98
+ mainAxis: -5
99
+ })]
100
+ });
101
+ let C = (e) => {
93
102
  e.stopPropagation();
94
- let n = d();
95
- if (!n) return;
96
- let { xs: r, ys: i } = n, { data: a, columns: o } = t.props, s = r[0] > 0 ? r[0] - 1 : r[1] < o.length - 1 ? r[1] + 1 : -1, c = a.length - 1;
103
+ let t = p();
104
+ if (!t) return;
105
+ let { xs: r, ys: i } = t, { data: a, columns: o } = n.props, s = r[0] > 0 ? r[0] - 1 : r[1] < o.length - 1 ? r[1] + 1 : -1, c = a.length - 1;
97
106
  if (s >= 0) {
98
107
  let e = o[s];
99
- if (e && !e[t.internal]) for (let t = i[1] + 1; t < a.length; t++) {
108
+ if (e && !e[n.internal]) for (let t = i[1] + 1; t < a.length; t++) {
100
109
  let n = a[t][e.id];
101
110
  if (n != null && n !== "") c = t;
102
111
  else break;
103
112
  }
104
113
  }
105
- b(r, i, "v", c - i[1]);
114
+ S(r, i, "v", c - i[1]);
106
115
  };
107
- return usePointerDrag(() => y, { start(e, n, r) {
116
+ return usePointerDrag(b, { start(e, t, n) {
108
117
  e.stopPropagation(), e.preventDefault();
109
- let i = d();
110
- if (!i) return;
111
- let { xs: a, ys: o } = i, s = 0, c = "v";
112
- n((e, { ox: n, oy: r }) => {
113
- Math.abs(r) >= Math.abs(n) ? (c = "v", s = Math.round(r / (t.trSizes?.[o[1]]?.height ?? 28))) : (c = "h", s = Math.round(n / (t.thSizes?.[a[1]]?.width ?? 100))), _(s ? {
114
- axis: c,
115
- delta: s
118
+ let r = p();
119
+ if (!r) return;
120
+ let { xs: i, ys: a } = r, o = 0, s = "v";
121
+ t((e, { ox: t, oy: n }) => {
122
+ Math.abs(n) >= Math.abs(t) ? (s = "v", o = e.composedPath().find((e) => e.tagName == "TD")?.getAttribute("y") - a[1]) : (s = "h", o = e.composedPath().find((e) => e.tagName == "TD")?.getAttribute("x") - i[1]), v(o ? {
123
+ axis: s,
124
+ delta: o
116
125
  } : null);
117
- }), r(() => {
118
- _(null), b(a, o, c, s);
126
+ }), n(() => {
127
+ v(null), S(i, a, s, o);
119
128
  });
120
129
  } }), [(() => {
121
130
  var e = _tmpl$();
122
- return effect((t) => style(e, v(), t)), e;
131
+ return effect((t) => style(e, y(), t)), e;
123
132
  })(), (() => {
124
133
  var e = _tmpl$2();
125
- e.$$dblclick = x;
126
- var t = y;
127
- return typeof t == "function" ? use(t, e) : y = e, effect((t) => style(e, h() + ";pointer-events:auto", t)), e;
134
+ return e.$$dblclick = C, use(x, e), e;
128
135
  })()];
129
136
  }]
130
137
  };
@@ -10,7 +10,7 @@ declare module '../index' {
10
10
  removed?: boolean;
11
11
  /** @default true */
12
12
  changed?: boolean;
13
- onCommit?: (data: any, opt: {
13
+ onCommit?: (opt: {
14
14
  added: any[];
15
15
  removed: any[];
16
16
  changed: any[];
@@ -22,7 +22,7 @@ declare module '../index' {
22
22
  diffDataKeyed: () => any;
23
23
  }
24
24
  interface Commands {
25
- diffCommit(data?: any[]): Promise<void>;
25
+ diffCommit(): Promise<void>;
26
26
  }
27
27
  }
28
28
  export declare const DiffPlugin: Plugin;
@@ -11,14 +11,14 @@ const DiffPlugin = {
11
11
  diffData: () => e.props.diff?.data ?? [],
12
12
  diffDataKeyed: createLazyMemo(() => keyBy(e.diffData(), (o) => o[e.props.rowKey]))
13
13
  }),
14
- commands: (e) => ({ async diffCommit(o = e.rawProps.data || []) {
15
- let { rowKey: s } = e.props || {}, c = [], l = [], u = [], d = keyBy(o, (e) => e[s]);
14
+ commands: (e) => ({ async diffCommit() {
15
+ let o = e.rawProps.data || [], { rowKey: s } = e.props || {}, c = [], l = [], u = [], d = keyBy(o, (e) => e[s]);
16
16
  for (let l of o) {
17
17
  let o = e.diffDataKeyed()[l[s]];
18
18
  o ? isEqual(l, o) || u.push(l) : c.push(l);
19
19
  }
20
20
  for (let o of e.diffData()) !d[o[s]] && l.push(o);
21
- await e.props.diff?.onCommit?.(o, {
21
+ await e.props.diff?.onCommit?.({
22
22
  added: c,
23
23
  removed: l,
24
24
  changed: u
@@ -26,7 +26,6 @@ const DiffPlugin = {
26
26
  } }),
27
27
  rewriteProps: {
28
28
  diff: ({ diff: e }) => ({
29
- enable: !1,
30
29
  added: !0,
31
30
  removed: !0,
32
31
  changed: !0,
@@ -1,8 +1,12 @@
1
1
  import type { Plugin } from '..';
2
2
  import type { AndOrNode } from '../components/AndOr';
3
+ import { useControlled } from '../hooks/useControlled';
3
4
  declare module '../index' {
4
5
  interface TableProps {
5
6
  filter?: {
7
+ value?: AndOrNode[];
8
+ defaultValue?: AndOrNode[];
9
+ initialValue?: AndOrNode[];
6
10
  onChange?: (value: AndOrNode[]) => void;
7
11
  /** @default true */
8
12
  autoMatch?: boolean;
@@ -12,7 +16,7 @@ declare module '../index' {
12
16
  filterable?: boolean;
13
17
  }
14
18
  interface TableStore {
15
- filters: Record<string, AndOrNode>;
19
+ filter: ReturnType<typeof useControlled<Exclude<TableProps['filter'], undefined>>>;
16
20
  }
17
21
  }
18
22
  export declare const FilterPlugin: Plugin;
@@ -1,38 +1,40 @@
1
- import { toArr } from "../utils.js";
1
+ import { findret, toArr } from "../utils.js";
2
+ import { useControlled } from "../hooks/useControlled.js";
2
3
  import { normalizeType } from "../components/AndOrFields.js";
3
- import { Filter } from "../components/Filter.js";
4
+ import { Filter, firstRule, isRuleNode } from "../components/Filter.js";
4
5
  import { createComponent, memo, mergeProps } from "solid-js/web";
5
- import { Show } from "solid-js";
6
+ import { Show, mergeProps as mergeProps$1 } from "solid-js";
7
+ import { keyBy } from "es-toolkit";
6
8
  function isBlank(e) {
7
9
  return e == null || String(e).trim() === "";
8
10
  }
9
11
  function toNum(e) {
10
- let a = Number(e);
11
- return Number.isNaN(a) ? null : a;
12
+ let m = Number(e);
13
+ return Number.isNaN(m) ? null : m;
12
14
  }
13
15
  function toDateTs(e) {
14
16
  if (isBlank(e)) return null;
15
- let a = new Date(String(e)).getTime();
16
- return Number.isNaN(a) ? null : a;
17
+ let m = new Date(String(e)).getTime();
18
+ return Number.isNaN(m) ? null : m;
17
19
  }
18
20
  function toBool(e) {
19
21
  if (typeof e == "boolean") return e;
20
22
  if (typeof e == "number") return e !== 0;
21
- let a = String(e ?? "").trim().toLowerCase();
23
+ let m = String(e ?? "").trim().toLowerCase();
22
24
  return [
23
25
  "1",
24
26
  "true",
25
27
  "yes",
26
28
  "y",
27
29
  "on"
28
- ].includes(a) ? !0 : [
30
+ ].includes(m) ? !0 : [
29
31
  "0",
30
32
  "false",
31
33
  "no",
32
34
  "n",
33
35
  "off",
34
36
  ""
35
- ].includes(a) ? !1 : !!e;
37
+ ].includes(m) ? !1 : !!e;
36
38
  }
37
39
  function toList(e) {
38
40
  return Array.isArray(e) ? e : e == null || String(e).trim() === "" ? [] : String(e).split(",").map((e) => e.trim()).filter(Boolean);
@@ -40,11 +42,8 @@ function toList(e) {
40
42
  function toPair(e) {
41
43
  if (Array.isArray(e)) return [e[0], e[1]];
42
44
  if (e == null || String(e).trim() === "") return [void 0, void 0];
43
- let a = String(e).split(",").map((e) => e.trim());
44
- return [a[0], a[1]];
45
- }
46
- function isRuleNode(e) {
47
- return "field" in e;
45
+ let m = String(e).split(",").map((e) => e.trim());
46
+ return [m[0], m[1]];
48
47
  }
49
48
  function hasActiveRule(e) {
50
49
  return !!e.op;
@@ -52,108 +51,109 @@ function hasActiveRule(e) {
52
51
  function hasActiveTree(e) {
53
52
  return e ? isRuleNode(e) ? hasActiveRule(e) : (e.children ?? []).some(hasActiveTree) : !1;
54
53
  }
55
- function matchFilter(e, a, o) {
56
- let s = a.op;
57
- if (s === "blank") return isBlank(e);
58
- if (s === "noblank") return !isBlank(e);
59
- if (s === "true") return toBool(e);
60
- if (s === "false") return !toBool(e);
61
- let c = a.value;
62
- if (o === "number") {
63
- let a = toNum(e), o = toNum(c), l = toList(c).map(toNum).filter((e) => e != null), [u, d] = toPair(c), p = toNum(u), m = toNum(d);
64
- if (a == null) return !1;
65
- if (s === "eq") return a === o;
66
- if (s === "ne") return a !== o;
67
- if (s === "in") return l.includes(a);
68
- if (s === "not_in") return !l.includes(a);
69
- if (s === "between") return p != null && m != null && a >= Math.min(p, m) && a <= Math.max(p, m);
70
- if (s === "not_between") return p != null && m != null && (a < Math.min(p, m) || a > Math.max(p, m));
71
- if (o == null) return !1;
72
- if (s === "lt") return a < o;
73
- if (s === "gt") return a > o;
74
- if (s === "lte") return a <= o;
75
- if (s === "gte") return a >= o;
54
+ function matchFilter(e, m, h) {
55
+ let g = m.op;
56
+ if (g === "blank") return isBlank(e);
57
+ if (g === "noblank") return !isBlank(e);
58
+ if (g === "true") return toBool(e);
59
+ if (g === "false") return !toBool(e);
60
+ let _ = m.value;
61
+ if (h === "number") {
62
+ let m = toNum(e), h = toNum(_), v = toList(_).map(toNum).filter((e) => e != null), [y, b] = toPair(_), x = toNum(y), S = toNum(b);
63
+ if (m == null) return !1;
64
+ if (g === "eq") return m === h;
65
+ if (g === "ne") return m !== h;
66
+ if (g === "in") return v.includes(m);
67
+ if (g === "not_in") return !v.includes(m);
68
+ if (g === "between") return x != null && S != null && m >= Math.min(x, S) && m <= Math.max(x, S);
69
+ if (g === "not_between") return x != null && S != null && (m < Math.min(x, S) || m > Math.max(x, S));
70
+ if (h == null) return !1;
71
+ if (g === "lt") return m < h;
72
+ if (g === "gt") return m > h;
73
+ if (g === "lte") return m <= h;
74
+ if (g === "gte") return m >= h;
76
75
  }
77
- if (o === "date") {
78
- let a = toDateTs(e), o = toDateTs(c), l = toList(c).map(toDateTs).filter((e) => e != null), [u, d] = toPair(c), f = toDateTs(u), m = toDateTs(d);
79
- if (a == null) return !1;
80
- if (s === "eq") return a === o;
81
- if (s === "ne") return a !== o;
82
- if (s === "in") return l.includes(a);
83
- if (s === "not_in") return !l.includes(a);
84
- if (s === "between") return f != null && m != null && a >= Math.min(f, m) && a <= Math.max(f, m);
85
- if (s === "not_between") return f != null && m != null && (a < Math.min(f, m) || a > Math.max(f, m));
86
- if (o == null) return !1;
87
- if (s === "lt") return a < o;
88
- if (s === "gt") return a > o;
89
- if (s === "lte") return a <= o;
90
- if (s === "gte") return a >= o;
76
+ if (h === "date") {
77
+ let m = toDateTs(e), h = toDateTs(_), v = toList(_).map(toDateTs).filter((e) => e != null), [y, b] = toPair(_), x = toDateTs(y), S = toDateTs(b);
78
+ if (m == null) return !1;
79
+ if (g === "eq") return m === h;
80
+ if (g === "ne") return m !== h;
81
+ if (g === "in") return v.includes(m);
82
+ if (g === "not_in") return !v.includes(m);
83
+ if (g === "between") return x != null && S != null && m >= Math.min(x, S) && m <= Math.max(x, S);
84
+ if (g === "not_between") return x != null && S != null && (m < Math.min(x, S) || m > Math.max(x, S));
85
+ if (h == null) return !1;
86
+ if (g === "lt") return m < h;
87
+ if (g === "gt") return m > h;
88
+ if (g === "lte") return m <= h;
89
+ if (g === "gte") return m >= h;
91
90
  }
92
- let l = String(e ?? "").toLowerCase(), u = String(c ?? "").toLowerCase(), h = toList(c).map((e) => String(e).toLowerCase()), [g, _] = toPair(c), v = String(g ?? "").toLowerCase(), y = String(_ ?? "").toLowerCase();
93
- return s === "eq" ? l === u : s === "ne" ? l !== u : s === "in" ? h.includes(l) : s === "not_in" ? !h.includes(l) : s === "between" ? v !== "" && y !== "" && l >= (v < y ? v : y) && l <= (v < y ? y : v) : s === "not_between" ? v !== "" && y !== "" && (l < (v < y ? v : y) || l > (v < y ? y : v)) : s === "startwith" ? l.startsWith(u) : s === "endwith" ? l.endsWith(u) : l.includes(u);
91
+ let v = String(e ?? "").toLowerCase(), y = String(_ ?? "").toLowerCase(), b = toList(_).map((e) => String(e).toLowerCase()), [x, S] = toPair(_), C = String(x ?? "").toLowerCase(), w = String(S ?? "").toLowerCase();
92
+ return g === "eq" ? v === y : g === "ne" ? v !== y : g === "in" ? b.includes(v) : g === "not_in" ? !b.includes(v) : g === "between" ? C !== "" && w !== "" && v >= (C < w ? C : w) && v <= (C < w ? w : C) : g === "not_between" ? C !== "" && w !== "" && (v < (C < w ? C : w) || v > (C < w ? w : C)) : g === "startwith" ? v.startsWith(y) : g === "endwith" ? v.endsWith(y) : v.includes(y);
94
93
  }
95
- function evaluateFilterTree(e, a, o) {
96
- if (isRuleNode(a)) return hasActiveRule(a) ? matchFilter(e, a, o) : !0;
97
- let s = (a.children ?? []).filter(hasActiveTree);
98
- return s.length ? a.op === "or" ? s.some((a) => evaluateFilterTree(e, a, o)) : s.every((a) => evaluateFilterTree(e, a, o)) : !0;
94
+ function evaluateFilterTree(e, m, h) {
95
+ if (isRuleNode(m)) return hasActiveRule(m) ? matchFilter(e[m.field], m, h(m)) : !0;
96
+ let g = (m.children ?? []).filter(hasActiveTree);
97
+ return g.length ? m.op === "or" ? g.some((m) => evaluateFilterTree(e, m, h)) : g.every((m) => evaluateFilterTree(e, m, h)) : !0;
99
98
  }
100
- function passesFilters(e, o, s, c) {
101
- return s.every((s) => {
102
- if (s[c] || !s.filterable) return !0;
103
- let l = o[s.id];
104
- return !l || !hasActiveTree(l) ? !0 : evaluateFilterTree(e[s.id], l, normalizeType(s));
105
- });
99
+ function passesFilters(e, m, h) {
100
+ let _ = keyBy(h, (e) => e.id);
101
+ return evaluateFilterTree(e, {
102
+ op: "and",
103
+ children: m
104
+ }, (e) => normalizeType(_[e.field]));
106
105
  }
107
106
  const FilterPlugin = {
108
107
  name: "filter",
109
- store: () => ({ filters: {} }),
110
108
  rewriteProps: {
111
- filter: ({ filter: e }) => ({
109
+ filter: ({ filter: e }, { store: m }) => (e = mergeProps$1({
112
110
  autoMatch: !0,
111
+ initialValue: [],
113
112
  ...e
114
- }),
115
- newRow: ({ newRow: a }, { store: o }) => function(...s) {
116
- let c = a(...s), { filters: l, props: u } = o, { columns: d } = u;
117
- return d.forEach((a) => {
118
- if (a[o.internal] || !a.filterable) return;
119
- let s = l[a.id];
120
- s && isRuleNode(s) && (c[a.id] = {
121
- ne: `not ${s.value}`,
122
- between: toArr(s.value)[0],
113
+ }, e), m.filter ??= useControlled(e, m.owner), m.filter.$setOpt(e), m.filter),
114
+ newRow: ({ newRow: e }, { store: h }) => function(...g) {
115
+ let _ = e(...g), { filters: v, props: b } = h, { columns: x } = b;
116
+ return x.forEach((e) => {
117
+ if (e[h.internal] || !e.filterable) return;
118
+ let g = v[e.id];
119
+ g && isRuleNode(g) && (_[e.id] = {
120
+ ne: `not ${g.value}`,
121
+ between: toArr(g.value)[0],
123
122
  not_between: NaN,
124
- in: toArr(s.value)[0],
123
+ in: toArr(g.value)[0],
125
124
  not_in: "",
126
- lt: s.value - 1,
127
- gt: s.value + 1,
125
+ lt: g.value - 1,
126
+ gt: g.value + 1,
128
127
  blank: "",
129
128
  noblank: "default",
130
129
  true: !0,
131
130
  false: !1
132
- }[s.op] ?? s.value);
133
- }), c;
131
+ }[g.op] ?? g.value);
132
+ }), _;
134
133
  },
135
- data: ({ data: e }, { store: a }) => {
134
+ data: ({ data: e }, { store: m }) => {
136
135
  if (!e) return e;
137
- let { filters: o } = a, { columns: s, filter: c } = a.props;
138
- return !c.autoMatch || !Object.values(o).some(hasActiveTree) ? e : e.filter((e) => passesFilters(e, o, s, a.internal));
136
+ let { columns: h } = m.props, g = m.props.filter;
137
+ return !g.autoMatch || !g.value.some(hasActiveTree) ? e : e.filter((e) => passesFilters(e, g.value, h));
139
138
  },
140
- Th: ({ Th: e }, { store: a }) => (d) => {
141
- let f = () => !!d.col.filterable && !d.col[a.internal];
142
- return createComponent(e, mergeProps(d, { get children() {
143
- return [memo(() => d.children), createComponent(Show, {
139
+ Th: ({ Th: m }, { store: h }) => (g) => {
140
+ let y = () => !!g.col.filterable && !g.col[h.internal];
141
+ return createComponent(m, mergeProps(g, { get children() {
142
+ return [memo(() => g.children), createComponent(Show, {
144
143
  get when() {
145
- return f();
144
+ return y();
146
145
  },
147
146
  get children() {
148
147
  return createComponent(Filter, {
149
148
  get col() {
150
- return d.col;
149
+ return g.col;
151
150
  },
152
151
  get tree() {
153
- return a.filters[d.col.id];
152
+ return findret(h.props.filter.value, (e) => firstRule(e)?.field === g.col.id ? e : null);
154
153
  },
155
154
  setTree: (e) => {
156
- e ? a.filters[d.col.id] = e : delete a.filters[d.col.id], a.props.filter?.onChange?.(Object.values(a.filters));
155
+ let m = [...h.props.filter.value], _ = m.findIndex((e) => firstRule(e)?.field == g.col.id);
156
+ e ? _ > -1 ? m[_] = e : m.push(e) : _ > -1 && m.splice(_, 1), h.props.filter?.onChange?.(m);
157
157
  }
158
158
  });
159
159
  }
@@ -1,40 +1,44 @@
1
1
  import { usePointerDrag } from "../hooks/index.js";
2
2
  import { unFn } from "../utils.js";
3
3
  import { Ctx } from "../index.js";
4
- import { className, createComponent, effect, memo, mergeProps, template, use } from "solid-js/web";
4
+ import { className, createComponent, delegateEvents, effect, memo, mergeProps, template, use } from "solid-js/web";
5
5
  import { batch, untrack, useContext } from "solid-js";
6
6
  import { reconcile } from "solid-js/store";
7
7
  import { clamp } from "es-toolkit";
8
8
  import { createEventListener } from "@solid-primitives/event-listener";
9
9
  import { defaultsDeep } from "es-toolkit/compat";
10
- var _tmpl$ = /* @__PURE__ */ template("<div>"), COL = Symbol("col_size"), ROW = Symbol("row_size"), ColHandle = (f) => {
11
- let { props: h, store: _ } = useContext(Ctx), v;
12
- return usePointerDrag(() => v, { start(e, p, m) {
10
+ var _tmpl$ = /* @__PURE__ */ template("<div>"), COL = Symbol("col_size"), ROW = Symbol("row_size"), findParentEl = (e, m) => {
11
+ for (; e = e.parentElement;) if (m(e)) return e;
12
+ }, ColHandle = (m) => {
13
+ let { props: _, store: v } = useContext(Ctx), b;
14
+ return usePointerDrag(() => b, { start(e, h, g) {
13
15
  e.stopPropagation();
14
- let g = f.x, { min: y, max: b } = h.resizable.col, x = v.parentElement, S = x.offsetWidth;
15
- p((e, { ox: p }) => _[COL][f.x] = clamp(S + p, y, b)), m(() => {
16
- let e = h.columns[g], f = [..._.rawProps.columns || []], p = f.findIndex((f) => f[_.ID] === e[_.ID]);
17
- p > -1 && (f[p] = {
18
- ...f[p],
19
- width: x.offsetWidth
20
- }, h.onColumnsChange?.(f)), e.onWidthChange?.(x.offsetWidth);
16
+ let y = m.x, { min: x, max: S } = _.resizable.col, C = findParentEl(b, (e) => e.tagName === "TH"), w = C.offsetWidth;
17
+ h((e, { ox: h }) => v[COL][m.x] = clamp(w + h, x, S)), g(() => {
18
+ let e = _.columns[y], m = [...v.rawProps.columns || []], h = m.findIndex((m) => m[v.ID] === e[v.ID]);
19
+ h > -1 && (m[h] = {
20
+ ...m[h],
21
+ width: C.offsetWidth
22
+ }, _.onColumnsChange?.(m)), e.onWidthChange?.(C.offsetWidth);
21
23
  });
22
24
  } }), (() => {
23
- var e = _tmpl$(), p = v;
24
- return typeof p == "function" ? use(p, e) : v = e, effect(() => className(e, `in-cell__resize-handle absolute top-0 right-0 flex justify-center w-10px! ${f.x == h.columns.length - 1 ? "justify-end!" : "w-10px! translate-x-1/2"} after:w-1 cursor-w-resize z-1`)), e;
25
+ var e = _tmpl$();
26
+ e.$$click = (e) => e.stopPropagation();
27
+ var h = b;
28
+ return typeof h == "function" ? use(h, e) : b = e, effect(() => className(e, `in-cell__resize-handle absolute top-0 right-0 flex justify-center w-10px! ${m.x == _.columns.length - 1 ? "justify-end!" : "w-10px! translate-x-1/2"} after:w-1 cursor-w-resize z-1`)), e;
25
29
  })();
26
- }, RowHandle = (f) => {
27
- let { props: h, store: _ } = useContext(Ctx), v;
28
- return usePointerDrag(() => v, { start(e, p, m) {
30
+ }, RowHandle = (m) => {
31
+ let { props: _, store: v } = useContext(Ctx), b;
32
+ return usePointerDrag(() => b, { start(e, h, g) {
29
33
  e.stopPropagation();
30
- let g = f.y, { min: y, max: b } = h.resizable.row, x = v.parentElement.offsetHeight;
31
- p((e, { oy: p }) => _[ROW][f.y] = clamp(x + p, y, b)), m(() => {
32
- let e = h.data[g];
33
- [..._.rawProps.data || []].findIndex((f) => f[_.ID] === e[_.ID]);
34
+ let y = m.y, { min: x, max: S } = _.resizable.row, C = findParentEl(b, (e) => e.tagName === "TD").offsetHeight;
35
+ h((e, { oy: h }) => v[ROW][m.y] = clamp(C + h, x, S)), g(() => {
36
+ let e = _.data[y];
37
+ [...v.rawProps.data || []].findIndex((m) => m[v.ID] === e[v.ID]);
34
38
  });
35
- } }), createEventListener(() => v, "dblclick", () => f.data[COL] = void 0), (() => {
36
- var e = _tmpl$(), p = v;
37
- return typeof p == "function" ? use(p, e) : v = e, effect(() => className(e, `in-cell__resize-handle absolute bottom-0 left-0 flex flex-col justify-center h-1! ${f.y == h.data.length - 1 ? "justify-end!" : ""} after:h-1 cursor-s-resize z-2`)), e;
39
+ } }), createEventListener(() => b, "dblclick", () => m.data[COL] = void 0), (() => {
40
+ var e = _tmpl$(), h = b;
41
+ return typeof h == "function" ? use(h, e) : b = e, effect(() => className(e, `in-cell__resize-handle absolute bottom-0 left-0 flex flex-col justify-center h-1! ${m.y == _.data.length - 1 ? "justify-end!" : ""} after:h-1 cursor-s-resize z-2`)), e;
38
42
  })();
39
43
  };
40
44
  const ResizePlugin = {
@@ -57,33 +61,34 @@ const ResizePlugin = {
57
61
  max: 400
58
62
  }
59
63
  }),
60
- columns: ({ columns: e }, { store: f }) => (e = e.map((e, p) => ({
64
+ columns: ({ columns: e }, { store: m }) => (e = e.map((e, h) => ({
61
65
  ...e,
62
- [f.ID]: e[f.ID] ??= Symbol()
66
+ [m.ID]: e[m.ID] ??= Symbol()
63
67
  })), e = e.map((e) => e.resizable === void 0 ? {
64
68
  ...e,
65
- resizable: f.props?.resizable?.col.enable
66
- } : e), e = e.map((e, p) => f[COL][p] ? {
69
+ resizable: m.props?.resizable?.col.enable
70
+ } : e), e = e.map((e, h) => m[COL][h] ? {
67
71
  ...e,
68
- width: f[COL][p]
69
- } : e), untrack(() => batch(() => reconcile(e, { key: f.ID })(f.__resize__cols ??= [])))),
70
- Th: ({ Th: e }, { store: f }) => (f) => createComponent(e, mergeProps(f, {
72
+ width: m[COL][h]
73
+ } : e), untrack(() => batch(() => reconcile(e, { key: m.ID })(m.__resize__cols ??= [])))),
74
+ Th: ({ Th: e }, { store: m }) => (m) => createComponent(e, mergeProps(m, {
71
75
  get class() {
72
- return `relative ${f.class}`;
76
+ return `relative ${m.class}`;
73
77
  },
74
78
  get children() {
75
- return [f.children, memo(() => memo(() => !!f.col.resizable)() && createComponent(ColHandle, f))];
79
+ return [m.children, memo(() => memo(() => !!m.col.resizable)() && createComponent(ColHandle, m))];
76
80
  }
77
81
  })),
78
- Td: ({ Td: e }, { store: f }) => f.props?.resizable?.row.enable ? (p) => createComponent(e, mergeProps(p, {
82
+ Td: ({ Td: e }, { store: m }) => m.props?.resizable?.row.enable ? (h) => createComponent(e, mergeProps(h, {
79
83
  get class() {
80
- return `relative ${p.class}`;
84
+ return `relative ${h.class}`;
81
85
  },
82
86
  get children() {
83
- return [p.children, memo(() => memo(() => !!(p.x == 0 && f.props?.resizable?.row.enable))() && createComponent(RowHandle, p))];
87
+ return [h.children, memo(() => memo(() => !!(h.x == 0 && m.props?.resizable?.row.enable))() && createComponent(RowHandle, h))];
84
88
  }
85
89
  })) : e,
86
- cellStyle: ({ cellStyle: e }, { store: p }) => (m) => `${unFn(e, m)};` + (p[ROW][m.y] ? `height: ${p[ROW][m.y]}px` : "")
90
+ cellStyle: ({ cellStyle: e }, { store: h }) => (g) => `${unFn(e, g)};` + (h[ROW][g.y] ? `height: ${h[ROW][g.y]}px` : "")
87
91
  }
88
92
  };
93
+ delegateEvents(["click"]);
89
94
  export { ResizePlugin };