From e5d0fcb8dfc7686e308b90cc4dceee7b339ef94d Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Fri, 25 Jul 2025 23:20:44 +0530 Subject: [PATCH] added create new Expense master form with api integrated --- src/components/master/CreateExpense.jsx | 72 +++++++++++++++++++++++++ src/components/master/MasterModal.jsx | 2 + src/hooks/masterHook/useMaster.js | 22 ++++++++ src/repositories/MastersRepository.jsx | 1 + 4 files changed, 97 insertions(+) create mode 100644 src/components/master/CreateExpense.jsx diff --git a/src/components/master/CreateExpense.jsx b/src/components/master/CreateExpense.jsx new file mode 100644 index 00000000..e941a922 --- /dev/null +++ b/src/components/master/CreateExpense.jsx @@ -0,0 +1,72 @@ + +import React from 'react' +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useCreateExpenseType } from '../../hooks/masterHook/useMaster'; + + +const ExpnseSchema = z.object({ + name: z.string().min(1, { message: "Name is required" }), + noOfPersonsRequired: z.boolean().default(false), + description: z.string().min(1, { message: "Description is required" }), +}); + + +const CreateExpense = ({onClose}) => { + const {register,handleSubmit,formState : {errors}} = useForm({ + resolver:zodResolver(ExpnseSchema), + defaultValues:{name:"",noOfPersonsRequired:false,description:""} + }) + const {mutate:CreateExpenseType,isPending} = useCreateExpenseType(()=>onClose?.()) + + const onSubmit = (payload) => { + CreateExpenseType(payload) + }; + + return ( +
+
+ + + {errors.name &&

{errors.name.message}

} +
+
+ + + + {errors.description && ( +

{errors.description.message}

+ )} +
+
+ +
+
+ + +
+ +
+ ) +} + +export default CreateExpense \ No newline at end of file diff --git a/src/components/master/MasterModal.jsx b/src/components/master/MasterModal.jsx index 13ca0e7c..4ea449c7 100644 --- a/src/components/master/MasterModal.jsx +++ b/src/components/master/MasterModal.jsx @@ -17,6 +17,7 @@ import CreateContactTag from "./CreateContactTag"; import EditContactCategory from "./EditContactCategory"; import EditContactTag from "./EditContactTag"; import { useDeleteMasterItem } from "../../hooks/masterHook/useMaster"; +import CreateExpense from "./createExpense"; const MasterModal = ({ modaldata, closeModal }) => { @@ -88,6 +89,7 @@ const MasterModal = ({ modaldata, closeModal }) => { "Edit-Contact Category": , "Contact Tag": , "Edit-Contact Tag": , + "Expense Type": }; return modalComponents[modalType] || null; diff --git a/src/hooks/masterHook/useMaster.js b/src/hooks/masterHook/useMaster.js index 0813469f..8d6aeb5d 100644 --- a/src/hooks/masterHook/useMaster.js +++ b/src/hooks/masterHook/useMaster.js @@ -535,6 +535,28 @@ export const useUpdateContactTag = (onSuccessCallback) => }); } +// ----------------------Expense Type------------------ +export const useCreateExpenseType = (onSuccessCallback)=>{ + const queryClient = useQueryClient(); + + return useMutation( { + mutationFn: async ( payload ) => + { + const resp = await MasterRespository.createExpenseType(payload); + return resp.data; + }, + onSuccess: ( data ) => + { + queryClient.invalidateQueries( {queryKey:[ "masterData", "Expense Type" ]} ) + showToast( "Expense Type added successfully", "success" ); + if(onSuccessCallback) onSuccessCallback(data) + }, + onError: ( error ) => + { + showToast(error.message || "Something went wrong", "error"); + } + }) +} // -Delete Master -------- export const useDeleteMasterItem = () => { const queryClient = useQueryClient(); diff --git a/src/repositories/MastersRepository.jsx b/src/repositories/MastersRepository.jsx index 046e0c66..539f639a 100644 --- a/src/repositories/MastersRepository.jsx +++ b/src/repositories/MastersRepository.jsx @@ -59,6 +59,7 @@ export const MasterRespository = { getAuditStatus:()=>api.get('/api/Master/work-status'), getExpenseType:()=>api.get('/api/Master/expenses-types'), + createExpenseType:(data)=>api.post('/api/Master/expenses-type',data), getPaymentMode:()=>api.get('/api/Master/payment-modes'), -- 2.43.0