TF-93 price field
This commit is contained in:
@@ -265,6 +265,8 @@
|
||||
"approved_amount": "مبلغ تصویب شده",
|
||||
"approved_amount_error": "وارد کردن مبلغ تصویب شده الزامیست",
|
||||
"approved_amount_positive": "مبلغ تصویب شده باید مثبت باشد",
|
||||
"approved_amount_number": "مبلغ تصویب شده باید عدد باشد",
|
||||
"toman": "تومان",
|
||||
"proposed_amount_error": "وارد کردن مقدار پیشنهادی الزامیست",
|
||||
"proposed_amount": "مقدار پیشنهادی",
|
||||
"proposed_amount_positive": "مقدار پیشنهادی باید مثبت باشد"
|
||||
|
||||
@@ -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}) => {
|
||||
/>
|
||||
</Stack>
|
||||
<Stack>
|
||||
<TextField
|
||||
<PriceField
|
||||
name="proposed_amount"
|
||||
label={<>
|
||||
<span>{t("ConfirmDialog.proposed_amount")}</span><small>{t("ConfirmDialog.unit")}</small></>}
|
||||
type="number"
|
||||
type="text"
|
||||
inputProps={{
|
||||
inputMode: "number",
|
||||
min: 0,
|
||||
pattern: "[0-9]*",
|
||||
}}
|
||||
|
||||
@@ -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}) => {
|
||||
/>
|
||||
</Stack>
|
||||
<Stack>
|
||||
<TextField
|
||||
<PriceField
|
||||
name="approved_amount"
|
||||
label={<>
|
||||
<span>{t("ConfirmDialog.approved_amount")}</span><small>{t("ConfirmDialog.unit")}</small></>}
|
||||
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 &&
|
||||
|
||||
23
src/core/components/PriceField.jsx
Normal file
23
src/core/components/PriceField.jsx
Normal file
@@ -0,0 +1,23 @@
|
||||
import {InputAdornment, TextField, Typography} from "@mui/material";
|
||||
import {useTranslations} from "next-intl";
|
||||
|
||||
const PriceField = (props) => {
|
||||
const t = useTranslations();
|
||||
return (
|
||||
<TextField
|
||||
InputProps={{
|
||||
endAdornment: (
|
||||
<InputAdornment position="end">
|
||||
<Typography
|
||||
sx={{margin: 1}}
|
||||
component="span">{((props.value) / 10).toLocaleString()}</Typography>
|
||||
<Typography component="span"
|
||||
variant="caption">{t("ConfirmDialog.toman")}</Typography>
|
||||
</InputAdornment>
|
||||
),
|
||||
}}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
export default PriceField
|
||||
Reference in New Issue
Block a user