@m4l/components 9.3.34 → 9.3.35-JT27112025.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 (133) hide show
  1. package/@types/export.d.ts +3 -0
  2. package/@types/types.d.ts +11 -0
  3. package/components/DataGrid/Datagrid.styles.js +1 -0
  4. package/components/DataGrid/contexts/DataGridContext/index.js +39 -268
  5. package/components/DataGrid/contexts/DataGridContext/types.d.ts +3 -20
  6. package/components/DataGrid/formatters/ColumnImageFormatter/ImageFormatterCell.d.ts +13 -0
  7. package/components/DataGrid/formatters/ColumnImageFormatter/ImageFormatterCell.js +33 -0
  8. package/components/DataGrid/formatters/ColumnImageFormatter/constants.d.ts +6 -0
  9. package/components/DataGrid/formatters/ColumnImageFormatter/constants.js +6 -0
  10. package/components/DataGrid/formatters/ColumnImageFormatter/formatter.d.ts +8 -0
  11. package/components/DataGrid/formatters/ColumnImageFormatter/formatter.js +25 -0
  12. package/components/DataGrid/formatters/ColumnImageFormatter/index.d.ts +3 -0
  13. package/components/DataGrid/formatters/ColumnImageFormatter/index.js +1 -0
  14. package/components/DataGrid/formatters/ColumnImageFormatter/tests/ColumnImageFormatter.test.d.ts +1 -0
  15. package/components/DataGrid/formatters/ColumnImageFormatter/types.d.ts +44 -0
  16. package/components/DataGrid/formatters/ColumnImageFormatter/types.js +1 -0
  17. package/components/DataGrid/formatters/ColumnImageFormatter/useColumnImage.d.ts +9 -0
  18. package/components/DataGrid/formatters/ColumnImageFormatter/useColumnImage.js +22 -0
  19. package/components/DataGrid/formatters/index.d.ts +1 -0
  20. package/components/DataGrid/helpers/getAllViewModes/getAllViewModes.d.ts +19 -0
  21. package/components/DataGrid/helpers/getAllViewModes/getAllViewModes.js +6 -0
  22. package/components/DataGrid/helpers/getAllViewModes/getAllViewModes.test.d.ts +1 -0
  23. package/components/DataGrid/helpers/getAllViewModes/index.d.ts +1 -0
  24. package/components/DataGrid/helpers/getAllViewModes/index.js +1 -0
  25. package/components/DataGrid/helpers/getColumnsWidth/getColumnsWidth.d.ts +47 -0
  26. package/components/DataGrid/helpers/getColumnsWidth/getColumnsWidth.js +32 -0
  27. package/components/DataGrid/helpers/getColumnsWidth/getColumnsWidth.test.d.ts +1 -0
  28. package/components/DataGrid/helpers/getColumnsWidth/index.d.ts +1 -0
  29. package/components/DataGrid/helpers/getColumnsWidth/index.js +1 -0
  30. package/components/DataGrid/helpers/getIndexRowHeightVariant/getIndexRowHeightVariant.d.ts +24 -0
  31. package/components/DataGrid/helpers/getIndexRowHeightVariant/getIndexRowHeightVariant.js +12 -0
  32. package/components/DataGrid/helpers/getIndexRowHeightVariant/getIndexRowHeightVariant.test.d.ts +1 -0
  33. package/components/DataGrid/helpers/getIndexRowHeightVariant/index.d.ts +1 -0
  34. package/components/DataGrid/helpers/getIndexRowHeightVariant/index.js +1 -0
  35. package/components/DataGrid/helpers/getInitialColumnsConfig/getInitialColumnsConfig.d.ts +48 -0
  36. package/components/DataGrid/helpers/getInitialColumnsConfig/getInitialColumnsConfig.js +35 -0
  37. package/components/DataGrid/helpers/getInitialColumnsConfig/getInitialColumnsConfig.test.d.ts +1 -0
  38. package/components/DataGrid/helpers/getInitialColumnsConfig/index.d.ts +1 -0
  39. package/components/DataGrid/helpers/getInitialColumnsConfig/index.js +1 -0
  40. package/components/DataGrid/helpers/getViewSpecificConfig/getViewSpecificConfig.d.ts +28 -0
  41. package/components/DataGrid/helpers/getViewSpecificConfig/getViewSpecificConfig.js +22 -0
  42. package/components/DataGrid/helpers/getViewSpecificConfig/getViewSpecificConfig.test.d.ts +1 -0
  43. package/components/DataGrid/helpers/getViewSpecificConfig/index.d.ts +1 -0
  44. package/components/DataGrid/helpers/getViewSpecificConfig/index.js +1 -0
  45. package/components/DataGrid/helpers/getViewSuffix/getViewSuffix.d.ts +24 -0
  46. package/components/DataGrid/helpers/getViewSuffix/getViewSuffix.js +9 -0
  47. package/components/DataGrid/helpers/getViewSuffix/getViewSuffix.test.d.ts +1 -0
  48. package/components/DataGrid/helpers/getViewSuffix/index.d.ts +1 -0
  49. package/components/DataGrid/helpers/getViewSuffix/index.js +1 -0
  50. package/components/DataGrid/helpers/index.d.ts +12 -0
  51. package/components/DataGrid/helpers/index.js +1 -0
  52. package/components/DataGrid/helpers/loadViewConfig/index.d.ts +1 -0
  53. package/components/DataGrid/helpers/loadViewConfig/index.js +1 -0
  54. package/components/DataGrid/helpers/loadViewConfig/loadViewConfig.d.ts +23 -0
  55. package/components/DataGrid/helpers/loadViewConfig/loadViewConfig.js +12 -0
  56. package/components/DataGrid/helpers/loadViewConfig/loadViewConfig.test.d.ts +1 -0
  57. package/components/DataGrid/helpers/saveColumnsWidth/index.d.ts +1 -0
  58. package/components/DataGrid/helpers/saveColumnsWidth/index.js +1 -0
  59. package/components/DataGrid/helpers/saveColumnsWidth/saveColumnsWidth.d.ts +52 -0
  60. package/components/DataGrid/helpers/saveColumnsWidth/saveColumnsWidth.js +18 -0
  61. package/components/DataGrid/helpers/saveColumnsWidth/saveColumnsWidth.test.d.ts +1 -0
  62. package/components/DataGrid/helpers/saveViewConfig/index.d.ts +1 -0
  63. package/components/DataGrid/helpers/saveViewConfig/index.js +1 -0
  64. package/components/DataGrid/helpers/saveViewConfig/saveViewConfig.d.ts +35 -0
  65. package/components/DataGrid/helpers/saveViewConfig/saveViewConfig.js +15 -0
  66. package/components/DataGrid/helpers/saveViewConfig/saveViewConfig.test.d.ts +1 -0
  67. package/components/DataGrid/helpers/saveViewMode/index.d.ts +1 -0
  68. package/components/DataGrid/helpers/saveViewMode/index.js +1 -0
  69. package/components/DataGrid/helpers/saveViewMode/saveViewMode.d.ts +33 -0
  70. package/components/DataGrid/helpers/saveViewMode/saveViewMode.js +13 -0
  71. package/components/DataGrid/helpers/saveViewMode/saveViewMode.test.d.ts +1 -0
  72. package/components/DataGrid/hooks/index.d.ts +6 -0
  73. package/components/DataGrid/hooks/index.js +1 -0
  74. package/components/DataGrid/hooks/useChangeColumnsConfig/index.d.ts +1 -0
  75. package/components/DataGrid/hooks/useChangeColumnsConfig/index.js +1 -0
  76. package/components/DataGrid/hooks/useChangeColumnsConfig/useChangeColumnsConfig.d.ts +9 -0
  77. package/components/DataGrid/hooks/useChangeColumnsConfig/useChangeColumnsConfig.js +27 -0
  78. package/components/DataGrid/hooks/useChangeColumnsConfig/useChangeColumnsConfig.test.d.ts +1 -0
  79. package/components/DataGrid/hooks/useChangeColumnsOrder/index.d.ts +1 -0
  80. package/components/DataGrid/hooks/useChangeColumnsOrder/index.js +1 -0
  81. package/components/DataGrid/hooks/useChangeColumnsOrder/useChangeColumnsOrder.d.ts +10 -0
  82. package/components/DataGrid/hooks/useChangeColumnsOrder/useChangeColumnsOrder.js +34 -0
  83. package/components/DataGrid/hooks/useChangeColumnsOrder/useChangeColumnsOrder.test.d.ts +1 -0
  84. package/components/DataGrid/hooks/useColumnsWidth/index.d.ts +1 -0
  85. package/components/DataGrid/hooks/useColumnsWidth/index.js +1 -0
  86. package/components/DataGrid/hooks/useColumnsWidth/useColumnsWidth.d.ts +11 -0
  87. package/components/DataGrid/hooks/useColumnsWidth/useColumnsWidth.js +29 -0
  88. package/components/DataGrid/hooks/useColumnsWidth/useColumnsWidth.test.d.ts +1 -0
  89. package/components/DataGrid/hooks/useRowHeight/index.d.ts +1 -0
  90. package/components/DataGrid/hooks/useRowHeight/index.js +1 -0
  91. package/components/DataGrid/hooks/useRowHeight/useRowHeight.d.ts +28 -0
  92. package/components/DataGrid/hooks/useRowHeight/useRowHeight.js +51 -0
  93. package/components/DataGrid/hooks/useRowHeight/useRowHeight.test.d.ts +1 -0
  94. package/components/DataGrid/hooks/useViewConfig/index.d.ts +1 -0
  95. package/components/DataGrid/hooks/useViewConfig/index.js +1 -0
  96. package/components/DataGrid/hooks/useViewConfig/useViewConfig.d.ts +9 -0
  97. package/components/DataGrid/hooks/useViewConfig/useViewConfig.js +30 -0
  98. package/components/DataGrid/hooks/useViewConfig/useViewConfig.test.d.ts +1 -0
  99. package/components/DataGrid/hooks/useViewMode/index.d.ts +1 -0
  100. package/components/DataGrid/hooks/useViewMode/index.js +1 -0
  101. package/components/DataGrid/hooks/useViewMode/useViewMode.d.ts +44 -0
  102. package/components/DataGrid/hooks/useViewMode/useViewMode.js +48 -0
  103. package/components/DataGrid/hooks/useViewMode/useViewMode.test.d.ts +1 -0
  104. package/components/DataGrid/index.d.ts +5 -4
  105. package/components/DataGrid/subcomponents/Cards/helpers/scrollToCardElement.js +2 -2
  106. package/components/DataGrid/subcomponents/Cards/index.js +16 -3
  107. package/components/DataGrid/subcomponents/Cards/subcomponents/CardRow/index.js +1 -0
  108. package/components/DataGrid/subcomponents/Table/index.js +10 -1
  109. package/components/DataGrid/tests/helpers/types.d.ts +10 -0
  110. package/components/DataGrid/types.helpers.d.ts +55 -0
  111. package/components/DataGrid/types.helpers.js +1 -0
  112. package/components/DataGrid/types.hooks.d.ts +79 -0
  113. package/components/formatters/ImageFormatter/ImageFormatter.d.ts +10 -0
  114. package/components/formatters/ImageFormatter/ImageFormatter.js +72 -0
  115. package/components/formatters/ImageFormatter/ImageFormatter.styles.d.ts +2 -0
  116. package/components/formatters/ImageFormatter/ImageFormatter.styles.js +42 -0
  117. package/components/formatters/ImageFormatter/constants.d.ts +5 -0
  118. package/components/formatters/ImageFormatter/constants.js +10 -0
  119. package/components/formatters/ImageFormatter/index.d.ts +2 -0
  120. package/components/formatters/ImageFormatter/index.js +1 -0
  121. package/components/formatters/ImageFormatter/slots/ImageFormatterEnum.d.ts +5 -0
  122. package/components/formatters/ImageFormatter/slots/ImageFormatterEnum.js +9 -0
  123. package/components/formatters/ImageFormatter/slots/ImageFormatterSlots.d.ts +9 -0
  124. package/components/formatters/ImageFormatter/slots/ImageFormatterSlots.js +23 -0
  125. package/components/formatters/ImageFormatter/tests/ImageFormatter.test.d.ts +1 -0
  126. package/components/formatters/ImageFormatter/types.d.ts +51 -0
  127. package/components/formatters/ImageFormatter/types.js +1 -0
  128. package/components/formatters/index.d.ts +1 -0
  129. package/hooks/useDataGridPersistence/constants.d.ts +1 -0
  130. package/hooks/useDataGridPersistence/constants.js +4 -2
  131. package/hooks/useDataGridPersistence/useDataGridPersistence.js +5 -2
  132. package/index.js +68 -62
  133. package/package.json +1 -1
@@ -241,5 +241,8 @@ declare module '@mui/material/styles' {
241
241
  M4LIconsFormatter?: {
242
242
  styleOverrides?: ComponentsOverrides<Theme>['M4LIconsFormatter'];
243
243
  };
244
+ M4LImageFormatter?: {
245
+ styleOverrides?: ComponentsOverrides<Theme>['M4LImageFormatter'];
246
+ };
244
247
  }
245
248
  }
package/@types/types.d.ts CHANGED
@@ -304,6 +304,10 @@ import {
304
304
  IconsFormatterOwnerState,
305
305
  IconsFormatterSlotsType,
306
306
  } from '../components/formatters/IconsFormatter/types';
307
+ import {
308
+ ImageFormatterOwnerState,
309
+ ImageFormatterSlotsType,
310
+ } from '../components/formatters/ImageFormatter';
307
311
 
308
312
  declare module '@mui/material/styles' {
309
313
  // Define the slots in the theme
@@ -397,6 +401,7 @@ declare module '@mui/material/styles' {
397
401
  M4LMFIsolationApp: MFIsolationAppSlotsType;
398
402
  M4LTagsFormatter: TagsFormatterSlotsType;
399
403
  M4LIconsFormatter: IconsFormatterSlotsType;
404
+ M4LImageFormatter: ImageFormatterSlotsType;
400
405
  }
401
406
  interface ComponentsPropsList {
402
407
  // Extend ComponentsProps or ComponentsOwnerState(this extend ComponentProps)
@@ -489,6 +494,7 @@ declare module '@mui/material/styles' {
489
494
  M4LMFIsolationApp: Partial<MFIsolationAppOwnerState>;
490
495
  M4LTagsFormatter: Partial<TagsFormatterOwnerState>;
491
496
  M4LIconsFormatter: Partial<IconsFormatterOwnerState>;
497
+ M4LImageFormatter: Partial<ImageFormatterOwnerState>;
492
498
  }
493
499
  interface Components {
494
500
  M4LDynamicFilter?: {
@@ -946,5 +952,10 @@ declare module '@mui/material/styles' {
946
952
  styleOverrides?: ComponentsOverrides<Theme>['M4LIconsFormatter'];
947
953
  variants?: ComponentsVariants['M4LIconsFormatter'];
948
954
  };
955
+ M4LImageFormatter?: {
956
+ defaultProps?: ComponentsPropsList['M4LImageFormatter'];
957
+ styleOverrides?: ComponentsOverrides<Theme>['M4LImageFormatter'];
958
+ variants?: ComponentsVariants['M4LImageFormatter'];
959
+ };
949
960
  }
950
961
  }
@@ -270,6 +270,7 @@ const dataGridStyles = {
270
270
  border: theme.vars.size.borderStroke.container,
271
271
  borderColor: theme.vars.palette?.border.secondary,
272
272
  "& .rdg ": {
273
+ scrollBehavior: "smooth",
273
274
  display: "grid",
274
275
  contain: "content",
275
276
  boxSizing: "border-box",
@@ -1,146 +1,21 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { useState, useCallback, useEffect, useMemo, createContext } from "react";
3
- import { c as castMapColumnsWidthToRecord } from "../../helpers/castMapColumnsWidthToRecord.js";
4
- import { useFirstRender, useIsMobile } from "@m4l/graphics";
2
+ import { useState, useEffect, useMemo, createContext } from "react";
3
+ import { useFirstRender } from "@m4l/graphics";
5
4
  import { g as getComponentClasses } from "../../../../utils/getComponentSlotRoot.js";
6
5
  import { a as DATAGRID_ROW_HEIGHTS, b as DATAGRID_ROW_HEADER_HEIGHTS, D as DATAGRID_PREFIX_NAME } from "../../constants.js";
7
6
  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
7
  import { deepEqual } from "fast-equals";
8
+ import { u as useViewMode } from "../../hooks/useViewMode/useViewMode.js";
9
+ import { u as useRowHeight } from "../../hooks/useRowHeight/useRowHeight.js";
10
+ import { u as useColumnsWidth } from "../../hooks/useColumnsWidth/useColumnsWidth.js";
11
+ import { u as useViewConfig } from "../../hooks/useViewConfig/useViewConfig.js";
12
+ import { u as useChangeColumnsConfig } from "../../hooks/useChangeColumnsConfig/useChangeColumnsConfig.js";
13
+ import { u as useChangeColumnsOrder } from "../../hooks/useChangeColumnsOrder/useChangeColumnsOrder.js";
14
+ import { g as getColumnsWidth } from "../../helpers/getColumnsWidth/getColumnsWidth.js";
15
+ import { g as getInitialColumnsConfig } from "../../helpers/getInitialColumnsConfig/getInitialColumnsConfig.js";
16
+ import { g as getAllViewModes } from "../../helpers/getAllViewModes/getAllViewModes.js";
17
+ import { g as getViewSpecificConfig } from "../../helpers/getViewSpecificConfig/getViewSpecificConfig.js";
9
18
  const DataGridContext = createContext(null);
10
- function getColumnsWidth(id, columns, defaultUserColumns) {
11
- const newMap = /* @__PURE__ */ new Map();
12
- let storeColumnsWidth;
13
- try {
14
- const item = window.localStorage.getItem(`${id}_columns_width`);
15
- storeColumnsWidth = item !== null ? new Map(JSON.parse(item)) : /* @__PURE__ */ new Map();
16
- } catch (_e) {
17
- storeColumnsWidth = /* @__PURE__ */ new Map();
18
- }
19
- for (let i = 0; i < columns.length; i++) {
20
- let width;
21
- if (defaultUserColumns) {
22
- try {
23
- width = defaultUserColumns.columnsWidths[columns[i].key];
24
- } catch (_e) {
25
- }
26
- }
27
- if (width === void 0) {
28
- const storeWidth = storeColumnsWidth.get(columns[i].key);
29
- if (typeof storeWidth === "number") {
30
- width = storeWidth;
31
- }
32
- }
33
- if (width !== void 0) {
34
- newMap.set(columns[i].key, width);
35
- }
36
- }
37
- return newMap;
38
- }
39
- function saveColumnsWidth(id, storeColumnsWidth, onChangeUserColumns) {
40
- if (onChangeUserColumns) {
41
- const columnsWidthObject = castMapColumnsWidthToRecord(storeColumnsWidth);
42
- onChangeUserColumns({
43
- reason: "columnsWidths",
44
- userConfig: columnsWidthObject
45
- });
46
- return;
47
- }
48
- localStorage.setItem(
49
- `${id}_columns_width`,
50
- JSON.stringify([...storeColumnsWidth])
51
- );
52
- }
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 ? existingConfig.visible : column.visible === void 0 ? true : column.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
- });
118
- return;
119
- }
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);
134
- }
135
- function getIndexRowHeightVariant(variant) {
136
- if (variant === "compact") {
137
- return 0;
138
- }
139
- if (variant === "standard") {
140
- return 1;
141
- }
142
- return 2;
143
- }
144
19
  function DataGridProvider(props) {
145
20
  const {
146
21
  id,
@@ -166,7 +41,32 @@ function DataGridProvider(props) {
166
41
  cardsViewConfig
167
42
  } = props;
168
43
  const isFirstRender = useFirstRender([columns, id]);
169
- const isMobile = useIsMobile();
44
+ const { viewModeState, handleViewModeChange } = useViewMode({
45
+ id,
46
+ viewMode,
47
+ defaultViewMode,
48
+ onViewModeChange,
49
+ onChangeUserColumns
50
+ });
51
+ const { currentRowHeightVariant, setRowHeightVariant } = useRowHeight({
52
+ rowHeights,
53
+ rowHeaderHeights,
54
+ initialRowHeightVariant
55
+ });
56
+ const { columnsWidths, setColumnsWidths, onChangeColumnWidth } = useColumnsWidth({
57
+ id,
58
+ onChangeUserColumns
59
+ });
60
+ const { getConfigColumns, updateConfigColumns } = useViewConfig();
61
+ const { onChangeColumnsConfig } = useChangeColumnsConfig({
62
+ id,
63
+ onChangeUserColumns,
64
+ updateConfigColumns
65
+ });
66
+ const { onChangeColumnsOrder } = useChangeColumnsOrder({
67
+ getConfigColumns,
68
+ onChangeColumnsConfig
69
+ });
170
70
  const classes = getComponentClasses(DATAGRID_PREFIX_NAME, {
171
71
  ...DataGridSlots,
172
72
  ...ActionsSlots,
@@ -176,80 +76,8 @@ function DataGridProvider(props) {
176
76
  ...ColumnsConfigSlots,
177
77
  ...ControlNavigateSlots
178
78
  });
179
- const [columnsWidths, setColumnsWidths] = useState(/* @__PURE__ */ new Map());
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
- []
198
- );
199
79
  const [rowsFilterCount, setRowFilterCount] = useState(rowsCount);
200
80
  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]);
230
- const [currentRowHeightVariant, setCurrentRowHeightVariant] = useState(() => {
231
- if (typeof rowHeights !== typeof rowHeaderHeights) {
232
- throw new Error("Must be same type rowheights and rowHeaderTypes");
233
- }
234
- if (typeof rowHeights === "number" && typeof rowHeaderHeights === "number") {
235
- return {
236
- rowHVariant: "compact",
237
- rowHeight: rowHeights,
238
- rowHeaderHeight: rowHeaderHeights
239
- };
240
- }
241
- if (typeof rowHeights !== "number" && rowHeights.length !== 3) {
242
- throw new Error("Must be 3 heights");
243
- }
244
- if (typeof rowHeaderHeights !== "number" && rowHeaderHeights.length !== 3) {
245
- throw new Error("Must be 3 HeaderHeights");
246
- }
247
- return {
248
- rowHVariant: initialRowHeightVariant,
249
- rowHeight: typeof rowHeights !== "number" ? rowHeights[getIndexRowHeightVariant(initialRowHeightVariant)] : rowHeights,
250
- rowHeaderHeight: typeof rowHeaderHeights !== "number" ? rowHeaderHeights[getIndexRowHeightVariant(initialRowHeightVariant)] : rowHeaderHeights
251
- };
252
- });
253
81
  useEffect(() => {
254
82
  const keys = new Set(columns.map((c) => c.key));
255
83
  if (sortSettings?.sortsColumns) {
@@ -315,7 +143,6 @@ function DataGridProvider(props) {
315
143
  }
316
144
  }, [columns, sortSettings, filterSettings, cardsViewConfig]);
317
145
  const finalRowHeights = useMemo(() => rowHeights, [rowHeights]);
318
- let timerSaveColumns;
319
146
  useEffect(() => {
320
147
  if (isFirstRender) {
321
148
  setColumnsWidths(getColumnsWidth(id, columns, defaultUserColumns));
@@ -450,65 +277,9 @@ function DataGridProvider(props) {
450
277
  });
451
278
  }
452
279
  }, [columns, id]);
453
- const onChangeColumnsConfig = useCallback(
454
- (viewModeParam, newConfig) => {
455
- saveViewConfig(
456
- id,
457
- getViewSuffix(viewModeParam),
458
- newConfig,
459
- onChangeUserColumns
460
- );
461
- updateConfigColumns(viewModeParam, newConfig);
462
- },
463
- [id, onChangeUserColumns, updateConfigColumns]
464
- );
465
- const onChangeColumnsOrder = useCallback(
466
- (viewModeParam, sourceKey, targetKey) => {
467
- if (sourceKey === targetKey) {
468
- return;
469
- }
470
- const currentConfig = getConfigColumns(viewModeParam);
471
- const sourceColumnIndex = currentConfig.findIndex(
472
- (c) => c.key === sourceKey
473
- );
474
- const targetColumnIndex = currentConfig.findIndex(
475
- (c) => c.key === targetKey
476
- );
477
- const reorderedConfig = [...currentConfig];
478
- reorderedConfig.splice(
479
- targetColumnIndex,
480
- 0,
481
- reorderedConfig.splice(sourceColumnIndex, 1)[0]
482
- );
483
- onChangeColumnsConfig(viewModeParam, reorderedConfig);
484
- },
485
- [getConfigColumns, onChangeColumnsConfig]
486
- );
487
- const onChangeColumnWidth = (columnKey, width) => {
488
- columnsWidths.set(columnKey, Math.round(width));
489
- if (timerSaveColumns) {
490
- clearTimeout(timerSaveColumns);
491
- }
492
- timerSaveColumns = setTimeout(() => {
493
- saveColumnsWidth(id, columnsWidths, onChangeUserColumns);
494
- }, 500);
495
- };
496
280
  const setRowFilterCountInternal = (newRowsCount) => {
497
281
  setRowFilterCount(newRowsCount);
498
282
  };
499
- const setCurrentRowHeightInternal = useCallback(
500
- (newVariant) => {
501
- if (typeof rowHeights === "number" || typeof rowHeaderHeights === "number") {
502
- throw new Error("Only use setCurrentRowHeight with vector rowHeights");
503
- }
504
- setCurrentRowHeightVariant({
505
- rowHVariant: newVariant,
506
- rowHeight: rowHeights[getIndexRowHeightVariant(newVariant)],
507
- rowHeaderHeight: rowHeaderHeights[getIndexRowHeightVariant(newVariant)]
508
- });
509
- },
510
- [setCurrentRowHeightVariant, rowHeights, rowHeaderHeights]
511
- );
512
283
  return /* @__PURE__ */ jsx(
513
284
  DataGridContext.Provider,
514
285
  {
@@ -528,7 +299,7 @@ function DataGridProvider(props) {
528
299
  onChangeColumnWidth,
529
300
  setRowsCount: setRowFilterCountInternal,
530
301
  rowActionsGetter,
531
- setRowHeightVariant: setCurrentRowHeightInternal,
302
+ setRowHeightVariant,
532
303
  onCheckedRowsChange,
533
304
  rowKeyGetter,
534
305
  onChangeUserColumns,
@@ -3,21 +3,12 @@ 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
- };
6
+ import { IGridConfig, BaseViewConfig } from '../../types.helpers';
16
7
  /**
17
8
  * Configuración extendida genérica con propiedades originales
18
9
  * USO INTERNO: El contexto usa esto para el estado interno con propiedades de tracking
19
10
  */
20
- export type IViewConfig<TViewSpecific = {}, TOriginalViewSpecific = {}> = BaseViewConfig<TViewSpecific> & {
11
+ export type IViewConfig<TViewSpecific = object, TOriginalViewSpecific = object> = BaseViewConfig<TViewSpecific> & {
21
12
  hidden: boolean;
22
13
  originalIndex: number;
23
14
  originalVisible: boolean;
@@ -62,15 +53,6 @@ export interface IConfigColumnCards extends Omit<IConfigColumn, 'frozen' | 'orig
62
53
  originalShowTitle: boolean;
63
54
  }
64
55
  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
- */
70
- export interface IGridConfig {
71
- columnsConfig: BaseConfigColumn[];
72
- columnsWidths: Record<RowKey, number>;
73
- }
74
56
  /**
75
57
  * Configuración extendida del Grid para soportar múltiples vistas
76
58
  * USO: Para nuevas implementaciones que soporten cards y futuras vistas
@@ -78,6 +60,7 @@ export interface IGridConfig {
78
60
  */
79
61
  export interface IGridConfigExtended extends IGridConfig {
80
62
  columnsConfigCards?: BaseConfigColumnCards[];
63
+ viewMode?: ViewMode;
81
64
  }
82
65
  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'> {
83
66
  id: number | string;
@@ -0,0 +1,13 @@
1
+ import { ColumnImageFormatterProps } from './types';
2
+ import { RenderCellProps } from 'react-data-grid';
3
+ /**
4
+ * Componente interno que renderiza la celda y puede usar hooks
5
+ */
6
+ export declare function ImageFormatterCell<TRow>(props: {
7
+ formatterProps: RenderCellProps<TRow>;
8
+ fieldValue: ColumnImageFormatterProps<TRow>['fieldValue'];
9
+ fieldText: ColumnImageFormatterProps<TRow>['fieldText'];
10
+ width?: ColumnImageFormatterProps<TRow>['width'];
11
+ height?: ColumnImageFormatterProps<TRow>['height'];
12
+ cover?: ColumnImageFormatterProps<TRow>['cover'];
13
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { useContext } from "react";
3
+ import { getPropertyByString } from "@m4l/core";
4
+ import { I as IMAGE_SIZES } from "./constants.js";
5
+ import { a as DataGridContext } from "../../contexts/DataGridContext/index.js";
6
+ import { I as ImageFormatter } from "../../../formatters/ImageFormatter/ImageFormatter.js";
7
+ function ImageFormatterCell(props) {
8
+ const { formatterProps, fieldValue, fieldText, width, height, cover } = props;
9
+ const context = useContext(DataGridContext);
10
+ const viewMode = context?.viewMode ?? "cards";
11
+ const hasCustomSize = width !== void 0 && height !== void 0;
12
+ const finalWidth = viewMode === "cards" && hasCustomSize ? width : viewMode === "cards" ? IMAGE_SIZES.cards : void 0;
13
+ const finalHeight = viewMode === "cards" && hasCustomSize ? height : viewMode === "cards" ? IMAGE_SIZES.cards : void 0;
14
+ const src = getPropertyByString(formatterProps.row, fieldValue) ?? void 0;
15
+ const text = fieldText ? getPropertyByString(formatterProps.row, fieldText) ?? void 0 : void 0;
16
+ if (!src) {
17
+ return /* @__PURE__ */ jsx(Fragment, { children: "-" });
18
+ }
19
+ return /* @__PURE__ */ jsx(
20
+ ImageFormatter,
21
+ {
22
+ src,
23
+ alt: text || src,
24
+ width: finalWidth,
25
+ height: finalHeight,
26
+ text,
27
+ cover
28
+ }
29
+ );
30
+ }
31
+ export {
32
+ ImageFormatterCell as I
33
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Dimensiones de imagen según densidad en vista tabla
3
+ */
4
+ export declare const IMAGE_SIZES: {
5
+ readonly cards: 60;
6
+ };
@@ -0,0 +1,6 @@
1
+ const IMAGE_SIZES = {
2
+ cards: 60
3
+ };
4
+ export {
5
+ IMAGE_SIZES as I
6
+ };
@@ -0,0 +1,8 @@
1
+ import { RenderCellProps } from 'react-data-grid';
2
+ import { ColumnImageFormatterProps } from './types';
3
+ /**
4
+ * Formatter para mostrar imágenes con o sin texto
5
+ * @param props - Propiedades del formatter
6
+ * @returns Función que recibe RenderCellProps y retorna el ImageFormatter
7
+ */
8
+ export declare function ColumnImageFormatter<TRow>(props: ColumnImageFormatterProps<TRow>): (formatterProps: RenderCellProps<TRow>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { I as ImageFormatterCell } from "./ImageFormatterCell.js";
3
+ function ColumnImageFormatter(props) {
4
+ const { fieldValue, fieldText, cover } = props;
5
+ const width = "width" in props && props.width !== void 0 ? props.width : void 0;
6
+ const height = "height" in props && props.height !== void 0 ? props.height : void 0;
7
+ const formatter = (formatterProps) => {
8
+ return /* @__PURE__ */ jsx(
9
+ ImageFormatterCell,
10
+ {
11
+ formatterProps,
12
+ fieldValue,
13
+ fieldText,
14
+ width,
15
+ height,
16
+ cover
17
+ }
18
+ );
19
+ };
20
+ formatter.__imageFormatterHeight = height ?? 60;
21
+ return formatter;
22
+ }
23
+ export {
24
+ ColumnImageFormatter as C
25
+ };
@@ -0,0 +1,3 @@
1
+ export { useColumnImage } from './useColumnImage';
2
+ export { ColumnImageFormatter } from './formatter';
3
+ export * from './types';
@@ -0,0 +1,44 @@
1
+ import { DeepKeyOf } from '../../../../utils/types';
2
+ interface ColumnImageFormatterBaseProps<TRow> {
3
+ /**
4
+ * Campo del row que contiene la URL de la imagen
5
+ */
6
+ fieldValue: DeepKeyOf<TRow>;
7
+ /**
8
+ * Campo opcional del row que contiene el texto a mostrar junto a la imagen
9
+ */
10
+ fieldText?: DeepKeyOf<TRow>;
11
+ /**
12
+ * Si es true, la imagen usa object-fit: cover (recorta si es necesario)
13
+ * Si es false o undefined, usa object-fit: contain (muestra completa)
14
+ * @default false
15
+ */
16
+ cover?: boolean;
17
+ }
18
+ /**
19
+ * Props sin dimensiones personalizadas (usa IMAGE_SIZES.cards por defecto)
20
+ */
21
+ interface ColumnImageFormatterWithoutSize<TRow> extends ColumnImageFormatterBaseProps<TRow> {
22
+ width?: never;
23
+ height?: never;
24
+ }
25
+ /**
26
+ * Props con dimensiones personalizadas para vista cards
27
+ * IMPORTANTE: width y height deben proporcionarse juntas
28
+ */
29
+ interface ColumnImageFormatterWithSize<TRow> extends ColumnImageFormatterBaseProps<TRow> {
30
+ /**
31
+ * Ancho personalizado para la imagen en vista cards (en píxeles)
32
+ */
33
+ width: number;
34
+ /**
35
+ * Alto personalizado para la imagen en vista cards (en píxeles)
36
+ */
37
+ height: number;
38
+ }
39
+ /**
40
+ * Props para ColumnImageFormatter
41
+ * Puede tener dimensiones personalizadas (width Y height juntas) o ninguna
42
+ */
43
+ export type ColumnImageFormatterProps<TRow> = ColumnImageFormatterWithoutSize<TRow> | ColumnImageFormatterWithSize<TRow>;
44
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ColumnImageFormatterProps } from './types';
2
+ /**
3
+ * Hook que retorna el formatter para columnas con imágenes en DataGrid
4
+ * @param props - Propiedades del formatter
5
+ * @returns Objeto con el formatter
6
+ */
7
+ export declare const useColumnImage: <TRow>(props: ColumnImageFormatterProps<TRow>) => {
8
+ formatter: (formatterProps: import('react-data-grid').RenderCellProps<TRow, unknown>) => import("react/jsx-runtime").JSX.Element;
9
+ };
@@ -0,0 +1,22 @@
1
+ import { useState, useRef, useEffect, useMemo } from "react";
2
+ import { deepEqual } from "fast-equals";
3
+ import { C as ColumnImageFormatter } from "./formatter.js";
4
+ const useColumnImage = (props) => {
5
+ const [stateProps, setStateProps] = useState(props);
6
+ const refProps = useRef({ ...props });
7
+ useEffect(() => {
8
+ if (!deepEqual(refProps.current, props)) {
9
+ refProps.current = props;
10
+ setStateProps(props);
11
+ }
12
+ }, [props]);
13
+ return useMemo(
14
+ () => ({
15
+ formatter: ColumnImageFormatter(stateProps)
16
+ }),
17
+ [stateProps]
18
+ );
19
+ };
20
+ export {
21
+ useColumnImage as u
22
+ };
@@ -11,3 +11,4 @@ export * from './ColumnUncertaintyFormatter';
11
11
  export * from './ColumnChipStatusFormatter';
12
12
  export * from './ColumnTagsFormatter';
13
13
  export * from './ColumnColorFormatter';
14
+ export * from './ColumnImageFormatter';
@@ -0,0 +1,19 @@
1
+ import { ViewMode } from '../../contexts/DataGridContext/types';
2
+ /**
3
+ * Obtiene todos los modos de vista disponibles en el DataGrid.
4
+ *
5
+ * ## Modos disponibles
6
+ *
7
+ * - `table`: Vista de tabla tradicional con filas y columnas
8
+ * - `cards`: Vista de tarjetas para visualización compacta
9
+ *
10
+ * ## Uso
11
+ *
12
+ * Esta función centraliza los modos de vista disponibles,
13
+ * facilitando la extensión futura si se agregan nuevos modos.
14
+ * @returns Array con los modos de vista disponibles
15
+ * @example
16
+ * const modes = getAllViewModes();
17
+ * // ['table', 'cards']
18
+ */
19
+ export declare const getAllViewModes: () => ViewMode[];