Skip to content
Snippets Groups Projects
AddShowModal.vue 5.77 KiB
Newer Older
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
  <div>
    <!-- Modal for adding new shows -->
    <b-modal
      ref="modalAddShow"
      :title="$t('showCreator.title')"
      :cancel-title="$t('cancel')"
      size="lg"
      @ok="addShow"
    >
      <b-container fluid>
        <b-row>
          <b-col cols="3"> {{ $t('showMeta.showName') }}: </b-col>
          <b-col cols="9">
            <b-form-input
              v-model="newShow.name"
              type="text"
              :placeholder="$t('showMeta.showNamePlaceholder')"
            />
          </b-col>
          <b-col cols="3" />
          <b-col cols="9">
            <small class="slug">{{ $t('slug') }}: {{ temporarySlug }}</small>
          </b-col>
        </b-row>
        <br />

        <b-row>
          <b-col cols="3"> {{ $t('showMeta.shortDescription') }}: </b-col>
          <b-col cols="9">
            <b-form-input
              v-model="newShow.short_description"
              type="text"
              :placeholder="$t('showMeta.shortDescriptionPlaceholder')"
            />
          </b-col>
        </b-row>
        <br />

        <b-row>
          <b-col cols="3"> {{ $t('showMeta.type') }}: </b-col>
          <b-col cols="9">
            <div v-if="!loaded.types">
              <img src="/assets/radio.gif" :alt="$t('loading')" />
            </div>
            <div v-else>
              <b-form-select v-model="newShow.type" :options="showTypeSelector" />
              <p
                v-if="showTypeSelector.length === 0"
                v-html="$t('showCreator.missingShowTypes', { adminUrl })"
              />
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
            </div>
          </b-col>
        </b-row>
        <br />

        <b-row>
          <b-col cols="3"> {{ $t('showMeta.fundingCategory') }}: </b-col>
          <b-col cols="9">
            <div v-if="!loaded.fundingcategories">
              <img src="/assets/radio.gif" :alt="$t('loading')" />
            </div>
            <div v-else>
              <b-form-select
                v-model="newShow.fundingcategory"
                :options="showFundingCategorySelector"
              />
              <p
                v-if="showFundingCategorySelector.length === 0"
                v-html="$t('showCreator.missingShowFundingCategories', { adminUrl })"
              />
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
            </div>
          </b-col>
        </b-row>
      </b-container>
    </b-modal>
  </div>
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
import slugify from '../../mixins/slugify.js'
import { mapGetters } from 'vuex'

export default {
  mixins: [slugify],
  props: {
    callback: { type: Function, default: null },
  },
  data() {
    return {
      adminUrl: `${import.meta.env.VUE_APP_BASEURI_STEERING}/admin`,
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
      newShow: {
        name: '',
        slug: '',
        short_description: '',
        type: 0,
        fundingcategory: 0,
        category: [],
        hosts: [],
        owners: [],
        language: [],
        topic: [],
        musicfocus: [],
      },
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
  },

  computed: {
    loaded() {
      return this.$store.state.shows.loaded
    },

    temporarySlug: function () {
      return this.slugify(this.newShow.name)
    },

    showTypeSelector: function () {
      return this.types.map(({ type, id }) => ({ text: type, value: id }))
    },

    showFundingCategorySelector: function () {
      return this.fundingcategories.map(({ id, abbrev, fundingcategory }) => ({
        value: id,
        text: `${abbrev} (${fundingcategory})`,
      }))
    },

    ...mapGetters({
      types: 'shows/types',
      fundingcategories: 'shows/fundingcategories',
      users: 'auth/users',
    }),
  },

  methods: {
    // create a new show and POST it to the steering API
    // new shows have to at least contain a name, a slug and a short-description.
    // also a valide show type and funding category have to be choosen.
    // for all other categories we can use an empty array and let the user fill
    // it out through the existing show manager modals, after the show is created
    addShow(event) {
      // prevent the modal from closing automatically on click
      event.preventDefault()

      // only try to add a new show if name and short description are filled out
      if (this.newShow.name.trim() === '' || this.newShow.short_description.trim() === '') {
        // TODO: make this nicer UI-wise (red text annotations next to input fields instead of simple alert)
        alert('Please provide at least a title and a short description for this show.')
        return
      }
      // also the type and funding category have to be set
      if (this.types.findIndex((type) => type.id === this.newShow.type) === -1) {
        // TODO: make this nicer UI-wise (red text annotations next to input fields instead of simple alert)
        alert('Please choose a type for this show.')
        return
      }
      if (
        this.fundingcategories.findIndex((cat) => cat.id === this.newShow.fundingcategory) === -1
      ) {
        // TODO: make this nicer UI-wise (red text annotations next to input fields instead of simple alert)
        alert('Please choose a funding category for this show.')
        return
      }

      // as the slug is a computed property we have to assign it to the new show's slug property
      this.newShow.slug = this.temporarySlug

      const modal = this.$refs.modalAddShow
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
      this.$store.dispatch('shows/submitShow', {
        show: this.newShow,
        callback: (response) => {
          modal.hide()
          this.$store.commit('shows/switchShowById', response.data.id)
          if (this.callback) {
            this.callback()
          }
        },
      })
    },

    // clear and fetch modal data and open the modal to add new shows
    openModal() {
      this.newShow.name = ''
      this.newShow.slug = ''
      this.newShow.short_description = ''
      this.$refs.modalAddShow.show()
    },
  },
}
Konrad Mohrfeldt's avatar
Konrad Mohrfeldt committed
.slug {
  color: gray;
}