UNPKG

tinper-bee

Version:

React Components living for enterprise-class pc backend application

516 lines (414 loc) 18.7 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("react"), require("prop-types"), require("react-dom")); else if(typeof define === 'function' && define.amd) define(["react", "prop-types", "react-dom"], factory); else { var a = typeof exports === 'object' ? factory(require("react"), require("prop-types"), require("react-dom")) : factory(root["React"], root["PropTypes"], root["ReactDOM"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_3__) { 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] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = 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; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 1024); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_0__; /***/ }), /***/ 1: /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_1__; /***/ }), /***/ 1024: /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(1025); /***/ }), /***/ 1025: /***/ (function(module, exports, __webpack_require__) { __webpack_require__(1026); module.exports = __webpack_require__(1027); /***/ }), /***/ 1026: /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /***/ 1027: /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _Affix = __webpack_require__(1028); var _Affix2 = _interopRequireDefault(_Affix); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } exports["default"] = _Affix2["default"]; module.exports = exports['default']; /***/ }), /***/ 1028: /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _react = __webpack_require__(0); var _react2 = _interopRequireDefault(_react); var _reactDom = __webpack_require__(3); var _reactDom2 = _interopRequireDefault(_reactDom); var _propTypes = __webpack_require__(1); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = __webpack_require__(4); var _classnames2 = _interopRequireDefault(_classnames); var _utils = __webpack_require__(1029); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return 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 === "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) : _defaults(subClass, superClass); } var propTypes = { container: _propTypes2["default"].object, offsetTop: _propTypes2["default"].number, horizontal: _propTypes2["default"].bool, target: _propTypes2["default"].func, //不对外开放,获取滚动scroll以及resize功能 onChange: _propTypes2["default"].func, //状态fixed或infixed时候调用 onTargetChange: _propTypes2["default"].func, //功能只有一个,时时刻刻输出state的状态 zIndex: _propTypes2["default"].number, canHidden: _propTypes2["default"].bool, childrenRef: _propTypes2["default"].object }; var defaultProps = { offsetTop: 0, horizontal: false, // container: document.body, target: function target() { return window; }, onChange: function onChange(affixed) { return {}; }, onTargetChange: function onTargetChange(state) { return {}; }, zIndex: 2, canHidden: false, childrenRef: null }; var Affix = function (_Component) { _inherits(Affix, _Component); function Affix(props) { _classCallCheck(this, Affix); var _this = _possibleConstructorReturn(this, _Component.call(this, props)); _this.getContainerDOM = function (nextProps) { var container = nextProps ? nextProps.container : _this.props.container; if (!container) { return document.body; } if (container != document.body) { return _reactDom2["default"].findDOMNode(container); } return container; }; _this.getInitPosition = function (nextProps, flag) { var container = _this.getContainerDOM(nextProps); // 20180927children是个变化,所以在nextprops要传入childrenRef,否则直接使用后面的语句 var thisElm = nextProps && nextProps.childrenRef && _reactDom2["default"].findDOMNode(nextProps.childrenRef) || _reactDom2["default"].findDOMNode(_this); _this.setState({ height: thisElm.offsetHeight, width: thisElm.offsetWidth, containerHeight: container.offsetHeight, containerWidth: container.offsetWidth }); var containerRect = container.getBoundingClientRect(); var thisElemRect = thisElm.getBoundingClientRect(); var top = thisElemRect.top, left = thisElemRect.left; var marginTop = top - containerRect.top; var marginLeft = left - containerRect.left; _this.setState({ top: top, left: left, initTop: flag ? top : _this.state.initTop, initLeft: flag ? left : _this.state.initLeft, marginTop: marginTop, marginLeft: marginLeft }); }; _this.handleTargetChange = function (evt, type) { var container = _this.getContainerDOM(); //是body var _container$getBoundin = container.getBoundingClientRect(), top = _container$getBoundin.top, left = _container$getBoundin.left; _this.setState({ top: top + _this.state.marginTop, //=0是临界值,滚动条使得屏幕顶端正好在affix上面,前者一直变化后者为不变 left: left + _this.state.marginLeft, //原理同上 containerHeight: container.offsetHeight, containerWidth: container.offsetWidth }); if (_this.state.top <= _this.props.offsetTop) { if (_this.state.affixed === false) { _this.props.onChange({ affixed: true, event: evt }); } _this.setState({ affixed: true }); //=true,calculate起作用 } if (_this.state.top > _this.props.offsetTop) { if (_this.state.affixed === true) { _this.props.onChange({ affixed: false, event: evt }); //新增还原样式 } _this.setState({ affixed: false }); } _this.props.onTargetChange(_this.state); _this.getInitPosition(undefined, false); }; _this.calculate = function () { var fixStyle = {}; var boxStyle = {}; //20171102修改,添加(this.state.top - this.state.marginTop == 0)的判断,谨防height+offsetTop >= containerHeight, handleTargetChange中的 //this.state.top <= this.props.offsetTop 恒成立,一直有position:affixed if (!_this.state.affixed || _this.state.top - _this.state.marginTop == 0) return { fixStyle: fixStyle, boxStyle: boxStyle }; var h = _this.state.top - _this.state.marginTop + _this.state.containerHeight - _this.state.height; if (_this.state.top < _this.props.offsetTop) { fixStyle = { position: "fixed", //修改20171102 去掉展示Affix全部内容,若是Affix内容高度大于container可展示,那么Affix只可展示部分 // top: this.props.canHidden ? ( h < 0 ? h : Math.min(h, this.props.offsetTop)) : ( h < 0 ? 0 : Math.min(h, this.props.offsetTop)), top: _this.props.canHidden ? h < 0 ? h : Math.min(h, _this.props.offsetTop) : _this.props.offsetTop, left: _this.props.horizontal ? _this.state.initLeft : _this.state.left, height: _this.state.height, width: _this.state.width, zIndex: _this.props.zIndex }; boxStyle = { height: _this.state.height }; } return { fixStyle: fixStyle, boxStyle: boxStyle }; }; _this.state = { affixed: false, initTop: 0, initLeft: 0, top: 0, //affix距离顶部的距离 left: 0, //affix距离左边的距离 marginTop: 0, //top - containerTop marginLeft: 0, //left - containerLeft height: 0, //affix的高度 width: 0, //affix的宽度 containerHeight: 0, //container的高度 containerWidth: 0, //container的宽度 containerId: "u-affix-container" + Math.random().toString(26).substring(2, 10) }; _this.calculate = _this.calculate.bind(_this); _this.getInitPosition = _this.getInitPosition.bind(_this); _this.getContainerDOM = _this.getContainerDOM.bind(_this); _this.handleTargetChange = _this.handleTargetChange.bind(_this); return _this; } Affix.prototype.componentDidMount = function componentDidMount() { this.getInitPosition(undefined, true); var listenTarget = this.props.target(); if (listenTarget) { (0, _utils.addEventListener)(listenTarget, 'resize', this.handleTargetChange); (0, _utils.addEventListener)(listenTarget, 'scroll', this.handleTargetChange); // listenTarget.addEventListener('resize', e=>this.handleTargetChange(e,'resize')) // listenTarget.addEventListener('scroll', e=>this.handleTargetChange(e,'scroll')) } }; Affix.prototype.componentWillUnmount = function componentWillUnmount() { var listenTarget = this.props.target(); if (listenTarget) { (0, _utils.removeEventListener)(listenTarget, 'resize', this.handleTargetChange); (0, _utils.removeEventListener)(listenTarget, 'scroll', this.handleTargetChange); // listenTarget.addEventListener('resize', e=>this.handleTargetChange(e,'resize')) // listenTarget.addEventListener('scroll', e=>this.handleTargetChange(e,'scroll')) } }; /** * 获取container * @return {[type]} [description] */ /** * 第一次 和 每次srcoll和resize也会执行该方法 * initTop,initLeft,marginTop,marginLeft都是不变的 * @return {[type]} [description] */ /** * [description]主要用于处理scroll以及reseize事件重新计算布局 * @param {[object]} evt [scroll或者resize事件] * 有两个函数:onChange 和 onTargetChange; */ /** * 只有上面的方法handleTargetChange使得affixed=ture才会执行 * @return {[type]} [description] */ Affix.prototype.render = function render() { var _calculate = this.calculate(), fixStyle = _calculate.fixStyle, boxStyle = _calculate.boxStyle; var _props = this.props, offsetTop = _props.offsetTop, horizontal = _props.horizontal, container = _props.container, target = _props.target, onChange = _props.onChange, onTargetChange = _props.onTargetChange, zIndex = _props.zIndex, canHidden = _props.canHidden, childrenRef = _props.childrenRef, others = _objectWithoutProperties(_props, ['offsetTop', 'horizontal', 'container', 'target', 'onChange', 'onTargetChange', 'zIndex', 'canHidden', 'childrenRef']); return _react2["default"].createElement( 'div', _extends({}, others, { className: (0, _classnames2["default"])("u-affix-container", this.props.className), id: this.state.containerId, style: boxStyle }), _react2["default"].createElement( 'div', { className: 'u-affix-content', style: fixStyle }, this.props.children ) ); }; return Affix; }(_react.Component); Affix.propTypes = propTypes; Affix.defaultProps = defaultProps; exports["default"] = Affix; module.exports = exports['default']; /***/ }), /***/ 1029: /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.addEventListener = addEventListener; exports.removeEventListener = removeEventListener; function addEventListener(target, eventType, callback, options) { if (target.addEventListener) { target.addEventListener(eventType, callback, options); } else if (target.attachEvent) { target.attachEvent("on" + eventType, callback); } } function removeEventListener(target, eventType, callback, options) { if (target.removeEventListener) { target.removeEventListener(eventType, callback, options); } else if (target.attachEvent) { target.detachEvent("on" + eventType, callback); } } /***/ }), /***/ 3: /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_3__; /***/ }), /***/ 4: /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! Copyright (c) 2017 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; if (argType === 'string' || argType === 'number') { classes.push(arg); } else if (Array.isArray(arg) && arg.length) { var inner = classNames.apply(null, arg); if (inner) { classes.push(inner); } } 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) { classNames.default = classNames; module.exports = classNames; } else if (true) { // 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; } }()); /***/ }) /******/ }); });