From c82701888ae2f4646cb1a704a06cc9d029470ee3 Mon Sep 17 00:00:00 2001 From: sajjadtalkhabi <97734061+sajjadtalkhabi@users.noreply.github.com> Date: Fri, 15 May 2026 17:12:51 +0330 Subject: [PATCH] fix --- .eslintrc.cjs | 2 +- jsconfig.json | 2 + package-lock.json | 26 ++ package.json | 2 + scripts/vite-icon-names.js | 52 +++ src/assets/icons/chat-centered-dots.svg | 13 + src/assets/icons/heart.svg | 10 + src/assets/icons/link.svg | 4 + src/assets/icons/map-pin-simple-area.svg | 12 + src/assets/icons/microphone.svg | 12 + src/assets/icons/mood.svg | 2 +- src/assets/icons/paper-plane-right.svg | 2 +- src/assets/icons/scroll.svg | 13 + src/components/BaseButton.vue | 1 + src/components/blocks/TabsBlock.vue | 144 ++++-- src/components/blocks/VideoPlayerBlock.vue | 95 ++++ src/components/form/CheckboxField.vue | 79 ++++ src/components/form/ImageUploader.vue | 231 ++++++++++ src/components/form/VoiceRecorder.vue | 422 ++++++++++++++++++ src/components/icons/SvgIcon.vue | 6 +- src/components/icons/icon-names.d.ts | 48 ++ .../admin/courses/pages/CoursesListPage.vue | 73 +-- .../components/CertificateItem.vue | 236 ++++++++++ .../pages/StudentCertificatesPage.vue | 94 ++++ .../consultants/components/ConsultantItem.vue | 107 +++++ .../components/RequestConsultantForm.vue | 141 ++++++ .../pages/StudentConsultantsPage.vue | 110 +++++ .../components/StudentCourseItem.vue | 0 .../pages/StudentCourseDetailsPage.vue | 0 .../pages/StudentCoursesPage.vue | 2 +- .../components/StudentExamAttemptItem.vue | 147 ++++++ .../exams/components/StudentExamItem.vue | 143 ++++++ .../exams/components/StudentExamQuestion.vue | 66 +++ .../exams/components/StudentExamSummary.vue | 216 +++++++++ .../student/exams/pages/StudentExamPage.vue | 117 +++++ .../exams/pages/StudentTakeExamPage.vue | 258 +++++++++++ .../lessons/components/StudentLessonItem.vue | 190 ++++++++ .../pages/StudentLessonDetailsPage.vue | 226 ++++++++++ .../components/MissionaryDispatchItem.vue | 174 ++++++++ .../components/MissionaryNarrativeItem.vue | 177 ++++++++ .../components/MissionaryRequestItem.vue | 257 +++++++++++ .../components/MissionaryUserCard.vue | 257 +++++++++++ .../modals/DispatchDetailsModal.vue | 72 +++ .../modals/NarrativeDetailsModal.vue | 123 +++++ .../components/modals/RequestDetailsModal.vue | 71 +++ .../pages/StudentMissionaryPage.vue | 203 +++++++++ .../{ => profile}/pages/EditProfilePage.vue | 2 +- .../student/{ => profile}/schema/index.js | 0 src/features/student/router.js | 66 ++- .../services/components/CreateServiceForm.vue | 251 +++++++++++ .../services/components/ServiceItem.vue | 106 +++++ .../services/pages/StudentServicesPage.vue | 116 +++++ .../components/StudentSessionItem.vue | 162 +++++++ .../pages/StudentSessionDetailsPage.vue | 306 +++++++++++++ .../terms/components/StudentTermItem.vue | 280 ++++++++++++ .../terms/components/StudentTermSummary.vue | 227 ++++++++++ .../terms/pages/StudentTermDetailsPage.vue | 77 ++++ .../student/terms/pages/StudentTermsPage.vue | 128 ++++++ src/global-components/Badge.vue | 137 ++++++ src/global-components/Tinymce.vue | 120 +++++ src/layouts/StudentLayout.vue | 36 ++ src/layouts/sidebars/StudentSidebar.vue | 6 +- src/plugins/tinymce/importTinymce.js | 35 ++ src/plugins/tinymce/langs/fa_IR.js | 392 ++++++++++++++++ src/plugins/tinymce/tinymce.js | 30 ++ src/services/api/endpoints.js | 25 ++ src/services/api/student-certificates.js | 8 + src/services/api/student-consultants.js | 10 + src/services/api/student-exams.js | 10 + src/services/api/student-lessons.js | 4 + src/services/api/student-missionary.js | 13 + src/services/api/student-services.js | 12 + src/services/api/student-sessions.js | 8 + src/services/api/student-terms.js | 6 + src/services/mock/fixtures/profile.js | 2 +- .../mock/fixtures/student-certificates.js | 32 ++ .../mock/fixtures/student-consultants.js | 50 +++ src/services/mock/fixtures/student-exams.js | 94 ++++ src/services/mock/fixtures/student-lessons.js | 93 ++++ .../mock/fixtures/student-missionary.js | 157 +++++++ .../mock/fixtures/student-services.js | 61 +++ .../mock/fixtures/student-sessions.js | 14 + src/services/mock/fixtures/student-terms.js | 75 ++++ .../mock/routes/student-certificates.js | 15 + .../mock/routes/student-consultants.js | 29 ++ src/services/mock/routes/student-exams.js | 27 ++ src/services/mock/routes/student-lessons.js | 11 + .../mock/routes/student-missionary.js | 21 + src/services/mock/routes/student-services.js | 33 ++ src/services/mock/routes/student-sessions.js | 14 + src/services/mock/routes/student-terms.js | 21 + src/services/query/student-certificates.js | 25 ++ src/services/query/student-consultants.js | 35 ++ src/services/query/student-exams.js | 26 ++ src/services/query/student-lessons.js | 14 + src/services/query/student-missionary.js | 56 +++ src/services/query/student-services.js | 45 ++ src/services/query/student-sessions.js | 22 + src/services/query/student-terms.js | 28 ++ src/styles/plugins/tinymce.css | 7 + vite.config.js | 3 +- 101 files changed, 8125 insertions(+), 96 deletions(-) create mode 100644 scripts/vite-icon-names.js create mode 100644 src/assets/icons/chat-centered-dots.svg create mode 100644 src/assets/icons/heart.svg create mode 100644 src/assets/icons/link.svg create mode 100644 src/assets/icons/map-pin-simple-area.svg create mode 100644 src/assets/icons/microphone.svg create mode 100644 src/assets/icons/scroll.svg create mode 100644 src/components/blocks/VideoPlayerBlock.vue create mode 100644 src/components/form/CheckboxField.vue create mode 100644 src/components/form/ImageUploader.vue create mode 100644 src/components/form/VoiceRecorder.vue create mode 100644 src/components/icons/icon-names.d.ts create mode 100644 src/features/student/certificates/components/CertificateItem.vue create mode 100644 src/features/student/certificates/pages/StudentCertificatesPage.vue create mode 100644 src/features/student/consultants/components/ConsultantItem.vue create mode 100644 src/features/student/consultants/components/RequestConsultantForm.vue create mode 100644 src/features/student/consultants/pages/StudentConsultantsPage.vue rename src/features/student/{ => courses}/components/StudentCourseItem.vue (100%) rename src/features/student/{ => courses}/pages/StudentCourseDetailsPage.vue (100%) rename src/features/student/{ => courses}/pages/StudentCoursesPage.vue (97%) create mode 100644 src/features/student/exams/components/StudentExamAttemptItem.vue create mode 100644 src/features/student/exams/components/StudentExamItem.vue create mode 100644 src/features/student/exams/components/StudentExamQuestion.vue create mode 100644 src/features/student/exams/components/StudentExamSummary.vue create mode 100644 src/features/student/exams/pages/StudentExamPage.vue create mode 100644 src/features/student/exams/pages/StudentTakeExamPage.vue create mode 100644 src/features/student/lessons/components/StudentLessonItem.vue create mode 100644 src/features/student/lessons/pages/StudentLessonDetailsPage.vue create mode 100644 src/features/student/missionary/components/MissionaryDispatchItem.vue create mode 100644 src/features/student/missionary/components/MissionaryNarrativeItem.vue create mode 100644 src/features/student/missionary/components/MissionaryRequestItem.vue create mode 100644 src/features/student/missionary/components/MissionaryUserCard.vue create mode 100644 src/features/student/missionary/components/modals/DispatchDetailsModal.vue create mode 100644 src/features/student/missionary/components/modals/NarrativeDetailsModal.vue create mode 100644 src/features/student/missionary/components/modals/RequestDetailsModal.vue create mode 100644 src/features/student/missionary/pages/StudentMissionaryPage.vue rename src/features/student/{ => profile}/pages/EditProfilePage.vue (99%) rename src/features/student/{ => profile}/schema/index.js (100%) create mode 100644 src/features/student/services/components/CreateServiceForm.vue create mode 100644 src/features/student/services/components/ServiceItem.vue create mode 100644 src/features/student/services/pages/StudentServicesPage.vue create mode 100644 src/features/student/sessions/components/StudentSessionItem.vue create mode 100644 src/features/student/sessions/pages/StudentSessionDetailsPage.vue create mode 100644 src/features/student/terms/components/StudentTermItem.vue create mode 100644 src/features/student/terms/components/StudentTermSummary.vue create mode 100644 src/features/student/terms/pages/StudentTermDetailsPage.vue create mode 100644 src/features/student/terms/pages/StudentTermsPage.vue create mode 100644 src/global-components/Badge.vue create mode 100644 src/global-components/Tinymce.vue create mode 100644 src/plugins/tinymce/importTinymce.js create mode 100644 src/plugins/tinymce/langs/fa_IR.js create mode 100644 src/plugins/tinymce/tinymce.js create mode 100644 src/services/api/student-certificates.js create mode 100644 src/services/api/student-consultants.js create mode 100644 src/services/api/student-exams.js create mode 100644 src/services/api/student-lessons.js create mode 100644 src/services/api/student-missionary.js create mode 100644 src/services/api/student-services.js create mode 100644 src/services/api/student-sessions.js create mode 100644 src/services/api/student-terms.js create mode 100644 src/services/mock/fixtures/student-certificates.js create mode 100644 src/services/mock/fixtures/student-consultants.js create mode 100644 src/services/mock/fixtures/student-exams.js create mode 100644 src/services/mock/fixtures/student-lessons.js create mode 100644 src/services/mock/fixtures/student-missionary.js create mode 100644 src/services/mock/fixtures/student-services.js create mode 100644 src/services/mock/fixtures/student-sessions.js create mode 100644 src/services/mock/fixtures/student-terms.js create mode 100644 src/services/mock/routes/student-certificates.js create mode 100644 src/services/mock/routes/student-consultants.js create mode 100644 src/services/mock/routes/student-exams.js create mode 100644 src/services/mock/routes/student-lessons.js create mode 100644 src/services/mock/routes/student-missionary.js create mode 100644 src/services/mock/routes/student-services.js create mode 100644 src/services/mock/routes/student-sessions.js create mode 100644 src/services/mock/routes/student-terms.js create mode 100644 src/services/query/student-certificates.js create mode 100644 src/services/query/student-consultants.js create mode 100644 src/services/query/student-exams.js create mode 100644 src/services/query/student-lessons.js create mode 100644 src/services/query/student-missionary.js create mode 100644 src/services/query/student-services.js create mode 100644 src/services/query/student-sessions.js create mode 100644 src/services/query/student-terms.js create mode 100644 src/styles/plugins/tinymce.css diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 8f04671..9640921 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -6,7 +6,7 @@ module.exports = { es2021: true, }, plugins: ['prettier', 'unicorn', 'import', 'waterfall'], - ignorePatterns: ['node_modules/', 'dist/', 'build/', '*.min.js'], + ignorePatterns: ['node_modules/', 'dist/', 'build/', '*.min.js', 'src/components/icons/icon-names.d.ts'], parserOptions: { ecmaVersion: 2021, sourceType: 'module', diff --git a/jsconfig.json b/jsconfig.json index 686295e..85cbc8d 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,9 +1,11 @@ { "compilerOptions": { "baseUrl": ".", + "checkJs": false, "paths": { "@/*": ["src/*"] } }, + "include": ["src/**/*", "src/**/*.d.ts"], "exclude": ["node_modules", "dist"] } diff --git a/package-lock.json b/package-lock.json index 08f0882..fd14004 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,11 @@ "@floating-ui/dom": "^1.7.6", "@tanstack/vue-query": "^5.62.2", "@tanstack/vue-query-devtools": "^5.62.2", + "@tinymce/tinymce-vue": "^4.0.7", "axios": "^1.12.2", "lodash": "^4.18.1", "pinia": "^3.0.3", + "tinymce": "^8.5.0", "vue": "^3.5.21", "vue-advanced-cropper": "^2.8.9", "vue-router": "^4.5.1", @@ -1671,6 +1673,24 @@ } } }, + "node_modules/@tinymce/tinymce-vue": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-4.0.7.tgz", + "integrity": "sha512-1esB8wGWrjPCY+rK8vy3QB1cxwXo7HLJWuNrcyPl6LOVR+QJjub0OiV/C+TUEsLN6OpCtRv+QnIqMC5vXz783Q==", + "license": "Apache-2.0", + "dependencies": { + "tinymce": "^5.5.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@tinymce/tinymce-vue/node_modules/tinymce": { + "version": "5.10.9", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.9.tgz", + "integrity": "sha512-5bkrors87X9LhYX2xq8GgPHrIgJYHl87YNs+kBcjQ5I3CiUgzo/vFcGvT3MZQ9QHsEeYMhYO6a5CLGGffR8hMg==", + "license": "LGPL-2.1" + }, "node_modules/@types/esrecurse": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", @@ -7201,6 +7221,12 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinymce": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-8.5.0.tgz", + "integrity": "sha512-DnKEfPNQnOJc8Ca1roZBs/GSbkAZyIIbC4p8eHZyZQi85OSAXtiVNYMaRxo4mzsGKpa0sA4/Us4KXQkX8q7w2A==", + "license": "SEE LICENSE IN license.md" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 0297ccd..bc83a12 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,11 @@ "@floating-ui/dom": "^1.7.6", "@tanstack/vue-query": "^5.62.2", "@tanstack/vue-query-devtools": "^5.62.2", + "@tinymce/tinymce-vue": "^4.0.7", "axios": "^1.12.2", "lodash": "^4.18.1", "pinia": "^3.0.3", + "tinymce": "^8.5.0", "vue": "^3.5.21", "vue-advanced-cropper": "^2.8.9", "vue-router": "^4.5.1", diff --git a/scripts/vite-icon-names.js b/scripts/vite-icon-names.js new file mode 100644 index 0000000..1ec9211 --- /dev/null +++ b/scripts/vite-icon-names.js @@ -0,0 +1,52 @@ +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const ICONS_DIR = path.resolve(__dirname, '../src/assets/icons') +const OUTPUT_FILE = path.resolve(__dirname, '../src/components/icons/icon-names.d.ts') + +const readNames = () => + fs + .readdirSync(ICONS_DIR) + .filter((f) => f.endsWith('.svg')) + .map((f) => f.replace(/\.svg$/, '')) + .sort() + +const buildContent = (names) => { + const union = names.length > 0 ? names.map((n) => ` | '${n}'`).join('\n') : ' | never' + return `// AUTO-GENERATED — do not edit by hand. +// Regenerated whenever src/assets/icons/*.svg changes (via scripts/vite-icon-names.js). + +export type IconName = +${union} + +export const iconNames: readonly IconName[] +` +} + +const writeIfChanged = () => { + const content = buildContent(readNames()) + const prev = fs.existsSync(OUTPUT_FILE) ? fs.readFileSync(OUTPUT_FILE, 'utf8') : '' + if (prev !== content) fs.writeFileSync(OUTPUT_FILE, content) +} + +export default function viteIconNames() { + return { + name: 'vite-icon-names', + buildStart() { + writeIfChanged() + }, + configureServer(server) { + writeIfChanged() + server.watcher.add(path.join(ICONS_DIR, '*.svg')) + const handler = (file) => { + if (file.startsWith(ICONS_DIR) && file.endsWith('.svg')) writeIfChanged() + } + server.watcher.on('add', handler) + server.watcher.on('unlink', handler) + }, + } +} + +export { writeIfChanged as generateIconNames } diff --git a/src/assets/icons/chat-centered-dots.svg b/src/assets/icons/chat-centered-dots.svg new file mode 100644 index 0000000..36aeefa --- /dev/null +++ b/src/assets/icons/chat-centered-dots.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/heart.svg b/src/assets/icons/heart.svg new file mode 100644 index 0000000..9857326 --- /dev/null +++ b/src/assets/icons/heart.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/link.svg b/src/assets/icons/link.svg new file mode 100644 index 0000000..1eba376 --- /dev/null +++ b/src/assets/icons/link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/map-pin-simple-area.svg b/src/assets/icons/map-pin-simple-area.svg new file mode 100644 index 0000000..d118d44 --- /dev/null +++ b/src/assets/icons/map-pin-simple-area.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/icons/microphone.svg b/src/assets/icons/microphone.svg new file mode 100644 index 0000000..cc7f90d --- /dev/null +++ b/src/assets/icons/microphone.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/icons/mood.svg b/src/assets/icons/mood.svg index e146bf6..4c152d5 100644 --- a/src/assets/icons/mood.svg +++ b/src/assets/icons/mood.svg @@ -1,3 +1,3 @@ - + diff --git a/src/assets/icons/paper-plane-right.svg b/src/assets/icons/paper-plane-right.svg index 64b1606..8200eed 100644 --- a/src/assets/icons/paper-plane-right.svg +++ b/src/assets/icons/paper-plane-right.svg @@ -1,4 +1,4 @@ - + diff --git a/src/assets/icons/scroll.svg b/src/assets/icons/scroll.svg new file mode 100644 index 0000000..fc05661 --- /dev/null +++ b/src/assets/icons/scroll.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/components/BaseButton.vue b/src/components/BaseButton.vue index f203790..8d0b7b4 100644 --- a/src/components/BaseButton.vue +++ b/src/components/BaseButton.vue @@ -79,6 +79,7 @@ const handleClick = (event) => { font-family: var(--font-family-fa); text-decoration: none; padding: 0 1rem; + white-space: nowrap; &__text { line-height: 1.25rem; diff --git a/src/components/blocks/TabsBlock.vue b/src/components/blocks/TabsBlock.vue index 70d8cfa..281d142 100644 --- a/src/components/blocks/TabsBlock.vue +++ b/src/components/blocks/TabsBlock.vue @@ -1,23 +1,57 @@ - + + + + {{ tab.label }} + + + + + - - {{ tab.label }} - + + + + + + + + + + + + + + + @@ -26,7 +60,7 @@ diff --git a/src/components/form/CheckboxField.vue b/src/components/form/CheckboxField.vue new file mode 100644 index 0000000..cf3a19e --- /dev/null +++ b/src/components/form/CheckboxField.vue @@ -0,0 +1,79 @@ + + + + {{ label }} + + + + + + + diff --git a/src/components/form/ImageUploader.vue b/src/components/form/ImageUploader.vue new file mode 100644 index 0000000..105ea10 --- /dev/null +++ b/src/components/form/ImageUploader.vue @@ -0,0 +1,231 @@ + + + + + + + + + + + {{ fileName }} + + + + + + + + + + + + + + {{ error }} + + + + + + diff --git a/src/components/form/VoiceRecorder.vue b/src/components/form/VoiceRecorder.vue new file mode 100644 index 0000000..d13ab3b --- /dev/null +++ b/src/components/form/VoiceRecorder.vue @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + + در حال ضبط... + {{ formattedTime }} + + + + + + + + + + + + + + + + + + + + {{ error }} + + + + + + + + diff --git a/src/components/icons/SvgIcon.vue b/src/components/icons/SvgIcon.vue index 4bdac10..fc37433 100644 --- a/src/components/icons/SvgIcon.vue +++ b/src/components/icons/SvgIcon.vue @@ -14,10 +14,13 @@ import { computed } from 'vue' import { iconRegistry } from '@/components/icons/registry' +/** @typedef {import('@/components/icons/icon-names').IconName} IconName */ + const props = defineProps({ + /** @type {import('vue').PropType} */ name: { type: String, required: true }, size: { type: [String, Number], default: '1.25rem' }, - color: { type: String, default: 'currentColor' }, + color: { type: String, default: 'transparent' }, }) const component = computed(() => { @@ -25,6 +28,7 @@ const component = computed(() => { if (!c && import.meta.env.DEV) { console.warn(`[SvgIcon] unknown icon "${props.name}"`) } + return c }) diff --git a/src/components/icons/icon-names.d.ts b/src/components/icons/icon-names.d.ts new file mode 100644 index 0000000..c261638 --- /dev/null +++ b/src/components/icons/icon-names.d.ts @@ -0,0 +1,48 @@ +// AUTO-GENERATED — do not edit by hand. +// Regenerated whenever src/assets/icons/*.svg changes (via scripts/vite-icon-names.js). + +export type IconName = + | 'arrow-left' + | 'arrows-clockwise' + | 'attach-file' + | 'bell' + | 'book' + | 'calendar' + | 'caret-down' + | 'caret-left' + | 'caret-right' + | 'chat' + | 'chat-centered-dots' + | 'check' + | 'check-square' + | 'close' + | 'copy' + | 'eye' + | 'eye-slash' + | 'file' + | 'funnel' + | 'heart' + | 'instagram' + | 'link' + | 'list-bullets' + | 'map-pin-simple-area' + | 'menu' + | 'microphone' + | 'mood' + | 'paper-plane' + | 'paper-plane-right' + | 'pencil' + | 'phone' + | 'plus' + | 'scroll' + | 'spinner' + | 'square' + | 'telegram' + | 'trash' + | 'upload' + | 'user' + | 'users' + | 'users-three' + | 'warning' + +export const iconNames: readonly IconName[] diff --git a/src/features/admin/courses/pages/CoursesListPage.vue b/src/features/admin/courses/pages/CoursesListPage.vue index 752817a..f38afe4 100644 --- a/src/features/admin/courses/pages/CoursesListPage.vue +++ b/src/features/admin/courses/pages/CoursesListPage.vue @@ -17,26 +17,6 @@ @reset="onFilterReset" /> - - - - - - - - - - - - - @@ -85,7 +65,6 @@ import { computed, ref } from 'vue' import { useRouter } from 'vue-router' import useModal from '@/composables/useModal' import { useQueryClient } from '@tanstack/vue-query' -import BaseButton from '@/components/BaseButton.vue' import SvgIcon from '@/components/icons/SvgIcon.vue' import NoItems from '@/components/blocks/NoItems.vue' import TabsBlock from '@/components/blocks/TabsBlock.vue' @@ -94,7 +73,6 @@ import PaginationBlock from '@/components/blocks/PaginationBlock.vue' import CourseItem from '@/features/admin/courses/components/CourseItem.vue' import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue' import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue' -import SimpleTitleIconBlock from '@/components/blocks/SimpleTitleIconBlock.vue' import CoursesFilters from '@/features/admin/courses/components/CoursesFilters.vue' import CourseDetailsModal from '@/features/admin/courses/components/modals/CourseDetailsModal.vue' import AddOfferedCourseModal from '@/features/admin/courses/components/modals/AddOfferedCourseModal.vue' @@ -117,9 +95,31 @@ const router = useRouter() const queryClient = useQueryClient() const { openModal, isModal } = useModal() +const onAdd = () => { + if (activeTab.value === 'templates') { + router.push({ name: 'admin-add-course-template' }).catch(() => {}) + } else { + openModal('AddOfferedCourseModal', { mode: 'add' }) + } +} + const tabs = [ - { name: 'templates', label: 'دورههای الگو', icon: 'list-bullets' }, - { name: 'offered', label: 'دورههای ارائه شده', icon: 'list-bullets' }, + { + name: 'templates', + label: 'دورههای الگو', + icon: 'list-bullets', + hasButton: true, + textButton: 'افزودن دوره الگوی جدید', + buttonAction: onAdd, + }, + { + name: 'offered', + label: 'دورههای ارائه شده', + icon: 'list-bullets', + hasButton: true, + textButton: 'افزودن دوره ارائه شده جدید', + buttonAction: onAdd, + }, ] const activeTab = ref('templates') @@ -188,14 +188,6 @@ const onFilterApply = () => { } const onFilterReset = onFilterApply -const onAdd = () => { - if (activeTab.value === 'templates') { - router.push({ name: 'admin-add-course-template' }).catch(() => {}) - } else { - openModal('AddOfferedCourseModal', { mode: 'add' }) - } -} - const onEditTemplate = (course) => { router.push({ name: 'admin-edit-course-template', params: { id: course.id } }).catch(() => {}) } @@ -261,22 +253,5 @@ const onChangeOfferedStatus = ({ id, isActive }) => { &__heading { margin-bottom: 0.75rem; } - - &__list-header { - display: flex; - align-items: center; - gap: 0.625rem; - margin-bottom: 0.375rem; - } - - &__list-title { - flex: 1; - margin-bottom: 0; - } - - &__add-btn { - min-width: fit-content; - padding: 0 1.25rem; - } } diff --git a/src/features/student/certificates/components/CertificateItem.vue b/src/features/student/certificates/components/CertificateItem.vue new file mode 100644 index 0000000..e65c76a --- /dev/null +++ b/src/features/student/certificates/components/CertificateItem.vue @@ -0,0 +1,236 @@ + + + + + + + + + {{ courseTitle }} + + + استاد : + {{ teacherName }} + + + + + + + تاریخ شروع : + {{ certificate.startDate || '—' }} + + + + تاریخ پایان : + {{ certificate.endDate || '—' }} + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/certificates/pages/StudentCertificatesPage.vue b/src/features/student/certificates/pages/StudentCertificatesPage.vue new file mode 100644 index 0000000..2e4bb11 --- /dev/null +++ b/src/features/student/certificates/pages/StudentCertificatesPage.vue @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/consultants/components/ConsultantItem.vue b/src/features/student/consultants/components/ConsultantItem.vue new file mode 100644 index 0000000..7312e28 --- /dev/null +++ b/src/features/student/consultants/components/ConsultantItem.vue @@ -0,0 +1,107 @@ + + + + {{ consultant.title }} + شماره درخواست : {{ consultant.requestNumber }} + + + + + + + + + + + + diff --git a/src/features/student/consultants/components/RequestConsultantForm.vue b/src/features/student/consultants/components/RequestConsultantForm.vue new file mode 100644 index 0000000..b0b7b11 --- /dev/null +++ b/src/features/student/consultants/components/RequestConsultantForm.vue @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/consultants/pages/StudentConsultantsPage.vue b/src/features/student/consultants/pages/StudentConsultantsPage.vue new file mode 100644 index 0000000..cfd0463 --- /dev/null +++ b/src/features/student/consultants/pages/StudentConsultantsPage.vue @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/components/StudentCourseItem.vue b/src/features/student/courses/components/StudentCourseItem.vue similarity index 100% rename from src/features/student/components/StudentCourseItem.vue rename to src/features/student/courses/components/StudentCourseItem.vue diff --git a/src/features/student/pages/StudentCourseDetailsPage.vue b/src/features/student/courses/pages/StudentCourseDetailsPage.vue similarity index 100% rename from src/features/student/pages/StudentCourseDetailsPage.vue rename to src/features/student/courses/pages/StudentCourseDetailsPage.vue diff --git a/src/features/student/pages/StudentCoursesPage.vue b/src/features/student/courses/pages/StudentCoursesPage.vue similarity index 97% rename from src/features/student/pages/StudentCoursesPage.vue rename to src/features/student/courses/pages/StudentCoursesPage.vue index 1230635..02fd7f7 100644 --- a/src/features/student/pages/StudentCoursesPage.vue +++ b/src/features/student/courses/pages/StudentCoursesPage.vue @@ -53,7 +53,7 @@ import PaginationBlock from '@/components/blocks/PaginationBlock.vue' import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue' import SkeletonLoaderBlock from '@/components/blocks/SkeletonLoaderBlock.vue' import { useStudentCoursesListQuery } from '@/services/query/student-courses' -import StudentCourseItem from '@/features/student/components/StudentCourseItem.vue' +import StudentCourseItem from '@/features/student/courses/components/StudentCourseItem.vue' const router = useRouter() diff --git a/src/features/student/exams/components/StudentExamAttemptItem.vue b/src/features/student/exams/components/StudentExamAttemptItem.vue new file mode 100644 index 0000000..f3d3718 --- /dev/null +++ b/src/features/student/exams/components/StudentExamAttemptItem.vue @@ -0,0 +1,147 @@ + + + {{ attempt.title || 'آزمون' }} + + + + + نمره : + {{ scoreText }} + + + + زمان آزمون : + {{ dateText }} + + + + وضعیت : + {{ statusLabel }} + + + + + + + + diff --git a/src/features/student/exams/components/StudentExamItem.vue b/src/features/student/exams/components/StudentExamItem.vue new file mode 100644 index 0000000..4d47686 --- /dev/null +++ b/src/features/student/exams/components/StudentExamItem.vue @@ -0,0 +1,143 @@ + + + {{ exam.title || '—' }} + + + + {{ durationText }} + مدت آزمون : + + + + نمره قبولی : + {{ passingScoreText }} + + + + تعداد سوال : + {{ questionsCountText }} + + + + + + + + + + + + + + + + + diff --git a/src/features/student/exams/components/StudentExamQuestion.vue b/src/features/student/exams/components/StudentExamQuestion.vue new file mode 100644 index 0000000..41931f8 --- /dev/null +++ b/src/features/student/exams/components/StudentExamQuestion.vue @@ -0,0 +1,66 @@ + + + {{ orderText }}{{ question.title }} + + + + + + + + + + diff --git a/src/features/student/exams/components/StudentExamSummary.vue b/src/features/student/exams/components/StudentExamSummary.vue new file mode 100644 index 0000000..f8db601 --- /dev/null +++ b/src/features/student/exams/components/StudentExamSummary.vue @@ -0,0 +1,216 @@ + + + + {{ exam.title || '—' }} + + + + + تعداد آزمونها : + {{ attemptsCountText }} + + + + تعداد سوال : + {{ questionsCountText }} + + + + نمره قبولی : + {{ passingScoreText }} + + + + مدت آزمون : + {{ durationText }} + + + وضعیت : + {{ statusLabel }} + + + + + + + + + + + + + + + + + diff --git a/src/features/student/exams/pages/StudentExamPage.vue b/src/features/student/exams/pages/StudentExamPage.vue new file mode 100644 index 0000000..629801d --- /dev/null +++ b/src/features/student/exams/pages/StudentExamPage.vue @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + دانشجوی گرامی + شما تاکنون هیچ آزمونی را به شروع نکرده اید. + + + + + + + diff --git a/src/features/student/exams/pages/StudentTakeExamPage.vue b/src/features/student/exams/pages/StudentTakeExamPage.vue new file mode 100644 index 0000000..9e3dceb --- /dev/null +++ b/src/features/student/exams/pages/StudentTakeExamPage.vue @@ -0,0 +1,258 @@ + + + + + + + + + + + زمان باقی مانده : + {{ timerText }} + + + + + + + + onAnswer(question.id, value)" + /> + + + + + + + + + + + + + + + + diff --git a/src/features/student/lessons/components/StudentLessonItem.vue b/src/features/student/lessons/components/StudentLessonItem.vue new file mode 100644 index 0000000..c336f1c --- /dev/null +++ b/src/features/student/lessons/components/StudentLessonItem.vue @@ -0,0 +1,190 @@ + + + + + + + {{ lesson.title || '—' }} + + + + + + تعداد دانشجویان : + {{ studentsText }} + + + + تعداد آزمون : + {{ quizzesText }} + + + + تعداد جلسات : + {{ sessionsText }} + + + + + + زمان یادگیری : + {{ hoursText }} + + + + + + + + + + + + + + + diff --git a/src/features/student/lessons/pages/StudentLessonDetailsPage.vue b/src/features/student/lessons/pages/StudentLessonDetailsPage.vue new file mode 100644 index 0000000..93cad58 --- /dev/null +++ b/src/features/student/lessons/pages/StudentLessonDetailsPage.vue @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + {{ lesson.title || '—' }} + + + + تعداد دانشجویان : + + {{ studentsText }} + + + + + تعداد آزمون : + + {{ quizzesText }} + + + + + تعداد جلسات : + + {{ sessionsText }} + + + + + تاریخ پایان : + {{ endDateText }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/MissionaryDispatchItem.vue b/src/features/student/missionary/components/MissionaryDispatchItem.vue new file mode 100644 index 0000000..f495d05 --- /dev/null +++ b/src/features/student/missionary/components/MissionaryDispatchItem.vue @@ -0,0 +1,174 @@ + + + + {{ dispatch.code }} + + {{ dispatch.title }} + + + {{ dispatch.location }} + + + + + + + تاریخ اعزام : + {{ dispatch.dispatchDate }} + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/MissionaryNarrativeItem.vue b/src/features/student/missionary/components/MissionaryNarrativeItem.vue new file mode 100644 index 0000000..ba1ba3d --- /dev/null +++ b/src/features/student/missionary/components/MissionaryNarrativeItem.vue @@ -0,0 +1,177 @@ + + + + {{ narrative.code }} + + {{ narrative.title }} + تاریخ ثبت: {{ narrative.submittedAt }} + + + + + + روایت : + {{ narrative.kindLabel }} + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/MissionaryRequestItem.vue b/src/features/student/missionary/components/MissionaryRequestItem.vue new file mode 100644 index 0000000..8739bee --- /dev/null +++ b/src/features/student/missionary/components/MissionaryRequestItem.vue @@ -0,0 +1,257 @@ + + + + {{ request.code }} + + {{ request.title }} + شماره درخواست : {{ request.requestNumber }} + + + + + + تاریخ درخواست : + {{ request.requestDate }} + + + نام درخواست کننده : + {{ request.requesterName }} + + + + {{ request.statusLabel }} + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/MissionaryUserCard.vue b/src/features/student/missionary/components/MissionaryUserCard.vue new file mode 100644 index 0000000..9669b7b --- /dev/null +++ b/src/features/student/missionary/components/MissionaryUserCard.vue @@ -0,0 +1,257 @@ + + + + + + + + + + سطح کاربر : + {{ level }} + + {{ fullName }} + + + {{ city }} + + + + + + + مدت عضویت + + {{ membershipDays }} + روز + + + + + + + امتیاز کاربر + + {{ rating }} + + + + + + + تعداد درخواستها + + {{ requestsCount }} + درخواست + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/modals/DispatchDetailsModal.vue b/src/features/student/missionary/components/modals/DispatchDetailsModal.vue new file mode 100644 index 0000000..c4df07b --- /dev/null +++ b/src/features/student/missionary/components/modals/DispatchDetailsModal.vue @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/modals/NarrativeDetailsModal.vue b/src/features/student/missionary/components/modals/NarrativeDetailsModal.vue new file mode 100644 index 0000000..d8ad381 --- /dev/null +++ b/src/features/student/missionary/components/modals/NarrativeDetailsModal.vue @@ -0,0 +1,123 @@ + + + + + + + + + + + {{ narrative.comments ?? 0 }} + + + + + {{ narrative.likes ?? 0 }} + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/components/modals/RequestDetailsModal.vue b/src/features/student/missionary/components/modals/RequestDetailsModal.vue new file mode 100644 index 0000000..3f3d33c --- /dev/null +++ b/src/features/student/missionary/components/modals/RequestDetailsModal.vue @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/missionary/pages/StudentMissionaryPage.vue b/src/features/student/missionary/pages/StudentMissionaryPage.vue new file mode 100644 index 0000000..c0a6030 --- /dev/null +++ b/src/features/student/missionary/pages/StudentMissionaryPage.vue @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/pages/EditProfilePage.vue b/src/features/student/profile/pages/EditProfilePage.vue similarity index 99% rename from src/features/student/pages/EditProfilePage.vue rename to src/features/student/profile/pages/EditProfilePage.vue index b6ad3d7..835ea68 100644 --- a/src/features/student/pages/EditProfilePage.vue +++ b/src/features/student/profile/pages/EditProfilePage.vue @@ -217,8 +217,8 @@ import ImageCropper from '@/components/form/ImageCropper.vue' import { objectToFormData } from '@/utils/object-to-formdata' import TextareaField from '@/components/form/TextareaField.vue' import PasswordField from '@/components/form/PasswordField.vue' -import { studentProfileSchema } from '@/features/student/schema' import DatePickerField from '@/components/form/DatePickerField.vue' +import { studentProfileSchema } from '@/features/student/profile/schema' import BoxedIconTitleBlock from '@/components/blocks/BoxedIconTitleBlock.vue' import { useGetCitiesOfProvinceQuery, useGetProvincesQuery } from '@/services/query/common' import { diff --git a/src/features/student/schema/index.js b/src/features/student/profile/schema/index.js similarity index 100% rename from src/features/student/schema/index.js rename to src/features/student/profile/schema/index.js diff --git a/src/features/student/router.js b/src/features/student/router.js index 06cbe2d..b6dcf82 100644 --- a/src/features/student/router.js +++ b/src/features/student/router.js @@ -8,19 +8,79 @@ export default [ { path: '/profile', name: 'student-profile', - component: () => import('@/features/student/pages/EditProfilePage.vue'), + component: () => import('@/features/student/profile/pages/EditProfilePage.vue'), meta: { layout: 'student', role: 'student', title: 'ویرایش پروفایل' }, }, { path: '/my-courses', name: 'student-courses', - component: () => import('@/features/student/pages/StudentCoursesPage.vue'), + component: () => import('@/features/student/courses/pages/StudentCoursesPage.vue'), meta: { layout: 'student', role: 'student', title: 'دورههای من' }, }, { path: '/my-courses/:id', name: 'student-course-details', - component: () => import('@/features/student/pages/StudentCourseDetailsPage.vue'), + component: () => import('@/features/student/courses/pages/StudentCourseDetailsPage.vue'), meta: { layout: 'student', role: 'student', title: 'جزئیات دوره' }, }, + { + path: '/my-terms', + name: 'student-terms', + component: () => import('@/features/student/terms/pages/StudentTermsPage.vue'), + meta: { layout: 'student', role: 'student', title: 'دورههای آموزشی' }, + }, + { + path: '/my-terms/:id', + name: 'student-term-details', + component: () => import('@/features/student/terms/pages/StudentTermDetailsPage.vue'), + meta: { layout: 'student', role: 'student', title: 'جزئیات دوره' }, + }, + { + path: '/my-lessons/:id', + name: 'student-lesson-details', + component: () => import('@/features/student/lessons/pages/StudentLessonDetailsPage.vue'), + meta: { layout: 'student', role: 'student', title: 'جزئیات درس' }, + }, + { + path: '/my-sessions/:id', + name: 'student-session-details', + component: () => import('@/features/student/sessions/pages/StudentSessionDetailsPage.vue'), + meta: { layout: 'student', role: 'student', title: 'جزئیات جلسه' }, + }, + { + path: '/my-exams/:id', + name: 'student-exam', + component: () => import('@/features/student/exams/pages/StudentExamPage.vue'), + meta: { layout: 'student', role: 'student', title: 'آزمون' }, + }, + { + path: '/my-exams/:id/take', + name: 'student-take-exam', + component: () => import('@/features/student/exams/pages/StudentTakeExamPage.vue'), + meta: { layout: 'student', role: 'student', title: 'شروع آزمون' }, + }, + { + path: '/missionary', + name: 'student-missionary', + component: () => import('@/features/student/missionary/pages/StudentMissionaryPage.vue'), + meta: { layout: 'student', role: 'student', title: 'سامانه اعزام' }, + }, + { + path: '/user/services', + name: 'student-services', + component: () => import('@/features/student/services/pages/StudentServicesPage.vue'), + meta: { layout: 'student', role: 'student', title: 'خدمات' }, + }, + { + path: '/user/consultants', + name: 'student-consultants', + component: () => import('@/features/student/consultants/pages/StudentConsultantsPage.vue'), + meta: { layout: 'student', role: 'student', title: 'مشاوره' }, + }, + { + path: '/user/certificates', + name: 'student-certificates', + component: () => import('@/features/student/certificates/pages/StudentCertificatesPage.vue'), + meta: { layout: 'student', role: 'student', title: 'گواهینامه ها' }, + }, ] diff --git a/src/features/student/services/components/CreateServiceForm.vue b/src/features/student/services/components/CreateServiceForm.vue new file mode 100644 index 0000000..6ef1c52 --- /dev/null +++ b/src/features/student/services/components/CreateServiceForm.vue @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/services/components/ServiceItem.vue b/src/features/student/services/components/ServiceItem.vue new file mode 100644 index 0000000..c59a968 --- /dev/null +++ b/src/features/student/services/components/ServiceItem.vue @@ -0,0 +1,106 @@ + + + + {{ service.title }} + شماره درخواست : {{ service.requestNumber }} + + + + + + + + + + + + diff --git a/src/features/student/services/pages/StudentServicesPage.vue b/src/features/student/services/pages/StudentServicesPage.vue new file mode 100644 index 0000000..18889ee --- /dev/null +++ b/src/features/student/services/pages/StudentServicesPage.vue @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/sessions/components/StudentSessionItem.vue b/src/features/student/sessions/components/StudentSessionItem.vue new file mode 100644 index 0000000..b2e83b8 --- /dev/null +++ b/src/features/student/sessions/components/StudentSessionItem.vue @@ -0,0 +1,162 @@ + + + + {{ session.title || '—' }} + + + زمان جلسه : + {{ durationText }} + + + + + + دیده شده + + + + ارسال تکلیف + + + + دارای آزمون + + + + جلسه آنلاین + + + + + + + + + + + + + + + + diff --git a/src/features/student/sessions/pages/StudentSessionDetailsPage.vue b/src/features/student/sessions/pages/StudentSessionDetailsPage.vue new file mode 100644 index 0000000..e41673d --- /dev/null +++ b/src/features/student/sessions/pages/StudentSessionDetailsPage.vue @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + {{ session?.homeworkPrompt || 'متنی برای این جلسه ثبت نشده است.' }} + + + + + + + + + + + + + + + {{ session.text }} + + + + https://link + + + + + + + + + + + محتوایی برای این جلسه ثبت نشده است. + + + + + + + + + + + + + {{ session?.homeworkHint || '' }} + + + + + + + + + + + + + + + + + diff --git a/src/features/student/terms/components/StudentTermItem.vue b/src/features/student/terms/components/StudentTermItem.vue new file mode 100644 index 0000000..c9755a0 --- /dev/null +++ b/src/features/student/terms/components/StudentTermItem.vue @@ -0,0 +1,280 @@ + + + + + + {{ term.title || '—' }} + + + استـــــــاد: + {{ teacherName }} + + + + + + + + تاریخ پایان : + {{ endDate }} + + + + تاریخ شروع : + {{ startDate }} + + + + معدل دوره : + + {{ gpaText }} + + + + وضعیت دوره : + {{ statusLabel }} + + + + + + + + + + + + + + + + diff --git a/src/features/student/terms/components/StudentTermSummary.vue b/src/features/student/terms/components/StudentTermSummary.vue new file mode 100644 index 0000000..2a87d6e --- /dev/null +++ b/src/features/student/terms/components/StudentTermSummary.vue @@ -0,0 +1,227 @@ + + + + + + + + + وضعیت دوره : + {{ statusLabel }} + + + {{ term.title || '—' }} + + + استـــــــاد: + {{ teacherName }} + + + + + + + تاریخ پایان : + {{ endDate }} + + + + تاریخ شروع : + {{ startDate }} + + + + + + + + diff --git a/src/features/student/terms/pages/StudentTermDetailsPage.vue b/src/features/student/terms/pages/StudentTermDetailsPage.vue new file mode 100644 index 0000000..2cede81 --- /dev/null +++ b/src/features/student/terms/pages/StudentTermDetailsPage.vue @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/features/student/terms/pages/StudentTermsPage.vue b/src/features/student/terms/pages/StudentTermsPage.vue new file mode 100644 index 0000000..5c8fe72 --- /dev/null +++ b/src/features/student/terms/pages/StudentTermsPage.vue @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/global-components/Badge.vue b/src/global-components/Badge.vue new file mode 100644 index 0000000..dbf2a4d --- /dev/null +++ b/src/global-components/Badge.vue @@ -0,0 +1,137 @@ + + + + + + {{ label }} + + {{ value }} + + + + + + + + diff --git a/src/global-components/Tinymce.vue b/src/global-components/Tinymce.vue new file mode 100644 index 0000000..b46451e --- /dev/null +++ b/src/global-components/Tinymce.vue @@ -0,0 +1,120 @@ + + + + + + + + + diff --git a/src/layouts/StudentLayout.vue b/src/layouts/StudentLayout.vue index 1f9b4ac..e2a4591 100644 --- a/src/layouts/StudentLayout.vue +++ b/src/layouts/StudentLayout.vue @@ -65,6 +65,42 @@ const menuItems = computed(() => [ to: { name: 'student-courses' }, active: ['student-courses', 'student-course-details'].includes(route.name), }, + { + title: 'دورههای آموزشی', + icon: 'book', + to: { name: 'student-terms' }, + active: [ + 'student-terms', + 'student-term-details', + 'student-lesson-details', + 'student-session-details', + 'student-exam', + ].includes(route.name), + }, + { + title: 'سامانه اعزام', + icon: 'paper-plane-right', + to: { name: 'student-missionary' }, + active: route.name === 'student-missionary', + }, + { + title: 'خدمات', + icon: 'paper-plane', + to: { name: 'student-services' }, + active: route.name === 'student-services', + }, + { + title: 'مشاوره', + icon: 'chat', + to: { name: 'student-consultants' }, + active: route.name === 'student-consultants', + }, + { + title: 'گواهینامه ها', + icon: 'scroll', + to: { name: 'student-certificates' }, + active: route.name === 'student-certificates', + }, { title: 'ویرایش پروفایل', icon: 'user', diff --git a/src/layouts/sidebars/StudentSidebar.vue b/src/layouts/sidebars/StudentSidebar.vue index 54bb34f..4307e55 100644 --- a/src/layouts/sidebars/StudentSidebar.vue +++ b/src/layouts/sidebars/StudentSidebar.vue @@ -1,5 +1,5 @@ -
{{ fileName }}
{{ error }}
+ + در حال ضبط... + {{ formattedTime }} +
{{ courseTitle }}
{{ consultant.title }}
شماره درخواست : {{ consultant.requestNumber }}
{{ attempt.title || 'آزمون' }}
{{ exam.title || '—' }}
{{ orderText }}{{ question.title }}
دانشجوی گرامی
شما تاکنون هیچ آزمونی را به شروع نکرده اید.
{{ lesson.title || '—' }}
{{ dispatch.title }}
{{ narrative.title }}
تاریخ ثبت: {{ narrative.submittedAt }}
{{ request.title }}
شماره درخواست : {{ request.requestNumber }}
{{ fullName }}
{{ service.title }}
شماره درخواست : {{ service.requestNumber }}
{{ session.title || '—' }}
+ {{ session?.homeworkPrompt || 'متنی برای این جلسه ثبت نشده است.' }} +
{{ session.text }}
محتوایی برای این جلسه ثبت نشده است.
+ {{ session?.homeworkHint || '' }} +
{{ term.title || '—' }}