fix: bugs
Deploy banu-front / deploy (push) Successful in 1m22s

This commit is contained in:
sajjadtalkhabi
2026-07-02 19:09:13 +03:30
parent e700609236
commit b9ef684b51
51 changed files with 406 additions and 170 deletions
@@ -6,7 +6,7 @@
desc="در این قسمت شما میتوانید گواهینامه هر دوره ای را که گذرانده اید را مشاهده کنید."
>
<template #icon>
<SvgIcon name="scroll" :size="24" color="var(--color-primary)" />
<SvgIcon name="certificate" :size="24" color="var(--color-primary)" />
</template>
</BoxedIconTitleBlock>
@@ -19,7 +19,6 @@
v-model="form.message"
name="message"
label="توضیحات خود را وارد نمایید"
placeholder="لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است."
:row="5"
:error="errors.message"
/>
@@ -118,11 +117,7 @@ const onSubmit = async () => {
&__actions {
display: flex;
justify-content: center;
@media (min-width: 768px) {
justify-content: flex-end;
}
justify-content: flex-end;
}
&__submit {
@@ -6,7 +6,7 @@
desc="درخواست مشاوره جدید ثبت کنید یا تاریخچه مشاوره‌های خود را مشاهده نمایید."
>
<template #icon>
<SvgIcon name="chat" :size="24" color="var(--color-primary)" />
<img :src="chatsImage" alt="مشاوره" class="student-consultants__heading-img" />
</template>
</BoxedIconTitleBlock>
@@ -37,10 +37,10 @@ import { computed, ref } from 'vue'
import { toast } from 'vue3-toastify'
import { TICKET_STATUS } from '@/enums'
import { useQueryClient } from '@tanstack/vue-query'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import TabsBlock from '@/components/blocks/TabsBlock.vue'
import chatsImage from '@/assets/images/tickets/chats.png'
import { usePagination } from '@/composables/usePagination'
import PaginationBlock from '@/components/blocks/PaginationBlock.vue'
import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue'
@@ -130,5 +130,11 @@ const onShowDetails = () => {}
&__heading {
margin-bottom: 0.75rem;
}
&__heading-img {
width: 1.75rem;
height: 1.75rem;
object-fit: contain;
}
}
</style>
@@ -58,8 +58,8 @@ import StudentCourseItem from '@/features/student/courses/components/StudentCour
const router = useRouter()
const tabs = [
{ name: 'current', label: 'در حال گذراندن', icon: 'list-bullets' },
{ name: 'ended', label: 'تکمیل شده', icon: 'list-bullets' },
{ name: 'current', label: 'در حال گذراندن', icon: 'play' },
{ name: 'ended', label: 'تکمیل شده', icon: 'check-circle' },
]
const activeTab = ref('current')
@@ -6,7 +6,7 @@
desc="در این قسمت می‌توانید پروفایل خود را به‌روز کنید."
>
<template #icon>
<SvgIcon name="user" :size="24" color="var(--color-primary)" />
<SvgIcon name="user-circle-check" :size="24" color="var(--color-primary)" />
</template>
</BoxedIconTitleBlock>
@@ -17,6 +17,7 @@
v-model="avatar"
name="avatar"
bg-color="#eeeeee"
helper-text="برای آپلود تصویر جدید لطفا روی دکمه بالا کلیک کنید."
@crop="onAvatarCropped"
@error="onAvatarError"
/>
@@ -405,34 +406,36 @@ const onCancel = () => router.push({ name: 'student-dashboard' })
}
&__grid {
display: grid;
grid-template-columns: 1fr;
display: flex;
flex-direction: column;
gap: 1rem;
@media (min-width: 1024px) {
grid-template-columns: 4fr 8fr;
display: grid;
grid-template-columns: 8fr 4fr;
}
@media (min-width: 1280px) {
grid-template-columns: 3fr 9fr;
display: grid;
grid-template-columns: 9fr 3fr;
}
}
&__avatar-col {
order: 2;
order: 1;
@media (min-width: 1024px) {
order: 1;
order: 2;
padding: 0.5rem;
}
}
&__main-col {
order: 1;
order: 2;
@media (min-width: 1024px) {
order: 2;
padding-inline-start: 1.25rem;
order: 1;
padding-inline-end: 1.25rem;
}
}
@@ -28,7 +28,6 @@
v-model="form.message"
name="message"
label="توضیحات خود را وارد نمایید"
placeholder="لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است."
:row="5"
:error="errors.message"
/>
@@ -210,7 +209,7 @@ const onSubmit = async () => {
gap: 1rem;
@media (min-width: 768px) {
grid-template-columns: 1fr 1fr;
grid-template-columns: repeat(12, 1fr);
}
}
@@ -218,6 +217,10 @@ const onSubmit = async () => {
display: flex;
flex-direction: column;
@media (min-width: 768px) {
grid-column: span 3;
}
&--full {
grid-column: 1 / -1;
}
@@ -21,7 +21,7 @@
@show-details="onShowDetails"
/>
</div>
<NoItems v-else title="ترمای نیست" desc="در حال حاضر ترمای در حال گذراندن ندارید." />
<NoItems v-else title="ترمی نیست" desc="در حال حاضر ترمی در حال گذراندن ندارید." />
<PaginationBlock :pagination="currentMeta" @update:page="setCurrentPage" />
</template>
@@ -1,5 +1,5 @@
<template>
<div class="ticket-item">
<div class="ticket-item" :class="{ 'ticket-item--clickable': isMobile }" @click="onItemClick">
<div class="ticket-item__user">
<div v-if="ticket.student?.avatarUrl" class="ticket-item__avatar">
<img :src="ticket.student.avatarUrl" :alt="userName" />
@@ -43,12 +43,12 @@
</template>
<script setup>
import { computed } from 'vue'
import Badge from '@/components/Badge.vue'
import BaseButton from '@/components/BaseButton.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import { TICKET_PRIORITY, TICKET_STATUS } from '@/enums'
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
const STATUS_VARIANT = {
open: 'warning',
@@ -69,6 +69,17 @@ const props = defineProps({
const emit = defineEmits(['show-details'])
const isMobile = ref(window.innerWidth < 1024)
const onResize = () => {
isMobile.value = window.innerWidth < 1024
}
onMounted(() => window.addEventListener('resize', onResize))
onBeforeUnmount(() => window.removeEventListener('resize', onResize))
const onItemClick = () => {
if (isMobile.value) emit('show-details', props.ticket)
}
const userName = computed(() => props.ticket.student?.name || props.ticket.subject || '—')
const statusLabel = computed(() => TICKET_STATUS[props.ticket.status] || '—')
@@ -96,6 +107,10 @@ const createdAt = computed(() => formatJalaaliDate(props.ticket.createdAt) || '
align-items: center;
}
&--clickable {
cursor: pointer;
}
&__user {
display: flex;
align-items: center;
@@ -105,6 +120,7 @@ const createdAt = computed(() => formatJalaaliDate(props.ticket.createdAt) || '
}
&__avatar {
display: none;
width: 3rem;
height: 3rem;
min-width: 3rem;
@@ -112,10 +128,13 @@ const createdAt = computed(() => formatJalaaliDate(props.ticket.createdAt) || '
overflow: hidden;
background: #fff;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
@media (min-width: 1024px) {
display: flex;
}
img {
width: 100%;
height: 100%;
@@ -166,13 +185,14 @@ const createdAt = computed(() => formatJalaaliDate(props.ticket.createdAt) || '
}
&__actions {
display: flex;
display: none;
justify-content: flex-end;
align-items: center;
gap: 0.375rem;
flex: 1 1 100%;
@media (min-width: 1024px) {
display: flex;
flex: 0 0 auto;
}
}
@@ -35,7 +35,6 @@
v-model="form.message"
name="message"
label="توضیحات خودتان را وارد کنید"
placeholder="لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است."
:row="4"
:error="errors.message"
/>
@@ -55,8 +54,8 @@
<footer class="ctm__footer">
<button type="button" class="ctm__cancel" @click="close">
<SvgIcon name="caret-right" :size="16" color="currentColor" />
<span>منصرف شدم</span>
<SvgIcon name="caret-left" :size="16" color="currentColor" />
</button>
<BaseButton
type="submit"
@@ -211,13 +210,17 @@ const onSubmit = async (close) => {
&__footer {
display: flex;
align-items: center;
justify-content: space-between;
justify-content: flex-end;
gap: 1rem;
flex-wrap: wrap;
@media (min-width: 640px) {
justify-content: space-between;
}
}
&__cancel {
display: inline-flex;
display: none;
align-items: center;
gap: 0.375rem;
background: transparent;
@@ -229,6 +232,10 @@ const onSubmit = async (close) => {
font-weight: 500;
color: #969696;
@media (min-width: 640px) {
display: inline-flex;
}
&:hover {
color: #6b6b6b;
}
@@ -6,7 +6,7 @@
desc="در این قسمت می‌توانید تیکت‌های خود را مدیریت کنید"
>
<template #icon>
<SvgIcon name="chat" :size="24" color="var(--color-primary)" />
<SvgIcon name="envelope-open" :size="24" color="var(--color-primary)" />
</template>
</BoxedIconTitleBlock>
@@ -38,7 +38,7 @@
@click="onNewTicket"
>
<template #appendIcon>
<SvgIcon name="plus" :size="16" color="#fff" />
<SvgIcon name="arrow-left" :size="16" color="#fff" />
</template>
</BaseButton>
</div>
@@ -127,7 +127,7 @@ const statusTiles = computed(() => [
{
key: 'all',
image: chatTextPng,
label: 'همه تیکت‌ها',
label: 'تمام تیکت‌ها',
count: stats.value?.all ?? 0,
countColor: '#B6842D',
},