@itaptec/datagrid 0.0.1-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __objRest = (source, exclude) => {
24
+ var target = {};
25
+ for (var prop in source)
26
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
27
+ target[prop] = source[prop];
28
+ if (source != null && __getOwnPropSymbols)
29
+ for (var prop of __getOwnPropSymbols(source)) {
30
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
31
+ target[prop] = source[prop];
32
+ }
33
+ return target;
34
+ };
35
+ var __export = (target, all) => {
36
+ for (var name in all)
37
+ __defProp(target, name, { get: all[name], enumerable: true });
38
+ };
39
+ var __copyProps = (to, from, except, desc) => {
40
+ if (from && typeof from === "object" || typeof from === "function") {
41
+ for (let key of __getOwnPropNames(from))
42
+ if (!__hasOwnProp.call(to, key) && key !== except)
43
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
44
+ }
45
+ return to;
46
+ };
47
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
48
+
49
+ // src/index.ts
50
+ var index_exports = {};
51
+ __export(index_exports, {
52
+ ItecDataGrid: () => ItecDataGrid,
53
+ useItecDataGrid: () => useItecDataGrid_default
54
+ });
55
+ module.exports = __toCommonJS(index_exports);
56
+
57
+ // src/base/datagrid.tsx
58
+ var import_x_data_grid = require("@mui/x-data-grid");
59
+ var import_react_query = require("@tanstack/react-query");
60
+ var import_icons_material2 = require("@mui/icons-material");
61
+ var import_material2 = require("@mui/material");
62
+
63
+ // src/common/useFilter.tsx
64
+ var import_react_hook_form = require("react-hook-form");
65
+ var import_react = require("react");
66
+ function useFilter(props) {
67
+ const { filters } = props;
68
+ const [filter, setFilter] = (0, import_react.useState)();
69
+ const form = (0, import_react_hook_form.useForm)({
70
+ mode: "onChange"
71
+ });
72
+ if (!filters) {
73
+ return void 0;
74
+ }
75
+ return {
76
+ // columnMenuComponent: (props) => {
77
+ // const {
78
+ // colDef: { field },
79
+ // } = props;
80
+ // // TODO: make field of type union of possible fields
81
+ // const menuParams = filters?.[field];
82
+ // if (!menuParams) return undefined;
83
+ // return (
84
+ // <Stack
85
+ // minWidth={300}
86
+ // p={2}
87
+ // spacing={2}
88
+ // direction="row"
89
+ // display="flex"
90
+ // justifyContent="space-between"
91
+ // alignItems="center"
92
+ // >
93
+ // <Box sx={{ width: "100%" }}>
94
+ // {menuParams.type === "select" && (
95
+ // <Select
96
+ // name={menuParams.name}
97
+ // control={control}
98
+ // getOptions={menuParams.getOptions}
99
+ // size="small"
100
+ // fullWidth
101
+ // />
102
+ // )}
103
+ // </Box>
104
+ // <Box display="flex">
105
+ // <Tooltip title="Limpiar filtro">
106
+ // <IconButton
107
+ // onClick={() => {
108
+ // resetField(menuParams.name);
109
+ // // onFilterChange(); // search on filter reset
110
+ // }}
111
+ // >
112
+ // <FilterAltOff />
113
+ // </IconButton>
114
+ // </Tooltip>
115
+ // <Tooltip title="Cerrar filtro">
116
+ // <IconButton>
117
+ // <Close />
118
+ // </IconButton>
119
+ // </Tooltip>
120
+ // </Box>
121
+ // </Stack>
122
+ // );
123
+ // },
124
+ form,
125
+ filter
126
+ };
127
+ }
128
+ {
129
+ }
130
+
131
+ // src/common/useCheckboxSelection.ts
132
+ var import_react2 = require("react");
133
+ function useCheckboxSelection(data, getRowId, apiRef) {
134
+ if (Array.isArray(data)) {
135
+ return useCheckboxSelectionBasic(data, getRowId, apiRef);
136
+ }
137
+ return useCheckboxSelectionPaginated(data, getRowId, apiRef);
138
+ }
139
+ function useCheckboxSelectionPaginated(data, getRowId, apiRef) {
140
+ const [selectedRows, setSelectedRows] = (0, import_react2.useState)([]);
141
+ (0, import_react2.useEffect)(() => {
142
+ const handleRowClick = ({
143
+ id,
144
+ value
145
+ }) => {
146
+ if (!data) return;
147
+ if (value) {
148
+ const newValue = data.lista.find((x) => getRowId(x) === id);
149
+ newValue && setSelectedRows((prev) => [...prev, newValue]);
150
+ } else {
151
+ setSelectedRows((prev) => [...prev.filter((x) => getRowId(x) !== id)]);
152
+ }
153
+ };
154
+ return apiRef.current.subscribeEvent(
155
+ "rowSelectionCheckboxChange",
156
+ handleRowClick
157
+ );
158
+ }, [apiRef, data]);
159
+ return {
160
+ selectedRows
161
+ };
162
+ }
163
+ function useCheckboxSelectionBasic(data, getRowId, apiRef) {
164
+ const [selectedRows, setSelectedRows] = (0, import_react2.useState)([]);
165
+ (0, import_react2.useEffect)(() => {
166
+ const handleRowClick = ({
167
+ id,
168
+ value
169
+ }) => {
170
+ if (!data) return;
171
+ if (value) {
172
+ const newValue = data.find((x) => getRowId(x) === id);
173
+ newValue && setSelectedRows((prev) => [...prev, newValue]);
174
+ } else {
175
+ setSelectedRows((prev) => [...prev.filter((x) => getRowId(x) !== id)]);
176
+ }
177
+ };
178
+ return apiRef.current.subscribeEvent(
179
+ "rowSelectionCheckboxChange",
180
+ handleRowClick
181
+ );
182
+ }, [apiRef, data]);
183
+ return {
184
+ selectedRows
185
+ };
186
+ }
187
+
188
+ // src/Filter.tsx
189
+ var import_icons_material = require("@mui/icons-material");
190
+ var import_material = require("@mui/material");
191
+ var import_form_components = require("@itaptec/form_components");
192
+ var import_jsx_runtime = require("react/jsx-runtime");
193
+ function Filter(props) {
194
+ const {
195
+ close,
196
+ menuParams,
197
+ formMethods: { control, resetField }
198
+ } = props;
199
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
200
+ import_material.Stack,
201
+ {
202
+ minWidth: 300,
203
+ px: 1,
204
+ spacing: 2,
205
+ direction: "row",
206
+ display: "flex",
207
+ justifyContent: "space-between",
208
+ alignItems: "center",
209
+ children: [
210
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_material.Box, { sx: { width: "100%" }, children: [
211
+ menuParams.type === "select" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
212
+ import_form_components.Select,
213
+ __spreadValues({
214
+ name: menuParams.name,
215
+ control
216
+ }, menuParams.props)
217
+ ),
218
+ menuParams.type === "multiselect" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
219
+ import_form_components.Multiselect,
220
+ __spreadValues({
221
+ name: menuParams.name,
222
+ control
223
+ }, menuParams.props)
224
+ ),
225
+ menuParams.type === "date-range" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
226
+ import_form_components.ControlledDateRangePicker,
227
+ __spreadValues({
228
+ label: "Fecha",
229
+ control
230
+ }, menuParams.props)
231
+ ),
232
+ menuParams.type === "text" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
233
+ import_form_components.TextField,
234
+ __spreadValues({
235
+ name: menuParams.name,
236
+ control,
237
+ InputProps: {
238
+ startAdornment: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_material.InputAdornment, { position: "start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_material.Search, {}) })
239
+ },
240
+ debounceTime: 500
241
+ }, menuParams.props)
242
+ ),
243
+ menuParams.type === "button-group" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
244
+ import_form_components.ToggleButtonGroup,
245
+ __spreadValues({
246
+ name: menuParams.name,
247
+ control
248
+ }, menuParams.props)
249
+ ),
250
+ menuParams.type === "multiple-button-group" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
251
+ import_form_components.ToggleButtonGroupMultiple,
252
+ __spreadValues({
253
+ name: menuParams.name,
254
+ control
255
+ }, menuParams.props)
256
+ )
257
+ ] }),
258
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_material.Box, { display: "flex", children: [
259
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_material.Tooltip, { title: "Limpiar filtro", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
260
+ import_material.IconButton,
261
+ {
262
+ onClick: () => {
263
+ resetField(menuParams.name);
264
+ close();
265
+ },
266
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_material.FilterAltOff, {})
267
+ }
268
+ ) }),
269
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_material.Tooltip, { title: "Cerrar filtro", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_material.IconButton, { onClick: close, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons_material.Close, {}) }) })
270
+ ] })
271
+ ]
272
+ }
273
+ );
274
+ }
275
+
276
+ // src/base/datagrid.tsx
277
+ var import_jsx_runtime2 = require("react/jsx-runtime");
278
+ function dataGridBase(props) {
279
+ const filter = useFilter({ filters: props.filters });
280
+ const query = (0, import_react_query.useQuery)({
281
+ queryKey: ["query", filter == null ? void 0 : filter.form.watch()],
282
+ queryFn: () => props.getEntities(filter == null ? void 0 : filter.form.watch())
283
+ });
284
+ const { data, refetch, isFetching, isError } = query;
285
+ const apiRef = (0, import_x_data_grid.useGridApiRef)();
286
+ const { selectedRows } = useCheckboxSelection(
287
+ data,
288
+ props.getRowId || (() => 0),
289
+ apiRef
290
+ );
291
+ return {
292
+ datagridProps: {
293
+ apiRef,
294
+ hideFooterPagination: true,
295
+ columns: props.columns.map((col) => {
296
+ var _a;
297
+ return __spreadProps(__spreadValues({}, col), {
298
+ sortable: false,
299
+ disableColumnMenu: !((_a = props.filters) == null ? void 0 : _a[col.field]),
300
+ renderHeader: (params) => {
301
+ var _a2;
302
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_material2.Box, { sx: { ":hover > *": { visibility: "visible" } }, children: [
303
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("strong", { style: { marginRight: 10 }, children: params.colDef.headerName }),
304
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children: ((_a2 = props.filters) == null ? void 0 : _a2[col.field]) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
305
+ import_material2.IconButton,
306
+ {
307
+ onClick: () => {
308
+ apiRef.current.showColumnMenu(params.colDef.field);
309
+ },
310
+ sx: {
311
+ visibility: !!(filter == null ? void 0 : filter.form.getValues(
312
+ props.filters[col.field].name
313
+ )) ? "visible" : "hidden"
314
+ },
315
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons_material2.FilterAlt, { fontSize: "small" })
316
+ }
317
+ ) })
318
+ ] });
319
+ }
320
+ });
321
+ }),
322
+ loading: isFetching,
323
+ rows: data || [],
324
+ slots: {
325
+ columnMenu: (params) => {
326
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
327
+ import_x_data_grid.GridColumnMenu,
328
+ __spreadProps(__spreadValues({}, params), {
329
+ slots: {
330
+ columnMenuUserItem: (params2) => {
331
+ if (!props.filters || !filter) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, {});
332
+ const {
333
+ colDef: { field }
334
+ } = params2;
335
+ const menuParams = props.filters[field];
336
+ if (!menuParams) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, {});
337
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
338
+ Filter,
339
+ {
340
+ close: () => {
341
+ apiRef.current.hideColumnMenu();
342
+ },
343
+ formMethods: filter.form,
344
+ menuParams
345
+ }
346
+ );
347
+ },
348
+ columnMenuSortItem: null,
349
+ columnMenuFilterItem: null,
350
+ columnMenuColumnsItem: null
351
+ }
352
+ })
353
+ );
354
+ }
355
+ },
356
+ checkboxSelection: props.checkboxSelection,
357
+ rowSelectionModel: props.checkboxSelection ? selectedRows.map((row) => props.getRowId(row)) : void 0,
358
+ getRowId: props.getRowId
359
+ },
360
+ control: {
361
+ query,
362
+ form: props.filters ? filter == null ? void 0 : filter.form : void 0,
363
+ selectedRows
364
+ }
365
+ };
366
+ }
367
+
368
+ // src/paginated/datagrid-paginated.tsx
369
+ var import_x_data_grid2 = require("@mui/x-data-grid");
370
+ var import_react3 = require("react");
371
+ var import_react_query2 = require("@tanstack/react-query");
372
+ var import_icons_material3 = require("@mui/icons-material");
373
+ var import_material3 = require("@mui/material");
374
+ var import_jsx_runtime3 = require("react/jsx-runtime");
375
+ var defaultPagination = {
376
+ actualPage: 1,
377
+ pageSize: 24
378
+ };
379
+ function dataGridPaginated(props) {
380
+ var _a;
381
+ const [paramsPaginacion, setParamsPaginacion] = (0, import_react3.useState)(defaultPagination);
382
+ const filter = useFilter({ filters: props.filters });
383
+ const query = (0, import_react_query2.useQuery)({
384
+ queryKey: ["query", paramsPaginacion, filter == null ? void 0 : filter.form.watch()],
385
+ queryFn: () => props.getEntitiesPaginated(paramsPaginacion, filter == null ? void 0 : filter.form.watch()).then((res) => res)
386
+ });
387
+ const { data, refetch, isFetching, isError } = query;
388
+ const apiRef = (0, import_x_data_grid2.useGridApiRef)();
389
+ const { selectedRows } = useCheckboxSelection(
390
+ data,
391
+ props.getRowId || (() => 0),
392
+ apiRef
393
+ );
394
+ return {
395
+ datagridProps: {
396
+ apiRef,
397
+ paginationModel: {
398
+ pageSize: (data == null ? void 0 : data.paginacion.pageSize) || 0,
399
+ page: (data == null ? void 0 : data.paginacion.actualPage) ? data.paginacion.actualPage - 1 : 0
400
+ },
401
+ rowCount: (_a = query.data) == null ? void 0 : _a.paginacion.cantRecords,
402
+ columns: props.columns.map((col) => {
403
+ var _a2;
404
+ return __spreadProps(__spreadValues({}, col), {
405
+ sortable: false,
406
+ disableColumnMenu: !((_a2 = props.filters) == null ? void 0 : _a2[col.field]),
407
+ renderHeader: (params) => {
408
+ var _a3;
409
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_material3.Box, { sx: { ":hover > *": { visibility: "visible" } }, children: [
410
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("strong", { style: { marginRight: 10 }, children: params.colDef.headerName }),
411
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children: ((_a3 = props.filters) == null ? void 0 : _a3[col.field]) && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
412
+ import_material3.IconButton,
413
+ {
414
+ onClick: () => {
415
+ apiRef.current.showColumnMenu(params.colDef.field);
416
+ },
417
+ sx: {
418
+ visibility: !!(filter == null ? void 0 : filter.form.getValues(
419
+ props.filters[col.field].name
420
+ )) ? "visible" : "hidden"
421
+ },
422
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons_material3.FilterAlt, { fontSize: "small" })
423
+ }
424
+ ) })
425
+ ] });
426
+ }
427
+ });
428
+ }),
429
+ rows: (data == null ? void 0 : data.lista) || [],
430
+ onPaginationModelChange: ({ page, pageSize }) => setParamsPaginacion({ actualPage: page + 1, pageSize }),
431
+ loading: isFetching,
432
+ slots: {
433
+ columnMenu: (params) => {
434
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
435
+ import_x_data_grid2.GridColumnMenu,
436
+ __spreadProps(__spreadValues({}, params), {
437
+ slots: {
438
+ columnMenuUserItem: (params2) => {
439
+ if (!props.filters || !filter) return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, {});
440
+ const {
441
+ colDef: { field }
442
+ } = params2;
443
+ const menuParams = props.filters[field];
444
+ if (!menuParams) return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, {});
445
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
446
+ Filter,
447
+ {
448
+ close: () => {
449
+ apiRef.current.hideColumnMenu();
450
+ },
451
+ formMethods: filter.form,
452
+ menuParams
453
+ }
454
+ );
455
+ },
456
+ columnMenuSortItem: null,
457
+ columnMenuFilterItem: null,
458
+ columnMenuColumnsItem: null
459
+ }
460
+ })
461
+ );
462
+ }
463
+ },
464
+ checkboxSelection: props.checkboxSelection,
465
+ rowSelectionModel: props.checkboxSelection ? selectedRows.map((row) => props.getRowId(row)) : void 0,
466
+ getRowId: props.getRowId
467
+ },
468
+ control: {
469
+ query,
470
+ form: props.filters ? filter == null ? void 0 : filter.form : void 0,
471
+ selectedRows
472
+ }
473
+ };
474
+ }
475
+
476
+ // src/useItecDataGrid.ts
477
+ function useItecDataGrid(props) {
478
+ if (props.pagination) {
479
+ return dataGridPaginated(props);
480
+ }
481
+ return dataGridBase(props);
482
+ }
483
+ var useItecDataGrid_default = useItecDataGrid;
484
+
485
+ // src/ItecDataGrid.tsx
486
+ var import_x_data_grid3 = require("@mui/x-data-grid");
487
+ var import_jsx_runtime4 = require("react/jsx-runtime");
488
+ function ItecDataGrid(props) {
489
+ const _a = props, { slots } = _a, rest = __objRest(_a, ["slots"]);
490
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
491
+ import_x_data_grid3.DataGrid,
492
+ __spreadValues({
493
+ paginationMode: "server",
494
+ filterMode: "server",
495
+ slots: __spreadValues({
496
+ columnMenuIcon: () => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, {})
497
+ }, slots),
498
+ autoHeight: true
499
+ }, rest)
500
+ );
501
+ }
502
+ // Annotate the CommonJS export names for ESM import in node:
503
+ 0 && (module.exports = {
504
+ ItecDataGrid,
505
+ useItecDataGrid
506
+ });
507
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/base/datagrid.tsx","../src/common/useFilter.tsx","../src/common/useCheckboxSelection.ts","../src/Filter.tsx","../src/paginated/datagrid-paginated.tsx","../src/useItecDataGrid.ts","../src/ItecDataGrid.tsx"],"sourcesContent":["export { default as useItecDataGrid } from \"./useItecDataGrid\";\r\nexport * from \"./types\";\r\nexport * from \"./paginated/types\";\r\nexport * from \"./base/types\";\r\nexport * from \"./ItecDataGrid\";\r\n","import {\r\n GridColumnMenu,\r\n GridValidRowModel,\r\n useGridApiRef,\r\n} from \"@mui/x-data-grid\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { FieldValues } from \"react-hook-form\";\r\nimport { UseItecDataGridProps, UseItecDataGrid } from \"./types\";\r\nimport { FilterAlt } from \"@mui/icons-material\";\r\nimport { Box, IconButton } from \"@mui/material\";\r\nimport { useFilter, useCheckboxSelection } from \"../common\";\r\nimport { Filter } from \"../Filter\";\r\n\r\nexport function dataGridBase<\r\n TEntity extends GridValidRowModel,\r\n TFilter extends FieldValues = {}\r\n>(\r\n props: UseItecDataGridProps<TEntity, TFilter>\r\n): UseItecDataGrid<TEntity, TFilter> {\r\n const filter = useFilter<TFilter>({ filters: props.filters });\r\n\r\n const query = useQuery({\r\n queryKey: [\"query\", filter?.form.watch()],\r\n queryFn: () => props.getEntities(filter?.form.watch()),\r\n });\r\n\r\n const { data, refetch, isFetching, isError } = query;\r\n\r\n const apiRef = useGridApiRef();\r\n\r\n const { selectedRows } = useCheckboxSelection<TEntity>(\r\n data,\r\n props.getRowId || (() => 0),\r\n apiRef\r\n );\r\n // TODO: habría que mejorar la estructura del código para que cuando no se requiere\r\n // checkbox selection, no sea necesario el hook.\r\n\r\n return {\r\n datagridProps: {\r\n apiRef: apiRef,\r\n hideFooterPagination: true,\r\n columns: props.columns.map((col) => ({\r\n ...col,\r\n sortable: false,\r\n disableColumnMenu: !props.filters?.[col.field],\r\n renderHeader: (params) => {\r\n return (\r\n <Box sx={{ \":hover > *\": { visibility: \"visible\" } }}>\r\n <strong style={{ marginRight: 10 }}>\r\n {params.colDef.headerName}\r\n </strong>\r\n <>\r\n {props.filters?.[col.field] && (\r\n <IconButton\r\n onClick={() => {\r\n apiRef.current.showColumnMenu(params.colDef.field);\r\n // apiRef.current.showFilterPanel(params.colDef.field);\r\n }}\r\n sx={{\r\n visibility: !!filter?.form.getValues(\r\n props.filters[col.field].name\r\n )\r\n ? \"visible\"\r\n : \"hidden\",\r\n }}\r\n >\r\n <FilterAlt fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n </>\r\n </Box>\r\n );\r\n },\r\n })),\r\n loading: isFetching,\r\n rows: data || [],\r\n slots: {\r\n columnMenu: (params) => {\r\n return (\r\n <GridColumnMenu\r\n {...params}\r\n slots={{\r\n columnMenuUserItem: (params) => {\r\n if (!props.filters || !filter) return <></>;\r\n const {\r\n colDef: { field },\r\n } = params;\r\n // TODO: make field of type union of possible fields\r\n const menuParams = props.filters[field];\r\n if (!menuParams) return <></>;\r\n return (\r\n <Filter\r\n close={() => {\r\n apiRef.current.hideColumnMenu();\r\n }}\r\n formMethods={filter.form}\r\n menuParams={menuParams}\r\n />\r\n );\r\n },\r\n columnMenuSortItem: null,\r\n columnMenuFilterItem: null,\r\n columnMenuColumnsItem: null,\r\n }}\r\n />\r\n );\r\n },\r\n },\r\n checkboxSelection: props.checkboxSelection,\r\n rowSelectionModel: props.checkboxSelection\r\n ? selectedRows.map((row) => props.getRowId(row))\r\n : undefined,\r\n getRowId: props.getRowId,\r\n },\r\n control: {\r\n query: query,\r\n form: props.filters ? filter?.form : undefined,\r\n selectedRows,\r\n },\r\n };\r\n}\r\n","import { GridColumnMenuProps } from \"@mui/x-data-grid\";\r\nimport { FieldValues, useForm } from \"react-hook-form\";\r\nimport { ItecColFilters } from \"../types\";\r\nimport { Box, Button, IconButton, Stack, Tooltip } from \"@mui/material\";\r\nimport { FilterAltOff, Close, Search } from \"@mui/icons-material\";\r\nimport { useState } from \"react\";\r\nimport { Select } from \"@itaptec/form_components\";\r\n\r\ntype UseFilterProps<TFilter extends FieldValues> = {\r\n filters: ItecColFilters<TFilter> | undefined;\r\n};\r\n\r\nexport type UseFilter<TFilter extends FieldValues> = {\r\n columnMenuComponent: React.JSXElementConstructor<GridColumnMenuProps>;\r\n filter: TFilter | undefined;\r\n};\r\n\r\nexport function useFilter<TFilter extends FieldValues>(\r\n props: UseFilterProps<TFilter>\r\n) {\r\n const { filters } = props;\r\n\r\n const [filter, setFilter] = useState<TFilter>();\r\n\r\n const form = useForm<TFilter>({\r\n mode: \"onChange\",\r\n });\r\n\r\n if (!filters) {\r\n return undefined;\r\n }\r\n\r\n // const onFilterChange = () => {\r\n // handleSubmit(setFilter)();\r\n // };\r\n\r\n return {\r\n // columnMenuComponent: (props) => {\r\n // const {\r\n // colDef: { field },\r\n // } = props;\r\n\r\n // // TODO: make field of type union of possible fields\r\n\r\n // const menuParams = filters?.[field];\r\n\r\n // if (!menuParams) return undefined;\r\n\r\n // return (\r\n // <Stack\r\n // minWidth={300}\r\n // p={2}\r\n // spacing={2}\r\n // direction=\"row\"\r\n // display=\"flex\"\r\n // justifyContent=\"space-between\"\r\n // alignItems=\"center\"\r\n // >\r\n // <Box sx={{ width: \"100%\" }}>\r\n // {menuParams.type === \"select\" && (\r\n // <Select\r\n // name={menuParams.name}\r\n // control={control}\r\n // getOptions={menuParams.getOptions}\r\n // size=\"small\"\r\n // fullWidth\r\n // />\r\n // )}\r\n // </Box>\r\n // <Box display=\"flex\">\r\n // <Tooltip title=\"Limpiar filtro\">\r\n // <IconButton\r\n // onClick={() => {\r\n // resetField(menuParams.name);\r\n // // onFilterChange(); // search on filter reset\r\n // }}\r\n // >\r\n // <FilterAltOff />\r\n // </IconButton>\r\n // </Tooltip>\r\n // <Tooltip title=\"Cerrar filtro\">\r\n // <IconButton>\r\n // <Close />\r\n // </IconButton>\r\n // </Tooltip>\r\n // </Box>\r\n // </Stack>\r\n // );\r\n // },\r\n form,\r\n filter,\r\n };\r\n}\r\n\r\n{\r\n /* <Button\r\n type=\"submit\"\r\n onClick={onFilterChange}\r\n startIcon={<Search />}\r\n >\r\n Buscar\r\n </Button> */\r\n}\r\n","import { EntityListWithPagination } from \"@itaptec/http_client\";\r\nimport {\r\n GridEventListener,\r\n GridRowIdGetter,\r\n GridRowSelectionModel,\r\n GridValidRowModel,\r\n useGridApiRef,\r\n} from \"@mui/x-data-grid\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Return type of the `useCheckboxSelection` hook.\r\n */\r\nexport type UseCheckboxSelection<TEntity extends GridValidRowModel> = {\r\n selectedRows: TEntity[];\r\n};\r\n\r\n// Overloads para el hook, con y sin paginación.\r\n\r\nexport function useCheckboxSelection<TEntity extends GridValidRowModel>(\r\n data: TEntity[] | undefined,\r\n getRowId: GridRowIdGetter<TEntity>,\r\n apiRef: ReturnType<typeof useGridApiRef>\r\n): UseCheckboxSelection<TEntity>;\r\n\r\nexport function useCheckboxSelection<TEntity extends GridValidRowModel>(\r\n data: EntityListWithPagination<TEntity> | undefined,\r\n getRowId: GridRowIdGetter<TEntity>,\r\n apiRef: ReturnType<typeof useGridApiRef>\r\n): UseCheckboxSelection<TEntity>;\r\n\r\n/**\r\n *\r\n * @param data The data currently displayed in the Data Grid.\r\n * @param getRowId Function to get the id of a given row.\r\n */\r\nexport function useCheckboxSelection<TEntity extends GridValidRowModel>(\r\n data: TEntity[] | EntityListWithPagination<TEntity> | undefined,\r\n getRowId: GridRowIdGetter<TEntity>,\r\n apiRef: ReturnType<typeof useGridApiRef>\r\n) {\r\n if (Array.isArray(data)) {\r\n return useCheckboxSelectionBasic(data, getRowId, apiRef);\r\n }\r\n\r\n return useCheckboxSelectionPaginated(data, getRowId, apiRef);\r\n}\r\n\r\n// Implementaciones del overload con y sin paginación.\r\n\r\nfunction useCheckboxSelectionPaginated<TEntity extends GridValidRowModel>(\r\n data: EntityListWithPagination<TEntity> | undefined,\r\n getRowId: GridRowIdGetter<TEntity>,\r\n apiRef: ReturnType<typeof useGridApiRef>\r\n) {\r\n const [selectedRows, setSelectedRows] = useState<TEntity[]>([]);\r\n\r\n useEffect(() => {\r\n const handleRowClick: GridEventListener<\"rowSelectionCheckboxChange\"> = ({\r\n id,\r\n value,\r\n }) => {\r\n if (!data) return;\r\n\r\n if (value) {\r\n const newValue = data.lista.find((x) => getRowId(x) === id);\r\n newValue && setSelectedRows((prev) => [...prev, newValue]);\r\n } else {\r\n setSelectedRows((prev) => [...prev.filter((x) => getRowId(x) !== id)]);\r\n }\r\n };\r\n\r\n // The `subscribeEvent` method will automatically unsubscribe in the cleanup function of the `useEffect`.\r\n return apiRef.current.subscribeEvent(\r\n \"rowSelectionCheckboxChange\",\r\n handleRowClick\r\n );\r\n }, [apiRef, data]);\r\n\r\n return {\r\n selectedRows,\r\n };\r\n}\r\n\r\nfunction useCheckboxSelectionBasic<TEntity extends GridValidRowModel>(\r\n data: TEntity[] | undefined,\r\n getRowId: GridRowIdGetter<TEntity>,\r\n apiRef: ReturnType<typeof useGridApiRef>\r\n) {\r\n const [selectedRows, setSelectedRows] = useState<TEntity[]>([]);\r\n\r\n useEffect(() => {\r\n const handleRowClick: GridEventListener<\"rowSelectionCheckboxChange\"> = ({\r\n id,\r\n value,\r\n }) => {\r\n if (!data) return;\r\n\r\n if (value) {\r\n const newValue = data.find((x) => getRowId(x) === id);\r\n newValue && setSelectedRows((prev) => [...prev, newValue]);\r\n } else {\r\n setSelectedRows((prev) => [...prev.filter((x) => getRowId(x) !== id)]);\r\n }\r\n };\r\n\r\n // The `subscribeEvent` method will automatically unsubscribe in the cleanup function of the `useEffect`.\r\n return apiRef.current.subscribeEvent(\r\n \"rowSelectionCheckboxChange\",\r\n handleRowClick\r\n );\r\n }, [apiRef, data]);\r\n\r\n return {\r\n selectedRows,\r\n };\r\n}\r\n","import { FilterAltOff, Close, Search } from \"@mui/icons-material\";\r\nimport {\r\n Stack,\r\n Box,\r\n Tooltip,\r\n IconButton,\r\n Divider,\r\n Typography,\r\n InputAdornment,\r\n} from \"@mui/material\";\r\nimport { Control, FieldValues, UseFormReturn } from \"react-hook-form\";\r\nimport { ItecColFilterParams } from \"./types\";\r\nimport {\r\n Multiselect,\r\n Select,\r\n TextField,\r\n ControlledDateRangePicker,\r\n ToggleButtonGroup,\r\n ToggleButtonGroupMultiple,\r\n} from \"@itaptec/form_components\";\r\n\r\nexport type FilterProps<TFilter extends FieldValues> = {\r\n close: () => void;\r\n menuParams: ItecColFilterParams<TFilter>;\r\n // control: Control<TFilter>;\r\n formMethods: UseFormReturn<TFilter>;\r\n};\r\n\r\nexport function Filter<TFilter extends FieldValues = FieldValues>(\r\n props: FilterProps<TFilter>\r\n) {\r\n const {\r\n close,\r\n menuParams,\r\n formMethods: { control, resetField },\r\n } = props;\r\n\r\n // TODO: autofocus fields on mount\r\n return (\r\n <Stack\r\n minWidth={300}\r\n px={1}\r\n spacing={2}\r\n direction=\"row\"\r\n display=\"flex\"\r\n justifyContent=\"space-between\"\r\n alignItems=\"center\"\r\n >\r\n <Box sx={{ width: \"100%\" }}>\r\n {menuParams.type === \"select\" && (\r\n <Select\r\n name={menuParams.name}\r\n control={control}\r\n {...menuParams.props}\r\n />\r\n )}\r\n {menuParams.type === \"multiselect\" && (\r\n <Multiselect\r\n name={menuParams.name}\r\n control={control}\r\n {...menuParams.props}\r\n />\r\n )}\r\n {menuParams.type === \"date-range\" && (\r\n <ControlledDateRangePicker\r\n label={\"Fecha\"}\r\n control={control}\r\n {...menuParams.props}\r\n />\r\n )}\r\n {menuParams.type === \"text\" && (\r\n <TextField\r\n name={menuParams.name}\r\n control={control}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Search />\r\n </InputAdornment>\r\n ),\r\n }}\r\n debounceTime={500}\r\n {...menuParams.props}\r\n />\r\n )}\r\n {menuParams.type === \"button-group\" && (\r\n <ToggleButtonGroup\r\n name={menuParams.name}\r\n control={control}\r\n {...menuParams.props}\r\n />\r\n )}\r\n {menuParams.type === \"multiple-button-group\" && (\r\n <ToggleButtonGroupMultiple\r\n name={menuParams.name}\r\n control={control}\r\n {...menuParams.props}\r\n />\r\n )}\r\n </Box>\r\n <Box display=\"flex\">\r\n <Tooltip title=\"Limpiar filtro\">\r\n <IconButton\r\n onClick={() => {\r\n resetField(menuParams.name);\r\n close();\r\n // onFilterChange(); // search on filter reset\r\n }}\r\n >\r\n <FilterAltOff />\r\n </IconButton>\r\n </Tooltip>\r\n <Tooltip title=\"Cerrar filtro\">\r\n <IconButton onClick={close}>\r\n <Close />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n </Stack>\r\n );\r\n}\r\n","import { PaginationRequest } from \"@itaptec/http_client\";\r\nimport {\r\n GridColumnMenu,\r\n GridValidRowModel,\r\n useGridApiRef,\r\n} from \"@mui/x-data-grid\";\r\nimport { useState } from \"react\";\r\nimport { FieldValues } from \"react-hook-form\";\r\nimport {\r\n UseItecDataGridPaginated,\r\n UseItecDataGridPaginatedProps,\r\n} from \"./types\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { useFilter, useCheckboxSelection } from \"../common\";\r\nimport { FilterAlt } from \"@mui/icons-material\";\r\nimport { Filter } from \"../Filter\";\r\nimport { Box, IconButton } from \"@mui/material\";\r\n\r\nconst defaultPagination: PaginationRequest = {\r\n actualPage: 1,\r\n pageSize: 24,\r\n};\r\n\r\nexport function dataGridPaginated<\r\n TEntity extends GridValidRowModel,\r\n TFilter extends FieldValues = {}\r\n>(\r\n props: UseItecDataGridPaginatedProps<TEntity, TFilter>\r\n): UseItecDataGridPaginated<TEntity, TFilter> {\r\n const [paramsPaginacion, setParamsPaginacion] =\r\n useState<PaginationRequest>(defaultPagination);\r\n\r\n const filter = useFilter<TFilter>({ filters: props.filters });\r\n\r\n const query = useQuery({\r\n queryKey: [\"query\", paramsPaginacion, filter?.form.watch()],\r\n queryFn: () =>\r\n props\r\n .getEntitiesPaginated(paramsPaginacion, filter?.form.watch())\r\n .then((res) => res),\r\n });\r\n\r\n const { data, refetch, isFetching, isError } = query;\r\n\r\n const apiRef = useGridApiRef();\r\n\r\n const { selectedRows } = useCheckboxSelection<TEntity>(\r\n data,\r\n props.getRowId || (() => 0),\r\n apiRef\r\n );\r\n // TODO: habría que mejorar la estructura del código para que cuando no se requiere\r\n // checkbox selection, no sea necesario el hook.\r\n\r\n return {\r\n datagridProps: {\r\n apiRef: apiRef,\r\n paginationModel: {\r\n pageSize: data?.paginacion.pageSize || 0,\r\n page: data?.paginacion.actualPage ? data.paginacion.actualPage - 1 : 0,\r\n },\r\n rowCount: query.data?.paginacion.cantRecords,\r\n columns: props.columns.map((col) => ({\r\n ...col,\r\n sortable: false,\r\n disableColumnMenu: !props.filters?.[col.field],\r\n renderHeader: (params) => {\r\n return (\r\n <Box sx={{ \":hover > *\": { visibility: \"visible\" } }}>\r\n <strong style={{ marginRight: 10 }}>\r\n {params.colDef.headerName}\r\n </strong>\r\n <>\r\n {props.filters?.[col.field] && (\r\n <IconButton\r\n onClick={() => {\r\n apiRef.current.showColumnMenu(params.colDef.field);\r\n // apiRef.current.showFilterPanel(params.colDef.field);\r\n }}\r\n sx={{\r\n visibility: !!filter?.form.getValues(\r\n props.filters[col.field].name\r\n )\r\n ? \"visible\"\r\n : \"hidden\",\r\n }}\r\n >\r\n <FilterAlt fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n </>\r\n </Box>\r\n );\r\n },\r\n })),\r\n rows: data?.lista || [],\r\n onPaginationModelChange: ({ page, pageSize }) =>\r\n setParamsPaginacion({ actualPage: page + 1, pageSize: pageSize }),\r\n loading: isFetching,\r\n slots: {\r\n columnMenu: (params) => {\r\n return (\r\n <GridColumnMenu\r\n {...params}\r\n slots={{\r\n columnMenuUserItem: (params) => {\r\n if (!props.filters || !filter) return <></>;\r\n const {\r\n colDef: { field },\r\n } = params;\r\n // TODO: make field of type union of possible fields\r\n const menuParams = props.filters[field];\r\n if (!menuParams) return <></>;\r\n return (\r\n <Filter\r\n close={() => {\r\n apiRef.current.hideColumnMenu();\r\n }}\r\n formMethods={filter.form}\r\n menuParams={menuParams}\r\n />\r\n );\r\n },\r\n columnMenuSortItem: null,\r\n columnMenuFilterItem: null,\r\n columnMenuColumnsItem: null,\r\n }}\r\n />\r\n );\r\n },\r\n },\r\n checkboxSelection: props.checkboxSelection,\r\n rowSelectionModel: props.checkboxSelection\r\n ? selectedRows.map((row) => props.getRowId(row))\r\n : undefined,\r\n getRowId: props.getRowId,\r\n },\r\n control: {\r\n query: query,\r\n form: props.filters ? filter?.form : undefined,\r\n selectedRows,\r\n },\r\n };\r\n}\r\n","import { GridValidRowModel } from \"@mui/x-data-grid\";\r\nimport { FieldValues } from \"react-hook-form\";\r\nimport { UseItecDataGrid, UseItecDataGridProps, dataGridBase } from \"./base\";\r\nimport {\r\n UseItecDataGridPaginatedProps,\r\n UseItecDataGridPaginated,\r\n dataGridPaginated,\r\n} from \"./paginated\";\r\n\r\n// function useItecDataGrid<\r\n// Paginated extends boolean = false,\r\n// Filterable extends boolean = false,\r\n// Sortable extends boolean = false,\r\n// Selectable extends boolean = false,\r\n// TEntity extends GridValidRowModel,\r\n// TFilter extends FieldValues = {}\r\n// >(\r\n// props: UseItecDataGridPaginatedProps<TEntity, TFilter>\r\n// ): UseItecDataGrid<TEntity>;\r\n\r\nfunction useItecDataGrid<\r\n TEntity extends GridValidRowModel,\r\n TFilter extends FieldValues = {}\r\n>(\r\n props: UseItecDataGridPaginatedProps<TEntity, TFilter>\r\n): UseItecDataGrid<TEntity, TFilter>;\r\n\r\nfunction useItecDataGrid<\r\n TEntity extends GridValidRowModel,\r\n TFilter extends FieldValues = {}\r\n>(\r\n props: UseItecDataGridProps<TEntity, TFilter>\r\n): UseItecDataGridPaginated<TEntity, TFilter>;\r\n\r\nfunction useItecDataGrid<\r\n TEntity extends GridValidRowModel,\r\n TFilter extends FieldValues = {}\r\n>(\r\n props:\r\n | UseItecDataGridProps<TEntity, TFilter>\r\n | UseItecDataGridPaginatedProps<TEntity, TFilter>\r\n):\r\n | UseItecDataGrid<TEntity, TFilter>\r\n | UseItecDataGridPaginated<TEntity, TFilter> {\r\n if (props.pagination) {\r\n return dataGridPaginated<TEntity, TFilter>(props);\r\n }\r\n\r\n return dataGridBase<TEntity, TFilter>(props);\r\n}\r\n\r\nexport default useItecDataGrid;\r\n","import { DataGrid, DataGridProps, GridValidRowModel } from \"@mui/x-data-grid\";\r\n\r\nexport type ItecDataGridProps<TEntity extends GridValidRowModel> = Omit<\r\n DataGridProps<TEntity>,\r\n \"paginationMode\" | \"filterMode\"\r\n>;\r\n\r\nexport function ItecDataGrid<TEntity extends GridValidRowModel>(\r\n props: ItecDataGridProps<TEntity>\r\n) {\r\n const { slots, ...rest } = props;\r\n\r\n return (\r\n <DataGrid\r\n paginationMode=\"server\"\r\n filterMode=\"server\"\r\n slots={{\r\n columnMenuIcon: () => <></>,\r\n ...slots,\r\n }}\r\n autoHeight={true}\r\n {...rest}\r\n />\r\n );\r\n}\r\n"],"mappings":"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","names":["import_icons_material","import_material","import_react","import_jsx_runtime","_a","params","import_x_data_grid","import_react","import_react_query","import_icons_material","import_material","import_jsx_runtime","_a","params","import_x_data_grid","import_jsx_runtime"]}