336 lines
14 KiB
JavaScript
336 lines
14 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.selectingTimes = undefined;
|
|
|
|
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); // Components
|
|
|
|
// Mixins
|
|
|
|
// Utils
|
|
|
|
|
|
var _VTimePickerTitle = require('./VTimePickerTitle');
|
|
|
|
var _VTimePickerTitle2 = _interopRequireDefault(_VTimePickerTitle);
|
|
|
|
var _VTimePickerClock = require('./VTimePickerClock');
|
|
|
|
var _VTimePickerClock2 = _interopRequireDefault(_VTimePickerClock);
|
|
|
|
var _picker = require('../../mixins/picker');
|
|
|
|
var _picker2 = _interopRequireDefault(_picker);
|
|
|
|
var _helpers = require('../../util/helpers');
|
|
|
|
var _pad = require('../VDatePicker/util/pad');
|
|
|
|
var _pad2 = _interopRequireDefault(_pad);
|
|
|
|
var _mixins = require('../../util/mixins');
|
|
|
|
var _mixins2 = _interopRequireDefault(_mixins);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var rangeHours24 = (0, _helpers.createRange)(24);
|
|
var rangeHours12am = (0, _helpers.createRange)(12);
|
|
var rangeHours12pm = rangeHours12am.map(function (v) {
|
|
return v + 12;
|
|
});
|
|
var range60 = (0, _helpers.createRange)(60);
|
|
var selectingTimes = { hour: 1, minute: 2, second: 3 };
|
|
var selectingNames = { 1: 'hour', 2: 'minute', 3: 'second' };
|
|
exports.selectingTimes = selectingTimes;
|
|
exports.default = (0, _mixins2.default)(_picker2.default
|
|
/* @vue/component */
|
|
).extend({
|
|
name: 'v-time-picker',
|
|
props: {
|
|
allowedHours: Function,
|
|
allowedMinutes: Function,
|
|
allowedSeconds: Function,
|
|
disabled: Boolean,
|
|
format: {
|
|
type: String,
|
|
default: 'ampm',
|
|
validator: function validator(val) {
|
|
return ['ampm', '24hr'].includes(val);
|
|
}
|
|
},
|
|
min: String,
|
|
max: String,
|
|
readonly: Boolean,
|
|
scrollable: Boolean,
|
|
useSeconds: Boolean,
|
|
value: null
|
|
},
|
|
data: function data() {
|
|
return {
|
|
inputHour: null,
|
|
inputMinute: null,
|
|
inputSecond: null,
|
|
lazyInputHour: null,
|
|
lazyInputMinute: null,
|
|
lazyInputSecond: null,
|
|
period: 'am',
|
|
selecting: selectingTimes.hour
|
|
};
|
|
},
|
|
|
|
computed: {
|
|
selectingHour: {
|
|
get: function get() {
|
|
return this.selecting === selectingTimes.hour;
|
|
},
|
|
set: function set(v) {
|
|
this.selecting = selectingTimes.hour;
|
|
}
|
|
},
|
|
selectingMinute: {
|
|
get: function get() {
|
|
return this.selecting === selectingTimes.minute;
|
|
},
|
|
set: function set(v) {
|
|
this.selecting = selectingTimes.minute;
|
|
}
|
|
},
|
|
selectingSecond: {
|
|
get: function get() {
|
|
return this.selecting === selectingTimes.second;
|
|
},
|
|
set: function set(v) {
|
|
this.selecting = selectingTimes.second;
|
|
}
|
|
},
|
|
isAllowedHourCb: function isAllowedHourCb() {
|
|
var _this = this;
|
|
|
|
if (!this.min && !this.max) return this.allowedHours;
|
|
var minHour = this.min ? Number(this.min.split(':')[0]) : 0;
|
|
var maxHour = this.max ? Number(this.max.split(':')[0]) : 23;
|
|
return function (val) {
|
|
return val >= minHour * 1 && val <= maxHour * 1 && (!_this.allowedHours || _this.allowedHours(val));
|
|
};
|
|
},
|
|
isAllowedMinuteCb: function isAllowedMinuteCb() {
|
|
var _this2 = this;
|
|
|
|
var isHourAllowed = !this.allowedHours || this.allowedHours(this.inputHour);
|
|
if (!this.min && !this.max) {
|
|
return isHourAllowed ? this.allowedMinutes : function () {
|
|
return false;
|
|
};
|
|
}
|
|
|
|
var _ref = this.min ? this.min.split(':').map(Number) : [0, 0],
|
|
_ref2 = _slicedToArray(_ref, 2),
|
|
minHour = _ref2[0],
|
|
minMinute = _ref2[1];
|
|
|
|
var _ref3 = this.max ? this.max.split(':').map(Number) : [23, 59],
|
|
_ref4 = _slicedToArray(_ref3, 2),
|
|
maxHour = _ref4[0],
|
|
maxMinute = _ref4[1];
|
|
|
|
var minTime = minHour * 60 + minMinute * 1;
|
|
var maxTime = maxHour * 60 + maxMinute * 1;
|
|
return function (val) {
|
|
var time = 60 * _this2.inputHour + val;
|
|
return time >= minTime && time <= maxTime && isHourAllowed && (!_this2.allowedMinutes || _this2.allowedMinutes(val));
|
|
};
|
|
},
|
|
isAllowedSecondCb: function isAllowedSecondCb() {
|
|
var _this3 = this;
|
|
|
|
var isHourAllowed = !this.allowedHours || this.allowedHours(this.inputHour);
|
|
var isMinuteAllowed = !this.allowedMinutes || this.allowedMinutes(this.inputMinute);
|
|
if (!this.min && !this.max) {
|
|
return isHourAllowed && isMinuteAllowed ? this.allowedSeconds : function () {
|
|
return false;
|
|
};
|
|
}
|
|
|
|
var _ref5 = this.min ? this.min.split(':').map(Number) : [0, 0, 0],
|
|
_ref6 = _slicedToArray(_ref5, 3),
|
|
minHour = _ref6[0],
|
|
minMinute = _ref6[1],
|
|
minSecond = _ref6[2];
|
|
|
|
var _ref7 = this.max ? this.max.split(':').map(Number) : [23, 59, 59],
|
|
_ref8 = _slicedToArray(_ref7, 3),
|
|
maxHour = _ref8[0],
|
|
maxMinute = _ref8[1],
|
|
maxSecond = _ref8[2];
|
|
|
|
var minTime = minHour * 3600 + minMinute * 60 + (minSecond || 0) * 1;
|
|
var maxTime = maxHour * 3600 + maxMinute * 60 + (maxSecond || 0) * 1;
|
|
return function (val) {
|
|
var time = 3600 * _this3.inputHour + 60 * _this3.inputMinute + val;
|
|
return time >= minTime && time <= maxTime && isHourAllowed && isMinuteAllowed && (!_this3.allowedSeconds || _this3.allowedSeconds(val));
|
|
};
|
|
},
|
|
isAmPm: function isAmPm() {
|
|
return this.format === 'ampm';
|
|
}
|
|
},
|
|
watch: {
|
|
value: 'setInputData'
|
|
},
|
|
mounted: function mounted() {
|
|
this.setInputData(this.value);
|
|
},
|
|
|
|
methods: {
|
|
genValue: function genValue() {
|
|
if (this.inputHour != null && this.inputMinute != null && (!this.useSeconds || this.inputSecond != null)) {
|
|
return (0, _pad2.default)(this.inputHour) + ':' + (0, _pad2.default)(this.inputMinute) + (this.useSeconds ? ':' + (0, _pad2.default)(this.inputSecond) : '');
|
|
}
|
|
return null;
|
|
},
|
|
emitValue: function emitValue() {
|
|
var value = this.genValue();
|
|
if (value !== null) this.$emit('input', value);
|
|
},
|
|
setPeriod: function setPeriod(period) {
|
|
this.period = period;
|
|
if (this.inputHour != null) {
|
|
var newHour = this.inputHour + (period === 'am' ? -12 : 12);
|
|
this.inputHour = this.firstAllowed('hour', newHour);
|
|
this.emitValue();
|
|
}
|
|
},
|
|
setInputData: function setInputData(value) {
|
|
if (value == null || value === '') {
|
|
this.inputHour = null;
|
|
this.inputMinute = null;
|
|
this.inputSecond = null;
|
|
} else if (value instanceof Date) {
|
|
this.inputHour = value.getHours();
|
|
this.inputMinute = value.getMinutes();
|
|
this.inputSecond = value.getSeconds();
|
|
} else {
|
|
var _ref9 = value.trim().toLowerCase().match(/^(\d+):(\d+)(:(\d+))?([ap]m)?$/) || new Array(6),
|
|
_ref10 = _slicedToArray(_ref9, 6),
|
|
hour = _ref10[1],
|
|
minute = _ref10[2],
|
|
second = _ref10[4],
|
|
period = _ref10[5];
|
|
|
|
this.inputHour = period ? this.convert12to24(parseInt(hour, 10), period) : parseInt(hour, 10);
|
|
this.inputMinute = parseInt(minute, 10);
|
|
this.inputSecond = parseInt(second || 0, 10);
|
|
}
|
|
this.period = this.inputHour == null || this.inputHour < 12 ? 'am' : 'pm';
|
|
},
|
|
convert24to12: function convert24to12(hour) {
|
|
return hour ? (hour - 1) % 12 + 1 : 12;
|
|
},
|
|
convert12to24: function convert12to24(hour, period) {
|
|
return hour % 12 + (period === 'pm' ? 12 : 0);
|
|
},
|
|
onInput: function onInput(value) {
|
|
if (this.selecting === selectingTimes.hour) {
|
|
this.inputHour = this.isAmPm ? this.convert12to24(value, this.period) : value;
|
|
} else if (this.selecting === selectingTimes.minute) {
|
|
this.inputMinute = value;
|
|
} else {
|
|
this.inputSecond = value;
|
|
}
|
|
this.emitValue();
|
|
},
|
|
onChange: function onChange(value) {
|
|
this.$emit('click:' + selectingNames[this.selecting], value);
|
|
var emitChange = this.selecting === (this.useSeconds ? selectingTimes.second : selectingTimes.minute);
|
|
if (this.selecting === selectingTimes.hour) {
|
|
this.selecting = selectingTimes.minute;
|
|
} else if (this.useSeconds && this.selecting === selectingTimes.minute) {
|
|
this.selecting = selectingTimes.second;
|
|
}
|
|
if (this.inputHour === this.lazyInputHour && this.inputMinute === this.lazyInputMinute && (!this.useSeconds || this.inputSecond === this.lazyInputSecond)) return;
|
|
var time = this.genValue();
|
|
if (time === null) return;
|
|
this.lazyInputHour = this.inputHour;
|
|
this.lazyInputMinute = this.inputMinute;
|
|
this.useSeconds && (this.lazyInputSecond = this.inputSecond);
|
|
emitChange && this.$emit('change', time);
|
|
},
|
|
firstAllowed: function firstAllowed(type, value) {
|
|
var allowedFn = type === 'hour' ? this.isAllowedHourCb : type === 'minute' ? this.isAllowedMinuteCb : this.isAllowedSecondCb;
|
|
if (!allowedFn) return value;
|
|
// TODO: clean up
|
|
var range = type === 'minute' ? range60 : type === 'second' ? range60 : this.isAmPm ? value < 12 ? rangeHours12am : rangeHours12pm : rangeHours24;
|
|
var first = range.find(function (v) {
|
|
return allowedFn((v + value) % range.length + range[0]);
|
|
});
|
|
return ((first || 0) + value) % range.length + range[0];
|
|
},
|
|
genClock: function genClock() {
|
|
return this.$createElement(_VTimePickerClock2.default, {
|
|
props: {
|
|
allowedValues: this.selecting === selectingTimes.hour ? this.isAllowedHourCb : this.selecting === selectingTimes.minute ? this.isAllowedMinuteCb : this.isAllowedSecondCb,
|
|
color: this.color,
|
|
dark: this.dark,
|
|
disabled: this.disabled,
|
|
double: this.selecting === selectingTimes.hour && !this.isAmPm,
|
|
format: this.selecting === selectingTimes.hour ? this.isAmPm ? this.convert24to12 : function (val) {
|
|
return val;
|
|
} : function (val) {
|
|
return (0, _pad2.default)(val, 2);
|
|
},
|
|
light: this.light,
|
|
max: this.selecting === selectingTimes.hour ? this.isAmPm && this.period === 'am' ? 11 : 23 : 59,
|
|
min: this.selecting === selectingTimes.hour && this.isAmPm && this.period === 'pm' ? 12 : 0,
|
|
readonly: this.readonly,
|
|
scrollable: this.scrollable,
|
|
size: Number(this.width) - (!this.fullWidth && this.landscape ? 80 : 20),
|
|
step: this.selecting === selectingTimes.hour ? 1 : 5,
|
|
value: this.selecting === selectingTimes.hour ? this.inputHour : this.selecting === selectingTimes.minute ? this.inputMinute : this.inputSecond
|
|
},
|
|
on: {
|
|
input: this.onInput,
|
|
change: this.onChange
|
|
},
|
|
ref: 'clock'
|
|
});
|
|
},
|
|
genPickerBody: function genPickerBody() {
|
|
return this.$createElement('div', {
|
|
staticClass: 'v-time-picker-clock__container',
|
|
key: this.selecting
|
|
}, [this.genClock()]);
|
|
},
|
|
genPickerTitle: function genPickerTitle() {
|
|
var _this4 = this;
|
|
|
|
return this.$createElement(_VTimePickerTitle2.default, {
|
|
props: {
|
|
ampm: this.isAmPm,
|
|
disabled: this.disabled,
|
|
hour: this.inputHour,
|
|
minute: this.inputMinute,
|
|
second: this.inputSecond,
|
|
period: this.period,
|
|
readonly: this.readonly,
|
|
useSeconds: this.useSeconds,
|
|
selecting: this.selecting
|
|
},
|
|
on: {
|
|
'update:selecting': function updateSelecting(value) {
|
|
return _this4.selecting = value;
|
|
},
|
|
'update:period': this.setPeriod
|
|
},
|
|
ref: 'title',
|
|
slot: 'title'
|
|
});
|
|
}
|
|
},
|
|
render: function render() {
|
|
return this.genPicker('v-picker--time');
|
|
}
|
|
});
|
|
//# sourceMappingURL=VTimePicker.js.map
|