From 5a2eb1894d52c6f3eee5dce7280d2f2af48f106c Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Fri, 25 Jul 2025 23:49:25 +0530 Subject: [PATCH 1/2] added edit functionality, merged create/edit into a common form --- src/components/master/CreateExpense.jsx | 72 ------------- src/components/master/ManageExpenseType.jsx | 112 ++++++++++++++++++++ src/components/master/MasterModal.jsx | 5 +- src/hooks/masterHook/useMaster.js | 25 +++++ src/repositories/MastersRepository.jsx | 1 + 5 files changed, 141 insertions(+), 74 deletions(-) delete mode 100644 src/components/master/CreateExpense.jsx create mode 100644 src/components/master/ManageExpenseType.jsx diff --git a/src/components/master/CreateExpense.jsx b/src/components/master/CreateExpense.jsx deleted file mode 100644 index e941a922..00000000 --- a/src/components/master/CreateExpense.jsx +++ /dev/null @@ -1,72 +0,0 @@ - -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/ManageExpenseType.jsx b/src/components/master/ManageExpenseType.jsx new file mode 100644 index 00000000..fdd9ea53 --- /dev/null +++ b/src/components/master/ManageExpenseType.jsx @@ -0,0 +1,112 @@ +import React, { useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + useCreateExpenseType, + useUpdateExpenseType, +} 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 ManageExpenseType = ({ data = null, onClose }) => { + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ + resolver: zodResolver(ExpnseSchema), + defaultValues: { name: "", noOfPersonsRequired: false, description: "" }, + }); + const { mutate: UpdateExpenseType, isPending:isPendingUpdate } = useUpdateExpenseType( + () => onClose?.() + ); + const { mutate: CreateExpenseType, isPending } = useCreateExpenseType(() => + onClose?.() + ); + + const onSubmit = (payload) => { + if (data) { + UpdateExpenseType({ + id: data.id, + payload: { ...payload, id: data.id }, + }); + } else { + CreateExpenseType(payload); + } + }; + + useEffect(() => { + if (data) { + reset({ + name: data.name ?? "", + noOfPersonsRequired: data.noOfPersonsRequired ?? false, + description: data.description ?? "", + }); + } + }, [data]); + return ( +
+
+ + + {errors.name &&

{errors.name.message}

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

{errors.description.message}

+ )} +
+
+ {" "} + +
+
+ + +
+
+ ); +}; + +export default ManageExpenseType; diff --git a/src/components/master/MasterModal.jsx b/src/components/master/MasterModal.jsx index 4ea449c7..774f9046 100644 --- a/src/components/master/MasterModal.jsx +++ b/src/components/master/MasterModal.jsx @@ -17,7 +17,7 @@ import CreateContactTag from "./CreateContactTag"; import EditContactCategory from "./EditContactCategory"; import EditContactTag from "./EditContactTag"; import { useDeleteMasterItem } from "../../hooks/masterHook/useMaster"; -import CreateExpense from "./createExpense"; +import ManageExpenseType from "./ManageExpenseType"; const MasterModal = ({ modaldata, closeModal }) => { @@ -89,7 +89,8 @@ const MasterModal = ({ modaldata, closeModal }) => { "Edit-Contact Category": , "Contact Tag": , "Edit-Contact Tag": , - "Expense Type": + "Expense Type":, + "Edit-Expense Type": }; return modalComponents[modalType] || null; diff --git a/src/hooks/masterHook/useMaster.js b/src/hooks/masterHook/useMaster.js index 8d6aeb5d..3cd9f3cc 100644 --- a/src/hooks/masterHook/useMaster.js +++ b/src/hooks/masterHook/useMaster.js @@ -557,6 +557,31 @@ export const useCreateExpenseType = (onSuccessCallback)=>{ } }) } +export const useUpdateExpenseType = (onSuccessCallback) => +{ + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ( {id, payload} ) => + { + const response = await MasterRespository.updateExpenseType(id,payload); + return response.data; + }, + onSuccess: (data, variables) => { + + queryClient.invalidateQueries({ + queryKey: ["masterData", "Expense Type"], + }); + showToast("Expense Type updated 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 539f639a..cc4e2463 100644 --- a/src/repositories/MastersRepository.jsx +++ b/src/repositories/MastersRepository.jsx @@ -60,6 +60,7 @@ export const MasterRespository = { getExpenseType:()=>api.get('/api/Master/expenses-types'), createExpenseType:(data)=>api.post('/api/Master/expenses-type',data), + updateExpenseType:(id,data)=>api.put(`/api/Master/expenses-type/edit/${id}`,data), getPaymentMode:()=>api.get('/api/Master/payment-modes'), -- 2.43.0 From 5988089b49da251898a05efc3776f02e5136e61f Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Fri, 25 Jul 2025 23:51:47 +0530 Subject: [PATCH 2/2] forgot close fun inside cancel btn --- src/components/master/ManageExpenseType.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/master/ManageExpenseType.jsx b/src/components/master/ManageExpenseType.jsx index fdd9ea53..8f280af5 100644 --- a/src/components/master/ManageExpenseType.jsx +++ b/src/components/master/ManageExpenseType.jsx @@ -101,6 +101,7 @@ const ManageExpenseType = ({ data = null, onClose }) => { data-bs-dismiss="modal" aria-label="Close" disabled={isPending || isPendingUpdate} + onClick={()=>onClose()} > Cancel -- 2.43.0