Skip to content
Snippets Groups Projects
ModalCreate.vue 6.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
      <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" />
                </label>
              </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" />
                </label>
              </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" />
                </label>
              </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" />
                </label>
              </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" />
                </label>
              </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>
              </div>
            </div>
          </template>
        </b-modal>
      </div>
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
    import { mapGetters } from 'vuex'
    import prettyDate from '../../mixins/prettyDate'
    import rrules from '../../mixins/rrules'
    import ServerErrors from '@/components/ServerErrors.vue'
    
    import { getISODateString, getTimeString } from '@/utilities'
    function narf_do() {
      console.log('gogo ')
    }
    narf_do()
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
    
    export default {
      components: { ServerErrors },
      mixins: [prettyDate, rrules],
    
      emits: ['conflict'],
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
      data() {
        return {
          newSchedule: null,
          loadedModal: false,
          submitting: false,
          pastEventWarning: false,
          serverErrors: [],
          initialLastDate: null,
          valuePick: {
            firstDate: null,
            startTime: null,
            endTime: null,
            lastDate: null,
            rrule: 1,
          },
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
      },
    
      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: {
        async 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.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.$refs.modalEmissionManagerCreate.hide()
          } catch (e) {
            const responseData = e.response?.data
            if (e.response?.status === 409) {
    
              this.$emit('conflict', responseData)
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
              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 = getISODateString(start)
          const startTime = getTimeString(start)
          const endTime = getTimeString(end)
          const lastDate = getISODateString(end)
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
          const now = this.apiDate(new Date())
          if (firstDate < now) {
            firstDate = now
            this.pastEventWarning = true
          } 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,
              default_playlist_id: 0,
              automation_id: 0,
            },
          }
          this.loadedModal = true
          this.submitting = false
          this.$refs.modalEmissionManagerCreate.show()
        },
      },
    }
    
    Konrad Mohrfeldt's avatar
    Konrad Mohrfeldt committed
    .row {
      margin-bottom: 1em;
    }