Compare commits

...

3 Commits

Author SHA1 Message Date
195af8317a set padding horizontically for Emp table 2025-08-06 11:33:19 +05:30
e249c1f64d sorted group by options 2025-08-06 11:32:47 +05:30
db65526f6f added GST number filed 2025-08-06 11:14:48 +05:30
6 changed files with 53 additions and 16 deletions

View File

@ -20,15 +20,18 @@ const ExpenseFilterPanel = ({ onApply, handleGroupBy }) => {
const selectedProjectId = useSelector((store) => store.localVariables.projectId); const selectedProjectId = useSelector((store) => store.localVariables.projectId);
const { data, isLoading,isError,error,isFetching , isFetched} = useExpenseFilter(); const { data, isLoading,isError,error,isFetching , isFetched} = useExpenseFilter();
const groupByList = useMemo(() => [ const groupByList = useMemo(() => {
return [
{ id: "transactionDate", name: "Transaction Date" }, { id: "transactionDate", name: "Transaction Date" },
{ id: "status", name: "Status" }, { id: "status", name: "Status" },
{ id: "submittedBy", name: "Submitted By" }, { id: "submittedBy", name: "Submitted By" },
{ id: "project", name: "Project" }, { id: "project", name: "Project" },
{ id: "paymentMode", name: "Payment Mode" }, { id: "paymentMode", name: "Payment Mode" },
{ id: "expensesType", name: "Expense Type" }, { id: "expensesType", name: "Expense Type" },
{id: "createdAt",name:"Submitted Date"} { id: "createdAt", name: "Submitted Date" }
], []); ].sort((a, b) => a.name.localeCompare(b.name));
}, []);
const [selectedGroup, setSelectedGroup] = useState(groupByList[0]); const [selectedGroup, setSelectedGroup] = useState(groupByList[0]);
const [resetKey, setResetKey] = useState(0); const [resetKey, setResetKey] = useState(0);

View File

@ -25,6 +25,7 @@ export const ExpenseSchema = (expenseTypes) => {
description: z.string().min(1, { message: "Description is required" }), description: z.string().min(1, { message: "Description is required" }),
location: z.string().min(1, { message: "Location is required" }), location: z.string().min(1, { message: "Location is required" }),
supplerName: z.string().min(1, { message: "Supplier name is required" }), supplerName: z.string().min(1, { message: "Supplier name is required" }),
gstNumber :z.string().optional(),
amount: z.coerce amount: z.coerce
.number({ .number({
invalid_type_error: "Amount is required and must be a number", invalid_type_error: "Amount is required and must be a number",
@ -91,6 +92,7 @@ export const defaultExpense = {
supplerName: "", supplerName: "",
amount: "", amount: "",
noOfPersons: "", noOfPersons: "",
gstNumber:"",
billAttachments: [], billAttachments: [],
}; };

View File

@ -20,7 +20,7 @@ const ExpenseStatusLogs = ({ data }) => {
{logsToShow.map((log, index) => ( {logsToShow.map((log, index) => (
<div <div
key={log.id} key={log.id}
className="col-12 d-flex align-items-start mb-2" className="col-12 d-flex align-items-start mb-1"
> >
<Avatar <Avatar
size="xs" size="xs"

View File

@ -156,6 +156,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
supplerName: data.supplerName || "", supplerName: data.supplerName || "",
amount: data.amount || "", amount: data.amount || "",
noOfPersons: data.noOfPersons || "", noOfPersons: data.noOfPersons || "",
gstNumber:data.gstNumber || "",
billAttachments: data.documents billAttachments: data.documents
? data.documents.map((doc) => ({ ? data.documents.map((doc) => ({
fileName: doc.fileName, fileName: doc.fileName,
@ -237,7 +238,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
</div> </div>
<div className="col-md-6"> <div className="col-md-6">
<label htmlFor="expensesTypeId" className="form-label "> <label htmlFor="expensesTypeId" className="form-label">
Expense Type Expense Type
</label> </label>
<select <select
@ -268,7 +269,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
<div className="row my-2"> <div className="row my-2">
<div className="col-md-6"> <div className="col-md-6">
<label htmlFor="paymentModeId" className="form-label "> <label htmlFor="paymentModeId" className="form-label">
Payment Mode Payment Mode
</label> </label>
<select <select
@ -409,10 +410,27 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
</small> </small>
)} )}
</div> </div>
<div className="col-md-6">
<label htmlFor="statusId" className="form-label ">
GST Number
</label>
<input
type="text"
id="gstNumber"
className="form-control form-control-sm"
min="1"
{...register("gstNumber")}
/>
{errors.gstNumber && (
<small className="danger-text">
{errors.gstNumber.message}
</small>
)}
</div>
{ExpenseType?.noOfPersonsRequired && ( {ExpenseType?.noOfPersonsRequired && (
<div className="col-md-6"> <div className="col-md-6 mt-2">
<label>No. of Persons</label> <label className="form-label ">No. of Persons</label>
<input <input
type="number" type="number"
id="noOfPersons" id="noOfPersons"
@ -431,7 +449,7 @@ const ManageExpense = ({ closeModal, expenseToEdit = null }) => {
<div className="row my-2"> <div className="row my-2">
<div className="col-md-12"> <div className="col-md-12">
<label htmlFor="description">Description</label> <label htmlFor="description" className="form-label ">Description</label>
<textarea <textarea
id="description" id="description"
className="form-control form-control-sm" className="form-control form-control-sm"

View File

@ -183,13 +183,14 @@ const ViewExpense = ({ ExpenseId }) => {
className="form-label me-2 mb-0 fw-semibold text-start" className="form-label me-2 mb-0 fw-semibold text-start"
style={{ minWidth: "130px" }} style={{ minWidth: "130px" }}
> >
Paid By : GST Number :
</label> </label>
<div className="text-muted"> <div className="text-muted">
{data?.paidBy?.firstName} {data?.paidBy?.lastName} {data?.gstNumber}
</div> </div>
</div> </div>
</div> </div>
{/* Row 4 */} {/* Row 4 */}
<div className="col-md-6 mb-3"> <div className="col-md-6 mb-3">
@ -272,6 +273,19 @@ const ViewExpense = ({ ExpenseId }) => {
</div> </div>
</div> </div>
)} )}
<div className="col-md-6 mb-3">
<div className="d-flex">
<label
className="form-label me-2 mb-0 fw-semibold text-start"
style={{ minWidth: "130px" }}
>
Paid By :
</label>
<div className="text-muted">
{data?.paidBy?.firstName} {data?.paidBy?.lastName}
</div>
</div>
</div>
</div> </div>
<div className="col-12 text-start"> <div className="col-12 text-start">
@ -349,7 +363,7 @@ const ViewExpense = ({ ExpenseId }) => {
)} )}
</div> </div>
)} )}
<hr className="divider my-1 py-3 divider-primary" /> <hr className="divider my-1 divider-primary" />
{Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && ( {Array.isArray(data?.nextStatus) && data.nextStatus.length > 0 && (
<> <>

View File

@ -295,12 +295,12 @@ const EmployeeList = () => {
{ViewTeamMember ? ( {ViewTeamMember ? (
// <div className="row"> // <div className="row">
<div className="card p-1"> <div className="card px-0 px-sm-4">
<div className="card-datatable table-responsive pt-2"> <div className="card-datatable table-responsive pt-2">
<div <div
id="DataTables_Table_0_wrapper" id="DataTables_Table_0_wrapper"
className="dataTables_wrapper dt-bootstrap5 no-footer" className="dataTables_wrapper no-footer px-2 "
style={{ width: "98%" }}
> >
<div className="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-3"> <div className="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-3">
{/* Switches: All Employees + Inactive */} {/* Switches: All Employees + Inactive */}
@ -581,7 +581,7 @@ const EmployeeList = () => {
<td className="text-start d-none d-sm-table-cell"> <td className="text-start d-none d-sm-table-cell">
{item.email ? ( {item.email ? (
<span className="text-truncate"> <span className="text-truncate">
<i className="bx bxs-envelope text-primary me-2"></i> <i className="bx bxs-envelope text-primary text-truncate me-2"></i>
{item.email} {item.email}
</span> </span>
) : ( ) : (