diff --git a/src/components/SelectionManager.vue b/src/components/SelectionManager.vue index 6f7819cd..e3c6c994 100644 --- a/src/components/SelectionManager.vue +++ b/src/components/SelectionManager.vue @@ -34,7 +34,7 @@ - + diff --git a/src/components/modal/AddToAlbumModal.vue b/src/components/modal/AddToAlbumModal.vue index fae75e63..8ff590e6 100644 --- a/src/components/modal/AddToAlbumModal.vue +++ b/src/components/modal/AddToAlbumModal.vue @@ -5,9 +5,9 @@
- + -
+
@@ -37,60 +37,54 @@ export default defineComponent({ data: () => ({ show: false, photos: [] as IPhoto[], - progress: 0, - processing: false, - processed: new Set(), - photosDone: 0, - totalOperations: 0, + opsDone: 0, + opsTotal: 0, }), + computed: { + progress(): number { + return Math.min(this.opsTotal ? Math.round((this.opsDone * 100) / this.opsTotal) : 100, 100); + }, + }, + methods: { open(photos: IPhoto[]) { - this.progress = 0; - this.processing = false; - this.show = true; this.photos = photos; - }, - - added(photos: IPhoto[]) { - this.$emit('added', photos); + this.show = true; + this.opsTotal = 0; }, close() { - this.photos = []; - this.processing = false; this.show = false; + this.photos = []; + this.opsTotal = 0; this.$emit('close'); }, - async processAlbum(album: IAlbum, action: 'add' | 'remove') { - const name = album.name || album.album_id.toString(); - const gen = action === 'add' - ? dav.addToAlbum(album.user, name, this.photos) - : dav.removeFromAlbum(album.user, name, this.photos); - - for await (const fids of gen) { - this.photosDone += fids.length; - this.photos.forEach((p) => { - if (fids.includes(p.fileid)) { - this.processed.add(p); - } - }); + async update(selection: IAlbum[], deselection: IAlbum[]) { + if (this.opsTotal) return; + + // Total number of DAV calls (ugh DAV) + this.opsTotal = this.photos.length * (selection.length + deselection.length); + + // Add the photos to the selected albums + for (const album of selection) { + for await (const fids of dav.addToAlbum(album.user, album.name, this.photos)) { + this.opsDone += fids.filter((f) => f).length; + } } - this.progress = Math.round((this.photosDone * 100) / this.totalOperations); - }, - async updateAlbums(albumsToAddTo: IAlbum[], albumsToRemoveFrom: IAlbum[] = []) { - if (this.processing) return; - this.processing = true; - this.processed = new Set(); - this.totalOperations = this.photos.length * (albumsToAddTo.length + albumsToRemoveFrom.length); + // Remove the photos from the deselected albums + for (const album of deselection) { + for await (const fids of dav.removeFromAlbum(album.user, album.name, this.photos)) { + this.opsDone += fids.filter((f) => f).length; + } + } - await Promise.all(albumsToAddTo.map((album) => this.processAlbum(album, 'add'))); - await Promise.all(albumsToRemoveFrom.map((album) => this.processAlbum(album, 'remove'))); - const n = this.processed.size; - this.added(Array.from(this.processed)); - showInfo(this.n('memories', '{n} processed', '{n} processed', n, { n })); + const n = this.photos.length; + showInfo(this.n('memories', '{n} photo updated', '{n} photos updated', n, { n })); + + this.$emit('change'); this.close(); }, }, @@ -101,4 +95,8 @@ export default defineComponent({ .outer { margin-top: 15px; } + +.progress-bar { + margin-top: 10px; +} diff --git a/src/components/modal/AlbumCollaborators.vue b/src/components/modal/AlbumCollaborators.vue index e9c26ad0..1023d98c 100644 --- a/src/components/modal/AlbumCollaborators.vue +++ b/src/components/modal/AlbumCollaborators.vue @@ -159,7 +159,7 @@ type Collaborator = { }; export default defineComponent({ - name: 'AddToAlbumModal', + name: 'AlbumCollaborators', components: { Magnify, Close, diff --git a/src/components/modal/AlbumPicker.vue b/src/components/modal/AlbumPicker.vue index 5f1bbbb3..170a3413 100644 --- a/src/components/modal/AlbumPicker.vue +++ b/src/components/modal/AlbumPicker.vue @@ -43,7 +43,8 @@
- + {{ t('memories', 'Save changes') }} @@ -107,6 +114,12 @@ export default defineComponent({ type: Array as PropType, required: true, }, + + /** Disable controls */ + disabled: { + type: Boolean, + default: false, + }, }, components: { AlbumForm, @@ -180,6 +193,8 @@ export default defineComponent({ }, toggleAlbumSelection(album: IAlbum) { + if (this.disabled) return; + if (this.selection.has(album)) { this.selection.delete(album);