fix drag bug and config

This commit is contained in:
yehuozhili 2020-08-31 14:54:19 +08:00
commit 01cf4c1614
8 changed files with 589 additions and 544 deletions

6
.gitignore vendored
View File

@ -103,4 +103,8 @@ dist
# TernJS port file # TernJS port file
.tern-port .tern-port
/**/*.umi <<<<<<< HEAD
/**/*.umi
=======
.umi/
>>>>>>> upstream/master

View File

@ -3,35 +3,39 @@ import { Carousel } from 'zarm';
import styles from './index.less'; import styles from './index.less';
const XCarousel = memo(props => { const XCarousel = memo(props => {
const { const { direction, swipeable, autoPlay, isTpl, imgList, tplImg } = props;
direction,
swipeable,
imgList
} = props
const contentRender = () => { const contentRender = () => {
return imgList.map((item, i) => { return imgList.map((item, i) => {
return ( return (
<div className={styles.carousel__item__pic} key={+i}> <div className={styles.carousel__item__pic} key={+i}>
<img src={item.imgUrl[0].url} alt="" /> <img src={item.imgUrl[0].url} alt="" />
</div> </div>
) );
}) });
} };
return <div style={{width: '100%', overflow: 'hidden'}}> return (
<Carousel <div style={{ width: '100%', overflow: 'hidden' }}>
onChange={(index) => { {isTpl ? (
// console.log(`onChange: ${index}`); <div className={styles.carousel__item__pic}>
}} <img src={tplImg} alt="" />
direction={direction}
swipeable={swipeable}
autoPlay
loop
>
{contentRender()}
</Carousel>
</div> </div>
}) ) : (
<Carousel
onChange={index => {
// console.log(`onChange: ${index}`);
}}
direction={direction}
swipeable={swipeable}
autoPlay={autoPlay}
loop
>
{contentRender()}
</Carousel>
)}
</div>
);
});
export default XCarousel; export default XCarousel;

View File

@ -2,35 +2,38 @@ import { dynamic } from 'umi';
import Loading from '../LoadingCp'; import Loading from '../LoadingCp';
import { useMemo, memo } from 'react'; import { useMemo, memo } from 'react';
const needList = ['Tab', 'Carousel', 'Upload', 'Video'] const needList = ['Tab', 'Carousel', 'Upload', 'Video'];
const DynamicFunc = (type) => dynamic({ const DynamicFunc = type =>
loader: async function() { dynamic({
let Component; loader: async function() {
if(needList.includes(type)) { let Component;
const { default: Graph } = await import(`@/components/${type}`) if (needList.includes(type)) {
Component = Graph const { default: Graph } = await import(`@/components/${type}`);
}else { Component = Graph;
const Components = await import(`@/components/DynamicEngine/components`) } else {
Component = Components[type] const Components = await import(`@/components/DynamicEngine/components`);
} Component = Components[type];
}
return (props) => { return props => {
const { config } = props const { config } = props;
return <Component {...config} /> return <Component {...config} />;
} };
}, },
loading: () => <div style={{ paddingTop: 10, textAlign: 'center' }}> loading: () => (
<Loading /> <div style={{ paddingTop: 10, textAlign: 'center' }}>
</div> <Loading />
}) </div>
),
});
const DynamicEngine = memo((props) => { const DynamicEngine = memo(props => {
const { type, config } = props const { type, config } = props;
const Dynamic = useMemo(() => { const Dynamic = useMemo(() => {
return DynamicFunc(type) return DynamicFunc(type);
}, [type]) }, [type, config]);
return <Dynamic type={type} config={config} /> return <Dynamic type={type} config={config} />;
}) });
export default DynamicEngine export default DynamicEngine;

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,12 @@
import React, { useState, useEffect, memo, useMemo } from 'react'; import React, { useState, useEffect, useCallback, memo, useMemo } from 'react';
import { Input, Slider, Result, Tabs } from 'antd'; import { Slider, Result, Tabs, Alert } from 'antd';
import { import {
PieChartOutlined, PieChartOutlined,
ExpandOutlined, ExpandOutlined,
PlayCircleOutlined, PlayCircleOutlined,
HighlightOutlined, HighlightOutlined,
} from '@ant-design/icons'; } from '@ant-design/icons';
import TextLoop from 'react-text-loop';
import { connect } from 'dva'; import { connect } from 'dva';
import HeaderComponent from './components/Header'; import HeaderComponent from './components/Header';
import SourceBox from './SourceBox'; import SourceBox from './SourceBox';
@ -17,10 +18,10 @@ import template from 'components/DynamicEngine/template';
import mediaTpl from 'components/DynamicEngine/mediaTpl'; import mediaTpl from 'components/DynamicEngine/mediaTpl';
import graphTpl from 'components/DynamicEngine/graphTpl'; import graphTpl from 'components/DynamicEngine/graphTpl';
import schema from 'components/DynamicEngine/schema'; import schema from 'components/DynamicEngine/schema';
import { uuid } from 'utils/tool';
import styles from './index.less'; import styles from './index.less';
const { Search } = Input;
const { TabPane } = Tabs; const { TabPane } = Tabs;
const Container = memo(props => { const Container = memo(props => {
@ -68,6 +69,10 @@ const Container = memo(props => {
}); });
}; };
const clearData = useCallback(() => {
dispatch({ type: 'editorModal/clearAll' });
}, []);
const handleDel = id => { const handleDel = id => {
dispatch({ dispatch({
type: 'editorModal/delPointData', type: 'editorModal/delPointData',
@ -94,34 +99,50 @@ const Container = memo(props => {
}); });
return arr; return arr;
}, []); }, []);
// 存储用户唯一信息
if (!localStorage.getItem('uid') || !sessionStorage.getItem('sid')) {
localStorage.setItem('uid', uuid(8, 10));
sessionStorage.setItem('sid', uuid(5, 10));
}
return ( return (
<div className={styles.editorWrap}> <div className={styles.editorWrap}>
<HeaderComponent pointData={pointData} location={props.location} /> <HeaderComponent pointData={pointData} clearData={clearData} location={props.location} />
<div className={styles.container}> <div className={styles.container}>
<div className={styles.list}> <div className={styles.list}>
<div className={styles.searchBar}> <div className={styles.searchBar}>
<Search placeholder="搜索组件" onSearch={value => console.log(value)} enterButton /> <Alert
banner
message={
<TextLoop mask>
<div>Dooring升级啦</div>
<div>Dooring添加自动保存功能</div>
<div>已有500+人使用</div>
<div>持续迭代中...</div>
</TextLoop>
}
/>
</div> </div>
<div className={styles.componentList}> <div className={styles.componentList}>
<Tabs defaultActiveKey="1"> <Tabs defaultActiveKey="1">
<TabPane tab={generateHeader('base', '基础组件')} key="1"> <TabPane tab={generateHeader('base', '基础组件')} key="1">
{template.map((value, i) => ( {template.map((value, i) => (
<TargetBox item={value} key={i} canvasId={canvasId}> <TargetBox item={value} key={i} canvasId={canvasId}>
<DynamicEngine {...value} config={schema[value.type].config} /> <DynamicEngine {...value} config={schema[value.type].config} isTpl={true} />
</TargetBox> </TargetBox>
))} ))}
</TabPane> </TabPane>
<TabPane tab={generateHeader('media', '媒体组件')} key="2"> <TabPane tab={generateHeader('media', '媒体组件')} key="2">
{mediaTpl.map((value, i) => ( {mediaTpl.map((value, i) => (
<TargetBox item={value} key={i} canvasId={canvasId}> <TargetBox item={value} key={i} canvasId={canvasId}>
<DynamicEngine {...value} config={schema[value.type].config} /> <DynamicEngine {...value} config={schema[value.type].config} isTpl={true} />
</TargetBox> </TargetBox>
))} ))}
</TabPane> </TabPane>
<TabPane tab={generateHeader('visible', '可视化组件')} key="3"> <TabPane tab={generateHeader('visible', '可视化组件')} key="3">
{graphTpl.map((value, i) => ( {graphTpl.map((value, i) => (
<TargetBox item={value} key={i} canvasId={canvasId}> <TargetBox item={value} key={i} canvasId={canvasId}>
<DynamicEngine {...value} config={schema[value.type].config} /> <DynamicEngine {...value} config={schema[value.type].config} isTpl={true} />
</TargetBox> </TargetBox>
))} ))}
</TabPane> </TabPane>

View File

@ -76,7 +76,6 @@ const SourceBox = memo(props => {
const opacity = isOver ? 0.7 : 1; const opacity = isOver ? 0.7 : 1;
const backgroundColor = isOver ? 1 : 0.7; const backgroundColor = isOver ? 1 : 0.7;
return ( return (
<Draggable handle=".js_box"> <Draggable handle=".js_box">
<div className={styles.canvasBox}> <div className={styles.canvasBox}>
@ -101,12 +100,12 @@ const SourceBox = memo(props => {
<div <div
className="js_box" className="js_box"
style={{ style={{
width: '12px', width: '10px',
height: '100%', height: '100%',
position: 'absolute', position: 'absolute',
borderRadius: '0 6px 6px 0', borderRadius: '0 6px 6px 0',
backgroundColor: '#2f54eb', backgroundColor: '#2f54eb',
right: '-12px', right: '-10px',
top: '0', top: '0',
color: '#fff', color: '#fff',
cursor: 'move', cursor: 'move',
@ -127,7 +126,7 @@ const SourceBox = memo(props => {
> >
{pointData.map(value => ( {pointData.map(value => (
<div className={styles.dragItem} key={value.id} data-grid={value.point}> <div className={styles.dragItem} key={value.id} data-grid={value.point}>
<DynamicEngine {...value.item} /> <DynamicEngine {...value.item} isTpl={false} />
</div> </div>
))} ))}
</GridLayout> </GridLayout>

View File

@ -1,5 +1,5 @@
import React, { useMemo, memo } from 'react'; import React, { useMemo, memo } from 'react';
import { useDrag, DragPreviewImage } from 'react-dnd'; import { useDrag } from 'react-dnd';
import { connect } from 'dva'; import { connect } from 'dva';
import schema from 'components/DynamicEngine/schema'; import schema from 'components/DynamicEngine/schema';
@ -30,12 +30,6 @@ const TargetBox = memo(props => {
return ( return (
<div className={styles.module} style={{ ...containerStyle }} ref={drag}> <div className={styles.module} style={{ ...containerStyle }} ref={drag}>
{props.children} {props.children}
{item.type === 'Carousel' && (
<DragPreviewImage
connect={preview}
src={'https://www.easyicon.net/api/resizeApi.php?id=1200841&size=32'}
></DragPreviewImage>
)}
</div> </div>
); );
}); });

View File

@ -1,69 +1,82 @@
import React, { memo, useEffect, useState } from 'react' import React, { memo, useEffect, useState } from 'react';
import GridLayout from 'react-grid-layout' import GridLayout from 'react-grid-layout';
import DynamicEngine from 'components/DynamicEngine' import DynamicEngine from 'components/DynamicEngine';
import req from '@/utils/req' import req from '@/utils/req';
import styles from './index.less' import styles from './index.less';
// 可视化组件类型 // 可视化组件类型
// const componentTypes = ['Column', 'Pie'] // const componentTypes = ['Column', 'Pie']
const isMac = navigator.platform.indexOf('Mac') === 0 const isMac = navigator.platform.indexOf('Mac') === 0;
const pcStyle = { const pcStyle = {
width: isMac ? 395 : 412, width: isMac ? 395 : 412,
margin: '20px auto', margin: '20px auto',
border: '10px solid #000', border: '10px solid #000',
borderRadius: '20px', borderRadius: '20px',
height: '684px', height: '684px',
overflow: 'auto' overflow: 'auto',
} };
const PreviewPage = memo((props) => { const PreviewPage = memo(props => {
const [pointData, setPointData] = useState(() => { const [pointData, setPointData] = useState(() => {
let pointDataStr = localStorage.getItem('pointData') let pointDataStr = localStorage.getItem('pointData');
let points let points;
try{
points = JSON.parse(pointDataStr) || []
}catch(err) {
points = []
}
return points.map(item => ({...item, point: {...item.point, isDraggable: false, isResizable: false } }))
})
const vw = window.innerWidth try {
points = JSON.parse(pointDataStr) || [];
} catch (err) {
points = [];
}
return points.map(item => ({
...item,
point: { ...item.point, isDraggable: false, isResizable: false },
}));
});
const vw = window.innerWidth;
useEffect(() => { useEffect(() => {
const { tid } = props.location.query const { tid } = props.location.query;
req.get('/visible/preview/get', { params: { tid } }).then(res => { const timer = null;
setPointData(res.map(item => ({...item, point: {...item.point, isDraggable: false, isResizable: false } }))) req
}).catch(err => { .get('/visible/preview/get', { params: { tid } })
setTimeout(() => { .then(res => {
window.close() setPointData(
}, 3000) res.map(item => ({
}) ...item,
}, []) point: { ...item.point, isDraggable: false, isResizable: false },
})),
);
})
.catch(err => {
timer = setTimeout(() => {
window.close();
}, 3000);
});
return () => {
clearTimeout(timer);
};
}, []);
return ( return (
<div style={vw > 800 ? pcStyle : {}}> <div style={vw > 800 ? pcStyle : {}}>
<GridLayout <GridLayout
className={styles.layout} className={styles.layout}
cols={24} cols={24}
rowHeight={2} rowHeight={2}
width={vw > 800 ? 375 :vw } width={vw > 800 ? 375 : vw}
margin={[0,0]} margin={[0, 0]}
id="xx" id="xx"
> >
{ {pointData.map(value => (
pointData.map(value => <div className={styles.dragItem} key={value.id} data-grid={value.point}>
<div className={styles.dragItem} key={value.id} data-grid={value.point}> <DynamicEngine {...value.item} />
<DynamicEngine {...value.item} /> </div>
</div> ))}
)
}
</GridLayout> </GridLayout>
</div> </div>
) );
}) });
export default PreviewPage export default PreviewPage;