From 6ad675c3df77b819537559d63e9dc2e58c89c6a9 Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Mon, 11 Dec 2023 14:54:42 +0330 Subject: [PATCH 01/39] debug witel pakage problems --- .../navgan/add-request-loan/forms/AddForm.jsx | 95 +++---------------- .../navgan/add-request-loan/index.jsx | 12 +-- src/components/login/SendToken.jsx | 5 +- src/components/login/SendUserData.jsx | 5 +- src/components/register/RequestOtp.jsx | 5 +- src/components/register/index.jsx | 5 +- src/components/register/navy/UserRegister.jsx | 5 +- src/core/components/ResendToken.jsx | 7 +- src/pages/register/navy/index.jsx | 2 +- 9 files changed, 26 insertions(+), 115 deletions(-) diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index df79a4c..88d33c0 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -1,10 +1,7 @@ -import Notifications from "@/core/components/notifications"; import SelectBox from "@/core/components/SelectBox"; import StyledForm from "@/core/components/StyledForm"; import UploadSystem from "@/core/components/UploadSystem"; import {GET_PROVINCE_LIST, SEND_LOAN_REQUEST_NAVGAN,} from "@/core/data/apiRoutes"; -import useDirection from "@/lib/app/hooks/useDirection"; -import useUser from "@/lib/app/hooks/useUser"; import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; import {Box, Button, Stack, TextField} from "@mui/material"; import axios from "axios"; @@ -12,6 +9,7 @@ import {Field, Formik} from "formik"; import {useTranslations} from "next-intl"; import {useEffect, useState} from "react"; import * as Yup from "yup"; +import {useDirection, useUser} from "@witel/webapp-builder"; const AddFormComponent = () => { const t = useTranslations(); @@ -34,7 +32,6 @@ const AddFormComponent = () => { setProvinceList(formattedData); }) .catch((error) => { - Notifications(t, error.response); }); }, []); // end get province list @@ -115,7 +112,6 @@ const AddFormComponent = () => { // submit const handleSubmit = async (values, props) => { - Notifications(t, undefined); const formData = new FormData(); formData.append("name", values.name); formData.append("phone_number", values.phone_number); @@ -138,10 +134,8 @@ const AddFormComponent = () => { }, }) .then(function (response) { - Notifications(t, response); }) .catch(function (error) { - Notifications(t, error.response); props.setSubmitting(false); }); }; @@ -181,15 +175,23 @@ const AddFormComponent = () => { { } /> - - - { /> - - - handleUploadChangeShenasname(e, props.setFieldValue) - } - setselectedImage={setSelectedImageShenasname} - setFieldValue={props.setFieldValue} - fieldname="shenasname_img" - fileType={fileTypeShenasname} - fileName={fileNameShenasname} - imageAlt={t("app_name")} - imageSize={[300 /*width*/, 150 /*height*/]} - label={t("LoanRequest.file_field_shenasname_image")} - /> - - handleUploadChangeNationalCard(e, props.setFieldValue) - } - setselectedImage={setSelectedImageNationalCard} - setFieldValue={props.setFieldValue} - fieldname="national_card_img" - fileType={fileTypeNationalCard} - fileName={fileNameNationalCard} - imageAlt={t("app_name")} - imageSize={[300 /*width*/, 150 /*height*/]} - label={t("LoanRequest.file_field_national_card_image")} - /> - { const t = useTranslations(); const {user} = useUser(); return ( - - - + <> + { - - + ); }; diff --git a/src/components/login/SendToken.jsx b/src/components/login/SendToken.jsx index 2a2f287..044ede9 100644 --- a/src/components/login/SendToken.jsx +++ b/src/components/login/SendToken.jsx @@ -1,9 +1,6 @@ import ResendToken from "@/core/components/ResendToken"; import StyledForm from "@/core/components/StyledForm"; import {LOGIN} from "@/core/data/apiRoutes"; -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; -import useUser from "@/lib/app/hooks/useUser"; import ChangeCircleIcon from "@mui/icons-material/ChangeCircle"; import LoginIcon from "@mui/icons-material/Login"; import {Box, Button, Container, Grid, Paper, Stack, TextField, Typography,} from "@mui/material"; @@ -11,8 +8,8 @@ import {Field, Formik} from "formik"; import {useTranslations} from "next-intl"; import * as Yup from "yup"; import SvgLogin from "@/core/components/svgs/SvgLogin"; -import useRequest from "@/lib/app/hooks/useRequest"; import AutoSubmit from "@/core/components/AutoSubmit"; +import {CenterLayout, FullPageLayout, useRequest, useUser} from "@witel/webapp-builder"; const SendTokenComponent = ({ PhoneNumber, diff --git a/src/components/login/SendUserData.jsx b/src/components/login/SendUserData.jsx index 6743799..a4c598a 100644 --- a/src/components/login/SendUserData.jsx +++ b/src/components/login/SendUserData.jsx @@ -1,8 +1,5 @@ -import LinkRouting from "@/core/components/LinkRouting"; import StyledForm from "@/core/components/StyledForm"; import {SEND_OTP_TOKEN} from "@/core/data/apiRoutes"; -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; import FingerprintIcon from "@mui/icons-material/Fingerprint"; import PersonAddIcon from "@mui/icons-material/PersonAdd"; import {Button, Container, Grid, Paper, Stack, TextField, Typography,} from "@mui/material"; @@ -11,7 +8,7 @@ import {useTranslations} from "next-intl"; import {useSearchParams} from "next/navigation"; import * as Yup from "yup"; import SvgLogin from "@/core/components/svgs/SvgLogin"; -import useRequest from "@/lib/app/hooks/useRequest"; +import {CenterLayout, FullPageLayout, LinkRouting, useRequest} from "@witel/webapp-builder"; const SendUserDataComponent = ({ setOtpToken, diff --git a/src/components/register/RequestOtp.jsx b/src/components/register/RequestOtp.jsx index a24aa4f..4729226 100644 --- a/src/components/register/RequestOtp.jsx +++ b/src/components/register/RequestOtp.jsx @@ -1,8 +1,5 @@ -import LinkRouting from "@/core/components/LinkRouting"; import StyledForm from "@/core/components/StyledForm"; import {SEND_OTP_TOKEN} from "@/core/data/apiRoutes"; -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; import FingerprintIcon from "@mui/icons-material/Fingerprint"; import {Button, Container, Paper, Stack, TextField, Typography,} from "@mui/material"; import {Field, Formik} from "formik"; @@ -10,7 +7,7 @@ import {useTranslations} from "next-intl"; import {useSearchParams} from "next/navigation"; import * as Yup from "yup"; import SvgLogin from "@/core/components/svgs/SvgLogin"; -import useRequest from "@/lib/app/hooks/useRequest"; +import {CenterLayout, FullPageLayout, LinkRouting, useRequest} from "@witel/webapp-builder"; const RequestOtpComponent = ({ setOtpToken, diff --git a/src/components/register/index.jsx b/src/components/register/index.jsx index eb11ad0..9036878 100644 --- a/src/components/register/index.jsx +++ b/src/components/register/index.jsx @@ -1,11 +1,8 @@ -import LinkRouting, {NextLinkComposed} from "@/core/components/LinkRouting"; -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; -import useUser from "@/lib/app/hooks/useUser"; import {Box, Button, Grid, Stack} from "@mui/material"; import {useTranslations} from "next-intl"; import {useSearchParams} from "next/navigation"; import SvgDashboard from "@/core/components/svgs/SvgDashboard"; +import {CenterLayout, FullPageLayout, LinkRouting, NextLinkComposed, useUser} from "@witel/webapp-builder"; const RegisterComponent = () => { const t = useTranslations(); diff --git a/src/components/register/navy/UserRegister.jsx b/src/components/register/navy/UserRegister.jsx index 9714636..81a3f45 100644 --- a/src/components/register/navy/UserRegister.jsx +++ b/src/components/register/navy/UserRegister.jsx @@ -1,7 +1,5 @@ import StyledForm from "@/core/components/StyledForm"; import {REGISTER} from "@/core/data/apiRoutes"; -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; import LoginIcon from "@mui/icons-material/Login"; import ChangeCircleIcon from "@mui/icons-material/ChangeCircle"; import {Box, Button, Chip, Container, Divider, Paper, Stack, TextField, Typography,} from "@mui/material"; @@ -9,10 +7,9 @@ import {Field, Formik} from "formik"; import {useTranslations} from "next-intl"; import * as Yup from "yup"; import ResendToken from "@/core/components/ResendToken"; -import useUser from "@/lib/app/hooks/useUser"; import SvgRegister from "@/core/components/svgs/SvgRegister"; -import useRequest from "@/lib/app/hooks/useRequest"; import AutoSubmit from "@/core/components/AutoSubmit"; +import {CenterLayout, FullPageLayout, useRequest, useUser} from "@witel/webapp-builder"; const UserRegisterComponent = ({ PhoneNumber, diff --git a/src/core/components/ResendToken.jsx b/src/core/components/ResendToken.jsx index 906581c..d564397 100644 --- a/src/core/components/ResendToken.jsx +++ b/src/core/components/ResendToken.jsx @@ -1,11 +1,8 @@ -import Notifications from "@/core/components/notifications"; -import useDirection from "@/lib/app/hooks/useDirection"; import {Button} from "@mui/material"; -import axios from "axios"; import {useTranslations} from "next-intl"; import {useEffect} from "react"; -import {LOGIN, SEND_OTP_TOKEN} from "../data/apiRoutes"; -import useRequest from "@/lib/app/hooks/useRequest"; +import {SEND_OTP_TOKEN} from "../data/apiRoutes"; +import {useDirection, useRequest} from "@witel/webapp-builder"; const ResendToken = ({initialTimerValue, timer, setTimer, PhoneNumber, disabled}) => { const t = useTranslations(); diff --git a/src/pages/register/navy/index.jsx b/src/pages/register/navy/index.jsx index 2272d57..8c0f278 100644 --- a/src/pages/register/navy/index.jsx +++ b/src/pages/register/navy/index.jsx @@ -1,6 +1,6 @@ import NavyComponent from "@/components/register/navy"; -import WithoutAuthMiddleware from "@/middlewares/WithoutAuth"; import {parse} from "next-useragent"; +import {WithoutAuthMiddleware} from "@witel/webapp-builder"; export default function Register() { return ( From 35bf4f7a7d6d9c77d49efac4d017a076efc56b67 Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Mon, 11 Dec 2023 15:39:43 +0330 Subject: [PATCH 02/39] replace field with textField and add error validation to it --- public/locales/fa/app.json | 2 + .../navgan/add-request-loan/forms/AddForm.jsx | 536 +++++++----------- 2 files changed, 213 insertions(+), 325 deletions(-) diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 2eeb753..fe291f9 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -136,6 +136,7 @@ "error_message_province_id": "لطفا استان خود را وارد کنید!", "error_message_national_id": "لطفا کد ملی خود را وارد کنید!", "error_message_shenasname_id": "لطفا شماره شناسنامه خود را وارد کنید!", + "error_message_national_code": "لطفا کد ملی خود را وارد کنید!", "text_field_phone_number": "شماره تلفن", "text_field_enter_your_phone_number": "شماره تلفن خود را وارد کنید", "text_field_name": "نام", @@ -145,6 +146,7 @@ "text_field_province_id": "استان", "text_field_loading_provinces_list": "درحال دریافت استان ها", "text_field_error_fetching_provinces": "خطا در دریافت استان ها", + "text_field_enter_your_national_code": "کد ملی خود را وارد کنید", "text_field_enter_your_province_id": "استان خود را وارد کنید", "text_field_navgan_id": "شماره ناوگان", "text_field_enter_your_navgan_id": "شماره ناوگان خود را وارد کنید", diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index 88d33c0..ee7687d 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -1,22 +1,17 @@ import SelectBox from "@/core/components/SelectBox"; -import StyledForm from "@/core/components/StyledForm"; -import UploadSystem from "@/core/components/UploadSystem"; import {GET_PROVINCE_LIST, SEND_LOAN_REQUEST_NAVGAN,} from "@/core/data/apiRoutes"; import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; import {Box, Button, Stack, TextField} from "@mui/material"; import axios from "axios"; -import {Field, Formik} from "formik"; +import {useFormik} from "formik"; import {useTranslations} from "next-intl"; import {useEffect, useState} from "react"; import * as Yup from "yup"; -import {useDirection, useUser} from "@witel/webapp-builder"; +import {useUser} from "@witel/webapp-builder"; const AddFormComponent = () => { const t = useTranslations(); - const {directionApp} = useDirection(); const {token} = useUser(); - - // get province list const [provinceList, setProvinceList] = useState([]); useEffect(() => { axios @@ -31,50 +26,11 @@ const AddFormComponent = () => { })); setProvinceList(formattedData); }) - .catch((error) => { - }); + .catch((error) => {}); }, []); - // end get province list - // upload files - const [selectedImageShenasname, setSelectedImageShenasname] = useState( - "/images/upload-image.svg" - ); - const [fileTypeShenasname, setFileTypeShenasname] = useState(null); - const [fileNameShenasname, setFileNameShenasname] = useState(null); - const [selectedImageNationalCard, setSelectedImageNationalCard] = useState( - "/images/upload-image.svg" - ); - const [fileTypeNationalCard, setFileTypeNationalCard] = useState(null); - const [fileNameNationalCard, setFileNameNationalCard] = useState(null); - const handleUploadChangeShenasname = (event, setFieldValue) => { - const uploadedFile = event.target?.files?.[0]; - if (uploadedFile) { - const fileType = event.target?.files?.[0].type; - const fileName = event.target?.files?.[0].name; - setSelectedImageShenasname(URL.createObjectURL(uploadedFile)); - setFileTypeShenasname(fileType); - setFileNameShenasname(fileName); - setFieldValue("shenasname_img", uploadedFile); - } - }; - const handleUploadChangeNationalCard = (event, setFieldValue) => { - const uploadedFile = event.target?.files?.[0]; - const fileType = event.target.files[0].type; - const fileName = event.target.files[0].name; - if (uploadedFile) { - setSelectedImageNationalCard(URL.createObjectURL(uploadedFile)); - setFileTypeNationalCard(fileType); - setFileNameNationalCard(fileName); - setFieldValue("national_card_img", uploadedFile); - } - }; - // end upload files - - // initial values const initialValues = { - name: "", phone_number: "", vehicle_type: "", plate_number: "", @@ -85,11 +41,8 @@ const AddFormComponent = () => { national_card_img: null, shenasname_img: null, }; - // end initial values - // validation const validationSchema = Yup.object().shape({ - name: Yup.string().required(t("LoanRequest.error_message_name")), phone_number: Yup.string().required( t("LoanRequest.error_message_phone_number") ), @@ -108,12 +61,8 @@ const AddFormComponent = () => { t("LoanRequest.error_message_shenasname_id") ), }); - // end validation - - // submit const handleSubmit = async (values, props) => { const formData = new FormData(); - formData.append("name", values.name); formData.append("phone_number", values.phone_number); formData.append("vehicle_type", values.vehicle_type); formData.append("plate_number", values.plate_number); @@ -139,283 +88,220 @@ const AddFormComponent = () => { props.setSubmitting(false); }); }; - // end submit + + const formik = useFormik({ + initialValues, validationSchema, onSubmit: handleSubmit + }) return ( - - {(props) => ( - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )} - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); }; From 5946daeb2bb53f43eba0c38aa25149f8f18a342c Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Tue, 12 Dec 2023 09:16:13 +0330 Subject: [PATCH 03/39] use request and grid instead of box --- public/locales/fa/app.json | 15 +- .../navgan/add-request-loan/forms/AddForm.jsx | 180 ++++++------------ src/core/components/SelectBox.jsx | 10 +- 3 files changed, 69 insertions(+), 136 deletions(-) diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index fe291f9..9473555 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -140,6 +140,7 @@ "text_field_phone_number": "شماره تلفن", "text_field_enter_your_phone_number": "شماره تلفن خود را وارد کنید", "text_field_name": "نام", + "text_field_city_id": "شهر", "text_field_enter_your_name": "نام خود را وارد کنید", "text_field_vehicle_type": "نام وسیله نقلیه", "text_field_enter_your_vehicle_type": "نام وسیله نقلیه خود را وارد کنید", @@ -148,6 +149,7 @@ "text_field_error_fetching_provinces": "خطا در دریافت استان ها", "text_field_enter_your_national_code": "کد ملی خود را وارد کنید", "text_field_enter_your_province_id": "استان خود را وارد کنید", + "text_field_enter_your_city_id": "شهر خود را وارد کنید", "text_field_navgan_id": "شماره ناوگان", "text_field_enter_your_navgan_id": "شماره ناوگان خود را وارد کنید", "text_field_national_code": "کد ملی", @@ -157,18 +159,7 @@ "text_field_plate_number": "شماره پلاک", "text_field_enter_your_plate_number": "شماره پلاک خود را وارد کنید", "button_submit": "ثبت درخواست", - "file_field_sherkat_naft_doc": "مجوز شرکت نفت", - "file_field_estate_doc": "سند مالکیت", - "file_field_agreement_doc": "موافقت نامه اصولی", - "error_message_sherkat_naft_doc": "مجوز شرکت نفت خود را وارد کنید", - "error_message_estate_doc": "سند مالکیت خود را وارد کنید", - "error_message_agreement_doc": "موافقت نامه اصولی خود را وارد کنید", - "file_field_shenasname_image": "تصویر شناسنامه", - "file_field_national_card_image": "تصویر کارت ملی", - "file_field_payan_khedmat_image": "تصویر کارت پایان خدمت", - "error_message_national_card_image": "تصویر کارت ملی خود را وارد کنید", - "error_message_shenasname_image": "تصویر شناسنامه خود را وارد کنید", - "error_message_payan_khedmat_image": "تصویر کارت پایان خدمت خود را وارد کنید", + "error_message_city_id": "لطفا شهر خود را وارد کنید!", "add_loan_request_permission": "اکنون امکان ثبت درخواست جدید برای شما مقدور نیست" }, "EditLoanRequest": { diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index ee7687d..f5ab007 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -1,32 +1,28 @@ import SelectBox from "@/core/components/SelectBox"; import {GET_PROVINCE_LIST, SEND_LOAN_REQUEST_NAVGAN,} from "@/core/data/apiRoutes"; import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; -import {Box, Button, Stack, TextField} from "@mui/material"; +import {Box, Button, Grid, TextField} from "@mui/material"; import axios from "axios"; import {useFormik} from "formik"; import {useTranslations} from "next-intl"; import {useEffect, useState} from "react"; import * as Yup from "yup"; -import {useUser} from "@witel/webapp-builder"; +import {useRequest, useUser} from "@witel/webapp-builder"; const AddFormComponent = () => { const t = useTranslations(); const {token} = useUser(); const [provinceList, setProvinceList] = useState([]); + const requestServer = useRequest() useEffect(() => { - axios - .get(GET_PROVINCE_LIST, { - headers: {Authorization: `Bearer ${token}`}, - }) - .then(({data}) => { - const formattedData = data.map((province, index) => ({ - id: index, - name: province.name, - value: province.id, - })); - setProvinceList(formattedData); - }) - .catch((error) => {}); + requestServer(GET_PROVINCE_LIST, "get", {auth : true, notification : false}).then(({data}) => { + const formattedData = data.map((province, index) => ({ + id: index, + name: province.name, + value: province.id, + })); + setProvinceList(formattedData); + }).catch(() => {}); }, []); @@ -35,6 +31,7 @@ const AddFormComponent = () => { vehicle_type: "", plate_number: "", province_id: "", + city_id: "", navgan_id: "", national_code: "", shenasname_id: "", @@ -54,6 +51,7 @@ const AddFormComponent = () => { ), navgan_id: Yup.string().required(t("LoanRequest.error_message_navgan_id")), province_id: Yup.string().required(t("LoanRequest.error_message_province_id")), + city_id: Yup.string().required(t("LoanRequest.error_message_city_id")), national_code: Yup.string().required( t("LoanRequest.error_message_national_code") ), @@ -67,6 +65,7 @@ const AddFormComponent = () => { formData.append("vehicle_type", values.vehicle_type); formData.append("plate_number", values.plate_number); formData.append("province_id", values.province_id); + formData.append("city_id", values.city_id); formData.append("navgan_id", values.navgan_id); formData.append("national_code", values.national_code); formData.append("shenasname_id", values.shenasname_id); @@ -75,18 +74,9 @@ const AddFormComponent = () => { if (values.national_card_img != null) formData.append("national_card_image", values.national_card_img); - await axios - .post(SEND_LOAN_REQUEST_NAVGAN, formData, { - headers: { - Authorization: `Bearer ${token}`, - "Content-Type": "multipart/form-data", - }, - }) - .then(function (response) { - }) - .catch(function (error) { - props.setSubmitting(false); - }); + requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", {auth : true, notification : true}).then().catch(() => { + props.setSubmitting(false) + }) }; const formik = useFormik({ @@ -96,21 +86,9 @@ const AddFormComponent = () => { return ( <> - - { helperText={formik.touched.national_code && formik.errors.national_code} fullWidth /> - - + { error={formik.touched.phone_number && Boolean(formik.errors.phone_number)} helperText={formik.touched.phone_number && formik.errors.phone_number} /> - - - - + + + + { error={formik.touched.vehicle_type && Boolean(formik.errors.vehicle_type)} helperText={formik.touched.vehicle_type && formik.errors.vehicle_type} /> - - + + { error={formik.touched.plate_number && Boolean(formik.errors.plate_number)} helperText={formik.touched.plate_number && formik.errors.plate_number} /> - - + + + + + + + + - - - - + + + + + + + { error={formik.touched.navgan_id && Boolean(formik.errors.navgan_id)} helperText={formik.touched.navgan_id && formik.errors.navgan_id} /> - - + + { error={formik.touched.shenasname_id && Boolean(formik.errors.shenasname_id)} helperText={formik.touched.shenasname_id && formik.errors.shenasname_id} /> - - + + { setFieldValue(selectType, event.target.value); }; - const handleBlur = () => { - setFieldTouched(select, true); - }; return ( {label} { - props.setFieldValue("province_id", e.target.value); - }} - onBlur={props.handleBlur} - fullWidth - variant="outlined" - > - {isLoadingProvinceList ? ( - - {t("LoanRequest.text_field_loading_provinces_list")} - - ) : errorProvinceList ? ( - - {t("LoanRequest.text_field_error_fetching_provinces")} - - ) : ( - provinceList.map((item) => ( - - {item.name} - - )) - )} - - - {props.touched.province_id && props.errors.province_id ? props.errors.province_id : ""} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )} - - ); -}; - -export default AddFormComponent; \ No newline at end of file diff --git a/src/components/dashboard/refahi/add-request-loan/index.jsx b/src/components/dashboard/refahi/add-request-loan/index.jsx deleted file mode 100644 index bc82ac7..0000000 --- a/src/components/dashboard/refahi/add-request-loan/index.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import DashboardLayouts from "@/layouts/dashboardLayouts"; -import useUser from "@/lib/app/hooks/useUser"; -import {useTranslations} from "next-intl"; -import AddFormComponent from "@/components/dashboard/refahi/add-request-loan/forms/AddForm"; -import AccessibilityComponent from "@/components/dashboard/refahi/add-request-loan/accessibility"; - -const LoanRequestComponent = () => { - const t = useTranslations(); - const {user} = useUser(); - return ( - - {user.can_request_a_new_loan ? : } - - ); -}; - -export default LoanRequestComponent; diff --git a/src/components/dashboard/refahi/edit-request-loan/forms/EditForm.jsx b/src/components/dashboard/refahi/edit-request-loan/forms/EditForm.jsx deleted file mode 100644 index 36f5aa0..0000000 --- a/src/components/dashboard/refahi/edit-request-loan/forms/EditForm.jsx +++ /dev/null @@ -1,397 +0,0 @@ -import StyledForm from "@/core/components/StyledForm"; -import UploadSystem from "@/core/components/UploadSystem"; -import {UPDATE_LOAN_REQUEST_WELFARE} from "@/core/data/apiRoutes"; -import useDirection from "@/lib/app/hooks/useDirection"; -import useUser from "@/lib/app/hooks/useUser"; -import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; -import {Box, Button, Chip, Divider, Stack, TextField} from "@mui/material"; -import {Field, Formik} from "formik"; -import {useTranslations} from "next-intl"; -import * as Yup from "yup"; -import SelectBox from "@/core/components/SelectBox"; -import useRequest from "@/lib/app/hooks/useRequest"; -import {useRouter} from "next/router"; -import useLoading from "@/lib/app/hooks/useLoading"; - -const EditFormComponent = ({provinceList, initialValues}) => { - const t = useTranslations(); - const requestServer = useRequest(); - const router = useRouter(); - - - // validation and request action of form - const validationSchema = Yup.object().shape({ - name: Yup.string().required(t("LoanRequest.error_message_name")), - phone_number: Yup.string().required( - t("LoanRequest.error_message_phone_number") - ), - province_id: Yup.string().required(t("LoanRequest.error_message_province_id")), - national_id: Yup.string().required(t("LoanRequest.error_message_national_id")), - shenasname_id: Yup.string().required(t("LoanRequest.error_message_shenasname_id")), - sherkat_naft_doc: Yup.mixed().required(t("LoanRequest.error_message_sherkat_naft_doc")), - estate_doc: Yup.mixed().required(t("LoanRequest.error_message_estate_doc")), - agreement_doc: Yup.mixed().required(t("LoanRequest.error_message_agreement_doc")), - national_card_image: Yup.mixed().required(t("LoanRequest.error_message_national_card_image")), - shenasname_image: Yup.mixed().required(t("LoanRequest.error_message_shenasname_image")), - payan_khedmat_image: Yup.mixed().required(t("LoanRequest.error_message_payan_khedmat_image")), - }); - - const handleSubmit = (values, props) => { - const formData = new FormData(); - formData.append("name", values.name); - formData.append("phone_number", values.phone_number); - formData.append("province_id", values.province_id); - formData.append("national_id", values.national_id); - formData.append("shenasname_id", values.shenasname_id); - if (values.sherkat_naft_doc != initialValues.sherkat_naft_doc) - formData.append("sherkat_naft_doc", values.sherkat_naft_doc); - if (values.estate_doc != initialValues.estate_doc) - formData.append("estate_doc", values.estate_doc); - if (values.agreement_doc != initialValues.agreement_doc) - formData.append("agreement_doc", values.agreement_doc); - if (values.shenasname_image != initialValues.shenasname_image) - formData.append("shenasname_image", values.shenasname_image); - if (values.national_card_image != initialValues.national_card_image) - formData.append("national_card_image", values.national_card_image); - if (values.payan_khedmat_image != initialValues.payan_khedmat_image) - formData.append("payan_khedmat_image", values.payan_khedmat_image); - - requestServer(UPDATE_LOAN_REQUEST_WELFARE + router.query.id, "post", {auth: true, data: formData}) - .then(function (response) { - }) - .catch(function (error) { - }) - .finally(function () { - props.setSubmitting(false); - }); - }; - if (!initialValues) return ""; - return ( - - {(props) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )} - - ); -}; - -export default EditFormComponent; \ No newline at end of file diff --git a/src/components/dashboard/refahi/edit-request-loan/index.jsx b/src/components/dashboard/refahi/edit-request-loan/index.jsx deleted file mode 100644 index 89de937..0000000 --- a/src/components/dashboard/refahi/edit-request-loan/index.jsx +++ /dev/null @@ -1,81 +0,0 @@ -import DashboardLayouts from "@/layouts/dashboardLayouts"; -import EditFormComponent from "@/components/dashboard/refahi/edit-request-loan/forms/EditForm"; -import {useEffect, useState} from "react"; -import {DETAILS_LOAN_REQUEST_WELFARE, GET_PROVINCE_LIST} from "@/core/data/apiRoutes"; -import useLoading from "@/lib/app/hooks/useLoading"; -import useRequest from "@/lib/app/hooks/useRequest"; -import {useRouter} from "next/router"; -import {log} from "next/dist/server/typescript/utils"; - -const LoanRequestComponent = () => { - const requestServer = useRequest(); - const {setLoadingPage} = useLoading(); - const router = useRouter(); - - const [provinceList, setProvinceList] = useState(null); - const [initialValues, setInitialValues] = useState(null); - - // get province list - useEffect(() => { - setLoadingPage(true); - requestServer(GET_PROVINCE_LIST, "get", {auth: true, notification: false}) - .then(function ({data}) { - const formattedData = data.map((province, index) => ({ - id: index, - name: province.name, - value: province.id, - })); - setProvinceList(formattedData); - }).catch(() => { - setLoadingPage(false); - }); - }, []); - - // get form data - useEffect(() => { - if (!provinceList) return; - setLoadingPage(true); - requestServer(DETAILS_LOAN_REQUEST_WELFARE + router.query.id, "get", {auth: true, notification: false}) - .then(function ({data}) { - const item = data.data; - const formattedData = { - name: item.name, - phone_number: item.phone_number, - province_id: item.province_id, - national_id: item.national_id, - shenasname_id: item.shenasname_id, - sherkat_naft_doc: item.sherkat_naft_doc, - estate_doc: item.estate_doc, - agreement_doc: item.agreement_doc, - national_card_image: item.national_card_image, - shenasname_image: item.shenasname_image, - payan_khedmat_image: item.payan_khedmat_image, - state_id: item.state_id - }; - setInitialValues(formattedData); - }) - .catch(() => { - setLoadingPage(false); - }); - }, [provinceList, router]); - - // Redirect to /dashboard/refahi/followUp-loan if state_id is not 7 - useEffect(() => { - if (!initialValues) return - if (initialValues.state_id === 7) return - - router.replace('/dashboard/refahi/followUp-loan'); - }, [initialValues]); - - return ( - <> - {initialValues && initialValues.state_id === 7 && ( - - - - )} - - ); -}; - -export default LoanRequestComponent; \ No newline at end of file diff --git a/src/components/dashboard/refahi/followUp-loan/RequestCard.jsx b/src/components/dashboard/refahi/followUp-loan/RequestCard.jsx deleted file mode 100644 index 799d296..0000000 --- a/src/components/dashboard/refahi/followUp-loan/RequestCard.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import { - Card, - CardContent, - CardHeader, - Grid, IconButton, Tooltip, - Typography, -} from "@mui/material"; -import SellIcon from '@mui/icons-material/Sell'; -import EditIcon from '@mui/icons-material/Edit'; -import {useTranslations} from "next-intl"; -import {NextLinkComposed} from "@/core/components/LinkRouting"; - - -const RequestCard = ({item}) => { - const t = useTranslations(); - return ( - - - } - title={`${t("LoanFollowUp.request_number")}: (${item.id})`} - subheader={item.latest_history_created_at} - action={ - item.state_id === 7 ? ( // Use the ternary operator or if/else inside curly braces - - - - - - ) : null - } - /> - - - {item.loan_state} - - - - - ); -}; - -export default RequestCard; \ No newline at end of file diff --git a/src/components/dashboard/refahi/followUp-loan/index.jsx b/src/components/dashboard/refahi/followUp-loan/index.jsx deleted file mode 100644 index 32b121d..0000000 --- a/src/components/dashboard/refahi/followUp-loan/index.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import DashboardLayouts from "@/layouts/dashboardLayouts"; -import {Grid, Stack, Typography,} from "@mui/material"; -import {useEffect, useState} from "react"; -import {SHOW_LOAN_REQUEST_WELFARE} from "@/core/data/apiRoutes"; -import useLoading from "@/lib/app/hooks/useLoading"; -import useRequest from "@/lib/app/hooks/useRequest"; -import moment from "jalali-moment"; -import RequestCard from "@/components/dashboard/refahi/followUp-loan/RequestCard"; -import {useTranslations} from "next-intl"; - -const LoanFollowUpComponent = () => { - const t = useTranslations() - const requestServer = useRequest(); - const {setLoadingPage} = useLoading(); - const [requestsList, setRequestsList] = useState(null); - // get form data - useEffect(() => { - setLoadingPage(true) - requestServer(SHOW_LOAN_REQUEST_WELFARE, "get", {auth: true, notification: false}) - .then(function ({data}) { - const items = data.data; - const formattedData = items.map((item, index) => ({ - id: item.id, - latest_history_created_at: moment(item.latest_history_created_at).locale("fa").format("HH:mm | YYYY/MM/DD"), - state_id: item.state_id, - loan_state: item.loan_state, - })); - setRequestsList(formattedData); - setLoadingPage(false) - }) - .catch(function (error) { - }) - }, []); - - return ( - - {requestsList == null ? '' : requestsList.length ? ( - {requestsList.map((item, index) => ())} - ) : ({t('LoanFollowUp.no_request_found')})} - - ); -}; - -export default LoanFollowUpComponent; diff --git a/src/layouts/dashboard.jsx b/src/layouts/dashboard.jsx index 9b1a916..a9abba5 100644 --- a/src/layouts/dashboard.jsx +++ b/src/layouts/dashboard.jsx @@ -5,9 +5,11 @@ import {GET_SIDEBAR_NOTIFICATION} from "@/core/data/apiRoutes"; const DashboardLayout = (props) => { const {user} = useUser() + const middlewaresProps = props.middlewaresProps || {} return ( <> Date: Tue, 12 Dec 2023 14:46:31 +0330 Subject: [PATCH 07/39] fix breadcrumbs --- src/layouts/dashboard.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/layouts/dashboard.jsx b/src/layouts/dashboard.jsx index a9abba5..71f4ed2 100644 --- a/src/layouts/dashboard.jsx +++ b/src/layouts/dashboard.jsx @@ -2,6 +2,7 @@ import {DashboardLayout as DashboardLayoutPure, useUser} from "@witel/webapp-bui import headerProfileItems from "@/core/data/headerProfileItems"; import sidebarMenu from "@/core/data/sidebarMenu"; import {GET_SIDEBAR_NOTIFICATION} from "@/core/data/apiRoutes"; +import UserInfo from "@/middlewares/UserInfo"; const DashboardLayout = (props) => { const {user} = useUser() @@ -9,13 +10,13 @@ const DashboardLayout = (props) => { return ( <> From 469ded064388a4375e7e25b4875f45143739ef1e Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 12 Dec 2023 14:51:41 +0330 Subject: [PATCH 08/39] remove comments --- .../first/LoanDescription/TimeLineDetails.jsx | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/components/first/LoanDescription/TimeLineDetails.jsx b/src/components/first/LoanDescription/TimeLineDetails.jsx index 02e2fed..f4470e9 100644 --- a/src/components/first/LoanDescription/TimeLineDetails.jsx +++ b/src/components/first/LoanDescription/TimeLineDetails.jsx @@ -60,15 +60,5 @@ const TimeLineDetails = () => { )} ) - // return ( - // - // - // - // - // - // ) } export default TimeLineDetails \ No newline at end of file From f1becfa07b33c015b13b522b6fb83cd09cd2e76a Mon Sep 17 00:00:00 2001 From: Yasiu1376 Date: Tue, 12 Dec 2023 15:39:06 +0330 Subject: [PATCH 09/39] login middleware --- src/layouts/dashboard.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/layouts/dashboard.jsx b/src/layouts/dashboard.jsx index 71f4ed2..5e36092 100644 --- a/src/layouts/dashboard.jsx +++ b/src/layouts/dashboard.jsx @@ -10,8 +10,7 @@ const DashboardLayout = (props) => { return ( <> Date: Tue, 12 Dec 2023 16:06:26 +0330 Subject: [PATCH 10/39] add plate number postal code navgan type and restyle select component --- public/locales/fa/app.json | 33 ++- .../navgan/add-request-loan/forms/AddForm.jsx | 259 +++++++++++------- src/core/components/PlateNumber.jsx | 209 ++++++++++++++ src/core/components/SelectBox.jsx | 40 +-- src/core/data/apiRoutes.js | 1 + src/lib/app/hooks/useCities.jsx | 33 +++ src/lib/app/hooks/useProvince.jsx | 37 +-- 7 files changed, 467 insertions(+), 145 deletions(-) create mode 100644 src/core/components/PlateNumber.jsx create mode 100644 src/lib/app/hooks/useCities.jsx diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 9a33968..228b3c2 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -126,39 +126,54 @@ "no_request_found": "درخواستی یافت نشد" }, "LoanRequest": { + "city_id": "شهر", "loan_request_page": "ثبت درخواست وام", "personal_info": "اطلاعات شخصی", + "national_code_number": "کد ملی می بایست شامل اعداد باشد", + "national_code_max": "کد ملی می بایست 10 رقم باشد", + "tel_number_max": "شماره ثابت می بایست 11 رقم باشد", + "national_code_positive": "کد ملی می بایست مثبت باشد", "uploading_documents": "اسناد", "error_message_name": "لطفا نام خود را وارد کنید!", - "error_message_phone_number": "لطفا شماره تلفن خود را وارد کنید!", + "error_message_tel_number": "لطفا شماره ثابت (با پیش شماره استان) خود را وارد کنید!", "error_message_vehicle_type": "لطفا نوع وسیله نقلیه خود را وارد کنید!", "error_message_plate_number": "لطفا شماره پلاک خود را وارد کنید!", - "error_message_navgan_id": "لطفا کد ناوگان خود را وارد کنید!", + "error_message_navgan_id": "لطفا کد هوشمند خود را وارد کنید!", "error_message_province_id": "لطفا استان خود را وارد کنید!", "error_message_national_id": "لطفا کد ملی خود را وارد کنید!", "error_message_shenasname_id": "لطفا شماره شناسنامه خود را وارد کنید!", "error_message_national_code": "لطفا کد ملی خود را وارد کنید!", - "text_field_phone_number": "شماره تلفن", - "text_field_enter_your_phone_number": "شماره تلفن خود را وارد کنید", + "text_field_tel_number": "شماره ثابت (با پیش شماره استان)", + "text_field_enter_your_tel_number": "شماره ثابت (با پیش شماره استان) خود را وارد کنید", "text_field_name": "نام", + "text_field_plate_part4": "بخش چهارم", + "text_field_plate_part3": "بخش سوم", + "text_field_plate_part2": "بخش دوم", + "text_field_plate_part1": "بخش اول", + "text_field_enter_your_plate_part1": "بخش اول پلاک را وارد کنید", + "text_field_enter_your_plate_part2": "بخش دوم پلاک را وارد کنید", + "text_field_enter_your_plate_part3": "بخش سوم پلاک را وارد کنید", + "text_field_enter_your_plate_part4": "بخش چهارم پلاک راوارد کنید", + "text_field_loading_cities_list": "درحال دریافت اطلاعات شهر ها...", "text_field_city_id": "شهر", "text_field_enter_your_name": "نام خود را وارد کنید", - "text_field_vehicle_type": "نام وسیله نقلیه", - "text_field_enter_your_vehicle_type": "نام وسیله نقلیه خود را وارد کنید", + "text_field_vehicle_type": "نوع وسیله نقلیه", + "text_field_enter_your_vehicle_type": "نوع وسیله نقلیه خود را وارد کنید", "text_field_province_id": "استان", - "text_field_loading_provinces_list": "درحال دریافت استان ها", + "text_field_loading_provinces_list": "درحال دریافت استان ها ...", "text_field_error_fetching_provinces": "خطا در دریافت استان ها", "text_field_enter_your_national_code": "کد ملی خود را وارد کنید", "text_field_enter_your_province_id": "استان خود را وارد کنید", "text_field_enter_your_city_id": "شهر خود را وارد کنید", - "text_field_navgan_id": "شماره ناوگان", - "text_field_enter_your_navgan_id": "شماره ناوگان خود را وارد کنید", + "text_field_navgan_id": "کد هوشمند ناوگان", + "text_field_enter_your_navgan_id": "کد هوشمند ناوگان خود را وارد کنید", "text_field_national_code": "کد ملی", "text_field_enter_your_national_id": "کد ملی خود را وارد کنید", "text_field_shenasname_id": "شماره شناسنامه", "text_field_enter_your_shenasname_id": "شماره شناسنامه خود را وارد کنید", "text_field_plate_number": "شماره پلاک", "text_field_enter_your_plate_number": "شماره پلاک خود را وارد کنید", + "text_field_error_fetching_cities": "شهر خود را وارد کنید!", "button_submit": "ثبت درخواست", "error_message_city_id": "لطفا شهر خود را وارد کنید!", "add_loan_request_permission": "اکنون امکان ثبت درخواست جدید برای شما مقدور نیست" diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index f5ab007..f5417f7 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -1,33 +1,24 @@ import SelectBox from "@/core/components/SelectBox"; -import {GET_PROVINCE_LIST, SEND_LOAN_REQUEST_NAVGAN,} from "@/core/data/apiRoutes"; +import {SEND_LOAN_REQUEST_NAVGAN} from "@/core/data/apiRoutes"; import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; -import {Box, Button, Grid, TextField} from "@mui/material"; -import axios from "axios"; +import {Box, Button, FormControl, Grid, Stack, TextField} from "@mui/material"; import {useFormik} from "formik"; import {useTranslations} from "next-intl"; -import {useEffect, useState} from "react"; import * as Yup from "yup"; import {useRequest, useUser} from "@witel/webapp-builder"; +import useProvince from "@/lib/app/hooks/useProvince"; +import useCities from "@/lib/app/hooks/useCities"; +import PlateNumber from "@/core/components/PlateNumber"; const AddFormComponent = () => { const t = useTranslations(); const {token} = useUser(); - const [provinceList, setProvinceList] = useState([]); const requestServer = useRequest() - useEffect(() => { - requestServer(GET_PROVINCE_LIST, "get", {auth : true, notification : false}).then(({data}) => { - const formattedData = data.map((province, index) => ({ - id: index, - name: province.name, - value: province.id, - })); - setProvinceList(formattedData); - }).catch(() => {}); - }, []); - + const{provinceList, isLoadingProvinceList, errorProvinceList} = useProvince() + const{cityTextField, cityList, setProvinceID}=useCities() const initialValues = { - phone_number: "", + tel_number: "", vehicle_type: "", plate_number: "", province_id: "", @@ -35,33 +26,68 @@ const AddFormComponent = () => { navgan_id: "", national_code: "", shenasname_id: "", - national_card_img: null, - shenasname_img: null, + postal_code: "", + navgan_type: "", + plate_part1 : "", + plate_part2 : "", + plate_part3 : "", + plate_part4 : "", }; const validationSchema = Yup.object().shape({ - phone_number: Yup.string().required( - t("LoanRequest.error_message_phone_number") - ), + tel_number: Yup.mixed() + .test("max", `${t("LoanRequest.tel_number_max")}`, (value) => value.toString().length === 11) + .required(t("LoanRequest.error_message_tel_number")), vehicle_type: Yup.string().required( t("LoanRequest.error_message_vehicle_type") ), - plate_number: Yup.string().required( - t("LoanRequest.error_message_plate_number") + navgan_type: Yup.string().required( + t("LoanRequest.error_message_navgan_type") ), - navgan_id: Yup.string().required(t("LoanRequest.error_message_navgan_id")), + postal_code : Yup.mixed() + .test("max", `${t("LoanRequest.postal_code_max")}`, (value) => value.toString().length === 10) + .required( + t("LoanRequest.error_message_postal_code") + ), + plate_part1: Yup.mixed() + .test("max", `${t("LoanRequest.plate_part1_max")}`, (value) => value.toString().length === 2) + .required( + t("LoanRequest.error_message_plate_part1") + ), + plate_part2: Yup.mixed() + .required( + t("LoanRequest.error_message_plate_part2") + ), + plate_part3: Yup.mixed() + .test("max", `${t("LoanRequest.plate_part3_max")}`, (value) => value.toString().length === 2) + .required( + t("LoanRequest.error_message_plate_part3") + ), + plate_part4: Yup.mixed() + .test("max", `${t("LoanRequest.plate_part3_max")}`, (value) => value.toString().length === 2) + .required( + t("LoanRequest.error_message_plate_part3") + ), + navgan_id: Yup.mixed().required(t("LoanRequest.error_message_navgan_id")), province_id: Yup.string().required(t("LoanRequest.error_message_province_id")), city_id: Yup.string().required(t("LoanRequest.error_message_city_id")), - national_code: Yup.string().required( - t("LoanRequest.error_message_national_code") - ), + national_code: Yup.mixed() + .test("is-number", `${t("LoanRequest.national_code_number")}`, + (value) => !isNaN(value)) + .test("positive", `${t("LoanRequest.national_code_positive")}`, (value) => value >= 0) + .test("max", `${t("LoanRequest.national_code_max")}`, (value) => value.toString().length === 10) + .required(t("LoanRequest.error_message_national_id")), shenasname_id: Yup.string().required( t("LoanRequest.error_message_shenasname_id") ), }); + + const handleSubmit = async (values, props) => { const formData = new FormData(); - formData.append("phone_number", values.phone_number); + formData.append("tel_number", values.tel_number); + formData.append("navgan_type", values.navgan_type); + formData.append("postal_code", values.postal_code); formData.append("vehicle_type", values.vehicle_type); formData.append("plate_number", values.plate_number); formData.append("province_id", values.province_id); @@ -69,10 +95,6 @@ const AddFormComponent = () => { formData.append("navgan_id", values.navgan_id); formData.append("national_code", values.national_code); formData.append("shenasname_id", values.shenasname_id); - if (values.shenasname_img != null) - formData.append("shenasname_image", values.shenasname_img); - if (values.national_card_img != null) - formData.append("national_card_image", values.national_card_img); requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", {auth : true, notification : true}).then().catch(() => { props.setSubmitting(false) @@ -82,9 +104,7 @@ const AddFormComponent = () => { const formik = useFormik({ initialValues, validationSchema, onSubmit: handleSubmit }) - return ( - <> @@ -95,6 +115,8 @@ const AddFormComponent = () => { name="national_code" variant="outlined" size="small" + type={"number"} + onChange={formik.handleChange} label={t("LoanRequest.text_field_national_code")} placeholder={t( "LoanRequest.text_field_enter_your_national_code" @@ -109,96 +131,45 @@ const AddFormComponent = () => { > - - - - - - - - - - - - - - - - - - { helperText={formik.touched.navgan_id && formik.errors.navgan_id} /> + + + + + + + {formik.setFieldValue('navgan_type', event.target.value)}} + setFieldTouched={formik.setFieldTouched} + error={formik.touched.navgan_type && Boolean(formik.errors.navgan_type)} + helperText={formik.touched.navgan_type && formik.errors.navgan_type} + onBlur={formik.handleBlur("navgan_type")} + /> + + + + + {formik.setFieldValue('province_id', event.target.value); setProvinceID(event.target.value) + formik.setFieldTouched("city_id", false, false); + formik.setFieldValue("city_id", "") + }} + setFieldTouched={formik.setFieldTouched} + error={formik.touched.province_id && Boolean(formik.errors.province_id)} + helperText={formik.touched.province_id && formik.errors.province_id} + onBlur={formik.handleBlur("province_id")} + /> + + + formik.setFieldValue('city_id', event.target.value)} + setFieldTouched={formik.setFieldTouched} + error={formik.touched.city_id && Boolean(formik.errors.city_id)} + helperText={formik.touched.city_id && formik.errors.city_id} + onBlur={formik.handleBlur("city_id")} + /> + + + { helperText={formik.touched.shenasname_id && formik.errors.shenasname_id} /> + + + + + + + + }, +] +const PlateNumber = ({formik}) => { + const t = useTranslations(); + return( + + + + + + + + + + formik.setFieldValue('plate_part2', event.target.value)} + setFieldTouched={formik.setFieldTouched} + error={formik.touched.plate_part2 && Boolean(formik.errors.plate_part2)} + helperText={formik.touched.plate_part2 && formik.errors.plate_part2} + onBlur={formik.handleBlur("plate_part2")} + /> + + + + + + + + ) +} +export default PlateNumber \ No newline at end of file diff --git a/src/core/components/SelectBox.jsx b/src/core/components/SelectBox.jsx index 5c81f5a..a1c35c7 100644 --- a/src/core/components/SelectBox.jsx +++ b/src/core/components/SelectBox.jsx @@ -1,46 +1,54 @@ import {FormControl, FormHelperText, InputLabel, MenuItem, Select,} from "@mui/material"; +import {useTranslations} from "next-intl"; function SelectBox({ select, - selectType, + name, selectors, label, - setFieldValue, - setFieldTouched, + handleChange, error, onBlur, + disabled, helperText, + isLoading, + errorEcured }) { + const t = useTranslations(); - const selectId = String(select); - const handleChange = (event) => { - setFieldValue(selectType, event.target.value); - }; return ( - {label} + {label} {helperText} diff --git a/src/core/data/apiRoutes.js b/src/core/data/apiRoutes.js index cd90a05..57bafba 100644 --- a/src/core/data/apiRoutes.js +++ b/src/core/data/apiRoutes.js @@ -14,5 +14,6 @@ export const SEND_LOAN_REQUEST_WELFARE = BASE_URL + "/refahi/loan/store"; export const UPDATE_LOAN_REQUEST_WELFARE = BASE_URL + "/refahi/loan/update/"; export const DETAILS_LOAN_REQUEST_WELFARE = BASE_URL + "/refahi/loan/details/"; export const GET_PROVINCE_LIST = BASE_URL + "/provinces"; +export const GET_CITIES_LIST = BASE_URL + "/cities"; diff --git a/src/lib/app/hooks/useCities.jsx b/src/lib/app/hooks/useCities.jsx new file mode 100644 index 0000000..fba621b --- /dev/null +++ b/src/lib/app/hooks/useCities.jsx @@ -0,0 +1,33 @@ +import {useEffect, useState} from "react"; +import {useRequest} from "@witel/webapp-builder"; +import {useTranslations} from "next-intl"; +import {GET_CITIES_LIST} from "@/core/data/apiRoutes"; +const useCities = () => { + const t = useTranslations(); + const [provinceID, setProvinceID] = useState(null) + const [cityList, setCityList] = useState([]); + const [cityTextField, setCityTextField] = useState(t("LoanRequest.city_id")); + const requestServer = useRequest({auth: true, notification: false}) + + useEffect(()=>{ + if(provinceID === null) return + setCityTextField(t("LoanRequest.text_field_loading_cities_list")) + requestServer(`${GET_CITIES_LIST}?province_id=${provinceID}`, "get", {auth: true, notification: false}) + .then(({data}) => { + const result = data.data; + const formattedData = result.map((city, index) => ({ + id: index, + name: city.name, + value: city.id, + })); + setCityList(formattedData); + setCityTextField(t("LoanRequest.text_field_city_id")) + }).catch(() => { + setCityTextField(t("LoanRequest.text_field_error_fetching_cities")) + }); + },[provinceID]) + + + return{cityTextField, cityList, setProvinceID} +} +export default useCities \ No newline at end of file diff --git a/src/lib/app/hooks/useProvince.jsx b/src/lib/app/hooks/useProvince.jsx index d0fbda0..add55f3 100644 --- a/src/lib/app/hooks/useProvince.jsx +++ b/src/lib/app/hooks/useProvince.jsx @@ -1,28 +1,33 @@ import {GET_PROVINCE_LIST} from "@/core/data/apiRoutes"; -import useRequest from "@/lib/app/hooks/useRequest"; -import useSWR from "swr"; +import {useRequest} from "@witel/webapp-builder"; +import {useEffect, useState} from "react"; const useProvince = () => { + const [isLoadingProvinceList, setIsLoadingProvinceList] = useState(false) + const [errorProvinceList, setErrorProvinceList] = useState(false) + const [provinceList, setProvinceList] = useState([]) const requestServer = useRequest({auth: true, notification: false}) - //swr config - const fetcher = (...args) => { - return requestServer(args, 'get').then(({data}) => { - return data; + useEffect(()=> { + setIsLoadingProvinceList(true) + requestServer(GET_PROVINCE_LIST, 'get',{auth : true, notification : false}).then(({data}) => { + const formattedData = data.map((province, index) => ({ + id: index, + name: province.name, + value: province.id, + })); + setIsLoadingProvinceList(false) + setProvinceList(formattedData); }).catch(() => { + setIsLoadingProvinceList(false) + setErrorProvinceList(true) }) - }; - - const {data, isLoading} = useSWR(GET_PROVINCE_LIST, fetcher, { - revalidateIfStale: false, - revalidateOnFocus: false, - revalidateOnReconnect: false - }); + },[]) return { - provinceList: data, - isLoadingProvinceList: isLoading, - errorProvinceList: !data + provinceList, + isLoadingProvinceList, + errorProvinceList } }; From 4a54f3a8d29bd9d9bc6c6f123a036d4b63c611d2 Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Wed, 13 Dec 2023 15:52:41 +0330 Subject: [PATCH 11/39] mohammad | working on plate component --- public/locales/fa/app.json | 2 +- .../navgan/add-request-loan/forms/AddForm.jsx | 73 ++--- src/core/components/PlateNumber.jsx | 295 ++++++++++-------- 3 files changed, 189 insertions(+), 181 deletions(-) diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 228b3c2..d5fa8b9 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -19,6 +19,7 @@ "online_message": "شما به اینترنت وصل هستید", "offline_message": "اتصال شما به اینترنت قطع شده است", "routing_to": "در حال انتقال به صفحه", + "error_message_plate_number": "لطفا شماره پلاک خود را وارد کنید!", "header": { "open_profile": "پروفایل", "edit_profile": "ویرایش پروفایل", @@ -137,7 +138,6 @@ "error_message_name": "لطفا نام خود را وارد کنید!", "error_message_tel_number": "لطفا شماره ثابت (با پیش شماره استان) خود را وارد کنید!", "error_message_vehicle_type": "لطفا نوع وسیله نقلیه خود را وارد کنید!", - "error_message_plate_number": "لطفا شماره پلاک خود را وارد کنید!", "error_message_navgan_id": "لطفا کد هوشمند خود را وارد کنید!", "error_message_province_id": "لطفا استان خود را وارد کنید!", "error_message_national_id": "لطفا کد ملی خود را وارد کنید!", diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index f5417f7..6567b42 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -1,7 +1,7 @@ import SelectBox from "@/core/components/SelectBox"; import {SEND_LOAN_REQUEST_NAVGAN} from "@/core/data/apiRoutes"; import DataSaverOnIcon from "@mui/icons-material/DataSaverOn"; -import {Box, Button, FormControl, Grid, Stack, TextField} from "@mui/material"; +import {Box, Button, Grid, TextField} from "@mui/material"; import {useFormik} from "formik"; import {useTranslations} from "next-intl"; import * as Yup from "yup"; @@ -14,8 +14,8 @@ const AddFormComponent = () => { const t = useTranslations(); const {token} = useUser(); const requestServer = useRequest() - const{provinceList, isLoadingProvinceList, errorProvinceList} = useProvince() - const{cityTextField, cityList, setProvinceID}=useCities() + const {provinceList, isLoadingProvinceList, errorProvinceList} = useProvince() + const {cityTextField, cityList, setProvinceID} = useCities() const initialValues = { tel_number: "", @@ -28,10 +28,10 @@ const AddFormComponent = () => { shenasname_id: "", postal_code: "", navgan_type: "", - plate_part1 : "", - plate_part2 : "", - plate_part3 : "", - plate_part4 : "", + plate_part1: "", + plate_part2: "", + plate_part3: "", + plate_part4: "", }; const validationSchema = Yup.object().shape({ @@ -44,36 +44,17 @@ const AddFormComponent = () => { navgan_type: Yup.string().required( t("LoanRequest.error_message_navgan_type") ), - postal_code : Yup.mixed() + postal_code: Yup.mixed() .test("max", `${t("LoanRequest.postal_code_max")}`, (value) => value.toString().length === 10) .required( t("LoanRequest.error_message_postal_code") ), - plate_part1: Yup.mixed() - .test("max", `${t("LoanRequest.plate_part1_max")}`, (value) => value.toString().length === 2) - .required( - t("LoanRequest.error_message_plate_part1") - ), - plate_part2: Yup.mixed() - .required( - t("LoanRequest.error_message_plate_part2") - ), - plate_part3: Yup.mixed() - .test("max", `${t("LoanRequest.plate_part3_max")}`, (value) => value.toString().length === 2) - .required( - t("LoanRequest.error_message_plate_part3") - ), - plate_part4: Yup.mixed() - .test("max", `${t("LoanRequest.plate_part3_max")}`, (value) => value.toString().length === 2) - .required( - t("LoanRequest.error_message_plate_part3") - ), navgan_id: Yup.mixed().required(t("LoanRequest.error_message_navgan_id")), province_id: Yup.string().required(t("LoanRequest.error_message_province_id")), city_id: Yup.string().required(t("LoanRequest.error_message_city_id")), national_code: Yup.mixed() .test("is-number", `${t("LoanRequest.national_code_number")}`, - (value) => !isNaN(value)) + (value) => !isNaN(value)) .test("positive", `${t("LoanRequest.national_code_positive")}`, (value) => value >= 0) .test("max", `${t("LoanRequest.national_code_max")}`, (value) => value.toString().length === 10) .required(t("LoanRequest.error_message_national_id")), @@ -96,7 +77,7 @@ const AddFormComponent = () => { formData.append("national_code", values.national_code); formData.append("shenasname_id", values.shenasname_id); - requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", {auth : true, notification : true}).then().catch(() => { + requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", {auth: true, notification: true}).then().catch(() => { props.setSubmitting(false) }) }; @@ -106,7 +87,7 @@ const AddFormComponent = () => { }) return ( <> - @@ -147,15 +128,15 @@ const AddFormComponent = () => { /> - + { label={t("LoanRequest.text_field_navgan_type")} size="small" selectType="navgan_type" - selectors={[{id : 1, value : 1, name : "مسافری"},{id : 2, value : 2, name : "عمومی"},{id : 3, value : 3, name : "روستایی"}]} + selectors={[{id: 1, value: 1, name: "مسافری"}, {id: 2, value: 2, name: "عمومی"}, { + id: 3, + value: 3, + name: "روستایی" + }]} select={formik.values.navgan_type} - handleChange={(event)=> {formik.setFieldValue('navgan_type', event.target.value)}} + handleChange={(event) => { + formik.setFieldValue('navgan_type', event.target.value) + }} setFieldTouched={formik.setFieldTouched} error={formik.touched.navgan_type && Boolean(formik.errors.navgan_type)} helperText={formik.touched.navgan_type && formik.errors.navgan_type} @@ -213,7 +200,7 @@ const AddFormComponent = () => { /> - + { errorEcured={errorProvinceList} selectors={provinceList} select={formik.values.province_id} - handleChange={(event)=> {formik.setFieldValue('province_id', event.target.value); setProvinceID(event.target.value) + handleChange={(event) => { + formik.setFieldValue('province_id', event.target.value); + setProvinceID(event.target.value) formik.setFieldTouched("city_id", false, false); formik.setFieldValue("city_id", "") }} @@ -243,7 +232,7 @@ const AddFormComponent = () => { disabled={cityList.length === 0} selectors={cityList} select={formik.values.city_id} - handleChange={(event)=>formik.setFieldValue('city_id', event.target.value)} + handleChange={(event) => formik.setFieldValue('city_id', event.target.value)} setFieldTouched={formik.setFieldTouched} error={formik.touched.city_id && Boolean(formik.errors.city_id)} helperText={formik.touched.city_id && formik.errors.city_id} @@ -251,7 +240,7 @@ const AddFormComponent = () => { /> - + { /> - - - - - + + id: 23, + value: "*", + name: }, ] const PlateNumber = ({formik}) => { const t = useTranslations(); - return( - - - + const [plateDrawer, setPlateDrawer] = useState(false); + const [selectedWordName, setSelectedWordName] = useState("الف"); + const [selectedWordValue, setSelectedWordValue] = useState(""); + + return ( + <> + + + + ایران + - - + + - - - formik.setFieldValue('plate_part2', event.target.value)} - setFieldTouched={formik.setFieldTouched} - error={formik.touched.plate_part2 && Boolean(formik.errors.plate_part2)} - helperText={formik.touched.plate_part2 && formik.errors.plate_part2} - onBlur={formik.handleBlur("plate_part2")} - /> - - + + + {/**/} + + setPlateDrawer(false)} + > + + {plate_words.map((item) => ( + + ))} + + + + - - - + + + {t("error_message_plate_number")} + ) } From ea2be91094b2f02ea970584ebecbf81fc4c5d91e Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Mon, 18 Dec 2023 09:30:46 +0330 Subject: [PATCH 12/39] merge mohammad changes --- public/locales/fa/app.json | 16 +++- .../navgan/add-request-loan/forms/AddForm.jsx | 80 +++++++++++++------ src/core/MuiDatePicker.jsx | 0 3 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 src/core/MuiDatePicker.jsx diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 228b3c2..d24b4c1 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -131,6 +131,8 @@ "personal_info": "اطلاعات شخصی", "national_code_number": "کد ملی می بایست شامل اعداد باشد", "national_code_max": "کد ملی می بایست 10 رقم باشد", + "shenasname_serial_max": "سریال پشت کارت ملی می بایست 10 رقم باشد", + "postal_code_max": "کد پستی می بایست 10 رقم باشد", "tel_number_max": "شماره ثابت می بایست 11 رقم باشد", "national_code_positive": "کد ملی می بایست مثبت باشد", "uploading_documents": "اسناد", @@ -141,8 +143,11 @@ "error_message_navgan_id": "لطفا کد هوشمند خود را وارد کنید!", "error_message_province_id": "لطفا استان خود را وارد کنید!", "error_message_national_id": "لطفا کد ملی خود را وارد کنید!", - "error_message_shenasname_id": "لطفا شماره شناسنامه خود را وارد کنید!", + "error_message_shenasname_serial": "لطفا سریال پشت کارت ملی خود را وارد کنید!", + "error_message_postal_code": "لطفا کد پستی خود را وارد کنید!", "error_message_national_code": "لطفا کد ملی خود را وارد کنید!", + "error_message_navgan_type": "لطفا نوع ناوگان خود را وارد کنید!", + "error_message_address": "لطفا آدرس خود را وارد کنید!", "text_field_tel_number": "شماره ثابت (با پیش شماره استان)", "text_field_enter_your_tel_number": "شماره ثابت (با پیش شماره استان) خود را وارد کنید", "text_field_name": "نام", @@ -150,13 +155,18 @@ "text_field_plate_part3": "بخش سوم", "text_field_plate_part2": "بخش دوم", "text_field_plate_part1": "بخش اول", + "text_field_postal_code": "کد پستی", + "text_field_navgan_type": "نوع ناوگان", + "text_field_address": "آدرس", "text_field_enter_your_plate_part1": "بخش اول پلاک را وارد کنید", "text_field_enter_your_plate_part2": "بخش دوم پلاک را وارد کنید", "text_field_enter_your_plate_part3": "بخش سوم پلاک را وارد کنید", "text_field_enter_your_plate_part4": "بخش چهارم پلاک راوارد کنید", + "text_field_enter_your_address": "آدرس خود راوارد کنید", "text_field_loading_cities_list": "درحال دریافت اطلاعات شهر ها...", "text_field_city_id": "شهر", "text_field_enter_your_name": "نام خود را وارد کنید", + "text_field_enter_your_postal_code": "کد پستی خود را وارد کنید", "text_field_vehicle_type": "نوع وسیله نقلیه", "text_field_enter_your_vehicle_type": "نوع وسیله نقلیه خود را وارد کنید", "text_field_province_id": "استان", @@ -169,8 +179,8 @@ "text_field_enter_your_navgan_id": "کد هوشمند ناوگان خود را وارد کنید", "text_field_national_code": "کد ملی", "text_field_enter_your_national_id": "کد ملی خود را وارد کنید", - "text_field_shenasname_id": "شماره شناسنامه", - "text_field_enter_your_shenasname_id": "شماره شناسنامه خود را وارد کنید", + "text_field_shenasname_serial": "سریال پشت کارت ملی", + "text_field_enter_your_shenasname_serial": "سریال پشت کارت ملی خود را وارد کنید", "text_field_plate_number": "شماره پلاک", "text_field_enter_your_plate_number": "شماره پلاک خود را وارد کنید", "text_field_error_fetching_cities": "شهر خود را وارد کنید!", diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index f5417f7..8d91c98 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -9,6 +9,7 @@ import {useRequest, useUser} from "@witel/webapp-builder"; import useProvince from "@/lib/app/hooks/useProvince"; import useCities from "@/lib/app/hooks/useCities"; import PlateNumber from "@/core/components/PlateNumber"; +import MuiDatePicker from "@/core/MuiDatePicker"; const AddFormComponent = () => { const t = useTranslations(); @@ -25,13 +26,14 @@ const AddFormComponent = () => { city_id: "", navgan_id: "", national_code: "", - shenasname_id: "", + shenasname_serial: "", postal_code: "", navgan_type: "", plate_part1 : "", plate_part2 : "", plate_part3 : "", plate_part4 : "", + address : "", }; const validationSchema = Yup.object().shape({ @@ -44,6 +46,9 @@ const AddFormComponent = () => { navgan_type: Yup.string().required( t("LoanRequest.error_message_navgan_type") ), + address: Yup.string().required( + t("LoanRequest.error_message_address") + ), postal_code : Yup.mixed() .test("max", `${t("LoanRequest.postal_code_max")}`, (value) => value.toString().length === 10) .required( @@ -77,8 +82,9 @@ const AddFormComponent = () => { .test("positive", `${t("LoanRequest.national_code_positive")}`, (value) => value >= 0) .test("max", `${t("LoanRequest.national_code_max")}`, (value) => value.toString().length === 10) .required(t("LoanRequest.error_message_national_id")), - shenasname_id: Yup.string().required( - t("LoanRequest.error_message_shenasname_id") + shenasname_serial: Yup.mixed() + .test("max", `${t("LoanRequest.shenasname_serial_max")}`, (value) => value.toString().length === 11) + .required(t("LoanRequest.error_message_shenasname_serial") ), }); @@ -92,9 +98,10 @@ const AddFormComponent = () => { formData.append("plate_number", values.plate_number); formData.append("province_id", values.province_id); formData.append("city_id", values.city_id); + formData.append("address", values.address); formData.append("navgan_id", values.navgan_id); formData.append("national_code", values.national_code); - formData.append("shenasname_id", values.shenasname_id); + formData.append("shenasname_serial", values.shenasname_serial); requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", {auth : true, notification : true}).then().catch(() => { props.setSubmitting(false) @@ -131,19 +138,17 @@ const AddFormComponent = () => { > @@ -184,17 +189,19 @@ const AddFormComponent = () => { @@ -255,19 +262,21 @@ const AddFormComponent = () => { + {/**/} @@ -275,6 +284,25 @@ const AddFormComponent = () => { + + + + + Date: Mon, 18 Dec 2023 11:39:34 +0330 Subject: [PATCH 13/39] use webapp builder --- package.json | 2 +- public/locales/fa/app.json | 1 + src/core/components/GlobalHead.jsx | 8 -------- src/layouts/dashboard.jsx | 6 +++++- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 05c6f46..b517190 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@mui/icons-material": "^5.11.16", "@mui/lab": "^5.0.0-alpha.152", "@mui/material": "^5.12.0", - "@witel/webapp-builder": "^1.1.0", + "@witel/webapp-builder": "^1.2.1", "axios": "^1.4.0", "colord": "^2.9.3", "eslint": "8.36.0", diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 6978a5d..af40ec3 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -5,6 +5,7 @@ "first_page": "خوش آمدید", "powered_by_witel": "توسعه یافته توسط وایتل", "login": "ورود", + "today": "امروز", "pending": "درحال اجرا...", "login_user_panel": "ورود به پنل کاربران", "register_navy": "ثبت نام اعضای ناوگان", diff --git a/src/core/components/GlobalHead.jsx b/src/core/components/GlobalHead.jsx index 9036b85..002199d 100644 --- a/src/core/components/GlobalHead.jsx +++ b/src/core/components/GlobalHead.jsx @@ -39,14 +39,6 @@ const GlobalHead = () => { /> - diff --git a/src/layouts/dashboard.jsx b/src/layouts/dashboard.jsx index a9abba5..9883080 100644 --- a/src/layouts/dashboard.jsx +++ b/src/layouts/dashboard.jsx @@ -2,17 +2,21 @@ import {DashboardLayout as DashboardLayoutPure, useUser} from "@witel/webapp-bui import headerProfileItems from "@/core/data/headerProfileItems"; import sidebarMenu from "@/core/data/sidebarMenu"; import {GET_SIDEBAR_NOTIFICATION} from "@/core/data/apiRoutes"; +import {useTranslations} from "next-intl"; +import moment from "jalali-moment"; const DashboardLayout = (props) => { const {user} = useUser() const middlewaresProps = props.middlewaresProps || {} + const t = useTranslations() return ( <> Date: Mon, 18 Dec 2023 13:18:13 +0330 Subject: [PATCH 14/39] change flag login middleware --- src/middlewares/UserInfo.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middlewares/UserInfo.jsx b/src/middlewares/UserInfo.jsx index 52523c5..3f594c4 100644 --- a/src/middlewares/UserInfo.jsx +++ b/src/middlewares/UserInfo.jsx @@ -2,7 +2,7 @@ import {useUser} from "@witel/webapp-builder"; const UserInfo = ({children}) => { const {user} = useUser(); - const userAccess = user.can_request_a_new_loan; + const userAccess = user.profile_completed; return userAccess ? <>{children} : ''; }; From 4b31247ca1f14326a7e01f100c320061a5c10cdf Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Mon, 18 Dec 2023 14:11:07 +0330 Subject: [PATCH 15/39] add postal code address and some validation --- package.json | 2 + public/locales/fa/app.json | 12 +- .../navgan/add-request-loan/forms/AddForm.jsx | 122 +++++++------ .../navgan/add-request-loan/index.jsx | 6 +- src/core/MuiDatePicker.jsx | 0 src/core/components/MuiDatePicker.jsx | 85 +++++++++ src/core/components/PlateNumber.jsx | 166 ++++++++---------- src/core/components/SelectBox.jsx | 12 +- src/lib/app/hooks/useCities.jsx | 17 +- 9 files changed, 247 insertions(+), 175 deletions(-) delete mode 100644 src/core/MuiDatePicker.jsx create mode 100644 src/core/components/MuiDatePicker.jsx diff --git a/package.json b/package.json index 05c6f46..9dc8e07 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,11 @@ "@mui/icons-material": "^5.11.16", "@mui/lab": "^5.0.0-alpha.152", "@mui/material": "^5.12.0", + "@mui/x-date-pickers": "^6.18.5", "@witel/webapp-builder": "^1.1.0", "axios": "^1.4.0", "colord": "^2.9.3", + "date-fns-jalali": "^2.13.0-0", "eslint": "8.36.0", "formik": "^2.2.9", "fs-extra": "^11.1.1", diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 06dc231..2c0b598 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -1,7 +1,14 @@ { "app_name": "سامانه جامع تسهیلات", "app_short_name": "سامانه تسهیلات", + "birthday": "تاریخ تولد", + "birthday_error": "تاریخ تولد خود را وارد کنید!", "dashboard": "داشبورد", + "text_field_city_id": "شهر", + "text_field_error_fetching_cities": "لطفا شهر خود را وارد کنید!", + "text_field_loading_cities_list": "درحال دریافت اطلاعات شهر ها...", + "text_field_loading": "درحال دریافت اطلاعات", + "text_field_error_fetching": "خطا در دریافت اطلاعات", "first_page": "خوش آمدید", "powered_by_witel": "توسعه یافته توسط وایتل", "login": "ورود", @@ -127,7 +134,7 @@ "no_request_found": "درخواستی یافت نشد" }, "LoanRequest": { - "city_id": "شهر", + "cityList_empty": "ابتدا استان را وارد کنید", "loan_request_page": "ثبت درخواست وام", "personal_info": "اطلاعات شخصی", "national_code_number": "کد ملی می بایست شامل اعداد باشد", @@ -163,8 +170,6 @@ "text_field_enter_your_plate_part3": "بخش سوم پلاک را وارد کنید", "text_field_enter_your_plate_part4": "بخش چهارم پلاک راوارد کنید", "text_field_enter_your_address": "آدرس خود راوارد کنید", - "text_field_loading_cities_list": "درحال دریافت اطلاعات شهر ها...", - "text_field_city_id": "شهر", "text_field_enter_your_name": "نام خود را وارد کنید", "text_field_enter_your_postal_code": "کد پستی خود را وارد کنید", "text_field_vehicle_type": "نوع وسیله نقلیه", @@ -183,7 +188,6 @@ "text_field_enter_your_shenasname_serial": "سریال پشت کارت ملی خود را وارد کنید", "text_field_plate_number": "شماره پلاک", "text_field_enter_your_plate_number": "شماره پلاک خود را وارد کنید", - "text_field_error_fetching_cities": "شهر خود را وارد کنید!", "button_submit": "ثبت درخواست", "error_message_city_id": "لطفا شهر خود را وارد کنید!", "add_loan_request_permission": "اکنون امکان ثبت درخواست جدید برای شما مقدور نیست" diff --git a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx index 40eed76..8097ee3 100644 --- a/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx +++ b/src/components/dashboard/navgan/add-request-loan/forms/AddForm.jsx @@ -9,7 +9,7 @@ import {useRequest, useUser} from "@witel/webapp-builder"; import useProvince from "@/lib/app/hooks/useProvince"; import useCities from "@/lib/app/hooks/useCities"; import PlateNumber from "@/core/components/PlateNumber"; -import MuiDatePicker from "@/core/MuiDatePicker"; +import MuiDatePicker from "@/core/components/MuiDatePicker"; const AddFormComponent = () => { const t = useTranslations(); @@ -34,6 +34,7 @@ const AddFormComponent = () => { plate_part3 : "", plate_part4 : "", address : "", + date_of_birth : "", }; const validationSchema = Yup.object().shape({ @@ -49,6 +50,9 @@ const AddFormComponent = () => { address: Yup.string().required( t("LoanRequest.error_message_address") ), + date_of_birth: Yup.string().required( + t("LoanRequest.error_message_date_of_birth") + ), postal_code: Yup.mixed() .test("max", `${t("LoanRequest.postal_code_max")}`, (value) => value.toString().length === 10) .required( @@ -101,6 +105,7 @@ const AddFormComponent = () => { formData.append("address", values.address); formData.append("navgan_id", values.navgan_id); formData.append("national_code", values.national_code); + formData.append("date_of_birth", values.date_of_birth); formData.append("shenasname_serial", values.shenasname_serial); requestServer(SEND_LOAN_REQUEST_NAVGAN, "post", {auth : true, notification : true}).then().catch(() => { @@ -115,7 +120,7 @@ const AddFormComponent = () => { <> - { fullWidth /> - + + + + + + + + { helperText={formik.touched.postal_code && formik.errors.postal_code} /> - - - - - - - - - - { helperText={formik.touched.tel_number && formik.errors.tel_number} /> + + { onBlur={formik.handleBlur("navgan_type")} /> + + + @@ -244,7 +258,7 @@ const AddFormComponent = () => { { - formik.setFieldValue('vehicle_type', event.target.value)} + error={formik.touched.vehicle_type && Boolean(formik.errors.vehicle_type)} + helperText={formik.touched.vehicle_type && formik.errors.vehicle_type} + onBlur={formik.handleBlur("vehicle_type")} /> - {/**/} - - - - - + diff --git a/src/components/dashboard/navgan/add-request-loan/index.jsx b/src/components/dashboard/navgan/add-request-loan/index.jsx index d8668ed..395ede7 100644 --- a/src/components/dashboard/navgan/add-request-loan/index.jsx +++ b/src/components/dashboard/navgan/add-request-loan/index.jsx @@ -1,20 +1,16 @@ import {Box, Chip, Divider} from "@mui/material"; import {useTranslations} from "next-intl"; import AddFormComponent from "@/components/dashboard/navgan/add-request-loan/forms/AddForm"; -import {CenterLayout, useUser} from "@witel/webapp-builder"; const LoanRequestComponent = () => { const t = useTranslations(); - const {user} = useUser(); return ( <> diff --git a/src/core/MuiDatePicker.jsx b/src/core/MuiDatePicker.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/core/components/MuiDatePicker.jsx b/src/core/components/MuiDatePicker.jsx new file mode 100644 index 0000000..5da1afc --- /dev/null +++ b/src/core/components/MuiDatePicker.jsx @@ -0,0 +1,85 @@ +import * as React from 'react'; +import {useState} from 'react'; +import Button from '@mui/material/Button'; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {LocalizationProvider} from '@mui/x-date-pickers/LocalizationProvider'; +import {DatePicker} from '@mui/x-date-pickers/DatePicker'; +import {useTranslations} from "next-intl"; +import moment from "jalali-moment"; +import {FormControl, FormHelperText} from "@mui/material"; + +function ButtonField(props) { + const t = useTranslations(); + const { + setOpen, + label, + id, + disabled, + InputProps: {ref} = {}, + inputProps: {'aria-label': ariaLabel} = {}, + } = props; + + return ( + + ); +} + +function ButtonDatePicker(props) { + const t = useTranslations(); + const [open, setOpen] = useState(false); + + return ( + setOpen(false)} + onOpen={() => setOpen(true)} + /> + ); +} + +export default function PickerWithButtonField({formik, error, helperText}) { + const [value, setValue] = useState(null); + + return ( + + + { + setValue(newValue) + }} + + /> + {helperText} + + + ); +} \ No newline at end of file diff --git a/src/core/components/PlateNumber.jsx b/src/core/components/PlateNumber.jsx index 57be9fd..292b764 100644 --- a/src/core/components/PlateNumber.jsx +++ b/src/core/components/PlateNumber.jsx @@ -1,4 +1,4 @@ -import {Box, Button, Drawer, FormHelperText, TextField, Typography} from "@mui/material"; +import {Box, Button, Drawer, FormHelperText, InputBase, Stack} from "@mui/material"; import {useTranslations} from "next-intl"; import AccessibleIcon from '@mui/icons-material/Accessible'; import {useState} from "react"; @@ -128,102 +128,80 @@ const PlateNumber = ({formik}) => { return ( <> - - - - ایران - - + event.target.value.length <= 2 ? formik.setFieldValue("plate_part4", event.target.value) : null} + size={'small'} + placeholder={'xx'} sx={{flexGrow: 2}} + inputProps={{sx: {textAlign: 'center'}}}/> + event.target.value.length <= 3 ? formik.setFieldValue("plate_part3", event.target.value) : null} + size={'small'} placeholder={'xxx'} sx={{ + flexGrow: 3, borderLeft: 1, borderRadius: 0, borderColor: 'divider' + }} inputProps={{sx: {textAlign: 'center'}}}/> + + - setPlateDrawer(false)} > - - {plate_words.map((item) => ( - - ))} - - + {selectedWordName} + - - - - + setPlateDrawer(false)} + > + + {plate_words.map((item) => ( + + ))} + + + event.target.value.length <= 2 ? formik.setFieldValue("plate_part1", event.target.value) : null} + size={'small'} + placeholder={'xx'} + sx={{flexGrow: 2}} + inputProps={{sx: {textAlign: 'center'}}}/> + + + + + + {t("error_message_plate_number")} diff --git a/src/core/components/SelectBox.jsx b/src/core/components/SelectBox.jsx index a1c35c7..2ff2dba 100644 --- a/src/core/components/SelectBox.jsx +++ b/src/core/components/SelectBox.jsx @@ -19,28 +19,26 @@ function SelectBox({ return ( {label}