@m4l/components 9.3.19-BE061025-beta.1 → 9.3.19-BE101025-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 (95) hide show
  1. package/components/Card/constants.d.ts +1 -1
  2. package/components/Chip/constants.d.ts +1 -1
  3. package/components/ContainerFlow/constants.d.ts +1 -1
  4. package/components/DataGrid/subcomponents/editors/EditLabelEditor/formatter.d.ts +8 -0
  5. package/components/DataGrid/subcomponents/editors/EditLabelEditor/index.d.ts +3 -0
  6. package/components/DataGrid/subcomponents/editors/EditLabelEditor/types.d.ts +5 -0
  7. package/components/DataGrid/subcomponents/editors/EditLabelEditor/useColumnEditLabel.d.ts +9 -0
  8. package/components/DataGrid/tests/helpers/types.d.ts +2 -0
  9. package/components/EditLabel/constants.d.ts +1 -1
  10. package/components/EditLabel/slots/EditLabelEnum.d.ts +1 -0
  11. package/components/EditLabel/slots/EditLabelSlots.d.ts +3 -0
  12. package/components/EditLabel/types.d.ts +2 -2
  13. package/components/FormContainer/constants.d.ts +1 -1
  14. package/components/Image/constant.d.ts +1 -1
  15. package/components/ImageText/constants.d.ts +1 -1
  16. package/components/MFIsolationAppStorybook/MFIsolationAppStorybook.d.ts +5 -0
  17. package/components/MFIsolationAppStorybook/MFIsolationAppStorybook.js +154 -0
  18. package/components/MFIsolationAppStorybook/constants.d.ts +1 -0
  19. package/components/MFIsolationAppStorybook/icons.d.ts +3 -0
  20. package/components/MFIsolationAppStorybook/icons.js +6 -0
  21. package/components/MFIsolationAppStorybook/index.d.ts +1 -0
  22. package/components/MFIsolationAppStorybook/index.js +1 -0
  23. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.d.ts +4 -0
  24. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.js +21 -0
  25. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.d.ts +1 -0
  26. package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.js +1 -0
  27. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/MFAuthAppStorybook.d.ts +5 -0
  28. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/MFAuthAppStorybook.js +44 -0
  29. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/index.d.ts +1 -0
  30. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/index.js +1 -0
  31. package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/types.d.ts +4 -0
  32. package/components/MFIsolationAppStorybook/types.d.ts +31 -0
  33. package/components/MenuActions/constants.d.ts +1 -1
  34. package/components/NoItemSelected/constant.d.ts +1 -1
  35. package/components/Stepper/Stepper.styles.js +17 -14
  36. package/components/Stepper/helpers/getInitialFieldValues/index.d.ts +12 -0
  37. package/components/Stepper/helpers/getInitialFieldValues/index.js +14 -0
  38. package/components/Stepper/helpers/index.d.ts +2 -0
  39. package/components/Stepper/helpers/parseWatchedValues/index.d.ts +17 -0
  40. package/components/Stepper/helpers/parseWatchedValues/index.js +12 -0
  41. package/components/Stepper/hooks/useDynamicValidation/index.d.ts +11 -0
  42. package/components/Stepper/hooks/useDynamicValidation/index.js +69 -0
  43. package/components/Stepper/hooks/useStepperActions/index.js +19 -3
  44. package/components/Stepper/store/StepperStore/index.js +20 -1
  45. package/components/Stepper/subcomponents/StepArea/index.js +45 -25
  46. package/components/Stepper/subcomponents/StepArea/subcomponents/Inidicator/index.js +18 -10
  47. package/components/Stepper/subcomponents/StepperButtons/StepperCancelButton/index.d.ts +2 -1
  48. package/components/Stepper/subcomponents/StepperButtons/StepperCancelButton/index.js +38 -5
  49. package/components/Stepper/subcomponents/StepperButtons/StepperNextButton/index.d.ts +2 -1
  50. package/components/Stepper/subcomponents/StepperButtons/StepperNextButton/index.js +5 -3
  51. package/components/Stepper/subcomponents/StepperButtons/StepperPrevButton/index.d.ts +2 -1
  52. package/components/Stepper/subcomponents/StepperButtons/StepperPrevButton/index.js +5 -3
  53. package/components/Stepper/subcomponents/StepperButtons/StepperSubmitButton/index.d.ts +2 -1
  54. package/components/Stepper/subcomponents/StepperButtons/StepperSubmitButton/index.js +5 -3
  55. package/components/Stepper/subcomponents/StepperContent/subcomponents/Step/index.js +30 -11
  56. package/components/Stepper/subcomponents/StepperFooter/subcomponents/StepperFooterRightActions/index.js +20 -10
  57. package/components/Stepper/types.d.ts +7 -0
  58. package/components/WindowBase/constants.d.ts +1 -1
  59. package/components/extended/React-Json-Viewer/constants.d.ts +1 -1
  60. package/components/extended/React-resizable-panels/SplitLayout.js +1 -1
  61. package/components/formatters/ChipStatusFormatter/constants.d.ts +1 -1
  62. package/components/formatters/EditLabelFormatter/constants.d.ts +1 -1
  63. package/components/formatters/EditLabelFormatter/slots/EditLabelFormatterSlots.d.ts +1 -0
  64. package/components/formatters/EditLabelFormatter/types.d.ts +1 -1
  65. package/components/hook-form/RHFAutocomplete/types.d.ts +1 -1
  66. package/components/hook-form/RHFCheckbox/constants.d.ts +1 -1
  67. package/components/hook-form/RHFSelect/constants.d.ts +1 -1
  68. package/components/hook-form/RHFUpload/RHFUploadSingleFile/constants.d.ts +25 -1
  69. package/components/hook-form/RHFUpload/RHFUploadSingleFile/constants.js +5 -1
  70. package/components/hook-form/RHFormContext/index.d.ts +1 -1
  71. package/components/hook-form/RHFormContext/index.js +14 -2
  72. package/components/index.d.ts +1 -0
  73. package/components/mui_extended/Autocomplete/hooks/useStartAdornments.d.ts +3 -3
  74. package/components/mui_extended/Autocomplete/hooks/useStartAdornments.js +2 -2
  75. package/components/mui_extended/Button/Button.js +15 -4
  76. package/components/mui_extended/Button/ButtonStyles.js +155 -82
  77. package/components/mui_extended/Button/{constans.d.ts → constants.d.ts} +1 -0
  78. package/components/mui_extended/Button/constants.js +8 -0
  79. package/components/mui_extended/Button/slots/ButtonSlots.js +1 -1
  80. package/components/mui_extended/Button/types.d.ts +1 -1
  81. package/components/mui_extended/IconButton/constants.d.ts +1 -1
  82. package/components/mui_extended/IconButton/constants.js +4 -1
  83. package/components/mui_extended/MenuItem/MenuItem.js +1 -1
  84. package/components/mui_extended/MenuItem/constants.d.ts +1 -1
  85. package/components/mui_extended/NavLink/constants.d.ts +1 -1
  86. package/components/mui_extended/Select/Select.js +2 -2
  87. package/components/mui_extended/Select/constants.d.ts +1 -1
  88. package/components/mui_extended/TextField/constants.d.ts +1 -1
  89. package/components/mui_extended/Tooltip/Tooltip.styles.js +8 -1
  90. package/components/mui_extended/Tooltip/constants.d.ts +1 -1
  91. package/components/mui_extended/Typography/constants.d.ts +1 -1
  92. package/index.js +12 -10
  93. package/package.json +1 -1
  94. package/utils/getComponentSlotRoot.d.ts +3 -1
  95. package/components/mui_extended/Button/constans.js +0 -4
@@ -0,0 +1,12 @@
1
+ function parseWatchedValues(watchValues, fields) {
2
+ if (fields.length === 1) {
3
+ return { [fields[0]]: watchValues };
4
+ }
5
+ return fields.reduce((acc, field, index) => {
6
+ acc[field] = Array.isArray(watchValues) ? watchValues[index] : watchValues;
7
+ return acc;
8
+ }, {});
9
+ }
10
+ export {
11
+ parseWatchedValues as p
12
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hook que simula validación onChange de campos específicos del Stepper, manteniendo el formulario en modo onSubmit para preservar el rendimiento.
3
+ * @returns Objeto con funciones para manejar la validación dinámica
4
+ */
5
+ export declare function useDynamicValidation(): {
6
+ activateFieldsValidation: (fields: string[], skipIfValidating?: boolean) => void;
7
+ clearAllValidation: () => void;
8
+ activeFields: string[];
9
+ startExternalValidation: () => void;
10
+ endExternalValidation: () => void;
11
+ };
@@ -0,0 +1,69 @@
1
+ import { useState, useRef, useEffect, useCallback } from "react";
2
+ import { useFormContext, useWatch } from "react-hook-form";
3
+ import { p as parseWatchedValues } from "../../helpers/parseWatchedValues/index.js";
4
+ import { g as getInitialFieldValues } from "../../helpers/getInitialFieldValues/index.js";
5
+ function useDynamicValidation() {
6
+ const { trigger, getValues } = useFormContext();
7
+ const [activeFields, setActiveFields] = useState([]);
8
+ const [isValidating, setIsValidating] = useState(false);
9
+ const statusLoad = useWatch({
10
+ name: "statusLoad"
11
+ });
12
+ const watchValues = useWatch({
13
+ name: activeFields.length > 0 ? activeFields : ["__dummy__"]
14
+ });
15
+ const lastValuesRef = useRef({});
16
+ useEffect(() => {
17
+ if (activeFields.length === 0 || statusLoad !== "ready" || isValidating) {
18
+ return;
19
+ }
20
+ const currentValues = parseWatchedValues(watchValues, activeFields);
21
+ const changedFields = activeFields.filter((field) => {
22
+ const currentValue = currentValues[field];
23
+ const lastValue = lastValuesRef.current[field];
24
+ const hasChanged = JSON.stringify(currentValue) !== JSON.stringify(lastValue);
25
+ if (hasChanged) {
26
+ lastValuesRef.current[field] = currentValue;
27
+ }
28
+ return hasChanged;
29
+ });
30
+ if (changedFields.length > 0) {
31
+ const timeoutId = setTimeout(() => {
32
+ trigger(changedFields);
33
+ }, 100);
34
+ return () => clearTimeout(timeoutId);
35
+ }
36
+ }, [activeFields, trigger, watchValues, statusLoad, isValidating]);
37
+ const startExternalValidation = useCallback(() => {
38
+ setIsValidating(true);
39
+ }, []);
40
+ const endExternalValidation = useCallback(() => {
41
+ setIsValidating(false);
42
+ }, []);
43
+ const activateFieldsValidation = useCallback(
44
+ (fields, skipIfValidating = true) => {
45
+ if (skipIfValidating && isValidating) {
46
+ return;
47
+ }
48
+ const formValues = getValues();
49
+ setActiveFields(fields);
50
+ const initialValues = getInitialFieldValues(formValues, fields);
51
+ lastValuesRef.current = initialValues;
52
+ },
53
+ [getValues, isValidating]
54
+ );
55
+ const clearAllValidation = useCallback(() => {
56
+ setActiveFields([]);
57
+ lastValuesRef.current = {};
58
+ }, []);
59
+ return {
60
+ activateFieldsValidation,
61
+ clearAllValidation,
62
+ activeFields,
63
+ startExternalValidation,
64
+ endExternalValidation
65
+ };
66
+ }
67
+ export {
68
+ useDynamicValidation as u
69
+ };
@@ -2,8 +2,10 @@ import { useCallback } from "react";
2
2
  import { u as useStepper } from "../useStepper/index.js";
3
3
  import { useFormContext } from "react-hook-form";
4
4
  import { shallow } from "zustand/shallow";
5
+ import { u as useDynamicValidation } from "../useDynamicValidation/index.js";
5
6
  function useStepperActions() {
6
7
  const { trigger, clearErrors, getValues, reset } = useFormContext();
8
+ const { activateFieldsValidation, clearAllValidation } = useDynamicValidation();
7
9
  const {
8
10
  nextStep,
9
11
  prevStep,
@@ -41,9 +43,20 @@ function useStepperActions() {
41
43
  if (fieldsToValidate.length === 0) {
42
44
  return true;
43
45
  }
44
- return await trigger(fieldsToValidate);
46
+ const result = await trigger(fieldsToValidate);
47
+ if (!result) {
48
+ activateFieldsValidation(fieldsToValidate);
49
+ }
50
+ return result;
45
51
  };
46
52
  const success = await nextStep(validateFn, formData);
53
+ if (success) {
54
+ const currentStepData = steps[currentStep - 1];
55
+ const fieldsJustValidated = currentStepData?.validationFields || [];
56
+ if (fieldsJustValidated.length > 0) {
57
+ clearAllValidation();
58
+ }
59
+ }
47
60
  if (success && futureFields.length > 0) {
48
61
  clearErrors(futureFields);
49
62
  setTimeout(() => {
@@ -62,13 +75,16 @@ function useStepperActions() {
62
75
  steps,
63
76
  currentStep,
64
77
  trigger,
65
- getValues
78
+ getValues,
79
+ activateFieldsValidation,
80
+ clearAllValidation
66
81
  ]);
67
82
  const cancelAction = useCallback(() => {
68
83
  reset();
69
84
  clearErrors();
85
+ clearAllValidation();
70
86
  resetStepper();
71
- }, [reset, clearErrors, resetStepper]);
87
+ }, [reset, clearErrors, clearAllValidation, resetStepper]);
72
88
  return { prevStepAction, nextStepAction, cancelAction };
73
89
  }
74
90
  export {
@@ -35,6 +35,18 @@ const createStepperStore = (initProps, storeDevtoolsEnabled = false) => {
35
35
  if (!preserveStepValidationStatus) {
36
36
  state.stepValidationStatus = {};
37
37
  }
38
+ if (!preserveStepValidationStatus) {
39
+ const firstVisibleStepIndex = findNextVisibleValidStep(
40
+ -1,
41
+ // Comenzar desde -1 para encontrar el primer step visible
42
+ steps,
43
+ {},
44
+ state.visibilityData
45
+ );
46
+ if (firstVisibleStepIndex !== 0 && firstVisibleStepIndex < steps.length) {
47
+ state.currentStep = firstVisibleStepIndex;
48
+ }
49
+ }
38
50
  });
39
51
  },
40
52
  /**
@@ -114,9 +126,16 @@ const createStepperStore = (initProps, storeDevtoolsEnabled = false) => {
114
126
  */
115
127
  resetStepper: () => {
116
128
  set((state) => {
117
- state.currentStep = 0;
118
129
  state.stepValidationStatus = {};
119
130
  state.isValidating = false;
131
+ const firstVisibleStepIndex = findNextVisibleValidStep(
132
+ -1,
133
+ // Comenzar desde -1 para encontrar el primer step visible
134
+ state.steps,
135
+ {},
136
+ state.visibilityData
137
+ );
138
+ state.currentStep = firstVisibleStepIndex < state.steps.length ? firstVisibleStepIndex : 0;
120
139
  });
121
140
  }
122
141
  }
@@ -5,10 +5,16 @@ import { u as useStepper } from "../../hooks/useStepper/index.js";
5
5
  import { e as StepAreaStyled, f as StepStyled, g as StepNameStyled } from "../../slots/StepperSlot.js";
6
6
  import { I as Indicator } from "./subcomponents/Inidicator/index.js";
7
7
  import { shallow } from "zustand/shallow";
8
+ import { u as useDynamicValidation } from "../../hooks/useDynamicValidation/index.js";
8
9
  import { e as evaluateVisibilityStepCondition } from "../../helpers/evaluateVisibilityStepCondition/index.js";
9
10
  function StepArea() {
10
11
  const { trigger, clearErrors } = useFormContext();
11
12
  const formValues = useWatch();
13
+ const {
14
+ activateFieldsValidation,
15
+ startExternalValidation,
16
+ endExternalValidation
17
+ } = useDynamicValidation();
12
18
  const {
13
19
  currentStep,
14
20
  steps,
@@ -32,16 +38,19 @@ function StepArea() {
32
38
  }),
33
39
  shallow
34
40
  );
35
- const validSteps = useMemo(() => {
36
- return steps;
37
- }, [steps]);
41
+ const allSteps = steps;
42
+ const visibleSteps = useMemo(() => {
43
+ return steps.filter(
44
+ (step) => evaluateVisibilityStepCondition(step, formValues || {}, visibilityData)
45
+ );
46
+ }, [steps, formValues, visibilityData]);
38
47
  const ownerState = {
39
48
  visibleTitle,
40
49
  orientation,
41
- totalSteps: validSteps.length
50
+ totalSteps: visibleSteps.length
42
51
  };
43
52
  const handleStepClick = async (targetIndex) => {
44
- const currentIndex = validSteps.findIndex(
53
+ const currentIndex = visibleSteps.findIndex(
45
54
  (step) => step.key === steps[currentStep].key
46
55
  );
47
56
  if (targetIndex === currentIndex) {
@@ -49,7 +58,7 @@ function StepArea() {
49
58
  }
50
59
  const isNavigatingForward = targetIndex > currentIndex;
51
60
  const targetOriginalIndex = steps.findIndex(
52
- (s) => s.key === validSteps[targetIndex].key
61
+ (s) => s.key === visibleSteps[targetIndex].key
53
62
  );
54
63
  if (!isNavigatingForward) {
55
64
  setCurrentStep(targetOriginalIndex);
@@ -58,37 +67,43 @@ function StepArea() {
58
67
  const isSkippingSteps = targetIndex > currentIndex + 1;
59
68
  if (isSkippingSteps) {
60
69
  for (let i = currentIndex; i < targetIndex; i++) {
61
- const step = validSteps[i];
70
+ const step = visibleSteps[i];
62
71
  const stepOriginalIndex = steps.findIndex((s) => s.key === step.key);
72
+ startExternalValidation();
63
73
  const isValid = await trigger(step.validationFields);
74
+ endExternalValidation();
64
75
  if (!isValid) {
65
76
  setCurrentStep(stepOriginalIndex);
66
77
  setStepValidationStatus(stepOriginalIndex, false);
78
+ activateFieldsValidation(step.validationFields || []);
67
79
  return;
68
80
  }
69
81
  setStepValidationStatus(stepOriginalIndex, true);
70
82
  }
71
83
  } else {
72
- const currentStepData = validSteps[currentIndex];
84
+ const currentStepData = visibleSteps[currentIndex];
73
85
  const currentStepOriginalIndex = steps.findIndex(
74
86
  (s) => s.key === currentStepData.key
75
87
  );
88
+ startExternalValidation();
76
89
  const isCurrentValid = await trigger(currentStepData.validationFields);
90
+ endExternalValidation();
77
91
  if (!isCurrentValid) {
78
92
  setStepValidationStatus(currentStepOriginalIndex, false);
93
+ activateFieldsValidation(currentStepData.validationFields || []);
79
94
  return;
80
95
  }
81
96
  setStepValidationStatus(currentStepOriginalIndex, true);
82
97
  }
83
98
  setCurrentStep(targetOriginalIndex);
84
99
  if (isNavigatingForward) {
85
- const currentStepData = validSteps[currentIndex];
100
+ const currentStepData = visibleSteps[currentIndex];
86
101
  const currentStepOriginalIndex = steps.findIndex(
87
102
  (s) => s.key === currentStepData.key
88
103
  );
89
104
  const isCurrentStepValid = stepValidationStatus[currentStepOriginalIndex] !== false;
90
105
  if (isCurrentStepValid) {
91
- const targetStep = validSteps[targetIndex];
106
+ const targetStep = visibleSteps[targetIndex];
92
107
  const targetStepFields = targetStep.validationFields || [];
93
108
  if (targetStepFields.length > 0) {
94
109
  clearErrors(targetStepFields);
@@ -100,25 +115,24 @@ function StepArea() {
100
115
  }
101
116
  }
102
117
  };
103
- return /* @__PURE__ */ jsx(StepAreaStyled, { ownerState, "data-testid": "stepper-step-area", children: validSteps.map((step, validIndex) => {
104
- const originalIndex = steps.findIndex((s) => s.key === step.key);
105
- const totalVisibleSteps = validSteps.filter(
106
- (s) => evaluateVisibilityStepCondition(s, formValues || {}, visibilityData)
107
- ).length;
118
+ return /* @__PURE__ */ jsx(StepAreaStyled, { ownerState, children: allSteps.map((step, originalIndex) => {
119
+ const isStepVisible = evaluateVisibilityStepCondition(
120
+ step,
121
+ formValues || {},
122
+ visibilityData
123
+ );
124
+ const visibleStepIndex = isStepVisible ? visibleSteps.findIndex((visStep) => visStep.key === step.key) : -1;
108
125
  return /* @__PURE__ */ jsxs(
109
126
  StepStyled,
110
127
  {
111
128
  role: "button",
112
- onClick: () => handleStepClick(validIndex),
129
+ onClick: () => isStepVisible ? handleStepClick(visibleStepIndex) : void 0,
113
130
  ownerState: {
114
131
  ...ownerState,
115
132
  currentStep,
116
- step: validIndex,
117
- isStepVisible: evaluateVisibilityStepCondition(
118
- step,
119
- formValues || {},
120
- visibilityData
121
- )
133
+ step: visibleStepIndex,
134
+ // Usa el índice en la secuencia visible
135
+ isStepVisible
122
136
  },
123
137
  "data-testid": `stepper-step-${step.key}`,
124
138
  children: [
@@ -126,7 +140,13 @@ function StepArea() {
126
140
  StepNameStyled,
127
141
  {
128
142
  variant: "body",
129
- ownerState: { ...ownerState, currentStep, step: validIndex },
143
+ ownerState: {
144
+ ...ownerState,
145
+ currentStep,
146
+ step: visibleStepIndex,
147
+ originalStepIndex: originalIndex,
148
+ isStepVisible
149
+ },
130
150
  children: step.title
131
151
  }
132
152
  ),
@@ -134,8 +154,8 @@ function StepArea() {
134
154
  Indicator,
135
155
  {
136
156
  currentStep,
137
- step: validIndex,
138
- totalSteps: totalVisibleSteps,
157
+ step: visibleStepIndex,
158
+ totalSteps: visibleSteps.length,
139
159
  originalStepIndex: originalIndex
140
160
  }
141
161
  )
@@ -21,15 +21,6 @@ function Indicator(props) {
21
21
  );
22
22
  const { host_static_assets, environment_assets } = useEnvironment();
23
23
  const { currentSize } = useComponentSize(size);
24
- const ownerState = {
25
- size: currentSize,
26
- currentStep,
27
- step,
28
- totalSteps,
29
- orientation,
30
- indicatorType,
31
- stepValidationStatus
32
- };
33
24
  const isMobile = useIsMobile();
34
25
  const effectiveIndicatorType = useMemo(() => {
35
26
  return isMobile ? "dot" : indicatorType;
@@ -45,6 +36,20 @@ function Indicator(props) {
45
36
  hasBeenValidated: validated
46
37
  };
47
38
  }, [currentStep, originalStepIndex, stepValidationStatus]);
39
+ const ownerState = {
40
+ size: currentSize,
41
+ currentStep,
42
+ step,
43
+ totalSteps,
44
+ orientation,
45
+ indicatorType,
46
+ stepValidationStatus,
47
+ originalStepIndex,
48
+ isCompleted,
49
+ isCurrent: currentStep === originalStepIndex,
50
+ isValidStep,
51
+ hasBeenValidated
52
+ };
48
53
  return /* @__PURE__ */ jsx(IndicatorStyled, { ownerState, children: hasBeenValidated && !isValidStep ? (
49
54
  // Mostrar error solo si ha sido validado y es inválido
50
55
  /* @__PURE__ */ jsx(
@@ -67,7 +72,10 @@ function Indicator(props) {
67
72
  )
68
73
  ) : (
69
74
  // Mostrar estado normal (número o dot) para pasos no validados o actuales
70
- /* @__PURE__ */ jsx(TextNumberStyled, { variant: "body", ownerState: { currentStep, step }, children: effectiveIndicatorType === "number" ? step + 1 : /* @__PURE__ */ jsx(
75
+ /* @__PURE__ */ jsx(TextNumberStyled, { variant: "body", ownerState, children: effectiveIndicatorType === "number" ? (
76
+ // Solo mostrar número si el step es visible (step >= 0)
77
+ step >= 0 ? step + 1 : ""
78
+ ) : /* @__PURE__ */ jsx(
71
79
  Icon,
72
80
  {
73
81
  src: `${host_static_assets}/${environment_assets}/${currentStep === originalStepIndex ? pathIcons.dotSelected : pathIcons.dotOutline}`,
@@ -1,4 +1,5 @@
1
+ import { StepperButtonProps } from '../../../types';
1
2
  /**
2
3
  * Botón modular para cancelar el proceso del Stepper
3
4
  */
4
- export declare function StepperCancelButton(): import("react/jsx-runtime").JSX.Element;
5
+ export declare function StepperCancelButton(props: StepperButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -1,22 +1,55 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import { useCallback } from "react";
3
+ import { useFormContext, useFormState } from "react-hook-form";
2
4
  import { u as useStepperActions } from "../../../hooks/useStepperActions/index.js";
3
- import { D as DICTIONARY } from "../../../dictionary.js";
5
+ import { D as DICTIONARY$1 } from "../../../dictionary.js";
6
+ import { D as DICTIONARY } from "../../../../CommonActions/dictionary.js";
4
7
  import { useModuleDictionary } from "@m4l/core";
8
+ import { u as useModal } from "../../../../../hooks/useModal/index.js";
9
+ import { u as useWindowToolsMF } from "../../../../WindowBase/hooks/useWindowToolsMF/index.js";
10
+ import { W as WindowConfirm } from "../../../../WindowConfirm/WindowConfirm.js";
5
11
  import { B as Button } from "../../../../mui_extended/Button/Button.js";
6
- function StepperCancelButton() {
12
+ function StepperCancelButton(props) {
13
+ const { label, ...rest } = props;
7
14
  const { getLabel } = useModuleDictionary();
8
15
  const { cancelAction } = useStepperActions();
9
- const handleCancel = () => {
16
+ const { openModal } = useModal();
17
+ const { close: closeWindow } = useWindowToolsMF();
18
+ const { control } = useFormContext();
19
+ const { isDirty } = useFormState({
20
+ control
21
+ });
22
+ const onConfirmQuit = useCallback(() => {
10
23
  cancelAction();
11
- };
24
+ closeWindow();
25
+ }, [cancelAction, closeWindow]);
26
+ const handleCancel = useCallback(() => {
27
+ if (isDirty) {
28
+ openModal({
29
+ window: /* @__PURE__ */ jsx(
30
+ WindowConfirm,
31
+ {
32
+ variant: "warning",
33
+ title: getLabel(DICTIONARY.CONFIRM_QUIT_TITLE),
34
+ msg: getLabel(DICTIONARY.CONFIRM_QUIT_MSG),
35
+ onClickIntro: onConfirmQuit
36
+ }
37
+ ),
38
+ variant: "warning"
39
+ });
40
+ } else {
41
+ onConfirmQuit();
42
+ }
43
+ }, [getLabel, isDirty, openModal, onConfirmQuit]);
12
44
  return /* @__PURE__ */ jsx(
13
45
  Button,
14
46
  {
15
47
  type: "button",
16
- label: getLabel(DICTIONARY.LABEL_CANCEL_BUTTON),
48
+ label: label || getLabel(DICTIONARY$1.LABEL_CANCEL_BUTTON),
17
49
  variant: "outlined",
18
50
  color: "default",
19
51
  onClick: handleCancel,
52
+ ...rest,
20
53
  "data-testid": "stepper-cancel-button"
21
54
  }
22
55
  );
@@ -1,4 +1,5 @@
1
+ import { StepperButtonProps } from '../../../types';
1
2
  /**
2
3
  * Botón modular para avanzar al siguiente step del Stepper
3
4
  */
4
- export declare function StepperNextButton(): import("react/jsx-runtime").JSX.Element;
5
+ export declare function StepperNextButton(props: StepperButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -6,7 +6,8 @@ import { D as DICTIONARY } from "../../../dictionary.js";
6
6
  import { useModuleDictionary, useEnvironment } from "@m4l/core";
7
7
  import { I as IconButton } from "../../../../mui_extended/IconButton/IconButton.js";
8
8
  import { B as Button } from "../../../../mui_extended/Button/Button.js";
9
- function StepperNextButton() {
9
+ function StepperNextButton(props) {
10
+ const { label, ...rest } = props;
10
11
  const { nextStepAction } = useStepperActions();
11
12
  const isMobile = useIsMobile();
12
13
  const { getLabel } = useModuleDictionary();
@@ -28,12 +29,13 @@ function StepperNextButton() {
28
29
  Button,
29
30
  {
30
31
  type: "button",
31
- label: getLabel(DICTIONARY.LABEL_NEXT_BUTTON),
32
+ label: label || getLabel(DICTIONARY.LABEL_NEXT_BUTTON),
32
33
  variant: "contained",
33
34
  color: "primary",
34
35
  onClick: handleNext,
35
36
  endIcon: `${host_static_assets}/${environment_assets}/${pathIcons.arrowRight}`,
36
- "data-testid": "stepper-next-button"
37
+ "data-testid": "stepper-next-button",
38
+ ...rest
37
39
  }
38
40
  );
39
41
  }
@@ -1,4 +1,5 @@
1
+ import { StepperButtonProps } from '../../../types';
1
2
  /**
2
3
  * Botón modular para ir al step anterior del Stepper
3
4
  */
4
- export declare function StepperPrevButton(): import("react/jsx-runtime").JSX.Element | null;
5
+ export declare function StepperPrevButton(props: StepperButtonProps): import("react/jsx-runtime").JSX.Element | null;
@@ -7,7 +7,8 @@ import { useIsMobile } from "@m4l/graphics";
7
7
  import { D as DICTIONARY } from "../../../dictionary.js";
8
8
  import { I as IconButton } from "../../../../mui_extended/IconButton/IconButton.js";
9
9
  import { B as Button } from "../../../../mui_extended/Button/Button.js";
10
- function StepperPrevButton() {
10
+ function StepperPrevButton(props) {
11
+ const { label, ...rest } = props;
11
12
  const { currentStep } = useStepper((state) => ({
12
13
  currentStep: state.currentStep
13
14
  }));
@@ -35,12 +36,13 @@ function StepperPrevButton() {
35
36
  Button,
36
37
  {
37
38
  type: "button",
38
- label: !isMobile ? getLabel(DICTIONARY.LABEL_PREV_BUTTON) : "",
39
+ label: label || getLabel(DICTIONARY.LABEL_PREV_BUTTON),
39
40
  variant: "outlined",
40
41
  color: "default",
41
42
  onClick: handlePrev,
42
43
  startIcon: `${host_static_assets}/${environment_assets}/${pathIcons.arrowLeft}`,
43
- "data-testid": "stepper-prev-button"
44
+ "data-testid": "stepper-prev-button",
45
+ ...rest
44
46
  }
45
47
  );
46
48
  }
@@ -1,4 +1,5 @@
1
+ import { StepperButtonProps } from '../../../types';
1
2
  /**
2
3
  * Botón modular para finalizar el Stepper y ejecutar onFinalSubmit
3
4
  */
4
- export declare function StepperSubmitButton(): import("react/jsx-runtime").JSX.Element;
5
+ export declare function StepperSubmitButton(props: StepperButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -2,16 +2,18 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { D as DICTIONARY } from "../../../dictionary.js";
3
3
  import { useModuleDictionary } from "@m4l/core";
4
4
  import { B as Button } from "../../../../mui_extended/Button/Button.js";
5
- function StepperSubmitButton() {
5
+ function StepperSubmitButton(props) {
6
+ const { label, ...rest } = props;
6
7
  const { getLabel } = useModuleDictionary();
7
8
  return /* @__PURE__ */ jsx(
8
9
  Button,
9
10
  {
10
11
  type: "submit",
11
- label: getLabel(DICTIONARY.LABEL_SUBMIT_BUTTON),
12
+ label: label || getLabel(DICTIONARY.LABEL_SUBMIT_BUTTON),
12
13
  variant: "contained",
13
14
  color: "primary",
14
- "data-testid": "stepper-submit-button"
15
+ "data-testid": "stepper-submit-button",
16
+ ...rest
15
17
  }
16
18
  );
17
19
  }
@@ -12,28 +12,47 @@ function Step(props) {
12
12
  steps: state.steps,
13
13
  visibilityData: state.visibilityData
14
14
  }));
15
- const currentStepConfig = useMemo(() => {
16
- return steps[currentStep];
17
- }, [steps, currentStep]);
18
15
  const stepConfig = useMemo(() => {
19
16
  return steps.find((step) => step.key === stepKey);
20
17
  }, [steps, stepKey]);
21
18
  const isStepVisible = useMemo(() => {
22
- if (!currentStepConfig) {
23
- return false;
24
- }
25
- if (stepKey !== currentStepConfig.key) {
19
+ if (!stepConfig) {
26
20
  return false;
27
21
  }
28
- if (stepConfig && !evaluateVisibilityStepCondition(
22
+ const meetsVisibilityCondition = evaluateVisibilityStepCondition(
29
23
  stepConfig,
30
24
  formValues || {},
31
25
  visibilityData
32
- )) {
26
+ );
27
+ if (!meetsVisibilityCondition) {
28
+ return false;
29
+ }
30
+ const currentStepConfig = steps[currentStep];
31
+ if (!currentStepConfig) {
32
+ return false;
33
+ }
34
+ if (evaluateVisibilityStepCondition(currentStepConfig, formValues || {}, visibilityData)) {
35
+ return stepKey === currentStepConfig.key;
36
+ }
37
+ const visibleStepsUpToCurrent = [];
38
+ for (let i = 0; i <= currentStep; i++) {
39
+ const step = steps[i];
40
+ if (evaluateVisibilityStepCondition(step, formValues || {}, visibilityData)) {
41
+ visibleStepsUpToCurrent.push(step);
42
+ }
43
+ }
44
+ if (visibleStepsUpToCurrent.length === 0) {
45
+ for (let i = currentStep + 1; i < steps.length; i++) {
46
+ const step = steps[i];
47
+ if (evaluateVisibilityStepCondition(step, formValues || {}, visibilityData)) {
48
+ return stepKey === step.key;
49
+ }
50
+ }
33
51
  return false;
34
52
  }
35
- return true;
36
- }, [currentStepConfig, stepKey, stepConfig, formValues, visibilityData]);
53
+ const activeVisibleStep = visibleStepsUpToCurrent[visibleStepsUpToCurrent.length - 1];
54
+ return stepKey === activeVisibleStep.key;
55
+ }, [currentStep, stepKey, stepConfig, steps, formValues, visibilityData]);
37
56
  return /* @__PURE__ */ jsx(StepContentStyled, { ownerState: { isStepVisible }, children });
38
57
  }
39
58
  export {