Skip to content

Commit 6d09aec

Browse files
committed
fix: use field array to manage extra questions values, disable button if value is not completed
Signed-off-by: Tomás Castillo <tcastilloboireau@gmail.com>
1 parent 87ed418 commit 6d09aec

File tree

1 file changed

+82
-66
lines changed

1 file changed

+82
-66
lines changed

src/components/forms/sponsor-general-form/add-extra-question-popup.js

Lines changed: 82 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useEffect } from "react";
22
import { connect } from "react-redux";
33
import T from "i18n-react/dist/i18n-react";
4-
import { FormikProvider, useFormik } from "formik";
4+
import { FieldArray, FormikProvider, useFormik } from "formik";
55
import * as yup from "yup";
66
import PropTypes from "prop-types";
77
import {
@@ -61,16 +61,16 @@ const AddSponsorExtraQuestionPopup = ({
6161
},
6262
validationSchema: yup.object({
6363
id: yup.number(),
64-
name: yup.string().required(),
65-
label: yup.string().required(),
66-
type: yup.string().required(),
64+
name: yup.string().required(T.translate("validation.required")),
65+
label: yup.string().required(T.translate("validation.required")),
66+
type: yup.string().required(T.translate("validation.required")),
6767
mandatory: yup.boolean(),
6868
placeholder: yup.string(),
6969
max_selected_values: yup.number(),
7070
values: yup.array().of(
7171
yup.object().shape({
72-
value: yup.string().required(),
73-
label: yup.string().required(),
72+
value: yup.string().required(T.translate("validation.required")),
73+
label: yup.string().required(T.translate("validation.required")),
7474
is_default: yup.boolean(),
7575
order: yup.number(),
7676
_shouldSave: yup.boolean()
@@ -111,29 +111,6 @@ const AddSponsorExtraQuestionPopup = ({
111111
}
112112
}, [formik.values]);
113113

114-
const handleAddValue = () => {
115-
const newValue = {
116-
value: "",
117-
label: "",
118-
is_default: false,
119-
_shouldSave: true
120-
};
121-
122-
const updatedValues = [...formik.values.values, newValue];
123-
formik.setFieldValue("values", updatedValues);
124-
};
125-
126-
const handleRemoveValue = async (index) => {
127-
const valueToRemove = formik.values.values[index];
128-
129-
if (valueToRemove.id) {
130-
deleteSponsorExtraQuestionValue(formik.values.id, valueToRemove.id);
131-
}
132-
133-
const updatedValues = formik.values.values.filter((_, i) => i !== index);
134-
formik.setFieldValue("values", updatedValues);
135-
};
136-
137114
const handleValueChange = (index, field, value) => {
138115
if (field === "is_default" && value === true) {
139116
const updatedValues = formik.values.values.map((v, i) => {
@@ -205,7 +182,14 @@ const AddSponsorExtraQuestionPopup = ({
205182
}
206183
};
207184

208-
const renderValueItem = (valueItem, index, provided, snapshot) => (
185+
const areExtraQuestionsIncomplete = () => {
186+
if (formik.errors.values) return true;
187+
return formik.values.values.some(
188+
(eq) => eq.name?.trim() === "" || eq.label?.trim() === ""
189+
);
190+
};
191+
192+
const renderValueItem = (valueItem, index, provided, snapshot, remove) => (
209193
<Grid2
210194
container
211195
spacing={2}
@@ -266,10 +250,16 @@ const AddSponsorExtraQuestionPopup = ({
266250
}}
267251
>
268252
<IconButton
269-
onClick={() => handleRemoveValue(index)}
270-
edge="end"
271-
sx={{ color: "#666" }}
272-
disableRipple
253+
onClick={() => {
254+
const valueToRemove = formik.values.values[index];
255+
if (valueToRemove.id) {
256+
deleteSponsorExtraQuestionValue(
257+
formik.values.id,
258+
valueToRemove.id
259+
);
260+
}
261+
remove(index);
262+
}}
273263
>
274264
<CloseIcon />
275265
</IconButton>
@@ -315,7 +305,12 @@ const AddSponsorExtraQuestionPopup = ({
315305
autoComplete="off"
316306
>
317307
<DialogContent sx={{ p: 1 }}>
318-
<Grid2 container spacing={2} size={12} sx={{ p: 2 }}>
308+
<Grid2
309+
container
310+
spacing={2}
311+
size={12}
312+
sx={{ p: 2, alignItems: "flex-start" }}
313+
>
319314
<Grid2
320315
container
321316
spacing={2}
@@ -438,37 +433,58 @@ const AddSponsorExtraQuestionPopup = ({
438433
</Grid2>
439434
<Grid2 size={2} />
440435
</Grid2>
441-
<Grid2 container spacing={2} size={12}>
442-
<DragAndDropList
443-
items={formik.values.values.sort(
444-
(a, b) => a.order - b.order
445-
)}
446-
onReorder={handleReorder}
447-
renderItem={renderValueItem}
448-
idKey="id"
449-
updateOrderKey="order"
450-
droppableId="sponsor-extra-question-values"
451-
/>
452-
</Grid2>
453-
454-
<Button
455-
variant="text"
456-
startIcon={<AddIcon />}
457-
onClick={handleAddValue}
458-
sx={{
459-
color: "#666",
460-
textTransform: "none",
461-
fontSize: "14px",
462-
fontWeight: 400,
463-
"&:hover": {
464-
backgroundColor: "transparent",
465-
color: "#2196F3"
466-
},
467-
mb: 2
468-
}}
469-
>
470-
{T.translate("edit_sponsor.add_value")}
471-
</Button>
436+
<FieldArray name="values">
437+
{({ push, remove }) => (
438+
<>
439+
<Grid2 container spacing={2} size={12}>
440+
<DragAndDropList
441+
items={formik.values.values.sort(
442+
(a, b) => a.order - b.order
443+
)}
444+
onReorder={handleReorder}
445+
renderItem={(valueItem, index, provided, snapshot) =>
446+
renderValueItem(
447+
valueItem,
448+
index,
449+
provided,
450+
snapshot,
451+
remove
452+
)
453+
}
454+
idKey="id"
455+
updateOrderKey="order"
456+
droppableId="sponsor-extra-question-values"
457+
/>
458+
</Grid2>
459+
<Button
460+
variant="text"
461+
startIcon={<AddIcon />}
462+
onClick={() =>
463+
push({
464+
value: "",
465+
label: "",
466+
is_default: false,
467+
_shouldSave: true
468+
})
469+
}
470+
disabled={areExtraQuestionsIncomplete()}
471+
sx={{
472+
color: "#666",
473+
textTransform: "none",
474+
fontSize: "14px",
475+
fontWeight: 400,
476+
"&:hover": {
477+
backgroundColor: "transparent",
478+
color: "#2196F3"
479+
},
480+
mb: 2
481+
}}
482+
>
483+
{T.translate("edit_sponsor.add_value")}
484+
</Button>
485+
</>
486+
)}
487+
</FieldArray>
472488
</Grid2>
473489
)}
474490
<Divider />

0 commit comments

Comments
 (0)