diff --git a/src/components/Expenses/ExpenseList.jsx b/src/components/Expenses/ExpenseList.jsx
index 89ae489f..32463732 100644
--- a/src/components/Expenses/ExpenseList.jsx
+++ b/src/components/Expenses/ExpenseList.jsx
@@ -3,6 +3,8 @@ import { useExpenseList } from "../../hooks/useExpense";
import Avatar from "../common/Avatar";
import { useExpenseContext } from "../../pages/Expense/ExpensePage";
import { formatDate, formatUTCToLocalTime } from "../../utils/dateUtils";
+import Pagination from "../common/Pagination";
+import { ITEMS_PER_PAGE } from "../../utils/constants";
const ExpenseList = () => {
const { setViewExpense } = useExpenseContext();
@@ -18,10 +20,9 @@ const ExpenseList = () => {
endDate: null,
};
- const { data, isLoading, isError } = useExpenseList(5, currentPage, filter);
-
+ const { data, isLoading, isError } = useExpenseList(ITEMS_PER_PAGE, currentPage, filter);
if (isLoading) return
Loading...
;
- const items = data ?? [];
+ const items = data.data ?? [];
const totalPages = data?.totalPages ?? 1;
const hasMore = currentPage < totalPages;
@@ -167,7 +168,7 @@ const ExpenseList = () => {
- {expense.amount} |
+ {expense.amount} |
{
- setViewExpense({ expenseId: expense.id, view: true })
+ setViewExpense({ expenseId: expense, view: true })
}
>
@@ -197,52 +198,15 @@ const ExpenseList = () => {
- {!isLoading && items.length > 0 && totalPages > 1 && (
-
- )}
+ {!isLoading && items.length > 0 && (
+
+ )}
+
);
};
diff --git a/src/components/Expenses/ViewExpense.jsx b/src/components/Expenses/ViewExpense.jsx
index a2849ede..8c15f2a5 100644
--- a/src/components/Expenses/ViewExpense.jsx
+++ b/src/components/Expenses/ViewExpense.jsx
@@ -1,14 +1,176 @@
-import React from 'react'
-import { useExpense } from '../../hooks/useExpense'
+import React from "react";
+import { useActionOnExpense } from "../../hooks/useExpense";
+import { formatUTCToLocalTime } from "../../utils/dateUtils";
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { ActionSchema } from "./ExpenseSchema";
+
+const ViewExpense = ({ ExpenseId }) => {
+ const {
+ register,
+ handleSubmit,
+ setValue,
+ formState: { errors },
+ } = useForm({
+ resolver: zodResolver(ActionSchema),
+ defaultValues: {
+ comment: "",
+ selectedStatus: "",
+ },
+ });
+
+ const { mutate: MakeAction } = useActionOnExpense();
+
+ const onSubmit = (formData) => {
+ const Payload = {
+ expenseId: ExpenseId?.id,
+ statusId: formData.selectedStatus,
+ comment: formData.comment,
+ };
+
+ MakeAction(Payload);
+ };
-const ViewExpense = ({ExpenseId}) => {
- console.log(ExpenseId)
- const {} = useExpense(ExpenseId)
return (
-
-
-
- )
-}
+
+ );
+};
+
+export default ViewExpense;
diff --git a/src/components/common/Pagination.jsx b/src/components/common/Pagination.jsx
new file mode 100644
index 00000000..5274eddc
--- /dev/null
+++ b/src/components/common/Pagination.jsx
@@ -0,0 +1,84 @@
+import React from "react";
+
+const getPaginationRange = (currentPage, totalPages, delta = 1) => {
+ const range = [];
+ const rangeWithDots = [];
+ let l;
+
+ for (let i = 1; i <= totalPages; i++) {
+ if (
+ i === 1 ||
+ i === totalPages ||
+ (i >= currentPage - delta && i <= currentPage + delta)
+ ) {
+ range.push(i);
+ }
+ }
+
+ for (let i of range) {
+ if (l) {
+ if (i - l === 2) {
+ rangeWithDots.push(l + 1);
+ } else if (i - l !== 1) {
+ rangeWithDots.push("...");
+ }
+ }
+ rangeWithDots.push(i);
+ l = i;
+ }
+
+ return rangeWithDots;
+};
+
+const Pagination = ({ currentPage, totalPages, onPageChange }) => {
+ if (totalPages <= 1) return null;
+
+ const paginationRange = getPaginationRange(currentPage, totalPages);
+
+ return (
+
+ );
+};
+
+export default Pagination;
diff --git a/src/repositories/ExpsenseRepository.jsx b/src/repositories/ExpsenseRepository.jsx
index 0371e867..376cb534 100644
--- a/src/repositories/ExpsenseRepository.jsx
+++ b/src/repositories/ExpsenseRepository.jsx
@@ -10,10 +10,12 @@ const ExpenseRepository = {
return api.get(`/api/expense/list?pageSize=${pageSize}&pageNumber=${pageNumber}&filter=${payloadJsonString}`);
},
- GetExpenseDetails:(id)=>api.get(`/api/Expanse/details/${id}`),
+ GetExpenseDetails:(id)=>api.get(`/api/Expense/details/${id}`),
CreateExpense:(data)=>api.post("/api/Expense/create",data),
- UpdateExpense:(id)=>api.put(`/api/Expanse/edit/${id}`),
- DeleteExpense:(id)=>api.delete(`/api/Expanse/edit/${id}`)
+ UpdateExpense:(id)=>api.put(`/api/Expense/edit/${id}`),
+ DeleteExpense:(id)=>api.delete(`/api/Expense/edit/${id}`),
+
+ ActionOnExpense:(data)=>api.post('/api/expense/action',data)
}
diff --git a/src/utils/appUtils.js b/src/utils/appUtils.js
index eac45ec7..3f420b31 100644
--- a/src/utils/appUtils.js
+++ b/src/utils/appUtils.js
@@ -2,4 +2,40 @@ export const formatFileSize=(bytes)=> {
if (bytes < 1024) return bytes + " B";
else if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + " KB";
else return (bytes / (1024 * 1024)).toFixed(2) + " MB";
-}
\ No newline at end of file
+}
+export const getExpenseIcon = (type) => {
+ switch (type.toLowerCase()) {
+ case 'vendor/supplier payments':
+ return 'bx-briefcase'; // Business-related
+ case 'transport':
+ return 'bx-car'; // Vehicle or logistics
+ case 'compliance & safety':
+ return 'bx-shield-quarter'; // Security/safety
+ case 'mobilization':
+ return 'bx-building-house'; // Setup / site infra
+ case 'procurement':
+ return 'bx-package'; // Box/package/supplies
+ case 'maintenance & utilities':
+ return 'bx-wrench'; // Repair/maintenance
+ case 'travelling':
+ return 'bx-plane'; // Personnel delivery
+ case 'employee welfare':
+ return 'bx-user-heart'; // Welfare / people
+ default:
+ return 'bx-folder'; // Fallback icon
+ }
+};
+export const getPaymentModeIcon = (mode) => {
+ switch (mode.toLowerCase()) {
+ case 'cash':
+ return 'bx-money'; // Cash/coins
+ case 'upi':
+ return 'bx-mobile-alt'; // Mobile payment
+ case 'cheque':
+ return 'bx-receipt'; // Paper receipt
+ case 'netbanking':
+ return 'bx-globe'; // Online/internet
+ default:
+ return 'bx-credit-card'; // Generic fallback
+ }
+};
diff --git a/src/utils/dateUtils.jsx b/src/utils/dateUtils.jsx
index 45aca2f9..b3b61b6d 100644
--- a/src/utils/dateUtils.jsx
+++ b/src/utils/dateUtils.jsx
@@ -67,9 +67,13 @@ export const formatNumber = (num) => {
if (num == null || isNaN(num)) return "NA";
return Number.isInteger(num) ? num : num.toFixed(2);
};
-export const formatUTCToLocalTime = (datetime) =>{
- return moment.utc(datetime).local().format("DD MMMM YYYY hh:mm A");
-}
+
+
+export const formatUTCToLocalTime = (datetime, timeRequired = false) => {
+ return timeRequired
+ ? moment.utc(datetime).local().format("DD MMMM YYYY hh:mm A")
+ : moment.utc(datetime).local().format("DD MMMM YYYY");
+};
export const getCompletionPercentage = (completedWork, plannedWork)=> {
if (!plannedWork || plannedWork === 0) return 0;
|