This commit is contained in:
sajjadtalkhabi
2026-05-13 03:06:59 +03:30
parent d2a577f254
commit b8ced45375
142 changed files with 3706 additions and 905 deletions
@@ -66,14 +66,13 @@
</template>
<script setup>
import { computed, ref, watch } from 'vue'
import TextField from '@/components/form/TextField.vue'
import SelectField from '@/components/form/SelectField.vue'
import CircleButton from '@/components/CircleButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import { useAdminRolesListQuery } from '@/services/query/admin-users'
import { ROLE_LABELS } from '@/enums'
import { computed, ref, watch } from 'vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import TextField from '@/components/form/TextField.vue'
import CircleButton from '@/components/CircleButton.vue'
import SelectField from '@/components/form/SelectField.vue'
import { useAdminRolesListQuery } from '@/services/query/admin-users'
const props = defineProps({
modelValue: {
@@ -68,11 +68,10 @@
<script setup>
import { computed, ref } from 'vue'
import { useQueryClient } from '@tanstack/vue-query'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import DropdownMenu from '@/components/DropdownMenu.vue'
import { CHANGEABLE_ROLES, ROLE_LABELS } from '@/enums'
import BaseButton from '@/components/BaseButton.vue'
import { CHANGEABLE_ROLES, ROLE_LABELS } from '@/enums'
import DropdownMenu from '@/components/DropdownMenu.vue'
import {
adminUsersKeys,
useAdminRolesListQuery,
@@ -92,16 +92,16 @@
<script setup>
import { computed } from 'vue'
import useModal from '@/composables/useModal'
import BasicModal from '@/components/BasicModal.vue'
import BaseButton from '@/components/BaseButton.vue'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import useModal from '@/composables/useModal'
import NoItems from '@/components/blocks/NoItems.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import { useAdminUserQuery } from '@/services/query/admin-users'
import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import {
EDUCATION_STATUS,
GENDER,
@@ -110,7 +110,6 @@ import {
SEMINARY_LEVEL,
UNIVERSITY_LEVEL,
} from '@/enums'
import { formatJalaaliDate } from '@/utils/date-utils'
defineOptions({ name: 'UserDetailsModal' })
@@ -80,11 +80,10 @@
<script setup>
import { computed } from 'vue'
import BaseButton from '@/components/BaseButton.vue'
import CircleButton from '@/components/CircleButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import CircleButton from '@/components/CircleButton.vue'
const props = defineProps({
user: { type: Object, required: true },
@@ -50,11 +50,10 @@
<script setup>
import { computed, ref, watch } from 'vue'
import TextField from '@/components/form/TextField.vue'
import DatePickerField from '@/components/form/DatePickerField.vue'
import CircleButton from '@/components/CircleButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import TextField from '@/components/form/TextField.vue'
import CircleButton from '@/components/CircleButton.vue'
import DatePickerField from '@/components/form/DatePickerField.vue'
const props = defineProps({
modelValue: {
@@ -30,8 +30,8 @@
<script setup>
import BasicModal from '@/components/BasicModal.vue'
import BaseButton from '@/components/BaseButton.vue'
import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue'
defineOptions({ name: 'RejectReasonDetailsModal' })
@@ -67,20 +67,20 @@
<script setup>
import { ref } from 'vue'
import useYup from '@/composables/useYup'
import { PRIORITY_STATUS } from '@/enums'
import { useQueryClient } from '@tanstack/vue-query'
import BasicModal from '@/components/BasicModal.vue'
import BaseButton from '@/components/BaseButton.vue'
import TextField from '@/components/form/TextField.vue'
import TextareaField from '@/components/form/TextareaField.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import useYup from '@/composables/useYup'
import TextField from '@/components/form/TextField.vue'
import { rejectionReasonSchema } from '../../../schema'
import SelectField from '@/components/form/SelectField.vue'
import TextareaField from '@/components/form/TextareaField.vue'
import {
adminPendingStudentsKeys,
useChangePendingStudentStatusMutation,
} from '@/services/query/admin-pending-students'
import SelectField from '@/components/form/SelectField.vue'
import { PRIORITY_STATUS } from '@/enums'
import { rejectionReasonSchema } from '../../../schema'
defineOptions({ name: 'RejectReasonModal' })
@@ -225,14 +225,17 @@
<script setup>
import { computed, ref } from 'vue'
import useModal from '@/composables/useModal'
import BasicModal from '@/components/BasicModal.vue'
import BaseButton from '@/components/BaseButton.vue'
import CircleButton from '@/components/CircleButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import useModal from '@/composables/useModal'
import {
usePendingStudentQuery,
useDownloadPendingStudentPdfMutation,
} from '@/services/query/admin-pending-students'
import {
AUDIENCE_CONFLICT_RESPONSE,
COMPETING_PROPAGATOR_RESPONSE,
@@ -247,11 +250,6 @@ import {
USER_STATUS,
VERIFICATION_MEDIA_TYPE,
} from '@/enums'
import { formatJalaaliDate } from '@/utils/date-utils'
import {
usePendingStudentQuery,
useDownloadPendingStudentPdfMutation,
} from '@/services/query/admin-pending-students'
defineOptions({ name: 'UserVerificationDetailsModal' })
@@ -297,12 +295,6 @@ const leaderMessage = computed(() =>
verificationMedia.value.find((m) => m.type === VERIFICATION_MEDIA_TYPE.LEADER_MESSAGE)
)
const statusLabel = (status) => {
if (status === 'pending') return 'در انتظار تایید'
if (status === 'rejected') return 'رد شده'
return USER_STATUS[status] || status || ''
}
const pdfLoading = ref(false)
const pdfMutation = useDownloadPendingStudentPdfMutation()
+14 -14
View File
@@ -219,21 +219,26 @@
</template>
<script setup>
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { toast } from 'vue3-toastify'
import useYup from '@/composables/useYup'
import { useRoute, useRouter } from 'vue-router'
import { useQueryClient } from '@tanstack/vue-query'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import BaseButton from '@/components/BaseButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import TextField from '@/components/form/TextField.vue'
import SelectField from '@/components/form/SelectField.vue'
import TextareaField from '@/components/form/TextareaField.vue'
import DatePickerField from '@/components/form/DatePickerField.vue'
import PasswordField from '@/components/form/PasswordField.vue'
import LineTitleBlock from '@/components/LineTitleBlock.vue'
import ImageCropper from '@/components/form/ImageCropper.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import useYup from '@/composables/useYup'
import { GENDER, MARITAL_STATUS, ROLE_LABELS } from '@/enums'
import { objectToFormData } from '@/utils/object-to-formdata'
import TextareaField from '@/components/form/TextareaField.vue'
import PasswordField from '@/components/form/PasswordField.vue'
import { useUploadTemporaryMutation } from '@/services/query/auth'
import DatePickerField from '@/components/form/DatePickerField.vue'
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
import { userAddSchema, userEditSchema } from '@/features/admin/users/schema'
import { useGetCitiesOfProvinceQuery, useGetProvincesQuery } from '@/services/query/common'
import {
adminUsersKeys,
useAddAdminUserMutation,
@@ -241,11 +246,6 @@ import {
useAdminUserQuery,
useUpdateAdminUserMutation,
} from '@/services/query/admin-users'
import { useGetCitiesOfProvinceQuery, useGetProvincesQuery } from '@/services/query/common'
import { useUploadTemporaryMutation } from '@/services/query/auth'
import { GENDER, MARITAL_STATUS, ROLE_LABELS } from '@/enums'
import { userAddSchema, userEditSchema } from '@/features/admin/users/schema'
import { objectToFormData } from '@/utils/object-to-formdata'
const route = useRoute()
const router = useRouter()
@@ -41,26 +41,25 @@
<script setup>
import { computed, ref } from 'vue'
import useModal from '@/composables/useModal'
import { useQueryClient } from '@tanstack/vue-query'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
import SimpleTitleIconBlock from '@/components/blocks/SimpleTitleIconBlock.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import VerificationsFilters from '@/features/admin/users/components/verifications/VerificationsFilters.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import { usePagination } from '@/composables/usePagination'
import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import SimpleTitleIconBlock from '@/components/blocks/SimpleTitleIconBlock.vue'
import VerificationItem from '@/features/admin/users/components/verifications/VerificationItem.vue'
import UserVerificationDetailsModal from '@/features/admin/users/components/verifications/modals/UserVerificationDetailsModal.vue'
import VerificationsFilters from '@/features/admin/users/components/verifications/VerificationsFilters.vue'
import RejectReasonModal from '@/features/admin/users/components/verifications/modals/RejectReasonModal.vue'
import RejectReasonDetailsModal from '@/features/admin/users/components/verifications/modals/RejectReasonDetailsModal.vue'
import UserVerificationDetailsModal from '@/features/admin/users/components/verifications/modals/UserVerificationDetailsModal.vue'
import {
adminPendingStudentsKeys,
useChangePendingStudentStatusMutation,
usePendingStudentsListQuery,
} from '@/services/query/admin-pending-students'
import { usePagination } from '@/composables/usePagination'
import useModal from '@/composables/useModal'
const queryClient = useQueryClient()
const { openModal, isModal } = useModal()
@@ -48,27 +48,26 @@
<script setup>
import { computed, ref } from 'vue'
import { useRouter } from 'vue-router'
import useModal from '@/composables/useModal'
import { useQueryClient } from '@tanstack/vue-query'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
import SimpleTitleIconBlock from '@/components/blocks/SimpleTitleIconBlock.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import BaseButton from '@/components/BaseButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import UsersFilters from '@/features/admin/users/components/UsersFilters.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import { usePagination } from '@/composables/usePagination'
import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import UsersTable from '@/features/admin/users/components/UsersTable.vue'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import UsersFilters from '@/features/admin/users/components/UsersFilters.vue'
import SimpleTitleIconBlock from '@/components/blocks/SimpleTitleIconBlock.vue'
import UserExamsModal from '@/features/admin/users/components/modals/UserExamsModal.vue'
import UserDetailsModal from '@/features/admin/users/components/modals/UserDetailsModal.vue'
import UserAssignmentsModal from '@/features/admin/users/components/modals/UserAssignmentsModal.vue'
import UserExamsModal from '@/features/admin/users/components/modals/UserExamsModal.vue'
import {
adminUsersKeys,
useAdminUsersListQuery,
useDeleteAdminUserMutation,
} from '@/services/query/admin-users'
import { usePagination } from '@/composables/usePagination'
import useModal from '@/composables/useModal'
const router = useRouter()
const queryClient = useQueryClient()
+1 -2
View File
@@ -1,8 +1,7 @@
import { object, string } from 'yup'
import { passwordRule } from '@/constants/rules/passwordRule'
import { phoneNumberRule } from '@/constants/rules/phoneNumberRule'
import { nationalCodeRule } from '@/constants/rules/nationalCodeRule'
import { passwordRule } from '@/constants/rules/passwordRule'
import { passwordConfirmationRule } from '@/constants/rules/passwordConfirmationRule'
export const rejectionReasonSchema = object().shape({