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 @@
+
+
+
+
+
+
+