fastlion-amis
Version:
一种MIS页面生成工具
1,367 lines (1,366 loc) • 66.9 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isBreakpoint = exports.isObject = exports.__uri = exports.padArr = exports.difference = exports.focusInputAndChooseInput = exports.getTextWidth = exports.getScrollParent = exports.promisify = exports.makeHorizontalDeeper = exports.hasAbility = exports.isDisabled = exports.visibilityFilter = exports.isUnfolded = exports.isVisible = exports.hasVisibleExpression = exports.makeColumnClassBuild = exports.immutableExtends = exports.isArrayChildrenModified = exports.isObjectShallowModified = exports.oldIsObjectShallowModified = exports.rmUndefined = exports.getChangedProp = exports.anyChanged = exports.noop = exports.hasOwnProperty = exports.deleteVariable = exports.setVariable = exports.getVariable = exports.findIndex = exports.guid = exports.syncDataFromSuper = exports.isSuperDataModified = exports.extendObject = exports.injectPropsToObject = exports.cloneObject = exports.createObject = exports.flatSuperData = exports.range = exports.getValueBitLength = exports.getChineseWordLengthInWord = exports.isMobile = exports.getLagerThanMaxZindex = exports.jsMemoryHeap = exports.standardValueText = exports.functionInOneFrame = exports.create2DArrayByMaxSum = exports.preventDefault = exports.isNil = exports.domUtils = void 0;
exports.getRange = exports.convertArrayValueToMoment = exports.JSONTraverse = exports.hashCode = exports.isClickOnInput = exports.normalizeNodePath = exports.removeHTMLTag = exports.detectPropValueChanged = exports.getPropValue = exports.getScrollbarWidth = exports.findObjectsWithKey = exports.keyToPath = exports.SkipOperation = exports.loadScript = exports.mapObject = exports.chainEvents = exports.chainFunctions = exports.object2formData = exports.qsparse = exports.qsstringify = exports.hasFile = exports.sortArray = exports.bulkBindFunctions = exports.autobind = exports.pickEventsProps = exports.string2regExp = exports.getLevelFromClassName = exports.getWidthRate = exports.camel = exports.lcFirst = exports.ucFirst = exports.getTreeParent = exports.getTreeAncestors = exports.getTreeDepth = exports.spliceTree = exports.flattenTree = exports.someTree = exports.everyTree = exports.filterTree = exports.getTree = exports.findTreeIndex = exports.findTreeList = exports.findTree = exports.eachTree = exports.mapTree = exports.uuidv4 = exports.uuid = exports.isEmpty = exports.omitControls = exports.until = void 0;
exports.numberFormatter = exports.AdjustToFiexdFloatNumber = exports.repeatCount = exports.handleActionCallback_10003 = exports.uniqueArr = void 0;
var tslib_1 = require("tslib");
var isPlainObject_1 = (0, tslib_1.__importDefault)(require("lodash/isPlainObject"));
var isEqual_1 = (0, tslib_1.__importDefault)(require("lodash/isEqual"));
var isNaN_1 = (0, tslib_1.__importDefault)(require("lodash/isNaN"));
var uniq_1 = (0, tslib_1.__importDefault)(require("lodash/uniq"));
var last_1 = (0, tslib_1.__importDefault)(require("lodash/last"));
var tpl_1 = require("./tpl");
var qs_1 = (0, tslib_1.__importDefault)(require("qs"));
var autobind_1 = require("./autobind");
var mobx_1 = require("mobx");
var tpl_builtin_1 = require("./tpl-builtin");
var msgsub_1 = (0, tslib_1.__importDefault)(require("../renderers/Lion/utils/msgsub"));
var lodash_1 = require("lodash");
var utils_1 = require("./utils");
var lodash_2 = require("lodash");
exports.domUtils = {
/**
* 一个元素是否匹配一个css选择器
* @param {Element} dom
* @param {string} selector
* @return {boolean}
*/
matches: function (dom, selector) {
if (dom instanceof Element && typeof selector === 'string' && selector) {
if (dom.webkitMatchesSelector) {
// 兼容android 4.4
return dom.webkitMatchesSelector(selector);
// }else if('matchesSelector' in dom){
// 兼容老版本浏览器
// return dom.matches(selector);
}
else if (dom.matches) {
return dom.matches(selector);
}
}
return false;
},
/**
* 获取父级可滚动的节点
* @param node
* @returns
*/
getScrollParent: function (node) {
if (node == null) {
return null;
}
// 兼容壳无法正确计算scrollHeight
if (node.scrollHeight > node.clientHeight && getComputedStyle(node).overflowY === 'scroll') {
return node;
}
else {
return exports.domUtils.getScrollParent(node.parentNode);
}
},
/**
* 向上冒泡遍历查找与能与css选择器匹配的元素(包含自身),
* @param {HTMLElement} target
* @param {string} selector
* @param {HTMLElement} stopNode
* @return {HTMLElement}
*/
closest: function (target, selector, stopNode) {
if ((target instanceof HTMLElement || target instanceof SVGElement)
&& typeof selector === 'string'
&& ((0, lodash_2.isUndefined)(stopNode) || stopNode instanceof HTMLElement || stopNode instanceof SVGElement)) {
var tar = target;
while (tar) {
if (exports.domUtils.matches(tar, selector)) {
return tar;
}
tar = tar.parentElement;
if (stopNode && stopNode.isSameNode(tar)) {
return null;
}
}
}
return null;
}
};
var isNil = function (value) { return value === null || value === undefined; };
exports.isNil = isNil;
function preventDefault(event) {
if (typeof event.cancelable !== 'boolean' || event.cancelable) {
event.preventDefault();
}
}
exports.preventDefault = preventDefault;
var create2DArrayByMaxSum = function (arr, maxSum) {
var result = []; // 存储二维数组
var currentRow = []; // 存储当前行的元素
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
var num = arr_1[_i];
// 如果当前行的和加上当前数字不超过最大和,则添加到当前行
if (currentRow.reduce(function (sum, val) { return sum + val; }, 0) + num <= maxSum) {
currentRow.push(num);
}
else {
// 否则,将当前行添加到结果数组中,并开始新的一行
result.push(currentRow);
currentRow = [num]; // 重置当前行为新的数字
}
}
// 不要忘记在最后添加当前行(如果它不是空的)
if (currentRow.length > 0) {
result.push(currentRow);
}
return result;
};
exports.create2DArrayByMaxSum = create2DArrayByMaxSum;
// 仅进行一帧的方法 类似settimeout(,0)只是这个视图上更流畅
var functionInOneFrame = function (Fn) {
var requestTimerId = requestAnimationFrame(function () {
Fn();
cancelAnimationFrame(requestTimerId);
});
};
exports.functionInOneFrame = functionInOneFrame;
/**
* 标准化展示文本 包含 前后缀 千分位 大写,金额大写 目前只识别到这三个
*/
function standardValueText(value, option) {
var _a;
if ((0, exports.isNil)(value))
return '';
var prefix = option.prefix, suffix = option.suffix, precision = option.precision, kilobitSeparator = option.kilobitSeparator, showUppercase = option.showUppercase, carry = option.carry;
// 小数保留
if (!Number.isNaN(+value)) {
if (!(0, exports.isNil)(precision) && typeof precision === 'number') {
if (carry) {
var val = ("" + value).toString().split('.');
value = val[0] + (val[1] ? ('.' + ((_a = val[1]) === null || _a === void 0 ? void 0 : _a.slice(0, precision))) : '');
}
else
value = (+value).toFixed(precision);
}
if (kilobitSeparator && !showUppercase) {
value = numberFormatter(value, precision);
}
if (showUppercase === 1) {
value = (0, utils_1.dealBigNumber)(+value);
}
else if (showUppercase === 2) {
value = (0, utils_1.dealBigMoney)(+value);
}
}
return (prefix ? prefix : '') + value + (suffix ? suffix : '');
}
exports.standardValueText = standardValueText;
window['_standardValueText'] = standardValueText;
// 计算一下宿主的js堆允许缓存大小
exports.jsMemoryHeap = (((_a = performance === null || performance === void 0 ? void 0 : performance.memory) === null || _a === void 0 ? void 0 : _a.jsHeapSizeLimit) / (1024 * 1024 * 1024)) || 1;
// 获取最大的index大1的index值
var getLagerThanMaxZindex = function () { return 1 + Math.max.apply(Math, (0, tslib_1.__spreadArray)([], Array.from(document.querySelectorAll('*')).map(function (_) { return Number(getComputedStyle(_).getPropertyValue('z-index')); }), true).filter(function (_) { return (!(0, isNaN_1.default)(_) && _ < 1000000000); })); };
exports.getLagerThanMaxZindex = getLagerThanMaxZindex;
var isMobileResult = /Harmony/.test(navigator.userAgent) ? !/PC/.test(navigator.userAgent) : /Android|ArkWeb|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
// 计算过一次就不用再计算了
function isMobile() {
return isMobileResult;
}
exports.isMobile = isMobile;
// 获取文本中中文个数
var getChineseWordLengthInWord = function (value) {
var _a;
if (value === void 0) { value = ''; }
return ((_a = (value + '').match(/[^\u0000-\u00ff]/g)) === null || _a === void 0 ? void 0 : _a.length) || 0;
};
exports.getChineseWordLengthInWord = getChineseWordLengthInWord;
// 获取字体的最大字节数-方便通用
var getValueBitLength = function (value) {
return value.replace(/[^\u0000-\u00ff]/g, 'aa').length;
};
exports.getValueBitLength = getValueBitLength;
function range(num, min, max) {
return Math.min(Math.max(num, min), max);
}
exports.range = range;
// 黑名单属性-禁止相关属性进行继承 分别是高级查询和基础查询的属性
var blackList = ['advancedFilterSub', 'advancedHeader', 'advancedFilter', 'filterOptionData', 'filterParam', 'perPage', 'page'];
// 展开__super
var flatSuperData = function (data) {
var curData = data;
var flatObj = {};
// 当当前data有__super的时候 展开
while (curData.__super) {
flatObj = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, curData), flatObj);
curData = curData.__super;
}
return flatObj;
};
exports.flatSuperData = flatSuperData;
// 方便取值的时候能够把上层的取到,但是获取的时候不会全部把所有的数据获取到。
function createObject(superProps, props, properties, copyBlackProPerty) {
var hasBlackListKey = Object.keys(superProps || {}).find(function (_) { return blackList.includes(_); });
if (superProps && (Object.isFrozen(superProps) || hasBlackListKey)) {
superProps = cloneObject(superProps);
}
// 初始化properties
var tempSearchQuery = {};
// 如果有黑名单数据 移除掉其中的黑名单数据-防止被继承
if (hasBlackListKey)
for (var _i = 0, blackList_1 = blackList; _i < blackList_1.length; _i++) {
var key = blackList_1[_i];
if (superProps === null || superProps === void 0 ? void 0 : superProps.hasOwnProperty(key)) {
//如果需要复制黑名单中的数据
if (copyBlackProPerty) {
// 复制黑名单数据
tempSearchQuery[key] = superProps[key];
}
delete superProps[key];
}
}
var obj = superProps
? Object.create(superProps, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, properties), { __super: {
value: superProps,
writable: false,
enumerable: false
} }))
: Object.create(Object.prototype, properties);
// 如果需要复制,直接加到同层数据中数据中
if (hasBlackListKey) {
Object.assign(obj, tempSearchQuery);
}
props &&
isObject(props) &&
Object.keys(props).forEach(function (key) { return (obj[key] = props[key]); });
return obj;
}
exports.createObject = createObject;
function cloneObject(target, persistOwnProps) {
if (persistOwnProps === void 0) { persistOwnProps = true; }
var obj = target && target.__super
? Object.create(target.__super, {
__super: {
value: target.__super,
writable: false,
enumerable: false
}
})
: Object.create(Object.prototype);
persistOwnProps &&
target &&
Object.keys(target).forEach(function (key) { return (obj[key] = target[key]); });
return obj;
}
exports.cloneObject = cloneObject;
/**
* 给目标对象添加其他属性,可读取但是不会被遍历。
* @param target
* @param props
*/
function injectPropsToObject(target, props) {
var sup = Object.create(target.__super || null);
Object.keys(props).forEach(function (key) { return (sup[key] = props[key]); });
var result = Object.create(sup);
Object.keys(target).forEach(function (key) { return (result[key] = target[key]); });
return result;
}
exports.injectPropsToObject = injectPropsToObject;
function extendObject(target, src, persistOwnProps) {
if (persistOwnProps === void 0) { persistOwnProps = true; }
var obj = cloneObject(target, persistOwnProps);
src && Object.keys(src).forEach(function (key) { return (obj[key] = src[key]); });
return obj;
}
exports.extendObject = extendObject;
function isSuperDataModified(data, prevData, store) {
var keys = [];
if (store && store.storeType === 'FormStore') {
keys = (0, uniq_1.default)(store.items
.map(function (item) { return ("" + item.name).replace(/\..*$/, ''); })
.concat(Object.keys(store.data)));
}
else {
keys = Object.keys(store.data);
}
if (Array.isArray(keys) && keys.length) {
return keys.some(function (key) { return data[key] !== prevData[key]; });
}
return false;
}
exports.isSuperDataModified = isSuperDataModified;
function syncDataFromSuper(data, superObject, prevSuperObject, store, force) {
var obj = (0, tslib_1.__assign)({}, data);
var keys = [];
// 如果是 form store,则从父级同步 formItem 种东西。
if (store && store.storeType === 'FormStore') {
keys = (0, uniq_1.default)(store.items
.map(function (item) { return ("" + item.name).replace(/\..*$/, ''); })
.concat(Object.keys(obj)));
}
else if (force) {
keys = Object.keys(obj);
}
if (superObject || prevSuperObject) {
keys.forEach(function (key) {
if (!key) {
return;
}
if (((superObject && typeof superObject[key] !== 'undefined') ||
(prevSuperObject && typeof prevSuperObject[key] !== 'undefined')) &&
((prevSuperObject && !superObject) ||
(!prevSuperObject && superObject) ||
prevSuperObject[key] !== superObject[key])) {
obj[key] = superObject[key];
}
});
}
return obj;
}
exports.syncDataFromSuper = syncDataFromSuper;
/**
* 生成 8 位随机数字。
*
* @return {string} 8位随机数字
*/
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + s4();
}
exports.guid = guid;
function findIndex(arr, detect) {
for (var i = 0, len = arr.length; i < len; i++) {
if (detect(arr[i], i)) {
return i;
}
}
return -1;
}
exports.findIndex = findIndex;
function getVariable(data, key, canAccessSuper) {
if (canAccessSuper === void 0) { canAccessSuper = true; }
if (!data || !key) {
return undefined;
}
else if (canAccessSuper ? key in data : data.hasOwnProperty(key)) {
return data[key];
}
return (0, exports.keyToPath)(key).reduce(function (obj, key) {
return obj &&
typeof obj === 'object' &&
(canAccessSuper ? key in obj : obj.hasOwnProperty(key))
? obj[key]
: undefined;
}, data);
}
exports.getVariable = getVariable;
function setVariable(data, key, value, convertKeyToPath) {
data = data || {};
if (key in data) {
data[key] = value;
return;
}
var parts = convertKeyToPath !== false ? (0, exports.keyToPath)(key) : [key];
var last = parts.pop();
while (parts.length) {
var key_1 = parts.shift();
if ((0, isPlainObject_1.default)(data[key_1])) {
data = data[key_1] = (0, tslib_1.__assign)({}, data[key_1]);
}
else if (Array.isArray(data[key_1])) {
data[key_1] = data[key_1].concat();
data = data[key_1];
}
else if (data[key_1]) {
// throw new Error(`目标路径不是纯对象,不能覆盖`);
// 强行转成对象
data[key_1] = {};
data = data[key_1];
}
else {
data[key_1] = {};
data = data[key_1];
}
}
data[last] = value;
}
exports.setVariable = setVariable;
function deleteVariable(data, key) {
if (!data) {
return;
}
else if (data.hasOwnProperty(key)) {
delete data[key];
return;
}
var parts = (0, exports.keyToPath)(key);
var last = parts.pop();
while (parts.length) {
var key_2 = parts.shift();
if ((0, isPlainObject_1.default)(data[key_2])) {
data = data[key_2] = (0, tslib_1.__assign)({}, data[key_2]);
}
else if (data[key_2]) {
throw new Error("\u76EE\u6807\u8DEF\u5F84\u4E0D\u662F\u7EAF\u5BF9\u8C61\uFF0C\u4E0D\u80FD\u4FEE\u6539");
}
else {
break;
}
}
if (data && data.hasOwnProperty && data.hasOwnProperty(last)) {
delete data[last];
}
}
exports.deleteVariable = deleteVariable;
function hasOwnProperty(data, key) {
var parts = (0, exports.keyToPath)(key);
while (parts.length) {
var key_3 = parts.shift();
if (!isObject(data) || !data.hasOwnProperty(key_3)) {
return false;
}
data = data[key_3];
}
return true;
}
exports.hasOwnProperty = hasOwnProperty;
function noop() { }
exports.noop = noop;
function anyChanged(attrs, from, to, strictMode) {
if (strictMode === void 0) { strictMode = true; }
return (typeof attrs === 'string' ? attrs.split(/\s*,\s*/) : attrs).some(function (key) { return (strictMode ? (from === null || from === void 0 ? void 0 : from[key]) !== (to === null || to === void 0 ? void 0 : to[key]) : (from === null || from === void 0 ? void 0 : from[key]) != (to === null || to === void 0 ? void 0 : to[key])); });
}
exports.anyChanged = anyChanged;
function getChangedProp(attrs, from, to, strictMode) {
if (strictMode === void 0) { strictMode = true; }
return (typeof attrs === 'string' ? attrs.split(/\s*,\s*/) : attrs).filter(function (key) { return (strictMode ? (from === null || from === void 0 ? void 0 : from[key]) !== (to === null || to === void 0 ? void 0 : to[key]) : (from === null || from === void 0 ? void 0 : from[key]) != (to === null || to === void 0 ? void 0 : to[key])); }).map(function (key) { return ({
key: key,
fromValue: from === null || from === void 0 ? void 0 : from[key],
toValue: to === null || to === void 0 ? void 0 : to[key],
}); });
}
exports.getChangedProp = getChangedProp;
function rmUndefined(obj) {
var newObj = {};
if (typeof obj !== 'object') {
return obj;
}
var keys = Object.keys(obj);
keys.forEach(function (key) {
if (obj[key] !== undefined) {
newObj[key] = obj[key];
}
});
return newObj;
}
exports.rmUndefined = rmUndefined;
// 原来的,在非嚴格模式下可以使用,因為isequal會嚴格比較,留下做个对照
function oldIsObjectShallowModified(prev, next, strictMode, ignoreUndefined) {
if (strictMode === void 0) { strictMode = true; }
if (ignoreUndefined === void 0) { ignoreUndefined = false; }
if (Array.isArray(prev) && Array.isArray(next)) {
return prev.length !== next.length
? true
: prev.some(function (prev, index) {
oldIsObjectShallowModified(prev, next[index], strictMode, ignoreUndefined);
});
}
else if (Number.isNaN(prev) && Number.isNaN(next)) {
return false;
}
else if (null == prev ||
null == next ||
!isObject(prev) ||
!isObject(next) ||
(0, mobx_1.isObservable)(prev) ||
(0, mobx_1.isObservable)(next)) {
return strictMode ? prev !== next : prev != next;
}
if (ignoreUndefined) {
prev = rmUndefined(prev);
next = rmUndefined(next);
}
var keys = Object.keys(prev);
var nextKeys = Object.keys(next);
if (keys.length !== nextKeys.length ||
keys.sort().join(',') !== nextKeys.sort().join(',')) {
return true;
}
for (var i = keys.length - 1; i >= 0; i--) {
var key = keys[i];
// 跳过对元数据的比较 也没啥用比较了
if (['item', 'itemsRaw', 'unSelectedItems', 'selectedItems'].includes(key))
continue;
if (oldIsObjectShallowModified(prev[key], next[key], strictMode, ignoreUndefined)) {
return true;
}
}
return false;
}
exports.oldIsObjectShallowModified = oldIsObjectShallowModified;
function isObjectShallowModified(prev, next, strictMode, ignoreUndefined) {
if (strictMode === void 0) { strictMode = true; }
if (ignoreUndefined === void 0) { ignoreUndefined = false; }
if (strictMode)
return !(0, isEqual_1.default)(prev, next);
return !(0, lodash_1.isEqualWith)(prev, next, function (objValue, otherValue) {
if (isObject(objValue) && isObject(otherValue)) {
return undefined;
}
return objValue == otherValue;
});
}
exports.isObjectShallowModified = isObjectShallowModified;
function isArrayChildrenModified(prev, next, strictMode) {
if (strictMode === void 0) { strictMode = true; }
if (!Array.isArray(prev) || !Array.isArray(next)) {
return strictMode ? prev !== next : prev != next;
}
if (prev.length !== next.length) {
return true;
}
for (var i = prev.length - 1; i >= 0; i--) {
if (strictMode ? prev[i] !== next[i] : prev[i] != next[i]) {
return true;
}
}
return false;
}
exports.isArrayChildrenModified = isArrayChildrenModified;
function immutableExtends(to, from, deep) {
if (deep === void 0) { deep = false; }
// 不是对象,不可以merge
if (!isObject(to) || !isObject(from)) {
return to;
}
var ret = to;
Object.keys(from).forEach(function (key) {
var origin = to[key];
var value = from[key];
// todo 支持深度merge
if (origin !== value) {
// 一旦有修改,就创建个新对象。
ret = ret !== to ? ret : (0, tslib_1.__assign)({}, to);
ret[key] = value;
}
});
return ret;
}
exports.immutableExtends = immutableExtends;
// 即将抛弃
function makeColumnClassBuild(steps, classNameTpl) {
if (classNameTpl === void 0) { classNameTpl = 'col-sm-$value'; }
var count = 12;
var step = Math.floor(count / steps);
return function (schema) {
if (schema.columnClassName &&
/\bcol-(?:xs|sm|md|lg)-(\d+)\b/.test(schema.columnClassName)) {
var flex = parseInt(RegExp.$1, 10);
count -= flex;
steps--;
step = Math.floor(count / steps);
return schema.columnClassName;
}
else if (schema.columnClassName) {
count -= step;
steps--;
return schema.columnClassName;
}
count -= step;
steps--;
return classNameTpl.replace('$value', '' + step);
};
}
exports.makeColumnClassBuild = makeColumnClassBuild;
function hasVisibleExpression(schema) {
return (schema === null || schema === void 0 ? void 0 : schema.visibleOn) || (schema === null || schema === void 0 ? void 0 : schema.hiddenOn);
}
exports.hasVisibleExpression = hasVisibleExpression;
function isVisible(schema, data) {
return !((schema === null || schema === void 0 ? void 0 : schema.hidden) ||
(schema === null || schema === void 0 ? void 0 : schema.visible) === false ||
((schema === null || schema === void 0 ? void 0 : schema.hiddenOn) && (0, tpl_1.evalExpression)(schema.hiddenOn, data) === true) ||
((schema === null || schema === void 0 ? void 0 : schema.visibleOn) && (0, tpl_1.evalExpression)(schema.visibleOn, data) === false));
}
exports.isVisible = isVisible;
function isUnfolded(node, config) {
var foldedField = config.foldedField, unfoldedField = config.unfoldedField;
unfoldedField = unfoldedField || 'unfolded';
foldedField = foldedField || 'folded';
var ret = false;
if (unfoldedField && typeof node[unfoldedField] !== 'undefined') {
ret = !!node[unfoldedField];
}
else if (foldedField && typeof node[foldedField] !== 'undefined') {
ret = !node[foldedField];
}
return ret;
}
exports.isUnfolded = isUnfolded;
/**
* 过滤掉被隐藏的数组元素
*/
function visibilityFilter(items, data) {
return items.filter(function (item) {
return isVisible(item, data);
});
}
exports.visibilityFilter = visibilityFilter;
function isDisabled(schema, data) {
return (schema.disabled ||
(schema.disabledOn && (0, tpl_1.evalExpression)(schema.disabledOn, data)));
}
exports.isDisabled = isDisabled;
function hasAbility(schema, ability, data, defaultValue) {
if (defaultValue === void 0) { defaultValue = true; }
return schema.hasOwnProperty(ability)
? schema[ability]
: schema.hasOwnProperty(ability + "On")
? (0, tpl_1.evalExpression)(schema[ability + "On"], data || schema)
: defaultValue;
}
exports.hasAbility = hasAbility;
function makeHorizontalDeeper(horizontal, count) {
if (count > 1 && /\bcol-(xs|sm|md|lg)-(\d+)\b/.test(horizontal.left)) {
var flex = parseInt(RegExp.$2, 10) * count;
return {
leftFixed: horizontal.leftFixed,
left: flex,
right: 12 - flex,
offset: flex
};
}
else if (count > 1 && typeof horizontal.left === 'number') {
var flex = horizontal.left * count;
return {
leftFixed: horizontal.leftFixed,
left: flex,
right: 12 - flex,
offset: flex
};
}
return horizontal;
}
exports.makeHorizontalDeeper = makeHorizontalDeeper;
function promisify(fn) {
var promisified = function () {
try {
var ret_1 = fn.apply(null, arguments);
if (ret_1 && ret_1.then) {
return ret_1;
}
else if (typeof ret_1 === 'function') {
// thunk support
return new Promise(function (resolve, reject) {
return ret_1(function (error, value) {
return error ? reject(error) : resolve(value);
});
});
}
return Promise.resolve(ret_1);
}
catch (e) {
return Promise.reject(e);
}
};
promisified.raw = fn;
return promisified;
}
exports.promisify = promisify;
function getScrollParent(node) {
if (node == null) {
return null;
}
var style = getComputedStyle(node);
if (!style) {
return null;
}
var text = style.getPropertyValue('overflow') +
style.getPropertyValue('overflow-x') +
style.getPropertyValue('overflow-y');
if (/auto|scroll/.test(text) || node.nodeName === 'BODY') {
return node;
}
return getScrollParent(node.parentNode);
}
exports.getScrollParent = getScrollParent;
// 获取文字再元素中的宽度
var getTextWidth = function (text, element) {
// 创建一个临时的span元素来计算文本的长度
var span = document.createElement('div');
span.style.fontSize = '13px';
span.style.visibility = 'hidden';
span.style.display = 'inline';
span.style.whiteSpace = 'nowrap'; /* 禁止换行 */
span.innerHTML = text;
if (element) {
// 获取计算后的样式
var computedStyle = window.getComputedStyle(element);
// 设置span元素的样式以匹配目标元素
span.style.fontFamily = computedStyle.fontFamily;
span.style.fontSize = computedStyle.fontSize;
span.style.fontWeight = computedStyle.fontWeight;
span.style.fontStyle = computedStyle.fontStyle;
span.style.letterSpacing = computedStyle.letterSpacing;
}
// 将span元素添加到文档中
document.body.appendChild(span);
// 获取文本的宽度
var width = span.offsetWidth;
// 移除临时创建的span元素
document.body.removeChild(span);
// 匀出半个字的像素冗余-对应表格自身的padding+border-防止出现超长字段
return Math.min(width + 2, 400);
};
exports.getTextWidth = getTextWidth;
var focusInputAndChooseInput = function (inputDom, chooseNumber) {
if (chooseNumber === void 0) { chooseNumber = false; }
if (!inputDom)
return;
var value = inputDom.value;
var firstDigitIndex = chooseNumber ? value.search(/\d/) : 0; // 找到第一个数字的位置
inputDom.focus();
// inputDom.scrollIntoView({ behavior: 'smooth', block: 'center' })
(0, exports.functionInOneFrame)(function () {
console.log(inputDom);
inputDom.setSelectionRange(firstDigitIndex === -1 ? 0 : firstDigitIndex, value.length);
});
};
exports.focusInputAndChooseInput = focusInputAndChooseInput;
/**
* Deep diff between two object, using lodash
* @param {Object} object Object compared
* @param {Object} base Object to compare with
* @return {Object} Return a new object who represent the diff
*/
function difference(object, base, keepProps) {
function changes(object, base) {
if (isObject(object) && isObject(base)) {
var keys = (0, uniq_1.default)(Object.keys(object).concat(Object.keys(base)));
var result_1 = {};
keys.forEach(function (key) {
var a = object[key];
var b = base[key];
if (keepProps && ~keepProps.indexOf(key)) {
result_1[key] = a;
}
if ((0, isEqual_1.default)(a, b)) {
return;
}
if (!object.hasOwnProperty(key)) {
result_1[key] = undefined;
}
else if (Array.isArray(a) && Array.isArray(b)) {
result_1[key] = a;
}
else {
result_1[key] = changes(a, b);
}
});
return result_1;
}
else {
return object;
}
}
return changes(object, base);
}
exports.difference = difference;
var padArr = function (arr, size) {
if (size === void 0) { size = 4; }
var ret = [];
var pool = arr.concat();
var from = 0;
while (pool.length) {
var host = ret[from] || (ret[from] = []);
if (host.length >= size) {
from += 1;
continue;
}
host.push(pool.shift());
}
return ret;
};
exports.padArr = padArr;
function __uri(id) {
return id;
}
exports.__uri = __uri;
function isObject(obj) {
var typename = typeof obj;
return (obj &&
typename !== 'string' &&
typename !== 'number' &&
typename !== 'boolean' &&
typename !== 'function' &&
!Array.isArray(obj));
}
exports.isObject = isObject;
// xs < 768px
// sm >= 768px
// md >= 992px
// lg >= 1200px
function isBreakpoint(str) {
if (typeof str !== 'string') {
return !!str;
}
var breaks = str.split(/\s*,\s*|\s+/);
if (window.matchMedia) {
return breaks.some(function (item) {
return item === '*' ||
(item === 'xs' &&
matchMedia("screen and (max-width: 767px)").matches) ||
(item === 'sm' &&
matchMedia("screen and (min-width: 768px) and (max-width: 991px)")
.matches) ||
(item === 'md' &&
matchMedia("screen and (min-width: 992px) and (max-width: 1199px)")
.matches) ||
(item === 'lg' && matchMedia("screen and (min-width: 1200px)").matches);
});
}
else {
var width_1 = window.innerWidth;
return breaks.some(function (item) {
return item === '*' ||
(item === 'xs' && width_1 < 768) ||
(item === 'sm' && width_1 >= 768 && width_1 < 992) ||
(item === 'md' && width_1 >= 992 && width_1 < 1200) ||
(item === 'lg' && width_1 >= 1200);
});
}
}
exports.isBreakpoint = isBreakpoint;
function until(fn, when, getCanceler, interval) {
var _this = this;
if (interval === void 0) { interval = 5000; }
var timer;
var stoped = false;
return new Promise(function (resolve, reject) {
var cancel = function () {
clearTimeout(timer);
stoped = true;
};
var check = function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var ret, e_1;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, fn()];
case 1:
ret = _a.sent();
if (stoped) {
return [2 /*return*/];
}
else if (when(ret)) {
stoped = true;
resolve(ret);
}
else {
timer = setTimeout(check, interval);
}
return [3 /*break*/, 3];
case 2:
e_1 = _a.sent();
reject(e_1);
return [3 /*break*/, 3];
case 3: return [2 /*return*/];
}
});
}); };
check();
getCanceler && getCanceler(cancel);
});
}
exports.until = until;
function omitControls(controls, omitItems) {
return controls.filter(function (control) { return !~omitItems.indexOf(control.name || control._name); });
}
exports.omitControls = omitControls;
function isEmpty(thing) {
if (isObject(thing) && Object.keys(thing).length) {
return false;
}
return true;
}
exports.isEmpty = isEmpty;
/**
* 基于时间戳的 uuid
*
* @returns uniqueId
*/
var uuid = function () {
return (+new Date()).toString(36);
};
exports.uuid = uuid;
// 参考 https://github.com/streamich/v4-uuid
var str = function () {
return ('00000000000000000' + (Math.random() * 0xffffffffffffffff).toString(16)).slice(-16);
};
var uuidv4 = function () {
var a = str();
var b = str();
return (a.slice(0, 8) +
'-' +
a.slice(8, 12) +
'-4' +
a.slice(13) +
'-a' +
b.slice(1, 4) +
'-' +
b.slice(4));
};
exports.uuidv4 = uuidv4;
/**
* 类似于 arr.map 方法,此方法主要针对类似下面示例的树形结构。
* [
* {
* children: []
* },
* // 其他成员
* ]
*
* @param {Tree} tree 树形数据
* @param {Function} iterator 处理函数,返回的数据会被替换成新的。
* @return {Tree} 返回处理过的 tree
*/
function mapTree(tree, iterator, level, depthFirst, paths) {
if (level === void 0) { level = 1; }
if (depthFirst === void 0) { depthFirst = false; }
if (paths === void 0) { paths = []; }
return tree === null || tree === void 0 ? void 0 : tree.map(function (item, index) {
if (depthFirst) {
var children = item.children
? mapTree(item.children, iterator, level + 1, depthFirst, paths.concat(item))
: undefined;
children && (item = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { children: children }));
item = iterator(item, index, level, paths) || (0, tslib_1.__assign)({}, item);
return item;
}
item = iterator(item, index, level, paths) || (0, tslib_1.__assign)({}, item);
if (item.children && item.children.splice) {
item.children = mapTree(item.children, iterator, level + 1, depthFirst, paths.concat(item));
}
return item;
});
}
exports.mapTree = mapTree;
/**
* 遍历树
* @param tree
* @param iterator
*/
function eachTree(tree, iterator, level) {
if (level === void 0) { level = 1; }
tree.map(function (item, index) {
iterator(item, index, level);
if (item.children) {
eachTree(item.children, iterator, level + 1);
}
});
}
exports.eachTree = eachTree;
/**
* 在树中查找节点。
* @param tree
* @param iterator
*/
function findTree(tree, iterator) {
var result = null;
everyTree(tree, function (item, key, level, paths) {
if (iterator(item, key, level, paths)) {
result = item;
return false;
}
return true;
});
return result;
}
exports.findTree = findTree;
/**
* 在树上查找节点,相同的逐一返回
* @param tree
* @param iterator
*/
function findTreeList(tree, iterator) {
var result = [];
everyTree(tree, function (item, key, level, paths) {
if (iterator(item, key, level, paths)) {
result.push(item);
}
if (item.children) {
findTreeList(item.children, iterator);
}
return true;
});
return result;
}
exports.findTreeList = findTreeList;
/**
* 在树中查找节点, 返回下标数组。
* @param tree
* @param iterator
*/
function findTreeIndex(tree, iterator) {
var idx = [];
findTree(tree, function (item, index, level, paths) {
if (iterator(item, index, level, paths)) {
idx = [index];
paths = paths.concat();
paths.unshift({
children: tree
});
for (var i = paths.length - 1; i > 0; i--) {
var prev = paths[i - 1];
var current = paths[i];
idx.unshift(prev.children.indexOf(current));
}
return true;
}
return false;
});
return idx.length ? idx : undefined;
}
exports.findTreeIndex = findTreeIndex;
function getTree(tree, idx) {
var indexes = Array.isArray(idx) ? idx.concat() : [idx];
var lastIndex = indexes.pop();
var list = tree;
for (var i = 0, len = indexes.length; i < len; i++) {
var index = indexes[i];
if (!list[index]) {
list = null;
break;
}
list = list[index].children;
}
return list ? list[lastIndex] : undefined;
}
exports.getTree = getTree;
/**
* 过滤树节点
*
* @param tree
* @param iterator
*/
function filterTree(tree, iterator, level, depthFirst) {
if (level === void 0) { level = 1; }
if (depthFirst === void 0) { depthFirst = false; }
if (depthFirst) {
return tree
.map(function (item) {
var children = item.children
? filterTree(item.children, iterator, level + 1, depthFirst)
: undefined;
if (Array.isArray(children) && Array.isArray(item.children)) {
item = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { children: children });
}
return item;
})
.filter(function (item, index) { return iterator(item, index, level); });
}
return tree
.filter(function (item, index) { return iterator(item, index, level); })
.map(function (item) {
if (item.children) {
var children = filterTree(item.children, iterator, level + 1, depthFirst);
if (Array.isArray(children) && Array.isArray(item.children)) {
item = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, item), { children: children });
}
}
return item;
});
}
exports.filterTree = filterTree;
/**
* 判断树中每个节点是否满足某个条件。
* @param tree
* @param iterator
*/
function everyTree(tree, iterator, level, paths, indexes) {
if (level === void 0) { level = 1; }
if (paths === void 0) { paths = []; }
if (indexes === void 0) { indexes = []; }
return tree.every(function (item, index) {
var value = iterator(item, index, level, paths, indexes);
if (value && item.children) {
return everyTree(item.children, iterator, level + 1, paths.concat(item), indexes.concat(index));
}
return value;
});
}
exports.everyTree = everyTree;
/**
* 判断树中是否有某些节点满足某个条件。
* @param tree
* @param iterator
*/
function someTree(tree, iterator) {
var result = false;
everyTree(tree, function (item, key, level, paths) {
if (iterator(item, key, level, paths)) {
result = true;
return false;
}
return true;
});
return result;
}
exports.someTree = someTree;
function flattenTree(tree, mapper) {
var flattened = [];
eachTree(tree, function (item, index) {
return flattened.push(mapper ? mapper(item, index) : item);
});
return flattened;
}
exports.flattenTree = flattenTree;
/**
* 操作树,遵循 imutable, 每次返回一个新的树。
* 类似数组的 splice 不同的地方这个方法不修改原始数据,
* 同时第二个参数不是下标,而是下标数组,分别代表每一层的下标。
*
* 至于如何获取下标数组,请查看 findTreeIndex
*
* @param tree
* @param idx
* @param deleteCount
* @param ...items
*/
function spliceTree(tree, idx, deleteCount) {
if (deleteCount === void 0) { deleteCount = 0; }
var items = [];
for (var _i = 3; _i < arguments.length; _i++) {
items[_i - 3] = arguments[_i];
}
var list = tree.concat();
if (typeof idx === 'number') {
list.splice.apply(list, (0, tslib_1.__spreadArray)([idx, deleteCount], items, false));
}
else if (Array.isArray(idx) && idx.length) {
idx = idx.concat();
var lastIdx = idx.pop();
var host = idx.reduce(function (list, idx) {
var child = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, list[idx]), { children: list[idx].children ? list[idx].children.concat() : [] });
list[idx] = child;
return child.children;
}, list);
host.splice.apply(host, (0, tslib_1.__spreadArray)([lastIdx, deleteCount], items, false));
}
return list;
}
exports.spliceTree = spliceTree;
/**
* 计算树的深度
* @param tree
*/
function getTreeDepth(tree) {
return Math.max.apply(Math, tree.map(function (item) {
if (Array.isArray(item.children)) {
return 1 + getTreeDepth(item.children);
}
return 1;
}));
}
exports.getTreeDepth = getTreeDepth;
/**
* 从树中获取某个值的所有祖先
* @param tree
* @param value
*/
function getTreeAncestors(tree, value, includeSelf) {
if (includeSelf === void 0) { includeSelf = false; }
var ancestors = null;
findTree(tree, function (item, index, level, paths) {
if (item === value) {
ancestors = paths;
if (includeSelf) {
ancestors.push(item);
}
return true;
}
return false;
});
return ancestors;
}
exports.getTreeAncestors = getTreeAncestors;
/**
* 从树中获取某个值的上级
* @param tree
* @param value
*/
function getTreeParent(tree, value) {
var ancestors = getTreeAncestors(tree, value);
return (ancestors === null || ancestors === void 0 ? void 0 : ancestors.length) ? ancestors[ancestors.length - 1] : null;
}
exports.getTreeParent = getTreeParent;
function ucFirst(str) {
return typeof str === 'string'
? str.substring(0, 1).toUpperCase() + str.substring(1)
: str;
}
exports.ucFirst = ucFirst;
function lcFirst(str) {
return str ? str.substring(0, 1).toLowerCase() + str.substring(1) : '';
}
exports.lcFirst = lcFirst;
function camel(str) {
return str
? str
.split(/[\s_\-]/)
.map(function (item, index) { return (index === 0 ? lcFirst(item) : ucFirst(item)); })
.join('')
: '';
}
exports.camel = camel;
function getWidthRate(value, strictMode) {
if (strictMode === void 0) { strictMode = false; }
if (typeof value === 'string' && /\bcol\-\w+\-(\d+)\b/.test(value)) {
return parseInt(RegExp.$1, 10);
}
return strictMode ? 0 : value || 0;
}
exports.getWidthRate = getWidthRate;
function getLevelFromClassName(value, defaultValue) {
if (defaultValue === void 0) { defaultValue = 'default'; }
if (/\b(?:btn|text)-(link|primary|secondary|info|success|warning|danger|light|dark)\b/.test(value)) {
return RegExp.$1;
}
return defaultValue;
}
exports.getLevelFromClassName = getLevelFromClassName;
function string2regExp(value, caseSensitive) {
if (caseSensitive === void 0) { caseSensitive = false; }
if (typeof value !== 'string') {
throw new TypeError('Expected a string');
}
return new RegExp(value.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d'), !caseSensitive ? 'i' : '');
}
exports.string2regExp = string2regExp;
function pickEventsProps(props) {
var ret = {};
props &&
Object.keys(props).forEach(function (key) { return /^on/.test(key) && (ret[key] = props[key]); });
return ret;
}
exports.pickEventsProps = pickEventsProps;
exports.autobind = autobind_1.autobindMethod;
var bulkBindFunctions = function (context, funNames) {
funNames.forEach(function (key) { return (context[key] = context[key].bind(context)); });
};
exports.bulkBindFunctions = bulkBindFunctions;
function sortArray(items, field, dir) {
return items.sort(function (a, b) {
var ret;
var a1 = a[field];
var b1 = b[field];
if (typeof a1 === 'number' && typeof b1 === 'number') {
ret = a1 < b1 ? -1 : a1 === b1 ? 0 : 1;
}
else {
ret = String(a1).localeCompare(String(b1));
}
return ret * dir;
});
}
exports.sortArray = sortArray;
// 只判断一层, 如果层级很深,form-data 也不好表达。
function hasFile(object) {
return Object.keys(object).some(function (key) {
var value = object[key];
return (value instanceof File ||
(Array.isArray(value) && value.length && value[0] instanceof File));
});
}
exports.hasFile = hasFile;
function qsstringify(data, options, keepEmptyArray) {
if (options === void 0) { options = {
arrayFormat: 'indices',
encodeValuesOnly: true
}; }
// qs会保留空字符串。fix: Combo模式的空数组,无法清空。改为存为空字符串;只转换一层
keepEmptyArray &&
Object.keys(data).forEach(function (key) {
Array.isArray(data[key]) && !data[key].length && (data[key] = '');
});
return qs_1.default.stringify(data, options);
}
exports.qsstringify = qsstringify;
function qsparse(data, options) {
if (options === void 0) { options = {
arrayFormat: 'indices',
encodeValuesOnly: true,
depth: 1000 // 默认是 5, 所以condition-builder只要来个条件组就会导致报错
}; }
return qs_1.default.parse(data, options);
}
exports.qsparse = qsparse;
function object2formData(data, options, fd) {
if (options === void 0) { options = {
arrayFormat: 'indices',
encodeValuesOnly: true
}; }
if (fd === void 0) { fd = new FormData(); }
var fileObjects = [];
var others = {};
Object.keys(data).forEach(function (key) {
var value = data[key];
if (value instanceof File) {
fileObjects.push([key, value]);
}
else if (Array.isArray(value) &&
value.length &&
value[0] instanceof File) {
value.forEach(function (value) { return fileObjects.push([key + "[]", value]); });
}
else {
others[key] = value;
}
});
// 因为 key 的格式太多了,偷个懒,用 qs 来处理吧。
qsstringify(others, options)
.split('&')
.forEach(function (item) {
var parts = item.split('=');
// form-data/multipart 是不需要 encode 值的。
parts[0] && fd.append(parts[0], decodeURIComponent(parts[1]));
});
// Note: File类型字段放在后面,可以支持第三方云存储鉴权
fileObjects.forEach(function (fileObject) {
return fd.append(fileObject[0], fileObject[1], fileObject[1].name);
});
return fd;
}
exports.object2formData = object2formData;
function chainFunctions() {
var fns = [];
for (var _i = 0; _i < arguments.length; _i++) {
fns[_i] = arguments[_i];
}
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return fns.reduce(function (ret, fn) {
return ret === false
? false
: typeof fn == 'function'
? fn.apply(void 0, args) : undefined;
}, undefined);
};
}
exports.chainFunctions = chainFunctions;
function chainEvents(props, schema) {
var ret = {};
Object.keys(props).forEach(function (key) {
if (key.substr(0, 2) === 'on' &&
typeof props[key] === 'function' &&
typeof schema[key] === 'function' &&
schema[key] !== props[key]) {
// 表单项里面的 onChange 很特殊,这个不要处理。
if (props.formStore && key === 'onChange') {
ret[key] = props[key];
}
else {