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 Student"
width="95%"
max-width="42rem"
min-width="auto"
:show-close-button="true"
>
<template #default="{ close }">
<div class="add-term-student">
<LineTitleBlock title="افزودن دانشجو" title-en="Add Student" />
<div class="add-term-student__search">
<SvgIcon name="user" :size="18" color="var(--color-thd-gray)" />
<input
@@ -37,20 +42,6 @@
</div>
<CircleButton
v-if="isAttached(user.id)"
tooltip="حذف از ترم"
bg-color="rgba(104, 104, 104, 0.05)"
size="2.25rem"
type="button"
:loading="pendingId === user.id"
@click="onDetach(user)"
>
<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"
@@ -91,15 +82,9 @@ import BaseButton from '@/components/BaseButton.vue'
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 { useAdminUsersListQuery } from '@/services/query/admin-users'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import {
adminTermsKeys,
useAddAdminTermStudentsMutation,
useAdminTermStudentsQuery,
useRemoveAdminTermStudentMutation,
} from '@/services/query/admin-terms'
import { adminTermsKeys, useAddAdminTermStudentsMutation } from '@/services/query/admin-terms'
defineOptions({ name: 'AddTermStudentModal' })
@@ -111,29 +96,13 @@ const termId = computed(() => modalData.value.termId ?? null)
const searchInput = ref('')
const searchQuery = ref('')
const userFilters = computed(() => ({ name: searchQuery.value }))
const userPagination = ref({ page: 1, perPage: 20 })
const userFilters = computed(() => ({ search: searchQuery.value }))
const userPagination = ref({ page: 1, perPage: 10 })
const { data: usersResponse, isLoading } = useAdminUsersListQuery(userFilters, userPagination)
const users = computed(() => usersResponse.value?.data ?? [])
const attachedFilters = computed(() => ({}))
const attachedPagination = ref({ page: 1, perPage: 200 })
const { data: attachedResponse } = useAdminTermStudentsQuery(
termId,
attachedFilters,
attachedPagination,
{ enabled: () => !!termId.value }
)
const attachedIds = computed(() => new Set((attachedResponse.value?.data ?? []).map((u) => u.id)))
const isAttached = (id) => attachedIds.value.has(id)
const userLabel = (user) =>
`${user.firstName || ''} ${user.lastName || ''}`.trim() ||
user.fullName ||
user.phoneNumber ||
'—'
const userLabel = (user) => user.name.trim() || '—'
const onSearchInput = useDebounce(() => {
searchQuery.value = searchInput.value || ''
@@ -143,7 +112,6 @@ const onSearchInput = useDebounce(() => {
const pendingId = ref(null)
const addMutation = useAddAdminTermStudentsMutation()
const removeMutation = useRemoveAdminTermStudentMutation()
const invalidate = () => queryClient.invalidateQueries({ queryKey: adminTermsKeys.all })
@@ -153,7 +121,7 @@ const onAttach = async (user) => {
try {
await addMutation.mutateAsync({
termId: termId.value,
payload: { userIds: [user.id] },
payload: { userId: user.id },
})
invalidate()
} finally {
@@ -161,17 +129,6 @@ const onAttach = async (user) => {
}
}
const onDetach = async (user) => {
if (!termId.value) return
pendingId.value = user.id
try {
await removeMutation.mutateAsync({ termId: termId.value, userId: user.id })
invalidate()
} finally {
pendingId.value = null
}
}
watch(termId, () => {
searchInput.value = ''
searchQuery.value = ''
@@ -293,7 +250,7 @@ watch(termId, () => {
&__footer {
display: flex;
justify-content: flex-start;
justify-content: flex-end;
}
&__close-btn {