From 180d23ab7c5940ea7e8d32077e96653738a85ae2 Mon Sep 17 00:00:00 2001 From: upsiflu Date: Wed, 26 Mar 2025 14:54:59 +0100 Subject: [PATCH] fix(front): [WIP] privacy_level slider on manageUploads - correct Vue syntax for 2-way binding `computed`; support `undefined` value --- front/src/components/ui/Slider.vue | 9 +++++ front/src/views/auth/ManageUploads.vue | 56 +++++++++++++++++--------- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/front/src/components/ui/Slider.vue b/front/src/components/ui/Slider.vue index a1340267e..1582166d6 100644 --- a/front/src/components/ui/Slider.vue +++ b/front/src/components/ui/Slider.vue @@ -39,6 +39,7 @@ onMounted(() => { +.slider { .label { margin-top: -18px; padding-bottom: 8px; @@ -175,5 +177,12 @@ onMounted(() => { background-color: var(--focus-ring-color); outline: 2px solid currentcolor; } + &[disabled] .pin { + display: none; + } + &[disabled] * { + pointer-events: none; + } +} diff --git a/front/src/views/auth/ManageUploads.vue b/front/src/views/auth/ManageUploads.vue index 33f9faeda..ff5b79129 100644 --- a/front/src/views/auth/ManageUploads.vue +++ b/front/src/views/auth/ManageUploads.vue @@ -106,23 +106,39 @@ const options = { // Model for use in global slider `privacy_level` const globalPrivacyLevel = computed({ - get: () => - selectedItems.value.map(({ privacy_level }) => - privacy_level as 'me' | 'instance' | 'everyone' | undefined - ).reduce((acc, item) => - acc === item - ? acc - : undefined - ), - set: function (level) { - items.value - = items.value.map(item => ({ - ...item, - privacy_level: - level === undefined || !item.selected - ? item.privacy_level - : level - })) + get () { + return selectedItems.value.length === 0 + ? undefined + : selectedItems.value.map(({ privacy_level }) => privacy_level) + .reduce((acc, item) => + acc === item + ? acc + : undefined + ) + }, + set (level) { + if (level === undefined) return + + const changes = [] + + for (const [index, item] of items.value.entries()) { + if (!item.selected || item.privacy_level === level) + break; + + changes.push({ + uuid: item.uuid, + privacy_level: level + }) + + items.value[index].privacy_level = level + } + + // Note: This will never set privacy_level to undefined. + // privacy_level as undefined is only a workaround for items in legacy libraries. + axios.patch( + 'uploads/bulk_update/', + { params: changes } + ) } }) @@ -303,6 +319,7 @@ const getPrivacyLevelChoice = (privacyLevel: PrivacyLevel) => { @@ -412,7 +429,10 @@ const getPrivacyLevelChoice = (privacyLevel: PrivacyLevel) => { {{ item.privacy_level }}