var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; import * as React from "react"; // import { compactLayout } from '../util/compact'; // import { getMaxContainerHeight } from '../util/sort'; // import { layoutCheck } from '../util/collison'; import { stringJoin } from '../utils'; // import { syncLayout } from '../util/initiate'; import './index.css'; import { Dragger } from "../dragger/index"; // interface DragactState { // GridXMoving: number // GridYMoving: number // wMoving: number // hMoving: number // placeholderShow: Boolean // placeholderMoving: Boolean // layout: any; // containerHeight: number // dragType: 'drag' | 'resize' // mapLayout: mapLayout | undefined // col: number // } var Column = /** @class */ (function (_super) { __extends(Column, _super); function Column() { return _super !== null && _super.apply(this, arguments) || this; } Column.prototype.render = function () { return this.props.children; }; return Column; }(React.Component)); export { Column }; var checkInContainer = function (GridX, GridY) { /**防止元素出container */ // if (GridY < 0) GridY = 0//上边界 return { GridX: GridX, GridY: GridY }; }; var ListCell = /** @class */ (function (_super) { __extends(ListCell, _super); function ListCell() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.onDragStart = function (x, y) { var _a = _this.calGridXY(x, y), GridX = _a.GridX, GridY = _a.GridY; var _b = _this.props, UniqueKey = _b.UniqueKey, currentListIndex = _b.currentListIndex; _this.props.onDragStart({ key: UniqueKey, x: GridX, y: GridY, currentListIndex: currentListIndex }); }; _this.onDrag = function (event, x, y) { var _a = _this.calGridXY(x, y), GridX = _a.GridX, GridY = _a.GridY; var _b = _this.props, UniqueKey = _b.UniqueKey, currentListIndex = _b.currentListIndex; _this.props.onDrag({ key: UniqueKey, x: GridX, y: GridY, currentListIndex: currentListIndex }); }; _this.onDragEnd = function (event, x, y) { var _a = _this.calGridXY(x, y), GridX = _a.GridX, GridY = _a.GridY; var _b = _this.props, UniqueKey = _b.UniqueKey, currentListIndex = _b.currentListIndex; console.log(_this.props); _this.props.onDragEnd({ key: UniqueKey, x: GridX, y: GridY, currentListIndex: currentListIndex }); }; return _this; } ListCell.prototype.calGridXY = function (x, y) { var _a = this.props, margin = _a.margin, width = _a.width, col = _a.col, rowHeight = _a.rowHeight; var containerWidth = width * col + margin[0]; /**坐标转换成格子的时候,无须计算margin */ var GridX = Math.round(x / containerWidth * col); var GridY = Math.round(y / (rowHeight + (margin ? margin[1] : 0))); // /**防止元素出container */ return checkInContainer(GridX, GridY); }; ListCell.prototype.render = function () { var _a = this.props, currentListIndex = _a.currentListIndex, y = _a.y, isUserMove = _a.isUserMove, width = _a.width, style = _a.style, rowHeight = _a.rowHeight, margin = _a.margin; return (React.createElement(Dragger, { x: currentListIndex * width, y: Math.round(y * rowHeight + margin[1] * (y + 1)), style: __assign({}, style, { width: width, transition: this.props.isUserMove ? '' : 'all .2s' }), isUserMove: isUserMove, onDragStart: this.onDragStart, onMove: this.onDrag, canResize: false, onDragEnd: this.onDragEnd }, this.props.children)); }; return ListCell; }(React.Component)); export { ListCell }; export var collision = function (a, b) { if (a === b) { return 1; } if (a + 1 <= b) return -1; if (a >= b + 1) return -1; return 2; }; var swapList = function (list, movingItem, firstKey) { var moving = []; var newList = list.map(function (oldItem) { if (oldItem.key !== movingItem.key) { var num = collision(oldItem.y, movingItem.y); if (num > 0) { // console.log(num) var offset = movingItem.y - 1; // if (movingItem.y > oldItem.y && movingItem.y < oldItem.y + 1) { // /** // * 元素向上移动时,元素的上面空间不足,则不移动这个元素 // * 当元素移动到GridY>所要向上交换的元素时,就不会进入这里,直接交换元素 // */ // console.log('你来了') // offset = oldItem.y // } // } moving.push(__assign({}, oldItem, { y: offset, isUserMove: false })); return __assign({}, oldItem, { y: offset, isUserMove: false }); } return oldItem; } else if (movingItem.key === firstKey) { /**永远保持用户移动的块是 isUserMove === true */ return __assign({}, oldItem, movingItem); } return oldItem; }); for (var i in moving) { newList = swapList(newList, moving[i], firstKey); } return newList; }; /**获取layout中,item第一个碰撞到的物体 */ export var getFirstCollison = function (layout, item) { for (var i = 0, length_1 = layout.length; i < length_1; i++) { if (collision(layout[i].y, item.y) > 0) { return layout[i]; } } return null; }; var compactCell = function (partialList, cell) { if (partialList.length === 0) { return __assign({}, cell, { y: 0 }); } var newCell = __assign({}, cell); /** * 类似一个递归调用 */ while (true) { var FirstCollison = getFirstCollison(partialList, newCell); if (FirstCollison) { /**第一次发生碰撞时,就可以返回了 */ return __assign({}, newCell, { y: FirstCollison.y + 1 }); } newCell.y--; if (newCell.y < 0) return __assign({}, newCell, { y: 0 }); /**碰到边界的时候,返回 */ } }; export var compactList = function (list, movingItem) { var sort = list.sort(function (a, b) { if (a.y === b.y) { if (b.isUserMove) return 1; } if (a.y > b.y) return 1; return 0; }); var needCompact = Array(list.length); var after = []; var mapList = {}; for (var i in sort) { var finished = compactCell(after, sort[i]); if (movingItem) { if (movingItem.key === finished.key) { // finished.y = movingItem.y; finished.isUserMove = true; } else finished.isUserMove = false; } else finished.isUserMove = false; after.push(finished); needCompact[i] = finished; mapList[finished.key] = finished; } return { compacted: needCompact, maped: mapList }; }; var DragactList = /** @class */ (function (_super) { __extends(DragactList, _super); function DragactList(props) { var _this = _super.call(this, props) || this; _this.onDragStart = function (e) { var key = e.key, x = e.x; for (var idx in _this.state.layout[x]) { if (_this.state.layout[x][idx].key === key) { _this.state.layout[x][idx].isUserMove = true; break; } } _this.setState({ layout: _this.state.layout, lastList: x }); }; _this.onDrag = function (e) { var key = e.key, x = e.x, y = e.y, currentListIndex = e.currentListIndex; if (!_this.state.layout[x]) return; //如果超出列表,就返回 if (x !== e.currentListIndex) { //移动到别的列表 var i = _this.state.maped[x][key]; if (!i) { _this.state.layout[x].push({ y: y, isUserMove: false, key: key, content: 'placeholder', currentListIndex: currentListIndex }); } } // if (x !== this.state.lastList && this.state.lastList !== e.currentListIndex) { // const { lastList } = this.state; // //跟上一个不一样的时候 // this.state.layout[lastList] = this.state.layout[lastList].filter((item: any) => { // if (item.key !== key) { // return item // } // }) // const compact = compactList(this.state.layout[lastList], undefined); // this.state.layout[lastList] = compact.compacted; // console.log(`上一次:${lastList}`, this.state.layout) // delete this.state.maped[lastList][key] // console.log(this.state.maped) // } console.log(e); var newList = swapList(_this.state.layout[x], { y: y, key: key }, key); var _a = compactList(newList, { y: y, key: key }), compacted = _a.compacted, maped = _a.maped; _this.state.layout[x] = compacted; _this.state.maped[x] = maped; _this.setState({ layout: _this.state.layout.slice(), maped: _this.state.maped.slice(), lastList: x }); }; _this.onDragEnd = function (e) { var x = e.x, key = e.key, currentListIndex = e.currentListIndex; if (x !== currentListIndex) { //1.删除原来list中的数据 _this.state.layout[currentListIndex] = _this.state.layout[currentListIndex].filter(function (item) { if (item.key !== key) { return item; } }); //2.删除原来map中的数据 delete _this.state.maped[currentListIndex][key]; var compact = compactList(_this.state.layout[currentListIndex], undefined); _this.state.layout[currentListIndex] = compact.compacted; _this.state.maped[currentListIndex] = compact.maped; _this.state.layout[x] = _this.state.layout[x].map(function (item) { if (key === item.key) { return __assign({}, item, { currentListIndex: x }); } return item; }); } var _a = compactList(_this.state.layout[x], undefined), compacted = _a.compacted, maped = _a.maped; _this.state.layout[x] = compacted; _this.state.maped[x] = maped; console.log(_this.state.layout); _this.setState({ layout: _this.state.layout.slice(), maped: _this.state.maped.slice() }); // if (this.state.currentList !== x) { // this.state.layout[x].push({ y, key: "10203", isUserMove: false }) // const compacted = compactList(this.state.layout[x], undefined); // this.state.layout[x] = compacted; // this.setState({ // layout: [...this.state.layout] // }) // } else { // } }; _this.renderList = function () { // console.log('set', this.props.layout) return _this.props.layout.map(function (child, index) { return React.createElement("div", { className: 'list-oneof', style: { background: 'red', height: 60 * _this.state.layout[index].length, width: 400 }, key: index }, _this.renderColumn(child, index)); }); }; _this.renderColumn = function (child, index) { // const column = this.state.layout[index]; var _a = _this.props, width = _a.width, margin = _a.margin, rowHeight = _a.rowHeight; return child.map(function (c, idx) { var key = c.key; var renderItem; // renderItem = this.state.maped[index][key]; for (var i in _this.state.maped) { renderItem = _this.state.maped[i][key]; if (renderItem) break; } // console.log(renderItem) // if (renderItem.key === '1') console.log(renderItem.listPosition) return React.createElement(ListCell, { margin: margin, rowHeight: rowHeight, width: width, col: _this.state.layout.length, currentListIndex: renderItem.currentListIndex, y: renderItem ? renderItem.y : c.y, style: { position: 'absolute' }, key: idx, UniqueKey: key, isUserMove: renderItem ? renderItem.isUserMove : false, onDragStart: _this.onDragStart, onDrag: _this.onDrag, onDragEnd: _this.onDragEnd }, _this.props.children(c, idx)); }); }; // const layout = getDataSet(props.children); var array = []; var layout = props.layout.map(function (child, idx) { return child.map(function (el, index) { if (!array[idx]) array[idx] = {}; array[idx][el.key] = __assign({}, el, { key: el.key, isUserMove: false, currentListIndex: idx }); return __assign({}, el, { key: el.key, isUserMove: false, currentListIndex: idx }); }); }); console.log(array); _this.state = { GridXMoving: 0, GridYMoving: 0, wMoving: 0, hMoving: 0, placeholderShow: false, placeholderMoving: false, layout: layout, containerHeight: 500, dragType: 'drag', mapLayout: undefined, col: 3, currentList: 0, maped: array, lastList: void 666 }; return _this; } DragactList.prototype.componentWillReceiveProps = function (nextProps) { // if (this.props.children.length > nextProps.children.length) { //remove // const mapLayoutCopy = { ...this.state.mapLayout }; // nextProps.children.forEach((child: any) => { // if ((mapLayoutCopy as any)[child.key] !== void 666) delete (mapLayoutCopy as any)[child.key]; // }) // for (const key in mapLayoutCopy) { // const newLayout = this.state.layout.filter((child) => { // if (child.key !== key) return child // }) // const { compacted, mapLayout } = compactLayout(newLayout, undefined); // this.setState({ // containerHeight: getMaxContainerHeight(compacted, this.props.rowHeight, this.props.margin[1]), // layout: compacted, // mapLayout // }) // } // } // if (this.props.children.length < nextProps.children.length) { //add // var item; // for (const idx in nextProps.children) { // const i = nextProps.children[idx]; // if (this.state.mapLayout && !this.state.mapLayout[i.key]) { // item = i; // break; // } // } // if (item !== void 666) { // const dataSet = { ...item.props['data-set'], isUserMove: false, key: item.key }; // var newLayout = [...this.state.layout, dataSet] // newLayout = correctLayout(newLayout, this.state.col) // const { compacted, mapLayout } = compactLayout(newLayout, undefined); // console.log(mapLayout) // // console.log(layout) // this.setState({ // containerHeight: getMaxContainerHeight(compacted, this.props.rowHeight, this.props.margin[1]), // layout: compacted, // mapLayout // }) // } // } }; DragactList.prototype.componentDidMount = function () { // setTimeout(() => { // const swp = [...this.state.layout[0]] // this.state.layout[0] = this.state.layout[1]; // this.state.layout[1] = swp; // const swpMap = { ...this.state.maped[0] } // this.state.maped[0] = this.state.maped[1]; // this.state.maped[1] = swpMap; // this.setState({ // layout: this.state.layout, // maped: this.state.maped // }) // // console.log(this.state.layout) // }, 1000); }; DragactList.prototype.render = function () { var _a = this.props, width = _a.width, className = _a.className; var numberOfCol = this.state.layout.length; return (React.createElement("div", { className: stringJoin('DraggerLayout', className + ''), style: { left: 100, width: width * numberOfCol, height: '', zIndex: 1, display: 'flex' } }, this.renderList())); }; return DragactList; }(React.Component)); export { DragactList };