fix
Deploy banu-front / deploy (push) Successful in 1m27s

This commit is contained in:
sajjadtalkhabi
2026-07-07 17:36:43 +03:30
parent b9ef684b51
commit 38a396ba21
89 changed files with 1815 additions and 478 deletions
+90 -15
View File
@@ -3,90 +3,165 @@ export default [
path: '/dashboard',
name: 'student-dashboard',
component: () => import('@/features/student/pages/StudentDashboardPage.vue'),
meta: { layout: 'student', role: 'student', title: 'پیشخوان' },
meta: {
layout: 'student',
role: 'student',
title: 'سلام بر شما',
subtitle: 'به سامانه موسسه بانو خوش آمدید.',
},
},
{
path: '/profile',
name: 'student-profile',
component: () => import('@/features/student/profile/pages/EditProfilePage.vue'),
meta: { layout: 'student', role: 'student', title: 'ویرایش پروفایل' },
meta: {
layout: 'student',
role: 'student',
title: 'پروفایل شما',
subtitle: 'مشخصاتتان را ویرایش نمایید.',
},
},
{
path: '/my-courses',
name: 'student-courses',
component: () => import('@/features/student/courses/pages/StudentCoursesPage.vue'),
meta: { layout: 'student', role: 'student', title: 'دوره‌های من' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-courses/:id',
name: 'student-course-details',
component: () => import('@/features/student/courses/pages/StudentCourseDetailsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'جزئیات دوره' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-terms',
name: 'student-terms',
component: () => import('@/features/student/terms/pages/StudentTermsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'ترم‌های آموزشی' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-terms/:id',
name: 'student-term-details',
component: () => import('@/features/student/terms/pages/StudentTermDetailsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'جزئیات دوره' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-lessons/:id',
name: 'student-lesson-details',
component: () => import('@/features/student/lessons/pages/StudentLessonDetailsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'جزئیات درس' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-sessions/:id',
name: 'student-session-details',
component: () => import('@/features/student/sessions/pages/StudentSessionDetailsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'جزئیات جلسه' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-exams/:id',
name: 'student-exam',
component: () => import('@/features/student/exams/pages/StudentExamPage.vue'),
meta: { layout: 'student', role: 'student', title: 'آزمون' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/my-exams/:id/take',
name: 'student-take-exam',
component: () => import('@/features/student/exams/pages/StudentTakeExamPage.vue'),
meta: { layout: 'student', role: 'student', title: 'شروع آزمون' },
meta: {
layout: 'student',
role: 'student',
title: 'یادگیری شما',
subtitle: 'مهارت‌ها و دوره‌های خود را دنبال کنید.',
},
},
{
path: '/missionary',
name: 'student-missionary',
component: () => import('@/features/student/missionary/pages/StudentMissionaryPage.vue'),
meta: { layout: 'student', role: 'student', title: 'سامانه اعزام' },
meta: {
layout: 'student',
role: 'student',
title: 'سیستم مدیریت اعزام',
subtitle: 'ساده‌ترین راه برای برنامه‌ریزی و پایش مأموریت‌ها',
},
},
{
path: '/user/services',
name: 'student-services',
component: () => import('@/features/student/services/pages/StudentServicesPage.vue'),
meta: { layout: 'student', role: 'student', title: 'خدمات' },
meta: {
layout: 'student',
role: 'student',
title: 'درخواست خدمت',
subtitle: 'فقط یک مرحله تا شروع کار شما.',
},
},
{
path: '/user/consultants',
name: 'student-consultants',
component: () => import('@/features/student/consultants/pages/StudentConsultantsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'مشاوره' },
meta: {
layout: 'student',
role: 'student',
title: 'مشاوره سریع',
subtitle: 'چند ثانیه برای دریافت مشاوره کافیست.',
},
},
{
path: '/user/certificates',
name: 'student-certificates',
component: () => import('@/features/student/certificates/pages/StudentCertificatesPage.vue'),
meta: { layout: 'student', role: 'student', title: 'گواهینامه ها' },
meta: {
layout: 'student',
role: 'student',
title: 'گواهینامه معتبر',
subtitle: 'نشان اعتماد و تخصص ما در هر حوزه',
},
},
{
path: '/my-tickets',
name: 'student-tickets',
component: () => import('@/features/student/tickets/pages/StudentTicketsPage.vue'),
meta: { layout: 'student', role: 'student', title: 'تیکت‌های من' },
meta: {
layout: 'student',
role: 'student',
title: 'تیکت‌های شما',
subtitle: 'اینجا پل ارتباطی شما با پشتیبانی است.',
},
},
]
@@ -14,7 +14,17 @@
</div>
<SkeletonLoaderBlock v-if="isLoading && !ticket" :rows="3" :cols-per-row="1" />
<div v-else-if="messages.length > 0" ref="thread" class="ticket-details__thread">
<div
v-else-if="messages.length > 0 || ticketMedia.length > 0"
ref="thread"
class="ticket-details__thread"
>
<div v-if="ticketMedia.length > 0" class="ticket-details__row ticket-details__row--self">
<div class="ticket-details__bubble">
<MessageAttachments :media="ticketMedia" />
<span class="ticket-details__time">{{ messageTime(ticket) }}</span>
</div>
</div>
<div
v-for="message in messages"
:key="message.id"
@@ -22,6 +32,7 @@
:class="`ticket-details__row--${senderClass(message)}`"
>
<div class="ticket-details__bubble">
<MessageAttachments v-if="message.media?.length" :media="message.media" />
<p class="ticket-details__text">{{ message.message }}</p>
<span class="ticket-details__time">{{ messageTime(message) }}</span>
</div>
@@ -60,6 +71,7 @@ import BasicModal from '@/components/BasicModal.vue'
import SvgIcon from '@/components/icons/SvgIcon.vue'
import NoItems from '@/components/blocks/NoItems.vue'
import { formatJalaaliDate } from '@/utils/date-utils'
import MessageAttachments from '@/components/blocks/MessageAttachments.vue'
import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue'
import {
studentTicketsKeys,
@@ -81,6 +93,8 @@ const { data: ticket, isLoading } = useStudentTicketQuery(ticketId, {
const messages = computed(() => ticket.value?.messages ?? [])
const ticketMedia = computed(() => ticket.value?.media ?? [])
const ticketDate = computed(() => formatJalaaliDate(ticket.value?.createdAt) || '—')
// Student viewing their own ticket — their own messages get the highlighted