Added Document Managment feature #388

Merged
pramod.mahajan merged 124 commits from Document_Manag into main 2025-09-10 14:34:35 +00:00
Showing only changes of commit 6caad7850d - Show all commits

View File

@ -12,16 +12,15 @@ import { z } from "zod";
import showToast from "../../services/toastService"; import showToast from "../../services/toastService";
export const ProjectPermissionSchema = z.object({ export const ProjectPermissionSchema = z.object({
employeeId: z.string(), employeeId: z.string().min(1, "Employee is required"),
selectedPermissions: z.array(z.string()).optional(), selectedPermissions: z.array(z.string()).optional(),
}); });
const ProjectPermission = () => { const ProjectPermission = () => {
const selectedProject = useSelectedproject(); const selectedProject = useSelectedproject();
const { data: ProjectModules } = useProjectLevelModules(); const { data: ProjectModules = [] } = useProjectLevelModules();
const { employees = [], isLoading: isEmployeeLoading } = const { employees = [], loading } = useEmployeesByProject(selectedProject);
useEmployeesByProject(selectedProject);
const { const {
register, register,
@ -39,14 +38,14 @@ const ProjectPermission = () => {
const selectedEmployee = watch("employeeId"); const selectedEmployee = watch("employeeId");
// Fetch permissions for the selected employee
const { data: selectedEmpPermissions } = useProjectLevelEmployeePermission( const { data: selectedEmpPermissions } = useProjectLevelEmployeePermission(
selectedEmployee || "", selectedEmployee || "",
selectedProject selectedProject
); );
// Update form state when employee permissions change
useEffect(() => { useEffect(() => {
if (!employees.length) return;
const enabledPerms = const enabledPerms =
selectedEmpPermissions?.permissions selectedEmpPermissions?.permissions
?.filter((perm) => perm.isEnabled) ?.filter((perm) => perm.isEnabled)
@ -58,18 +57,17 @@ const ProjectPermission = () => {
}); });
}, [selectedEmpPermissions, reset, selectedEmployee, employees]); }, [selectedEmpPermissions, reset, selectedEmployee, employees]);
const { mutate: UpdatePermission, isPending } = const { mutate: updatePermission, isPending } =
useUpdateProjectLevelEmployeePermission(); useUpdateProjectLevelEmployeePermission();
const onSubmit = (formData) => { const onSubmit = (formData) => {
// Guard 1: Ensure employee selected
if (!formData.employeeId) { if (!formData.employeeId) {
console.warn("No employee selected"); showToast("Please select an employee", "warn");
return; return;
} }
const existingPermissions = selectedEmpPermissions?.permissions || []; const existingPermissions = selectedEmpPermissions?.permissions || [];
// Build payload
const payloadPermissions = const payloadPermissions =
existingPermissions.length > 0 existingPermissions.length > 0
? existingPermissions.map((perm) => ({ ? existingPermissions.map((perm) => ({
@ -81,20 +79,19 @@ const ProjectPermission = () => {
isEnabled: true, isEnabled: true,
})); }));
// Guard 2: Prevent API call if no permissions at all
if (payloadPermissions.length === 0) { if (payloadPermissions.length === 0) {
showToast("No permissions selected", "warn"); showToast("No permissions selected", "warn");
return; return;
} }
// Guard 3 (optional): Prevent API call if nothing changed
const hasChanges = existingPermissions.some( const hasChanges = existingPermissions.some(
(perm) => (perm) =>
perm.isEnabled !== perm.isEnabled !==
(formData.selectedPermissions?.includes(perm.id) || false) (formData.selectedPermissions?.includes(perm.id) || false)
); );
if (!hasChanges && existingPermissions.length > 0) { if (!hasChanges && existingPermissions.length > 0) {
showToast("No changes detected", "warn"); showToast("No changes detected", "info");
return; return;
} }
@ -104,75 +101,79 @@ const ProjectPermission = () => {
permission: payloadPermissions, permission: payloadPermissions,
}; };
UpdatePermission(payload); updatePermission(payload);
}; };
return ( return (
<div className="row"> <div className="row">
{isEmployeeLoading ? ( <form className="row" onSubmit={handleSubmit(onSubmit)}>
<>Loading...</> {/* Employee Dropdown */}
) : ( <div className="d-flex align-items-end gap-2">
<form className="row" onSubmit={handleSubmit(onSubmit)}> <div className="text-start">
<div className="d-flex align-items-end gap-2"> <label className="form-label">Select Employee</label>
<div className="text-start"> <select
<label className="form-label">Select Employee</label> className="form-select form-select-sm"
<select {...register("employeeId")}
className="form-select form-select-sm" disabled={isPending}
{...register("employeeId")} >
disabled={isPending} {loading ? (
> <option value="">Loading...</option>
<option value="">-- Select --</option> ) : (
{employees.map((emp) => ( <>
<option key={emp.id} value={emp.id}> <option value="">-- Select --</option>
{emp.firstName} {emp.lastName} {employees.map((emp) => (
</option> <option key={emp.id} value={emp.id}>
))} {emp.firstName} {emp.lastName}
</select> </option>
{errors.employeeId && (
<div className="text-danger small">
{errors.employeeId.message}
</div>
)}
</div>
<button className="btn btn-sm btn-primary">
{isPending ? "Please Wait..." : "Update Permission"}
</button>
</div>
{ProjectModules?.map((feature) => (
<div key={feature.id} className="row my-1">
<div className="col-12 text-start fw-semibold mb-2">
{feature.name}
</div>
<div className="col-12">
<div className="row">
{feature.featurePermissions?.map((perm) => (
<div
className="col-12 col-sm-6 col-md-4 mb-3"
key={perm.id}
>
<label
className="form-check-label d-flex align-items-center"
htmlFor={perm.id}
>
<input
type="checkbox"
className="form-check-input me-2"
id={perm.id}
value={perm.id}
{...register("selectedPermissions")}
/>
{perm.name}
</label>
</div>
))} ))}
</div> </>
)}
</select>
{errors.employeeId && (
<div className="text-danger small">
{errors.employeeId.message}
</div> </div>
<hr className="my-2" /> )}
</div>
<button className="btn btn-sm btn-primary" disabled={isPending}>
{isPending ? "Please Wait..." : "Update Permission"}
</button>
</div>
{/* Permissions */}
{ProjectModules.map((feature) => (
<div key={feature.id} className="row my-2">
<div className="col-12 text-start fw-semibold mb-2">
{feature.name}
</div> </div>
))} <div className="col-12">
</form> <div className="row">
)} {feature.featurePermissions?.map((perm) => (
<div
className="col-12 col-sm-6 col-md-4 mb-2"
key={perm.id}
>
<label
className="form-check-label d-flex align-items-center"
htmlFor={perm.id}
>
<input
type="checkbox"
className="form-check-input me-2"
id={perm.id}
value={perm.id}
{...register("selectedPermissions")}
/>
{perm.name}
</label>
</div>
))}
</div>
</div>
<hr className="my-2" />
</div>
))}
</form>
</div> </div>
); );
}; };