UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

330 lines (322 loc) 17.8 kB
/** * xdesign v1.0.6 * (c) 2023 xdesign * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _slicedToArray = require('@babel/runtime/helpers/slicedToArray'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var vue = require('vue'); var debounce = require('lodash/debounce'); var range = require('lodash/range'); var padStart = require('lodash/padStart'); var dayjs = require('dayjs'); var customParseFormat = require('../../_chunks/dep-10196b34.js'); var timePicker_panel_props = require('./props.js'); var _common_js_timePicker_const = require('../../_common/js/time-picker/const.js'); var _common_js_timePicker_utils = require('../../_common/js/time-picker/utils.js'); var configProvider_useConfig = require('../../config-provider/useConfig.js'); require('../../_chunks/dep-8d10b59f.js'); require('lodash/isBoolean'); require('../props.js'); require('lodash/isFunction'); require('lodash/cloneDeep'); require('lodash/isString'); require('../../config-provider/context.js'); require('lodash/mergeWith'); require('lodash/merge'); require('../../_common/js/global-config/default-config.js'); require('../../_common/js/global-config/locale/en_US.js'); require('lodash/isArray'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray); var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce); var range__default = /*#__PURE__*/_interopDefaultLegacy(range); var padStart__default = /*#__PURE__*/_interopDefaultLegacy(padStart); var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } dayjs__default["default"].extend(customParseFormat.customParseFormat); var timeArr = [_common_js_timePicker_const.EPickerCols.hour, _common_js_timePicker_const.EPickerCols.minute, _common_js_timePicker_const.EPickerCols.second, _common_js_timePicker_const.EPickerCols.milliSecond]; var panelOffset = { top: 15, bottom: 21 }; var SinglePanel = vue.defineComponent({ name: "XTimePickerPanelCol", props: _objectSpread(_objectSpread({}, timePicker_panel_props.panelColProps()), {}, { position: String, triggerScroll: Boolean, onChange: Function, resetTriggerScroll: Function, isShowPanel: Boolean }), setup: function setup(props) { var _toRefs = vue.toRefs(props), steps = _toRefs.steps, value = _toRefs.value, format = _toRefs.format, position = _toRefs.position, triggerScroll = _toRefs.triggerScroll; var _useConfig = configProvider_useConfig.useConfig("timePicker"), globalConfig = _useConfig.globalConfig; var _useConfig2 = configProvider_useConfig.useConfig(), classPrefix = _useConfig2.classPrefix; var cols = vue.ref([]); var bodyRef = vue.ref(); var maskRef = vue.ref(null); var colsRef = vue.reactive({ 0: null, 1: null, 2: null, 3: null, 4: null, 5: null }); var dayjsValue = vue.computed(function () { var isStepsSet = !!steps.value.filter(function (v) { return v > 1; }).length; if (value.value) return dayjs__default["default"](value.value, format.value); if (isStepsSet) return dayjs__default["default"]().hour(0).minute(0).second(0); return dayjs__default["default"](); }); var panelClassName = vue.computed(function () { return "".concat(classPrefix.value, "-time-picker__panel"); }); vue.watch(function () { return dayjsValue.value; }, function () { if (dayjsValue.value && value.value) updateTimeScrollPos(true); }); vue.watch(function () { return triggerScroll.value; }, function () { if (triggerScroll.value) { updateTimeScrollPos(true); } }); vue.onMounted(function () { var match = format.value.match(_common_js_timePicker_const.TIME_FORMAT); var _match = _slicedToArray__default["default"](match, 7), startCol = _match[1], hourCol = _match[2], minuteCol = _match[3], secondCol = _match[4], milliSecondCol = _match[5], endCol = _match[6]; var meridiem = _common_js_timePicker_const.EPickerCols.meridiem, hour = _common_js_timePicker_const.EPickerCols.hour, minute = _common_js_timePicker_const.EPickerCols.minute, second = _common_js_timePicker_const.EPickerCols.second, milliSecond = _common_js_timePicker_const.EPickerCols.milliSecond; var renderCol = [startCol && meridiem, hourCol && hour, minuteCol && minute, secondCol && second, milliSecondCol && milliSecond, endCol && meridiem].filter(function (v) { return !!v; }); cols.value = renderCol; }); var getItemHeight = function getItemHeight() { var _maskRef$value; var maskDom = (_maskRef$value = maskRef.value) === null || _maskRef$value === void 0 ? void 0 : _maskRef$value.querySelector("div"); if (!maskDom) { return { offsetHeight: 0, margin: 0 }; } return { offsetHeight: parseFloat(getComputedStyle(maskDom).height), margin: parseFloat(getComputedStyle(maskDom).marginTop) }; }; var timeItemCanUsed = function timeItemCanUsed(col, el) { var colIdx = timeArr.indexOf(col); if (colIdx !== -1) { var _props$disableTime; var params = [dayjsValue.value.hour(), dayjsValue.value.minute(), dayjsValue.value.second(), dayjsValue.value.millisecond()]; params[colIdx] = Number(el); return !((_props$disableTime = props.disableTime) !== null && _props$disableTime !== void 0 && (_props$disableTime = _props$disableTime.call.apply(_props$disableTime, [props].concat(params, [{ partial: position.value || "start" }]))) !== null && _props$disableTime !== void 0 && (_props$disableTime = _props$disableTime[col]) !== null && _props$disableTime !== void 0 && _props$disableTime.includes(Number(el))); } return true; }; var getColList = function getColList(col) { var count = 0; if (timeArr.includes(col)) { var colIdx = timeArr.indexOf(col); var colStep = steps.value[colIdx] || 1; if (col === _common_js_timePicker_const.EPickerCols.hour) count = _common_js_timePicker_const.TWELVE_HOUR_FORMAT.test(format.value) ? 11 : 23;else if (col === _common_js_timePicker_const.EPickerCols.milliSecond) count = 999;else count = 59; var colList = range__default["default"](0, count + 1, Number(colStep)).map(function (v) { return padStart__default["default"](String(v), 2, "0"); }) || []; return props.hideDisabledTime && !!props.disableTime ? colList.filter(function (t) { var _props$disableTime2; var params = [dayjsValue.value.hour(), dayjsValue.value.minute(), dayjsValue.value.second(), dayjsValue.value.millisecond()]; params[colIdx] = Number(t); return !((_props$disableTime2 = props.disableTime) !== null && _props$disableTime2 !== void 0 && (_props$disableTime2 = _props$disableTime2.call.apply(_props$disableTime2, [props].concat(params, [{ partial: position.value || "start" }]))) !== null && _props$disableTime2 !== void 0 && (_props$disableTime2 = _props$disableTime2[col]) !== null && _props$disableTime2 !== void 0 && _props$disableTime2.includes(Number(t))); }) : colList; } return _common_js_timePicker_const.MERIDIEM_LIST; }; var getScrollDistance = function getScrollDistance(col, time) { if (col === _common_js_timePicker_const.EPickerCols.hour && /[h]{1}/.test(format.value)) time %= 12; var itemIdx = getColList(col).indexOf(padStart__default["default"](String(time), 2, "0")); var _getItemHeight = getItemHeight(), offsetHeight = _getItemHeight.offsetHeight, margin = _getItemHeight.margin; var timeItemTotalHeight = offsetHeight + margin; var distance = Math.abs(Math.max(0, itemIdx) * timeItemTotalHeight); return distance; }; var handleScroll = function handleScroll(col, idx, e) { var _colsRef$idx, _props$onChange; var val; var formattedVal; if (!props.isShowPanel) return; var scrollTop = (((_colsRef$idx = colsRef[idx]) === null || _colsRef$idx === void 0 ? void 0 : _colsRef$idx.scrollTop) || 0) + panelOffset.top; var _getItemHeight2 = getItemHeight(), offsetHeight = _getItemHeight2.offsetHeight, margin = _getItemHeight2.margin; var timeItemTotalHeight = offsetHeight + margin; var colStep = Math.abs(Math.round(scrollTop / timeItemTotalHeight + 0.5)); var meridiem = _common_js_timePicker_const.MERIDIEM_LIST[Math.min(colStep - 1, 1)].toLowerCase(); if (Number.isNaN(colStep)) colStep = 1; if (timeArr.includes(col)) { var max = 59; if (col === _common_js_timePicker_const.EPickerCols.hour) max = /[h]{1}/.test(format.value) ? 11 : 23;else if (col === _common_js_timePicker_const.EPickerCols.milliSecond) max = 999; var colIdx = timeArr.indexOf(col); var availableArr = range__default["default"](0, max + 1, Number(steps.value[colIdx]) || 1); val = _common_js_timePicker_utils.closestLookup(availableArr, Number(getColList(col)[Math.min(colStep - 1, max + 1, availableArr.length - 1)]), Number(steps.value[colIdx]) || 1); if (Number.isNaN(val)) val = availableArr[availableArr.length - 1]; if (col === _common_js_timePicker_const.EPickerCols.hour && cols.value.includes(_common_js_timePicker_const.EPickerCols.meridiem) && dayjsValue.value.hour() >= 12) { val = Number(val) + 12; } } else val = meridiem; var distance = getScrollDistance(col, val); if (!dayjs__default["default"](dayjsValue.value).isValid() || value.value && !dayjs__default["default"](value.value, format.value, true).isValid()) return; if (timeArr.includes(col)) { var _dayjsValue$value$col, _dayjsValue$value; if (timeItemCanUsed(col, val)) formattedVal = (_dayjsValue$value$col = (_dayjsValue$value = dayjsValue.value)[col]) === null || _dayjsValue$value$col === void 0 ? void 0 : _dayjsValue$value$col.call(_dayjsValue$value, val).format(format.value);else formattedVal = dayjsValue.value.format(format.value); } else { var currentHour = dayjsValue.value.hour(); if (meridiem === _common_js_timePicker_const.AM && currentHour >= 12) { formattedVal = dayjsValue.value.hour(currentHour - 12).format(format.value); } else if (meridiem === _common_js_timePicker_const.PM && currentHour < 12) { formattedVal = dayjsValue.value.hour(currentHour + 12).format(format.value); } else { formattedVal = dayjsValue.value.format(format.value); } } if (formattedVal !== value.value) (_props$onChange = props.onChange) === null || _props$onChange === void 0 ? void 0 : _props$onChange.call(props, formattedVal, e); if (distance !== scrollTop) { var _scrollCtrl$scrollTo; var scrollCtrl = colsRef[cols.value.indexOf(col)]; if (!scrollCtrl || scrollCtrl.scrollTop === distance) return; (_scrollCtrl$scrollTo = scrollCtrl.scrollTo) === null || _scrollCtrl$scrollTo === void 0 ? void 0 : _scrollCtrl$scrollTo.call(scrollCtrl, { top: distance, behavior: "smooth" }); } }; var scrollToTime = function scrollToTime(col, time, idx) { var _scrollCtrl$scrollTo2; var behavior = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "auto"; var distance = getScrollDistance(col, time); var scrollCtrl = colsRef[idx]; if (!scrollCtrl || scrollCtrl.scrollTop === distance || !timeItemCanUsed(col, time)) return; (_scrollCtrl$scrollTo2 = scrollCtrl.scrollTo) === null || _scrollCtrl$scrollTo2 === void 0 ? void 0 : _scrollCtrl$scrollTo2.call(scrollCtrl, { top: distance, behavior: behavior }); }; var handleTimeItemClick = function handleTimeItemClick(col, el, idx, e) { if (!timeItemCanUsed(col, el)) return; if (timeArr.includes(col)) { if (col === _common_js_timePicker_const.EPickerCols.hour && dayjsValue.value.format("a") === _common_js_timePicker_const.PM && cols.value.includes(_common_js_timePicker_const.EPickerCols.meridiem)) { el = Number(el) + 12; } scrollToTime(col, el, idx, "smooth"); } else { var currentHour = dayjsValue.value.hour(); if (el === _common_js_timePicker_const.AM && currentHour >= 12) { props.onChange(dayjsValue.value.hour(currentHour - 12).format(format.value), e); } else if (el === _common_js_timePicker_const.PM && currentHour < 12) { props.onChange(dayjsValue.value.hour(currentHour + 12).format(format.value), e); } } }; var updateTimeScrollPos = function updateTimeScrollPos() { var isAutoScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var behavior = value.value && !isAutoScroll ? "smooth" : "auto"; var isStepsSet = !!steps.value.filter(function (v) { return v > 1; }).length; vue.nextTick(function () { cols.value.forEach(function (col, idx) { if (!isStepsSet || isStepsSet && value.value) { var _dayjsValue$value$col2, _dayjsValue$value2; scrollToTime(col, timeArr.includes(col) ? (_dayjsValue$value$col2 = (_dayjsValue$value2 = dayjsValue.value)[col]) === null || _dayjsValue$value$col2 === void 0 ? void 0 : _dayjsValue$value$col2.call(_dayjsValue$value2) : dayjsValue.value.format("a"), idx, behavior); } else { var _getColList; scrollToTime(col, (_getColList = getColList(col)) === null || _getColList === void 0 ? void 0 : _getColList[0], idx, behavior); } }); }); props.resetTriggerScroll(); }; var isCurrent = function isCurrent(col, colItem) { var _dayjsValue$value$col3, _dayjsValue$value3; var colVal; if (col === _common_js_timePicker_const.EPickerCols.meridiem) { var currentMeridiem = dayjsValue.value.format("a"); return currentMeridiem === colItem; } colVal = (_dayjsValue$value$col3 = (_dayjsValue$value3 = dayjsValue.value)[col]) === null || _dayjsValue$value$col3 === void 0 ? void 0 : _dayjsValue$value$col3.call(_dayjsValue$value3); if (col === _common_js_timePicker_const.EPickerCols.hour && /[h]{1}/.test(format.value)) { colVal %= 12; } return colVal === Number(colItem); }; return function () { var _cols$value$map, _cols$value, _cols$value$map2, _cols$value2; return vue.createVNode("div", { "class": "".concat(panelClassName.value, "-body"), "ref": bodyRef }, [vue.createVNode("div", { "class": "".concat(panelClassName.value, "-body-active-mask"), "ref": maskRef }, [(_cols$value$map = (_cols$value = cols.value).map) === null || _cols$value$map === void 0 ? void 0 : _cols$value$map.call(_cols$value, function (col, idx) { return vue.createVNode("div", { "key": "".concat(col, "_").concat(idx) }, null); })]), (_cols$value$map2 = (_cols$value2 = cols.value).map) === null || _cols$value$map2 === void 0 ? void 0 : _cols$value$map2.call(_cols$value2, function (col, idx) { return vue.createVNode("ul", { "key": "".concat(col, "_").concat(idx), "ref": function ref(el) { return colsRef[idx] = el; }, "class": "".concat(panelClassName.value, "-body-scroll"), "onScroll": debounce__default["default"](function (e) { return handleScroll(col, idx, e); }, 50) }, [getColList(col).map(function (el) { var _ref; return vue.createVNode("li", { "key": el, "class": ["".concat(panelClassName.value, "-body-scroll-item"), (_ref = {}, _defineProperty__default["default"](_ref, "".concat(classPrefix.value, "-is-disabled"), !timeItemCanUsed(col, el)), _defineProperty__default["default"](_ref, "".concat(classPrefix.value, "-is-current"), isCurrent(col, el)), _ref)], "onClick": function onClick(e) { return handleTimeItemClick(col, el, idx, e); } }, [timeArr.includes(col) ? _common_js_timePicker_const.TWELVE_HOUR_FORMAT.test(format.value) && col === _common_js_timePicker_const.EPickerCols.hour && el === "00" ? "12" : el : globalConfig.value[el === _common_js_timePicker_const.AM ? "anteMeridiem" : "postMeridiem"]]); })]); })]); }; } }); exports["default"] = SinglePanel; //# sourceMappingURL=single-panel.js.map