diff --git a/platypush/backend/http/webapp/src/components/elements/Dropdown.vue b/platypush/backend/http/webapp/src/components/elements/Dropdown.vue index 4d8506f210..879de35f38 100644 --- a/platypush/backend/http/webapp/src/components/elements/Dropdown.vue +++ b/platypush/backend/http/webapp/src/components/elements/Dropdown.vue @@ -59,11 +59,19 @@ export default { }, computed: { + button() { + const el = this.$refs.button?.$el + if (!el) + return this.$refs.button + + return el.querySelector('button') + }, + buttonStyle() { - if (!this.$refs.button) + if (!this.button) return {} - return getComputedStyle(this.$refs.button) + return getComputedStyle(this.button) }, buttonWidth() { @@ -140,7 +148,7 @@ export default { }, adjustDropdownPos() { - const buttonRect = this.$refs.button.getBoundingClientRect() + const buttonRect = this.button.getBoundingClientRect() const buttonPos = { left: buttonRect.left + window.scrollX, top: buttonRect.top + window.scrollY, diff --git a/platypush/backend/http/webapp/src/components/elements/FloatingDropdownButton.vue b/platypush/backend/http/webapp/src/components/elements/FloatingDropdownButton.vue new file mode 100644 index 0000000000..c4b665717c --- /dev/null +++ b/platypush/backend/http/webapp/src/components/elements/FloatingDropdownButton.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin.vue b/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin.vue index c2b37ea6ee..49810d33ad 100644 --- a/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin.vue +++ b/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin.vue @@ -24,7 +24,7 @@ import Index from "./Jellyfin/Index"; import Loading from "@/components/Loading"; import MediaNav from "./Nav"; import MediaProvider from "./Mixin"; -import Movies from "./Jellyfin/Collections/Movies/Index"; +import Movies from "./Jellyfin/collections/Movies/Index"; export default { mixins: [MediaProvider], diff --git a/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/Collections/Movies/Index.vue b/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/collections/Movies/Index.vue similarity index 72% rename from platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/Collections/Movies/Index.vue rename to platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/collections/Movies/Index.vue index bc3dd6ef08..f164f4b703 100644 --- a/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/Collections/Movies/Index.vue +++ b/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/collections/Movies/Index.vue @@ -18,6 +18,8 @@ @remove-from-playlist="$emit('remove-from-playlist', $event)" @select="selectedResult = $event" v-else /> + + @@ -26,6 +28,7 @@ import Loading from "@/components/Loading"; import MediaProvider from "@/components/panels/Media/Providers/Mixin"; import NoItems from "@/components/elements/NoItems"; import Results from "@/components/panels/Media/Results"; +import SortButton from "@/components/panels/Media/Providers/Jellyfin/components/SortButton"; export default { mixins: [MediaProvider], @@ -33,6 +36,7 @@ export default { Loading, NoItems, Results, + SortButton, }, emits: [ @@ -52,9 +56,13 @@ export default { data() { return { - movies: {}, + movies: [], loading_: false, selectedResult: null, + sort: { + attr: 'title', + desc: false, + }, }; }, @@ -64,8 +72,25 @@ export default { }, sortedMovies() { + if (!this.movies) { + return [] + } + return [...this.movies].sort((a, b) => { - return a.title.localeCompare(b.title) + const attr = this.sort.attr + const desc = this.sort.desc + let aVal = a[attr] + let bVal = b[attr] + + if (typeof aVal === 'number' || typeof bVal === 'number') { + aVal = aVal || 0 + bVal = bVal || 0 + return desc ? bVal - aVal : aVal - bVal + } + + aVal = (aVal || '').toString().toLowerCase() + bVal = (bVal || '').toString().toLowerCase() + return desc ? bVal.localeCompare(aVal) : aVal.localeCompare(bVal) }).map((movie) => { return { item_type: movie.type, @@ -113,4 +138,8 @@ export default { diff --git a/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/components/SortButton.vue b/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/components/SortButton.vue new file mode 100644 index 0000000000..db3af55e19 --- /dev/null +++ b/platypush/backend/http/webapp/src/components/panels/Media/Providers/Jellyfin/components/SortButton.vue @@ -0,0 +1,124 @@ + + + + +