fix: admin courses

This commit is contained in:
sajjadtalkhabi
2026-05-27 14:47:19 +03:30
parent 7eb2984f5e
commit cb86920015
50 changed files with 787 additions and 649 deletions
@@ -84,24 +84,25 @@
class="course-details__student-row"
>
<div class="course-details__student-main">
<div v-if="student.avatarUrl" class="course-details__avatar">
<img :src="student.avatarUrl" :alt="studentName(student)" />
<div v-if="studentAvatar(student)" class="course-details__avatar">
<img :src="studentAvatar(student)" :alt="student.name" />
</div>
<div v-else class="course-details__avatar course-details__avatar--placeholder">
<SvgIcon name="user" :size="20" color="#bcbcbc" />
</div>
<div>
<p class="course-details__student-name">{{ studentName(student) }}</p>
<p class="course-details__student-name">{{ student.name || '—' }}</p>
<p class="course-details__student-meta">
<span>{{ student.address?.province?.name || '—' }}</span>
<span class="course-details__sep">،</span>
<span>{{ student.address?.city?.name || '—' }}</span>
<span dir="ltr">{{ student.phone || '—' }}</span>
<template v-if="student.email">
<span class="course-details__sep">،</span>
<span dir="ltr">{{ student.email }}</span>
</template>
</p>
</div>
</div>
<div class="course-details__student-actions">
<div v-if="student.phone" class="course-details__student-actions">
<CircleButton
v-if="student.phoneNumber"
tooltip="ارسال پیام"
bg-color="rgba(104, 104, 104, 0.05)"
size="2.25rem"
@@ -111,16 +112,6 @@
<SvgIcon name="chat" :size="16" color="var(--color-sec-gray)" />
</template>
</CircleButton>
<CircleButton
tooltip="حذف"
bg-color="rgba(104, 104, 104, 0.05)"
size="2.25rem"
@click="onAskRemoveStudent(student)"
>
<template #icon>
<SvgIcon name="trash" :size="16" color="var(--color-error)" />
</template>
</CircleButton>
</div>
</div>
</div>
@@ -151,7 +142,6 @@
<script setup>
import { computed, ref } from 'vue'
import useModal from '@/composables/useModal'
import { useQueryClient } from '@tanstack/vue-query'
import BasicModal from '@/components/BasicModal.vue'
import BaseButton from '@/components/BaseButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
@@ -166,16 +156,13 @@ import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import CourseSessionItem from '@/features/admin/courses/components/CourseSessionItem.vue'
import {
adminCoursesKeys,
useAdminCourseQuery,
useAdminCourseSessionsQuery,
useAdminCourseStudentsQuery,
useRemoveAdminCourseStudentMutation,
useCourseAttendeesQuery,
} from '@/services/query/admin-courses'
defineOptions({ name: 'CourseDetailsModal' })
const queryClient = useQueryClient()
const { openModal, getModal } = useModal()
const modalData = computed(() => getModal('CourseDetailsModal')?.data ?? {})
@@ -226,7 +213,7 @@ const { pagination: studentsPagination, setPage: setStudentsPage } = usePaginati
perPage: 10,
})
const { data: studentsData, isLoading: studentsPending } = useAdminCourseStudentsQuery(
const { data: studentsData, isLoading: studentsPending } = useCourseAttendeesQuery(
courseId,
studentsFilters,
studentsPagination,
@@ -243,15 +230,7 @@ const studentsPaginationMeta = computed(() => ({
...studentsData.value?.meta,
}))
const studentName = (student) =>
`${student.firstName || ''} ${student.lastName || ''}`.trim() ||
student.fullName ||
student.phoneNumber ||
'—'
const invalidate = () => queryClient.invalidateQueries({ queryKey: adminCoursesKeys.all })
const removeStudentMutation = useRemoveAdminCourseStudentMutation()
const studentAvatar = (student) => student.avatarUrl || student.avatarDownloadUrl || ''
const onOpenAddSession = () => {
openModal('AddSessionToCourseModal', { courseId: courseId.value })
@@ -261,21 +240,9 @@ const onOpenAddStudent = () => {
openModal('AddCourseStudentModal', { courseId: courseId.value })
}
const onAskRemoveStudent = (student) => {
openModal('ConfirmModal', {
title: `حذف ${studentName(student)}`,
message: `آیا از حذف <strong>${studentName(student)}</strong> از این دوره اطمینان دارید؟`,
onConfirm: () =>
removeStudentMutation.mutate(
{ courseId: courseId.value, userId: student.id },
{ onSuccess: invalidate }
),
})
}
const onMessageStudent = (student) => {
if (!student?.phoneNumber) return
window.location.href = `sms:${student.phoneNumber}`
if (!student?.phone) return
window.location.href = `sms:${student.phone}`
}
</script>