zent
Version:
一套前端设计语言和基于React的实现
1,660 lines (1,290 loc) • 265 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof define === 'function' && define.amd)
define(["react", "react-dom"], factory);
else if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"), require("react-dom"));
else if(typeof exports === 'object')
exports["zent-popover"] = factory(require("react"), require("react-dom"));
else
root["zent-popover"] = factory(root["React"], root["ReactDOM"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_4__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(1);
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Popover = __webpack_require__(2);
var _Popover2 = _interopRequireDefault(_Popover);
var _withPopover = __webpack_require__(188);
var _withPopover2 = _interopRequireDefault(_withPopover);
var _trigger = __webpack_require__(189);
var _trigger2 = _interopRequireDefault(_trigger);
var _Content = __webpack_require__(30);
var _Content2 = _interopRequireDefault(_Content);
var _placement = __webpack_require__(213);
var _placement2 = _interopRequireDefault(_placement);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
_Popover2['default'].Content = _Content2['default'];
_Popover2['default'].Trigger = _trigger2['default'];
_Popover2['default'].Position = _placement2['default'];
_Popover2['default'].withPopover = _withPopover2['default'];
exports['default'] = _Popover2['default'];
module.exports = exports['default'];
/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports['default'] = exports.PopoverContextType = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _class, _temp, _initialiseProps; /**
* 设计:
*
* Popover组件只是一个壳子,负责组装Trigger和Content。
*
* 弹层实际的打开/关闭都是Content完成的,而什么情况打开弹层是Trigger控制的。
*/
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _reactDom = __webpack_require__(4);
var _reactDom2 = _interopRequireDefault(_reactDom);
var _classnames = __webpack_require__(5);
var _classnames2 = _interopRequireDefault(_classnames);
var _noop = __webpack_require__(8);
var _noop2 = _interopRequireDefault(_noop);
var _uniqueId = __webpack_require__(10);
var _uniqueId2 = _interopRequireDefault(_uniqueId);
var _isFunction = __webpack_require__(24);
var _isFunction2 = _interopRequireDefault(_isFunction);
var _isBoolean = __webpack_require__(27);
var _isBoolean2 = _interopRequireDefault(_isBoolean);
var _isPromise = __webpack_require__(29);
var _isPromise2 = _interopRequireDefault(_isPromise);
var _Content = __webpack_require__(30);
var _Content2 = _interopRequireDefault(_Content);
var _Trigger = __webpack_require__(187);
var _Trigger2 = _interopRequireDefault(_Trigger);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var SKIPPED = function SKIPPED() {};
function instanceOf(MaybeDerive, Base) {
return MaybeDerive === Base || MaybeDerive.prototype instanceof Base;
}
function handleBeforeHook(beforeFn, arity, continuation) {
// 有参数,传入continuation,由外部去控制何时调用
if (arity >= 1) {
return beforeFn(continuation);
}
// 无参数,如果返回Promise那么resolve后调用continuation;如果返回不是Promise,直接调用Promise
var mayBePromise = beforeFn();
if (!(0, _isPromise2['default'])(mayBePromise) && mayBePromise !== SKIPPED) {
return continuation();
}
mayBePromise.then(continuation);
}
var PopoverContextType = exports.PopoverContextType = {
popover: _react.PropTypes.shape({
close: _react.PropTypes.func.isRequired,
open: _react.PropTypes.func.isRequired,
getContentNode: _react.PropTypes.func.isRequired,
getTriggerNode: _react.PropTypes.func.isRequired
})
};
var Popover = (_temp = _class = function (_Component) {
_inherits(Popover, _Component);
_createClass(Popover, [{
key: 'getChildContext',
value: function getChildContext() {
return {
popover: {
close: this.close,
open: this.open,
getContentNode: this.getPopoverNode,
getTriggerNode: this.getTriggerNode
}
};
}
}]);
function Popover(props) {
_classCallCheck(this, Popover);
// id用来唯一标识popover实例
var _this = _possibleConstructorReturn(this, (Popover.__proto__ || Object.getPrototypeOf(Popover)).call(this, props));
_initialiseProps.call(_this);
_this.id = (0, _uniqueId2['default'])(props.prefix + '-popover-internal-id-');
if (!_this.isVisibilityControlled(props)) {
_this.state = {
visible: false
};
}
return _this;
}
_createClass(Popover, [{
key: 'isVisibilityControlled',
value: function isVisibilityControlled(props) {
var _ref = props || this.props,
visible = _ref.visible,
onVisibleChange = _ref.onVisibleChange;
var hasOnChange = (0, _isFunction2['default'])(onVisibleChange);
var hasVisible = (0, _isBoolean2['default'])(visible);
if (hasVisible && !hasOnChange || hasOnChange && !hasVisible) {
throw new Error('visible and onVisibleChange must be used together');
}
return hasVisible && hasOnChange;
}
}, {
key: 'validateChildren',
value: function validateChildren() {
var children = this.props.children;
var childArray = _react.Children.toArray(children);
if (childArray.length !== 2) {
throw new Error('There must be one and only one trigger and content in Popover');
}
var _childArray$reduce = childArray.reduce(function (state, c) {
var type = c.type;
if (instanceOf(type, _Trigger2['default'])) {
state.trigger = c;
} else if (instanceOf(type, _Content2['default'])) {
state.content = c;
}
return state;
}, { trigger: null, content: null }),
trigger = _childArray$reduce.trigger,
content = _childArray$reduce.content;
if (!trigger) {
throw new Error('Missing trigger in Popover');
}
if (!content) {
throw new Error('Missing content in Popover');
}
return { trigger: trigger, content: content };
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
if (this.isVisibilityControlled() && this.props.visible) {
this.props.onShow();
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
var visible = this.getVisible();
if (visible !== this.getVisible(prevProps, prevState)) {
var afterHook = visible ? this.props.onShow : this.props.onClose;
afterHook();
}
}
}, {
key: 'render',
value: function render() {
var _validateChildren = this.validateChildren(),
trigger = _validateChildren.trigger,
content = _validateChildren.content;
var _props = this.props,
display = _props.display,
prefix = _props.prefix,
className = _props.className,
wrapperClassName = _props.wrapperClassName,
containerSelector = _props.containerSelector,
position = _props.position,
cushion = _props.cushion;
var visible = this.getVisible();
return _react2['default'].createElement(
'div',
{ style: { display: display }, className: (0, _classnames2['default'])(prefix + '-popover-wrapper', wrapperClassName) },
_react2['default'].cloneElement(trigger, {
prefix: prefix,
contentVisible: visible,
onTriggerRefChange: this.onTriggerRefChange,
getTriggerNode: this.getTriggerNode,
getContentNode: this.getPopoverNode,
open: this.open,
close: this.close
}),
_react2['default'].cloneElement(content, {
prefix: prefix,
className: className,
id: this.id,
getContentNode: this.getPopoverNode,
getAnchor: this.getTriggerNode,
visible: visible,
cushion: cushion,
containerSelector: containerSelector,
placement: position
})
);
}
}]);
return Popover;
}(_react.Component), _class.propTypes = {
prefix: _react.PropTypes.string,
className: _react.PropTypes.string,
// custom classname for trigger wrapper
wrapperClassName: _react.PropTypes.string,
// container的display属性
display: _react.PropTypes.string,
// position strategy
position: _react.PropTypes.func.isRequired,
// 定位时的偏移量
cushion: _react.PropTypes.number,
// 只有用户触发的打开/关闭才会触发这两个毁掉
onBeforeClose: _react.PropTypes.func,
onBeforeShow: _react.PropTypes.func,
// 不管打开/关闭时如何触发的都会被调用
onClose: _react.PropTypes.func,
onShow: _react.PropTypes.func,
// defaults to body
containerSelector: _react.PropTypes.string,
children: _react.PropTypes.node.isRequired,
// 两个必须一起出现
visible: _react.PropTypes.bool,
onVisibleChange: _react.PropTypes.func
}, _class.defaultProps = {
prefix: 'zent',
className: '',
wrapperClassName: '',
display: 'block',
onBeforeClose: _noop2['default'],
onBeforeShow: _noop2['default'],
onClose: _noop2['default'],
onShow: _noop2['default'],
cushion: 0,
containerSelector: 'body'
}, _class.childContextTypes = PopoverContextType, _initialiseProps = function _initialiseProps() {
var _this2 = this;
this.getVisible = function (props, state) {
if (_this2.isVisibilityControlled(props)) {
props = props || _this2.props;
return props.visible;
}
state = state || _this2.state;
return state.visible;
};
this.setVisible = function (visible, props, state) {
props = props || _this2.props;
state = state || _this2.state;
var beforeHook = visible ? props.onBeforeShow : props.onBeforeClose;
var onBefore = function onBefore() {
// 确保pending的时候不会触发多次beforeHook
if (_this2.pendingOnBeforeHook) {
return SKIPPED;
}
_this2.pendingOnBeforeHook = true;
return beforeHook.apply(undefined, arguments);
};
if (_this2.isVisibilityControlled(props)) {
if (_this2.pendingOnBeforeHook || props.visible === visible) {
return;
}
handleBeforeHook(onBefore, beforeHook.length, function () {
props.onVisibleChange(visible);
_this2.pendingOnBeforeHook = false;
});
} else {
if (_this2.pendingOnBeforeHook || state.visible === visible) {
return;
}
handleBeforeHook(onBefore, beforeHook.length, function () {
_this2.setState({ visible: visible });
_this2.pendingOnBeforeHook = false;
});
}
};
this.getPopoverNode = function () {
return document.querySelector('.' + _this2.id);
};
this.onTriggerRefChange = function (triggerInstance) {
_this2.triggerNode = _reactDom2['default'].findDOMNode(triggerInstance);
};
this.getTriggerNode = function () {
return _this2.triggerNode;
};
this.open = function () {
_this2.setVisible(true);
};
this.close = function () {
_this2.setVisible(false);
};
}, _temp);
exports['default'] = Popover;
/***/ },
/* 3 */
/***/ function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
/***/ },
/* 4 */
/***/ function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classnames = __webpack_require__(6);
Object.defineProperty(exports, 'default', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_classnames)['default'];
}
});
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { 'default': obj };
}
module.exports = exports['default'];
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/*!
Copyright (c) 2016 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/* global define */
(function () {
'use strict';
var hasOwn = {}.hasOwnProperty;
function classNames() {
var classes = [];
for (var i = 0; i < arguments.length; i++) {
var arg = arguments[i];
if (!arg) continue;
var argType = typeof arg === 'undefined' ? 'undefined' : _typeof(arg);
if (argType === 'string' || argType === 'number') {
classes.push(arg);
} else if (Array.isArray(arg)) {
classes.push(classNames.apply(null, arg));
} else if (argType === 'object') {
for (var key in arg) {
if (hasOwn.call(arg, key) && arg[key]) {
classes.push(key);
}
}
}
}
return classes.join(' ');
}
if (typeof module !== 'undefined' && module.exports) {
module.exports = classNames;
} else if ("function" === 'function' && _typeof(__webpack_require__(7)) === 'object' && __webpack_require__(7)) {
// register as 'classnames', consistent with npm package name
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {
return classNames;
}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else {
window.classNames = classNames;
}
})();
/***/ },
/* 7 */
/***/ function(module, exports) {
/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {module.exports = __webpack_amd_options__;
/* WEBPACK VAR INJECTION */}.call(exports, {}))
/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
/* DO NOT EDIT!! Auto genetated wrapper for lodash/noop. */
var noop = __webpack_require__(9);
module.exports = noop;
/***/ },
/* 9 */
/***/ function(module, exports) {
"use strict";
/**
* This method returns `undefined`.
*
* @static
* @memberOf _
* @since 2.3.0
* @category Util
* @example
*
* _.times(2, _.noop);
* // => [undefined, undefined]
*/
function noop() {
// No operation performed.
}
module.exports = noop;
/***/ },
/* 10 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
/* DO NOT EDIT!! Auto genetated wrapper for lodash/uniqueId. */
var uniqueId = __webpack_require__(11);
module.exports = uniqueId;
/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var toString = __webpack_require__(12);
/** Used to generate unique IDs. */
var idCounter = 0;
/**
* Generates a unique ID. If `prefix` is given, the ID is appended to it.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Util
* @param {string} [prefix=''] The value to prefix the ID with.
* @returns {string} Returns the unique ID.
* @example
*
* _.uniqueId('contact_');
* // => 'contact_104'
*
* _.uniqueId();
* // => '105'
*/
function uniqueId(prefix) {
var id = ++idCounter;
return toString(prefix) + id;
}
module.exports = uniqueId;
/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var baseToString = __webpack_require__(13);
/**
* Converts `value` to a string. An empty string is returned for `null`
* and `undefined` values. The sign of `-0` is preserved.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to convert.
* @returns {string} Returns the converted string.
* @example
*
* _.toString(null);
* // => ''
*
* _.toString(-0);
* // => '-0'
*
* _.toString([1, 2, 3]);
* // => '1,2,3'
*/
function toString(value) {
return value == null ? '' : baseToString(value);
}
module.exports = toString;
/***/ },
/* 13 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _Symbol = __webpack_require__(14),
arrayMap = __webpack_require__(17),
isArray = __webpack_require__(18),
isSymbol = __webpack_require__(19);
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/** Used to convert symbols to primitives and strings. */
var symbolProto = _Symbol ? _Symbol.prototype : undefined,
symbolToString = symbolProto ? symbolProto.toString : undefined;
/**
* The base implementation of `_.toString` which doesn't convert nullish
* values to empty strings.
*
* @private
* @param {*} value The value to process.
* @returns {string} Returns the string.
*/
function baseToString(value) {
// Exit early for strings to avoid a performance hit in some environments.
if (typeof value == 'string') {
return value;
}
if (isArray(value)) {
// Recursively convert values (susceptible to call stack limits).
return arrayMap(value, baseToString) + '';
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : '';
}
var result = value + '';
return result == '0' && 1 / value == -INFINITY ? '-0' : result;
}
module.exports = baseToString;
/***/ },
/* 14 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var root = __webpack_require__(15);
/** Built-in value references. */
var _Symbol = root.Symbol;
module.exports = _Symbol;
/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var freeGlobal = __webpack_require__(16);
/** Detect free variable `self`. */
var freeSelf = (typeof self === 'undefined' ? 'undefined' : _typeof(self)) == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
module.exports = root;
/***/ },
/* 16 */
/***/ function(module, exports) {
/* WEBPACK VAR INJECTION */(function(global) {'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/** Detect free variable `global` from Node.js. */
var freeGlobal = (typeof global === 'undefined' ? 'undefined' : _typeof(global)) == 'object' && global && global.Object === Object && global;
module.exports = freeGlobal;
/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
/***/ },
/* 17 */
/***/ function(module, exports) {
"use strict";
/**
* A specialized version of `_.map` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function arrayMap(array, iteratee) {
var index = -1,
length = array == null ? 0 : array.length,
result = Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
return result;
}
module.exports = arrayMap;
/***/ },
/* 18 */
/***/ function(module, exports) {
"use strict";
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(document.body.children);
* // => false
*
* _.isArray('abc');
* // => false
*
* _.isArray(_.noop);
* // => false
*/
var isArray = Array.isArray;
module.exports = isArray;
/***/ },
/* 19 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var baseGetTag = __webpack_require__(20),
isObjectLike = __webpack_require__(23);
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag;
}
module.exports = isSymbol;
/***/ },
/* 20 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _Symbol = __webpack_require__(14),
getRawTag = __webpack_require__(21),
objectToString = __webpack_require__(22);
/** `Object#toString` result references. */
var nullTag = '[object Null]',
undefinedTag = '[object Undefined]';
/** Built-in value references. */
var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;
/**
* The base implementation of `getTag` without fallbacks for buggy environments.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function baseGetTag(value) {
if (value == null) {
return value === undefined ? undefinedTag : nullTag;
}
return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
}
module.exports = baseGetTag;
/***/ },
/* 21 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _Symbol = __webpack_require__(14);
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var nativeObjectToString = objectProto.toString;
/** Built-in value references. */
var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;
/**
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the raw `toStringTag`.
*/
function getRawTag(value) {
var isOwn = hasOwnProperty.call(value, symToStringTag),
tag = value[symToStringTag];
try {
value[symToStringTag] = undefined;
var unmasked = true;
} catch (e) {}
var result = nativeObjectToString.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag] = tag;
} else {
delete value[symToStringTag];
}
}
return result;
}
module.exports = getRawTag;
/***/ },
/* 22 */
/***/ function(module, exports) {
"use strict";
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var nativeObjectToString = objectProto.toString;
/**
* Converts `value` to a string using `Object.prototype.toString`.
*
* @private
* @param {*} value The value to convert.
* @returns {string} Returns the converted string.
*/
function objectToString(value) {
return nativeObjectToString.call(value);
}
module.exports = objectToString;
/***/ },
/* 23 */
/***/ function(module, exports) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return value != null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object';
}
module.exports = isObjectLike;
/***/ },
/* 24 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
/* DO NOT EDIT!! Auto genetated wrapper for lodash/isFunction. */
var isFunction = __webpack_require__(25);
module.exports = isFunction;
/***/ },
/* 25 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var baseGetTag = __webpack_require__(20),
isObject = __webpack_require__(26);
/** `Object#toString` result references. */
var asyncTag = '[object AsyncFunction]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]',
proxyTag = '[object Proxy]';
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
if (!isObject(value)) {
return false;
}
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 9 which returns 'object' for typed arrays and other constructors.
var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
module.exports = isFunction;
/***/ },
/* 26 */
/***/ function(module, exports) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
return value != null && (type == 'object' || type == 'function');
}
module.exports = isObject;
/***/ },
/* 27 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
/* DO NOT EDIT!! Auto genetated wrapper for lodash/isBoolean. */
var isBoolean = __webpack_require__(28);
module.exports = isBoolean;
/***/ },
/* 28 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var baseGetTag = __webpack_require__(20),
isObjectLike = __webpack_require__(23);
/** `Object#toString` result references. */
var boolTag = '[object Boolean]';
/**
* Checks if `value` is classified as a boolean primitive or object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
* @example
*
* _.isBoolean(false);
* // => true
*
* _.isBoolean(null);
* // => false
*/
function isBoolean(value) {
return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag;
}
module.exports = isBoolean;
/***/ },
/* 29 */
/***/ function(module, exports) {
'use strict';
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
};
exports['default'] = isPromise;
/**
* Test whether an object looks like a promise
*
* @export
* @param {any} obj
* @returns {bool}
*/
function isPromise(obj) {
return !!obj && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
}
module.exports = exports['default'];
/***/ },
/* 30 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports['default'] = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _class, _temp2;
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _classnames = __webpack_require__(5);
var _classnames2 = _interopRequireDefault(_classnames);
var _zentPortal = __webpack_require__(31);
var _zentPortal2 = _interopRequireDefault(_zentPortal);
var _WindowResizeHandler = __webpack_require__(176);
var _WindowResizeHandler2 = _interopRequireDefault(_WindowResizeHandler);
var _findPositionedParent = __webpack_require__(179);
var _findPositionedParent2 = _interopRequireDefault(_findPositionedParent);
var _throttle = __webpack_require__(180);
var _throttle2 = _interopRequireDefault(_throttle);
var _invisible = __webpack_require__(185);
var _invisible2 = _interopRequireDefault(_invisible);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function translateToContainerCoordinates(containerBB, bb) {
var left = containerBB.left,
top = containerBB.top;
return {
width: bb.width,
height: bb.height,
top: bb.top - top,
left: bb.left - left,
bottom: bb.bottom - top,
right: bb.right - left
};
}
/**
* Like triggers, content can be replaced with your own implementation, all you have to do is extend this base class.
*
* The props on this class are all private.
*/
var PopoverContent = (_temp2 = _class = function (_Component) {
_inherits(PopoverContent, _Component);
function PopoverContent() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, PopoverContent);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = PopoverContent.__proto__ || Object.getPrototypeOf(PopoverContent)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
position: null
}, _this.adjustPosition = function () {
var content = _this.props.getContentNode();
// 可能还未渲染出来,先放到一个不可见的位置
if (!content) {
_this.setState({
position: (0, _invisible2['default'])(_this.props.prefix)
});
setTimeout(_this.adjustPosition, 0);
return;
}
var anchor = _this.getAnchor();
var boundingBox = anchor.getBoundingClientRect();
var parent = _this.getPositionedParent();
var parentBoundingBox = parent.getBoundingClientRect();
var contentBoundingBox = content.getBoundingClientRect();
var relativeBB = translateToContainerCoordinates(parentBoundingBox, boundingBox);
var relativeContainerBB = translateToContainerCoordinates(parentBoundingBox, parentBoundingBox);
var position = _this.props.placement(_this.props.prefix, relativeBB, relativeContainerBB, {
width: contentBoundingBox.width,
height: contentBoundingBox.height
}, { cushion: _this.props.cushion });
_this.setState({
position: position
});
}, _this.onWindowResize = (0, _throttle2['default'])(function (evt, delta) {
if (_this.props.visible && (delta.deltaX !== 0 || delta.deltaY !== 0)) {
_this.adjustPosition();
}
}, 16), _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(PopoverContent, [{
key: 'getAnchor',
value: function getAnchor() {
return this.props.getAnchor();
}
}, {
key: 'getPositionedParent',
value: function getPositionedParent() {
// findPositionedParent returns null on fail
if (this.positionedParent !== undefined) {
return this.positionedParent;
}
var containerSelector = this.props.containerSelector;
var container = document.querySelector(containerSelector);
var parent = (0, _findPositionedParent2['default'])(container, true);
this.positionedParent = parent;
return parent;
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
var visible = this.props.visible;
if (visible) {
this.adjustPosition();
}
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if (nextProps.visible && nextProps.visible !== this.props.visible) {
this.adjustPosition();
}
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
prefix = _props.prefix,
className = _props.className,
id = _props.id,
visible = _props.visible,
children = _props.children,
containerSelector = _props.containerSelector;
var position = this.state.position;
if (!position) {
return null;
}
var cls = (0, _classnames2['default'])(className, prefix + '-popover', id, position.toString());
return _react2['default'].createElement(
_zentPortal2['default'],
{ prefix: prefix, visible: visible, selector: containerSelector, className: cls, css: position.getCSSStyle() },
_react2['default'].createElement(
'div',
{ className: prefix + '-popover-content' },
children,
_react2['default'].createElement(_WindowResizeHandler2['default'], { onResize: this.onWindowResize })
)
);
}
}]);
return PopoverContent;
}(_react.Component), _class.propTypes = {
children: _react.PropTypes.node,
prefix: _react.PropTypes.string,
id: _react.PropTypes.string,
getContentNode: _react.PropTypes.func,
visible: _react.PropTypes.bool,
// placement strategy
placement: _react.PropTypes.func,
cushion: _react.PropTypes.number,
// A function that returns the anchor for this popover
// () => Node
getAnchor: _react.PropTypes.func,
// defaults to body
containerSelector: _react.PropTypes.string
}, _temp2);
exports['default'] = PopoverContent;
module.exports = exports['default'];
/***/ },
/* 31 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _ClosablePortal = __webpack_require__(32);
var _ClosablePortal2 = _interopRequireDefault(_ClosablePortal);
var _withESCToClose = __webpack_require__(116);
var _withESCToClose2 = _interopRequireDefault(_withESCToClose);
var _withNonScrollable = __webpack_require__(175);
var _withNonScrollable2 = _interopRequireDefault(_withNonScrollable);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { 'default': obj };
}
_ClosablePortal2['default'].withESCToClose = _withESCToClose2['default'];
_ClosablePortal2['default'].withNonScrollable = _withNonScrollable2['default'];
exports['default'] = _ClosablePortal2['default'];
module.exports = exports['default'];
/***/ },
/* 32 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
exports['default'] = undefined;
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
var _class, _temp;
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _Portal = __webpack_require__(33);
var _Portal2 = _interopRequireDefault(_Portal);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { 'default': obj };
}
function _objectWithoutProperties(obj, keys) {
var target = {};for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];
}return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && ((typeof call === 'undefined' ? 'undefined' : _typeof(call)) === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass)));
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
// visible的逻辑放在Portal里实现会比较烦,因为没法利用React的update机制。
var ClosablePortal = (_temp = _class = function (_Component) {
_inherits(ClosablePortal, _Component);
function ClosablePortal() {
_classCallCheck(this, ClosablePortal);
return _possibleConstructorReturn(this, (ClosablePortal.__proto__ || Object.getPrototypeOf(ClosablePortal)).apply(this, arguments));
}
_createClass(ClosablePortal, [{
key: 'render',
value: function render() {
var _props = this.props,
visible = _props.visible,
portalProps = _objectWithoutProperties(_props, ['visible']);
return visible && _react2['default'].createElement(_Portal2['default'], portalProps);
}
}]);
return ClosablePortal;
}(_react.Component), _class.propTypes = {
visible: _react.PropTypes.bool
}, _class.defaultProps = {
visible: true
}, _temp);
exports['default'] = ClosablePortal;
module.exports = exports['default'];
/***/ },
/* 33 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
exports['default'] = undefined;
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
var _class, _temp;
var _react = __webpack_require__(3);
var _isEqual = __webpack_require__(34);
var _isEqual2 = _interopRequireDefault(_isEqual);
var _util = __webpack_require__(115);
var util = _interopRequireWildcard(_util);
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
} else {
var newObj = {};if (obj != null) {
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
}
}newObj['default'] = obj;return newObj;
}
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { 'default': obj };
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && ((typeof call === 'undefined' ? 'undefined' : _typeof(call)) === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass)));
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
/**
Portal的核心,只负责管理child。index.js实际export的不是这个component.
**/
var Portal = (_temp = _class = function (_Component) {
_inherits(Portal, _Component);
function Portal() {
_classCallCheck(this, Portal);
return _possibleConstructorReturn(this, (Portal.__proto__ || Object.getPrototypeOf(Portal)).apply(this, arguments));
}
_createClass(Portal, [{
key: 'componentDidMount',
// openPortal和closePortal之所以不暴露出去是因为这两个API的调用容易出BUG,有操作是异步的。
value: function componentDidMount() {
util.openPortal.call(this);
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
util.destroyPortal.call(this);
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
var _this2 = this;
if (this.pendingDestroy) {
// destroyPortal是异步的(原因看destroyPortal的代码),所以用callback的形式调用openPortal
util.destroyPortal.call(this, function () {
_this2.pendingDestroy = false;
util.openPortal.call(_this2);
});
} else {
util.openPortal.call(this);
}
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
// 如果selector变了的话,删除再重新打开
var selector = this.props.selector;
if (selector !== nextProps.selector) {
// 真正的工作是在componentDidUpdate里做的
this.pendingDestroy = true;
return;
}
// 如果children变了,直接重新render, react会判断是否有更新(即使这个是root节点)。
// 这个也是在componentDidUpdate里做的。
// 其它情况仅更新样式
var _props = this.props,
className = _props.className,
prefix = _props.prefix,
css = _props.css;
if (className !== nextProps.cla