diff --git a/src/api/sessionApi.js b/src/api/sessionApi.js index d5bdc1f..97b3389 100644 --- a/src/api/sessionApi.js +++ b/src/api/sessionApi.js @@ -10,5 +10,6 @@ export const sessionApi = { delete: (id) => axiosInstance.delete(`/sessions/admin/delete/${id}`), bulkDelete: (ids) => axiosInstance.post('/sessions/admin/bulk-delete', { ids }), bulkUpdateStatus: (ids, status) => axiosInstance.post('/sessions/admin/bulk-status', { ids, status }), - recordAttendance: (sessionId, data) => axiosInstance.put(`/sessions/admin/${sessionId}/attendance`, data) + recordAttendance: (sessionId, data) => axiosInstance.put(`/sessions/admin/${sessionId}/attendance`, data), + notifyHolding: (id) => axiosInstance.post(`/sessions/admin/${id}/notify-holding`) }; diff --git a/src/assets/styles/main.scss b/src/assets/styles/main.scss index 45edd04..50911e9 100644 --- a/src/assets/styles/main.scss +++ b/src/assets/styles/main.scss @@ -130,6 +130,7 @@ a { display: inline-flex !important; align-items: center !important; justify-content: center !important; + transform: none !important; width: 32px !important; height: 32px !important; border-radius: 8px !important; @@ -143,6 +144,7 @@ a { width: 14px !important; height: 14px !important; fill: var(--text-primary) !important; + transform: none !important; path { fill: var(--text-primary) !important; diff --git a/src/components/classes/ClassSessionsSection.vue b/src/components/classes/ClassSessionsSection.vue index bac133e..858fb90 100644 --- a/src/components/classes/ClassSessionsSection.vue +++ b/src/components/classes/ClassSessionsSection.vue @@ -74,7 +74,7 @@ - + - + @@ -170,6 +211,7 @@ import Column from 'primevue/column'; import Tag from 'primevue/tag'; import Select from 'primevue/select'; import Dropdown from 'primevue/select'; +import Dialog from 'primevue/dialog'; const { formatJalali, toPersianDigits } = usePersianDate(); const { showSuccess, showError } = useToast(); @@ -200,6 +242,35 @@ const selectedSession = ref(null); const bulkDeleteMode = ref(false); const isDeleting = ref(false); +const notifyDialogVisible = ref(false); +const selectedSessionForNotify = ref(null); +const notifyingSessionId = ref(null); +const isNotifying = ref(false); + +const openNotifyHoldingDialog = (session) => { + selectedSessionForNotify.value = session; + notifyDialogVisible.value = true; +}; + +const handleSendSessionHolding = async () => { + if (!selectedSessionForNotify.value) return; + const id = selectedSessionForNotify.value._id || selectedSessionForNotify.value.id; + notifyingSessionId.value = id; + isNotifying.value = true; + try { + const res = await sessionApi.notifyHolding(id); + const count = res.data?.sentCount || res.data?.totalStudents || ''; + showSuccess(`پیامک برگزاری جلسه با موفقیت به ${count ? toPersianDigits(count) + ' نفر از ' : ''}دانشجویان ارسال شد`); + notifyDialogVisible.value = false; + selectedSessionForNotify.value = null; + } catch (err) { + showError(err); + } finally { + notifyingSessionId.value = null; + isNotifying.value = false; + } +}; + const statusOptions = [ { label: 'طبق برنامه', value: 'scheduled' }, { label: 'برگزار شده', value: 'held' },