Skip to content
Snippets Groups Projects
AddShowModal.vue 7.74 KiB
Newer Older
  • Learn to ignore specific revisions
  •     <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>
    
    Richard Blechinger's avatar
    Richard Blechinger committed
                        <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"
                                />
                            </div>
                        </b-col>
                    </b-row>
    
    
                    <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"
                                />
                            </div>
                        </b-col>
                    </b-row>
                </b-container>
            </b-modal>
        </div>
    
        import slugify from '../../mixins/slugify.js'
        import {mapGetters} from 'vuex'
    
        export default {
            mixins: [slugify],
            props: {
                callback: {type: Function, default: null}
            },
            data() {
                return {
                    newShow: {
                        name: "",
                        slug: "",
                        short_description: "",
                        type: 0,
                        fundingcategory: 0,
                        category: [],
                        hosts: [],
                        owners: [],
                        language: [],
                        topic: [],
                        musicfocus: [],
                    },
                }
            },
    
            computed: {
                loaded() {
                    return this.$store.state.shows.loaded
                },
    
                temporarySlug: function () {
                    return this.slugify(this.newShow.name)
                },
    
                showTypeSelector: function () {
                    let options = []
                    for (let i in this.types) {
                        options.push({
                            value: this.types[i].id,
                            text: this.types[i].type
                        })
                    }
                    return options
                },
    
                showFundingCategorySelector: function () {
                    let options = []
                    for (let i in this.fundingcategories) {
                        options.push({
                            value: this.fundingcategories[i].id,
                            text: this.fundingcategories[i].abbrev + ' (' + this.fundingcategories[i].fundingcategory + ')'
                        })
                    }
                    return options
                },
    
                ...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
    
                    let modal = this.$refs.modalAddShow
                    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()
                },
    
        .slug {
            color: gray;
        }