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 @@
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
{{ props.row.title.th }}
+
{{ props.row.title.en }}
+
+
+
+
+
+
+
+
+
+ {{ getStatusLabel(props.row.status) }}
+
+
+
+
+
+
+
+
+ {{ props.row.is_free ? 'ฟรี' : `฿${parseFloat(props.row.price).toLocaleString()}` }}
+
+
+
+
+
+
+
+ {{ formatDate(props.row.created_at) }}
+
+
+
+
+
+
+
+ ดูรายละเอียด
+
+
+
+
+
+
+
+
+ ทำสำเนา
+
+
+
+
+
+
+ ลบ
+
+
+
+
+
+
+
+
+
@@ -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();