<template> <div> <modal title='Edit Station'> <div slot='body'> <label class='label'>Name</label> <p class='control'> <input class='input' type='text' placeholder='Station Name' v-model='editing.name'> </p> <label class='label'>Display name</label> <p class='control'> <input class='input' type='text' placeholder='Station Display Name' v-model='editing.displayName'> </p> <label class='label'>Description</label> <p class='control'> <input class='input' type='text' placeholder='Station Display Name' v-model='editing.description'> </p> <label class='label'>Privacy</label> <p class='control'> <span class='select'> <select v-model='editing.privacy'> <option :value='"public"'>Public</option> <option :value='"unlisted"'>Unlisted</option> <option :value='"private"'>Private</option> </select> </span> </p> <p class='control'> <label class="checkbox party-mode-inner"> <input type="checkbox" v-model="editing.partyMode"> Party mode </label> </p> </div> <div slot='footer'> <button class='button is-success' @click='update()'>Update Settings</button> <button class='button is-danger' @click='deleteStation()' v-if="$parent.type === 'community'">Delete station</button> </div> </modal> </div> </template> <script> import { Toast } from 'vue-roaster'; import Modal from './Modal.vue'; import io from '../../io'; import validation from '../../validation'; export default { data: function() { return { editing: { _id: '', name: '', type: '', displayName: '', description: '', privacy: 'private', partyMode: false } } }, methods: { update: function () { if (this.$parent.station.name !== this.editing.name) this.updateName(); if (this.$parent.station.displayName !== this.editing.displayName) this.updateDisplayName(); if (this.$parent.station.description !== this.editing.description) this.updateDescription(); if (this.$parent.station.privacy !== this.editing.privacy) this.updatePrivacy(); if (this.$parent.station.partyMode !== this.editing.partyMode) this.updatePartyMode(); }, updateName: function () { const name = this.editing.name; if (!validation.isLength(name, 2, 16)) return Toast.methods.addToast('Name must have between 2 and 16 characters.', 8000); if (!validation.regex.az09_.test(name)) return Toast.methods.addToast('Invalid name format. Allowed characters: a-z, 0-9 and _.', 8000); this.socket.emit('stations.updateName', this.editing._id, name, res => { if (res.status === 'success') { if (this.$parent.station) _this.$parent.station.name = name; else { this.$parent.stations.forEach((station, index) => { if (station._id === this.editing._id) return this.$parent.stations[index].name = name; }); } } Toast.methods.addToast(res.message, 8000); }); }, updateDisplayName: function () { const displayName = this.editing.displayName; if (!validation.isLength(displayName, 2, 32)) return Toast.methods.addToast('Display name must have between 2 and 32 characters.', 8000); if (!validation.regex.azAZ09_.test(displayName)) return Toast.methods.addToast('Invalid display name format. Allowed characters: a-z, A-Z, 0-9 and _.', 8000); this.socket.emit('stations.updateDisplayName', this.editing._id, displayName, res => { if (res.status === 'success') { if (this.$parent.station) _this.$parent.station.displayName = displayName; else { this.$parent.stations.forEach((station, index) => { if (station._id === this.editing._id) return this.$parent.stations[index].displayName = displayName; }); } } Toast.methods.addToast(res.message, 8000); }); }, updateDescription: function () { const description = this.editing.description; if (!validation.isLength(description, 2, 200)) return Toast.methods.addToast('Description must have between 2 and 200 characters.', 8000); let characters = description.split(""); characters = characters.filter(function(character) { return character.charCodeAt(0) === 21328; }); if (characters.length !== 0) return Toast.methods.addToast('Invalid description format. Swastika\'s are not allowed.', 8000); this.socket.emit('stations.updateDescription', this.editing._id, description, res => { if (res.status === 'success') { if (_this.$parent.station) _this.$parent.station.description = description; else { _this.$parent.stations.forEach((station, index) => { if (station._id === station._id) return _this.$parent.stations[index].description = description; }); } return Toast.methods.addToast(res.message, 4000); } Toast.methods.addToast(res.message, 8000); }); }, updatePrivacy: function () { let _this = this; this.socket.emit('stations.updatePrivacy', this.editing._id, this.editing.privacy, res => { if (res.status === 'success') { if (_this.$parent.station) _this.$parent.station.privacy = _this.editing.privacy; else { _this.$parent.stations.forEach((station, index) => { if (station._id === station._id) return _this.$parent.stations[index].privacy = _this.editing.privacy; }); } return Toast.methods.addToast(res.message, 4000); } Toast.methods.addToast(res.message, 8000); }); }, updatePartyMode: function () { let _this = this; this.socket.emit('stations.updatePartyMode', this.editing._id, this.editing.partyMode, res => { if (res.status === 'success') { if (_this.$parent.station) _this.$parent.station.partyMode = _this.editing.partyMode; else { _this.$parent.stations.forEach((station, index) => { if (station._id === station._id) return _this.$parent.stations[index].partyMode = _this.editing.partyMode; }); } return Toast.methods.addToast(res.message, 4000); } Toast.methods.addToast(res.message, 8000); }); }, deleteStation: function() { let _this = this; this.socket.emit('stations.remove', this.editing._id, res => { Toast.methods.addToast(res.message, 8000); }); } }, ready: function () { let _this = this; io.getSocket(socket => { _this.socket = socket; }); }, events: { closeModal: function() { this.$parent.modals.editStation = false; }, editStation: function(station) { for (let prop in station) { this.editing[prop] = station[prop]; } this.$parent.modals.editStation = true; } }, components: { Modal } } </script> <style type='scss' scoped> .controls { display: flex; a { display: flex; align-items: center; } } .table { margin-bottom: 0; } h5 { padding: 20px 0; } .party-mode-inner, .party-mode-outer { display: flex; align-items: center; } .select:after { border-color: #029ce3; } </style>