From 6d64c2931de91243243788946a3808a12a72b709 Mon Sep 17 00:00:00 2001 From: Kavehhn174 Date: Sun, 23 Aug 2026 23:00:23 +0330 Subject: [PATCH] feat: add waitlist view, quick edit payment dialog, and catering fee in class views --- src/api/paymentApi.js | 4 +- src/api/waitlistApi.js | 14 + src/components/common/StatusTag.vue | 4 +- src/components/layout/AppSidebar.vue | 1 + .../payments/QuickEditPaymentDialog.vue | 701 ++++++++++++++++ src/constants/permissions.js | 18 +- src/router/routes.js | 8 + src/utils/professorShare.js | 6 +- src/utils/professorShare.test.js | 13 + src/views/classes/ClassDetailView.vue | 4 + src/views/classes/ClassFormView.vue | 16 +- src/views/payments/PaymentListView.vue | 29 +- src/views/waitlist/WaitlistListView.vue | 787 ++++++++++++++++++ 13 files changed, 1598 insertions(+), 7 deletions(-) create mode 100644 src/api/waitlistApi.js create mode 100644 src/components/payments/QuickEditPaymentDialog.vue create mode 100644 src/views/waitlist/WaitlistListView.vue diff --git a/src/api/paymentApi.js b/src/api/paymentApi.js index 6cb6fa9..552aba3 100644 --- a/src/api/paymentApi.js +++ b/src/api/paymentApi.js @@ -12,5 +12,7 @@ export const paymentApi = { delete: (id) => axiosInstance.delete(`/payments/admin/delete/${id}`), recordTransaction: (paymentId, data) => axiosInstance.post(`/payments/admin/transactions/${paymentId}`, data), updateTransaction: (transactionId, data) => axiosInstance.put(`/payments/admin/transactions/${transactionId}`, data), - cancelTransaction: (transactionId) => axiosInstance.post(`/payments/admin/transactions/${transactionId}/cancel`) + cancelTransaction: (transactionId) => axiosInstance.post(`/payments/admin/transactions/${transactionId}/cancel`), + revertTransaction: (transactionId) => axiosInstance.post(`/payments/admin/transactions/${transactionId}/revert`), + deleteTransaction: (transactionId) => axiosInstance.delete(`/payments/admin/transactions/${transactionId}`) }; diff --git a/src/api/waitlistApi.js b/src/api/waitlistApi.js new file mode 100644 index 0000000..42f9dac --- /dev/null +++ b/src/api/waitlistApi.js @@ -0,0 +1,14 @@ +// /src/api/waitlistApi.js +import axiosInstance from './axiosInstance'; + +export const waitlistApi = { + getAll: (params) => axiosInstance.get('/waitlist/admin/get-all', { params }), + getStats: () => axiosInstance.get('/waitlist/admin/stats'), + getOne: (id) => axiosInstance.get(`/waitlist/admin/get-one/${id}`), + create: (data) => axiosInstance.post('/waitlist/admin/create', data), + update: (id, data) => axiosInstance.put(`/waitlist/admin/update/${id}`, data), + assignClass: (id, data) => axiosInstance.post(`/waitlist/admin/${id}/assign-class`, data), + revert: (id, data) => axiosInstance.post(`/waitlist/admin/${id}/revert`, data), + cancel: (id, data) => axiosInstance.post(`/waitlist/admin/${id}/cancel`, data), + delete: (id) => axiosInstance.delete(`/waitlist/admin/delete/${id}`) +}; diff --git a/src/components/common/StatusTag.vue b/src/components/common/StatusTag.vue index f97be67..c7357cf 100644 --- a/src/components/common/StatusTag.vue +++ b/src/components/common/StatusTag.vue @@ -47,7 +47,8 @@ const PAYMENT_LABELS = { partial: 'پیش پرداخت', pending: 'در انتظار پرداخت', overdue: 'معوق', - cancelled: 'لغوشده' + cancelled: 'لغوشده', + reverted: 'مسترد شده' }; const PENDING_STUDENT_LABELS = { @@ -67,6 +68,7 @@ const severity = computed(() => { if (val === 'pending' || val === 'در انتظار پرداخت') return 'info'; if (val === 'overdue' || val === 'معوق شده' || val === 'معوق') return 'danger'; if (val === 'cancelled' || val === 'canceled' || val === 'لغوشده') return 'secondary'; + if (val === 'reverted' || val === 'مسترد شده' || val === 'مسترد') return 'warn'; } if (props.type === 'session') { diff --git a/src/components/layout/AppSidebar.vue b/src/components/layout/AppSidebar.vue index 3f6bb5f..0fd3ff8 100644 --- a/src/components/layout/AppSidebar.vue +++ b/src/components/layout/AppSidebar.vue @@ -122,6 +122,7 @@ const menuGroups = computed(() => { { label: 'مدیریت اساتید', icon: 'pi pi-id-card', to: '/professors' }, { label: 'دوره‌های آموزشی', icon: 'pi pi-book', to: '/courses' }, { label: 'کلاس‌ها', icon: 'pi pi-desktop', to: '/classes' }, + { label: 'لیست انتظار', icon: 'pi pi-clock', to: '/waitlist', permission: PERMISSIONS.WAITLIST_READ }, { label: 'جلسات آموزشی', icon: 'pi pi-calendar', to: '/sessions' } ] }, diff --git a/src/components/payments/QuickEditPaymentDialog.vue b/src/components/payments/QuickEditPaymentDialog.vue new file mode 100644 index 0000000..b618375 --- /dev/null +++ b/src/components/payments/QuickEditPaymentDialog.vue @@ -0,0 +1,701 @@ + +