Skip to content
Snippets Groups Projects
ModalCreate.vue 9.35 KiB
Newer Older
  • Learn to ignore specific revisions
  •     <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>
    
        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()
                },
    
        .row {
            margin-bottom: 1em;
        }