cleanup duplicated artist/album lists

This commit is contained in:
Thomas Amland 2020-07-31 11:28:48 +02:00
parent e0288bb04e
commit 4559846172
12 changed files with 116 additions and 190 deletions

View File

@ -4,26 +4,19 @@
<template v-else> <template v-else>
<div v-for="section in sections" :key="section.key" class="mb-4"> <div v-for="section in sections" :key="section.key" class="mb-4">
<h1>{{ section.name }}</h1> <h1>{{ section.name }}</h1>
<Tiles square> <AlbumList :items="$data[section.key]"/>
<Tile v-for="item in $data[section.key]" :key="item.id"
:image="item.image"
:to="{name: 'album', params: { id: item.id } }"
:title="item.name">
<template v-slot:text>
<router-link :to="{name: 'artist', params: { id: item.artistId } }">
{{ item.artist }}
</router-link>
</template>
</Tile>
</Tiles>
</div> </div>
</template> </template>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import AlbumList from "@/library/album/AlbumList.vue";
export default Vue.extend({ export default Vue.extend({
components: {
AlbumList,
},
data() { data() {
return { return {
sections: [ sections: [

View File

@ -1,35 +0,0 @@
<template>
<div class="card">
<img class="card-img-top" :src="item.image">
<div class="card-body">
<div class=" ">
<div class="text-truncate">
<router-link :to="{name: 'album', params: { id: item.id } }">
<strong>{{ item.name }}</strong>
</router-link>
</div>
<div class="text-truncate text-muted">
{{ item.artist }}
</div>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.on-hover {
opacity: 0.6;
}
.show-btns {
color: rgba(255, 255, 255, 1) !important;
}
</style>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
props: {
item: Object
}
});
</script>

View File

@ -0,0 +1,50 @@
<template>
<div>
<Spinner :data="albums" v-slot="{albums: data}">
<AlbumList :items="albums"/>
</Spinner>
</div>
</template>
<script lang="ts">
import Vue from "vue";
import AlbumList from './AlbumList.vue';
import { AlbumSort } from '@/shared/api';
export default Vue.extend({
components: {
AlbumList,
},
props: {
msg: String
},
data() {
return {
sort: "newest",
albums: null,
};
},
computed: {
sortOptions() {
return [
{ text: "A-Z", value: "alphabeticalByName" },
{ text: "Date", value: "newest" },
{ text: "frequent", value: "frequent" },
// { text: "random", value: "random" },
// { text: "recent", value: "recent" },
// { text: "starred", value: "starred" },
]
}
},
watch: {
sort: {
immediate: true,
handler(value: AlbumSort) {
this.albums = null;
this.$api.getAlbums(value).then(albums => {
this.albums = albums;
});
}
}
},
});
</script>

View File

@ -1,59 +1,14 @@
<template> <template functional>
<div>
<Spinner :data="albums" v-slot="{albums: data}">
<Tiles square> <Tiles square>
<Tile v-for="item in albums" :key="item.id" <Tile v-for="item in props.items" :key="item.id"
:image="item.image" :image="item.image"
:to="{name: 'album', params: { id: item.id } }" :to="{name: 'album', params: { id: item.id } }"
:title="item.name"> :title="item.name">
<template v-slot:text> <template v-slot:text>
<router-link :to="{name: 'artist', params: { id: item.artistId } }"> <router-link :to="{name: 'artist', params: { id: item.artistId } }" class="text-muted">
{{ item.artist }} {{ item.artist }}
</router-link> </router-link>
</template> </template>
</Tile> </Tile>
</Tiles> </Tiles>
</Spinner>
</div>
</template> </template>
<script lang="ts">
import Vue from "vue";
import { AlbumSort } from '@/shared/api';
export default Vue.extend({
props: {
msg: String
},
data() {
return {
sort: "newest",
albums: null,
};
},
computed: {
sortOptions() {
return [
{ text: "A-Z", value: "alphabeticalByName" },
{ text: "Date", value: "newest" },
{ text: "frequent", value: "frequent" },
// { text: "random", value: "random" },
// { text: "recent", value: "recent" },
// { text: "starred", value: "starred" },
]
}
},
watch: {
sort: {
immediate: true,
handler(value: AlbumSort) {
this.albums = null;
this.$api.getAlbums(value).then(albums => {
this.albums = albums;
});
}
}
},
created() {
}
});
</script>

View File

@ -1,21 +0,0 @@
<template>
<div>
<div class="text-truncate">
<router-link :to="{name: 'artist', params: { id: item.id } }">
<strong>{{ item.name }}</strong>
</router-link>
</div>
<div class="text-truncate text-muted">
<strong>{{ item.albumCount }}</strong> albums
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
props: {
item: { type: Object, required: true }
}
});
</script>

View File

@ -10,31 +10,22 @@
</div> </div>
</div> </div>
<h3 class="pt-5">Albums</h3> <h3 class="pt-5">Albums</h3>
<Tiles square> <AlbumList :items="item.albums"/>
<Tile v-for="item in item.albums" :key="item.id"
:image="item.image"
:to="{name: 'album', params: { id: item.id } }"
:title="item.name"
:text="item.artist">
</Tile>
</Tiles>
<h3 class="pt-5">Similar artist</h3> <h3 class="pt-5">Similar artist</h3>
<Tiles> <ArtistList :items="item.similarArtist"/>
<Tile v-for="item in item.similarArtist" :key="item.id"
:to="{name: 'artist', params: { id: item.id } }"
:title="item.name">
<template v-slot:text>
<strong>{{ item.albumCount }}</strong> albums
</template>
</Tile>
</Tiles>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from "vue"; import Vue from "vue";
import AlbumList from "@/library/album/AlbumList.vue";
import ArtistList from "@/library/artist/ArtistList.vue";
export default Vue.extend({ export default Vue.extend({
components: {}, components: {
AlbumList,
ArtistList,
},
props: { props: {
id: String id: String
}, },

View File

@ -0,0 +1,23 @@
<template>
<ArtistList :items="items"/>
</template>
<script lang="ts">
import Vue from "vue";
import ArtistList from './ArtistList.vue';
export default Vue.extend({
components: {
ArtistList,
},
data() {
return {
items: []
};
},
created() {
this.$api.getArtists().then(items => {
this.items = items;
});
}
});
</script>

View File

@ -1,7 +1,6 @@
<template> <template functional>
<Tiles> <Tiles>
<Tile v-for="item in items" :key="item.id" <Tile v-for="item in props.items" :key="item.id"
:image="item.image"
:to="{name: 'artist', params: { id: item.id } }" :to="{name: 'artist', params: { id: item.id } }"
:title="item.name"> :title="item.name">
<template v-slot:text> <template v-slot:text>
@ -10,19 +9,3 @@
</Tile> </Tile>
</Tiles> </Tiles>
</template> </template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
data() {
return {
items: []
};
},
created() {
this.$api.getArtists().then(items => {
this.items = items;
});
}
});
</script>

View File

@ -1,15 +1,8 @@
<template> <template>
<div v-if="result"> <div v-if="result">
<div> <div>
<h5 class="text-uppercase">Artists</h5> <h5 class="text-uppercase">Artists</h5>
<div class="d-flex"> <ArtistList :items="result.artists"/>
<div class="tiles">
<div v-for="item in result.artists" :key="item.id">
<ArtistCard :item="item"></ArtistCard>
</div>
</div>
</div>
<b-table-simple hover borderless> <b-table-simple hover borderless>
<tbody> <tbody>
@ -22,13 +15,7 @@
<div> <div>
<h5 class="text-uppercase">Albums</h5> <h5 class="text-uppercase">Albums</h5>
<div class="d-flex"> <AlbumList :items="result.albums"/>
<div class="tiles">
<div v-for="item in result.albums" :key="item.id">
<AlbumCard :item="item"></AlbumCard>
</div>
</div>
</div>
<b-table-simple hover borderless> <b-table-simple hover borderless>
<tbody> <tbody>
<tr v-for="item in result.albums"> <tr v-for="item in result.albums">
@ -72,13 +59,13 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from "vue"; import Vue from "vue";
import AlbumCard from "@/library/album/AlbumCard.vue"; import AlbumList from "@/library/album/AlbumList.vue";
import ArtistCard from "@/library/artist/ArtistCard.vue"; import ArtistList from "@/library/artist/ArtistList.vue";
export default Vue.extend({ export default Vue.extend({
components: { components: {
AlbumCard, AlbumList,
ArtistCard, ArtistList,
}, },
props: { props: {
query: String, query: String,

View File

@ -3,13 +3,13 @@ import Router from 'vue-router'
import Login from '@/auth/Login.vue' import Login from '@/auth/Login.vue'
import Queue from '@/player/Queue.vue' import Queue from '@/player/Queue.vue'
import Home from '@/home/Home.vue' import Home from '@/home/Home.vue'
import AlbumList from '@/library/album/AlbumList.vue'
import ArtistDetails from '@/library/artist/ArtistDetails.vue' import ArtistDetails from '@/library/artist/ArtistDetails.vue'
import ArtistList from '@/library/artist/ArtistList.vue' import ArtistLibrary from '@/library/artist/ArtistLibrary.vue'
import Album from '@/library/album/Album.vue' import AlbumDetails from '@/library/album/AlbumDetails.vue'
import AlbumLibrary from '@/library/album/AlbumLibrary.vue'
import RandomSongs from '@/playlist/RandomSongs.vue' import RandomSongs from '@/playlist/RandomSongs.vue'
import GenreList from '@/library/genre/GenreList.vue'
import GenreDetails from '@/library/genre/GenreDetails.vue' import GenreDetails from '@/library/genre/GenreDetails.vue'
import GenreLibrary from '@/library/genre/GenreLibrary.vue'
import Starred from '@/library/starred/Starred.vue' import Starred from '@/library/starred/Starred.vue'
import Playlist from '@/playlist/Playlist.vue' import Playlist from '@/playlist/Playlist.vue'
import PlaylistList from '@/playlist/PlaylistList.vue' import PlaylistList from '@/playlist/PlaylistList.vue'
@ -44,18 +44,18 @@ export function setupRouter(auth: AuthService) {
{ {
name: 'albums', name: 'albums',
path: '/albums', path: '/albums',
component: AlbumList component: AlbumLibrary
}, },
{ {
name: 'album', name: 'album',
path: '/album/:id', path: '/album/:id',
component: Album, component: AlbumDetails,
props: true, props: true,
}, },
{ {
name: 'artists', name: 'artists',
path: '/artists', path: '/artists',
component: ArtistList component: ArtistLibrary
}, },
{ {
name: 'artist', name: 'artist',
@ -66,7 +66,7 @@ export function setupRouter(auth: AuthService) {
{ {
name: 'genres', name: 'genres',
path: '/genres', path: '/genres',
component: GenreList, component: GenreLibrary,
}, },
{ {
name: 'genre', name: 'genre',