Merge pull request #1451 from chme/web/next

Update web interface
This commit is contained in:
Christian Meffert 2022-04-17 10:46:19 +02:00 committed by GitHub
commit 9c4d246c8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
77 changed files with 532 additions and 7097 deletions

View File

@ -24,10 +24,5 @@ htdocsassetsdir = $(datadir)/owntone/htdocs/assets
dist_htdocsassets_DATA = \ dist_htdocsassets_DATA = \
assets/index.css \ assets/index.css \
assets/index.js \ assets/index.js
assets/materialdesignicons-webfont.svg \
assets/materialdesignicons-webfont.ttf \
assets/materialdesignicons-webfont.woff2 \
assets/materialdesignicons-webfont.woff \
assets/materialdesignicons-webfont.eot
endif endif

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.3 MiB

View File

@ -9,13 +9,14 @@
"version": "2.0.0", "version": "2.0.0",
"dependencies": { "dependencies": {
"@aacassandra/vue3-progressbar": "^1.0.3", "@aacassandra/vue3-progressbar": "^1.0.3",
"@mdi/js": "^6.6.96",
"@ts-pro/vue-eternal-loading": "^1.2.0", "@ts-pro/vue-eternal-loading": "^1.2.0",
"@vueform/slider": "github:chme/slider#faff83ed8a77f2cdbcb7252505ef734301efd139", "@vueform/slider": "github:chme/slider#faff83ed8a77f2cdbcb7252505ef734301efd139",
"axios": "^0.26.1", "axios": "^0.26.1",
"bulma": "^0.9.3", "bulma": "^0.9.3",
"bulma-switch": "^2.0.4", "bulma-switch": "^2.0.4",
"luxon": "^2.3.1", "luxon": "^2.3.1",
"mdi": "^2.2.43", "mdi-vue": "^3.0.12",
"reconnectingwebsocket": "^1.0.0", "reconnectingwebsocket": "^1.0.0",
"spotify-web-api-js": "^1.5.2", "spotify-web-api-js": "^1.5.2",
"string-to-color": "^2.2.2", "string-to-color": "^2.2.2",
@ -97,6 +98,11 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"node_modules/@mdi/js": {
"version": "6.6.96",
"resolved": "https://registry.npmjs.org/@mdi/js/-/js-6.6.96.tgz",
"integrity": "sha512-ke9PN5DjPCOlMfhioxeZYADz8Yiz6v47W0IYRza01SSJD7y1EwESVpwFnnFUso+eCoWtE1CO9cTIvQF6sEreuA=="
},
"node_modules/@ts-pro/vue-eternal-loading": { "node_modules/@ts-pro/vue-eternal-loading": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ts-pro/vue-eternal-loading/-/vue-eternal-loading-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@ts-pro/vue-eternal-loading/-/vue-eternal-loading-1.2.0.tgz",
@ -1485,11 +1491,17 @@
"sourcemap-codec": "^1.4.8" "sourcemap-codec": "^1.4.8"
} }
}, },
"node_modules/mdi": { "node_modules/mdi-vue": {
"version": "2.2.43", "version": "3.0.12",
"resolved": "https://registry.npmjs.org/mdi/-/mdi-2.2.43.tgz", "resolved": "https://registry.npmjs.org/mdi-vue/-/mdi-vue-3.0.12.tgz",
"integrity": "sha512-g3m6z4303qieltUM20JL2gdsJZvoVzIzO74qa2XxZ2kg9JPwrPEAgooVhRDHZi1vvRh0gB8Dg+c9XqNdz4jcIg==", "integrity": "sha512-rc4rq99Hafa7v1u3KyfzGRr13v7/AzBvNrcXdhcgPQvj8wYafimbLGfNvQcGiAYZMow40KpXlZuG07132XccKw==",
"deprecated": "The mdi package was renamed to @mdi/font after v2.2.43. Please rename in your package.json for future updates." "dependencies": {
"@mdi/js": "*"
},
"peerDependencies": {
"@mdi/js": "*",
"vue": "*"
}
}, },
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "3.1.2", "version": "3.1.2",
@ -2182,6 +2194,11 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"@mdi/js": {
"version": "6.6.96",
"resolved": "https://registry.npmjs.org/@mdi/js/-/js-6.6.96.tgz",
"integrity": "sha512-ke9PN5DjPCOlMfhioxeZYADz8Yiz6v47W0IYRza01SSJD7y1EwESVpwFnnFUso+eCoWtE1CO9cTIvQF6sEreuA=="
},
"@ts-pro/vue-eternal-loading": { "@ts-pro/vue-eternal-loading": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ts-pro/vue-eternal-loading/-/vue-eternal-loading-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@ts-pro/vue-eternal-loading/-/vue-eternal-loading-1.2.0.tgz",
@ -3145,10 +3162,13 @@
"sourcemap-codec": "^1.4.8" "sourcemap-codec": "^1.4.8"
} }
}, },
"mdi": { "mdi-vue": {
"version": "2.2.43", "version": "3.0.12",
"resolved": "https://registry.npmjs.org/mdi/-/mdi-2.2.43.tgz", "resolved": "https://registry.npmjs.org/mdi-vue/-/mdi-vue-3.0.12.tgz",
"integrity": "sha512-g3m6z4303qieltUM20JL2gdsJZvoVzIzO74qa2XxZ2kg9JPwrPEAgooVhRDHZi1vvRh0gB8Dg+c9XqNdz4jcIg==" "integrity": "sha512-rc4rq99Hafa7v1u3KyfzGRr13v7/AzBvNrcXdhcgPQvj8wYafimbLGfNvQcGiAYZMow40KpXlZuG07132XccKw==",
"requires": {
"@mdi/js": "*"
}
}, },
"minimatch": { "minimatch": {
"version": "3.1.2", "version": "3.1.2",

View File

@ -11,13 +11,14 @@
}, },
"dependencies": { "dependencies": {
"@aacassandra/vue3-progressbar": "^1.0.3", "@aacassandra/vue3-progressbar": "^1.0.3",
"@mdi/js": "^6.6.96",
"@ts-pro/vue-eternal-loading": "^1.2.0", "@ts-pro/vue-eternal-loading": "^1.2.0",
"@vueform/slider": "github:chme/slider#faff83ed8a77f2cdbcb7252505ef734301efd139", "@vueform/slider": "github:chme/slider#faff83ed8a77f2cdbcb7252505ef734301efd139",
"axios": "^0.26.1", "axios": "^0.26.1",
"bulma": "^0.9.3", "bulma": "^0.9.3",
"bulma-switch": "^2.0.4", "bulma-switch": "^2.0.4",
"luxon": "^2.3.1", "luxon": "^2.3.1",
"mdi": "^2.2.43", "mdi-vue": "^3.0.12",
"reconnectingwebsocket": "^1.0.0", "reconnectingwebsocket": "^1.0.0",
"spotify-web-api-js": "^1.5.2", "spotify-web-api-js": "^1.5.2",
"string-to-color": "^2.2.2", "string-to-color": "^2.2.2",

View File

@ -12,8 +12,8 @@
@click="is_active = !is_active" @click="is_active = !is_active"
> >
<span>{{ modelValue }}</span> <span>{{ modelValue }}</span>
<span class="icon is-small"> <span class="icon">
<i class="mdi mdi-chevron-down" aria-hidden="true" /> <mdicon name="chevron-down" size="16" />
</span> </span>
</button> </button>
</div> </div>

View File

@ -41,7 +41,7 @@
<div class="media-right" style="padding-top: 0.7rem"> <div class="media-right" style="padding-top: 0.7rem">
<a @click.prevent.stop="open_dialog(album.item)"> <a @click.prevent.stop="open_dialog(album.item)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>

View File

@ -22,7 +22,7 @@
<div class="media-right"> <div class="media-right">
<a @click.prevent.stop="open_dialog(artist.item)"> <a @click.prevent.stop="open_dialog(artist.item)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>

View File

@ -22,7 +22,7 @@
<div class="media-right"> <div class="media-right">
<a @click.prevent.stop="open_dialog(composer.item)"> <a @click.prevent.stop="open_dialog(composer.item)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>

View File

@ -6,7 +6,7 @@
> >
<figure class="media-left fd-has-action"> <figure class="media-left fd-has-action">
<span class="icon"> <span class="icon">
<i class="mdi mdi-subdirectory-arrow-left" /> <mdicon name="subdirectory-arrow-left" size="16" />
</span> </span>
</figure> </figure>
<div class="media-content fd-has-action is-clipped"> <div class="media-content fd-has-action is-clipped">
@ -20,7 +20,7 @@
<div class="media" @click="open_directory(directory)"> <div class="media" @click="open_directory(directory)">
<figure class="media-left fd-has-action"> <figure class="media-left fd-has-action">
<span class="icon"> <span class="icon">
<i class="mdi mdi-folder" /> <mdicon name="folder" size="16" />
</span> </span>
</figure> </figure>
<div class="media-content fd-has-action is-clipped"> <div class="media-content fd-has-action is-clipped">
@ -34,7 +34,7 @@
<div class="media-right"> <div class="media-right">
<a @click.prevent.stop="open_dialog(directory)"> <a @click.prevent.stop="open_dialog(directory)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>

View File

@ -18,7 +18,7 @@
<div class="media-right"> <div class="media-right">
<a @click.prevent.stop="open_dialog(genre.item)"> <a @click.prevent.stop="open_dialog(genre.item)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>

View File

@ -2,7 +2,7 @@
<div v-if="is_next || !show_only_next_items" class="media"> <div v-if="is_next || !show_only_next_items" class="media">
<div v-if="edit_mode" class="media-left"> <div v-if="edit_mode" class="media-left">
<span class="icon has-text-grey fd-is-movable handle" <span class="icon has-text-grey fd-is-movable handle"
><i class="mdi mdi-drag-horizontal mdi-18px" ><mdicon name="drag-horizontal" size="16"
/></span> /></span>
</div> </div>

View File

@ -1,32 +1,25 @@
<template> <template>
<div <div
v-for="playlist in playlists" v-for="playlist in playlists"
:key="playlist.id" :key="playlist.itemId"
class="media" class="media"
:playlist="playlist" :playlist="playlist"
@click="open_playlist(playlist)" @click="open_playlist(playlist.item)"
> >
<figure class="media-left fd-has-action"> <figure class="media-left fd-has-action">
<span class="icon"> <span class="icon">
<i <mdicon :name="icon_name(playlist.item)" size="16" />
class="mdi"
:class="{
'mdi-library-music': playlist.type !== 'folder',
'mdi-rss': playlist.type === 'rss',
'mdi-folder': playlist.type === 'folder'
}"
/>
</span> </span>
</figure> </figure>
<div class="media-content fd-has-action is-clipped"> <div class="media-content fd-has-action is-clipped">
<h1 class="title is-6"> <h1 class="title is-6">
{{ playlist.name }} {{ playlist.item.name }}
</h1> </h1>
</div> </div>
<div class="media-right"> <div class="media-right">
<a @click.prevent.stop="open_dialog(playlist)"> <a @click.prevent.stop="open_dialog(playlist.item)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>
@ -68,6 +61,16 @@ export default {
open_dialog: function (playlist) { open_dialog: function (playlist) {
this.selected_playlist = playlist this.selected_playlist = playlist
this.show_details_modal = true this.show_details_modal = true
},
icon_name: function (playlist) {
if (playlist.type === 'folder') {
return 'folder'
} else if (playlist.type === 'rss') {
return 'rss'
} else {
return 'music-box-multiple'
}
} }
} }
} }

View File

@ -9,7 +9,7 @@
> >
<figure v-if="show_icon" class="media-left fd-has-action"> <figure v-if="show_icon" class="media-left fd-has-action">
<span class="icon"> <span class="icon">
<i class="mdi mdi-file-outline" /> <mdicon name="file-outline" size="16" />
</span> </span>
</figure> </figure>
<div class="media-content fd-has-action is-clipped"> <div class="media-content fd-has-action is-clipped">
@ -37,7 +37,7 @@
<div class="media-right"> <div class="media-right">
<a @click.prevent.stop="open_dialog(track)"> <a @click.prevent.stop="open_dialog(track)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</div> </div>

View File

@ -13,7 +13,7 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="$emit('close')"> <a class="card-footer-item has-text-dark" @click="$emit('close')">
<span class="icon"><i class="mdi mdi-cancel" /></span> <span class="icon"><mdicon name="cancel" size="16" /></span>
<span class="is-size-7">{{ <span class="is-size-7">{{
close_action ? close_action : 'Cancel' close_action ? close_action : 'Cancel'
}}</span> }}</span>
@ -23,7 +23,7 @@
class="card-footer-item has-background-danger has-text-white has-text-weight-bold" class="card-footer-item has-background-danger has-text-white has-text-weight-bold"
@click="$emit('delete')" @click="$emit('delete')"
> >
<span class="icon"><i class="mdi mdi-delete" /></span> <span class="icon"><mdicon name="delete" size="16" /></span>
<span class="is-size-7">{{ delete_action }}</span> <span class="is-size-7">{{ delete_action }}</span>
</a> </a>
<a <a
@ -31,7 +31,7 @@
class="card-footer-item has-background-info has-text-white has-text-weight-bold" class="card-footer-item has-background-info has-text-white has-text-weight-bold"
@click="$emit('ok')" @click="$emit('ok')"
> >
<span class="icon"><i class="mdi mdi-check" /></span> <span class="icon"><mdicon name="check" size="16" /></span>
<span class="is-size-7">{{ ok_action }}</span> <span class="is-size-7">{{ ok_action }}</span>
</a> </a>
</footer> </footer>

View File

@ -19,7 +19,7 @@
:disabled="loading" :disabled="loading"
/> />
<span class="icon is-left"> <span class="icon is-left">
<i class="mdi mdi-rss" /> <mdicon name="rss" size="16" />
</span> </span>
</p> </p>
<p class="help"> <p class="help">
@ -31,7 +31,7 @@
</div> </div>
<footer v-if="loading" class="card-footer"> <footer v-if="loading" class="card-footer">
<a class="card-footer-item button is-loading"> <a class="card-footer-item button is-loading">
<span class="icon"><i class="mdi mdi-web" /></span> <span class="icon"><mdicon name="web" size="16" /></span>
<span class="is-size-7">Processing ...</span> <span class="is-size-7">Processing ...</span>
</a> </a>
</footer> </footer>
@ -40,14 +40,16 @@
class="card-footer-item has-text-danger" class="card-footer-item has-text-danger"
@click="$emit('close')" @click="$emit('close')"
> >
<span class="icon"><i class="mdi mdi-cancel" /></span> <span class="icon"><mdicon name="cancel" size="16" /></span>
<span class="is-size-7">Cancel</span> <span class="is-size-7">Cancel</span>
</a> </a>
<a <a
class="card-footer-item has-background-info has-text-white has-text-weight-bold" class="card-footer-item has-background-info has-text-white has-text-weight-bold"
@click="add_stream" @click="add_stream"
> >
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
</footer> </footer>

View File

@ -19,7 +19,7 @@
:disabled="loading" :disabled="loading"
/> />
<span class="icon is-left"> <span class="icon is-left">
<i class="mdi mdi-web" /> <mdicon name="web" size="16" />
</span> </span>
</p> </p>
</div> </div>
@ -27,7 +27,7 @@
</div> </div>
<footer v-if="loading" class="card-footer"> <footer v-if="loading" class="card-footer">
<a class="card-footer-item has-text-dark"> <a class="card-footer-item has-text-dark">
<span class="icon"><i class="mdi mdi-web" /></span> <span class="icon"><mdicon name="web" size="16" /></span>
<span class="is-size-7">Loading ...</span> <span class="is-size-7">Loading ...</span>
</a> </a>
</footer> </footer>
@ -36,18 +36,20 @@
class="card-footer-item has-text-danger" class="card-footer-item has-text-danger"
@click="$emit('close')" @click="$emit('close')"
> >
<span class="icon"><i class="mdi mdi-cancel" /></span> <span class="icon"><mdicon name="cancel" size="16" /></span>
<span class="is-size-7">Cancel</span> <span class="is-size-7">Cancel</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="add_stream"> <a class="card-footer-item has-text-dark" @click="add_stream">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a <a
class="card-footer-item has-background-info has-text-white has-text-weight-bold" class="card-footer-item has-background-info has-text-white has-text-weight-bold"
@click="play" @click="play"
> >
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -68,15 +68,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -34,15 +34,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -32,15 +32,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -12,15 +12,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -30,15 +30,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -20,19 +20,27 @@
<span class="heading">Type</span> <span class="heading">Type</span>
<span class="title is-6">{{ playlist.type }}</span> <span class="title is-6">{{ playlist.type }}</span>
</p> </p>
<p v-if="!playlist.folder">
<span class="heading">Track count</span>
<span class="title is-6">{{ playlist.item_count }}</span>
</p>
</div> </div>
</div> </div>
<footer v-if="!playlist.folder" class="card-footer"> <footer v-if="!playlist.folder" class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -19,7 +19,7 @@
:disabled="loading" :disabled="loading"
/> />
<span class="icon is-left"> <span class="icon is-left">
<i class="mdi mdi-file-music" /> <mdicon name="file-music" size="16" />
</span> </span>
</p> </p>
</div> </div>
@ -27,7 +27,7 @@
</div> </div>
<footer v-if="loading" class="card-footer"> <footer v-if="loading" class="card-footer">
<a class="card-footer-item has-text-dark"> <a class="card-footer-item has-text-dark">
<span class="icon"><i class="mdi mdi-web" /></span> <span class="icon"><mdicon name="web" size="16" /></span>
<span class="is-size-7">Saving ...</span> <span class="is-size-7">Saving ...</span>
</a> </a>
</footer> </footer>
@ -36,14 +36,16 @@
class="card-footer-item has-text-danger" class="card-footer-item has-text-danger"
@click="$emit('close')" @click="$emit('close')"
> >
<span class="icon"><i class="mdi mdi-cancel" /></span> <span class="icon"><mdicon name="cancel" size="16" /></span>
<span class="is-size-7">Cancel</span> <span class="is-size-7">Cancel</span>
</a> </a>
<a <a
class="card-footer-item has-background-info has-text-white has-text-weight-bold" class="card-footer-item has-background-info has-text-white has-text-weight-bold"
@click="save" @click="save"
> >
<span class="icon"><i class="mdi mdi-content-save" /></span> <span class="icon"
><mdicon name="content-save" size="16"
/></span>
<span class="is-size-7">Save</span> <span class="is-size-7">Save</span>
</a> </a>
</footer> </footer>

View File

@ -92,11 +92,11 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="remove"> <a class="card-footer-item has-text-dark" @click="remove">
<span class="icon"><i class="mdi mdi-delete" /></span> <span class="icon"><mdicon name="delete" size="16" /></span>
<span class="is-size-7">Remove</span> <span class="is-size-7">Remove</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -29,14 +29,14 @@
class="card-footer-item has-text-danger" class="card-footer-item has-text-danger"
@click="$emit('close')" @click="$emit('close')"
> >
<span class="icon"><i class="mdi mdi-cancel" /></span> <span class="icon"><mdicon name="cancel" size="16" /></span>
<span class="is-size-7">Cancel</span> <span class="is-size-7">Cancel</span>
</a> </a>
<a <a
class="card-footer-item has-background-info has-text-white has-text-weight-bold" class="card-footer-item has-background-info has-text-white has-text-weight-bold"
@click="kickoff_pairing" @click="kickoff_pairing"
> >
<span class="icon"><i class="mdi mdi-cellphone-iphone" /></span> <span class="icon"><mdicon name="cellphone" size="16" /></span>
<span class="is-size-7">Pair Remote</span> <span class="is-size-7">Pair Remote</span>
</a> </a>
</footer> </footer>

View File

@ -124,15 +124,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play_track"> <a class="card-footer-item has-text-dark" @click="play_track">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -12,7 +12,7 @@
<div class="navbar-brand fd-expanded"> <div class="navbar-brand fd-expanded">
<!-- Link to queue --> <!-- Link to queue -->
<navbar-item-link to="/" exact> <navbar-item-link to="/" exact>
<span class="icon"><i class="mdi mdi-24px mdi-playlist-play" /></span> <span class="icon"><mdicon name="playlist-play" size="24" /></span>
</navbar-item-link> </navbar-item-link>
<!-- Now playing artist/title (not visible on "now playing" page) --> <!-- Now playing artist/title (not visible on "now playing" page) -->
@ -39,31 +39,31 @@
<player-button-previous <player-button-previous
v-if="is_now_playing_page" v-if="is_now_playing_page"
class="navbar-item fd-margin-left-auto" class="navbar-item fd-margin-left-auto"
icon_style="mdi-24px" :icon_size="24"
/> />
<player-button-seek-back <player-button-seek-back
v-if="is_now_playing_page" v-if="is_now_playing_page"
seek_ms="10000" :seek_ms="10000"
class="navbar-item" class="navbar-item"
icon_style="mdi-24px" :icon_size="24"
/> />
<!-- Play/pause --> <!-- Play/pause -->
<player-button-play-pause <player-button-play-pause
class="navbar-item" class="navbar-item"
icon_style="mdi-36px" :icon_size="36"
show_disabled_message show_disabled_message
/> />
<player-button-seek-forward <player-button-seek-forward
v-if="is_now_playing_page" v-if="is_now_playing_page"
seek_ms="30000" :seek_ms="30000"
class="navbar-item" class="navbar-item"
icon_style="mdi-24px" :icon_size="24"
/> />
<!-- Skip next (not visible on "now playing" page) --> <!-- Skip next (not visible on "now playing" page) -->
<player-button-next <player-button-next
v-if="is_now_playing_page" v-if="is_now_playing_page"
class="navbar-item" class="navbar-item"
icon_style="mdi-24px" :icon_size="24"
/> />
<!-- Player menu button (only visible on mobile and tablet) --> <!-- Player menu button (only visible on mobile and tablet) -->
@ -72,12 +72,9 @@
@click="show_player_menu = !show_player_menu" @click="show_player_menu = !show_player_menu"
> >
<span class="icon" <span class="icon"
><i ><mdicon
class="mdi mdi-18px" :name="show_player_menu ? 'chevron-down' : 'chevron-up'"
:class="{ size="18"
'mdi-chevron-up': !show_player_menu,
'mdi-chevron-down': show_player_menu
}"
/></span> /></span>
</a> </a>
@ -91,12 +88,9 @@
@click="show_player_menu = !show_player_menu" @click="show_player_menu = !show_player_menu"
> >
<span class="icon" <span class="icon"
><i ><mdicon
class="mdi mdi-18px" :name="show_player_menu ? 'chevron-down' : 'chevron-up'"
:class="{ size="18"
'mdi-chevron-up': !show_player_menu,
'mdi-chevron-down': show_player_menu
}"
/></span> /></span>
</a> </a>
@ -114,12 +108,9 @@
@click="toggle_mute_volume" @click="toggle_mute_volume"
> >
<span class="icon" <span class="icon"
><i ><mdicon
class="mdi mdi-18px" :name="player.volume > 0 ? 'volume-high' : 'volume-off'"
:class="{ size="18"
'mdi-volume-off': player.volume <= 0,
'mdi-volume-high': player.volume > 0
}"
/></span> /></span>
</a> </a>
</div> </div>
@ -173,7 +164,7 @@
'is-loading': loading 'is-loading': loading
}" }"
@click="togglePlay" @click="togglePlay"
><i class="mdi mdi-18px mdi-radio-tower" /></span ><mdicon name="radio-tower" size="18" /></span
></a> ></a>
</div> </div>
<div class="level-item fd-expanded"> <div class="level-item fd-expanded">
@ -239,9 +230,9 @@
<!-- Repeat/shuffle/consume --> <!-- Repeat/shuffle/consume -->
<div class="navbar-item"> <div class="navbar-item">
<div class="buttons is-centered"> <div class="buttons is-centered">
<player-button-repeat class="button" icon_style="mdi-18px" /> <player-button-repeat class="button" :icon_size="18" />
<player-button-shuffle class="button" icon_style="mdi-18px" /> <player-button-shuffle class="button" :icon_size="18" />
<player-button-consume class="button" icon_style="mdi-18px" /> <player-button-consume class="button" :icon_size="18" />
</div> </div>
</div> </div>
@ -254,12 +245,9 @@
<div class="level-item" style="flex-grow: 0"> <div class="level-item" style="flex-grow: 0">
<a class="button is-white is-small" @click="toggle_mute_volume"> <a class="button is-white is-small" @click="toggle_mute_volume">
<span class="icon" <span class="icon"
><i ><mdicon
class="mdi mdi-18px" :name="player.volume > 0 ? 'volume-high' : 'volume-off'"
:class="{ size="18"
'mdi-volume-off': player.volume <= 0,
'mdi-volume-high': player.volume > 0
}"
/></span> /></span>
</a> </a>
</div> </div>
@ -313,7 +301,7 @@
'is-loading': loading 'is-loading': loading
}" }"
@click="togglePlay" @click="togglePlay"
><i class="mdi mdi-18px mdi-radio-tower" /> ><mdicon name="radio-tower" size="16" />
</span> </span>
</a> </a>
</div> </div>

View File

@ -9,11 +9,7 @@
:class="{ 'has-text-grey-light': !output.selected }" :class="{ 'has-text-grey-light': !output.selected }"
@click="set_enabled" @click="set_enabled"
> >
<i <mdicon :name="type_class" size="18" :title="output.type" />
class="mdi mdi-18px"
:class="type_class"
:title="output.type"
/>
</span> </span>
</a> </a>
</div> </div>
@ -68,13 +64,13 @@ export default {
computed: { computed: {
type_class() { type_class() {
if (this.output.type.startsWith('AirPlay')) { if (this.output.type.startsWith('AirPlay')) {
return 'mdi-airplay' return 'cast-variant'
} else if (this.output.type === 'Chromecast') { } else if (this.output.type === 'Chromecast') {
return 'mdi-cast' return 'cast'
} else if (this.output.type === 'fifo') { } else if (this.output.type === 'fifo') {
return 'mdi-pipe' return 'pipe'
} else { } else {
return 'mdi-server' return 'server'
} }
}, },

View File

@ -7,25 +7,25 @@
> >
<div class="navbar-brand"> <div class="navbar-brand">
<navbar-item-link v-if="is_visible_playlists" to="/playlists"> <navbar-item-link v-if="is_visible_playlists" to="/playlists">
<span class="icon"><i class="mdi mdi-library-music" /></span> <span class="icon"><mdicon name="music-box-multiple" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link v-if="is_visible_music" to="/music"> <navbar-item-link v-if="is_visible_music" to="/music">
<span class="icon"><i class="mdi mdi-music" /></span> <span class="icon"><mdicon name="music" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link v-if="is_visible_podcasts" to="/podcasts"> <navbar-item-link v-if="is_visible_podcasts" to="/podcasts">
<span class="icon"><i class="mdi mdi-microphone" /></span> <span class="icon"><mdicon name="microphone" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link v-if="is_visible_audiobooks" to="/audiobooks"> <navbar-item-link v-if="is_visible_audiobooks" to="/audiobooks">
<span class="icon"><i class="mdi mdi-book-open-variant" /></span> <span class="icon"><mdicon name="book-open-variant" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link v-if="is_visible_radio" to="/radio"> <navbar-item-link v-if="is_visible_radio" to="/radio">
<span class="icon"><i class="mdi mdi-radio" /></span> <span class="icon"><mdicon name="radio" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link v-if="is_visible_files" to="/files"> <navbar-item-link v-if="is_visible_files" to="/files">
<span class="icon"><i class="mdi mdi-folder-open" /></span> <span class="icon"><mdicon name="folder-open" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link v-if="is_visible_search" to="/search"> <navbar-item-link v-if="is_visible_search" to="/search">
<span class="icon"><i class="mdi mdi-magnify" /></span> <span class="icon"><mdicon name="magnify" size="16" /></span>
</navbar-item-link> </navbar-item-link>
<div <div
@ -51,18 +51,20 @@
> >
<a class="navbar-link is-arrowless"> <a class="navbar-link is-arrowless">
<span class="icon is-hidden-touch" <span class="icon is-hidden-touch"
><i class="mdi mdi-24px mdi-menu" ><mdicon name="menu" size="24"
/></span> /></span>
<span class="is-hidden-desktop has-text-weight-bold">OwnTone</span> <span class="is-hidden-desktop has-text-weight-bold">OwnTone</span>
</a> </a>
<div class="navbar-dropdown is-right"> <div class="navbar-dropdown is-right">
<navbar-item-link to="/playlists"> <navbar-item-link to="/playlists">
<span class="icon"><i class="mdi mdi-library-music" /></span> <span class="icon"
><mdicon name="music-box-multiple" size="16"
/></span>
<b>Playlists</b> <b>Playlists</b>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/music" exact> <navbar-item-link to="/music" exact>
<span class="icon"><i class="mdi mdi-music" /></span> <span class="icon"><mdicon name="music" size="16" /></span>
<b>Music</b> <b>Music</b>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/music/artists"> <navbar-item-link to="/music/artists">
@ -78,23 +80,25 @@
<span class="fd-navbar-item-level2">Spotify</span> <span class="fd-navbar-item-level2">Spotify</span>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/podcasts"> <navbar-item-link to="/podcasts">
<span class="icon"><i class="mdi mdi-microphone" /></span> <span class="icon"><mdicon name="microphone" size="16" /></span>
<b>Podcasts</b> <b>Podcasts</b>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/audiobooks"> <navbar-item-link to="/audiobooks">
<span class="icon"><i class="mdi mdi-book-open-variant" /></span> <span class="icon"
><mdicon name="book-open-variant" size="16"
/></span>
<b>Audiobooks</b> <b>Audiobooks</b>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/radio"> <navbar-item-link to="/radio">
<span class="icon"><i class="mdi mdi-radio" /></span> <span class="icon"><mdicon name="radio" size="16" /></span>
<b>Radio</b> <b>Radio</b>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/files"> <navbar-item-link to="/files">
<span class="icon"><i class="mdi mdi-folder-open" /></span> <span class="icon"><mdicon name="folder-open" size="16" /></span>
<b>Files</b> <b>Files</b>
</navbar-item-link> </navbar-item-link>
<navbar-item-link to="/search"> <navbar-item-link to="/search">
<span class="icon"><i class="mdi mdi-magnify" /></span> <span class="icon"><mdicon name="magnify" size="16" /></span>
<b>Search</b> <b>Search</b>
</navbar-item-link> </navbar-item-link>
<hr class="fd-navbar-divider" /> <hr class="fd-navbar-divider" />

View File

@ -1,6 +1,6 @@
<template> <template>
<a :class="{ 'is-warning': is_consume }" @click="toggle_consume_mode"> <a :class="{ 'is-warning': is_consume }" @click="toggle_consume_mode">
<span class="icon"><i class="mdi mdi-fire" :class="icon_style" /></span> <span class="icon"><mdicon name="fire" :size="icon_size" /></span>
</a> </a>
</template> </template>
@ -11,7 +11,10 @@ export default {
name: 'PlayerButtonConsume', name: 'PlayerButtonConsume',
props: { props: {
icon_style: String icon_size: {
type: Number,
default: 16
}
}, },
computed: { computed: {

View File

@ -1,8 +1,6 @@
<template> <template>
<a :disabled="disabled" @click="play_next"> <a :disabled="disabled" @click="play_next">
<span class="icon" <span class="icon"><mdicon name="skip-forward" :size="icon_size" /></span>
><i class="mdi mdi-skip-forward" :class="icon_style"
/></span>
</a> </a>
</template> </template>
@ -13,7 +11,10 @@ export default {
name: 'PlayerButtonNext', name: 'PlayerButtonNext',
props: { props: {
icon_style: String icon_size: {
type: Number,
default: 16
}
}, },
computed: { computed: {

View File

@ -1,17 +1,6 @@
<template> <template>
<a :disabled="disabled" @click="toggle_play_pause"> <a :disabled="disabled" @click="toggle_play_pause">
<span class="icon" <span class="icon"><mdicon :name="icon_name" :size="icon_size" /></span>
><i
class="mdi"
:class="[
icon_style,
{
'mdi-play': !is_playing,
'mdi-pause': is_playing && is_pause_allowed,
'mdi-stop': is_playing && !is_pause_allowed
}
]"
/></span>
</a> </a>
</template> </template>
@ -22,7 +11,10 @@ export default {
name: 'PlayerButtonPlayPause', name: 'PlayerButtonPlayPause',
props: { props: {
icon_style: String, icon_size: {
type: Number,
default: 16
},
show_disabled_message: Boolean show_disabled_message: Boolean
}, },
@ -40,6 +32,15 @@ export default {
disabled() { disabled() {
return !this.$store.state.queue || this.$store.state.queue.count <= 0 return !this.$store.state.queue || this.$store.state.queue.count <= 0
},
icon_name() {
if (!this.is_playing) {
return 'play'
} else if (this.is_pause_allowed) {
return 'pause'
}
return 'stop'
} }
}, },

View File

@ -1,8 +1,6 @@
<template> <template>
<a :disabled="disabled" @click="play_previous"> <a :disabled="disabled" @click="play_previous">
<span class="icon" <span class="icon"><mdicon name="skip-backward" :size="icon_size" /></span>
><i class="mdi mdi-skip-backward" :class="icon_style"
/></span>
</a> </a>
</template> </template>
@ -13,7 +11,10 @@ export default {
name: 'PlayerButtonPrevious', name: 'PlayerButtonPrevious',
props: { props: {
icon_style: String icon_size: {
type: Number,
default: 16
}
}, },
computed: { computed: {

View File

@ -1,17 +1,6 @@
<template> <template>
<a :class="{ 'is-warning': !is_repeat_off }" @click="toggle_repeat_mode"> <a :class="{ 'is-warning': !is_repeat_off }" @click="toggle_repeat_mode">
<span class="icon" <span class="icon"><mdicon :name="icon_name" :size="icon_size" /></span>
><i
class="mdi"
:class="[
icon_style,
{
'mdi-repeat': is_repeat_all,
'mdi-repeat-once': is_repeat_single,
'mdi-repeat-off': is_repeat_off
}
]"
/></span>
</a> </a>
</template> </template>
@ -22,7 +11,10 @@ export default {
name: 'PlayerButtonRepeat', name: 'PlayerButtonRepeat',
props: { props: {
icon_style: String icon_size: {
type: Number,
default: 16
}
}, },
computed: { computed: {
@ -34,6 +26,14 @@ export default {
}, },
is_repeat_off() { is_repeat_off() {
return !this.is_repeat_all && !this.is_repeat_single return !this.is_repeat_all && !this.is_repeat_single
},
icon_name() {
if (this.is_repeat_all) {
return 'repeat'
} else if (this.is_repeat_single) {
return 'repeat-once'
}
return 'repeat-off'
} }
}, },

View File

@ -1,6 +1,6 @@
<template> <template>
<a v-if="visible" :disabled="disabled" @click="seek"> <a v-if="visible" :disabled="disabled" @click="seek">
<span class="icon"><i class="mdi mdi-rewind" :class="icon_style" /></span> <span class="icon"><mdicon name="rewind" :size="icon_size" /></span>
</a> </a>
</template> </template>
@ -9,7 +9,13 @@ import webapi from '@/webapi'
export default { export default {
name: 'PlayerButtonSeekBack', name: 'PlayerButtonSeekBack',
props: ['seek_ms', 'icon_style'], props: {
seek_ms: Number,
icon_size: {
type: Number,
default: 16
}
},
computed: { computed: {
now_playing() { now_playing() {

View File

@ -1,8 +1,6 @@
<template> <template>
<a v-if="visible" :disabled="disabled" @click="seek"> <a v-if="visible" :disabled="disabled" @click="seek">
<span class="icon" <span class="icon"><mdicon name="fast-forward" :size="icon_size" /></span>
><i class="mdi mdi-fast-forward" :class="icon_style"
/></span>
</a> </a>
</template> </template>
@ -11,7 +9,13 @@ import webapi from '@/webapi'
export default { export default {
name: 'PlayerButtonSeekForward', name: 'PlayerButtonSeekForward',
props: ['seek_ms', 'icon_style'], props: {
seek_ms: Number,
icon_size: {
type: Number,
default: 16
}
},
computed: { computed: {
now_playing() { now_playing() {

View File

@ -1,13 +1,6 @@
<template> <template>
<a :class="{ 'is-warning': is_shuffle }" @click="toggle_shuffle_mode"> <a :class="{ 'is-warning': is_shuffle }" @click="toggle_shuffle_mode">
<span class="icon" <span class="icon"><mdicon :name="icon_name" :size="icon_size" /></span>
><i
class="mdi"
:class="[
icon_style,
{ 'mdi-shuffle': is_shuffle, 'mdi-shuffle-disabled': !is_shuffle }
]"
/></span>
</a> </a>
</template> </template>
@ -18,12 +11,21 @@ export default {
name: 'PlayerButtonShuffle', name: 'PlayerButtonShuffle',
props: { props: {
icon_style: String icon_size: {
type: Number,
default: 16
}
}, },
computed: { computed: {
is_shuffle() { is_shuffle() {
return this.$store.state.player.shuffle return this.$store.state.player.shuffle
},
icon_name() {
if (this.is_shuffle) {
return 'shuffle'
}
return 'shuffle-disabled'
} }
}, },

View File

@ -43,15 +43,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -27,15 +27,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -30,15 +30,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -51,15 +51,19 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
<a class="card-footer-item has-text-dark" @click="queue_add"> <a class="card-footer-item has-text-dark" @click="queue_add">
<span class="icon"><i class="mdi mdi-playlist-plus" /></span> <span class="icon"
><mdicon name="playlist-plus" size="16"
/></span>
<span class="is-size-7">Add</span> <span class="is-size-7">Add</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="queue_add_next"> <a class="card-footer-item has-text-dark" @click="queue_add_next">
<span class="icon"><i class="mdi mdi-playlist-play" /></span> <span class="icon"
><mdicon name="playlist-play" size="16"
/></span>
<span class="is-size-7">Add Next</span> <span class="is-size-7">Add Next</span>
</a> </a>
<a class="card-footer-item has-text-dark" @click="play"> <a class="card-footer-item has-text-dark" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span class="is-size-7">Play</span> <span class="is-size-7">Play</span>
</a> </a>
</footer> </footer>

View File

@ -13,7 +13,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-artist" ><mdicon name="account-music" size="16"
/></span> /></span>
<span class="">Authors</span> <span class="">Authors</span>
</a> </a>
@ -27,7 +27,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-album" ><mdicon name="album" size="16"
/></span> /></span>
<span class="">Audiobooks</span> <span class="">Audiobooks</span>
</a> </a>

View File

@ -12,7 +12,9 @@
> >
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small"><i class="mdi mdi-web" /></span> <span class="icon is-small"
><mdicon name="web" size="16"
/></span>
<span class="">Browse</span> <span class="">Browse</span>
</a> </a>
</li> </li>
@ -25,7 +27,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-artist" ><mdicon name="account-music" size="16"
/></span> /></span>
<span class="">Artists</span> <span class="">Artists</span>
</a> </a>
@ -39,7 +41,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-album" ><mdicon name="album" size="16"
/></span> /></span>
<span class="">Albums</span> <span class="">Albums</span>
</a> </a>
@ -53,7 +55,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-speaker" ><mdicon name="speaker" size="16"
/></span> /></span>
<span class="">Genres</span> <span class="">Genres</span>
</a> </a>
@ -67,7 +69,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-book-open-page-variant" ><mdicon name="book-open-page-variant" size="16"
/></span> /></span>
<span class="">Composers</span> <span class="">Composers</span>
</a> </a>
@ -82,7 +84,7 @@
<li :class="{ 'is-active': isActive }"> <li :class="{ 'is-active': isActive }">
<a @click="navigate" @keypress.enter="navigate"> <a @click="navigate" @keypress.enter="navigate">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-spotify" ><mdicon name="spotify" size="16"
/></span> /></span>
<span class="">Spotify</span> <span class="">Spotify</span>
</a> </a>

View File

@ -5,18 +5,26 @@
<div class="column is-four-fifths"> <div class="column is-four-fifths">
<div class="tabs is-centered is-small is-toggle is-toggle-rounded"> <div class="tabs is-centered is-small is-toggle is-toggle-rounded">
<ul> <ul>
<li :class="{ 'is-active': $store.state.search_path === '/search/library' }"> <li
:class="{
'is-active': $store.state.search_path === '/search/library'
}"
>
<a @click="search_library"> <a @click="search_library">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-library-books" ><mdicon name="bookshelf" size="16"
/></span> /></span>
<span class="">Library</span> <span class="">Library</span>
</a> </a>
</li> </li>
<li :class="{ 'is-active': $store.state.search_path === '/search/spotify' }"> <li
:class="{
'is-active': $store.state.search_path === '/search/spotify'
}"
>
<a @click="search_spotify"> <a @click="search_spotify">
<span class="icon is-small" <span class="icon is-small"
><i class="mdi mdi-spotify" ><mdicon name="spotify" size="16"
/></span> /></span>
<span class="">Spotify</span> <span class="">Spotify</span>
</a> </a>

117
web-src/src/icons.js Normal file
View File

@ -0,0 +1,117 @@
import {
mdiAccountMusic,
mdiAlbum,
mdiArrowCollapseDown,
mdiBookOpenVariant,
mdiBookOpenPageVariant,
mdiBookshelf,
mdiCancel,
mdiCast,
mdiCastVariant,
mdiCellphone,
mdiCheck,
mdiChevronDown,
mdiChevronUp,
mdiContentSave,
mdiDelete,
mdiDeleteEmpty,
mdiDotsHorizontal,
mdiDotsVertical,
mdiDragHorizontal,
mdiFastForward,
mdiFileMusic,
mdiFileOutline,
mdiFire,
mdiFolder,
mdiFolderOpen,
mdiMagnify,
mdiMenu,
mdiMicrophone,
mdiMusic,
mdiMusicBoxMultiple,
mdiPause,
mdiPencil,
mdiPipe,
mdiPlay,
mdiPlaylistPlay,
mdiPlaylistPlus,
mdiRadio,
mdiRadioTower,
mdiRefresh,
mdiRepeat,
mdiRepeatOff,
mdiRepeatOnce,
mdiRewind,
mdiRss,
mdiServer,
mdiShuffle,
mdiShuffleDisabled,
mdiSkipBackward,
mdiSkipForward,
mdiSpeaker,
mdiSpotify,
mdiStop,
mdiSubdirectoryArrowLeft,
mdiVolumeHigh,
mdiVolumeOff,
mdiWeb
} from '@mdi/js'
export const icons = {
mdiAccountMusic,
mdiAlbum,
mdiArrowCollapseDown,
mdiBookOpenVariant,
mdiBookOpenPageVariant,
mdiBookshelf,
mdiCancel,
mdiCast,
mdiCastVariant,
mdiCellphone,
mdiCheck,
mdiChevronDown,
mdiChevronUp,
mdiContentSave,
mdiDelete,
mdiDeleteEmpty,
mdiDotsHorizontal,
mdiDotsVertical,
mdiDragHorizontal,
mdiFastForward,
mdiFileMusic,
mdiFileOutline,
mdiFire,
mdiFolder,
mdiFolderOpen,
mdiMagnify,
mdiMenu,
mdiMicrophone,
mdiMusic,
mdiMusicBoxMultiple,
mdiPause,
mdiPencil,
mdiPipe,
mdiPlay,
mdiPlaylistPlay,
mdiPlaylistPlus,
mdiRadio,
mdiRadioTower,
mdiRefresh,
mdiRepeat,
mdiRepeatOff,
mdiRepeatOnce,
mdiRewind,
mdiRss,
mdiServer,
mdiShuffle,
mdiShuffleDisabled,
mdiSkipBackward,
mdiSkipForward,
mdiSpeaker,
mdiSpotify,
mdiStop,
mdiSubdirectoryArrowLeft,
mdiVolumeHigh,
mdiVolumeOff,
mdiWeb
}

View File

@ -1,31 +0,0 @@
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import { router } from './router'
import store from './store'
import './filter'
import './progress'
import vClickOutside from 'v-click-outside'
import VueTinyLazyloadImg from 'vue-tiny-lazyload-img'
import VueObserveVisibility from 'vue-observe-visibility'
import VueScrollTo from 'vue-scrollto'
import 'mdi/css/materialdesignicons.css'
import 'vue-range-slider/dist/vue-range-slider.css'
import './mystyles.scss'
Vue.config.productionTip = false
Vue.use(vClickOutside)
Vue.use(VueTinyLazyloadImg)
Vue.use(VueObserveVisibility)
Vue.use(VueScrollTo)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})

View File

@ -5,11 +5,12 @@ import VueProgressBar from '@aacassandra/vue3-progressbar'
import VueClickAway from 'vue3-click-away' import VueClickAway from 'vue3-click-away'
import VueLazyLoad from 'vue3-lazyload' import VueLazyLoad from 'vue3-lazyload'
import VueScrollTo from 'vue-scrollto' import VueScrollTo from 'vue-scrollto'
import mdiVue from 'mdi-vue/v3'
import { filters } from './filter' import { filters } from './filter'
import { icons } from './icons'
import App from './App.vue' import App from './App.vue'
import './mystyles.scss' import './mystyles.scss'
import 'mdi/css/materialdesignicons.css'
import '@vueform/slider/themes/default.css' import '@vueform/slider/themes/default.css'
const app = createApp(App) const app = createApp(App)
@ -26,6 +27,9 @@ const app = createApp(App)
log: false log: false
}) })
.use(VueScrollTo) .use(VueScrollTo)
.use(mdiVue, {
icons: icons
})
app.config.globalProperties.$filters = filters app.config.globalProperties.$filters = filters
app.mount('#app') app.mount('#app')

View File

@ -10,16 +10,14 @@
<div class="buttons fd-is-centered-mobile fd-has-margin-top"> <div class="buttons fd-is-centered-mobile fd-has-margin-top">
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
<a <a
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_album_details_modal = true" @click="show_album_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
</div> </div>
</template> </template>

View File

@ -22,12 +22,10 @@
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_artist_details_modal = true" @click="show_artist_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -16,11 +16,11 @@
@click="show_artist_details_modal = true" @click="show_artist_details_modal = true"
> >
<span class="icon" <span class="icon"
><i class="mdi mdi-dots-horizontal mdi-18px" ><mdicon name="dots-horizontal" size="16"
/></span> /></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -10,16 +10,14 @@
<div class="buttons fd-is-centered-mobile fd-has-margin-top"> <div class="buttons fd-is-centered-mobile fd-has-margin-top">
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span>Play</span> <span>Play</span>
</a> </a>
<a <a
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_album_details_modal = true" @click="show_album_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
</div> </div>
</template> </template>

View File

@ -11,12 +11,10 @@
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_artist_details_modal = true" @click="show_artist_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -13,11 +13,11 @@
@click="show_composer_details_modal = true" @click="show_composer_details_modal = true"
> >
<span class="icon" <span class="icon"
><i class="mdi mdi-dots-horizontal mdi-18px" ><mdicon name="dots-horizontal" size="16"
/></span> /></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -13,11 +13,11 @@
@click="show_composer_details_modal = true" @click="show_composer_details_modal = true"
> >
<span class="icon" <span class="icon"
><i class="mdi mdi-dots-horizontal mdi-18px" ><mdicon name="dots-horizontal" size="16"
/></span> /></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -14,11 +14,11 @@
@click="open_directory_dialog({ path: current_directory })" @click="open_directory_dialog({ path: current_directory })"
> >
<span class="icon" <span class="icon"
><i class="mdi mdi-dots-horizontal mdi-18px" ><mdicon name="dots-horizontal" size="16"
/></span> /></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-play" /></span> <span class="icon"><mdicon name="play" size="16" /></span>
<span>Play</span> <span>Play</span>
</a> </a>
</div> </div>

View File

@ -16,11 +16,11 @@
@click="show_genre_details_modal = true" @click="show_genre_details_modal = true"
> >
<span class="icon" <span class="icon"
><i class="mdi mdi-dots-horizontal mdi-18px" ><mdicon name="dots-horizontal" size="16"
/></span> /></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -16,11 +16,11 @@
@click="show_genre_details_modal = true" @click="show_genre_details_modal = true"
> >
<span class="icon" <span class="icon"
><i class="mdi mdi-dots-horizontal mdi-18px" ><mdicon name="dots-horizontal" size="16"
/></span> /></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -11,12 +11,10 @@
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_playlist_details_modal = true" @click="show_playlist_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>

View File

@ -4,10 +4,10 @@
<p class="title is-4"> <p class="title is-4">
{{ playlist.name }} {{ playlist.name }}
</p> </p>
<p class="heading">{{ playlists.total }} playlists</p> <p class="heading">{{ playlists.count }} playlists</p>
</template> </template>
<template #content> <template #content>
<list-playlists :playlists="playlists.items" /> <list-playlists :playlists="playlists" />
</template> </template>
</content-with-heading> </content-with-heading>
</template> </template>
@ -16,6 +16,7 @@
import ContentWithHeading from '@/templates/ContentWithHeading.vue' import ContentWithHeading from '@/templates/ContentWithHeading.vue'
import ListPlaylists from '@/components/ListPlaylists.vue' import ListPlaylists from '@/components/ListPlaylists.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
import { GroupByList, noop } from '@/lib/GroupByList'
const dataObject = { const dataObject = {
load: function (to) { load: function (to) {
@ -27,7 +28,7 @@ const dataObject = {
set: function (vm, response) { set: function (vm, response) {
vm.playlist = response[0].data vm.playlist = response[0].data
vm.playlists = response[1].data vm.playlists_list = new GroupByList(response[1].data)
} }
} }
@ -51,7 +52,25 @@ export default {
data() { data() {
return { return {
playlist: {}, playlist: {},
playlists: {} playlists_list: new GroupByList()
}
},
computed: {
radio_playlists() {
return this.$store.state.config.radio_playlists
},
playlists() {
this.playlists_list.group(noop(), [
(playlist) =>
playlist.folder ||
this.radio_playlists ||
playlist.stream_count === 0 ||
playlist.item_count > playlist.stream_count
])
return this.playlists_list
} }
} }
} }

View File

@ -11,13 +11,11 @@
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_album_details_modal = true" @click="show_album_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"> <span class="icon">
<i class="mdi mdi-play" /> <mdicon name="play" size="16" />
</span> </span>
<span>Play</span> <span>Play</span>
</a> </a>

View File

@ -8,7 +8,7 @@
<div class="buttons is-centered"> <div class="buttons is-centered">
<a class="button is-small" @click="mark_all_played"> <a class="button is-small" @click="mark_all_played">
<span class="icon"> <span class="icon">
<i class="mdi mdi-pencil" /> <mdicon name="pencil" size="16" />
</span> </span>
<span>Mark All Played</span> <span>Mark All Played</span>
</a> </a>
@ -32,13 +32,13 @@
<div class="buttons is-centered"> <div class="buttons is-centered">
<a v-if="rss.tracks > 0" class="button is-small" @click="update_rss"> <a v-if="rss.tracks > 0" class="button is-small" @click="update_rss">
<span class="icon"> <span class="icon">
<i class="mdi mdi-refresh" /> <mdicon name="refresh" size="16" />
</span> </span>
<span>Update</span> <span>Update</span>
</a> </a>
<a class="button is-small" @click="open_add_podcast_dialog"> <a class="button is-small" @click="open_add_podcast_dialog">
<span class="icon"> <span class="icon">
<i class="mdi mdi-rss" /> <mdicon name="rss" size="16" />
</span> </span>
<span>Add Podcast</span> <span>Add Podcast</span>
</a> </a>

View File

@ -12,13 +12,13 @@
@click="update_show_next_items" @click="update_show_next_items"
> >
<span class="icon"> <span class="icon">
<i class="mdi mdi-arrow-collapse-down" /> <mdicon name="arrow-collapse-down" size="16" />
</span> </span>
<span>Hide previous</span> <span>Hide previous</span>
</a> </a>
<a class="button is-small" @click="open_add_stream_dialog"> <a class="button is-small" @click="open_add_stream_dialog">
<span class="icon"> <span class="icon">
<i class="mdi mdi-web" /> <mdicon name="web" size="16" />
</span> </span>
<span>Add Stream</span> <span>Add Stream</span>
</a> </a>
@ -28,13 +28,13 @@
@click="edit_mode = !edit_mode" @click="edit_mode = !edit_mode"
> >
<span class="icon"> <span class="icon">
<i class="mdi mdi-pencil" /> <mdicon name="pencil" size="16" />
</span> </span>
<span>Edit</span> <span>Edit</span>
</a> </a>
<a class="button is-small" @click="queue_clear"> <a class="button is-small" @click="queue_clear">
<span class="icon"> <span class="icon">
<i class="mdi mdi-delete-empty" /> <mdicon name="delete-empty" size="16" />
</span> </span>
<span>Clear</span> <span>Clear</span>
</a> </a>
@ -45,7 +45,7 @@
@click="save_dialog" @click="save_dialog"
> >
<span class="icon"> <span class="icon">
<i class="mdi mdi-content-save" /> <mdicon name="content-save" size="16" />
</span> </span>
<span>Save</span> <span>Save</span>
</a> </a>
@ -69,7 +69,7 @@
<template #actions> <template #actions>
<a v-if="!edit_mode" @click.prevent.stop="open_dialog(element)"> <a v-if="!edit_mode" @click.prevent.stop="open_dialog(element)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
<a <a
@ -77,7 +77,7 @@
@click.prevent.stop="remove(element)" @click.prevent.stop="remove(element)"
> >
<span class="icon has-text-grey" <span class="icon has-text-grey"
><i class="mdi mdi-delete mdi-18px" ><mdicon name="delete" size="18"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -17,7 +17,7 @@
autocomplete="off" autocomplete="off"
/> />
<span class="icon is-left"> <span class="icon is-left">
<i class="mdi mdi-magnify" /> <mdicon name="magnify" size="16" />
</span> </span>
</p> </p>
<p class="help has-text-centered"> <p class="help has-text-centered">
@ -131,7 +131,7 @@
<p class="title is-4">Composers</p> <p class="title is-4">Composers</p>
</template> </template>
<template #content> <template #content>
<list-composers :composers="composers.items" /> <list-composers :composers="composers" />
</template> </template>
<template #footer> <template #footer>
<nav v-if="show_all_composers_button" class="level"> <nav v-if="show_all_composers_button" class="level">
@ -139,7 +139,7 @@
<a <a
class="button is-light is-small is-rounded" class="button is-light is-small is-rounded"
@click="open_search_composers" @click="open_search_composers"
>Show all {{ composers.total }} composers</a >Show all {{ composers.total.toLocaleString() }} composers</a
> >
</p> </p>
</nav> </nav>
@ -157,7 +157,7 @@
<p class="title is-4">Playlists</p> <p class="title is-4">Playlists</p>
</template> </template>
<template #content> <template #content>
<list-playlists :playlists="playlists.items" /> <list-playlists :playlists="playlists" />
</template> </template>
<template #footer> <template #footer>
<nav v-if="show_all_playlists_button" class="level"> <nav v-if="show_all_playlists_button" class="level">
@ -264,8 +264,8 @@ export default {
tracks: { items: [], total: 0 }, tracks: { items: [], total: 0 },
artists: new GroupByList(), artists: new GroupByList(),
albums: new GroupByList(), albums: new GroupByList(),
composers: { items: [], total: 0 }, composers: new GroupByList(),
playlists: { items: [], total: 0 }, playlists: new GroupByList(),
audiobooks: new GroupByList(), audiobooks: new GroupByList(),
podcasts: new GroupByList() podcasts: new GroupByList()
} }
@ -396,12 +396,8 @@ export default {
this.tracks = data.tracks ? data.tracks : { items: [], total: 0 } this.tracks = data.tracks ? data.tracks : { items: [], total: 0 }
this.artists = new GroupByList(data.artists) this.artists = new GroupByList(data.artists)
this.albums = new GroupByList(data.albums) this.albums = new GroupByList(data.albums)
this.composers = data.composers this.composers = new GroupByList(data.composers)
? data.composers this.playlists = new GroupByList(data.playlists)
: { items: [], total: 0 }
this.playlists = data.playlists
? data.playlists
: { items: [], total: 0 }
}) })
}, },

View File

@ -12,16 +12,14 @@
<div class="buttons fd-is-centered-mobile fd-has-margin-top"> <div class="buttons fd-is-centered-mobile fd-has-margin-top">
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
<a <a
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_album_details_modal = true" @click="show_album_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
</div> </div>
</template> </template>
@ -52,7 +50,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_track_dialog(track)"> <a @click.prevent.stop="open_track_dialog(track)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -11,12 +11,10 @@
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_artist_details_modal = true" @click="show_artist_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>
@ -43,7 +41,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_dialog(album)"> <a @click.prevent.stop="open_dialog(album)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -28,7 +28,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_album_dialog(album)"> <a @click.prevent.stop="open_album_dialog(album)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>
@ -67,7 +67,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_playlist_dialog(playlist)"> <a @click.prevent.stop="open_playlist_dialog(playlist)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -15,7 +15,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_playlist_dialog(playlist)"> <a @click.prevent.stop="open_playlist_dialog(playlist)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -27,7 +27,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_album_dialog(album)"> <a @click.prevent.stop="open_album_dialog(album)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -11,12 +11,10 @@
class="button is-small is-light is-rounded" class="button is-small is-light is-rounded"
@click="show_playlist_details_modal = true" @click="show_playlist_details_modal = true"
> >
<span class="icon" <span class="icon"><mdicon name="dots-horizontal" size="16" /></span>
><i class="mdi mdi-dots-horizontal mdi-18px"
/></span>
</a> </a>
<a class="button is-small is-dark is-rounded" @click="play"> <a class="button is-small is-dark is-rounded" @click="play">
<span class="icon"><i class="mdi mdi-shuffle" /></span> <span class="icon"><mdicon name="shuffle" size="16" /></span>
<span>Shuffle</span> <span>Shuffle</span>
</a> </a>
</div> </div>
@ -36,7 +34,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_track_dialog(item.track)"> <a @click.prevent.stop="open_track_dialog(item.track)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -17,7 +17,7 @@
autocomplete="off" autocomplete="off"
/> />
<span class="icon is-left"> <span class="icon is-left">
<i class="mdi mdi-magnify" /> <mdicon name="magnify" size="16" />
</span> </span>
</p> </p>
</div> </div>
@ -55,7 +55,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_track_dialog(track)"> <a @click.prevent.stop="open_track_dialog(track)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>
@ -105,7 +105,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_artist_dialog(artist)"> <a @click.prevent.stop="open_artist_dialog(artist)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>
@ -166,7 +166,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_album_dialog(album)"> <a @click.prevent.stop="open_album_dialog(album)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>
@ -215,7 +215,7 @@
<template #actions> <template #actions>
<a @click.prevent.stop="open_playlist_dialog(playlist)"> <a @click.prevent.stop="open_playlist_dialog(playlist)">
<span class="icon has-text-dark" <span class="icon has-text-dark"
><i class="mdi mdi-dots-vertical mdi-18px" ><mdicon name="dots-vertical" size="16"
/></span> /></span>
</a> </a>
</template> </template>

View File

@ -15,14 +15,14 @@
class="button is-small is-white" class="button is-small is-white"
@click="scroll_to_top" @click="scroll_to_top"
><span class="icon is-small" ><span class="icon is-small"
><i class="mdi mdi-chevron-up" /></span ><mdicon name="chevron-up" size="16" /></span
></a> ></a>
<a <a
v-else v-else
class="button is-small is-white" class="button is-small is-white"
@click="scroll_to_content" @click="scroll_to_content"
><span class="icon is-small" ><span class="icon is-small"
><i class="mdi mdi-chevron-down" /></span ><mdicon name="chevron-down" size="16" /></span
></a> ></a>
</nav> </nav>
</section> </section>