Added Document Managment feature #388
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user