mirror of
https://github.com/MrXujiang/h5-Dooring.git
synced 2026-01-20 12:48:13 +00:00
fix drag bug and config
This commit is contained in:
commit
01cf4c1614
6
.gitignore
vendored
6
.gitignore
vendored
@ -103,4 +103,8 @@ dist
|
|||||||
# TernJS port file
|
# TernJS port file
|
||||||
.tern-port
|
.tern-port
|
||||||
|
|
||||||
/**/*.umi
|
<<<<<<< HEAD
|
||||||
|
/**/*.umi
|
||||||
|
=======
|
||||||
|
.umi/
|
||||||
|
>>>>>>> upstream/master
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user