From 03ed807eaf0d69154136a2fea7fe2a5062375d47 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sun, 10 Dec 2023 15:08:10 +0330 Subject: [PATCH 01/43] use witel webapp builder --- next.config.js | 2 +- package.json | 1 + public/global.scss | 2 + public/manifest.json | 2 +- src/components/dashboard/first/index.jsx | 4 +- src/components/errors/403.jsx | 4 +- src/components/errors/404.jsx | 4 +- src/components/errors/500.jsx | 4 +- src/components/first/FooterDetails.jsx | 17 +-- src/components/first/HeaderDetails.jsx | 8 +- src/components/first/LoanCondition.jsx | 36 ++--- .../first/LoanDescription/index.jsx | 28 ++-- src/components/first/LoanRegister.jsx | 33 +++-- src/components/first/index.jsx | 12 +- src/core/components/LinkRouting.jsx | 116 --------------- src/core/components/LoadingHardPage.jsx | 44 ------ src/core/components/Messages.jsx | 18 --- src/core/components/NetworkComponent.jsx | 34 ----- src/core/components/NoSsrHandler.jsx | 8 -- .../notifications/ErrorNotification.jsx | 39 ----- .../notifications/PendingNotification.jsx | 12 -- .../notifications/SuccessNotification.jsx | 42 ------ .../notifications/WarningNotification.jsx | 40 ------ src/core/components/notifications/index.jsx | 54 ------- src/core/data/apiRoutes.js | 3 +- ...ProfileItems.jsx => headerProfileItems.js} | 0 src/core/data/languageList.js | 14 ++ .../data/{sidebarMenu.jsx => sidebarMenu.js} | 21 --- src/core/utils/createEmotionCache.jsx | 38 ----- src/core/utils/errorHandler.js | 62 -------- src/core/utils/succesHandler.js | 9 -- src/layouts/AppLayout.jsx | 56 -------- src/layouts/CenterLayout.jsx | 18 --- src/layouts/FullPageLayout.jsx | 21 --- src/layouts/MuiLayout.jsx | 75 ---------- src/layouts/ScrollableLayout.jsx | 25 ---- src/layouts/dashboard.jsx | 15 ++ .../breadcrumbs/BreadcrumbItem.jsx | 19 --- .../dashboardLayouts/breadcrumbs/index.jsx | 62 -------- .../dashboardLayouts/header/ProfileData.jsx | 15 -- .../dashboardLayouts/header/ProfileMenu.jsx | 62 -------- .../header/ProfileOptionLogOut.jsx | 49 ------- .../header/ProfileOptions.jsx | 49 ------- src/layouts/dashboardLayouts/header/index.jsx | 72 ---------- src/layouts/dashboardLayouts/index.jsx | 49 ------- .../sidebar/SidebarDrawer.jsx | 26 ---- .../dashboardLayouts/sidebar/SidebarList.jsx | 69 --------- .../sidebar/SidebarListItem.jsx | 59 -------- .../sidebar/SidebarListSubItem.jsx | 48 ------- .../dashboardLayouts/sidebar/index.jsx | 46 ------ src/layouts/index.jsx | 16 +++ src/layouts/list.jsx | 3 + src/lib/app/contexts/language.jsx | 99 ------------- src/lib/app/contexts/loading.jsx | 14 -- src/lib/app/contexts/user.jsx | 133 ------------------ src/lib/app/hooks/useDirection.jsx | 10 -- src/lib/app/hooks/useLanguage.jsx | 28 ---- src/lib/app/hooks/useLoading.jsx | 10 -- src/lib/app/hooks/useNetwork.jsx | 58 -------- src/lib/app/hooks/useRequest.js | 66 --------- src/lib/app/hooks/useUser.jsx | 36 ----- src/middlewares/UserType.jsx | 41 ------ src/middlewares/WithAuth.jsx | 41 ------ src/middlewares/WithoutAuth.jsx | 56 -------- src/pages/_app.jsx | 42 ++++-- src/pages/_document.jsx | 12 +- src/pages/dashboard/index.jsx | 7 +- .../navgan/add-request-loan/index.jsx | 11 +- .../dashboard/navgan/followUp-loan/index.jsx | 11 +- .../refahi/add-request-loan/index.jsx | 24 ---- .../refahi/edit-request-loan/[id].jsx | 24 ---- .../dashboard/refahi/followUp-loan/index.jsx | 24 ---- src/pages/login.jsx | 4 +- src/pages/register/index.jsx | 4 +- 74 files changed, 188 insertions(+), 2132 deletions(-) create mode 100644 public/global.scss delete mode 100644 src/core/components/LinkRouting.jsx delete mode 100644 src/core/components/LoadingHardPage.jsx delete mode 100644 src/core/components/Messages.jsx delete mode 100644 src/core/components/NetworkComponent.jsx delete mode 100644 src/core/components/NoSsrHandler.jsx delete mode 100644 src/core/components/notifications/ErrorNotification.jsx delete mode 100644 src/core/components/notifications/PendingNotification.jsx delete mode 100644 src/core/components/notifications/SuccessNotification.jsx delete mode 100644 src/core/components/notifications/WarningNotification.jsx delete mode 100644 src/core/components/notifications/index.jsx rename src/core/data/{headerProfileItems.jsx => headerProfileItems.js} (100%) create mode 100644 src/core/data/languageList.js rename src/core/data/{sidebarMenu.jsx => sidebarMenu.js} (61%) delete mode 100644 src/core/utils/createEmotionCache.jsx delete mode 100644 src/core/utils/errorHandler.js delete mode 100644 src/core/utils/succesHandler.js delete mode 100644 src/layouts/AppLayout.jsx delete mode 100644 src/layouts/CenterLayout.jsx delete mode 100644 src/layouts/FullPageLayout.jsx delete mode 100644 src/layouts/MuiLayout.jsx delete mode 100644 src/layouts/ScrollableLayout.jsx create mode 100644 src/layouts/dashboard.jsx delete mode 100644 src/layouts/dashboardLayouts/breadcrumbs/BreadcrumbItem.jsx delete mode 100644 src/layouts/dashboardLayouts/breadcrumbs/index.jsx delete mode 100644 src/layouts/dashboardLayouts/header/ProfileData.jsx delete mode 100644 src/layouts/dashboardLayouts/header/ProfileMenu.jsx delete mode 100644 src/layouts/dashboardLayouts/header/ProfileOptionLogOut.jsx delete mode 100644 src/layouts/dashboardLayouts/header/ProfileOptions.jsx delete mode 100644 src/layouts/dashboardLayouts/header/index.jsx delete mode 100644 src/layouts/dashboardLayouts/index.jsx delete mode 100644 src/layouts/dashboardLayouts/sidebar/SidebarDrawer.jsx delete mode 100644 src/layouts/dashboardLayouts/sidebar/SidebarList.jsx delete mode 100644 src/layouts/dashboardLayouts/sidebar/SidebarListItem.jsx delete mode 100644 src/layouts/dashboardLayouts/sidebar/SidebarListSubItem.jsx delete mode 100644 src/layouts/dashboardLayouts/sidebar/index.jsx create mode 100644 src/layouts/index.jsx create mode 100644 src/layouts/list.jsx delete mode 100644 src/lib/app/contexts/language.jsx delete mode 100644 src/lib/app/contexts/loading.jsx delete mode 100644 src/lib/app/contexts/user.jsx delete mode 100644 src/lib/app/hooks/useDirection.jsx delete mode 100644 src/lib/app/hooks/useLanguage.jsx delete mode 100644 src/lib/app/hooks/useLoading.jsx delete mode 100644 src/lib/app/hooks/useNetwork.jsx delete mode 100644 src/lib/app/hooks/useRequest.js delete mode 100644 src/lib/app/hooks/useUser.jsx delete mode 100644 src/middlewares/UserType.jsx delete mode 100644 src/middlewares/WithAuth.jsx delete mode 100644 src/middlewares/WithoutAuth.jsx delete mode 100644 src/pages/dashboard/refahi/add-request-loan/index.jsx delete mode 100644 src/pages/dashboard/refahi/edit-request-loan/[id].jsx delete mode 100644 src/pages/dashboard/refahi/followUp-loan/index.jsx diff --git a/next.config.js b/next.config.js index db2124f..5c809d9 100644 --- a/next.config.js +++ b/next.config.js @@ -3,7 +3,7 @@ const nextConfig = { reactStrictMode: true, images: { - domains: ['loan.witel.ir', /* other domains */], + domains: [process.env.NEXT_PUBLIC_BASE_URL], }, i18n: { defaultLocale: 'fa', diff --git a/package.json b/package.json index 5305c99..e44361c 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@mui/icons-material": "^5.11.16", "@mui/lab": "^5.0.0-alpha.152", "@mui/material": "^5.12.0", + "@witel/webapp-builder": "^1.0.2", "axios": "^1.4.0", "colord": "^2.9.3", "eslint": "8.36.0", diff --git a/public/global.scss b/public/global.scss new file mode 100644 index 0000000..a4a3158 --- /dev/null +++ b/public/global.scss @@ -0,0 +1,2 @@ +@import "fontiran"; +@import 'react-toastify/dist/ReactToastify.css'; \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json index 32bacd5..1fd43e4 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,5 +1,5 @@ { - "short_name": "Loan Facilities Dashboard", + "short_name": "Loan Facilities", "name": "Loan Facilities User Dashboard", "description": "Loan Facilities", "version": "1.0.0", diff --git a/src/components/dashboard/first/index.jsx b/src/components/dashboard/first/index.jsx index 3d1c29e..0e3c800 100644 --- a/src/components/dashboard/first/index.jsx +++ b/src/components/dashboard/first/index.jsx @@ -1,7 +1,5 @@ -import DashboardLayouts from "@/layouts/dashboardLayouts"; - const FirstComponent = () => { - return ; + return <>; }; export default FirstComponent; diff --git a/src/components/errors/403.jsx b/src/components/errors/403.jsx index ce91443..8d410ed 100644 --- a/src/components/errors/403.jsx +++ b/src/components/errors/403.jsx @@ -1,10 +1,8 @@ -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; import {Button, Typography} from "@mui/material"; -import {NextLinkComposed} from "@/core/components/LinkRouting"; import {useTranslations} from "next-intl"; import TitlePage from "@/core/components/TitlePage"; import Svg403 from "@/core/components/svgs/Svg403"; +import {CenterLayout, FullPageLayout, NextLinkComposed} from "@witel/webapp-builder"; const UnAuthorizedComponent = () => { const t = useTranslations(); diff --git a/src/components/errors/404.jsx b/src/components/errors/404.jsx index acfd418..15a394c 100644 --- a/src/components/errors/404.jsx +++ b/src/components/errors/404.jsx @@ -1,10 +1,8 @@ -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; import {Button, Typography} from "@mui/material"; -import {NextLinkComposed} from "@/core/components/LinkRouting"; import {useTranslations} from "next-intl"; import TitlePage from "@/core/components/TitlePage"; import Svg404 from "@/core/components/svgs/Svg404"; +import {CenterLayout, FullPageLayout, NextLinkComposed} from "@witel/webapp-builder"; const NotFoundComponent = () => { const t = useTranslations(); diff --git a/src/components/errors/500.jsx b/src/components/errors/500.jsx index 5a19eda..5527a39 100644 --- a/src/components/errors/500.jsx +++ b/src/components/errors/500.jsx @@ -1,10 +1,8 @@ -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; import {Button, Typography} from "@mui/material"; -import {NextLinkComposed} from "@/core/components/LinkRouting"; import {useTranslations} from "next-intl"; import TitlePage from "@/core/components/TitlePage"; import Svg500 from "@/core/components/svgs/Svg500"; +import {CenterLayout, FullPageLayout, NextLinkComposed} from "@witel/webapp-builder"; const ServerErrorComponent = () => { const t = useTranslations(); diff --git a/src/components/first/FooterDetails.jsx b/src/components/first/FooterDetails.jsx index bb8fe01..7c0eb2c 100644 --- a/src/components/first/FooterDetails.jsx +++ b/src/components/first/FooterDetails.jsx @@ -1,23 +1,24 @@ import {Box, Button, Container, Grid, Stack, Typography} from "@mui/material"; -import LinkRouting from "@/core/components/LinkRouting"; import {useTranslations} from "next-intl"; +import {LinkRouting} from "@witel/webapp-builder"; const FooterDetails = () => { const t = useTranslations(); - return( - - - + return ( + + + - Your Alt Text + Your Alt Text { - return( + return ( - + - - - - } - /> - ); - } - - return <>{children}; -}; - -export default UserTypeMiddleware; diff --git a/src/middlewares/WithAuth.jsx b/src/middlewares/WithAuth.jsx deleted file mode 100644 index b317492..0000000 --- a/src/middlewares/WithAuth.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import {NextLinkComposed} from "@/core/components/LinkRouting"; -import Message from "@/core/components/Messages"; -import useUser from "@/lib/app/hooks/useUser"; -import {Button, Typography} from "@mui/material"; -import {useTranslations} from "next-intl"; -import {useRouter} from "next/router"; - -const WithAuthMiddleware = ({children}) => { - const {isAuth} = useUser(); - const t = useTranslations(); - const router = useRouter(); - - if (!isAuth) - return ( - - {t( - "Authorization.typography_your_access_to_this_page_has_expired_Please_login_again" - )} - - } - actions={ - <> - - - } - /> - ); - return <>{children}; -}; - -export default WithAuthMiddleware; diff --git a/src/middlewares/WithoutAuth.jsx b/src/middlewares/WithoutAuth.jsx deleted file mode 100644 index 594ffc5..0000000 --- a/src/middlewares/WithoutAuth.jsx +++ /dev/null @@ -1,56 +0,0 @@ -import Message from "@/core/components/Messages"; -import useUser from "@/lib/app/hooks/useUser"; -import {Stack, Typography} from "@mui/material"; -import {useTranslations} from "next-intl"; -import {useSearchParams} from "next/navigation"; -import {useRouter} from "next/router"; -import {useEffect} from "react"; - -const WithoutAuthMiddleware = ({children}) => { - const {isAuth} = useUser(); - const t = useTranslations(); - const router = useRouter(); - - // gettin url query - const searchParams = useSearchParams(); - const backUrlDecodedPath = searchParams.get("back_url"); - - useEffect(() => { - if (!isAuth) return; - const timer = setTimeout(() => { - router.replace( - backUrlDecodedPath - ? decodeURIComponent(backUrlDecodedPath) - : "/dashboard" - ); - }, 2000); - - return () => { - clearTimeout(timer); - }; - }, [isAuth]); - - if (isAuth) - return ( - - - {t( - "Authorization.typography_your_login_is_valid_and_you_do_not_need_to_login_again" - )} - - - {t("Authorization.typography_redirect_to")}{" "} - {backUrlDecodedPath - ? t("Authorization.typography_routing_previuos_page") - : t("Authorization.typography_routing_dashbaord_page")} - - - } - /> - ); - return <>{children}; -}; - -export default WithoutAuthMiddleware; diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx index 0fc6a4a..a3be1c7 100644 --- a/src/pages/_app.jsx +++ b/src/pages/_app.jsx @@ -1,25 +1,41 @@ -import "&/fontiran.scss"; -import AppLayout from "@/layouts/AppLayout"; -import MuiLayout from "@/layouts/MuiLayout"; -import {LanguageProvider} from "@/lib/app/contexts/language"; -import {LoadingProvider} from "@/lib/app/contexts/loading"; -import {UserProvider} from "@/lib/app/contexts/user"; +import "&/global.scss"; import "moment/locale/fa"; +import { + AppLayout, + LanguageProvider, + LoadingProvider, + MuiLayout, + NetworkProvider, + ToastProvider, + UserProvider +} from "@witel/webapp-builder"; +import {GET_USER} from "@/core/data/apiRoutes"; +import languageList from "@/core/data/languageList"; import {NextIntlProvider} from "next-intl"; +import themeRtl from "@/core/utils/theme-rtl"; import TitlePage from "@/core/components/TitlePage"; +import GlobalHead from "@/core/components/GlobalHead"; +import Layout from "@/layouts"; const App = ({Component, pageProps}) => { return ( <> - - - - + data}> + + + {pageProps.messages ? : ''} - - - + + + + + + + + + diff --git a/src/pages/_document.jsx b/src/pages/_document.jsx index 474e29b..6aaa82f 100644 --- a/src/pages/_document.jsx +++ b/src/pages/_document.jsx @@ -1,7 +1,8 @@ -import {createEmotionCacheRtl} from "@/core/utils/createEmotionCache"; import theme from "@/core/utils/theme"; import createEmotionServer from "@emotion/server/create-instance"; import Document, {Head, Html, Main, NextScript} from "next/document"; +import {createEmotionCacheLtr, createEmotionCacheRtl} from "@witel/webapp-builder"; +import languageList from "@/core/data/languageList"; export default function MyDocument(props) { const {emotionStyleTags} = props; @@ -26,10 +27,13 @@ export default function MyDocument(props) { MyDocument.getInitialProps = async (ctx) => { const originalRenderPage = ctx.renderPage; let cache; - switch (ctx.locale) { - case "fa": + for (const lang of languageList) { + if (ctx.locale !== lang.key) continue; + if (lang.dir === 'rtl') { cache = createEmotionCacheRtl(); - break; + } else { + cache = createEmotionCacheLtr(); + } } const {extractCriticalToChunks} = createEmotionServer(cache); diff --git a/src/pages/dashboard/index.jsx b/src/pages/dashboard/index.jsx index 02c438a..265c8ac 100644 --- a/src/pages/dashboard/index.jsx +++ b/src/pages/dashboard/index.jsx @@ -1,12 +1,9 @@ import FirstComponent from "@/components/dashboard/first"; -import WithAuthMiddleware from "@/middlewares/WithAuth"; import {parse} from "next-useragent"; export default function Dashboard() { return ( - - - + ); } @@ -17,6 +14,8 @@ export async function getServerSideProps({req, locale}) { messages: (await import(`&/locales/${locale}/app.json`)).default, title: "Dashboard.dashboard_page", isBot, + locale, + layout: {name: 'DashboardLayout'} }, }; } diff --git a/src/pages/dashboard/navgan/add-request-loan/index.jsx b/src/pages/dashboard/navgan/add-request-loan/index.jsx index bd8a442..5af141c 100644 --- a/src/pages/dashboard/navgan/add-request-loan/index.jsx +++ b/src/pages/dashboard/navgan/add-request-loan/index.jsx @@ -1,16 +1,9 @@ -import WithAuthMiddleware from "@/middlewares/WithAuth"; import {parse} from "next-useragent"; -import UserTypeMiddleware from "@/middlewares/UserType"; import LoanRequestComponent from "@/components/dashboard/navgan/add-request-loan"; -const user_type = 1; export default function AddLoanRequest() { return ( - - - - - + ); } @@ -21,6 +14,8 @@ export async function getServerSideProps({req, locale}) { messages: (await import(`&/locales/${locale}/app.json`)).default, title: "LoanRequest.loan_request_page", isBot, + locale, + layout: {name: 'DashboardLayout'} }, }; } diff --git a/src/pages/dashboard/navgan/followUp-loan/index.jsx b/src/pages/dashboard/navgan/followUp-loan/index.jsx index 52f0271..1476d5a 100644 --- a/src/pages/dashboard/navgan/followUp-loan/index.jsx +++ b/src/pages/dashboard/navgan/followUp-loan/index.jsx @@ -1,16 +1,9 @@ -import WithAuthMiddleware from "@/middlewares/WithAuth"; import {parse} from "next-useragent"; -import UserTypeMiddleware from "@/middlewares/UserType"; import LoanFollowUpComponent from "@/components/dashboard/navgan/followUp-loan"; -const user_type = 1; export default function FollowUpLoan() { return ( - - - - - + ); } @@ -21,6 +14,8 @@ export async function getServerSideProps({req, locale}) { messages: (await import(`&/locales/${locale}/app.json`)).default, title: "LoanRequest.loan_request_page", isBot, + locale, + layout: {name: 'DashboardLayout'} }, }; } diff --git a/src/pages/dashboard/refahi/add-request-loan/index.jsx b/src/pages/dashboard/refahi/add-request-loan/index.jsx deleted file mode 100644 index b4575e9..0000000 --- a/src/pages/dashboard/refahi/add-request-loan/index.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import WithAuthMiddleware from "@/middlewares/WithAuth"; -import {parse} from "next-useragent"; - -const user_type = 2; -export default function AddLoanRequest() { - return ( - - {/**/} - {/* */} - {/**/} - - ); -} - -export async function getServerSideProps({req, locale}) { - const {isBot} = parse(req.headers["user-agent"]); - return { - props: { - messages: (await import(`&/locales/${locale}/app.json`)).default, - title: "LoanRequest.loan_request_page", - isBot, - }, - }; -} diff --git a/src/pages/dashboard/refahi/edit-request-loan/[id].jsx b/src/pages/dashboard/refahi/edit-request-loan/[id].jsx deleted file mode 100644 index f6b72d5..0000000 --- a/src/pages/dashboard/refahi/edit-request-loan/[id].jsx +++ /dev/null @@ -1,24 +0,0 @@ -import WithAuthMiddleware from "@/middlewares/WithAuth"; -import {parse} from "next-useragent"; - -const user_type = 2; -export default function EditLoanRequest() { - return ( - - {/**/} - {/* */} - {/**/} - - ); -} - -export async function getServerSideProps({req, locale}) { - const {isBot} = parse(req.headers["user-agent"]); - return { - props: { - messages: (await import(`&/locales/${locale}/app.json`)).default, - title: "EditLoanRequest.edit_loan_request_page", - isBot, - }, - }; -} diff --git a/src/pages/dashboard/refahi/followUp-loan/index.jsx b/src/pages/dashboard/refahi/followUp-loan/index.jsx deleted file mode 100644 index f679299..0000000 --- a/src/pages/dashboard/refahi/followUp-loan/index.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import WithAuthMiddleware from "@/middlewares/WithAuth"; -import {parse} from "next-useragent"; - -const user_type = 2; -export default function FollowUpLoan() { - return ( - - {/**/} - {/* */} - {/**/} - - ); -} - -export async function getServerSideProps({req, locale}) { - const {isBot} = parse(req.headers["user-agent"]); - return { - props: { - messages: (await import(`&/locales/${locale}/app.json`)).default, - title: "LoanFollowUp.loan_follow_up_page", - isBot, - }, - }; -} diff --git a/src/pages/login.jsx b/src/pages/login.jsx index 5cac2bc..63e88c7 100644 --- a/src/pages/login.jsx +++ b/src/pages/login.jsx @@ -1,10 +1,10 @@ import LoginComponent from "@/components/login"; -import WithoutAuthMiddleware from "@/middlewares/WithoutAuth"; import {parse} from "next-useragent"; +import {WithoutAuthMiddleware} from "@witel/webapp-builder"; export default function Login() { return ( - + ); diff --git a/src/pages/register/index.jsx b/src/pages/register/index.jsx index 6d8d4d6..3f078d7 100644 --- a/src/pages/register/index.jsx +++ b/src/pages/register/index.jsx @@ -1,10 +1,10 @@ import RegisterComponent from "@/components/register"; -import WithoutAuthMiddleware from "@/middlewares/WithoutAuth"; import {parse} from "next-useragent"; +import {WithoutAuthMiddleware} from "@witel/webapp-builder"; export default function Register() { return ( - + ); From d575bcc496ca6e634bb9de31fbc7e0b348b74233 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 11 Dec 2023 11:22:57 +0330 Subject: [PATCH 02/43] change content first page and fixed bugs --- public/files/راهنما.xlsx | Bin 0 -> 14047 bytes src/components/first/LoanCondition.jsx | 31 +++--- .../first/LoanDescription/TimeLineDetails.jsx | 93 ++---------------- .../first/LoanDescription/index.jsx | 38 +++---- src/components/first/LoanRegister.jsx | 7 +- .../components/timelines/DoneTimeLine.jsx | 35 +++++++ .../timelines/InProgressTimeLine.jsx | 33 +++++++ .../components/timelines/OpenTimeLine.jsx | 34 +++++++ 8 files changed, 152 insertions(+), 119 deletions(-) create mode 100644 public/files/راهنما.xlsx create mode 100644 src/core/components/timelines/DoneTimeLine.jsx create mode 100644 src/core/components/timelines/InProgressTimeLine.jsx create mode 100644 src/core/components/timelines/OpenTimeLine.jsx diff --git a/public/files/راهنما.xlsx b/public/files/راهنما.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..efbd0bf48498b56660e45b9186485f7dddbb00ef GIT binary patch literal 14047 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 literal 0 HcmV?d00001 diff --git a/src/components/first/LoanCondition.jsx b/src/components/first/LoanCondition.jsx index 5259679..da19a17 100644 --- a/src/components/first/LoanCondition.jsx +++ b/src/components/first/LoanCondition.jsx @@ -7,9 +7,6 @@ const LoanCondition = () => { return ( - - تخصیص وام - @@ -17,18 +14,22 @@ const LoanCondition = () => { قوانین دریافت وام - - - - + + + - این یکی از محبوب‌ترین انواع وام در ایران است. دلیل این - محبوبیت سرعت آن در پرداخت و سود بسیار پایین آن است. - تنها یک شرط برای اخذ این وام وجود دارد و آن این است که باید به تازگی ازدواج کرده باشید. - همچنین فقط یک بار از این وام می‌توانید استفاده کنید. یعنی این وام فقط یک بار به هر فرد - تعلق می‌گیرد. - محل تامین بودجه آن حساب‌های قرض الحسنه‌ایست که افراد در بانک‌ها باز می‌کنند و مرجع اصلی - آرائه آن، بانک مرکزی است. + + این وام برای اتوبوس تا سقف 700 میلیون تومان + و برای مینی بوس تا سقف 200 میلیون تومان در + نظر گرفته شده است. مبلغ نهایی با توجه به امتیاز و روند کارشناسی در ادارات مربوطه مشخص + میشود. برای اطلاع از شرایط کامل این وام فایل پیوست را مطالعه بفرمایید. @@ -41,7 +42,7 @@ const LoanCondition = () => { color={'white'} download underline="none" - href={'/dist/images/modalrms/Asset%2010.apk'} + href={'/files/راهنما.xlsx'} > دریافت فایل های راهنما diff --git a/src/components/first/LoanDescription/TimeLineDetails.jsx b/src/components/first/LoanDescription/TimeLineDetails.jsx index abfe3d1..5feb4fe 100644 --- a/src/components/first/LoanDescription/TimeLineDetails.jsx +++ b/src/components/first/LoanDescription/TimeLineDetails.jsx @@ -1,91 +1,18 @@ import {useTranslations} from "next-intl"; -import { - Timeline, - TimelineConnector, TimelineContent, - TimelineDot, - TimelineItem, - TimelineOppositeContent, - TimelineSeparator -} from "@mui/lab"; -import RepeatIcon from '@mui/icons-material/Repeat'; -import FastfoodIcon from '@mui/icons-material/Fastfood'; -import LaptopMacIcon from '@mui/icons-material/LaptopMac'; -import CheckCircleIcon from '@mui/icons-material/CheckCircle'; -import CallMadeIcon from '@mui/icons-material/CallMade'; -import {CircularProgress, Typography} from "@mui/material"; -import HowToRegIcon from '@mui/icons-material/HowToReg'; -import DoneIcon from '@mui/icons-material/Done'; -import HotelIcon from '@mui/icons-material/Hotel'; +import {Timeline} from "@mui/lab"; +import OpenTimeLine from "@/core/components/timelines/OpenTimeLine"; +import InProgressTimeLine from "@/core/components/timelines/InProgressTimeLine"; const TimeLineDetails = () => { const t = useTranslations(); - return( + return ( - - - 10 دی - - - - - - - - - - ثبت نام متقاضی - - ثبت نام متقاضیان واجد شرایط - - - - - 10 بهمن - - - - - - - - - - - صحت سنجی متقاضیان - - بررسی و کارشناسی درخواست ها - - - - - 10 اسفند - - - - - - - - - - ارجاع به بانک - - فرآیند معرفی ضامن و پرداخت - - + + + ) } diff --git a/src/components/first/LoanDescription/index.jsx b/src/components/first/LoanDescription/index.jsx index d7e57da..f5a933d 100644 --- a/src/components/first/LoanDescription/index.jsx +++ b/src/components/first/LoanDescription/index.jsx @@ -8,27 +8,29 @@ const LoanDescription = () => { - توضیحات دریافت وام + وام نوسازی ناوگان - - وام خرید کالای مهر ایران یا کالا کارت با هدف خرید مایحتاج خانه و کالاهای ضروری زندگی داده - می‌شود. سقف کالا کارت ۱۵۰ میلیون تومان و سود آن ۴ درصد است. - با دریافت کالا کارت می‌توانید وسایل موردنیازتان را از فروشگاه‌های طرف قرارداد - این فروشگاه‌ها با نام گلدیران در شهرهای تهران، شیراز، اهواز، نور، اصفهان، تبریز، ساری و رشت - فعالیت می‌کنند. - طبق قوانین جدید و در راستای حمایت از طرح افزایش جمیعت، مبلغ آن برای زوجینی که مرد زیر ۲۵ سال - و زن زیر ۲۳ سال داشته باشد، 440 میلیون یا ۲۲۰ - میلیون به ازای هر نفر است. - در این قانون هریک از زوجین که شرایط آن‌ها در این قانون نگنجد، - مبلغ تغییر کرده و به زوج 400 میلیون وام تعلق - خواهد گرفت. - حداکثر زمان بازپرداخت وام خرید کالا ۲۴ ماه است و برای گرفتن آن به یک ضامن رسمی احتیاج دارید. + + این وام براساس تبصره 18 قانون بودجه می باشد. در + قانون + بودجه این تبصره اینگونه بیان شده است: + "به منظور رشد و پیشرفت استان های کشور از طریق ارتقای بهره وری و توسعه، سرمایه گذاری ها، + تکمیل واحدهای نیمه تمام و ظرفیت های خالی بنگاه های تولیدی بر پایه آمایش سرزمین و همچنین + حمایت از طرح(پروژهای) دانش بنیان و پیشران و بسط و عدالت سرزمینی منابع زیر جهت ایجاد و افزایش + تولید، اشتغال و کارآفرینی و ارتقای رشد اقتصادی اختصاص می یابد". + + + در این راستا سازمان راهداری و حمل و نقل جاده ای به منظور بهبود کیفیت حمل و نقل بین شهری و + افزایش ظرفیت ترابری اقدام به اعطای وام به ناوگان های + مسافربری برای + بازسازی و تعمیرات میکند. diff --git a/src/components/first/LoanRegister.jsx b/src/components/first/LoanRegister.jsx index 6c7bed7..c665eb2 100644 --- a/src/components/first/LoanRegister.jsx +++ b/src/components/first/LoanRegister.jsx @@ -14,9 +14,10 @@ const LoanRegister = () => { - - برای استفاده از تسهیلات این سامانه و دریافت وام می بایست ابتدا وارد سامانه شوید و یا - اگر ثبت نام نکرده اید ثبت نام کنید + + وام نوسازی ناوگان به هدف رشد و پیشرفت استان های کشور از طریق ارتقای بهره وری و توسعه + اعطا میشود. برای استفاده از تسهیلات این سامانه و درخواست وام می بایست ابتدا وارد + سامانه شوید. diff --git a/src/core/components/timelines/DoneTimeLine.jsx b/src/core/components/timelines/DoneTimeLine.jsx new file mode 100644 index 0000000..c2e2b3e --- /dev/null +++ b/src/core/components/timelines/DoneTimeLine.jsx @@ -0,0 +1,35 @@ +import { + TimelineConnector, + TimelineContent, + TimelineDot, + TimelineItem, + TimelineOppositeContent, + TimelineSeparator +} from "@mui/lab"; +import DoneIcon from "@mui/icons-material/Done"; +import {Typography} from "@mui/material"; + +const DoneTimeLine = ({date, primaryLabel, secondaryLabel, position}) => { + return ( + + {date} + + + + + {position !== 'end' && } + + + {primaryLabel} + {secondaryLabel} + + + ) +} + +export default DoneTimeLine \ No newline at end of file diff --git a/src/core/components/timelines/InProgressTimeLine.jsx b/src/core/components/timelines/InProgressTimeLine.jsx new file mode 100644 index 0000000..2b210d9 --- /dev/null +++ b/src/core/components/timelines/InProgressTimeLine.jsx @@ -0,0 +1,33 @@ +import { + TimelineConnector, + TimelineContent, + TimelineDot, + TimelineItem, + TimelineOppositeContent, + TimelineSeparator +} from "@mui/lab"; +import {CircularProgress, Typography} from "@mui/material"; + +const InProgressTimeLine = ({date, primaryLabel, secondaryLabel, position}) => { + return ( + + {date} + + + + + {position !== 'end' && } + + + {primaryLabel} + {secondaryLabel} + + + ) +} + +export default InProgressTimeLine \ No newline at end of file diff --git a/src/core/components/timelines/OpenTimeLine.jsx b/src/core/components/timelines/OpenTimeLine.jsx new file mode 100644 index 0000000..b203ea2 --- /dev/null +++ b/src/core/components/timelines/OpenTimeLine.jsx @@ -0,0 +1,34 @@ +import { + TimelineConnector, + TimelineContent, + TimelineDot, + TimelineItem, + TimelineOppositeContent, + TimelineSeparator +} from "@mui/lab"; +import CallMadeIcon from "@mui/icons-material/CallMade"; +import {Typography} from "@mui/material"; + +const OpenTimeLine = ({date, primaryLabel, secondaryLabel, position}) => { + return ( + + {date} + + + + + {position !== 'end' && } + + + {primaryLabel} + {secondaryLabel} + + + ) +} + +export default OpenTimeLine \ No newline at end of file From 90b9c385fcb523404bd3c7542b741d6c7068b927 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 11 Dec 2023 11:25:15 +0330 Subject: [PATCH 03/43] change content first page and fixed bugs --- src/components/first/LoanDescription/index.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/first/LoanDescription/index.jsx b/src/components/first/LoanDescription/index.jsx index f5a933d..a0afd67 100644 --- a/src/components/first/LoanDescription/index.jsx +++ b/src/components/first/LoanDescription/index.jsx @@ -18,10 +18,10 @@ const LoanDescription = () => { component={'span'}>تبصره 18 قانون بودجه می باشد. در قانون بودجه این تبصره اینگونه بیان شده است: - "به منظور رشد و پیشرفت استان های کشور از طریق ارتقای بهره وری و توسعه، سرمایه گذاری ها، + به منظور رشد و پیشرفت استان های کشور از طریق ارتقای بهره وری و توسعه، سرمایه گذاری ها، تکمیل واحدهای نیمه تمام و ظرفیت های خالی بنگاه های تولیدی بر پایه آمایش سرزمین و همچنین حمایت از طرح(پروژهای) دانش بنیان و پیشران و بسط و عدالت سرزمینی منابع زیر جهت ایجاد و افزایش - تولید، اشتغال و کارآفرینی و ارتقای رشد اقتصادی اختصاص می یابد". + تولید، اشتغال و کارآفرینی و ارتقای رشد اقتصادی اختصاص می یابد. در این راستا سازمان راهداری و حمل و نقل جاده ای به منظور بهبود کیفیت حمل و نقل بین شهری و From 6ad675c3df77b819537559d63e9dc2e58c89c6a9 Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Mon, 11 Dec 2023 14:54:42 +0330 Subject: [PATCH 04/43] 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 05/43] 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 61d947cac6670c172cf99bda1f1205faaa50eddc Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 11 Dec 2023 16:29:27 +0330 Subject: [PATCH 06/43] implementation of dynamic timeline in first page --- .gitignore | 4 +- public/config.json.example | 36 +++++++++ public/locales/fa/app.json | 1 + .../first/LoanDescription/TimeLineDetails.jsx | 74 ++++++++++++++++--- .../components/timelines/timelineManager.jsx | 16 ++++ 5 files changed, 120 insertions(+), 11 deletions(-) create mode 100644 public/config.json.example create mode 100644 src/core/components/timelines/timelineManager.jsx diff --git a/.gitignore b/.gitignore index ccfafdc..a59383e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,6 @@ cypress/screenshots .env .idea package-lock.json -ecosystem.config \ No newline at end of file +ecosystem.config + +public/config.json \ No newline at end of file diff --git a/public/config.json.example b/public/config.json.example new file mode 100644 index 0000000..59e8e23 --- /dev/null +++ b/public/config.json.example @@ -0,0 +1,36 @@ +{ + "time_lines": { + "navgan_first_page": [ + { + "date": { + "from": "1402/09/01", + "to": "1402/09/10" + }, + "label": { + "primary": "ثبت نام متقاضی", + "secondary": "ثبت نام متقاضیان واجد شرایط" + } + }, + { + "date": { + "from": "1402/09/15", + "to": "1402/11/10" + }, + "label": { + "primary": "صحت سنجی متقاضیان", + "secondary": "بررسی و کارشناسی درخواست ها" + } + }, + { + "date": { + "from": "1402/11/10", + "to": "1402/12/20" + }, + "label": { + "primary": "ارجاع به بانک", + "secondary": "فرآیند معرفی ضامن و پرداخت" + } + } + ] + } +} \ No newline at end of file diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 2eeb753..6978a5d 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -18,6 +18,7 @@ "upload_file_text": "بارگذاری فایل", "online_message": "شما به اینترنت وصل هستید", "offline_message": "اتصال شما به اینترنت قطع شده است", + "routing_to": "در حال انتقال به صفحه", "header": { "open_profile": "پروفایل", "edit_profile": "ویرایش پروفایل", diff --git a/src/components/first/LoanDescription/TimeLineDetails.jsx b/src/components/first/LoanDescription/TimeLineDetails.jsx index 5feb4fe..a3db1a7 100644 --- a/src/components/first/LoanDescription/TimeLineDetails.jsx +++ b/src/components/first/LoanDescription/TimeLineDetails.jsx @@ -1,19 +1,73 @@ import {useTranslations} from "next-intl"; +import {useEffect, useState} from "react"; +import {useRequest} from "@witel/webapp-builder"; +import TimelineManager from "@/core/components/timelines/timelineManager"; +import moment from "jalali-moment"; import {Timeline} from "@mui/lab"; -import OpenTimeLine from "@/core/components/timelines/OpenTimeLine"; -import InProgressTimeLine from "@/core/components/timelines/InProgressTimeLine"; const TimeLineDetails = () => { const t = useTranslations(); + const request = useRequest({notification: false, auth: false}) + const [timeLineList, setTimeLineList] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + setLoading(true) + request(process.env.NEXT_PUBLIC_CONFIG_APP_URL, 'get').then(res => { + setLoading(false) + let tempArr = [] + for (const timeLine of res.data.time_lines.navgan_first_page) { + let temp = {} + temp['label'] = timeLine.label + temp['date'] = moment(timeLine.date.from, 'jYYYY/jMM/jDD').locale('fa').format('jD jMMMM') + const fromDate = moment(timeLine.date.from, 'jYYYY/jMM/jDD') + const toDate = moment(timeLine.date.to, 'jYYYY/jMM/jDD') + const today = moment() + if (today.isBetween(fromDate, toDate, null, '[]')) { + temp['status'] = 'in progress' + } else if (today.isAfter(toDate, null)) { + temp['status'] = 'done' + } else if (today.isBefore(fromDate, null)) { + temp['status'] = 'open' + } + tempArr.push(temp) + } + setTimeLineList(tempArr) + }).catch(() => { + setLoading(false) + }) + }, []); + return ( - - - - - + <> + {loading ? ( + <>loading... + ) : ( + + {timeLineList.map((timeLine, index) => ( + + )) + } + + )} + ) + // return ( + // + // + // + // + // + // ) } export default TimeLineDetails \ No newline at end of file diff --git a/src/core/components/timelines/timelineManager.jsx b/src/core/components/timelines/timelineManager.jsx new file mode 100644 index 0000000..292c3d1 --- /dev/null +++ b/src/core/components/timelines/timelineManager.jsx @@ -0,0 +1,16 @@ +import OpenTimeLine from "@/core/components/timelines/OpenTimeLine"; +import InProgressTimeLine from "@/core/components/timelines/InProgressTimeLine"; +import DoneTimeLine from "@/core/components/timelines/DoneTimeLine"; + +const TimelineManager = (props) => { + switch (props.status) { + case 'open': + return + case 'in progress': + return + case 'done': + return + } +} + +export default TimelineManager \ No newline at end of file From fc944c0d350d561f332e85d4f70a932d00cecc49 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 11 Dec 2023 16:29:59 +0330 Subject: [PATCH 07/43] fixed bugs for dashboard layout --- package.json | 2 +- src/core/data/sidebarMenu.js | 15 +++++++++------ src/layouts/dashboard.jsx | 14 +++++++++++--- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index e44361c..9b8b7b0 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.0.2", + "@witel/webapp-builder": "^1.0.6", "axios": "^1.4.0", "colord": "^2.9.3", "eslint": "8.36.0", diff --git a/src/core/data/sidebarMenu.js b/src/core/data/sidebarMenu.js index 1869bae..5f24a93 100644 --- a/src/core/data/sidebarMenu.js +++ b/src/core/data/sidebarMenu.js @@ -6,27 +6,30 @@ const sidebarMenu = [ [ { key: "sidebar.dashboard", + name: "sidebar.dashboard", type: "page", route: "/dashboard", - icon: , + icon: , selected: false, - permission_name: "all" + permission: "all" }, { key: "sidebar.add-request-loan", + name: "sidebar.add-request-loan", type: "page", route: "/dashboard/navgan/add-request-loan", - icon: , + icon: , selected: false, - permission_name: "can_request_a_new_loan" + permission: "can_request_a_new_loan" }, { key: "sidebar.followUp-loan", + name: "sidebar.followUp-loan", type: "page", route: "/dashboard/navgan/followUp-loan", - icon: , + icon: , selected: false, - permission_name: "all" + permission: "all" }, ], ]; diff --git a/src/layouts/dashboard.jsx b/src/layouts/dashboard.jsx index 945416c..9b1a916 100644 --- a/src/layouts/dashboard.jsx +++ b/src/layouts/dashboard.jsx @@ -1,13 +1,21 @@ -import {DashboardLayout as DashboardLayoutPure} from "@witel/webapp-builder"; +import {DashboardLayout as DashboardLayoutPure, useUser} from "@witel/webapp-builder"; import headerProfileItems from "@/core/data/headerProfileItems"; import sidebarMenu from "@/core/data/sidebarMenu"; import {GET_SIDEBAR_NOTIFICATION} from "@/core/data/apiRoutes"; const DashboardLayout = (props) => { + const {user} = useUser() return ( <> - + ) } From 96ebf94bfe4b373f983d537e0bdb7fe04eb98002 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 11 Dec 2023 16:43:33 +0330 Subject: [PATCH 08/43] implementation of dynamic timeline in first page --- src/components/first/LoanDescription/TimeLineDetails.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/first/LoanDescription/TimeLineDetails.jsx b/src/components/first/LoanDescription/TimeLineDetails.jsx index a3db1a7..d57064b 100644 --- a/src/components/first/LoanDescription/TimeLineDetails.jsx +++ b/src/components/first/LoanDescription/TimeLineDetails.jsx @@ -4,6 +4,7 @@ import {useRequest} from "@witel/webapp-builder"; import TimelineManager from "@/core/components/timelines/timelineManager"; import moment from "jalali-moment"; import {Timeline} from "@mui/lab"; +import {LinearProgress} from "@mui/material"; const TimeLineDetails = () => { const t = useTranslations(); @@ -14,7 +15,6 @@ const TimeLineDetails = () => { useEffect(() => { setLoading(true) request(process.env.NEXT_PUBLIC_CONFIG_APP_URL, 'get').then(res => { - setLoading(false) let tempArr = [] for (const timeLine of res.data.time_lines.navgan_first_page) { let temp = {} @@ -33,6 +33,7 @@ const TimeLineDetails = () => { tempArr.push(temp) } setTimeLineList(tempArr) + setLoading(false) }).catch(() => { setLoading(false) }) @@ -41,7 +42,7 @@ const TimeLineDetails = () => { return ( <> {loading ? ( - <>loading... + ) : ( {timeLineList.map((timeLine, index) => ( From 12d559d7c844b4ffa1c7846af03e1c90d6c6a671 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 11 Dec 2023 16:57:37 +0330 Subject: [PATCH 09/43] implementation of dynamic timeline in first page --- src/components/first/LoanDescription/TimeLineDetails.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/first/LoanDescription/TimeLineDetails.jsx b/src/components/first/LoanDescription/TimeLineDetails.jsx index d57064b..02e2fed 100644 --- a/src/components/first/LoanDescription/TimeLineDetails.jsx +++ b/src/components/first/LoanDescription/TimeLineDetails.jsx @@ -49,7 +49,7 @@ const TimeLineDetails = () => { Date: Tue, 12 Dec 2023 09:16:13 +0330 Subject: [PATCH 10/43] 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 14/43] 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 15/43] 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 16/43] 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 17/43] 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 18/43] 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 19/43] 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 20/43] 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 21/43] 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 22/43] 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}