diff --git a/src/features/province/components/create-guilds/CreateGuilds.js b/src/features/province/components/create-guilds/CreateGuilds.js index e2d509d..2ba4e68 100644 --- a/src/features/province/components/create-guilds/CreateGuilds.js +++ b/src/features/province/components/create-guilds/CreateGuilds.js @@ -130,21 +130,23 @@ export const CreateGuilds = ({ guild, updateTable }) => { hasInquiry ); }); - dispatch(updateGuildByNationalIdNewService(guildsDataArray)).then( - (result) => { - if (result.payload.error) { - handleSubmitError(openNotif, result.payload.error); - } else { - handleSubmitSuccess( - dispatch, - openNotif, - updateTable, - values, - result.payload?.data - ); - } - } - ); + + console.log(guildsDataArray); + // dispatch(updateGuildByNationalIdNewService(guildsDataArray)).then( + // (result) => { + // if (result.payload.error) { + // handleSubmitError(openNotif, result.payload.error); + // } else { + // handleSubmitSuccess( + // dispatch, + // openNotif, + // updateTable, + // values, + // result.payload?.data + // ); + // } + // } + // ); }, }); @@ -183,6 +185,7 @@ export const CreateGuilds = ({ guild, updateTable }) => { return { steward: initialValues.steward || false, guild: initialValues.guild || false, + license_number: initialValues.license_number ?? "", }; }); formik.setFieldValue("guilds", guildsForFormik, false).then(() => { @@ -266,20 +269,11 @@ export const CreateGuilds = ({ guild, updateTable }) => { }); setGuildsFormValues(initialGuildValues); - // Update Formik's guilds array for validation - const guildsForFormik = guildsData.map((guildItem) => ({ - steward: - typeof guildItem?.steward === "boolean" - ? guildItem.steward - : typeof guildItem?.isSteward === "boolean" - ? guildItem.isSteward - : false, - guild: - typeof guildItem?.guild === "boolean" - ? guildItem.guild - : typeof guildItem?.isGuild === "boolean" - ? guildItem.isGuild - : false, + // Update Formik's guilds array for validation (include validated fields) + const guildsForFormik = initialGuildValues.map((g) => ({ + steward: g.steward ?? false, + guild: g.guild ?? false, + license_number: g.license_number ?? "", })); formik.setFieldValue("guilds", guildsForFormik, true).then(() => { formik.validateField("guilds"); @@ -563,8 +557,12 @@ export const CreateGuilds = ({ guild, updateTable }) => { return newValues; }); - // Sync with Formik's guilds array for steward and guild fields - if (fieldName === "steward" || fieldName === "guild") { + // Sync validated guild fields to Formik's guilds array (schema: license_number, steward, guild) + if ( + fieldName === "steward" || + fieldName === "guild" || + fieldName === "license_number" + ) { const currentGuilds = formik.values.guilds || []; const updatedGuilds = [...currentGuilds]; if (!updatedGuilds[index]) { @@ -683,6 +681,7 @@ export const CreateGuilds = ({ guild, updateTable }) => { onGuildValuesChange={handleGuildValuesChange} expanded={expandedAccordion === index} onChange={handleAccordionChange(index)} + mainFormik={formik} /> ))} diff --git a/src/features/province/components/create-guilds/components/FormActions.js b/src/features/province/components/create-guilds/components/FormActions.js index 7c4d69d..51d9b3d 100644 --- a/src/features/province/components/create-guilds/components/FormActions.js +++ b/src/features/province/components/create-guilds/components/FormActions.js @@ -74,7 +74,9 @@ export const FormActions = ({ color="error" sx={{ mt: 1, display: "block" }} > - {formik.errors.guilds} + {typeof formik.errors.guilds === "string" + ? formik.errors.guilds + : "برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود"} )} diff --git a/src/features/province/components/create-guilds/components/GuildInfoAccordionItem.js b/src/features/province/components/create-guilds/components/GuildInfoAccordionItem.js index b60227e..a443906 100644 --- a/src/features/province/components/create-guilds/components/GuildInfoAccordionItem.js +++ b/src/features/province/components/create-guilds/components/GuildInfoAccordionItem.js @@ -26,7 +26,12 @@ export const GuildInfoAccordionItem = ({ onGuildValuesChange, expanded, 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 const guildFormik = { values: guildFormValues || {}, @@ -36,9 +41,14 @@ export const GuildInfoAccordionItem = ({ handleChange: (e) => { onGuildValuesChange(guildIndex, e.target.name, e.target.value); }, - handleBlur: () => {}, - errors: {}, - touched: {}, + handleBlur: (e) => { + const name = e?.target?.name; + if (name && mainFormik?.setFieldTouched) { + mainFormik.setFieldTouched(`guilds.${guildIndex}.${name}`, true); + } + }, + errors: guildErrors, + touched: guildTouched, }; const getGuildTitle = () => { if (guildData?.guildsName) { @@ -92,6 +102,7 @@ export const GuildInfoAccordionItem = ({ typeActivities={typeActivities} hideTitle={true} noGridWrapper={true} + guildIndex={guildIndex} /> diff --git a/src/features/province/components/create-guilds/components/GuildInfoSection.js b/src/features/province/components/create-guilds/components/GuildInfoSection.js index bb56337..ba1e4c0 100644 --- a/src/features/province/components/create-guilds/components/GuildInfoSection.js +++ b/src/features/province/components/create-guilds/components/GuildInfoSection.js @@ -242,6 +242,8 @@ export const GuildInfoSection = ({ value={formik.values.license_number} onChange={formik.handleChange} onBlur={formik.handleBlur} + error={Boolean(formik.errors?.license_number)} + helperText={formik.errors?.license_number} /> ) : ( 0) + } + helperText={ + (formik.touched.mobile || formik.submitCount > 0) && + formik.errors.mobile + } disabled={ isKillHouse && formik.values.mobile && diff --git a/src/features/province/components/create-guilds/utils/formUtils.js b/src/features/province/components/create-guilds/utils/formUtils.js index 362b02d..8785854 100644 --- a/src/features/province/components/create-guilds/utils/formUtils.js +++ b/src/features/province/components/create-guilds/utils/formUtils.js @@ -3,27 +3,19 @@ import { normalizeDatabaseDate } from "./dateUtils"; /** * 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) => yup.object({ national_id: yup .string() .required("کد ملی الزامی است") .matches(/^[0-9]{10}$/, "کد ملی باید 10 رقم باشد"), - mobile: isEditMode - ? yup - .string() - .nullable() - .test( - "mobile-format", - "شماره تلفن باید 11 رقم باشد", - (value) => !value || /^[0-9]{11}$/.test(value) - ) - : yup - .string() - .required("شماره تلفن الزامی است") - .matches(/^[0-9]{11}$/, "شماره تلفن باید 11 رقم باشد"), + mobile: yup + .string() + .required("شماره همراه الزامی است") + .matches(/^[0-9]{11}$/, "شماره تلفن باید 11 رقم باشد"), first_name: yup.string(), last_name: yup.string(), guild_name: yup.string(), @@ -51,22 +43,18 @@ export const getValidationSchema = (isEditMode) => .array() .min(1, "حداقل یک واحد صنفی باید وجود داشته باشد") .of( - yup.object({ - steward: yup.boolean().default(false), - guild: yup.boolean().default(false), - }) - ) - .test( - "steward-guild-required", - "برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود", - function (guilds) { - if (!guilds || guilds.length === 0) { - return false; - } - return guilds.every( - (guild) => guild?.steward === true || guild?.guild === true - ); - } + yup + .object({ + license_number: yup.string().required("شماره مجوز الزامی است"), + + steward: yup.boolean(), + guild: yup.boolean(), + }) + .test( + "steward-guild-required", + "برای هر واحد صنفی، حداقل یکی از گزینه‌های مباشر یا صنف باید انتخاب شود", + (value) => value?.steward === true || value?.guild === true + ) ), }); diff --git a/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsForm.js b/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsForm.js index 9ba31a2..339564d 100644 --- a/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsForm.js +++ b/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsForm.js @@ -1,10 +1,4 @@ -import React, { - useContext, - useEffect, - useState, - useCallback, - useRef, -} from "react"; +import React, { useContext, useEffect, useState, useCallback } from "react"; import { useFormik } from "formik"; import * as yup from "yup"; import { useDispatch } from "react-redux"; @@ -28,7 +22,6 @@ import { CLOSE_MODAL, LOADING_END, LOADING_START, - OPEN_MODAL, } from "../../../../lib/redux/slices/appSlice"; import { AppContext } from "../../../../contexts/AppContext"; 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 { cityGetCity } from "../../../city/services/city-get-city"; -let preservedUserData = null; -let preservedUserFound = false; -let preservedNationalCode = ""; +const preservedUserData = null; +const preservedNationalCode = ""; const extractCityFromAddress = (address) => { if (!address || typeof address !== "string") { @@ -386,12 +378,7 @@ const InquiryForm = ({ onInquiry, nationalCode, setNationalCode }) => { ); }; -export const ProvinceLegalGuildsForm = ({ - onClose, - updateTable, - item, - userType, -}) => { +export const ProvinceLegalGuildsForm = ({ updateTable, item, userType }) => { const [provinceData, setProvinceData] = useState(); const [cityData, setCityData] = useState(); @@ -424,13 +411,17 @@ export const ProvinceLegalGuildsForm = ({ const [userData, setUserData] = useState( item ? userInitialValue : preservedUserData ); - const [userFound, setUserFound] = useState(item ? true : preservedUserFound); const [typeActivities, setTypeActivities] = useState([]); const currentRole = getRoleFromUrl(); const isAdmin = currentRole === "AdminX"; useEffect(() => { + if (preservedUserData) { + setUserData(preservedUserData); + setNationalCode(preservedNationalCode); + } + dispatch(LOADING_START()); dispatch(cityGetProvinces()) ?.then((r) => { @@ -444,51 +435,12 @@ export const ProvinceLegalGuildsForm = ({ .finally(() => { dispatch(LOADING_END()); }); - }, []); - useEffect(() => { dispatch(provinceGetTypeActivity()).then((r) => { 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: ( - - ), - size: { xs: "96vw", md: "90vw", lg: "600px" }, - }) - ); - } - }, [userData, dispatch, onClose, updateTable, userFound, nationalCode]); - const handleInquiry = useCallback(() => { if (!nationalCode || nationalCode.length !== 11) { openNotif({ @@ -502,7 +454,6 @@ export const ProvinceLegalGuildsForm = ({ dispatch(provinceGetLegalPersonUnitInfoService(nationalCode)).then((r) => { if (r.payload.error) { - setUserFound(false); if (isAdmin) { openNotif({ vertical: "top", @@ -543,7 +494,6 @@ export const ProvinceLegalGuildsForm = ({ }); } } else if (r.payload.data) { - setUserFound(true); const extractedCity = extractCityFromAddress( r.payload.data.address || "" ); diff --git a/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsInProvince.js b/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsInProvince.js index e538ad0..8904d7a 100644 --- a/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsInProvince.js +++ b/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsInProvince.js @@ -155,22 +155,6 @@ export const ProvinceLegalGuildsInProvince = ({ userType }) => { } }; - const handleOpenModal = () => { - dispatch( - OPEN_MODAL({ - title: `ثبت ${IS_STEWARD ? "مباشر جدید" : "صنف جدید"}`, - content: ( - dispatch(CLOSE_MODAL())} - updateTable={updateTableData} - userType={userType} - /> - ), - size: 400, - }) - ); - }; - return ( { gap={SPACING.SMALL} mb={SPACING.SMALL} > -
diff --git a/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsOperations.js b/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsOperations.js index d735436..32b285a 100644 --- a/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsOperations.js +++ b/src/features/province/components/province-legal-guilds-in-province/ProvinceLegalGuildsOperations.js @@ -96,7 +96,6 @@ export const ProvinceLegalGuildsOperations = ({ dispatch(LOADING_END()); } catch (error) { - console.log(error); dispatch(LOADING_END()); const errorMessage = error.response?.data?.result ||