diff --git a/src/features/admin/certificates/components/CertificateItem.vue b/src/features/admin/certificates/components/CertificateItem.vue new file mode 100644 index 0000000..32f480b --- /dev/null +++ b/src/features/admin/certificates/components/CertificateItem.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/features/admin/certificates/components/modals/IssueCertificateModal.vue b/src/features/admin/certificates/components/modals/IssueCertificateModal.vue new file mode 100644 index 0000000..f33e2a9 --- /dev/null +++ b/src/features/admin/certificates/components/modals/IssueCertificateModal.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/src/features/admin/certificates/pages/AdminCertificatesPage.vue b/src/features/admin/certificates/pages/AdminCertificatesPage.vue new file mode 100644 index 0000000..86a2530 --- /dev/null +++ b/src/features/admin/certificates/pages/AdminCertificatesPage.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/features/admin/certificates/schema/index.js b/src/features/admin/certificates/schema/index.js new file mode 100644 index 0000000..92b4f3d --- /dev/null +++ b/src/features/admin/certificates/schema/index.js @@ -0,0 +1,24 @@ +import { mixed, number, object, string } from 'yup' + +export const certificateSchema = object() + .shape({ + userId: number().typeError('طلبه را انتخاب کنید').required('طلبه را انتخاب کنید'), + termId: mixed().nullable().notRequired(), + courseId: mixed().nullable().notRequired(), + issuedAt: string().nullable().notRequired(), + startedAt: string().nullable().notRequired(), + endedAt: string().nullable().notRequired(), + imageMediaId: number().nullable().notRequired(), + pdfMediaId: number().nullable().notRequired(), + }) + .test('term-or-course', function (value) { + if (value?.termId || value?.courseId) return true + return this.createError({ path: 'termId', message: 'یکی از ترم یا دوره را انتخاب کنید' }) + }) + .test('image-or-pdf', function (value) { + if (value?.imageMediaId || value?.pdfMediaId) return true + return this.createError({ + path: 'imageMediaId', + message: 'حداقل یک فایل (تصویر یا PDF) بارگذاری کنید', + }) + }) diff --git a/src/services/api/admin-certificates.js b/src/services/api/admin-certificates.js new file mode 100644 index 0000000..e9500e8 --- /dev/null +++ b/src/services/api/admin-certificates.js @@ -0,0 +1,10 @@ +import { http } from '@/services/api/http' +import { buildUrl, endpoints } from '@/services/api/endpoints' + +export const apiGetAdminCertificates = (params) => + http.get(endpoints.getAdminCertificates, { params }) + +export const apiAddAdminCertificate = (payload) => http.post(endpoints.addAdminCertificate, payload) + +export const apiDeleteAdminCertificate = (id) => + http.delete(buildUrl(endpoints.deleteAdminCertificate, { id })) diff --git a/src/services/query/admin-certificates.js b/src/services/query/admin-certificates.js new file mode 100644 index 0000000..5e3c6e8 --- /dev/null +++ b/src/services/query/admin-certificates.js @@ -0,0 +1,30 @@ +import { cleanFilters } from '@/utils/clean-filters' +import { useMutation, useQuery } from '@tanstack/vue-query' +import { + apiAddAdminCertificate, + apiDeleteAdminCertificate, + apiGetAdminCertificates, +} from '@/services/api/admin-certificates' + +export const adminCertificatesKeys = { + all: ['admin', 'certificates'], + list: (filters, pagination) => ['admin', 'certificates', 'list', filters, pagination], +} + +export const useAdminCertificatesListQuery = (filtersRef, paginationRef, options = {}) => + useQuery({ + queryKey: ['admin', 'certificates', 'list', filtersRef, paginationRef], + queryFn: () => + apiGetAdminCertificates({ ...cleanFilters(filtersRef.value), ...paginationRef.value }), + select: (response) => ({ + data: response?.data?.items ?? response?.data ?? [], + meta: response?.data?.meta ?? response?.meta, + }), + ...options, + }) + +export const useAddAdminCertificateMutation = () => + useMutation({ mutationFn: (payload) => apiAddAdminCertificate(payload) }) + +export const useDeleteAdminCertificateMutation = () => + useMutation({ mutationFn: (id) => apiDeleteAdminCertificate(id) }) diff --git a/src/services/query/student-certificates.js b/src/services/query/student-certificates.js index 5989f28..822d944 100644 --- a/src/services/query/student-certificates.js +++ b/src/services/query/student-certificates.js @@ -18,6 +18,10 @@ export const useStudentCertificatesQuery = (filtersRef, paginationRef, options = ...cleanFilters(filtersRef.value), ...paginationRef.value, }), + select: (response) => ({ + data: response?.data?.items ?? response?.data ?? [], + meta: response?.data?.meta ?? response?.meta, + }), ...options, })