link to album views from home page

This commit is contained in:
Thomas Amland 2020-08-22 09:29:34 +02:00
parent 9c93ec6e56
commit 2bcafbffaa
6 changed files with 49 additions and 40 deletions

View File

@ -22,7 +22,7 @@
</small>
</a>
<router-link class="nav-link" :to="{name: 'albums'}">
<router-link class="nav-link" :to="{name: 'albums', params: {sort: 'a-z'}}">
<Icon icon="collection" /> Albums
</router-link>

View File

@ -3,9 +3,17 @@
<Spinner v-if="loading" />
<template v-else>
<div v-for="section in sections" :key="section.key" class="mb-4">
<template v-if="$data[section.key].length > 0">
<h1>{{ section.name }}</h1>
<AlbumList :items="$data[section.key]" />
<template v-if="result[section.key].length > 0">
<h1>
{{ section.name }}
<router-link
:to="{name: 'albums', params: {sort: section.key}}"
class="text-muted"
>
<Icon icon="chevron-compact-right" />
</router-link>
</h1>
<AlbumList :items="result[section.key]" />
</template>
</div>
</template>
@ -23,36 +31,38 @@
data() {
return {
loading: true as boolean,
recent: [] as Album[],
newest: [] as Album[],
frequent: [] as Album[],
random: [] as Album[],
result: {
'recently-added': [] as Album[],
'recently-played': [] as Album[],
'most-played': [] as Album[],
random: [] as Album[],
}
}
},
computed: {
sections(): any[] {
return [
{ name: 'Recently added', key: 'newest' },
{ name: 'Recently played', key: 'recent' },
{ name: 'Most played', key: 'frequent' },
{ name: 'Recently added', key: 'recently-added' },
{ name: 'Recently played', key: 'recently-played' },
{ name: 'Most played', key: 'most-played' },
{ name: 'Random', key: 'random' },
]
}
},
created() {
const size = 10
this.$api.getAlbums('newest', size).then(result => {
this.newest = result
this.$api.getAlbums('recently-added', size).then(result => {
this.result['recently-added'] = result
this.loading = false
})
this.$api.getAlbums('recent', size).then(result => {
this.recent = result
this.$api.getAlbums('recently-played', size).then(result => {
this.result['recently-played'] = result
})
this.$api.getAlbums('frequent', size).then(result => {
this.frequent = result
this.$api.getAlbums('most-played', size).then(result => {
this.result['most-played'] = result
})
this.$api.getAlbums('random', 50).then(result => {
this.random = result
this.result.random = result
})
}
})

View File

@ -1,7 +1,7 @@
<template>
<div>
<ul class="nav-underlined">
<li v-for="{ value, text } in categories" :key="value">
<li v-for="{ value, text } in options" :key="value">
<router-link :to="{... $route, params: {... $route.params, sort: value }}">
{{ text }}
</router-link>
@ -17,14 +17,6 @@
import AlbumList from './AlbumList.vue'
import { Album, AlbumSort } from '@/shared/api'
const categoryToSort = {
'a-z': 'alphabeticalByName',
'recently-added': 'newest',
'recently-played': 'recent',
'most-played': 'frequent',
random: 'random',
} as {[key: string]: AlbumSort}
export default Vue.extend({
components: {
AlbumList,
@ -38,7 +30,7 @@
}
},
computed: {
categories() {
options() {
return [
{ text: 'A-Z', value: 'a-z' },
{ text: 'Recently added', value: 'recently-added' },
@ -51,9 +43,9 @@
watch: {
sort: {
immediate: true,
handler(value: string) {
handler(value: AlbumSort) {
this.albums = null
this.$api.getAlbums(categoryToSort[value]).then(albums => {
this.$api.getAlbums(value).then(albums => {
this.albums = albums
})
}

View File

@ -1,7 +1,12 @@
import axios, { AxiosRequestConfig, AxiosInstance } from 'axios'
import { AuthService } from '@/auth/service'
export type AlbumSort = 'alphabeticalByName' | 'newest' | 'recent' | 'frequent' | 'random'
export type AlbumSort =
'a-z' |
'recently-added'|
'recently-played' |
'most-played' |
'random'
export interface Album {
id: string
@ -123,8 +128,16 @@ export class API {
}
async getAlbums(sort: AlbumSort, size = 500): Promise<Album[]> {
const type = {
'a-z': 'alphabeticalByName',
'recently-added': 'newest',
'recently-played': 'recent',
'most-played': 'frequent',
random: 'random',
}[sort]
const params = {
type: sort,
type,
offset: '0',
size: size,
}

View File

@ -6,6 +6,7 @@
import {
BIcon,
BIconCardText,
BIconChevronCompactRight,
BIconMusicNoteList,
BIconStar,
BIconStarFill,
@ -28,6 +29,7 @@
components: {
BIcon,
BIconCardText,
BIconChevronCompactRight,
BIconMusicNoteList,
BIconStar,
BIconStarFill,

View File

@ -41,14 +41,6 @@ export function setupRouter(auth: AuthService) {
},
{
name: 'albums',
path: '/albums',
redirect: {
name: 'albums-params',
params: { sort: 'a-z' }
}
},
{
name: 'albums-params',
path: '/albums/:sort',
component: AlbumLibrary,
props: true