@serkonda7/solid-components 0.0.3 → 0.0.6

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/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @serkonda7/solid-components
2
2
  [![CI][ci-badge]][ci-status]
3
3
  [![npm version][npm-badge]][npm-link]
4
- [![npm updated][npm-date-badge]][npm-link]
4
+ [![npm updated and downloads][npm-date-dl-badge]][npm-link]
5
5
 
6
6
  Reusable components for [SolidJS](https://www.solidjs.com/).
7
7
 
@@ -37,5 +37,5 @@ This repo is licensed under the [MIT License](LICENSE.txt).
37
37
  [ci-badge]: https://github.com/serkonda7/solid-components/actions/workflows/ci.yml/badge.svg
38
38
  [ci-status]: https://github.com/serkonda7/solid-components/actions/workflows/ci.yml
39
39
  [npm-badge]: https://nodei.co/npm/@serkonda7/solid-components.png?style=shields&data=v&color=blue
40
- [npm-date-badge]: https://nodei.co/npm/@serkonda7/solid-components.png?style=shields&data=u&color=blue
40
+ [npm-date-dl-badge]: https://nodei.co/npm/@serkonda7/solid-components.png?style=shields&data=u,d&color=blue
41
41
  [npm-link]: https://www.npmjs.com/package/@serkonda7/solid-components
@@ -1,9 +1,14 @@
1
1
  import type { Accessor, JSX } from 'solid-js';
2
2
  export type DataTableSortDirection = 'asc' | 'desc';
3
+ export interface DataTableSort {
4
+ key: string;
5
+ direction: DataTableSortDirection;
6
+ }
3
7
  export interface DataTableColumn<TRow> {
4
8
  key: string;
5
9
  label: string;
6
10
  sortable?: boolean;
11
+ sortValue?: (row: TRow) => unknown;
7
12
  class?: string;
8
13
  ariaLabel?: string;
9
14
  getValue?: (row: TRow) => JSX.Element;
@@ -23,7 +28,10 @@ export interface DataTableProps<TRow> {
23
28
  selectionLabel?: string;
24
29
  sortKey?: string | Accessor<string | undefined>;
25
30
  sortDirection?: DataTableSortDirection | Accessor<DataTableSortDirection>;
31
+ defaultSort?: DataTableSort;
26
32
  onSort?: (key: string) => void;
33
+ onSortClear?: () => void;
34
+ onSortChange?: (sort: DataTableSort | undefined) => void;
27
35
  visibleColumns?: string[] | Accessor<string[]>;
28
36
  defaultVisibleColumns?: string[];
29
37
  onVisibleColumnsChange?: (visibleKeys: string[]) => void;
package/dist/index.d.ts CHANGED
@@ -4,4 +4,4 @@
4
4
  * Add components here as they are implemented so consumers can import them
5
5
  * from the package root.
6
6
  */
7
- export { DataTable, type DataTableColumn, type DataTableProps, type DataTableSortDirection, } from './data-table';
7
+ export { DataTable, type DataTableColumn, type DataTableProps, type DataTableSort, type DataTableSortDirection, } from './data-table';
package/dist/index.js CHANGED
@@ -1,126 +1,147 @@
1
1
  import { className as e, createComponent as t, delegateEvents as n, effect as r, insert as i, memo as a, setAttribute as o, template as s, use as c } from "solid-js/web";
2
2
  import { For as l, Show as u, createEffect as d, createMemo as f, createSignal as p, createUniqueId as m, onCleanup as h } from "solid-js";
3
3
  //#region src/data-table.tsx
4
- var g = /*#__PURE__*/ s("<div role=dialog class=data-table-customizer-panel><p class=data-table-customizer-title></p><ul class=data-table-customizer-list></ul><div class=data-table-customizer-actions><button type=button></button><button type=button>"), _ = /*#__PURE__*/ s("<div class=data-table-toolbar><div class=data-table-customizer><button type=button class=data-table-customizer-button aria-haspopup=dialog><span aria-hidden=true>⚙</span> "), v = /*#__PURE__*/ s("<th class=data-table-checkbox><span class=data-table-visually-hidden>Select rows</span><input type=checkbox>"), y = /*#__PURE__*/ s("<th>Actions"), b = /*#__PURE__*/ s("<div><div class=data-table-scroll><table class=data-table><thead><tr></tr></thead><tbody>"), x = /*#__PURE__*/ s("<li><label class=data-table-customizer-option><input type=checkbox>"), S = /*#__PURE__*/ s("<button type=button class=data-table-sort>"), C = /*#__PURE__*/ s("<th>"), ee = /*#__PURE__*/ s("<td class=data-table-checkbox><input type=checkbox>"), w = /*#__PURE__*/ s("<td>"), T = /*#__PURE__*/ s("<tr>"), E = /*#__PURE__*/ s("<p class=data-table-status>Loading…"), D = /*#__PURE__*/ s("<p class=data-table-status>No results.");
5
- function O(e) {
4
+ var ee = /*#__PURE__*/ s("<div role=dialog class=data-table-customizer-panel><p class=data-table-customizer-title></p><ul class=data-table-customizer-list></ul><div class=data-table-customizer-actions><button type=button></button><button type=button>"), te = /*#__PURE__*/ s("<div class=data-table-toolbar><div class=data-table-customizer><button type=button class=data-table-customizer-button aria-haspopup=dialog><span aria-hidden=true>⚙</span> "), ne = /*#__PURE__*/ s("<th class=data-table-checkbox><span class=data-table-visually-hidden>Select rows</span><input type=checkbox>"), g = /*#__PURE__*/ s("<th>Actions"), _ = /*#__PURE__*/ s("<div><div class=data-table-scroll><table class=data-table><thead><tr></tr></thead><tbody>"), v = /*#__PURE__*/ s("<li><label class=data-table-customizer-option><input type=checkbox>"), y = /*#__PURE__*/ s("<button type=button class=data-table-sort><span class=data-table-sort-indicator aria-hidden=true>"), b = /*#__PURE__*/ s("<th>"), re = /*#__PURE__*/ s("<td class=data-table-checkbox><input type=checkbox>"), x = /*#__PURE__*/ s("<td>"), ie = /*#__PURE__*/ s("<tr>"), ae = /*#__PURE__*/ s("<p class=data-table-status>Loading…"), S = /*#__PURE__*/ s("<p class=data-table-status>No results.");
5
+ function C(e) {
6
6
  return typeof e == "function" ? e() : e;
7
7
  }
8
- function k(n) {
9
- let s = f(() => O(n.rows)), k = () => O(n.loading ?? !1), A = () => O(n.selected ?? []), j = () => O(n.sortKey ?? void 0), M = () => O(n.sortDirection ?? "asc"), N = () => O(n.showColumnCustomizer ?? !1), P = () => n.selected !== void 0 && n.onSelectionChange !== void 0, F = () => {
10
- let e = A();
8
+ function w(n) {
9
+ let s = f(() => C(n.rows)), w = () => C(n.loading ?? !1), T = () => C(n.selected ?? []), E = n.sortKey !== void 0 || n.sortDirection !== void 0, [D, O] = p(n.defaultSort), k = () => E ? C(n.sortKey ?? void 0) : D()?.key, A = () => E ? C(n.sortDirection ?? "asc") : D()?.direction ?? "asc", j = () => C(n.showColumnCustomizer ?? !1), M = () => n.selected !== void 0 && n.onSelectionChange !== void 0, N = () => {
10
+ let e = T();
11
11
  return s().length > 0 && s().every((t) => e.includes(n.getRowId(t)));
12
- }, I = f(() => n.defaultVisibleColumns ?? n.columns.filter((e) => e.defaultVisible !== !1).map((e) => e.key)), [L, R] = p(void 0), z = () => n.visibleColumns === void 0 ? L() ?? I() : O(n.visibleColumns), B = f(() => new Set(z())), V = f(() => n.columns.filter((e) => e.toggleable === !1 || B().has(e.key))), H = f(() => n.columns.filter((e) => e.toggleable !== !1)), U = f(() => H().map((e) => e.key));
13
- function W(e) {
12
+ }, P = f(() => n.defaultVisibleColumns ?? n.columns.filter((e) => e.defaultVisible !== !1).map((e) => e.key)), [F, I] = p(void 0), L = () => n.visibleColumns === void 0 ? F() ?? P() : C(n.visibleColumns), R = f(() => new Set(L())), z = f(() => n.columns.filter((e) => e.toggleable === !1 || R().has(e.key))), B = f(() => n.columns.filter((e) => e.toggleable !== !1)), V = f(() => B().map((e) => e.key));
13
+ function H(e, t) {
14
+ return t.sortValue ? t.sortValue(e) : e[t.key];
15
+ }
16
+ function U(e, t) {
17
+ return e === t ? 0 : e == null ? -1 : t == null ? 1 : typeof e == "number" && typeof t == "number" ? e - t : String(e).localeCompare(String(t), void 0, { numeric: !0 });
18
+ }
19
+ let W = f(() => {
20
+ let e = s(), t = k();
21
+ if (E || !t) return e;
22
+ let r = n.columns.find((e) => e.key === t);
23
+ if (!r) return e;
24
+ let i = A() === "asc" ? 1 : -1;
25
+ return [...e].sort((e, t) => i * U(H(e, r), H(t, r)));
26
+ });
27
+ function G(e) {
28
+ let t = k() === e, r = t && A() === "desc" ? void 0 : {
29
+ key: e,
30
+ direction: t ? "desc" : "asc"
31
+ };
32
+ E || O(r), n.onSort?.(e), r || n.onSortClear?.(), n.onSortChange?.(r);
33
+ }
34
+ function K(e) {
14
35
  let t = new Map(n.columns.map((e, t) => [e.key, t]));
15
36
  return [...e].sort((e, n) => (t.get(e) ?? 0) - (t.get(n) ?? 0));
16
37
  }
17
- function G(e) {
18
- let t = W(e);
19
- n.visibleColumns === void 0 && R(t), n.onVisibleColumnsChange?.(t);
38
+ function q(e) {
39
+ let t = K(e);
40
+ n.visibleColumns === void 0 && I(t), n.onVisibleColumnsChange?.(t);
20
41
  }
21
- function K(e, t) {
22
- let n = new Set(z());
23
- t ? n.add(e) : n.delete(e), G(U().filter((e) => n.has(e)));
42
+ function oe(e, t) {
43
+ let n = new Set(L());
44
+ t ? n.add(e) : n.delete(e), q(V().filter((e) => n.has(e)));
24
45
  }
25
- function q() {
26
- G(U());
46
+ function se() {
47
+ q(V());
27
48
  }
28
- function J() {
29
- G(I());
49
+ function ce() {
50
+ q(P());
30
51
  }
31
- let Y = `${m()}-panel`, [X, Z] = p(!1), Q;
52
+ let J = `${m()}-panel`, [Y, X] = p(!1), Z;
32
53
  d(() => {
33
- if (!X() || !N()) return;
54
+ if (!Y() || !j()) return;
34
55
  function e(e) {
35
- Q && !Q.contains(e.target) && Z(!1);
56
+ Z && !Z.contains(e.target) && X(!1);
36
57
  }
37
58
  function t(e) {
38
- e.key === "Escape" && Z(!1);
59
+ e.key === "Escape" && X(!1);
39
60
  }
40
61
  document.addEventListener("pointerdown", e), document.addEventListener("keydown", t), h(() => {
41
62
  document.removeEventListener("pointerdown", e), document.removeEventListener("keydown", t);
42
63
  });
43
64
  });
44
- let $;
65
+ let Q;
45
66
  d(() => {
46
- $ && ($.indeterminate = A().length > 0 && !F());
67
+ Q && (Q.indeterminate = T().length > 0 && !N());
47
68
  });
48
- function te(e) {
69
+ function $(e) {
49
70
  n.onSelectionChange?.(e ? s().map(n.getRowId) : []);
50
71
  }
51
- function ne(e, t) {
52
- let r = n.getRowId(e), i = A(), a = t ? [...i, r] : i.filter((e) => e !== r);
72
+ function le(e, t) {
73
+ let r = n.getRowId(e), i = T(), a = t ? [...i, r] : i.filter((e) => e !== r);
53
74
  n.onSelectionChange?.(a);
54
75
  }
55
- function re(e) {
56
- return A().includes(n.getRowId(e));
76
+ function ue(e) {
77
+ return T().includes(n.getRowId(e));
57
78
  }
58
- function ie(e) {
59
- return e.toggleable === !1 || B().has(e.key);
79
+ function de(e) {
80
+ return e.toggleable === !1 || R().has(e.key);
60
81
  }
61
- function ae(e, t) {
82
+ function fe(e, t) {
62
83
  return n.getCell?.(e, t) ?? t.getValue?.(e) ?? null;
63
84
  }
64
85
  return (() => {
65
- var d = b(), f = d.firstChild, p = f.firstChild.firstChild, m = p.firstChild, h = p.nextSibling;
86
+ var d = _(), f = d.firstChild, p = f.firstChild.firstChild, m = p.firstChild, h = p.nextSibling;
66
87
  return i(d, t(u, {
67
88
  get when() {
68
- return N();
89
+ return j();
69
90
  },
70
91
  get children() {
71
- var e = _(), a = e.firstChild, s = a.firstChild;
92
+ var e = te(), a = e.firstChild, s = a.firstChild;
72
93
  s.firstChild.nextSibling;
73
- var d = Q;
74
- return typeof d == "function" ? c(d, a) : Q = a, s.$$click = () => Z((e) => !e), o(s, "aria-controls", Y), i(s, () => n.columnCustomizerLabel ?? "Columns", null), i(a, t(u, {
94
+ var d = Z;
95
+ return typeof d == "function" ? c(d, a) : Z = a, s.$$click = () => X((e) => !e), o(s, "aria-controls", J), i(s, () => n.columnCustomizerLabel ?? "Columns", null), i(a, t(u, {
75
96
  get when() {
76
- return X();
97
+ return Y();
77
98
  },
78
99
  get children() {
79
- var e = g(), a = e.firstChild, s = a.nextSibling, c = s.nextSibling.firstChild, u = c.nextSibling;
80
- return o(e, "id", Y), i(a, () => n.columnCustomizerTitle ?? "Shown columns"), i(s, t(l, {
100
+ var e = ee(), a = e.firstChild, s = a.nextSibling, c = s.nextSibling.firstChild, u = c.nextSibling;
101
+ return o(e, "id", J), i(a, () => n.columnCustomizerTitle ?? "Shown columns"), i(s, t(l, {
81
102
  get each() {
82
103
  return n.columns;
83
104
  },
84
105
  children: (e) => (() => {
85
- var t = x(), n = t.firstChild, a = n.firstChild;
86
- return a.addEventListener("change", (t) => K(e.key, t.currentTarget.checked)), i(n, () => e.ariaLabel ?? e.label, null), r(() => a.disabled = e.toggleable === !1), r(() => a.checked = ie(e)), t;
106
+ var t = v(), n = t.firstChild, a = n.firstChild;
107
+ return a.addEventListener("change", (t) => oe(e.key, t.currentTarget.checked)), i(n, () => e.ariaLabel ?? e.label, null), r(() => a.disabled = e.toggleable === !1), r(() => a.checked = de(e)), t;
87
108
  })()
88
- })), c.$$click = q, i(c, () => n.columnCustomizerShowAllLabel ?? "Show all"), u.$$click = J, i(u, () => n.columnCustomizerResetLabel ?? "Reset"), r(() => o(e, "aria-label", n.columnCustomizerTitle ?? "Customize columns")), e;
109
+ })), c.$$click = se, i(c, () => n.columnCustomizerShowAllLabel ?? "Show all"), u.$$click = ce, i(u, () => n.columnCustomizerResetLabel ?? "Reset"), r(() => o(e, "aria-label", n.columnCustomizerTitle ?? "Customize columns")), e;
89
110
  }
90
- }), null), r(() => o(s, "aria-expanded", X())), e;
111
+ }), null), r(() => o(s, "aria-expanded", Y())), e;
91
112
  }
92
113
  }), f), i(m, t(u, {
93
114
  get when() {
94
- return P();
115
+ return M();
95
116
  },
96
117
  get children() {
97
- var e = v(), t = e.firstChild.nextSibling;
98
- t.addEventListener("change", (e) => te(e.currentTarget.checked));
99
- var i = $;
100
- return typeof i == "function" ? c(i, t) : $ = t, r(() => o(t, "aria-label", n.selectionLabel ?? "Select all rows")), r(() => t.checked = F()), e;
118
+ var e = ne(), t = e.firstChild.nextSibling;
119
+ t.addEventListener("change", (e) => $(e.currentTarget.checked));
120
+ var i = Q;
121
+ return typeof i == "function" ? c(i, t) : Q = t, r(() => o(t, "aria-label", n.selectionLabel ?? "Select all rows")), r(() => t.checked = N()), e;
101
122
  }
102
123
  }), null), i(m, t(l, {
103
124
  get each() {
104
- return V();
125
+ return z();
105
126
  },
106
127
  children: (s) => (() => {
107
- var c = C();
128
+ var c = b();
108
129
  return i(c, t(u, {
109
130
  get when() {
110
- return a(() => !!s.sortable)() && n.onSort;
131
+ return a(() => !!s.sortable)() && (!E || n.onSort || n.onSortChange);
111
132
  },
112
133
  get fallback() {
113
134
  return s.label;
114
135
  },
115
136
  get children() {
116
- var e = S();
117
- return e.$$click = () => n.onSort?.(s.key), i(e, () => s.label, null), i(e, (() => {
118
- var e = a(() => j() === s.key);
119
- return () => e() ? M() === "asc" ? " ▲" : " ▼" : "";
120
- })(), null), e;
137
+ var e = y(), t = e.firstChild;
138
+ return e.$$click = () => G(s.key), i(e, () => s.label, t), i(t, (() => {
139
+ var e = a(() => k() === s.key);
140
+ return () => e() ? A() === "asc" ? "▲" : "▼" : "";
141
+ })()), e;
121
142
  }
122
143
  })), r((t) => {
123
- var n = s.class, r = s.sortable ? j() === s.key ? M() === "asc" ? "ascending" : "descending" : "none" : void 0;
144
+ var n = s.class, r = s.sortable ? k() === s.key ? A() === "asc" ? "ascending" : "descending" : "none" : void 0;
124
145
  return n !== t.e && e(c, t.e = n), r !== t.t && o(c, "aria-sort", t.t = r), t;
125
146
  }, {
126
147
  e: void 0,
@@ -132,57 +153,57 @@ function k(n) {
132
153
  return n.rowActions;
133
154
  },
134
155
  get children() {
135
- return y();
156
+ return g();
136
157
  }
137
158
  }), null), i(h, t(l, {
138
159
  get each() {
139
- return s();
160
+ return W();
140
161
  },
141
162
  children: (a) => (() => {
142
- var s = T();
163
+ var s = ie();
143
164
  return i(s, t(u, {
144
165
  get when() {
145
- return P();
166
+ return M();
146
167
  },
147
168
  get children() {
148
- var e = ee(), t = e.firstChild;
149
- return t.addEventListener("change", (e) => ne(a, e.currentTarget.checked)), r(() => o(t, "aria-label", `Select row ${n.getRowId(a)}`)), r(() => t.checked = re(a)), e;
169
+ var e = re(), t = e.firstChild;
170
+ return t.addEventListener("change", (e) => le(a, e.currentTarget.checked)), r(() => o(t, "aria-label", `Select row ${n.getRowId(a)}`)), r(() => t.checked = ue(a)), e;
150
171
  }
151
172
  }), null), i(s, t(l, {
152
173
  get each() {
153
- return V();
174
+ return z();
154
175
  },
155
176
  children: (t) => (() => {
156
- var n = w();
157
- return i(n, () => ae(a, t)), r(() => e(n, t.class)), n;
177
+ var n = x();
178
+ return i(n, () => fe(a, t)), r(() => e(n, t.class)), n;
158
179
  })()
159
180
  }), null), i(s, t(u, {
160
181
  get when() {
161
182
  return n.rowActions;
162
183
  },
163
184
  get children() {
164
- var e = w();
185
+ var e = x();
165
186
  return i(e, () => n.rowActions?.(a)), e;
166
187
  }
167
188
  }), null), s;
168
189
  })()
169
190
  })), i(d, t(u, {
170
191
  get when() {
171
- return k();
192
+ return w();
172
193
  },
173
194
  get children() {
174
- return n.loadingContent ?? E();
195
+ return n.loadingContent ?? ae();
175
196
  }
176
197
  }), null), i(d, t(u, {
177
198
  get when() {
178
- return a(() => !k())() && (n.empty === void 0 ? s().length === 0 : O(n.empty));
199
+ return a(() => !w())() && (n.empty === void 0 ? s().length === 0 : C(n.empty));
179
200
  },
180
201
  get children() {
181
- return n.emptyContent ?? D();
202
+ return n.emptyContent ?? S();
182
203
  }
183
204
  }), null), r(() => e(d, `data-table-wrap${n.class ? ` ${n.class}` : ""}`)), d;
184
205
  })();
185
206
  }
186
207
  n(["click"]);
187
208
  //#endregion
188
- export { k as DataTable };
209
+ export { w as DataTable };
package/dist/styles.css CHANGED
@@ -118,6 +118,13 @@
118
118
  text-decoration: underline;
119
119
  }
120
120
 
121
+ .data-table-sort-indicator {
122
+ display: inline-block;
123
+ width: 1em;
124
+ margin-left: 0.25em;
125
+ text-align: center;
126
+ }
127
+
121
128
  .data-table-status {
122
129
  color: var(--text-secondary, #616161);
123
130
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serkonda7/solid-components",
3
- "version": "0.0.3",
3
+ "version": "0.0.6",
4
4
  "description": "Reusable components for SolidJS",
5
5
  "license": "MIT",
6
6
  "author": "serkonda7",
@@ -28,6 +28,7 @@
28
28
  "lint": "biome check --write",
29
29
  "lint:ci": "biome ci",
30
30
  "check": "tsc --noEmit",
31
+ "test": "vitest run",
31
32
  "examples": "vite --config examples/vite.config.ts",
32
33
  "build:dev": "bun run scripts/build.ts --dev",
33
34
  "build": "bun run check && bun run scripts/build.ts --prod",
@@ -43,9 +44,12 @@
43
44
  "devDependencies": {
44
45
  "@biomejs/biome": "2.5.14",
45
46
  "@types/bun": "1.4.2",
47
+ "@vitest/browser-playwright": "^5.0.2",
48
+ "playwright": "^1.63.0",
46
49
  "solid-js": "~1.9.15",
47
50
  "typescript": "~7.0.2",
48
51
  "vite": "~8.3.0",
49
- "vite-plugin-solid": "~2.11.14"
52
+ "vite-plugin-solid": "~2.11.14",
53
+ "vitest": "^5.0.2"
50
54
  }
51
55
  }