@dust-tt/sparkle 0.2.225 → 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.
Files changed (48) hide show
  1. package/dist/cjs/index.js +283 -113
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/esm/components/DataTable.d.ts +5 -2
  4. package/dist/esm/components/DataTable.d.ts.map +1 -1
  5. package/dist/esm/components/DataTable.js +48 -29
  6. package/dist/esm/components/DataTable.js.map +1 -1
  7. package/dist/esm/components/PaginatedCitationsGrid.d.ts.map +1 -1
  8. package/dist/esm/components/PaginatedCitationsGrid.js +8 -4
  9. package/dist/esm/components/PaginatedCitationsGrid.js.map +1 -1
  10. package/dist/esm/components/Pagination.d.ts +5 -4
  11. package/dist/esm/components/Pagination.d.ts.map +1 -1
  12. package/dist/esm/components/Pagination.js +35 -35
  13. package/dist/esm/components/Pagination.js.map +1 -1
  14. package/dist/esm/hooks/index.d.ts +3 -0
  15. package/dist/esm/hooks/index.d.ts.map +1 -0
  16. package/dist/esm/hooks/index.js +3 -0
  17. package/dist/esm/hooks/index.js.map +1 -0
  18. package/dist/esm/hooks/useHashParams.d.ts +18 -0
  19. package/dist/esm/hooks/useHashParams.d.ts.map +1 -0
  20. package/dist/esm/hooks/useHashParams.js +67 -0
  21. package/dist/esm/hooks/useHashParams.js.map +1 -0
  22. package/dist/esm/hooks/usePaginationFromUrl.d.ts +6 -0
  23. package/dist/esm/hooks/usePaginationFromUrl.d.ts.map +1 -0
  24. package/dist/esm/hooks/usePaginationFromUrl.js +23 -0
  25. package/dist/esm/hooks/usePaginationFromUrl.js.map +1 -0
  26. package/dist/esm/index.d.ts +1 -0
  27. package/dist/esm/index.d.ts.map +1 -1
  28. package/dist/esm/index.js +1 -0
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/stories/DataTable.stories.d.ts +2 -0
  31. package/dist/esm/stories/DataTable.stories.d.ts.map +1 -1
  32. package/dist/esm/stories/DataTable.stories.js +133 -106
  33. package/dist/esm/stories/DataTable.stories.js.map +1 -1
  34. package/dist/esm/stories/Pagination.stories.d.ts +1 -0
  35. package/dist/esm/stories/Pagination.stories.d.ts.map +1 -1
  36. package/dist/esm/stories/Pagination.stories.js +25 -3
  37. package/dist/esm/stories/Pagination.stories.js.map +1 -1
  38. package/dist/sparkle.css +4 -0
  39. package/package.json +1 -1
  40. package/src/components/DataTable.tsx +114 -75
  41. package/src/components/PaginatedCitationsGrid.tsx +11 -6
  42. package/src/components/Pagination.tsx +48 -45
  43. package/src/hooks/index.ts +2 -0
  44. package/src/hooks/useHashParams.ts +95 -0
  45. package/src/hooks/usePaginationFromUrl.ts +36 -0
  46. package/src/index.ts +1 -0
  47. package/src/stories/DataTable.stories.tsx +200 -130
  48. package/src/stories/Pagination.stories.tsx +38 -10
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"}
@@ -6,4 +6,6 @@ declare const meta: {
6
6
  };
7
7
  export default meta;
8
8
  export declare const DataTableExample: () => React.JSX.Element;
9
+ export declare const DataTablePaginatedExample: () => React.JSX.Element;
10
+ export declare const DataTablePaginatedServerSideExample: () => React.JSX.Element;
9
11
  //# sourceMappingURL=DataTable.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/DataTable.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,SAAS,EAAc,MAAM,uBAAuB,CAAC;AAE9D,QAAA,MAAM,IAAI;;;CAGwB,CAAC;AAEnC,eAAe,IAAI,CAAC;AAiBpB,eAAO,MAAM,gBAAgB,yBA6I5B,CAAC"}
1
+ {"version":3,"file":"DataTable.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/DataTable.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,OAAO,EAAE,SAAS,EAAc,MAAM,uBAAuB,CAAC;AAE9D,QAAA,MAAM,IAAI;;;CAGwB,CAAC;AAEnC,eAAe,IAAI,CAAC;AA+IpB,eAAO,MAAM,gBAAgB,yBAmB5B,CAAC;AAEF,eAAO,MAAM,yBAAyB,yBA2BrC,CAAC;AAEF,eAAO,MAAM,mCAAmC,yBAkC/C,CAAC"}
@@ -1,116 +1,143 @@
1
- import React from "react";
1
+ import { __read } from "tslib";
2
+ import React, { useMemo } from "react";
3
+ import { Input } from "../components/Input";
2
4
  import { DataTable, FolderIcon } from "../index_with_tw_base";
3
5
  var meta = {
4
6
  title: "Components/DataTable",
5
7
  component: DataTable,
6
8
  };
7
9
  export default meta;
10
+ var data = [
11
+ {
12
+ name: "Soupinou with tooltip on avatar",
13
+ usedBy: 100,
14
+ addedBy: "User1",
15
+ lastUpdated: "July 8, 2023",
16
+ size: "32kb",
17
+ avatarUrl: "https://avatars.githubusercontent.com/u/138893015?s=200&v=4",
18
+ avatarTooltipLabel: "Meow",
19
+ roundedAvatar: true,
20
+ onClick: function () { return console.log("hehe"); },
21
+ },
22
+ {
23
+ name: "Marketing",
24
+ description: "(23 items)",
25
+ usedBy: 8,
26
+ addedBy: "User1",
27
+ lastUpdated: "July 8, 2023",
28
+ size: "32kb",
29
+ avatarUrl: "https://dust.tt/static/droidavatar/Droid_Lime_3.jpg",
30
+ roundedAvatar: true,
31
+ onClick: function () { return alert("Marketing clicked"); },
32
+ },
33
+ {
34
+ name: "Design",
35
+ usedBy: 2,
36
+ addedBy: "User2",
37
+ lastUpdated: "2023-07-09",
38
+ size: "64kb",
39
+ icon: FolderIcon,
40
+ moreMenuItems: [
41
+ {
42
+ label: "Edit (disabled)",
43
+ onClick: function () { return alert("Design menu clicked"); },
44
+ disabled: true,
45
+ },
46
+ ],
47
+ onClick: function () { return alert("Design clicked"); },
48
+ },
49
+ {
50
+ name: "design",
51
+ usedBy: 3,
52
+ addedBy: "User21",
53
+ lastUpdated: "2023-07-09",
54
+ size: "64kb",
55
+ icon: FolderIcon,
56
+ moreMenuItems: [
57
+ {
58
+ label: "Edit",
59
+ onClick: function () { return alert("Design menu clicked"); },
60
+ },
61
+ ],
62
+ },
63
+ {
64
+ name: "Development",
65
+ usedBy: 5,
66
+ addedBy: "User3",
67
+ lastUpdated: "2023-07-07",
68
+ size: "128kb",
69
+ },
70
+ {
71
+ name: "Sales",
72
+ usedBy: 10,
73
+ addedBy: "User4",
74
+ lastUpdated: "2023-07-10",
75
+ size: "16kb",
76
+ },
77
+ {
78
+ name: "HR",
79
+ usedBy: 3,
80
+ addedBy: "User5",
81
+ lastUpdated: "2023-07-06",
82
+ size: "48kb",
83
+ },
84
+ ];
85
+ var columns = [
86
+ {
87
+ accessorKey: "name",
88
+ header: "Name",
89
+ sortingFn: "text",
90
+ cell: function (info) { return (React.createElement(DataTable.CellContent, { avatarUrl: info.row.original.avatarUrl, avatarTooltipLabel: info.row.original.avatarTooltipLabel, icon: info.row.original.icon, description: info.row.original.description, roundedAvatar: info.row.original.roundedAvatar }, info.row.original.name)); },
91
+ },
92
+ {
93
+ accessorKey: "usedBy",
94
+ header: "Used by",
95
+ cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.usedBy)); },
96
+ },
97
+ {
98
+ accessorKey: "addedBy",
99
+ header: "Added by",
100
+ cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.addedBy)); },
101
+ },
102
+ {
103
+ accessorKey: "lastUpdated",
104
+ header: "Last updated",
105
+ cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.lastUpdated)); },
106
+ enableSorting: false,
107
+ },
108
+ {
109
+ accessorKey: "size",
110
+ header: "Size",
111
+ cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.size)); },
112
+ },
113
+ ];
8
114
  export var DataTableExample = function () {
9
- var data = [
10
- {
11
- name: "Soupinou with tooltip on avatar",
12
- usedBy: 100,
13
- addedBy: "User1",
14
- lastUpdated: "July 8, 2023",
15
- size: "32kb",
16
- avatarUrl: "https://avatars.githubusercontent.com/u/138893015?s=200&v=4",
17
- avatarTooltipLabel: "Meow",
18
- roundedAvatar: true,
19
- onClick: function () { return console.log("hehe"); },
20
- },
21
- {
22
- name: "Marketing",
23
- description: "(23 items)",
24
- usedBy: 8,
25
- addedBy: "User1",
26
- lastUpdated: "July 8, 2023",
27
- size: "32kb",
28
- avatarUrl: "https://dust.tt/static/droidavatar/Droid_Lime_3.jpg",
29
- roundedAvatar: true,
30
- onClick: function () { return alert("Marketing clicked"); },
31
- },
32
- {
33
- name: "Design",
34
- usedBy: 2,
35
- addedBy: "User2",
36
- lastUpdated: "2023-07-09",
37
- size: "64kb",
38
- icon: FolderIcon,
39
- moreMenuItems: [
40
- {
41
- label: "Edit (disabled)",
42
- onClick: function () { return alert("Design menu clicked"); },
43
- disabled: true,
44
- },
45
- ],
46
- onClick: function () { return alert("Design clicked"); },
47
- },
48
- {
49
- name: "design",
50
- usedBy: 3,
51
- addedBy: "User21",
52
- lastUpdated: "2023-07-09",
53
- size: "64kb",
54
- icon: FolderIcon,
55
- moreMenuItems: [
56
- {
57
- label: "Edit",
58
- onClick: function () { return alert("Design menu clicked"); },
59
- },
60
- ],
61
- },
62
- {
63
- name: "Development",
64
- usedBy: 5,
65
- addedBy: "User3",
66
- lastUpdated: "2023-07-07",
67
- size: "128kb",
68
- },
69
- {
70
- name: "Sales",
71
- usedBy: 10,
72
- addedBy: "User4",
73
- lastUpdated: "2023-07-10",
74
- size: "16kb",
75
- },
76
- {
77
- name: "HR",
78
- usedBy: 3,
79
- addedBy: "User5",
80
- lastUpdated: "2023-07-06",
81
- size: "48kb",
82
- },
83
- ];
84
- var columns = [
85
- {
86
- accessorKey: "name",
87
- header: "Name",
88
- sortingFn: "text",
89
- cell: function (info) { return (React.createElement(DataTable.CellContent, { avatarUrl: info.row.original.avatarUrl, avatarTooltipLabel: info.row.original.avatarTooltipLabel, icon: info.row.original.icon, description: info.row.original.description, roundedAvatar: info.row.original.roundedAvatar }, info.row.original.name)); },
90
- },
91
- {
92
- accessorKey: "usedBy",
93
- header: "Used by",
94
- cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.usedBy)); },
95
- },
96
- {
97
- accessorKey: "addedBy",
98
- header: "Added by",
99
- cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.addedBy)); },
100
- },
101
- {
102
- accessorKey: "lastUpdated",
103
- header: "Last updated",
104
- cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.lastUpdated)); },
105
- enableSorting: false,
106
- },
107
- {
108
- accessorKey: "size",
109
- header: "Size",
110
- cell: function (info) { return (React.createElement(DataTable.CellContent, null, info.row.original.size)); },
111
- },
112
- ];
115
+ var _a = __read(React.useState(""), 2), filter = _a[0], setFilter = _a[1];
113
116
  return (React.createElement("div", { className: "s-w-full s-max-w-4xl s-overflow-x-auto" },
114
- React.createElement(DataTable, { data: data, columns: columns, initialColumnOrder: [{ id: "name", desc: false }], columnsBreakpoints: { lastUpdated: "sm" } })));
117
+ React.createElement(Input, { name: "filter", placeholder: "Filter", value: filter, onChange: function (v) { return setFilter(v); } }),
118
+ React.createElement(DataTable, { data: data, filter: filter, filterColumn: "name", columns: columns })));
119
+ };
120
+ export var DataTablePaginatedExample = function () {
121
+ var _a = __read(React.useState({
122
+ pageIndex: 0,
123
+ pageSize: 2,
124
+ }), 2), pagination = _a[0], setPagination = _a[1];
125
+ var _b = __read(React.useState(""), 2), filter = _b[0], setFilter = _b[1];
126
+ return (React.createElement("div", { className: "s-w-full s-max-w-4xl s-overflow-x-auto" },
127
+ React.createElement(Input, { name: "filter", placeholder: "Filter", value: filter, onChange: function (v) { return setFilter(v); } }),
128
+ React.createElement(DataTable, { data: data, filter: filter, filterColumn: "name", pagination: pagination, setPagination: setPagination, columns: columns, initialColumnOrder: [{ id: "name", desc: false }], columnsBreakpoints: { lastUpdated: "sm" } })));
129
+ };
130
+ export var DataTablePaginatedServerSideExample = function () {
131
+ var _a = __read(React.useState({
132
+ pageIndex: 0,
133
+ pageSize: 2,
134
+ }), 2), pagination = _a[0], setPagination = _a[1];
135
+ var _b = __read(React.useState(""), 2), filter = _b[0], setFilter = _b[1];
136
+ var rows = useMemo(function () {
137
+ return data.slice(pagination.pageIndex * pagination.pageSize, (pagination.pageIndex + 1) * pagination.pageSize);
138
+ }, [data, pagination]);
139
+ return (React.createElement("div", { className: "s-w-full s-max-w-4xl s-overflow-x-auto" },
140
+ React.createElement(Input, { name: "filter", placeholder: "Filter", value: filter, onChange: function (v) { return setFilter(v); } }),
141
+ React.createElement(DataTable, { data: rows, totalRowCount: data.length, filter: filter, filterColumn: "name", pagination: pagination, setPagination: setPagination, columns: columns, initialColumnOrder: [{ id: "name", desc: false }], columnsBreakpoints: { lastUpdated: "sm" } })));
115
142
  };
116
143
  //# sourceMappingURL=DataTable.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.stories.js","sourceRoot":"","sources":["../../../src/stories/DataTable.stories.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.stories.js","sourceRoot":"","sources":["../../../src/stories/DataTable.stories.tsx"],"names":[],"mappings":"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"}
@@ -8,4 +8,5 @@ export default meta;
8
8
  export declare const PaginationSM: () => React.JSX.Element;
9
9
  export declare const PaginationXS: () => React.JSX.Element;
10
10
  export declare const PaginationNoPageButtons: () => React.JSX.Element;
11
+ export declare const PaginationWithUrl: () => React.JSX.Element;
11
12
  //# sourceMappingURL=Pagination.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/Pagination.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,QAAA,MAAM,IAAI;;;CAGyB,CAAC;AAEpC,eAAe,IAAI,CAAC;AAEpB,eAAO,MAAM,YAAY,yBAQxB,CAAC;AAEF,eAAO,MAAM,YAAY,yBAUxB,CAAC;AAEF,eAAO,MAAM,uBAAuB,yBAWnC,CAAC"}
1
+ {"version":3,"file":"Pagination.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/Pagination.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,QAAA,MAAM,IAAI;;;CAGyB,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,eAAO,MAAM,YAAY,yBAYxB,CAAC;AAEF,eAAO,MAAM,YAAY,yBAcxB,CAAC;AAEF,eAAO,MAAM,uBAAuB,yBAenC,CAAC;AAEF,eAAO,MAAM,iBAAiB,yBAa7B,CAAC"}
@@ -1,4 +1,6 @@
1
+ import { __read } from "tslib";
1
2
  import React from "react";
3
+ import { usePaginationFromUrl } from "../hooks/usePaginationFromUrl";
2
4
  import { Pagination } from "../index_with_tw_base";
3
5
  var meta = {
4
6
  title: "Components/Pagination",
@@ -6,12 +8,32 @@ var meta = {
6
8
  };
7
9
  export default meta;
8
10
  export var PaginationSM = function () {
9
- return (React.createElement(Pagination, { itemsCount: 960, maxItemsPerPage: 50, onButtonClick: function () { } }));
11
+ var _a = __read(React.useState({
12
+ pageIndex: 0,
13
+ pageSize: 50,
14
+ }), 2), pagination = _a[0], setPagination = _a[1];
15
+ return (React.createElement(Pagination, { rowCount: 960, pagination: pagination, setPagination: setPagination }));
10
16
  };
11
17
  export var PaginationXS = function () {
12
- return (React.createElement(Pagination, { itemsCount: 960, maxItemsPerPage: 50, size: "xs", showDetails: false, onButtonClick: function () { } }));
18
+ var _a = __read(React.useState({
19
+ pageIndex: 0,
20
+ pageSize: 50,
21
+ }), 2), pagination = _a[0], setPagination = _a[1];
22
+ return (React.createElement(Pagination, { rowCount: 960, size: "xs", showDetails: false, pagination: pagination, setPagination: setPagination }));
13
23
  };
14
24
  export var PaginationNoPageButtons = function () {
15
- return (React.createElement(Pagination, { itemsCount: 960, maxItemsPerPage: 50, size: "xs", showDetails: false, showPageButtons: false, onButtonClick: function () { } }));
25
+ var _a = __read(React.useState({
26
+ pageIndex: 0,
27
+ pageSize: 50,
28
+ }), 2), pagination = _a[0], setPagination = _a[1];
29
+ return (React.createElement(Pagination, { rowCount: 960, size: "xs", showDetails: false, showPageButtons: false, pagination: pagination, setPagination: setPagination }));
30
+ };
31
+ export var PaginationWithUrl = function () {
32
+ var _a = usePaginationFromUrl("example", 50), pagination = _a.pagination, setPagination = _a.setPagination;
33
+ return (React.createElement(React.Fragment, null,
34
+ React.createElement("div", { className: "s-p-2" },
35
+ "Current hash: ",
36
+ location.hash),
37
+ React.createElement(Pagination, { rowCount: 960, pagination: pagination, setPagination: setPagination })));
16
38
  };
17
39
  //# sourceMappingURL=Pagination.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.stories.js","sourceRoot":"","sources":["../../../src/stories/Pagination.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,IAAM,IAAI,GAAG;IACX,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,UAAU;CACY,CAAC;AAEpC,eAAe,IAAI,CAAC;AAEpB,MAAM,CAAC,IAAM,YAAY,GAAG;IAC1B,OAAO,CACL,oBAAC,UAAU,IACT,UAAU,EAAE,GAAG,EACf,eAAe,EAAE,EAAE,EACnB,aAAa,EAAE,cAAO,CAAC,GACvB,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,YAAY,GAAG;IAC1B,OAAO,CACL,oBAAC,UAAU,IACT,UAAU,EAAE,GAAG,EACf,eAAe,EAAE,EAAE,EACnB,IAAI,EAAC,IAAI,EACT,WAAW,EAAE,KAAK,EAClB,aAAa,EAAE,cAAO,CAAC,GACvB,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,uBAAuB,GAAG;IACrC,OAAO,CACL,oBAAC,UAAU,IACT,UAAU,EAAE,GAAG,EACf,eAAe,EAAE,EAAE,EACnB,IAAI,EAAC,IAAI,EACT,WAAW,EAAE,KAAK,EAClB,eAAe,EAAE,KAAK,EACtB,aAAa,EAAE,cAAO,CAAC,GACvB,CACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"Pagination.stories.js","sourceRoot":"","sources":["../../../src/stories/Pagination.stories.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,IAAM,IAAI,GAAG;IACX,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,UAAU;CACY,CAAC;AAEpC,eAAe,IAAI,CAAC;AACpB,MAAM,CAAC,IAAM,YAAY,GAAG;IACpB,IAAA,KAAA,OAA8B,KAAK,CAAC,QAAQ,CAAC;QACjD,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,EAAE;KACb,CAAC,IAAA,EAHK,UAAU,QAAA,EAAE,aAAa,QAG9B,CAAC;IACH,OAAO,CACL,oBAAC,UAAU,IACT,QAAQ,EAAE,GAAG,EACb,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,YAAY,GAAG;IACpB,IAAA,KAAA,OAA8B,KAAK,CAAC,QAAQ,CAAC;QACjD,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,EAAE;KACb,CAAC,IAAA,EAHK,UAAU,QAAA,EAAE,aAAa,QAG9B,CAAC;IACH,OAAO,CACL,oBAAC,UAAU,IACT,QAAQ,EAAE,GAAG,EACb,IAAI,EAAC,IAAI,EACT,WAAW,EAAE,KAAK,EAClB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,uBAAuB,GAAG;IAC/B,IAAA,KAAA,OAA8B,KAAK,CAAC,QAAQ,CAAC;QACjD,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,EAAE;KACb,CAAC,IAAA,EAHK,UAAU,QAAA,EAAE,aAAa,QAG9B,CAAC;IACH,OAAO,CACL,oBAAC,UAAU,IACT,QAAQ,EAAE,GAAG,EACb,IAAI,EAAC,IAAI,EACT,WAAW,EAAE,KAAK,EAClB,eAAe,EAAE,KAAK,EACtB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,iBAAiB,GAAG;IACzB,IAAA,KAAgC,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,EAAjE,UAAU,gBAAA,EAAE,aAAa,mBAAwC,CAAC;IAE1E,OAAO,CACL;QACE,6BAAK,SAAS,EAAC,OAAO;;YAAgB,QAAQ,CAAC,IAAI,CAAO;QAC1D,oBAAC,UAAU,IACT,QAAQ,EAAE,GAAG,EACb,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,GAC5B,CACD,CACJ,CAAC;AACJ,CAAC,CAAC"}
package/dist/sparkle.css CHANGED
@@ -3016,6 +3016,10 @@ select {
3016
3016
  padding: 0px;
3017
3017
  }
3018
3018
 
3019
+ .s-p-1 {
3020
+ padding: 0.25rem;
3021
+ }
3022
+
3019
3023
  .s-p-10 {
3020
3024
  padding: 2.5rem;
3021
3025
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dust-tt/sparkle",
3
- "version": "0.2.225",
3
+ "version": "0.2.226",
4
4
  "scripts": {
5
5
  "build": "rm -rf dist && npm run tailwind && npm run build:esm && npm run build:cjs",
6
6
  "tailwind": "tailwindcss -i ./src/styles/tailwind.css -o dist/sparkle.css",
@@ -4,9 +4,12 @@ import {
4
4
  flexRender,
5
5
  getCoreRowModel,
6
6
  getFilteredRowModel,
7
+ getPaginationRowModel,
7
8
  getSortedRowModel,
9
+ PaginationState,
8
10
  SortingFn,
9
11
  type SortingState,
12
+ Updater,
10
13
  useReactTable,
11
14
  } from "@tanstack/react-table";
12
15
  import React, { ReactNode, useEffect, useState } from "react";
@@ -17,6 +20,7 @@ import {
17
20
  DropdownMenu,
18
21
  } from "@sparkle/components/DropdownMenu";
19
22
  import { IconButton } from "@sparkle/components/IconButton";
23
+ import { Pagination } from "@sparkle/components/Pagination";
20
24
  import { Tooltip } from "@sparkle/components/Tooltip";
21
25
  import { ArrowDownIcon, ArrowUpIcon, MoreIcon } from "@sparkle/icons";
22
26
  import { classNames } from "@sparkle/lib/utils";
@@ -35,10 +39,13 @@ interface ColumnBreakpoint {
35
39
 
36
40
  interface DataTableProps<TData extends TBaseData> {
37
41
  data: TData[];
42
+ totalRowCount?: number;
38
43
  columns: ColumnDef<TData, any>[]; // eslint-disable-line @typescript-eslint/no-explicit-any
39
44
  className?: string;
40
45
  filter?: string;
41
46
  filterColumn?: string;
47
+ pagination?: PaginationState;
48
+ setPagination?: (pagination: PaginationState) => void;
42
49
  initialColumnOrder?: SortingState;
43
50
  columnsBreakpoints?: ColumnBreakpoint;
44
51
  sortingFn?: SortingFn<TData>;
@@ -56,12 +63,15 @@ function shouldRenderColumn(
56
63
 
57
64
  export function DataTable<TData extends TBaseData>({
58
65
  data,
66
+ totalRowCount,
59
67
  columns,
60
68
  className,
61
69
  filter,
62
70
  filterColumn,
63
71
  initialColumnOrder,
64
72
  columnsBreakpoints = {},
73
+ pagination,
74
+ setPagination,
65
75
  }: DataTableProps<TData>) {
66
76
  const windowSize = useWindowSize();
67
77
  const [sorting, setSorting] = useState<SortingState>(
@@ -69,18 +79,36 @@ export function DataTable<TData extends TBaseData>({
69
79
  );
70
80
  const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);
71
81
 
82
+ const isServerSidePagination = !!totalRowCount && totalRowCount > data.length;
83
+ const onPaginationChange =
84
+ pagination && setPagination
85
+ ? (updater: Updater<PaginationState>) => {
86
+ const newValue =
87
+ typeof updater === "function" ? updater(pagination) : updater;
88
+ setPagination(newValue);
89
+ }
90
+ : undefined;
91
+
72
92
  const table = useReactTable({
73
93
  data,
74
94
  columns,
95
+ rowCount: totalRowCount,
96
+ manualPagination: isServerSidePagination,
75
97
  onSortingChange: setSorting,
76
98
  getCoreRowModel: getCoreRowModel(),
77
99
  getSortedRowModel: getSortedRowModel(),
78
100
  getFilteredRowModel: getFilteredRowModel(),
101
+ getPaginationRowModel: pagination ? getPaginationRowModel() : undefined,
79
102
  onColumnFiltersChange: setColumnFilters,
80
103
  state: {
81
104
  columnFilters,
82
- sorting,
105
+ sorting: isServerSidePagination ? undefined : sorting,
106
+ pagination,
107
+ },
108
+ initialState: {
109
+ pagination,
83
110
  },
111
+ onPaginationChange: onPaginationChange,
84
112
  });
85
113
 
86
114
  useEffect(() => {
@@ -90,81 +118,92 @@ export function DataTable<TData extends TBaseData>({
90
118
  }, [filter, filterColumn]);
91
119
 
92
120
  return (
93
- <DataTable.Root className={className}>
94
- <DataTable.Header>
95
- {table.getHeaderGroups().map((headerGroup) => (
96
- <DataTable.Row key={headerGroup.id}>
97
- {headerGroup.headers.map((header) => {
98
- const breakpoint = columnsBreakpoints[header.id];
99
- if (
100
- !windowSize.width ||
101
- !shouldRenderColumn(windowSize.width, breakpoint)
102
- ) {
103
- return null;
104
- }
105
- return (
106
- <DataTable.Head
107
- key={header.id}
108
- onClick={header.column.getToggleSortingHandler()}
109
- className={classNames(
110
- header.column.getCanSort() ? "s-cursor-pointer" : ""
111
- )}
112
- >
113
- <div className="s-flex s-items-center s-space-x-1 s-whitespace-nowrap">
114
- {flexRender(
115
- header.column.columnDef.header,
116
- header.getContext()
117
- )}
118
- {header.column.getCanSort() && (
119
- <Icon
120
- visual={
121
- header.column.getIsSorted() === "asc"
122
- ? ArrowUpIcon
123
- : header.column.getIsSorted() === "desc"
124
- ? ArrowDownIcon
125
- : ArrowDownIcon
126
- }
127
- size="xs"
128
- className={classNames(
129
- "s-ml-1",
130
- header.column.getIsSorted()
131
- ? "s-opacity-100"
132
- : "s-opacity-0"
133
- )}
134
- />
121
+ <div className="s-flex s-flex-col s-gap-2">
122
+ <DataTable.Root className={className}>
123
+ <DataTable.Header>
124
+ {table.getHeaderGroups().map((headerGroup) => (
125
+ <DataTable.Row key={headerGroup.id}>
126
+ {headerGroup.headers.map((header) => {
127
+ const breakpoint = columnsBreakpoints[header.id];
128
+ if (
129
+ !windowSize.width ||
130
+ !shouldRenderColumn(windowSize.width, breakpoint)
131
+ ) {
132
+ return null;
133
+ }
134
+ return (
135
+ <DataTable.Head
136
+ key={header.id}
137
+ onClick={header.column.getToggleSortingHandler()}
138
+ className={classNames(
139
+ header.column.getCanSort() ? "s-cursor-pointer" : ""
135
140
  )}
136
- </div>
137
- </DataTable.Head>
138
- );
139
- })}
140
- </DataTable.Row>
141
- ))}
142
- </DataTable.Header>
143
- <DataTable.Body>
144
- {table.getRowModel().rows.map((row) => (
145
- <DataTable.Row
146
- key={row.id}
147
- onClick={row.original.onClick}
148
- moreMenuItems={row.original.moreMenuItems}
149
- >
150
- {row.getVisibleCells().map((cell) => {
151
- const breakpoint = columnsBreakpoints[cell.column.id];
152
- if (
153
- !windowSize.width ||
154
- !shouldRenderColumn(windowSize.width, breakpoint)
155
- ) {
156
- return null;
157
- }
158
- return (
159
- <DataTable.Cell key={cell.id}>
160
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
161
- </DataTable.Cell>
162
- );
163
- })}
164
- </DataTable.Row>
165
- ))}
166
- </DataTable.Body>
167
- </DataTable.Root>
141
+ >
142
+ <div className="s-flex s-items-center s-space-x-1 s-whitespace-nowrap">
143
+ {flexRender(
144
+ header.column.columnDef.header,
145
+ header.getContext()
146
+ )}
147
+ {header.column.getCanSort() && (
148
+ <Icon
149
+ visual={
150
+ header.column.getIsSorted() === "asc"
151
+ ? ArrowUpIcon
152
+ : header.column.getIsSorted() === "desc"
153
+ ? ArrowDownIcon
154
+ : ArrowDownIcon
155
+ }
156
+ size="xs"
157
+ className={classNames(
158
+ "s-ml-1",
159
+ header.column.getIsSorted()
160
+ ? "s-opacity-100"
161
+ : "s-opacity-0"
162
+ )}
163
+ />
164
+ )}
165
+ </div>
166
+ </DataTable.Head>
167
+ );
168
+ })}
169
+ </DataTable.Row>
170
+ ))}
171
+ </DataTable.Header>
172
+ <DataTable.Body>
173
+ {table.getRowModel().rows.map((row) => (
174
+ <DataTable.Row
175
+ key={row.id}
176
+ onClick={row.original.onClick}
177
+ moreMenuItems={row.original.moreMenuItems}
178
+ >
179
+ {row.getVisibleCells().map((cell) => {
180
+ const breakpoint = columnsBreakpoints[cell.column.id];
181
+ if (
182
+ !windowSize.width ||
183
+ !shouldRenderColumn(windowSize.width, breakpoint)
184
+ ) {
185
+ return null;
186
+ }
187
+ return (
188
+ <DataTable.Cell key={cell.id}>
189
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
190
+ </DataTable.Cell>
191
+ );
192
+ })}
193
+ </DataTable.Row>
194
+ ))}
195
+ </DataTable.Body>
196
+ </DataTable.Root>
197
+ {pagination && (
198
+ <div className="s-p-1">
199
+ <Pagination
200
+ pagination={table.getState().pagination}
201
+ setPagination={table.setPagination}
202
+ rowCount={table.getRowCount()}
203
+ />
204
+ </div>
205
+ )}
206
+ </div>
168
207
  );
169
208
  }
170
209