FAQ

How to do validations in fieldtypes

Following an example of how you could do input validation in plugins. Instead of using v-model on your inputs you need to listen on the input event and pass your data only to the model if it is valid.

const Fieldtype = {
  mixins: [window.Storyblok.plugin],
  template: `
    <div>
      <input
        class="uk-width-1-1"
        type="number"
        @input="validate"
        :step="1"
        ref="input"
      />
      <div v-if="invalid">
        The number must be higher than 1 and lower than 5
      </div>
    </div>
  `,
  data() {
    return {
      invalid: false
    }
  },
  methods: {
    initWith() {
      return {
        plugin: 'number-restricted',
        value: null
      }
    },
    validate(e) {
      let val = parseInt(e.target.value)
      let max = 5
      let min = 1
      if (val > max || val < min) {
        this.invalid = true
      } else {
        this.invalid = false
        this.$refs.input.value = val
        this.model.value = val
      }
    },
    pluginCreated() {
      this.$nextTick(() => {
        if (this.model.value === null) {
          this.model.value = this.options.default || '4'
          this.$refs.input.value = this.model.value
        }
      })
    }
  },
  watch: {
    model: {
      handler (model) {
        this.$emit('changed-model', model)
      },
      deep: true
    }
  }
}