Newer
Older
<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">
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<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>

jackie / Andrea Ida Malkah Klaura
committed
<div v-else>
<b-row>
<b-col align="center">
<img

Richard Blechinger
committed
src="/assets/radio.gif"

jackie / Andrea Ida Malkah Klaura
committed
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,

jackie / Andrea Ida Malkah Klaura
committed
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

jackie / Andrea Ida Malkah Klaura
committed
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,
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

jackie / Andrea Ida Malkah Klaura
committed
this.submitting = false
this.$refs.modalEmissionManagerCreate.show()
},
}
}
</script>
<style scoped>
.row {
margin-bottom: 1em;
}
</style>