@m4l/components 9.3.19-BE171025-beta.1 → 9.3.19-BE241025-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 (120) 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 +322 -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/types.d.ts +1 -0
  70. package/components/DataGrid/tests/helpers/useCardsViewConfig.d.ts +24 -0
  71. package/components/DataGrid/tests/helpers/useCustomCardExample.d.ts +7 -0
  72. package/components/DataGrid/tests/hooks/useCardContent.test.d.ts +1 -0
  73. package/components/DataGrid/tests/hooks/useModalDetail.test.d.ts +1 -0
  74. package/components/DataGrid/tests/hooks/useModalSettingsCards.test.d.ts +1 -0
  75. package/components/DataGrid/tests/hooks/useProcessedColumns.test.d.ts +1 -0
  76. package/components/DataGrid/types.d.ts +87 -5
  77. package/components/DynamicFilter/helpers/formatToInitialFilters.js +3 -3
  78. package/components/DynamicFilter/subcomponents/FieldTypes/BooleanFilter/helpers.js +11 -3
  79. package/components/DynamicFilter/subcomponents/FieldTypes/DateTimeFilter/helpers.js +16 -4
  80. package/components/DynamicFilter/subcomponents/FieldTypes/NumberFilter/helpers.js +11 -8
  81. package/components/DynamicFilter/subcomponents/FieldTypes/SelectAsyncFilter/helpers.js +21 -8
  82. package/components/DynamicFilter/subcomponents/FieldTypes/SelectFilter/helpers.js +18 -8
  83. package/components/DynamicFilter/subcomponents/FieldTypes/StringFilter/helpers.js +5 -3
  84. package/components/EditLabel/hooks/useEditLabel.d.ts +1 -0
  85. package/components/LanguagePopover/LanguagePopover.js +2 -0
  86. package/components/MFIsolationApp/MFIsolationApp.js +1 -4
  87. package/components/MFIsolationApp/subcomponents/AppBarSettings/AppBarSettings.js +1 -1
  88. package/components/MFIsolationAppStorybook/MFIsolationAppStorybook.js +4 -20
  89. package/components/MFIsolationAppStorybook/types.d.ts +0 -4
  90. package/components/MenuActions/MenuActions.js +105 -55
  91. package/components/hook-form/RHFAutocomplete/RHFAutocomplete.d.ts +1 -1
  92. package/components/hook-form/RHFAutocomplete/RHFAutocomplete.js +4 -4
  93. package/components/hook-form/RHFAutocomplete/types.d.ts +2 -2
  94. package/components/hook-form/RHFAutocompleteAsync/RHFAutocompleteAsync.js +4 -4
  95. package/components/hook-form/RHFAutocompleteAsync/slots/RHFAutocompleteSlotsAsync.d.ts +1 -1
  96. package/components/mui_extended/Autocomplete/Autocomplete.d.ts +4 -8
  97. package/components/mui_extended/Autocomplete/Autocomplete.js +11 -11
  98. package/components/mui_extended/Autocomplete/Autocomplete.styles.js +7 -3
  99. package/components/mui_extended/Autocomplete/RenderAdornment/RenderAdornment.d.ts +6 -0
  100. package/components/mui_extended/Autocomplete/RenderAdornment/RenderAdornment.js +45 -0
  101. package/components/mui_extended/Autocomplete/hooks/useEndAdornments.js +2 -1
  102. package/components/mui_extended/Autocomplete/hooks/useStartAdornments.d.ts +4 -12
  103. package/components/mui_extended/Autocomplete/hooks/useStartAdornments.js +72 -23
  104. package/components/mui_extended/Autocomplete/hooks/useValuesAndHandlers.d.ts +0 -2
  105. package/components/mui_extended/Autocomplete/hooks/useValuesAndHandlers.js +0 -13
  106. package/components/mui_extended/Autocomplete/renderOptions/index.d.ts +4 -17
  107. package/components/mui_extended/Autocomplete/renderOptions/index.js +42 -5
  108. package/components/mui_extended/Autocomplete/renderOptions/types.d.ts +7 -0
  109. package/components/mui_extended/Autocomplete/types.d.ts +10 -3
  110. package/contexts/AppearanceComponentContext/AppearanceComponentContext.js +4 -1
  111. package/hooks/useDataGridPersistence/helpers.d.ts +2 -2
  112. package/hooks/useDataGridPersistence/useDataGridPersistence.d.ts +2 -2
  113. package/hooks/useDataGridPersistence/useDataGridPersistence.js +5 -0
  114. package/index.js +8 -8
  115. package/package.json +1 -1
  116. package/components/MFIsolationAppStorybook/icons.js +0 -6
  117. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.d.ts +0 -4
  118. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.js +0 -21
  119. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.d.ts +0 -1
  120. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.js +0 -1
@@ -34,6 +34,7 @@ function MenuActions(props) {
34
34
  className,
35
35
  onOpen,
36
36
  slots = {},
37
+ variant = "text",
37
38
  ...other
38
39
  } = props;
39
40
  const { currentSize } = useComponentSize(size);
@@ -41,11 +42,14 @@ function MenuActions(props) {
41
42
  const { getLabel } = useModuleDictionary();
42
43
  const [anchorEl, setAnchorEl] = useState(null);
43
44
  const open = Boolean(externalOpen ?? anchorEl);
44
- const ownerState = useMemo(() => ({
45
- iconSize: currentSize,
46
- selected: open,
47
- paletteColor: color
48
- }), [currentSize, open, color]);
45
+ const ownerState = useMemo(
46
+ () => ({
47
+ iconSize: currentSize,
48
+ selected: open,
49
+ paletteColor: color
50
+ }),
51
+ [currentSize, open, color]
52
+ );
49
53
  useEffect(() => {
50
54
  if (onOpen) {
51
55
  onOpen(open);
@@ -60,21 +64,27 @@ function MenuActions(props) {
60
64
  const finalIcon = useMemo(() => {
61
65
  return icon || urlIcon || `${host_static_assets}/${environment_assets}/${ICON_PATH}/${ICONS.MENU}`;
62
66
  }, [urlIcon, icon, host_static_assets, environment_assets]);
63
- const handleClick = useCallback((e, menuAction) => {
64
- e.stopPropagation();
65
- setAnchorEl(null);
66
- if (onOpen) {
67
- onOpen(false);
68
- }
69
- menuAction.onClick && menuAction.onClick(e);
70
- }, [onOpen]);
71
- const handleButtonClick = useCallback((e) => {
72
- e.stopPropagation();
73
- setAnchorEl(e.currentTarget);
74
- if (onOpen) {
75
- onOpen(true);
76
- }
77
- }, [onOpen]);
67
+ const handleClick = useCallback(
68
+ (e, menuAction) => {
69
+ e.stopPropagation();
70
+ setAnchorEl(null);
71
+ if (onOpen) {
72
+ onOpen(false);
73
+ }
74
+ menuAction.onClick && menuAction.onClick(e);
75
+ },
76
+ [onOpen]
77
+ );
78
+ const handleButtonClick = useCallback(
79
+ (e) => {
80
+ e.stopPropagation();
81
+ setAnchorEl(e.currentTarget);
82
+ if (onOpen) {
83
+ onOpen(true);
84
+ }
85
+ },
86
+ [onOpen]
87
+ );
78
88
  const renderMenuContent = useCallback(() => {
79
89
  let processedActions = [];
80
90
  let finalActions = [];
@@ -89,7 +99,16 @@ function MenuActions(props) {
89
99
  finalActions = processedActions;
90
100
  }
91
101
  if (finalActions.length === 0) {
92
- return /* @__PURE__ */ jsx(MenuItem, { disabled: true, role: "menu-no-actions", label: getLabel(getMenuActionsDictionary(DICTIONARY.no_actions_label)) });
102
+ return /* @__PURE__ */ jsx(
103
+ MenuItem,
104
+ {
105
+ disabled: true,
106
+ role: "menu-no-actions",
107
+ label: getLabel(
108
+ getMenuActionsDictionary(DICTIONARY.no_actions_label)
109
+ )
110
+ }
111
+ );
93
112
  }
94
113
  const RenderHeader = () => {
95
114
  return /* @__PURE__ */ jsx(HeaderMenuActionsStyled, { children: header });
@@ -104,7 +123,14 @@ function MenuActions(props) {
104
123
  const key = actionKey ?? index;
105
124
  switch (menuAction.type ?? "menuItem") {
106
125
  case "divider":
107
- return /* @__PURE__ */ jsx(MenuDivider, { variant: "solid", size }, `divider-${key}`);
126
+ return /* @__PURE__ */ jsx(
127
+ MenuDivider,
128
+ {
129
+ variant: "solid",
130
+ size
131
+ },
132
+ `divider-${key}`
133
+ );
108
134
  case "loader":
109
135
  return /* @__PURE__ */ jsx(MenuLoaderStyled, { size, children: /* @__PURE__ */ jsx(CircularProgress, { size }) }, `loader-${key}`);
110
136
  case "customNode":
@@ -115,7 +141,9 @@ function MenuActions(props) {
115
141
  {
116
142
  size,
117
143
  ...menuAction,
118
- label: menuAction.label ?? getLabel(getMenuActionsDictionary(DICTIONARY.no_actions_label)),
144
+ label: menuAction.label ?? getLabel(
145
+ getMenuActionsDictionary(DICTIONARY.no_actions_label)
146
+ ),
119
147
  onClick: menuAction.onClick ? (e) => handleClick(e, menuAction) : void 0
120
148
  },
121
149
  `${MENU_ACTIONS_}${menuAction.label ?? key}`
@@ -128,38 +156,60 @@ function MenuActions(props) {
128
156
  footer && /* @__PURE__ */ jsx(RenderFooter, {}),
129
157
  endListElement && endListElement
130
158
  ] });
131
- }, [menuActions, header, size, footer, endListElement, objItem, getLabel, actionKey, handleClick]);
132
- return /* @__PURE__ */ jsxs(RootStyled, { className: clsx(className, MENU_ACTIONS_CLASSES.root, ownerState.selected && MENU_ACTIONS_CLASSES.selected), ownerState: { ownerState }, children: [
133
- /* @__PURE__ */ jsx(
134
- IconButtonStyled,
135
- {
136
- ownerState: { ...ownerState },
137
- tooltip: toolTip,
138
- size,
139
- icon: finalIcon,
140
- onClick: handleButtonClick,
141
- className: iconButtonClassName,
142
- selected: open,
143
- disabled,
144
- badgeProps: { badgeContent },
145
- "aria-label": "menu-actions"
146
- }
147
- ),
148
- open && /* @__PURE__ */ jsx(
149
- Popover,
150
- {
151
- id: "Popover",
152
- open,
153
- anchorEl,
154
- onClose: handleOpenClose,
155
- arrowType,
156
- ...other,
157
- slots: { ...slots },
158
- slotProps: { paper: { ...paperProps } },
159
- children: renderMenuContent()
160
- }
161
- )
162
- ] });
159
+ }, [
160
+ menuActions,
161
+ header,
162
+ size,
163
+ footer,
164
+ endListElement,
165
+ objItem,
166
+ getLabel,
167
+ actionKey,
168
+ handleClick
169
+ ]);
170
+ return /* @__PURE__ */ jsxs(
171
+ RootStyled,
172
+ {
173
+ className: clsx(
174
+ className,
175
+ MENU_ACTIONS_CLASSES.root,
176
+ ownerState.selected && MENU_ACTIONS_CLASSES.selected
177
+ ),
178
+ ownerState: { ownerState },
179
+ children: [
180
+ /* @__PURE__ */ jsx(
181
+ IconButtonStyled,
182
+ {
183
+ ownerState: { ...ownerState },
184
+ tooltip: toolTip,
185
+ size,
186
+ icon: finalIcon,
187
+ onClick: handleButtonClick,
188
+ className: iconButtonClassName,
189
+ selected: open,
190
+ disabled,
191
+ badgeProps: { badgeContent },
192
+ "aria-label": other?.["aria-label"] ?? "menu-actions",
193
+ variant
194
+ }
195
+ ),
196
+ open && /* @__PURE__ */ jsx(
197
+ Popover,
198
+ {
199
+ id: "Popover",
200
+ open,
201
+ anchorEl,
202
+ onClose: handleOpenClose,
203
+ arrowType,
204
+ ...other,
205
+ slots: { ...slots },
206
+ slotProps: { paper: { ...paperProps } },
207
+ children: renderMenuContent()
208
+ }
209
+ )
210
+ ]
211
+ }
212
+ );
163
213
  }
164
214
  const MemonizedMenuActions = React.memo(MenuActions);
165
215
  export {
@@ -4,4 +4,4 @@ import { RHFAutocompleteProps } from './types';
4
4
  * @param props - The properties for the RHFAutocomplete component.
5
5
  * @returns The RHFAutocomplete component.
6
6
  */
7
- export declare function RHFAutocomplete<T>(props: RHFAutocompleteProps<T>): import("react/jsx-runtime").JSX.Element;
7
+ export declare function RHFAutocomplete<T, Multiple extends boolean | undefined = undefined, DisableClearable extends boolean | undefined = undefined, FreeSolo extends boolean | undefined = undefined>(props: RHFAutocompleteProps<T, Multiple, DisableClearable, FreeSolo>): import("react/jsx-runtime").JSX.Element;
@@ -25,8 +25,8 @@ function RHFAutocomplete(props) {
25
25
  multiple,
26
26
  refresh,
27
27
  startAdornment,
28
- getOptionalStartAdornment,
29
- getOptionalEndAdornment,
28
+ getOptionStartAdornment,
29
+ getOptionEndAdornment,
30
30
  className
31
31
  // onChange: onChangeRHF,
32
32
  } = props;
@@ -121,8 +121,8 @@ function RHFAutocomplete(props) {
121
121
  value,
122
122
  htmlFor: htmlForId,
123
123
  startAdornment,
124
- getOptionalStartAdornment: getOptionalStartAdornment ? (option) => getOptionalStartAdornment(option) : () => null,
125
- getOptionalEndAdornment: getOptionalEndAdornment ? (option) => getOptionalEndAdornment(option) : () => null
124
+ getOptionStartAdornment,
125
+ getOptionEndAdornment
126
126
  }
127
127
  ),
128
128
  error?.message ? /* @__PURE__ */ jsx(HelperError, { message: error?.message }) : null
@@ -54,11 +54,11 @@ export interface RHFAutocompleteProps<T = any, Multiple extends boolean | undefi
54
54
  /**
55
55
  * Icono o adorno inicial que se muestra en cada opción del autocomplete.
56
56
  */
57
- getOptionalEndAdornment?: AutocompleteProps<T, Multiple>['getOptionalEndAdornment'];
57
+ getOptionEndAdornment?: AutocompleteProps<T, Multiple>['getOptionEndAdornment'];
58
58
  /**
59
59
  * Icono o adorno final que se muestra en cada opción del autocomplete.
60
60
  */
61
- getOptionalStartAdornment?: AutocompleteProps<T, Multiple>['getOptionalStartAdornment'];
61
+ getOptionStartAdornment?: AutocompleteProps<T, Multiple>['getOptionStartAdornment'];
62
62
  }
63
63
  /**
64
64
  * Represents the owner state of the Autocomplete component for styling purposes.
@@ -24,8 +24,8 @@ function RHFAutocompleteAsync(props) {
24
24
  skeletonWidth,
25
25
  responseToCamelCase,
26
26
  startAdornment,
27
- getOptionalStartAdornment,
28
- getOptionalEndAdornment,
27
+ getOptionStartAdornment,
28
+ getOptionEndAdornment,
29
29
  className
30
30
  } = props;
31
31
  const [state, dispatch] = useReducer(
@@ -94,8 +94,8 @@ function RHFAutocompleteAsync(props) {
94
94
  onClose: onCloseLocal,
95
95
  skeletonWidth,
96
96
  startAdornment,
97
- getOptionalStartAdornment,
98
- getOptionalEndAdornment
97
+ getOptionStartAdornment,
98
+ getOptionEndAdornment
99
99
  }
100
100
  );
101
101
  }
@@ -1 +1 @@
1
- export declare const RHFAutocompleteAsyncRootStyled: import('@emotion/styled').StyledComponent<Pick<import('../../RHFAutocomplete/types').RHFAutocompleteProps<unknown, undefined, undefined, undefined>, keyof import('../../RHFAutocomplete/types').RHFAutocompleteProps<unknown, undefined, undefined, undefined>> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown>, {}, {}>;
1
+ export declare const RHFAutocompleteAsyncRootStyled: import('@emotion/styled').StyledComponent<Pick<import('../../RHFAutocomplete/types').RHFAutocompleteProps<unknown, boolean | undefined, boolean | undefined, boolean | undefined>, keyof import('../../RHFAutocomplete/types').RHFAutocompleteProps<unknown, boolean | undefined, boolean | undefined, boolean | undefined>> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown>, {}, {}>;
@@ -1,9 +1,5 @@
1
+ import { Ref } from 'react';
1
2
  import { AutocompleteProps } from './types';
2
- /**
3
- * Autocomplete refactorizado con slots M4L.
4
- * Tener en cuenta que cuando es multiple y se abre el dropdown, y el value no está dentro de lasl opciones.
5
- * MUI va a genera el siguiente warning (Y es normal que suceda, no es necesario darle solución):
6
- * MUI: The value provided to Autocomplete is invalid.
7
- * None of the options match with `{"y":y,"x":"xxx"}`. etc.
8
- */
9
- export declare const Autocomplete: import('react').ForwardRefExoticComponent<AutocompleteProps<unknown, boolean | undefined> & import('react').RefAttributes<HTMLInputElement | HTMLTextAreaElement>>;
3
+ export declare const Autocomplete: <T, Multiple extends boolean | undefined = undefined>(props: AutocompleteProps<T, Multiple> & {
4
+ ref?: Ref<HTMLInputElement | HTMLTextAreaElement>;
5
+ }) => JSX.Element;
@@ -8,7 +8,7 @@ import { u as useEndAdornments } from "./hooks/useEndAdornments.js";
8
8
  import { u as useComponentSize } from "../../../hooks/useComponentSize/useComponentSize.js";
9
9
  import { S as SkeletonAutocompleteStyled, A as AutocompleteRootStyled, R as RenderInputStyled, P as PopperComponentStyled } from "./slots/AutocompleteSlots.js";
10
10
  import { T as Typography } from "../Typography/Typography.js";
11
- const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
11
+ function AutocompleteComponent(props, ref) {
12
12
  const {
13
13
  options,
14
14
  disabled,
@@ -17,16 +17,14 @@ const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
17
17
  size = "medium",
18
18
  onChangeFilterParmsLocal,
19
19
  multiple,
20
- getOptionUrlImage,
21
- // Diferencia
22
20
  refresh,
23
21
  error = false,
24
22
  htmlFor,
25
23
  readOnly = false,
26
24
  placeholder,
27
25
  startAdornment,
28
- getOptionalStartAdornment,
29
- getOptionalEndAdornment
26
+ getOptionStartAdornment,
27
+ getOptionEndAdornment
30
28
  } = props;
31
29
  const { getLabel } = useModuleDictionary();
32
30
  const isSkeleton = useModuleSkeleton();
@@ -47,6 +45,7 @@ const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
47
45
  checkKeyDown,
48
46
  scrollPositionOptionsRef
49
47
  } = useValuesAndHandlers(props);
48
+ const hasStartAdornment = !!startAdornment;
50
49
  const ownerState = useMemo(() => ({
51
50
  size: adjustedSize,
52
51
  variant,
@@ -54,8 +53,8 @@ const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
54
53
  multiple: Boolean(multiple),
55
54
  error,
56
55
  readOnly,
57
- startAdornment: !!startAdornment
58
- }), [adjustedSize, disabled, error, multiple, variant, readOnly, startAdornment]);
56
+ startAdornment: hasStartAdornment
57
+ }), [adjustedSize, disabled, error, multiple, variant, readOnly, hasStartAdornment]);
59
58
  const startAdornments = useStartAdornments({
60
59
  selectedValue,
61
60
  multiple,
@@ -65,8 +64,8 @@ const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
65
64
  handleDelete,
66
65
  disabled,
67
66
  startAdornment,
68
- getOptionalStartAdornment,
69
- getOptionalEndAdornment
67
+ getOptionStartAdornment,
68
+ getOptionEndAdornment
70
69
  });
71
70
  const endAdornments = useEndAdornments({
72
71
  loading,
@@ -133,7 +132,7 @@ const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
133
132
  selected: isSelected,
134
133
  disabled,
135
134
  size
136
- });
135
+ }, getOptionStartAdornment, getOptionEndAdornment);
137
136
  },
138
137
  ListboxProps: {
139
138
  //Esto para no perder el scroll de la lista de opciones, cuando es multiple, ya que MUI no lo guarda
@@ -182,7 +181,8 @@ const Autocomplete = forwardRef(function Autocomplete2(props, ref) {
182
181
  }
183
182
  }
184
183
  );
185
- });
184
+ }
185
+ const Autocomplete = forwardRef(AutocompleteComponent);
186
186
  export {
187
187
  Autocomplete as A
188
188
  };
@@ -3,9 +3,13 @@ const autocompleteSyles = {
3
3
  /**
4
4
  * Styles for the root component.
5
5
  */
6
- root: () => ({
6
+ root: ({ theme }) => ({
7
7
  width: "100%",
8
- padding: 0
8
+ padding: 0,
9
+ "& .M4LImage-root": {
10
+ width: theme.vars.size.baseSpacings["sp3-5"],
11
+ height: theme.vars.size.baseSpacings["sp3-5"]
12
+ }
9
13
  }),
10
14
  /**
11
15
  * Styles for the icon button component.
@@ -81,7 +85,7 @@ const autocompleteSyles = {
81
85
  ...ownerState?.startAdornment ? {
82
86
  padding: `${sp1} ${sp7} ${sp1} ${sp5}!important`
83
87
  } : {
84
- padding: `${sp1} ${sp7} ${sp1} 0px!important`
88
+ padding: `${sp1} ${sp7} ${sp1} ${sp1}!important`
85
89
  },
86
90
  gap: sp1,
87
91
  flexWrap: "wrap",
@@ -0,0 +1,6 @@
1
+ import { Sizes } from '@m4l/styles';
2
+ import { ResourceType } from '../types';
3
+ /**
4
+ * Render adornment function similar to useStartAdornments
5
+ */
6
+ export declare const renderAdornment: (propsResource: ResourceType, adjustedSize: Extract<Sizes, "small" | "medium">) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,45 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { I as Image } from "../../../Image/Image.js";
4
+ import { I as Icon } from "../../../Icon/Icon.js";
5
+ const renderAdornment = (propsResource, adjustedSize) => {
6
+ const { resource, type } = propsResource;
7
+ if (!resource) {
8
+ return null;
9
+ }
10
+ if (React.isValidElement(resource)) {
11
+ try {
12
+ return React.cloneElement(resource, {
13
+ size: adjustedSize
14
+ });
15
+ } catch (error) {
16
+ console.warn("Error cloning React element:", error);
17
+ return null;
18
+ }
19
+ }
20
+ if (typeof resource === "string") {
21
+ if (type === "image") {
22
+ return /* @__PURE__ */ jsx(
23
+ Image,
24
+ {
25
+ src: resource,
26
+ width: 14,
27
+ height: 14
28
+ }
29
+ );
30
+ } else {
31
+ return /* @__PURE__ */ jsx(
32
+ Icon,
33
+ {
34
+ src: resource,
35
+ size: adjustedSize
36
+ }
37
+ );
38
+ }
39
+ }
40
+ console.warn("Invalid icon type provided to renderAdornment:", typeof resource);
41
+ return null;
42
+ };
43
+ export {
44
+ renderAdornment as r
45
+ };
@@ -40,7 +40,8 @@ function useEndAdornments(props) {
40
40
  onClick: (event) => !readOnly ? onOpenLocal(event) : void 0,
41
41
  disabled,
42
42
  size: adjustedSize,
43
- rotationAngle: open ? 180 : 0
43
+ rotationAngle: open ? 180 : 0,
44
+ "aria-label": "toggle Autocomplete"
44
45
  }
45
46
  )
46
47
  ] });
@@ -1,25 +1,17 @@
1
- import { default as React } from 'react';
2
1
  import { AutocompleteOwnerState, AutocompleteProps } from '../types';
3
- export type UseAdornmentsProps<T> = {
2
+ export type UseAdornmentsProps<T, Multiple extends boolean | undefined = undefined> = {
4
3
  selectedValue: T | T[] | null;
5
4
  multiple?: boolean;
6
- loading?: boolean;
7
5
  adjustedSize: 'small' | 'medium';
8
6
  getOptionLabelLocal: (option: T) => string;
9
- getOptionalStartAdornment?: (option: T) => React.ReactNode;
10
- getOptionalEndAdornment?: (option: T) => React.ReactNode;
7
+ getOptionStartAdornment?: AutocompleteProps<T, Multiple>['getOptionStartAdornment'];
8
+ getOptionEndAdornment?: AutocompleteProps<T, Multiple>['getOptionEndAdornment'];
11
9
  ownerState: AutocompleteOwnerState;
12
10
  handleDelete: (option: T) => void;
13
- getOptionUrlImage?: (option: T) => string;
14
- selectedOption?: T;
15
- getOptionUrlImageLocal: (option: T) => string;
16
- refresh?: () => void;
17
- handleRefresh: () => void;
18
11
  disabled?: boolean;
19
- onOpenLocal: (event: React.MouseEvent<HTMLButtonElement>) => void;
20
12
  startAdornment?: AutocompleteProps<unknown, true>['startAdornment'];
21
13
  };
22
14
  /**
23
15
  * Hook para el componente Autocomplete local
24
16
  */
25
- export declare function useStartAdornments<T>(props: UseAdornmentsProps<T>): import("react/jsx-runtime").JSX.Element | null;
17
+ export declare function useStartAdornments<T, Multiple extends boolean | undefined = undefined>(props: UseAdornmentsProps<T, Multiple>): import("react/jsx-runtime").JSX.Element | null;
@@ -1,5 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import React, { useMemo } from "react";
3
+ import { r as renderAdornment } from "../RenderAdornment/RenderAdornment.js";
3
4
  import { b as ContainerMultipleValuesStyled, c as ContainerWrapperStyled, d as ChipStyled, W as WrapperStartAdornmentStyled } from "../slots/AutocompleteSlots.js";
4
5
  function useStartAdornments(props) {
5
6
  const {
@@ -11,30 +12,68 @@ function useStartAdornments(props) {
11
12
  handleDelete,
12
13
  disabled,
13
14
  startAdornment,
14
- getOptionalStartAdornment,
15
- getOptionalEndAdornment
15
+ getOptionStartAdornment,
16
+ getOptionEndAdornment
16
17
  } = props;
17
- const startAdornmentClone = startAdornment ? React.cloneElement(startAdornment, {
18
- size: adjustedSize
19
- }) : null;
18
+ const startAdornmentClone = useMemo(() => {
19
+ if (!startAdornment) {
20
+ return null;
21
+ }
22
+ try {
23
+ return React.cloneElement(startAdornment, {
24
+ size: adjustedSize
25
+ });
26
+ } catch (error) {
27
+ console.warn("Error cloning startAdornment:", error);
28
+ return null;
29
+ }
30
+ }, [startAdornment, adjustedSize]);
31
+ const memoizedIcons = useMemo(() => {
32
+ if (!Array.isArray(selectedValue) || !multiple || selectedValue.length === 0) {
33
+ return null;
34
+ }
35
+ const iconMap = /* @__PURE__ */ new Map();
36
+ selectedValue.forEach((option) => {
37
+ const optionKey = getOptionLabelLocal(option);
38
+ const startAdornmentResource = getOptionStartAdornment?.(option);
39
+ const endAdornmentResource = getOptionEndAdornment?.(option);
40
+ if (startAdornmentResource) {
41
+ iconMap.set(`${optionKey}-start`, renderAdornment(startAdornmentResource, adjustedSize));
42
+ }
43
+ if (endAdornmentResource) {
44
+ iconMap.set(`${optionKey}-end`, renderAdornment(endAdornmentResource, adjustedSize));
45
+ }
46
+ });
47
+ return iconMap;
48
+ }, [
49
+ selectedValue,
50
+ multiple,
51
+ getOptionLabelLocal,
52
+ getOptionStartAdornment,
53
+ getOptionEndAdornment,
54
+ adjustedSize
55
+ ]);
20
56
  const internalAdornments = useMemo(() => {
21
57
  if (!(Array.isArray(selectedValue) && multiple)) {
22
58
  return null;
23
59
  }
24
- return /* @__PURE__ */ jsx(ContainerMultipleValuesStyled, { children: /* @__PURE__ */ jsx(ContainerWrapperStyled, { children: selectedValue.map((option, index) => /* @__PURE__ */ jsx(
25
- ChipStyled,
26
- {
27
- size: adjustedSize,
28
- label: getOptionLabelLocal(option),
29
- opacity: true,
30
- onDeleted: () => handleDelete(option),
31
- disabledDeleteButton: disabled,
32
- ownerState: { ...ownerState },
33
- startIcon: getOptionalStartAdornment?.(option),
34
- endIcon: getOptionalEndAdornment?.(option)
35
- },
36
- `${option}-${index}`
37
- )) }) });
60
+ return /* @__PURE__ */ jsx(ContainerMultipleValuesStyled, { role: "list", "aria-label": "Selected options", children: /* @__PURE__ */ jsx(ContainerWrapperStyled, { children: selectedValue.map((option, index) => {
61
+ const optionKey = getOptionLabelLocal(option);
62
+ return /* @__PURE__ */ jsx(
63
+ ChipStyled,
64
+ {
65
+ size: adjustedSize,
66
+ label: optionKey,
67
+ opacity: true,
68
+ onDeleted: () => handleDelete(option),
69
+ disabledDeleteButton: disabled,
70
+ ownerState: { ...ownerState },
71
+ startIcon: memoizedIcons?.get(`${optionKey}-start`),
72
+ endIcon: memoizedIcons?.get(`${optionKey}-end`)
73
+ },
74
+ `${optionKey}-${index}`
75
+ );
76
+ }) }) });
38
77
  }, [
39
78
  selectedValue,
40
79
  multiple,
@@ -43,16 +82,26 @@ function useStartAdornments(props) {
43
82
  handleDelete,
44
83
  disabled,
45
84
  ownerState,
46
- getOptionalStartAdornment,
47
- getOptionalEndAdornment
85
+ memoizedIcons
48
86
  ]);
49
87
  if (startAdornmentClone && internalAdornments) {
50
88
  return /* @__PURE__ */ jsxs(Fragment, { children: [
51
- /* @__PURE__ */ jsx(WrapperStartAdornmentStyled, { children: startAdornmentClone }),
89
+ /* @__PURE__ */ jsx(WrapperStartAdornmentStyled, { role: "img", "aria-hidden": "true", children: startAdornmentClone }),
52
90
  internalAdornments
53
91
  ] });
54
92
  }
55
- return startAdornment ? /* @__PURE__ */ jsx(WrapperStartAdornmentStyled, { children: startAdornmentClone }) : internalAdornments;
93
+ if (startAdornmentClone) {
94
+ return /* @__PURE__ */ jsx(WrapperStartAdornmentStyled, { role: "img", "aria-hidden": "true", children: startAdornmentClone });
95
+ }
96
+ if (!getOptionLabelLocal) {
97
+ console.error("useStartAdornments: getOptionLabelLocal is required");
98
+ return null;
99
+ }
100
+ if (!handleDelete) {
101
+ console.error("useStartAdornments: handleDelete is required");
102
+ return null;
103
+ }
104
+ return internalAdornments;
56
105
  }
57
106
  export {
58
107
  useStartAdornments as u
@@ -8,7 +8,6 @@ export declare function useValuesAndHandlers<T, Multiple extends boolean | undef
8
8
  open: boolean;
9
9
  inputValue: string;
10
10
  selectedValue: T | T[] | null;
11
- selectedOption: T | undefined;
12
11
  isOptionEqualToValueLocal: (option: unknown, val: unknown) => boolean;
13
12
  handleDelete: (optionToDelete: T) => void;
14
13
  handleRefresh: () => void;
@@ -17,7 +16,6 @@ export declare function useValuesAndHandlers<T, Multiple extends boolean | undef
17
16
  onCloseLocal: (event: React.SyntheticEvent, reason: AutocompleteCloseReason) => void;
18
17
  onOpenLocal: (event: React.SyntheticEvent) => void;
19
18
  getOptionLabelLocal: (option: unknown) => string;
20
- getOptionUrlImageLocal: (option: T | null) => string;
21
19
  checkKeyDown: (e: KeyboardEvent<HTMLDivElement>) => void;
22
20
  scrollPositionOptionsRef: import('react').MutableRefObject<number>;
23
21
  };