@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 +2 -2
- package/dist/data-table.d.ts +8 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +93 -72
- package/dist/styles.css +7 -0
- package/package.json +6 -2
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
|
package/dist/data-table.d.ts
CHANGED
|
@@ -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
|
|
5
|
-
function
|
|
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
|
|
9
|
-
let s = f(() =>
|
|
10
|
-
let e =
|
|
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
|
-
},
|
|
13
|
-
function
|
|
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
|
|
18
|
-
let t =
|
|
19
|
-
n.visibleColumns === void 0 &&
|
|
38
|
+
function q(e) {
|
|
39
|
+
let t = K(e);
|
|
40
|
+
n.visibleColumns === void 0 && I(t), n.onVisibleColumnsChange?.(t);
|
|
20
41
|
}
|
|
21
|
-
function
|
|
22
|
-
let n = new Set(
|
|
23
|
-
t ? n.add(e) : n.delete(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
|
|
26
|
-
|
|
46
|
+
function se() {
|
|
47
|
+
q(V());
|
|
27
48
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
49
|
+
function ce() {
|
|
50
|
+
q(P());
|
|
30
51
|
}
|
|
31
|
-
let
|
|
52
|
+
let J = `${m()}-panel`, [Y, X] = p(!1), Z;
|
|
32
53
|
d(() => {
|
|
33
|
-
if (!
|
|
54
|
+
if (!Y() || !j()) return;
|
|
34
55
|
function e(e) {
|
|
35
|
-
|
|
56
|
+
Z && !Z.contains(e.target) && X(!1);
|
|
36
57
|
}
|
|
37
58
|
function t(e) {
|
|
38
|
-
e.key === "Escape" &&
|
|
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
|
-
|
|
67
|
+
Q && (Q.indeterminate = T().length > 0 && !N());
|
|
47
68
|
});
|
|
48
|
-
function
|
|
69
|
+
function $(e) {
|
|
49
70
|
n.onSelectionChange?.(e ? s().map(n.getRowId) : []);
|
|
50
71
|
}
|
|
51
|
-
function
|
|
52
|
-
let r = n.getRowId(e), i =
|
|
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
|
|
56
|
-
return
|
|
76
|
+
function ue(e) {
|
|
77
|
+
return T().includes(n.getRowId(e));
|
|
57
78
|
}
|
|
58
|
-
function
|
|
59
|
-
return e.toggleable === !1 ||
|
|
79
|
+
function de(e) {
|
|
80
|
+
return e.toggleable === !1 || R().has(e.key);
|
|
60
81
|
}
|
|
61
|
-
function
|
|
82
|
+
function fe(e, t) {
|
|
62
83
|
return n.getCell?.(e, t) ?? t.getValue?.(e) ?? null;
|
|
63
84
|
}
|
|
64
85
|
return (() => {
|
|
65
|
-
var d =
|
|
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
|
|
89
|
+
return j();
|
|
69
90
|
},
|
|
70
91
|
get children() {
|
|
71
|
-
var e =
|
|
92
|
+
var e = te(), a = e.firstChild, s = a.firstChild;
|
|
72
93
|
s.firstChild.nextSibling;
|
|
73
|
-
var d =
|
|
74
|
-
return typeof d == "function" ? c(d, a) :
|
|
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
|
|
97
|
+
return Y();
|
|
77
98
|
},
|
|
78
99
|
get children() {
|
|
79
|
-
var e =
|
|
80
|
-
return o(e, "id",
|
|
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 =
|
|
86
|
-
return a.addEventListener("change", (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 =
|
|
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",
|
|
111
|
+
}), null), r(() => o(s, "aria-expanded", Y())), e;
|
|
91
112
|
}
|
|
92
113
|
}), f), i(m, t(u, {
|
|
93
114
|
get when() {
|
|
94
|
-
return
|
|
115
|
+
return M();
|
|
95
116
|
},
|
|
96
117
|
get children() {
|
|
97
|
-
var e =
|
|
98
|
-
t.addEventListener("change", (e) =>
|
|
99
|
-
var i =
|
|
100
|
-
return typeof i == "function" ? c(i, t) :
|
|
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
|
|
125
|
+
return z();
|
|
105
126
|
},
|
|
106
127
|
children: (s) => (() => {
|
|
107
|
-
var 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 =
|
|
117
|
-
return e.$$click = () =>
|
|
118
|
-
var e = a(() =>
|
|
119
|
-
return () => e() ?
|
|
120
|
-
})()
|
|
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 ?
|
|
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
|
|
156
|
+
return g();
|
|
136
157
|
}
|
|
137
158
|
}), null), i(h, t(l, {
|
|
138
159
|
get each() {
|
|
139
|
-
return
|
|
160
|
+
return W();
|
|
140
161
|
},
|
|
141
162
|
children: (a) => (() => {
|
|
142
|
-
var s =
|
|
163
|
+
var s = ie();
|
|
143
164
|
return i(s, t(u, {
|
|
144
165
|
get when() {
|
|
145
|
-
return
|
|
166
|
+
return M();
|
|
146
167
|
},
|
|
147
168
|
get children() {
|
|
148
|
-
var e =
|
|
149
|
-
return t.addEventListener("change", (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
|
|
174
|
+
return z();
|
|
154
175
|
},
|
|
155
176
|
children: (t) => (() => {
|
|
156
|
-
var n =
|
|
157
|
-
return i(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 =
|
|
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
|
|
192
|
+
return w();
|
|
172
193
|
},
|
|
173
194
|
get children() {
|
|
174
|
-
return n.loadingContent ??
|
|
195
|
+
return n.loadingContent ?? ae();
|
|
175
196
|
}
|
|
176
197
|
}), null), i(d, t(u, {
|
|
177
198
|
get when() {
|
|
178
|
-
return a(() => !
|
|
199
|
+
return a(() => !w())() && (n.empty === void 0 ? s().length === 0 : C(n.empty));
|
|
179
200
|
},
|
|
180
201
|
get children() {
|
|
181
|
-
return n.emptyContent ??
|
|
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 {
|
|
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
|
+
"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
|
}
|