@m4l/components 9.3.19 → 9.3.21-JAEBeta.0
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/@types/types.d.ts +1 -1
- package/components/Chip/Chip.js +9 -7
- package/components/Chip/ChipStyles.js +4 -31
- package/components/Chip/helpers.d.ts +10 -0
- package/components/Chip/helpers.js +34 -0
- package/components/Chip/types.d.ts +6 -0
- package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettings/index.js +1 -1
- package/components/DragResizeWindowRND/DragResizeWindowRND.js +14 -10
- package/components/DragResizeWindowRND/helpers/expandingParentContainer.d.ts +1 -1
- package/components/DragResizeWindowRND/helpers/expandingParentContainer.js +24 -19
- package/components/DragResizeWindowRND/helpers/getInitialSize.d.ts +3 -3
- package/components/DragResizeWindowRND/helpers/getInitialSize.js +18 -15
- package/components/DragResizeWindowRND/helpers/shrinkingParentContainer.d.ts +1 -1
- package/components/DragResizeWindowRND/helpers/shrinkingParentContainer.js +17 -9
- package/components/DragResizeWindowRND/hooks/useRNDDimensionEffects.js +4 -1
- package/components/DragResizeWindowRND/index.d.ts +1 -0
- package/components/DragResizeWindowRND/types.d.ts +12 -2
- package/components/DynamicFilter/DynamicFilter.js +2 -1
- package/components/DynamicFilter/helpers/frontEndHelpers.d.ts +2 -2
- package/components/DynamicFilter/helpers/frontEndHelpers.js +31 -9
- package/components/DynamicFilter/subcomponents/DynamicFilterBase/DynamicFilterBase.d.ts +2 -1
- package/components/DynamicFilter/subcomponents/DynamicFilterBase/DynamicFilterBase.js +4 -2
- package/components/DynamicFilter/subcomponents/DynamicFilterBase/types.d.ts +3 -0
- package/components/DynamicFilter/subcomponents/PopoverFilter/PopoverFilter.js +1 -1
- package/components/DynamicFilter/types.d.ts +4 -0
- package/components/DynamicSort/DynamicSort.js +2 -1
- package/components/DynamicSort/subcomponents/DynamicSortBase/DynamicSortBase.d.ts +2 -1
- package/components/DynamicSort/subcomponents/DynamicSortBase/DynamicSortBase.js +4 -2
- package/components/DynamicSort/subcomponents/DynamicSortBase/types.d.ts +3 -0
- package/components/DynamicSort/subcomponents/PopoverSort/PopoverSort.js +1 -1
- package/components/DynamicSort/types.d.ts +4 -0
- package/components/Image/Image.js +4 -1
- package/components/MFLoader/MFLoader.js +3 -2
- package/components/MFLoader/types.d.ts +5 -0
- package/components/ObjectLogs/hooks/useDetailFormatter.js +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/WindowBase.js +3 -3
- package/components/WindowBase/WindowBase.styles.js +36 -31
- package/components/WindowBase/constants.d.ts +1 -1
- package/components/WindowBase/constants.js +2 -2
- package/components/WindowBase/index.d.ts +1 -0
- package/components/WindowBase/subcomponents/Component/index.js +2 -2
- package/components/WindowBase/subcomponents/Component/types.d.ts +2 -0
- package/components/WindowBase/subcomponents/Header/HeaderWindowBase.js +7 -7
- package/components/WindowBase/subcomponents/Header/types.d.ts +1 -1
- package/components/WindowBase/subcomponents/MicroFrontend/types.d.ts +2 -0
- package/components/WindowBase/types.d.ts +3 -3
- package/components/WindowConfirm/WindowConfirm.js +1 -1
- package/components/areas/components/AreasViewer/subcomponents/Area/subcomponents/Window/Window.js +3 -1
- package/components/areas/components/AreasViewer/subcomponents/Area/subcomponents/Window/hooks/useWindow.js +17 -2
- package/components/areas/contexts/AreasContext/store.js +2 -2
- package/components/areas/index.d.ts +1 -1
- package/components/areas/types.d.ts +1 -1
- package/components/formatters/DistanceToNowFormatter/DistanceToNowFormatter.js +3 -34
- package/components/formatters/DistanceToNowFormatter/dictionary.d.ts +8 -0
- package/components/formatters/DistanceToNowFormatter/hooks/useDistanceToNowFormatter.d.ts +13 -0
- package/components/formatters/DistanceToNowFormatter/hooks/useDistanceToNowFormatter.js +65 -0
- package/components/formatters/DistanceToNowFormatter/index.d.ts +1 -0
- package/components/formatters/DistanceToNowFormatter/types.d.ts +4 -1
- package/components/hook-form/RHFAutocomplete/RHFAutocomplete.js +5 -1
- package/components/hook-form/RHFAutocomplete/constants.d.ts +1 -0
- package/components/hook-form/RHFAutocomplete/constants.js +5 -1
- package/components/hook-form/RHFAutocompleteAsync/RHFAutocompleteAsync.js +3 -1
- package/components/hook-form/RHFAutocompleteAsync/types.d.ts +4 -0
- package/components/hook-form/RHFormContext/index.d.ts +1 -1
- package/components/hook-form/RHFormContext/index.js +29 -4
- package/components/mui_extended/ToggleIconButton/ToggleIconButton.js +6 -2
- package/components/mui_extended/ToggleIconButton/ToggleIconButton.styles.js +9 -0
- package/components/mui_extended/ToggleIconButton/types.d.ts +1 -0
- package/components/mui_extended/index.d.ts +1 -1
- package/components/popups/components/PopupsProvider/hooks/usePopups.d.ts +2 -2
- package/components/popups/components/PopupsProvider/hooks/usePopups.js +0 -1
- package/components/popups/components/PopupsViewer/PopupsViewer.js +2 -2
- package/components/popups/components/PopupsViewer/subcomponents/Popup/Popup.js +3 -1
- package/components/popups/components/PopupsViewer/types.d.ts +1 -0
- package/hooks/index.d.ts +1 -0
- package/hooks/useSizeContainer/index.d.ts +2 -1
- package/hooks/useSizeContainer/index.js +22 -13
- package/hooks/useSizeContainer/types.d.ts +6 -0
- package/hooks/useStateRef/index.js +4 -4
- package/index.js +45 -38
- package/package.json +1 -1
- package/utils/deepShallow.d.ts +17 -0
- package/utils/deepShallow.js +76 -0
- package/utils/formatDistanceToNow/formatDistanteToNow.d.ts +2 -2
- package/utils/formatDistanceToNow/formatDistanteToNow.js +18 -2
- package/utils/formatDistanceToNow/types.d.ts +13 -0
- package/utils/index.d.ts +1 -0
|
@@ -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 {
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React, { useMemo } from "react";
|
|
2
|
+
import React, { useState, useEffect, useMemo } from "react";
|
|
3
3
|
import { u as useIsLastVisibleValidStep } from "../../../../hooks/useIsLastVisibleValidStep/index.js";
|
|
4
4
|
import { m as StepperFooterRightActionsStyled } from "../../../../slots/StepperSlot.js";
|
|
5
|
-
import { S as StepperNextButton } from "../../../StepperButtons/StepperNextButton/index.js";
|
|
6
5
|
import { S as StepperSubmitButton } from "../../../StepperButtons/StepperSubmitButton/index.js";
|
|
6
|
+
import { S as StepperNextButton } from "../../../StepperButtons/StepperNextButton/index.js";
|
|
7
7
|
function StepperFooterRightActions(props) {
|
|
8
8
|
const { children } = props;
|
|
9
9
|
const isLastVisibleValidStep = useIsLastVisibleValidStep();
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const [hasCustomSubmitButton, setHasCustomSubmitButton] = useState(false);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const hasCustomButton = React.Children.toArray(children).some((child) => {
|
|
13
|
+
if (React.isValidElement(child)) {
|
|
14
|
+
return child.type === StepperSubmitButton;
|
|
15
|
+
}
|
|
16
|
+
return false;
|
|
17
|
+
});
|
|
18
|
+
setHasCustomSubmitButton(hasCustomButton);
|
|
19
|
+
}, [children]);
|
|
20
|
+
const filteredChildren = useMemo(() => {
|
|
14
21
|
return React.Children.toArray(children).filter((child) => {
|
|
15
22
|
if (React.isValidElement(child)) {
|
|
16
|
-
if (child.type ===
|
|
23
|
+
if (!isLastVisibleValidStep && child.type === StepperSubmitButton) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (isLastVisibleValidStep && child.type === StepperNextButton) {
|
|
17
27
|
return false;
|
|
18
28
|
}
|
|
19
29
|
}
|
|
@@ -21,10 +31,10 @@ function StepperFooterRightActions(props) {
|
|
|
21
31
|
});
|
|
22
32
|
}, [children, isLastVisibleValidStep]);
|
|
23
33
|
const submitButton = useMemo(() => {
|
|
24
|
-
return isLastVisibleValidStep ? /* @__PURE__ */ jsx(StepperSubmitButton, {}) : null;
|
|
25
|
-
}, [isLastVisibleValidStep]);
|
|
34
|
+
return isLastVisibleValidStep && !hasCustomSubmitButton ? /* @__PURE__ */ jsx(StepperSubmitButton, {}) : null;
|
|
35
|
+
}, [isLastVisibleValidStep, hasCustomSubmitButton]);
|
|
26
36
|
return /* @__PURE__ */ jsxs(StepperFooterRightActionsStyled, { children: [
|
|
27
|
-
|
|
37
|
+
filteredChildren,
|
|
28
38
|
submitButton
|
|
29
39
|
] });
|
|
30
40
|
}
|
|
@@ -5,6 +5,7 @@ import { ContentAreaSlots, ContentSlots, StepperFooterSlots, StepperSlots } from
|
|
|
5
5
|
import { STEPPER_PREFIX_NAME } from './constants';
|
|
6
6
|
import { M4LOverridesStyleRules } from '../../@types/augmentations';
|
|
7
7
|
import { Step as StepComponent } from './subcomponents/StepperContent/subcomponents/Step';
|
|
8
|
+
import { ButtonProps } from '../mui_extended/Button';
|
|
8
9
|
export type Orientation = 'horizontal' | 'vertical';
|
|
9
10
|
export type IndicatorType = 'number' | 'dot';
|
|
10
11
|
export type FormData = Record<string, string | number | boolean | null | undefined>;
|
|
@@ -145,6 +146,12 @@ export interface StepperFooterProps {
|
|
|
145
146
|
export interface StepperFooterLeftActionsProps {
|
|
146
147
|
children?: ReactNode;
|
|
147
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Props para los botones del Stepper que extienden las props de Button de mui_extended
|
|
151
|
+
*/
|
|
152
|
+
export interface StepperButtonProps extends Omit<ButtonProps, 'label'> {
|
|
153
|
+
label?: string;
|
|
154
|
+
}
|
|
148
155
|
/**
|
|
149
156
|
* Props del StepperFooterRightActions
|
|
150
157
|
*/
|
|
@@ -25,7 +25,7 @@ const WindowBase = (props) => {
|
|
|
25
25
|
windowId,
|
|
26
26
|
onMouseDown,
|
|
27
27
|
editionInfo,
|
|
28
|
-
|
|
28
|
+
emergeType = "layout",
|
|
29
29
|
collapsed,
|
|
30
30
|
draggable = true,
|
|
31
31
|
...other
|
|
@@ -36,7 +36,7 @@ const WindowBase = (props) => {
|
|
|
36
36
|
selected,
|
|
37
37
|
variant: computedVariant,
|
|
38
38
|
size: currentSize,
|
|
39
|
-
|
|
39
|
+
emergeType,
|
|
40
40
|
maximized,
|
|
41
41
|
collapsed,
|
|
42
42
|
draggable
|
|
@@ -61,7 +61,7 @@ const WindowBase = (props) => {
|
|
|
61
61
|
maximized,
|
|
62
62
|
collapsed,
|
|
63
63
|
onClose,
|
|
64
|
-
|
|
64
|
+
emergeType,
|
|
65
65
|
draggable,
|
|
66
66
|
...other
|
|
67
67
|
}
|