fix: user changes

This commit is contained in:
sajjadtalkhabi
2026-05-28 13:34:30 +03:30
parent cb86920015
commit 7ed6ec9ae1
46 changed files with 328 additions and 1114 deletions
@@ -1,9 +1,14 @@
<template>
<BasicModal width="95%" max-width="42rem" min-width="auto" :show-close-button="true">
<BasicModal
title="افزودن جلسه"
title-en="Add"
width="95%"
max-width="42rem"
min-width="auto"
:show-close-button="true"
>
<template #default="{ close }">
<div class="add-session">
<LineTitleBlock title="افزودن جلسه" title-en="Add" />
<div class="add-session__search">
<SvgIcon name="book" :size="18" color="var(--color-thd-gray)" />
<input
@@ -37,20 +42,6 @@
</div>
<CircleButton
v-if="isAttached(session.id)"
tooltip="حذف از دوره"
bg-color="rgba(104, 104, 104, 0.05)"
size="2.25rem"
type="button"
:loading="pendingId === session.id"
@click="onDetach(session)"
>
<template #icon>
<SvgIcon name="trash" :size="16" color="var(--color-error)" />
</template>
</CircleButton>
<CircleButton
v-else
tooltip="افزودن به دوره"
bg-color="rgba(104, 104, 104, 0.05)"
size="2.25rem"
@@ -92,14 +83,13 @@ import SvgIcon from '@/components/icons/SvgIcon.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import CircleButton from '@/components/CircleButton.vue'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import { useAdminSessionsListQuery } from '@/services/query/admin-sessions'
import { adminCoursesKeys } from '@/services/query/admin-courses'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import {
adminCoursesKeys,
useAdminCourseSessionsQuery,
useAttachAdminCourseSessionMutation,
useDetachAdminCourseSessionMutation,
} from '@/services/query/admin-courses'
adminSessionsKeys,
useAdminSessionsListQuery,
useUpdateAdminSessionMutation,
} from '@/services/query/admin-sessions'
defineOptions({ name: 'AddSessionToCourseModal' })
@@ -111,8 +101,8 @@ const courseId = computed(() => modalData.value.courseId ?? null)
const searchInput = ref('')
const searchQuery = ref('')
const sessionFilters = computed(() => ({ title: searchQuery.value }))
const sessionPagination = ref({ page: 1, perPage: 20 })
const sessionFilters = computed(() => ({ search: searchQuery.value }))
const sessionPagination = ref({ page: 1, perPage: 10 })
const { data: sessionsResponse, isLoading } = useAdminSessionsListQuery(
sessionFilters,
@@ -120,18 +110,6 @@ const { data: sessionsResponse, isLoading } = useAdminSessionsListQuery(
)
const sessions = computed(() => sessionsResponse.value?.data ?? [])
const attachedFilters = computed(() => ({}))
const attachedPagination = ref({ page: 1, perPage: 200 })
const { data: attachedResponse } = useAdminCourseSessionsQuery(
courseId,
attachedFilters,
attachedPagination,
{ enabled: () => !!courseId.value }
)
const attachedIds = computed(() => new Set((attachedResponse.value?.data ?? []).map((s) => s.id)))
const isAttached = (id) => attachedIds.value.has(id)
const teacherName = (session) => {
const t = session.teacher
if (!t) return '—'
@@ -145,18 +123,20 @@ const onSearchInput = useDebounce(() => {
const pendingId = ref(null)
const attachMutation = useAttachAdminCourseSessionMutation()
const detachMutation = useDetachAdminCourseSessionMutation()
const updateSessionMutation = useUpdateAdminSessionMutation()
const invalidate = () => queryClient.invalidateQueries({ queryKey: adminCoursesKeys.all })
const invalidate = () => {
queryClient.invalidateQueries({ queryKey: adminCoursesKeys.all })
queryClient.invalidateQueries({ queryKey: adminSessionsKeys.all })
}
const onAttach = async (session) => {
if (!courseId.value) return
pendingId.value = session.id
try {
await attachMutation.mutateAsync({
courseId: courseId.value,
payload: { sessionIds: [session.id] },
await updateSessionMutation.mutateAsync({
id: session.id,
payload: { courseId: courseId.value },
})
invalidate()
} finally {
@@ -164,17 +144,6 @@ const onAttach = async (session) => {
}
}
const onDetach = async (session) => {
if (!courseId.value) return
pendingId.value = session.id
try {
await detachMutation.mutateAsync({ courseId: courseId.value, sessionId: session.id })
invalidate()
} finally {
pendingId.value = null
}
}
watch(courseId, () => {
searchInput.value = ''
searchQuery.value = ''