From 9dc8636d31c891ac2547a653ce62e0a3f06f1680 Mon Sep 17 00:00:00 2001 From: Missez Date: Tue, 24 Feb 2026 14:43:06 +0700 Subject: [PATCH] feat: Implement admin user and pending course management, instructor course listing, and a dedicated admin service. --- .../pages/admin/courses/pending.vue | 57 ++++--- .../pages/admin/users/index.vue | 42 ++++-- .../pages/instructor/courses/index.vue | 141 ++++++++++++++++-- frontend_management/services/admin.service.ts | 18 +++ 4 files changed, 212 insertions(+), 46 deletions(-) diff --git a/frontend_management/pages/admin/courses/pending.vue b/frontend_management/pages/admin/courses/pending.vue index 800855c8..e5871eb9 100644 --- a/frontend_management/pages/admin/courses/pending.vue +++ b/frontend_management/pages/admin/courses/pending.vue @@ -31,33 +31,48 @@ - +
- - - - -
+
+
+ + + + +
-
- + dense + rounded + unelevated + class="border" + > + + + +
diff --git a/frontend_management/pages/admin/users/index.vue b/frontend_management/pages/admin/users/index.vue index b5570d7e..2b220138 100644 --- a/frontend_management/pages/admin/users/index.vue +++ b/frontend_management/pages/admin/users/index.vue @@ -216,7 +216,7 @@ diff --git a/frontend_management/pages/instructor/courses/index.vue b/frontend_management/pages/instructor/courses/index.vue index cdda8b84..4764b770 100644 --- a/frontend_management/pages/instructor/courses/index.vue +++ b/frontend_management/pages/instructor/courses/index.vue @@ -39,8 +39,8 @@
-
-
+
+
+ + + + +
- +
+

ยังไม่มีหลักสูตร

@@ -82,7 +106,8 @@ />
-
+ +
ดูรายละเอียด - @@ -167,6 +183,94 @@
+ +
+ + + + + + + + + + + + + + + + +
+ @@ -256,6 +360,17 @@ const courses = ref([]); const loading = ref(true); const searchQuery = ref(''); const filterStatus = ref(null); +const viewMode = ref<'card' | 'table'>('card'); + +// Table config +const tablePagination = ref({ page: 1, rowsPerPage: 10 }); +const tableColumns = [ + { name: 'title', label: 'หลักสูตร', field: 'title', align: 'left' as const, sortable: true }, + { name: 'status', label: 'สถานะ', field: 'status', align: 'center' as const, sortable: true }, + { name: 'price', label: 'ราคา', field: 'price', align: 'center' as const, sortable: true }, + { name: 'created_at', label: 'วันที่สร้าง', field: 'created_at', align: 'center' as const, sortable: true }, + { name: 'actions', label: 'จัดการ', field: 'actions', align: 'center' as const } +]; // Status options const statusOptions = [ diff --git a/frontend_management/services/admin.service.ts b/frontend_management/services/admin.service.ts index cdea0ea4..8a90c27f 100644 --- a/frontend_management/services/admin.service.ts +++ b/frontend_management/services/admin.service.ts @@ -320,7 +320,25 @@ const getAuthToken = (): string => { return tokenCookie.value || ''; }; +// Role interface +export interface RoleResponse { + id: number; + code: string; +} + export const adminService = { + async getRoles(): Promise { + const config = useRuntimeConfig(); + const token = getAuthToken(); + const response = await $fetch<{ roles: RoleResponse[] }>('/api/user/roles', { + baseURL: config.public.apiBaseUrl as string, + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.roles; + }, + async getUsers(): Promise { const config = useRuntimeConfig(); const token = getAuthToken();