@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.
- package/components/Card/constants.d.ts +1 -1
- package/components/Chip/constants.d.ts +1 -1
- package/components/ContainerFlow/constants.d.ts +1 -1
- package/components/DataGrid/subcomponents/editors/EditLabelEditor/formatter.d.ts +8 -0
- package/components/DataGrid/subcomponents/editors/EditLabelEditor/index.d.ts +3 -0
- package/components/DataGrid/subcomponents/editors/EditLabelEditor/types.d.ts +5 -0
- package/components/DataGrid/subcomponents/editors/EditLabelEditor/useColumnEditLabel.d.ts +9 -0
- package/components/DataGrid/tests/helpers/types.d.ts +2 -0
- package/components/EditLabel/constants.d.ts +1 -1
- package/components/EditLabel/slots/EditLabelEnum.d.ts +1 -0
- package/components/EditLabel/slots/EditLabelSlots.d.ts +3 -0
- package/components/EditLabel/types.d.ts +2 -2
- package/components/FormContainer/constants.d.ts +1 -1
- package/components/Image/constant.d.ts +1 -1
- package/components/ImageText/constants.d.ts +1 -1
- package/components/MFIsolationAppStorybook/MFIsolationAppStorybook.d.ts +5 -0
- package/components/MFIsolationAppStorybook/MFIsolationAppStorybook.js +154 -0
- package/components/MFIsolationAppStorybook/constants.d.ts +1 -0
- package/components/MFIsolationAppStorybook/icons.d.ts +3 -0
- package/components/MFIsolationAppStorybook/icons.js +6 -0
- package/components/MFIsolationAppStorybook/index.d.ts +1 -0
- package/components/MFIsolationAppStorybook/index.js +1 -0
- package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.d.ts +4 -0
- package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/AppBarSettings.js +21 -0
- package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.d.ts +1 -0
- package/components/MFIsolationAppStorybook/subcomponents/AppBarSettings/index.js +1 -0
- package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/MFAuthAppStorybook.d.ts +5 -0
- package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/MFAuthAppStorybook.js +44 -0
- package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/index.d.ts +1 -0
- package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/index.js +1 -0
- package/components/MFIsolationAppStorybook/subcomponents/MFAuthAppStorybook/types.d.ts +4 -0
- package/components/MFIsolationAppStorybook/types.d.ts +31 -0
- package/components/MenuActions/constants.d.ts +1 -1
- package/components/NoItemSelected/constant.d.ts +1 -1
- package/components/Stepper/Stepper.styles.js +17 -14
- package/components/Stepper/helpers/getInitialFieldValues/index.d.ts +12 -0
- package/components/Stepper/helpers/getInitialFieldValues/index.js +14 -0
- package/components/Stepper/helpers/index.d.ts +2 -0
- package/components/Stepper/helpers/parseWatchedValues/index.d.ts +17 -0
- package/components/Stepper/helpers/parseWatchedValues/index.js +12 -0
- package/components/Stepper/hooks/useDynamicValidation/index.d.ts +11 -0
- package/components/Stepper/hooks/useDynamicValidation/index.js +69 -0
- package/components/Stepper/hooks/useStepperActions/index.js +19 -3
- package/components/Stepper/store/StepperStore/index.js +20 -1
- package/components/Stepper/subcomponents/StepArea/index.js +45 -25
- package/components/Stepper/subcomponents/StepArea/subcomponents/Inidicator/index.js +18 -10
- package/components/Stepper/subcomponents/StepperButtons/StepperCancelButton/index.d.ts +2 -1
- package/components/Stepper/subcomponents/StepperButtons/StepperCancelButton/index.js +38 -5
- package/components/Stepper/subcomponents/StepperButtons/StepperNextButton/index.d.ts +2 -1
- package/components/Stepper/subcomponents/StepperButtons/StepperNextButton/index.js +5 -3
- package/components/Stepper/subcomponents/StepperButtons/StepperPrevButton/index.d.ts +2 -1
- package/components/Stepper/subcomponents/StepperButtons/StepperPrevButton/index.js +5 -3
- package/components/Stepper/subcomponents/StepperButtons/StepperSubmitButton/index.d.ts +2 -1
- package/components/Stepper/subcomponents/StepperButtons/StepperSubmitButton/index.js +5 -3
- package/components/Stepper/subcomponents/StepperContent/subcomponents/Step/index.js +30 -11
- package/components/Stepper/subcomponents/StepperFooter/subcomponents/StepperFooterRightActions/index.js +20 -10
- package/components/Stepper/types.d.ts +7 -0
- package/components/WindowBase/constants.d.ts +1 -1
- package/components/extended/React-Json-Viewer/constants.d.ts +1 -1
- package/components/extended/React-resizable-panels/SplitLayout.js +1 -1
- package/components/formatters/ChipStatusFormatter/constants.d.ts +1 -1
- package/components/formatters/EditLabelFormatter/constants.d.ts +1 -1
- package/components/formatters/EditLabelFormatter/slots/EditLabelFormatterSlots.d.ts +1 -0
- package/components/formatters/EditLabelFormatter/types.d.ts +1 -1
- package/components/hook-form/RHFAutocomplete/types.d.ts +1 -1
- package/components/hook-form/RHFCheckbox/constants.d.ts +1 -1
- package/components/hook-form/RHFSelect/constants.d.ts +1 -1
- package/components/hook-form/RHFUpload/RHFUploadSingleFile/constants.d.ts +25 -1
- package/components/hook-form/RHFUpload/RHFUploadSingleFile/constants.js +5 -1
- package/components/hook-form/RHFormContext/index.d.ts +1 -1
- package/components/hook-form/RHFormContext/index.js +14 -2
- package/components/index.d.ts +1 -0
- package/components/mui_extended/Autocomplete/hooks/useStartAdornments.d.ts +3 -3
- package/components/mui_extended/Autocomplete/hooks/useStartAdornments.js +2 -2
- package/components/mui_extended/Button/Button.js +15 -4
- package/components/mui_extended/Button/ButtonStyles.js +155 -82
- package/components/mui_extended/Button/{constans.d.ts → constants.d.ts} +1 -0
- package/components/mui_extended/Button/constants.js +8 -0
- package/components/mui_extended/Button/slots/ButtonSlots.js +1 -1
- package/components/mui_extended/Button/types.d.ts +1 -1
- package/components/mui_extended/IconButton/constants.d.ts +1 -1
- package/components/mui_extended/IconButton/constants.js +4 -1
- package/components/mui_extended/MenuItem/MenuItem.js +1 -1
- package/components/mui_extended/MenuItem/constants.d.ts +1 -1
- package/components/mui_extended/NavLink/constants.d.ts +1 -1
- package/components/mui_extended/Select/Select.js +2 -2
- package/components/mui_extended/Select/constants.d.ts +1 -1
- package/components/mui_extended/TextField/constants.d.ts +1 -1
- package/components/mui_extended/Tooltip/Tooltip.styles.js +8 -1
- package/components/mui_extended/Tooltip/constants.d.ts +1 -1
- package/components/mui_extended/Typography/constants.d.ts +1 -1
- package/index.js +12 -10
- package/package.json +1 -1
- package/utils/getComponentSlotRoot.d.ts +3 -1
- 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
|
-
|
|
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
|
|
36
|
-
|
|
37
|
-
|
|
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:
|
|
50
|
+
totalSteps: visibleSteps.length
|
|
42
51
|
};
|
|
43
52
|
const handleStepClick = async (targetIndex) => {
|
|
44
|
-
const currentIndex =
|
|
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 ===
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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(
|
|
129
|
+
onClick: () => isStepVisible ? handleStepClick(visibleStepIndex) : void 0,
|
|
113
130
|
ownerState: {
|
|
114
131
|
...ownerState,
|
|
115
132
|
currentStep,
|
|
116
|
-
step:
|
|
117
|
-
|
|
118
|
-
|
|
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: {
|
|
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:
|
|
138
|
-
totalSteps:
|
|
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
|
|
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
|
|
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:
|
|
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 (!
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
if (stepKey !== currentStepConfig.key) {
|
|
19
|
+
if (!stepConfig) {
|
|
26
20
|
return false;
|
|
27
21
|
}
|
|
28
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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 {
|