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
@@ -51,37 +51,23 @@
<div v-else-if="students.length > 0">
<div v-for="student in students" :key="student.id" class="term-details__student-row">
<div class="term-details__student-main">
<div v-if="student.avatarUrl" class="term-details__avatar">
<img :src="student.avatarUrl" :alt="studentName(student)" />
<div v-if="studentAvatar(student)" class="term-details__avatar">
<img :src="studentAvatar(student)" :alt="student.name" />
</div>
<div v-else class="term-details__avatar term-details__avatar--placeholder">
<SvgIcon name="user" :size="20" color="#bcbcbc" />
</div>
<div>
<p class="term-details__student-name">{{ studentName(student) }}</p>
<p class="term-details__student-name">{{ student.name || '—' }}</p>
<p class="term-details__student-meta">
<span>{{ student.address?.province?.name || '—' }}</span>
<span class="term-details__sep">،</span>
<span>{{ student.address?.city?.name || '—' }}</span>
<span dir="ltr">{{ student.phone || '—' }}</span>
<template v-if="student.email">
<span class="term-details__sep">،</span>
<span dir="ltr">{{ student.email }}</span>
</template>
</p>
</div>
</div>
<div class="term-details__student-actions">
<ToggleSwitch
:model-value="!!student.isOnLeave"
@update:model-value="onToggleLeave(student, $event)"
/>
<CircleButton
tooltip="حذف از ترم"
bg-color="rgba(104, 104, 104, 0.05)"
size="2.5rem"
@click="onAskRemoveStudent(student)"
>
<template #icon>
<SvgIcon name="trash" :size="18" color="var(--color-error)" />
</template>
</CircleButton>
</div>
</div>
</div>
<NoItems v-else title="متاسفیم" desc="دانشجویی برای نمایش وجود ندارد." />
@@ -143,11 +129,9 @@ import BaseButton from '@/components/BaseButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import CircleButton from '@/components/CircleButton.vue'
import TabsBlock from '@/components/blocks/TabsBlock.vue'
import { usePagination } from '@/composables/usePagination'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import ToggleSwitch from '@/components/form/ToggleSwitch.vue'
import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue'
import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
@@ -156,13 +140,7 @@ import {
useAdminCoursesListQuery,
useUpdateAdminCourseMutation,
} from '@/services/query/admin-courses'
import {
adminTermsKeys,
useAdminTermQuery,
useAdminTermStudentsQuery,
useRemoveAdminTermStudentMutation,
useToggleAdminTermStudentLeaveMutation,
} from '@/services/query/admin-terms'
import { useAdminTermQuery, useTermAttendeesQuery } from '@/services/query/admin-terms'
defineOptions({ name: 'TermDetailsModal' })
@@ -189,7 +167,7 @@ const {
reset: resetStudentPagination,
} = usePagination({ page: 1, perPage: 10 })
const { data: studentsData, isLoading: studentsPending } = useAdminTermStudentsQuery(
const { data: studentsData, isLoading: studentsPending } = useTermAttendeesQuery(
termId,
studentFilters,
studentPagination,
@@ -206,31 +184,7 @@ const studentPaginationMeta = computed(() => ({
...studentsData.value?.meta,
}))
const studentName = (student) =>
`${student.firstName || ''} ${student.lastName || ''}`.trim() || student.fullName || '—'
const invalidate = () => queryClient.invalidateQueries({ queryKey: adminTermsKeys.all })
const toggleLeaveMutation = useToggleAdminTermStudentLeaveMutation()
const removeStudentMutation = useRemoveAdminTermStudentMutation()
const onToggleLeave = (student, isOnLeave) => {
toggleLeaveMutation.mutate(
{
termId: termId.value,
userId: student.id,
payload: { setLeave: isOnLeave },
},
{ onSuccess: invalidate }
)
}
const onAskRemoveStudent = (student) => {
removeStudentMutation.mutate(
{ termId: termId.value, userId: student.id },
{ onSuccess: invalidate }
)
}
const studentAvatar = (student) => student.avatarUrl || student.avatarDownloadUrl || ''
const courseFilters = computed(() => ({ termId: termId.value }))
const { pagination: coursePagination, setPage: setCoursePage } = usePagination({