@m4l/components 9.4.9 → 9.4.10-JT14012026.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 (177) hide show
  1. package/components/AccountPopover/slots/AccountPopoverSlots.d.ts +3 -3
  2. package/components/ActionsGroup/slots/ActionsGroupSlots.d.ts +1 -1
  3. package/components/CheckableList/slots/styled.d.ts +4 -4
  4. package/components/Chip/slots/ChipSlots.d.ts +1 -1
  5. package/components/EditLabel/slots/EditLabelSlots.d.ts +1 -1
  6. package/components/HelperError/slots/HelperErrorSlots.d.ts +1 -1
  7. package/components/ImageText/slots/ImageTextSlots.d.ts +2 -2
  8. package/components/Label/slots/LabelSlots.d.ts +2 -2
  9. package/components/LoadingError/slots/LoadingErrorSlots.d.ts +1 -1
  10. package/components/MFIsolationApp/slots/MFIsolationAppSlots.d.ts +2 -2
  11. package/components/NumberInput/hooks/useNumberInput/useNumberInput.js +0 -2
  12. package/components/ObjectLogs/slots/ObjectLogsSlots.d.ts +1 -1
  13. package/components/Pager/slots/PagerSlots.d.ts +3 -3
  14. package/components/PaperForm/slots/PaperFormSlots.d.ts +1 -1
  15. package/components/SettingsLayout/slots/SettingsLayoutSlots.d.ts +1 -1
  16. package/components/SideBar/subcomponents/ContentComponent/style.js +15 -2
  17. package/components/Stepper/slots/StepperSlot.d.ts +4 -4
  18. package/components/TabsNavigator/slots/TabsNavigatorSlots.d.ts +2 -2
  19. package/components/ToastContainer/slots/toastContainerSlots.d.ts +2 -2
  20. package/components/WindowBase/slots/WindowBaseSlots.d.ts +2 -2
  21. package/components/areas/components/AreasAdmin/slots/AreasAdminSlots.d.ts +1 -1
  22. package/components/datagrids/Datagrid.styles.js +24 -0
  23. package/components/datagrids/components/BaseDataGrid/BaseDataGrid.d.ts +12 -0
  24. package/components/datagrids/components/BaseDataGrid/BaseDataGrid.js +131 -0
  25. package/components/datagrids/components/BaseDataGrid/index.d.ts +1 -0
  26. package/components/datagrids/components/BaseDataGrid/index.js +1 -0
  27. package/components/datagrids/components/DataGridMain/DataGridMain.js +22 -134
  28. package/components/datagrids/components/TreeDataGrid/TreeDataGrid.d.ts +22 -0
  29. package/components/datagrids/components/TreeDataGrid/TreeDataGrid.js +50 -0
  30. package/components/datagrids/components/TreeDataGrid/TreeDataGrid.test.d.ts +1 -0
  31. package/components/datagrids/components/TreeDataGrid/index.d.ts +1 -0
  32. package/components/datagrids/components/TreeDataGrid/index.js +1 -0
  33. package/components/datagrids/constants.js +3 -5
  34. package/components/datagrids/contexts/DataGridContext/DataGridContext.js +8 -4
  35. package/components/datagrids/contexts/DataGridContext/types.d.ts +19 -3
  36. package/components/datagrids/dictionary.d.ts +3 -0
  37. package/components/datagrids/dictionary.js +4 -0
  38. package/components/datagrids/formatters/ColumnBooleanFormatter/ColumnBooleanGroupFormatter.d.ts +15 -0
  39. package/components/datagrids/formatters/ColumnBooleanFormatter/ColumnBooleanGroupFormatter.js +32 -0
  40. package/components/datagrids/formatters/ColumnBooleanFormatter/index.d.ts +1 -0
  41. package/components/datagrids/formatters/ColumnBooleanFormatter/useColumnBoolean.d.ts +1 -0
  42. package/components/datagrids/formatters/ColumnBooleanFormatter/useColumnBoolean.js +2 -0
  43. package/components/datagrids/formatters/ColumnChipStatusFormatter/ColumnChipStatusGroupFormatter.d.ts +16 -0
  44. package/components/datagrids/formatters/ColumnChipStatusFormatter/ColumnChipStatusGroupFormatter.js +37 -0
  45. package/components/datagrids/formatters/ColumnChipStatusFormatter/index.d.ts +1 -0
  46. package/components/datagrids/formatters/ColumnChipStatusFormatter/useColumnChipStatus.d.ts +1 -0
  47. package/components/datagrids/formatters/ColumnChipStatusFormatter/useColumnChipStatus.js +2 -0
  48. package/components/datagrids/formatters/ColumnColorFormatter/ColumnColorGroupFormatter.d.ts +14 -0
  49. package/components/datagrids/formatters/ColumnColorFormatter/ColumnColorGroupFormatter.js +24 -0
  50. package/components/datagrids/formatters/ColumnColorFormatter/index.d.ts +1 -0
  51. package/components/datagrids/formatters/ColumnColorFormatter/useColumnColor.d.ts +1 -0
  52. package/components/datagrids/formatters/ColumnColorFormatter/useColumnColor.js +3 -1
  53. package/components/datagrids/formatters/ColumnConcatenatedValuesFormatter/ColumnConcatenatedValuesGroupFormatter.d.ts +15 -0
  54. package/components/datagrids/formatters/ColumnConcatenatedValuesFormatter/ColumnConcatenatedValuesGroupFormatter.js +35 -0
  55. package/components/datagrids/formatters/ColumnConcatenatedValuesFormatter/index.d.ts +1 -0
  56. package/components/datagrids/formatters/ColumnConcatenatedValuesFormatter/useColumnConcatenatedValues.d.ts +1 -0
  57. package/components/datagrids/formatters/ColumnConcatenatedValuesFormatter/useColumnConcatenatedValues.js +2 -0
  58. package/components/datagrids/formatters/ColumnDateFormatter/ColumnDateGroupFormatter.d.ts +9 -0
  59. package/components/datagrids/formatters/ColumnDateFormatter/ColumnDateGroupFormatter.js +35 -0
  60. package/components/datagrids/formatters/ColumnDateFormatter/index.d.ts +1 -0
  61. package/components/datagrids/formatters/ColumnDateFormatter/useColumnDate.d.ts +1 -0
  62. package/components/datagrids/formatters/ColumnDateFormatter/useColumnDate.js +2 -0
  63. package/components/datagrids/formatters/ColumnIconFormatter/ColumnIconGroupFormatter.d.ts +13 -0
  64. package/components/datagrids/formatters/ColumnIconFormatter/ColumnIconGroupFormatter.js +17 -0
  65. package/components/datagrids/formatters/ColumnIconFormatter/index.d.ts +1 -0
  66. package/components/datagrids/formatters/ColumnIconFormatter/useColumnIcon.d.ts +1 -0
  67. package/components/datagrids/formatters/ColumnIconFormatter/useColumnIcon.js +3 -1
  68. package/components/datagrids/formatters/ColumnImageFormatter/ColumnImageGroupFormatter.d.ts +15 -0
  69. package/components/datagrids/formatters/ColumnImageFormatter/ColumnImageGroupFormatter.js +33 -0
  70. package/components/datagrids/formatters/ColumnImageFormatter/index.d.ts +1 -0
  71. package/components/datagrids/formatters/ColumnImageFormatter/useColumnImage.d.ts +1 -0
  72. package/components/datagrids/formatters/ColumnImageFormatter/useColumnImage.js +3 -1
  73. package/components/datagrids/formatters/ColumnInteractiveCheckFormatter/formatter.d.ts +12 -1
  74. package/components/datagrids/formatters/ColumnInteractiveCheckFormatter/formatter.js +6 -0
  75. package/components/datagrids/formatters/ColumnNestedValueFormatter/ColumnNestedValueGroupFormatter.d.ts +14 -0
  76. package/components/datagrids/formatters/ColumnNestedValueFormatter/ColumnNestedValueGroupFormatter.js +22 -0
  77. package/components/datagrids/formatters/ColumnNestedValueFormatter/index.d.ts +1 -0
  78. package/components/datagrids/formatters/ColumnNestedValueFormatter/useColumnNestedValue.d.ts +1 -0
  79. package/components/datagrids/formatters/ColumnNestedValueFormatter/useColumnNestedValue.js +2 -0
  80. package/components/datagrids/formatters/ColumnPointsFormatter/ColumnPointsGroupFormatter.d.ts +15 -0
  81. package/components/datagrids/formatters/ColumnPointsFormatter/ColumnPointsGroupFormatter.js +28 -0
  82. package/components/datagrids/formatters/ColumnPointsFormatter/index.d.ts +1 -0
  83. package/components/datagrids/formatters/ColumnPointsFormatter/useColumnPoints.d.ts +1 -0
  84. package/components/datagrids/formatters/ColumnPointsFormatter/useColumnPoints.js +2 -0
  85. package/components/datagrids/formatters/ColumnPriceFormatter/ColumnPriceGroupFormatter.d.ts +14 -0
  86. package/components/datagrids/formatters/ColumnPriceFormatter/ColumnPriceGroupFormatter.js +26 -0
  87. package/components/datagrids/formatters/ColumnPriceFormatter/index.d.ts +1 -0
  88. package/components/datagrids/formatters/ColumnPriceFormatter/useColumnPrice.d.ts +1 -0
  89. package/components/datagrids/formatters/ColumnPriceFormatter/useColumnPrice.js +2 -0
  90. package/components/datagrids/formatters/ColumnTagsFormatter/ColumnTagsGroupFormatter.d.ts +13 -0
  91. package/components/datagrids/formatters/ColumnTagsFormatter/ColumnTagsGroupFormatter.js +21 -0
  92. package/components/datagrids/formatters/ColumnTagsFormatter/index.d.ts +1 -0
  93. package/components/datagrids/formatters/ColumnTagsFormatter/useColumnTags.d.ts +1 -0
  94. package/components/datagrids/formatters/ColumnTagsFormatter/useColumnTags.js +2 -0
  95. package/components/datagrids/formatters/ColumnUncertaintyFormatter/ColumnUncertaintyGroupFormatter.d.ts +15 -0
  96. package/components/datagrids/formatters/ColumnUncertaintyFormatter/ColumnUncertaintyGroupFormatter.js +27 -0
  97. package/components/datagrids/formatters/ColumnUncertaintyFormatter/index.d.ts +1 -0
  98. package/components/datagrids/formatters/ColumnUncertaintyFormatter/useColumnUncertainty.d.ts +1 -0
  99. package/components/datagrids/formatters/ColumnUncertaintyFormatter/useColumnUncertainty.js +2 -0
  100. package/components/datagrids/helpers/shared/getInitialColumnsConfig/getInitialColumnsConfig.js +8 -0
  101. package/components/datagrids/helpers/shared/getViewSpecificConfig/getViewSpecificConfig.js +10 -3
  102. package/components/datagrids/hooks/useChangeColumnsOrder/useChangeColumnsOrder.d.ts +1 -0
  103. package/components/datagrids/hooks/useChangeColumnsOrder/useChangeColumnsOrder.js +12 -4
  104. package/components/datagrids/icons.d.ts +5 -0
  105. package/components/datagrids/icons.js +5 -1
  106. package/components/datagrids/index.d.ts +2 -1
  107. package/components/datagrids/slots/DataGridEnum.d.ts +3 -1
  108. package/components/datagrids/slots/DataGridEnum.js +2 -0
  109. package/components/datagrids/slots/DataGridSlot.d.ts +2 -0
  110. package/components/datagrids/slots/DataGridSlot.js +12 -2
  111. package/components/datagrids/types.d.ts +52 -0
  112. package/components/datagrids/views/CardsView/hooks/useProcessedColumns/useProcessedColumns.d.ts +2 -0
  113. package/components/datagrids/views/CardsView/hooks/useProcessedColumns/useProcessedColumns.js +3 -2
  114. package/components/datagrids/views/TableView/TableView.d.ts +4 -4
  115. package/components/datagrids/views/TableView/TableView.js +41 -3
  116. package/components/datagrids/views/TableView/helpers/defaultRowGrouper/defaultRowGrouper.d.ts +28 -0
  117. package/components/datagrids/views/TableView/helpers/defaultRowGrouper/defaultRowGrouper.js +15 -0
  118. package/components/datagrids/views/TableView/helpers/defaultRowGrouper/defaultRowGrouper.test.d.ts +1 -0
  119. package/components/datagrids/views/TableView/helpers/defaultRowGrouper/index.d.ts +1 -0
  120. package/components/datagrids/views/TableView/helpers/defaultRowGrouper/index.js +1 -0
  121. package/components/datagrids/views/TableView/helpers/getGroupBy/getGroupBy.d.ts +20 -0
  122. package/components/datagrids/views/TableView/helpers/getGroupBy/getGroupBy.js +13 -0
  123. package/components/datagrids/views/TableView/helpers/getGroupBy/getGroupBy.test.d.ts +1 -0
  124. package/components/datagrids/views/TableView/helpers/getGroupBy/index.d.ts +1 -0
  125. package/components/datagrids/views/TableView/helpers/getGroupBy/index.js +1 -0
  126. package/components/datagrids/views/TableView/helpers/index.d.ts +2 -0
  127. package/components/datagrids/views/TableView/hooks/useHeaderMenuActions/useHeaderMenuActions.js +62 -1
  128. package/components/datagrids/views/TableView/hooks/useSortColumnsRows/useSortColumnsRows.js +39 -13
  129. package/components/datagrids/views/TableView/subcomponents/ActionsColumn/ActionsColumn.js +1 -1
  130. package/components/datagrids/views/TableView/subcomponents/HeaderRenderClick/HeaderRenderClick.js +1 -1
  131. package/components/datagrids/views/TableView/subcomponents/RadioSelectColumn/RadioSelectColumn.js +2 -2
  132. package/components/datagrids/views/TableView/subcomponents/RenderGroupCell/RenderGroupCell.d.ts +10 -0
  133. package/components/datagrids/views/TableView/subcomponents/RenderGroupCell/RenderGroupCell.js +35 -0
  134. package/components/datagrids/views/TableView/subcomponents/RenderGroupCell/RenderGroupCell.test.d.ts +1 -0
  135. package/components/datagrids/views/TableView/subcomponents/RenderGroupCell/index.d.ts +2 -0
  136. package/components/datagrids/views/TableView/subcomponents/RenderGroupCell/index.js +1 -0
  137. package/components/datagrids/views/TableView/subcomponents/RenderGroupCell/types.d.ts +12 -0
  138. package/components/datagrids/views/TableView/subcomponents/SelectColumn/SelectColumn.js +46 -14
  139. package/components/datagrids/views/TableView/subcomponents/Settings/hooks/useModalSettings/useModalSettings.js +13 -2
  140. package/components/datagrids/views/TableView/subcomponents/Settings/subcomponents/ColumnsConfig/ColumnsConfig.js +47 -13
  141. package/components/datagrids/views/TableView/subcomponents/Settings/subcomponents/ColumnsConfig/types.d.ts +22 -0
  142. package/components/datagrids/views/adapters/CheckboxCellAdapter/CheckboxCellAdapter.js +1 -1
  143. package/components/extended/React-resizable-panels/slots/SplitLayoutSlots.d.ts +2 -2
  144. package/components/formatters/BooleanFormatter/slots/BooleanFormatterSlots.d.ts +1 -1
  145. package/components/formatters/ConcatenatedFormatter/slots/ConcatenatedFormatterSlots.d.ts +1 -1
  146. package/components/formatters/DateFormatter/slots/DateFormatterSlots.d.ts +1 -1
  147. package/components/formatters/DistanceToNowFormatter/slots/DistanceToNowFormatterSlots.d.ts +1 -1
  148. package/components/formatters/ImageFormatter/slots/ImageFormatterSlots.d.ts +1 -1
  149. package/components/formatters/PeriodFormatter/slots/PeriodFormatterSlots.d.ts +1 -1
  150. package/components/formatters/PointsFormatter/slots/ointsFormatterSlots.d.ts +1 -1
  151. package/components/formatters/PriceFormatter/slots/PriceFormatterSlots.d.ts +1 -1
  152. package/components/formatters/UncertaintyFormatter/slots/UncertaintyFormatterSlots.d.ts +1 -1
  153. package/components/hook-form/RHFAutocompleteAsync/reducer/RHFAutocompleteReducer.js +0 -5
  154. package/components/hook-form/RHFUpload/RHFUploadImage/slots/RHFUploadImageSlots.d.ts +1 -1
  155. package/components/hook-form/RHFUpload/RHFUploadSingleFile/slots/RHFUploadSingleFileSlots.d.ts +5 -5
  156. package/components/mui_extended/Accordion/slots/AccordionSlots.d.ts +1 -1
  157. package/components/mui_extended/Autocomplete/slots/AutocompleteSlots.d.ts +2 -2
  158. package/components/mui_extended/Button/slots/ButtonSlots.d.ts +1 -1
  159. package/components/mui_extended/CheckBox/slots/CheckBoxSlots.d.ts +1 -1
  160. package/components/mui_extended/MenuItem/MenuItem.js +13 -15
  161. package/components/mui_extended/MenuItem/MenuItem.styles.js +33 -46
  162. package/components/mui_extended/MenuItem/constants.d.ts +1 -1
  163. package/components/mui_extended/MenuItem/slots/MenuItemEnum.d.ts +0 -1
  164. package/components/mui_extended/MenuItem/slots/MenuItemEnum.js +0 -1
  165. package/components/mui_extended/MenuItem/slots/MenuItemSlots.d.ts +2 -5
  166. package/components/mui_extended/MenuItem/slots/MenuItemSlots.js +1 -6
  167. package/components/mui_extended/NavLink/slots/NavLinkSlots.d.ts +1 -1
  168. package/components/mui_extended/Radio/slots/styled.d.ts +1 -1
  169. package/components/mui_extended/Select/Select.js +1 -1
  170. package/components/mui_extended/Select/slots/SelectSlots.d.ts +3 -3
  171. package/components/mui_extended/Tab/Slots/TabSlots.d.ts +1 -1
  172. package/components/mui_extended/TextField/slots/TextFieldSlots.d.ts +3 -3
  173. package/components/mui_extended/Typography/slots/typographySlots.d.ts +1 -1
  174. package/hooks/useDynamicFilterAndSort/slots/DynamicFilterAndSortSlots.d.ts +3 -3
  175. package/index.js +108 -82
  176. package/not_recognized/index.js +25 -100
  177. package/package.json +1 -1
@@ -1,10 +1,12 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, useState, useRef, useEffect } from "react";
3
- import DataGrid from "react-data-grid";
3
+ import DataGrid, { TreeDataGrid } from "react-data-grid";
4
4
  import { DndProvider } from "react-dnd";
5
5
  import { HTML5Backend } from "react-dnd-html5-backend";
6
6
  import { B as TableContainerStyled, y as TableWrapperDataGridStyled } from "../../slots/DataGridSlot.js";
7
7
  import { u as useSortColumnsRows } from "./hooks/useSortColumnsRows/useSortColumnsRows.js";
8
+ import { g as getGroupBy } from "./helpers/getGroupBy/getGroupBy.js";
9
+ import { d as defaultRowGrouper } from "./helpers/defaultRowGrouper/defaultRowGrouper.js";
8
10
  import { u as useHeaderMenuActions } from "./hooks/useHeaderMenuActions/useHeaderMenuActions.js";
9
11
  import { f as filterHeight } from "./subcomponents/SelectColumn/SelectColumn.js";
10
12
  import { H as HeaderRenderClick } from "./subcomponents/HeaderRenderClick/HeaderRenderClick.js";
@@ -21,6 +23,7 @@ function TableView(props) {
21
23
  onSelectedRowsChange,
22
24
  defaultColumnOptions: defaultColumnOptionsProp,
23
25
  focusOnRowKey,
26
+ treeProps,
24
27
  ...restProps
25
28
  } = props;
26
29
  const renderCheckbox = (formatterProps) => {
@@ -61,8 +64,16 @@ function TableView(props) {
61
64
  currentRowHeightVariant,
62
65
  size,
63
66
  sortColumns,
64
- setSortColumns
67
+ setSortColumns,
68
+ columnsConfig
65
69
  } = useDataGrid();
70
+ const groupBy = useMemo(() => {
71
+ if (!treeProps) {
72
+ return [];
73
+ }
74
+ return getGroupBy(columnsConfig);
75
+ }, [columnsConfig, treeProps]);
76
+ const rowGrouper = treeProps?.rowGrouper ?? defaultRowGrouper;
66
77
  const ref_data_grid = useRef(null);
67
78
  const [popoverState, setPopoverState] = useState({
68
79
  anchorEl: null,
@@ -150,7 +161,34 @@ function TableView(props) {
150
161
  {
151
162
  ownerState: { size, currentRowHeightVariant, currentRowHeight },
152
163
  children: [
153
- /* @__PURE__ */ jsx(DndProvider, { backend: HTML5Backend, context: window, children: /* @__PURE__ */ jsx(
164
+ /* @__PURE__ */ jsx(DndProvider, { backend: HTML5Backend, context: window, children: treeProps ? /* @__PURE__ */ jsx(
165
+ TreeDataGrid,
166
+ {
167
+ className: "rdg-light",
168
+ ref: ref_data_grid,
169
+ headerRowHeight: activeFilters ? currentRowHeaderHeight + filterHeight : currentRowHeaderHeight,
170
+ columns: finalColumns,
171
+ sortColumns,
172
+ onSortColumnsChange: handleSortColumnsChange,
173
+ onColumnResize,
174
+ rows: finalRows,
175
+ onRowsChange,
176
+ selectedRows,
177
+ onSelectedRowsChange,
178
+ onCellClick,
179
+ rowHeight: currentRowHeight,
180
+ rowKeyGetter,
181
+ renderers: {
182
+ renderCheckbox
183
+ },
184
+ defaultColumnOptions,
185
+ groupBy,
186
+ rowGrouper,
187
+ expandedGroupIds: treeProps.expandedGroupIds,
188
+ onExpandedGroupIdsChange: treeProps.onExpandedGroupIdsChange,
189
+ ...restProps
190
+ }
191
+ ) : /* @__PURE__ */ jsx(
154
192
  DataGrid,
155
193
  {
156
194
  className: "rdg-light",
@@ -0,0 +1,28 @@
1
+ /**
2
+ * RowGrouper genérico por defecto.
3
+ *
4
+ * Se usa cuando NO pasas un rowGrouper personalizado al TreeDataGrid.
5
+ * Agrupa las filas usando el valor directo de la columna.
6
+ *
7
+ * Ideal para agrupar por campos de texto como:
8
+ * - Departamento
9
+ * - Estado
10
+ * - Ubicación
11
+ * @param rows - Todas las filas de la tabla
12
+ * @param columnKey - El nombre de la columna por la que agrupar (ej: 'department')
13
+ * @returns Un objeto donde cada llave es un valor único y cada valor es un array de filas
14
+ * @example
15
+ * const rows = [
16
+ * { id: 1, name: 'Juan', department: 'Ventas' },
17
+ * { id: 2, name: 'María', department: 'Tecnología' },
18
+ * { id: 3, name: 'Pedro', department: 'Ventas' },
19
+ * ];
20
+ *
21
+ * const groups = defaultRowGrouper(rows, 'department');
22
+ * // Resultado:
23
+ * // {
24
+ * // 'Ventas': [Juan, Pedro],
25
+ * // 'Tecnología': [María]
26
+ * // }
27
+ */
28
+ export declare const defaultRowGrouper: <TRow>(rows: readonly TRow[], columnKey: string) => Record<string, readonly TRow[]>;
@@ -0,0 +1,15 @@
1
+ const defaultRowGrouper = (rows, columnKey) => {
2
+ const groups = {};
3
+ for (const row of rows) {
4
+ const rawValue = row[columnKey];
5
+ const groupKey = String(rawValue ?? "");
6
+ if (!groups[groupKey]) {
7
+ groups[groupKey] = [];
8
+ }
9
+ groups[groupKey].push(row);
10
+ }
11
+ return groups;
12
+ };
13
+ export {
14
+ defaultRowGrouper as d
15
+ };
@@ -0,0 +1 @@
1
+ export { defaultRowGrouper } from './defaultRowGrouper';
@@ -0,0 +1,20 @@
1
+ import { IConfigColumn } from '../../../../contexts/DataGridContext/types';
2
+ /**
3
+ * Calcula el array de keys de columnas que deben agruparse.
4
+ *
5
+ * Esta función:
6
+ * 1. Filtra las columnas que tienen grouped: true
7
+ * 2. Las ordena por groupOrder (menor = primer nivel de agrupación)
8
+ * 3. Retorna un array con las keys de esas columnas
9
+ * @param columnsConfig - Array de configuración de columnas del DataGrid
10
+ * @returns Array de keys de columnas ordenadas por nivel de agrupación
11
+ * @example
12
+ * // Si columnsConfig tiene:
13
+ * // - department: { grouped: true, groupOrder: 0 }
14
+ * // - team: { grouped: true, groupOrder: 1 }
15
+ * // - name: { grouped: false }
16
+ *
17
+ * const groupBy = getGroupBy(columnsConfig);
18
+ * // Resultado: ['department', 'team']
19
+ */
20
+ export declare const getGroupBy: (columnsConfig: IConfigColumn[]) => string[];
@@ -0,0 +1,13 @@
1
+ const getGroupBy = (columnsConfig) => {
2
+ const groupedColumns = columnsConfig.filter(
3
+ (column) => column.grouped === true
4
+ );
5
+ const sortedColumns = groupedColumns.sort(
6
+ (columnA, columnB) => (columnA.groupOrder ?? 0) - (columnB.groupOrder ?? 0)
7
+ );
8
+ const groupByKeys = sortedColumns.map((column) => column.key);
9
+ return groupByKeys;
10
+ };
11
+ export {
12
+ getGroupBy as g
13
+ };
@@ -0,0 +1 @@
1
+ export { getGroupBy } from './getGroupBy';
@@ -1 +1,3 @@
1
1
  export { getDragHeaderRenderer } from './getDragHeaderRenderer';
2
+ export { getGroupBy } from './getGroupBy';
3
+ export { defaultRowGrouper } from './defaultRowGrouper';
@@ -123,6 +123,24 @@ function useHeaderMenuActions(columnKey, finalColumns, defaultSortable, handleSo
123
123
  columnKey
124
124
  });
125
125
  }, [columnKey, column, externalFilterSettings]);
126
+ const canGroup = useMemo(() => {
127
+ if (!columnKey || !column) {
128
+ return false;
129
+ }
130
+ return column.groupable === true;
131
+ }, [columnKey, column]);
132
+ const isGrouped = useMemo(() => {
133
+ if (!columnKey) {
134
+ return false;
135
+ }
136
+ const colConfig = columnsConfig.find((c) => c.key === columnKey);
137
+ return colConfig?.grouped === true;
138
+ }, [columnKey, columnsConfig]);
139
+ const hasGroupableColumns = useMemo(() => {
140
+ return finalColumns.some(
141
+ (col) => col.groupable === true || col.grouped === true
142
+ );
143
+ }, [finalColumns]);
126
144
  const isAddFilterDisabled = useMemo(() => {
127
145
  if (!columnKey || !column) {
128
146
  return true;
@@ -229,6 +247,44 @@ function useHeaderMenuActions(columnKey, finalColumns, defaultSortable, handleSo
229
247
  disabled: isAddFilterDisabled
230
248
  }
231
249
  ] : [];
250
+ const toggleGrouped = (grouped) => {
251
+ if (!columnKey) {
252
+ return;
253
+ }
254
+ const currentGroupedColumns = columnsConfig.filter((c) => c.grouped);
255
+ const newGroupOrder = grouped ? currentGroupedColumns.length : 0;
256
+ const next = columnsConfig.map(
257
+ (c) => c.key === columnKey ? {
258
+ ...c,
259
+ grouped,
260
+ groupOrder: grouped ? newGroupOrder : c.groupOrder
261
+ } : c
262
+ );
263
+ onChangeColumnsConfig("table", next);
264
+ };
265
+ const groupActions = hasGroupableColumns ? [
266
+ {
267
+ type: "menuItem",
268
+ startIcon: `${host_static_assets}/${environment_assets}/${pathIcons.group}`,
269
+ label: getLabel(DICTIONARY.GROUP_BY_COLUMN),
270
+ dataTestId: "group-add",
271
+ onClick: () => {
272
+ toggleGrouped(true);
273
+ },
274
+ disabled: !canGroup || isGrouped
275
+ },
276
+ {
277
+ type: "menuItem",
278
+ startIcon: `${host_static_assets}/${environment_assets}/${pathIcons.removeGroup}`,
279
+ label: getLabel(DICTIONARY.REMOVE_GROUP_COLUMN),
280
+ dataTestId: "group-remove",
281
+ onClick: () => {
282
+ toggleGrouped(false);
283
+ },
284
+ // Solo deshabilitado si no está agrupada O si es una agrupación estática (groupable=false)
285
+ disabled: !isGrouped || !canGroup
286
+ }
287
+ ] : [];
232
288
  const baseActions = [
233
289
  {
234
290
  type: "menuItem",
@@ -246,9 +302,10 @@ function useHeaderMenuActions(columnKey, finalColumns, defaultSortable, handleSo
246
302
  dataTestId: "hide-column"
247
303
  }
248
304
  ];
249
- return [...sortActions, ...filterAction, ...baseActions];
305
+ return [...sortActions, ...filterAction, ...groupActions, ...baseActions];
250
306
  }, [
251
307
  columnKey,
308
+ column,
252
309
  canSort,
253
310
  canSortExternally,
254
311
  hasExternalSortAsc,
@@ -258,8 +315,12 @@ function useHeaderMenuActions(columnKey, finalColumns, defaultSortable, handleSo
258
315
  toggleFrozen,
259
316
  toggleVisible,
260
317
  columnsConfig,
318
+ onChangeColumnsConfig,
261
319
  externalSortSettings,
262
320
  externalFilterSettings,
321
+ hasGroupableColumns,
322
+ canGroup,
323
+ isGrouped,
263
324
  host_static_assets,
264
325
  environment_assets,
265
326
  getLabel,
@@ -1,9 +1,11 @@
1
+ import { jsx } from "react/jsx-runtime";
1
2
  import { useState, useEffect, useMemo } from "react";
2
3
  import { useModuleSkeleton, getPropertyByString } from "@m4l/core";
3
- import { d as DATAGRID_SELECT_COLUMN_KEY } from "../../../../constants.js";
4
+ import { SELECT_COLUMN_KEY } from "react-data-grid";
4
5
  import { g as getDragHeaderRenderer } from "../../helpers/getDragHeaderRenderer/getDragHeaderRenderer.js";
5
6
  import { S as SkeletonFormatter } from "../../subcomponents/SkeletonFormatter/SkeletonFormatter.js";
6
7
  import { a as filterColumnClassName, S as SelectColumn } from "../../subcomponents/SelectColumn/SelectColumn.js";
8
+ import { R as RenderGroupCell } from "../../subcomponents/RenderGroupCell/RenderGroupCell.js";
7
9
  import { A as ActionsColumn } from "../../subcomponents/ActionsColumn/ActionsColumn.js";
8
10
  import { R as RadioSelectColumn } from "../../subcomponents/RadioSelectColumn/RadioSelectColumn.js";
9
11
  import { u as useDataGrid } from "../../../../hooks/shared/useDataGrid/useDataGrid.js";
@@ -18,7 +20,6 @@ function getComparator(columns, sortColumn) {
18
20
  return column.customSort;
19
21
  }
20
22
  switch (typeOrder) {
21
- //Si el tipo de dato de la columna es un numerico, retorna una función de ordenamiento numérica
22
23
  case "number":
23
24
  return (a, b) => {
24
25
  try {
@@ -27,7 +28,6 @@ function getComparator(columns, sortColumn) {
27
28
  return -1;
28
29
  }
29
30
  };
30
- //Por defecto retorna una función de ordenamiento de string
31
31
  default:
32
32
  return (a, b) => {
33
33
  try {
@@ -39,6 +39,12 @@ function getComparator(columns, sortColumn) {
39
39
  }
40
40
  }
41
41
  const getColumIndex = (key, columnsConfig) => columnsConfig.findIndex((columnConfig) => columnConfig.key === key);
42
+ const findKeyInColumns = (key, columns) => {
43
+ const index = columns.findIndex(
44
+ (column) => key === column.key && column.hidden === false
45
+ );
46
+ return index !== -1;
47
+ };
42
48
  const getInOrderColumns = (columns, hasCheckedRows, checkedRowsMultiple, columnsConfig, columnsWidths, rowActionsGetter) => {
43
49
  let filteredSortedColumns = columns.filter((column) => {
44
50
  const columnConfigIndex = getColumIndex(column.key, columnsConfig);
@@ -100,12 +106,6 @@ const useSortColumnsRows = (sourceColumns, sourceRows, popoverHandlers) => {
100
106
  );
101
107
  const isSkeleton = useModuleSkeleton();
102
108
  const { activeFilters, filters } = useFilters();
103
- const findKeyInColumns = (key, cols) => {
104
- const index = cols.findIndex(
105
- (column) => key === column.key && column.hidden === false
106
- );
107
- return index !== -1;
108
- };
109
109
  useEffect(() => {
110
110
  setColumns(
111
111
  getInOrderColumns(
@@ -124,7 +124,17 @@ const useSortColumnsRows = (sourceColumns, sourceRows, popoverHandlers) => {
124
124
  if (JSON.stringify(finalSortedColumns) !== JSON.stringify(sortColumns)) {
125
125
  setSortColumns(finalSortedColumns);
126
126
  }
127
- }, [sourceColumns, columnsConfig, rowActionsGetter]);
127
+ }, [
128
+ sourceColumns,
129
+ columnsConfig,
130
+ rowActionsGetter,
131
+ checkedRows,
132
+ onCheckedRowsChange,
133
+ checkedRowsMultiple,
134
+ columnsWidths,
135
+ sortColumns,
136
+ setSortColumns
137
+ ]);
128
138
  const finalColumns = useMemo(() => {
129
139
  const DragAndDropHeaderRenderer = getDragHeaderRenderer(
130
140
  (sourceKey, targetKey) => onChangeColumnsOrder("table", sourceKey, targetKey),
@@ -139,7 +149,7 @@ const useSortColumnsRows = (sourceColumns, sourceRows, popoverHandlers) => {
139
149
  cellClass,
140
150
  headerCellClass: cellClass
141
151
  };
142
- if (newColumn.key === DATAGRID_SELECT_COLUMN_KEY || newColumn.isDraggable !== void 0 && newColumn.isDraggable === false) {
152
+ if (newColumn.key === SELECT_COLUMN_KEY || newColumn.isDraggable !== void 0 && newColumn.isDraggable === false) {
143
153
  return newColumn;
144
154
  }
145
155
  if (isSkeleton) {
@@ -161,6 +171,20 @@ const useSortColumnsRows = (sourceColumns, sourceRows, popoverHandlers) => {
161
171
  newColumn.headerCellClass = `${newColumn.headerCellClass} ${filterColumnClassName}`.trim();
162
172
  }
163
173
  newColumn.renderHeaderCell = DragAndDropHeaderRenderer;
174
+ const columnConfig = columnsConfig.find((cfg) => cfg.key === c.key);
175
+ const isGroupedInConfig = columnConfig?.grouped === true;
176
+ const originalColumn = sourceColumns.find((col) => col.key === c.key);
177
+ const hasCustomGroupCell = originalColumn?.renderGroupCell !== void 0;
178
+ if (isGroupedInConfig) {
179
+ const customGroupCell = hasCustomGroupCell ? originalColumn?.renderGroupCell : void 0;
180
+ newColumn.renderGroupCell = (cellProps) => /* @__PURE__ */ jsx(
181
+ RenderGroupCell,
182
+ {
183
+ ...cellProps,
184
+ customRenderGroupCell: customGroupCell
185
+ }
186
+ );
187
+ }
164
188
  return newColumn;
165
189
  });
166
190
  }, [
@@ -168,7 +192,9 @@ const useSortColumnsRows = (sourceColumns, sourceRows, popoverHandlers) => {
168
192
  columns,
169
193
  activeFilters,
170
194
  onChangeColumnsOrder,
171
- popoverHandlers
195
+ popoverHandlers,
196
+ columnsConfig,
197
+ sourceColumns
172
198
  ]);
173
199
  const finalRows = useMemo(() => {
174
200
  const nextRows = sourceRows.filter((r) => {
@@ -226,7 +252,7 @@ const useSortColumnsRows = (sourceColumns, sourceRows, popoverHandlers) => {
226
252
  return 0;
227
253
  });
228
254
  return nextRows;
229
- }, [sourceRows, sortColumns, filters]);
255
+ }, [sourceRows, sortColumns, filters, columns]);
230
256
  return { finalColumns, sortColumns, setSortColumns, finalRows };
231
257
  };
232
258
  export {
@@ -1,5 +1,5 @@
1
1
  import { jsx, Fragment } from "react/jsx-runtime";
2
- import { f as DATAGRID_SEMANTIC_WIDTHS, e as DATAGRID_ACTIONS_COLUMN_KEY } from "../../../../constants.js";
2
+ import { e as DATAGRID_SEMANTIC_WIDTHS, d as DATAGRID_ACTIONS_COLUMN_KEY } from "../../../../constants.js";
3
3
  import { u as useDataGrid } from "../../../../hooks/shared/useDataGrid/useDataGrid.js";
4
4
  import { M as MenuActions } from "../../../../../MenuActions/MenuActions.js";
5
5
  function ActionsFormatter(props) {
@@ -6,7 +6,7 @@ import { P as MenuListStyled, Q as HeaderRenderClickStyled } from "../../../../s
6
6
  import { M as MenuDivider } from "../../../../../mui_extended/MenuDivider/MenuDivider.js";
7
7
  import { P as Popover } from "../../../../../mui_extended/Popover/Popover.js";
8
8
  import { D as DICTIONARY } from "../../../../dictionary.js";
9
- import { g as DATAGRID_HEADER_RENDER_CLICK_KEY } from "../../../../constants.js";
9
+ import { f as DATAGRID_HEADER_RENDER_CLICK_KEY } from "../../../../constants.js";
10
10
  import { u as useFilters } from "../../../../hooks/shared/useFilters/useFilters.js";
11
11
  function HeaderRenderClick(props) {
12
12
  const {
@@ -1,5 +1,5 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { d as DATAGRID_SELECT_COLUMN_KEY } from "../../../../constants.js";
2
+ import { SELECT_COLUMN_KEY } from "react-data-grid";
3
3
  import { u as useDataGrid } from "../../../../hooks/shared/useDataGrid/useDataGrid.js";
4
4
  import { R as RadioFormatter } from "./subcomponents/RadioFormatter/RadioFormatter.js";
5
5
  function RadioSelectGroupFormatter(_props) {
@@ -28,7 +28,7 @@ function RadioSelectColumnHeaderRenderer(_props) {
28
28
  return null;
29
29
  }
30
30
  const RadioSelectColumn = {
31
- key: DATAGRID_SELECT_COLUMN_KEY,
31
+ key: SELECT_COLUMN_KEY,
32
32
  name: "",
33
33
  width: 32,
34
34
  minWidth: 32,
@@ -0,0 +1,10 @@
1
+ import { RenderGroupCellComponentProps } from './types';
2
+ /**
3
+ * Componente para renderizar las celdas de grupo en TreeDataGrid.
4
+ * Siempre muestra un icono de expansión/colapso al inicio.
5
+ * Si se proporciona customRenderGroupCell, renderiza ese contenido después del icono.
6
+ * De lo contrario, muestra el texto del grupo (groupKey).
7
+ * Respeta la alineación de la columna (align: left | center | right).
8
+ * @param props - Props de react-data-grid para grupo + customRenderGroupCell opcional
9
+ */
10
+ export declare function RenderGroupCell<TRow>(props: RenderGroupCellComponentProps<TRow>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useEnvironment } from "@m4l/core";
3
+ import { p as pathIcons } from "../../../../icons.js";
4
+ import { I as Icon } from "../../../../../Icon/Icon.js";
5
+ import { S as DefaultRenderGroupCellRootStyled, U as DefaultRenderGroupCellTextStyled } from "../../../../slots/DataGridSlot.js";
6
+ import { u as useDataGrid } from "../../../../hooks/shared/useDataGrid/useDataGrid.js";
7
+ function RenderGroupCell(props) {
8
+ const { groupKey, isExpanded, toggleGroup, column, customRenderGroupCell, ...restProps } = props;
9
+ const { host_static_assets, environment_assets } = useEnvironment();
10
+ const { size, currentRowHeightVariant } = useDataGrid();
11
+ const iconPath = isExpanded ? pathIcons.groupDown : pathIcons.groupUp;
12
+ const fullIconPath = `${host_static_assets}/${environment_assets}/${iconPath}`;
13
+ const align = column.align;
14
+ const originalProps = {
15
+ groupKey,
16
+ isExpanded,
17
+ toggleGroup,
18
+ column,
19
+ ...restProps
20
+ };
21
+ return /* @__PURE__ */ jsxs(DefaultRenderGroupCellRootStyled, { ownerState: { align }, onClick: toggleGroup, children: [
22
+ /* @__PURE__ */ jsx(
23
+ Icon,
24
+ {
25
+ src: fullIconPath,
26
+ size,
27
+ ariaLabel: isExpanded ? "Colapsar grupo" : "Expandir grupo"
28
+ }
29
+ ),
30
+ customRenderGroupCell ? customRenderGroupCell(originalProps) : /* @__PURE__ */ jsx(DefaultRenderGroupCellTextStyled, { ownerState: { currentRowHeightVariant }, children: String(groupKey) })
31
+ ] });
32
+ }
33
+ export {
34
+ RenderGroupCell as R
35
+ };
@@ -0,0 +1,2 @@
1
+ export { RenderGroupCell } from './RenderGroupCell';
2
+ export type { RenderGroupCellComponentProps } from './types';
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ import { RenderGroupCellProps } from 'react-data-grid';
3
+ /**
4
+ * Props para RenderGroupCell que permiten contenido personalizado.
5
+ */
6
+ export interface RenderGroupCellComponentProps<TRow> extends RenderGroupCellProps<TRow> {
7
+ /**
8
+ * Función opcional para renderizar contenido personalizado después del icono.
9
+ * Si se proporciona, se renderiza en lugar del texto por defecto (groupKey).
10
+ */
11
+ customRenderGroupCell?: (props: RenderGroupCellProps<TRow>) => ReactNode;
12
+ }
@@ -1,21 +1,49 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { useRowSelection, SelectCellFormatter } from "react-data-grid";
3
- import { d as DATAGRID_SELECT_COLUMN_KEY } from "../../../../constants.js";
2
+ import { SELECT_COLUMN_KEY, SelectCellFormatter } from "react-data-grid";
4
3
  import { u as useDataGrid } from "../../../../hooks/shared/useDataGrid/useDataGrid.js";
5
4
  const filterColumnClassName = "filter-cell";
6
5
  const filterHeight = 35;
6
+ function getAllChildRowIds(childRows, rowKeyGetter) {
7
+ const ids = [];
8
+ for (const row of childRows) {
9
+ if ("childRows" in row && Array.isArray(row.childRows)) {
10
+ ids.push(...getAllChildRowIds(row.childRows, rowKeyGetter));
11
+ } else {
12
+ ids.push(rowKeyGetter(row));
13
+ }
14
+ }
15
+ return ids;
16
+ }
7
17
  function SelectGroupFormatter(props) {
8
- const { isRowSelected, onRowSelectionChange } = useRowSelection();
18
+ const { checkedRows, onCheckedRowsChange, rowKeyGetter } = useDataGrid();
19
+ const { childRows } = props;
20
+ const childRowIds = getAllChildRowIds(childRows, rowKeyGetter);
21
+ const selectedCount = childRowIds.filter((id) => checkedRows?.has(id)).length;
22
+ const totalCount = childRowIds.length;
23
+ const allChildrenChecked = totalCount > 0 && selectedCount === totalCount;
24
+ const someChildrenChecked = selectedCount > 0 && selectedCount < totalCount;
9
25
  const onChange = (checked) => {
10
- onRowSelectionChange({ row: props.row, checked, isShiftClick: false });
26
+ if (!onCheckedRowsChange) {
27
+ return;
28
+ }
29
+ const newCheckedRows = new Set(checkedRows);
30
+ if (checked) {
31
+ childRowIds.forEach((id) => newCheckedRows.add(id));
32
+ } else {
33
+ childRowIds.forEach((id) => newCheckedRows.delete(id));
34
+ }
35
+ onCheckedRowsChange(newCheckedRows);
11
36
  };
12
- const cellFormater = SelectCellFormatter({
13
- value: isRowSelected,
14
- tabIndex: props.tabIndex,
15
- onChange,
16
- "aria-label": "Select Group"
17
- });
18
- return cellFormater;
37
+ return /* @__PURE__ */ jsx(
38
+ SelectCellFormatter,
39
+ {
40
+ value: allChildrenChecked,
41
+ indeterminate: someChildrenChecked,
42
+ tabIndex: props.tabIndex,
43
+ onChange,
44
+ "aria-label": "Select Group"
45
+ }
46
+ );
19
47
  }
20
48
  function SelectFormatter(props) {
21
49
  const { checkedRows, onCheckedRowsChange, rowKeyGetter } = useDataGrid();
@@ -40,26 +68,30 @@ function SelectFormatter(props) {
40
68
  }
41
69
  const SelectColumnHeaderRenderer = (props) => {
42
70
  const { rows, rowKeyGetter, onCheckedRowsChange, checkedRows } = useDataGrid();
71
+ const selectedCount = checkedRows?.size ?? 0;
72
+ const totalCount = rows.length;
73
+ const allRowsChecked = totalCount > 0 && selectedCount === totalCount;
74
+ const someRowsChecked = selectedCount > 0 && selectedCount < totalCount;
43
75
  const onAllRowsCheckedChange = (checked) => {
44
76
  if (!onCheckedRowsChange) {
45
77
  return;
46
78
  }
47
79
  if (checked) {
48
- onCheckedRowsChange(new Set(rows.map((r) => rowKeyGetter(r))));
80
+ onCheckedRowsChange(new Set(rows.map((row) => rowKeyGetter(row))));
49
81
  } else {
50
82
  onCheckedRowsChange(/* @__PURE__ */ new Set());
51
83
  }
52
84
  };
53
- const allRowsChecked = rows.length === checkedRows?.size;
54
85
  return SelectCellFormatter({
55
86
  "aria-label": "Select All",
56
87
  tabIndex: props.tabIndex,
57
88
  value: allRowsChecked,
89
+ indeterminate: someRowsChecked,
58
90
  onChange: onAllRowsCheckedChange
59
91
  });
60
92
  };
61
93
  const SelectColumn = {
62
- key: DATAGRID_SELECT_COLUMN_KEY,
94
+ key: SELECT_COLUMN_KEY,
63
95
  name: "",
64
96
  width: 32,
65
97
  minWidth: 32,
@@ -11,13 +11,24 @@ import { u as useDataGrid } from "../../../../../../hooks/shared/useDataGrid/use
11
11
  import { W as WindowBase } from "../../../../../../../WindowBase/WindowBase.js";
12
12
  import { A as ActionCancel } from "../../../../../../../CommonActions/components/ActionCancel/ActionCancel.js";
13
13
  import { A as ActionIntro } from "../../../../../../../CommonActions/components/ActionIntro/ActionIntro.js";
14
+ const BASE_MODAL_WIDTH = 520;
15
+ const GROUP_COLUMN_WIDTH = 80;
14
16
  const useModalSettings = (size, columns) => {
15
17
  const { openModal, closeModal } = useModal();
16
- const { columnsConfig, onChangeColumnsConfig, currentRowHeight, classes } = useDataGrid();
18
+ const {
19
+ columnsConfig,
20
+ onChangeColumnsConfig,
21
+ currentRowHeight,
22
+ classes
23
+ } = useDataGrid();
17
24
  const { getLabel } = useModuleDictionary();
18
25
  const { host_static_assets, environment_assets } = useEnvironment();
19
26
  const isMobile = useIsMobile();
20
27
  const ref = useRef(null);
28
+ const hasGroupableColumns = columns.some(
29
+ (col) => col.groupable === true || col.grouped === true
30
+ );
31
+ const modalWidth = hasGroupableColumns ? BASE_MODAL_WIDTH + GROUP_COLUMN_WIDTH : BASE_MODAL_WIDTH;
21
32
  const onCloseSettings = useCallback(() => {
22
33
  closeModal();
23
34
  }, [closeModal]);
@@ -31,7 +42,7 @@ const useModalSettings = (size, columns) => {
31
42
  };
32
43
  const onClickSettings = () => {
33
44
  openModal({
34
- initialWidth: 500,
45
+ initialWidth: modalWidth,
35
46
  initialHeight: 680,
36
47
  fullScreen: isMobile,
37
48
  window: /* @__PURE__ */ jsx(