UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

1,367 lines (1,366 loc) 66.9 kB
"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 {