/* * @Author: yehuozhili * @Date: 2021-08-09 15:15:25 * @LastEditors: yehuozhili * @LastEditTime: 2022-01-12 17:44:22 * @FilePath: \dooringx\packages\dooringx-lib\src\components\timeLine\timeline.tsx */ import deepcopy from 'deepcopy'; import React, { CSSProperties, useEffect, useMemo, useRef, useState } from 'react'; import { SortableContainer, SortableElement, SortableHandle, SortEnd } from 'react-sortable-hoc'; import UserConfig from '../../config'; import { IBlockType, IStoreData } from '../../core/store/storetype'; import { arrayMove } from '../../core/utils'; import { DeleteOutlined, EyeInvisibleOutlined, EyeOutlined, MenuOutlined, PlayCircleOutlined, } from '@ant-design/icons'; import { TimeLineItem, itemHeight, TimeLineItemMouseMove, TimeLineItemMouseOver, interval, iter, } from './timelineItem'; import { specialCoList } from '../../core/utils/special'; import { replaceLocale } from '../../locale'; import { Popconfirm } from 'antd'; export interface TimeLineProps { style?: CSSProperties; classes?: string; config: UserConfig; } export interface TimeLineConfigType { autoFocus: boolean; scrollDom: null | HTMLDivElement; } export interface TimeLineNeedleConfigType { status: 'stop' | 'start' | 'pause'; runFunc: Function; resetFunc: Function; current: number; } const animateTicker = new Array(iter).fill(1).map((_, y) => y); const DragHandle = SortableHandle(() => ); const leftWidth = 200; let WAIT = false; const widthInterval = interval * 10 + 9; const ruleWidth = (widthInterval * iter) / 10 + 10; const borderColor = '1px solid rgb(204, 204, 204)'; const SortableItem = SortableElement( ({ value, }: { value: { value: IBlockType; config: UserConfig; }; }) => (
{ const store = value.config.getStore(); const clone = deepcopy(store.getData()); clone.block.forEach((v) => { if (v.id === value.value.id && !specialCoList.includes(value.value.name)) { v.focus = true; } else { v.focus = false; } }); store.setData(clone); }} style={{ display: 'flex', alignItems: 'center', width: leftWidth, overflow: 'auto', minWidth: leftWidth, borderRight: borderColor, borderBottom: borderColor, backgroundColor: value.value.focus ? '#76767680' : 'initial', cursor: 'pointer', }} >
{value.config.getComponentRegister().getMap()[value.value.name].display}
{value.value.id.slice(-6)}
{ const store = value.config.getStore(); const clone = deepcopy(store.getData()); clone.block = clone.block.map((v) => { if (v.id === value.value.id && !specialCoList.includes(value.value.name)) { v.canSee = !v.canSee; return v; } return v; }); store.setData(clone); }} > {value.value.canSee ? : } { const store = value.config.getStore(); const clone = deepcopy(store.getData()); clone.block = clone.block.filter((v) => { return !(v.id === value.value.id && !specialCoList.includes(value.value.name)); }); store.setData(clone); }} okText={replaceLocale('yes', '确定', value.config)} cancelText={replaceLocale('no', '取消', value.config)} >
) ); const SortableList = SortableContainer( ({ items, }: { items: { data: IBlockType[]; config: UserConfig; }; }) => { return (
{items.data.map((value, index: number) => ( ))}
); } ); let cacheBlock: IBlockType[] = []; // const needleWidth = 2; // const initialLeft = 20 - needleWidth / 2; // let timer: number | null = null; export function TimeLine(props: TimeLineProps) { const store = props.config.getStore(); const data = store.getData().block; const forceUpdate = useState(0)[1]; const onSortEnd = (sort: SortEnd) => { const { oldIndex, newIndex } = sort; const newblocks: IBlockType[] = arrayMove(data, oldIndex, newIndex); const isEdit = props.config.getStoreChanger().isEdit(); if (isEdit) { const firstType = newblocks[0].name; if (firstType !== 'modalMask') { return; } } const store = props.config.getStore(); const cloneData: IStoreData = deepcopy(store.getData()); cloneData.block = newblocks; store.setData(cloneData); }; const [state, setState] = useState(0); const [scrollx, setScrollx] = useState(0); const content = (
); const renderData = useMemo(() => { if (props.config.waitAnimate) { return cacheBlock; } cacheBlock = data; return cacheBlock; }, [data, props.config.waitAnimate]); const ref = useRef(null); useEffect(() => { if (ref.current) { props.config.timelineConfig.scrollDom = ref.current; } }, [props.config]); // const [needle, setNeedle] = useState(initialLeft); //const needleStart = () => { // props.config.timelineNeedleConfig.current = 0; // setNeedle(initialLeft); // //每过0.1秒移动2 // if (timer) { // window.clearInterval(timer); // } // props.config.timelineNeedleConfig.status = 'start'; // const cloneData: IStoreData = deepcopy(store.getData()); // store.setData(cloneData); // store.cleanLast(); // timer = window.setInterval(() => { // if (needle < ruleWidth) { // setNeedle((pre) => { // props.config.timelineNeedleConfig.current = (pre - initialLeft) / 20; // console.log(props.config.timelineNeedleConfig.current); // return pre + 2; // }); // } // }, 100); // }; // const needlePlay = async () => { // if (timer) { // window.clearInterval(timer); // } // await resetAnimate(); // setTimeout(() => { // props.config.timelineNeedleConfig.status = 'pause'; // timer = window.setInterval(() => { // if (needle < ruleWidth) { // setNeedle((pre) => { // props.config.timelineNeedleConfig.current = (pre - initialLeft) / 20; // return pre + 2; // }); // } // }, 100); // }); // }; // const needleReset = () => { // if (timer) { // window.clearInterval(timer); // } // props.config.timelineNeedleConfig.status = 'pause'; // props.config.timelineNeedleConfig.current = 0; // resetAnimate(); // setNeedle(initialLeft); // store.cleanLast(); // }; // const needlePause = () => { // props.config.timelineNeedleConfig.status = 'pause'; // if (timer) { // window.clearInterval(timer); // } // const cloneData: IStoreData = deepcopy(store.getData()); // store.setData(cloneData); // store.cleanLast(); // }; // props.config.timelineNeedleConfig.resetFunc = needleReset; // props.config.timelineNeedleConfig.runFunc = needleStart; return (
<>
{replaceLocale('timeline.name', '组件名称', props.config)}
{/* needleReset()} /> needlePause()} /> */} { //缓存所有animate后执行 if (!WAIT) { WAIT = true; props.config.waitAnimate = true; const cache = data.map((v) => { return v.animate; }); const cloneData: IStoreData = deepcopy(store.getData()); cloneData.block.forEach((v) => { v.animate = []; }); store.setData(cloneData); setTimeout(() => { const cloneData: IStoreData = deepcopy(store.getData()); cloneData.block.forEach((v, i) => { v.animate = cache[i]; }); WAIT = false; props.config.waitAnimate = false; store.setData(cloneData); store.cleanLast(); }); } }} >
{content}
{/*
*/}
{animateTicker.map((v) => { if (v % 10 === 0) { return (
{v}
); } else { return (
); } })}
{ const target = e.target as HTMLDivElement; setState(target.scrollTop); setScrollx(target.scrollLeft); }} ref={ref} style={{ overflow: 'auto', height: `calc(100% - ${itemHeight}px)` }} > {renderData.map((v) => { return (
{ TimeLineItemMouseMove(e, v.animate, forceUpdate); }} onMouseLeave={() => TimeLineItemMouseOver()} onMouseUp={() => TimeLineItemMouseOver()} > {animateTicker.map((v) => { if (v % 10 === 0) { return (
); } else { return null; } })}
); })}
); } export default TimeLine;