Now the sidebar, header, and footer are in the App.vue

This commit is contained in:
Diyar Akhgar 2025-05-31 17:49:08 +03:30
parent b8985e7f96
commit a6f9ac7e44
12 changed files with 158 additions and 188 deletions

View File

@ -1,26 +1,43 @@
<template>
<div id="app">
<!-- Main App Layout -->
<!-- Dashboard LayOut -->
<template v-if="isDashboardLayout">
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<AppHeader :pageTitle="$route.meta.title" />
<router-view></router-view>
</div>
</div>
</template>
<!-- The router-view here will display the active route's component -->
<router-view></router-view>
<!-- Sample LayOut for SignUp .... -->
<template v-else>
<router-view></router-view>
</template>
<Footer />
</div>
<Footer />
</template>
<script>
import Footer from '@/components/Footer.vue'
import AppHeader from '@/components/Header.vue';
import SidebarMenu from '@/components/SidebarMenu.vue';
import Footer from '@/components/Footer.vue';
export default {
name: 'App',
components: {
Footer
}
}
Footer,
SidebarMenu,
AppHeader,
},
computed: {
isDashboardLayout() {
return this.$route.meta.requiresAuth === true;
},
},
};
</script>
<style scoped>
@ -35,12 +52,6 @@ body {
}
/* Styling for the header */
header {
background-color: #4A90E2; /* Blue color */
padding: 20px;
text-align: center;
}
.app-title {
color: white;
@ -60,6 +71,12 @@ router-view {
flex-grow: 1;
padding: 20px;
}
</style>
@ -75,4 +92,22 @@ router-view {
* {
font-family: 'IRANSans', sans-serif !important;
}
.dashboard-page {
margin-right: 20rem;
padding: 20px;
direction: rtl;
font-family: IRANSansXFaNum, sans-serif;
}
.content {
background-color: #f8f9fa;
border-radius: 20px;
padding: 35px 80px !important;
display: flex;
flex-direction: column;
gap: 32px;
}
</style>

View File

@ -209,6 +209,11 @@ export default {
this.$emit('upload-success');
this.$emit('close');
alert('فایل با موفقیت آپلود شد');
// بررسی مسیر فعلی و هدایت به /dashboard/files در صورت نیاز
if (this.$route.path !== '/dashboard/files') {
this.$router.push('/dashboard/files');
}
} catch (error) {
console.error('Error uploading file:', error);
alert('خطا در آپلود فایل');

View File

@ -1,25 +1,21 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<!-- Header -->
<AppHeader pageTitle="انتخاب آواتار" />
<div style="gap: 1.5rem;display: flex;flex-direction: column;">
<div style="gap: 1.5rem;display: flex;flex-direction: column;">
<div class="page-title"> آواتار خود را انتخاب کنید</div>
<div class="page-title"> آواتار خود را انتخاب کنید</div>
<h5>
نحوه ظاهر شدن خود را در طول جلسات در XRoom را سفارشی سازی کنید.
نگران نباشید، شما می توانید ان را در هر زمان دیگری تغییر دهید.
</h5>
<router-link to="/dashboard/readyplayer">ساخت آواتار به دلخواه </router-link>
<h5>
نحوه ظاهر شدن خود را در طول جلسات در XRoom را سفارشی سازی کنید.
نگران نباشید، شما می توانید ان را در هر زمان دیگری تغییر دهید.
</h5>
<router-link to="/dashboard/readyplayer">ساخت آواتار به دلخواه </router-link>
</div>
<div class="avatar-selection-container">
<!-- Left Column - Women Models -->
<div class="gender-column">
<h3 class="text-center mb-4">آواتارهای زنانه</h3>
<h3 class="mb-4 text-center">آواتارهای زنانه</h3>
<div class="avatar-grid">
<div v-for="(avatar, index) in femaleAvatars" :key="'female-' + index" class="avatar-card">
<div class="model-preview-container">
@ -47,7 +43,7 @@
<!-- Right Column - Men Models -->
<div class="gender-column">
<h3 class="text-center mb-4">آواتارهای مردانه</h3>
<h3 class="mb-4 text-center">آواتارهای مردانه</h3>
<div class="avatar-grid">
<div v-for="(avatar, index) in maleAvatars" :key="'male-' + index" class="avatar-card">
<div class="model-preview-container">
@ -74,20 +70,15 @@
</div>
</div>
</div>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue'
import axios from '@/axios';
import { ref } from 'vue';
import AppHeader from '@/components/Header.vue';
export default {
name: 'ChangeAvatar',
components: {
SidebarMenu,
AppHeader,
},
data() {
return {
@ -271,21 +262,6 @@ export default {
<style scoped>
.dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
font-family: IRANSansXFaNum, sans-serif;
}
.content {
background-color: #f8f9fa;
border-radius: 20px;
padding: 35px 80px;
display: flex;
flex-direction: column;
gap: 32px;
}
.page-title {
font-size: 22px;
font-weight: bold;
@ -431,8 +407,11 @@ body, html {
/* Each gender column */
.gender-column {
flex: 1; /* Each column takes equal width */
min-width: 0; /* Prevent flex items from overflowing */
flex: 1;
min-width: 0;
gap: 1rem;
display: flex;
flex-direction: column;
}
/* Grid layout inside each column */

View File

@ -1,8 +1,5 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<div>
<!-- Top Header -->
<AppHeader pageTitle="دانلود ها" />
@ -43,19 +40,13 @@
برای دستورالعملهای نصب ، حتماً از <router-link to="/dashboard/download" style="color: #3A57E8;">پایگاه دانش ما</router-link> دیدن کنید.
</span>
</div>
</div>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue'
import AppHeader from '@/components/Header.vue';
export default {
name: 'DashboardPage',
components: {
SidebarMenu,
AppHeader,
},
data () {
@ -83,7 +74,7 @@ export default {
<style scoped>
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -97,7 +88,7 @@ export default {
flex-direction: column;
gap: 32px;
}
*/
.section-title {
font-size: 20px;
font-weight: 600;
@ -124,6 +115,7 @@ export default {
.chose-device {
margin-top: 2rem;
margin-bottom: 2rem;
}
.cards {
@ -237,7 +229,6 @@ export default {
}
.instructions-text {
margin-top: 1.5rem;
font-size: 15px;
font-weight: 600;
color: #4F5A69;

View File

@ -1,12 +1,5 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<!-- Header -->
<AppHeader pageTitle="ویرایش پروفایل" />
<div>
<!-- Two-Column Form Layout -->
<div class="profile-edit-container">
@ -96,19 +89,14 @@
</div>
</div>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue'
import axios from '@/axios';
import AppHeader from '@/components/Header.vue';
export default {
name: 'EditProfile',
components: {
SidebarMenu,
AppHeader,
},
data() {
@ -209,7 +197,7 @@ export default {
<style scoped>
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -223,7 +211,7 @@ export default {
display: flex;
flex-direction: column;
gap: 32px;
}
} */
.page-title {
font-size: 22px;
font-weight: bold;

View File

@ -1,11 +1,5 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<!-- Top Header -->
<AppHeader pageTitle="جلسات" />
<div>
<!-- Description -->
<div class="section-description">
<div class="section-title">مدیریت جلسات</div>
@ -133,19 +127,14 @@
@close="showModal = false"
/>
</div>
</div>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue';
import AppHeader from '@/components/Header.vue';
import CreateMeetingModal from '@/components/CreateMeetingModal.vue';
export default {
name: 'DashboardPage',
components: {
SidebarMenu,
AppHeader,
CreateMeetingModal,
},
data() {
@ -222,7 +211,7 @@ export default {
};
</script>
<style scoped>
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -236,7 +225,7 @@ export default {
flex-direction: column;
gap: 32px;
}
*/
.section-title {
font-size: 20px;

View File

@ -1,8 +1,5 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<div>
<!-- Top Header -->
<AppHeader pageTitle="فضاها" />
@ -48,7 +45,6 @@
<p>هیچ فضایی با فیلترهای انتخابشده یافت نشد.</p>
</div>
</div>
</div>
@ -65,8 +61,6 @@
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue';
import AppHeader from '@/components/Header.vue';
import CreateSpaceModal from '@/components/CreateSpaceModal.vue';
import { Swiper, SwiperSlide } from 'swiper/vue';
import 'swiper/css';
@ -76,8 +70,6 @@ import axios from 'axios';
export default {
name: 'DashboardPage',
components: {
SidebarMenu,
AppHeader,
CreateSpaceModal,
Swiper,
SwiperSlide,
@ -175,7 +167,7 @@ export default {
</style>
<style scoped>
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -188,7 +180,7 @@ export default {
display: flex;
flex-direction: column;
gap: 32px;
}
} */
.section-title {
font-size: 20px;
font-weight: 600;

View File

@ -1,9 +1,7 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<div class="ef">
<!-- Top Header -->
<AppHeader pageTitle="فایل‌ها" />
<!-- Description -->
<div class="section-description">
@ -64,7 +62,17 @@
:key="`${section.type}-${index}`"
@click="openPreviewDialog(section.type, index, getFullFileUrl(file[section.type]), file.id)"
>
<img :src="getFilePreviewImage(section.type, file)" class="file-image" />
<img
:src="getFilePreviewImage(section.type, file)"
:class="[
{
'file-image': section.type === 'image',
'file-pdf': section.type === 'pdf',
'file-video': section.type === 'video',
'file-glb': section.type === 'glb'
}
]"
/>
<div class="file-card-info">
<div class="file-title">{{ file.name }}</div>
<div class="file-meta">
@ -130,22 +138,17 @@
@close="closePreviewDialog"
@delete-success="fetchUserData"
/>
</div>
</template>
<script>
import '@google/model-viewer';
import SidebarMenu from '@/components/SidebarMenu.vue';
import axios from 'axios';
import AppHeader from '@/components/Header.vue';
import NewFileDialog from '@/components/NewFileDialog.vue';
import FilePreviewDialog from '@/components/FilePreviewDialog.vue';
export default {
name: 'DashboardPage',
components: {
SidebarMenu,
AppHeader,
NewFileDialog,
FilePreviewDialog,
},
@ -423,20 +426,7 @@ export default {
margin-top: 1rem;
}
/* Layout and Containers */
.dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
font-family: IRANSansXFaNum, sans-serif;
}
.content {
background-color: #f8f9fa;
border-radius: 20px;
padding: 35px 80px;
display: flex;
flex-direction: column;
gap: 32px;
}
@ -530,7 +520,14 @@ export default {
height: 190px;
width: 100%;
border-radius: 15px;
object-fit: cover;
}
.file-image{
object-fit: cover;
}
.file-pdf , .file-video , .file-glb{
object-fit: contain;
}
.file-card-info {

View File

@ -1,10 +1,6 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<div>
<!-- <AppHeader /> -->
<AppHeader pageTitle="از این داشبورد، کار با XRoom را آغاز کنید." />
<div class="dashboard-grid">
<!-- Right Section -->
@ -43,8 +39,8 @@
<div class="files-header">
<h1 style=" font-size: 24px;">آخرین فایل ها</h1>
<div class="file-buttons">
<button class="white-button">بارگذاری فایل</button>
<button class="white-button">مدیریت فایلها</button>
<button class="white-button" @click="openDialog('image')">بارگذاری فایل</button>
<router-link class="white-button" to="/dashboard/files">مدیریت فایلها</router-link>
</div>
</div>
@ -100,8 +96,6 @@
</div>
</div>
<!-- Create Meeting Modal -->
<CreateMeetingModal
:is-open="showModal"
@ -114,30 +108,40 @@
:is-open="tutorialShowModal"
@close="tutorialShowModal = false"
/>
<!-- New File Dialog Component -->
<NewFileDialog
:is-open="isNewFileDialogOpen"
:initial-upload-type="currentUploadType"
:base-url="baseUrl"
@close="closeDialog"
@upload-success="fetchUserData"
/>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue'
import AppHeader from '@/components/Header.vue';
import CreateMeetingModal from '@/components/CreateMeetingModal.vue';
import TutorialShowModal from '@/components/TutorialShowModal.vue';
import NewFileDialog from '@/components/NewFileDialog.vue';
export default {
name: 'DashboardPage',
components: {
SidebarMenu,
AppHeader,
CreateMeetingModal,
TutorialShowModal,
NewFileDialog
},
data() {
return {
showModal: false,
tutorialShowModal: false,
isNewFileDialogOpen: false,
currentUploadType: 'image',
baseUrl: 'http://194.62.43.230:8000'
}
},
methods: {
methods: {
createNewMeeting(meetingData) {
const newMeeting = {
id: this.meetings.length + 1,
@ -153,13 +157,22 @@ export default {
filterMeetings() {
console.log('Filtering meetings');
},
openDialog(type = 'image') {
this.currentUploadType = type;
this.isNewFileDialogOpen = true;
},
closeDialog() {
this.isNewFileDialogOpen = false;
},
fetchUserData() {
console.log('Fetching user data');
}
}
}
</script>
<style scoped>
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -175,13 +188,13 @@ export default {
padding: 35px 80px;
display: flex;
flex-direction: column;
}
} */
.dashboard-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
margin-top: 80px;
margin-top: 1rem;
}
.left-section {
@ -374,6 +387,8 @@ export default {
font-family: "IRANSansXFaNum-Medium", Helvetica;
cursor: pointer;
transition: background-color 0.2s;
color: #101010;
line-height: normal;
}
.white-button:hover {

View File

@ -1,11 +1,5 @@
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<!-- Header -->
<AppHeader pageTitle="انتخاب آواتار" />
<template>
<div>
<div class="page-title">ساخت آواتار جدید</div>
@ -19,19 +13,14 @@
></iframe>
</div>
</div>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue'
<script>
import axios from '@/axios';
import AppHeader from '@/components/Header.vue';
export default {
name: 'ChangeAvatar',
components: {
SidebarMenu,
AppHeader,
},
data() {
return {
@ -234,7 +223,7 @@ import AppHeader from '@/components/Header.vue';
}
/* Rest of your existing styles... */
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -248,7 +237,7 @@ import AppHeader from '@/components/Header.vue';
display: flex;
flex-direction: column;
gap: 32px;
}
} */
.page-title {
font-size: 22px;

View File

@ -1,11 +1,6 @@
<!-- DashboardPage.vue -->
<template>
<SidebarMenu />
<div class="dashboard-page">
<div class="content">
<!-- Top Header -->
<AppHeader pageTitle="تیم ها" />
<div>
<!-- Description -->
<div class="section-description">
<div class="section-title">مدیریت اعضا</div>
@ -73,12 +68,9 @@
/>
</div>
</div>
</div>
</template>
<script>
import SidebarMenu from '@/components/SidebarMenu.vue';
import AppHeader from '@/components/Header.vue';
import TeamUser from '@/components/TeamUser.vue';
import BuySubscription from '@/components/BuySubscription.vue';
import Membership from '@/components/Membership.vue';
@ -88,8 +80,6 @@ import axios from 'axios';
export default {
name: 'DashboardPage',
components: {
SidebarMenu,
AppHeader,
TeamUser,
BuySubscription,
Membership,
@ -507,7 +497,7 @@ export default {
margin-top: 1rem;
}
.dashboard-page {
/* .dashboard-page {
margin-right: 360px;
padding: 20px;
direction: rtl;
@ -522,7 +512,7 @@ export default {
flex-direction: column;
gap: 10px;
}
*/
.tab-buttons {
display: flex;
gap: 25px;

View File

@ -36,55 +36,55 @@ const routes = [
path: '/dashboard',
name: 'DashboardPage',
component: DashboardPage,
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'از این داشبورد، کار با XRoom را آغاز کنید.'}
},
{
path: '/dashboard/files',
name: 'files',
component: FilesPage,
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'فایل ها'}
},
{
path: '/dashboard/download',
name: 'download',
component: DownloadPage,
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'دانلود ها'}
},
{
path: '/dashboard/spaces',
name: 'spaces',
component: spacesPage,
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'فضاها'}
},
{
path: '/dashboard/meetings',
name: 'meetings',
component: MeetingPage,
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'جلسات'}
},
{
path: '/dashboard/teams',
name: 'teams',
component: TeamsPage,
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'تیم ها'}
},
{
path: '/dashboard/edit-profile',
name: 'EditProfile',
component: () => import('@/pages/dashboard/EditProfile.vue'),
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'ویرایش پروفایل'}
},
{
path: '/dashboard/readyPlayer',
name: 'ReadyPlayer',
component: () => import('@/pages/dashboard/readyPlayer.vue'),
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'انتخاب آواتار'}
},
{
path: '/dashboard/ChangeAvatar',
name: 'ChangeAvatar',
component: () => import('@/pages/dashboard/ChangeAvatar.vue'),
meta: { requiresAuth: true }
meta: { requiresAuth: true , title : 'انتخاب آواتار'}
}
]