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 name="ChangeListManager">
 | 
			
		||||
    <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$/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/Player.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/components/Player.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/Loader.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/Loader.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" />
 | 
			
		||||
      <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/Miniature.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/Miniature.vue" afterDir="false" />
 | 
			
		||||
      <change beforePath="$PROJECT_DIR$/frontend/src/items/SwitchTab.vue" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/items/SwitchTab.vue" afterDir="false" />
 | 
			
		||||
    </list>
 | 
			
		||||
    <option name="SHOW_DIALOG" value="false" />
 | 
			
		||||
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
 | 
			
		||||
@@ -108,7 +106,7 @@
 | 
			
		||||
      <workItem from="1744962250986" duration="599000" />
 | 
			
		||||
      <workItem from="1744963762669" duration="7674000" />
 | 
			
		||||
      <workItem from="1745243053934" duration="15721000" />
 | 
			
		||||
      <workItem from="1746260006352" duration="16911000" />
 | 
			
		||||
      <workItem from="1746260006352" duration="20086000" />
 | 
			
		||||
    </task>
 | 
			
		||||
    <servers />
 | 
			
		||||
  </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>
 | 
			
		||||
  <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>
 | 
			
		||||
 | 
			
		||||
</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 LectureListIcon from "../assets/Icons/LectureListIcon.vue";
 | 
			
		||||
import {lectureListIsOpen, lectureListPopUp, playlistPopUp, playlistsIsOpen} from "../stores/globalStore.ts";
 | 
			
		||||
import UploadIcon from "../assets/Icons/UploadIcon.vue";
 | 
			
		||||
 | 
			
		||||
const lectureList = lectureListIsOpen();
 | 
			
		||||
const playlists = playlistsIsOpen();
 | 
			
		||||
@@ -18,11 +19,29 @@ const 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>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <header>
 | 
			
		||||
    <InputSearch />
 | 
			
		||||
    <button @click="uploadMyFile">
 | 
			
		||||
      <UploadIcon />
 | 
			
		||||
    </button>
 | 
			
		||||
    <button @click="togglePlaylists" v-if="playlistPopUp().popUp">
 | 
			
		||||
      <PlaylistIcon />
 | 
			
		||||
    </button>
 | 
			
		||||
 
 | 
			
		||||
@@ -28,15 +28,6 @@ const historyList = historyListStore();
 | 
			
		||||
  <div :class="props.popup == true ? 'lecture-list--popup' : 'lecture-list'">
 | 
			
		||||
    <div class="lecture-list__content">
 | 
			
		||||
      <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
 | 
			
		||||
            :selectedTab="nav == 'lecture' ? 1 : 2"
 | 
			
		||||
            tab1-label="Liste de lecture"
 | 
			
		||||
@@ -44,6 +35,15 @@ const historyList = historyListStore();
 | 
			
		||||
            tab2-label="Historique de lecture"
 | 
			
		||||
            :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>
 | 
			
		||||
      <MiniatureList
 | 
			
		||||
          v-if="nav == 'lecture'"
 | 
			
		||||
@@ -87,12 +87,27 @@ const historyList = historyListStore();
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
 | 
			
		||||
  &__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 {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-content: center;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
      justify-content: end;
 | 
			
		||||
      gap: 5px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
import { defineProps } from 'vue';
 | 
			
		||||
import Add from "../assets/Icons/Add.vue";
 | 
			
		||||
import Play from "../assets/Icons/Play.vue";
 | 
			
		||||
import SaveIcon from "../assets/Icons/SaveIcon.vue";
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
  thumbnail: string;
 | 
			
		||||
@@ -17,12 +18,21 @@ const props = defineProps<{
 | 
			
		||||
      <img :src="props.thumbnail" alt="Video Thumbnail" />
 | 
			
		||||
      <p class="miniature__img__duration" >{{duration}}</p>
 | 
			
		||||
      <div class="miniature__img__overlay">
 | 
			
		||||
        <button>
 | 
			
		||||
        <button
 | 
			
		||||
          title="Ajouter à la liste de lecture"
 | 
			
		||||
        >
 | 
			
		||||
          <Add />
 | 
			
		||||
        </button>
 | 
			
		||||
        <button>
 | 
			
		||||
        <button
 | 
			
		||||
          title="Jouer le song maintenant"
 | 
			
		||||
        >
 | 
			
		||||
          <Play />
 | 
			
		||||
        </button>
 | 
			
		||||
        <button
 | 
			
		||||
          title="Ajouter à la playlist"
 | 
			
		||||
        >
 | 
			
		||||
          <SaveIcon />
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="miniature__info">
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ const props = defineProps<{
 | 
			
		||||
  tab1Label?: string;
 | 
			
		||||
  tab2Click?: (event: MouseEvent) => void;
 | 
			
		||||
  tab2Label?: string;
 | 
			
		||||
  tab1Lecture?: number;
 | 
			
		||||
}>();
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
@@ -22,7 +23,7 @@ const props = defineProps<{
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
.tab-container {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  width: 79%;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  align-items: flex-start;
 | 
			
		||||
@@ -30,7 +31,7 @@ const props = defineProps<{
 | 
			
		||||
  padding: 2px;
 | 
			
		||||
  background-color: var(--neutral-50);
 | 
			
		||||
  border-radius: 9px;
 | 
			
		||||
  margin: 10px 20px 0px 20px;
 | 
			
		||||
  margin-right: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.indicator {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user