Skip to content

Commit

Permalink
fix: allow deadline extension (#109)
Browse files Browse the repository at this point in the history
* fix: enforce deadlines

* fix: allow deadline extension
  • Loading branch information
andreiio authored Feb 29, 2024
1 parent 46913ee commit 472516c
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 22 deletions.
3 changes: 3 additions & 0 deletions client/src/lib/reports.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function deadlineHasPassed(deadline) {
return new Date(deadline).setHours(23, 59, 59) < new Date().getTime();
}
14 changes: 10 additions & 4 deletions client/src/pages/Home/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,21 @@ import empty from "@/assets/empty.svg";
import TableHeadReports from "@/components/index/TableHeadReports";
import TableRowReport from "@/components/TableRowReport";
import EmptyScreen from "@/components/EmptyScreen";
import { deadlineHasPassed } from "@/lib/reports";

const Home = () => {
const user = useAppSelector((state) => state.userState.user);
const hasReports = !!user?.reports?.length;
const reports = user?.reports?.map((report) => ({
...report,
finished: deadlineHasPassed(report.deadline) || report.finished
}));

const hasReports = !!reports?.length;
const hasReportsInProgress = useMemo(
() =>
hasReports &&
user.reports.filter((report) => !report.finished).length > 0,
[hasReports, user?.reports]
reports.filter((report) => !report.finished).length > 0,
[hasReports, reports]
);

return (
Expand Down Expand Up @@ -57,7 +63,7 @@ const Home = () => {
<table className="min-w-full divide-y divide-gray-300">
<TableHeadReports />
<tbody className="divide-y divide-gray-200 bg-white">
{user.reports?.map((report) => {
{reports?.map((report) => {
return (
<TableRowReport
key={report.id}
Expand Down
93 changes: 76 additions & 17 deletions client/src/pages/authenticated/Report/ReportInProgress.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import React, { useCallback, useMemo, useState } from "react";
import React, { useCallback, useEffect, useMemo, useState } from "react";
import Button from "@/components/Button";
import { DonutChart } from "react-circle-chart";
import CreateEvaluation from "@/components/CreateEvaluation";
import TableEvaluations from "@/components/TableEvaluations";
import Confirm from "@/components/Confirm";
import { useUpdateReportMutation } from "@/redux/api/userApi";
import { ErrorMessage } from "@hookform/error-message";
import { object, string, date, preprocess, array, TypeOf } from "zod";
import { zodResolver } from "@hookform/resolvers/zod/dist/zod";
import { useForm } from "react-hook-form";

const CallToAction = ({ reportId }: { reportId: number }) => {
const [updateReport] = useUpdateReportMutation();
Expand Down Expand Up @@ -38,6 +42,35 @@ const ReportInProgress = ({ report }) => {
[report?.evaluations]
);
const canFinish = evaluationsCompleted.length > 0;
const [editDeadline, setEditDeadline] = useState(false);

const [updateReport, { isSuccess }] = useUpdateReportMutation();
useEffect(() => {
if (isSuccess) {
setEditDeadline(false);
}
}, [isSuccess]);

const reportSchema = object({
deadline: preprocess((arg) => {
if (typeof arg == "string" || arg instanceof Date) return new Date(arg);
}, date().min(new Date(), { message: "Alegeti o data in viitor" })),
});

type ReportInput = TypeOf<typeof reportSchema>;

const { register, handleSubmit, formState } = useForm<ReportInput>({
resolver: zodResolver(reportSchema),
});

const today = new Date().toISOString().split('T')[0];

const onSubmitHandler = useCallback((form: ReportInput) => {
updateReport({
id: reportId,
deadline: form.deadline,
});
}, []);

return (
<div>
Expand Down Expand Up @@ -89,33 +122,59 @@ const ReportInProgress = ({ report }) => {
Perioada de evaluare
</div>
<div className="flex mt-4 space-x-8">
{report.createdAt && (
<div>
<div className="text-sm leading-5 font-medium">
Data de început:
</div>
<div className="mt-2.5">
{new Date(report.createdAt).toLocaleDateString("ro-RO", {
month: "short",
day: "numeric",
year: "numeric",
})}
</div>
<div>
<div className="text-sm leading-5 font-medium">
Data de început:
</div>
)}
{report.deadline && (
<div className="mt-2.5">
{new Date(report.createdAt).toLocaleDateString("ro-RO", {
month: "short",
day: "numeric",
year: "numeric",
})}
</div>
</div>

{!editDeadline ? (
<div>
<div className="text-sm leading-5 font-medium">
Data de final:
</div>

<div className="mt-2.5">
{new Date(report.deadline).toLocaleDateString("ro-RO", {
<div>{new Date(report.deadline).toLocaleDateString("ro-RO", {
month: "short",
day: "numeric",
year: "numeric",
})}
})}</div>
<button className="whitespace-nowrap text-sm font-medium text-teal-600 hover:underline mt-2" onClick={() => setEditDeadline(true)}>Editează</button>
</div>
</div>
) : (
<form onSubmit={handleSubmit(onSubmitHandler)}>
<div>
<div className="text-sm leading-5 font-medium mb-1">
Data de final:
</div>
<input
type="date"
className="border-gray-300 rounded-md"
min={today}
defaultValue={report.deadline}
{...register('deadline')}
/>
<div className="text-red-600 text-sm mt-1">
<ErrorMessage name="deadline" errors={formState.errors} />
</div>
</div>

<div className="flex space-x-4">
<Button color="white" type={"reset"} onClick={()=>setEditDeadline(false)}>
Renunță
</Button>
<Button type="submit">Salvează modificări</Button>
</div>
</form>
)}
</div>
</div>
Expand Down
3 changes: 2 additions & 1 deletion server/src/api/evaluation/controllers/evaluation.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const sendMailToUserWhenEvaluationIsFinished = (to, data) =>

const { createCoreController } = require("@strapi/strapi").factories;
const { UnauthorizedError, ForbiddenError } = require("@strapi/utils").errors;
const { deadlineHasPassed } = require("../../../helpers/reports");

module.exports = createCoreController(
"api::evaluation.evaluation",
Expand All @@ -33,7 +34,7 @@ module.exports = createCoreController(
);
const { report, email: userEmail, ...response } = data;

if (report.finished && !isFDSC) {
if ((report.finished || deadlineHasPassed(report.deadline)) && !isFDSC) {
throw new UnauthorizedError(
`Perioada de evaluare a luat sfarsit. Va rugam luati legatura cu organizatia ${report.user.ongName} pentru mai multe detalii.`
);
Expand Down
6 changes: 6 additions & 0 deletions server/src/api/report/controllers/report.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

const { createCoreController } = require("@strapi/strapi").factories;
const { deadlineHasPassed } = require("../../../helpers/reports");

module.exports = createCoreController("api::report.report", ({ strapi }) => ({
async create(ctx) {
Expand Down Expand Up @@ -32,6 +33,11 @@ module.exports = createCoreController("api::report.report", ({ strapi }) => ({
const data = await strapi.entityService.findOne("api::report.report", id, {
populate: ["evaluations.dimensions.quiz", "user"],
});

if (deadlineHasPassed(data.deadline)) {
data.finished = true;
}

return data;
},
}));
6 changes: 6 additions & 0 deletions server/src/helpers/reports.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const deadlineHasPassed = (deadline) =>
new Date(deadline).setHours(23, 59, 59) < new Date().getTime();

module.exports = {
deadlineHasPassed
}

0 comments on commit 472516c

Please sign in to comment.