fix: erros for Create guilds

This commit is contained in:
2026-02-01 15:01:58 +03:30
parent cf11b64d8e
commit 74ba1dddb6
9 changed files with 105 additions and 144 deletions

View File

@@ -130,21 +130,23 @@ export const CreateGuilds = ({ guild, updateTable }) => {
hasInquiry hasInquiry
); );
}); });
dispatch(updateGuildByNationalIdNewService(guildsDataArray)).then(
(result) => { console.log(guildsDataArray);
if (result.payload.error) { // dispatch(updateGuildByNationalIdNewService(guildsDataArray)).then(
handleSubmitError(openNotif, result.payload.error); // (result) => {
} else { // if (result.payload.error) {
handleSubmitSuccess( // handleSubmitError(openNotif, result.payload.error);
dispatch, // } else {
openNotif, // handleSubmitSuccess(
updateTable, // dispatch,
values, // openNotif,
result.payload?.data // updateTable,
); // values,
} // result.payload?.data
} // );
); // }
// }
// );
}, },
}); });
@@ -183,6 +185,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
return { return {
steward: initialValues.steward || false, steward: initialValues.steward || false,
guild: initialValues.guild || false, guild: initialValues.guild || false,
license_number: initialValues.license_number ?? "",
}; };
}); });
formik.setFieldValue("guilds", guildsForFormik, false).then(() => { formik.setFieldValue("guilds", guildsForFormik, false).then(() => {
@@ -266,20 +269,11 @@ export const CreateGuilds = ({ guild, updateTable }) => {
}); });
setGuildsFormValues(initialGuildValues); setGuildsFormValues(initialGuildValues);
// Update Formik's guilds array for validation // Update Formik's guilds array for validation (include validated fields)
const guildsForFormik = guildsData.map((guildItem) => ({ const guildsForFormik = initialGuildValues.map((g) => ({
steward: steward: g.steward ?? false,
typeof guildItem?.steward === "boolean" guild: g.guild ?? false,
? guildItem.steward license_number: g.license_number ?? "",
: typeof guildItem?.isSteward === "boolean"
? guildItem.isSteward
: false,
guild:
typeof guildItem?.guild === "boolean"
? guildItem.guild
: typeof guildItem?.isGuild === "boolean"
? guildItem.isGuild
: false,
})); }));
formik.setFieldValue("guilds", guildsForFormik, true).then(() => { formik.setFieldValue("guilds", guildsForFormik, true).then(() => {
formik.validateField("guilds"); formik.validateField("guilds");
@@ -563,8 +557,12 @@ export const CreateGuilds = ({ guild, updateTable }) => {
return newValues; return newValues;
}); });
// Sync with Formik's guilds array for steward and guild fields // Sync validated guild fields to Formik's guilds array (schema: license_number, steward, guild)
if (fieldName === "steward" || fieldName === "guild") { if (
fieldName === "steward" ||
fieldName === "guild" ||
fieldName === "license_number"
) {
const currentGuilds = formik.values.guilds || []; const currentGuilds = formik.values.guilds || [];
const updatedGuilds = [...currentGuilds]; const updatedGuilds = [...currentGuilds];
if (!updatedGuilds[index]) { if (!updatedGuilds[index]) {
@@ -683,6 +681,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
onGuildValuesChange={handleGuildValuesChange} onGuildValuesChange={handleGuildValuesChange}
expanded={expandedAccordion === index} expanded={expandedAccordion === index}
onChange={handleAccordionChange(index)} onChange={handleAccordionChange(index)}
mainFormik={formik}
/> />
</Box> </Box>
))} ))}

View File

@@ -74,7 +74,9 @@ export const FormActions = ({
color="error" color="error"
sx={{ mt: 1, display: "block" }} sx={{ mt: 1, display: "block" }}
> >
{formik.errors.guilds} {typeof formik.errors.guilds === "string"
? formik.errors.guilds
: "برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود"}
</Typography> </Typography>
)} )}
</Grid> </Grid>

View File

@@ -26,7 +26,12 @@ export const GuildInfoAccordionItem = ({
onGuildValuesChange, onGuildValuesChange,
expanded, expanded,
onChange, onChange,
mainFormik,
}) => { }) => {
// Errors and touched for this guild from main formik (formik.errors.guilds[i], formik.touched.guilds[i])
const guildErrors = mainFormik?.errors?.guilds?.[guildIndex] ?? {};
const guildTouched = mainFormik?.touched?.guilds?.[guildIndex] ?? {};
// Create a formik-like object for this guild's values // Create a formik-like object for this guild's values
const guildFormik = { const guildFormik = {
values: guildFormValues || {}, values: guildFormValues || {},
@@ -36,9 +41,14 @@ export const GuildInfoAccordionItem = ({
handleChange: (e) => { handleChange: (e) => {
onGuildValuesChange(guildIndex, e.target.name, e.target.value); onGuildValuesChange(guildIndex, e.target.name, e.target.value);
}, },
handleBlur: () => {}, handleBlur: (e) => {
errors: {}, const name = e?.target?.name;
touched: {}, if (name && mainFormik?.setFieldTouched) {
mainFormik.setFieldTouched(`guilds.${guildIndex}.${name}`, true);
}
},
errors: guildErrors,
touched: guildTouched,
}; };
const getGuildTitle = () => { const getGuildTitle = () => {
if (guildData?.guildsName) { if (guildData?.guildsName) {
@@ -92,6 +102,7 @@ export const GuildInfoAccordionItem = ({
typeActivities={typeActivities} typeActivities={typeActivities}
hideTitle={true} hideTitle={true}
noGridWrapper={true} noGridWrapper={true}
guildIndex={guildIndex}
/> />
</AccordionDetails> </AccordionDetails>
</Accordion> </Accordion>

View File

@@ -242,6 +242,8 @@ export const GuildInfoSection = ({
value={formik.values.license_number} value={formik.values.license_number}
onChange={formik.handleChange} onChange={formik.handleChange}
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
error={Boolean(formik.errors?.license_number)}
helperText={formik.errors?.license_number}
/> />
) : ( ) : (
<InfoBox <InfoBox

View File

@@ -436,12 +436,20 @@ export const PersonalInfoSection = ({
label="شماره همراه" label="شماره همراه"
variant="outlined" variant="outlined"
fullWidth fullWidth
required
id="mobile" id="mobile"
name="mobile" name="mobile"
value={formik.values.mobile} value={formik.values.mobile}
onChange={formik.handleChange} onChange={formik.handleChange}
error={formik.touched.mobile && Boolean(formik.errors.mobile)} onBlur={formik.handleBlur}
helperText={formik.touched.mobile && formik.errors.mobile} error={
Boolean(formik.errors.mobile) &&
(formik.touched.mobile || formik.submitCount > 0)
}
helperText={
(formik.touched.mobile || formik.submitCount > 0) &&
formik.errors.mobile
}
disabled={ disabled={
isKillHouse && isKillHouse &&
formik.values.mobile && formik.values.mobile &&

View File

@@ -3,27 +3,19 @@ import { normalizeDatabaseDate } from "./dateUtils";
/** /**
* Creates validation schema for the form * Creates validation schema for the form
* @param {boolean} isEditMode - Whether we're editing an existing guild * @param {boolean} isEditMode - Whether we're editing an existing guild (kept for API compatibility)
*/ */
// eslint-disable-next-line no-unused-vars
export const getValidationSchema = (isEditMode) => export const getValidationSchema = (isEditMode) =>
yup.object({ yup.object({
national_id: yup national_id: yup
.string() .string()
.required("کد ملی الزامی است") .required("کد ملی الزامی است")
.matches(/^[0-9]{10}$/, "کد ملی باید 10 رقم باشد"), .matches(/^[0-9]{10}$/, "کد ملی باید 10 رقم باشد"),
mobile: isEditMode mobile: yup
? yup .string()
.string() .required("شماره همراه الزامی است")
.nullable() .matches(/^[0-9]{11}$/, "شماره تلفن باید 11 رقم باشد"),
.test(
"mobile-format",
"شماره تلفن باید 11 رقم باشد",
(value) => !value || /^[0-9]{11}$/.test(value)
)
: yup
.string()
.required("شماره تلفن الزامی است")
.matches(/^[0-9]{11}$/, "شماره تلفن باید 11 رقم باشد"),
first_name: yup.string(), first_name: yup.string(),
last_name: yup.string(), last_name: yup.string(),
guild_name: yup.string(), guild_name: yup.string(),
@@ -51,22 +43,18 @@ export const getValidationSchema = (isEditMode) =>
.array() .array()
.min(1, "حداقل یک واحد صنفی باید وجود داشته باشد") .min(1, "حداقل یک واحد صنفی باید وجود داشته باشد")
.of( .of(
yup.object({ yup
steward: yup.boolean().default(false), .object({
guild: yup.boolean().default(false), license_number: yup.string().required("شماره مجوز الزامی است"),
})
) steward: yup.boolean(),
.test( guild: yup.boolean(),
"steward-guild-required", })
"برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود", .test(
function (guilds) { "steward-guild-required",
if (!guilds || guilds.length === 0) { "برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود",
return false; (value) => value?.steward === true || value?.guild === true
} )
return guilds.every(
(guild) => guild?.steward === true || guild?.guild === true
);
}
), ),
}); });

View File

@@ -1,10 +1,4 @@
import React, { import React, { useContext, useEffect, useState, useCallback } from "react";
useContext,
useEffect,
useState,
useCallback,
useRef,
} from "react";
import { useFormik } from "formik"; import { useFormik } from "formik";
import * as yup from "yup"; import * as yup from "yup";
import { useDispatch } from "react-redux"; import { useDispatch } from "react-redux";
@@ -28,7 +22,6 @@ import {
CLOSE_MODAL, CLOSE_MODAL,
LOADING_END, LOADING_END,
LOADING_START, LOADING_START,
OPEN_MODAL,
} from "../../../../lib/redux/slices/appSlice"; } from "../../../../lib/redux/slices/appSlice";
import { AppContext } from "../../../../contexts/AppContext"; import { AppContext } from "../../../../contexts/AppContext";
import { provinceGetLegalPersonUnitInfoService } from "../../services/province-get-legal-person-unit-info"; import { provinceGetLegalPersonUnitInfoService } from "../../services/province-get-legal-person-unit-info";
@@ -38,9 +31,8 @@ import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl";
import { cityGetProvinces } from "../../../city/services/CityGetProvinces"; import { cityGetProvinces } from "../../../city/services/CityGetProvinces";
import { cityGetCity } from "../../../city/services/city-get-city"; import { cityGetCity } from "../../../city/services/city-get-city";
let preservedUserData = null; const preservedUserData = null;
let preservedUserFound = false; const preservedNationalCode = "";
let preservedNationalCode = "";
const extractCityFromAddress = (address) => { const extractCityFromAddress = (address) => {
if (!address || typeof address !== "string") { if (!address || typeof address !== "string") {
@@ -386,12 +378,7 @@ const InquiryForm = ({ onInquiry, nationalCode, setNationalCode }) => {
); );
}; };
export const ProvinceLegalGuildsForm = ({ export const ProvinceLegalGuildsForm = ({ updateTable, item, userType }) => {
onClose,
updateTable,
item,
userType,
}) => {
const [provinceData, setProvinceData] = useState(); const [provinceData, setProvinceData] = useState();
const [cityData, setCityData] = useState(); const [cityData, setCityData] = useState();
@@ -424,13 +411,17 @@ export const ProvinceLegalGuildsForm = ({
const [userData, setUserData] = useState( const [userData, setUserData] = useState(
item ? userInitialValue : preservedUserData item ? userInitialValue : preservedUserData
); );
const [userFound, setUserFound] = useState(item ? true : preservedUserFound);
const [typeActivities, setTypeActivities] = useState([]); const [typeActivities, setTypeActivities] = useState([]);
const currentRole = getRoleFromUrl(); const currentRole = getRoleFromUrl();
const isAdmin = currentRole === "AdminX"; const isAdmin = currentRole === "AdminX";
useEffect(() => { useEffect(() => {
if (preservedUserData) {
setUserData(preservedUserData);
setNationalCode(preservedNationalCode);
}
dispatch(LOADING_START()); dispatch(LOADING_START());
dispatch(cityGetProvinces()) dispatch(cityGetProvinces())
?.then((r) => { ?.then((r) => {
@@ -444,51 +435,12 @@ export const ProvinceLegalGuildsForm = ({
.finally(() => { .finally(() => {
dispatch(LOADING_END()); dispatch(LOADING_END());
}); });
}, []);
useEffect(() => {
dispatch(provinceGetTypeActivity()).then((r) => { dispatch(provinceGetTypeActivity()).then((r) => {
setTypeActivities(r.payload.data || []); setTypeActivities(r.payload.data || []);
}); });
}, [dispatch]);
// Restore preserved data on mount
useEffect(() => {
if (preservedUserData) {
setUserData(preservedUserData);
setUserFound(preservedUserFound);
setNationalCode(preservedNationalCode);
}
}, []); }, []);
// Update modal size when userData is available (only once)
const sizeUpdatedRef = useRef(false);
useEffect(() => {
if (userData && !sizeUpdatedRef.current) {
sizeUpdatedRef.current = true;
// Preserve state before remount
preservedUserData = userData;
preservedUserFound = userFound;
preservedNationalCode = nationalCode;
// Update modal with larger size
dispatch(
OPEN_MODAL({
title: `${item ? "ویرایش" : "ثبت"} ${
IS_STEWARD ? "مباشر" : "صنف"
} حقوقی`,
content: (
<ProvinceLegalGuildsForm
onClose={onClose}
updateTable={updateTable}
userType={userType}
/>
),
size: { xs: "96vw", md: "90vw", lg: "600px" },
})
);
}
}, [userData, dispatch, onClose, updateTable, userFound, nationalCode]);
const handleInquiry = useCallback(() => { const handleInquiry = useCallback(() => {
if (!nationalCode || nationalCode.length !== 11) { if (!nationalCode || nationalCode.length !== 11) {
openNotif({ openNotif({
@@ -502,7 +454,6 @@ export const ProvinceLegalGuildsForm = ({
dispatch(provinceGetLegalPersonUnitInfoService(nationalCode)).then((r) => { dispatch(provinceGetLegalPersonUnitInfoService(nationalCode)).then((r) => {
if (r.payload.error) { if (r.payload.error) {
setUserFound(false);
if (isAdmin) { if (isAdmin) {
openNotif({ openNotif({
vertical: "top", vertical: "top",
@@ -543,7 +494,6 @@ export const ProvinceLegalGuildsForm = ({
}); });
} }
} else if (r.payload.data) { } else if (r.payload.data) {
setUserFound(true);
const extractedCity = extractCityFromAddress( const extractedCity = extractCityFromAddress(
r.payload.data.address || "" r.payload.data.address || ""
); );

View File

@@ -155,22 +155,6 @@ export const ProvinceLegalGuildsInProvince = ({ userType }) => {
} }
}; };
const handleOpenModal = () => {
dispatch(
OPEN_MODAL({
title: `ثبت ${IS_STEWARD ? "مباشر جدید" : "صنف جدید"}`,
content: (
<ProvinceLegalGuildsForm
onClose={() => dispatch(CLOSE_MODAL())}
updateTable={updateTableData}
userType={userType}
/>
),
size: 400,
})
);
};
return ( return (
<Grid item gap={SPACING.SMALL} p={2} xs={12}> <Grid item gap={SPACING.SMALL} p={2} xs={12}>
<Grid <Grid
@@ -180,7 +164,25 @@ export const ProvinceLegalGuildsInProvince = ({ userType }) => {
gap={SPACING.SMALL} gap={SPACING.SMALL}
mb={SPACING.SMALL} mb={SPACING.SMALL}
> >
<Button variant="contained" color="primary" onClick={handleOpenModal}> <Button
variant="contained"
color="primary"
onClick={() =>
dispatch(
OPEN_MODAL({
title: `ثبت ${IS_STEWARD ? "مباشر جدید" : "صنف جدید"}`,
content: (
<ProvinceLegalGuildsForm
onClose={() => dispatch(CLOSE_MODAL())}
updateTable={updateTableData}
userType={userType}
/>
),
size: "auto",
})
)
}
>
{`ثبت ${IS_STEWARD ? "مباشر" : "واحد صنفی"}`} {`ثبت ${IS_STEWARD ? "مباشر" : "واحد صنفی"}`}
</Button> </Button>
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit}>

View File

@@ -96,7 +96,6 @@ export const ProvinceLegalGuildsOperations = ({
dispatch(LOADING_END()); dispatch(LOADING_END());
} catch (error) { } catch (error) {
console.log(error);
dispatch(LOADING_END()); dispatch(LOADING_END());
const errorMessage = const errorMessage =
error.response?.data?.result || error.response?.data?.result ||