From 708f8e3972b8d2ca42a2d5b49991490bd21be6e1 Mon Sep 17 00:00:00 2001 From: ildyria Date: Wed, 18 Sep 2024 18:40:15 +0200 Subject: [PATCH] move should be working for both photo and albums --- .../forms/album/AlbumDeleteDialog.vue | 62 +++++++++++ .../forms/album/AlbumMoveDialog.vue | 102 ++++++++++++++++++ .../forms/photo/DialogPhotoDelete.vue | 4 +- .../forms/photo/DialogPhotoMove.vue | 5 + .../js/composables/album/albumsRefresher.ts | 60 +++++++++++ .../composables/contextMenus/contextMenu.ts | 3 - .../modalsTriggers/deleteAlbumOpen.ts | 14 +++ .../modalsTriggers/moveAlbumOpen.ts | 14 +++ .../js/composables/selections/selections.ts | 14 +-- resources/js/services/album-service.ts | 5 + resources/js/views/gallery-panels/Album.vue | 81 ++++++++++++-- resources/js/views/gallery-panels/Albums.vue | 83 +++++++------- resources/js/views/gallery-panels/Photo.vue | 2 +- 13 files changed, 380 insertions(+), 69 deletions(-) create mode 100644 resources/js/components/forms/album/AlbumDeleteDialog.vue create mode 100644 resources/js/components/forms/album/AlbumMoveDialog.vue create mode 100644 resources/js/composables/album/albumsRefresher.ts create mode 100644 resources/js/composables/modalsTriggers/deleteAlbumOpen.ts create mode 100644 resources/js/composables/modalsTriggers/moveAlbumOpen.ts diff --git a/resources/js/components/forms/album/AlbumDeleteDialog.vue b/resources/js/components/forms/album/AlbumDeleteDialog.vue new file mode 100644 index 0000000000..2a71cc6032 --- /dev/null +++ b/resources/js/components/forms/album/AlbumDeleteDialog.vue @@ -0,0 +1,62 @@ + + + diff --git a/resources/js/components/forms/album/AlbumMoveDialog.vue b/resources/js/components/forms/album/AlbumMoveDialog.vue new file mode 100644 index 0000000000..818030ebd3 --- /dev/null +++ b/resources/js/components/forms/album/AlbumMoveDialog.vue @@ -0,0 +1,102 @@ + + diff --git a/resources/js/components/forms/photo/DialogPhotoDelete.vue b/resources/js/components/forms/photo/DialogPhotoDelete.vue index bce4fb6c7f..377af3aefa 100644 --- a/resources/js/components/forms/photo/DialogPhotoDelete.vue +++ b/resources/js/components/forms/photo/DialogPhotoDelete.vue @@ -7,7 +7,6 @@ - @@ -24,11 +23,13 @@ import { sprintf } from "sprintf-js"; import { computed } from "vue"; import Button from "primevue/button"; import { trans } from "laravel-vue-i18n"; +import AlbumService from "@/services/album-service"; const toast = useToast(); const props = defineProps<{ photo?: App.Http.Resources.Models.PhotoResource; photoIds?: string[]; + albumId: string; }>(); const visible = defineModel("visible", { default: false }); @@ -56,6 +57,7 @@ function execute() { summary: "Photo deleted", life: 3000, }); + AlbumService.clearCache(props.albumId); emit("deleted"); // Todo emit that we moved things. }); diff --git a/resources/js/components/forms/photo/DialogPhotoMove.vue b/resources/js/components/forms/photo/DialogPhotoMove.vue index 5e054ba328..9dc2f9414b 100644 --- a/resources/js/components/forms/photo/DialogPhotoMove.vue +++ b/resources/js/components/forms/photo/DialogPhotoMove.vue @@ -37,6 +37,7 @@ import { computed, ref } from "vue"; import SearchTargetAlbum from "../album/SearchTargetAlbum.vue"; import Button from "primevue/button"; import Dialog from "primevue/dialog"; +import AlbumService from "@/services/album-service"; const props = defineProps<{ photo?: App.Http.Resources.Models.PhotoResource; @@ -87,6 +88,10 @@ function execute() { summary: "Photo moved", life: 3000, }); + // Clear the cache for the current album and the destination album + AlbumService.clearCache(props.albumId); + AlbumService.clearCache(destination_id.value); + emit("moved"); // Todo emit that we moved things. }); diff --git a/resources/js/composables/album/albumsRefresher.ts b/resources/js/composables/album/albumsRefresher.ts new file mode 100644 index 0000000000..22c2261b27 --- /dev/null +++ b/resources/js/composables/album/albumsRefresher.ts @@ -0,0 +1,60 @@ +import AlbumService from "@/services/album-service"; +import { AuthStore } from "@/stores/Auth"; +import { LycheeStateStore } from "@/stores/LycheeState"; +import { computed, ref, Ref } from "vue"; + +export function useAlbumsRefresher(auth: AuthStore, lycheeStore: LycheeStateStore, isLoginOpen: Ref) { + const user = ref(undefined) as Ref; + const isKeybindingsHelpOpen = ref(false); + const smartAlbums = ref([]) as Ref; + const albums = ref([]) as Ref; + const sharedAlbums = ref([]) as Ref; + const rootConfig = ref(undefined) as Ref; + const rootRights = ref(undefined) as Ref; + const selectableAlbums = computed(() => albums.value.concat(sharedAlbums.value)); + + function refresh() { + auth.getUser().then((data) => { + user.value = data; + + // display popup if logged in and set.. + if (user.value.id && lycheeStore.show_keybinding_help_popup) { + isKeybindingsHelpOpen.value = true; + } + }); + + AlbumService.getAll() + .then((data) => { + smartAlbums.value = (data.data.smart_albums as App.Http.Resources.Models.ThumbAlbumResource[]) ?? []; + albums.value = data.data.albums as App.Http.Resources.Models.ThumbAlbumResource[]; + smartAlbums.value = smartAlbums.value.concat(data.data.tag_albums as App.Http.Resources.Models.ThumbAlbumResource[]); + sharedAlbums.value = (data.data.shared_albums as App.Http.Resources.Models.ThumbAlbumResource[]) ?? []; + rootConfig.value = data.data.config; + rootRights.value = data.data.rights; + + if (albums.value.length === 0 && smartAlbums.value.length === 0 && sharedAlbums.value.length === 0) { + isLoginOpen.value = true; + } + }) + .catch((error) => { + // We are required to login :) + if (error.response.status === 401) { + isLoginOpen.value = true; + } else { + console.error(error); + } + }); + } + + return { + user, + isKeybindingsHelpOpen, + smartAlbums, + albums, + sharedAlbums, + rootConfig, + rootRights, + selectableAlbums, + refresh, + }; +} diff --git a/resources/js/composables/contextMenus/contextMenu.ts b/resources/js/composables/contextMenus/contextMenu.ts index bcd7cafe8e..f7009f1d6e 100644 --- a/resources/js/composables/contextMenus/contextMenu.ts +++ b/resources/js/composables/contextMenus/contextMenu.ts @@ -81,9 +81,6 @@ export function useContextMenu(selectors: Selectors, photoCallbacks: PhotoCallba if (selectors.selectedAlbums.value.length > 0) { return albumsMenu(); } - - //! Should not happen. - console.log("No menu available??"); return []; }); diff --git a/resources/js/composables/modalsTriggers/deleteAlbumOpen.ts b/resources/js/composables/modalsTriggers/deleteAlbumOpen.ts new file mode 100644 index 0000000000..9bf007a78e --- /dev/null +++ b/resources/js/composables/modalsTriggers/deleteAlbumOpen.ts @@ -0,0 +1,14 @@ +import { ref } from "vue"; + +export function useDeleteAlbumOpen() { + const isDeleteAlbumVisible = ref(false); + + function toggleDeleteAlbum() { + isDeleteAlbumVisible.value = !isDeleteAlbumVisible.value; + } + + return { + isDeleteAlbumVisible, + toggleDeleteAlbum, + }; +} diff --git a/resources/js/composables/modalsTriggers/moveAlbumOpen.ts b/resources/js/composables/modalsTriggers/moveAlbumOpen.ts new file mode 100644 index 0000000000..6e990bd097 --- /dev/null +++ b/resources/js/composables/modalsTriggers/moveAlbumOpen.ts @@ -0,0 +1,14 @@ +import { ref } from "vue"; + +export function useMoveAlbumOpen() { + const isMoveAlbumVisible = ref(false); + + function toggleMoveAlbum() { + isMoveAlbumVisible.value = !isMoveAlbumVisible.value; + } + + return { + isMoveAlbumVisible, + toggleMoveAlbum, + }; +} diff --git a/resources/js/composables/selections/selections.ts b/resources/js/composables/selections/selections.ts index b5dc383bbf..4001abe4a1 100644 --- a/resources/js/composables/selections/selections.ts +++ b/resources/js/composables/selections/selections.ts @@ -3,12 +3,14 @@ import { computed, ComputedRef, Ref, ref } from "vue"; export function useSelection( config: Ref, - album: ComputedRef< - | App.Http.Resources.Models.AlbumResource - | App.Http.Resources.Models.TagAlbumResource - | App.Http.Resources.Models.SmartAlbumResource - | undefined - >, + album: + | ComputedRef< + | App.Http.Resources.Models.AlbumResource + | App.Http.Resources.Models.TagAlbumResource + | App.Http.Resources.Models.SmartAlbumResource + | undefined + > + | undefined, photos: Ref<{ [key: number]: App.Http.Resources.Models.PhotoResource }>, albums: ComputedRef<{ [key: number]: App.Http.Resources.Models.ThumbAlbumResource }>, ) { diff --git a/resources/js/services/album-service.ts b/resources/js/services/album-service.ts index ab82c74905..47558f2fa4 100644 --- a/resources/js/services/album-service.ts +++ b/resources/js/services/album-service.ts @@ -55,6 +55,11 @@ const AlbumService = { } }, + clearAlbums(): void { + const axiosWithCache = axios as unknown as AxiosCacheInstance; + axiosWithCache.storage.remove("albums"); + }, + getAll(): Promise> { const requester = axios as unknown as AxiosCacheInstance; return requester.get(`${Constants.API_URL}Albums`, { data: {}, id: "albums" }); diff --git a/resources/js/views/gallery-panels/Album.vue b/resources/js/views/gallery-panels/Album.vue index 4acfa4462c..7ee6124be5 100644 --- a/resources/js/views/gallery-panels/Album.vue +++ b/resources/js/views/gallery-panels/Album.vue @@ -42,8 +42,38 @@ /> - - + + + + + + + + + + +