@m4l/components 9.3.21-JAEBeta.2 → 9.3.21-JT20102025.beta.1

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 (93) hide show
  1. package/components/DataGrid/DataGrid.js +9 -4
  2. package/components/DataGrid/Datagrid.styles.js +270 -0
  3. package/components/DataGrid/constants.js +2 -2
  4. package/components/DataGrid/contexts/DataGridContext/index.js +317 -112
  5. package/components/DataGrid/contexts/DataGridContext/types.d.ts +63 -4
  6. package/components/DataGrid/dictionary.d.ts +5 -0
  7. package/components/DataGrid/dictionary.js +6 -1
  8. package/components/DataGrid/formatters/ColumnSetCheckFormatter/formatter.js +2 -2
  9. package/components/DataGrid/hooks/useModalCardDetail.d.ts +6 -0
  10. package/components/DataGrid/hooks/useModalCardDetail.js +74 -0
  11. package/components/DataGrid/hooks/useProcessedColumns.d.ts +50 -0
  12. package/components/DataGrid/hooks/useProcessedColumns.js +44 -0
  13. package/components/DataGrid/icons.d.ts +7 -0
  14. package/components/DataGrid/icons.js +5 -1
  15. package/components/DataGrid/index.d.ts +1 -1
  16. package/components/DataGrid/slots/DataGridEnum.d.ts +22 -1
  17. package/components/DataGrid/slots/DataGridEnum.js +21 -0
  18. package/components/DataGrid/slots/DataGridSlot.d.ts +24 -0
  19. package/components/DataGrid/slots/DataGridSlot.js +123 -21
  20. package/components/DataGrid/subcomponents/Cards/hooks/useCardContent.d.ts +9 -0
  21. package/components/DataGrid/subcomponents/Cards/hooks/useCardContent.js +91 -0
  22. package/components/DataGrid/subcomponents/Cards/index.d.ts +5 -0
  23. package/components/DataGrid/subcomponents/Cards/index.js +40 -0
  24. package/components/DataGrid/subcomponents/Cards/subcomponents/CardDetails/index.d.ts +8 -0
  25. package/components/DataGrid/subcomponents/Cards/subcomponents/CardDetails/index.js +79 -0
  26. package/components/DataGrid/subcomponents/Cards/subcomponents/CardHeader/index.d.ts +7 -0
  27. package/components/DataGrid/subcomponents/Cards/subcomponents/CardHeader/index.js +98 -0
  28. package/components/DataGrid/subcomponents/Cards/subcomponents/CardRow/index.d.ts +6 -0
  29. package/components/DataGrid/subcomponents/Cards/subcomponents/CardRow/index.js +71 -0
  30. package/components/DataGrid/subcomponents/Cards/subcomponents/IntersectCard/index.d.ts +20 -0
  31. package/components/DataGrid/subcomponents/Cards/subcomponents/IntersectCard/index.js +46 -0
  32. package/components/DataGrid/subcomponents/Cards/subcomponents/LazyLoadCard/index.d.ts +17 -0
  33. package/components/DataGrid/subcomponents/Cards/subcomponents/LazyLoadCard/index.js +34 -0
  34. package/components/DataGrid/subcomponents/Cards/types.d.ts +118 -0
  35. package/components/DataGrid/subcomponents/CheckboxCellAdapter/index.d.ts +7 -0
  36. package/components/DataGrid/subcomponents/CheckboxCellAdapter/index.js +43 -0
  37. package/components/DataGrid/subcomponents/CheckboxCellAdapter/types.d.ts +7 -0
  38. package/components/DataGrid/subcomponents/ControlNavigate/ControlNavigate.js +1 -1
  39. package/components/DataGrid/subcomponents/HeaderActions/index.js +5 -3
  40. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/RowsCount/index.js +1 -1
  41. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/index.js +11 -2
  42. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/subcomponents/ColumnsConfig/index.js +1 -1
  43. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/subcomponents/ColumnsConfigCards/index.d.ts +2 -0
  44. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/subcomponents/ColumnsConfigCards/index.js +304 -0
  45. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/subcomponents/ColumnsConfigCards/types.d.ts +31 -0
  46. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/ViewMode/index.d.ts +4 -0
  47. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/ViewMode/index.js +125 -0
  48. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettings/index.js +2 -2
  49. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettingsCards/index.d.ts +7 -0
  50. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettingsCards/index.js +74 -0
  51. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettingsCards/types.d.ts +4 -0
  52. package/components/DataGrid/subcomponents/RenderContent/index.d.ts +5 -0
  53. package/components/DataGrid/subcomponents/RenderContent/index.js +11 -0
  54. package/components/DataGrid/subcomponents/Table/hooks/useHeaderMenuActions.js +2 -2
  55. package/components/DataGrid/subcomponents/Table/hooks/useSortColumnsRows.js +1 -1
  56. package/components/DataGrid/subcomponents/Table/index.js +1 -1
  57. package/components/DataGrid/subcomponents/Table/subcomponents/ActionsColumn.js +1 -1
  58. package/components/DataGrid/subcomponents/Table/subcomponents/DraggableHeaderRenderer.js +1 -1
  59. package/components/DataGrid/subcomponents/Table/subcomponents/HeaderRenderClick/HeaderRenderClick.js +1 -1
  60. package/components/DataGrid/subcomponents/editors/TextEditor/index.js +1 -1
  61. package/components/DataGrid/tests/components/CardDetails.test.d.ts +1 -0
  62. package/components/DataGrid/tests/components/CardHeader.test.d.ts +1 -0
  63. package/components/DataGrid/tests/components/CardRow.test.d.ts +1 -0
  64. package/components/DataGrid/tests/components/Cards.test.d.ts +1 -0
  65. package/components/DataGrid/tests/components/CheckboxCellAdapter.test.d.ts +1 -0
  66. package/components/DataGrid/tests/components/ColumnsConfigCards.test.d.ts +1 -0
  67. package/components/DataGrid/tests/components/IntersectCard.test.d.ts +1 -0
  68. package/components/DataGrid/tests/components/ViewMode.test.d.ts +1 -0
  69. package/components/DataGrid/tests/helpers/useCardsViewConfig.d.ts +24 -0
  70. package/components/DataGrid/tests/helpers/useCustomCardExample.d.ts +7 -0
  71. package/components/DataGrid/tests/hooks/useCardContent.test.d.ts +1 -0
  72. package/components/DataGrid/tests/hooks/useModalDetail.test.d.ts +1 -0
  73. package/components/DataGrid/tests/hooks/useModalSettingsCards.test.d.ts +1 -0
  74. package/components/DataGrid/tests/hooks/useProcessedColumns.test.d.ts +1 -0
  75. package/components/DataGrid/types.d.ts +86 -5
  76. package/components/MFIsolationAppStorybook/MFIsolationAppStorybook.d.ts +5 -0
  77. package/components/MFIsolationAppStorybook/constants.d.ts +1 -0
  78. package/components/MFIsolationAppStorybook/icons.d.ts +3 -0
  79. package/components/MFIsolationAppStorybook/index.d.ts +1 -0
  80. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.d.ts +4 -0
  81. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.d.ts +1 -0
  82. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/MFAuthAppStorybook.d.ts +5 -0
  83. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/index.d.ts +1 -0
  84. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/types.d.ts +4 -0
  85. package/components/MFIsolationAppStorybook/types.d.ts +31 -0
  86. package/components/MenuActions/MenuActions.js +105 -55
  87. package/components/areas/contexts/AreasContext/store.js +2 -2
  88. package/components/hook-form/RHFormContext/index.d.ts +1 -1
  89. package/hooks/useDataGridPersistence/helpers.d.ts +2 -2
  90. package/hooks/useDataGridPersistence/useDataGridPersistence.d.ts +2 -2
  91. package/hooks/useDataGridPersistence/useDataGridPersistence.js +5 -0
  92. package/index.js +8 -8
  93. package/package.json +1 -1
@@ -1,51 +1,12 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { useState, useEffect, useMemo, useCallback, createContext } from "react";
2
+ import { useState, useCallback, useEffect, useMemo, createContext } from "react";
3
3
  import { c as castMapColumnsWidthToRecord } from "../../helpers/castMapColumnsWidthToRecord.js";
4
- import { useFirstRender } from "@m4l/graphics";
4
+ import { useFirstRender, useIsMobile } from "@m4l/graphics";
5
5
  import { g as getComponentClasses } from "../../../../utils/getComponentSlotRoot.js";
6
6
  import { a as DATAGRID_ROW_HEIGHTS, b as DATAGRID_ROW_HEADER_HEIGHTS, D as DATAGRID_PREFIX_NAME } from "../../constants.js";
7
7
  import { C as ControlNavigateSlots, a as ColumnsConfigSlots, T as TextEditorSlots, b as TableSlots, R as RowsCountSlots, A as ActionsSlots, D as DataGridSlots } from "../../slots/DataGridEnum.js";
8
8
  import { deepEqual } from "fast-equals";
9
9
  const DataGridContext = createContext(null);
10
- const getColumnConfigByKey = (key, storeColumnsConfig) => {
11
- let indexFind = -1;
12
- return [
13
- storeColumnsConfig.find((column, index) => {
14
- if (column.key === key) {
15
- indexFind = index;
16
- }
17
- return column.key === key;
18
- }),
19
- indexFind
20
- ];
21
- };
22
- function getColumnsConfig(id, columns, defaultUserColumns = void 0) {
23
- let columnsConfig;
24
- if (defaultUserColumns) {
25
- columnsConfig = defaultUserColumns.columnsConfig;
26
- } else {
27
- try {
28
- const item = window.localStorage.getItem(`${id}_columns_config`);
29
- columnsConfig = item !== null ? JSON.parse(item) : [];
30
- } catch (_e) {
31
- columnsConfig = [];
32
- }
33
- }
34
- return columns.map((column, index) => {
35
- const [columnConfig = { ...column }, columnConfigIndex] = getColumnConfigByKey(column.key, columnsConfig);
36
- return {
37
- key: column.key,
38
- name: typeof column.name === "string" ? column.name : String(column.name),
39
- hidden: column.hidden === void 0 ? false : column.hidden,
40
- index: columnConfigIndex > -1 ? columnConfigIndex : index,
41
- visible: columnConfig.visible === void 0 ? true : columnConfig.visible,
42
- frozen: columnConfig.frozen ?? false,
43
- originalIndex: index,
44
- originalVisible: column.visible === void 0 ? true : column.visible,
45
- originalFrozen: column.frozen ?? false
46
- };
47
- }).sort((a, b) => a.index - b.index);
48
- }
49
10
  function getColumnsWidth(id, columns, defaultUserColumns) {
50
11
  const newMap = /* @__PURE__ */ new Map();
51
12
  let storeColumnsWidth;
@@ -89,12 +50,87 @@ function saveColumnsWidth(id, storeColumnsWidth, onChangeUserColumns) {
89
50
  JSON.stringify([...storeColumnsWidth])
90
51
  );
91
52
  }
92
- function saveColumnsConfig(id, columnsConfig, onChangeUserColumns) {
93
- if (onChangeUserColumns) {
94
- onChangeUserColumns({ reason: "columnsConfig", userConfig: columnsConfig });
53
+ const getAllViewModes = () => {
54
+ return ["table", "cards"];
55
+ };
56
+ const getViewSpecificConfig = (viewMode) => {
57
+ const configs = {
58
+ table: {
59
+ defaults: { frozen: false },
60
+ originalDefaults: { originalFrozen: false },
61
+ dynamicOriginalProperty: (item) => ({
62
+ originalFrozen: item?.frozen ?? false
63
+ })
64
+ },
65
+ cards: {
66
+ defaults: { showTitle: true },
67
+ originalDefaults: { originalShowTitle: true },
68
+ dynamicOriginalProperty: (item) => ({
69
+ originalShowTitle: item?.showTitle ?? true
70
+ })
71
+ }
72
+ };
73
+ return configs[viewMode] || configs.table;
74
+ };
75
+ const getViewSuffix = (viewMode) => {
76
+ if (viewMode === "table") {
77
+ return "";
78
+ }
79
+ return `_${viewMode}`;
80
+ };
81
+ function getInitialColumnsConfig(id, columns, viewMode, defaultUserConfig, viewSpecificDefaults, originalViewSpecificDefaults) {
82
+ let columnsConfig;
83
+ if (defaultUserConfig) {
84
+ columnsConfig = defaultUserConfig;
85
+ } else {
86
+ columnsConfig = loadViewConfig(
87
+ id,
88
+ getViewSuffix(viewMode)
89
+ ) || [];
90
+ }
91
+ return columns.map((column, index) => {
92
+ const existingConfig = columnsConfig.find((c) => c.key === column.key);
93
+ const columnConfigIndex = existingConfig ? columnsConfig.indexOf(existingConfig) : -1;
94
+ const baseConfig = {
95
+ key: column.key,
96
+ name: typeof column.name === "string" ? column.name : String(column.name),
97
+ hidden: column.hidden === void 0 ? false : column.hidden,
98
+ index: columnConfigIndex > -1 ? columnConfigIndex : index,
99
+ visible: existingConfig?.visible === void 0 ? true : existingConfig.visible,
100
+ originalIndex: index,
101
+ originalVisible: column.visible === void 0 ? true : column.visible
102
+ };
103
+ return {
104
+ ...baseConfig,
105
+ ...viewSpecificDefaults,
106
+ ...originalViewSpecificDefaults,
107
+ ...existingConfig || {}
108
+ };
109
+ }).sort((a, b) => a.index - b.index);
110
+ }
111
+ function saveViewConfig(id, viewSuffix, config, onChangeCallback) {
112
+ if (onChangeCallback) {
113
+ const reason = viewSuffix === "" ? "columnsConfig" : `columnsConfig${viewSuffix.replace("_", "")}`;
114
+ onChangeCallback({
115
+ reason,
116
+ userConfig: config
117
+ });
95
118
  return;
96
119
  }
97
- localStorage.setItem(`${id}_columns_config`, JSON.stringify(columnsConfig));
120
+ const storageKey = viewSuffix === "" ? `${id}_columns_config` : `${id}_columns_config${viewSuffix}`;
121
+ localStorage.setItem(storageKey, JSON.stringify(config));
122
+ }
123
+ function loadViewConfig(id, viewSuffix) {
124
+ try {
125
+ const storageKey = viewSuffix === "" ? `${id}_columns_config` : `${id}_columns_config${viewSuffix}`;
126
+ const stored = localStorage.getItem(storageKey);
127
+ return stored ? JSON.parse(stored) : null;
128
+ } catch (_e) {
129
+ return null;
130
+ }
131
+ }
132
+ function saveViewMode(id, viewMode) {
133
+ localStorage.setItem(`${id}_view_mode`, viewMode);
98
134
  }
99
135
  function getIndexRowHeightVariant(variant) {
100
136
  if (variant === "compact") {
@@ -123,9 +159,14 @@ function DataGridProvider(props) {
123
159
  onChangeUserColumns,
124
160
  externalSortSettings: sortSettings,
125
161
  externalFilterSettings: filterSettings,
126
- size
162
+ size,
163
+ viewMode,
164
+ onViewModeChange,
165
+ defaultViewMode,
166
+ cardsViewConfig
127
167
  } = props;
128
168
  const isFirstRender = useFirstRender([columns, id]);
169
+ const isMobile = useIsMobile();
129
170
  const classes = getComponentClasses(DATAGRID_PREFIX_NAME, {
130
171
  ...DataGridSlots,
131
172
  ...ActionsSlots,
@@ -136,11 +177,56 @@ function DataGridProvider(props) {
136
177
  ...ControlNavigateSlots
137
178
  });
138
179
  const [columnsWidths, setColumnsWidths] = useState(/* @__PURE__ */ new Map());
139
- const [columnsConfig, setColumnsConfigOptions] = useState(
140
- () => []
180
+ const [viewConfig, setViewConfig] = useState(() => ({
181
+ table: [],
182
+ cards: []
183
+ }));
184
+ const getConfigColumns = useCallback(
185
+ (viewModeParam) => {
186
+ return viewConfig[viewModeParam];
187
+ },
188
+ [viewConfig]
189
+ );
190
+ const updateConfigColumns = useCallback(
191
+ (viewModeParam, config) => {
192
+ setViewConfig((prev) => ({
193
+ ...prev,
194
+ [viewModeParam]: config
195
+ }));
196
+ },
197
+ []
141
198
  );
142
199
  const [rowsFilterCount, setRowFilterCount] = useState(rowsCount);
143
200
  const [sortColumns, setSortColumns] = useState([]);
201
+ const [viewModeState, setViewModeState] = useState(() => {
202
+ if (viewMode) {
203
+ return viewMode;
204
+ }
205
+ try {
206
+ const savedViewMode = localStorage.getItem(`${id}_view_mode`);
207
+ if (savedViewMode === "cards" || savedViewMode === "table") {
208
+ return savedViewMode;
209
+ }
210
+ } catch (_e) {
211
+ }
212
+ if (defaultViewMode) {
213
+ return defaultViewMode;
214
+ }
215
+ return isMobile ? "cards" : "table";
216
+ });
217
+ const handleViewModeChange = useCallback(
218
+ (newViewMode) => {
219
+ setViewModeState(newViewMode);
220
+ saveViewMode(id, newViewMode);
221
+ onViewModeChange?.(newViewMode);
222
+ },
223
+ [onViewModeChange, id]
224
+ );
225
+ useEffect(() => {
226
+ if (viewMode !== void 0) {
227
+ setViewModeState(viewMode);
228
+ }
229
+ }, [viewMode]);
144
230
  const [currentRowHeightVariant, setCurrentRowHeightVariant] = useState(() => {
145
231
  if (typeof rowHeights !== typeof rowHeaderHeights) {
146
232
  throw new Error("Must be same type rowheights and rowHeaderTypes");
@@ -184,99 +270,214 @@ function DataGridProvider(props) {
184
270
  }
185
271
  }
186
272
  }
187
- }, [columns, sortSettings, filterSettings]);
273
+ if (cardsViewConfig !== void 0) {
274
+ const hasCustomRender = cardsViewConfig.customRender !== void 0;
275
+ const hasColumnsConfig = cardsViewConfig.columnsConfig !== void 0 && cardsViewConfig.columnsConfig.length > 0;
276
+ if (!hasCustomRender && !hasColumnsConfig) {
277
+ throw new Error(
278
+ `DataGridProvider: cardsViewConfig.enabled=true requiere configurar al menos una de estas opciones:
279
+ - cardsViewConfig.customRender (renderizado personalizado)
280
+ - cardsViewConfig.columnsConfig (configuración de columnas con al menos 1 elemento)
281
+
282
+ Configuración actual:
283
+ - customRender: ${hasCustomRender ? "definido" : "undefined"}
284
+ - columnsConfig: ${cardsViewConfig.columnsConfig?.length || 0} columnas
285
+
286
+ Ejemplo válido con columnsConfig:
287
+ cardsViewConfig={{
288
+ enabled: true,
289
+ columnsConfig: [
290
+ { columnKey: 'name', showTitle: false },
291
+ { columnKey: 'email', showTitle: true }
292
+ ]
293
+ }}
294
+
295
+ Ejemplo válido con customRender:
296
+ cardsViewConfig={{
297
+ enabled: true,
298
+ customRender: {
299
+ renderContent: (row) => <CustomCard row={row} />,
300
+ minHeight: 200
301
+ }
302
+ }}
303
+ `
304
+ );
305
+ }
306
+ if (hasColumnsConfig && cardsViewConfig.columnsConfig) {
307
+ for (const cardCol of cardsViewConfig.columnsConfig) {
308
+ if (!keys.has(cardCol.columnKey)) {
309
+ throw new Error(
310
+ `DataGridProvider: cardsViewConfig.columnsConfig incluye columnKey="${cardCol.columnKey}", pero no existe ninguna columna con key="${cardCol.columnKey}".`
311
+ );
312
+ }
313
+ }
314
+ }
315
+ }
316
+ }, [columns, sortSettings, filterSettings, cardsViewConfig]);
188
317
  const finalRowHeights = useMemo(() => rowHeights, [rowHeights]);
189
318
  let timerSaveColumns;
190
319
  useEffect(() => {
191
320
  if (isFirstRender) {
192
321
  setColumnsWidths(getColumnsWidth(id, columns, defaultUserColumns));
193
- setColumnsConfigOptions(
194
- getColumnsConfig(id, columns, defaultUserColumns)
322
+ updateConfigColumns(
323
+ "table",
324
+ getInitialColumnsConfig(
325
+ id,
326
+ columns,
327
+ "table",
328
+ defaultUserColumns?.columnsConfig,
329
+ { frozen: false },
330
+ { originalFrozen: false }
331
+ )
332
+ );
333
+ const finalCardsConfig = (() => {
334
+ if (defaultUserColumns?.columnsConfigCards) {
335
+ return defaultUserColumns.columnsConfigCards;
336
+ }
337
+ if (cardsViewConfig?.columnsConfig) {
338
+ return cardsViewConfig.columnsConfig.map((colConfig, index) => ({
339
+ key: colConfig.columnKey,
340
+ visible: true,
341
+ index,
342
+ showTitle: colConfig.showTitle
343
+ }));
344
+ }
345
+ return void 0;
346
+ })();
347
+ updateConfigColumns(
348
+ "cards",
349
+ getInitialColumnsConfig(
350
+ id,
351
+ columns,
352
+ "cards",
353
+ finalCardsConfig,
354
+ { showTitle: false },
355
+ { originalShowTitle: false }
356
+ )
195
357
  );
196
358
  }
197
359
  }, [defaultUserColumns]);
198
360
  useEffect(() => {
199
361
  if (!isFirstRender) {
200
- const finalColumnsConfig = [];
201
- for (let i = 0; i < columnsConfig.length; i++) {
202
- const columnIndex = columns.findIndex(
203
- (c) => c.key === columnsConfig[i]?.key
204
- );
205
- if (columnIndex !== -1) {
206
- const column = columns[columnIndex];
207
- finalColumnsConfig.push({
208
- ...columnsConfig[i],
209
- // name: column.name as string,
210
- originalIndex: columnIndex,
211
- originalFrozen: column.frozen ?? false,
212
- originalVisible: column.visible ?? true
213
- });
214
- }
215
- }
216
- const newColumns = columns.filter(
217
- (column, index) => column.key !== columnsConfig[index]?.key
218
- );
219
- if (newColumns.length > 0) {
220
- const colLength = finalColumnsConfig.length;
221
- const newColConfig = getColumnsConfig(
222
- id,
223
- newColumns
224
- ).map((columnConfig, index) => {
362
+ const updatedConfigs = {
363
+ table: [],
364
+ cards: []
365
+ };
366
+ getAllViewModes().forEach((viewModeParam) => {
367
+ const currentConfig = getConfigColumns(viewModeParam);
368
+ const finalConfig = [];
369
+ for (let i = 0; i < currentConfig.length; i++) {
225
370
  const columnIndex = columns.findIndex(
226
- (c) => c.key === newColumns[index].key
371
+ (c) => c.key === currentConfig[i]?.key
227
372
  );
228
- const column = newColumns[index];
229
- const indexNewCol = index + colLength;
230
- return {
231
- ...columnConfig,
232
- index: indexNewCol,
233
- name: column.name,
234
- originalIndex: columnIndex,
235
- originalFrozen: column.frozen ?? false,
236
- originalVisible: column.visible ?? true
373
+ if (columnIndex !== -1) {
374
+ const column = columns[columnIndex];
375
+ finalConfig.push({
376
+ ...currentConfig[i],
377
+ originalIndex: columnIndex,
378
+ // Propiedades específicas por vista dinámicamente
379
+ ...getViewSpecificConfig(viewModeParam).dynamicOriginalProperty(
380
+ currentConfig[i] || column
381
+ ),
382
+ originalVisible: column.visible ?? true
383
+ });
384
+ }
385
+ }
386
+ updatedConfigs[viewModeParam] = finalConfig;
387
+ });
388
+ getAllViewModes().forEach((viewModeParam) => {
389
+ const currentConfig = updatedConfigs[viewModeParam];
390
+ const newColumnsForView = columns.filter(
391
+ (column, index) => column.key !== getConfigColumns(viewModeParam)[index]?.key
392
+ );
393
+ if (newColumnsForView.length > 0) {
394
+ const colLength = currentConfig.length;
395
+ const viewSpecificDefaults = viewModeParam === "cards" ? { showTitle: false } : {
396
+ frozen: false
237
397
  };
238
- });
239
- finalColumnsConfig.push(...newColConfig);
240
- }
241
- if (deepEqual(columnsConfig, finalColumnsConfig)) {
398
+ const originalViewSpecificDefaults = viewModeParam === "cards" ? {
399
+ originalShowTitle: false
400
+ } : {
401
+ originalFrozen: false
402
+ };
403
+ const newColConfig = getInitialColumnsConfig(
404
+ id,
405
+ newColumnsForView,
406
+ viewModeParam,
407
+ void 0,
408
+ viewSpecificDefaults,
409
+ originalViewSpecificDefaults
410
+ ).map((columnConfig, index) => {
411
+ const columnIndex = columns.findIndex(
412
+ (c) => c.key === newColumnsForView[index].key
413
+ );
414
+ const column = newColumnsForView[index];
415
+ return {
416
+ ...columnConfig,
417
+ index: index + colLength,
418
+ name: column.name,
419
+ originalIndex: columnIndex,
420
+ originalVisible: column.visible ?? true,
421
+ // Propiedades específicas por vista dinámicamente
422
+ ...getViewSpecificConfig(viewModeParam).dynamicOriginalProperty(
423
+ column
424
+ )
425
+ };
426
+ });
427
+ updatedConfigs[viewModeParam].push(...newColConfig);
428
+ }
429
+ });
430
+ let hasChanges = false;
431
+ getAllViewModes().forEach((viewModeParam) => {
432
+ if (!deepEqual(
433
+ getConfigColumns(viewModeParam),
434
+ updatedConfigs[viewModeParam]
435
+ )) {
436
+ hasChanges = true;
437
+ }
438
+ });
439
+ if (!hasChanges) {
242
440
  return;
243
441
  }
244
- console.log(
245
- "useEffect columnsConfig changed",
246
- columnsConfig,
247
- finalColumnsConfig
248
- );
249
- setColumnsConfigOptions(finalColumnsConfig);
442
+ console.log("useEffect viewConfigs changed", updatedConfigs);
443
+ getAllViewModes().forEach((viewModeParam) => {
444
+ updateConfigColumns(viewModeParam, updatedConfigs[viewModeParam]);
445
+ });
250
446
  }
251
447
  }, [columns, id]);
252
448
  const onChangeColumnsConfig = useCallback(
253
- (newColumnsConfig) => {
254
- saveColumnsConfig(id, newColumnsConfig, onChangeUserColumns);
255
- setColumnsConfigOptions(newColumnsConfig);
449
+ (viewModeParam, newConfig) => {
450
+ saveViewConfig(
451
+ id,
452
+ getViewSuffix(viewModeParam),
453
+ newConfig,
454
+ onChangeUserColumns
455
+ );
456
+ updateConfigColumns(viewModeParam, newConfig);
256
457
  },
257
- // eslint-disable-next-line react-hooks/exhaustive-deps
258
- [setColumnsConfigOptions, id]
458
+ [id, onChangeUserColumns, updateConfigColumns]
259
459
  );
260
460
  const onChangeColumnsOrder = useCallback(
261
- (sourceKey, targetKey) => {
461
+ (viewModeParam, sourceKey, targetKey) => {
262
462
  if (sourceKey === targetKey) {
263
463
  return;
264
464
  }
265
- const sourceColumnIndex = columnsConfig.findIndex(
465
+ const currentConfig = getConfigColumns(viewModeParam);
466
+ const sourceColumnIndex = currentConfig.findIndex(
266
467
  (c) => c.key === sourceKey
267
468
  );
268
- const targetColumnIndex = columnsConfig.findIndex(
469
+ const targetColumnIndex = currentConfig.findIndex(
269
470
  (c) => c.key === targetKey
270
471
  );
271
- const reorderedColumnsConfig = [...columnsConfig];
272
- reorderedColumnsConfig.splice(
472
+ const reorderedConfig = [...currentConfig];
473
+ reorderedConfig.splice(
273
474
  targetColumnIndex,
274
475
  0,
275
- reorderedColumnsConfig.splice(sourceColumnIndex, 1)[0]
476
+ reorderedConfig.splice(sourceColumnIndex, 1)[0]
276
477
  );
277
- onChangeColumnsConfig(reorderedColumnsConfig);
478
+ onChangeColumnsConfig(viewModeParam, reorderedConfig);
278
479
  },
279
- [columnsConfig, onChangeColumnsConfig]
480
+ [getConfigColumns, onChangeColumnsConfig]
280
481
  );
281
482
  const onChangeColumnWidth = (columnKey, width) => {
282
483
  columnsWidths.set(columnKey, Math.round(width));
@@ -307,7 +508,9 @@ function DataGridProvider(props) {
307
508
  DataGridContext.Provider,
308
509
  {
309
510
  value: {
310
- columnsConfig,
511
+ getConfigColumns,
512
+ onChangeColumnsConfig,
513
+ columnsConfig: getConfigColumns("table"),
311
514
  columnsWidths,
312
515
  rowsCount: rowsFilterCount,
313
516
  currentRowHeightVariant: currentRowHeightVariant.rowHVariant,
@@ -316,7 +519,6 @@ function DataGridProvider(props) {
316
519
  rows,
317
520
  rowHeights: finalRowHeights,
318
521
  checkedRows,
319
- onChangeColumnsConfig,
320
522
  onChangeColumnsOrder,
321
523
  onChangeColumnWidth,
322
524
  setRowsCount: setRowFilterCountInternal,
@@ -330,7 +532,10 @@ function DataGridProvider(props) {
330
532
  externalSortSettings: sortSettings,
331
533
  externalFilterSettings: filterSettings,
332
534
  classes,
333
- size
535
+ size,
536
+ viewMode: viewModeState,
537
+ onViewModeChange: handleViewModeChange,
538
+ cardsViewConfig
334
539
  },
335
540
  children
336
541
  }
@@ -3,6 +3,29 @@ import { RowKey, RowHeightVariants, GridProps } from '../../types';
3
3
  import { Maybe } from '@m4l/core';
4
4
  import { ActionsSlots, ColumnsConfigSlots, ControlNavigateSlots, DataGridSlots, RowsCountSlots, TableSlots, TextEditorSlots } from '../../slots/DataGridEnum';
5
5
  import { SortColumn } from 'react-data-grid';
6
+ /**
7
+ * Configuración base genérica que puede extenderse con propiedades específicas de cualquier vista
8
+ * USO INTERNO: El sistema usa esto para manejar genéricamente las configuraciones
9
+ */
10
+ export type BaseViewConfig<TViewSpecific = {}> = TViewSpecific & {
11
+ key: string;
12
+ visible: boolean;
13
+ index: number;
14
+ name?: string;
15
+ };
16
+ /**
17
+ * Configuración extendida genérica con propiedades originales
18
+ * USO INTERNO: El contexto usa esto para el estado interno con propiedades de tracking
19
+ */
20
+ export type IViewConfig<TViewSpecific = {}, TOriginalViewSpecific = {}> = BaseViewConfig<TViewSpecific> & {
21
+ hidden: boolean;
22
+ originalIndex: number;
23
+ originalVisible: boolean;
24
+ } & TOriginalViewSpecific;
25
+ /**
26
+ * Configuración base para columnas de tabla
27
+ * USO: Los desarrolladores pasan esto en defaultUserColumns.columnsConfig
28
+ */
6
29
  export interface BaseConfigColumn {
7
30
  key: string;
8
31
  visible: boolean;
@@ -13,28 +36,66 @@ export interface BaseConfigColumn {
13
36
  */
14
37
  name?: string;
15
38
  }
39
+ /**
40
+ * Configuración base para vista cards - omite frozen y agrega showTitle
41
+ * USO: Los desarrolladores pasan esto en defaultUserColumns.columnsConfigCards
42
+ */
43
+ export interface BaseConfigColumnCards extends Omit<BaseConfigColumn, 'frozen'> {
44
+ showTitle: boolean;
45
+ }
46
+ /**
47
+ * Configuración extendida para columnas de tabla (estado interno)
48
+ * USO INTERNO: El contexto agrega estas propiedades para tracking y gestión de estado
49
+ */
16
50
  export interface IConfigColumn extends BaseConfigColumn {
17
51
  hidden: boolean;
18
52
  originalIndex: number;
19
53
  originalVisible: boolean;
20
54
  originalFrozen: boolean;
21
55
  }
56
+ /**
57
+ * Configuración extendida para cards (estado interno)
58
+ * USO INTERNO: El contexto agrega estas propiedades para tracking y gestión de estado
59
+ */
60
+ export interface IConfigColumnCards extends Omit<IConfigColumn, 'frozen' | 'originalFrozen'> {
61
+ showTitle: boolean;
62
+ originalShowTitle: boolean;
63
+ }
64
+ export type ViewMode = 'table' | 'cards';
65
+ /**
66
+ * Configuración base del Grid (API pública original)
67
+ * USO: Tipo base para defaultUserColumns - mantiene retrocompatibilidad
68
+ * IMPORTANTE: No modificar para mantener retrocompatibilidad con código existente
69
+ */
22
70
  export interface IGridConfig {
23
71
  columnsConfig: BaseConfigColumn[];
24
72
  columnsWidths: Record<RowKey, number>;
25
73
  }
26
- export interface DataGridProviderProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> extends Pick<GridProps<TRow, TSummaryRow, TKey>, 'rows' | 'columns' | 'rowActionsGetter' | 'rowHeaderHeights' | 'rowHeights' | 'initialRowHeightVariant' | 'checkedRows' | 'onCheckedRowsChange' | 'rowKeyGetter' | 'onChangeUserColumns' | 'defaultUserColumns' | 'externalSortSettings' | 'externalFilterSettings'> {
74
+ /**
75
+ * Configuración extendida del Grid para soportar múltiples vistas
76
+ * USO: Para nuevas implementaciones que soporten cards y futuras vistas
77
+ * EXTENSIBILIDAD: Agregar aquí nuevas propiedades para nuevas vistas (ej: columnsConfigList)
78
+ */
79
+ export interface IGridConfigExtended extends IGridConfig {
80
+ columnsConfigCards?: BaseConfigColumnCards[];
81
+ }
82
+ export interface DataGridProviderProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> extends Pick<GridProps<TRow, TSummaryRow, TKey>, 'rows' | 'columns' | 'rowActionsGetter' | 'rowHeaderHeights' | 'rowHeights' | 'initialRowHeightVariant' | 'checkedRows' | 'onCheckedRowsChange' | 'rowKeyGetter' | 'onChangeUserColumns' | 'defaultUserColumns' | 'externalSortSettings' | 'externalFilterSettings' | 'defaultViewMode' | 'cardsViewConfig'> {
27
83
  id: number | string;
28
84
  children: ReactNode;
29
85
  rowsCount: number;
30
86
  size: GridProps<any, any, any>['size'];
87
+ viewMode?: ViewMode;
88
+ onViewModeChange?: (viewMode: ViewMode) => void;
31
89
  }
32
90
  export type RowHeightState = {
33
91
  rowHVariant: RowHeightVariants;
34
92
  rowHeight: number;
35
93
  rowHeaderHeight: number;
36
94
  };
37
- export interface DataGridContextProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> extends Pick<DataGridProviderProps<TRow, TSummaryRow, TKey>, 'rows' | 'checkedRows' | 'onCheckedRowsChange' | 'rowHeights' | 'rowsCount' | 'rowActionsGetter' | 'rowKeyGetter' | 'onChangeUserColumns' | 'externalSortSettings' | 'externalFilterSettings'> {
95
+ export interface DataGridContextProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> extends Pick<DataGridProviderProps<TRow, TSummaryRow, TKey>, 'rows' | 'checkedRows' | 'onCheckedRowsChange' | 'rowHeights' | 'rowsCount' | 'rowActionsGetter' | 'rowKeyGetter' | 'onChangeUserColumns' | 'externalSortSettings' | 'externalFilterSettings' | 'viewMode' | 'onViewModeChange' | 'defaultViewMode' | 'cardsViewConfig'> {
96
+ getConfigColumns: (viewMode: ViewMode) => IViewConfig[];
97
+ onChangeColumnsConfig: (viewMode: ViewMode, config: IViewConfig[]) => void;
98
+ onChangeColumnsOrder: (viewMode: ViewMode, sourceKey: string, targetKey: string) => void;
38
99
  columnsConfig: IConfigColumn[];
39
100
  columnsWidths: Map<string, Maybe<string | number>>;
40
101
  setRowsCount: (newRowsCount: number) => void;
@@ -42,8 +103,6 @@ export interface DataGridContextProps<TRow, TSummaryRow, TKey extends RowKey = R
42
103
  currentRowHeight: number;
43
104
  currentRowHeightVariant: RowHeightVariants;
44
105
  setRowHeightVariant: (neVariant: RowHeightVariants) => void;
45
- onChangeColumnsConfig: (newColumnsConfig: IConfigColumn[]) => void;
46
- onChangeColumnsOrder: (sourceKey: string, targetKey: string) => void;
47
106
  onChangeColumnWidth: (columnKey: string, width: number) => void;
48
107
  classes?: Record<DataGridSlots | ActionsSlots | RowsCountSlots | TableSlots | TextEditorSlots | ColumnsConfigSlots | ControlNavigateSlots, string>;
49
108
  size: GridProps<any, any, any>['size'];
@@ -16,6 +16,7 @@ export declare const DICTIONARY: {
16
16
  SETTINGS_COLUMN_NAME: string;
17
17
  SETTINGS_COLUMN_POSITION: string;
18
18
  SETTINGS_COLUMN_VISIBLE: string;
19
+ SETTINGS_COLUMN_SHOW_TITLE: string;
19
20
  SETTINGS_COLUMNS_FROZEN: string;
20
21
  SETTINGS_SEL_COLUMNS: string;
21
22
  SETTINGS_MOVE_FIRST: string;
@@ -33,4 +34,8 @@ export declare const DICTIONARY: {
33
34
  UNFREEZE_COLUMN: string;
34
35
  HIDE_COLUMN: string;
35
36
  ADD_FILTER_COLUMN: string;
37
+ VIEW_MODE_TABLE: string;
38
+ VIEW_MODE_CARDS: string;
39
+ TOOLTIP_VIEW_MODE: string;
40
+ DETAILS: string;
36
41
  };
@@ -16,6 +16,7 @@ const DICTIONARY = {
16
16
  SETTINGS_COLUMN_NAME: `${DATAGRID_ID_DICTIONARY}.settings_column_name`,
17
17
  SETTINGS_COLUMN_POSITION: `${DATAGRID_ID_DICTIONARY}.settings_column_position`,
18
18
  SETTINGS_COLUMN_VISIBLE: `${DATAGRID_ID_DICTIONARY}.settings_column_visible`,
19
+ SETTINGS_COLUMN_SHOW_TITLE: `${DATAGRID_ID_DICTIONARY}.settings_column_show_title`,
19
20
  SETTINGS_COLUMNS_FROZEN: `${DATAGRID_ID_DICTIONARY}.settings_column_frozen`,
20
21
  SETTINGS_SEL_COLUMNS: `${DATAGRID_ID_DICTIONARY}.settings_sel_columns`,
21
22
  SETTINGS_MOVE_FIRST: `${DATAGRID_ID_DICTIONARY}.settings_move_first`,
@@ -32,7 +33,11 @@ const DICTIONARY = {
32
33
  FREEZE_COLUMN: `${DATAGRID_ID_DICTIONARY}.freeze_column`,
33
34
  UNFREEZE_COLUMN: `${DATAGRID_ID_DICTIONARY}.unfreeze_column`,
34
35
  HIDE_COLUMN: `${DATAGRID_ID_DICTIONARY}.hide_column`,
35
- ADD_FILTER_COLUMN: `${DATAGRID_ID_DICTIONARY}.add_filter`
36
+ ADD_FILTER_COLUMN: `${DATAGRID_ID_DICTIONARY}.add_filter`,
37
+ VIEW_MODE_TABLE: `${DATAGRID_ID_DICTIONARY}.view_mode_table`,
38
+ VIEW_MODE_CARDS: `${DATAGRID_ID_DICTIONARY}.view_mode_cards`,
39
+ TOOLTIP_VIEW_MODE: `${DATAGRID_ID_DICTIONARY}.tooltip_view_mode`,
40
+ DETAILS: `${DATAGRID_ID_DICTIONARY}.details`
36
41
  };
37
42
  export {
38
43
  DICTIONARY as D,