ifthenelse-8.x-1.x-dev-no-core/modules/contrib/if_then_else/js/vue-timepicker.min.js

modules/contrib/if_then_else/js/vue-timepicker.min.js
/* eslint-env node, browser, es6, amd */

(function (global, factory) {
  'use strict'
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory()
  : typeof define === 'function' && define.amd ? define(factory)
  : (global.VueTimepicker = factory())
}(this, function () {
  'use strict'

  function install (Vue) {
    const CONFIG = {
      HOUR_TOKENS: ['HH', 'H', 'hh', 'h', 'kk', 'k'],
      MINUTE_TOKENS: ['mm', 'm'],
      SECOND_TOKENS: ['ss', 's'],
      APM_TOKENS: ['A', 'a']
    }

    var VueTimepicker = Vue.extend({
      name: 'VueTimepicker',

      props: {
        value: {type: Object},
        hideClearButton: {type: Boolean},
        format: {type: String},
        minuteInterval: {type: Number},
        secondInterval: {type: Number}
      },

      data () {
        return {
          hours: [],
          minutes: [],
          seconds: [],
          apms: [],
          showDropdown: false,
          muteWatch: false,
          hourType: 'HH',
          minuteType: 'mm',
          secondType: '',
          apmType: '',
          hour: '',
          minute: '',
          second: '',
          apm: '',
          fullValues: undefined
        }
      },

      computed: {
        displayTime () {
          let formatString = String((this.format || 'HH:mm'))
          if (this.hour) {
            formatString = formatString.replace(new RegExp(this.hourType, 'g'), this.hour)
          }
          if (this.minute) {
            formatString = formatString.replace(new RegExp(this.minuteType, 'g'), this.minute)
          }
          if (this.second && this.secondType) {
            formatString = formatString.replace(new RegExp(this.secondType, 'g'), this.second)
          }
          if (this.apm && this.apmType) {
            formatString = formatString.replace(new RegExp(this.apmType, 'g'), this.apm)
          }
          return formatString
        },
        showClearBtn () {
          if ((this.hour && this.hour !== '') || (this.minute && this.minute !== '')) {
            return true
          }
          return false
        }
      },

      watch: {
        'format': 'renderFormat',
        minuteInterval (newInteval) {
          this.renderList('minute', newInteval)
        },
        secondInterval (newInteval) {
          this.renderList('second', newInteval)
        },
        'value': 'readValues',
        'displayTime': 'fillValues'
      },

      methods: {
        formatValue (type, i) {
          switch (type) {
            case 'H':
            case 'm':
            case 's':
              return String(i)
            case 'HH':
            case 'mm':
            case 'ss':
              return i < 10 ? `0${i}` : String(i)
            case 'h':
            case 'k':
              return String(i + 1)
            case 'hh':
            case 'kk':
              return (i + 1) < 10 ? `0${i + 1}` : String(i + 1)
            default:
              return ''
          }
        },

        checkAcceptingType (validValues, formatString, fallbackValue) {
          if (!validValues || !formatString || !formatString.length) { return '' }
          for (let i = 0; i < validValues.length; i++) {
            if (formatString.indexOf(validValues[i]) > -1) {
              return validValues[i]
            }
          }
          return fallbackValue || ''
        },

        renderFormat (newFormat) {
          newFormat = newFormat || this.format
          if (!newFormat || !newFormat.length) {
            newFormat = 'HH:mm'
          }

          this.hourType = this.checkAcceptingType(CONFIG.HOUR_TOKENS, newFormat, 'HH')
          this.minuteType = this.checkAcceptingType(CONFIG.MINUTE_TOKENS, newFormat, 'mm')
          this.secondType = this.checkAcceptingType(CONFIG.SECOND_TOKENS, newFormat)
          this.apmType = this.checkAcceptingType(CONFIG.APM_TOKENS, newFormat)

          this.renderHoursList()
          this.renderList('minute')

          if (this.secondType) {
            this.renderList('second')
          }

          if (this.apmType) {
            this.renderApmList()
          }

          const self = this
          this.$nextTick(() => {
            self.readValues()
          })
        },

        renderHoursList () {
          const hoursCount = (this.hourType === 'h' || this.hourType === 'hh') ? 12 : 24
          this.hours = []
          for (let i = 0; i < hoursCount; i++) {
            this.hours.push(this.formatValue(this.hourType, i))
          }
        },

        renderList (listType, interval) {
          if (listType === 'second') {
            interval = interval || this.secondInterval
          } else if (listType === 'minute') {
            interval = interval || this.minuteInterval
          } else {
            return
          }

          if (interval === 0) {
            interval = 60
          } else if (interval > 60) {
            window.console.warn('`' + listType + '-interval` should be less than 60. Current value is', interval)
            interval = 1
          } else if (interval < 1) {
            window.console.warn('`' + listType + '-interval` should be NO less than 1. Current value is', interval)
            interval = 1
          } else if (!interval) {
            interval = 1
          }

          if (listType === 'minute') {
            this.minutes = []
          } else {
            this.seconds = []
          }

          for (let i = 0; i < 60; i += interval) {
            if (listType === 'minute') {
              this.minutes.push(this.formatValue(this.minuteType, i))
            } else {
              this.seconds.push(this.formatValue(this.secondType, i))
            }
          }
        },

        renderApmList () {
          this.apms = []
          if (!this.apmType) { return }
          this.apms = this.apmType === 'A' ? ['AM', 'PM'] : ['am', 'pm']
        },

        readValues () {
          if (!this.value || this.muteWatch) { return }

          const timeValue = JSON.parse(JSON.stringify(this.value || {}))

          const values = Object.keys(timeValue)
          if (values.length === 0) { return }

          if (values.indexOf(this.hourType) > -1) {
            this.hour = timeValue[this.hourType]
          }

          if (values.indexOf(this.minuteType) > -1) {
            this.minute = timeValue[this.minuteType]
          }

          if (values.indexOf(this.secondType) > -1) {
            this.second = timeValue[this.secondType]
          } else {
            this.second = 0
          }

          if (values.indexOf(this.apmType) > -1) {
            this.apm = timeValue[this.apmType]
          }

          this.fillValues()
        },

        fillValues () {
          let fullValues = {}

          const baseHour = this.hour
          const baseHourType = this.hourType

          const hourValue = baseHour || baseHour === 0 ? Number(baseHour) : ''
          const baseOnTwelveHours = this.isTwelveHours(baseHourType)
          const apmValue = (baseOnTwelveHours && this.apm) ? String(this.apm).toLowerCase() : false

          CONFIG.HOUR_TOKENS.forEach((token) => {
            if (token === baseHourType) {
              fullValues[token] = baseHour
              return
            }

            let value
            let apm
            switch (token) {
              case 'H':
              case 'HH':
                if (!String(hourValue).length) {
                  fullValues[token] = ''
                  return
                } else if (baseOnTwelveHours) {
                  if (apmValue === 'pm') {
                    value = hourValue < 12 ? hourValue + 12 : hourValue
                  } else {
                    value = hourValue % 12
                  }
                } else {
                  value = hourValue % 24
                }
                fullValues[token] = (token === 'HH' && value < 10) ? `0${value}` : String(value)
                break
              case 'k':
              case 'kk':
                if (!String(hourValue).length) {
                  fullValues[token] = ''
                  return
                } else if (baseOnTwelveHours) {
                  if (apmValue === 'pm') {
                    value = hourValue < 12 ? hourValue + 12 : hourValue
                  } else {
                    value = hourValue === 12 ? 24 : hourValue
                  }
                } else {
                  value = hourValue === 0 ? 24 : hourValue
                }
                fullValues[token] = (token === 'kk' && value < 10) ? `0${value}` : String(value)
                break
              case 'h':
              case 'hh':
                if (apmValue) {
                  value = hourValue
                  apm = apmValue || 'am'
                } else {
                  if (!String(hourValue).length) {
                    fullValues[token] = ''
                    fullValues.a = ''
                    fullValues.A = ''
                    return
                  } else if (hourValue > 11) {
                    apm = 'pm'
                    value = hourValue === 12 ? 12 : hourValue % 12
                  } else {
                    if (baseOnTwelveHours) {
                      apm = ''
                    } else {
                      apm = 'am'
                    }
                    value = hourValue % 12 === 0 ? 12 : hourValue
                  }
                }
                fullValues[token] = (token === 'hh' && value < 10) ? `0${value}` : String(value)
                fullValues.a = apm
                fullValues.A = apm.toUpperCase()
                break
            }
          })

          if (this.minute || this.minute === 0) {
            const minuteValue = Number(this.minute)
            fullValues.m = String(minuteValue)
            fullValues.mm = minuteValue < 10 ? `0${minuteValue}` : String(minuteValue)
          } else {
            fullValues.m = ''
            fullValues.mm = ''
          }

          if (this.second || this.second === 0) {
            const secondValue = Number(this.second)
            fullValues.s = String(secondValue)
            fullValues.ss = secondValue < 10 ? `0${secondValue}` : String(secondValue)
          } else {
            fullValues.s = ''
            fullValues.ss = ''
          }

          this.fullValues = fullValues
          this.updateTimeValue(fullValues)
          this.$emit('change', {data: fullValues})
        },

        updateTimeValue (fullValues) {
          this.muteWatch = true

          const self = this

          const baseTimeValue = JSON.parse(JSON.stringify(this.value || {}))
          let timeValue = {}

          Object.keys(baseTimeValue).forEach((key) => {
            timeValue[key] = fullValues[key]
          })

          this.$emit('input', timeValue)

          this.$nextTick(() => {
            self.muteWatch = false
          })
        },

        isTwelveHours (token) {
          return token === 'h' || token === 'hh'
        },

        toggleDropdown () {
          this.showDropdown = !this.showDropdown
        },

        select (type, value) {
          if (type === 'hour') {
            this.hour = value
          } else if (type === 'minute') {
            this.minute = value
          } else if (type === 'second') {
            this.second = value
          } else if (type === 'apm') {
            this.apm = value
          }
        },

        clearTime () {
          this.hour = ''
          this.minute = ''
          this.second = ''
          this.apm = ''
        }
      },

      mounted () {
        this.renderFormat()
      },

      template:
      '<span class="time-picker">' +
        '<input class="display-time" v-model="displayTime" @click.stop="toggleDropdown" type="text" readonly />' +
        '<span class="clear-btn" v-if="!hideClearButton" v-show="!showDropdown && showClearBtn" @click.stop="clearTime">&times;</span>' +
        '<div class="time-picker-overlay" v-if="showDropdown" @click.stop="toggleDropdown"></div>' +
        '<div class="dropdown" v-show="showDropdown">' +
          '<div class="select-list">' +
            '<ul class="hours">' +
              '<li class="hint" v-text="hourType"></li>' +
              '<li v-for="hr in hours" v-text="hr" :class="{active: hour === hr}" @click.stop="select(\'hour\', hr)"></li>' +
            '</ul>' +
            '<ul class="minutes">' +
              '<li class="hint" v-text="minuteType"></li>' +
              '<li v-for="m in minutes" v-text="m" :class="{active: minute === m}" @click.stop="select(\'minute\', m)"></li>' +
            '</ul>' +
            '<ul class="seconds" v-if="secondType">' +
              '<li class="hint" v-text="secondType"></li>' +
              '<li v-for="s in seconds" v-text="s" :class="{active: second === s}" @click.stop="select(\'second\', s)"></li>' +
            '</ul>' +
            '<ul class="apms" v-if="apmType">' +
              '<li class="hint" v-text="apmType"></li>' +
              '<li v-for="a in apms" v-text="a" :class="{active: apm === a}" @click.stop="select(\'apm\', a)"></li>' +
            '</ul>' +
          '</div>' +
        '</div>' +
      '</span>'
    })

    Vue.component('vue-timepicker', VueTimepicker)
  }

  if (typeof Vue !== 'undefined') {
    Vue.use(install)
  }

  return install
}))

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc