123 lines
3.7 KiB
Vue
123 lines
3.7 KiB
Vue
<template>
|
|
<div id="settings">
|
|
<md-card>
|
|
<md-card-header>
|
|
<span class="md-title">Settings</span>
|
|
</md-card-header>
|
|
<md-card-content v-if="loggedInUser.isAdmin">
|
|
<div class="md-headline">
|
|
Prevent modifications from unregistered users:
|
|
</div>
|
|
<div class="protection-sect">
|
|
<md-switch v-model="shownSettings.protectUnregistered" class="md-warn">unregistered attendees (modify and delete)</md-switch>
|
|
|
|
<br />
|
|
<md-switch v-model="shownSettings.protectGroupNotes" class="md-warn">group notes</md-switch>
|
|
|
|
<br />
|
|
<md-switch v-model="shownSettings.protectGroupName" class="md-warn">group name</md-switch>
|
|
|
|
<br />
|
|
<md-switch v-model="shownSettings.protectDayNotes" class="md-warn">day notes</md-switch>
|
|
|
|
</div>
|
|
|
|
<br />
|
|
<div class="md-headline">
|
|
Message of the day
|
|
</div>
|
|
<md-switch v-model="shownSettings.showMotd" class="md-warn">show motd</md-switch>
|
|
|
|
<md-input-container v-if="shownSettings.showMotd">
|
|
<label>message</label>
|
|
<md-textarea v-model="shownSettings.motd"></md-textarea>
|
|
</md-input-container>
|
|
|
|
<br />
|
|
<md-button id="save-button" class="md-raised md-primary" @click="save()">Save</md-button>
|
|
</md-card-content>
|
|
<md-card-content v-else>
|
|
Only admin are allowed to change global settings.
|
|
</md-card-content>
|
|
</md-card>
|
|
<ibt-dialog ref="dialogObj" />
|
|
<ibt-snackbar ref="snackbarObj" />
|
|
</div>
|
|
</template>
|
|
<script>
|
|
|
|
import IbtDialog from './IbtDialog.vue';
|
|
import IbtSnackbar from './IbtSnackbar.vue';
|
|
|
|
export default {
|
|
|
|
computed: {
|
|
loggedInUser() {
|
|
return this.$store.state.loggedInUser;
|
|
},
|
|
|
|
shownSettings() {
|
|
return this.$store.state.settings || {};
|
|
}
|
|
},
|
|
|
|
beforeCreate: function() {
|
|
this.settingsUrl = this.$resource('settings');
|
|
},
|
|
|
|
mounted: function() {
|
|
this.fetchSettings();
|
|
},
|
|
|
|
methods: {
|
|
fetchSettings() {
|
|
// XXX: duplicated code from App.vue; move this login
|
|
// near the store.
|
|
this.settingsUrl.get().then((response) => {
|
|
return response.json();
|
|
}, (response) => {
|
|
this.$refs.dialogObj.show({text: 'unable to fetch settings'});
|
|
}).then((json) => {
|
|
if (!json || json.error) {
|
|
this.$refs.dialogObj.show({text: 'unable to fetch settings: ' + (json && json.message) || ''});
|
|
} else {
|
|
this.$store.commit('updateSettings', json);
|
|
}
|
|
});
|
|
},
|
|
|
|
save() {
|
|
this.settingsUrl.save(this.shownSettings).then((response) => {
|
|
return response.json();
|
|
}, (response) => {
|
|
this.$refs.dialogObj.show({text: 'unable to update settings'});
|
|
}).then((json) => {
|
|
if (!json || json.error) {
|
|
this.$refs.dialogObj.show({text: 'unable to update settings: ' + (json && json.message) || ''});
|
|
} else {
|
|
this.fetchSettings();
|
|
this.$refs.snackbarObj.show('settings saved');
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
components: { IbtDialog, IbtSnackbar }
|
|
}
|
|
|
|
</script>
|
|
<style>
|
|
|
|
#settings {
|
|
padding: 10px;
|
|
}
|
|
|
|
#save-button {
|
|
margin-top: 40px;
|
|
}
|
|
|
|
.protection-sect {
|
|
padding-left: 30px;
|
|
}
|
|
|
|
</style>
|