fixed form for create guilds basiclly

This commit is contained in:
2026-01-26 15:22:33 +03:30
parent eed6904646
commit 66d71c9c25
12 changed files with 536 additions and 123 deletions

13
.vscode/settings.json vendored
View File

@@ -1,3 +1,14 @@
{ {
"workbench.editor.enablePreviewFromCodeNavigation": true "workbench.editor.enablePreviewFromCodeNavigation": true,
"launch": {
"configurations": [],
"compounds": []
},
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint",
"editor.formatOnSave": true,
"notebook.defaultFormatter": "rvest.vs-code-prettier-eslint",
"notebook.formatOnSave.enabled": true,
"[javascript]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
}
} }

View File

@@ -22,6 +22,8 @@ import { provinceGetFieldOfWorks } from "../../services/ProvinceGetFieldOfWorks"
import { provinceGetTypeActivity } from "../../services/provinceGetTypeActivity"; import { provinceGetTypeActivity } from "../../services/provinceGetTypeActivity";
import { provinceGetRegisterCodeStateService } from "../../services/province-get-register-code-state"; import { provinceGetRegisterCodeStateService } from "../../services/province-get-register-code-state";
import { mainGetGuildsForUpdateOrCreateService } from "../../services/main-get-guilds-for-update-or-create"; import { mainGetGuildsForUpdateOrCreateService } from "../../services/main-get-guilds-for-update-or-create";
import { cityGetProvinces } from "../../../city/services/CityGetProvinces";
import { cityGetCity } from "../../../city/services/city-get-city";
import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl"; import { getRoleFromUrl } from "../../../../utils/getRoleFromUrl";
import { PersonalInfoSection } from "./components/PersonalInfoSection"; import { PersonalInfoSection } from "./components/PersonalInfoSection";
import { InquiryForm } from "./components/InquiryForm"; import { InquiryForm } from "./components/InquiryForm";
@@ -87,6 +89,8 @@ export const CreateGuilds = ({ guild, updateTable }) => {
return []; return [];
}); });
const [cities, setCities] = useState([]); const [cities, setCities] = useState([]);
const [provinces, setProvinces] = useState([]);
const [provinceCities, setProvinceCities] = useState([]);
const [typeActivities, setTypeActivities] = useState([]); const [typeActivities, setTypeActivities] = useState([]);
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [deleteDialogIndex, setDeleteDialogIndex] = useState(null); const [deleteDialogIndex, setDeleteDialogIndex] = useState(null);
@@ -109,6 +113,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
const combinedValues = { const combinedValues = {
...values, // Personal info (shared) ...values, // Personal info (shared)
...guildValues, // Guild-specific info (overrides if same keys exist) ...guildValues, // Guild-specific info (overrides if same keys exist)
national_id: values?.national_id,
}; };
return prepareSubmitData( return prepareSubmitData(
combinedValues, combinedValues,
@@ -117,7 +122,7 @@ export const CreateGuilds = ({ guild, updateTable }) => {
hasInquiry hasInquiry
); );
}); });
console.log(guildsDataArray);
dispatch(updateGuildByNationalIdNewService(guildsDataArray)).then( dispatch(updateGuildByNationalIdNewService(guildsDataArray)).then(
(result) => { (result) => {
if (result.payload.error) { if (result.payload.error) {
@@ -151,12 +156,78 @@ export const CreateGuilds = ({ guild, updateTable }) => {
dispatch(provinceGetTypeActivity()).then((r) => { dispatch(provinceGetTypeActivity()).then((r) => {
setTypeActivities(r.payload.data || []); setTypeActivities(r.payload.data || []);
}); });
// Fetch provinces for province/city selection
dispatch(cityGetProvinces()).then((r) => {
if (r?.payload?.data) {
setProvinces(r.payload.data);
}
});
}, []); }, []);
useEffect(() => { useEffect(() => {
// Initialize Formik's guilds array if we have initial guild data
if (guild && guildsList.length > 0) {
const guildsForFormik = guildsList.map((guildItem) => {
const combinedGuild = {
...guildItem,
user: guild?.user || {},
};
const initialValues = getInitialValues(combinedGuild);
return {
steward: initialValues.steward || false,
guild: initialValues.guild || false,
};
});
formik.setFieldValue("guilds", guildsForFormik, false).then(() => {
formik.validateField("guilds");
});
}
formik.validateForm(); formik.validateForm();
}, []); }, []);
// Set province ID from state name when provinces are loaded
useEffect(() => {
if (
formik.values.state &&
provinces.length > 0 &&
!formik.values.province
) {
const province = provinces.find((p) => p.name === formik.values.state);
if (province) {
formik.setFieldValue("province", province.key);
}
}
}, [provinces, formik.values.state, formik.values.province]);
// Fetch cities when province is selected
useEffect(() => {
if (formik.values.province) {
dispatch(cityGetCity(formik.values.province)).then((r) => {
if (r?.payload?.data) {
setProvinceCities(r.payload.data);
}
});
} else {
setProvinceCities([]);
}
}, [formik.values.province, dispatch]);
// Set city ID from person_city name when provinceCities are loaded
useEffect(() => {
if (
formik.values.person_city &&
!formik.values.city &&
provinceCities.length > 0
) {
const city = provinceCities.find(
(c) => c.name === formik.values.person_city
);
if (city) {
formik.setFieldValue("city", city.key);
}
}
}, [provinceCities, formik.values.person_city, formik.values.city]);
const mapResponseToFormFields = useCallback( const mapResponseToFormFields = useCallback(
(responseData) => { (responseData) => {
const guildsData = Array.isArray(responseData.guilds) const guildsData = Array.isArray(responseData.guilds)
@@ -187,10 +258,34 @@ export const CreateGuilds = ({ guild, updateTable }) => {
return getInitialValues(combinedGuild); return getInitialValues(combinedGuild);
}); });
setGuildsFormValues(initialGuildValues); 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,
}));
formik.setFieldValue("guilds", guildsForFormik, true).then(() => {
formik.validateField("guilds");
});
setExpandedAccordion(0); setExpandedAccordion(0);
} else { } else {
setGuildsList([]); setGuildsList([]);
setGuildsFormValues([]); setGuildsFormValues([]);
formik.setFieldValue("guilds", [], true).then(() => {
formik.validateField("guilds");
});
} }
setTimeout(() => { setTimeout(() => {
@@ -333,6 +428,19 @@ export const CreateGuilds = ({ guild, updateTable }) => {
const newIndex = guildsList.length; const newIndex = guildsList.length;
setGuildsList([...guildsList, null]); setGuildsList([...guildsList, null]);
setGuildsFormValues([...guildsFormValues, getInitialValues(null)]); setGuildsFormValues([...guildsFormValues, getInitialValues(null)]);
// Add to Formik's guilds array for validation
const currentGuilds = formik.values.guilds || [];
formik
.setFieldValue(
"guilds",
[...currentGuilds, { steward: false, guild: false }],
true
)
.then(() => {
formik.validateField("guilds");
});
setExpandedAccordion(newIndex); setExpandedAccordion(newIndex);
}; };
@@ -346,6 +454,19 @@ export const CreateGuilds = ({ guild, updateTable }) => {
if (guildsList.length > 1) { if (guildsList.length > 1) {
setGuildsList(guildsList.filter((_, i) => i !== index)); setGuildsList(guildsList.filter((_, i) => i !== index));
setGuildsFormValues(guildsFormValues.filter((_, i) => i !== index)); setGuildsFormValues(guildsFormValues.filter((_, i) => i !== index));
// Remove from Formik's guilds array
const currentGuilds = formik.values.guilds || [];
formik
.setFieldValue(
"guilds",
currentGuilds.filter((_, i) => i !== index),
true
)
.then(() => {
formik.validateField("guilds");
});
if (expandedAccordion === index) { if (expandedAccordion === index) {
setExpandedAccordion(0); setExpandedAccordion(0);
} else if (expandedAccordion > index) { } else if (expandedAccordion > index) {
@@ -386,6 +507,19 @@ export const CreateGuilds = ({ guild, updateTable }) => {
setGuildsFormValues( setGuildsFormValues(
guildsFormValues.filter((_, i) => i !== deleteDialogIndex) guildsFormValues.filter((_, i) => i !== deleteDialogIndex)
); );
// Remove from Formik's guilds array
const currentGuilds = formik.values.guilds || [];
formik
.setFieldValue(
"guilds",
currentGuilds.filter((_, i) => i !== deleteDialogIndex),
true
)
.then(() => {
formik.validateField("guilds");
});
// If deleted accordion was expanded, expand the first one // If deleted accordion was expanded, expand the first one
if (expandedAccordion === deleteDialogIndex) { if (expandedAccordion === deleteDialogIndex) {
setExpandedAccordion(0); setExpandedAccordion(0);
@@ -408,7 +542,8 @@ export const CreateGuilds = ({ guild, updateTable }) => {
} }
}; };
const handleGuildValuesChange = useCallback((index, fieldName, value) => { const handleGuildValuesChange = useCallback(
(index, fieldName, value) => {
setGuildsFormValues((prev) => { setGuildsFormValues((prev) => {
const newValues = [...prev]; const newValues = [...prev];
if (!newValues[index]) { if (!newValues[index]) {
@@ -420,7 +555,25 @@ export const CreateGuilds = ({ guild, updateTable }) => {
}; };
return newValues; return newValues;
}); });
}, []);
// Sync with Formik's guilds array for steward and guild fields
if (fieldName === "steward" || fieldName === "guild") {
const currentGuilds = formik.values.guilds || [];
const updatedGuilds = [...currentGuilds];
if (!updatedGuilds[index]) {
updatedGuilds[index] = { steward: false, guild: false };
}
updatedGuilds[index] = {
...updatedGuilds[index],
[fieldName]: value,
};
formik.setFieldValue("guilds", updatedGuilds, true).then(() => {
formik.validateField("guilds");
});
}
},
[formik]
);
const handleAccordionChange = (index) => (event, isExpanded) => { const handleAccordionChange = (index) => (event, isExpanded) => {
setExpandedAccordion(isExpanded ? index : false); setExpandedAccordion(isExpanded ? index : false);
@@ -438,6 +591,8 @@ export const CreateGuilds = ({ guild, updateTable }) => {
const shouldShowInquiryForm = !guild && !isInquiryDone; const shouldShowInquiryForm = !guild && !isInquiryDone;
const shouldShowFormContent = guild || isInquiryDone; const shouldShowFormContent = guild || isInquiryDone;
console.log(formik.errors);
return ( return (
<form onSubmit={formik.handleSubmit}> <form onSubmit={formik.handleSubmit}>
<Grid <Grid
@@ -483,6 +638,9 @@ export const CreateGuilds = ({ guild, updateTable }) => {
isAdmin={isAdmin} isAdmin={isAdmin}
isSuperAdmin={isSuperAdmin} isSuperAdmin={isSuperAdmin}
isKillHouse={isKillHouse} isKillHouse={isKillHouse}
provinces={provinces}
provinceCities={provinceCities}
guildsList={guildsList}
/> />
<Grid <Grid
@@ -507,7 +665,10 @@ export const CreateGuilds = ({ guild, updateTable }) => {
guildData={guildItem} guildData={guildItem}
guildActive={guildActive} guildActive={guildActive}
isAdmin={isAdmin} isAdmin={isAdmin}
cities={cities} isSuperAdmin={isSuperAdmin}
cities={
provinceCities.length > 0 ? provinceCities : cities
}
typeActivities={typeActivities} typeActivities={typeActivities}
onDelete={() => handleDeleteGuild(index)} onDelete={() => handleDeleteGuild(index)}
canDelete={ canDelete={
@@ -561,6 +722,18 @@ export const CreateGuilds = ({ guild, updateTable }) => {
!isSuperAdmin && !isSuperAdmin &&
!isKillHouse !isKillHouse
} }
formData={guildsList.map((guildItem, index) => {
const guildValues = guildsFormValues[index];
const combinedValues = {
...guildValues, // Guild-specific info (overrides if same keys exist)
};
return prepareSubmitData(
combinedValues,
guildItem,
originalPhoneNumber,
hasInquiry
);
})}
isKillHouse={isKillHouse} isKillHouse={isKillHouse}
onSubmit={formik.handleSubmit} onSubmit={formik.handleSubmit}
/> />

View File

@@ -19,11 +19,14 @@ export const FormActions = ({
); );
} }
// For KillHouse: check if area_activity contains "مرغ"
const isAreaActivityValid = isKillHouse const isAreaActivityValid = isKillHouse
? formik.values.area_activity && formik.values.area_activity.includes("مرغ") ? formik.values.area_activity && formik.values.area_activity.includes("مرغ")
: true; : true;
// Check if guilds validation has errors
const hasGuildsError = formik.errors.guilds;
const hasGuilds = formik.values.guilds && formik.values.guilds.length > 0;
return ( return (
<> <>
<Grid item xs={12}> <Grid item xs={12}>
@@ -44,7 +47,9 @@ export const FormActions = ({
disabled={ disabled={
formik.errors.isAccepted || formik.errors.isAccepted ||
Boolean(formik.errors.national_id) || Boolean(formik.errors.national_id) ||
!isAreaActivityValid !isAreaActivityValid ||
hasGuildsError ||
!hasGuilds
} }
color="primary" color="primary"
fullWidth fullWidth
@@ -63,6 +68,15 @@ export const FormActions = ({
رسته واحد صنفی باید شامل کلمه &quot;مرغ&quot; باشد رسته واحد صنفی باید شامل کلمه &quot;مرغ&quot; باشد
</Typography> </Typography>
)} )}
{hasGuildsError && (
<Typography
variant="caption"
color="error"
sx={{ mt: 1, display: "block" }}
>
{formik.errors.guilds}
</Typography>
)}
</Grid> </Grid>
</> </>
); );

View File

@@ -17,6 +17,7 @@ export const GuildInfoAccordionItem = ({
guildData, guildData,
guildActive, guildActive,
isAdmin, isAdmin,
isSuperAdmin,
cities, cities,
typeActivities, typeActivities,
onDelete, onDelete,
@@ -86,6 +87,7 @@ export const GuildInfoAccordionItem = ({
guild={guildData} guild={guildData}
guildActive={guildActive} guildActive={guildActive}
isAdmin={isAdmin} isAdmin={isAdmin}
isSuperAdmin={isSuperAdmin}
cities={cities} cities={cities}
typeActivities={typeActivities} typeActivities={typeActivities}
hideTitle={true} hideTitle={true}

View File

@@ -10,6 +10,7 @@ import {
MenuItem, MenuItem,
InputLabel, InputLabel,
Checkbox, Checkbox,
Autocomplete,
} from "@mui/material"; } from "@mui/material";
import { DatePicker } from "@mui/x-date-pickers"; import { DatePicker } from "@mui/x-date-pickers";
import moment from "moment"; import moment from "moment";
@@ -40,6 +41,7 @@ export const GuildInfoSection = ({
guild, guild,
guildActive, guildActive,
isAdmin, isAdmin,
isSuperAdmin,
cities, cities,
typeActivities, typeActivities,
hideTitle = false, hideTitle = false,
@@ -81,7 +83,7 @@ export const GuildInfoSection = ({
xs={12} xs={12}
md={6} md={6}
px={SPACING.TINY} px={SPACING.TINY}
gap={SPACING.TINY} gap={SPACING.SMALL}
> >
<Grid item xs={12}> <Grid item xs={12}>
{isAdmin ? ( {isAdmin ? (
@@ -150,60 +152,47 @@ export const GuildInfoSection = ({
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12}>
{isAdmin ? ( {isAdmin ? (
<TextField <Autocomplete
label="استان" size="small"
variant="outlined" style={{ width: "100%" }}
fullWidth disablePortal
id="state" id="city_name"
name="state" disabled={!cities || cities.length === 0}
value={formik.values.state} options={
onChange={formik.handleChange} cities
onBlur={formik.handleBlur} ? cities.map((i) => ({
/> id: i.key,
) : ( label: i.name,
<InfoBox }))
icon={PublicIcon} : []
label="استان" }
value={formik.values.state} value={
/> cities.find((c) => c.name === formik.values.city_name)
)} ? {
</Grid> id: cities.find(
<Grid item xs={12}> (c) => c.name === formik.values.city_name
{isAdmin ? ( )?.key,
<FormControl fullWidth> label: formik.values.city_name,
<InputLabel id="city-select-label">شهرستان</InputLabel> }
<Select : formik.values.city_name
labelId="city-select-label" ? {
id="city" id: null,
name="city" label: formik.values.city_name,
value={formik.values.city || ""} }
label="شهرستان" : null
onChange={(e) => { }
formik.setFieldValue("city", e.target.value); onChange={(e, value) => {
formik.setFieldValue("city_name", value ? value.label : "");
}} }}
onBlur={formik.handleBlur} renderInput={(params) => (
> <TextField {...params} label="شهرستان" />
{cities.map((city) => (
<MenuItem key={city.key} value={city.name}>
{city.name}
</MenuItem>
))}
{/* Show current value if it doesn't exist in options */}
{formik.values.city &&
!cities.some(
(city) => city.name === formik.values.city
) && (
<MenuItem key="current-value" value={formik.values.city}>
{formik.values.city}
</MenuItem>
)} )}
</Select> />
</FormControl>
) : ( ) : (
<InfoBox <InfoBox
icon={LocationCityIcon} icon={LocationCityIcon}
label="شهرستان" label="شهرستان"
value={formik.values.city} value={formik.values.city_name}
/> />
)} )}
</Grid> </Grid>
@@ -332,7 +321,7 @@ export const GuildInfoSection = ({
md={6} md={6}
px={SPACING.TINY} px={SPACING.TINY}
direction="column" direction="column"
gap={SPACING.TINY} gap={SPACING.SMALL}
> >
<Grid item xs={12}> <Grid item xs={12}>
{isAdmin ? ( {isAdmin ? (
@@ -345,6 +334,8 @@ export const GuildInfoSection = ({
value={formik.values.postal_code} value={formik.values.postal_code}
onChange={formik.handleChange} onChange={formik.handleChange}
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
error={Boolean(formik.errors.postal_code)}
helperText={formik.errors.postal_code}
/> />
) : ( ) : (
<InfoBox <InfoBox
@@ -365,6 +356,13 @@ export const GuildInfoSection = ({
value={formik.values.phone_number} value={formik.values.phone_number}
onChange={formik.handleChange} onChange={formik.handleChange}
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
error={
formik.touched.phone_number &&
Boolean(formik.errors.phone_number)
}
helperText={
formik.touched.phone_number && formik.errors.phone_number
}
/> />
) : ( ) : (
<InfoBox <InfoBox
@@ -505,7 +503,7 @@ export const GuildInfoSection = ({
</Grid> </Grid>
</Grid> </Grid>
<Grid item xs={12} sx={{ display: "flex", mt: 2, pl: 2, mb: 2 }}> <Grid item xs={12} sx={{ display: "flex", mt: 2, pl: 2, mb: 2 }}>
{isAdmin ? ( {isAdmin || isSuperAdmin ? (
<> <>
<FormControlLabel <FormControlLabel
control={ control={

View File

@@ -6,6 +6,7 @@ import {
FormControl, FormControl,
Radio, Radio,
FormControlLabel, FormControlLabel,
Autocomplete,
} from "@mui/material"; } from "@mui/material";
import { DatePicker } from "@mui/x-date-pickers"; import { DatePicker } from "@mui/x-date-pickers";
import moment from "moment"; import moment from "moment";
@@ -16,6 +17,7 @@ import CakeIcon from "@mui/icons-material/Cake";
import FaceIcon from "@mui/icons-material/Face"; import FaceIcon from "@mui/icons-material/Face";
import LocationCityIcon from "@mui/icons-material/LocationCity"; import LocationCityIcon from "@mui/icons-material/LocationCity";
import FavoriteIcon from "@mui/icons-material/Favorite"; import FavoriteIcon from "@mui/icons-material/Favorite";
import PublicIcon from "@mui/icons-material/Public";
import { Grid } from "../../../../../components/grid/Grid"; import { Grid } from "../../../../../components/grid/Grid";
import { SPACING } from "../../../../../data/spacing"; import { SPACING } from "../../../../../data/spacing";
import { LabelField } from "../../../../../components/label-field/LabelField"; import { LabelField } from "../../../../../components/label-field/LabelField";
@@ -33,6 +35,8 @@ export const PersonalInfoSection = ({
isAdmin, isAdmin,
isSuperAdmin, isSuperAdmin,
isKillHouse, isKillHouse,
provinces = [],
provinceCities = [],
}) => { }) => {
const getGenderDisplay = (gender) => { const getGenderDisplay = (gender) => {
if (gender === "True" || gender === true) return GENDER_VALUES.MALE; if (gender === "True" || gender === true) return GENDER_VALUES.MALE;
@@ -305,21 +309,106 @@ export const PersonalInfoSection = ({
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12}>
{isAdmin ? ( {isAdmin ? (
<TextField <Autocomplete
label="شهر" size="small"
variant="outlined" style={{ width: "100%" }}
fullWidth disablePortal
id="person_city" id="province"
name="person_city" options={
value={formik.values.person_city} provinces
onChange={formik.handleChange} ? provinces.map((i) => ({
onBlur={formik.handleBlur} id: i.key,
label: i.name,
}))
: []
}
value={
provinces.find((p) => p.key === formik.values.province)
? {
id: formik.values.province,
label:
provinces.find(
(p) => p.key === formik.values.province
)?.name || "",
}
: null
}
onChange={(e, value) => {
formik.setFieldValue("province", value ? value.id : "");
formik.setFieldValue("city", "");
formik.setFieldValue("person_city", "");
}}
disabled={guild}
renderInput={(params) => (
<TextField {...params} label="استان" />
)}
/>
) : (
<InfoBox
icon={PublicIcon}
label="استان"
value={
provinces.find((p) => p.key === formik.values.province)
?.name ||
formik.values.state ||
"-"
}
/>
)}
</Grid>
<Grid item xs={12}>
{isAdmin ? (
<Autocomplete
size="small"
style={{ width: "100%" }}
disablePortal
id="city"
disabled={!formik.values.province}
options={
provinceCities
? provinceCities.map((i) => ({
id: i.key,
label: i.name,
}))
: []
}
value={
provinceCities.find((c) => c.key === formik.values.city)
? {
id: formik.values.city,
label:
provinceCities.find(
(c) => c.key === formik.values.city
)?.name || "",
}
: formik.values.person_city
? {
id: null,
label: formik.values.person_city,
}
: null
}
onChange={(e, value) => {
formik.setFieldValue("city", value ? value.id : "");
formik.setFieldValue(
"person_city",
value ? value.label : ""
);
}}
renderInput={(params) => (
<TextField {...params} label="شهر" />
)}
/> />
) : ( ) : (
<InfoBox <InfoBox
icon={LocationCityIcon} icon={LocationCityIcon}
label="شهر" label="شهر"
value={formik.values.person_city} value={
provinceCities.find((c) => c.key === formik.values.city)
?.name ||
formik.values.person_city ||
"-"
}
/> />
)} )}
</Grid> </Grid>

View File

@@ -25,7 +25,12 @@ export const prepareSubmitData = (
values.birth_date || "", values.birth_date || "",
hasInquiry === true hasInquiry === true
), ),
city: values.city || "", // city is for user info (personal info) - use person_city from personal info
city: values.person_city || values.city || "",
// city_name is for guild info
city_name: values.city_name || "",
// province is stored as ID when selected, or as name from state field
province: values.province || "",
address: values.address || "", address: values.address || "",
postalcode: values.postal_code || "", postalcode: values.postal_code || "",
licenseNumber: values.license_number || "", licenseNumber: values.license_number || "",
@@ -177,7 +182,8 @@ export const mapResponseDataToFormFields = (
? guildData.isicname || "" ? guildData.isicname || ""
: firstGuild.areaActivity || "", : firstGuild.areaActivity || "",
state: isExternalApi ? guildData.state || "" : provinceData.name || "", state: isExternalApi ? guildData.state || "" : provinceData.name || "",
city: isExternalApi ? guildData.city || "" : cityData.name || "", province: isExternalApi ? "" : provinceData.key || "",
city: isExternalApi ? guildData.city || "" : cityData.key || "",
address: isExternalApi address: isExternalApi
? guildData.address || "" ? guildData.address || ""
: addressData.address || "", : addressData.address || "",

View File

@@ -43,6 +43,27 @@ export const getValidationSchema = (isEditMode) =>
return val === true; return val === true;
}) })
.required("این فیلد اجباری است!"), .required("این فیلد اجباری است!"),
guilds: yup
.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
);
}
),
}); });
export const getInitialValues = (guild) => ({ export const getInitialValues = (guild) => ({
@@ -56,10 +77,11 @@ export const getInitialValues = (guild) => ({
gender: guild?.user?.gender || "", gender: guild?.user?.gender || "",
person_city: guild?.user?.city || "", person_city: guild?.user?.city || "",
is_alive: guild?.user?.isAlive || "", is_alive: guild?.user?.isAlive || "",
guild_name: guild?.guildsName || "", guild_name: guild?.guildsName || guild?.name || "",
area_activity: guild?.areaActivity || "", area_activity: guild?.areaActivity || "",
state: guild?.address?.province?.name || "", state: guild?.address?.province?.name || "",
city: guild?.address?.city?.name || "", province: guild?.address?.province?.key || "",
city_name: guild?.address?.city?.name || "",
address: guild?.address?.address || "", address: guild?.address?.address || "",
license_expire_date: normalizeDatabaseDate(guild?.licenseExpireDate || ""), license_expire_date: normalizeDatabaseDate(guild?.licenseExpireDate || ""),
license_status: guild?.licenseStatus || "", license_status: guild?.licenseStatus || "",
@@ -92,4 +114,22 @@ export const getInitialValues = (guild) => ({
company_identifier: guild?.companyIdentifier || "", company_identifier: guild?.companyIdentifier || "",
type_activity_name: guild?.typeActivityName || "", type_activity_name: guild?.typeActivityName || "",
active: guild?.active ?? null, active: guild?.active ?? null,
guilds: guild
? [
{
steward:
typeof guild?.steward === "boolean"
? guild.steward
: typeof guild?.isSteward === "boolean"
? guild.isSteward
: false,
guild:
typeof guild?.guild === "boolean"
? guild.guild
: typeof guild?.isGuild === "boolean"
? guild.isGuild
: false,
},
]
: [],
}); });

View File

@@ -1,8 +1,9 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Button, TextField } from "@mui/material"; import { Button, TextField, Typography } from "@mui/material";
import { useDispatch } from "react-redux"; import { useDispatch } from "react-redux";
import { RiSearchLine } from "react-icons/ri"; import { RiSearchLine } from "react-icons/ri";
import { import {
CLOSE_MODAL,
LOADING_END, LOADING_END,
LOADING_START, LOADING_START,
OPEN_MODAL, OPEN_MODAL,
@@ -14,6 +15,8 @@ import { ManageGuildsRequestsOperations } from "../manage-guilds-requests-operat
import { CreateGuilds } from "../create-guilds/CreateGuilds"; import { CreateGuilds } from "../create-guilds/CreateGuilds";
import { provinceGetTotalGuildsService } from "../../services/province-get-total-guilds"; import { provinceGetTotalGuildsService } from "../../services/province-get-total-guilds";
import { provinceGetTotalStewardsService } from "../../services/province-get-total-stewards"; import { provinceGetTotalStewardsService } from "../../services/province-get-total-stewards";
import { formatTime } from "../../../../utils/formatTime";
import { ProvinceLegalGuildsForm } from "../province-legal-guilds-in-province/ProvinceLegalGuildsForm";
export const ManageGuildsRequests = ({ userType }) => { export const ManageGuildsRequests = ({ userType }) => {
const IS_STEWARD = userType === "steward"; const IS_STEWARD = userType === "steward";
@@ -76,6 +79,7 @@ export const ManageGuildsRequests = ({ userType }) => {
const d = data?.map((item, i) => { const d = data?.map((item, i) => {
return [ return [
page === 1 ? i + 1 : i + perPage * (page - 1) + 1, page === 1 ? i + 1 : i + perPage * (page - 1) + 1,
formatTime(item?.createDate) || "-",
`${item?.registerarFullname || ""} ${ `${item?.registerarFullname || ""} ${
item?.registerarMobile ? "(" + item?.registerarMobile + " )" : " " item?.registerarMobile ? "(" + item?.registerarMobile + " )" : " "
}`, }`,
@@ -130,7 +134,9 @@ export const ManageGuildsRequests = ({ userType }) => {
dispatch(LOADING_END()); dispatch(LOADING_END());
} }
}; };
{
/* */
}
return ( return (
<Grid container xs={12} justifyContent="center" alignItems="center" gap={2}> <Grid container xs={12} justifyContent="center" alignItems="center" gap={2}>
<Grid <Grid
@@ -148,12 +154,71 @@ export const ManageGuildsRequests = ({ userType }) => {
OPEN_MODAL({ OPEN_MODAL({
title: `ثبت ${IS_STEWARD ? "مباشر" : "صنف"} جدید`, title: `ثبت ${IS_STEWARD ? "مباشر" : "صنف"} جدید`,
size: window.innerWidth <= 600 ? "small" : "auto", size: window.innerWidth <= 600 ? "small" : "auto",
content: <CreateGuilds updateTable={updateTable} />, content: (
<Grid container>
<Grid xs={12} mb={2}>
<Typography>{`نوع ${
IS_STEWARD ? "مباشر" : "صنف"
}:`}</Typography>
</Grid>
<Grid container justifyContent="flex-end" gap={1} xs={12}>
<Button
variant="contained"
color="primary"
onClick={() => {
dispatch(CLOSE_MODAL());
dispatch(
OPEN_MODAL({
title: `ثبت ${
IS_STEWARD ? "مباشر" : "صنف"
} حقیقی جدید`,
size:
window.innerWidth <= 600 ? "small" : "auto",
content: (
<CreateGuilds updateTable={updateTable} />
),
})
);
}}
style={{ flex: 1 }}
>
حقیقی
</Button>
<Button
style={{ flex: 1 }}
variant="outlined"
color="primary"
onClick={() => {
dispatch(CLOSE_MODAL());
dispatch(
OPEN_MODAL({
title: `ثبت ${
IS_STEWARD
? "مباشر حقوقی جدید"
: "صنف حقوقی جدید"
}`,
content: (
<ProvinceLegalGuildsForm
onClose={() => dispatch(CLOSE_MODAL())}
updateTable={updateTable}
userType={userType}
/>
),
size: 400,
}) })
); );
}} }}
> >
{`ثبت ${IS_STEWARD ? "مباشر" : "صنف"} جدید`} حقوقی
</Button>
</Grid>
</Grid>
),
})
);
}}
>
{`ثبت ${IS_STEWARD ? "مباشر" : "صنف"}`}
</Button> </Button>
)} )}
@@ -182,6 +247,7 @@ export const ManageGuildsRequests = ({ userType }) => {
data={tableData} data={tableData}
columns={[ columns={[
"ردیف", "ردیف",
"تاریخ ثبت",
"ثبت کننده", "ثبت کننده",
`شناسه ${IS_STEWARD ? "مباشر" : "صنف"}`, `شناسه ${IS_STEWARD ? "مباشر" : "صنف"}`,
`نام ${IS_STEWARD ? "مباشر" : "واحد صنفی"}`, `نام ${IS_STEWARD ? "مباشر" : "واحد صنفی"}`,

View File

@@ -14,6 +14,7 @@ import { SimpleTable } from "../../../../components/simple-table/SimpleTable";
import { CreateGuilds } from "../create-guilds/CreateGuilds"; import { CreateGuilds } from "../create-guilds/CreateGuilds";
import { checkPathStartsWith } from "../../../../utils/checkPathStartsWith"; import { checkPathStartsWith } from "../../../../utils/checkPathStartsWith";
import { provinceGetTotalStewardsService } from "../../services/province-get-total-stewards"; import { provinceGetTotalStewardsService } from "../../services/province-get-total-stewards";
import { formatTime } from "../../../../utils/formatTime";
export const ManageGuilds = ({ userType }) => { export const ManageGuilds = ({ userType }) => {
const IS_STEWARD = userType === "steward"; const IS_STEWARD = userType === "steward";
@@ -100,6 +101,10 @@ export const ManageGuilds = ({ userType }) => {
const d = data.map((item, i) => { const d = data.map((item, i) => {
const commonData = [ const commonData = [
page === 1 ? i + 1 : i + perPage * (page - 1) + 1, page === 1 ? i + 1 : i + perPage * (page - 1) + 1,
formatTime(item?.createDate) || "-",
`${item?.registerarFullname || ""} ${
item?.registerarMobile ? "(" + item?.registerarMobile + " )" : " "
}`,
item?.licenseNumber || "-", item?.licenseNumber || "-",
(IS_STEWARD ? item?.name : item?.guildsName) || "-", (IS_STEWARD ? item?.name : item?.guildsName) || "-",
`${item?.user?.fullname || "-"} (${item?.user?.mobile || "-"})`, `${item?.user?.fullname || "-"} (${item?.user?.mobile || "-"})`,
@@ -268,7 +273,6 @@ export const ManageGuilds = ({ userType }) => {
> >
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit}>
<Grid container alignItems="center" gap={SPACING.SMALL}> <Grid container alignItems="center" gap={SPACING.SMALL}>
{["KillHouse", "GuildRoom"].includes(getRoleFromUrl()) && (
<Button <Button
variant="contained" variant="contained"
onClick={() => { onClick={() => {
@@ -283,9 +287,8 @@ export const ManageGuilds = ({ userType }) => {
); );
}} }}
> >
{`ثبت ${IS_STEWARD ? "مباشر" : "صنف"} جدید`} {`ثبت ${IS_STEWARD ? "مباشر" : "صنف"}`}
</Button> </Button>
)}
<TextField <TextField
size="small" size="small"
@@ -360,6 +363,8 @@ export const ManageGuilds = ({ userType }) => {
getRoleFromUrl() === "CityJahad" || getRoleFromUrl() === "CityPoultry" getRoleFromUrl() === "CityJahad" || getRoleFromUrl() === "CityPoultry"
? [ ? [
"ردیف", "ردیف",
"تاریخ ثبت",
"ثبت کننده",
IS_STEWARD ? "شناسه مباشر" : "شناسه صنف", IS_STEWARD ? "شناسه مباشر" : "شناسه صنف",
"نام واحد صنفی", "نام واحد صنفی",
"نام شخص/شرکت", "نام شخص/شرکت",
@@ -381,6 +386,8 @@ export const ManageGuilds = ({ userType }) => {
: getRoleFromUrl() === "KillHouse" : getRoleFromUrl() === "KillHouse"
? [ ? [
"ردیف", "ردیف",
"تاریخ ثبت",
"ثبت کننده",
IS_STEWARD ? "شناسه مباشر" : "شناسه صنف", IS_STEWARD ? "شناسه مباشر" : "شناسه صنف",
"نام واحد صنفی", "نام واحد صنفی",
"نام شخص/شرکت", "نام شخص/شرکت",
@@ -400,6 +407,8 @@ export const ManageGuilds = ({ userType }) => {
] ]
: [ : [
"ردیف", "ردیف",
"تاریخ ثبت",
"ثبت کننده",
IS_STEWARD ? "شناسه مباشر" : "شناسه صنف", IS_STEWARD ? "شناسه مباشر" : "شناسه صنف",
"نام واحد صنفی", "نام واحد صنفی",
"نام شخص/شرکت", "نام شخص/شرکت",

View File

@@ -90,30 +90,27 @@ const InfoBox = ({ icon: Icon, label, value, iconSx }) => (
</Box> </Box>
); );
const getValidationSchema = (isAdmin, userFound) => const getValidationSchema = () =>
yup.object({ yup.object({
national_id: yup national_id: yup
.string() .string()
.required("شناسه حقوقی الزامی است") .required("شناسه حقوقی الزامی است")
.matches(/^[0-9]{11}$/, "شناسه حقوقی باید 11 رقم باشد"), .matches(/^[0-9]{11}$/, "شناسه حقوقی باید 11 رقم باشد"),
first_name: yup.string(), first_name: yup.string().required("نام اجباری است."),
last_name: yup.string(), last_name: yup.string().required("نام خانوادگی اجباری است."),
unit_name: yup.string(), unit_name: yup.string(),
name: yup.string(), name: yup.string(),
province: yup.string(), province: yup.string(),
city: yup.string(), city: yup.string(),
mobile: mobile: yup
isAdmin || !userFound
? yup
.string() .string()
.nullable()
.test( .test(
"mobile-format", "mobile-format",
"شماره تلفن باید 11 رقم باشد", "شماره تلفن باید 11 رقم باشد",
(value) => !value || /^[0-9]{11}$/.test(value) (value) => !value || /^[0-9]{11}$/.test(value)
) )
: yup.string(), .required("شماره موبایل اجباری است."),
type_activity: yup.string(), type_activity: yup.string().required("نوع فعالیت اجباری است."),
}); });
const LegalGuildForm = ({ const LegalGuildForm = ({
@@ -125,7 +122,7 @@ const LegalGuildForm = ({
cities, cities,
}) => { }) => {
const IS_STEWARD = userType === "steward"; const IS_STEWARD = userType === "steward";
const IS_ADMIN = getRoleFromUrl() === "AdminX";
return ( return (
<form onSubmit={formik.handleSubmit}> <form onSubmit={formik.handleSubmit}>
<Grid container gap={SPACING.SMALL} p={2}> <Grid container gap={SPACING.SMALL} p={2}>
@@ -146,7 +143,7 @@ const LegalGuildForm = ({
error={Boolean(formik.errors.national_id)} error={Boolean(formik.errors.national_id)}
helperText={formik.errors.national_id} helperText={formik.errors.national_id}
inputProps={{ maxLength: 11 }} inputProps={{ maxLength: 11 }}
disabled={true} disabled={!IS_ADMIN}
/> />
) : ( ) : (
<InfoBox <InfoBox
@@ -583,8 +580,9 @@ export const ProvinceLegalGuildsForm = ({
const formik = useFormik({ const formik = useFormik({
initialValues: formikIntitialValues, initialValues: formikIntitialValues,
validationSchema: getValidationSchema(isAdmin, userFound, userType), validationSchema: getValidationSchema(),
enableReinitialize: true, enableReinitialize: true,
validateOnMount: true,
onSubmit: (values) => { onSubmit: (values) => {
// Find type_activity key from the title // Find type_activity key from the title
const typeActivityObj = typeActivities.find( const typeActivityObj = typeActivities.find(

View File

@@ -11,6 +11,7 @@ import ResponsiveTable from "../../../../components/responsive-table/ResponsiveT
import { RiSearchLine } from "react-icons/ri"; import { RiSearchLine } from "react-icons/ri";
import { provinceGetTotalStewardsService } from "../../services/province-get-total-stewards"; import { provinceGetTotalStewardsService } from "../../services/province-get-total-stewards";
import { checkPathStartsWith } from "../../../../utils/checkPathStartsWith"; import { checkPathStartsWith } from "../../../../utils/checkPathStartsWith";
import { formatTime } from "../../../../utils/formatTime";
export const ProvinceLegalGuildsInProvince = ({ userType }) => { export const ProvinceLegalGuildsInProvince = ({ userType }) => {
const IS_STEWARD = userType === "steward"; const IS_STEWARD = userType === "steward";
@@ -85,6 +86,10 @@ export const ProvinceLegalGuildsInProvince = ({ userType }) => {
const d = data.map((item, i) => { const d = data.map((item, i) => {
return [ return [
page === 1 ? i + 1 : i + perPage * (page - 1) + 1, page === 1 ? i + 1 : i + perPage * (page - 1) + 1,
formatTime(item?.createDate) || "-",
`${item?.registerarFullname || ""} ${
item?.registerarMobile ? "(" + item?.registerarMobile + " )" : " "
}`,
(IS_STEWARD ? item?.licenseNumber : item?.nationalId) || "-", (IS_STEWARD ? item?.licenseNumber : item?.nationalId) || "-",
(IS_STEWARD ? item?.name : item?.guildsName) || "-", (IS_STEWARD ? item?.name : item?.guildsName) || "-",
`${item?.user?.fullname || "-"}`, `${item?.user?.fullname || "-"}`,
@@ -195,6 +200,8 @@ export const ProvinceLegalGuildsInProvince = ({ userType }) => {
title={TABLE_TITLE} title={TABLE_TITLE}
columns={[ columns={[
"ردیف", "ردیف",
"تاریخ ثبت",
"ثبت کننده",
"شناسه حقوقی", "شناسه حقوقی",
"نام واحد", "نام واحد",
"نام و نام خانوادگی", "نام و نام خانوادگی",