187 lines
6.4 KiB
JavaScript
187 lines
6.4 KiB
JavaScript
import React, { useState } from "react";
|
|
import { formatDate } from "../../utils/dateUtils";
|
|
import { useForm } from "react-hook-form";
|
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
import { z } from "zod";
|
|
import showToast from "../../services/toastService";
|
|
import { TasksRepository } from "../../repositories/TaskRepository";
|
|
|
|
export const ReportTask = ({ report, closeModal, refetch }) => {
|
|
const [loading, setloading] = useState(false);
|
|
|
|
const schema = z.object({
|
|
completedTask: z
|
|
.number()
|
|
.min(1, "Completed Work must be at least 1")
|
|
.max(
|
|
report?.plannedTask,
|
|
`Completed Work cannot exceed ${report?.plannedTask}`
|
|
)
|
|
.int("Completed Work must be an integer")
|
|
.positive("Completed Work must be a positive number")
|
|
.optional(),
|
|
comment: z.string().min(1, "Comment cannot be empty"),
|
|
});
|
|
const {
|
|
register,
|
|
handleSubmit,
|
|
formState: { errors },
|
|
} = useForm({
|
|
resolver: zodResolver(schema),
|
|
});
|
|
|
|
const onSubmit = async (data) => {
|
|
try {
|
|
setloading(true);
|
|
const reportData = {
|
|
...data,
|
|
id: report?.id,
|
|
reportedDate: new Date().toISOString(),
|
|
};
|
|
|
|
let response = await TasksRepository.reportTsak(reportData);
|
|
showToast("succesfully", "success");
|
|
refetch();
|
|
closeModal();
|
|
} catch (error) {
|
|
showToast("Somthing wrog", "error");
|
|
}
|
|
};
|
|
const handleClose = () => {
|
|
closeModal();
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className="modal-dialog modal-md modal-simple report-task-modal"
|
|
role="document"
|
|
>
|
|
<div className="modal-content">
|
|
<div className="modal-body px-1">
|
|
<button
|
|
type="button"
|
|
className="btn-close"
|
|
onClick={handleClose}
|
|
aria-label="Close"
|
|
></button>
|
|
|
|
<div className="container m-0">
|
|
<div className="d-flex justify-content-between">
|
|
<figure className="text-start p-0 m-0">
|
|
<blockquote className="blockquote">
|
|
<small>
|
|
{" "}
|
|
Assigned Date : {formatDate(report?.assignmentDate)}
|
|
</small>
|
|
</blockquote>
|
|
</figure>
|
|
<figure className="text-end p-0 m-0">
|
|
<blockquote className="blockquote">
|
|
<small>Assigned By</small>
|
|
</blockquote>
|
|
<figcaption className="blockquote-footer mb-0">
|
|
{/* <div className="d-flex avatar avatar-xs">
|
|
<span className="avatar-initial rounded-circle bg-label-primary">
|
|
{report?.assignedBy?.firstName.slice(0, 1)}
|
|
</span> */}
|
|
<cite title="Source Title m-0">{` ${report?.assignedBy.firstName} ${report?.assignedBy.lastName}`}</cite>
|
|
{/* </div> */}
|
|
</figcaption>
|
|
</figure>
|
|
</div>
|
|
|
|
<div className="d-flex p-0 m-0">
|
|
<div className="flex-shrink-0 mt-1 mx-sm-0 px-2 mx-auto">
|
|
<i className="bx bx-buildings"></i>
|
|
</div>
|
|
<p className="lead">
|
|
{report?.workItem?.workArea?.floor?.building?.name}
|
|
</p>
|
|
<p className="lead ms-12">
|
|
{report?.workItem?.workArea?.floor?.floorName}
|
|
</p>
|
|
</div>
|
|
<dl className="row text-start ms-3">
|
|
<dt className="col-sm-6">
|
|
Work Area : {report?.workItem?.workArea?.areaName}
|
|
</dt>
|
|
<dd className="col-sm-6">
|
|
<small> {report?.workItem?.activityMaster.activityName}</small>
|
|
</dd>
|
|
</dl>
|
|
<dl className="row text-start ms-3">
|
|
<dt className="col-sm-4">Team</dt>
|
|
|
|
<dd className="col-sm-4 d-flex align-items-center avatar-group justify-content-start">
|
|
{report?.teamMembers.map((member) => (
|
|
<>
|
|
<div
|
|
data-bs-toggle="tooltip"
|
|
data-bs-html="true"
|
|
data-popup="tooltip-custom"
|
|
data-bs-placement="top"
|
|
title={`${member.firstName} ${member.lastName}`}
|
|
className="avatar avatar-xs"
|
|
>
|
|
{/* <img src="..." alt="Avatar" className="rounded-circle pull-up" /> */}
|
|
<span className="avatar-initial rounded-circle bg-label-primary">
|
|
{member?.firstName.slice(0, 1)}
|
|
</span>
|
|
</div>
|
|
</>
|
|
))}
|
|
</dd>
|
|
<dt className="col-sm-4 text-start">
|
|
Planned : {report?.plannedTask}
|
|
</dt>
|
|
</dl>
|
|
<form onSubmit={handleSubmit(onSubmit)}>
|
|
<div className="row p-0">
|
|
<div className="col-4">
|
|
<input
|
|
{...register("completedTask", { valueAsNumber: true })}
|
|
id="smallInput"
|
|
className="form-control form-control-sm"
|
|
type="number"
|
|
placeholder="Completed Work"
|
|
/>
|
|
{errors.completedTask && (
|
|
<div className="text-danger">
|
|
{errors.completedTask.message}
|
|
</div>
|
|
)}
|
|
</div>
|
|
<div className="col-8">
|
|
<textarea
|
|
{...register("comment")}
|
|
className="form-control"
|
|
id="exampleFormControlTextarea1"
|
|
rows="1"
|
|
placeholder="Enter comment"
|
|
/>
|
|
{errors.comment && (
|
|
<div className="text-danger">{errors.comment.message}</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
<div className="col-12 text-center my-2">
|
|
<button type="submit" className="btn btn-sm btn-primary me-3">
|
|
{loading ? "Please wait" : "Submit Report"}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
className="btn btn-sm btn-label-secondary"
|
|
onClick={handleClose}
|
|
>
|
|
Cancel
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|