Compare commits

...

2 Commits

4 changed files with 174 additions and 250 deletions

View File

@ -23,11 +23,11 @@ const ExpenseFilterPanel = ({ onApply, handleGroupBy }) => {
const groupByList = useMemo(() => [
{ id: "transactionDate", name: "Transaction Date" },
{ id: "status", name: "Status" },
{ id: "paidBy", name: "Paid By" },
{ id: "submittedBy", name: "Submitted By" },
{ id: "project", name: "Project" },
{ id: "paymentMode", name: "Payment Mode" },
{ id: "expensesType", name: "Expense Type" },
{id: "createdAt",name:"Submitted"}
{id: "createdAt",name:"Submitted Date"}
], []);
const [selectedGroup, setSelectedGroup] = useState(groupByList[0]);

View File

@ -4,14 +4,18 @@ import Avatar from "../common/Avatar";
import { useExpenseContext } from "../../pages/Expense/ExpensePage";
import { formatDate, formatUTCToLocalTime } from "../../utils/dateUtils";
import Pagination from "../common/Pagination";
import { APPROVE_EXPENSE, EXPENSE_DRAFT, EXPENSE_REJECTEDBY } from "../../utils/constants";
import {
APPROVE_EXPENSE,
EXPENSE_DRAFT,
EXPENSE_REJECTEDBY,
} from "../../utils/constants";
import { getColorNameFromHex, useDebounce } from "../../utils/appUtils";
import { ExpenseTableSkeleton } from "./ExpenseSkeleton";
import ConfirmModal from "../common/ConfirmModal";
import { useHasUserPermission } from "../../hooks/useHasUserPermission";
import { useSelector } from "react-redux";
const ExpenseList = ({ filters, groupBy = "transactionDate",searchText }) => {
const ExpenseList = ({ filters, groupBy = "transactionDate", searchText }) => {
const [deletingId, setDeletingId] = useState(null);
const [IsDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const { setViewExpense, setManageExpenseModal } = useExpenseContext();
@ -62,9 +66,9 @@ const ExpenseList = ({ filters, groupBy = "transactionDate",searchText }) => {
case "status":
key = item.status?.displayName || "Unknown";
break;
case "paidBy":
key = `${item.paidBy?.firstName ?? ""} ${
item.paidBy?.lastName ?? ""
case "submittedBy":
key = `${item.createdBy?.firstName ?? ""} ${
item.createdBy?.lastName ?? ""
}`.trim();
break;
case "project":
@ -76,7 +80,7 @@ const ExpenseList = ({ filters, groupBy = "transactionDate",searchText }) => {
case "expensesType":
key = item.expensesType?.name || "Unknown Type";
break;
case "createdAt":
case "createdAt":
key = item.createdAt?.split("T")[0] || "Unknown Type";
break;
default:
@ -102,23 +106,23 @@ const ExpenseList = ({ filters, groupBy = "transactionDate",searchText }) => {
align: "text-start",
},
{
key: "paidBy",
label: "Paid By",
key: "Submitted By",
label: "Submitted By",
align: "text-start",
getValue: (e) =>
`${e.paidBy?.firstName ?? ""} ${e.paidBy?.lastName ?? ""}`.trim() ||
`${e.createdBy?.firstName ?? ""} ${e.createdBy?.lastName ?? ""}`.trim() ||
"N/A",
customRender: (e) => (
<div className="d-flex align-items-center">
<Avatar
size="xs"
classAvatar="m-0"
firstName={e.paidBy?.firstName}
lastName={e.paidBy?.lastName}
firstName={e.createdBy?.firstName}
lastName={e.createdBy?.lastName}
/>
<span>
{`${e.paidBy?.firstName ?? ""} ${
e.paidBy?.lastName ?? ""
{`${e.createdBy?.firstName ?? ""} ${
e.createdBy?.lastName ?? ""
}`.trim() || "N/A"}
</span>
</div>
@ -164,19 +168,20 @@ const ExpenseList = ({ filters, groupBy = "transactionDate",searchText }) => {
? groupByField(data?.data ?? [], groupBy)
: { All: data?.data ?? [] };
const IsGroupedByDate = ["transactionDate", "createdAt"].includes(groupBy);
const canEditExpense = (expense) => {
return (
(expense.status.id === EXPENSE_DRAFT ||
EXPENSE_REJECTEDBY.includes(expense.status.id)) &&
expense.createdBy?.id === SelfId
);
};
const canEditExpense = (expense) => {
return (
(expense.status.id === EXPENSE_DRAFT ||
EXPENSE_REJECTEDBY.includes(expense.status.id)) &&
expense.createdBy?.id === SelfId
);
};
const canDetetExpense = (expense)=>{
return (expense.status.id === EXPENSE_DRAFT && expense.createdBy.id === SelfId )
}
const canDetetExpense = (expense) => {
return (
expense.status.id === EXPENSE_DRAFT && expense.createdBy.id === SelfId
);
};
return (
<>
{IsDeleteModalOpen && (
@ -267,28 +272,27 @@ const canDetetExpense = (expense)=>{
})
}
></i>
{canEditExpense(expense) && (
<i
className="bx bx-edit text-secondary cursor-pointer"
onClick={() =>
setManageExpenseModal({
IsOpen: true,
expenseId: expense.id,
})
}
></i>
)}
{canDetetExpense(expense) && (
<i
className="bx bx-trash text-danger cursor-pointer"
onClick={() => {
setIsDeleteModalOpen(true);
setDeletingId(expense.id);
}}
></i>
)}
{canEditExpense(expense) && (
<i
className="bx bx-edit text-secondary cursor-pointer"
onClick={() =>
setManageExpenseModal({
IsOpen: true,
expenseId: expense.id,
})
}
></i>
)}
{canDetetExpense(expense) && (
<i
className="bx bx-trash text-danger cursor-pointer"
onClick={() => {
setIsDeleteModalOpen(true);
setDeletingId(expense.id);
}}
></i>
)}
</div>
</td>
</tr>

View File

@ -113,9 +113,6 @@ const ViewExpense = ({ ExpenseId }) => {
<hr />
</div>
<div className="text-start mb-2">
{/* <label className="form-label me-2 mb-0 fw-semibold">
Description :
</label> */}
<div className="text-muted">{data?.description}</div>
</div>
{/* Row 1 */}
@ -274,93 +271,9 @@ const ViewExpense = ({ ExpenseId }) => {
</div>
</div>
</div>
)}
{/* {data.reviewedBy && (
<div className="col-md-6 mb-3 text-start">
<div className="d-flex align-items-center">
<label
className="form-label me-2 mb-0 fw-semibold"
style={{ minWidth: "130px" }}
>
Reviewed By :
</label>
<div className="d-flex align-items-center">
<Avatar
size="xs"
classAvatar="m-0"
firstName={data.reviewedBy?.firstName}
lastName={data.reviewedBy?.lastName}
/>
<span className="text-muted">
{`${data.reviewedBy?.firstName ?? ""} ${
data.reviewedBy?.lastName ?? ""
}`.trim() || "N/A"}
</span>
</div>
</div>
</div>
)}
{data.approvedBy && (
<div className="col-md-6 mb-3 text-start">
<div className="d-flex align-items-center">
<label
className="form-label me-2 mb-0 fw-semibold"
style={{ minWidth: "130px" }}
>
Approved By :{" "}
</label>
<div className="d-flex align-items-center">
<Avatar
size="xs"
classAvatar="m-0"
firstName={data.approvedBy?.firstName}
lastName={data.approvedBy?.lastName}
/>
<span className="text-muted">
{`${data.approvedBy?.firstName ?? ""} ${
data.approvedBy?.lastName ?? ""
}`.trim() || "N/A"}
</span>
</div>
</div>
</div>
)}
{data.processedBy && (
<div className="col-md-6 mb-3 text-start">
<div className="d-flex align-items-center">
<label
className="form-label me-2 mb-0 fw-semibold"
style={{ minWidth: "130px" }}
>
Processed By :{" "}
</label>
<div className="d-flex align-items-center">
<Avatar
size="xs"
classAvatar="m-0"
firstName={data.processedBy?.firstName}
lastName={data.processedBy?.lastName}
/>
<span className="text-muted">
{`${data.processedBy?.firstName ?? ""} ${
data.processedBy?.lastName ?? ""
}`.trim() || "N/A"}
</span>
</div>
</div>
</div>
)} */}
)}
</div>
{/* <div className="text-start">
<label className="form-label me-2 mb-0 fw-semibold">
Description :
</label>
<div className="text-muted">{data?.description}</div>
</div> */}
<div className="col-12 text-start">
<label className="form-label me-2 mb-0 fw-semibold">Attachment :</label>

View File

@ -1,118 +1,125 @@
[
{
"header": "",
"items": [
{
"text": "Dashboard",
"icon": "bx bx-home",
"available": true,
"link": "/dashboard"
},
{
"text": "Projects",
"icon": "bx bx-building-house",
"available": true,
"link": "/projects"
},
{
"text": "Employees",
"icon": "bx bx-user",
"available": true,
"link": "/employees"
},
{
"text": "Activities",
"icon": "bx bx-list-ul",
"available": true,
"link": "",
"submenu": [
{
"text": "Attendance",
"available": true,
"link": "/activities/Attendance"
},
{
"text": "Daily Task Planning",
"available": true,
"link": "/activities/task"
},
{
"text": "Daily Progress Report",
"available": true,
"link": "/activities/records"
},
{
"text": "Project Report",
"available": true,
"link": "/activities/reports"
},
{
"text": "Daily Expenses",
"available": true,
"link": "/activities/reports"
}
]
},
{
"text": "Directory",
"icon": "bx bx-group",
"available": true,
"link": "/directory"
},
{
"text": "Image Gallary",
"icon": "bx bx-images",
"available": true,
"link": "/gallary"
},
{
"text": "Administration",
"icon": "bx bx-box",
"available": true,
"link": "",
"submenu": [
{
"text": "Users",
"available": true,
"link": "/employees/"
},
{
"text": "Masters",
"available": true,
"link": "/masters"
}
]
},
{
"text": "Inventory",
"icon": "bx bx-store",
"available": true,
"link": "/inventory"
}
{
"header": "",
"items": [
{
"text": "Dashboard",
"icon": "bx bx-home",
"available": true,
"link": "/dashboard"
},
{
"text": "Projects",
"icon": "bx bx-building-house",
"available": true,
"link": "/projects"
},
{
"text": "Employees",
"icon": "bx bx-user",
"available": true,
"link": "/employees"
},
{
"text": "Activities",
"icon": "bx bx-list-ul",
"available": true,
"link": "",
"submenu": [
{
"text": "Attendance",
"available": true,
"link": "/activities/Attendance"
},
{
"text": "Daily Task Planning",
"available": true,
"link": "/activities/task"
},
{
"text": "Daily Progress Report",
"available": true,
"link": "/activities/records"
},
{
"text": "Project Report",
"available": true,
"link": "/activities/reports"
},
{
"text": "Daily Expenses",
"available": true,
"link": "/activities/reports"
}
]
},
{
"header": "",
"items": [
{
"text": "Support",
"icon": "bx bx-copy",
"available": true,
"link": "/help/support"
},
{
"text": "Documentation",
"available": true,
"icon": "bx bx-book-reader",
"link": "/help/docs"
},
{
"text": "Help Desk",
"available": true,
"link": "/help/connect",
"icon": "bx bx-question-mark"
}
},
{
"text": "Directory",
"icon": "bx bx-group",
"available": true,
"link": "/directory"
},
{
"text": "Expense",
"icon": "bx bx-receipt",
"available": true,
"link": "/expenses"
},
{
"text": "Image Gallary",
"icon": "bx bx-images",
"available": true,
"link": "/gallary"
},
{
"text": "Administration",
"icon": "bx bx-box",
"available": true,
"link": "",
"submenu": [
{
"text": "Users",
"available": true,
"link": "/employees/"
},
{
"text": "Masters",
"available": true,
"link": "/masters"
}
]
}
]
},
{
"text": "Inventory",
"icon": "bx bx-store",
"available": true,
"link": "/inventory"
}
]
},
{
"header": "",
"items": [
{
"text": "Support",
"icon": "bx bx-copy",
"available": true,
"link": "/help/support"
},
{
"text": "Documentation",
"available": true,
"icon": "bx bx-book-reader",
"link": "/help/docs"
},
{
"text": "Help Desk",
"available": true,
"link": "/help/connect",
"icon": "bx bx-question-mark"
}
]
}
]