@ceed/ads 0.0.17-9 → 0.0.18
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.
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
import React, { ComponentProps } from "react";
|
|
2
2
|
import { Table, TableBody, TableHead } from "../Table";
|
|
3
|
-
|
|
3
|
+
type DataTableProps<T extends Record<string, unknown>> = {
|
|
4
4
|
data: T[];
|
|
5
5
|
showCheckbox?: boolean;
|
|
6
|
+
onCheckboxChange?: (event: any, selectedModel: string) => void;
|
|
7
|
+
/**
|
|
8
|
+
* 체크박스가 있는 경우, 체크박스를 클릭했을 때 선택된 row의 index를 지정한다.
|
|
9
|
+
*/
|
|
10
|
+
selectionModel?: string[];
|
|
11
|
+
onSelectionModelChange?: (newSelectionModel: string[]) => void;
|
|
12
|
+
/**
|
|
13
|
+
* 페이지네이션을 위한 prop
|
|
14
|
+
* 별도로 지정하지 않으면, data prop 기반의 페이지네이션을 사용한다.
|
|
15
|
+
*/
|
|
16
|
+
page?: number;
|
|
17
|
+
onPageChange?: (newPage: number) => void;
|
|
18
|
+
rowsPerPage?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Rows의 총 갯수를 직접 지정 할 수 있다.
|
|
21
|
+
* 이 값이 주어지면, data prop 기반의 페이지네이션을 사용하지 않는다.
|
|
22
|
+
* data lazy loading을 위한 prop
|
|
23
|
+
*/
|
|
24
|
+
totalRows?: number;
|
|
6
25
|
slots?: {
|
|
7
26
|
checkbox?: React.ElementType;
|
|
8
27
|
toolbar?: React.ElementType;
|
|
28
|
+
footer?: React.ElementType;
|
|
9
29
|
};
|
|
10
30
|
slotProps?: {
|
|
11
31
|
checkbox?: Partial<{
|
|
@@ -15,8 +35,12 @@ declare function DataTable<T extends Record<string, unknown>>(props: {
|
|
|
15
35
|
toolbar?: Partial<{
|
|
16
36
|
[key: string]: any;
|
|
17
37
|
}>;
|
|
38
|
+
background?: Partial<{
|
|
39
|
+
[key: string]: any;
|
|
40
|
+
}>;
|
|
18
41
|
};
|
|
19
|
-
} & ComponentProps<typeof Table> & Pick<ComponentProps<typeof TableHead>, "headCells"> & Pick<ComponentProps<typeof TableBody>, "cellOrder"
|
|
42
|
+
} & ComponentProps<typeof Table> & Pick<ComponentProps<typeof TableHead>, "headCells"> & Pick<ComponentProps<typeof TableBody>, "cellOrder">;
|
|
43
|
+
declare function DataTable<T extends Record<string, unknown>>(props: DataTableProps<T>): React.JSX.Element;
|
|
20
44
|
declare namespace DataTable {
|
|
21
45
|
var displayName: string;
|
|
22
46
|
}
|
|
@@ -20,13 +20,110 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
20
20
|
}
|
|
21
21
|
return t;
|
|
22
22
|
};
|
|
23
|
-
|
|
23
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
24
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
25
|
+
if (ar || !(i in from)) {
|
|
26
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
27
|
+
ar[i] = from[i];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
31
|
+
};
|
|
32
|
+
import React, { useCallback, useEffect, useMemo, useState, } from "react";
|
|
24
33
|
import Sheet from "../Sheet";
|
|
25
34
|
import { Table, TableHead } from "../Table";
|
|
26
35
|
import Checkbox from "../Checkbox";
|
|
36
|
+
import Box from "../Box";
|
|
37
|
+
import Stack from "../Stack";
|
|
38
|
+
import Typography from "../Typography";
|
|
39
|
+
import Button from "../Button";
|
|
40
|
+
function TablePagination(props) {
|
|
41
|
+
// prop destruction
|
|
42
|
+
var page = props.page, rowsPerPage = props.rowsPerPage, totalRows = props.totalRows, onPageChange = props.onPageChange;
|
|
43
|
+
// lib hooks
|
|
44
|
+
// state, ref, querystring hooks
|
|
45
|
+
// form hooks
|
|
46
|
+
// query hooks
|
|
47
|
+
// calculated values
|
|
48
|
+
var firstPage = 1;
|
|
49
|
+
var lastPage = Math.ceil(totalRows / rowsPerPage);
|
|
50
|
+
var beforePages = [page - 2, page - 1].filter(function (p) { return p > 1; });
|
|
51
|
+
var afterPages = [page + 1, page + 2].filter(function (p) { return p <= lastPage - 1; });
|
|
52
|
+
var isMoreAfterPages = lastPage > 1 && page < lastPage - 3;
|
|
53
|
+
var isMoreBeforePages = lastPage > 1 && page > 4;
|
|
54
|
+
// effects
|
|
55
|
+
// handlers
|
|
56
|
+
return (React.createElement(Stack, { direction: "row", spacing: 1, sx: {
|
|
57
|
+
pt: 1,
|
|
58
|
+
pb: 1,
|
|
59
|
+
}, justifyContent: "end", alignItems: "center" },
|
|
60
|
+
React.createElement(Stack, { direction: "row", spacing: 0.5, alignItems: "center" },
|
|
61
|
+
React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(page - 1); }, disabled: page === firstPage, "aria-label": "Previous page" }, "<"),
|
|
62
|
+
page !== firstPage && (React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(firstPage); } }, firstPage)),
|
|
63
|
+
isMoreBeforePages && (React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(page - 3); } }, "...")),
|
|
64
|
+
beforePages.map(function (p) { return (React.createElement(Button, { key: p, size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(p); } }, p)); }),
|
|
65
|
+
React.createElement(Button, { variant: "soft", size: "sm" }, page),
|
|
66
|
+
afterPages.map(function (p) { return (React.createElement(Button, { key: p, size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(p); } }, p)); }),
|
|
67
|
+
isMoreAfterPages && (React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(page + 3); } }, "...")),
|
|
68
|
+
page !== lastPage && (React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(lastPage); } }, lastPage)),
|
|
69
|
+
React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(page + 1); }, disabled: page === lastPage, "aria-label": "Next page" }, ">"))));
|
|
70
|
+
}
|
|
27
71
|
function useDataTableRenderer(_a) {
|
|
28
|
-
var data = _a.data, cellOrder = _a.cellOrder, headCells = _a.headCells;
|
|
72
|
+
var data = _a.data, cellOrder = _a.cellOrder, headCells = _a.headCells, totalRowsProp = _a.totalRows, _b = _a.page, pageProp = _b === void 0 ? 1 : _b, onPageChange = _a.onPageChange, rowsPerPage = _a.rowsPerPage, _c = _a.selectionModel, selectionModel = _c === void 0 ? [] : _c, onSelectionModelChange = _a.onSelectionModelChange, onCheckboxChange = _a.onCheckboxChange;
|
|
73
|
+
var _d = useState(pageProp), page = _d[0], setPage = _d[1];
|
|
74
|
+
var selectedModelSet = useMemo(function () { return new Set(selectionModel); }, [selectionModel]);
|
|
75
|
+
var dataInPage = useMemo(function () {
|
|
76
|
+
return data.slice((page - 1) * rowsPerPage, (page - 1) * rowsPerPage + rowsPerPage);
|
|
77
|
+
}, [data, page, rowsPerPage]);
|
|
78
|
+
var isAllSelected = useMemo(function () {
|
|
79
|
+
return dataInPage.length > 0 &&
|
|
80
|
+
dataInPage.every(function (_, i) {
|
|
81
|
+
return selectedModelSet.has("".concat(i + (page - 1) * rowsPerPage));
|
|
82
|
+
});
|
|
83
|
+
}, [dataInPage, selectedModelSet, page, rowsPerPage]);
|
|
84
|
+
var totalRows = totalRowsProp || data.length;
|
|
85
|
+
var isTotalSelected = useMemo(function () { return totalRows > 0 && selectionModel.length === totalRows; }, [selectionModel, totalRows]);
|
|
86
|
+
var handlePageChange = useCallback(function (newPage) {
|
|
87
|
+
setPage(newPage);
|
|
88
|
+
onPageChange === null || onPageChange === void 0 ? void 0 : onPageChange(newPage);
|
|
89
|
+
}, [onPageChange]);
|
|
90
|
+
useEffect(function () {
|
|
91
|
+
handlePageChange(1);
|
|
92
|
+
}, [totalRows]);
|
|
93
|
+
useEffect(function () {
|
|
94
|
+
if (page > Math.ceil(totalRows / rowsPerPage)) {
|
|
95
|
+
handlePageChange(Math.ceil(totalRows / rowsPerPage));
|
|
96
|
+
}
|
|
97
|
+
}, [totalRows, rowsPerPage]);
|
|
98
|
+
useEffect(function () {
|
|
99
|
+
onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange([]);
|
|
100
|
+
}, [page]);
|
|
29
101
|
return {
|
|
102
|
+
totalRows: totalRows,
|
|
103
|
+
page: page,
|
|
104
|
+
onPageChange: handlePageChange,
|
|
105
|
+
dataInPage: dataInPage,
|
|
106
|
+
isAllSelected: isAllSelected, // all rows are selected on this page
|
|
107
|
+
isTotalSelected: isTotalSelected,
|
|
108
|
+
isSelectedRow: useCallback(function (model) { return selectedModelSet.has(model); }, [selectedModelSet]),
|
|
109
|
+
onAllCheckboxChange: useCallback(function () {
|
|
110
|
+
onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(isAllSelected
|
|
111
|
+
? []
|
|
112
|
+
: dataInPage.map(function (_, i) { return "".concat(i + (page - 1) * rowsPerPage); }));
|
|
113
|
+
onCheckboxChange === null || onCheckboxChange === void 0 ? void 0 : onCheckboxChange(null, '');
|
|
114
|
+
}, [isAllSelected, dataInPage, onSelectionModelChange]),
|
|
115
|
+
onCheckboxChange: useCallback(function (event, selectedModel) {
|
|
116
|
+
if (selectedModelSet.has(selectedModel)) {
|
|
117
|
+
var newSelectionModel = selectionModel.filter(function (model) { return model !== selectedModel; });
|
|
118
|
+
onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(newSelectionModel);
|
|
119
|
+
onCheckboxChange === null || onCheckboxChange === void 0 ? void 0 : onCheckboxChange(event, selectedModel);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
var newSelectionModel = __spreadArray(__spreadArray([], selectionModel, true), [selectedModel], false);
|
|
123
|
+
onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(newSelectionModel);
|
|
124
|
+
onCheckboxChange === null || onCheckboxChange === void 0 ? void 0 : onCheckboxChange(event, selectedModel);
|
|
125
|
+
}
|
|
126
|
+
}, [selectionModel, onSelectionModelChange]),
|
|
30
127
|
renderCellOrder: useMemo(function () { return cellOrder || Object.keys(data[0] || {}); }, [data, cellOrder]),
|
|
31
128
|
renderHeadCells: useMemo(function () {
|
|
32
129
|
return headCells ||
|
|
@@ -35,59 +132,90 @@ function useDataTableRenderer(_a) {
|
|
|
35
132
|
label: key,
|
|
36
133
|
}); });
|
|
37
134
|
}, [data, headCells]),
|
|
135
|
+
onTotalSelect: useCallback(function () {
|
|
136
|
+
onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(isTotalSelected ? [] : data.map(function (_, i) { return "".concat(i); }));
|
|
137
|
+
}, [isTotalSelected, data, onSelectionModelChange]),
|
|
38
138
|
};
|
|
39
139
|
}
|
|
40
140
|
function DataTable(props) {
|
|
41
141
|
// prop destruction
|
|
42
|
-
var data = props.data, showCheckbox = props.showCheckbox, headCells = props.headCells, cellOrder = props.cellOrder,
|
|
142
|
+
var data = props.data, showCheckbox = props.showCheckbox, headCells = props.headCells, cellOrder = props.cellOrder, selectionModel = props.selectionModel, onSelectionModelChange = props.onSelectionModelChange, _ = props.totalRows, // totalRows is used in useDataTableRenderer
|
|
143
|
+
_a = props.rowsPerPage, // totalRows is used in useDataTableRenderer
|
|
144
|
+
rowsPerPage = _a === void 0 ? 20 : _a, _page = props.page, // page is used in useDataTableRenderer
|
|
145
|
+
_onPageChange = props.onPageChange, // onPageChange is used in useDataTableRenderer
|
|
146
|
+
_onCheckboxChange = props.onCheckboxChange, // onCheckboxChange is used in useDataTableRenderer
|
|
147
|
+
_b = props.slots, // onCheckboxChange is used in useDataTableRenderer
|
|
148
|
+
_c = _b === void 0 ? {} : _b, _d = _c.checkbox, RenderCheckbox = _d === void 0 ? Checkbox : _d, Toolbar = _c.toolbar, Footer = _c.footer, _e = props.slotProps, _f = _e === void 0 ? {} : _e, _g = _f.checkbox, checkboxProps = _g === void 0 ? {} : _g, toolbarProps = _f.toolbar, _h = _f.background, backgroundProps = _h === void 0 ? {} : _h, innerProps = __rest(props, ["data", "showCheckbox", "headCells", "cellOrder", "selectionModel", "onSelectionModelChange", "totalRows", "rowsPerPage", "page", "onPageChange", "onCheckboxChange", "slots", "slotProps"]);
|
|
43
149
|
// lib hooks
|
|
44
|
-
var
|
|
45
|
-
data: data,
|
|
46
|
-
cellOrder: cellOrder,
|
|
47
|
-
headCells: headCells,
|
|
48
|
-
}), renderCellOrder = _g.renderCellOrder, renderHeadCells = _g.renderHeadCells;
|
|
150
|
+
var _j = useDataTableRenderer(__assign(__assign({}, props), { rowsPerPage: rowsPerPage })), renderCellOrder = _j.renderCellOrder, renderHeadCells = _j.renderHeadCells, isAllSelected = _j.isAllSelected, isSelectedRow = _j.isSelectedRow, onAllCheckboxChange = _j.onAllCheckboxChange, onCheckboxChange = _j.onCheckboxChange, totalRows = _j.totalRows, page = _j.page, onPageChange = _j.onPageChange, dataInPage = _j.dataInPage, isTotalSelected = _j.isTotalSelected, onTotalSelect = _j.onTotalSelect;
|
|
49
151
|
// state, ref, querystring hooks
|
|
50
152
|
// form hooks
|
|
51
153
|
// query hooks
|
|
52
154
|
// calculated values
|
|
53
155
|
// effects
|
|
54
156
|
// handlers
|
|
55
|
-
return (React.createElement(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
157
|
+
return (React.createElement(Box, null,
|
|
158
|
+
React.createElement(Stack, { direction: "row", sx: {
|
|
159
|
+
pt: 1,
|
|
160
|
+
pb: 1,
|
|
161
|
+
}, justifyContent: "space-between", alignItems: "center" },
|
|
162
|
+
React.createElement(Stack, { direction: "row", spacing: 1 },
|
|
163
|
+
!isAllSelected && (React.createElement(Typography, { level: "body-xs" },
|
|
164
|
+
(selectionModel === null || selectionModel === void 0 ? void 0 : selectionModel.length) || 0,
|
|
165
|
+
" items selected")),
|
|
166
|
+
isAllSelected && !isTotalSelected && (React.createElement(Stack, { direction: "row", spacing: 1, alignItems: "center" },
|
|
167
|
+
React.createElement(Typography, { level: "body-xs" },
|
|
168
|
+
"All ", selectionModel === null || selectionModel === void 0 ? void 0 :
|
|
169
|
+
selectionModel.length,
|
|
170
|
+
" items on this page are selected."),
|
|
171
|
+
React.createElement(Button, { size: "sm", variant: "plain", onClick: onTotalSelect },
|
|
172
|
+
"Select all ",
|
|
173
|
+
data.length,
|
|
174
|
+
" items"))),
|
|
175
|
+
isTotalSelected && (React.createElement(Stack, { direction: "row", spacing: 1, alignItems: "center" },
|
|
176
|
+
React.createElement(Typography, { level: "body-xs" },
|
|
177
|
+
"All ",
|
|
178
|
+
data.length,
|
|
179
|
+
" items are selected."),
|
|
180
|
+
React.createElement(Button, { size: "sm", variant: "plain", color: "danger", onClick: onTotalSelect }, "Cancel")))),
|
|
181
|
+
Toolbar && React.createElement(Toolbar, __assign({}, (toolbarProps || {})))),
|
|
182
|
+
React.createElement(Sheet, __assign({ variant: "outlined", sx: {
|
|
183
|
+
overflow: "auto",
|
|
184
|
+
width: "100%",
|
|
185
|
+
boxShadow: "sm",
|
|
186
|
+
borderRadius: "sm",
|
|
187
|
+
} }, backgroundProps),
|
|
188
|
+
React.createElement(Table, __assign({ sx: [
|
|
189
|
+
{
|
|
190
|
+
// "--TableCell-headBackground": "transparent",
|
|
191
|
+
"--TableCell-selectedBackground": function (theme) {
|
|
192
|
+
return theme.vars.palette.neutral.plainActiveBg;
|
|
70
193
|
},
|
|
71
|
-
}
|
|
72
|
-
: {},
|
|
73
|
-
{
|
|
74
|
-
"--TableCell-headBackground": "transparent",
|
|
75
|
-
"--TableCell-selectedBackground": function (theme) {
|
|
76
|
-
return theme.vars.palette.success.softBg;
|
|
77
194
|
},
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
195
|
+
] }, innerProps),
|
|
196
|
+
React.createElement(TableHead, { showCheckbox: showCheckbox, headCells: renderHeadCells || [], onCheckboxChange: onAllCheckboxChange, slotProps: {
|
|
197
|
+
checkbox: __assign({ checked: isAllSelected, indeterminate: (selectionModel || []).length > 0 && !isAllSelected }, checkboxProps),
|
|
198
|
+
} }),
|
|
199
|
+
React.createElement("tbody", null, dataInPage.map(function (row, rowIndex) {
|
|
200
|
+
var rowId = "".concat(rowIndex + (page - 1) * rowsPerPage);
|
|
201
|
+
return (React.createElement("tr", { key: rowId, role: showCheckbox ? "checkbox" : undefined, tabIndex: showCheckbox ? -1 : undefined, onClick: showCheckbox
|
|
202
|
+
? function (e) { return onCheckboxChange(e, rowId); }
|
|
203
|
+
: undefined, "aria-checked": showCheckbox ? isSelectedRow(rowId) : undefined, style: showCheckbox && isSelectedRow(rowId)
|
|
204
|
+
? {
|
|
205
|
+
"--TableCell-dataBackground": "var(--TableCell-selectedBackground)",
|
|
206
|
+
"--TableCell-headBackground": "var(--TableCell-selectedBackground)",
|
|
207
|
+
}
|
|
208
|
+
: {
|
|
209
|
+
"--TableCell-headBackground": "transparent",
|
|
210
|
+
} },
|
|
211
|
+
showCheckbox && (React.createElement("th", { scope: "row", style: {
|
|
212
|
+
textAlign: "center",
|
|
213
|
+
} },
|
|
214
|
+
React.createElement(RenderCheckbox, __assign({ onChange: function (e) { return onCheckboxChange(e, rowId); }, checked: isSelectedRow(rowId) }, checkboxProps)))),
|
|
215
|
+
renderCellOrder.map(function (cellKey) { return (React.createElement("td", { key: cellKey }, row[cellKey])); })));
|
|
216
|
+
})),
|
|
217
|
+
Footer && React.createElement(Footer, null))),
|
|
218
|
+
React.createElement(TablePagination, { page: page, rowsPerPage: rowsPerPage, totalRows: totalRows, onPageChange: onPageChange, onRowsPerPageChange: function () { } })));
|
|
91
219
|
}
|
|
92
220
|
export { DataTable };
|
|
93
221
|
DataTable.displayName = "DataTable";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
declare const Modal: import("framer-motion").CustomDomComponent<Pick<import("@mui/base").ModalOwnProps, "children" | "container" | "open" | "disableAutoFocus" | "disableEnforceFocus" | "disableEscapeKeyDown" | "disablePortal" | "disableRestoreFocus" | "disableScrollLock" | "hideBackdrop" | "keepMounted"> & {
|
|
3
|
-
onClose?: ((event: {}, reason: "
|
|
3
|
+
onClose?: ((event: {}, reason: "escapeKeyDown" | "backdropClick" | "closeClick") => void) | undefined;
|
|
4
4
|
sx?: import("@mui/joy/styles/types").SxProps | undefined;
|
|
5
5
|
} & import("@mui/joy").ModalSlotsAndSlotProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
6
6
|
ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined;
|