@uxf/data-grid 10.0.0-beta.9 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/data-grid.js +16 -24
  2. package/data-grid.stories.js +10 -9
  3. package/hooks/use-rdg-visuals.d.ts +18 -0
  4. package/hooks/use-rdg-visuals.js +47 -0
  5. package/hooks/useColumns.js +2 -2
  6. package/index.d.ts +1 -1
  7. package/index.js +1 -1
  8. package/package.json +12 -10
  9. package/store/actions.d.ts +3 -3
  10. package/store/reducer.d.ts +1 -1
  11. package/tailwindui/body-cell/body-cell-boolean.js +1 -1
  12. package/tailwindui/body-cell/body-cell-date.js +1 -1
  13. package/tailwindui/body-cell/body-cell-datetime.js +1 -1
  14. package/tailwindui/body-cell/body-cell-email.js +1 -1
  15. package/tailwindui/body-cell/body-cell-phone.js +1 -1
  16. package/tailwindui/body-cell/body-cell-url.js +1 -1
  17. package/tailwindui/body-cell/index.js +3 -3
  18. package/tailwindui/components/action-cell-base.js +5 -3
  19. package/tailwindui/components/drawer.js +17 -10
  20. package/tailwindui/components/no-rows-fallback.js +1 -1
  21. package/tailwindui/components/pagination-rows-per-page-select.js +1 -1
  22. package/tailwindui/components/select-row-checkbox.js +5 -6
  23. package/tailwindui/components/selected-rows-toolbar.js +1 -1
  24. package/tailwindui/components/toolbar-control.js +27 -9
  25. package/tailwindui/components/toolbar-customs.js +1 -1
  26. package/tailwindui/components/toolbar-tabs.js +3 -3
  27. package/tailwindui/data-grid.d.ts +1 -1
  28. package/tailwindui/data-grid.js +1 -1
  29. package/tailwindui/filter-handler/bool-filter.js +1 -1
  30. package/tailwindui/filter-handler/boolean-filter.js +3 -3
  31. package/tailwindui/filter-handler/index.js +2 -1
  32. package/tailwindui/filter-handler/interval-filter.js +1 -1
  33. package/tailwindui/filter-handler/select-filter.js +1 -1
  34. package/tailwindui/filter-handler/text-filter.js +1 -1
  35. package/tailwindui/index.d.ts +1 -1
  36. package/tailwindui/index.js +1 -1
  37. package/tailwindui/styles.css +371 -131
  38. package/tailwindui/ui.js +9 -9
  39. package/types/api.d.ts +2 -2
  40. package/types/components.d.ts +9 -8
  41. package/types/core.d.ts +1 -0
  42. package/types/data-grid-props.d.ts +5 -4
  43. package/types/index.d.ts +3 -3
  44. package/types/index.js +3 -3
  45. package/types/schema.d.ts +5 -2
  46. package/types/schema.js +6 -0
  47. package/types/state.d.ts +2 -2
  48. package/types/ui-components.d.ts +1 -1
  49. package/utils.d.ts +2 -2
package/data-grid.js CHANGED
@@ -28,27 +28,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.DataGrid = void 0;
30
30
  const react_1 = __importStar(require("react"));
31
- const reducer_1 = require("./store/reducer");
32
- const utils_1 = require("./utils");
33
31
  const react_data_grid_1 = __importDefault(require("react-data-grid"));
32
+ const use_rdg_visuals_1 = require("./hooks/use-rdg-visuals");
34
33
  const useColumns_1 = require("./hooks/useColumns");
34
+ const actions_1 = require("./store/actions");
35
+ const reducer_1 = require("./store/reducer");
35
36
  const footer_1 = require("./tailwindui/components/footer");
36
37
  const show_1 = require("./tailwindui/show");
37
- const actions_1 = require("./store/actions");
38
+ const utils_1 = require("./utils");
38
39
  const defaultKeyExtractor = (r) => {
39
40
  return r.id;
40
41
  };
41
42
  // eslint-disable-next-line react/require-optimization
42
43
  const DataGrid = (props) => {
43
- var _a, _b, _c, _d, _e;
44
- const rowHeight = (_a = props.rowHeight) !== null && _a !== void 0 ? _a : 44;
45
- const headerRowHeight = (_b = props.headerRowHeight) !== null && _b !== void 0 ? _b : 36;
44
+ var _a, _b, _c;
46
45
  const { LinearProgress, Container, FilterList, Pagination, PaginationCounts, PaginationRowsPerPageSelect, SelectedRowsToolbar, NoRowsFallback, SelectRowCheckbox, Toolbar, ToolbarControl, ToolbarCustoms, ToolbarTabs, } = props.ui;
47
46
  const [state, dispatch] = (0, react_1.useReducer)(props.debug ? reducer_1.debugReducer : reducer_1.reducer, (0, reducer_1.getInitialState)(props.schema, props.initialState));
48
- const [mounted, setMounted] = (0, react_1.useState)(false);
49
- (0, react_1.useEffect)(() => {
50
- setMounted(true);
51
- }, []);
52
47
  // TODO @vejvis - tady vyřešit problém se závislostma v useCallbacku
53
48
  const schema = props.schema;
54
49
  const gridName = props.gridName;
@@ -86,14 +81,11 @@ const DataGrid = (props) => {
86
81
  const onFilter = (0, react_1.useCallback)((value) => {
87
82
  dispatch(actions_1.dataGridActions.filter(value));
88
83
  }, [dispatch]);
89
- const rows = (_d = (_c = state.response) === null || _c === void 0 ? void 0 : _c.result) !== null && _d !== void 0 ? _d : [];
84
+ const rows = (_b = (_a = state.response) === null || _a === void 0 ? void 0 : _a.result) !== null && _b !== void 0 ? _b : [];
90
85
  const columns = (0, useColumns_1.useColumns)(props, onReload);
91
- const contentHeight = typeof rowHeight === "function"
92
- ? rows.reduce((prev, curr) => prev + rowHeight({ type: "ROW", row: curr }))
93
- : (rowHeight + 1) * rows.length;
94
86
  const components = (0, react_1.useMemo)(() => {
95
87
  return {
96
- checkboxFormatter: SelectRowCheckbox,
88
+ renderCheckbox: (args) => react_1.default.createElement(SelectRowCheckbox, { ...args }),
97
89
  noRowsFallback: react_1.default.createElement(NoRowsFallback, { error: state.error, loading: !!state.loading }),
98
90
  };
99
91
  }, [SelectRowCheckbox, NoRowsFallback, state.error, state.loading]);
@@ -111,22 +103,22 @@ const DataGrid = (props) => {
111
103
  dispatch(actions_1.dataGridActions.sortClear());
112
104
  }
113
105
  };
114
- const reactDataGridStyles = {
115
- border: 0,
116
- borderRadius: 4,
117
- height: contentHeight + headerRowHeight + (rows.length === 0 ? 44 : 0) + 4,
118
- overflowY: "hidden",
119
- };
106
+ const rdgVisuals = (0, use_rdg_visuals_1.useRdgVisuals)({
107
+ headerRowHeight: props.headerRowHeight,
108
+ mode: props.mode,
109
+ rowHeight: props.rowHeight,
110
+ rows,
111
+ });
120
112
  return (react_1.default.createElement(react_1.default.Fragment, null,
121
113
  react_1.default.createElement(Container, { noBorder: props.noBorder, className: props.className },
122
114
  react_1.default.createElement(Toolbar, { noBorder: props.noBorder },
123
115
  react_1.default.createElement(ToolbarTabs, { activeTab: state.request.tab, onChange: (tab) => dispatch(actions_1.dataGridActions.changeTab(tab)), schema: props.schema }),
124
- react_1.default.createElement(ToolbarControl, { gridName: props.gridName, dispatch: dispatch, filterHandlers: props.ui.FilterHandlers, noBorder: props.noBorder, schema: props.schema, filtersData: state.request.f, fulltextValue: state.request.search, onFulltextChange: (value) => dispatch(actions_1.dataGridActions.search(value)), showFulltext: props.schema.fullText }),
116
+ react_1.default.createElement(ToolbarControl, { gridName: props.gridName, dispatch: dispatch, filterHandlers: props.ui.FilterHandlers, noBorder: props.noBorder, schema: props.schema, onFulltextChange: (value) => dispatch(actions_1.dataGridActions.search(value)), showFulltext: props.schema.fullText, hiddenColumns: props.hiddenColumns, onChangeHiddenColumns: props.onChangeHiddenColumns, onCsvDownload: props.onCsvDownload, state: state }),
125
117
  react_1.default.createElement(ToolbarCustoms, { buttons: props.customActions })),
126
118
  react_1.default.createElement(LinearProgress, { loading: !!state.loading }),
127
119
  react_1.default.createElement(FilterList, { gridName: props.gridName, onFilter: onFilter, filters: props.schema.filters, filtersData: state.request.f, filterHandlers: props.ui.FilterHandlers, noBorder: props.noBorder }),
128
- react_1.default.createElement(show_1.Show, { when: mounted },
129
- react_1.default.createElement(react_data_grid_1.default, { style: reactDataGridStyles, className: `uxf-data-grid__table ${props.mode === "light" ? "rdg-light" : props.mode === "dark" ? "rdg-dark" : ""}`, columns: columns, rows: rows, enableVirtualization: false, onSortColumnsChange: onSortColumnChange, sortColumns: sortColumns, rowHeight: rowHeight, headerRowHeight: headerRowHeight, rowClass: props.rowClass, rowKeyGetter: (_e = props.keyExtractor) !== null && _e !== void 0 ? _e : defaultKeyExtractor, selectedRows: props.selectedRows, onSelectedRowsChange: props.onChangeSelectedRows, components: components })),
120
+ react_1.default.createElement(show_1.Show, { when: rdgVisuals.ready },
121
+ react_1.default.createElement(react_data_grid_1.default, { className: rdgVisuals.className, columns: columns, enableVirtualization: false, headerRowHeight: rdgVisuals.headerRowHeight, onSelectedRowsChange: props.onChangeSelectedRows, onSortColumnsChange: onSortColumnChange, ref: rdgVisuals.ref, renderers: components, rowClass: props.rowClass, rowHeight: rdgVisuals.rowHeight, rowKeyGetter: (_c = props.keyExtractor) !== null && _c !== void 0 ? _c : defaultKeyExtractor, rows: rows, selectedRows: props.selectedRows, sortColumns: sortColumns, style: rdgVisuals.style })),
130
122
  react_1.default.createElement(footer_1.Footer, { noBorder: props.noBorder },
131
123
  react_1.default.createElement(PaginationRowsPerPageSelect, { value: state.request.perPage, onChange: (value) => dispatch(actions_1.dataGridActions.changePerPage(value)) }),
132
124
  react_1.default.createElement(PaginationCounts, { page: state.request.page, perPage: state.request.perPage, response: state.response }),
@@ -75,7 +75,7 @@ const schema = {
75
75
  { name: "only-odd-ids", label: "Only odd ids blablabla" },
76
76
  // { name: "only-odd-ids", label: "Only odd ids" },
77
77
  ],
78
- dir: "asc",
78
+ dir: _1.DataGridSortDir.Asc,
79
79
  sort: "id",
80
80
  perPage: 10,
81
81
  fullText: true,
@@ -223,23 +223,24 @@ const loader = async (_, request) => {
223
223
  result: filteredData.slice(page * perPage, page * perPage + perPage),
224
224
  };
225
225
  };
226
+ const onCsvDownload = (request) => {
227
+ // eslint-disable-next-line no-console
228
+ console.log(request);
229
+ };
226
230
  function Default() {
227
231
  const [hiddenColumns, setHiddenColumns] = (0, react_1.useState)([]);
228
232
  const [selectedRows, setSelectedRows] = (0, react_1.useState)(new Set());
229
233
  const callbackRef = (0, _1.useCallbackRef)();
230
234
  return (react_1.default.createElement("div", { className: "min-h-screen bg-gray-50 p-4 dark:bg-gray-950" },
231
- react_1.default.createElement(tailwindui_1.DataGrid, { callbackRef: callbackRef, schema: schema, title: "Test", noBorder: false, loader: loader, onChangeHiddenColumns: setHiddenColumns, hiddenColumns: hiddenColumns, onChangeSelectedRows: setSelectedRows, selectedRows: selectedRows, getOpenUrl: (row) => `https://www.uxf.cz/item-${row.id}`, onEdit: console.log, onRemove: console.log, initialState: "eyJzb3J0IjoiaWQiLCJkaXIiOiJhc2MiLCJwZXJQYWdlIjoxMCwicGFnZSI6MCwiZiI6W3sibmFtZSI6ImNvZGUiLCJ2YWx1ZSI6IkNaIn1dfQ==", defaultConfig: {
235
+ react_1.default.createElement(tailwindui_1.DataGrid, { callbackRef: callbackRef, schema: schema, title: "Test", noBorder: false, loader: loader, onChangeHiddenColumns: setHiddenColumns, hiddenColumns: hiddenColumns, onChangeSelectedRows: setSelectedRows, selectedRows: selectedRows, getOpenUrl: (row) => `https://www.uxf.cz/item-${row.id}`, onEdit: console.log, onRemove: (row, reload) => {
236
+ console.log(row, reload);
237
+ reload();
238
+ }, initialState: "eyJzb3J0IjoiaWQiLCJkaXIiOiJhc2MiLCJwZXJQYWdlIjoxMCwicGFnZSI6MCwiZiI6W3sibmFtZSI6ImNvZGUiLCJ2YWx1ZSI6IkNaIn1dfQ==", onCsvDownload: onCsvDownload, defaultConfig: {
232
239
  columns: {
233
240
  id: { width: 50, hidden: true },
234
241
  text: {},
235
242
  bool: { width: 50 },
236
243
  },
237
- },
238
- //rowClass={row => ["bg-success-100", "bg-warning-100", "bg-error-100", "bg-primary-100"][(row.id - 1) % 4]}
239
- // customActions={[
240
- // { label: "Do something", onClick: () => console.log("click") },
241
- // { label: "Do something else", href: "https://www.uxf.cz", variant: "text" },
242
- // ]}
243
- debug: true })));
244
+ }, debug: true })));
244
245
  }
245
246
  exports.Default = Default;
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ import { DataGridHandle } from "react-data-grid";
3
+ import { BaseGridType, DataGridBaseProps } from "../types";
4
+ export declare function useRdgVisuals(props: {
5
+ headerRowHeight?: DataGridBaseProps<BaseGridType, any>["headerRowHeight"];
6
+ mode?: DataGridBaseProps<BaseGridType, any>["mode"];
7
+ rowHeight?: DataGridBaseProps<BaseGridType, any>["rowHeight"];
8
+ rows: any[];
9
+ }): {
10
+ className: string;
11
+ headerRowHeight: number;
12
+ ready: boolean;
13
+ ref: import("react").RefObject<DataGridHandle>;
14
+ rowHeight: number | ((row: any) => number);
15
+ style: {
16
+ height: number | undefined;
17
+ };
18
+ };
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRdgVisuals = void 0;
4
+ const react_1 = require("react");
5
+ function useRdgVisuals(props) {
6
+ var _a, _b;
7
+ const [mounted, setMounted] = (0, react_1.useState)(false);
8
+ (0, react_1.useEffect)(() => setMounted(true), []);
9
+ const rowHeight = (_a = props.rowHeight) !== null && _a !== void 0 ? _a : 44;
10
+ const headerRowHeight = (_b = props.headerRowHeight) !== null && _b !== void 0 ? _b : 36;
11
+ const contentHeight = typeof rowHeight === "function"
12
+ ? props.rows.reduce((prev, curr) => prev + rowHeight({ type: "ROW", row: curr }))
13
+ : rowHeight * props.rows.length;
14
+ const ref = (0, react_1.useRef)(null);
15
+ const size = {
16
+ contentHeight,
17
+ headerRowHeight,
18
+ rowsCount: props.rows.length,
19
+ };
20
+ const storedSize = (0, react_1.useRef)(size);
21
+ storedSize.current = size;
22
+ const [height, setHeight] = (0, react_1.useState)();
23
+ (0, react_1.useEffect)(() => {
24
+ var _a;
25
+ const node = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.element;
26
+ if (!(mounted && node)) {
27
+ return;
28
+ }
29
+ const observer = new MutationObserver((mutations) => mutations.forEach(() => {
30
+ const currentSize = storedSize.current;
31
+ const scrollbarHeight = node.scrollWidth > node.clientWidth ? 8 : 0;
32
+ const emptyRowHeight = currentSize.rowsCount === 0 ? 44 : 0;
33
+ setHeight(currentSize.headerRowHeight + currentSize.contentHeight + emptyRowHeight + scrollbarHeight);
34
+ }));
35
+ observer.observe(node, { attributes: true, attributeFilter: ["style"] });
36
+ return () => observer.disconnect();
37
+ }, [mounted, storedSize]);
38
+ return {
39
+ className: `uxf-data-grid__table ${props.mode === "light" ? "rdg-light" : props.mode === "dark" ? "rdg-dark" : ""}`,
40
+ headerRowHeight,
41
+ ready: mounted,
42
+ ref,
43
+ rowHeight,
44
+ style: { height },
45
+ };
46
+ }
47
+ exports.useRdgVisuals = useRdgVisuals;
@@ -47,7 +47,7 @@ const useColumns = (props, reload) => {
47
47
  width: props.ui.ActionCell !== action_cell_base_1.ActionCellBase
48
48
  ? actionCellWidth
49
49
  : [onRemove, onEdit !== null && onEdit !== void 0 ? onEdit : getEditUrl, onOpen !== null && onOpen !== void 0 ? onOpen : getOpenUrl].filter((i) => i).length * 40 + 8 * 2,
50
- formatter: (p) => {
50
+ renderCell: (p) => {
51
51
  if (!props.ui.ActionCell) {
52
52
  return null;
53
53
  }
@@ -71,7 +71,7 @@ const useColumns = (props, reload) => {
71
71
  minWidth: (_c = c.minWidth) !== null && _c !== void 0 ? _c : (_d = defaultConfig === null || defaultConfig === void 0 ? void 0 : defaultConfig.columns[c.name]) === null || _d === void 0 ? void 0 : _d.minWidth,
72
72
  maxWidth: (_e = c.maxWidth) !== null && _e !== void 0 ? _e : (_f = defaultConfig === null || defaultConfig === void 0 ? void 0 : defaultConfig.columns[c.name]) === null || _f === void 0 ? void 0 : _f.maxWidth,
73
73
  cellClass: (0, utils_1.cx)("uxf-data-grid__cell", `uxf-data-grid__cell--type-${c.type}`, `uxf-data-grid__cell--name-${c.name}`),
74
- formatter: (p) => {
74
+ renderCell: (p) => {
75
75
  var _a;
76
76
  const columnType = c.type;
77
77
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "./data-grid";
2
- export * from "./types";
3
2
  export * from "./hooks/useCallbackRef";
3
+ export * from "./types";
4
4
  export { decodeFilter, encodeFilter } from "./utils";
package/index.js CHANGED
@@ -16,8 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.encodeFilter = exports.decodeFilter = void 0;
18
18
  __exportStar(require("./data-grid"), exports);
19
- __exportStar(require("./types"), exports);
20
19
  __exportStar(require("./hooks/useCallbackRef"), exports);
20
+ __exportStar(require("./types"), exports);
21
21
  var utils_1 = require("./utils");
22
22
  Object.defineProperty(exports, "decodeFilter", { enumerable: true, get: function () { return utils_1.decodeFilter; } });
23
23
  Object.defineProperty(exports, "encodeFilter", { enumerable: true, get: function () { return utils_1.encodeFilter; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxf/data-grid",
3
- "version": "10.0.0-beta.9",
3
+ "version": "10.0.0",
4
4
  "description": "UXF DataGrid",
5
5
  "homepage": "https://gitlab.com/uxf-npm/data-grid#readme",
6
6
  "main": "index.js",
@@ -26,18 +26,20 @@
26
26
  "test": "npm run-script typecheck",
27
27
  "typecheck": "tsc --noEmit --skipLibCheck"
28
28
  },
29
- "engines": {
30
- "node": ">=8.9"
29
+ "dependencies": {
30
+ "@uxf/ui": "10.0.0",
31
+ "dayjs": "1.11.10",
32
+ "react-data-grid": "7.0.0-beta.39"
31
33
  },
32
34
  "peerDependencies": {
33
- "@uxf/ui": "10.0.0-beta.9",
34
- "react": "^18.0.0",
35
- "react-dom": "^18.0.0",
36
- "dayjs": "^1.11.7"
35
+ "react": ">=18.2.0",
36
+ "react-dom": ">=18.2.0"
37
37
  },
38
- "dependencies": {
39
- "react-data-grid": "7.0.0-beta.13"
38
+ "devDependencies": {
39
+ "@types/react": "18.2.27",
40
+ "@types/react-dom": "18.2.12",
41
+ "react": "18.2.0",
42
+ "react-dom": "18.2.0"
40
43
  },
41
- "devDependencies": {},
42
44
  "gitHead": "e4f21a15c3d50fb6614d70cdaf36685232de87e7"
43
45
  }
@@ -1,4 +1,4 @@
1
- import { RequestFilter, Response, SortDirection } from "../types";
1
+ import { DataGridSortDir, RequestFilter, Response } from "../types";
2
2
  export declare const dataGridActions: {
3
3
  filter: (filterValue: RequestFilter) => {
4
4
  type: string;
@@ -34,10 +34,10 @@ export declare const dataGridActions: {
34
34
  type: string;
35
35
  search: string;
36
36
  };
37
- sort: (columnName: string, direction: SortDirection) => {
37
+ sort: (columnName: string, direction: DataGridSortDir) => {
38
38
  type: string;
39
39
  columnName: string;
40
- direction: SortDirection;
40
+ direction: DataGridSortDir;
41
41
  };
42
42
  sortClear: () => {
43
43
  type: string;
@@ -1,5 +1,5 @@
1
1
  import { Reducer } from "react";
2
- import { Schema, Request, DataGridState } from "../types";
2
+ import { DataGridState, Request, Schema } from "../types";
3
3
  export declare const getInitialState: (schema: Schema<any>, init?: Request | string) => DataGridState;
4
4
  export declare const reducer: Reducer<DataGridState, any>;
5
5
  export declare const debugReducer: Reducer<DataGridState, any>;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BodyCellBoolean = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const checkbox_1 = require("@uxf/ui/checkbox");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const BodyCellBoolean = (props) => {
10
10
  if (typeof props.value !== "boolean") {
11
11
  return null;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BodyCellDate = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const dayjs_1 = __importDefault(require("dayjs"));
8
+ const react_1 = __importDefault(require("react"));
9
9
  const BodyCellDate = (props) => {
10
10
  if (typeof props.value !== "string") {
11
11
  return null;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BodyCellDateTime = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const dayjs_1 = __importDefault(require("dayjs"));
8
+ const react_1 = __importDefault(require("react"));
9
9
  const BodyCellDateTime = (props) => {
10
10
  if (typeof props.value !== "string") {
11
11
  return null;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BodyCellEmail = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const text_link_1 = require("@uxf/ui/text-link");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const BodyCellEmail = (props) => {
10
10
  if (typeof props.value !== "string") {
11
11
  return null;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BodyCellPhone = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const text_link_1 = require("@uxf/ui/text-link");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const BodyCellPhone = (props) => {
10
10
  if (typeof props.value !== "string") {
11
11
  return null;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BodyCellUrl = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const text_link_1 = require("@uxf/ui/text-link");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const BodyCellUrl = (props) => {
10
10
  if (typeof props.value !== "string") {
11
11
  return null;
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BodyCells = void 0;
4
- const body_cell_default_1 = require("./body-cell-default");
5
4
  const body_cell_boolean_1 = require("./body-cell-boolean");
6
5
  const body_cell_date_1 = require("./body-cell-date");
7
6
  const body_cell_datetime_1 = require("./body-cell-datetime");
8
- const body_cell_to_one_1 = require("./body-cell-to-one");
9
- const body_cell_to_many_1 = require("./body-cell-to-many");
7
+ const body_cell_default_1 = require("./body-cell-default");
10
8
  const body_cell_email_1 = require("./body-cell-email");
11
9
  const body_cell_phone_1 = require("./body-cell-phone");
10
+ const body_cell_to_many_1 = require("./body-cell-to-many");
11
+ const body_cell_to_one_1 = require("./body-cell-to-one");
12
12
  const body_cell_url_1 = require("./body-cell-url");
13
13
  exports.BodyCells = {
14
14
  boolean: body_cell_boolean_1.BodyCellBoolean,
@@ -24,9 +24,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.ActionCellBase = exports.ActionCellWrapper = void 0;
27
- const react_1 = __importStar(require("react"));
28
27
  const button_1 = require("@uxf/ui/button");
29
28
  const icon_1 = require("@uxf/ui/icon");
29
+ const react_1 = __importStar(require("react"));
30
30
  const ActionCellWrapper = (props) => {
31
31
  const innerRef = (0, react_1.useRef)(null);
32
32
  (0, react_1.useEffect)(() => {
@@ -74,9 +74,11 @@ const Button = (props) => {
74
74
  return null;
75
75
  };
76
76
  const ActionCellBase = (props) => {
77
+ const onRemove = props.onRemove;
78
+ const handleRemove = onRemove ? () => onRemove(props.row, props.reload) : undefined;
77
79
  return (react_1.default.createElement(exports.ActionCellWrapper, null,
78
- react_1.default.createElement(Button, { row: props.row, onClick: props.onRemove, getUrl: undefined, icon: "trash", title: "Smazat" }),
80
+ react_1.default.createElement(Button, { row: props.row, onClick: props.onOpen, getUrl: props.getOpenUrl, icon: "circle-info", title: "Detail" }),
79
81
  react_1.default.createElement(Button, { row: props.row, onClick: props.onEdit, getUrl: props.getEditUrl, icon: "pen", title: "Upravit" }),
80
- react_1.default.createElement(Button, { row: props.row, onClick: props.onOpen, getUrl: props.getOpenUrl, icon: "circle-info", title: "Detail" })));
82
+ react_1.default.createElement(Button, { row: props.row, onClick: handleRemove, getUrl: undefined, icon: "trash", title: "Smazat" })));
81
83
  };
82
84
  exports.ActionCellBase = ActionCellBase;
@@ -4,17 +4,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Drawer = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const icon_1 = require("@uxf/ui/icon");
7
+ const react_1 = require("@floating-ui/react");
8
+ const useIsMounted_1 = require("@uxf/core/hooks/useIsMounted");
9
9
  const button_1 = require("@uxf/ui/button");
10
+ const icon_1 = require("@uxf/ui/icon");
11
+ const react_2 = __importDefault(require("react"));
10
12
  const Drawer = (props) => {
11
- return (react_1.default.createElement("main", { className: `uxf-data-grid__drawer uxf-data-grid__drawer--${props.open ? "open" : "closed"}` },
12
- react_1.default.createElement("section", { className: `uxf-data-grid__drawer-body-wrapper ${props.open ? "uxf-data-grid__drawer-body-wrapper--open" : ""}` },
13
- react_1.default.createElement("article", { className: "uxf-data-grid__drawer-body" },
14
- react_1.default.createElement(button_1.Button, { isIconButton: true, onClick: props.onClose, variant: "text", className: "uxf-data-grid__drawer-close-button" },
15
- react_1.default.createElement(icon_1.Icon, { name: "xmarkLarge" })),
16
- react_1.default.createElement("header", { className: "uxf-data-grid__drawer-header" }, props.title),
17
- react_1.default.createElement("div", { className: "uxf-data-grid__drawer-content" }, props.children))),
18
- react_1.default.createElement("section", { className: "uxf-data-grid__drawer-backdrop", onClick: props.onClose })));
13
+ const isMounted = (0, useIsMounted_1.useIsMounted)();
14
+ if (!isMounted) {
15
+ return null;
16
+ }
17
+ return (react_2.default.createElement(react_1.FloatingPortal, null,
18
+ react_2.default.createElement("div", { className: `uxf-data-grid__drawer uxf-data-grid__drawer--${props.open ? "open" : "closed"}` },
19
+ react_2.default.createElement("div", { className: `uxf-data-grid__drawer-body-wrapper ${props.open ? "uxf-data-grid__drawer-body-wrapper--open" : ""}` },
20
+ react_2.default.createElement("div", { className: "uxf-data-grid__drawer-body" },
21
+ react_2.default.createElement(button_1.Button, { isIconButton: true, onClick: props.onClose, variant: "text", className: "uxf-data-grid__drawer-close-button" },
22
+ react_2.default.createElement(icon_1.Icon, { name: "xmarkLarge" })),
23
+ react_2.default.createElement("header", { className: "uxf-data-grid__drawer-header" }, props.title),
24
+ react_2.default.createElement("div", { className: "uxf-data-grid__drawer-content" }, props.children))),
25
+ react_2.default.createElement("section", { className: "uxf-data-grid__drawer-backdrop", onClick: props.onClose }))));
19
26
  };
20
27
  exports.Drawer = Drawer;
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.NoRowsFallback = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const icon_1 = require("@uxf/ui/icon");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const utils_1 = require("../../utils");
10
10
  const NoRowsFallback = (props) => {
11
11
  return (react_1.default.createElement("div", { className: (0, utils_1.cx)("uxf-data-grid__fallback", props.loading && "is-loading", props.error && "is-error") }, props.loading ? (react_1.default.createElement(react_1.default.Fragment, null, "Na\u010D\u00EDt\u00E1m...")) : props.error ? (react_1.default.createElement(react_1.default.Fragment, null,
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.PaginationRowsPerPageSelect = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const select_1 = require("@uxf/ui/select");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const PER_PAGE_OPTIONS = [
10
10
  { id: 10, label: "10" },
11
11
  { id: 25, label: "25" },
@@ -24,18 +24,17 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.SelectRowCheckbox = void 0;
27
- const react_1 = __importStar(require("react"));
28
27
  const checkbox_1 = require("@uxf/ui/checkbox");
29
- const SelectRowComponent = (props, ref) => {
28
+ const react_1 = __importStar(require("react"));
29
+ const SelectRowComponent = (props) => {
30
30
  var _a;
31
31
  const handleChange = (value, e) => {
32
- var _a;
33
32
  if (typeof value !== "undefined") {
34
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
35
- props.onChange(value, (_a = e === null || e === void 0 ? void 0 : e.nativeEvent) === null || _a === void 0 ? void 0 : _a.shiftKey);
33
+ const shiftKey = (e === null || e === void 0 ? void 0 : e.nativeEvent) && e.nativeEvent instanceof MouseEvent ? e.nativeEvent.shiftKey : false;
34
+ props.onChange(value, shiftKey);
36
35
  }
37
36
  };
38
37
  return (react_1.default.createElement("div", { className: "uxf-data-grid__select-row-checkbox-wrapper" },
39
- react_1.default.createElement(checkbox_1.Checkbox, { ref: ref, ...props, value: (_a = props.checked) !== null && _a !== void 0 ? _a : false, onChange: handleChange })));
38
+ react_1.default.createElement(checkbox_1.Checkbox, { ...props, value: (_a = props.checked) !== null && _a !== void 0 ? _a : false, onChange: handleChange })));
40
39
  };
41
40
  exports.SelectRowCheckbox = (0, react_1.forwardRef)(SelectRowComponent);
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.SelectedRowsToolbar = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const button_1 = require("@uxf/ui/button");
8
+ const react_1 = __importDefault(require("react"));
9
9
  const getText = (count) => {
10
10
  if (count === 1) {
11
11
  return "Vybrán 1 záznam";
@@ -24,14 +24,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.ToolbarControl = void 0;
27
- const react_1 = __importStar(require("react"));
27
+ const button_1 = require("@uxf/ui/button");
28
28
  const icon_1 = require("@uxf/ui/icon");
29
29
  const text_input_1 = require("@uxf/ui/text-input");
30
- const button_1 = require("@uxf/ui/button");
31
- const drawer_1 = require("./drawer");
32
30
  const toggle_1 = require("@uxf/ui/toggle");
31
+ const react_1 = __importStar(require("react"));
33
32
  const actions_1 = require("../../store/actions");
33
+ const utils_1 = require("../../utils");
34
34
  const show_1 = require("../show");
35
+ const drawer_1 = require("./drawer");
35
36
  function Filters(props) {
36
37
  return (react_1.default.createElement("div", { className: "uxf-data-grid__filters" }, props.schema.filters.map((filter) => {
37
38
  var _a, _b;
@@ -47,21 +48,38 @@ function Filters(props) {
47
48
  })));
48
49
  }
49
50
  function Columns(props) {
50
- return (react_1.default.createElement("div", { className: "uxf-data-grid__toolbar-control-columns" }, props.schema.columns.map((column) => (react_1.default.createElement(toggle_1.Toggle, { key: column.name, label: typeof column.label === "string" ? column.label : "", value: true, onChange: () => null })))));
51
+ const onHideColumn = (columnName) => {
52
+ var _a, _b;
53
+ (_a = props.onChangeHiddenColumns) === null || _a === void 0 ? void 0 : _a.call(props, [...((_b = props.hiddenColumns) !== null && _b !== void 0 ? _b : []), columnName]);
54
+ };
55
+ const onShowColumn = (columnName) => {
56
+ var _a, _b;
57
+ (_a = props.onChangeHiddenColumns) === null || _a === void 0 ? void 0 : _a.call(props, [...((_b = props.hiddenColumns) !== null && _b !== void 0 ? _b : [])].filter((v) => v !== columnName));
58
+ };
59
+ return (react_1.default.createElement("div", { className: "uxf-data-grid__toolbar-control-columns" }, props.schema.columns.map((column) => {
60
+ var _a;
61
+ return (react_1.default.createElement(toggle_1.Toggle, { key: column.name, label: typeof column.label === "string" ? column.label : "", value: !((_a = props.hiddenColumns) === null || _a === void 0 ? void 0 : _a.includes(column.name)), onChange: (value) => (value ? onShowColumn(column.name) : onHideColumn(column.name)) }));
62
+ })));
51
63
  }
52
64
  const ToolbarControl = (props) => {
53
65
  const [isFiltersOpen, setFiltersOpen] = (0, react_1.useState)(false);
54
66
  const [isColumnsOpen, setColumnsOpen] = (0, react_1.useState)(false);
67
+ const fulltextValue = props.state.request.search;
68
+ const filtersData = props.state.request.f;
55
69
  return (react_1.default.createElement("div", { className: "uxf-data-grid__toolbar-control" },
56
70
  react_1.default.createElement(show_1.Show, { when: props.showFulltext },
57
- react_1.default.createElement(text_input_1.TextInput, { value: props.fulltextValue, onChange: props.onFulltextChange, placeholder: "Pi\u0161te pro hled\u00E1n\u00ED", className: "uxf-data-grid__plugin-fulltext", size: "small", leftElement: react_1.default.createElement(icon_1.Icon, { name: "search", size: 16 }) })),
58
- react_1.default.createElement(button_1.Button, { isIconButton: true, variant: "white", size: "sm", onClick: () => setFiltersOpen(true), title: "Filtrovat", className: "uxf-data-grid__plugin-filter" },
59
- react_1.default.createElement(icon_1.Icon, { name: "filter" })),
71
+ react_1.default.createElement(text_input_1.TextInput, { value: fulltextValue, onChange: props.onFulltextChange, placeholder: "Pi\u0161te pro hled\u00E1n\u00ED", className: "uxf-data-grid__plugin-fulltext", size: "small", leftElement: react_1.default.createElement(icon_1.Icon, { name: "search", size: 16 }), label: "Vyhled\u00E1v\u00E1n\u00ED", hiddenLabel: true })),
72
+ react_1.default.createElement(show_1.Show, { when: props.schema.filters.length !== 0 },
73
+ react_1.default.createElement(button_1.Button, { isIconButton: true, variant: "white", size: "sm", onClick: () => setFiltersOpen(true), title: "Filtrovat", className: "uxf-data-grid__plugin-button" },
74
+ react_1.default.createElement(icon_1.Icon, { name: "filter" }))),
60
75
  react_1.default.createElement(show_1.Show, { when: props.onChangeHiddenColumns && props.hiddenColumns },
61
- react_1.default.createElement(button_1.Button, { isIconButton: true, variant: "white", size: "sm", onClick: () => setColumnsOpen(true), title: "Nastaven\u00ED sloupc\u016F" },
76
+ react_1.default.createElement(button_1.Button, { isIconButton: true, variant: "white", size: "sm", onClick: () => setColumnsOpen(true), title: "Nastaven\u00ED sloupc\u016F", className: "uxf-data-grid__plugin-button" },
62
77
  react_1.default.createElement(icon_1.Icon, { name: "table-columns" }))),
78
+ react_1.default.createElement(show_1.Show, { when: props.onCsvDownload },
79
+ react_1.default.createElement(button_1.Button, { isIconButton: true, variant: "white", size: "sm", onClick: () => { var _a; return (_a = props.onCsvDownload) === null || _a === void 0 ? void 0 : _a.call(props, (0, utils_1.createRequest)(props.state, props.schema.sort, props.schema.dir)); }, title: "St\u00E1hnout CSV", className: "uxf-data-grid__plugin-button" },
80
+ react_1.default.createElement(icon_1.Icon, { name: "file-arrow-down" }))),
63
81
  react_1.default.createElement(drawer_1.Drawer, { open: isFiltersOpen, onClose: () => setFiltersOpen(false), title: "Filtry" },
64
- react_1.default.createElement(Filters, { gridName: props.gridName, schema: props.schema, dispatch: props.dispatch, filtersData: props.filtersData, filterHandlers: props.filterHandlers, noBorder: props.noBorder })),
82
+ react_1.default.createElement(Filters, { gridName: props.gridName, schema: props.schema, dispatch: props.dispatch, filtersData: filtersData, filterHandlers: props.filterHandlers, noBorder: props.noBorder })),
65
83
  react_1.default.createElement(drawer_1.Drawer, { open: isColumnsOpen, onClose: () => setColumnsOpen(false), title: "Nastaven\u00ED sloupc\u016F" },
66
84
  react_1.default.createElement(Columns, { schema: props.schema, onChangeHiddenColumns: props.onChangeHiddenColumns, hiddenColumns: props.hiddenColumns }))));
67
85
  };
@@ -4,9 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ToolbarCustoms = void 0;
7
- const react_1 = __importDefault(require("react"));
8
7
  const button_1 = require("@uxf/ui/button");
9
8
  const button_list_1 = require("@uxf/ui/button-list");
9
+ const react_1 = __importDefault(require("react"));
10
10
  const ToolbarCustoms = (props) => {
11
11
  if (!props.buttons) {
12
12
  return null;
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ToolbarTabs = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const show_1 = require("../show");
9
- const utils_1 = require("../../utils");
10
7
  const button_1 = require("@uxf/ui/button");
11
8
  const icon_1 = require("@uxf/ui/icon");
12
9
  const modal_service_1 = require("@uxf/ui/modal/modal-service");
10
+ const react_1 = __importDefault(require("react"));
11
+ const utils_1 = require("../../utils");
12
+ const show_1 = require("../show");
13
13
  function Tab(props) {
14
14
  return (react_1.default.createElement("button", { className: (0, utils_1.cx)("uxf-data-grid__toolbar-tab", props.isActive && "is-active"), onClick: props.onClick }, props.title));
15
15
  }
@@ -1,5 +1,5 @@
1
- import { BaseGridType, DataGridBaseProps, UIComponents } from "../types";
2
1
  import React from "react";
2
+ import { BaseGridType, DataGridBaseProps, UIComponents } from "../types";
3
3
  export type DataGridProps<GridType extends BaseGridType, R> = DataGridBaseProps<GridType, R> & {
4
4
  ui?: Partial<UIComponents<GridType, R>>;
5
5
  };