aboutsummaryrefslogtreecommitdiff
path: root/src/site/components/image-modal/AlbumInfo.vue
blob: 8974a11921e6fbc5380e6cbbe460b0fa162d0412 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<template>
	<b-dropdown
		v-model="selectedOptions"
		multiple
		expanded
		scrollable
		inline
		aria-role="list"
		max-height="500px">
		<button slot="trigger" class="button is-primary" type="button">
			<span>Albums ({{ selectedOptions.length }})</span>
			<b-icon icon="menu-down" />
		</button>

		<b-dropdown-item
			v-for="album in orderedAlbums"
			:key="album.id"
			:value="album.id"
			aria-role="listitem"
			@click="handleClick(album.id)">
			<span>{{ album.name }}</span>
		</b-dropdown-item>
	</b-dropdown>
</template>

<script>
import { mapState } from 'vuex';

export default {
	name: 'Albuminfo',
	props: {
		imageId: {
			type: Number,
			default: 0,
		},
		imageAlbums: {
			type: Array,
			default: () => [],
		},
		albums: {
			type: Array,
			default: () => [],
		},
	},
	data() {
		return {
			selectedOptions: [],
			orderedAlbums: [],
		};
	},
	created() {
		this.orderedAlbums = this.getOrderedAlbums();
		// we're sorting here instead of computed because we want sort on creation
		// then the array's values should be frozen
		this.selectedOptions = this.imageAlbums.map((e) => e.id);
	},
	methods: {
		getOrderedAlbums() {
			return [...this.albums].sort(
				(a, b) => {
					const selectedA = this.imageAlbums.findIndex(({ name }) => name === a.name) !== -1;
					const selectedB = this.imageAlbums.findIndex(({ name }) => name === b.name) !== -1;

					if (selectedA !== selectedB) {
						return selectedA ? -1 : 1;
					}
					return a.name.localeCompare(b.name);
				},
			);
		},
		isAlbumSelected(id) {
			if (!this.showingModalForFile) return false;
			const found = this.showingModalForFile.albums.find((el) => el.id === id);
			return !!(found && found.id);
		},
		async handleClick(id) {
			// here the album should be already removed from the selected list
			if (this.selectedOptions.indexOf(id) > -1) {
				this.$handler.executeAction('images/addToAlbum', {
					albumId: id,
					fileId: this.imageId,
				});
			} else {
				this.$handler.executeAction('images/removeFromAlbum', {
					albumId: id,
					fileId: this.imageId,
				});
			}
		},
	},
};
</script>