buefy
Version:
Lightweight UI components for Vue.js based on Bulma
546 lines (481 loc) • 15.4 kB
JavaScript
import { i as isMobile } from './chunk-e5fce48f.js';
import { c as config } from './chunk-9e3207cc.js';
import { F as FormElementMixin } from './chunk-10c85529.js';
var AM = 'AM';
var PM = 'PM';
var HOUR_FORMAT_24 = '24';
var HOUR_FORMAT_12 = '12';
var defaultTimeFormatter = function defaultTimeFormatter(date, vm) {
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var period = '';
if (vm.hourFormat === HOUR_FORMAT_12) {
period = ' ' + (hours < 12 ? AM : PM);
if (hours > 12) {
hours -= 12;
} else if (hours === 0) {
hours = 12;
}
}
return vm.pad(hours) + ':' + vm.pad(minutes) + (vm.enableSeconds ? ':' + vm.pad(seconds) : '') + period;
};
var defaultTimeParser = function defaultTimeParser(timeString, vm) {
if (timeString) {
var am = false;
if (vm.hourFormat === HOUR_FORMAT_12) {
var dateString12 = timeString.split(' ');
timeString = dateString12[0];
am = dateString12[1] === AM;
}
var time = timeString.split(':');
var hours = parseInt(time[0], 10);
var minutes = parseInt(time[1], 10);
var seconds = vm.enableSeconds ? parseInt(time[2], 10) : 0;
if (isNaN(hours) || hours < 0 || hours > 23 || vm.hourFormat === HOUR_FORMAT_12 && (hours < 1 || hours > 12) || isNaN(minutes) || minutes < 0 || minutes > 59) {
return null;
}
var d = null;
if (vm.computedValue && !isNaN(vm.computedValue)) {
d = new Date(vm.computedValue);
} else {
d = new Date();
d.setMilliseconds(0);
}
d.setSeconds(seconds);
d.setMinutes(minutes);
if (vm.hourFormat === HOUR_FORMAT_12) {
if (am && hours === 12) {
hours = 0;
} else if (!am && hours !== 12) {
hours += 12;
}
}
d.setHours(hours);
return new Date(d.getTime());
}
return null;
};
var TimepickerMixin = {
mixins: [FormElementMixin],
inheritAttrs: false,
props: {
value: Date,
inline: Boolean,
minTime: Date,
maxTime: Date,
placeholder: String,
editable: Boolean,
disabled: Boolean,
hourFormat: {
type: String,
default: HOUR_FORMAT_24,
validator: function validator(value) {
return value === HOUR_FORMAT_24 || value === HOUR_FORMAT_12;
}
},
incrementMinutes: {
type: Number,
default: 1
},
incrementSeconds: {
type: Number,
default: 1
},
timeFormatter: {
type: Function,
default: function _default(date, vm) {
if (typeof config.defaultTimeFormatter === 'function') {
return config.defaultTimeFormatter(date);
} else {
return defaultTimeFormatter(date, vm);
}
}
},
timeParser: {
type: Function,
default: function _default(date, vm) {
if (typeof config.defaultTimeParser === 'function') {
return config.defaultTimeParser(date);
} else {
return defaultTimeParser(date, vm);
}
}
},
mobileNative: {
type: Boolean,
default: function _default() {
return config.defaultTimepickerMobileNative;
}
},
position: String,
unselectableTimes: Array,
openOnFocus: Boolean,
enableSeconds: Boolean,
defaultMinutes: Number,
defaultSeconds: Number
},
data: function data() {
return {
dateSelected: this.value,
hoursSelected: null,
minutesSelected: null,
secondsSelected: null,
meridienSelected: null,
_elementRef: 'input',
AM: AM,
PM: PM,
HOUR_FORMAT_24: HOUR_FORMAT_24,
HOUR_FORMAT_12: HOUR_FORMAT_12
};
},
computed: {
computedValue: {
get: function get() {
return this.dateSelected;
},
set: function set(value) {
this.dateSelected = value;
this.$emit('input', value);
}
},
hours: function hours() {
var hours = [];
var numberOfHours = this.isHourFormat24 ? 24 : 12;
for (var i = 0; i < numberOfHours; i++) {
var value = i;
var label = value;
if (!this.isHourFormat24) {
value = i + 1;
label = value;
if (this.meridienSelected === this.AM) {
if (value === 12) {
value = 0;
}
} else if (this.meridienSelected === this.PM) {
if (value !== 12) {
value += 12;
}
}
}
hours.push({
label: this.formatNumber(label),
value: value
});
}
return hours;
},
minutes: function minutes() {
var minutes = [];
for (var i = 0; i < 60; i += this.incrementMinutes) {
minutes.push({
label: this.formatNumber(i, true),
value: i
});
}
return minutes;
},
seconds: function seconds() {
var seconds = [];
for (var i = 0; i < 60; i += this.incrementSeconds) {
seconds.push({
label: this.formatNumber(i, true),
value: i
});
}
return seconds;
},
meridiens: function meridiens() {
return [AM, PM];
},
isMobile: function isMobile$1() {
return this.mobileNative && isMobile.any();
},
isHourFormat24: function isHourFormat24() {
return this.hourFormat === HOUR_FORMAT_24;
}
},
watch: {
hourFormat: function hourFormat() {
if (this.hoursSelected !== null) {
this.meridienSelected = this.hoursSelected >= 12 ? PM : AM;
}
},
/**
* When v-model is changed:
* 1. Update internal value.
* 2. If it's invalid, validate again.
*/
value: {
handler: function handler(value) {
this.updateInternalState(value);
!this.isValid && this.$refs.input.checkHtml5Validity();
},
immediate: true
}
},
methods: {
onMeridienChange: function onMeridienChange(value) {
if (this.hoursSelected !== null) {
if (value === PM) {
this.hoursSelected += 12;
} else if (value === AM) {
this.hoursSelected -= 12;
}
}
this.updateDateSelected(this.hoursSelected, this.minutesSelected, this.enableSeconds ? this.secondsSelected : 0, value);
},
onHoursChange: function onHoursChange(value) {
if (!this.minutesSelected && this.defaultMinutes) {
this.minutesSelected = this.defaultMinutes;
}
if (!this.secondsSelected && this.defaultSeconds) {
this.secondsSelected = this.defaultSeconds;
}
this.updateDateSelected(parseInt(value, 10), this.minutesSelected, this.enableSeconds ? this.secondsSelected : 0, this.meridienSelected);
},
onMinutesChange: function onMinutesChange(value) {
if (!this.secondsSelected && this.defaultSeconds) {
this.secondsSelected = this.defaultSeconds;
}
this.updateDateSelected(this.hoursSelected, parseInt(value, 10), this.enableSeconds ? this.secondsSelected : 0, this.meridienSelected);
},
onSecondsChange: function onSecondsChange(value) {
this.updateDateSelected(this.hoursSelected, this.minutesSelected, parseInt(value, 10), this.meridienSelected);
},
updateDateSelected: function updateDateSelected(hours, minutes, seconds, meridiens) {
if (hours != null && minutes != null && (!this.isHourFormat24 && meridiens !== null || this.isHourFormat24)) {
var time = null;
if (this.computedValue && !isNaN(this.computedValue)) {
time = new Date(this.computedValue);
} else {
time = new Date();
time.setMilliseconds(0);
}
time.setHours(hours);
time.setMinutes(minutes);
time.setSeconds(seconds);
this.computedValue = new Date(time.getTime());
}
},
updateInternalState: function updateInternalState(value) {
if (value) {
this.hoursSelected = value.getHours();
this.minutesSelected = value.getMinutes();
this.secondsSelected = value.getSeconds();
this.meridienSelected = value.getHours() >= 12 ? PM : AM;
} else {
this.hoursSelected = null;
this.minutesSelected = null;
this.secondsSelected = null;
this.meridienSelected = AM;
}
this.dateSelected = value;
},
isHourDisabled: function isHourDisabled(hour) {
var _this = this;
var disabled = false;
if (this.minTime) {
var minHours = this.minTime.getHours();
disabled = hour < minHours;
}
if (this.maxTime) {
if (!disabled) {
var maxHours = this.maxTime.getHours();
disabled = hour > maxHours;
}
}
if (this.unselectableTimes) {
if (!disabled) {
var unselectable = this.unselectableTimes.filter(function (time) {
if (_this.enableSeconds && _this.secondsSelected !== null) {
return time.getHours() === hour && time.getMinutes() === _this.minutesSelected && time.getSeconds() === _this.secondsSelected;
} else if (_this.minutesSelected !== null) {
return time.getHours() === hour && time.getMinutes() === _this.minutesSelected;
} else {
return time.getHours() === hour;
}
});
disabled = unselectable.length > 0;
}
}
return disabled;
},
isMinuteDisabled: function isMinuteDisabled(minute) {
var _this2 = this;
var disabled = false;
if (this.hoursSelected !== null) {
if (this.isHourDisabled(this.hoursSelected)) {
disabled = true;
} else {
if (this.minTime) {
var minHours = this.minTime.getHours();
var minMinutes = this.minTime.getMinutes();
disabled = this.hoursSelected === minHours && minute < minMinutes;
}
if (this.maxTime) {
if (!disabled) {
var maxHours = this.maxTime.getHours();
var maxMinutes = this.maxTime.getMinutes();
disabled = this.hoursSelected === maxHours && minute > maxMinutes;
}
}
}
if (this.unselectableTimes) {
if (!disabled) {
var unselectable = this.unselectableTimes.filter(function (time) {
if (_this2.enableSeconds && _this2.secondsSelected !== null) {
return time.getHours() === _this2.hoursSelected && time.getMinutes() === minute && time.getSeconds() === _this2.secondsSelected;
} else {
return time.getHours() === _this2.hoursSelected && time.getMinutes() === minute;
}
});
disabled = unselectable.length > 0;
}
}
}
return disabled;
},
isSecondDisabled: function isSecondDisabled(second) {
var _this3 = this;
var disabled = false;
if (this.minutesSelected !== null) {
if (this.isMinuteDisabled(this.minutesSelected)) {
disabled = true;
} else {
if (this.minTime) {
var minHours = this.minTime.getHours();
var minMinutes = this.minTime.getMinutes();
var minSeconds = this.minTime.getSeconds();
disabled = this.hoursSelected === minHours && this.minutesSelected === minMinutes && second < minSeconds;
}
if (this.maxTime) {
if (!disabled) {
var maxHours = this.maxTime.getHours();
var maxMinutes = this.maxTime.getMinutes();
var maxSeconds = this.maxTime.getSeconds();
disabled = this.hoursSelected === maxHours && this.minutesSelected === maxMinutes && second > maxSeconds;
}
}
}
if (this.unselectableTimes) {
if (!disabled) {
var unselectable = this.unselectableTimes.filter(function (time) {
return time.getHours() === _this3.hoursSelected && time.getMinutes() === _this3.minutesSelected && time.getSeconds() === second;
});
disabled = unselectable.length > 0;
}
}
}
return disabled;
},
/*
* Parse string into date
*/
onChange: function onChange(value) {
var date = this.timeParser(value, this);
this.updateInternalState(date);
if (date && !isNaN(date)) {
this.computedValue = date;
} else {
// Force refresh input value when not valid date
this.computedValue = null;
this.$refs.input.newValue = this.computedValue;
}
},
/*
* Toggle timepicker
*/
toggle: function toggle(active) {
if (this.$refs.dropdown) {
this.$refs.dropdown.isActive = typeof active === 'boolean' ? active : !this.$refs.dropdown.isActive;
}
},
/*
* Close timepicker
*/
close: function close() {
this.toggle(false);
},
/*
* Call default onFocus method and show timepicker
*/
handleOnFocus: function handleOnFocus() {
this.onFocus();
if (this.openOnFocus) {
this.toggle(true);
}
},
/*
* Format date into string 'HH-MM-SS'
*/
formatHHMMSS: function formatHHMMSS(value) {
var date = new Date(value);
if (value && !isNaN(date)) {
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
return this.formatNumber(hours, true) + ':' + this.formatNumber(minutes, true) + ':' + this.formatNumber(seconds, true);
}
return '';
},
/*
* Parse time from string
*/
onChangeNativePicker: function onChangeNativePicker(event) {
var date = event.target.value;
if (date) {
var time = null;
if (this.computedValue && !isNaN(this.computedValue)) {
time = new Date(this.computedValue);
} else {
time = new Date();
time.setMilliseconds(0);
}
var t = date.split(':');
time.setHours(parseInt(t[0], 10));
time.setMinutes(parseInt(t[1], 10));
time.setSeconds(t[2] ? parseInt(t[2], 10) : 0);
this.computedValue = new Date(time.getTime());
} else {
this.computedValue = null;
}
},
formatNumber: function formatNumber(value, prependZero) {
return this.isHourFormat24 || prependZero ? this.pad(value) : value;
},
pad: function pad(value) {
return (value < 10 ? '0' : '') + value;
},
/*
* Format date into string
*/
formatValue: function formatValue(date) {
if (date && !isNaN(date)) {
return this.timeFormatter(date, this);
} else {
return null;
}
},
/**
* Keypress event that is bound to the document.
*/
keyPress: function keyPress(event) {
// Esc key
if (this.$refs.dropdown && this.$refs.dropdown.isActive && event.keyCode === 27) {
this.toggle(false);
}
}
},
created: function created() {
if (typeof window !== 'undefined') {
document.addEventListener('keyup', this.keyPress);
}
},
beforeDestroy: function beforeDestroy() {
if (typeof window !== 'undefined') {
document.removeEventListener('keyup', this.keyPress);
}
}
};
export { TimepickerMixin as T };