@crispy-seed/data-table 0.1.0
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/LICENSE +201 -0
- package/NOTICE +30 -0
- package/README.md +103 -0
- package/dist/DataTable-12s-8LMBtS2u.cjs +1532 -0
- package/dist/DataTable-12s-Bd20OuMs.js +1482 -0
- package/dist/DataTable-12s-Zml1x9Kr-12s-CTRzgvMT.cjs +161 -0
- package/dist/DataTable-12s-Zml1x9Kr-12s-Coi-3lUa.js +153 -0
- package/dist/Menu-12s-Db_zr1AP.cjs +104 -0
- package/dist/Menu-12s-Di5JADW4.js +78 -0
- package/dist/Select-12s-1Uh7XbkG.js +219 -0
- package/dist/Select-12s-D8DdKT-U.cjs +250 -0
- package/dist/body-cells-12s-BnOVUTKN.js +453 -0
- package/dist/body-cells-12s-BoOTcg-l.cjs +462 -0
- package/dist/column-calc-12s-C6IPSOaF.js +129 -0
- package/dist/column-calc-12s-CKuSpe-l.cjs +149 -0
- package/dist/column-layout-12s-CTu5yT_D.cjs +120 -0
- package/dist/column-layout-12s-s7wnxkMN.js +99 -0
- package/dist/column-menu-12s-BPE9N1gs.cjs +427 -0
- package/dist/column-menu-12s-mRBk-4oa.js +407 -0
- package/dist/data-table-recipe.css +442 -0
- package/dist/data-table-recipe.layered.css +505 -0
- package/dist/editors-12s-BO9Mp034.js +525 -0
- package/dist/editors-12s-DO8TZkYV.cjs +555 -0
- package/dist/index.cjs +14 -0
- package/dist/index.d.ts +323 -0
- package/dist/index.js +10 -0
- package/dist/resize-12s-jQY-PX67.cjs +58 -0
- package/dist/resize-12s-nsMvrmLt.js +58 -0
- package/dist/states-12s-CLO_uVue.cjs +125 -0
- package/dist/states-12s-DEFSxJCO.js +122 -0
- package/dist/styles.css +14660 -0
- package/dist/toolbar-12s-AVU-sbDW.js +69 -0
- package/dist/toolbar-12s-CaLgJrDo.cjs +71 -0
- package/dist/useDataTable-12s-BHiDUubw-12s-CBeCwTe7.js +61 -0
- package/dist/useDataTable-12s-BHiDUubw-12s-Dgvt7XDk.cjs +61 -0
- package/dist/useDataTableColumnCalc-12s-DTQQTtEJ-12s-CvD14JYo.cjs +207 -0
- package/dist/useDataTableColumnCalc-12s-DTQQTtEJ-12s-DsEse3uq.js +183 -0
- package/dist/useDataTableColumns-12s-Cn2ZAzFL-12s-CD6goR59.js +289 -0
- package/dist/useDataTableColumns-12s-Cn2ZAzFL-12s-CUk_CpYT.cjs +292 -0
- package/dist/useDataTableEdit-12s-9Wb_UCrN-12s-BoOHq3GB.js +98 -0
- package/dist/useDataTableEdit-12s-9Wb_UCrN-12s-De6YHBba.cjs +98 -0
- package/dist/useDataTableFilter-12s-ZzbmWMin-12s-CWyBeFna.js +74 -0
- package/dist/useDataTableFilter-12s-ZzbmWMin-12s-lpjzZY3_.cjs +74 -0
- package/dist/useDataTableInfiniteScroll-12s-8ZG31URd-12s-BexjP6iO.js +104 -0
- package/dist/useDataTableInfiniteScroll-12s-8ZG31URd-12s-Bt8gojr9.cjs +104 -0
- package/dist/useDataTableRow-12s-CPYaDa1p-12s-BmUSAnPe.js +30 -0
- package/dist/useDataTableRow-12s-CPYaDa1p-12s-D-DRjwAe.cjs +30 -0
- package/dist/useDataTableScroll-12s-BKDCr0en-12s-C7f2vHeG.js +61 -0
- package/dist/useDataTableScroll-12s-BKDCr0en-12s-CUvUYMtt.cjs +61 -0
- package/dist/useDataTableSearch-12s-Ck3iWcpX-12s-B-65V6gH.js +37 -0
- package/dist/useDataTableSearch-12s-Ck3iWcpX-12s-DhVfN2Hq.cjs +37 -0
- package/dist/useDataTableSelection-12s-BIDtiRQq-12s-IS__VAnU.cjs +71 -0
- package/dist/useDataTableSelection-12s-BIDtiRQq-12s-O6M_BhrH.js +71 -0
- package/dist/useDataTableSort-12s-DvJYtmeS-12s-C5VGnsq4.cjs +78 -0
- package/dist/useDataTableSort-12s-DvJYtmeS-12s-DABSNt6U.js +78 -0
- package/package.json +78 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
function __insertCSS(code) {
|
|
3
|
+
if (!code || typeof document == 'undefined') return
|
|
4
|
+
let head = document.head || document.getElementsByTagName('head')[0]
|
|
5
|
+
let style = document.createElement('style')
|
|
6
|
+
style.type = 'text/css'
|
|
7
|
+
head.appendChild(style)
|
|
8
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
import { d as useControllableState } from './useDataTableColumnCalc-12s-DTQQTtEJ-12s-DsEse3uq.js';
|
|
12
|
+
import { useCallback } from 'react';
|
|
13
|
+
|
|
14
|
+
// Owns the toolbar's single free-text query -- the way useDataTableSort owns the single
|
|
15
|
+
// active sort column. It has no idea which columns are searchable or how a row's value
|
|
16
|
+
// is read off them (that needs `TRow`, a type this headless package never sees), so
|
|
17
|
+
// narrowing `data` against the query is the styled layer's job (DataTable.tsx's
|
|
18
|
+
// `getVisibleRows`) -- the same split sort already draws: this hook tracks WHICH state
|
|
19
|
+
// is active, the styled layer decides what that state does to the rows.
|
|
20
|
+
function useDataTableSearch(props) {
|
|
21
|
+
const { query: queryProp, defaultQuery = "", onQueryChange } = props;
|
|
22
|
+
const [query = "", setQuery] = useControllableState({
|
|
23
|
+
prop: queryProp,
|
|
24
|
+
defaultProp: defaultQuery,
|
|
25
|
+
onChange: onQueryChange
|
|
26
|
+
});
|
|
27
|
+
const clearQuery = useCallback(()=>setQuery(""), [
|
|
28
|
+
setQuery
|
|
29
|
+
]);
|
|
30
|
+
return {
|
|
31
|
+
query,
|
|
32
|
+
setQuery,
|
|
33
|
+
clearQuery
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { useDataTableSearch as u };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
function __insertCSS(code) {
|
|
3
|
+
if (!code || typeof document == 'undefined') return
|
|
4
|
+
let head = document.head || document.getElementsByTagName('head')[0]
|
|
5
|
+
let style = document.createElement('style')
|
|
6
|
+
style.type = 'text/css'
|
|
7
|
+
head.appendChild(style)
|
|
8
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var useDataTableColumnCalc12sDTQQTtEJ12s = require('./useDataTableColumnCalc-12s-DTQQTtEJ-12s-CvD14JYo.cjs');
|
|
12
|
+
var React = require('react');
|
|
13
|
+
|
|
14
|
+
// Owns the toolbar's single free-text query -- the way useDataTableSort owns the single
|
|
15
|
+
// active sort column. It has no idea which columns are searchable or how a row's value
|
|
16
|
+
// is read off them (that needs `TRow`, a type this headless package never sees), so
|
|
17
|
+
// narrowing `data` against the query is the styled layer's job (DataTable.tsx's
|
|
18
|
+
// `getVisibleRows`) -- the same split sort already draws: this hook tracks WHICH state
|
|
19
|
+
// is active, the styled layer decides what that state does to the rows.
|
|
20
|
+
function useDataTableSearch(props) {
|
|
21
|
+
const { query: queryProp, defaultQuery = "", onQueryChange } = props;
|
|
22
|
+
const [query = "", setQuery] = useDataTableColumnCalc12sDTQQTtEJ12s.useControllableState({
|
|
23
|
+
prop: queryProp,
|
|
24
|
+
defaultProp: defaultQuery,
|
|
25
|
+
onChange: onQueryChange
|
|
26
|
+
});
|
|
27
|
+
const clearQuery = React.useCallback(()=>setQuery(""), [
|
|
28
|
+
setQuery
|
|
29
|
+
]);
|
|
30
|
+
return {
|
|
31
|
+
query,
|
|
32
|
+
setQuery,
|
|
33
|
+
clearQuery
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
exports.useDataTableSearch = useDataTableSearch;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
function __insertCSS(code) {
|
|
3
|
+
if (!code || typeof document == 'undefined') return
|
|
4
|
+
let head = document.head || document.getElementsByTagName('head')[0]
|
|
5
|
+
let style = document.createElement('style')
|
|
6
|
+
style.type = 'text/css'
|
|
7
|
+
head.appendChild(style)
|
|
8
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var useDataTableColumnCalc12sDTQQTtEJ12s = require('./useDataTableColumnCalc-12s-DTQQTtEJ-12s-CvD14JYo.cjs');
|
|
12
|
+
var domUtils = require('@seed-design/dom-utils');
|
|
13
|
+
var React = require('react');
|
|
14
|
+
var useDataTableColumns12sCn2ZAzFL12s = require('./useDataTableColumns-12s-Cn2ZAzFL-12s-CUk_CpYT.cjs');
|
|
15
|
+
|
|
16
|
+
// Owns the selected-id set and its two shapes of toggle (one row, select-all) --
|
|
17
|
+
// the way useSelectOptions owns the selected VALUE. `selectionState` and `toggleAll`
|
|
18
|
+
// are always computed against `rowIds` (the currently rendered order), never against
|
|
19
|
+
// `selectedIds` alone -- see dom.ts's `computeSelectionState` doc comment.
|
|
20
|
+
function useDataTableSelection(props) {
|
|
21
|
+
const { rowIds = [], selectable = false, selectedIds: selectedIdsProp, defaultSelectedIds = [], onSelectionChange } = props;
|
|
22
|
+
const [selectedIds = [], setSelectedIds] = useDataTableColumnCalc12sDTQQTtEJ12s.useControllableState({
|
|
23
|
+
prop: selectedIdsProp,
|
|
24
|
+
defaultProp: defaultSelectedIds,
|
|
25
|
+
onChange: onSelectionChange
|
|
26
|
+
});
|
|
27
|
+
const selectedIdSet = React.useMemo(()=>new Set(selectedIds), [
|
|
28
|
+
selectedIds
|
|
29
|
+
]);
|
|
30
|
+
const isSelected = React.useCallback((id)=>selectedIdSet.has(id), [
|
|
31
|
+
selectedIdSet
|
|
32
|
+
]);
|
|
33
|
+
const toggleRow = React.useCallback((id)=>{
|
|
34
|
+
setSelectedIds((current = [])=>useDataTableColumns12sCn2ZAzFL12s.toggleMembership(current, id));
|
|
35
|
+
}, [
|
|
36
|
+
setSelectedIds
|
|
37
|
+
]);
|
|
38
|
+
const selectionState = React.useMemo(()=>useDataTableColumns12sCn2ZAzFL12s.computeSelectionState(rowIds, selectedIds), [
|
|
39
|
+
rowIds,
|
|
40
|
+
selectedIds
|
|
41
|
+
]);
|
|
42
|
+
const toggleAll = React.useCallback(()=>{
|
|
43
|
+
setSelectedIds(selectionState === "all" ? [] : rowIds);
|
|
44
|
+
}, [
|
|
45
|
+
selectionState,
|
|
46
|
+
rowIds,
|
|
47
|
+
setSelectedIds
|
|
48
|
+
]);
|
|
49
|
+
const getRowProps = React.useCallback((rowId)=>{
|
|
50
|
+
const isRowSelected = isSelected(rowId);
|
|
51
|
+
return domUtils.elementProps({
|
|
52
|
+
role: "row",
|
|
53
|
+
"aria-selected": domUtils.ariaAttr(isRowSelected),
|
|
54
|
+
"data-selected": domUtils.dataAttr(isRowSelected)
|
|
55
|
+
});
|
|
56
|
+
}, [
|
|
57
|
+
isSelected
|
|
58
|
+
]);
|
|
59
|
+
return {
|
|
60
|
+
selectable,
|
|
61
|
+
rowIds,
|
|
62
|
+
selectedIds,
|
|
63
|
+
selectionState,
|
|
64
|
+
isSelected,
|
|
65
|
+
toggleRow,
|
|
66
|
+
toggleAll,
|
|
67
|
+
getRowProps
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
exports.useDataTableSelection = useDataTableSelection;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
function __insertCSS(code) {
|
|
3
|
+
if (!code || typeof document == 'undefined') return
|
|
4
|
+
let head = document.head || document.getElementsByTagName('head')[0]
|
|
5
|
+
let style = document.createElement('style')
|
|
6
|
+
style.type = 'text/css'
|
|
7
|
+
head.appendChild(style)
|
|
8
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
import { d as useControllableState } from './useDataTableColumnCalc-12s-DTQQTtEJ-12s-DsEse3uq.js';
|
|
12
|
+
import { elementProps, dataAttr, ariaAttr } from '@seed-design/dom-utils';
|
|
13
|
+
import { useMemo, useCallback } from 'react';
|
|
14
|
+
import { t as toggleMembership, c as computeSelectionState } from './useDataTableColumns-12s-Cn2ZAzFL-12s-CD6goR59.js';
|
|
15
|
+
|
|
16
|
+
// Owns the selected-id set and its two shapes of toggle (one row, select-all) --
|
|
17
|
+
// the way useSelectOptions owns the selected VALUE. `selectionState` and `toggleAll`
|
|
18
|
+
// are always computed against `rowIds` (the currently rendered order), never against
|
|
19
|
+
// `selectedIds` alone -- see dom.ts's `computeSelectionState` doc comment.
|
|
20
|
+
function useDataTableSelection(props) {
|
|
21
|
+
const { rowIds = [], selectable = false, selectedIds: selectedIdsProp, defaultSelectedIds = [], onSelectionChange } = props;
|
|
22
|
+
const [selectedIds = [], setSelectedIds] = useControllableState({
|
|
23
|
+
prop: selectedIdsProp,
|
|
24
|
+
defaultProp: defaultSelectedIds,
|
|
25
|
+
onChange: onSelectionChange
|
|
26
|
+
});
|
|
27
|
+
const selectedIdSet = useMemo(()=>new Set(selectedIds), [
|
|
28
|
+
selectedIds
|
|
29
|
+
]);
|
|
30
|
+
const isSelected = useCallback((id)=>selectedIdSet.has(id), [
|
|
31
|
+
selectedIdSet
|
|
32
|
+
]);
|
|
33
|
+
const toggleRow = useCallback((id)=>{
|
|
34
|
+
setSelectedIds((current = [])=>toggleMembership(current, id));
|
|
35
|
+
}, [
|
|
36
|
+
setSelectedIds
|
|
37
|
+
]);
|
|
38
|
+
const selectionState = useMemo(()=>computeSelectionState(rowIds, selectedIds), [
|
|
39
|
+
rowIds,
|
|
40
|
+
selectedIds
|
|
41
|
+
]);
|
|
42
|
+
const toggleAll = useCallback(()=>{
|
|
43
|
+
setSelectedIds(selectionState === "all" ? [] : rowIds);
|
|
44
|
+
}, [
|
|
45
|
+
selectionState,
|
|
46
|
+
rowIds,
|
|
47
|
+
setSelectedIds
|
|
48
|
+
]);
|
|
49
|
+
const getRowProps = useCallback((rowId)=>{
|
|
50
|
+
const isRowSelected = isSelected(rowId);
|
|
51
|
+
return elementProps({
|
|
52
|
+
role: "row",
|
|
53
|
+
"aria-selected": ariaAttr(isRowSelected),
|
|
54
|
+
"data-selected": dataAttr(isRowSelected)
|
|
55
|
+
});
|
|
56
|
+
}, [
|
|
57
|
+
isSelected
|
|
58
|
+
]);
|
|
59
|
+
return {
|
|
60
|
+
selectable,
|
|
61
|
+
rowIds,
|
|
62
|
+
selectedIds,
|
|
63
|
+
selectionState,
|
|
64
|
+
isSelected,
|
|
65
|
+
toggleRow,
|
|
66
|
+
toggleAll,
|
|
67
|
+
getRowProps
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { useDataTableSelection as u };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
function __insertCSS(code) {
|
|
3
|
+
if (!code || typeof document == 'undefined') return
|
|
4
|
+
let head = document.head || document.getElementsByTagName('head')[0]
|
|
5
|
+
let style = document.createElement('style')
|
|
6
|
+
style.type = 'text/css'
|
|
7
|
+
head.appendChild(style)
|
|
8
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var useDataTableColumnCalc12sDTQQTtEJ12s = require('./useDataTableColumnCalc-12s-DTQQTtEJ-12s-CvD14JYo.cjs');
|
|
12
|
+
var domUtils = require('@seed-design/dom-utils');
|
|
13
|
+
var React = require('react');
|
|
14
|
+
|
|
15
|
+
// Owns the single active sort column/direction and the click/keyboard toggle that
|
|
16
|
+
// cycles it -- the way useSelectHighlight owns the single active index. A header
|
|
17
|
+
// cell's full prop set (aria-sort, data-sortable/data-sorted, the click and
|
|
18
|
+
// Enter/Space handlers) is built here too, beside the state it reads, rather than
|
|
19
|
+
// re-derived in the styled layer or the root primitive.
|
|
20
|
+
function useDataTableSort(props) {
|
|
21
|
+
const { sort: sortProp, defaultSort, onSortChange } = props;
|
|
22
|
+
const [sort, setSort] = useDataTableColumnCalc12sDTQQTtEJ12s.useControllableState({
|
|
23
|
+
prop: sortProp,
|
|
24
|
+
defaultProp: defaultSort,
|
|
25
|
+
onChange: (nextSort)=>{
|
|
26
|
+
// `toggleSort` never sets `sort` back to `undefined`, but the underlying state is
|
|
27
|
+
// typed as possibly-undefined so an uncontrolled table can start with no sort at all.
|
|
28
|
+
if (nextSort) onSortChange?.(nextSort);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const toggleSort = React.useCallback((key)=>{
|
|
32
|
+
setSort((current)=>{
|
|
33
|
+
if (!current || current.key !== key) return {
|
|
34
|
+
key,
|
|
35
|
+
dir: "asc"
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
key,
|
|
39
|
+
dir: current.dir === "asc" ? "desc" : "asc"
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}, [
|
|
43
|
+
setSort
|
|
44
|
+
]);
|
|
45
|
+
const getHeaderCellProps = React.useCallback((columnKey, sortable)=>{
|
|
46
|
+
const isSorted = Boolean(columnKey) && sort?.key === columnKey;
|
|
47
|
+
const canSort = Boolean(sortable && columnKey);
|
|
48
|
+
return domUtils.elementProps({
|
|
49
|
+
role: "columnheader",
|
|
50
|
+
"aria-sort": canSort ? isSorted ? sort?.dir === "asc" ? "ascending" : "descending" : "none" : undefined,
|
|
51
|
+
tabIndex: canSort ? 0 : undefined,
|
|
52
|
+
"data-sortable": domUtils.dataAttr(canSort),
|
|
53
|
+
"data-sorted": domUtils.dataAttr(isSorted),
|
|
54
|
+
"data-sort-direction": isSorted ? sort?.dir : undefined,
|
|
55
|
+
onClick (event) {
|
|
56
|
+
if (event.defaultPrevented || !canSort || !columnKey) return;
|
|
57
|
+
toggleSort(columnKey);
|
|
58
|
+
},
|
|
59
|
+
onKeyDown (event) {
|
|
60
|
+
if (event.defaultPrevented || !canSort || !columnKey) return;
|
|
61
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
toggleSort(columnKey);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}, [
|
|
68
|
+
sort,
|
|
69
|
+
toggleSort
|
|
70
|
+
]);
|
|
71
|
+
return {
|
|
72
|
+
sort,
|
|
73
|
+
toggleSort,
|
|
74
|
+
getHeaderCellProps
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
exports.useDataTableSort = useDataTableSort;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
function __insertCSS(code) {
|
|
3
|
+
if (!code || typeof document == 'undefined') return
|
|
4
|
+
let head = document.head || document.getElementsByTagName('head')[0]
|
|
5
|
+
let style = document.createElement('style')
|
|
6
|
+
style.type = 'text/css'
|
|
7
|
+
head.appendChild(style)
|
|
8
|
+
;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
import { d as useControllableState } from './useDataTableColumnCalc-12s-DTQQTtEJ-12s-DsEse3uq.js';
|
|
12
|
+
import { elementProps, dataAttr } from '@seed-design/dom-utils';
|
|
13
|
+
import { useCallback } from 'react';
|
|
14
|
+
|
|
15
|
+
// Owns the single active sort column/direction and the click/keyboard toggle that
|
|
16
|
+
// cycles it -- the way useSelectHighlight owns the single active index. A header
|
|
17
|
+
// cell's full prop set (aria-sort, data-sortable/data-sorted, the click and
|
|
18
|
+
// Enter/Space handlers) is built here too, beside the state it reads, rather than
|
|
19
|
+
// re-derived in the styled layer or the root primitive.
|
|
20
|
+
function useDataTableSort(props) {
|
|
21
|
+
const { sort: sortProp, defaultSort, onSortChange } = props;
|
|
22
|
+
const [sort, setSort] = useControllableState({
|
|
23
|
+
prop: sortProp,
|
|
24
|
+
defaultProp: defaultSort,
|
|
25
|
+
onChange: (nextSort)=>{
|
|
26
|
+
// `toggleSort` never sets `sort` back to `undefined`, but the underlying state is
|
|
27
|
+
// typed as possibly-undefined so an uncontrolled table can start with no sort at all.
|
|
28
|
+
if (nextSort) onSortChange?.(nextSort);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const toggleSort = useCallback((key)=>{
|
|
32
|
+
setSort((current)=>{
|
|
33
|
+
if (!current || current.key !== key) return {
|
|
34
|
+
key,
|
|
35
|
+
dir: "asc"
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
key,
|
|
39
|
+
dir: current.dir === "asc" ? "desc" : "asc"
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}, [
|
|
43
|
+
setSort
|
|
44
|
+
]);
|
|
45
|
+
const getHeaderCellProps = useCallback((columnKey, sortable)=>{
|
|
46
|
+
const isSorted = Boolean(columnKey) && sort?.key === columnKey;
|
|
47
|
+
const canSort = Boolean(sortable && columnKey);
|
|
48
|
+
return elementProps({
|
|
49
|
+
role: "columnheader",
|
|
50
|
+
"aria-sort": canSort ? isSorted ? sort?.dir === "asc" ? "ascending" : "descending" : "none" : undefined,
|
|
51
|
+
tabIndex: canSort ? 0 : undefined,
|
|
52
|
+
"data-sortable": dataAttr(canSort),
|
|
53
|
+
"data-sorted": dataAttr(isSorted),
|
|
54
|
+
"data-sort-direction": isSorted ? sort?.dir : undefined,
|
|
55
|
+
onClick (event) {
|
|
56
|
+
if (event.defaultPrevented || !canSort || !columnKey) return;
|
|
57
|
+
toggleSort(columnKey);
|
|
58
|
+
},
|
|
59
|
+
onKeyDown (event) {
|
|
60
|
+
if (event.defaultPrevented || !canSort || !columnKey) return;
|
|
61
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
toggleSort(columnKey);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}, [
|
|
68
|
+
sort,
|
|
69
|
+
toggleSort
|
|
70
|
+
]);
|
|
71
|
+
return {
|
|
72
|
+
sort,
|
|
73
|
+
toggleSort,
|
|
74
|
+
getHeaderCellProps
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { useDataTableSort as u };
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@crispy-seed/data-table",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Self-contained, publishable build of seed-design's Attio-measured DataTable — one install, one CSS import.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/daangn/seed-design.git",
|
|
8
|
+
"directory": "packages/data-table-dist"
|
|
9
|
+
},
|
|
10
|
+
"license": "Apache-2.0",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"sideEffects": [
|
|
13
|
+
"*.css"
|
|
14
|
+
],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"require": "./dist/index.cjs"
|
|
20
|
+
},
|
|
21
|
+
"./styles.css": "./dist/styles.css",
|
|
22
|
+
"./data-table-recipe.css": "./dist/data-table-recipe.css",
|
|
23
|
+
"./data-table-recipe.layered.css": "./dist/data-table-recipe.layered.css",
|
|
24
|
+
"./package.json": "./package.json"
|
|
25
|
+
},
|
|
26
|
+
"main": "./dist/index.cjs",
|
|
27
|
+
"module": "./dist/index.js",
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE",
|
|
33
|
+
"NOTICE"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "bunchee --dts-bundle --external @seed-design/css/recipes/avatar,@seed-design/css/recipes/avatar-stack,@seed-design/css/recipes/badge,@seed-design/css/recipes/checkbox,@seed-design/css/recipes/checkbox-group,@seed-design/css/recipes/checkmark,@seed-design/css/recipes/menu,@seed-design/css/recipes/menu-item,@seed-design/css/recipes/segmented-control,@seed-design/css/recipes/select,@seed-design/css/recipes/select-item,@seed-design/css/recipes/select-trigger,@seed-design/css/recipes/switch,@seed-design/css/recipes/switchmark,@seed-design/css/recipes/text-input && node scripts/copy-css.mjs",
|
|
37
|
+
"clean": "rm -rf dist"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"react": ">=18",
|
|
41
|
+
"react-dom": ">=18",
|
|
42
|
+
"@seed-design/dom-utils": "^2.1.0",
|
|
43
|
+
"@seed-design/react-checkbox": "^2.0.1",
|
|
44
|
+
"@seed-design/react-field": "^2.0.1",
|
|
45
|
+
"@seed-design/react-image": "^1.1.0",
|
|
46
|
+
"@seed-design/react-menu": "^2.0.2",
|
|
47
|
+
"@seed-design/react-primitive": "^2.0.1",
|
|
48
|
+
"@seed-design/react-scale-feedback": "^1.0.0",
|
|
49
|
+
"@seed-design/react-segmented-control": "^2.0.2",
|
|
50
|
+
"@seed-design/react-select": "^1.0.1",
|
|
51
|
+
"@seed-design/react-switch": "^2.0.1",
|
|
52
|
+
"@seed-design/react-text-field": "^2.0.1"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@seed-design/css": "^2.8.0",
|
|
56
|
+
"@seed-design/dom-utils": "^2.1.0",
|
|
57
|
+
"@seed-design/react-checkbox": "^2.0.1",
|
|
58
|
+
"@seed-design/react-data-table": "^0.0.0",
|
|
59
|
+
"@seed-design/react-field": "^2.0.1",
|
|
60
|
+
"@seed-design/react-image": "^1.1.0",
|
|
61
|
+
"@seed-design/react-menu": "^2.0.2",
|
|
62
|
+
"@seed-design/react-primitive": "^2.0.1",
|
|
63
|
+
"@seed-design/react-scale-feedback": "^1.0.0",
|
|
64
|
+
"@seed-design/react-segmented-control": "^2.0.2",
|
|
65
|
+
"@seed-design/react-select": "^1.0.1",
|
|
66
|
+
"@seed-design/react-switch": "^2.0.1",
|
|
67
|
+
"@seed-design/react-text-field": "^2.0.1",
|
|
68
|
+
"@types/react": "^19.2.2",
|
|
69
|
+
"@types/react-dom": "^19.2.1",
|
|
70
|
+
"bunchee": "^6.6.2",
|
|
71
|
+
"react": "^19.1.0",
|
|
72
|
+
"react-dom": "^19.1.0"
|
|
73
|
+
},
|
|
74
|
+
"publishConfig": {
|
|
75
|
+
"access": "public",
|
|
76
|
+
"registry": "https://registry.npmjs.org/"
|
|
77
|
+
}
|
|
78
|
+
}
|