UNPKG

zent

Version:

一套前端设计语言和基于React的实现

314 lines (239 loc) 9.47 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _pop = require('../../pop'); var _pop2 = _interopRequireDefault(_pop); var _pick = require('lodash/pick'); var _pick2 = _interopRequireDefault(_pick); var _reactDnd = require('react-dnd'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var COMPONENT = 'component'; var DesignPreviewController = function (_ref) { (0, _inherits3['default'])(DesignPreviewController, _ref); function DesignPreviewController() { var _ref2; var _temp, _this, _ret; (0, _classCallCheck3['default'])(this, DesignPreviewController); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = (0, _possibleConstructorReturn3['default'])(this, (_ref2 = DesignPreviewController.__proto__ || Object.getPrototypeOf(DesignPreviewController)).call.apply(_ref2, [this].concat(args))), _this), _this.onSelect = function (evt) { var editable = _this.props.editable; if (!editable) { return; } _this.invokeCallback('onSelect', evt, false); }, _this.onEdit = function (evt) { _this.invokeCallback('onEdit', evt, true); }, _this.onAdd = function (evt) { _this.invokeCallback('onAdd', evt, true); }, _this.onDelete = function () { _this.invokeCallback('onDelete', null, true); }, _temp), (0, _possibleConstructorReturn3['default'])(_this, _ret); } (0, _createClass3['default'])(DesignPreviewController, [{ key: 'render', value: function render() { var _cx; var _props = this.props, dragable = _props.dragable, configurable = _props.configurable, highlightWhenSelect = _props.highlightWhenSelect, isSelected = _props.isSelected, isDragging = _props.isDragging, connectDragSource = _props.connectDragSource, connectDropTarget = _props.connectDropTarget, PreviewComponent = _props.component, previewProps = _props.previewProps, prefix = _props.prefix; var cls = (0, _classnames2['default'])(prefix + '-design-preview-controller', (_cx = {}, (0, _defineProperty3['default'])(_cx, prefix + '-design-preview-controller--selected', isSelected), (0, _defineProperty3['default'])(_cx, prefix + '-design-preview-controller--highlight', highlightWhenSelect), (0, _defineProperty3['default'])(_cx, prefix + '-design-preview-controller--dragable', dragable), _cx)); var props = (0, _pick2['default'])(this.props, ['value', 'design', 'globalConfig']); var style = { opacity: isDragging ? 0 : 1 }; var tree = _react2['default'].createElement( 'div', { className: cls, style: style, onClick: this.onSelect }, _react2['default'].createElement(PreviewComponent, (0, _extends3['default'])({ prefix: prefix }, previewProps, props)), configurable && _react2['default'].createElement(Actions, { prefix: prefix, onEdit: this.onEdit, onAdd: this.onAdd, onDelete: this.onDelete }) ); if (!dragable) { return tree; } return connectDragSource(connectDropTarget(tree)); } }, { key: 'invokeCallback', value: function invokeCallback(action, evt, stopPropagation) { if (stopPropagation && evt) { evt.stopPropagation(); } var value = this.props.value; var cb = this.props[action]; cb && cb(value); } }]); return DesignPreviewController; }(_react.PureComponent || _react.Component); DesignPreviewController.propTypes = { // 这个组件所在位置的下标 index: _propTypes2['default'].number.isRequired, // 是否可以编辑,UMP里面有些地方config是不能编辑的 editable: _propTypes2['default'].bool, // 组件是否可以拖拽 dragable: _propTypes2['default'].bool, // 是否显示右下角的编辑区域 configurable: _propTypes2['default'].bool, // 选中时是否高亮 highlightWhenSelect: _propTypes2['default'].bool, // 当前是否选中 isSelected: _propTypes2['default'].bool.isRequired, // 这个组件对应的值 value: _propTypes2['default'].object.isRequired, // 选中的会掉函数 onSelect: _propTypes2['default'].func.isRequired, // 编辑的回调函数 onEdit: _propTypes2['default'].func.isRequired, // 添加新组件的回调函数 onAdd: _propTypes2['default'].func.isRequired, // 删除组件的回调函数 onDelete: _propTypes2['default'].func.isRequired, // 拖拽时移动组件的回调函数 onMove: _propTypes2['default'].func.isRequired, // design 组件暴露的方法 design: _propTypes2['default'].object.isRequired, // 用来渲染预览的组件 component: _propTypes2['default'].func.isRequired, // 自定义配置 globalConfig: _propTypes2['default'].object, // preview 额外的 props previewProps: _propTypes2['default'].object, prefix: _propTypes2['default'].string }; DesignPreviewController.defaultProps = { prefix: 'zent' }; var dndSource = { canDrag: function canDrag(props) { return props.dragable; }, beginDrag: function beginDrag(props) { return { index: props.index }; } }; var dndTarget = { hover: function hover(props, monitor, component) { var dragIndex = monitor.getItem().index; var hoverIndex = props.index; // Don't replace items with themselves if (dragIndex === hoverIndex) { return; } // Determine rectangle on screen var hoverBoundingRect = (0, _reactDom.findDOMNode)(component).getBoundingClientRect(); // Get vertical middle var hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; // Determine mouse position var clientOffset = monitor.getClientOffset(); // Get pixels to the top var hoverClientY = clientOffset.y - hoverBoundingRect.top; // Only perform the move when the mouse has crossed half of the items height // When dragging downwards, only move when the cursor is below 50% // When dragging upwards, only move when the cursor is above 50% // Dragging downwards if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { return; } // Dragging upwards if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { return; } // Time to actually perform the action props.onMove(dragIndex, hoverIndex); // Note: we're mutating the monitor item here! // Generally it's better to avoid mutations, // but it's good here for the sake of performance // to avoid expensive index searches. monitor.getItem().index = hoverIndex; } }; function Actions(_ref3) { var onEdit = _ref3.onEdit, onAdd = _ref3.onAdd, onDelete = _ref3.onDelete, prefix = _ref3.prefix; return _react2['default'].createElement( 'div', { className: prefix + '-design-preview-controller__actions' }, _react2['default'].createElement( 'button', { onClick: onEdit, className: prefix + '-design-preview-controller__action-btn' }, '\u7F16\u8F91' ), _react2['default'].createElement( 'button', { onClick: onAdd, className: prefix + '-design-preview-controller__action-btn' }, '\u52A0\u5185\u5BB9' ), _react2['default'].createElement( _pop2['default'], { content: '\u786E\u5B9A\u5220\u9664\uFF1F', trigger: 'click', position: 'left-center', centerArrow: true, onConfirm: onDelete }, _react2['default'].createElement( 'button', { className: prefix + '-design-preview-controller__action-btn' }, '\u5220\u9664' ) ) ); } /* eslint-disable new-cap, no-use-before-define */ exports['default'] = (0, _reactDnd.DropTarget)(COMPONENT, dndTarget, function (connect) { return { connectDropTarget: connect.dropTarget() }; })((0, _reactDnd.DragSource)(COMPONENT, dndSource, function (connect, monitor) { return { connectDragSource: connect.dragSource(), isDragging: monitor.isDragging() }; })(DesignPreviewController)); /* eslint-enable new-cap, no-use-before-define */