Version 1.0.0 - Ajout du design et début search bar
This commit is contained in:
		@@ -4,6 +4,7 @@
 | 
				
			|||||||
  "private": true,
 | 
					  "private": true,
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "dev": "vite --host --port 8080",
 | 
					    "dev": "vite --host --port 8080",
 | 
				
			||||||
 | 
					    "preview": "vite preview --host --port 8080",
 | 
				
			||||||
    "build": "vite build"
 | 
					    "build": "vite build"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@
 | 
				
			|||||||
    --primary: #FFFFFF;
 | 
					    --primary: #FFFFFF;
 | 
				
			||||||
    --primary-hover: #292b26;
 | 
					    --primary-hover: #292b26;
 | 
				
			||||||
    --secondary: #EAEAEA;
 | 
					    --secondary: #EAEAEA;
 | 
				
			||||||
    --tertiary: #cacaca;
 | 
					    --tertiary: #d3d3d3;
 | 
				
			||||||
    --text: #111210;
 | 
					    --text: #111210;
 | 
				
			||||||
    --text-inverse: #FFFFFF;
 | 
					    --text-inverse: #FFFFFF;
 | 
				
			||||||
    --text-secondary: #404040;
 | 
					    --text-secondary: #404040;
 | 
				
			||||||
@@ -60,6 +60,11 @@ html, body {
 | 
				
			|||||||
   
 | 
					   
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#app {
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.no-decoration {
 | 
					.no-decoration {
 | 
				
			||||||
    text-decoration: none !important;
 | 
					    text-decoration: none !important;
 | 
				
			||||||
}   
 | 
					}   
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -103,7 +103,9 @@ function updateServerInfo() {
 | 
				
			|||||||
.container {
 | 
					.container {
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    flex-direction: column;
 | 
					    flex-direction: column;
 | 
				
			||||||
    gap: 10px;;
 | 
					    justify-content: space-between;
 | 
				
			||||||
 | 
					    gap: 10px;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.itm {
 | 
					.itm {
 | 
				
			||||||
@@ -146,6 +148,7 @@ function updateServerInfo() {
 | 
				
			|||||||
    position: absolute;
 | 
					    position: absolute;
 | 
				
			||||||
    background-color: var(--tertiary);
 | 
					    background-color: var(--tertiary);
 | 
				
			||||||
    border-radius: 0px 0px 10px 10px;
 | 
					    border-radius: 0px 0px 10px 10px;
 | 
				
			||||||
 | 
					    z-index: 1000;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.menu-content {
 | 
					.menu-content {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,41 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="search">
 | 
					    <div class="search">
 | 
				
			||||||
        <input type="text" placeholder="Search..." v-model="searchQuery" />
 | 
					        <Icon color="#FFFFFF" icon="fa-solid fa-magnifying-glass" style="width: 20px;" />
 | 
				
			||||||
 | 
					        <input ref="searchBar" type="text" placeholder="Insérer votre recherche ici" v-model="searchQuery" />
 | 
				
			||||||
 | 
					        <IconAction
 | 
				
			||||||
 | 
					            icon="fa-solid fa-cloud-arrow-up"
 | 
				
			||||||
 | 
					            color="#FFFFFF"
 | 
				
			||||||
 | 
					            title="Mes fichiers"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { onBeforeUnmount, onMounted, ref } from 'vue';
 | 
				
			||||||
 | 
					import IconAction from '../UI/IconAction.vue';
 | 
				
			||||||
 | 
					import { IORequest } from '@/utils/IORequest';
 | 
				
			||||||
 | 
					import Events from '@/utils/Events';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const searchBar = ref(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const searchQuery = ref('');
 | 
					const searchQuery = ref('');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					onMounted(() => {
 | 
				
			||||||
 | 
					    searchBar.value.addEventListener('change', find);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function find() {
 | 
				
			||||||
 | 
					    if (searchQuery.value.trim() === '') {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Events.emit("SEARCH_STARTED");
 | 
				
			||||||
 | 
					    IORequest("/SEARCH", (data) => {
 | 
				
			||||||
 | 
					        Events.emit("SEARCH_RESULT", data);
 | 
				
			||||||
 | 
					    }, searchQuery.value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped>
 | 
					<style scoped>
 | 
				
			||||||
@@ -15,18 +43,21 @@ const searchQuery = ref('');
 | 
				
			|||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    align-items: center;
 | 
					    align-items: center;
 | 
				
			||||||
    padding: 10px;
 | 
					    padding: 10px;
 | 
				
			||||||
    background-color: var(--tertiary);
 | 
					    gap: 5px;
 | 
				
			||||||
 | 
					    background-color: var(--main);
 | 
				
			||||||
    border-radius: 10px;
 | 
					    border-radius: 10px;
 | 
				
			||||||
 | 
					    box-shadow: 2px 2px 10px 0px rgba(0, 0, 0, 0.50);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.search input {
 | 
					.search input {
 | 
				
			||||||
    border: none;
 | 
					    border: none;
 | 
				
			||||||
    outline: none;
 | 
					    outline: none;
 | 
				
			||||||
    background: transparent;
 | 
					    background: var(--secondary);
 | 
				
			||||||
    color: var(--text-primary);
 | 
					    color: var(--text-primary);
 | 
				
			||||||
 | 
					    border-radius: 10px;;
 | 
				
			||||||
    flex: 1;
 | 
					    flex: 1;
 | 
				
			||||||
    padding: 5px 10px;
 | 
					    padding: 10px 10px;
 | 
				
			||||||
    border-radius: 5px;
 | 
					    border-radius: 20px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.search input::placeholder {
 | 
					.search input::placeholder {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										95
									
								
								src/components/Layout/View.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/components/Layout/View.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					    <Box v-if="deviceType === 'desktop'" padding="closed" class="view">
 | 
				
			||||||
 | 
					        <IconAction @click="returnDefault()" v-if="!actualComponent.unclosable" icon="fa-solid fa-xmark" class="close"/>
 | 
				
			||||||
 | 
					        <component :is="actualComponent.component" v-bind="actualComponent.props"/>
 | 
				
			||||||
 | 
					    </Box>
 | 
				
			||||||
 | 
					    <div v-else-if="deviceType === 'mobile' && !actualComponent.default" class="view-mobile">
 | 
				
			||||||
 | 
					        <IconAction @click="returnDefault()" v-if="!actualComponent.unclosable" icon="fa-solid fa-xmark" class="close"/>
 | 
				
			||||||
 | 
					        <component :is="actualComponent.component" v-bind="actualComponent.props"/>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					<script setup>
 | 
				
			||||||
 | 
					import Box from '../UI/Box.vue';
 | 
				
			||||||
 | 
					import Events from '@/utils/Events';
 | 
				
			||||||
 | 
					import { computed, ref, watch } from 'vue';
 | 
				
			||||||
 | 
					import Loading from '@/components/Widget/View/LoadingView.vue'
 | 
				
			||||||
 | 
					import SearchResults from '@/components/Widget/View/SearchResults.vue';
 | 
				
			||||||
 | 
					import Default from '../Widget/View/Default.vue';
 | 
				
			||||||
 | 
					import IconAction from '../UI/IconAction.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//TODO: Render compatibility with mobile
 | 
				
			||||||
 | 
					//TODO: Make Default.vue a real default view
 | 
				
			||||||
 | 
					//TODO: Make the search request
 | 
				
			||||||
 | 
					//TODO: Make the medias
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const deviceType = ref((window.innerWidth < 768 || window.innerHeight < 607) ? 'mobile' : 'desktop');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					watch(() => window.innerWidth, () => {
 | 
				
			||||||
 | 
					    deviceType.value = (window.innerWidth < 768 || window.innerHeight < 607) ? 'mobile' : 'desktop';
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const defaultComponent = {
 | 
				
			||||||
 | 
					    component: Default,
 | 
				
			||||||
 | 
					    unclosable: true,
 | 
				
			||||||
 | 
					    default: true,
 | 
				
			||||||
 | 
					    props: {}
 | 
				
			||||||
 | 
					};  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function returnDefault() {
 | 
				
			||||||
 | 
					    actualComponent.value = defaultComponent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const actualComponent = ref(defaultComponent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Events.on("SEARCH_STARTED", () => {
 | 
				
			||||||
 | 
					    setLoading("Recherche en cours ...")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					Events.on("SEARCH_RESULT", (data) => {
 | 
				
			||||||
 | 
					    console.log("Search results received:", data);
 | 
				
			||||||
 | 
					    actualComponent.value = {
 | 
				
			||||||
 | 
					        component: SearchResults,
 | 
				
			||||||
 | 
					        props: {
 | 
				
			||||||
 | 
					            results: data
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setLoading(messageLoading) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    actualComponent.value = {
 | 
				
			||||||
 | 
					        component: Loading,
 | 
				
			||||||
 | 
					        unclosable: true,
 | 
				
			||||||
 | 
					        props: {
 | 
				
			||||||
 | 
					            message: messageLoading
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.close {
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    top: 10px;
 | 
				
			||||||
 | 
					    right: 10px;
 | 
				
			||||||
 | 
					    color: var(--text-secondary);
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.view {
 | 
				
			||||||
 | 
					    position: relative;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.view-mobile {
 | 
				
			||||||
 | 
					    position: fixed;
 | 
				
			||||||
 | 
					    top: 0;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    background-color: var(--background-secondary);
 | 
				
			||||||
 | 
					    z-index: 1000;
 | 
				
			||||||
 | 
					    border-radius: 0 !important;
 | 
				
			||||||
 | 
					}   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
    <div class="settings-container">
 | 
					    <div class="settings-container">
 | 
				
			||||||
        <Icon style="width: 20px;" class="settings-icon" :icon="icon"/> 
 | 
					        <Icon style="width: 20px;" class="settings-icon" :icon="icon"/> 
 | 
				
			||||||
        <div class="settings-item">
 | 
					        <div class="settings-item">
 | 
				
			||||||
                <p class="settings-title">{{ title }}</p>
 | 
					                <p class="settings-title"><Icon style="width: 20px;" class="settings-icon-replace" :icon="icon"/>  {{ title }}</p>
 | 
				
			||||||
               <slot></slot>
 | 
					               <slot></slot>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@@ -21,6 +21,16 @@ defineProps({
 | 
				
			|||||||
</script>
 | 
					</script>
 | 
				
			||||||
<style scoped>
 | 
					<style scoped>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (max-width: 768px) {
 | 
				
			||||||
 | 
					    .settings-icon {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .settings-icon-replace {
 | 
				
			||||||
 | 
					        display: unset !important;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
.settings-title {
 | 
					.settings-title {
 | 
				
			||||||
    font-size: 1.1em;
 | 
					    font-size: 1.1em;
 | 
				
			||||||
    color: var(--text-primary);
 | 
					    color: var(--text-primary);
 | 
				
			||||||
@@ -33,6 +43,10 @@ defineProps({
 | 
				
			|||||||
    margin-top: 1px;
 | 
					    margin-top: 1px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.settings-icon-replace {
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.settings-container {
 | 
					.settings-container {
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    gap: 7px;
 | 
					    gap: 7px;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -86,9 +86,10 @@ defineExpose({
 | 
				
			|||||||
 <section>
 | 
					 <section>
 | 
				
			||||||
  <div ref="box" :class="showMenu ? `showed firstbox` : 'firstbox'" @click="showMenu = !showMenu">
 | 
					  <div ref="box" :class="showMenu ? `showed firstbox` : 'firstbox'" @click="showMenu = !showMenu">
 | 
				
			||||||
    <template  v-if="firstSlot">
 | 
					    <template  v-if="firstSlot">
 | 
				
			||||||
      <component :is="firstSlot" />
 | 
					      <component style="white-space: break-spaces;" :is="firstSlot" />
 | 
				
			||||||
    </template>
 | 
					    </template>
 | 
				
			||||||
    <IconAction
 | 
					    <IconAction
 | 
				
			||||||
 | 
					      class="icon"
 | 
				
			||||||
      :icon="showMenu ? 'fa-solid fa-angle-up' : 'fa-solid fa-angle-down'"
 | 
					      :icon="showMenu ? 'fa-solid fa-angle-up' : 'fa-solid fa-angle-down'"
 | 
				
			||||||
    />
 | 
					    />
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
@@ -114,6 +115,7 @@ defineExpose({
 | 
				
			|||||||
  font-size: 14px;
 | 
					  font-size: 14px;
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  justify-content: space-between;
 | 
					  justify-content: space-between;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.container {
 | 
					.container {
 | 
				
			||||||
@@ -148,6 +150,7 @@ defineExpose({
 | 
				
			|||||||
  padding: 5px;
 | 
					  padding: 5px;
 | 
				
			||||||
  background-color: var(--tertiary);
 | 
					  background-color: var(--tertiary);
 | 
				
			||||||
  cursor: pointer;
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  white-space: break-spaces;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.option:hover {
 | 
					.option:hover {
 | 
				
			||||||
@@ -160,4 +163,9 @@ defineExpose({
 | 
				
			|||||||
  padding-bottom: 0; */
 | 
					  padding-bottom: 0; */
 | 
				
			||||||
  border-radius: 5px 5px 0 0 !important;
 | 
					  border-radius: 5px 5px 0 0 !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.icon {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
@@ -11,7 +11,6 @@
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
import { defineProps } from 'vue';
 | 
					 | 
				
			||||||
import Avatar from './Avatar.vue';
 | 
					import Avatar from './Avatar.vue';
 | 
				
			||||||
const props = defineProps({
 | 
					const props = defineProps({
 | 
				
			||||||
    user: {
 | 
					    user: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="metrics" v-if="metrics">
 | 
					    <div class="metrics" v-if="metrics && metrics.length > 0">
 | 
				
			||||||
        <div class="metric" v-for="metric in metrics" :key="metric.name">
 | 
					        <div class="metric" v-for="metric in metrics" :key="metric.name">
 | 
				
			||||||
            <div class="metric-header">
 | 
					            <div class="metric-header">
 | 
				
			||||||
                <Icon class="metric-icon" :icon="getIcons(metric.name)" />
 | 
					                <Icon class="metric-icon" :icon="getIcons(metric.name)" />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,6 @@
 | 
				
			|||||||
<script setup>
 | 
					<script setup>
 | 
				
			||||||
import Events from '@/utils/Events';
 | 
					import Events from '@/utils/Events';
 | 
				
			||||||
import { IORequest } from '@/utils/IORequest';
 | 
					import { IORequest } from '@/utils/IORequest';
 | 
				
			||||||
import { defineProps } from 'vue';
 | 
					 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { ref } from 'vue';
 | 
				
			||||||
import User from '@/components/UI/User.vue';
 | 
					import User from '@/components/UI/User.vue';
 | 
				
			||||||
import Role from '@/components/UI/Role.vue';
 | 
					import Role from '@/components/UI/Role.vue';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,6 +92,7 @@ onMounted(() => {
 | 
				
			|||||||
.version p {
 | 
					.version p {
 | 
				
			||||||
    margin: 0;
 | 
					    margin: 0;
 | 
				
			||||||
    font-size: 12px;
 | 
					    font-size: 12px;
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
    color: var(--text-secondary);
 | 
					    color: var(--text-secondary);
 | 
				
			||||||
}   
 | 
					}   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								src/components/Widget/View/Default.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/components/Widget/View/Default.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					    <p>Test</p>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup>
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										41
									
								
								src/components/Widget/View/LoadingView.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/components/Widget/View/LoadingView.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					    <div class="loading">
 | 
				
			||||||
 | 
					        <div class="loading-content">
 | 
				
			||||||
 | 
					        <Icon icon="fa-solid fa-spinner" spin-pulse />
 | 
				
			||||||
 | 
					        <span>{{ message }}</span>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <span class="second">Un peu de patience, le groupe se prépare !</span>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					<script setup>
 | 
				
			||||||
 | 
					const props = defineProps({
 | 
				
			||||||
 | 
					    message: {
 | 
				
			||||||
 | 
					        type: String,
 | 
				
			||||||
 | 
					        default: 'Chargement en cours...'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.loading {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    justify-content: center;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    font-size: 2rem;
 | 
				
			||||||
 | 
					    gap: 10px;
 | 
				
			||||||
 | 
					    color: var(--text-tertiary);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.loading-content {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    gap: 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.second {
 | 
				
			||||||
 | 
					    font-size: 0.8rem;
 | 
				
			||||||
 | 
					    color: var(--text-secondary);
 | 
				
			||||||
 | 
					    opacity: 0.8;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										3
									
								
								src/components/Widget/View/SearchResults.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/components/Widget/View/SearchResults.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
@@ -1,8 +1,10 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <SocketEnvironment>
 | 
					    <SocketEnvironment>
 | 
				
			||||||
        <div class="container">
 | 
					        <div class="container">
 | 
				
			||||||
             <GuildHeader/>
 | 
					            <Search class="search"/>
 | 
				
			||||||
                <Box>
 | 
					            <div class="left-side">
 | 
				
			||||||
 | 
					                <GuildHeader class="guildheader"/>
 | 
				
			||||||
 | 
					                <Box class="playlist">
 | 
				
			||||||
                    <Button @click="router.push('/servers')">Choisir un serveur</Button>
 | 
					                    <Button @click="router.push('/servers')">Choisir un serveur</Button>
 | 
				
			||||||
                    <Button @click="router.push('/terms')">Terms</Button>
 | 
					                    <Button @click="router.push('/terms')">Terms</Button>
 | 
				
			||||||
                    <Button @click="router.push('/privacy')">Privacy</Button>
 | 
					                    <Button @click="router.push('/privacy')">Privacy</Button>
 | 
				
			||||||
@@ -10,8 +12,11 @@
 | 
				
			|||||||
                    <Button @click="globalStore.toogleTheme()">Changer le thème</Button>
 | 
					                    <Button @click="globalStore.toogleTheme()">Changer le thème</Button>
 | 
				
			||||||
                    <p>{{ guildId }}</p>
 | 
					                    <p>{{ guildId }}</p>
 | 
				
			||||||
                </Box>
 | 
					                </Box>
 | 
				
			||||||
                <Search/>
 | 
					                <Account class="account"/>
 | 
				
			||||||
                <Account/>
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div class="queue"></div>
 | 
				
			||||||
 | 
					            <View class="view"></View>
 | 
				
			||||||
 | 
					            <div class="player"></div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </SocketEnvironment>
 | 
					    </SocketEnvironment>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
@@ -29,6 +34,7 @@ import Account from '@/components/Layout/Account.vue';
 | 
				
			|||||||
import events from '@/utils/Events.js';
 | 
					import events from '@/utils/Events.js';
 | 
				
			||||||
import GuildHeader from '@/components/Layout/GuildHeader.vue';
 | 
					import GuildHeader from '@/components/Layout/GuildHeader.vue';
 | 
				
			||||||
import Search from '@/components/Layout/Search.vue';
 | 
					import Search from '@/components/Layout/Search.vue';
 | 
				
			||||||
 | 
					import View from '@/components/Layout/View.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps({
 | 
					const props = defineProps({
 | 
				
			||||||
    guildId: {
 | 
					    guildId: {
 | 
				
			||||||
@@ -98,11 +104,105 @@ function checkGuildAvailability() {
 | 
				
			|||||||
</script>
 | 
					</script>
 | 
				
			||||||
<style scoped>  
 | 
					<style scoped>  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (max-width: 768px), screen and (max-height: 607px) {
 | 
				
			||||||
    .container {
 | 
					    .container {
 | 
				
			||||||
    padding: 15px;;;
 | 
					        display: flex;
 | 
				
			||||||
    max-width: 400px;
 | 
					        gap: 15px;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    .left-side {
 | 
				
			||||||
        display: flex;
 | 
					        display: flex;
 | 
				
			||||||
        flex-direction: column;
 | 
					        flex-direction: column;
 | 
				
			||||||
    gap: 20px;
 | 
					        gap: 15px;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .guildheader {
 | 
				
			||||||
 | 
					        order: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .account {
 | 
				
			||||||
 | 
					        order: 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .playlist {
 | 
				
			||||||
 | 
					        order: 2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (min-width: 769px) and (max-width: 1280px) and (min-height: 607px) {
 | 
				
			||||||
 | 
					    .queue {
 | 
				
			||||||
 | 
					        display: none
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    .container {
 | 
				
			||||||
 | 
					        display: grid;
 | 
				
			||||||
 | 
					        grid-template-columns: 0.8fr repeat(2, 1fr);
 | 
				
			||||||
 | 
					        grid-template-rows: 0.1fr repeat(2, 1fr) 0.5fr;
 | 
				
			||||||
 | 
					        grid-column-gap: 15px;
 | 
				
			||||||
 | 
					        grid-row-gap: 15px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .left-side { grid-area: 1 / 1 / 5 / 2; }
 | 
				
			||||||
 | 
					    .player { grid-area: 4 / 2 / 5 / 4; }
 | 
				
			||||||
 | 
					    .search { grid-area: 1 / 2 / 2 / 4; }
 | 
				
			||||||
 | 
					    .view { grid-area: 2 / 2 / 4 / 4; }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    .left-side {
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					        gap: 15px;
 | 
				
			||||||
 | 
					        height: 100%;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .playlist {
 | 
				
			||||||
 | 
					        flex: 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media screen and (min-width: 1281px) {
 | 
				
			||||||
 | 
					    .container {
 | 
				
			||||||
 | 
					        display: grid;
 | 
				
			||||||
 | 
					        grid-template-columns: 0.7fr repeat(2, 1fr) 0.8fr;
 | 
				
			||||||
 | 
					        grid-template-rows: 0.1fr repeat(2, 1fr) 0.5fr;
 | 
				
			||||||
 | 
					        grid-column-gap: 15px;
 | 
				
			||||||
 | 
					        grid-row-gap: 15px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .left-side { grid-area: 1 / 1 / 5 / 2; }
 | 
				
			||||||
 | 
					    .player { grid-area: 4 / 2 / 5 / 4; }
 | 
				
			||||||
 | 
					    .search { grid-area: 1 / 2 / 2 / 4; }
 | 
				
			||||||
 | 
					    .queue { grid-area: 1 / 4 / 5 / 5; }
 | 
				
			||||||
 | 
					    .view { grid-area: 2 / 2 / 4 / 4; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .left-side {
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					        gap: 15px;
 | 
				
			||||||
 | 
					        height: 100%;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .playlist {
 | 
				
			||||||
 | 
					        flex: 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.container {
 | 
				
			||||||
 | 
					    padding: 15px;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.queue, .view, .player {
 | 
				
			||||||
 | 
					    background-color: var(--secondary);
 | 
				
			||||||
 | 
					    border-radius: 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user