<template> <modal title="Report"> <div slot="body"> <div class="columns song-types"> <div v-if="$parent.previousSong !== null" class="column song-type" > <div class="card is-fullwidth" :class="{ 'is-highlight-active': isPreviousSongActive }" @click="highlight('previousSong')" > <header class="card-header"> <p class="card-header-title"> Previous Song </p> </header> <div class="card-content"> <article class="media"> <figure class="media-left"> <p class="image is-64x64"> <img :src=" $parent.previousSong.thumbnail " onerror='this.src="/assets/notes-transparent.png"' /> </p> </figure> <div class="media-content"> <div class="content"> <p> <strong>{{ $parent.previousSong.title }}</strong> <br /> <small>{{ $parent.previousSong.artists.split( " ," ) }}</small> </p> </div> </div> </article> </div> <a href="#" class="absolute-a" @click="highlight('previousSong')" /> </div> </div> <div v-if="$parent.currentSong !== {}" class="column song-type"> <div class="card is-fullwidth" :class="{ 'is-highlight-active': isCurrentSongActive }" @click="highlight('currentSong')" > <header class="card-header"> <p class="card-header-title"> Current Song </p> </header> <div class="card-content"> <article class="media"> <figure class="media-left"> <p class="image is-64x64"> <img :src="$parent.currentSong.thumbnail" onerror='this.src="/assets/notes-transparent.png"' /> </p> </figure> <div class="media-content"> <div class="content"> <p> <strong>{{ $parent.currentSong.title }}</strong> <br /> <small>{{ $parent.currentSong.artists.split( " ," ) }}</small> </p> </div> </div> </article> </div> <a href="#" class="absolute-a" @click="highlight('currentSong')" /> </div> </div> </div> <div class="edit-report-wrapper"> <div class="columns is-multiline"> <div v-for="(issue, index) in issues" class="column is-half" :key="index" > <label class="label">{{ issue.name }}</label> <p v-for="(reason, index) in issue.reasons" class="control" :key="index" > <label class="checkbox"> <input type="checkbox" @click="toggleIssue(issue.name, reason)" /> {{ reason }} </label> </p> </div> <div class="column"> <label class="label">Other</label> <textarea v-model="report.description" class="textarea" maxlength="400" placeholder="Any other details..." @keyup="updateCharactersRemaining()" /> <div class="textarea-counter"> {{ charactersRemaining }} </div> </div> </div> </div> </div> <div slot="footer"> <a class="button is-success" @click="create()" href="#"> <i class="material-icons save-changes">done</i> <span> Create</span> </a> <a class="button is-danger" href="#" @click="$parent.modals.report = !$parent.modals.report" > <span> Cancel</span> </a> </div> </modal> </template> <script> import { Toast } from "vue-roaster"; import Modal from "./Modal.vue"; import io from "../../io"; export default { components: { Modal }, data() { return { charactersRemaining: 400, isPreviousSongActive: false, isCurrentSongActive: true, report: { resolved: false, songId: this.$parent.currentSong.songId, description: "", issues: [ { name: "Video", reasons: [] }, { name: "Title", reasons: [] }, { name: "Duration", reasons: [] }, { name: "Artists", reasons: [] }, { name: "Thumbnail", reasons: [] } ] }, issues: [ { name: "Video", reasons: [ "Doesn't exist", "It's private", "It's not available in my country" ] }, { name: "Title", reasons: ["Incorrect", "Inappropriate"] }, { name: "Duration", reasons: [ "Skips too soon", "Skips too late", "Starts too soon", "Starts too late" ] }, { name: "Artists", reasons: ["Incorrect", "Inappropriate"] }, { name: "Thumbnail", reasons: ["Incorrect", "Inappropriate", "Doesn't exist"] } ] }; }, mounted: function() { let _this = this; io.getSocket(socket => { _this.socket = socket; }); }, methods: { create: function() { let _this = this; console.log(this.report); _this.socket.emit("reports.create", _this.report, res => { Toast.methods.addToast(res.message, 4000); if (res.status == "success") _this.$parent.modals.report = !_this.$parent.modals.report; }); }, updateCharactersRemaining: function() { this.charactersRemaining = 400 - document.getElementsByClassName("textarea").value.length; }, highlight: function(type) { if (type == "currentSong") { this.report.songId = this.$parent.currentSong.songId; this.isPreviousSongActive = false; this.isCurrentSongActive = true; } else if (type == "previousSong") { this.report.songId = this.$parent.previousSong.songId; this.isCurrentSongActive = false; this.isPreviousSongActive = true; } }, toggleIssue: function(name, reason) { for (let z = 0; z < this.report.issues.length; z++) { if (this.report.issues[z].name == name) { if (this.report.issues[z].reasons.indexOf(reason) > -1) { this.report.issues[z].reasons.splice( this.report.issues[z].reasons.indexOf(reason), 1 ); } else this.report.issues[z].reasons.push(reason); } } } }, events: { closeModal: function() { this.$parent.modals.report = !this.$parent.modals.report; } } }; </script> <style lang="scss" scoped> h6 { margin-bottom: 15px; } .song-type:first-of-type { padding-left: 0; } .song-type:last-of-type { padding-right: 0; } .media-content { display: flex; align-items: center; height: 64px; } .radio-controls .control { display: flex; align-items: center; } .textarea-counter { text-align: right; } @media screen and (min-width: 769px) { .radio-controls .control-label { padding-top: 0 !important; } } .edit-report-wrapper { padding: 20px; } .is-highlight-active { border: 3px #03a9f4 solid; } </style>