diff --git a/src/api/certificateApi.js b/src/api/certificateApi.js index a957741..d858bb0 100644 --- a/src/api/certificateApi.js +++ b/src/api/certificateApi.js @@ -5,12 +5,15 @@ export const certificateApi = { getAll: (params) => axiosInstance.get('/certificates/admin/get-all', { params }), search: (params) => axiosInstance.get('/certificates/admin/search', { params }), getOne: (id) => axiosInstance.get(`/certificates/admin/get-one/${id}`), + getByUser: (userId) => axiosInstance.get(`/certificates/admin/by-user/${userId}`), create: (data) => axiosInstance.post('/certificates/admin/create', data), update: (id, data) => axiosInstance.put(`/certificates/admin/update/${id}`, data), delete: (id) => axiosInstance.delete(`/certificates/admin/delete/${id}`), uploadTemp: (formData) => axiosInstance.post('/files/admin/upload-temp', formData, { headers: { 'Content-Type': 'multipart/form-data' } }), + getSignedUrl: (filename, bucket = 'temp') => + axiosInstance.get(`/files/admin/signed-url/${encodeURIComponent(filename)}`, { params: { bucket } }), userUpload: (data) => axiosInstance.post('/certificates/user/upload', data), getUserCertificates: () => axiosInstance.get('/certificates/user/my-certificates') }; diff --git a/src/api/documentApi.js b/src/api/documentApi.js new file mode 100644 index 0000000..0a380e8 --- /dev/null +++ b/src/api/documentApi.js @@ -0,0 +1,12 @@ +// /src/api/documentApi.js +import axiosInstance from './axiosInstance'; + +export const documentApi = { + getAll: (params) => axiosInstance.get('/documents/admin/get-all', { params }), + getByUser: (userId) => axiosInstance.get(`/documents/admin/by-user/${userId}`), + getOne: (id) => axiosInstance.get(`/documents/admin/get-one/${id}`), + create: (data) => axiosInstance.post('/documents/admin/create', data), + update: (id, data) => axiosInstance.put(`/documents/admin/update/${id}`, data), + delete: (id) => axiosInstance.delete(`/documents/admin/delete/${id}`), + getMyDocuments: () => axiosInstance.get('/documents/user/my-documents') +}; diff --git a/src/components/uploader/CertificateUploader.vue b/src/components/uploader/CertificateUploader.vue index 4ca9095..403fe04 100644 --- a/src/components/uploader/CertificateUploader.vue +++ b/src/components/uploader/CertificateUploader.vue @@ -1,37 +1,20 @@ diff --git a/src/components/uploader/ImageManager.vue b/src/components/uploader/ImageManager.vue index 1ade362..c7492d4 100644 --- a/src/components/uploader/ImageManager.vue +++ b/src/components/uploader/ImageManager.vue @@ -1,55 +1,71 @@ @@ -191,8 +270,17 @@ onUnmounted(() => { background-color: var(--surface-card); border: 1px dashed var(--border-color); } + .filepond--drop-label { color: var(--text-secondary); } + + .gallery-thumb { + background: var(--surface-ground); + } + + .pdf-thumb { + background: var(--surface-ground); + } } diff --git a/src/components/uploader/UserFilesSection.vue b/src/components/uploader/UserFilesSection.vue new file mode 100644 index 0000000..f934e62 --- /dev/null +++ b/src/components/uploader/UserFilesSection.vue @@ -0,0 +1,202 @@ + + + + diff --git a/src/router/routes.js b/src/router/routes.js index ac2b3d9..4b3cbe3 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -42,6 +42,11 @@ export const routes = [ name: 'UserEdit', component: () => import('@/views/users/UserFormView.vue') }, + { + path: 'users/:id', + name: 'UserDetail', + component: () => import('@/views/users/UserDetailView.vue') + }, // Professors { diff --git a/src/views/users/UserDetailView.vue b/src/views/users/UserDetailView.vue index 3b3a486..3553af7 100644 --- a/src/views/users/UserDetailView.vue +++ b/src/views/users/UserDetailView.vue @@ -15,7 +15,7 @@ {{ $t('users.tabCourses') }} {{ $t('users.tabSessions') }} {{ $t('users.tabPayments') }} - {{ $t('users.tabCertificates') }} + گواهینامه‌ها و اسناد @@ -180,11 +180,10 @@ - +
-

گواهینامه‌های صادر شده دانشجو

- +
@@ -221,7 +220,7 @@ import { useToast } from '@/composables/useToast'; import PageHeader from '@/components/common/PageHeader.vue'; import PermissionGate from '@/components/common/PermissionGate.vue'; import StatusTag from '@/components/common/StatusTag.vue'; -import CertificateUploader from '@/components/uploader/CertificateUploader.vue'; +import UserFilesSection from '@/components/uploader/UserFilesSection.vue'; import Tabs from 'primevue/tabs'; import TabList from 'primevue/tablist'; import Tab from 'primevue/tab'; @@ -243,7 +242,6 @@ const user = ref(null); const enrolledCourses = ref([]); const attendances = ref([]); const payments = ref([]); -const userCertificates = ref([]); const showEnrollModal = ref(false); const allCourses = ref([]); @@ -263,7 +261,6 @@ const fetchUserDetail = async () => { user.value = res.data || res; enrolledCourses.value = user.value.enrolledCourses || user.value.courses || []; payments.value = user.value.payments || []; - userCertificates.value = user.value.certificates || []; } catch (err) { showError(err); } diff --git a/src/views/users/UserFormView.vue b/src/views/users/UserFormView.vue index 697c7f8..b489d4b 100644 --- a/src/views/users/UserFormView.vue +++ b/src/views/users/UserFormView.vue @@ -108,6 +108,10 @@ +
+ +
+