@ceed/ads 0.0.18 → 0.0.20

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,8 +1,25 @@
1
1
  import React from "react";
2
- import { ButtonProps } from "@mui/joy";
3
2
  import { MotionProps } from "framer-motion";
4
- declare const Button: {
5
- (props: ButtonProps & MotionProps): React.JSX.Element;
6
- displayName: string;
7
- };
3
+ declare const Button: React.ForwardRefExoticComponent<Omit<{
4
+ component?: React.ElementType<any, keyof React.JSX.IntrinsicElements> | undefined;
5
+ } & import("@mui/joy").ButtonSlotsAndSlotProps & {
6
+ action?: React.Ref<{
7
+ focusVisible(): void;
8
+ }> | undefined;
9
+ color?: import("@mui/types").OverridableStringUnion<import("@mui/joy").ColorPaletteProp, import("@mui/joy").ButtonPropsColorOverrides> | undefined;
10
+ disabled?: boolean | undefined;
11
+ endDecorator?: React.ReactNode;
12
+ focusVisibleClassName?: string | undefined;
13
+ fullWidth?: boolean | undefined;
14
+ size?: import("@mui/types").OverridableStringUnion<"sm" | "md" | "lg", import("@mui/joy").ButtonPropsSizeOverrides> | undefined;
15
+ startDecorator?: React.ReactNode;
16
+ sx?: import("@mui/joy/styles/types").SxProps | undefined;
17
+ tabIndex?: number | undefined;
18
+ variant?: import("@mui/types").OverridableStringUnion<import("@mui/joy").VariantProp, import("@mui/joy").ButtonPropsVariantOverrides> | undefined;
19
+ loading?: boolean | undefined;
20
+ loadingIndicator?: React.ReactNode;
21
+ loadingPosition?: "center" | "end" | "start" | undefined;
22
+ } & Omit<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
23
+ ref?: ((instance: HTMLButtonElement | null) => void) | React.RefObject<HTMLButtonElement> | null | undefined;
24
+ }, "color" | "tabIndex" | "variant" | "sx" | "disabled" | "size" | "component" | keyof import("@mui/joy").ButtonSlotsAndSlotProps | "action" | "endDecorator" | "focusVisibleClassName" | "fullWidth" | "startDecorator" | "loading" | "loadingIndicator" | "loadingPosition"> & MotionProps, "ref"> & React.RefAttributes<unknown>>;
8
25
  export { Button };
@@ -9,11 +9,11 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- import React from "react";
12
+ import React, { forwardRef } from "react";
13
13
  import { Button as JoyButton } from "@mui/joy";
14
14
  import { motion } from "framer-motion";
15
15
  var MotionButton = motion(JoyButton);
16
- var Button = function (props) {
16
+ var Button = forwardRef(function (props) {
17
17
  // prop destruction
18
18
  // lib hooks
19
19
  // state, ref, querystring hooks
@@ -23,6 +23,6 @@ var Button = function (props) {
23
23
  // effects
24
24
  // handlers
25
25
  return (React.createElement(MotionButton, __assign({}, props)));
26
- };
26
+ });
27
27
  export { Button };
28
28
  Button.displayName = "Button";
@@ -1,27 +1,34 @@
1
1
  import React, { ComponentProps } from "react";
2
- import { Table, TableBody, TableHead } from "../Table";
2
+ import { Table } from "../Table";
3
3
  type DataTableProps<T extends Record<string, unknown>> = {
4
- data: T[];
5
- showCheckbox?: boolean;
6
- onCheckboxChange?: (event: any, selectedModel: string) => void;
4
+ rows: T[];
5
+ checkboxSelection?: boolean;
6
+ columns: {
7
+ type?: "number" | "string";
8
+ field: keyof T;
9
+ headerName?: string;
10
+ width?: string;
11
+ minWidth?: string;
12
+ maxWidth?: string;
13
+ }[];
7
14
  /**
8
15
  * 체크박스가 있는 경우, 체크박스를 클릭했을 때 선택된 row의 index를 지정한다.
9
16
  */
10
17
  selectionModel?: string[];
11
18
  onSelectionModelChange?: (newSelectionModel: string[]) => void;
12
- /**
13
- * 페이지네이션을 위한 prop
14
- * 별도로 지정하지 않으면, data prop 기반의 페이지네이션을 사용한다.
15
- */
16
- page?: number;
17
- onPageChange?: (newPage: number) => void;
18
- rowsPerPage?: number;
19
+ paginationModel?: {
20
+ page: number;
21
+ pageSize: number;
22
+ };
23
+ onPaginationModelChange?: (model: {
24
+ page: number;
25
+ pageSize: number;
26
+ }) => void;
19
27
  /**
20
28
  * Rows의 총 갯수를 직접 지정 할 수 있다.
21
- * 값이 주어지면, data prop 기반의 페이지네이션을 사용하지 않는다.
22
- * data lazy loading을 위한 prop
29
+ * 기본적으로는 rows.length를 사용하지만, 값을 지정하면 rows.length를 사용하지 않는다.
23
30
  */
24
- totalRows?: number;
31
+ rowCount?: number;
25
32
  slots?: {
26
33
  checkbox?: React.ElementType;
27
34
  toolbar?: React.ElementType;
@@ -39,7 +46,7 @@ type DataTableProps<T extends Record<string, unknown>> = {
39
46
  [key: string]: any;
40
47
  }>;
41
48
  };
42
- } & ComponentProps<typeof Table> & Pick<ComponentProps<typeof TableHead>, "headCells"> & Pick<ComponentProps<typeof TableBody>, "cellOrder">;
49
+ } & ComponentProps<typeof Table>;
43
50
  declare function DataTable<T extends Record<string, unknown>>(props: DataTableProps<T>): React.JSX.Element;
44
51
  declare namespace DataTable {
45
52
  var displayName: string;
@@ -31,22 +31,25 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
31
31
  };
32
32
  import React, { useCallback, useEffect, useMemo, useState, } from "react";
33
33
  import Sheet from "../Sheet";
34
- import { Table, TableHead } from "../Table";
34
+ import { Table } from "../Table";
35
35
  import Checkbox from "../Checkbox";
36
36
  import Box from "../Box";
37
37
  import Stack from "../Stack";
38
38
  import Typography from "../Typography";
39
39
  import Button from "../Button";
40
+ var numberFormatter = function (value) {
41
+ return "Intl" in window ? new Intl.NumberFormat().format(value) : value;
42
+ };
40
43
  function TablePagination(props) {
41
44
  // prop destruction
42
- var page = props.page, rowsPerPage = props.rowsPerPage, totalRows = props.totalRows, onPageChange = props.onPageChange;
45
+ var _a = props.paginationModel, page = _a.page, pageSize = _a.pageSize, rowCount = props.rowCount, onPageChange = props.onPageChange;
43
46
  // lib hooks
44
47
  // state, ref, querystring hooks
45
48
  // form hooks
46
49
  // query hooks
47
50
  // calculated values
48
51
  var firstPage = 1;
49
- var lastPage = Math.ceil(totalRows / rowsPerPage);
52
+ var lastPage = Math.ceil(rowCount / pageSize);
50
53
  var beforePages = [page - 2, page - 1].filter(function (p) { return p > 1; });
51
54
  var afterPages = [page + 1, page + 2].filter(function (p) { return p <= lastPage - 1; });
52
55
  var isMoreAfterPages = lastPage > 1 && page < lastPage - 3;
@@ -69,39 +72,39 @@ function TablePagination(props) {
69
72
  React.createElement(Button, { size: "sm", variant: "plain", color: "neutral", onClick: function () { return onPageChange(page + 1); }, disabled: page === lastPage, "aria-label": "Next page" }, ">"))));
70
73
  }
71
74
  function useDataTableRenderer(_a) {
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];
75
+ var rows = _a.rows, columns = _a.columns, totalRowsProp = _a.rowCount, paginationModel = _a.paginationModel, onPaginationModelChange = _a.onPaginationModelChange, _b = _a.selectionModel, selectionModel = _b === void 0 ? [] : _b, onSelectionModelChange = _a.onSelectionModelChange;
76
+ var _c = useState((paginationModel === null || paginationModel === void 0 ? void 0 : paginationModel.page) || 1), page = _c[0], setPage = _c[1];
77
+ var pageSize = (paginationModel === null || paginationModel === void 0 ? void 0 : paginationModel.pageSize) || 20;
74
78
  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]);
79
+ var dataInPage = useMemo(function () { return rows.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize); }, [rows, page, pageSize]);
78
80
  var isAllSelected = useMemo(function () {
79
81
  return dataInPage.length > 0 &&
80
82
  dataInPage.every(function (_, i) {
81
- return selectedModelSet.has("".concat(i + (page - 1) * rowsPerPage));
83
+ return selectedModelSet.has("".concat(i + (page - 1) * pageSize));
82
84
  });
83
- }, [dataInPage, selectedModelSet, page, rowsPerPage]);
84
- var totalRows = totalRowsProp || data.length;
85
- var isTotalSelected = useMemo(function () { return totalRows > 0 && selectionModel.length === totalRows; }, [selectionModel, totalRows]);
85
+ }, [dataInPage, selectedModelSet, page, pageSize]);
86
+ var rowCount = totalRowsProp || rows.length;
87
+ var isTotalSelected = useMemo(function () { return rowCount > 0 && selectionModel.length === rowCount; }, [selectionModel, rowCount]);
86
88
  var handlePageChange = useCallback(function (newPage) {
87
89
  setPage(newPage);
88
- onPageChange === null || onPageChange === void 0 ? void 0 : onPageChange(newPage);
89
- }, [onPageChange]);
90
+ onPaginationModelChange === null || onPaginationModelChange === void 0 ? void 0 : onPaginationModelChange({ page: newPage, pageSize: pageSize });
91
+ }, [onPaginationModelChange]);
90
92
  useEffect(function () {
91
93
  handlePageChange(1);
92
- }, [totalRows]);
94
+ }, [rowCount]);
93
95
  useEffect(function () {
94
- if (page > Math.ceil(totalRows / rowsPerPage)) {
95
- handlePageChange(Math.ceil(totalRows / rowsPerPage));
96
+ if (page > Math.ceil(rowCount / pageSize)) {
97
+ handlePageChange(Math.ceil(rowCount / pageSize));
96
98
  }
97
- }, [totalRows, rowsPerPage]);
99
+ }, [rowCount, pageSize]);
98
100
  useEffect(function () {
99
101
  onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange([]);
100
102
  }, [page]);
101
103
  return {
102
- totalRows: totalRows,
104
+ rowCount: rowCount,
103
105
  page: page,
104
- onPageChange: handlePageChange,
106
+ pageSize: pageSize,
107
+ onPaginationModelChange: handlePageChange,
105
108
  dataInPage: dataInPage,
106
109
  isAllSelected: isAllSelected, // all rows are selected on this page
107
110
  isTotalSelected: isTotalSelected,
@@ -109,45 +112,36 @@ function useDataTableRenderer(_a) {
109
112
  onAllCheckboxChange: useCallback(function () {
110
113
  onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(isAllSelected
111
114
  ? []
112
- : dataInPage.map(function (_, i) { return "".concat(i + (page - 1) * rowsPerPage); }));
113
- onCheckboxChange === null || onCheckboxChange === void 0 ? void 0 : onCheckboxChange(null, '');
115
+ : dataInPage.map(function (_, i) { return "".concat(i + (page - 1) * pageSize); }));
114
116
  }, [isAllSelected, dataInPage, onSelectionModelChange]),
115
117
  onCheckboxChange: useCallback(function (event, selectedModel) {
116
118
  if (selectedModelSet.has(selectedModel)) {
117
119
  var newSelectionModel = selectionModel.filter(function (model) { return model !== selectedModel; });
118
120
  onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(newSelectionModel);
119
- onCheckboxChange === null || onCheckboxChange === void 0 ? void 0 : onCheckboxChange(event, selectedModel);
120
121
  }
121
122
  else {
122
123
  var newSelectionModel = __spreadArray(__spreadArray([], selectionModel, true), [selectedModel], false);
123
124
  onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(newSelectionModel);
124
- onCheckboxChange === null || onCheckboxChange === void 0 ? void 0 : onCheckboxChange(event, selectedModel);
125
125
  }
126
126
  }, [selectionModel, onSelectionModelChange]),
127
- renderCellOrder: useMemo(function () { return cellOrder || Object.keys(data[0] || {}); }, [data, cellOrder]),
128
- renderHeadCells: useMemo(function () {
129
- return headCells ||
127
+ columns: useMemo(function () {
128
+ return columns ||
130
129
  // fallback
131
- Object.keys(data[0] || {}).map(function (key) { return ({
132
- label: key,
130
+ Object.keys(rows[0] || {}).map(function (key) { return ({
131
+ field: key,
133
132
  }); });
134
- }, [data, headCells]),
133
+ }, [rows, columns]),
135
134
  onTotalSelect: useCallback(function () {
136
- onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(isTotalSelected ? [] : data.map(function (_, i) { return "".concat(i); }));
137
- }, [isTotalSelected, data, onSelectionModelChange]),
135
+ onSelectionModelChange === null || onSelectionModelChange === void 0 ? void 0 : onSelectionModelChange(isTotalSelected ? [] : rows.map(function (_, i) { return "".concat(i); }));
136
+ }, [isTotalSelected, rows, onSelectionModelChange]),
138
137
  };
139
138
  }
140
139
  function DataTable(props) {
141
140
  // prop destruction
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"]);
141
+ var rows = props.rows, checkboxSelection = props.checkboxSelection, selectionModel = props.selectionModel, onSelectionModelChange = props.onSelectionModelChange, _ = props.rowCount, // rowCount is used in useDataTableRenderer
142
+ paginationModel = props.paginationModel, _a = props.slots, _b = _a === void 0 ? {} : _a, _c = _b.checkbox, RenderCheckbox = _c === void 0 ? Checkbox : _c, Toolbar = _b.toolbar, Footer = _b.footer, _d = props.slotProps, _e = _d === void 0 ? {} : _d, _f = _e.checkbox, checkboxProps = _f === void 0 ? {} : _f, toolbarProps = _e.toolbar, _g = _e.background, backgroundProps = _g === void 0 ? {} : _g, innerProps = __rest(props, ["rows", "checkboxSelection", "selectionModel", "onSelectionModelChange", "rowCount", "paginationModel", "slots", "slotProps"]);
149
143
  // lib hooks
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;
144
+ var _h = useDataTableRenderer(props), columns = _h.columns, isAllSelected = _h.isAllSelected, isSelectedRow = _h.isSelectedRow, onAllCheckboxChange = _h.onAllCheckboxChange, onCheckboxChange = _h.onCheckboxChange, rowCount = _h.rowCount, page = _h.page, pageSize = _h.pageSize, onPaginationModelChange = _h.onPaginationModelChange, dataInPage = _h.dataInPage, isTotalSelected = _h.isTotalSelected, onTotalSelect = _h.onTotalSelect;
151
145
  // state, ref, querystring hooks
152
146
  // form hooks
153
147
  // query hooks
@@ -161,21 +155,21 @@ function DataTable(props) {
161
155
  }, justifyContent: "space-between", alignItems: "center" },
162
156
  React.createElement(Stack, { direction: "row", spacing: 1 },
163
157
  !isAllSelected && (React.createElement(Typography, { level: "body-xs" },
164
- (selectionModel === null || selectionModel === void 0 ? void 0 : selectionModel.length) || 0,
158
+ numberFormatter((selectionModel === null || selectionModel === void 0 ? void 0 : selectionModel.length) || 0),
165
159
  " items selected")),
166
160
  isAllSelected && !isTotalSelected && (React.createElement(Stack, { direction: "row", spacing: 1, alignItems: "center" },
167
161
  React.createElement(Typography, { level: "body-xs" },
168
- "All ", selectionModel === null || selectionModel === void 0 ? void 0 :
169
- selectionModel.length,
162
+ "All ",
163
+ numberFormatter((selectionModel === null || selectionModel === void 0 ? void 0 : selectionModel.length) || 0),
170
164
  " items on this page are selected."),
171
165
  React.createElement(Button, { size: "sm", variant: "plain", onClick: onTotalSelect },
172
166
  "Select all ",
173
- data.length,
167
+ numberFormatter(rows.length),
174
168
  " items"))),
175
169
  isTotalSelected && (React.createElement(Stack, { direction: "row", spacing: 1, alignItems: "center" },
176
170
  React.createElement(Typography, { level: "body-xs" },
177
171
  "All ",
178
- data.length,
172
+ numberFormatter(rows.length),
179
173
  " items are selected."),
180
174
  React.createElement(Button, { size: "sm", variant: "plain", color: "danger", onClick: onTotalSelect }, "Cancel")))),
181
175
  Toolbar && React.createElement(Toolbar, __assign({}, (toolbarProps || {})))),
@@ -193,14 +187,27 @@ function DataTable(props) {
193
187
  },
194
188
  },
195
189
  ] }, innerProps),
196
- React.createElement(TableHead, { showCheckbox: showCheckbox, headCells: renderHeadCells || [], onCheckboxChange: onAllCheckboxChange, slotProps: {
197
- checkbox: __assign({ checked: isAllSelected, indeterminate: (selectionModel || []).length > 0 && !isAllSelected }, checkboxProps),
198
- } }),
190
+ React.createElement("thead", null,
191
+ React.createElement("tr", null,
192
+ checkboxSelection && (React.createElement("th", { style: {
193
+ width: "40px",
194
+ textAlign: "center",
195
+ } },
196
+ React.createElement(RenderCheckbox, __assign({ onChange: onAllCheckboxChange, checked: isAllSelected, indeterminate: (selectionModel || []).length > 0 && !isAllSelected }, checkboxProps)))),
197
+ columns.map(function (column) {
198
+ var _a;
199
+ return (React.createElement("th", { key: column.field, style: {
200
+ width: column.width,
201
+ minWidth: column.minWidth,
202
+ maxWidth: column.maxWidth,
203
+ textAlign: column.type === "number" ? "end" : "start",
204
+ } }, (_a = column.headerName) !== null && _a !== void 0 ? _a : column.field));
205
+ }))),
199
206
  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
207
+ var rowId = "".concat(rowIndex + (page - 1) * pageSize);
208
+ return (React.createElement("tr", { key: rowId, role: checkboxSelection ? "checkbox" : undefined, tabIndex: checkboxSelection ? -1 : undefined, onClick: checkboxSelection
202
209
  ? function (e) { return onCheckboxChange(e, rowId); }
203
- : undefined, "aria-checked": showCheckbox ? isSelectedRow(rowId) : undefined, style: showCheckbox && isSelectedRow(rowId)
210
+ : undefined, "aria-checked": checkboxSelection ? isSelectedRow(rowId) : undefined, style: checkboxSelection && isSelectedRow(rowId)
204
211
  ? {
205
212
  "--TableCell-dataBackground": "var(--TableCell-selectedBackground)",
206
213
  "--TableCell-headBackground": "var(--TableCell-selectedBackground)",
@@ -208,14 +215,16 @@ function DataTable(props) {
208
215
  : {
209
216
  "--TableCell-headBackground": "transparent",
210
217
  } },
211
- showCheckbox && (React.createElement("th", { scope: "row", style: {
218
+ checkboxSelection && (React.createElement("th", { scope: "row", style: {
212
219
  textAlign: "center",
213
220
  } },
214
221
  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])); })));
222
+ columns.map(function (column) { return (React.createElement("td", { key: column.field, style: {
223
+ textAlign: column.type === "number" ? "end" : "start",
224
+ } }, row[column.field])); })));
216
225
  })),
217
226
  Footer && React.createElement(Footer, null))),
218
- React.createElement(TablePagination, { page: page, rowsPerPage: rowsPerPage, totalRows: totalRows, onPageChange: onPageChange, onRowsPerPageChange: function () { } })));
227
+ React.createElement(TablePagination, { paginationModel: { page: page, pageSize: pageSize }, rowCount: rowCount, onPageChange: onPaginationModelChange, onRowsPerPageChange: function () { } })));
219
228
  }
220
229
  export { DataTable };
221
230
  DataTable.displayName = "DataTable";
@@ -29,6 +29,12 @@ var defaultTheme = extendTheme({
29
29
  },
30
30
  },
31
31
  },
32
+ JoyTooltip: {
33
+ defaultProps: {
34
+ size: "sm",
35
+ placement: "top",
36
+ },
37
+ },
32
38
  },
33
39
  });
34
40
  function ThemeProvider(props) {
package/framer/index.js CHANGED
@@ -31912,16 +31912,17 @@ Box2.displayName = "Box";
31912
31912
  var Box_default2 = Box2;
31913
31913
 
31914
31914
  // src/components/Button/Button.tsx
31915
+ import { forwardRef as forwardRef75 } from "react";
31915
31916
  import { motion as motion3 } from "framer-motion";
31916
31917
  var MotionButton = motion3(Button_default);
31917
- var Button3 = (props) => {
31918
+ var Button3 = forwardRef75((props) => {
31918
31919
  return /* @__PURE__ */ jsx2(
31919
31920
  MotionButton,
31920
31921
  {
31921
31922
  ...props
31922
31923
  }
31923
31924
  );
31924
- };
31925
+ });
31925
31926
  Button3.displayName = "Button";
31926
31927
 
31927
31928
  // src/components/Button/index.ts
@@ -31939,7 +31940,7 @@ Checkbox3.displayName = "Checkbox";
31939
31940
  var Checkbox_default2 = Checkbox3;
31940
31941
 
31941
31942
  // src/components/Container/Container.tsx
31942
- import { forwardRef as forwardRef75 } from "react";
31943
+ import { forwardRef as forwardRef76 } from "react";
31943
31944
  var ContainerRoot = styled_default2("div", {
31944
31945
  name: "Container",
31945
31946
  slot: "root",
@@ -31971,7 +31972,7 @@ var ContainerRoot = styled_default2("div", {
31971
31972
  }
31972
31973
  })
31973
31974
  );
31974
- var Container = forwardRef75(function Container2(props, ref) {
31975
+ var Container = forwardRef76(function Container2(props, ref) {
31975
31976
  return /* @__PURE__ */ jsx2(ContainerRoot, { ref, ...props });
31976
31977
  });
31977
31978
  Container.displayName = "Container";
@@ -32095,10 +32096,15 @@ Typography3.displayName = "Typography";
32095
32096
  var Typography_default2 = Typography3;
32096
32097
 
32097
32098
  // src/components/DataTable/DataTable.tsx
32099
+ var numberFormatter = (value) => "Intl" in window ? new Intl.NumberFormat().format(value) : value;
32098
32100
  function TablePagination(props) {
32099
- const { page, rowsPerPage, totalRows, onPageChange } = props;
32101
+ const {
32102
+ paginationModel: { page, pageSize },
32103
+ rowCount,
32104
+ onPageChange
32105
+ } = props;
32100
32106
  const firstPage = 1;
32101
- const lastPage = Math.ceil(totalRows / rowsPerPage);
32107
+ const lastPage = Math.ceil(rowCount / pageSize);
32102
32108
  const beforePages = [page - 2, page - 1].filter((p) => p > 1);
32103
32109
  const afterPages = [page + 1, page + 2].filter((p) => p <= lastPage - 1);
32104
32110
  const isMoreAfterPages = lastPage > 1 && page < lastPage - 3;
@@ -32207,62 +32213,58 @@ function TablePagination(props) {
32207
32213
  );
32208
32214
  }
32209
32215
  function useDataTableRenderer({
32210
- data,
32211
- cellOrder,
32212
- headCells,
32213
- totalRows: totalRowsProp,
32214
- page: pageProp = 1,
32215
- onPageChange,
32216
- rowsPerPage,
32216
+ rows,
32217
+ columns,
32218
+ rowCount: totalRowsProp,
32219
+ paginationModel,
32220
+ onPaginationModelChange,
32217
32221
  selectionModel = [],
32218
- onSelectionModelChange,
32219
- onCheckboxChange
32222
+ onSelectionModelChange
32220
32223
  }) {
32221
- const [page, setPage] = useState21(pageProp);
32224
+ const [page, setPage] = useState21(paginationModel?.page || 1);
32225
+ const pageSize = paginationModel?.pageSize || 20;
32222
32226
  const selectedModelSet = useMemo32(
32223
32227
  () => new Set(selectionModel),
32224
32228
  [selectionModel]
32225
32229
  );
32226
32230
  const dataInPage = useMemo32(
32227
- () => data.slice(
32228
- (page - 1) * rowsPerPage,
32229
- (page - 1) * rowsPerPage + rowsPerPage
32230
- ),
32231
- [data, page, rowsPerPage]
32231
+ () => rows.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize),
32232
+ [rows, page, pageSize]
32232
32233
  );
32233
32234
  const isAllSelected = useMemo32(
32234
32235
  () => dataInPage.length > 0 && dataInPage.every(
32235
- (_4, i) => selectedModelSet.has(`${i + (page - 1) * rowsPerPage}`)
32236
+ (_4, i) => selectedModelSet.has(`${i + (page - 1) * pageSize}`)
32236
32237
  ),
32237
- [dataInPage, selectedModelSet, page, rowsPerPage]
32238
+ [dataInPage, selectedModelSet, page, pageSize]
32238
32239
  );
32239
- const totalRows = totalRowsProp || data.length;
32240
+ const rowCount = totalRowsProp || rows.length;
32240
32241
  const isTotalSelected = useMemo32(
32241
- () => totalRows > 0 && selectionModel.length === totalRows,
32242
- [selectionModel, totalRows]
32242
+ () => rowCount > 0 && selectionModel.length === rowCount,
32243
+ [selectionModel, rowCount]
32243
32244
  );
32244
32245
  const handlePageChange = useCallback23(
32245
32246
  (newPage) => {
32246
32247
  setPage(newPage);
32247
- onPageChange?.(newPage);
32248
+ onPaginationModelChange?.({ page: newPage, pageSize });
32248
32249
  },
32249
- [onPageChange]
32250
+ [onPaginationModelChange]
32250
32251
  );
32251
32252
  useEffect33(() => {
32252
32253
  handlePageChange(1);
32253
- }, [totalRows]);
32254
+ }, [rowCount]);
32254
32255
  useEffect33(() => {
32255
- if (page > Math.ceil(totalRows / rowsPerPage)) {
32256
- handlePageChange(Math.ceil(totalRows / rowsPerPage));
32256
+ if (page > Math.ceil(rowCount / pageSize)) {
32257
+ handlePageChange(Math.ceil(rowCount / pageSize));
32257
32258
  }
32258
- }, [totalRows, rowsPerPage]);
32259
+ }, [rowCount, pageSize]);
32259
32260
  useEffect33(() => {
32260
32261
  onSelectionModelChange?.([]);
32261
32262
  }, [page]);
32262
32263
  return {
32263
- totalRows,
32264
+ rowCount,
32264
32265
  page,
32265
- onPageChange: handlePageChange,
32266
+ pageSize,
32267
+ onPaginationModelChange: handlePageChange,
32266
32268
  dataInPage,
32267
32269
  isAllSelected,
32268
32270
  // all rows are selected on this page
@@ -32273,9 +32275,8 @@ function useDataTableRenderer({
32273
32275
  ),
32274
32276
  onAllCheckboxChange: useCallback23(() => {
32275
32277
  onSelectionModelChange?.(
32276
- isAllSelected ? [] : dataInPage.map((_4, i) => `${i + (page - 1) * rowsPerPage}`)
32278
+ isAllSelected ? [] : dataInPage.map((_4, i) => `${i + (page - 1) * pageSize}`)
32277
32279
  );
32278
- onCheckboxChange?.(null, "");
32279
32280
  }, [isAllSelected, dataInPage, onSelectionModelChange]),
32280
32281
  onCheckboxChange: useCallback23(
32281
32282
  (event, selectedModel) => {
@@ -32284,50 +32285,36 @@ function useDataTableRenderer({
32284
32285
  (model) => model !== selectedModel
32285
32286
  );
32286
32287
  onSelectionModelChange?.(newSelectionModel);
32287
- onCheckboxChange?.(event, selectedModel);
32288
32288
  } else {
32289
32289
  const newSelectionModel = [...selectionModel, selectedModel];
32290
32290
  onSelectionModelChange?.(newSelectionModel);
32291
- onCheckboxChange?.(event, selectedModel);
32292
32291
  }
32293
32292
  },
32294
32293
  [selectionModel, onSelectionModelChange]
32295
32294
  ),
32296
- renderCellOrder: useMemo32(
32297
- () => cellOrder || Object.keys(data[0] || {}),
32298
- [data, cellOrder]
32299
- ),
32300
- renderHeadCells: useMemo32(
32301
- () => headCells || // fallback
32302
- Object.keys(data[0] || {}).map((key) => ({
32303
- label: key
32295
+ columns: useMemo32(
32296
+ () => columns || // fallback
32297
+ Object.keys(rows[0] || {}).map((key) => ({
32298
+ field: key
32304
32299
  })),
32305
- [data, headCells]
32300
+ [rows, columns]
32306
32301
  ),
32307
32302
  onTotalSelect: useCallback23(() => {
32308
32303
  onSelectionModelChange?.(
32309
- isTotalSelected ? [] : data.map((_4, i) => `${i}`)
32304
+ isTotalSelected ? [] : rows.map((_4, i) => `${i}`)
32310
32305
  );
32311
- }, [isTotalSelected, data, onSelectionModelChange])
32306
+ }, [isTotalSelected, rows, onSelectionModelChange])
32312
32307
  };
32313
32308
  }
32314
32309
  function DataTable(props) {
32315
32310
  const {
32316
- data,
32317
- showCheckbox,
32318
- headCells,
32319
- cellOrder,
32311
+ rows,
32312
+ checkboxSelection,
32320
32313
  selectionModel,
32321
32314
  onSelectionModelChange,
32322
- totalRows: _4,
32323
- // totalRows is used in useDataTableRenderer
32324
- rowsPerPage = 20,
32325
- page: _page,
32326
- // page is used in useDataTableRenderer
32327
- onPageChange: _onPageChange,
32328
- // onPageChange is used in useDataTableRenderer
32329
- onCheckboxChange: _onCheckboxChange,
32330
- // onCheckboxChange is used in useDataTableRenderer
32315
+ rowCount: _4,
32316
+ // rowCount is used in useDataTableRenderer
32317
+ paginationModel,
32331
32318
  slots: {
32332
32319
  checkbox: RenderCheckbox = Checkbox_default2,
32333
32320
  toolbar: Toolbar,
@@ -32341,19 +32328,19 @@ function DataTable(props) {
32341
32328
  ...innerProps
32342
32329
  } = props;
32343
32330
  const {
32344
- renderCellOrder,
32345
- renderHeadCells,
32331
+ columns,
32346
32332
  isAllSelected,
32347
32333
  isSelectedRow,
32348
32334
  onAllCheckboxChange,
32349
32335
  onCheckboxChange,
32350
- totalRows,
32336
+ rowCount,
32351
32337
  page,
32352
- onPageChange,
32338
+ pageSize,
32339
+ onPaginationModelChange,
32353
32340
  dataInPage,
32354
32341
  isTotalSelected,
32355
32342
  onTotalSelect
32356
- } = useDataTableRenderer({ ...props, rowsPerPage });
32343
+ } = useDataTableRenderer(props);
32357
32344
  return /* @__PURE__ */ jsxs2(Box_default2, { children: [
32358
32345
  /* @__PURE__ */ jsxs2(
32359
32346
  Stack_default2,
@@ -32368,25 +32355,25 @@ function DataTable(props) {
32368
32355
  children: [
32369
32356
  /* @__PURE__ */ jsxs2(Stack_default2, { direction: "row", spacing: 1, children: [
32370
32357
  !isAllSelected && /* @__PURE__ */ jsxs2(Typography_default2, { level: "body-xs", children: [
32371
- selectionModel?.length || 0,
32358
+ numberFormatter(selectionModel?.length || 0),
32372
32359
  " items selected"
32373
32360
  ] }),
32374
32361
  isAllSelected && !isTotalSelected && /* @__PURE__ */ jsxs2(Stack_default2, { direction: "row", spacing: 1, alignItems: "center", children: [
32375
32362
  /* @__PURE__ */ jsxs2(Typography_default2, { level: "body-xs", children: [
32376
32363
  "All ",
32377
- selectionModel?.length,
32364
+ numberFormatter(selectionModel?.length || 0),
32378
32365
  " items on this page are selected."
32379
32366
  ] }),
32380
32367
  /* @__PURE__ */ jsxs2(Button_default2, { size: "sm", variant: "plain", onClick: onTotalSelect, children: [
32381
32368
  "Select all ",
32382
- data.length,
32369
+ numberFormatter(rows.length),
32383
32370
  " items"
32384
32371
  ] })
32385
32372
  ] }),
32386
32373
  isTotalSelected && /* @__PURE__ */ jsxs2(Stack_default2, { direction: "row", spacing: 1, alignItems: "center", children: [
32387
32374
  /* @__PURE__ */ jsxs2(Typography_default2, { level: "body-xs", children: [
32388
32375
  "All ",
32389
- data.length,
32376
+ numberFormatter(rows.length),
32390
32377
  " items are selected."
32391
32378
  ] }),
32392
32379
  /* @__PURE__ */ jsx2(
@@ -32427,38 +32414,56 @@ function DataTable(props) {
32427
32414
  ],
32428
32415
  ...innerProps,
32429
32416
  children: [
32430
- /* @__PURE__ */ jsx2(
32431
- TableHead,
32432
- {
32433
- showCheckbox,
32434
- headCells: renderHeadCells || [],
32435
- onCheckboxChange: onAllCheckboxChange,
32436
- slotProps: {
32437
- checkbox: {
32438
- checked: isAllSelected,
32439
- indeterminate: (selectionModel || []).length > 0 && !isAllSelected,
32440
- ...checkboxProps
32441
- }
32417
+ /* @__PURE__ */ jsx2("thead", { children: /* @__PURE__ */ jsxs2("tr", { children: [
32418
+ checkboxSelection && /* @__PURE__ */ jsx2(
32419
+ "th",
32420
+ {
32421
+ style: {
32422
+ width: "40px",
32423
+ textAlign: "center"
32424
+ },
32425
+ children: /* @__PURE__ */ jsx2(
32426
+ RenderCheckbox,
32427
+ {
32428
+ onChange: onAllCheckboxChange,
32429
+ checked: isAllSelected,
32430
+ indeterminate: (selectionModel || []).length > 0 && !isAllSelected,
32431
+ ...checkboxProps
32432
+ }
32433
+ )
32442
32434
  }
32443
- }
32444
- ),
32435
+ ),
32436
+ columns.map((column2) => /* @__PURE__ */ jsx2(
32437
+ "th",
32438
+ {
32439
+ style: {
32440
+ width: column2.width,
32441
+ minWidth: column2.minWidth,
32442
+ maxWidth: column2.maxWidth,
32443
+ textAlign: column2.type === "number" ? "end" : "start"
32444
+ },
32445
+ children: column2.headerName ?? column2.field
32446
+ },
32447
+ column2.field
32448
+ ))
32449
+ ] }) }),
32445
32450
  /* @__PURE__ */ jsx2("tbody", { children: dataInPage.map((row, rowIndex) => {
32446
- const rowId = `${rowIndex + (page - 1) * rowsPerPage}`;
32451
+ const rowId = `${rowIndex + (page - 1) * pageSize}`;
32447
32452
  return /* @__PURE__ */ jsxs2(
32448
32453
  "tr",
32449
32454
  {
32450
- role: showCheckbox ? "checkbox" : void 0,
32451
- tabIndex: showCheckbox ? -1 : void 0,
32452
- onClick: showCheckbox ? (e) => onCheckboxChange(e, rowId) : void 0,
32453
- "aria-checked": showCheckbox ? isSelectedRow(rowId) : void 0,
32454
- style: showCheckbox && isSelectedRow(rowId) ? {
32455
+ role: checkboxSelection ? "checkbox" : void 0,
32456
+ tabIndex: checkboxSelection ? -1 : void 0,
32457
+ onClick: checkboxSelection ? (e) => onCheckboxChange(e, rowId) : void 0,
32458
+ "aria-checked": checkboxSelection ? isSelectedRow(rowId) : void 0,
32459
+ style: checkboxSelection && isSelectedRow(rowId) ? {
32455
32460
  "--TableCell-dataBackground": "var(--TableCell-selectedBackground)",
32456
32461
  "--TableCell-headBackground": "var(--TableCell-selectedBackground)"
32457
32462
  } : {
32458
32463
  "--TableCell-headBackground": "transparent"
32459
32464
  },
32460
32465
  children: [
32461
- showCheckbox && /* @__PURE__ */ jsx2(
32466
+ checkboxSelection && /* @__PURE__ */ jsx2(
32462
32467
  "th",
32463
32468
  {
32464
32469
  scope: "row",
@@ -32475,7 +32480,16 @@ function DataTable(props) {
32475
32480
  )
32476
32481
  }
32477
32482
  ),
32478
- renderCellOrder.map((cellKey) => /* @__PURE__ */ jsx2("td", { children: row[cellKey] }, cellKey))
32483
+ columns.map((column2) => /* @__PURE__ */ jsx2(
32484
+ "td",
32485
+ {
32486
+ style: {
32487
+ textAlign: column2.type === "number" ? "end" : "start"
32488
+ },
32489
+ children: row[column2.field]
32490
+ },
32491
+ column2.field
32492
+ ))
32479
32493
  ]
32480
32494
  },
32481
32495
  rowId
@@ -32490,10 +32504,9 @@ function DataTable(props) {
32490
32504
  /* @__PURE__ */ jsx2(
32491
32505
  TablePagination,
32492
32506
  {
32493
- page,
32494
- rowsPerPage,
32495
- totalRows,
32496
- onPageChange,
32507
+ paginationModel: { page, pageSize },
32508
+ rowCount,
32509
+ onPageChange: onPaginationModelChange,
32497
32510
  onRowsPerPageChange: () => {
32498
32511
  }
32499
32512
  }
@@ -32762,6 +32775,12 @@ var defaultTheme4 = extendTheme({
32762
32775
  }
32763
32776
  })
32764
32777
  }
32778
+ },
32779
+ JoyTooltip: {
32780
+ defaultProps: {
32781
+ size: "sm",
32782
+ placement: "top"
32783
+ }
32765
32784
  }
32766
32785
  }
32767
32786
  });
@@ -33025,7 +33044,8 @@ var dataTablePropertyControls = {
33025
33044
  // defaultValue:
33026
33045
  // "https://sharadcodes.github.io/noob-cms/data/MOCK_DATA.csv",
33027
33046
  },
33028
- showCheckbox: {
33047
+ checkboxSelection: {
33048
+ title: "Show Checkbox",
33029
33049
  type: ControlType7.Boolean,
33030
33050
  defaultValue: true
33031
33051
  },
@@ -33043,13 +33063,15 @@ var dataTablePropertyControls = {
33043
33063
  optionTitles: ["None", "Odd", "Even"],
33044
33064
  defaultValue: void 0
33045
33065
  },
33046
- headCells: {
33066
+ columns: {
33047
33067
  type: ControlType7.Array,
33068
+ description: "Column\uC758 \uC0C1\uC138 \uC124\uC815\uC774 \uD544\uC694\uD55C \uACBD\uC6B0 \uC0AC\uC6A9",
33048
33069
  control: {
33049
33070
  type: ControlType7.Object,
33050
33071
  controls: {
33051
- label: {
33052
- type: ControlType7.String
33072
+ field: {
33073
+ type: ControlType7.String,
33074
+ description: "Column Name. CSV\uC5D0 \uC788\uB294 \uAC12\uC744 \uADF8\uB300\uB85C \uB123\uC5B4\uC57C \uD55C\uB2E4."
33053
33075
  },
33054
33076
  width: {
33055
33077
  type: ControlType7.String
@@ -33062,7 +33084,7 @@ var dataTablePropertyControls = {
33062
33084
  },
33063
33085
  defaultValue: []
33064
33086
  },
33065
- rowsPerPage: {
33087
+ pageSize: {
33066
33088
  type: ControlType7.Number,
33067
33089
  defaultValue: 20
33068
33090
  },
@@ -33074,10 +33096,10 @@ var dataTablePropertyControls = {
33074
33096
  type: ControlType7.Boolean,
33075
33097
  defaultValue: false
33076
33098
  },
33077
- onPageChange: {
33099
+ onPaginationModelChange: {
33078
33100
  type: ControlType7.EventHandler
33079
33101
  },
33080
- onCheckboxChange: {
33102
+ onSelectionModelChange: {
33081
33103
  type: ControlType7.EventHandler
33082
33104
  },
33083
33105
  toolbar: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ceed/ads",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "description": "UI tool for Ecube Labs front-end developers",
@@ -53,6 +53,5 @@
53
53
  "type": "git",
54
54
  "url": "git+ssh://git@github.com/Ecube-Labs/hds.git"
55
55
  },
56
- "packageManager": "yarn@4.1.0",
57
- "stableVersion": "0.0.17"
56
+ "packageManager": "yarn@4.1.0"
58
57
  }