@dust-tt/sparkle 0.2.224 → 0.2.226
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/dist/cjs/index.js +293 -153
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/components/Breadcrumbs.d.ts +7 -6
- package/dist/esm/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/esm/components/Breadcrumbs.js +3 -2
- package/dist/esm/components/Breadcrumbs.js.map +1 -1
- package/dist/esm/components/DataTable.d.ts +5 -2
- package/dist/esm/components/DataTable.d.ts.map +1 -1
- package/dist/esm/components/DataTable.js +50 -33
- package/dist/esm/components/DataTable.js.map +1 -1
- package/dist/esm/components/DropdownMenu.d.ts +10 -10
- package/dist/esm/components/DropdownMenu.d.ts.map +1 -1
- package/dist/esm/components/DropdownMenu.js +7 -7
- package/dist/esm/components/DropdownMenu.js.map +1 -1
- package/dist/esm/components/Item.d.ts +18 -15
- package/dist/esm/components/Item.d.ts.map +1 -1
- package/dist/esm/components/Item.js +2 -1
- package/dist/esm/components/Item.js.map +1 -1
- package/dist/esm/components/PaginatedCitationsGrid.d.ts.map +1 -1
- package/dist/esm/components/PaginatedCitationsGrid.js +8 -4
- package/dist/esm/components/PaginatedCitationsGrid.js.map +1 -1
- package/dist/esm/components/Pagination.d.ts +5 -4
- package/dist/esm/components/Pagination.d.ts.map +1 -1
- package/dist/esm/components/Pagination.js +35 -35
- package/dist/esm/components/Pagination.js.map +1 -1
- package/dist/esm/hooks/index.d.ts +3 -0
- package/dist/esm/hooks/index.d.ts.map +1 -0
- package/dist/esm/hooks/index.js +3 -0
- package/dist/esm/hooks/index.js.map +1 -0
- package/dist/esm/hooks/useHashParams.d.ts +18 -0
- package/dist/esm/hooks/useHashParams.d.ts.map +1 -0
- package/dist/esm/hooks/useHashParams.js +67 -0
- package/dist/esm/hooks/useHashParams.js.map +1 -0
- package/dist/esm/hooks/usePaginationFromUrl.d.ts +6 -0
- package/dist/esm/hooks/usePaginationFromUrl.d.ts.map +1 -0
- package/dist/esm/hooks/usePaginationFromUrl.js +23 -0
- package/dist/esm/hooks/usePaginationFromUrl.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/stories/DataTable.stories.d.ts +2 -0
- package/dist/esm/stories/DataTable.stories.d.ts.map +1 -1
- package/dist/esm/stories/DataTable.stories.js +133 -105
- package/dist/esm/stories/DataTable.stories.js.map +1 -1
- package/dist/esm/stories/DropdownMenu.stories.d.ts.map +1 -1
- package/dist/esm/stories/DropdownMenu.stories.js +32 -31
- package/dist/esm/stories/DropdownMenu.stories.js.map +1 -1
- package/dist/esm/stories/Item.stories.d.ts.map +1 -1
- package/dist/esm/stories/Item.stories.js +8 -6
- package/dist/esm/stories/Item.stories.js.map +1 -1
- package/dist/esm/stories/Pagination.stories.d.ts +1 -0
- package/dist/esm/stories/Pagination.stories.d.ts.map +1 -1
- package/dist/esm/stories/Pagination.stories.js +25 -3
- package/dist/esm/stories/Pagination.stories.js.map +1 -1
- package/dist/sparkle.css +4 -0
- package/package.json +1 -1
- package/src/components/Breadcrumbs.tsx +11 -10
- package/src/components/DataTable.tsx +116 -81
- package/src/components/DropdownMenu.tsx +13 -13
- package/src/components/Item.tsx +20 -16
- package/src/components/PaginatedCitationsGrid.tsx +11 -6
- package/src/components/Pagination.tsx +48 -45
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useHashParams.ts +95 -0
- package/src/hooks/usePaginationFromUrl.ts +36 -0
- package/src/index.ts +1 -0
- package/src/stories/DataTable.stories.tsx +200 -129
- package/src/stories/DropdownMenu.stories.tsx +43 -31
- package/src/stories/Item.stories.tsx +26 -6
- package/src/stories/Pagination.stories.tsx +38 -10
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Original code from : https://www.npmjs.com/package/use-hash-param
|
|
3
|
+
* ISC License
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { useCallback, useEffect, useState } from "react";
|
|
7
|
+
|
|
8
|
+
const getHashSearchParams = (location: Location): [string, URLSearchParams] => {
|
|
9
|
+
const hash = location.hash.slice(1);
|
|
10
|
+
const [prefix, query] = hash.split("?");
|
|
11
|
+
|
|
12
|
+
return [prefix, new URLSearchParams(query)];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const getHashParam = (key: string, defaultValue?: string) => {
|
|
16
|
+
if (typeof window === "undefined") {
|
|
17
|
+
return defaultValue;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const [, searchParams] = getHashSearchParams(window.location);
|
|
21
|
+
|
|
22
|
+
return searchParams.get(key) ?? defaultValue;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const setHashParam = (
|
|
26
|
+
key: string,
|
|
27
|
+
value: string | undefined,
|
|
28
|
+
shouldReplaceState: boolean
|
|
29
|
+
) => {
|
|
30
|
+
if (typeof window !== "undefined") {
|
|
31
|
+
const [prefix, searchParams] = getHashSearchParams(window.location);
|
|
32
|
+
|
|
33
|
+
if (typeof value === "undefined" || value === "") {
|
|
34
|
+
searchParams.delete(key);
|
|
35
|
+
} else {
|
|
36
|
+
searchParams.set(key, value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const search = searchParams.toString();
|
|
40
|
+
const hash = search ? `${prefix}?${search}` : prefix;
|
|
41
|
+
if (shouldReplaceState && "replaceState" in history) {
|
|
42
|
+
history.replaceState(null, "", `#${hash}`);
|
|
43
|
+
} else {
|
|
44
|
+
window.location.hash = hash;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
type Updater = (prevValue?: string) => string;
|
|
50
|
+
type SetterOptions = {
|
|
51
|
+
history: "replace" | "push";
|
|
52
|
+
};
|
|
53
|
+
type Setter = (value?: string | Updater, options?: SetterOptions) => void;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @param key The parameter-name to use from the hash-string query string.
|
|
57
|
+
* @param defaultValue A default value to use if the parameter is not specified and on the server.
|
|
58
|
+
* @returns A two-tuple, the first element is the selected param value (either extracted from the hash param or the default value).
|
|
59
|
+
* The second element is a setter function to change the param value.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
export const useHashParam = (
|
|
63
|
+
key: string,
|
|
64
|
+
defaultValue?: string
|
|
65
|
+
): [string | undefined, Setter] => {
|
|
66
|
+
const [innerValue, setInnerValue] = useState<string | undefined>(() =>
|
|
67
|
+
getHashParam(key, defaultValue)
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
const handleHashChange = () =>
|
|
72
|
+
setInnerValue(getHashParam(key, defaultValue));
|
|
73
|
+
handleHashChange();
|
|
74
|
+
window.addEventListener("hashchange", handleHashChange);
|
|
75
|
+
return () => window.removeEventListener("hashchange", handleHashChange);
|
|
76
|
+
}, [key]);
|
|
77
|
+
|
|
78
|
+
const setValue = useCallback<Setter>(
|
|
79
|
+
(
|
|
80
|
+
newValue?: string | Updater,
|
|
81
|
+
options: SetterOptions = { history: "replace" }
|
|
82
|
+
) => {
|
|
83
|
+
const newInnerValue =
|
|
84
|
+
typeof newValue === "function"
|
|
85
|
+
? newValue(getHashParam(key, defaultValue))
|
|
86
|
+
: newValue;
|
|
87
|
+
|
|
88
|
+
setInnerValue(newInnerValue);
|
|
89
|
+
setHashParam(key, newInnerValue, options.history === "replace");
|
|
90
|
+
},
|
|
91
|
+
[key]
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
return [innerValue || defaultValue, setValue];
|
|
95
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PaginationState } from "@tanstack/react-table";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
import { useHashParam } from "@sparkle/hooks/useHashParams";
|
|
5
|
+
|
|
6
|
+
const defaultPageSize = 25;
|
|
7
|
+
|
|
8
|
+
export const usePaginationFromUrl = (
|
|
9
|
+
urlPrefix?: string,
|
|
10
|
+
initialPageSize = defaultPageSize
|
|
11
|
+
) => {
|
|
12
|
+
const [pageIndexParam, setPageIndexParam] = useHashParam(
|
|
13
|
+
urlPrefix ? `${urlPrefix}PageIndex` : "pageIndex"
|
|
14
|
+
);
|
|
15
|
+
const [pageSizeParam, setPageSizeParam] = useHashParam(
|
|
16
|
+
urlPrefix ? `${urlPrefix}PageSize` : "pageSize"
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
const pageIndex = pageIndexParam ? parseInt(pageIndexParam) : 0;
|
|
20
|
+
const pageSize = pageSizeParam ? parseInt(pageSizeParam) : initialPageSize;
|
|
21
|
+
|
|
22
|
+
const res = useMemo(() => {
|
|
23
|
+
const pagination: PaginationState = { pageIndex, pageSize };
|
|
24
|
+
|
|
25
|
+
const setPagination = (newValue: PaginationState) => {
|
|
26
|
+
if (newValue.pageIndex !== pageIndex || newValue.pageSize !== pageSize) {
|
|
27
|
+
setPageIndexParam(newValue.pageIndex.toString());
|
|
28
|
+
setPageSizeParam(newValue.pageSize.toString());
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return { pagination, setPagination };
|
|
33
|
+
}, [pageIndex, pageSize, urlPrefix]);
|
|
34
|
+
|
|
35
|
+
return res;
|
|
36
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Meta } from "@storybook/react";
|
|
2
|
-
import { ColumnDef } from "@tanstack/react-table";
|
|
3
|
-
import React from "react";
|
|
2
|
+
import { ColumnDef, PaginationState } from "@tanstack/react-table";
|
|
3
|
+
import React, { useMemo } from "react";
|
|
4
4
|
|
|
5
5
|
import { DropdownItemProps } from "@sparkle/components/DropdownMenu";
|
|
6
|
+
import { Input } from "@sparkle/components/Input";
|
|
6
7
|
|
|
7
8
|
import { DataTable, FolderIcon } from "../index_with_tw_base";
|
|
8
9
|
|
|
@@ -28,140 +29,210 @@ type Data = {
|
|
|
28
29
|
roundedAvatar?: boolean;
|
|
29
30
|
};
|
|
30
31
|
|
|
32
|
+
const data: Data[] = [
|
|
33
|
+
{
|
|
34
|
+
name: "Soupinou with tooltip on avatar",
|
|
35
|
+
usedBy: 100,
|
|
36
|
+
addedBy: "User1",
|
|
37
|
+
lastUpdated: "July 8, 2023",
|
|
38
|
+
size: "32kb",
|
|
39
|
+
avatarUrl: "https://avatars.githubusercontent.com/u/138893015?s=200&v=4",
|
|
40
|
+
avatarTooltipLabel: "Meow",
|
|
41
|
+
roundedAvatar: true,
|
|
42
|
+
onClick: () => console.log("hehe"),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "Marketing",
|
|
46
|
+
description: "(23 items)",
|
|
47
|
+
usedBy: 8,
|
|
48
|
+
addedBy: "User1",
|
|
49
|
+
lastUpdated: "July 8, 2023",
|
|
50
|
+
size: "32kb",
|
|
51
|
+
avatarUrl: "https://dust.tt/static/droidavatar/Droid_Lime_3.jpg",
|
|
52
|
+
roundedAvatar: true,
|
|
53
|
+
onClick: () => alert("Marketing clicked"),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "Design",
|
|
57
|
+
usedBy: 2,
|
|
58
|
+
addedBy: "User2",
|
|
59
|
+
lastUpdated: "2023-07-09",
|
|
60
|
+
size: "64kb",
|
|
61
|
+
icon: FolderIcon,
|
|
62
|
+
moreMenuItems: [
|
|
63
|
+
{
|
|
64
|
+
label: "Edit (disabled)",
|
|
65
|
+
onClick: () => alert("Design menu clicked"),
|
|
66
|
+
disabled: true,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
onClick: () => alert("Design clicked"),
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: "design",
|
|
73
|
+
usedBy: 3,
|
|
74
|
+
addedBy: "User21",
|
|
75
|
+
lastUpdated: "2023-07-09",
|
|
76
|
+
size: "64kb",
|
|
77
|
+
icon: FolderIcon,
|
|
78
|
+
moreMenuItems: [
|
|
79
|
+
{
|
|
80
|
+
label: "Edit",
|
|
81
|
+
onClick: () => alert("Design menu clicked"),
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "Development",
|
|
87
|
+
usedBy: 5,
|
|
88
|
+
addedBy: "User3",
|
|
89
|
+
lastUpdated: "2023-07-07",
|
|
90
|
+
size: "128kb",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "Sales",
|
|
94
|
+
usedBy: 10,
|
|
95
|
+
addedBy: "User4",
|
|
96
|
+
lastUpdated: "2023-07-10",
|
|
97
|
+
size: "16kb",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "HR",
|
|
101
|
+
usedBy: 3,
|
|
102
|
+
addedBy: "User5",
|
|
103
|
+
lastUpdated: "2023-07-06",
|
|
104
|
+
size: "48kb",
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
const columns: ColumnDef<Data>[] = [
|
|
109
|
+
{
|
|
110
|
+
accessorKey: "name",
|
|
111
|
+
header: "Name",
|
|
112
|
+
sortingFn: "text",
|
|
113
|
+
cell: (info) => (
|
|
114
|
+
<DataTable.CellContent
|
|
115
|
+
avatarUrl={info.row.original.avatarUrl}
|
|
116
|
+
avatarTooltipLabel={info.row.original.avatarTooltipLabel}
|
|
117
|
+
icon={info.row.original.icon}
|
|
118
|
+
description={info.row.original.description}
|
|
119
|
+
roundedAvatar={info.row.original.roundedAvatar}
|
|
120
|
+
>
|
|
121
|
+
{info.row.original.name}
|
|
122
|
+
</DataTable.CellContent>
|
|
123
|
+
),
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
accessorKey: "usedBy",
|
|
127
|
+
header: "Used by",
|
|
128
|
+
cell: (info) => (
|
|
129
|
+
<DataTable.CellContent>{info.row.original.usedBy}</DataTable.CellContent>
|
|
130
|
+
),
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
accessorKey: "addedBy",
|
|
134
|
+
header: "Added by",
|
|
135
|
+
cell: (info) => (
|
|
136
|
+
<DataTable.CellContent>{info.row.original.addedBy}</DataTable.CellContent>
|
|
137
|
+
),
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
accessorKey: "lastUpdated",
|
|
141
|
+
header: "Last updated",
|
|
142
|
+
cell: (info) => (
|
|
143
|
+
<DataTable.CellContent>
|
|
144
|
+
{info.row.original.lastUpdated}
|
|
145
|
+
</DataTable.CellContent>
|
|
146
|
+
),
|
|
147
|
+
enableSorting: false,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
accessorKey: "size",
|
|
151
|
+
header: "Size",
|
|
152
|
+
cell: (info) => (
|
|
153
|
+
<DataTable.CellContent>{info.row.original.size}</DataTable.CellContent>
|
|
154
|
+
),
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
|
|
31
158
|
export const DataTableExample = () => {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
avatarUrl: "https://dust.tt/static/droidavatar/Droid_Lime_3.jpg",
|
|
52
|
-
roundedAvatar: true,
|
|
53
|
-
onClick: () => console.log("hehe"),
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: "Design",
|
|
57
|
-
usedBy: 2,
|
|
58
|
-
addedBy: "User2",
|
|
59
|
-
lastUpdated: "2023-07-09",
|
|
60
|
-
size: "64kb",
|
|
61
|
-
icon: FolderIcon,
|
|
62
|
-
moreMenuItems: [
|
|
63
|
-
{
|
|
64
|
-
label: "Edit (disabled)",
|
|
65
|
-
onClick: () => console.log("Edit"),
|
|
66
|
-
disabled: true,
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: "design",
|
|
72
|
-
usedBy: 3,
|
|
73
|
-
addedBy: "User21",
|
|
74
|
-
lastUpdated: "2023-07-09",
|
|
75
|
-
size: "64kb",
|
|
76
|
-
icon: FolderIcon,
|
|
77
|
-
moreMenuItems: [
|
|
78
|
-
{
|
|
79
|
-
label: "Edit",
|
|
80
|
-
onClick: () => console.log("Edit"),
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
name: "Development",
|
|
86
|
-
usedBy: 5,
|
|
87
|
-
addedBy: "User3",
|
|
88
|
-
lastUpdated: "2023-07-07",
|
|
89
|
-
size: "128kb",
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
name: "Sales",
|
|
93
|
-
usedBy: 10,
|
|
94
|
-
addedBy: "User4",
|
|
95
|
-
lastUpdated: "2023-07-10",
|
|
96
|
-
size: "16kb",
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: "HR",
|
|
100
|
-
usedBy: 3,
|
|
101
|
-
addedBy: "User5",
|
|
102
|
-
lastUpdated: "2023-07-06",
|
|
103
|
-
size: "48kb",
|
|
104
|
-
},
|
|
105
|
-
];
|
|
159
|
+
const [filter, setFilter] = React.useState<string>("");
|
|
160
|
+
|
|
161
|
+
return (
|
|
162
|
+
<div className="s-w-full s-max-w-4xl s-overflow-x-auto">
|
|
163
|
+
<Input
|
|
164
|
+
name="filter"
|
|
165
|
+
placeholder="Filter"
|
|
166
|
+
value={filter}
|
|
167
|
+
onChange={(v) => setFilter(v)}
|
|
168
|
+
/>
|
|
169
|
+
<DataTable
|
|
170
|
+
data={data}
|
|
171
|
+
filter={filter}
|
|
172
|
+
filterColumn="name"
|
|
173
|
+
columns={columns}
|
|
174
|
+
/>
|
|
175
|
+
</div>
|
|
176
|
+
);
|
|
177
|
+
};
|
|
106
178
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
<DataTable.CellContent
|
|
114
|
-
avatarUrl={info.row.original.avatarUrl}
|
|
115
|
-
avatarTooltipLabel={info.row.original.avatarTooltipLabel}
|
|
116
|
-
icon={info.row.original.icon}
|
|
117
|
-
description={info.row.original.description}
|
|
118
|
-
roundedAvatar={info.row.original.roundedAvatar}
|
|
119
|
-
>
|
|
120
|
-
{info.row.original.name}
|
|
121
|
-
</DataTable.CellContent>
|
|
122
|
-
),
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
accessorKey: "usedBy",
|
|
126
|
-
header: "Used by",
|
|
127
|
-
cell: (info) => (
|
|
128
|
-
<DataTable.CellContent>
|
|
129
|
-
{info.row.original.usedBy}
|
|
130
|
-
</DataTable.CellContent>
|
|
131
|
-
),
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
accessorKey: "addedBy",
|
|
135
|
-
header: "Added by",
|
|
136
|
-
cell: (info) => (
|
|
137
|
-
<DataTable.CellContent>
|
|
138
|
-
{info.row.original.addedBy}
|
|
139
|
-
</DataTable.CellContent>
|
|
140
|
-
),
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
accessorKey: "lastUpdated",
|
|
144
|
-
header: "Last updated",
|
|
145
|
-
cell: (info) => (
|
|
146
|
-
<DataTable.CellContent>
|
|
147
|
-
{info.row.original.lastUpdated}
|
|
148
|
-
</DataTable.CellContent>
|
|
149
|
-
),
|
|
150
|
-
enableSorting: false,
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
accessorKey: "size",
|
|
154
|
-
header: "Size",
|
|
155
|
-
cell: (info) => (
|
|
156
|
-
<DataTable.CellContent>{info.row.original.size}</DataTable.CellContent>
|
|
157
|
-
),
|
|
158
|
-
},
|
|
159
|
-
];
|
|
179
|
+
export const DataTablePaginatedExample = () => {
|
|
180
|
+
const [pagination, setPagination] = React.useState<PaginationState>({
|
|
181
|
+
pageIndex: 0,
|
|
182
|
+
pageSize: 2,
|
|
183
|
+
});
|
|
184
|
+
const [filter, setFilter] = React.useState<string>("");
|
|
160
185
|
|
|
161
186
|
return (
|
|
162
187
|
<div className="s-w-full s-max-w-4xl s-overflow-x-auto">
|
|
188
|
+
<Input
|
|
189
|
+
name="filter"
|
|
190
|
+
placeholder="Filter"
|
|
191
|
+
value={filter}
|
|
192
|
+
onChange={(v) => setFilter(v)}
|
|
193
|
+
/>
|
|
163
194
|
<DataTable
|
|
164
195
|
data={data}
|
|
196
|
+
filter={filter}
|
|
197
|
+
filterColumn="name"
|
|
198
|
+
pagination={pagination}
|
|
199
|
+
setPagination={setPagination}
|
|
200
|
+
columns={columns}
|
|
201
|
+
initialColumnOrder={[{ id: "name", desc: false }]}
|
|
202
|
+
columnsBreakpoints={{ lastUpdated: "sm" }}
|
|
203
|
+
/>
|
|
204
|
+
</div>
|
|
205
|
+
);
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
export const DataTablePaginatedServerSideExample = () => {
|
|
209
|
+
const [pagination, setPagination] = React.useState<PaginationState>({
|
|
210
|
+
pageIndex: 0,
|
|
211
|
+
pageSize: 2,
|
|
212
|
+
});
|
|
213
|
+
const [filter, setFilter] = React.useState<string>("");
|
|
214
|
+
const rows = useMemo(() => {
|
|
215
|
+
return data.slice(
|
|
216
|
+
pagination.pageIndex * pagination.pageSize,
|
|
217
|
+
(pagination.pageIndex + 1) * pagination.pageSize
|
|
218
|
+
);
|
|
219
|
+
}, [data, pagination]);
|
|
220
|
+
|
|
221
|
+
return (
|
|
222
|
+
<div className="s-w-full s-max-w-4xl s-overflow-x-auto">
|
|
223
|
+
<Input
|
|
224
|
+
name="filter"
|
|
225
|
+
placeholder="Filter"
|
|
226
|
+
value={filter}
|
|
227
|
+
onChange={(v) => setFilter(v)}
|
|
228
|
+
/>
|
|
229
|
+
<DataTable
|
|
230
|
+
data={rows}
|
|
231
|
+
totalRowCount={data.length}
|
|
232
|
+
filter={filter}
|
|
233
|
+
filterColumn="name"
|
|
234
|
+
pagination={pagination}
|
|
235
|
+
setPagination={setPagination}
|
|
165
236
|
columns={columns}
|
|
166
237
|
initialColumnOrder={[{ id: "name", desc: false }]}
|
|
167
238
|
columnsBreakpoints={{ lastUpdated: "sm" }}
|
|
@@ -51,44 +51,53 @@ export const DropdownExample = () => {
|
|
|
51
51
|
<DropdownMenu.Button label="Action" />
|
|
52
52
|
<DropdownMenu.Items width={220}>
|
|
53
53
|
<DropdownMenu.SectionHeader label="Edition" />
|
|
54
|
-
<DropdownMenu.Item
|
|
54
|
+
<DropdownMenu.Item
|
|
55
|
+
label="Edit"
|
|
56
|
+
link={{ href: "#" }}
|
|
57
|
+
icon={PencilSquareIcon}
|
|
58
|
+
/>
|
|
55
59
|
<DropdownMenu.Item
|
|
56
60
|
label="Duplicate (New)"
|
|
57
|
-
href
|
|
61
|
+
link={{ href: "#" }}
|
|
58
62
|
icon={ClipboardIcon}
|
|
59
63
|
/>
|
|
60
64
|
<DropdownMenu.Item
|
|
61
65
|
label="Archive"
|
|
62
|
-
href
|
|
66
|
+
link={{ href: "#" }}
|
|
63
67
|
icon={TrashIcon}
|
|
64
68
|
variant="warning"
|
|
65
69
|
/>
|
|
70
|
+
<DropdownMenu.Item
|
|
71
|
+
label="Dust site"
|
|
72
|
+
link={{ href: "https://dust.tt", target: "_blank" }}
|
|
73
|
+
icon={EyeIcon}
|
|
74
|
+
/>
|
|
66
75
|
<DropdownMenu.SectionHeader label="Sharing" />
|
|
67
76
|
<DropdownMenu.Item
|
|
68
77
|
label="Company Assistant"
|
|
69
|
-
href
|
|
78
|
+
link={{ href: "#" }}
|
|
70
79
|
icon={PlanetIcon}
|
|
71
80
|
/>
|
|
72
81
|
<DropdownMenu.Item
|
|
73
82
|
label="Shared Assistant"
|
|
74
|
-
href
|
|
83
|
+
link={{ href: "#" }}
|
|
75
84
|
selected
|
|
76
85
|
icon={UserGroupIcon}
|
|
77
86
|
/>
|
|
78
87
|
<DropdownMenu.Item
|
|
79
88
|
label="Personal Assistant"
|
|
80
|
-
href
|
|
89
|
+
link={{ href: "#" }}
|
|
81
90
|
icon={LockIcon}
|
|
82
91
|
/>
|
|
83
92
|
<DropdownMenu.SectionHeader label="My Assistants" />
|
|
84
93
|
<DropdownMenu.Item
|
|
85
94
|
label="Add to my list"
|
|
86
|
-
href
|
|
95
|
+
link={{ href: "#" }}
|
|
87
96
|
icon={ListAddIcon}
|
|
88
97
|
/>
|
|
89
98
|
<DropdownMenu.Item
|
|
90
99
|
label="Remove from my list"
|
|
91
|
-
href
|
|
100
|
+
link={{ href: "#" }}
|
|
92
101
|
icon={ListRemoveIcon}
|
|
93
102
|
/>
|
|
94
103
|
</DropdownMenu.Items>
|
|
@@ -305,11 +314,14 @@ export const DropdownExample = () => {
|
|
|
305
314
|
tooltipPosition="below"
|
|
306
315
|
/>
|
|
307
316
|
<DropdownMenu.Items origin="topLeft" width={120}>
|
|
308
|
-
<DropdownMenu.Item label="item 1 is longish" href
|
|
309
|
-
<DropdownMenu.Item
|
|
317
|
+
<DropdownMenu.Item label="item 1 is longish" link={{ href: "#" }} />
|
|
318
|
+
<DropdownMenu.Item
|
|
319
|
+
label="item 2 is also longer"
|
|
320
|
+
link={{ href: "#" }}
|
|
321
|
+
/>
|
|
310
322
|
<DropdownMenu.Item
|
|
311
323
|
label="item with a long title because it is long"
|
|
312
|
-
href
|
|
324
|
+
link={{ href: "#" }}
|
|
313
325
|
/>
|
|
314
326
|
</DropdownMenu.Items>
|
|
315
327
|
</DropdownMenu>
|
|
@@ -320,8 +332,8 @@ export const DropdownExample = () => {
|
|
|
320
332
|
<DropdownMenu>
|
|
321
333
|
<DropdownMenu.Button label="Moonlab" icon={PlanetIcon} />
|
|
322
334
|
<DropdownMenu.Items>
|
|
323
|
-
<DropdownMenu.Item label="item 1" href
|
|
324
|
-
<DropdownMenu.Item label="item 2" href
|
|
335
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
336
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
325
337
|
</DropdownMenu.Items>
|
|
326
338
|
</DropdownMenu>
|
|
327
339
|
</div>
|
|
@@ -331,8 +343,8 @@ export const DropdownExample = () => {
|
|
|
331
343
|
<DropdownMenu>
|
|
332
344
|
<DropdownMenu.Button label="Moonlab" icon={PlanetIcon} size="md" />
|
|
333
345
|
<DropdownMenu.Items>
|
|
334
|
-
<DropdownMenu.Item label="item 1" href
|
|
335
|
-
<DropdownMenu.Item label="item 2" href
|
|
346
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
347
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
336
348
|
</DropdownMenu.Items>
|
|
337
349
|
</DropdownMenu>
|
|
338
350
|
</div>
|
|
@@ -346,11 +358,11 @@ export const DropdownExample = () => {
|
|
|
346
358
|
tooltipPosition="below"
|
|
347
359
|
/>
|
|
348
360
|
<DropdownMenu.Items origin="topLeft">
|
|
349
|
-
<DropdownMenu.Item label="item 1" href
|
|
350
|
-
<DropdownMenu.Item label="item 2" href
|
|
361
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
362
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
351
363
|
<DropdownMenu.Item
|
|
352
364
|
label="item 2 with a long title because it is long"
|
|
353
|
-
href
|
|
365
|
+
link={{ href: "#" }}
|
|
354
366
|
/>
|
|
355
367
|
</DropdownMenu.Items>
|
|
356
368
|
</DropdownMenu>
|
|
@@ -361,8 +373,8 @@ export const DropdownExample = () => {
|
|
|
361
373
|
<DropdownMenu>
|
|
362
374
|
<DropdownMenu.Button icon={ChatBubbleBottomCenterTextIcon} />
|
|
363
375
|
<DropdownMenu.Items origin="bottomLeft">
|
|
364
|
-
<DropdownMenu.Item label="item 1" href
|
|
365
|
-
<DropdownMenu.Item label="item 2" href
|
|
376
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
377
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
366
378
|
</DropdownMenu.Items>
|
|
367
379
|
</DropdownMenu>
|
|
368
380
|
</div>
|
|
@@ -372,8 +384,8 @@ export const DropdownExample = () => {
|
|
|
372
384
|
<DropdownMenu>
|
|
373
385
|
<DropdownMenu.Button icon={ChatBubbleBottomCenterTextIcon} />
|
|
374
386
|
<DropdownMenu.Items origin="bottomRight">
|
|
375
|
-
<DropdownMenu.Item label="item 1" href
|
|
376
|
-
<DropdownMenu.Item label="item 2" href
|
|
387
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
388
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
377
389
|
</DropdownMenu.Items>
|
|
378
390
|
</DropdownMenu>
|
|
379
391
|
</div>
|
|
@@ -387,8 +399,8 @@ export const DropdownExample = () => {
|
|
|
387
399
|
disabled
|
|
388
400
|
/>
|
|
389
401
|
<DropdownMenu.Items>
|
|
390
|
-
<DropdownMenu.Item label="item 1" href
|
|
391
|
-
<DropdownMenu.Item label="item 2" href
|
|
402
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
403
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
392
404
|
</DropdownMenu.Items>
|
|
393
405
|
</DropdownMenu>
|
|
394
406
|
</div>
|
|
@@ -398,8 +410,8 @@ export const DropdownExample = () => {
|
|
|
398
410
|
<DropdownMenu>
|
|
399
411
|
<DropdownMenu.Button type="select" label="Every 6 months" />
|
|
400
412
|
<DropdownMenu.Items origin="topRight">
|
|
401
|
-
<DropdownMenu.Item label="item 1" href
|
|
402
|
-
<DropdownMenu.Item label="item 2" href
|
|
413
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
414
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
403
415
|
</DropdownMenu.Items>
|
|
404
416
|
</DropdownMenu>
|
|
405
417
|
</div>
|
|
@@ -413,7 +425,7 @@ export const DropdownExample = () => {
|
|
|
413
425
|
</DropdownMenu.Button>
|
|
414
426
|
<DropdownMenu.Items origin="topRight">
|
|
415
427
|
{["item 1", "item 2", "item 3"].map((item) => (
|
|
416
|
-
<DropdownMenu.Item label={item} href
|
|
428
|
+
<DropdownMenu.Item label={item} link={{ href: "#" }} key={item} />
|
|
417
429
|
))}
|
|
418
430
|
</DropdownMenu.Items>
|
|
419
431
|
</DropdownMenu>
|
|
@@ -486,8 +498,8 @@ export const DropdownExample = () => {
|
|
|
486
498
|
<DropdownMenu>
|
|
487
499
|
<DropdownMenu.Button label="Nested" />
|
|
488
500
|
<DropdownMenu.Items origin="topRight">
|
|
489
|
-
<DropdownMenu.Item label="item 1" href
|
|
490
|
-
<DropdownMenu.Item label="item 2" href
|
|
501
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
502
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
491
503
|
</DropdownMenu.Items>
|
|
492
504
|
</DropdownMenu>
|
|
493
505
|
</DropdownMenu.Items>
|
|
@@ -498,8 +510,8 @@ export const DropdownExample = () => {
|
|
|
498
510
|
<DropdownMenu>
|
|
499
511
|
<DropdownMenu.Button label="Moonlab" icon={PlanetIcon} />
|
|
500
512
|
<DropdownMenu.Items origin="auto">
|
|
501
|
-
<DropdownMenu.Item label="item 1" href
|
|
502
|
-
<DropdownMenu.Item label="item 2" href
|
|
513
|
+
<DropdownMenu.Item label="item 1" link={{ href: "#" }} />
|
|
514
|
+
<DropdownMenu.Item label="item 2" link={{ href: "#" }} />
|
|
503
515
|
</DropdownMenu.Items>
|
|
504
516
|
</DropdownMenu>
|
|
505
517
|
</div>
|