@bnorth/components
Version:
bnorth, components, react
750 lines (642 loc) • 31.8 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
_Object$defineProperty2(exports, "__esModule", {
value: true
});
exports.PanelItem = exports.PanelContainer = exports.default = void 0;
var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-properties"));
var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors"));
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols"));
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));
require("core-js/modules/es6.array.find-index");
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends"));
var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _classes = _interopRequireDefault(require("@bnorth/rich.css/lib/classes"));
var _animation = require("@bnorth/rich.css/lib/styles/animation");
var _BaseComponent5 = _interopRequireWildcard(require("./BaseComponent"));
function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return (0, _getOwnPropertyDescriptor.default)(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { ownKeys(source).forEach(function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; }
/**
* 小面板组件,基本的布局单位,其他组件一般使用该组件做基本组件
* @component
* @exportdefault
* @augments module:BaseComponent.BaseComponent
*/
var _Panel = function Panel(aprops) {
var _classSetPre;
if (aprops.component && aprops.component.isBnorth) {
var _Component = aprops.component,
_props = (0, _objectWithoutProperties2.default)(aprops, ["component"]);
return _react.default.createElement(_Component, _props);
}
var _BaseComponent = (0, _BaseComponent5.default)(aprops, _Panel),
main = _BaseComponent.main,
page = _BaseComponent.page,
full = _BaseComponent.full,
inline = _BaseComponent.inline,
panelContainerProps = _BaseComponent.panelContainerProps,
panelItemIndex = _BaseComponent.panelItemIndex,
panelItemCount = _BaseComponent.panelItemCount,
panelItemSelected = _BaseComponent.panelItemSelected,
panelItemPlain = _BaseComponent.panelItemPlain,
bTheme = _BaseComponent['b-theme'],
bStyle = _BaseComponent['b-style'],
bSize = _BaseComponent['b-size'],
classNameBase = _BaseComponent.classNameBase,
styleBase = _BaseComponent.styleBase,
classNameBaseProps = _BaseComponent.classNameBaseProps,
styleBaseProps = _BaseComponent.styleBaseProps,
classNamePre = _BaseComponent.classNamePre,
stylePre = _BaseComponent.stylePre,
classNameExt = _BaseComponent.classNameExt,
styleExt = _BaseComponent.styleExt,
className = _BaseComponent.className,
style = _BaseComponent.style,
_BaseComponent$panelT = _BaseComponent.panelThemeProps,
sensitiveBg = _BaseComponent$panelT.sensitiveBg,
sensitiveSelect = _BaseComponent$panelT.sensitiveSelect,
textOnBg = _BaseComponent$panelT.textOnBg,
bgOnHollow = _BaseComponent$panelT.bgOnHollow,
textOnBgSelected = _BaseComponent$panelT.textOnBgSelected,
textOnBgUnselected = _BaseComponent$panelT.textOnBgUnselected,
textUnselected = _BaseComponent$panelT.textUnselected,
_BaseComponent$compon = _BaseComponent.component,
Component = _BaseComponent$compon === void 0 ? aprops.componentPanel || "div" : _BaseComponent$compon,
componentPanel = _BaseComponent.componentPanel,
props = (0, _objectWithoutProperties2.default)(_BaseComponent, ["main", "page", "full", "inline", "panelContainerProps", "panelItemIndex", "panelItemCount", "panelItemSelected", "panelItemPlain", "b-theme", "b-style", "b-size", "classNameBase", "styleBase", "classNameBaseProps", "styleBaseProps", "classNamePre", "stylePre", "classNameExt", "styleExt", "className", "style", "panelThemeProps", "component", "componentPanel"]);
if (sensitiveBg === undefined) sensitiveBg = bStyle === 'solid' && bTheme;
if (sensitiveSelect === undefined) sensitiveSelect = bStyle === 'underline';
if (page) props['data-dock'] = true;
if (main && !props['data-b-edge-shadow']) props['data-b-edge-shadow'] = 'false';
var classSetPre = (_classSetPre = {
'offset-a-start square-full overflow-a-hidden': full
}, (0, _defineProperty3.default)(_classSetPre, page ? 'flex-display-inline' : 'display-inlineblock', inline), (0, _defineProperty3.default)(_classSetPre, (!inline ? 'flex-display-block' : '') + ' flex-direction-v bg-color-view', page), (0, _defineProperty3.default)(_classSetPre, 'scrollable-a- flex-sub-flex-extend', main), _classSetPre);
var styleSetPre = {};
var classSet = {};
var styleSet = {};
var textTheme;
if (sensitiveSelect) textTheme = sensitiveBg ? classNameBase.selected ? textOnBgSelected : textOnBgUnselected : classNameBase.selected ? bTheme || '' : textUnselected;
if (!sensitiveSelect) textTheme = sensitiveBg ? textOnBg : bTheme;
textTheme = textTheme ? textTheme === true ? '' : textTheme : false;
classSetPre['text-color-' + textTheme] = textTheme !== false;
classSetPre['text-size-' + (bSize === 'true' ? '' : bSize)] = bSize;
if (bStyle === 'solid') {
var theme = bTheme ? bTheme === true ? '' : bTheme : bTheme === false ? false : 'component';
classSetPre['bg-color-' + theme] = theme !== false;
classSetPre['border-set-a-' + theme] = theme !== false;
} else if (bStyle === 'hollow') {
var _theme = bTheme ? bTheme === true ? '' : bTheme : bTheme === false ? false : '';
classSetPre['border-set-a-' + _theme] = _theme !== false;
classSetPre[bgOnHollow === false ? 'bg-none-' : 'bg-color-' + (bgOnHollow === true ? '' : bgOnHollow)] = true;
} else if (bStyle === 'underline') {
var _theme2 = bTheme ? bTheme === true ? '' : bTheme : bTheme === false ? false : '';
classSetPre['border-none-top- border-none-left- border-none-right- bg-none-'] = true;
classSetPre['border-width-bottom-2'] = true;
classSetPre['border-set-bottom-' + _theme2] = _theme2 !== false;
if (!classNameBase.selected) styleSetPre['borderColor'] = 'transparent';
} else if (bStyle === 'white') {
classSetPre['bg-color-white'] = true;
} else if (bStyle === 'mask') {
classSetPre['bg-color-mask'] = true;
} else if (bStyle === 'plain') {
classSetPre['border-none-top- border-none-bottom- border-none-left- border-none-right- bg-none-'] = true;
}
return _react.default.createElement(Component, (0, _extends2.default)({
className: (0, _classes.default)(classNameBase, classSetPre, classNamePre, classSet, classNameBaseProps, className, classNameExt),
style: _objectSpread({}, styleBase, {}, styleSetPre, {}, stylePre, {}, styleSet, {}, styleBaseProps, {}, style, {}, styleExt)
}, props));
};
_Panel.defaultProps = {};
_Panel.defaultProps.panelThemeProps = {
sensitiveBg: undefined,
// 设置为有背景状态
sensitiveSelect: undefined,
// 设置为字体主题响应是否选中状态
textUnselected: 'disable',
// 设置文本主题,在无背景和在未选择状态下
textOnBg: 'white',
// 设置文本主题,在有背景的面板上时
textOnBgSelected: 'white',
// 设置文本主题,在有背景和在选择状态下
textOnBgUnselected: 'disable',
// 设置文本主题,在有背景和在未选择状态下
bgOnHollow: 'white' // 设置背景主题,在镂空样式时
/**
* 设置为主模式,将开启 flex extend 样式和滚动样式
* @attribute module:Panel.Panel.page
* @type {boolean}
*/
/**
* 设置为主模式,将开启 flex extend 样式和滚动样式
* @attribute module:Panel.Panel.main
* @type {boolean}
*/
/**
* 设置为主模式,将开启 flex extend 样式和滚动样式
* @attribute module:Panel.Panel.full
* @type {boolean}
*/
/**
* 设为为 inline 模式,将开启 display inline 样式
* @attribute module:Panel.Panel.inline
* @type {boolean}
*/
/**
* 设置样式主题,根据 richcss color 的设置
* @attribute module:Panel.Panel.b-theme
* @type {string}
*/
/**
* 设置样式风格,包括 plain,solid,hollow,underline
* @attribute module:Panel.Panel.b-style
* @type {string}
*/
/**
* 设置样式尺寸,设置文本的字体大小,根据 richcss textSize 的配置
* @attribute module:Panel.Panel.b-size
* @type {string}
*/
};
(0, _defineProperty2.default)(_Panel, "Panel", {
get: function get() {
return _Panel;
},
set: function set(val) {
_Panel = val;
}
});
var _default = _Panel;
exports.default = _default;
var positionToDirection = {
left: 'h',
right: 'hv',
top: 'v',
bottom: 'vv'
/**
* 扩展小面板组件,提供了容器的能力,可管理子组件,
*
* 容器内的子组件会被容器进行属性设置,如果希望特殊子组件不接受容器组件设置,子组件需要包含 panelItemPlain 属性
* @component
* @augments module:BaseComponent.BaseComponent
* @augments module:Panel.Panel
*/
};
var _PanelContainer =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(PanelContainer, _React$Component);
function PanelContainer() {
(0, _classCallCheck2.default)(this, PanelContainer);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(PanelContainer).apply(this, arguments));
}
(0, _createClass2.default)(PanelContainer, [{
key: "render",
value: function render() {
var _objectSpread5;
var _BaseComponent2 = (0, _BaseComponent5.default)(this.props, _PanelContainer),
ctype = _BaseComponent2.ctype,
selectedIndex = _BaseComponent2.selectedIndex,
countToShow = _BaseComponent2.countToShow,
onSelectedChange = _BaseComponent2.onSelectedChange,
panelContainerProps = _BaseComponent2.panelContainerProps,
inline = _BaseComponent2.inline,
position = _BaseComponent2.position,
direction = _BaseComponent2.direction,
justify = _BaseComponent2.justify,
align = _BaseComponent2.align,
wrap = _BaseComponent2.wrap,
separator = _BaseComponent2.separator,
separatorProps = _BaseComponent2.separatorProps,
noOverlap = _BaseComponent2.noOverlap,
genPanelItemProps = _BaseComponent2.genPanelItemProps,
panelItemProps = _BaseComponent2.panelItemProps,
getPanelItemProps = _BaseComponent2.getPanelItemProps,
getPanelItemClassName = _BaseComponent2.getPanelItemClassName,
getPanelItemStyle = _BaseComponent2.getPanelItemStyle,
classNamePre = _BaseComponent2.classNamePre,
children = _BaseComponent2.children,
props = (0, _objectWithoutProperties2.default)(_BaseComponent2, ["ctype", "selectedIndex", "countToShow", "onSelectedChange", "panelContainerProps", "inline", "position", "direction", "justify", "align", "wrap", "separator", "separatorProps", "noOverlap", "genPanelItemProps", "panelItemProps", "getPanelItemProps", "getPanelItemClassName", "getPanelItemStyle", "classNamePre", "children"]);
children = _react.default.Children.toArray(children).filter(function (v) {
return v;
});
children = !separator ? children : children.reduce(function (v1, v2, i, a) {
if (i > 0) v1.push(_react.default.createElement(_Panel, (0, _extends2.default)({
key: 'sep' + i,
panelItemPlain: true,
inline: true,
"b-theme": "border",
"b-size": "lg",
classNamePre: 'flex-sub-flex-none flex-display-inline flex-align-center flex-justify-center'
}, separatorProps), _react.default.createElement("span", null, "|")));
v1.push(v2);
return v1;
}, []);
var aindex = children.findIndex(function (v) {
return (0, _typeof2.default)(v) === 'object' && v.props.panelItemSelected;
});
selectedIndex = aindex >= 0 ? aindex : selectedIndex;
var panelItemCount = children.filter(function (v) {
return (0, _typeof2.default)(v) === 'object' && !v.props.panelItemPlain;
}).length;
var panelItemIndex = -1;
children = children.map(function (v) {
return (0, _typeof2.default)(v) !== 'object' || v.props.panelItemPlain ? v : _react.default.createElement(_PanelItem, genPanelItemProps(ctype, selectedIndex, panelContainerProps, ++panelItemIndex, panelItemCount, v.props, panelItemProps, getPanelItemClassName, getPanelItemStyle, getPanelItemProps), v);
});
var classSetPre = {
'overflow-a-hidden': true
};
if (ctype === 'single') {
children = children.filter(function (v) {
return v.props.panelItemSelected;
});
props.inline = inline;
} else if (ctype === 'justify') {
var _objectSpread2;
classSetPre = _objectSpread({}, classSetPre, (_objectSpread2 = {}, (0, _defineProperty3.default)(_objectSpread2, 'flex-display-' + (inline ? 'inline' : 'block'), true), (0, _defineProperty3.default)(_objectSpread2, 'flex-justify-around flex-align-stretch', true), _objectSpread2));
} else if (ctype === 'primary') {
var _objectSpread3;
classSetPre = _objectSpread({}, classSetPre, (_objectSpread3 = {}, (0, _defineProperty3.default)(_objectSpread3, 'flex-display-' + (inline ? 'inline' : 'block'), true), (0, _defineProperty3.default)(_objectSpread3, 'flex-align-center', true), _objectSpread3));
} else if (ctype === 'flex') {
classSetPre = _objectSpread({}, classSetPre, (0, _defineProperty3.default)({}, 'flex-display-' + (inline ? 'inline' : 'block'), true));
} else if (ctype === 'scroll') {
children = _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_InnerScroll, {
countToShow: countToShow,
selectedIndex: selectedIndex,
onSelectedChange: onSelectedChange
}, children.filter(function (v) {
return (0, _typeof2.default)(v) === 'object' && !v.props.panelItemPlain;
})), children.filter(function (v) {
return (0, _typeof2.default)(v) === 'object' && v.props.panelItemPlain;
}));
}
if (position) direction = positionToDirection[position];
classSetPre = _objectSpread({}, classSetPre, (_objectSpread5 = {}, (0, _defineProperty3.default)(_objectSpread5, 'flex-direction-' + direction, direction), (0, _defineProperty3.default)(_objectSpread5, 'flex-justify-' + justify, justify), (0, _defineProperty3.default)(_objectSpread5, 'flex-align-' + align, align), (0, _defineProperty3.default)(_objectSpread5, 'flex-wrap-' + wrap, wrap), _objectSpread5));
return _react.default.createElement(_Panel, (0, _extends2.default)({
classNamePre: (0, _classes.default)(classSetPre, classNamePre)
}, props), children);
}
}]);
return PanelContainer;
}(_react.default.Component);
exports.PanelContainer = _PanelContainer;
_PanelContainer.isBnorth = true;
_PanelContainer.defaultProps = {};
/**
* 设置子组件的排列类型,包括:
*
* - single: 仅 selected 属性为真的子组件显示
* - justify: 平分组件
* - primary: 仅 subTypePrimary 属性的子组件扩展,其他组件保持不延展不压缩
* - flex: 普通 flex 布局
* - scroll: 滑动布局
*
* @attribute module:Panel~PanelContainer.ctype
* @type {string}
*/
_PanelContainer.defaultProps.selectedIndex = 0;
_PanelContainer.defaultProps.countToShow = 1;
/**
* 设置组件的 flex direction 属性,参见 rich.css
* @attribute module:Panel~PanelContainer.direction
* @type {string}
*/
/**
* 设置组件的 flex justify 属性,参见 rich.css
* @attribute module:Panel~PanelContainer.justify
* @type {string}
*/
/**
* 设置组件的 flex align 属性,参见 rich.css
* @attribute module:Panel~PanelContainer.align
* @type {string}
*/
/**
* 设置组件的 flex wrap 属性,参见 rich.css
* @attribute module:Panel~PanelContainer.wrap
* @type {string}
*/
/**
* 统一设置子组件的属性
* @attribute module:Panel~PanelContainer.panelItemProps
* @type {object}
*/
/**
* 获取子组件样式类的回调函数
* @callback ItemGetClassNameCallback
* @param {object} panelItemProps - 子组件属性
* @param {object} containerProps - 容器组件的属
* @returns {string|object|array} 样式字符串,样式对象或者样式类数组,具体参见 rich.css classes 函数
*/
/**
* 设置获取子组件的样式类的回到函数
* @attribute module:Panel~PanelContainer.getPanelItemClassName
* @type {module:Panel~ItemGetClassNameCallback}
*/
/**
* 获取子组件样式对象的回调函数
* @callback ItemGetStyleCallback
* @param {object} panelItemProps - 子组件属性
* @param {object} containerProps - 容器组件的属
* @returns {object} 样式表对象
*/
/**
* 设置子组件的样式对象的回调函数
* @attribute module:Panel~PanelContainer.getPanelItemStyle
* @type {module:Panel~ItemGetStyleCallback}
*/
/**
* 获取子组件属性的回调函数
* @callback ItemGetPropsCallback
* @param {object} panelItemProps - 子组件属性
* @param {object} containerProps - 容器组件的属性
* @returns {object} 属性对象
*/
/**
* 设置获取子组件的属性的回调函数
* @attribute module:Panel~PanelContainer.getPanelItemProps
* @type {module:Panel~ItemGetPropsCallback}
*/
/**
* 子组件属性计算函数
* panelItemProps < props < |getPanelItemXXX<panelItemProps<props| < getPanelItemProps
*/
_PanelContainer.defaultProps.genPanelItemProps = function (type, selectedIndex, panelContainerProps, panelItemIndex, panelItemCount) {
var _ref = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {},
className = _ref.className,
style = _ref.style,
props = (0, _objectWithoutProperties2.default)(_ref, ["className", "style"]);
var _ref2 = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {},
panelItemClassName = _ref2.className,
panelItemStyle = _ref2.style,
panelItemProps = (0, _objectWithoutProperties2.default)(_ref2, ["className", "style"]);
var getPanelItemClassName = arguments.length > 7 ? arguments[7] : undefined;
var getPanelItemStyle = arguments.length > 8 ? arguments[8] : undefined;
var getPanelItemProps = arguments.length > 9 ? arguments[9] : undefined;
var ret = _objectSpread({
key: panelItemIndex,
panelContainerType: type,
panelContainerProps: panelContainerProps,
panelItemIndex: panelItemIndex,
panelItemCount: panelItemCount,
panelItemSelected: selectedIndex === panelItemIndex
}, panelItemProps, {}, props);
ret.style = _objectSpread({}, getPanelItemStyle && getPanelItemStyle(ret, panelContainerProps) || {}, {}, panelItemStyle, {}, style);
ret.className = (0, _classes.default)(getPanelItemClassName && getPanelItemClassName(ret, panelContainerProps), panelItemClassName, className);
return _objectSpread({}, ret, {}, getPanelItemProps && getPanelItemProps(ret, panelContainerProps) || {});
};
(0, _defineProperty2.default)(_Panel, "Container", {
get: function get() {
return _PanelContainer;
},
set: function set(val) {
exports.PanelContainer = _PanelContainer = val;
}
});
/**
* 带容器能力的小面板组件的子组件
* @component
*/
var _PanelItem = function PanelItem(aprops) {
var _BaseComponent3 = (0, _BaseComponent5.default)(aprops, _PanelItem),
panelContainerType = _BaseComponent3.panelContainerType,
_BaseComponent3$panel = _BaseComponent3.panelContainerProps,
panelContainerProps = _BaseComponent3$panel === void 0 ? {} : _BaseComponent3$panel,
panelItemIndex = _BaseComponent3.panelItemIndex,
panelItemCount = _BaseComponent3.panelItemCount,
panelItemSelected = _BaseComponent3.panelItemSelected,
panelItemPlain = _BaseComponent3.panelItemPlain,
className = _BaseComponent3.className,
children = _BaseComponent3.children,
props = (0, _objectWithoutProperties2.default)(_BaseComponent3, ["panelContainerType", "panelContainerProps", "panelItemIndex", "panelItemCount", "panelItemSelected", "panelItemPlain", "className", "children"]);
if (panelItemPlain) return children;
var classSet = [];
if (panelContainerType === 'single') classSet.push('offset-a-start square-full overflow-a-hidden');
if (panelContainerType === 'justify') classSet.push('flex-sub-flex-extend');
if (panelContainerType === 'primary') classSet.push(panelItemSelected ? 'flex-sub-flex-extend' : 'flex-sub-flex-none');
if (panelContainerType === 'scroll') classSet.push('flex-sub-flex-extend height-full');
if (panelContainerProps.noOverlap && panelItemIndex < panelItemCount - 1) classSet.push('border-none-right-');
return (0, _react.cloneElement)(children, _objectSpread({
className: (0, _classes.default)(classSet, className),
panelContainerProps: panelContainerProps,
panelItemIndex: panelItemIndex,
panelItemCount: panelItemCount,
panelItemSelected: panelItemSelected,
panelItemPlain: panelItemPlain
}, props));
};
exports.PanelItem = _PanelItem;
_PanelItem.isBnorth = true;
_PanelItem.defaultProps = {};
/**
* 容器组件的组织类型
* @attribute module:Panel~PanelItem.panelContainerType
*/
/**
* 组件在容器中的索引
* @attribute module:Panel~PanelItem.panelItemIndex
* @type {number}
*/
/**
* 容器中子组件的数量
* @attribute module:Panel~PanelItem.panelItemCount
* @type {number}
*/
/**
* 组件为容器中选中组件
* @attribute module:Panel~PanelItem.panelItemSelected
* @type {boolean}
*/
/**
* 组件不接受容器管理
* @attribute module:Panel~PanelItem.panelItemPlain
* @type {boolean}
*/
/**
* 容器组件的属性
* @attribute module:Panel~PanelItem.panelContainerProps
* @type {object}
*/
(0, _defineProperty2.default)(_Panel, "ContainerItem", {
get: function get() {
return _PanelItem;
},
set: function set(val) {
exports.PanelItem = _PanelItem = val;
}
});
/**
* 容器内部的滑动组件
* @component
* @private
* @augments module:BaseComponent.BaseComponent
* @augments module:Panel.Panel
* @augments module:Touchable.Touchable
*/
var _InnerScroll =
/*#__PURE__*/
function (_React$Component2) {
(0, _inherits2.default)(InnerScroll, _React$Component2);
function InnerScroll() {
(0, _classCallCheck2.default)(this, InnerScroll);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(InnerScroll).apply(this, arguments));
}
(0, _createClass2.default)(InnerScroll, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this = this;
var _this$props = this.props,
countToShow = _this$props.countToShow,
selectedIndex = _this$props.selectedIndex,
children = _this$props.children;
var node = (0, _BaseComponent5.domFindNode)(this);
this.size = node.clientWidth * countToShow / children.length;
var val = -(this.size / countToShow) * (selectedIndex % children.length);
node.scrollableLeft = -val;
node.scrollableWidth = node.clientWidth;
if (_BaseComponent5.domIsMouse) {
(0, _BaseComponent5.domFindNode)(this).addEventListener("mousedown", function (event) {
_this.mark = false;
}, true);
(0, _BaseComponent5.domFindNode)(this).addEventListener("click", function (event) {
if (_this.mark) {
event.stopPropagation();
_this.mark = false;
}
}, true);
}
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
var _this$props2 = this.props,
selectedIndex = _this$props2.selectedIndex,
countToShow = _this$props2.countToShow,
children = _this$props2.children;
var node = (0, _BaseComponent5.domFindNode)(this);
this.size = node.clientWidth * countToShow / children.length;
var val = -(this.size / countToShow) * (selectedIndex % children.length);
node.scrollableLeft = -val;
node.scrollableWidth = node.clientWidth;
}
}, {
key: "handleStart",
value: function handleStart(e) {
var _this2 = this;
var _this$props3 = this.props,
selectedIndex = _this$props3.selectedIndex,
countToShow = _this$props3.countToShow,
onSelectedChange = _this$props3.onSelectedChange,
children = _this$props3.children;
var node = (0, _BaseComponent5.domFindNode)(this);
var x = _BaseComponent5.domIsMouse ? e.clientX : e.touches[0].clientX;
var y = _BaseComponent5.domIsMouse ? e.clientY : e.touches[0].clientY;
var offsetX, offsetY, moved, ignore;
if (!node.scrollable) {
node.scrollable = 'x';
node.scrollableWidth = node.clientWidth * children.length;
node.scrollableLeft = selectedIndex * node.clientWidth;
}
var handleMove = function handleMove(e) {
offsetX = (_BaseComponent5.domIsMouse ? e.clientX : e.touches[0].clientX) - x;
offsetY = (_BaseComponent5.domIsMouse ? e.clientY : e.touches[0].clientY) - y;
if (ignore === undefined) {
if (Math.abs(offsetY) > Math.abs(offsetX)) {
handleEnd();
return;
}
ignore = false;
}
moved = true;
var val = -(_this2.size / countToShow) * (selectedIndex % children.length) + (offsetX || 0);
val = Math.min(0, val);
val = Math.max(-(children.length - 1) * _this2.size, val);
var style = (0, _animation.transform)('translate3D', val + 'px', 0, 0);
(0, _entries.default)(style).forEach(function (_ref3) {
var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
k = _ref4[0],
v = _ref4[1];
return node.style[k] = v;
});
node.scrollableLeft = -val;
if (selectedIndex === 0 && offsetX > 0 || selectedIndex === children.length - 1 && offsetX < 0) {} else {
e.stopPropagation(); // e.preventDefault();
}
};
var handleEnd = function handleEnd(e) {
node.removeEventListener(_BaseComponent5.domIsMouse ? 'mousemove' : 'touchmove', handleMove);
node.removeEventListener(_BaseComponent5.domIsMouse ? 'mouseup' : 'touchend', handleEnd);
!_BaseComponent5.domIsMouse && node.removeEventListener('touchcancel', handleEnd);
if (!moved) return;
var val = -(_this2.size / countToShow) * (selectedIndex % children.length);
var style = (0, _animation.transform)('translate3D', val + 'px', 0, 0);
(0, _entries.default)(style).forEach(function (_ref5) {
var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
k = _ref6[0],
v = _ref6[1];
return node.style[k] = v;
});
node.scrollableLeft = -val;
if (onSelectedChange) {
var aindex = selectedIndex - Math.round((offsetX || 0) * children.length / (countToShow * node.clientWidth));
aindex = Math.min(aindex, children.length - 1);
aindex = Math.max(aindex, 0);
if (selectedIndex !== aindex) onSelectedChange(aindex, children[aindex].props);
}
if (_BaseComponent5.domIsMouse) _this2.mark = true;
};
var eventOption = (0, _BaseComponent5.domPassiveSupported)() ? {
passive: true
} : false;
node.addEventListener(_BaseComponent5.domIsMouse ? 'mousemove' : 'touchmove', handleMove, eventOption);
node.addEventListener(_BaseComponent5.domIsMouse ? 'mouseup' : 'touchend', handleEnd, eventOption);
!_BaseComponent5.domIsMouse && node.addEventListener('touchcancel', handleEnd, eventOption);
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _BaseComponent4 = (0, _BaseComponent5.default)(this.props, _InnerScroll),
countToShow = _BaseComponent4.countToShow,
selectedIndex = _BaseComponent4.selectedIndex,
onSelectedChange = _BaseComponent4.onSelectedChange,
children = _BaseComponent4.children,
props = (0, _objectWithoutProperties2.default)(_BaseComponent4, ["countToShow", "selectedIndex", "onSelectedChange", "children"]);
children = _react.default.Children.toArray(children);
var classNamePre = 'flex-display-block flex-align-stretch height-full transition-set- overflow-x-hidden';
var stylePre = _objectSpread({
width: "".concat(100 / countToShow * children.length, "%")
}, (0, _animation.transform)('translateX', -(this.size / countToShow) * (selectedIndex % children.length) + 'px'));
return _react.default.createElement(_Panel, (0, _extends2.default)({}, (0, _defineProperty3.default)({}, _BaseComponent5.domIsMouse ? 'onMouseDown' : 'onTouchStart', function (e) {
return _this3.handleStart(e);
}), {
classNamePre: classNamePre,
stylePre: stylePre
}, props), children);
}
}]);
return InnerScroll;
}(_react.default.Component);
_InnerScroll.isBnorth = true;
_InnerScroll.defaultProps = {};
(0, _defineProperty2.default)(_Panel, "InnerScroll", {
get: function get() {
return _InnerScroll;
},
set: function set(val) {
_InnerScroll = val;
}
});