From 941b19581350742f935617eeff2bfc49e193888b Mon Sep 17 00:00:00 2001 From: Missez Date: Tue, 10 Feb 2026 15:24:19 +0700 Subject: [PATCH] feat: Introduce admin pages for pending course review and course details, and instructor pages for course management and lesson quizzes. --- .../components/course/LessonPreviewDialog.vue | 228 ++++++++++++++++++ .../components/course/StructureTab.vue | 40 ++- .../pages/admin/courses/[id].vue | 2 +- .../pages/admin/courses/pending.vue | 114 ++++++++- .../[chapterId]/lessons/[lessonId]/quiz.vue | 29 ++- .../pages/instructor/courses/[id]/index.vue | 2 +- 6 files changed, 388 insertions(+), 27 deletions(-) create mode 100644 frontend_management/components/course/LessonPreviewDialog.vue diff --git a/frontend_management/components/course/LessonPreviewDialog.vue b/frontend_management/components/course/LessonPreviewDialog.vue new file mode 100644 index 00000000..2d414994 --- /dev/null +++ b/frontend_management/components/course/LessonPreviewDialog.vue @@ -0,0 +1,228 @@ + + + diff --git a/frontend_management/components/course/StructureTab.vue b/frontend_management/components/course/StructureTab.vue index e2e6aa33..79cc1555 100644 --- a/frontend_management/components/course/StructureTab.vue +++ b/frontend_management/components/course/StructureTab.vue @@ -3,14 +3,15 @@

โครงสร้างบทเรียน

-
+
ยังไม่มีบทเรียน
@@ -41,6 +42,10 @@ v-for="lesson in getSortedLessons(chapter)" :key="lesson.id" class="py-3" + :class="{ 'cursor-pointer hover:bg-gray-50': course.status === 'APPROVED' }" + :clickable="course.status === 'APPROVED'" + :v-ripple="course.status === 'APPROVED'" + @click="handleLessonClick(lesson)" > + + + +
+ + + diff --git a/frontend_management/pages/admin/courses/[id].vue b/frontend_management/pages/admin/courses/[id].vue index e8eaf667..a78bd809 100644 --- a/frontend_management/pages/admin/courses/[id].vue +++ b/frontend_management/pages/admin/courses/[id].vue @@ -323,7 +323,7 @@ const getLessonIcon = (type: string) => { const getLessonTypeColor = (type: string) => { const colors: Record = { VIDEO: 'blue', - QUIZ: 'purple', + QUIZ: 'orange', DOCUMENT: 'teal' }; return colors[type] || 'grey'; diff --git a/frontend_management/pages/admin/courses/pending.vue b/frontend_management/pages/admin/courses/pending.vue index 9aea3966..c9503538 100644 --- a/frontend_management/pages/admin/courses/pending.vue +++ b/frontend_management/pages/admin/courses/pending.vue @@ -3,14 +3,16 @@

คอร์สรออนุมัติ

- +
+ +
@@ -47,6 +49,17 @@ +
+ +
+
@@ -57,7 +70,8 @@

ไม่มีคอร์สที่รอการอนุมัติ

-
+ +
+ + +
+ + + + + + + + + + + + + + + + +
@@ -144,6 +230,16 @@ const router = useRouter(); const courses = ref([]); const loading = ref(true); const searchQuery = ref(''); +const viewMode = ref('table'); + +const columns = [ + { name: 'thumbnail', label: 'รูปปก', field: 'thumbnail', align: 'left' }, + { name: 'title', label: 'ชื่อคอร์ส', field: (row: PendingCourse) => row.title.th, align: 'left', sortable: true }, + { name: 'instructor', label: 'ผู้สอน', field: (row: PendingCourse) => getPrimaryInstructor(row), align: 'left', sortable: true }, + { name: 'stats', label: 'จำนวนบท', field: 'stats', align: 'center' }, + { name: 'submitted_at', label: 'วันที่ส่ง', field: (row: PendingCourse) => row.latest_submission?.created_at, align: 'left', sortable: true }, + { name: 'actions', label: '', field: 'actions', align: 'center' } +]; // Computed const totalChapters = computed(() => diff --git a/frontend_management/pages/instructor/courses/[id]/chapters/[chapterId]/lessons/[lessonId]/quiz.vue b/frontend_management/pages/instructor/courses/[id]/chapters/[chapterId]/lessons/[lessonId]/quiz.vue index 52401d55..666b5df3 100644 --- a/frontend_management/pages/instructor/courses/[id]/chapters/[chapterId]/lessons/[lessonId]/quiz.vue +++ b/frontend_management/pages/instructor/courses/[id]/chapters/[chapterId]/lessons/[lessonId]/quiz.vue @@ -230,9 +230,10 @@ :color="choice.is_correct ? 'positive' : 'grey'" size="18px" /> - - {{ choice.text.th || `ตัวเลือก ${Number(cIndex) + 1}` }} - +
+
{{ choice.text.th || `ตัวเลือก ${Number(cIndex) + 1}` }}
+
{{ choice.text.en }}
+
@@ -296,13 +297,21 @@ :val="cIndex" @update:model-value="setCorrectChoice(cIndex)" /> - +
+ + +
- +