UNPKG

@bos-alpha/progress

Version:

进度管理

162 lines (161 loc) 8.76 kB
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } return cooked; }; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useEffect, useRef, useState } from 'react'; import { Select, DatePicker, Row, Col, Slider } from 'antd'; import dayjs from 'dayjs'; import moment from 'moment'; import styled from '@emotion/styled'; import { Icon, prefixCls } from '@bos-alpha/common'; var Option = Select.Option; /** * 进度模拟播放 1.对3D模型当前时间节点高亮构件 2.对甘特图进行操作(按天滚动) * @param tableData 进度模拟表格数据 */ export var ProgressPlay = function (_a) { var tableData = _a.tableData, onChange = _a.onChange; // 甘特图时间节段数 var _b = useState(1), stepUnit = _b[0], setStepUnit = _b[1]; // 时间区间 var _c = useState(0), timeStart = _c[0], setTimeStart = _c[1]; var _d = useState(0), timeEnd = _d[0], setTimeEnd = _d[1]; // 滑块下标 var _e = useState({}), sliderMarks = _e[0], setSliderMarks = _e[1]; // 滑块每段时间数值跨度 步长 【此数值必须可被 (max - min) 整除 不然Slider会卡死】 var _f = useState(1), perStep = _f[0], setPerStep = _f[1]; // 当前步级 值为时间戳 var _g = useState(0), curStep = _g[0], setCurStep = _g[1]; // 正在模拟中 var _h = useState(false), playing = _h[0], setPlaying = _h[1]; // 定时器 var timer = useRef(0); // 计算出时间轴最小最大值 useEffect(function () { var initRange = getRange(tableData, 10445241600000, 0); var start = initRange[0]; var end = initRange[1]; setTimeStart(start); setTimeEnd(end); setCurStep(start); setPerStep(end - start); onChange && onChange(0, start); }, [tableData]); // eslint-disable-line react-hooks/exhaustive-deps // 根据任务进度 获取时间最小最大 var getRange = function (list, min, max) { var _min = min; var _max = max; if (list.length === 0) { _min = dayjs().valueOf(); _max = dayjs().add(1, 'day').valueOf(); } else { list.forEach(function (task) { if (task.planStartTime < _min) _min = task.planStartTime; if (task.startTime < _min) _min = task.startTime; if (task.planEndTime > _max) _max = task.planEndTime; if (task.endTime > _max) _max = task.endTime; if (task.children) { var _range = getRange(task.children, _min, _max); if (_range[0] < _min) _min = _range[0]; if (_range[1] > _max) _max = _range[1]; } }); } return [_min, _max]; }; // 时间区间变化 重置每步时间跨度 和 每步底部时间节点 和 时间节段数 useEffect(function () { if (timeStart === 0) return; setStepUnit(1); setSliderInfo(1); return function () { return clearInterval(timer.current); }; }, [timeStart, timeEnd]); // eslint-disable-line // 设置跨度和marks var setSliderInfo = function (unit) { var perSteps = Math.floor((timeEnd - timeStart) / unit); var marks = {}; for (var i = timeStart; i <= timeEnd; i += perSteps) { marks[i] = dayjs(i).format('YYYY-MM-DD'); } setPerStep(perSteps); setSliderMarks(marks); }; // 设置时间节段数 var onStepUnitChange = function (val) { setStepUnit(val); setSliderInfo(val); }; // 步级发生变化,计算天数 通知甘特图滚动 useEffect(function () { if (timeStart === 0) return; var days = dayjs(curStep).diff(timeStart, 'day'); onChange && onChange(days, curStep); }, [curStep]); // eslint-disable-line // 暂停播放 var onPlayPause = function () { setPlaying(false); if (timer.current) clearInterval(timer.current); }; // 开始播放 var onPlayStart = function () { if (timer.current) clearInterval(timer.current); var startTime = curStep; timer.current = window.setInterval(function () { if (startTime >= timeEnd) { clearInterval(timer.current); // 回到起点 setCurStep(timeStart); setPlaying(false); } else { // 注意 此处引用需要用函数获取最新state setCurStep(function (curS) { startTime = curS + perStep; return startTime; }); } }, 1000); setPlaying(true); }; // 日期区间发生变化 var onDateChange = function (ranges) { if (!ranges) return; var start = ranges[0], end = ranges[1]; setTimeStart(start.valueOf()); setTimeEnd(end.valueOf()); }; // 时间跨度的天数 用于限制分段选项 var rangeDays = dayjs(timeEnd).diff(timeStart, 'day'); return (_jsxs(Container, { children: [_jsx("div", { className: "grey-blank" }, void 0), _jsxs(Row, { children: [_jsx(Col, __assign({ span: 8 }, { children: _jsx("div", __assign({ className: "play-btn" }, { children: playing ? (_jsx(CustomIcon, { type: "iconicon_pauseupload-01", onClick: onPlayPause }, void 0)) : (_jsx(CustomIcon, { type: "iconicon_function", onClick: onPlayStart }, void 0)) }), void 0) }), void 0), _jsxs(Col, __assign({ span: 8 }, { children: [_jsx("span", { children: "\u6A21\u62DF\u65F6\u6BB5\uFF1A" }, void 0), timeStart ? ( // @ts-ignore _jsx(DatePicker.RangePicker, { disabled: playing, defaultValue: [moment(timeStart), moment(timeEnd)], onChange: onDateChange }, void 0)) : null] }), void 0), _jsxs(Col, __assign({ span: 8 }, { children: [_jsx("span", { children: "\u65F6\u95F4\u8282\u6BB5\u6570\u9009\u62E9\uFF1A" }, void 0), _jsx(Select, __assign({ disabled: playing, value: stepUnit, onChange: onStepUnitChange }, { children: [1, 5, 10, 20, 30].map(function (item) { return (_jsx(Option, __assign({ value: item, disabled: rangeDays < item }, { children: item }), item)); }) }), void 0)] }), void 0)] }, void 0), _jsx("div", __assign({ className: "slider" }, { children: timeStart > 0 && perStep > 0 ? (_jsx(Slider, { dots: true, min: timeStart, max: timeEnd, step: perStep, marks: sliderMarks, tipFormatter: function (date) { return dayjs(date).format('YYYY-MM-DD'); }, value: curStep, onChange: function (value) { return setCurStep(value); } }, void 0)) : null }), void 0)] }, void 0)); }; var Container = styled.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n padding-top: 20px;\n .grey-blank {\n height: 4px;\n background-color: #eee;\n margin-bottom: 20px;\n }\n .play-btn {\n text-align: center;\n .anticon {\n display: flex;\n align-items: center;\n }\n }\n .slider {\n padding: 0 40px 50px;\n .", "-slider-mark-text {\n white-space: nowrap;\n }\n }\n"], ["\n padding-top: 20px;\n .grey-blank {\n height: 4px;\n background-color: #eee;\n margin-bottom: 20px;\n }\n .play-btn {\n text-align: center;\n .anticon {\n display: flex;\n align-items: center;\n }\n }\n .slider {\n padding: 0 40px 50px;\n .", "-slider-mark-text {\n white-space: nowrap;\n }\n }\n"])), prefixCls); var CustomIcon = styled(Icon)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n color: inherit;\n justify-content: center;\n font-size: 24px;\n height: 34px;\n cursor: pointer;\n"], ["\n color: inherit;\n justify-content: center;\n font-size: 24px;\n height: 34px;\n cursor: pointer;\n"]))); var templateObject_1, templateObject_2;