Skip to content
Snippets Groups Projects
ModalCreate.vue 9.61 KiB
Newer Older
  • Learn to ignore specific revisions
  •     <div>
            <b-modal
    
                ref="modalEmissionManagerCreate"
                :title="$t('scheduleEditor.titleCreate', { show: selectedShow.name })"
                :cancel-title="$t('cancel')"
                size="lg"
                @ok="create"
    
            >
                <b-alert
    
                    variant="warning"
                    :show="pastEventWarning"
    
                    <span v-html="$t('scheduleEditor.pastEventWarning')" />
    
                </b-alert>
    
                <server-errors :errors="serverErrors" />
    
    
                <div v-if="loaded.modal && !submitting">
                    <b-row>
    
                        <b-col cols="12">
                            <label class="tw-w-full tw-font-bold">
    
                                <span class="tw-inline-block tw-pb-2">{{ $t('rrule.rrule') }}</span>
    
                                <b-form-select
    
                                    v-model="valuePick.rrule"
                                    :options="rruleOptions"
    
                        </b-col>
                    </b-row>
    
                    <b-row>
    
                        <b-col cols="3">
                            <label class="tw-w-full tw-font-bold">
    
                                <span class="tw-inline-block tw-pb-2">{{ $t('scheduleEditor.fromDate' ) }}</span>
    
                                <b-form-input
    
                                    v-model="valuePick.firstDate"
    
                                    type="date"
    
                        </b-col>
    
                        <b-col
                            v-if="valuePick.rrule !== 1"
                            cols="3"
                        >
    
                            <label class="tw-w-full tw-font-bold">
    
                                <span
                                    class="tw-inline-block tw-pb-2"
                                    v-html="$t('scheduleEditor.toDate')"
                                />
    
                                <b-form-input
    
                                    v-model="valuePick.lastDate"
    
                                    type="date"
    
                        </b-col>
    
                        <b-col cols="3">
                            <label class="tw-w-full tw-font-bold">
                                <span class="tw-inline-block tw-pb-2">{{ $t('scheduleEditor.from') }}</span>
                                <b-form-input
    
                                    v-model="valuePick.startTime"
    
                                    type="time"
    
                        </b-col>
    
                        <b-col cols="3">
                            <label class="tw-w-full tw-font-bold">
                                <span class="tw-inline-block tw-pb-2">{{ $t('scheduleEditor.to') }}</span>
                                <b-form-input
    
                                    v-model="valuePick.endTime"
    
                                    type="time"
    
                        </b-col>
                    </b-row>
                </div>
                <div v-else>
                    <b-row>
                        <b-col align="center">
                            <img
    
                                src="/assets/radio.gif"
                                :alt="$t('loading')"
    
                            >
                        </b-col>
                    </b-row>
                </div>
    
                <template #modal-footer="{ ok, cancel }">
    
                    <div class="tw-flex tw-justify-between tw-items-center tw-w-full">
    
                        <span v-html="$t('scheduleEditor.projectedDuration', { duration: projectedTimeslotDuration })" />
    
    
                        <div class="tw-space-x-2">
    
                            <b-button @click="cancel()">
                                {{ $t('cancel') }}
                            </b-button>
                            <b-button
                                variant="primary"
                                @click="ok()"
                            >
                                OK
                            </b-button>
    
            </b-modal>
        </div>
    
        import {mapGetters} from 'vuex'
        import prettyDate from '../../mixins/prettyDate'
        import rrules from '../../mixins/rrules'
    
        import ServerErrors from '@/components/ServerErrors.vue'
    
        export default {
    
            components: {ServerErrors},
    
            mixins: [prettyDate, rrules],
    
            data() {
                return {
                    newSchedule: null,
                    loadedModal: false,
                    submitting: false,
                    pastEventWarning: false,
    
                    initialLastDate: null,
    
                    valuePick: {
    
                        firstDate: null,
                        startTime: null,
                        endTime: null,
                        lastDate: null,
    
            computed: {
                loaded() {
                    return {
                        shows: this.$store.state.shows.loaded['shows'],
                        modal: this.loadedModal,
                    }
                },
    
                projectedTimeslotDuration() {
    
                    const {firstDate, startTime, endTime} = this.valuePick
    
                    const d1 = new Date(`${firstDate} ${startTime}`)
                    const d2 = new Date(`${this.initialLastDate} ${endTime}`)
    
                    const diffInNs = (d2 - d1) * 1000 * 1000
                    const diffInMinutes = this.nanosecondsToMinutes(diffInNs)
    
                    return this.minutesToHm(diffInMinutes)
    
                ...mapGetters({
                    selectedShow: 'shows/selectedShow',
                })
            },
    
            methods: {
    
                    // 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.firstDate < now) {
                        this.valuePick.firstDate = 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.first_date = this.valuePick.firstDate
                    this.newSchedule.schedule.start_time = this.valuePick.startTime
                    this.newSchedule.schedule.end_time = this.valuePick.endTime
                    this.newSchedule.schedule.last_date = this.valuePick.lastDate
    
                    this.newSchedule.schedule.rrule = this.valuePick.rrule
    
                    this.newSchedule.schedule.by_weekday = this.getWeekdayFromApiDate(this.valuePick.firstDate)
    
                    // ok then, let's submit and see if any conflicts arise
                    this.submitting = true
    
                    this.serverErrors = []
                    try {
                        await this.$store.dispatch('shows/submitSchedule', {
                            showId: this.selectedShow.id,
                            schedule: this.newSchedule,
                        })
                        this.$parent.renderView(null)
                        this.$refs.modalEmissionManagerCreate.hide()
                    } catch (e) {
                        const responseData = e.response?.data
                        if (e.response?.status === 409) {
                            this.$parent.resolve(responseData)
    
                            this.$refs.modalEmissionManagerCreate.hide()
    
                        } else {
                            this.serverErrors = e.errors ?? []
    
                    } finally {
                        this.submitting = false
                    }
    
                // initialise a new schedule and open the modal
                open(start, end) {
    
                    let firstDate = start.format('YYYY-MM-DD')
                    const startTime = start.format('HH:mm')
                    const endTime = end.format('HH:mm')
                    const lastDate = end.format('YYYY-MM-DD')
                    const now = this.apiDate(new Date())
                    if (firstDate < now) {
                        firstDate = now
    
                    } else {
                        this.pastEventWarning = false
                    }
    
                    this.valuePick.firstDate = firstDate
                    this.valuePick.startTime = startTime
                    this.valuePick.endTime = endTime
                    this.valuePick.lastDate = lastDate
                    this.initialLastDate = lastDate
    
                    this.newSchedule = {
                        schedule: {
                            rrule: 1,
                            show: 0,
    
                            by_weekday: 0,
                            first_date: firstDate,
                            start_time: startTime,
                            end_time: endTime,
                            last_date: lastDate,
    
                            is_repetition: false,
                            add_days_no: 0,
                            add_business_days_only: false,
    
                            automation_id: 0,
                        }
                    }
                    this.loadedModal = true
                    this.submitting = false
                    this.$refs.modalEmissionManagerCreate.show()
                },
    
        .row {
            margin-bottom: 1em;
        }