<template> <div> <b-modal ref="modalEmissionManagerCreate" title="Create a new schedule" size="lg" @ok="create" > <b-row> <b-col cols="3"> Creating schedule for: </b-col> <b-col cols="9"> <b v-if="loaded.shows"> {{ selectedShow.name }} </b>! </b-col> </b-row> <b-alert variant="warning" :show="pastEventWarning" > Past events will be ignored. Start date was set to today!<br> Try again or change the start date to something in the future. </b-alert> <div v-if="loaded.modal && !submitting"> <b-row> <b-col cols="2"> Start: </b-col> <b-col cols="3"> <b-form-input v-model="valuePick.dstart" type="date" /> </b-col> <b-col cols="3"> <b-form-input v-model="valuePick.tstart" type="time" /> </b-col> <b-col cols="1"> End: </b-col> <b-col cols="3"> <b-form-input v-model="valuePick.tend" type="time" /> </b-col> </b-row> <b-row> <b-col cols="2"> Type of event: </b-col> <b-col cols="6"> <b-form-select v-model="valuePick.rrule" :options="rruleOptions" /> </b-col> <b-col v-if="valuePick.rrule != 1"> Until: </b-col> <b-col v-if="valuePick.rrule != 1"> <b-form-input v-model="valuePick.until" type="date" /> </b-col> </b-row> </div> <div v-else> <b-row> <b-col align="center"> <img src="/assets/radio.gif" alt="submitting new schedule" > </b-col> </b-row> </div> </b-modal> </div> </template> <script> import { mapGetters } from 'vuex' import prettyDate from '../../mixins/prettyDate' import rrules from '../../mixins/rrules' export default { mixins: [ prettyDate, rrules ], data () { return { newSchedule: null, loadedModal: false, submitting: false, pastEventWarning: false, valuePick: { dstart: null, tstart: null, tend: null, until: null, rrule: 1 }, } }, computed: { loaded () { return { shows: this.$store.state.shows.loaded['shows'], modal: this.loadedModal, } }, ...mapGetters({ selectedShow: 'shows/selectedShow', }) }, methods: { create (event) { // prevent the modal from closing automatically on click event.preventDefault() // check for past dates; as past dates will be ignored by steering we // want to make the user aware - otherwise it might get confusing in // conflict resolution let now = this.apiDate(new Date()) if (this.valuePick.dstart < now) { this.valuePick.dstart = now this.pastEventWarning = true return } else { this.pastEventWarning = false } // take all values that have been picked and put them into our new // schedule. so far we do not need any transformations. this.newSchedule.schedule.dstart = this.valuePick.dstart this.newSchedule.schedule.tstart = this.valuePick.tstart this.newSchedule.schedule.tend = this.valuePick.tend this.newSchedule.schedule.until = this.valuePick.until this.newSchedule.schedule.rrule = this.valuePick.rrule this.newSchedule.schedule.byweekday = this.getWeekdayFromApiDate(this.valuePick.dstart) // ok then, let's submit and see if any conflicts arise this.submitting = true this.$store.dispatch('shows/submitSchedule', { showId: this.selectedShow.id, schedule: this.newSchedule, callback: (response) => { // we have to check if there are any conflicts with existing timeslots let conflicts = false for (let i in response.data.projected) { if (response.data.projected[i].collisions.length > 0) { conflicts = true break } } // if there are no conflicts we can set an empty solutions object // in our newSchedule and submit it. if (!conflicts) { this.newSchedule.solutions = {} this.submit() // otherwise we have to resolve the conflict first. } else { this.submitting = false this.$parent.resolve(response.data) this.$refs.modalEmissionManagerCreate.hide() } }, callbackCancel: () => { this.submitting = false } }) }, submit () { this.$store.dispatch('shows/submitSchedule', { showId: this.selectedShow.id, schedule: this.newSchedule, callback: (response) => { this.submitting = false // if for some reason a new conflict arose, e.g. because in the meantime // someone else inserted a conflicting schedule, we have to resolve. // TODO: based on single event schedule // TODO: check for complex schedules with resolved conflicts if (response.data.projected === undefined) { this.$parent.renderView(null) } else { this.$log.debug('Timeslot conflict. Switching to resolve mode.') this.$parent.resolve(response.data) } this.$refs.modalEmissionManagerCreate.hide() }, callbackCancel: () => { this.submitting = false } }) }, // initialise a new schedule and open the modal open (start, end) { let dstart = start.format('YYYY-MM-DD') let tstart = start.format('HH:mm') let tend = end.format('HH:mm') let until = end.format('YYYY-MM-DD') let now = this.apiDate(new Date()) if (dstart < now) { dstart = now this.pastEventWarning = true } else { this.pastEventWarning = false } this.valuePick.dstart = dstart this.valuePick.tstart = tstart this.valuePick.tend = tend this.valuePick.until = until this.newSchedule = { schedule: { rrule: 1, show: 0, byweekday: 0, dstart: dstart, tstart: tstart, tend: tend, until: until, is_repetition: false, add_days_no: 0, add_business_days_only: false, fallback_id: 0, automation_id: 0, } } this.loadedModal = true this.submitting = false this.$refs.modalEmissionManagerCreate.show() }, } } </script> <style scoped> .row { margin-bottom: 1em; } </style>