UNPKG

5.79 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4exports.prevent = exports.noop = undefined;
5exports.makeChain = makeChain;
6exports.bindCtx = bindCtx;
7exports.promiseCall = promiseCall;
8exports.invoke = invoke;
9exports.renderNode = renderNode;
10exports.checkDate = checkDate;
11exports.checkRangeDate = checkRangeDate;
12
13var _object = require('./object');
14
15var _date = require('./date');
16
17var _date2 = _interopRequireDefault(_date);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21/**
22 * 一个空方法,返回入参本身或空对象
23 */
24var noop = exports.noop = function noop() {};
25
26/**
27 * 一个空方法,返回false
28 */
29var prevent = exports.prevent = function prevent() {
30 return false;
31};
32
33/**
34 * 将N个方法合并为一个链式调用的方法
35 * @return {Function} 合并后的方法
36 * 参考 https://github.com/react-component/util/
37 *
38 * @example
39 * func.makeChain(this.handleChange, this.props.onChange);
40 */
41function makeChain() {
42 for (var _len = arguments.length, fns = Array(_len), _key = 0; _key < _len; _key++) {
43 fns[_key] = arguments[_key];
44 }
45
46 if (fns.length === 1) {
47 return fns[0];
48 }
49
50 return function chainedFunction() {
51 for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
52 args[_key2] = arguments[_key2];
53 }
54
55 for (var i = 0, j = fns.length; i < j; i++) {
56 if (fns[i] && fns[i].apply) {
57 fns[i].apply(this, args);
58 }
59 }
60 };
61}
62
63/**
64 * 批量改变方法的上下文
65 * 此方法在react组件中很有用,在constructor中批量将组件上的方法执行上下文绑定到组件本身
66 * 注意:用bind改变函数运行的上下文只会生效一次
67 * @param {Object} ctx 方法挂载的对象以及执行的上下文
68 * @param {Array<String>} fns 方法名列表
69 *
70 * @example
71 * func.bindCtx(this, ['handleClick', 'handleChange']);
72 */
73function bindCtx(ctx, fns, ns) {
74 if (typeof fns === 'string') {
75 fns = [fns];
76 }
77
78 // 方法的挂载空间,如果不传,默认与ctx相同
79 ns = ns || ctx;
80
81 fns.forEach(function (fnName) {
82 // 这里不要添加空方法判断,由调用者保证正确性,否则出了问题无法排查
83 ns[fnName] = ns[fnName].bind(ctx);
84 });
85}
86
87/**
88 * 用于执行回调方法后的逻辑
89 * @param {*} ret 回调方法执行结果
90 * @param {Function} success 执行结果返回非false的回调
91 * @param {Function} [failure=noop] 执行结果返回false的回调
92 */
93function promiseCall(ret, success) {
94 var failure = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop;
95
96 if ((0, _object.isPromise)(ret)) {
97 return ret.then(function (result) {
98 success(result);
99 return result;
100 }).catch(function (e) {
101 failure(e);
102 // throw e;
103 });
104 }
105
106 return ret !== false ? success(ret) : failure(ret);
107}
108
109/**
110 * 方法调用,如果obj对象中存在名为method的方法则调用该方法
111 * @param {Object} target 目标对象
112 * @param {string} method 方法名
113 * @param {Array} args 函数参数列表
114 * @returns {*} 函数返回值 如果不存在返回undefined
115 */
116function invoke(target, method, args) {
117 var func = target && method in target ? target[method] : undefined;
118 return func && func.apply(undefined, args);
119}
120
121function renderNode(render, defaultRender) {
122 var renderProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
123
124 var r = render !== undefined ? render : defaultRender;
125
126 if (renderProps && !Array.isArray(renderProps)) {
127 renderProps = [renderProps];
128 }
129 return typeof r === 'function' ? r.apply(undefined, renderProps) : r;
130}
131
132/**
133 * 日期检验:无效值返回 null
134 * @param {dayjs.ConfigType} value
135 * @returns {Dayjs | null}
136 */
137function checkDate(value) {
138 /**
139 * 因为 datejs(undefined) 表示当前时间
140 * 但是这里期望的是一个空值,即用户不输入值的时候显示为空
141 */
142 if (value === undefined) {
143 value = null;
144 }
145
146 value = (0, _date2.default)(value);
147 return value.isValid() ? value : null;
148}
149
150/**
151 * Range 日期检验
152 * @param {dayjs.ConfigType[]} value 日期值
153 * @param {number} inputType 输入框类型:开始时间输入框/结束时间输入框
154 * @param {boolean} disabled 是否禁用
155 * @param {boolean} strictly 是否严格校验:严格模式下不允许开始时间大于结束时间,在显示确认按键的,用户输入过程可不严格校验
156 * @returns {Dayjs[] | null[]}
157 */
158function checkRangeDate(value, inputType, disabled) {
159 var strictly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
160
161 var _ref = Array.isArray(value) ? [0, 1].map(function (i) {
162 return checkDate(value[i]);
163 }) : [null, null],
164 begin = _ref[0],
165 end = _ref[1];
166
167 var _ref2 = Array.isArray(disabled) ? disabled : [disabled, disabled],
168 disabledBegin = _ref2[0],
169 disabledEnd = _ref2[1];
170
171 /**
172 * 需要清除其中一个时间,优先清除结束时间,下面情况清除开始时间:
173 * 1. 结束时间被 disabled 而开始时间没有被 disabled
174 * 2. 开始时间和结束时间都没被 disabled 且当前正在输入是结束时间
175 */
176
177
178 if (strictly && begin && end && begin.isAfter(end)) {
179 if (!disabledBegin && disabledEnd ||
180 // 本来是 (!disabledBegin && !disabledBegin && inputType === DATE_INPUT_TYPE.END)
181 !disabledBegin && !disabledBegin && inputType === 1) {
182 return [null, end];
183 }
184
185 return [begin, null];
186 }
187
188 return [begin, end];
189}
\No newline at end of file