|  | @@ -442,21 +442,36 @@
 | 
	
		
			
				|  |  |  				</div>
 | 
	
		
			
				|  |  |  			</template>
 | 
	
		
			
				|  |  |  			<template #footer>
 | 
	
		
			
				|  |  | -				<slot name="footer-actions" :song="song" />
 | 
	
		
			
				|  |  | +				<div v-if="bulk">
 | 
	
		
			
				|  |  | +					<button class="button is-primary" @click="editNextSong()">
 | 
	
		
			
				|  |  | +						Next
 | 
	
		
			
				|  |  | +					</button>
 | 
	
		
			
				|  |  | +					<button class="button is-primary" @click="flagSong()">
 | 
	
		
			
				|  |  | +						Flag
 | 
	
		
			
				|  |  | +					</button>
 | 
	
		
			
				|  |  | +				</div>
 | 
	
		
			
				|  |  |  				<div>
 | 
	
		
			
				|  |  |  					<save-button
 | 
	
		
			
				|  |  |  						ref="saveButton"
 | 
	
		
			
				|  |  | -						@clicked="save(song, false, false)"
 | 
	
		
			
				|  |  | +						@clicked="save(song, false, false, 'saveButton')"
 | 
	
		
			
				|  |  |  					/>
 | 
	
		
			
				|  |  |  					<save-button
 | 
	
		
			
				|  |  |  						ref="saveAndCloseButton"
 | 
	
		
			
				|  |  | -						default-message="Save and close"
 | 
	
		
			
				|  |  | -						@clicked="save(song, false, true)"
 | 
	
		
			
				|  |  | +						:default-message="
 | 
	
		
			
				|  |  | +							bulk ? `Save and next` : `Save and close`
 | 
	
		
			
				|  |  | +						"
 | 
	
		
			
				|  |  | +						@clicked="save(song, false, true, 'saveAndCloseButton')"
 | 
	
		
			
				|  |  |  					/>
 | 
	
		
			
				|  |  |  					<save-button
 | 
	
		
			
				|  |  |  						ref="saveVerifyAndCloseButton"
 | 
	
		
			
				|  |  | -						default-message="Save, verify and close"
 | 
	
		
			
				|  |  | -						@click="save(song, true, true)"
 | 
	
		
			
				|  |  | +						:default-message="
 | 
	
		
			
				|  |  | +							bulk
 | 
	
		
			
				|  |  | +								? `Save, verify and next`
 | 
	
		
			
				|  |  | +								: `Save, verify and close`
 | 
	
		
			
				|  |  | +						"
 | 
	
		
			
				|  |  | +						@click="
 | 
	
		
			
				|  |  | +							save(song, true, true, 'saveVerifyAndCloseButton')
 | 
	
		
			
				|  |  | +						"
 | 
	
		
			
				|  |  |  					/>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  					<div class="right">
 | 
	
	
		
			
				|  | @@ -562,7 +577,7 @@ export default {
 | 
	
		
			
				|  |  |  		sector: { type: String, default: "admin" },
 | 
	
		
			
				|  |  |  		bulk: { type: Boolean, default: false }
 | 
	
		
			
				|  |  |  	},
 | 
	
		
			
				|  |  | -	emits: ["error", "savedSuccess", "savedError"],
 | 
	
		
			
				|  |  | +	emits: ["error", "savedSuccess", "savedError", "flagSong", "nextSong"],
 | 
	
		
			
				|  |  |  	data() {
 | 
	
		
			
				|  |  |  		return {
 | 
	
		
			
				|  |  |  			songDataLoaded: false,
 | 
	
	
		
			
				|  | @@ -747,7 +762,7 @@ export default {
 | 
	
		
			
				|  |  |  			ctrl: true,
 | 
	
		
			
				|  |  |  			preventDefault: true,
 | 
	
		
			
				|  |  |  			handler: () => {
 | 
	
		
			
				|  |  | -				this.save(this.song, false, false);
 | 
	
		
			
				|  |  | +				this.save(this.song, false, false, "saveButton");
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -757,7 +772,7 @@ export default {
 | 
	
		
			
				|  |  |  			alt: true,
 | 
	
		
			
				|  |  |  			preventDefault: true,
 | 
	
		
			
				|  |  |  			handler: () => {
 | 
	
		
			
				|  |  | -				this.save(this.song, true);
 | 
	
		
			
				|  |  | +				this.save(this.song, false, true, "saveAndCloseButton");
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -769,6 +784,7 @@ export default {
 | 
	
		
			
				|  |  |  			preventDefault: true,
 | 
	
		
			
				|  |  |  			handler: () => {
 | 
	
		
			
				|  |  |  				// alert("not implemented yet");
 | 
	
		
			
				|  |  | +				this.save(this.song, true, true, "saveVerifyAndCloseButton");
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1126,15 +1142,12 @@ export default {
 | 
	
		
			
				|  |  |  			this.openModal("importAlbum");
 | 
	
		
			
				|  |  |  			this.closeModal("editSong");
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  | -		save(songToCopy, verify, close) {
 | 
	
		
			
				|  |  | +		save(songToCopy, verify, closeOrNext, saveButtonRefName) {
 | 
	
		
			
				|  |  |  			const song = JSON.parse(JSON.stringify(songToCopy));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			this.$emit("saving", song._id);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			let saveButtonRef = this.$refs.saveButton;
 | 
	
		
			
				|  |  | -			if (close && !verify) saveButtonRef = this.$refs.saveAndCloseButton;
 | 
	
		
			
				|  |  | -			else if (close && verify)
 | 
	
		
			
				|  |  | -				saveButtonRef = this.$refs.saveVerifyAndCloseButton;
 | 
	
		
			
				|  |  | +			const saveButtonRef = this.$refs[saveButtonRefName];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			if (!this.youtubeError && this.youtubeVideoDuration === "0.000") {
 | 
	
		
			
				|  |  |  				saveButtonRef.handleFailedSave();
 | 
	
	
		
			
				|  | @@ -1310,24 +1323,50 @@ export default {
 | 
	
		
			
				|  |  |  				return new Toast('Thumbnail must start with "http://".');
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			saveButtonRef.status = "disabled";
 | 
	
		
			
				|  |  | +			saveButtonRef.status = "saving";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			return this.socket.dispatch(`songs.update`, song._id, song, res => {
 | 
	
		
			
				|  |  |  				new Toast(res.message);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -				if (res.status === "success")
 | 
	
		
			
				|  |  | -					saveButtonRef.handleSuccessfulSave();
 | 
	
		
			
				|  |  | -				else saveButtonRef.handleFailedSave();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				if (res.status === "success")
 | 
	
		
			
				|  |  | -					this.$emit("savedSuccess", song._id);
 | 
	
		
			
				|  |  | -				else if (res.status === "error")
 | 
	
		
			
				|  |  | +				if (res.status === "error") {
 | 
	
		
			
				|  |  | +					saveButtonRef.handleFailedSave();
 | 
	
		
			
				|  |  |  					this.$emit("savedError", song._id);
 | 
	
		
			
				|  |  | +					return;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				if (verify) {
 | 
	
		
			
				|  |  | +					saveButtonRef.status = "verifying";
 | 
	
		
			
				|  |  | +					this.verify(this.song._id, success => {
 | 
	
		
			
				|  |  | +						if (success) {
 | 
	
		
			
				|  |  | +							saveButtonRef.handleSuccessfulSave();
 | 
	
		
			
				|  |  | +							this.$emit("savedSuccess", song._id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +							if (closeOrNext && this.bulk)
 | 
	
		
			
				|  |  | +								this.$emit("nextSong");
 | 
	
		
			
				|  |  | +							else if (closeOrNext) this.closeModal("editSong");
 | 
	
		
			
				|  |  | +						} else {
 | 
	
		
			
				|  |  | +							saveButtonRef.handleFailedSave();
 | 
	
		
			
				|  |  | +							this.$emit("savedError", song._id);
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					});
 | 
	
		
			
				|  |  | +					return;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				saveButtonRef.handleSuccessfulSave();
 | 
	
		
			
				|  |  | +				this.$emit("savedSuccess", song._id);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -				if (verify) this.verify(this.song._id);
 | 
	
		
			
				|  |  | -				if (close) this.closeModal("editSong");
 | 
	
		
			
				|  |  | +				if (!closeOrNext) return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				if (this.bulk) this.$emit("nextSong");
 | 
	
		
			
				|  |  | +				else this.closeModal("editSong");
 | 
	
		
			
				|  |  |  			});
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  | +		editNextSong() {
 | 
	
		
			
				|  |  | +			this.$emit("nextSong");
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  | +		flagSong() {
 | 
	
		
			
				|  |  | +			this.$emit("flagSong");
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  |  		getAlbumData(type) {
 | 
	
		
			
				|  |  |  			if (!this.song.discogs) return;
 | 
	
		
			
				|  |  |  			if (type === "title")
 | 
	
	
		
			
				|  | @@ -1560,9 +1599,10 @@ export default {
 | 
	
		
			
				|  |  |  				this.activityWatchVideoLastStatus = "not_playing";
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  | -		verify(id) {
 | 
	
		
			
				|  |  | +		verify(id, cb) {
 | 
	
		
			
				|  |  |  			this.socket.dispatch("songs.verify", id, res => {
 | 
	
		
			
				|  |  |  				new Toast(res.message);
 | 
	
		
			
				|  |  | +				if (cb) cb(res.status === "success");
 | 
	
		
			
				|  |  |  			});
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  |  		unverify(id) {
 |