mirror of https://github.com/statping/statping
195 lines
6.8 KiB
Vue
195 lines
6.8 KiB
Vue
<template>
|
|
<div>
|
|
<div class="card contain-card mb-5">
|
|
<div class="card-header">{{message.id ? `Update ${message.title}` : "Create Announcement"}}
|
|
<transition name="slide-fade">
|
|
<button @click="removeEdit" v-if="message.id" class="btn btn-sm float-right btn-danger btn-sm">
|
|
{{ $t('close') }}
|
|
</button>
|
|
</transition>
|
|
</div>
|
|
<div class="card-body">
|
|
<form @submit="saveMessage">
|
|
<div class="form-group row">
|
|
<label class="col-sm-4 col-form-label">{{ $t('dashboard.title') }}</label>
|
|
<div class="col-sm-8">
|
|
<input v-model="message.title" type="text" name="title" class="form-control" id="title" placeholder="Announcement Title" required>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row">
|
|
<label class="col-sm-4 col-form-label">Description</label>
|
|
<div class="col-sm-8">
|
|
<textarea v-model="message.description" rows="5" name="description" class="form-control" id="description" required></textarea>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row">
|
|
<label class="col-sm-4 col-form-label">Service</label>
|
|
<div class="col-sm-8">
|
|
<select v-model="message.service" name="service_id" class="form-control">
|
|
<option :value="0">Global Announcement</option>
|
|
<option v-for="service in $store.getters.services" :value="service.id" v-bind:key="service.id" >{{service.name}}</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row">
|
|
<label class="col-sm-4 col-form-label">Announcement Date Range</label>
|
|
<div class="col-sm-4">
|
|
<flatPickr v-model="message.start_on" @on-change="startChange" :config="config" type="text" name="start_on" class="form-control form-control-plaintext" id="start_on" value="0001-01-01T00:00:00Z" required />
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<flatPickr v-model="message.end_on" @on-change="endChange" :config="config" type="text" name="end_on" class="form-control form-control-plaintext" id="end_on" value="0001-01-01T00:00:00Z" required />
|
|
</div>
|
|
</div>
|
|
|
|
<div v-show="this.service === null" class="form-group row">
|
|
<label for="service_id" class="col-sm-4 col-form-label">Service</label>
|
|
<div class="col-sm-8">
|
|
<select v-model="message.service" class="form-control" name="service" id="service_id">
|
|
<option :value="0">Global Message</option>
|
|
<option v-for="service in $store.getters.services" :value="service.id" v-bind:key="service.id">{{service.name}}</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row">
|
|
<label for="notify_method" class="col-sm-4 col-form-label">Notify Users</label>
|
|
<div class="col-sm-8">
|
|
<span @click="message.notify = !!message.notify" class="switch">
|
|
<input v-model="message.notify" type="checkbox" class="switch" id="switch-normal">
|
|
<label for="switch-normal">Notify Users Before Scheduled Time</label>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="message.notify" class="form-group row">
|
|
<label for="notify_method" class="col-sm-4 col-form-label">Notification Method</label>
|
|
<div class="col-sm-8">
|
|
<input v-model="message.notify_method" type="text" name="notify_method" class="form-control" id="notify_method" value="" placeholder="email">
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="message.notify" class="form-group row">
|
|
<label for="notify_before" class="col-sm-4 col-form-label">Notify Before</label>
|
|
<div class="col-sm-8">
|
|
<div class="form-inline">
|
|
<input v-model="message.notify_before" type="number" name="notify_before" class="col-4 form-control" id="notify_before">
|
|
<select v-model="message.notify_before_scale" class="ml-2 col-7 form-control" name="notify_before_scale" id="notify_before_scale">
|
|
<option value="minute">Minutes</option>
|
|
<option value="hour">Hours</option>
|
|
<option value="day">Days</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group row">
|
|
<div class="col-sm-12">
|
|
<button @click="saveMessage"
|
|
:disabled="!message.title || !message.description"
|
|
type="submit" class="btn btn-block" :class="{'btn-primary': !message.id, 'btn-secondary': message.id}">
|
|
{{message.id ? "Edit Message" : "Create Message"}}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="alert alert-danger d-none" id="alerter" role="alert"></div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import Api from "../API";
|
|
import flatPickr from 'vue-flatpickr-component';
|
|
import 'flatpickr/dist/flatpickr.css';
|
|
|
|
export default {
|
|
name: 'FormMessage',
|
|
components: {
|
|
flatPickr
|
|
},
|
|
props: {
|
|
in_message: {
|
|
type: Object
|
|
},
|
|
service: {
|
|
type: Object
|
|
},
|
|
edit: {
|
|
type: Function
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
message: {
|
|
title: "",
|
|
description: "",
|
|
start_on: new Date(),
|
|
end_on: new Date(),
|
|
service_id: 0,
|
|
notify_method: "",
|
|
notify: false,
|
|
notify_before: 0,
|
|
notify_before_scale: "minute",
|
|
},
|
|
config: {
|
|
altFormat: "l M J, \\at h:iK",
|
|
altInput: true,
|
|
enableTime: true,
|
|
dateFormat: "Z",
|
|
},
|
|
temp: {}
|
|
}
|
|
},
|
|
watch: {
|
|
in_message() {
|
|
this.message = this.in_message
|
|
}
|
|
},
|
|
mounted () {
|
|
if (this.service) {
|
|
this.service_id = this.service.id
|
|
}
|
|
},
|
|
methods: {
|
|
startChange(e) {
|
|
window.console.log(e)
|
|
},
|
|
endChange(e) {
|
|
window.console.log(e)
|
|
},
|
|
removeEdit() {
|
|
this.message = {}
|
|
this.edit(false)
|
|
},
|
|
async saveMessage(e) {
|
|
e.preventDefault();
|
|
if (this.message.id) {
|
|
await this.updateMessage()
|
|
} else {
|
|
await this.createMessage()
|
|
}
|
|
},
|
|
async createMessage() {
|
|
await Api.message_create(this.message)
|
|
const messages = await Api.messages()
|
|
this.$store.commit('setMessages', messages)
|
|
this.message = {}
|
|
},
|
|
async updateMessage() {
|
|
await Api.message_update(this.message)
|
|
const messages = await Api.messages()
|
|
this.$store.commit('setMessages', messages)
|
|
this.edit(false)
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
<style scoped>
|
|
</style>
|