From 6ffebfc596fa2b546f6a0701f5b6ee84ca97a7fb Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Sat, 26 Jul 2025 15:52:23 +0530 Subject: [PATCH] add create, edit, delete functionality with validation and UI integration --- src/components/master/ManageExpenseStatus.jsx | 165 ++++++++++++++++++ src/components/master/MasterModal.jsx | 5 +- src/hooks/masterHook/useMaster.js | 42 +++++ src/pages/master/MasterTable.jsx | 3 +- src/repositories/MastersRepository.jsx | 7 +- src/utils/constants.jsx | 6 + 6 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 src/components/master/ManageExpenseStatus.jsx diff --git a/src/components/master/ManageExpenseStatus.jsx b/src/components/master/ManageExpenseStatus.jsx new file mode 100644 index 00000000..eccc3bf8 --- /dev/null +++ b/src/components/master/ManageExpenseStatus.jsx @@ -0,0 +1,165 @@ +import React, { useEffect } from "react"; +import { + useForm, + FormProvider, +} from "react-hook-form"; +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import SelectMultiple from "../common/SelectMultiple"; +import { useFeatures } from "../../hooks/useMasterRole"; +import { EXPENSE_MANAGEMENT } from "../../utils/constants"; +import { useCreateExpenseStatus, useUpdateExpenseStatus } from "../../hooks/masterHook/useMaster"; +import { displayName } from "react-quill"; +import { AppColorconfig } from "../../utils/appUtils"; + +const ExpenseStatusSchema = z.object({ + name: z.string().min(1, { message: "Name is required" }), + displayName: z.string().min(1, { message: "Display Name is required" }), + description: z.string().min(1, { message: "Description is required" }), + permissionIds: z.array(z.string()).min(1, { + message: "At least one permission is required", + }), + color: z + .string() + .regex(/^#([0-9A-F]{3}){1,2}$/i, { message: "Invalid hex color" }), +}); + +const ManageExpenseStatus = ({data, onClose }) => { + const methods = useForm({ + resolver: zodResolver(ExpenseStatusSchema), + defaultValues: { + name: "", + displayName: "", + description: "", + permissionIds: [], + color: AppColorconfig.colors.primary, + }, + }); + + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = methods; + + const { masterFeatures, loading } = useFeatures(); + + const ExpenseFeature = masterFeatures?.find( + (appfeature) => appfeature.id === EXPENSE_MANAGEMENT + ); + const {mutate:CreateExpenseStatus,isPending:isPending} = useCreateExpenseStatus(()=>onClose?.()) + const {mutate:UpdateExpenseStatus,isPending:Updating} = useUpdateExpenseStatus(()=>onClose?.()); + + + + const onSubmit = (payload) => { + if(data){ + UpdateExpenseStatus({id:data.id,payload:{...payload,id:data.id}}) + }else{ + CreateExpenseStatus(payload) + } + }; + + + useEffect(()=>{ + if(data){ + reset({ + name:data.name ?? "", + displayName:data.displayName ?? "", + description:data.description ?? "", + permissionIds:data.permissionIds ?? [], + color:data.color ?? AppColorconfig.colors.primary + }) + } + },[data]) + return ( + + {loading ? ( +
Loading...
+ ) : ( +
+
+ + + {errors.name &&

{errors.name.message}

} +
+ +
+ + + {errors.displayName && ( +

{errors.displayName.message}

+ )} +
+ +
+ + {errors.permissionIds && ( +

{errors.permissionIds.message}

+ )} +
+ +
+ + + {errors.color && ( +

{errors.color.message}

+ )} +
+ +
+ +