From 09a6df9e66e5a1df65cd0f7c3e7fc8e8124bc520 Mon Sep 17 00:00:00 2001 From: Sukma Gladys Date: Thu, 7 Nov 2024 15:11:19 +0700 Subject: [PATCH] fix: get answer revision data --- .../src/routes/assessmentResult/route.ts | 42 ++-------- .../assessmentResultsManagaementQueries.ts | 12 +-- .../_verifyingLayout/verifying/index.lazy.tsx | 80 +++++++------------ 3 files changed, 33 insertions(+), 101 deletions(-) diff --git a/apps/backend/src/routes/assessmentResult/route.ts b/apps/backend/src/routes/assessmentResult/route.ts index 575e1e8..dcdcb27 100644 --- a/apps/backend/src/routes/assessmentResult/route.ts +++ b/apps/backend/src/routes/assessmentResult/route.ts @@ -397,22 +397,8 @@ const assessmentRoute = new Hono() .get( "/getAnswers/:id", checkPermission("assessments.readAnswers"), - requestValidator( - "query", - z.object({ - // assessmentId: z.string().min(1), - withMetadata: z - .string() - .optional() - .transform((v) => v?.toLowerCase() === "true"), - page: z.coerce.number().int().min(0).default(0), - limit: z.coerce.number().int().min(1).max(1000).default(1000), - q: z.string().default(""), - }) - ), async (c) => { const assessmentId = c.req.param("id").toString(); - const { page, limit, q, withMetadata } = c.req.valid("query"); // Query to count total answers for the specific assessmentId const totalCountQuery = sql`(SELECT count(*) @@ -428,36 +414,18 @@ const assessmentRoute = new Hono() answerId: answerRevisions.answerId, newOptionId: answerRevisions.newOptionId, newValidationInformation: answerRevisions.newValidationInformation, + questionId: options.questionId, fullCount: totalCountQuery, }) .from(answerRevisions) - .innerJoin(answers, eq(answers.id, answerRevisions.answerId)) - .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) - .where( - and( - eq(assessments.id, assessmentId), - q - ? or( - ilike(answers.filename, q), - ilike(answerRevisions.newValidationInformation, q), - eq(answerRevisions.answerId, q) - ) - : undefined - ) + .leftJoin(answers, eq(answers.id, answerRevisions.answerId)) + .leftJoin(options, eq(answerRevisions.newOptionId, options.id)) + .leftJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId), ) - .offset(page * limit) - .limit(limit); return c.json({ data: result.map((d) => ({ ...d, fullCount: undefined })), - _metadata: { - currentPage: page, - totalPages: withMetadata - ? Math.ceil((Number(result[0]?.fullCount) ?? 0) / limit) - : null, - totalItems: withMetadata ? Number(result[0]?.fullCount) ?? 0 : null, - perPage: limit, - }, }); } ) diff --git a/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts b/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts index 06f0062..b4e5e26 100644 --- a/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts +++ b/apps/frontend/src/modules/assessmentResultsManagement/queries/assessmentResultsManagaementQueries.ts @@ -88,23 +88,13 @@ export const postAnswerRevisionMutation = () => { // Query untuk mendapatkan jawaban berdasarkan assessment ID export const getAnswersRevisionQueryOptions = ( assessmentId: string, - page: number, - limit: number, - q: string = "", - withMetadata: string = "true" ) => { return queryOptions({ - queryKey: ["answerRevision", { assessmentId, page, limit, q }], + queryKey: ["answerRevision", { assessmentId }], queryFn: () => fetchRPC( client.assessmentResult.getAnswers[":id"].$get({ param: { id: assessmentId }, - query: { - limit: String(limit), - page: String(page), - q, - withMetadata, - }, }) ), }); diff --git a/apps/frontend/src/routes/_verifyingLayout/verifying/index.lazy.tsx b/apps/frontend/src/routes/_verifyingLayout/verifying/index.lazy.tsx index 572d0ee..2419f29 100644 --- a/apps/frontend/src/routes/_verifyingLayout/verifying/index.lazy.tsx +++ b/apps/frontend/src/routes/_verifyingLayout/verifying/index.lazy.tsx @@ -184,9 +184,15 @@ export default function AssessmentPage() { // Fetching answers for the assessment const { data: answersData } = useQuery( - getAnswersRevisionQueryOptions(assessmentId || "", page, limit) + getAnswersRevisionQueryOptions(assessmentId || "") ); -console.log("answersData:", answersData); + +const formattedResult = answersData?.data.reduce((acc, item) => { + if (item.questionId != null && item.newOptionId != null) { + acc[item.questionId] = item.newOptionId; + } + return acc; +}, {} as Record); // Effect untuk mengatur answers dari data yang diambil useEffect(() => { @@ -195,18 +201,8 @@ console.log("answersData:", answersData); return; } - // Ambil jawaban dari localStorage berdasarkan ID assessment - const savedAnswers = JSON.parse(localStorage.getItem(`assessmentAnswers_${assessmentId}`) || "{}"); - - // Gabungkan jawaban dari localStorage dan answersData - if (answersData) { - // Pastikan answersData adalah objek yang valid sebelum menggabungkan - setAnswers({ - ...savedAnswers, // Jawaban dari localStorage - ...answersData // Jawaban dari query - }); - } else { - setAnswers(savedAnswers); // Gunakan data dari localStorage jika answersData kosong + if (formattedResult) { + setAnswers(formattedResult); } }, [answersData, assessmentId]); @@ -343,8 +339,6 @@ console.log("answersData:", answersData); // Update jawaban untuk pertanyaan tertentu const updatedAnswers = { ...answers, [questionId]: optionId }; - // Simpan jawaban ke localStorage dengan ID assessment - localStorage.setItem(`assessmentAnswers_${assessmentId}`, JSON.stringify(updatedAnswers)); // Update state setAnswers(updatedAnswers); @@ -357,6 +351,22 @@ console.log("answersData:", answersData); }); }; + const validationResult = answersData?.data.reduce((acc, item) => { + if (item.questionId != null && item.newValidationInformation != null) { + acc[item.questionId] = item.newValidationInformation; + } + return acc; + }, {} as Record); + + // Mengambil data dari database saat komponen dimuat + useEffect(() => { + if (validationResult) { + setValidationInformation(validationResult); + } + }, [answersData, assessmentId]); + + console.log(validationInformation); + // Mutation untuk mengirim data ke backend const { mutate: submitValidation } = useMutation({ mutationFn: (form: { @@ -373,36 +383,6 @@ console.log("answersData:", answersData); }, }); - // Mengambil data dari localStorage saat komponen dimuat - useEffect(() => { - const storedValidationInfo = localStorage.getItem(`validationInfo_${assessmentId}`); - - if (storedValidationInfo) { - try { - const parsedValidationInfo = JSON.parse(storedValidationInfo); - setValidationInformation(parsedValidationInfo); - - // Iterasi melalui parsedValidationInfo untuk mengirimkan setiap validasi ke server - Object.keys(parsedValidationInfo).forEach((questionId) => { - const validationValue = parsedValidationInfo[questionId]; - - // Pastikan assessmentId tidak null sebelum memanggil submitValidation - if (assessmentId) { - submitValidation({ - assessmentId, - questionId, - newValidationInformation: validationValue, - }); - } else { - console.error("Assessment ID tidak ditemukan"); - } - }); - } catch (error) { - console.error("Error parsing validation information:", error); - } - } - }, [assessmentId, submitValidation]); - // Handle perubahan di Textarea const handleTextareaChange = (questionId: string, value: string) => { // Memperbarui state validationInformation @@ -411,13 +391,6 @@ console.log("answersData:", answersData); [questionId]: value, })); - // Memperbarui localStorage dengan informasi validasi baru dalam format JSON - const updatedValidationInformation = { - ...validationInformation, - [questionId]: value, - }; - localStorage.setItem(`validationInfo_${assessmentId}`, JSON.stringify(updatedValidationInformation)); - // Pastikan assessmentId tidak null sebelum mengirimkan data ke server if (assessmentId) { // Kirim data validasi ke server @@ -731,6 +704,7 @@ console.log("answersData:", answersData); {/* Opsi Radio Button */} {question.options?.length > 0 ? (
+ handleAnswerChange(questionId, value)}