Pull Request branch dev-clone to main #1

Merged
gitea merged 429 commits from dev-clone into main 2024-12-23 09:31:34 +00:00
4 changed files with 148 additions and 22 deletions
Showing only changes of commit 1eb355bf95 - Show all commits

View File

@ -89,6 +89,9 @@ const permissionsData = [
{ {
code: "assessmentRequest.create", code: "assessmentRequest.create",
}, },
{
code: "assessmentRequest.update",
},
{ {
code: "assessments.readAspect", code: "assessments.readAspect",
}, },

View File

@ -145,6 +145,65 @@ const assessmentRequestRoute = new Hono<HonoEnv>()
return c.json({ message: "Successfully submitted the assessment request", data: newAssessment }, 201); return c.json({ message: "Successfully submitted the assessment request", data: newAssessment }, 201);
} }
)
// Update assessment status when the user clicks the start assessment button
.patch(
"/:assessmentId",
checkPermission("assessmentRequest.update"),
requestValidator(
"json",
z.object({
status: z.enum([
"menunggu konfirmasi",
"diterima",
"ditolak",
"dalam pengerjaan",
"belum diverifikasi",
"selesai",
]).optional(),
})
),
async (c) => {
const currentUser = c.get("currentUser");
const userId = currentUser?.id;
const { assessmentId } = c.req.param();
const { status } = c.req.valid("json");
if (!userId) {
throw forbidden({
message: "User not authenticated",
});
}
// Check if the assessment with the given assessmentId exists and belongs to the user
const existingAssessment = await db
.select()
.from(assessments)
.leftJoin(respondents, eq(assessments.respondentId, respondents.id))
.where(and(eq(assessments.id, assessmentId), eq(respondents.userId, userId)));
if (!existingAssessment.length) {
throw notFound({
message: "Assessment not found or unauthorized.",
});
}
// Update assessment status to "dalam pengerjaan"
const updatedAssessment = await db
.update(assessments)
.set({
status: status || "dalam pengerjaan",
})
.where(eq(assessments.id, assessmentId))
.returning();
return c.json({
message: "Assessment status updated successfully",
data: updatedAssessment,
});
}
); );
export default assessmentRequestRoute; export default assessmentRequestRoute;

View File

@ -28,3 +28,23 @@ export const createAssessmentRequest = async ({ respondentsId }: { respondentsId
return await response.json(); return await response.json();
}; };
// Query to update assessment status
export const updateAssessmentRequest = async ({
assessmentId,
status,
}: {
assessmentId: string;
status: "menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan" | "belum diverifikasi" | "selesai";
}) => {
const response = await client.assessmentRequest[":assessmentId"].$patch({
json: { status },
param: { assessmentId },
});
if (!response.ok) {
throw new Error("Gagal memperbarui status permohonan asesmen");
}
return await response.json();
};

View File

@ -1,5 +1,5 @@
import { useState } from "react"; import { useState } from "react";
import { assessmentRequestQueryOptions } from "@/modules/assessmentRequest/queries/assessmentRequestQueries"; import { assessmentRequestQueryOptions, updateAssessmentRequest } from "@/modules/assessmentRequest/queries/assessmentRequestQueries";
import PageTemplate from "@/components/PageTemplate"; import PageTemplate from "@/components/PageTemplate";
import { createLazyFileRoute } from "@tanstack/react-router"; import { createLazyFileRoute } from "@tanstack/react-router";
import FormModal from "@/modules/assessmentRequest/modals/CreateAssessmentRequestModal"; import FormModal from "@/modules/assessmentRequest/modals/CreateAssessmentRequestModal";
@ -38,14 +38,26 @@ export default function UsersPage() {
}; };
/** /**
* Function to open assessment page in new tab * Function to start assessment and redirect to the assessment page in new tab
* @param {string} assessmentId ID of the assessment to be opened * This function will update the status of the assessment to "dalam pengerjaan"
* and then open the assessment page in a new tab
* @param {string} assessmentId ID of the assessment to be started
*/ */
const handleStartAssessment = (assessmentId: string) => { const handleStartAssessment = async (assessmentId: string) => {
// Redirect to new URL in new tab try {
await updateAssessmentRequest({
assessmentId,
status: "dalam pengerjaan",
});
// Redirect to the assessment page
const assessmentUrl = `/assessment?id=${assessmentId}`; const assessmentUrl = `/assessment?id=${assessmentId}`;
window.open(assessmentUrl, "_blank"); window.open(assessmentUrl, "_blank");
} catch (error) {
console.error("Gagal memulai asesmen:", error);
} finally {
setModalOpen(false); setModalOpen(false);
}
}; };
/** /**
@ -97,16 +109,34 @@ export default function UsersPage() {
cell: (props) => { cell: (props) => {
const status = props.row.original.status; const status = props.row.original.status;
switch (status) { switch (status) {
case "dalam pengerjaan":
return <div className="flex items-center justify-center">
<Badge variant={"inprogress"}>Dalam Pengerjaan</Badge>
</div>;
case "menunggu konfirmasi": case "menunggu konfirmasi":
return <Badge variant={"waiting"}>Menunggu Konfirmasi</Badge>; return <div className="flex items-center justify-center">
<Badge variant={"waiting"}>Menunggu Konfirmasi</Badge>
</div>;
case "diterima": case "diterima":
return <Badge variant={"accepted"}>Diterima</Badge>; return <div className="flex items-center justify-center">
<Badge variant={"accepted"}>Diterima</Badge>
</div>;
case "ditolak": case "ditolak":
return <Badge variant={"rejected"}>Ditolak</Badge>; return <div className="flex items-center justify-center">
<Badge variant={"rejected"}>Ditolak</Badge>
</div>;
case "belum diverifikasi":
return <div className="flex items-center justify-center">
<Badge variant={"unverified"}>Belum Diverifikasi</Badge>
</div>;
case "selesai": case "selesai":
return <Badge variant={"completed"}>Selesai</Badge>; return <div className="flex items-center justify-center">
<Badge variant={"completed"}>Selesai</Badge>
</div>;
default: default:
return <Badge variant={"outline"}>Tidak diketahui</Badge>; return <div className="flex items-center justify-center">
<Badge variant={"outline"}>Tidak diketahui</Badge>
</div>;
} }
}, },
}), }),
@ -122,22 +152,36 @@ export default function UsersPage() {
{status === "selesai" ? ( {status === "selesai" ? (
<Button variant={"secondary"} disabled><TbClipboardText className="mr-2" />Mulai Asesmen</Button> <Button variant={"secondary"} disabled><TbClipboardText className="mr-2" />Mulai Asesmen</Button>
) : status === "diterima" ? ( ) : status === "diterima" ? (
<Button <Button onClick={() => handleOpenModal(assessmentId ?? '')}>
onClick={() => handleOpenModal(assessmentId ?? '')}
>
<TbClipboardText className="mr-2" /> <TbClipboardText className="mr-2" />
Mulai Asesmen Mulai Asesmen
</Button> </Button>
) : status === "dalam pengerjaan" ? (
<Button onClick={() => handleOpenModal(assessmentId ?? "")}>
<TbClipboardText className="mr-2" />
{status === "dalam pengerjaan" ? "Lanjutkan Asesmen" : "Mulai Asesmen"}
</Button>
) : ( ) : (
<Button variant={"secondary"} disabled><TbClipboardText className="mr-2" />Mulai Asesmen</Button> <Button variant={"secondary"} disabled><TbClipboardText className="mr-2" />
Mulai Asesmen
</Button>
)} )}
{/* Button View Result */} {/* Button View Result */}
{status === "selesai" ? ( {status === "selesai" ? (
<Button variant={"outline"} onClick={()=>handleViewResult(assessmentId ?? '')}> <Button variant={"outline"} onClick={()=>handleViewResult(assessmentId ?? '')}>
<TbListCheck className="mr-2" />Lihat Hasil</Button> <TbListCheck className="mr-2" />
Lihat Hasil
</Button>
) : status === "belum diverifikasi" ? (
<Button variant={"outline"} onClick={()=>handleViewResult(assessmentId ?? '')}>
<TbListCheck className="mr-2" />
Lihat Hasil
</Button>
) : ( ) : (
<Button variant={"outline"} disabled><TbListCheck className="mr-2" />Lihat Hasil</Button> <Button variant={"outline"} disabled><TbListCheck className="mr-2" />
Lihat Hasil
</Button>
)} )}
</div> </div>
); );