diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx index 3c4f7541..57088241 100644 --- a/src/components/Expenses/ExpenseList.jsx +++ b/src/components/Expenses/ExpenseList.jsx @@ -23,10 +23,10 @@ const ExpenseList = () => { }; - const { data, isLoading, isError,isInitialLoading,error } = useExpenseList(10, currentPage, filter); - if (isInitialLoading) return ; - if (isError) return
{error}
; - const items = data.data ?? []; + const { data, isLoading, isError,isInitialLoading,error,isFetching } = useExpenseList(10, currentPage, filter); + if (isInitialLoading ) return ; + if (isError) return
{error}
; + const items = data?.data ?? []; const totalPages = data?.totalPages ?? 1; const hasMore = currentPage < totalPages; @@ -128,7 +128,7 @@ const ExpenseList = () => { - {isLoading && ( + {/* {isLoading && ( Loading... @@ -142,7 +142,7 @@ const ExpenseList = () => { No expenses found. - )} + )} */} {!isInitialLoading && items.map((expense) => ( diff --git a/src/components/Expenses/ExpenseSchema.js b/src/components/Expenses/ExpenseSchema.js index 7c4993c5..705efe6b 100644 --- a/src/components/Expenses/ExpenseSchema.js +++ b/src/components/Expenses/ExpenseSchema.js @@ -39,10 +39,12 @@ export const ExpenseSchema = (expenseTypes) => { contentType: z.string().refine((val) => ALLOWED_TYPES.includes(val), { message: "Only PDF, PNG, JPG, or JPEG files are allowed", }), + documentId:z.string().optional(), fileSize: z.number().max(MAX_FILE_SIZE, { message: "File size must be less than or equal to 5MB", }), description: z.string().optional(), + isActive:z.boolean().default(true) }) ) .nonempty({ message: "At least one file attachment is required" }), diff --git a/src/components/Expenses/ManageExpense.jsx b/src/components/Expenses/ManageExpense.jsx index f2b18713..23c13250 100644 --- a/src/components/Expenses/ManageExpense.jsx +++ b/src/components/Expenses/ManageExpense.jsx @@ -19,7 +19,7 @@ import Avatar from "../common/Avatar"; import { useCreateExpnse, useExpense, - useUpdateExepse, + useUpdateExpense, } from "../../hooks/useExpense"; import ExpenseSkeleton from "./ExpenseSkeleton"; @@ -49,7 +49,6 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { defaultValues: defaultExpense, }); - const selectedproject = watch("projectId"); const selectedProject = useSelector( (store) => store.localVariables.projectId @@ -72,7 +71,6 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { error: EmpError, } = useEmployeesByProject(selectedproject); - const files = watch("billAttachments"); const onFileChange = async (e) => { const newFiles = Array.from(e.target.files); @@ -89,6 +87,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { contentType: file.type, fileSize: file.size, description: "", + isActive:true }; }) ); @@ -114,12 +113,23 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); - reader.onload = () => resolve(reader.result.split(",")[1]); // base64 only, no prefix + reader.onload = () => resolve(reader.result.split(",")[1]); reader.onerror = (error) => reject(error); }); const removeFile = (index) => { - const newFiles = files.filter((_, i) => i !== index); - setValue("billAttachments", newFiles, { shouldValidate: true }); + if (expenseToEdit) { + const newFiles = files.map((file, i) => { + if (file.documentId !== index) return file; + return { + ...file, + isActive: false, + }; + }); + setValue("billAttachments", newFiles, { shouldValidate: true }); + } else { + const newFiles = files.filter((_, i) => i !== index); + setValue("billAttachments", newFiles, { shouldValidate: true }); + } }; useEffect(() => { @@ -139,17 +149,19 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { billAttachments: data.documents ? data.documents.map((doc) => ({ fileName: doc.fileName, - base64Data: null, + base64Data: null, contentType: doc.contentType, + documentId: doc.documentId, fileSize: 0, description: "", - preSignedUrl: doc.preSignedUrl, + preSignedUrl: doc.preSignedUrl, + isActive: doc.isActive || true, })) : [], }); } }, [data, reset, employees]); - const { mutate: UpdateExpense, isPending } = useUpdateExepse(() => + const { mutate: ExpenseUpdate, isPending } = useUpdateExpense(() => handleClose() ); const { mutate: CreateExpense, isPending: createPending } = useCreateExpnse( @@ -160,7 +172,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { const onSubmit = (payload) => { if (expenseToEdit) { const editPayload = { ...payload, id: data.id }; - UpdateExpense({ id: data.id, payload: editPayload }); + ExpenseUpdate({ id: data.id, payload: editPayload }); } else { CreateExpense(payload); } @@ -176,12 +188,20 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { reset(); closeModal(); }; - if(EmpLoading || StatusLoadding || projectLoading || ExpenseLoading || isLoading) return - + if ( + EmpLoading || + StatusLoadding || + projectLoading || + ExpenseLoading || + isLoading + ) + return ; return (
-
{expenseToEdit ? "Update Expense ": "Create New Expense"}
+
+ {expenseToEdit ? "Update Expense " : "Create New Expense"} +
@@ -458,43 +478,52 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => { {errors.billAttachments.message} )} - {files.length > 0 && ( )} {Array.isArray(errors.billAttachments) && errors.billAttachments.map((fileError, index) => (
- {fileError?.fileSize?.message || - fileError?.contentType?.message || - fileError?.base64Data?.message} + { + (fileError?.fileSize?.message || + fileError?.contentType?.message || + fileError?.base64Data?.message, + fileError?.documentId.message) + }
))}
@@ -511,6 +540,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {