add icon save and upload file and fix switch tab
This commit is contained in:
14
.idea/workspace.xml
generated
14
.idea/workspace.xml
generated
@@ -5,15 +5,13 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="5847035d-0a9b-4d26-a129-e3ed88eb8bd7" name="Changes" comment="">
|
<list default="true" id="5847035d-0a9b-4d26-a129-e3ed88eb8bd7" name="Changes" comment="">
|
||||||
|
<change afterPath="$PROJECT_DIR$/frontend/src/assets/Icons/SaveIcon.vue" afterDir="false" />
|
||||||
|
<change afterPath="$PROJECT_DIR$/frontend/src/assets/Icons/UploadIcon.vue" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/assets/Global.scss" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/assets/Global.scss" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/components/Header.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/components/Header.vue" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/frontend/src/components/Header.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/components/Header.vue" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/components/Player.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/components/Player.vue" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/frontend/src/components/LectureList.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/components/LectureList.vue" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/items/Button.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/Button.vue" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/frontend/src/items/Miniature.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/Miniature.vue" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/items/Loader.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/Loader.vue" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/frontend/src/items/SwitchTab.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/SwitchTab.vue" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/items/PlaylistItem.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/PlaylistItem.vue" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/items/UserLoginInfo.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/UserLoginInfo.vue" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/frontend/src/views/Home.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/views/Home.vue" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -108,7 +106,7 @@
|
|||||||
<workItem from="1744962250986" duration="599000" />
|
<workItem from="1744962250986" duration="599000" />
|
||||||
<workItem from="1744963762669" duration="7674000" />
|
<workItem from="1744963762669" duration="7674000" />
|
||||||
<workItem from="1745243053934" duration="15721000" />
|
<workItem from="1745243053934" duration="15721000" />
|
||||||
<workItem from="1746260006352" duration="16911000" />
|
<workItem from="1746260006352" duration="20086000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
|
14
frontend/src/assets/Icons/SaveIcon.vue
Normal file
14
frontend/src/assets/Icons/SaveIcon.vue
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M15 8H8.6C8.03995 8 7.75992 8 7.54601 7.89101C7.35785 7.79513 7.20487 7.64215 7.10899 7.45399C7 7.24008 7 6.96005 7 6.4V3M17 21V14.6C17 14.0399 17 13.7599 16.891 13.546C16.7951 13.3578 16.6422 13.2049 16.454 13.109C16.2401 13 15.9601 13 15.4 13H8.6C8.03995 13 7.75992 13 7.54601 13.109C7.35785 13.2049 7.20487 13.3578 7.10899 13.546C7 13.7599 7 14.0399 7 14.6V21M21 9.32548V16.2C21 17.8802 21 18.7202 20.673 19.362C20.3854 19.9265 19.9265 20.3854 19.362 20.673C18.7202 21 17.8802 21 16.2 21H7.8C6.11984 21 5.27976 21 4.63803 20.673C4.07354 20.3854 3.6146 19.9265 3.32698 19.362C3 18.7202 3 17.8802 3 16.2V7.8C3 6.11984 3 5.27976 3.32698 4.63803C3.6146 4.07354 4.07354 3.6146 4.63803 3.32698C5.27976 3 6.11984 3 7.8 3H14.6745C15.1637 3 15.4083 3 15.6385 3.05526C15.8425 3.10425 16.0376 3.18506 16.2166 3.29472C16.4184 3.4184 16.5914 3.59135 16.9373 3.93726L20.0627 7.06274C20.4086 7.40865 20.5816 7.5816 20.7053 7.78343C20.8149 7.96237 20.8957 8.15746 20.9447 8.36154C21 8.59171 21 8.8363 21 9.32548Z" class="iconFixedStrokeWhite" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M21 3H3M12 21V7M12 7L5 14M12 7L19 14" class="iconDefaultStrokeReverse" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M21 3H3M12 21V7M12 7L5 14M12 7L19 14" class="iconFixedStrokeWhite" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
14
frontend/src/assets/Icons/UploadIcon.vue
Normal file
14
frontend/src/assets/Icons/UploadIcon.vue
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M21 15V16.2C21 17.8802 21 18.7202 20.673 19.362C20.3854 19.9265 19.9265 20.3854 19.362 20.673C18.7202 21 17.8802 21 16.2 21H7.8C6.11984 21 5.27976 21 4.63803 20.673C4.07354 20.3854 3.6146 19.9265 3.32698 19.362C3 18.7202 3 17.8802 3 16.2V15M17 8L12 3M12 3L7 8M12 3V15" class="iconFixedStrokeWhite" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
@@ -4,6 +4,7 @@ import InputSearch from "../items/InputSearch.vue";
|
|||||||
import PlaylistIcon from "../assets/Icons/PlaylistIcon.vue";
|
import PlaylistIcon from "../assets/Icons/PlaylistIcon.vue";
|
||||||
import LectureListIcon from "../assets/Icons/LectureListIcon.vue";
|
import LectureListIcon from "../assets/Icons/LectureListIcon.vue";
|
||||||
import {lectureListIsOpen, lectureListPopUp, playlistPopUp, playlistsIsOpen} from "../stores/globalStore.ts";
|
import {lectureListIsOpen, lectureListPopUp, playlistPopUp, playlistsIsOpen} from "../stores/globalStore.ts";
|
||||||
|
import UploadIcon from "../assets/Icons/UploadIcon.vue";
|
||||||
|
|
||||||
const lectureList = lectureListIsOpen();
|
const lectureList = lectureListIsOpen();
|
||||||
const playlists = playlistsIsOpen();
|
const playlists = playlistsIsOpen();
|
||||||
@@ -18,11 +19,29 @@ const togglePlaylists = () => {
|
|||||||
playlists.togglePlaylists();
|
playlists.togglePlaylists();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const uploadMyFile = () => {
|
||||||
|
const input = document.createElement("input");
|
||||||
|
input.type = "file";
|
||||||
|
input.accept = ".MP4, .MP3, .WAV, .M4A, .AAC, .OGG, .FLAC";
|
||||||
|
input.click();
|
||||||
|
input.onchange = async (e) => {
|
||||||
|
const file = (e.target as HTMLInputElement).files?.[0];
|
||||||
|
if (file) {
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append("file", file);
|
||||||
|
console.log("File uploaded:", file);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<header>
|
<header>
|
||||||
<InputSearch />
|
<InputSearch />
|
||||||
|
<button @click="uploadMyFile">
|
||||||
|
<UploadIcon />
|
||||||
|
</button>
|
||||||
<button @click="togglePlaylists" v-if="playlistPopUp().popUp">
|
<button @click="togglePlaylists" v-if="playlistPopUp().popUp">
|
||||||
<PlaylistIcon />
|
<PlaylistIcon />
|
||||||
</button>
|
</button>
|
||||||
|
@@ -28,15 +28,6 @@ const historyList = historyListStore();
|
|||||||
<div :class="props.popup == true ? 'lecture-list--popup' : 'lecture-list'">
|
<div :class="props.popup == true ? 'lecture-list--popup' : 'lecture-list'">
|
||||||
<div class="lecture-list__content">
|
<div class="lecture-list__content">
|
||||||
<div class="lecture-list__header">
|
<div class="lecture-list__header">
|
||||||
<div v-if="nav == 'lecture'">
|
|
||||||
<button>
|
|
||||||
<Trash color="#FF306F"/>
|
|
||||||
</button>
|
|
||||||
<div>
|
|
||||||
<p>{{ lecturesList.lectures.length }}</p>
|
|
||||||
<InPlayListIcon/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<SwitchTab
|
<SwitchTab
|
||||||
:selectedTab="nav == 'lecture' ? 1 : 2"
|
:selectedTab="nav == 'lecture' ? 1 : 2"
|
||||||
tab1-label="Liste de lecture"
|
tab1-label="Liste de lecture"
|
||||||
@@ -44,6 +35,15 @@ const historyList = historyListStore();
|
|||||||
tab2-label="Historique de lecture"
|
tab2-label="Historique de lecture"
|
||||||
:tab2-click="() => {switchNav('history')}"
|
:tab2-click="() => {switchNav('history')}"
|
||||||
/>
|
/>
|
||||||
|
<div class="sub_header" v-if="nav == 'lecture'">
|
||||||
|
<div>
|
||||||
|
<p>{{ lecturesList.lectures.length }}</p>
|
||||||
|
<InPlayListIcon/>
|
||||||
|
</div>
|
||||||
|
<button>
|
||||||
|
<Trash color="#FF306F"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<MiniatureList
|
<MiniatureList
|
||||||
v-if="nav == 'lecture'"
|
v-if="nav == 'lecture'"
|
||||||
@@ -87,12 +87,27 @@ const historyList = historyListStore();
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
&__header {
|
&__header {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
|
||||||
|
.sub_header {
|
||||||
|
flex : 1 1 auto;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 5px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
|
||||||
div {
|
div {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: end;
|
}
|
||||||
gap: 5px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
import { defineProps } from 'vue';
|
import { defineProps } from 'vue';
|
||||||
import Add from "../assets/Icons/Add.vue";
|
import Add from "../assets/Icons/Add.vue";
|
||||||
import Play from "../assets/Icons/Play.vue";
|
import Play from "../assets/Icons/Play.vue";
|
||||||
|
import SaveIcon from "../assets/Icons/SaveIcon.vue";
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
thumbnail: string;
|
thumbnail: string;
|
||||||
@@ -17,12 +18,21 @@ const props = defineProps<{
|
|||||||
<img :src="props.thumbnail" alt="Video Thumbnail" />
|
<img :src="props.thumbnail" alt="Video Thumbnail" />
|
||||||
<p class="miniature__img__duration" >{{duration}}</p>
|
<p class="miniature__img__duration" >{{duration}}</p>
|
||||||
<div class="miniature__img__overlay">
|
<div class="miniature__img__overlay">
|
||||||
<button>
|
<button
|
||||||
|
title="Ajouter à la liste de lecture"
|
||||||
|
>
|
||||||
<Add />
|
<Add />
|
||||||
</button>
|
</button>
|
||||||
<button>
|
<button
|
||||||
|
title="Jouer le song maintenant"
|
||||||
|
>
|
||||||
<Play />
|
<Play />
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
title="Ajouter à la playlist"
|
||||||
|
>
|
||||||
|
<SaveIcon />
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="miniature__info">
|
<div class="miniature__info">
|
||||||
|
@@ -8,6 +8,7 @@ const props = defineProps<{
|
|||||||
tab1Label?: string;
|
tab1Label?: string;
|
||||||
tab2Click?: (event: MouseEvent) => void;
|
tab2Click?: (event: MouseEvent) => void;
|
||||||
tab2Label?: string;
|
tab2Label?: string;
|
||||||
|
tab1Lecture?: number;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@@ -22,7 +23,7 @@ const props = defineProps<{
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.tab-container {
|
.tab-container {
|
||||||
width: 100%;
|
width: 79%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
@@ -30,7 +31,7 @@ const props = defineProps<{
|
|||||||
padding: 2px;
|
padding: 2px;
|
||||||
background-color: var(--neutral-50);
|
background-color: var(--neutral-50);
|
||||||
border-radius: 9px;
|
border-radius: 9px;
|
||||||
margin: 10px 20px 0px 20px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.indicator {
|
.indicator {
|
||||||
|
Reference in New Issue
Block a user