Skip to content
Snippets Groups Projects
ShowManagerModalSuperuser.vue 7.75 KiB
Newer Older
  • Learn to ignore specific revisions
  •     <!-- Modal for adding new shows -->
    
        <b-modal
          ref="modalAddShow"
          title="Create a new show"
          size="lg"
          @ok="addShow"
        >
          <b-container fluid>
            <b-row>
    
                <b-form-input
                  v-model="newShow.name"
                  type="text"
                  placeholder="Enter a title for this new show"
                />
              </b-col>
    
                <small class="slug">Slug: {{ temporarySlug }}</small>
              </b-col>
            </b-row>
            <br>
    
                <b-form-input
                  v-model="newShow.short_description"
                  type="text"
                  placeholder="Enter a short description for this show"
                />
              </b-col>
            </b-row>
    
            <br>
    
            <b-row>
              <b-col cols="3">
                Show type:
              </b-col>
              <b-col cols="9">
                <div v-if="!loaded.types">
                  <img
                    src="../assets/radio.gif"
                    alt="loading data"
                  >
                </div>
                <div v-else>
                  <b-form-select
                    v-model="newShow.type"
                    :options="showTypeSelector"
                  />
                </div>
              </b-col>
            </b-row>
            
            <b-row>
              <b-col cols="3">
                Funding category:
              </b-col>
              <b-col cols="9">
                <div v-if="!loaded.fundingcategories">
                  <img
                    src="../assets/radio.gif"
                    alt="loading data"
                  >
                </div>
                <div v-else>
                  <b-form-select
                    v-model="newShow.fundingcategory"
                    :options="showFundingCategorySelector"
                  />
                </div>
              </b-col>
            </b-row>
    
    
        <!-- Modal to confirm and delete a show -->
        <b-modal
          ref="modalDeleteShow"
          title="Delete a show"
          size="lg"
          @ok="deleteShow"
        >
          <b-alert
            variant="danger"
            show
          >
            You are about to delete the show <b>{{ deletedShow.name }}</b>!
          </b-alert>
          <div align="center">
            Are you sure you want to continue?
          </div>
        </b-modal>
    
      </div>
    </template>
    
    <script>
    import axios from 'axios'
    import slugify from '../mixins/slugify.js'
    
    export default {
      mixins: [ slugify ],
      data () {
        return {
          newShow: {
            name: "",
            slug: "",
            short_description: "",
    
            category: [],
            hosts: [],
            owners: [],
            language: [],
            topic: [],
    
            musicfocus: [],
          },
          deletedShow: {
            id: null,
            name: '',
    
          },
          loaded: {
            types: false,
            fundingcategories: false,
          },
          types: [],
          fundingcategories: [],
    
      computed: {
        temporarySlug: function () {
          return this.slug(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
        },
    
      methods: {
        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.')
          } else {
            // as the slug is a computed property we to assign it to the new show's slug variable
            this.newShow.slug = this.temporarySlug
    
            let uri = process.env.VUE_APP_API_STEERING_SHOWS
    
            axios.post(uri, this.newShow, {
              withCredentials: true,
              headers: { 'Authorization': 'Bearer ' + this.$parent.$parent.user.access_token }
    
              // everything was fine, we can close the modal now
              this.$refs.modalAddShow.hide()
    
              this.$parent.loadAndSwitch(response.data.id)
    
            }).catch(error => {
              this.$log.error(error.response.status + ' ' + error.response.statusText)
              this.$log.error(error.response)
              alert('Error: could not add new show. See console for details.')
              // and we leave the modal open, so no call to its .hide function here
            })
          }
        },
    
    
        deleteShow (event) {
          // prevent the modal from closing automatically on click
          event.preventDefault()
          let uri = process.env.VUE_APP_API_STEERING_SHOWS + this.deletedShow.id
          axios.delete(uri, {
            withCredentials: true,
            headers: { 'Authorization': 'Bearer ' + this.$parent.$parent.user.access_token }
          }).then(() => {
            this.$refs.modalDeleteShow.hide()
            this.$parent.loadAndSwitch(null)
          }).catch(error => {
            this.$log.error(error.response.status + ' ' + error.response.statusText)
            this.$log.error(error.response)
            alert('Error: could not delete show. See console for details.')
            // and we leave the modal open, so no call to its .hide function here
          })
        },
    
    
        // clear and fetch modal data and open the modal to add new shows
    
        showModalAddShow () {
          this.newShow.name = ''
          this.newShow.slug = ''
          this.newShow.short_description = ''
    
          this.loadTypes()
          this.loadFundingCategories()
    
          this.$refs.modalAddShow.show()
    
        // open the deletion confirmation modal
    
        showModalDeleteShow (id, name) {
          this.deletedShow.id = id
          this.deletedShow.name = name
          this.$refs.modalDeleteShow.show()
    
        },
    
        // fetch all available (that is: active) show type from steering
        loadTypes () {
          this.loaded.types = false
          axios.get(process.env.VUE_APP_API_STEERING + 'types/?active=true', {
            withCredentials: true,
            headers: { 'Authorization': 'Bearer ' + this.$parent.$parent.user.access_token }
          }).then(response => {
            this.types = response.data
            this.loaded.types = true
          }).catch(error => {
            this.$log.error(error.response.status + ' ' + error.response.statusText)
            this.$log.error(error.response)
            alert('Error: could not load available show types. See console for details.')
          })
        },
    
        // fetch all available (that is: active) funding categories from steering
        loadFundingCategories () {
          this.loaded.fundingcategories = false
          axios.get(process.env.VUE_APP_API_STEERING + 'fundingcategories/?active=true', {
            withCredentials: true,
            headers: { 'Authorization': 'Bearer ' + this.$parent.$parent.user.access_token }
          }).then(response => {
            this.fundingcategories = response.data
            this.loaded.fundingcategories = true
          }).catch(error => {
            this.$log.error(error.response.status + ' ' + error.response.statusText)
            this.$log.error(error.response)
            alert('Error: could not load available funding categories. See console for details.')
          })
        },