Skip to content
Snippets Groups Projects
Form.vue 5.14 KiB
Newer Older
<template>
  <form class="ui form" @submit.prevent="submit">
    <p v-if="!library"><translate translate-context="Content/Library/Paragraph">Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.</translate></p>
    <div v-if="errors.length > 0" class="ui negative message">
      <div class="header"><translate translate-context="Content/Library/Error message.Title">Error</translate></div>
      <ul class="list">
        <li v-for="error in errors">{{ error }}</li>
      </ul>
    </div>
    <div class="required field">
      <label><translate translate-context="Content/Library/Input.Label">Name</translate></label>
      <input name="name" v-model="currentName" :placeholder="labels.namePlaceholder" required maxlength="100">
    </div>
    <div class="field">
      <label><translate translate-context="Content/Library/Input.Label">Description</translate></label>
      <textarea v-model="currentDescription" :placeholder="labels.descriptionPlaceholder" maxlength="2000"></textarea>
    </div>
    <div class="field">
      <label><translate translate-context="Content/Library/Dropdown.Label">Visibility</translate></label>
      <p><translate translate-context="Content/Library/Paragraph">You are able to share your library with other people, regardless of its visibility.</translate></p>
      <select class="ui dropdown" v-model="currentVisibilityLevel">
        <option :value="c" v-for="c in ['me', 'instance', 'everyone']">{{ sharedLabels.fields.privacy_level.choices[c] }}</option>
      </select>
    </div>
    <button class="ui submit button" type="submit">
      <translate translate-context="Content/Library/Button.Label/Verb" v-if="library">Update library</translate>
      <translate translate-context="Content/Library/Button.Label/Verb" v-else>Create library</translate>
    </button>
    <dangerous-button v-if="library" class="right floated basic button" color='red' @confirm="remove()">
      <translate translate-context="Content/Library/Button.Label/Verb">Delete</translate>
      <p slot="modal-header">
        <translate translate-context="Popup/Library/Title">Delete this library?</translate>
      </p>
      <p slot="modal-content">
        <translate translate-context="Popup/Library/Paragraph">
Allan Nordhøy's avatar
Allan Nordhøy committed
          The library and all its tracks will be deleted. This can not be undone.
      <div slot="modal-confirm">
        <translate translate-context="Popup/Library/Button.Label/Verb">Delete library</translate>
    </dangerous-button>
  </form>
</template>

<script>
import axios from 'axios'
import MixinsTranslation from '@/components/mixins/Translations.vue'
  mixins: [MixinsTranslation],
  props: ['library'],
  data () {
    let d = {
      isLoading: false,
      over: false,
      errors: []
    }
    if (this.library) {
      d.currentVisibilityLevel = this.library.privacy_level
      d.currentName = this.library.name
      d.currentDescription = this.library.description
    } else {
      d.currentVisibilityLevel = 'me'
      d.currentName = ''
      d.currentDescription = ''
    }
    return d
  },
  computed: {
    labels () {
      let namePlaceholder = this.$pgettext('Content/Library/Input.Placeholder', 'My awesome library')
      let descriptionPlaceholder = this.$pgettext('Content/Library/Input.Placeholder', 'This library contains my personal music, I hope you like it.')
      return {
        namePlaceholder,
        descriptionPlaceholder,
      }
    }
  },
  methods: {
    submit () {
      let self = this
      this.isLoading = true
      let payload = {
        name: this.currentName,
        description: this.currentDescription,
        privacy_level: this.currentVisibilityLevel
      }
      let promise
      if (this.library) {
        promise = axios.patch(`libraries/${this.library.uuid}/`, payload)
      } else {
        promise = axios.post('libraries/', payload)
      }
      promise.then((response) => {
        self.isLoading = false
        let msg
        if (self.library) {
          self.$emit('updated', response.data)
          msg = this.$pgettext('Content/Library/Message', 'Library updated')
        } else {
          self.$emit('created', response.data)
          msg = this.$pgettext('Content/Library/Message', 'Library created')
        }
        self.$store.commit('ui/addMessage', {
          content: msg,
          date: new Date()
        })
      }, error => {
        self.isLoading = false
        self.errors = error.backendErrors
      })
    },
    reset () {
      this.currentVisibilityLevel = 'me'
      this.currentName = ''
      this.currentDescription = ''
    },
    remove () {
      let self = this
      axios.delete(`libraries/${this.library.uuid}/`).then((response) => {
        self.isLoading = false
        let msg = this.$pgettext('Content/Library/Message', 'Library deleted')
        self.$emit('deleted', {})
        self.$store.commit('ui/addMessage', {
          content: msg,
          date: new Date()
        })
      }, error => {
        self.isLoading = false
        self.errors = error.backendErrors
      })
    }
  }
}
</script>

<style scoped>
</style>