duration-picker.vue 2.37 KB
Newer Older
Nick's avatar
Nick committed
1
<template lang='pug'>
Nick's avatar
Nick committed
2
  v-toolbar.radius-7(flat, :color='$vuetify.dark ? "grey darken-4-l3" : "grey lighten-3"')
Nick's avatar
Nick committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
    .body-2.mr-3 Every
    v-text-field(
      solo
      hide-details
      flat
      reverse
      v-model='minutes'
    )
    .body-2.mx-3 Minute(s)
    v-divider.mr-3()
    v-text-field(
      solo
      hide-details
      flat
      reverse
      v-model='hours'
    )
    .body-2.mx-3 Hour(s)
    v-divider.mr-3()
    v-text-field(
      solo
      hide-details
      flat
      reverse
      v-model='days'
    )
    .body-2.mx-3 Day(s)
    v-divider.mr-3()
    v-text-field(
      solo
      hide-details
      flat
      reverse
      v-model='months'
    )
    .body-2.mx-3 Month(s)
    v-divider.mr-3()
    v-text-field(
      solo
      hide-details
      flat
      reverse
      v-model='years'
    )
    .body-2.mx-3 Year(s)
</template>

<script>
import _ from 'lodash'
import moment from 'moment'

export default {
  props: {
    value: {
      type: String,
      default: 'PT5M'
    }
  },
  data() {
    return {
      duration: moment.duration(0)
    }
  },
  computed: {
    years: {
      get() { return this.duration.years() || 0 },
      set(val) { this.rebuild(_.toNumber(val), 'years') }
    },
    months: {
      get() { return this.duration.months() || 0 },
      set(val) { this.rebuild(_.toNumber(val), 'months') }
    },
    days: {
      get() { return this.duration.days() || 0 },
      set(val) { this.rebuild(_.toNumber(val), 'days') }
    },
    hours: {
      get() { return this.duration.hours() || 0 },
      set(val) { this.rebuild(_.toNumber(val), 'hours') }
    },
    minutes: {
      get() { return this.duration.minutes() || 0 },
      set(val) { this.rebuild(_.toNumber(val), 'minutes') }
    }
  },
  watch: {
    value(newValue, oldValue) {
      this.duration = moment.duration(newValue)
    }
  },
  methods: {
    rebuild(val, unit) {
      if (!_.isFinite(val) || val < 0) {
        val = 0
      }
      const newDuration = {
        minutes: this.duration.minutes(),
        hours: this.duration.hours(),
        days: this.duration.days(),
        months: this.duration.months(),
        years: this.duration.years()
      }
      _.set(newDuration, unit, val)
      this.duration = moment.duration(newDuration)
      this.$emit('input', this.duration.toISOString())
    }
  },
  mounted() {
    this.duration = moment.duration(this.value)
  }
}
</script>