diff --git a/assets/css/tooltip.css b/assets/css/tooltip.css index d5eb080..1ceaebc 100644 --- a/assets/css/tooltip.css +++ b/assets/css/tooltip.css @@ -87,7 +87,7 @@ } .v-popper__popper[data-popper-placement^="top"] .v-popper__arrow-container { - bottom: -7px; + bottom: -6px; } .v-popper__popper[data-popper-placement^="top"] .v-popper__arrow-inner, diff --git a/assets/img/icons/sort-add-asc.svg b/assets/img/icons/sort-add-asc.svg new file mode 100644 index 0000000..d31842f --- /dev/null +++ b/assets/img/icons/sort-add-asc.svg @@ -0,0 +1,18 @@ + + diff --git a/assets/img/icons/sort-add-desc.svg b/assets/img/icons/sort-add-desc.svg new file mode 100644 index 0000000..81db1ce --- /dev/null +++ b/assets/img/icons/sort-add-desc.svg @@ -0,0 +1,18 @@ + + diff --git a/assets/img/icons/sort-add.svg b/assets/img/icons/sort-add.svg new file mode 100644 index 0000000..7c21355 --- /dev/null +++ b/assets/img/icons/sort-add.svg @@ -0,0 +1,16 @@ + + diff --git a/assets/img/icons/sort-heart.svg b/assets/img/icons/sort-heart.svg new file mode 100644 index 0000000..21c2a0d --- /dev/null +++ b/assets/img/icons/sort-heart.svg @@ -0,0 +1,38 @@ + + diff --git a/components/stashes/heart.vue b/components/stashes/heart.vue index 8a0dbbe..37783c2 100644 --- a/components/stashes/heart.vue +++ b/components/stashes/heart.vue @@ -261,6 +261,7 @@ async function reloadStashes(newStash) { +import { computed, ref } from 'vue'; + import Checkbox from '#/components/form/checkbox.vue'; -defineProps({ +const props = defineProps({ stashes: { type: Array, default: () => [], @@ -10,16 +12,63 @@ defineProps({ type: Array, default: () => [], }, + domain: { + type: String, + default: 'scenes', + }, }); const emit = defineEmits(['stash', 'unstash', 'create']); + +const sortings = ['used', 'name', 'size', 'created']; +const sorting = ref(localStorage.getItem('stashMenuSorting') || 'used'); + +const domainKey = { + actors: 'stashedActors', + scenes: 'stashedScenes', + movies: 'stashedMovies', +}[props.domain]; + +const sortedStashes = computed(() => props.stashes + .toSorted((stashA, stashB) => { + return stashA.createdAt - stashB.createdAt; + }) + .toSorted((stashA, stashB) => { + if (sorting.value === 'used') { + return stashB.lastStashAt - stashA.lastStashAt; + } + + if (sorting.value === 'name') { + return stashA.name.localeCompare(stashB.name); + } + + if (sorting.value === 'size') { + return stashB[domainKey] - stashA[domainKey]; + } + + if (sorting.value === 'created') { + return stashA.createdAt - stashB.createdAt; + } + + return 0; + })); + /* + .toSorted((stashA, stashB) => { + return stashB.isPrimary - stashA.isPrimary; + })); + */ + +function toggleSorting() { + sorting.value = sortings[(sortings.indexOf(sorting.value) + 1) % sortings.length]; + localStorage.setItem('stashMenuSorting', sorting.value); +} @@ -85,10 +168,22 @@ const emit = defineEmits(['stash', 'unstash', 'create']); .check-container { margin-right: .5rem; } +} - &.create { - flex-shrink: 0; - border-top: 1px solid var(--glass-weak-40); +.menu-actions { + flex-shrink: 0; + display: flex; + border-top: solid 1px var(--glass-weak-40); +} + +.menu-sort { + padding: .75rem 1rem; + fill: var(--glass); + border-left: solid 1px var(--glass-weak-40); + + &:hover { + fill: var(--primary); + cursor: pointer; } } diff --git a/components/stashes/stashes.vue b/components/stashes/stashes.vue index b2a2b40..f959d47 100644 --- a/components/stashes/stashes.vue +++ b/components/stashes/stashes.vue @@ -1,5 +1,5 @@