diff --git a/demo/js/case/pager/demo.direction_pager.js b/demo/js/case/pager/demo.direction_pager.js index 62e6a0b26..d554d50df 100644 --- a/demo/js/case/pager/demo.direction_pager.js +++ b/demo/js/case/pager/demo.direction_pager.js @@ -3,14 +3,46 @@ Demo.Func = BI.inherit(BI.Widget, { baseCls: "demo-func" }, + mounted: function () { + this.pager.populate(); + }, + render: function () { + var self = this; BI.createWidget({ type: "bi.vertical", hgap: 200, vgap: 50, element: this, items: [{ - type: "bi.direction_pager" + type: "bi.direction_pager", + ref: function (_ref) { + self.pager = _ref; + }, + horizontal: { + pages: false, // 总页数 + curr: 1, // 初始化当前页, pages为数字时可用 + + hasPrev: function (v) { + return v > 1; + }, + hasNext: function () { + return true; + }, + firstPage: 1 + }, + vertical: { + pages: false, // 总页数 + curr: 1, // 初始化当前页, pages为数字时可用 + + hasPrev: function (v) { + return v > 1; + }, + hasNext: function () { + return true; + }, + firstPage: 1 + } }] }); } diff --git a/demo/js/widget/table/demo.page_table.js b/demo/js/widget/table/demo.page_table.js index def67aaa7..245f42502 100644 --- a/demo/js/widget/table/demo.page_table.js +++ b/demo/js/widget/table/demo.page_table.js @@ -190,6 +190,7 @@ Demo.Func = BI.inherit(BI.Widget, { crossHeader: crossHeader, crossItems: crossItems }); + table1.populate(); // table1.populate(items, header, crossItems, crossHeader); BI.createWidget({ type: "bi.absolute", diff --git a/dist/base.js b/dist/base.js index 486d45c07..6f8fc3896 100644 --- a/dist/base.js +++ b/dist/base.js @@ -904,6 +904,7 @@ BI.BasicButton = BI.inherit(BI.Single, { if (o.action) { BI.Actions.runAction(o.action, o); } + BI.Actions.runGlobalAction(o); } }, diff --git a/dist/bundle.js b/dist/bundle.js index 5f80706c9..f71c6d71f 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -9599,7 +9599,7 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { })( window );/** * @license * Lodash (Custom Build) - * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference"` + * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference,defaultsDeep"` * Copyright JS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 @@ -10444,6 +10444,20 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return result; } + /** + * Gets the value at `key`, unless `key` is "__proto__". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + return key == '__proto__' + ? undefined + : object[key]; + } + /** * Converts `set` to an array of its values. * @@ -11459,6 +11473,22 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return result; } + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) @@ -12487,6 +12517,116 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { }; } + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + /** * The base implementation of `_.orderBy` without param guards. * @@ -13706,6 +13846,30 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return setWrapToString(setter(result, newData), func, bitmask); } + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. @@ -17781,6 +17945,34 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { : (reIsBadHex.test(value) ? NAN : +value); } + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. @@ -17934,6 +18126,30 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return object; }); + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + /** * This method is like `_.find` except that it returns the key of the first * element `predicate` returns truthy for instead of the element itself. @@ -18228,6 +18444,41 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. @@ -18997,6 +19248,7 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { lodash.create = create; lodash.debounce = debounce; lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; lodash.defer = defer; lodash.delay = delay; lodash.difference = difference; @@ -28472,7 +28724,6 @@ BI.extend(BI.DOM, { }, getImage: function (param, fillStyle, backgroundColor) { - var image = new Image(); var canvas = document.createElement("canvas"); $("body").append(canvas); var w = BI.DOM.getTextSizeWidth(param, 14) + 6; @@ -28490,8 +28741,8 @@ BI.extend(BI.DOM, { width: w, height: 24, src: canvas.toDataURL("image/png"), - style: "background-color: " + backColor + ";vertical-align: sub; margin: 0 3px;", - alt: param + style: "background-color: " + backColor + ";vertical-align: middle; margin: 0 3px;", + param: param }; } });(function () { @@ -28549,7 +28800,14 @@ BI.extend(BI.DOM, { }; var actions = {}; + var globalAction = []; BI.action = function (type, actionFn) { + if (BI.isFunction(type)) { + globalAction.push(type); + return function () { + BI.remove(globalAction, actionFn); + }; + } if (!actions[type]) { actions[type] = []; } @@ -28610,7 +28868,7 @@ BI.extend(BI.DOM, { console.error(e); } } - } + }; }(afns)); } } @@ -28670,6 +28928,12 @@ BI.extend(BI.DOM, { BI.each(actions[type], function (i, act) { act(config); }); + }, + runGlobalAction: function () { + var args = [].slice.call(arguments); + BI.each(globalAction, function (i, act) { + act.apply(null, args); + }); } }; })(); @@ -36161,6 +36425,7 @@ BI.BasicButton = BI.inherit(BI.Single, { if (o.action) { BI.Actions.runAction(o.action, o); } + BI.Actions.runGlobalAction(o); } }, @@ -72305,7 +72570,7 @@ BI.SingleSelectRadioItem = BI.inherit(BI.BasicButton, { items: BI.LogicFactory.createLogicItemsByDirection("left", { type: "bi.center_adapt", items: [this.radio], - width: 36 + width: 16 }, this.text) })))); }, @@ -103332,7 +103597,7 @@ BI.SingleSelectCombo = BI.inherit(BI.Single, { BI.isKey(self._startValue) && (self.storeValue = self._startValue); self.trigger.getSearcher().setState(self.storeValue); }; - this.storeValue = o.value || ""; + this.storeValue = o.value; // 标记正在请求数据 this.requesting = false; @@ -103638,7 +103903,7 @@ BI.SingleSelectCombo = BI.inherit(BI.Single, { }, setValue: function (v) { - this.storeValue = v || ""; + this.storeValue = v; this._assertValue(this.storeValue); this.combo.setValue(this.storeValue); }, @@ -103660,7 +103925,8 @@ BI.extend(BI.SingleSelectCombo, { BI.SingleSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM"; -BI.shortcut("bi.single_select_combo", BI.SingleSelectCombo);/** +BI.shortcut("bi.single_select_combo", BI.SingleSelectCombo); +/** * 选择列表 * * Created by GUY on 2015/11/1. @@ -111097,6 +111363,7 @@ BI.shortcut("bi.value_chooser_pane", BI.ValueChooserPane);;(function () { needPop = true; } this.store = this._store(); + this.store._widget = this; needPop && popTarget(); needPop = false; pushTarget(this.store); @@ -111136,6 +111403,7 @@ BI.shortcut("bi.value_chooser_pane", BI.ValueChooserPane);;(function () { this._watchers && (this._watchers = []); if (this.store) { this.store._parent && (this.store._parent = null); + this.store._widget && (this.store._widget = null); this.store = null; } delete this.__cacheStore; diff --git a/dist/case.js b/dist/case.js index 8f7f027ea..38c553b1f 100644 --- a/dist/case.js +++ b/dist/case.js @@ -365,7 +365,7 @@ BI.SingleSelectRadioItem = BI.inherit(BI.BasicButton, { items: BI.LogicFactory.createLogicItemsByDirection("left", { type: "bi.center_adapt", items: [this.radio], - width: 36 + width: 16 }, this.text) })))); }, diff --git a/dist/core.js b/dist/core.js index 665bee4e6..7a7c66d02 100644 --- a/dist/core.js +++ b/dist/core.js @@ -9599,7 +9599,7 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { })( window );/** * @license * Lodash (Custom Build) - * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference"` + * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference,defaultsDeep"` * Copyright JS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 @@ -10444,6 +10444,20 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return result; } + /** + * Gets the value at `key`, unless `key` is "__proto__". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + return key == '__proto__' + ? undefined + : object[key]; + } + /** * Converts `set` to an array of its values. * @@ -11459,6 +11473,22 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return result; } + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) @@ -12487,6 +12517,116 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { }; } + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + /** * The base implementation of `_.orderBy` without param guards. * @@ -13706,6 +13846,30 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return setWrapToString(setter(result, newData), func, bitmask); } + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. @@ -17781,6 +17945,34 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { : (reIsBadHex.test(value) ? NAN : +value); } + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. @@ -17934,6 +18126,30 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return object; }); + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + /** * This method is like `_.find` except that it returns the key of the first * element `predicate` returns truthy for instead of the element itself. @@ -18228,6 +18444,41 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. @@ -18997,6 +19248,7 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) { lodash.create = create; lodash.debounce = debounce; lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; lodash.defer = defer; lodash.delay = delay; lodash.difference = difference; @@ -28472,7 +28724,6 @@ BI.extend(BI.DOM, { }, getImage: function (param, fillStyle, backgroundColor) { - var image = new Image(); var canvas = document.createElement("canvas"); $("body").append(canvas); var w = BI.DOM.getTextSizeWidth(param, 14) + 6; @@ -28490,8 +28741,8 @@ BI.extend(BI.DOM, { width: w, height: 24, src: canvas.toDataURL("image/png"), - style: "background-color: " + backColor + ";vertical-align: sub; margin: 0 3px;", - alt: param + style: "background-color: " + backColor + ";vertical-align: middle; margin: 0 3px;", + param: param }; } });(function () { @@ -28549,7 +28800,14 @@ BI.extend(BI.DOM, { }; var actions = {}; + var globalAction = []; BI.action = function (type, actionFn) { + if (BI.isFunction(type)) { + globalAction.push(type); + return function () { + BI.remove(globalAction, actionFn); + }; + } if (!actions[type]) { actions[type] = []; } @@ -28610,7 +28868,7 @@ BI.extend(BI.DOM, { console.error(e); } } - } + }; }(afns)); } } @@ -28670,6 +28928,12 @@ BI.extend(BI.DOM, { BI.each(actions[type], function (i, act) { act(config); }); + }, + runGlobalAction: function () { + var args = [].slice.call(arguments); + BI.each(globalAction, function (i, act) { + act.apply(null, args); + }); } }; })(); diff --git a/dist/demo.js b/dist/demo.js index 798a6214f..8231ae4b7 100644 --- a/dist/demo.js +++ b/dist/demo.js @@ -2797,14 +2797,46 @@ BI.shortcut("demo.all_count_pager", Demo.Func);Demo.Func = BI.inherit(BI.Widget, baseCls: "demo-func" }, + mounted: function () { + this.pager.populate(); + }, + render: function () { + var self = this; BI.createWidget({ type: "bi.vertical", hgap: 200, vgap: 50, element: this, items: [{ - type: "bi.direction_pager" + type: "bi.direction_pager", + ref: function (_ref) { + self.pager = _ref; + }, + horizontal: { + pages: false, // 总页数 + curr: 1, // 初始化当前页, pages为数字时可用 + + hasPrev: function (v) { + return v > 1; + }, + hasNext: function () { + return true; + }, + firstPage: 1 + }, + vertical: { + pages: false, // 总页数 + curr: 1, // 初始化当前页, pages为数字时可用 + + hasPrev: function (v) { + return v > 1; + }, + hasNext: function () { + return true; + }, + firstPage: 1 + } }] }); } @@ -13646,6 +13678,7 @@ BI.shortcut("demo.slider", Demo.Slider);Demo.Func = BI.inherit(BI.Widget, { crossHeader: crossHeader, crossItems: crossItems }); + table1.populate(); // table1.populate(items, header, crossItems, crossHeader); BI.createWidget({ type: "bi.absolute", diff --git a/dist/fix/fix.compact.js b/dist/fix/fix.compact.js index b3de0609d..8d8fb18d3 100644 --- a/dist/fix/fix.compact.js +++ b/dist/fix/fix.compact.js @@ -115,6 +115,7 @@ needPop = true; } this.store = this._store(); + this.store._widget = this; needPop && popTarget(); needPop = false; pushTarget(this.store); @@ -154,6 +155,7 @@ this._watchers && (this._watchers = []); if (this.store) { this.store._parent && (this.store._parent = null); + this.store._widget && (this.store._widget = null); this.store = null; } delete this.__cacheStore; diff --git a/dist/widget.js b/dist/widget.js index 1aa515278..d380a1824 100644 --- a/dist/widget.js +++ b/dist/widget.js @@ -16696,7 +16696,7 @@ BI.SingleSelectCombo = BI.inherit(BI.Single, { BI.isKey(self._startValue) && (self.storeValue = self._startValue); self.trigger.getSearcher().setState(self.storeValue); }; - this.storeValue = o.value || ""; + this.storeValue = o.value; // 标记正在请求数据 this.requesting = false; @@ -17002,7 +17002,7 @@ BI.SingleSelectCombo = BI.inherit(BI.Single, { }, setValue: function (v) { - this.storeValue = v || ""; + this.storeValue = v; this._assertValue(this.storeValue); this.combo.setValue(this.storeValue); }, @@ -17024,7 +17024,8 @@ BI.extend(BI.SingleSelectCombo, { BI.SingleSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM"; -BI.shortcut("bi.single_select_combo", BI.SingleSelectCombo);/** +BI.shortcut("bi.single_select_combo", BI.SingleSelectCombo); +/** * 选择列表 * * Created by GUY on 2015/11/1. diff --git a/lodash.md b/lodash.md deleted file mode 100644 index 77a9174d1..000000000 --- a/lodash.md +++ /dev/null @@ -1 +0,0 @@ -lodash core plus=debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference \ No newline at end of file diff --git a/src/base/single/button/button.basic.js b/src/base/single/button/button.basic.js index 64970858f..17d5301d9 100644 --- a/src/base/single/button/button.basic.js +++ b/src/base/single/button/button.basic.js @@ -303,6 +303,7 @@ BI.BasicButton = BI.inherit(BI.Single, { if (o.action) { BI.Actions.runAction(o.action, o); } + BI.Actions.runGlobalAction(o); } }, diff --git a/src/case/button/item.singleselect.radio.js b/src/case/button/item.singleselect.radio.js index a1ee88ee1..7c3252fb0 100644 --- a/src/case/button/item.singleselect.radio.js +++ b/src/case/button/item.singleselect.radio.js @@ -43,7 +43,7 @@ BI.SingleSelectRadioItem = BI.inherit(BI.BasicButton, { items: BI.LogicFactory.createLogicItemsByDirection("left", { type: "bi.center_adapt", items: [this.radio], - width: 36 + width: 16 }, this.text) })))); }, diff --git a/src/core/func/function.js b/src/core/func/function.js index 6d5b08cb2..4502a19b6 100644 --- a/src/core/func/function.js +++ b/src/core/func/function.js @@ -301,7 +301,6 @@ BI.extend(BI.DOM, { }, getImage: function (param, fillStyle, backgroundColor) { - var image = new Image(); var canvas = document.createElement("canvas"); $("body").append(canvas); var w = BI.DOM.getTextSizeWidth(param, 14) + 6; @@ -319,8 +318,8 @@ BI.extend(BI.DOM, { width: w, height: 24, src: canvas.toDataURL("image/png"), - style: "background-color: " + backColor + ";vertical-align: sub; margin: 0 3px;", - alt: param + style: "background-color: " + backColor + ";vertical-align: middle; margin: 0 3px;", + param: param }; } }); \ No newline at end of file diff --git a/src/core/inject.js b/src/core/inject.js index e8b388f71..3da3e0e4a 100644 --- a/src/core/inject.js +++ b/src/core/inject.js @@ -53,7 +53,14 @@ }; var actions = {}; + var globalAction = []; BI.action = function (type, actionFn) { + if (BI.isFunction(type)) { + globalAction.push(type); + return function () { + BI.remove(globalAction, actionFn); + }; + } if (!actions[type]) { actions[type] = []; } @@ -114,7 +121,7 @@ console.error(e); } } - } + }; }(afns)); } } @@ -174,6 +181,12 @@ BI.each(actions[type], function (i, act) { act(config); }); + }, + runGlobalAction: function () { + var args = [].slice.call(arguments); + BI.each(globalAction, function (i, act) { + act.apply(null, args); + }); } }; })(); diff --git a/src/core/lodash.js b/src/core/lodash.js index 3041a41ab..7384837e5 100644 --- a/src/core/lodash.js +++ b/src/core/lodash.js @@ -1,7 +1,7 @@ /** * @license * Lodash (Custom Build) - * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference"` + * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference,defaultsDeep"` * Copyright JS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 @@ -846,6 +846,20 @@ return result; } + /** + * Gets the value at `key`, unless `key` is "__proto__". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + return key == '__proto__' + ? undefined + : object[key]; + } + /** * Converts `set` to an array of its values. * @@ -1861,6 +1875,22 @@ return result; } + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) @@ -2889,6 +2919,116 @@ }; } + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + /** * The base implementation of `_.orderBy` without param guards. * @@ -4108,6 +4248,30 @@ return setWrapToString(setter(result, newData), func, bitmask); } + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. @@ -8183,6 +8347,34 @@ : (reIsBadHex.test(value) ? NAN : +value); } + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. @@ -8336,6 +8528,30 @@ return object; }); + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + /** * This method is like `_.find` except that it returns the key of the first * element `predicate` returns truthy for instead of the element itself. @@ -8630,6 +8846,41 @@ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. @@ -9399,6 +9650,7 @@ lodash.create = create; lodash.debounce = debounce; lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; lodash.defer = defer; lodash.delay = delay; lodash.difference = difference; diff --git a/src/widget/singleselect/singleselect.combo.js b/src/widget/singleselect/singleselect.combo.js index 086abd280..d556ee45d 100644 --- a/src/widget/singleselect/singleselect.combo.js +++ b/src/widget/singleselect/singleselect.combo.js @@ -22,7 +22,7 @@ BI.SingleSelectCombo = BI.inherit(BI.Single, { BI.isKey(self._startValue) && (self.storeValue = self._startValue); self.trigger.getSearcher().setState(self.storeValue); }; - this.storeValue = o.value || ""; + this.storeValue = o.value; // 标记正在请求数据 this.requesting = false; @@ -328,7 +328,7 @@ BI.SingleSelectCombo = BI.inherit(BI.Single, { }, setValue: function (v) { - this.storeValue = v || ""; + this.storeValue = v; this._assertValue(this.storeValue); this.combo.setValue(this.storeValue); }, @@ -350,4 +350,4 @@ BI.extend(BI.SingleSelectCombo, { BI.SingleSelectCombo.EVENT_CONFIRM = "EVENT_CONFIRM"; -BI.shortcut("bi.single_select_combo", BI.SingleSelectCombo); \ No newline at end of file +BI.shortcut("bi.single_select_combo", BI.SingleSelectCombo); diff --git a/utils/utils.js b/utils/utils.js index 132a9416f..1e545eb3a 100644 --- a/utils/utils.js +++ b/utils/utils.js @@ -1,7 +1,7 @@ /** * @license * Lodash (Custom Build) - * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference"` + * Build: `lodash core plus="debounce,throttle,get,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference,defaultsDeep"` * Copyright JS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 @@ -846,6 +846,20 @@ return result; } + /** + * Gets the value at `key`, unless `key` is "__proto__". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + return key == '__proto__' + ? undefined + : object[key]; + } + /** * Converts `set` to an array of its values. * @@ -1861,6 +1875,22 @@ return result; } + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) @@ -2889,6 +2919,116 @@ }; } + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + /** * The base implementation of `_.orderBy` without param guards. * @@ -4108,6 +4248,30 @@ return setWrapToString(setter(result, newData), func, bitmask); } + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. @@ -8183,6 +8347,34 @@ : (reIsBadHex.test(value) ? NAN : +value); } + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. @@ -8336,6 +8528,30 @@ return object; }); + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + /** * This method is like `_.find` except that it returns the key of the first * element `predicate` returns truthy for instead of the element itself. @@ -8630,6 +8846,41 @@ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. @@ -9399,6 +9650,7 @@ lodash.create = create; lodash.debounce = debounce; lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; lodash.defer = defer; lodash.delay = delay; lodash.difference = difference; @@ -12987,7 +13239,14 @@ _.extend(BI.OB.prototype, { }; var actions = {}; + var globalAction = []; BI.action = function (type, actionFn) { + if (BI.isFunction(type)) { + globalAction.push(type); + return function () { + BI.remove(globalAction, actionFn); + }; + } if (!actions[type]) { actions[type] = []; } @@ -13048,7 +13307,7 @@ _.extend(BI.OB.prototype, { console.error(e); } } - } + }; }(afns)); } } @@ -13108,6 +13367,12 @@ _.extend(BI.OB.prototype, { BI.each(actions[type], function (i, act) { act(config); }); + }, + runGlobalAction: function () { + var args = [].slice.call(arguments); + BI.each(globalAction, function (i, act) { + act.apply(null, args); + }); } }; })();