@6thquake/react-material
Version:
React components that implement Google's Material Design.
396 lines (321 loc) • 14.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
var _icons = require("@material-ui/icons");
var _reactDnd = require("react-dnd");
var _GridList = _interopRequireDefault(require("../GridList"));
var _GridListTile = _interopRequireDefault(require("../GridListTile"));
var _GridListTileBar = _interopRequireDefault(require("../GridListTileBar"));
var _DragAndDrop = require("../DragAndDrop");
var _reResizable = _interopRequireDefault(require("re-resizable"));
var _withDragAndDrop = _interopRequireDefault(require("../DragAndDrop/withDragAndDrop"));
/**
* @ignore - do not document.
*/
/*
需要get到penal的clientOffset xy
*/
/*
flex布局 分为12份
将总宽度 eg 1000px/12 得到每一栅格的宽度 perflex
将组件宽度Math.round(300px/perflex) 得到所占的栅格数 flexCount
得到组件新的宽度 flexCount/12
cellSize int //每个网格的宽度
*/
var myCellSize = 50;
var defaultColsCount = 12;
var defaultPanelSize = {
width: 650,
height: 600
};
var styles = {
root: {
minWidth: '100px',
minHeight: '100px',
position: 'relative',
backgroundImage: 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAAEH5aXCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQzODRDNjY1OTEyMTFFODkwMDFEODY0QTdDMDVBRTMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQzODRDNjU1OTEyMTFFODkwMDFEODY0QTdDMDVBRTMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MzJDMUZEQTU3NzYxMUU4OTEwMkY1OEVDQkZDMUIzNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2MzJDMUZEQjU3NzYxMUU4OTEwMkY1OEVDQkZDMUIzNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpaCGOAAAAFLSURBVHjaYpDXMJT6//8/AymYiYEMMKppVBMVNAEEECMoAdLUllENoxpwAIAAYiCntKRL6UqXvDdqyaglo5YMUUsAAojkinM0TkYtGbVk1JJRS0YtGbVk1JJRSwavJQAB2K9jEwBgEAiATaawSps2+w8nWeLBcILfn18ZeUwTm7nWN7WDgICAgICAgICAgICAgICATJ/1Yp9b0yEtALt2TAMAAIAwzL9rNOwlxUEPHoKBTkdAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBSbh50E6C9O7QBAIQBIAgJ+4+GxaKYg1TUdoDmXlVzqWvCjAu6GO7Zb8iKCAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiAAPEEQFS0cmjxn2mDPp5bn+8Ii2+BAAAAAElFTkSuQmCC")',
backgroundSize: "".concat(myCellSize, "px ").concat(myCellSize, "px")
},
resize: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
borderTop: '1px solid rgba(0,0,0,0.1)',
borderRight: '1px solid rgba(0,0,0,0.1)',
borderBottom: '1px solid rgba(0,0,0,0.1)' // border: 'solid 1px #ddd',
// background: '#f0f0f0',
},
resizeInnerWrap: {
height: '100%',
width: '100%',
overflow: 'visible',
'&> ul': {
overflow: 'visible' // backgroundImage:'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAAEH5aXCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA0xpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjMyQzFGREI1Nzc2MTFFODkxMDJGNThFQ0JGQzFCMzQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NjMyQzFGREE1Nzc2MTFFODkxMDJGNThFQ0JGQzFCMzQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmRkNzZhNTk4LTllZWYtMTE3Yi1hNWRmLWM5MWVjYTRjYTk3ZCIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmRkNzZhNTk4LTllZWYtMTE3Yi1hNWRmLWM5MWVjYTRjYTk3ZCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhWNmR8AAAE6SURBVHjaYmRkZGQgFTAxkAFGNY1qooImgABiJDXBMtHcWaMaRooGgABiJKe0pEu2GLVk1JJRS0YtwQ0AAogeZZf8aJyMWjJqyaglo5aMWjJqyaglo5bQxxKAAOzXQQkAAAgDwI897N9SUwyUGyzA4cdFhmkgmQfyzdlBQEBAQEBAQEBAQEBAQEBAzqe2/QEyArBrxzQAAAAIw/y7RsNeUhz04CEY6HQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQk5eZBNwHauWMaAIAQCILFI+D9qyWhxQC5zFoYygsVsqBLaA7qATnTBwJEQIAICBABASIgQIAAERAgAgJEQIAICBAgQAQEiIAAERAgAgJEQAQEiIAAERAgAgJEQAQEiIAAERAgAgJEQLRAYj6xpdSuGwYph8fsCgAAAABJRU5ErkJggg==")',
// backgroundSize: myCellSize+'px '+myCellSize+'px',
// overflow: 'visible'
}
},
gridListTile: {
'@global div': {
overflow: 'visible'
},
transition: 'all 0.5s cubic-bezier(.23,.66,.37,.8)'
},
dragsourceResizeable: {
background: 'rgba(0,0,0,0.1)',
margin: '1px',
'&:hover': {
border: '1px dashed rgba(0,0,0,0.1)',
borderRedius: '3px'
}
}
};
var boxTarget = {
drop: function drop(props, monitor, component) {
console.log('drop.......');
var item = monitor.getItem();
console.log(item);
if (!item.component) {
// 当comp不是从panel外部拉入
component.hasDroped = true;
}
if (!item.component) {
// 如果没有component 说明不是从外部拖进来的 不予处理
return;
} // 取到drop时的xy坐标,
// 计算出栅格的坐标值,
if (!component.state.childComponents) {
component.state.childComponents = [];
}
component.state.childComponents.push({
component: item.component,
size: [item.component.props.cols, item.component.props.rows]
});
component.setState({
childComponents: component.state.childComponents
});
},
hover: function hover(props, monitor, component) {// console.log('now hover');
}
};
var _Panel =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(_Panel, _React$Component);
function _Panel(props) {
var _this;
(0, _classCallCheck2.default)(this, _Panel);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(_Panel).call(this, props));
_this.sequenceComponent = function (from, to, callback) {
// from 是指原数组的第from个位置 to 是指原数组的第to个位置
var _cc = _this.state.childComponents;
if (!_cc) {
return;
}
var mycom = _cc.splice(from, 1);
_cc.splice(to, 0, mycom[0]); // this.state();
_this.setState({
childComponents: _cc
});
if (!!callback && typeof callback === 'function') {
callback();
}
};
_this.removeComponent = function (index) {
if (!index && index != 0) {
return;
}
if (_this.hasDroped) {// 说明drop在了panel内部 不作处理
} else {
// 说明drop在了panle外部 需要删除指定index
console.log("remove".concat(index));
var _cc = _this.state.childComponents;
if (!_cc) {
return;
}
_cc.splice(index, 1);
_this.setState({
childComponents: _cc
});
}
_this.hasDroped = false;
};
_this.dragSourceResize = function (event, direction, refToElement, delta) {
var mc = _this.state.childComponents;
var cs = parseInt(_this.state.cellSize || 0); // 当source被resize时,
// _i 当先对象的index 123
var _i = refToElement.getAttribute('datakey');
if (!_i && _i != 0) {
return;
} // 原始宽高
var _h = refToElement.offsetHeight;
var _w = refToElement.offsetWidth; // 改变的宽高
var _dw = delta.width;
var _dh = delta.height;
var _col = Math.round(_w / cs);
var _row = Math.round(_h / cs);
mc[_i].size = [_col, _row]; // 用state更新size of <Resizable>
_this.setState({
childComponents: mc
}); // 从而得到新的宽高
// 通过新的宽高 得到新的row和cols
// console.log(direction,delta)
};
_this.resizePanel = function (event, direction, refToElement, delta) {
_this.refCallBack(refToElement);
};
_this.refCallBack = function (node) {
console.log('**************', 'refcallback');
if (node && node.offsetWidth) {
var _offsetWidth = node.offsetWidth;
var _colsCount = _this.state.colsCount || defaultColsCount;
var _cellSize = Math.round(_offsetWidth / _colsCount);
if (_cellSize != _this.state.cellSize) {
// const ul = node.querySelector('ul[class^="MuiGridList"]');
var coreWidth = _colsCount * _cellSize;
var myPadding = _offsetWidth - coreWidth;
if (_this.state.panelSize) {
_this.state.panelSize.width = coreWidth;
}
var _paddingLeft = 0;
var _paddingRight = 0;
if (myPadding >= 1) {
_paddingLeft = Math.floor(myPadding / 2);
_paddingRight = Math.ceil(myPadding / 2);
}
_this.setState({
cellSize: _cellSize,
spacing: [_paddingLeft, _paddingRight],
panelSize: _this.state.panelSize
});
}
}
};
_this.state = {
// childComponents:props.defaultChildren,
cellSize: myCellSize,
spacing: [0, 0],
panelSize: defaultPanelSize,
colsCount: defaultColsCount
};
_this.state.childComponents = props.defaultChildren.map(function (v, i) {
return {
component: v,
size: [v.props.cols, v.props.rows]
};
});
return _this;
}
(0, _createClass2.default)(_Panel, [{
key: "componentDidMount",
value: function componentDidMount() {// this.
//
// const a = this.refs['panelwrap'].getBoundingClientRect();
// this.worldCoordinate = [a.x,a.y]
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var self = this;
var _this$state = this.state,
childComponents = _this$state.childComponents,
cellSize = _this$state.cellSize,
colsCount = _this$state.colsCount,
spacing = _this$state.spacing,
panelSize = _this$state.panelSize;
var _this$props = this.props,
classes = _this$props.classes,
connectDropTarget = _this$props.connectDropTarget;
var _childComponents = (childComponents || []).map(function (value, index) {
if (value && value.size instanceof Array && value.size.length === 2) {
return _react.default.createElement(_GridListTile.default, {
className: classes.gridListTile,
key: index,
cols: value.size[0],
rows: value.size[1]
}, _react.default.createElement(_reResizable.default, {
size: {
width: value.size[0] * cellSize - 4,
height: value.size[1] * cellSize - 4
},
minWidth: 10,
minHeight: 10,
datakey: index,
onResizeStop: _this2.dragSourceResize,
className: classes.dragsourceResizeable,
bounds: 'window'
}, _react.default.createElement(_DragAndDrop.DragSource, {
type: 'POSITION',
sequence: _this2.sequenceComponent,
remove: _this2.removeComponent,
index: index
}, value.component)));
}
return null;
});
return connectDropTarget(_react.default.createElement("div", {
className: classes.root,
ref: this.refCallBack,
style: {
backgroundSize: "".concat(cellSize, "px ").concat(cellSize, "px"),
marginRight: "".concat(spacing[1], "px"),
marginLeft: "".concat(spacing[0], "px")
}
}, _react.default.createElement(_reResizable.default, {
className: classes.resize,
defaultSize: panelSize,
size: panelSize,
minWidth: 100,
minHeight: 100,
bounds: 'window',
onResizeStop: this.resizePanel
}, _react.default.createElement("div", {
className: classes.resizeInnerWrap
}, _react.default.createElement(_GridList.default, {
spacing: 0,
cellHeight: cellSize,
cols: colsCount
}, _childComponents)))));
}
}]);
return _Panel;
}(_react.default.Component);
var Panel = (0, _reactDnd.DropTarget)(['DRAGANDDROP'], boxTarget, function (connect, monitor) {
return {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver({
shallow: true
}),
// isOverCurrent: monitor.isOver({ shallow: false }),
canDrop: monitor.canDrop(),
itemType: monitor.getItemType()
};
})(_Panel);
Panel.propTypes = {
/**
*Array of Jsx,it will be render in this panel eg.
*[(<div cols={4} rows={2}>
<Button color="primary">默认的button</Button>
</div>),
(<div cols={5} rows={2}>
<div>默认的div1</div>
</div>)]
*/
defaultChildren: _propTypes.default.array.isRequired
};
var _default = (0, _withStyles.default)(styles, {
name: 'RMPanel'
})((0, _withDragAndDrop.default)()(Panel));
exports.default = _default;