254 lines
6.1 KiB
TypeScript
254 lines
6.1 KiB
TypeScript
import { Card, Modal, Radio, Space } from 'antd';
|
|
import { Gantt, Task, ViewMode } from 'gantt-task-react';
|
|
import "gantt-task-react/dist/index.css";
|
|
import React, { useEffect, useState } from 'react';
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
import CancelCrud from '../../../components/crud/CancelCrud';
|
|
import { CrudContext } from '../../../components/crud/useCrud';
|
|
import { Dispatch, RootState } from '../../../models/store';
|
|
import { Schedule, ScheduleProps } from '../../../service/def';
|
|
import useRequest from '../../../utils/useRequest';
|
|
import { demoDate } from '../../../utils/utils';
|
|
import { TaskListHeader } from './components/task-list-header';
|
|
import { TaskListTable } from './components/task-list-table';
|
|
import DataForm from './DataForm';
|
|
|
|
|
|
type IProps = {
|
|
crudCtx: CrudContext;
|
|
}
|
|
|
|
let id = 1;
|
|
const wbsProps: ScheduleProps = { wbs: true, level: '单项工程', status: '未开工', phase: '[C]项目实时阶段', };
|
|
const taskProps: ScheduleProps = { task: true, type: 'xxxxx', calendar: 'xxxxx', schedule: 'xxxxxx' };
|
|
|
|
async function demodata(): Promise<Schedule[]> {
|
|
return [{
|
|
id: `${id++}`,
|
|
name: '工程里程碑',
|
|
stm1: demoDate(2),
|
|
etm1: demoDate(100),
|
|
props: wbsProps,
|
|
progress: 77,
|
|
_indent: 1,
|
|
children: [
|
|
{
|
|
id: `${id++}`,
|
|
name: '正式开工',
|
|
stm1: demoDate(2),
|
|
etm1: demoDate(2),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: '完成导流洞施工',
|
|
stm1: demoDate(20),
|
|
etm1: demoDate(20),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: '开始下闸蓄水',
|
|
stm1: demoDate(50),
|
|
etm1: demoDate(50),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: '完工',
|
|
stm1: demoDate(100),
|
|
etm1: demoDate(100),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
]
|
|
}, {
|
|
id: `${id++}`,
|
|
name: '设计任务',
|
|
stm1: demoDate(2),
|
|
etm1: demoDate(10),
|
|
props: wbsProps,
|
|
_indent: 1,
|
|
progress: 77,
|
|
children: [
|
|
{
|
|
id: `${id++}`,
|
|
name: '详细设计',
|
|
stm1: demoDate(2),
|
|
etm1: demoDate(8),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: '评审',
|
|
stm1: demoDate(8),
|
|
etm1: demoDate(10),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
]
|
|
}, {
|
|
id: `${id++}`,
|
|
name: '采购任务',
|
|
stm1: demoDate(11),
|
|
etm1: demoDate(40),
|
|
props: wbsProps,
|
|
_indent: 1,
|
|
progress: 77,
|
|
children: [
|
|
{
|
|
id: `${id++}`,
|
|
name: '详细设计',
|
|
stm1: demoDate(11),
|
|
etm1: demoDate(20),
|
|
props: wbsProps,
|
|
_indent: 2,
|
|
progress: 77,
|
|
children: [
|
|
{
|
|
id: `${id++}`,
|
|
name: 'asfgiywefb',
|
|
stm1: demoDate(11),
|
|
etm1: demoDate(13),
|
|
_indent: 3,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: 'asfaefuijkbsdv',
|
|
stm1: demoDate(13),
|
|
etm1: demoDate(15),
|
|
_indent: 3,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: 'asfkugasvuig',
|
|
stm1: demoDate(15),
|
|
etm1: demoDate(17),
|
|
_indent: 3,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: 'asfaefrgwg',
|
|
stm1: demoDate(17),
|
|
etm1: demoDate(20),
|
|
_indent: 3,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
]
|
|
},
|
|
{
|
|
id: `${id++}`,
|
|
name: '评审',
|
|
stm1: demoDate(23),
|
|
etm1: demoDate(40),
|
|
_indent: 2,
|
|
props: taskProps,
|
|
progress: 77,
|
|
},
|
|
]
|
|
}, {
|
|
id: `${id++}`,
|
|
name: '施工任务',
|
|
stm1: demoDate(11),
|
|
etm1: demoDate(40),
|
|
props: wbsProps,
|
|
_indent: 1,
|
|
progress: 77,
|
|
children: []
|
|
}, {
|
|
id: `${id++}`,
|
|
name: '管理任务',
|
|
stm1: demoDate(11),
|
|
etm1: demoDate(40),
|
|
props: wbsProps,
|
|
_indent: 1,
|
|
progress: 77,
|
|
children: []
|
|
}];
|
|
}
|
|
const VIEWWMODEOPTIONS = [
|
|
{ label: '日', value: ViewMode.Day },
|
|
{ label: '周', value: ViewMode.Week },
|
|
{ label: '月', value: ViewMode.Month },
|
|
];
|
|
|
|
const ProjectSchedule: React.FC<IProps> = ({ crudCtx }) => {
|
|
|
|
|
|
const { data } = useRequest(demodata);
|
|
const dispatch = useDispatch<Dispatch>();
|
|
|
|
const tasks = useSelector((s: RootState) => s.progress.tasks);
|
|
|
|
const crud = useSelector((s: RootState) => s.progress.scheduleCrud);
|
|
|
|
const [viewMode, setViewmode] = useState<ViewMode>(ViewMode.Day);
|
|
|
|
useEffect(() => {
|
|
if (data) {
|
|
dispatch.progress.loadSchedules(data);
|
|
}
|
|
}, [data]);
|
|
|
|
const onExpanderClick = (task: Task) => {
|
|
console.log(task);
|
|
dispatch.progress.setTasks(tasks?.map(o => o.id === task.id ? task : o));
|
|
}
|
|
|
|
return (
|
|
<Card
|
|
title="test项目"
|
|
extra={
|
|
<Space>
|
|
<Radio.Group options={VIEWWMODEOPTIONS} optionType="button" buttonStyle="solid" onChange={(e) => setViewmode(e.target.value)} value={viewMode} />
|
|
<CancelCrud crudCtx={crudCtx} text="返回项目列表" />
|
|
</Space>
|
|
|
|
}
|
|
bodyStyle={{ padding: 0 }}
|
|
>
|
|
{
|
|
tasks?.length ? (
|
|
<Gantt
|
|
viewMode={viewMode}
|
|
tasks={tasks}
|
|
TaskListHeader={TaskListHeader}
|
|
TaskListTable={TaskListTable}
|
|
onExpanderClick={onExpanderClick}
|
|
/>
|
|
) : null
|
|
}
|
|
{
|
|
crud ? (
|
|
<Modal
|
|
visible
|
|
footer={null}
|
|
title={crud.mode === 'new' ? '新增进度' : crud.record.name}
|
|
onCancel={() => dispatch.progress.setScheduleCrud(undefined)}>
|
|
<DataForm />
|
|
</Modal>
|
|
) : null
|
|
}
|
|
</Card>
|
|
)
|
|
}
|
|
|
|
export default ProjectSchedule
|