This commit is contained in:
exttex
2021-01-21 19:19:14 +01:00
parent 5c40db1242
commit 87eb351e80
29 changed files with 2060 additions and 890 deletions

View File

@ -0,0 +1,67 @@
<template>
<v-list dense>
<!-- Play album -->
<v-list-item dense @click='$emit("play")'>
<v-list-item-icon>
<v-icon>mdi-play</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Play")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Add to queue -->
<v-list-item dense @click='$emit("addQueue")'>
<v-list-item-icon>
<v-icon>mdi-playlist-plus</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Add to queue")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Add to library -->
<v-list-item dense @click='$emit("library")' v-if='!album.library'>
<v-list-item-icon>
<v-icon>mdi-heart</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Add to library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Remove from library -->
<v-list-item dense @click='$emit("library")' v-if='album.library'>
<v-list-item-icon>
<v-icon>mdi-heart-remove</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Remove from library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Share -->
<v-list-item dense @click='$emit("share")'>
<v-list-item-icon>
<v-icon>mdi-share-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Share")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Download -->
<v-list-item dense @click='$emit("download")'>
<v-list-item-icon>
<v-icon>mdi-download</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Download")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</template>
<script>
export default {
name: 'AlbumContext',
props: {
album: Object,
}
}
</script>

View File

@ -19,68 +19,28 @@
<v-list-item-subtitle>{{album.artistString}}</v-list-item-subtitle>
</v-list-item-content>
<v-list-item-action>
<!-- Context menu -->
<v-menu v-model='menu' offset-y offset-x absolue>
<!-- Context -->
<v-menu offset-y offset-x absolue>
<template v-slot:activator="{on, attrs}">
<v-btn v-on='on' v-bind='attrs' icon>
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</template>
<v-list dense>
<!-- Play album -->
<v-list-item dense @click='play'>
<v-list-item-icon>
<v-icon>mdi-play</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Play")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Add to library -->
<v-list-item dense @click='library' v-if='!album.library'>
<v-list-item-icon>
<v-icon>mdi-heart</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Add to library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Remove from library -->
<v-list-item dense @click='library' v-if='album.library'>
<v-list-item-icon>
<v-icon>mdi-heart-remove</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Remove from library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Share -->
<v-list-item dense @click='share'>
<v-list-item-icon>
<v-icon>mdi-share-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Share")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Download -->
<v-list-item dense @click='download'>
<v-list-item-icon>
<v-icon>mdi-download</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Download")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
<AlbumContext
:album='album'
@play='play'
@download='download'
@addQueue='addQueue'
@share='share'
@library='library'
></AlbumContext>
</v-menu>
</v-list-item-action>
</v-list-item>
<!-- Card version -->
<v-card v-if='card' max-width='175px' max-height='230px' @click='click' color='transparent' elevation='0'>
<v-card v-if='card' max-width='175px' max-height='230px' @click='click' color='transparent' elevation='0' @contextmenu="showMenu">
<v-hover v-slot:default='{hover}'>
<div>
@ -96,6 +56,26 @@
</div>
</v-hover>
<!-- Context -->
<v-menu
v-model='menu'
:position-x='menuX'
:position-y='menuY'
absolute
offset-y
close-on-click>
<AlbumContext
:album='album'
@play='play'
@download='download'
@addQueue='addQueue'
@share='share'
@library='library'
></AlbumContext>
</v-menu>
<div class='px-2 pt-2 pb-1 text-subtitle-2 text-center text-truncate'>{{album.title}}</div>
<div class='pb-1 px-2 text-caption text-center text-truncate'>{{album.artistString}}</div>
@ -108,15 +88,18 @@
<script>
import DownloadDialog from '@/components/DownloadDialog.vue';
import AlbumContext from '@/components/AlbumContext.vue';
export default {
name: 'AlbumTile',
components: {DownloadDialog},
components: {DownloadDialog, AlbumContext},
data() {
return {
menu: false,
hover: false,
downloadDialog: false
downloadDialog: false,
menuX: 0,
menuY: 0,
}
},
props: {
@ -127,6 +110,15 @@ export default {
}
},
methods: {
showMenu(e) {
e.preventDefault();
this.menu = false;
this.menuX = e.clientX;
this.menuY = e.clientY;
this.$nextTick(() => {
this.menu = true;
});
},
async play() {
let album = this.album;
//Load album from API if tracks are missing
@ -145,6 +137,18 @@ export default {
this.$root.replaceQueue(album.tracks);
this.$root.playIndex(0);
},
//Add to queue
async addQueue() {
let album = this.album;
//Load album from API if tracks are missing
if (album.tracks.length == 0) {
let data = await this.$axios.get(`/album/${album.id}`)
album = data.data;
}
if (!album) return;
this.$root.queue.data = this.$root.queue.data.concat(album.tracks);
},
//On click navigate to details
click() {
this.$router.push({
@ -188,7 +192,7 @@ export default {
document.body.removeChild(copyElem);
this.$root.globalSnackbar = this.$t('Link copied!');
}
}
},
};
</script>

View File

@ -1,5 +1,5 @@
<template>
<div v-scroll.self='scroll'>
<div>
<div class='px-4 pt-2 d-flex' style='max-height: 50px;'>
<div class='text-overline px-2 pt-1'>
{{count}} {{$t("TRACKS")}}
@ -24,7 +24,7 @@
></v-text-field>
</div>
<v-list :height='height' class='overflow-y-auto'>
<v-list :height='height' class='overflow-y-auto' v-scroll.self='scroll' >
<v-lazy
v-for='(track, index) in filtered'
:key='index + "t" + track.id'
@ -69,7 +69,8 @@ export default {
},
methods: {
scroll(event) {
let loadOffset = event.target.scrollHeight - event.target.offsetHeight - 100;
console.log(event);
let loadOffset = event.target.scrollHeight - event.target.offsetHeight - 150;
if (event.target.scrollTop > loadOffset) {
if (!this.loading) this.load();
}