UNPKG

cron-hooks

Version:
705 lines (642 loc) 21.1 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } require('antd/es/dropdown/style'); var _Dropdown = _interopDefault(require('antd/es/dropdown')); require('antd/es/input/style'); var _Input = _interopDefault(require('antd/es/input')); require('antd/es/col/style'); var _Col = _interopDefault(require('antd/es/col')); require('antd/es/checkbox/style'); var _Checkbox = _interopDefault(require('antd/es/checkbox')); require('antd/es/tabs/style'); var _Tabs = _interopDefault(require('antd/es/tabs')); var React = require('react'); var React__default = _interopDefault(React); require('antd/es/row/style'); var _Row = _interopDefault(require('antd/es/row')); require('antd/es/input-number/style'); var _InputNumber = _interopDefault(require('antd/es/input-number')); require('antd/es/select/style'); var _Select = _interopDefault(require('antd/es/select')); require('antd/es/radio/style'); var _Radio = _interopDefault(require('antd/es/radio')); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; 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"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } /* * @Descripttion: * @Author: Bean * @Date: 2020-08-28 14:39:29 * @LastEditors: Bean * @LastEditTime: 2020-08-31 16:02:43 */ // CRON组件对应的默认数据 var second = { '1': '*', '2': '1-1', '3': '1/1', '4': '0' }; var minute = _objectSpread2({}, second); var hour = _objectSpread2({}, second); var day = _objectSpread2(_objectSpread2({}, second), {}, { '4': '1', '5': '?' }); var month = _objectSpread2(_objectSpread2({}, second), {}, { '4': '1' }); var week = { '1': '*', '4': 'MON', '5': '?', '6': 'SUN-FRI', '7': 'SUN#1', '8': 'MONL' }; var year = { '1': '*', '2': '1-1', '3': '1/1', '4': '1' }; var localeMap = { second: '秒', minute: '分', hour: '时', day: '日', month: '月', week: '周', year: '年' }; var defaultData = { second: second, minute: minute, hour: hour, day: day, month: month, week: week, year: year }; var RadioGroup = _Radio.Group; var CheckboxGroup = _Checkbox.Group; var Option = _Select.Option; var CronPane = function CronPane(props) { var _props$value = props.value, value = _props$value === void 0 ? '0' : _props$value, _props$type = props.type, type = _props$type === void 0 ? 'second' : _props$type, _props$options = props.options, options = _props$options === void 0 ? [] : _props$options, onChange = props.onChange, createChecks = props.createChecks; var defaultSecond = defaultData[type]; var defaultInputData = { cycles: ['1', '1'], ranges: ['1', '1'], checks: type === 'week' ? ['MON'] : [options[0]], weekRanges: ['SUN', 'FRI'], weekSeveral: ['SUN', '1'], weekl: 'MON' }; var radiochecked = '1'; if (value === '*') { radiochecked = '1'; } else if (value === '?') { radiochecked = '5'; } else if (value.indexOf('-') > -1) { var tempValue = value.split('-'); if (type === 'week') { radiochecked = '6'; defaultInputData.weekRanges = tempValue; } else { radiochecked = '2'; defaultInputData.cycles = tempValue; } } else if (value.indexOf('/') > -1) { radiochecked = '3'; defaultInputData.ranges = value.split('/'); } else if (value.indexOf('#') > -1) { radiochecked = '7'; defaultInputData.weekSeveral = value.split('#'); } else if (value.indexOf('L') > -1) { radiochecked = '8'; defaultInputData.weekl = value.slice(0, value.length - 1); } else { // 数组类型 radiochecked = '4'; defaultInputData.checks = value.split(','); } // radio更改,赋给默认的second对应数据,以重新渲染选中的radio var onRadioChange = function onRadioChange(e) { var secondRadio = e.target.value; onChange(type, defaultSecond[secondRadio]); }; // checkbox更改直接修改数据 var onCheckboxChange = function onCheckboxChange(checkedValues) { var data = Array.from(new Set(checkedValues)); onChange(type, data.join(',')); }; var inputChange = function inputChange(inputValue, option, index, connectLine) { var reportData = ''; if (radiochecked !== '8') { defaultInputData[option][index] = "".concat(inputValue); reportData = defaultInputData[option].join(connectLine); } else { // 周 -- 本月的最后一个星期, 数据是末尾加 L 标识的字符串 defaultInputData[option] = "".concat(inputValue, "L"); reportData = defaultInputData[option]; } onChange(type, reportData); }; var radioStyle = { display: 'block', height: '30px', lineHeight: '30px' }; return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(RadioGroup, { name: "radiogroup", value: radiochecked, onChange: onRadioChange }, /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "1" }, "\u6BCF\u4E00", localeMap[type]), (type === 'day' || type === 'week') && /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "5" }, "\u4E0D\u6307\u5B9A"), type === 'week' && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "6" }, /*#__PURE__*/React__default.createElement("span", { className: "right5" }, "\u6309\u5468\u671F \u5468\u671F\u4ECE \u661F\u671F"), /*#__PURE__*/React__default.createElement("span", { onClick: function onClick(e) { e.stopPropagation(); e.preventDefault(); } }, /*#__PURE__*/React__default.createElement(_Select, { disabled: radiochecked !== '6', value: defaultInputData.weekRanges[0] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'weekRanges', 0, '-'); }, style: { width: 100 } }, options.map(function (item) { return /*#__PURE__*/React__default.createElement(Option, { value: item, key: item }, item); }))), /*#__PURE__*/React__default.createElement("span", { className: "divider" }), /*#__PURE__*/React__default.createElement("span", { onClick: function onClick(e) { e.stopPropagation(); e.preventDefault(); } }, /*#__PURE__*/React__default.createElement(_Select, { disabled: radiochecked !== '6', value: defaultInputData.weekRanges[1] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'weekRanges', 1, '-'); }, style: { width: 100 } }, options.map(function (item) { return /*#__PURE__*/React__default.createElement(Option, { value: item, key: item }, item); })))), /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "7" }, /*#__PURE__*/React__default.createElement("span", { className: "right5" }, "\u672C\u6708\u7B2C"), /*#__PURE__*/React__default.createElement(_InputNumber, { disabled: radiochecked !== '7', min: 1, max: 5, value: defaultInputData.weekSeveral[1] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'weekSeveral', 1, '#'); }, style: { width: 100 } }), /*#__PURE__*/React__default.createElement("span", { className: "lr5" }, "\u5468 \u7684\u661F\u671F"), /*#__PURE__*/React__default.createElement("span", { onClick: function onClick(e) { e.stopPropagation(); e.preventDefault(); } }, /*#__PURE__*/React__default.createElement(_Select, { disabled: radiochecked !== '7', value: defaultInputData.weekSeveral[0] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'weekSeveral', 0, '#'); }, style: { width: 100 } }, options.map(function (item) { return /*#__PURE__*/React__default.createElement(Option, { value: item, key: item }, item); })))), /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "8" }, /*#__PURE__*/React__default.createElement("span", { className: "right5" }, "\u672C\u6708\u7684\u6700\u540E\u4E00\u4E2A\u661F\u671F"), /*#__PURE__*/React__default.createElement("span", { onClick: function onClick(e) { e.stopPropagation(); e.preventDefault(); } }, /*#__PURE__*/React__default.createElement(_Select, { disabled: radiochecked !== '8', value: defaultInputData.weekl || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'weekl'); }, style: { width: 100 } }, options.map(function (item) { return /*#__PURE__*/React__default.createElement(Option, { value: item, key: item }, item); }))))), type !== 'week' && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "2" }, /*#__PURE__*/React__default.createElement("span", { className: "right5" }, "\u6309\u5468\u671F \u5468\u671F\u4ECE"), /*#__PURE__*/React__default.createElement(_InputNumber, { disabled: radiochecked !== '2', min: 0, max: 59, value: defaultInputData.cycles[0] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'cycles', 0, '-'); }, style: { width: 100 } }), /*#__PURE__*/React__default.createElement("span", { className: "divider" }), /*#__PURE__*/React__default.createElement(_InputNumber, { disabled: radiochecked !== '2', min: 0, max: 59, value: defaultInputData.cycles[1] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'cycles', 1, '-'); }, style: { width: 100 } }), /*#__PURE__*/React__default.createElement("span", { className: "left5" }, localeMap[type])), /*#__PURE__*/React__default.createElement(_Radio, { style: radioStyle, value: "3" }, /*#__PURE__*/React__default.createElement("span", { className: "right5" }, "\u5468\u671F\u4ECE"), /*#__PURE__*/React__default.createElement(_InputNumber, { disabled: radiochecked !== '3', min: 0, max: 59, value: defaultInputData.ranges[0] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'ranges', 0, '/'); }, style: { width: 100 } }), /*#__PURE__*/React__default.createElement("span", { className: "lr5" }, localeMap[type], "\u5F00\u59CB\uFF0C \u6BCF"), /*#__PURE__*/React__default.createElement(_InputNumber, { disabled: radiochecked !== '3', min: 0, max: 59, value: defaultInputData.ranges[1] || '', size: "small", onChange: function onChange(val) { return inputChange(val, 'ranges', 1, '/'); }, style: { width: 100 } }), /*#__PURE__*/React__default.createElement("span", { className: "left5" }, localeMap[type], " \u6267\u884C\u4E00\u6B21"))), /*#__PURE__*/React__default.createElement(_Radio, { value: "4" }, /*#__PURE__*/React__default.createElement("span", { className: "right5" }, "\u6307\u5B9A"), /*#__PURE__*/React__default.createElement("br", null), /*#__PURE__*/React__default.createElement(CheckboxGroup, { defaultValue: defaultInputData.checks, style: { width: '100%' }, onChange: onCheckboxChange }, /*#__PURE__*/React__default.createElement(_Row, null, " ", createChecks(type, radiochecked, '4'), " "))))); }; var TabPane = _Tabs.TabPane; var options = { second: [], hour: [], day: [], month: [], week: ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'] }; // eslint-disable-next-line no-plusplus for (var i = 0; i < 60; i++) { options.second.push("".concat(i)); if (i < 24) options.hour.push("".concat(i)); if (i > 0 && i < 32) options.day.push("".concat(i)); if (i > 0 && i < 13) options.month.push("".concat(i)); } /** * @name: cron表达式组件 * @msg: * @param {type} * @return {type} */ var CronHooks = function CronHooks(props) { var _props$value = props.value, value = _props$value === void 0 ? '0 0 0 * * ?' : _props$value, _props$type = props.type, type = _props$type === void 0 ? ['second', 'minute', 'hour', 'day', 'month', 'week'] : _props$type, _props$style = props.style, style = _props$style === void 0 ? { width: 540 } : _props$style, onChange = props.onChange; var cronArr = value.split(' '); var _useState = React.useState(type[0]), _useState2 = _slicedToArray(_useState, 2), activeKey = _useState2[0], setActiveKey = _useState2[1]; var _useState3 = React.useState({ second: cronArr[0] || '0', minute: cronArr[1] || '0', hour: cronArr[2] || '0', day: cronArr[3] || '*', month: cronArr[4] || '*', week: cronArr[5] || '?', year: cronArr[6] }), _useState4 = _slicedToArray(_useState3, 2), cronData = _useState4[0], setCronData = _useState4[1]; // type类型做映射,确定TabPane是否显示 var typeMap = {}; type.map(function (tp) { typeMap[tp] = true; }); // 获取最后的 cron表达式,在表单中使用时,通过onChange上报 var getValue = function getValue(data) { var second = data.second, minute = data.minute, hour = data.hour, day = data.day, month = data.month, week = data.week, year = data.year; var tempArr = [second, minute, hour, day, month, week, year]; var val = tempArr.filter(function (cron) { return !!cron; }).join(' '); return val; }; var tabsChange = function tabsChange(active) { setActiveKey(active); }; var createChecks = function createChecks(option, radiochecked, radio) { var flag = option === 'minute' ? 'second' : option; var optionList = options[flag] || []; return optionList.map(function (index) { return /*#__PURE__*/React__default.createElement(_Col, { key: index, span: optionList.length === 7 ? 3 : 4, style: { marginRight: optionList.length === 7 ? 5 : 0 } }, /*#__PURE__*/React__default.createElement(_Checkbox, { disabled: radiochecked !== radio, value: index.toString() }, index)); }); }; // 表达式监听事件 var expressionChange = function expressionChange(option, val) { var tempCron = _objectSpread2({}, cronData); tempCron[option] = val; setCronData(_objectSpread2(_objectSpread2({}, cronData), {}, _defineProperty({}, option, val))); if (onChange) { var inputValue = getValue(tempCron); onChange(inputValue); } }; return /*#__PURE__*/React__default.createElement("div", { className: "cron-wrap", style: style }, /*#__PURE__*/React__default.createElement(_Tabs, { activeKey: activeKey, onChange: tabsChange }, typeMap.second && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u79D2", key: "second" }, /*#__PURE__*/React__default.createElement(CronPane, { type: "second", value: cronData.second, options: options.second, onChange: expressionChange, createChecks: createChecks })), typeMap.minute && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u5206", key: "minute" }, /*#__PURE__*/React__default.createElement(CronPane, { type: "minute", value: cronData.minute, options: options.second, onChange: expressionChange, createChecks: createChecks })), typeMap.hour && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u65F6", key: "hour" }, /*#__PURE__*/React__default.createElement(CronPane, { type: "hour", value: cronData.hour, options: options.hour, onChange: expressionChange, createChecks: createChecks })), typeMap.day && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u65E5", key: "day" }, /*#__PURE__*/React__default.createElement(CronPane, { type: "day", value: cronData.day, options: options.day, onChange: expressionChange, createChecks: createChecks })), typeMap.month && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u6708", key: "month" }, /*#__PURE__*/React__default.createElement(CronPane, { type: "month", value: cronData.month, options: options.month, onChange: expressionChange, createChecks: createChecks })), typeMap.week && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u5468", key: "week" }, /*#__PURE__*/React__default.createElement(CronPane, { type: "week", value: cronData.week, options: options.week, onChange: expressionChange, createChecks: createChecks })), typeMap.year && /*#__PURE__*/React__default.createElement(TabPane, { tab: "\u5E74", key: "year" }, "year"))); }; var InputCron = function InputCron(props) { var value = props.value, style = props.style, lang = props.lang, type = props.type, width = props.width, onChange = props.onChange; var _useState5 = React.useState({ value: value || '', dateVisible: false }), _useState6 = _slicedToArray(_useState5, 2), state = _useState6[0], setState = _useState6[1]; var handleChange = function handleChange(val) { setState(_objectSpread2(_objectSpread2({}, state), {}, { value: val })); if (onChange) { onChange(val); } }; return /*#__PURE__*/React__default.createElement(_Dropdown, { trigger: ['click'], placement: "bottomLeft", visible: state.dateVisible, onVisibleChange: function onVisibleChange(visible) { return setState(_objectSpread2(_objectSpread2({}, state), {}, { dateVisible: visible })); }, overlay: /*#__PURE__*/React__default.createElement(CronHooks, { onChange: handleChange, value: value, style: style, type: type }) }, /*#__PURE__*/React__default.createElement(_Input, { readOnly: true, value: value, style: { width: width } })); }; exports.InputCron = InputCron; exports.default = CronHooks;