diff --git a/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx b/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx index 277b085..0b0a14e 100644 --- a/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx +++ b/apps/frontend/src/routes/_assessmentLayout/assessment/index.lazy.tsx @@ -1,8 +1,6 @@ import { createLazyFileRoute } from "@tanstack/react-router"; import { - Card, Flex, - // Pagination, Stack, Text, Loader, @@ -10,6 +8,12 @@ import { CloseButton, Group, } from "@mantine/core"; +import { + Card, + CardContent, + CardDescription, + CardHeader, +} from "@/shadcn/components/ui/card"; import { Textarea } from "@/shadcn/components/ui/textarea"; import { Label } from "@/shadcn/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/shadcn/components/ui/radio-group"; @@ -77,6 +81,9 @@ export default function AssessmentPage() { const [unansweredQuestions, setUnansweredQuestions] = useState(0); const [validationModalOpen, setValidationModalOpen] = useState(false); const [exceededFileName, setExceededFileName] = useState(""); + const [currentPagePerSubAspect, setCurrentPagePerSubAspect] = useState<{ [subAspectId: string]: number }>({}); + const currentPage = currentPagePerSubAspect[selectedSubAspectId || ""] || 1; + const questionsPerPage = 10; // Fetch aspects and sub-aspects const aspectsQuery = useQuery({ @@ -511,11 +518,6 @@ export default function AssessmentPage() { } }; - // Handle pagination - const handlePageChange = (newPage: number) => { - setPage(newPage); - }; - // Render conditions if (isLoading) { return ; @@ -529,26 +531,43 @@ export default function AssessmentPage() { ); } - const totalQuestions = data?.data?.length || 0; - const totalPages = Math.ceil(totalQuestions / limit); - if (!assessmentId) { return ( - - - Error: Data Asesmen tidak ditemukan. Harap akses halaman melalui link yang valid. - + + + + Error: Data Asesmen tidak ditemukan. Harap akses halaman melalui link yang valid. + + ); } const startIndex = (page - 1) * limit; - const endIndex = startIndex + limit; - const paginatedQuestions = data?.data.slice(startIndex, endIndex) || []; - const filteredQuestions = paginatedQuestions.filter((question) => { - return question.subAspectId === selectedSubAspectId; // Misalnya, jika `question` memiliki `subAspectId` - }); + // Fungsi untuk mengubah halaman pada sub-aspek + const handlePageChange = (subAspectId: string, newPage: number) => { + setCurrentPagePerSubAspect((prev) => ({ + ...prev, + [subAspectId]: newPage, + })); + }; + + // Filter pertanyaan berdasarkan halaman saat ini + const filteredQuestions = data?.data?.filter((question) => { + // Filter berdasarkan sub-aspek yang dipilih + return question.subAspectId === selectedSubAspectId; + })?.slice( + (currentPage - 1) * questionsPerPage, + currentPage * questionsPerPage + ) || []; + + // Perbarui jumlah halaman untuk sub-aspek saat ini + const totalQuestionsInSubAspect = data?.data?.filter( + (question) => question.subAspectId === selectedSubAspectId + )?.length || 0; + + const totalPages = Math.ceil(totalQuestionsInSubAspect / questionsPerPage); return (
@@ -793,9 +812,9 @@ export default function AssessmentPage() { {/* Navigasi dan Pagination */}
- - Nomor Soal - + + Nomor Soal + {/* Navigasi (Number of Questions) */}
@@ -828,17 +847,28 @@ export default function AssessmentPage() {
- - Halaman {page} dari {totalPages} + { + if (selectedSubAspectId) { + handlePageChange(selectedSubAspectId, newPage); + } + }} + > + Halaman {currentPage} dari {totalPages}
{/* Skor Aspek dan Sub-Aspek */}
- - - {/* Skor Aspek */} -
+ + + Nilai Sementara + + + + {filteredAspects.length > 0 ? ( filteredAspects.map((aspect) => { const aspectScore = parseFloat(aspect.averageScore).toFixed(2); @@ -868,71 +898,70 @@ export default function AssessmentPage() { ) : ( Data aspek ini kosong )} -
+ {/* Garis pembatas */} -
-
-
+
{/* Skor Sub-Aspek */} -
- {filteredSubAspects.length > 0 ? ( - filteredSubAspects.map((subAspect) => { - const subAspectScore = parseFloat(subAspect.averageScore).toFixed(2); - const subAspectScoreValue = parseFloat(subAspectScore); + {filteredSubAspects.length > 0 ? ( + filteredSubAspects.map((subAspect) => { + const subAspectScore = parseFloat(subAspect.averageScore).toFixed(2); + const subAspectScoreValue = parseFloat(subAspectScore); - return ( -
- {subAspect.subAspectName} - = 4.01 - ? "text-green-700" - : subAspectScoreValue >= 3.01 - ? "text-green-400" - : subAspectScoreValue >= 2.01 - ? "text-yellow-400" - : subAspectScoreValue >= 1.01 - ? "text-orange-500" - : "text-red-500" - }`} - > - {subAspectScore} - -
- ); - }) - ) : ( - Data sub-aspek ini kosong - )} -
- + return ( +
+ {subAspect.subAspectName} + = 4.01 + ? "text-green-700" + : subAspectScoreValue >= 3.01 + ? "text-green-400" + : subAspectScoreValue >= 2.01 + ? "text-yellow-400" + : subAspectScoreValue >= 1.01 + ? "text-orange-500" + : "text-red-500" + }`} + > + {subAspectScore} + +
+ ); + }) + ) : ( + Data sub-aspek ini kosong + )} + {/* Tombol Selesai */} -
-
- {/* Modal untuk konfirmasi selesai asesmen */} - setModalOpen(false)} - onConfirm={handleConfirmFinish} - assessmentId={assessmentId} - /> - - {/* Modal untuk peringatan jika ada pertanyaan yang belum dijawab */} - setValidationModalOpen(false)} - unansweredQuestions={unansweredQuestions} + {/* Modal untuk konfirmasi selesai asesmen */} + setModalOpen(false)} + onConfirm={handleConfirmFinish} + assessmentId={assessmentId} /> - -
- + + {/* Modal untuk peringatan jika ada pertanyaan yang belum dijawab */} + setValidationModalOpen(false)} + unansweredQuestions={unansweredQuestions} + /> +
+
+