diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 437cabd..41f327b 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -265,6 +265,8 @@ "approved_amount": "مبلغ تصویب شده", "approved_amount_error": "وارد کردن مبلغ تصویب شده الزامیست", "approved_amount_positive": "مبلغ تصویب شده باید مثبت باشد", + "approved_amount_number": "مبلغ تصویب شده باید عدد باشد", + "toman": "تومان", "proposed_amount_error": "وارد کردن مقدار پیشنهادی الزامیست", "proposed_amount": "مقدار پیشنهادی", "proposed_amount_positive": "مقدار پیشنهادی باید مثبت باشد" diff --git a/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx b/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx index ab4b11f..a55653c 100644 --- a/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx +++ b/src/components/dashboard/machinary-office/Form/ConfirmForm.jsx @@ -21,6 +21,7 @@ import {CONFIRM_MACHINARY_OFFICE} from "@/core/data/apiRoutes"; import * as Yup from "yup"; import useRequest from "@/lib/app/hooks/useRequest"; import useNotification from "@/lib/app/hooks/useNotification"; +import PriceField from "@/core/components/PriceField"; const Confirm = ({rowId, fetchUrl, mutate}) => { @@ -35,7 +36,12 @@ const Confirm = ({rowId, fetchUrl, mutate}) => { const {update_notification} = useNotification() const validationSchema = Yup.object().shape({ - proposed_amount: Yup.number().positive(t("ConfirmDialog.proposed_amount_positive")).required(t("ConfirmDialog.proposed_amount_error")), + proposed_amount: Yup.mixed().test( + "is-number", + `${t("ConfirmDialog.approved_amount_number")}`, + (value) => !isNaN(value) + ).test("positive", `${t("ConfirmDialog.proposed_amount_positive")}`, (value) => value >= 0) + .required(t("ConfirmDialog.proposed_amount_error")) }) const formik = useFormik({ initialValues: { @@ -66,7 +72,11 @@ const Confirm = ({rowId, fetchUrl, mutate}) => { formik.setFieldValue("description", event.target.value) }; const handleAmountChange = (event) => { - formik.setFieldValue("proposed_amount", event.target.value); + if (!isNaN(event.target.value)) { + formik.setFieldValue("proposed_amount", event.target.value) + } else { + formik.setFieldValue("proposed_amount", formik.values.proposed_amount) + } }; const handleUploadChange = (event) => { const uploadedFile = event.target?.files?.[0]; @@ -119,12 +129,13 @@ const Confirm = ({rowId, fetchUrl, mutate}) => { /> - {t("ConfirmDialog.proposed_amount")}{t("ConfirmDialog.unit")}} - type="number" + type="text" inputProps={{ + inputMode: "number", min: 0, pattern: "[0-9]*", }} diff --git a/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx b/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx index d4305f5..4b188f2 100644 --- a/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx +++ b/src/components/dashboard/passenger-boss/Form/ConfirmForm.jsx @@ -21,6 +21,7 @@ import * as Yup from "yup"; import useRequest from "@/lib/app/hooks/useRequest"; import {CONFIRM_PASSENGER_BOSS} from "@/core/data/apiRoutes"; import useNotification from "@/lib/app/hooks/useNotification"; +import PriceField from "@/core/components/PriceField"; const Confirm = ({rowId, fetchUrl, mutate}) => { @@ -35,7 +36,12 @@ const Confirm = ({rowId, fetchUrl, mutate}) => { const {update_notification} = useNotification() const validationSchema = Yup.object().shape({ - approved_amount: Yup.number().positive(t("ConfirmDialog.approved_amount_positive")).required(t("ConfirmDialog.approved_amount_error")) + approved_amount: Yup.mixed().test( + "is-number", + `${t("ConfirmDialog.approved_amount_number")}`, + (value) => !isNaN(value) + ).test("positive", `${t("ConfirmDialog.proposed_amount_positive")}`, (value) => value >= 0) + .required(t("ConfirmDialog.approved_amount_error")) }); const formik = useFormik({ initialValues: { @@ -66,7 +72,11 @@ const Confirm = ({rowId, fetchUrl, mutate}) => { formik.setFieldValue("description", event.target.value) }; const handleAmountChange = (event) => { - formik.setFieldValue("approved_amount", event.target.value); + if (!isNaN(event.target.value)) { + formik.setFieldValue("approved_amount", event.target.value) + } else { + formik.setFieldValue("approved_amount", formik.values.approved_amount) + } }; const handleUploadChange = (event) => { const uploadedFile = event.target?.files?.[0]; @@ -119,18 +129,19 @@ const Confirm = ({rowId, fetchUrl, mutate}) => { /> - {t("ConfirmDialog.approved_amount")}{t("ConfirmDialog.unit")}} - type="number" + type="text" inputProps={{ + inputMode: "number", min: 0, pattern: "[0-9]*", }} + onChange={handleAmountChange} variant="outlined" value={formik.values.approved_amount} - onChange={handleAmountChange} onBlur={formik.handleBlur("approved_amount")} error={ formik.touched.approved_amount && diff --git a/src/core/components/PriceField.jsx b/src/core/components/PriceField.jsx new file mode 100644 index 0000000..29d8763 --- /dev/null +++ b/src/core/components/PriceField.jsx @@ -0,0 +1,23 @@ +import {InputAdornment, TextField, Typography} from "@mui/material"; +import {useTranslations} from "next-intl"; + +const PriceField = (props) => { + const t = useTranslations(); + return ( + + {((props.value) / 10).toLocaleString()} + {t("ConfirmDialog.toman")} + + ), + }} + {...props} + /> + ) +} +export default PriceField \ No newline at end of file