UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

185 lines (184 loc) 6.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkValueWithDayjs = exports.getValueWithDayjs = exports.checkRangeDate = exports.checkDate = exports.renderNode = exports.invoke = exports.promiseCall = exports.bindCtx = exports.makeChain = exports.prevent = exports.noop = void 0; var tslib_1 = require("tslib"); var object_1 = require("./object"); var date_1 = tslib_1.__importDefault(require("./date")); /** * 一个空方法,返回入参本身或空对象 */ var noop = function () { }; exports.noop = noop; /** * 一个空方法,返回 false */ var prevent = function () { return false; }; exports.prevent = prevent; /** * 将 N 个方法合并为一个链式调用的方法 * @returns 合并后的方法 * @see https://github.com/react-component/util/ * * @example * func.makeChain(this.handleChange, this.props.onChange); */ function makeChain() { var fns = []; for (var _i = 0; _i < arguments.length; _i++) { fns[_i] = arguments[_i]; } if (fns.length === 1) { return fns[0]; } return function chainedFunction() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } for (var i = 0, j = fns.length; i < j; i++) { var fn = fns[i]; if (fn && fn.apply) { fn.apply(this, args); } } }; } exports.makeChain = makeChain; /** * 批量改变方法的上下文 * 此方法在 react 组件中很有用,在 constructor 中批量将组件上的方法执行上下文绑定到组件本身 * 注意:用 bind 改变函数运行的上下文只会生效一次 * @param ctx - 方法挂载的对象以及执行的上下文 * @param fns - 方法名列表 * * @example * func.bindCtx(this, ['handleClick', 'handleChange']); */ function bindCtx(ctx, fns, ns) { if (typeof fns === 'string') { fns = [fns]; } // 方法的挂载空间,如果不传,默认与ctx相同 ns = ns || ctx; fns.forEach(function (fnName) { // @ts-expect-error 这里不要添加空方法判断,由调用者保证正确性,否则出了问题无法排查 ns[fnName] = ns[fnName].bind(ctx); }); } exports.bindCtx = bindCtx; /** * 用于执行回调方法后的逻辑 * @param ret - 回调方法执行结果 * @param success - 执行结果返回非 false 的回调 * @param failure - [failure=noop] 执行结果返回 false 的回调 */ function promiseCall(ret, success, failure) { if (failure === void 0) { failure = exports.noop; } if ((0, object_1.isPromise)(ret)) { return ret .then(function (result) { success(result); return result; }) .catch(function (e) { failure(e); // throw e; }); } return ret !== false ? success(ret) : failure(ret); } exports.promiseCall = promiseCall; /** * 方法调用,如果 obj 对象中存在名为 method 的方法则调用该方法 * @param target - 目标对象 * @param method - 方法名 * @param args - 函数参数列表 * @returns 函数返回值 如果不存在返回 undefined */ function invoke(target, method, args) { var func = target && method in target ? target[method] : undefined; return func && func.apply(void 0, tslib_1.__spreadArray([], tslib_1.__read((args || [])), false)); } exports.invoke = invoke; function renderNode(render, defaultRender, renderProps) { if (renderProps === void 0) { renderProps = []; } var r = render !== undefined ? render : defaultRender; if (renderProps && !Array.isArray(renderProps)) { renderProps = [renderProps]; } return typeof r === 'function' ? r.apply(void 0, tslib_1.__spreadArray([], tslib_1.__read(renderProps), false)) : r; } exports.renderNode = renderNode; /** * 日期检验:无效值返回 null */ function checkDate(value, format) { /** * 因为 datejs(undefined) 表示当前时间 * 但是这里期望的是一个空值,即用户不输入值的时候显示为空 */ if (value === undefined) { value = null; } var date = format ? (0, date_1.default)(value, format) : (0, date_1.default)(value); return date.isValid() ? date : null; } exports.checkDate = checkDate; /** * Range 日期检验 * @param value - 日期值 * @param inputType - 输入框类型:开始时间输入框/结束时间输入框 * @param disabled - 是否禁用 * @param strictly - 是否严格校验:严格模式下不允许开始时间大于结束时间,在显示确认按键的,用户输入过程可不严格校验 */ function checkRangeDate(value, inputType, disabled, strictly, format) { if (strictly === void 0) { strictly = true; } var _a = tslib_1.__read(Array.isArray(value) ? [0, 1].map(function (i) { return checkDate(value[i], format); }) : [null, null], 2), begin = _a[0], end = _a[1]; var _b = tslib_1.__read(Array.isArray(disabled) ? disabled : [disabled, disabled], 2), disabledBegin = _b[0], disabledEnd = _b[1]; /** * 需要清除其中一个时间,优先清除结束时间,下面情况清除开始时间: * 1. 结束时间被 disabled 而开始时间没有被 disabled * 2. 开始时间和结束时间都没被 disabled 且当前正在输入是结束时间 */ if (strictly && begin && end && begin.isAfter(end)) { if ((!disabledBegin && disabledEnd) || // 本来是 (!disabledBegin && !disabledBegin && inputType === DATE_INPUT_TYPE.END) (!disabledBegin && !disabledBegin && inputType === 1)) { return [null, end]; } return [begin, null]; } return [begin, end]; } exports.checkRangeDate = checkRangeDate; /** * 字符型日期转为dayjs类型 */ function getValueWithDayjs(val, format) { var date; if (Array.isArray(val)) { date = val.map(function (v) { return checkValueWithDayjs(v, format); }); } else { date = checkValueWithDayjs(val, format); } return date; } exports.getValueWithDayjs = getValueWithDayjs; /** * 将字符型转为dayjs类型,dayjs(x)解析无效时使用dayjs(x,format)再次解析。兼容YYYY-[Q]Q 季度类字符串 */ function checkValueWithDayjs(val, format) { var date = checkDate(val); if (!date) { date = checkDate(val, format); } return date; } exports.checkValueWithDayjs = checkValueWithDayjs;