| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 | <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>
 |