From eee468a1c3c28aaf5a850a17511342182aeee277 Mon Sep 17 00:00:00 2001 From: yehuozhili Date: Sun, 30 Aug 2020 11:13:42 +0800 Subject: [PATCH] fix drag bug add ignore --- .gitignore | 2 + src/pages/editor/Container.js | 211 +++++++++++++++++++--------------- src/pages/editor/SourceBox.js | 167 +++++++++++++++------------ src/pages/editor/TargetBox.js | 78 +++++-------- 4 files changed, 246 insertions(+), 212 deletions(-) diff --git a/.gitignore b/.gitignore index 6704566..4fad141 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,5 @@ dist # TernJS port file .tern-port + +/**/*.umi \ No newline at end of file diff --git a/src/pages/editor/Container.js b/src/pages/editor/Container.js index 0456ae9..67d67b2 100644 --- a/src/pages/editor/Container.js +++ b/src/pages/editor/Container.js @@ -1,165 +1,190 @@ -import React, { useState, useEffect, memo } from 'react' -import { Input, Slider, Result, Tabs } from 'antd' +import React, { useState, useEffect, memo, useMemo } from 'react'; +import { Input, Slider, Result, Tabs } from 'antd'; import { PieChartOutlined, ExpandOutlined, PlayCircleOutlined, - HighlightOutlined -} from '@ant-design/icons' -import { connect } from 'dva' -import HeaderComponent from './components/Header' -import SourceBox from './SourceBox' -import TargetBox from './TargetBox' -import Calibration from 'components/Calibration' -import DynamicEngine from 'components/DynamicEngine' -import FormEditor from 'components/FormEditor' -import template from 'components/DynamicEngine/template' -import mediaTpl from 'components/DynamicEngine/mediaTpl' -import graphTpl from 'components/DynamicEngine/graphTpl' -import schema from 'components/DynamicEngine/schema' + HighlightOutlined, +} from '@ant-design/icons'; +import { connect } from 'dva'; +import HeaderComponent from './components/Header'; +import SourceBox from './SourceBox'; +import TargetBox from './TargetBox'; +import Calibration from 'components/Calibration'; +import DynamicEngine from 'components/DynamicEngine'; +import FormEditor from 'components/FormEditor'; +import template from 'components/DynamicEngine/template'; +import mediaTpl from 'components/DynamicEngine/mediaTpl'; +import graphTpl from 'components/DynamicEngine/graphTpl'; +import schema from 'components/DynamicEngine/schema'; -import styles from './index.less' +import styles from './index.less'; const { Search } = Input; const { TabPane } = Tabs; -const Container = memo((props) => { - const [ scaleNum , setScale ] = useState(1) +const Container = memo(props => { + const [scaleNum, setScale] = useState(1); - const { pointData, curPoint, dispatch } = props + const { pointData, curPoint, dispatch } = props; // 指定画布的id - let canvasId = 'js_canvas' + let canvasId = 'js_canvas'; const backSize = () => { - setScale(1) - } + setScale(1); + }; const CpIcon = { base: , media: , - visible: - } + visible: , + }; const generateHeader = (type, text) => { - return
{ CpIcon[type] } { text }
- } + return ( +
+ {CpIcon[type]} {text} +
+ ); + }; - const handleSliderChange = (v) => { - setScale(prev => v >= 150 ? 1.5 : (v / 100)) - } + const handleSliderChange = v => { + setScale(prev => (v >= 150 ? 1.5 : v / 100)); + }; - const handleSlider = (type) => { - if(type) { - setScale(prev => prev >= 1.5 ? 1.5 : (prev + 0.1)) - }else { - setScale(prev => prev <= 0.5 ? 0.5 : (prev - 0.1)) + const handleSlider = type => { + if (type) { + setScale(prev => (prev >= 1.5 ? 1.5 : prev + 0.1)); + } else { + setScale(prev => (prev <= 0.5 ? 0.5 : prev - 0.1)); } - } + }; - const handleFormSave = (data) => { + const handleFormSave = data => { dispatch({ type: 'editorModal/modPointData', - payload: { ...curPoint, item: {...curPoint.item, config: data} } - }) - } + payload: { ...curPoint, item: { ...curPoint.item, config: data } }, + }); + }; - const handleDel = (id) => { + const handleDel = id => { dispatch({ type: 'editorModal/delPointData', - payload: { id } - }) - } + payload: { id }, + }); + }; useEffect(() => { - if(window.innerWidth < 1024) { - props.history.push('/mobileTip') + if (window.innerWidth < 1024) { + props.history.push('/mobileTip'); } - }, []) + }, []); + const allType = useMemo(() => { + let arr = []; + template.forEach(v => { + arr.push(v.type); + }); + mediaTpl.forEach(v => { + arr.push(v.type); + }); + graphTpl.forEach(v => { + arr.push(v.type); + }); + return arr; + }, []); return (
-
+
console.log(value)} enterButton />
- - { - template.map((value,i) => - - - - ) - } + + {template.map((value, i) => ( + + + + ))} - - { - mediaTpl.map((value,i) => - - - - ) - } + + {mediaTpl.map((value, i) => ( + + + + ))} - - { - graphTpl.map((value,i) => - - - - ) - } + + {graphTpl.map((value, i) => ( + + + + ))}
-
+
- -
+ +
- +
- +
- + - - - + + + + + + + - + +
+
+
-
- { - pointData.length && curPoint ? + {pointData.length && curPoint ? ( <>
属性设置
- - : -
+ + ) : ( +
- } + )}
-
- ) -}) + ); +}); export default connect(({ editorModal: { pointData, curPoint } }) => ({ - pointData, curPoint -}))(Container) + pointData, + curPoint, +}))(Container); diff --git a/src/pages/editor/SourceBox.js b/src/pages/editor/SourceBox.js index 2b013d6..1cea37e 100644 --- a/src/pages/editor/SourceBox.js +++ b/src/pages/editor/SourceBox.js @@ -1,79 +1,105 @@ -import React, { memo, useEffect, useState } from 'react' -import { useDrop } from 'react-dnd' -import Draggable from 'react-draggable' -import GridLayout from 'react-grid-layout' -import { Tooltip } from 'antd' -import { connect } from 'dva' -import DynamicEngine from 'components/DynamicEngine' -import styles from './index.less' - -const SourceBox = memo((props) => { - const { pointData, scaleNum, canvasId, dispatch } = props - const [canvasRect, setCanvasRect] = useState([]) - const [isShowTip, setIsShowTip] = useState(true) +import React, { memo, useEffect, useState } from 'react'; +import { useDrop } from 'react-dnd'; +import Draggable from 'react-draggable'; +import GridLayout from 'react-grid-layout'; +import { Tooltip } from 'antd'; +import { connect } from 'dva'; +import DynamicEngine from 'components/DynamicEngine'; +import styles from './index.less'; +import { uuid } from '@/utils/tool'; +const SourceBox = memo(props => { + const { pointData, scaleNum, canvasId, allType, dispatch } = props; + const [canvasRect, setCanvasRect] = useState([]); + const [isShowTip, setIsShowTip] = useState(true); const [{ isOver }, drop] = useDrop({ - accept: [], - collect: (monitor) => ({ + accept: allType, + drop: (item, monitor) => { + let parentDiv = document.getElementById(canvasId), + pointRect = parentDiv.getBoundingClientRect(), + top = pointRect.top, + pointEnd = monitor.getSourceClientOffset(), + y = pointEnd.y - top, + col = 24, // 网格列数 + cellHeight = 2; + // 转换成网格规则的坐标和大小 + let gridY = Math.ceil(y / cellHeight); + dispatch({ + type: 'editorModal/addPointData', + payload: { + id: uuid(6, 10), + item, + point: { i: `x-${pointData.length}`, x: 0, y: gridY, w: col, h: item.h, isBounded: true }, + }, + }); + }, + collect: monitor => ({ isOver: monitor.isOver(), canDrop: monitor.canDrop(), - item: monitor.getItem() - }) - }) + item: monitor.getItem(), + }), + }); const dragStop = (layout, oldItem, newItem, placeholder, e, element) => { - const curPointData = pointData.filter(item => item.id === newItem.i)[0] + const curPointData = pointData.filter(item => item.id === newItem.i)[0]; dispatch({ type: 'editorModal/modPointData', - payload: { ...curPointData, point: newItem } - }) - } + payload: { ...curPointData, point: newItem }, + }); + }; const onDragStart = (layout, oldItem, newItem, placeholder, e, element) => { - const curPointData = pointData.filter(item => item.id === newItem.i)[0] + const curPointData = pointData.filter(item => item.id === newItem.i)[0]; dispatch({ type: 'editorModal/modPointData', - payload: { ...curPointData } - }) - } + payload: { ...curPointData }, + }); + }; const onResizeStop = (layout, oldItem, newItem, placeholder, e, element) => { - const curPointData = pointData.filter(item => item.id === newItem.i)[0] + const curPointData = pointData.filter(item => item.id === newItem.i)[0]; dispatch({ type: 'editorModal/modPointData', - payload: { ...curPointData, point: newItem } - }) - } + payload: { ...curPointData, point: newItem }, + }); + }; useEffect(() => { - let { width, height } = document.getElementById(canvasId).getBoundingClientRect() - setCanvasRect([width, height]) - }, [canvasId]) + let { width, height } = document.getElementById(canvasId).getBoundingClientRect(); + setCanvasRect([width, height]); + }, [canvasId]); useEffect(() => { setTimeout(() => { - setIsShowTip(false) - }, 3000) - }, []) + setIsShowTip(false); + }, 3000); + }, []); - const opacity = isOver ? 0.7 : 1 - const backgroundColor = isOver ? 1 : 0.7 + const opacity = isOver ? 0.7 : 1; + const backgroundColor = isOver ? 1 : 0.7; return (
-
- -
+
-
{ right: '-12px', top: '0', color: '#fff', - cursor: 'move' + cursor: 'move', }} - /> + /> - - { - pointData.length > 0 ? - 0 ? ( + - { - pointData.map(value => -
- -
- ) - } -
: null - } + {pointData.map(value => ( +
+ +
+ ))} +
+ ) : null}
- ) -}) + ); +}); export default connect(({ editorModal: { pointData } }) => ({ - pointData -}))(SourceBox) + pointData, +}))(SourceBox); diff --git a/src/pages/editor/TargetBox.js b/src/pages/editor/TargetBox.js index 8ea8566..a3d689c 100644 --- a/src/pages/editor/TargetBox.js +++ b/src/pages/editor/TargetBox.js @@ -1,61 +1,45 @@ -import React, { useMemo, memo } from 'react' -import { useDrag } from 'react-dnd' -import { connect } from 'dva' -import schema from 'components/DynamicEngine/schema' -import { uuid } from '@/utils/tool'; -import styles from './index.less' +import React, { useMemo, memo } from 'react'; +import { useDrag, DragPreviewImage } from 'react-dnd'; +import { connect } from 'dva'; +import schema from 'components/DynamicEngine/schema'; -const TargetBox = memo((props) => { - const { item, dispatch, canvasId, pointData } = props - const [{ isDragging }, drag] = useDrag({ - item: { type: item.type, config: schema[item.type].config, h: item.h, editableEl: schema[item.type].editData }, - collect: (monitor) => ({ +import styles from './index.less'; + +const TargetBox = memo(props => { + const { item, dispatch, canvasId, pointData } = props; + const [{ isDragging }, drag, preview] = useDrag({ + item: { + type: item.type, + config: schema[item.type].config, + h: item.h, + editableEl: schema[item.type].editData, + }, + collect: monitor => ({ isDragging: monitor.isDragging(), }), - // begin(monitor) { - // getStartPoint(monitor.getSourceClientOffset()) - // }, - end(item, monitor) { - let parentDiv = document.getElementById(canvasId), - pointRect = parentDiv.getBoundingClientRect(), - top = pointRect.top, - pointEnd = monitor.getSourceClientOffset(), - y = pointEnd.y - top, - col = 24, // 网格列数 - cellHeight = 2 - // 转换成网格规则的坐标和大小 - let gridY = Math.ceil(y / cellHeight) - - dispatch({ - type: 'editorModal/addPointData', - payload: { - id: uuid(6, 10), - item, - point: { i: `x-${pointData.length}`, x: 0, y: gridY, w: col, h: item.h, isBounded: true } - } - }) - } - }) + }); const containerStyle = useMemo( () => ({ opacity: isDragging ? 0.4 : 1, - cursor: 'move' + cursor: 'move', }), [isDragging], - ) + ); return ( -
- { props.children } +
+ {props.children} + {item.type === 'Carousel' && ( + + )}
- ) -}) + ); +}); export default connect(({ editorModal: { pointData } }) => ({ - pointData -}))(TargetBox) + pointData, +}))(TargetBox);