update 0.3.0
This commit is contained in:
		| @@ -61,8 +61,8 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
|  | ||||
| 	const ref = useRef<HTMLDivElement>(null); | ||||
| 	const innerDragData = useMemo(() => { | ||||
| 		return { ...innerDrag(props.data, ref) }; | ||||
| 	}, [props.data]); | ||||
| 		return { ...innerDrag(props.data, ref, props.config) }; | ||||
| 	}, [props.data, props.config]); | ||||
|  | ||||
| 	useEffect(() => { | ||||
| 		const fn = () => { | ||||
| @@ -133,7 +133,7 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 					{...innerDragData} | ||||
| 					onContextMenu={(e) => { | ||||
| 						if (props.data.name !== 'modalMask') { | ||||
| 							contextMenuEvent(e, ref); | ||||
| 							contextMenuEvent(e, ref, props.config); | ||||
| 						} | ||||
| 					}} | ||||
| 				> | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import { containerDragResolve } from '../core/crossDrag'; | ||||
| import { containerFocusRemove } from '../core/focusHandler'; | ||||
| import { innerContainerDrag } from '../core/innerDrag'; | ||||
| import { NormalMarkLineRender } from '../core/markline'; | ||||
| import { scaleState } from '../core/scale/state'; | ||||
| import { IStoreData } from '../core/store/storetype'; | ||||
| import { wrapperMoveState } from './wrapperMove/event'; | ||||
| import { CSSProperties, PropsWithChildren, useMemo } from 'react'; | ||||
| @@ -22,14 +21,14 @@ interface ContainerProps { | ||||
| } | ||||
| function Container(props: PropsWithChildren<ContainerProps>) { | ||||
| 	const { editContainerStyle, previewContainerStyle } = props; | ||||
|  | ||||
| 	const scaleState = props.config.getScaleState(); | ||||
| 	const transform = useMemo(() => { | ||||
| 		if (props.context === 'edit') { | ||||
| 			return `scale(${scaleState.value}) translate(${wrapperMoveState.needX}px, ${wrapperMoveState.needY}px)`; | ||||
| 		} else { | ||||
| 			return undefined; | ||||
| 		} | ||||
| 	}, [props.context]); | ||||
| 	}, [props.context, scaleState]); | ||||
|  | ||||
| 	const bgColor = () => { | ||||
| 		const isEdit = props.config.getStoreChanger().isEdit(); | ||||
| @@ -63,11 +62,13 @@ function Container(props: PropsWithChildren<ContainerProps>) { | ||||
| 									overflow: 'hidden', | ||||
| 									...editContainerStyle, | ||||
| 								}} | ||||
| 								{...(props.context === 'edit' ? containerDragResolve : null)} | ||||
| 								{...(props.context === 'edit' ? innerContainerDrag() : null)} | ||||
| 								{...(props.context === 'edit' ? containerFocusRemove() : null)} | ||||
| 								{...(props.context === 'edit' ? containerDragResolve(props.config) : null)} | ||||
| 								{...(props.context === 'edit' ? innerContainerDrag(props.config) : null)} | ||||
| 								{...(props.context === 'edit' ? containerFocusRemove(props.config) : null)} | ||||
| 							> | ||||
| 								{props.context === 'edit' && <NormalMarkLineRender></NormalMarkLineRender>} | ||||
| 								{props.context === 'edit' && ( | ||||
| 									<NormalMarkLineRender config={props.config}></NormalMarkLineRender> | ||||
| 								)} | ||||
| 								{props.state.block.map((v) => { | ||||
| 									return ( | ||||
| 										<Blocks | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-02-04 10:32:45 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-12 15:21:27 | ||||
|  * @LastEditTime: 2021-07-12 17:12:35 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\components\leftConfig.tsx | ||||
|  */ | ||||
| import React, { ReactNode, useEffect, useMemo, useState } from 'react'; | ||||
| @@ -144,8 +144,8 @@ function LeftConfig(props: LeftConfigProps) { | ||||
| 		} | ||||
| 	}, [menuSelect, props.config, leftMapRenderListCategory, search]); | ||||
|  | ||||
| 	const [isCollapse, setCollapse] = useState(false); | ||||
| 	const [renderCollapse, setRenderCollaspe] = useState(false); | ||||
| 	const [isCollapse, setCollapse] = useState(props.config.getCollapse()); | ||||
| 	const [renderCollapse, setRenderCollaspe] = useState(props.config.getCollapse()); | ||||
|  | ||||
| 	return ( | ||||
| 		<div style={{ display: 'flex', height: '100%' }}> | ||||
| @@ -164,11 +164,15 @@ function LeftConfig(props: LeftConfigProps) { | ||||
| 							setCollapse((pre) => { | ||||
| 								if (pre) { | ||||
| 									setTimeout(() => { | ||||
| 										props.config.collapsed = false; | ||||
| 										setRenderCollaspe(false); | ||||
| 										props.config.getStore().forceUpdate(); | ||||
| 									}, 300); | ||||
| 									return !pre; | ||||
| 								} else { | ||||
| 									props.config.collapsed = true; | ||||
| 									setRenderCollaspe(true); | ||||
| 									props.config.getStore().forceUpdate(); | ||||
| 									return !pre; | ||||
| 								} | ||||
| 							}) | ||||
|   | ||||
| @@ -2,12 +2,11 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 05:42:13 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-10 16:06:33 | ||||
|  * @FilePath: \DooringV2\packages\dooringx-lib\src\components\rightConfig.tsx | ||||
|  * @LastEditTime: 2021-07-12 20:36:30 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\components\rightConfig.tsx | ||||
|  */ | ||||
| import { CreateOptionsRes } from '../core/components/formTypes'; | ||||
| import { IBlockType, IStoreData } from '../core/store/storetype'; | ||||
| import { store } from '../runtime/store'; | ||||
| import { PropsWithChildren, useEffect, useMemo, useState } from 'react'; | ||||
| import React from 'react'; | ||||
| import { Tabs, Input, Row, Col, Checkbox } from 'antd'; | ||||
| @@ -33,6 +32,9 @@ function RightConfig(props: PropsWithChildren<RightConfigProps>) { | ||||
| 	const rightMapRenderListCategory = useMemo(() => { | ||||
| 		return props.config.getConfig().rightRenderListCategory; | ||||
| 	}, [props.config]); | ||||
|  | ||||
| 	const store = props.config.getStore(); | ||||
|  | ||||
| 	useEffect(() => { | ||||
| 		const fn = () => { | ||||
| 			let item: IBlockType | undefined; | ||||
| @@ -52,7 +54,7 @@ function RightConfig(props: PropsWithChildren<RightConfigProps>) { | ||||
| 		return () => { | ||||
| 			unregist(); | ||||
| 		}; | ||||
| 	}, []); | ||||
| 	}, [store]); | ||||
| 	const render = useMemo(() => { | ||||
| 		return (type: string, current: IBlockType) => { | ||||
| 			const fn = () => props.config.getComponentRegister().getComp(current.name); | ||||
|   | ||||
| @@ -2,13 +2,13 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-02-21 22:17:29 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-04-05 18:24:27 | ||||
|  * @FilePath: \dooringv2\src\components\wrapperMove\event.ts | ||||
|  * @LastEditTime: 2021-07-12 20:33:14 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\components\wrapperMove\event.ts | ||||
|  */ | ||||
| import { store } from '../../runtime/store'; | ||||
| import { RefObject } from 'react'; | ||||
| import { containerResizer } from '../../core/resizeHandler/containerResizer'; | ||||
| import { contextMenuState } from '../../core/contextMenu'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| export interface WrapperMoveStateProps { | ||||
| 	isDrag: boolean; | ||||
| @@ -28,7 +28,9 @@ export const wrapperMoveState: WrapperMoveStateProps = { | ||||
| 	ref: null, | ||||
| }; | ||||
|  | ||||
| export const wrapperEvent = (ref: RefObject<HTMLDivElement>) => { | ||||
| export const wrapperEvent = (ref: RefObject<HTMLDivElement>, config: UserConfig) => { | ||||
| 	const scale = config.getScaleState().value; | ||||
| 	const store = config.getStore(); | ||||
| 	return { | ||||
| 		onMouseDown: (e: React.MouseEvent) => { | ||||
| 			// e.preventDefault();// 不能使用preventDefault 否则弹窗输入框焦点无法触发 | ||||
| @@ -49,10 +51,11 @@ export const wrapperEvent = (ref: RefObject<HTMLDivElement>) => { | ||||
| 			if (wrapperMoveState.isDrag) { | ||||
| 				const diffX = e.clientX - wrapperMoveState.startX; | ||||
| 				const diffY = e.clientY - wrapperMoveState.startY; | ||||
| 				wrapperMoveState.needX = wrapperMoveState.needX + diffX; | ||||
| 				wrapperMoveState.needY = wrapperMoveState.needY + diffY; | ||||
| 				wrapperMoveState.needX = wrapperMoveState.needX + diffX / scale; | ||||
| 				wrapperMoveState.needY = wrapperMoveState.needY + diffY / scale; | ||||
| 				wrapperMoveState.startX = e.clientX; | ||||
| 				wrapperMoveState.startY = e.clientY; | ||||
|  | ||||
| 				store.forceUpdate(); | ||||
| 			} | ||||
| 			containerResizer.onMouseMove(e); | ||||
|   | ||||
| @@ -2,15 +2,18 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-12 15:24:29 | ||||
|  * @LastEditTime: 2021-07-12 19:47:39 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\components\wrapperMove\index.tsx | ||||
|  */ | ||||
| import { AllHTMLAttributes, CSSProperties, PropsWithChildren, useRef } from 'react'; | ||||
| import { wrapperEvent } from './event'; | ||||
| import { onWheelEvent } from '../../core/scale'; | ||||
| import React from 'react'; | ||||
| import Ticker from './ticker'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| export interface ContainerWrapperProps extends AllHTMLAttributes<HTMLDivElement> { | ||||
| 	config: UserConfig; | ||||
| 	classNames?: string; | ||||
| 	style?: CSSProperties; | ||||
| } | ||||
| @@ -33,11 +36,12 @@ function ContainerWrapper(props: PropsWithChildren<ContainerWrapperProps>) { | ||||
| 				overflow: 'hidden', | ||||
| 				...style, | ||||
| 			}} | ||||
| 			{...wrapperEvent(ref)} | ||||
| 			{...onWheelEvent} | ||||
| 			{...wrapperEvent(ref, props.config)} | ||||
| 			{...onWheelEvent(props.config)} | ||||
| 			{...rest} | ||||
| 		> | ||||
| 			{children} | ||||
| 			<Ticker config={props.config}></Ticker> | ||||
| 		</div> | ||||
| 	); | ||||
| } | ||||
|   | ||||
							
								
								
									
										147
									
								
								packages/dooringx-lib/src/components/wrapperMove/ticker.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								packages/dooringx-lib/src/components/wrapperMove/ticker.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| /* | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-07-12 15:54:35 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-12 19:21:35 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\components\wrapperMove\ticker.tsx | ||||
|  */ | ||||
| import React, { useEffect, useRef, useState } from 'react'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| const width = '20px'; | ||||
| const indent = 50; | ||||
|  | ||||
| function Ticker(props: { config: UserConfig }) { | ||||
| 	const topRef = useRef<HTMLDivElement>(null); | ||||
| 	const leftRef = useRef<HTMLDivElement>(null); | ||||
| 	const [topRender, setTopRender] = useState(0); | ||||
| 	const [leftRender, setLeftRender] = useState(0); | ||||
|  | ||||
| 	const scale = props.config.getScaleState().value; | ||||
|  | ||||
| 	useEffect(() => { | ||||
| 		const timer = setTimeout(() => { | ||||
| 			if (topRef.current) { | ||||
| 				const width = topRef.current.getBoundingClientRect().width; | ||||
| 				const renderWidth = Math.ceil(width / 10 / scale); | ||||
| 				setTopRender(renderWidth); | ||||
| 			} | ||||
| 			// left可以不用放,但为了更新统一 | ||||
| 			if (leftRef.current) { | ||||
| 				const height = leftRef.current.getBoundingClientRect().height; | ||||
| 				const renderHeight = Math.ceil(height / 10 / scale); | ||||
| 				setLeftRender(renderHeight); | ||||
| 			} | ||||
| 		}, 300); | ||||
|  | ||||
| 		return () => { | ||||
| 			clearTimeout(timer); | ||||
| 		}; | ||||
| 	}, [props.config, props.config.collapsed, scale]); | ||||
|  | ||||
| 	return ( | ||||
| 		<> | ||||
| 			<div | ||||
| 				ref={topRef} | ||||
| 				style={{ | ||||
| 					position: 'absolute', | ||||
| 					top: 0, | ||||
| 					left: indent, | ||||
| 					width: '100%', | ||||
| 					height: width, | ||||
| 					display: 'flex', | ||||
| 					justifyContent: 'space-between', | ||||
| 				}} | ||||
| 			> | ||||
| 				{Array(topRender) | ||||
| 					.fill(1) | ||||
| 					.map((_, i) => { | ||||
| 						if (i % 10 === 0) { | ||||
| 							return ( | ||||
| 								<div | ||||
| 									key={i} | ||||
| 									style={{ | ||||
| 										background: 'rgb(204, 204, 204)', | ||||
| 										width: '1px', | ||||
| 										height: '12px', | ||||
| 										position: 'relative', | ||||
| 									}} | ||||
| 								> | ||||
| 									<div | ||||
| 										style={{ | ||||
| 											position: 'absolute', | ||||
| 											top: '20px', | ||||
| 											fontSize: '10px', | ||||
| 											left: '-2px', | ||||
| 											userSelect: 'none', | ||||
| 										}} | ||||
| 									> | ||||
| 										{i} | ||||
| 									</div> | ||||
| 								</div> | ||||
| 							); | ||||
| 						} else { | ||||
| 							return ( | ||||
| 								<div | ||||
| 									key={i} | ||||
| 									style={{ background: 'rgb(204, 204, 204)', width: '1px', height: '6px' }} | ||||
| 								></div> | ||||
| 							); | ||||
| 						} | ||||
| 					})} | ||||
| 			</div> | ||||
| 			<div | ||||
| 				ref={leftRef} | ||||
| 				style={{ | ||||
| 					position: 'absolute', | ||||
| 					top: indent, | ||||
| 					left: 0, | ||||
| 					width: width, | ||||
| 					height: '100%', | ||||
| 					display: 'flex', | ||||
| 					justifyContent: 'space-between', | ||||
| 					flexDirection: 'column', | ||||
| 				}} | ||||
| 			> | ||||
| 				{Array(leftRender) | ||||
| 					.fill(1) | ||||
| 					.map((_, i) => { | ||||
| 						if (i % 10 === 0) { | ||||
| 							return ( | ||||
| 								<div | ||||
| 									key={i} | ||||
| 									style={{ | ||||
| 										background: 'rgb(204, 204, 204)', | ||||
| 										width: '12px', | ||||
| 										height: '1px', | ||||
| 										position: 'relative', | ||||
| 									}} | ||||
| 								> | ||||
| 									<div | ||||
| 										style={{ | ||||
| 											position: 'absolute', | ||||
| 											left: '20px', | ||||
| 											fontSize: '10px', | ||||
| 											top: '-2px', | ||||
| 											userSelect: 'none', | ||||
| 										}} | ||||
| 									> | ||||
| 										{i} | ||||
| 									</div> | ||||
| 								</div> | ||||
| 							); | ||||
| 						} else { | ||||
| 							return ( | ||||
| 								<div | ||||
| 									key={i} | ||||
| 									style={{ background: 'rgb(204, 204, 204)', width: '6px', height: '1px' }} | ||||
| 								></div> | ||||
| 							); | ||||
| 						} | ||||
| 					})} | ||||
| 			</div> | ||||
| 		</> | ||||
| 	); | ||||
| } | ||||
|  | ||||
| export default Ticker; | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-02-25 21:16:58 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-12 14:49:32 | ||||
|  * @LastEditTime: 2021-07-12 16:49:46 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\config\index.tsx | ||||
|  */ | ||||
| import { IBlockType, IStoreData } from '../core/store/storetype'; | ||||
| @@ -321,6 +321,7 @@ export class UserConfig { | ||||
| 	public eventCenter: EventCenter; | ||||
| 	public dataCenter: DataCenter; | ||||
| 	public scaleState = scaleState; | ||||
| 	public collapsed = false; | ||||
| 	constructor(initConfig?: Partial<InitConfig>) { | ||||
| 		const mergeConfig = userConfigMerge(defaultConfig, initConfig); | ||||
| 		this.initConfig = mergeConfig; | ||||
| @@ -370,6 +371,10 @@ export class UserConfig { | ||||
| 		this.toRegist(); | ||||
| 	} | ||||
|  | ||||
| 	getCollapse() { | ||||
| 		return this.collapsed; | ||||
| 	} | ||||
|  | ||||
| 	getStoreJSON() { | ||||
| 		return JSON.stringify(this.store.getData()); | ||||
| 	} | ||||
|   | ||||
| @@ -2,14 +2,14 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-05 22:46:15 | ||||
|  * @FilePath: \DooringV2\packages\dooring-v2-lib\src\core\contextMenu\index.tsx | ||||
|  * @LastEditTime: 2021-07-12 20:31:47 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\contextMenu\index.tsx | ||||
|  */ | ||||
| import { Button } from 'antd'; | ||||
| import React, { RefObject, useState } from 'react'; | ||||
| import { ReactElement } from 'react'; | ||||
| import ReactDOM, { unmountComponentAtNode } from 'react-dom'; | ||||
| import { scaleState } from '../scale/state'; | ||||
| import UserConfig from '../../config'; | ||||
| import { isMac } from '../utils'; | ||||
|  | ||||
| const ContextMenu = () => { | ||||
| @@ -68,9 +68,11 @@ export const contextMenuState: ContextMenuStateProps = { | ||||
|  | ||||
| export function contextMenuEvent( | ||||
| 	e: React.MouseEvent<HTMLDivElement, MouseEvent>, | ||||
| 	ref: RefObject<HTMLDivElement> | ||||
| 	ref: RefObject<HTMLDivElement>, | ||||
| 	userConfig: UserConfig | ||||
| ) { | ||||
| 	e.preventDefault(); | ||||
| 	const scaleState = userConfig.getScaleState(); | ||||
| 	contextMenuState.unmountContextMenu(); | ||||
| 	const config: MutationObserverInit = { | ||||
| 		attributes: true, | ||||
|   | ||||
| @@ -2,15 +2,14 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-10 18:34:40 | ||||
|  * @LastEditTime: 2021-07-12 20:11:56 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\crossDrag\index.ts | ||||
|  */ | ||||
| import { store } from '../../runtime/store'; | ||||
| import { componentRegister } from '../../runtime'; | ||||
| import { DragEvent, ReactNode } from 'react'; | ||||
| import { createBlock } from '../components/createBlock'; | ||||
| import { IBlockType } from '../store/storetype'; | ||||
| import { deepCopy } from '../utils'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| /** | ||||
|  * | ||||
| @@ -43,42 +42,46 @@ export const dragEventResolve = function (item: LeftRegistComponentMapItem) { | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| export const containerDragResolve = { | ||||
| 	onDragStart: () => {}, | ||||
| 	onDragOver: (e: DragEvent<HTMLDivElement>) => { | ||||
| 		e.preventDefault(); | ||||
| 	}, | ||||
| 	onDrop: (e: DragEvent<HTMLDivElement>) => { | ||||
| 		const offsetX = e.nativeEvent.offsetX; | ||||
| 		const offestY = e.nativeEvent.offsetY; | ||||
| 		//drop后修改store, | ||||
| 		if (currentDrag) { | ||||
| 			// 还需要拿到注册的组件状态 | ||||
| 			const origin = componentRegister.getComp(currentDrag.component); | ||||
| 			if (!origin) { | ||||
| 				console.log(currentDrag.component, 'wait the chunk pull compeletely and retry'); | ||||
| 				return; | ||||
| 			} | ||||
| 			const target = e.target as HTMLElement; | ||||
| 			let newblock: IBlockType; | ||||
| 			if (!origin.needPosition) { | ||||
| 				newblock = createBlock( | ||||
| 					origin.initData.top ?? offestY, | ||||
| 					origin.initData.left ?? offsetX, | ||||
| 					origin | ||||
| 				); | ||||
| 			} else { | ||||
| 				if (target.id !== 'yh-container') { | ||||
| 					newblock = createBlock(offestY + target.offsetTop, offsetX + target.offsetLeft, origin); | ||||
| 				} else { | ||||
| 					newblock = createBlock(offestY, offsetX, origin); | ||||
| export const containerDragResolve = (config: UserConfig) => { | ||||
| 	const store = config.getStore(); | ||||
| 	const componentRegister = config.getComponentRegister(); | ||||
| 	return { | ||||
| 		onDragStart: () => {}, | ||||
| 		onDragOver: (e: DragEvent<HTMLDivElement>) => { | ||||
| 			e.preventDefault(); | ||||
| 		}, | ||||
| 		onDrop: (e: DragEvent<HTMLDivElement>) => { | ||||
| 			const offsetX = e.nativeEvent.offsetX; | ||||
| 			const offestY = e.nativeEvent.offsetY; | ||||
| 			//drop后修改store, | ||||
| 			if (currentDrag) { | ||||
| 				// 还需要拿到注册的组件状态 | ||||
| 				const origin = componentRegister.getComp(currentDrag.component); | ||||
| 				if (!origin) { | ||||
| 					console.log(currentDrag.component, 'wait the chunk pull compeletely and retry'); | ||||
| 					return; | ||||
| 				} | ||||
| 				const target = e.target as HTMLElement; | ||||
| 				let newblock: IBlockType; | ||||
| 				if (!origin.needPosition) { | ||||
| 					newblock = createBlock( | ||||
| 						origin.initData.top ?? offestY, | ||||
| 						origin.initData.left ?? offsetX, | ||||
| 						origin | ||||
| 					); | ||||
| 				} else { | ||||
| 					if (target.id !== 'yh-container') { | ||||
| 						newblock = createBlock(offestY + target.offsetTop, offsetX + target.offsetLeft, origin); | ||||
| 					} else { | ||||
| 						newblock = createBlock(offestY, offsetX, origin); | ||||
| 					} | ||||
| 				} | ||||
| 				const data = deepCopy(store.getData()); | ||||
| 				data.block.push(newblock); | ||||
| 				store.setData({ ...data }); | ||||
| 			} | ||||
| 			const data = deepCopy(store.getData()); | ||||
| 			data.block.push(newblock); | ||||
| 			store.setData({ ...data }); | ||||
| 		} | ||||
| 		currentDrag = null; | ||||
| 	}, | ||||
| 	onDragEnd: () => {}, | ||||
| 			currentDrag = null; | ||||
| 		}, | ||||
| 		onDragEnd: () => {}, | ||||
| 	}; | ||||
| }; | ||||
|   | ||||
| @@ -2,18 +2,19 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-03-14 12:10:16 | ||||
|  * @FilePath: \dooring-v2\src\core\focusHandler\index.tsx | ||||
|  * @LastEditTime: 2021-07-12 20:48:04 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\focusHandler\index.tsx | ||||
|  */ | ||||
| import { store } from '../../runtime/store'; | ||||
| import { innerDragState } from '../innerDrag/state'; | ||||
| import { IBlockType } from '../store/storetype'; | ||||
| import { deepCopy } from '../utils'; | ||||
| import { selectRangeMouseDown } from '../selectRange'; | ||||
| import { unmountContextMenu } from '../contextMenu'; | ||||
| import { focusState } from './state'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| export function containerFocusRemove() { | ||||
| export function containerFocusRemove(config: UserConfig) { | ||||
| 	const store = config.getStore(); | ||||
| 	const onMouseDown = (e: React.MouseEvent) => { | ||||
| 		const clonedata = deepCopy(store.getData()); | ||||
| 		const newBlock = clonedata.block.map((v: IBlockType) => { | ||||
| @@ -23,7 +24,7 @@ export function containerFocusRemove() { | ||||
| 		focusState.blocks = []; | ||||
| 		store.setData({ ...clonedata, block: newBlock }); | ||||
| 		if (!innerDragState.item) { | ||||
| 			selectRangeMouseDown(e); | ||||
| 			selectRangeMouseDown(e, config); | ||||
| 		} | ||||
| 		unmountContextMenu(); | ||||
| 	}; | ||||
| @@ -32,7 +33,8 @@ export function containerFocusRemove() { | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| export function blockFocus(e: React.MouseEvent, item: IBlockType) { | ||||
| export function blockFocus(e: React.MouseEvent, item: IBlockType, config: UserConfig) { | ||||
| 	const store = config.getStore(); | ||||
| 	const clonedata = deepCopy(store.getData()); | ||||
| 	if (e.shiftKey) { | ||||
| 		const newBlock = clonedata.block.map((v: IBlockType) => { | ||||
|   | ||||
| @@ -1,26 +1,30 @@ | ||||
| import { store } from '../../runtime/store'; | ||||
| import { RefObject } from 'react'; | ||||
| import { blockFocus, containerFocusRemove } from '../focusHandler'; | ||||
| import { marklineConfig } from '../markline/marklineConfig'; | ||||
| import { resizerMouseMove, resizerMouseUp } from '../resizeHandler'; | ||||
| import { scaleState } from '../scale/state'; | ||||
| import { selectRangeMouseMove, selectData, selectRangeMouseUp } from '../selectRange'; | ||||
| import { IBlockType } from '../store/storetype'; | ||||
| import { deepCopy, isMac } from '../utils'; | ||||
| import { wrapperMoveMouseUp } from '../../components/wrapperMove/event'; | ||||
| import { contextMenuState } from '../contextMenu'; | ||||
| import { innerDragState } from './state'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| export const innerDrag = function (item: IBlockType, ref: RefObject<HTMLDivElement>) { | ||||
| export const innerDrag = function ( | ||||
| 	item: IBlockType, | ||||
| 	ref: RefObject<HTMLDivElement>, | ||||
| 	config: UserConfig | ||||
| ) { | ||||
| 	const store = config.getStore(); | ||||
| 	return { | ||||
| 		onMouseDown: (e: React.MouseEvent) => { | ||||
| 			e.preventDefault(); | ||||
| 			e.stopPropagation(); | ||||
| 			if (!item.canDrag) { | ||||
| 				containerFocusRemove().onMouseDown(e); | ||||
| 				containerFocusRemove(config).onMouseDown(e); | ||||
| 				return; | ||||
| 			} | ||||
| 			blockFocus(e, item); | ||||
| 			blockFocus(e, item, config); | ||||
| 			if (item.id && innerDragState.lastClick && item.id !== innerDragState.lastClick.id) { | ||||
| 				contextMenuState.unmountContextMenu(); | ||||
| 			} | ||||
| @@ -43,8 +47,10 @@ export const innerDrag = function (item: IBlockType, ref: RefObject<HTMLDivEleme | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| export const innerContainerDrag = function () { | ||||
| export const innerContainerDrag = function (config: UserConfig) { | ||||
| 	let lastblock: null | IBlockType; | ||||
| 	const store = config.getStore(); | ||||
| 	const scaleState = config.getScaleState(); | ||||
| 	const onMouseMove = (e: React.MouseEvent) => { | ||||
| 		e.preventDefault(); | ||||
| 		if (isMac() && contextMenuState.state) { | ||||
| @@ -96,7 +102,8 @@ export const innerContainerDrag = function () { | ||||
| 		onMouseMove, | ||||
| 	}; | ||||
| }; | ||||
| export const innerContainerDragUp = function () { | ||||
| export const innerContainerDragUp = function (config: UserConfig) { | ||||
| 	const store = config.getStore(); | ||||
| 	const onMouseUp = (e: React.MouseEvent) => { | ||||
| 		e.preventDefault(); | ||||
| 		wrapperMoveMouseUp(); | ||||
|   | ||||
| @@ -2,22 +2,23 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-03-14 11:49:50 | ||||
|  * @FilePath: \dooring-v2\src\core\markline\calcRender.ts | ||||
|  * @LastEditTime: 2021-07-12 20:56:02 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\markline\calcRender.ts | ||||
|  */ | ||||
| import { store } from '../../runtime/store'; | ||||
| import { innerDragState } from '../innerDrag/state'; | ||||
| import { scaleState } from '../scale/state'; | ||||
| import { grideModeRender, gridModeDisplay } from './gridMode'; | ||||
| import { switchMarklineDisplay } from './normalMode'; | ||||
| import { resizeCurrentCalculate } from './resizeMarkline'; | ||||
| import { marklineConfig } from './marklineConfig'; | ||||
| import UserConfig from '../../config'; | ||||
| export interface LinesTypes { | ||||
| 	x: number[]; | ||||
| 	y: number[]; | ||||
| } | ||||
|  | ||||
| export function marklineCalRender() { | ||||
| export function marklineCalRender(config: UserConfig) { | ||||
| 	const store = config.getStore(); | ||||
| 	const scaleState = config.getScaleState(); | ||||
| 	//focus可能好几个,做对比的是拖拽那个 | ||||
| 	const lines: LinesTypes = { x: [], y: [] }; | ||||
| 	if (innerDragState.item?.position === 'static' || innerDragState.item?.position === 'relative') { | ||||
| @@ -65,15 +66,15 @@ export function marklineCalRender() { | ||||
| 			} | ||||
| 		}); | ||||
| 		if (marklineConfig.mode === 'grid' && marklineConfig.isAbsorb) { | ||||
| 			gridModeDisplay(left, top, focus); | ||||
| 			gridModeDisplay(left, top, focus, config); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (marklineConfig.mode === 'grid') { | ||||
| 		grideModeRender(lines); | ||||
| 		grideModeRender(lines, config); | ||||
| 	} | ||||
|  | ||||
| 	resizeCurrentCalculate(lines); | ||||
| 	resizeCurrentCalculate(lines, config); | ||||
|  | ||||
| 	return lines; | ||||
| } | ||||
|   | ||||
| @@ -2,17 +2,18 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-03-14 11:49:43 | ||||
|  * @FilePath: \dooring-v2\src\core\markline\gridMode.ts | ||||
|  * @LastEditTime: 2021-07-12 20:56:19 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\markline\gridMode.ts | ||||
|  */ | ||||
| import { store } from '../../runtime/store'; | ||||
| import UserConfig from '../../config'; | ||||
| import { IBlockType } from '../store/storetype'; | ||||
| import { deepCopy } from '../utils'; | ||||
| import { LinesTypes } from './calcRender'; | ||||
| import { marklineConfig } from './marklineConfig'; | ||||
| export function gridModeDisplay(left: number, top: number, focus: IBlockType) { | ||||
| export function gridModeDisplay(left: number, top: number, focus: IBlockType, config: UserConfig) { | ||||
| 	// 有吸附走吸附,只吸top和left,宽高不需要 | ||||
| 	// 无吸附拖拽时显示所有网格。 | ||||
| 	const store = config.getStore(); | ||||
| 	const container = store.getData().container; | ||||
| 	const containerWidth = container.width; | ||||
| 	const containerHeight = container.height; | ||||
| @@ -55,7 +56,8 @@ export const lastGridStatus: lastGridStatusProps = { | ||||
| 	lastLine: { x: [], y: [] }, | ||||
| }; | ||||
|  | ||||
| export function grideModeRender(lines: LinesTypes) { | ||||
| export function grideModeRender(lines: LinesTypes, config: UserConfig) { | ||||
| 	const store = config.getStore(); | ||||
| 	const container = store.getData().container; | ||||
| 	const containerWidth = container.width; | ||||
| 	const containerHeight = container.height; | ||||
|   | ||||
| @@ -2,11 +2,12 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-03-14 11:45:22 | ||||
|  * @FilePath: \dooring-v2\src\core\markline\index.tsx | ||||
|  * @LastEditTime: 2021-07-12 20:59:27 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\markline\index.tsx | ||||
|  */ | ||||
| import React from 'react'; | ||||
| import { useMemo } from 'react'; | ||||
| import UserConfig from '../../config'; | ||||
| import { IBlockType } from '../store/storetype'; | ||||
| import { marklineCalRender } from './calcRender'; | ||||
|  | ||||
| @@ -62,8 +63,8 @@ export function MarklineY(props: any) { | ||||
| 	); | ||||
| } | ||||
|  | ||||
| export function NormalMarkLineRender() { | ||||
| 	const lines = marklineCalRender(); | ||||
| export function NormalMarkLineRender(props: { config: UserConfig }) { | ||||
| 	const lines = marklineCalRender(props.config); | ||||
| 	const render = useMemo(() => { | ||||
| 		return ( | ||||
| 			<> | ||||
|   | ||||
| @@ -2,21 +2,22 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-02-18 11:52:38 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-03-14 11:49:58 | ||||
|  * @FilePath: \dooring-v2\src\core\markline\resizeMarkline.ts | ||||
|  * @LastEditTime: 2021-07-12 20:54:50 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\markline\resizeMarkline.ts | ||||
|  */ | ||||
|  | ||||
| import { store } from '../../runtime/store'; | ||||
| import { resizeState } from '../resizeHandler'; | ||||
| import { scaleState } from '../scale/state'; | ||||
| import { LinesTypes } from './calcRender'; | ||||
| import { switchMarklineResizeDisplay } from './normalMode'; | ||||
| import { marklineConfig } from './marklineConfig'; | ||||
| import UserConfig from '../../config'; | ||||
|  | ||||
| export function resizeCurrentCalculate(lines: LinesTypes) { | ||||
| export function resizeCurrentCalculate(lines: LinesTypes, config: UserConfig) { | ||||
| 	const id = resizeState.item?.id; | ||||
|  | ||||
| 	if (resizeState.ref?.current && id) { | ||||
| 		const store = config.getStore(); | ||||
| 		const scaleState = config.getScaleState(); | ||||
| 		const newblock = store.getData().block; | ||||
| 		const unfocus = newblock.filter((v) => v.id !== id); | ||||
| 		const { width, height } = resizeState.ref.current.getBoundingClientRect(); | ||||
|   | ||||
| @@ -2,8 +2,8 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-09 15:19:36 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-03-14 04:52:57 | ||||
|  * @FilePath: \dooring-v2\src\core\resizeHandler\containerResizer.ts | ||||
|  * @LastEditTime: 2021-07-12 19:25:09 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\resizeHandler\containerResizer.ts | ||||
|  */ | ||||
|  | ||||
| import { store } from '../../runtime/store'; | ||||
| @@ -15,6 +15,7 @@ export const containerState = { | ||||
| 	isDrag: false, | ||||
| 	startY: 0, | ||||
| 	startIndex: 0, | ||||
| 	minHeight: 667, | ||||
| }; | ||||
|  | ||||
| export const containerResizer = { | ||||
| @@ -29,7 +30,8 @@ export const containerResizer = { | ||||
| 			const diff = ((e.clientY - containerState.startY) / scale) * 2; | ||||
| 			const clonedata: IStoreData = deepCopy(store.getData()); | ||||
| 			const height = clonedata.container.height; | ||||
| 			let tmpHeight = height + diff < 600 ? 600 : height + diff; | ||||
| 			let tmpHeight = | ||||
| 				height + diff < containerState.minHeight ? containerState.minHeight : height + diff; | ||||
| 			clonedata.container.height = tmpHeight; | ||||
| 			store.setData(clonedata); | ||||
| 			containerState.startY = e.clientY; | ||||
|   | ||||
| @@ -2,40 +2,44 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 04:29:09 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-04-05 22:18:43 | ||||
|  * @FilePath: \dooringv2\src\core\scale\index.ts | ||||
|  * @LastEditTime: 2021-07-12 20:04:17 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\core\scale\index.ts | ||||
|  */ | ||||
| import { store } from '../../runtime/store'; | ||||
| import Store from '../store'; | ||||
| import UserConfig from '../../config'; | ||||
| import { scaleCancelFn } from './cancel'; | ||||
| import { scaleState } from './state'; | ||||
|  | ||||
| export const onWheelEvent = { | ||||
| 	onWheel: (e: React.WheelEvent<HTMLDivElement>) => { | ||||
| 		const dom = document.querySelector('.ant-modal-mask'); | ||||
| 		if (dom) { | ||||
| 			//出现弹窗禁止滚动 | ||||
| 			return; | ||||
| 		} | ||||
| 		if (e.deltaY > 0) { | ||||
| 			scaleCancelFn(); | ||||
| 			if (scaleState.value < scaleState.maxValue) { | ||||
| 				scaleState.value = scaleState.value + 0.1; | ||||
| 				store.forceUpdate(); | ||||
| export const onWheelEvent = (config: UserConfig) => { | ||||
| 	const store = config.getStore(); | ||||
| 	const scale = config.getScaleState(); | ||||
| 	return { | ||||
| 		onWheel: (e: React.WheelEvent<HTMLDivElement>) => { | ||||
| 			const dom = document.querySelector('.ant-modal-mask'); | ||||
| 			if (dom) { | ||||
| 				//出现弹窗禁止滚动 | ||||
| 				return; | ||||
| 			} | ||||
| 		} else { | ||||
| 			scaleCancelFn(); | ||||
| 			//往上滚缩小 | ||||
| 			if (scaleState.value > scaleState.minValue) { | ||||
| 				scaleState.value = scaleState.value - 0.1; | ||||
| 				store.forceUpdate(); | ||||
| 			if (e.deltaY > 0) { | ||||
| 				scaleCancelFn(); | ||||
| 				if (scale.value < scale.maxValue) { | ||||
| 					scale.value = scale.value + 0.1; | ||||
| 					store.forceUpdate(); | ||||
| 				} | ||||
| 			} else { | ||||
| 				scaleCancelFn(); | ||||
| 				//往上滚缩小 | ||||
| 				if (scale.value > scale.minValue) { | ||||
| 					scale.value = scale.value - 0.1; | ||||
| 					store.forceUpdate(); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 		}, | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| export const scaleFn = { | ||||
| 	increase(number: number = 0.1, store: Store) { | ||||
| 	increase(number: number = 0.1, config: UserConfig) { | ||||
| 		const store = config.getStore(); | ||||
| 		const scaleState = config.getScaleState(); | ||||
| 		if (scaleState.value < scaleState.maxValue) { | ||||
| 			scaleCancelFn(); | ||||
| 			scaleState.value = scaleState.value + number; | ||||
| @@ -43,7 +47,9 @@ export const scaleFn = { | ||||
| 		} | ||||
| 		return scaleState.value; | ||||
| 	}, | ||||
| 	decrease(number: number = 0.1, store: Store) { | ||||
| 	decrease(number: number = 0.1, config: UserConfig) { | ||||
| 		const store = config.getStore(); | ||||
| 		const scaleState = config.getScaleState(); | ||||
| 		scaleCancelFn(); | ||||
| 		if (scaleState.value > scaleState.minValue) { | ||||
| 			scaleState.value = scaleState.value - number; | ||||
|   | ||||
| @@ -1,9 +1,8 @@ | ||||
| import { store } from '../../runtime/store'; | ||||
| import { IStoreData } from '../store/storetype'; | ||||
| import { deepCopy } from '../utils'; | ||||
| import { focusState } from '../focusHandler/state'; | ||||
| import { scaleState } from '../scale/state'; | ||||
| import style from '../../index.less'; | ||||
| import UserConfig from '../../config'; | ||||
| export interface SelectDataProps { | ||||
| 	selectDiv: HTMLDivElement | null; | ||||
| 	posx: number; | ||||
| @@ -20,7 +19,7 @@ export const selectData: SelectDataProps = { | ||||
| 	startY: 0, | ||||
| }; | ||||
|  | ||||
| export function selectRangeMouseDown(e: React.MouseEvent) { | ||||
| export function selectRangeMouseDown(e: React.MouseEvent, config: UserConfig) { | ||||
| 	if (!selectData.selectDiv) { | ||||
| 		selectData.selectDiv = document.createElement('div'); | ||||
| 	} | ||||
| @@ -34,7 +33,7 @@ export function selectRangeMouseDown(e: React.MouseEvent) { | ||||
| 		selectData.selectDiv.style.top = e.clientY + 'px'; | ||||
| 		selectData.selectDiv.style.position = 'fixed'; | ||||
| 		document.body.appendChild(selectData.selectDiv); | ||||
| 		selectData.selectDiv.onmouseup = (e) => selectRangeMouseUp(e); | ||||
| 		selectData.selectDiv.onmouseup = (e) => selectRangeMouseUp(e, config); | ||||
| 		selectData.selectDiv.onmousemove = (e) => selectRangeMouseMove(e); | ||||
| 	} | ||||
| } | ||||
| @@ -52,10 +51,11 @@ function typeGuard(e: React.MouseEvent | MouseEvent): e is React.MouseEvent { | ||||
| 	return !(e instanceof Event); | ||||
| } | ||||
|  | ||||
| function selectFocus(left: number, top: number, width: number, height: number) { | ||||
| function selectFocus(left: number, top: number, width: number, height: number, config: UserConfig) { | ||||
| 	if (width === 0 || height === 0) { | ||||
| 		return; | ||||
| 	} | ||||
| 	const store = config.getStore(); | ||||
| 	const clonedata: IStoreData = deepCopy(store.getData()); | ||||
| 	const blocks = clonedata.block; | ||||
| 	let change = false; | ||||
| @@ -75,13 +75,14 @@ function selectFocus(left: number, top: number, width: number, height: number) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| export function selectRangeMouseUp(e: React.MouseEvent | MouseEvent) { | ||||
| export function selectRangeMouseUp(e: React.MouseEvent | MouseEvent, config: UserConfig) { | ||||
| 	if (selectData.selectDiv) { | ||||
| 		// 这里需要判定区域 | ||||
| 		// 如果是react触发 ,left和top就是起始值和终止值的最小值 | ||||
| 		// 如果是原生触发,left和top是起始点减去其宽高 | ||||
| 		let left = 0; | ||||
| 		let top = 0; | ||||
| 		const scaleState = config.getScaleState(); | ||||
| 		const { width, height } = selectData.selectDiv.getBoundingClientRect(); | ||||
| 		const scale = scaleState.value; | ||||
| 		const wwidth = width / scale; | ||||
| @@ -93,7 +94,7 @@ export function selectRangeMouseUp(e: React.MouseEvent | MouseEvent) { | ||||
| 			left = selectData.startX - wwidth; | ||||
| 			top = selectData.startY - wheight; | ||||
| 		} | ||||
| 		selectFocus(left, top, wwidth, wheight); | ||||
| 		selectFocus(left, top, wwidth, wheight, config); | ||||
| 		selectData.selectDiv.parentNode!.removeChild(selectData.selectDiv); | ||||
| 		selectData.selectDiv = null; | ||||
| 	} | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * @Author: yehuozhili | ||||
|  * @Date: 2021-03-14 05:35:15 | ||||
|  * @LastEditors: yehuozhili | ||||
|  * @LastEditTime: 2021-07-12 14:48:38 | ||||
|  * @LastEditTime: 2021-07-12 15:52:06 | ||||
|  * @FilePath: \dooringx\packages\dooringx-lib\src\hooks\index.ts | ||||
|  */ | ||||
| import { useEffect, useMemo, useState } from 'react'; | ||||
| @@ -94,6 +94,6 @@ export function useDynamicAddEventCenter( | ||||
| 				eventCenter.manualUpdateMap(eventName, displayName); | ||||
| 			} | ||||
| 		} | ||||
| 	}, [eventCenter, props.data.eventMap, props.data.id, props.store]); | ||||
| 	}, [displayName, eventCenter, eventName, props.data.eventMap, props.data.id, props.store]); | ||||
| 	return; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hufeixiong
					hufeixiong