/* eslint-disable no-param-reassign */
/* eslint-disable array-callback-return */
import {
AddMission,
AddSteps,
AddTags,
AddUsers,
EditRemark,
} from '@/components/DragModal/formdoms';
import IconFont from '@/components/IconFont';
import Limit from '@/components/Limit';
import { doFetch, getFetch } from '@/utils/doFetch';
import {
ArrowLeftOutlined,
DeleteOutlined,
EditFilled,
ExportOutlined,
PlayCircleFilled,
PlusOutlined,
RedoOutlined,
RollbackOutlined,
TagOutlined,
} from '@ant-design/icons';
import { history, useModel, useOutletContext, useParams } from '@umijs/max';
import { useRequest } from 'ahooks';
import {
Avatar,
Badge,
Card,
DatePicker,
Divider,
Drawer,
Empty,
Grid,
List,
Modal,
Popconfirm,
Popover,
Segmented,
Select,
Skeleton,
Switch,
Tooltip,
Typography,
} from 'antd';
import dayjs from 'dayjs';
import { Gantt } from 'gantt-task-react';
import 'gantt-task-react/dist/index.css';
import _ from 'lodash';
import { useEffect, useMemo, useState } from 'react';
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
import { Scrollbars } from 'react-custom-scrollbars';
import './index.less';
import QuoteList from './QuoteList';
const colordiy = {
barProgressColor: 'rgba(24, 144, 255,0.6)',
barProgressSelectedColor: 'rgba(24, 144, 255,0.6)',
barBackgroundColor: '#999',
barBackgroundSelectedColor: '#999',
};
const { Paragraph } = Typography;
const { useBreakpoint } = Grid;
const items = {
0: {
value: '0',
statusName: '未开始',
icon: (
),
},
1: {
value: '1',
statusName: '进行中',
color: 'green',
icon: (
),
},
2: {
value: '2',
statusName: '已完成',
color: 'grey',
icon: (
),
},
};
const columns = [];
function swapArray(arr, index1, index2) {
arr[index1] = arr.splice(index2, 1, arr[index1])[0];
return arr;
}
function difftime(start, end) {
const diffInMs = start.diff(end);
if (diffInMs < 60 * 60 * 1000) {
// 时间差小于 1 小时,转为分钟
const diffInMinutes = Math.round(diffInMs / (60 * 1000));
return diffInMinutes + '分钟前';
} else {
// 时间差大于等于 1 小时,继续判断是否超过 24 小时
const diffInHours = Math.round(diffInMs / (60 * 60 * 1000));
if (diffInHours >= 24) {
// 时间差超过 24 小时,转为天
const diffInDays = Math.round(diffInHours / 24);
return diffInDays + '天前';
} else {
// 时间差在 1 小时到 24 小时之间,直接输出小时数
return diffInHours + '小时前';
}
}
}
const MissionPools = ({ datalist = [], userList, setmodal, refresh }) => {
const screens = useBreakpoint();
const {
initialState: { vs },
setInitialState,
} = useModel('@@initialState');
const setvs = (val) => {
setInitialState((s) => ({
...s,
vs: val,
}));
};
return (
{
setvs(true);
}}
>
{!vs && (
)}
{vs && (
任务池{' '}
{
e.stopPropagation();
setvs(false);
}}
>
收起
}
bordered={vs}
className="card"
hoverable
extra={[
{
setmodal((s) => ({
...s,
open: true,
title: '任务池-新建任务',
width: '1000px',
step_id: null,
sort: datalist?.length ? Math.max(...datalist?.map((it) => it.sort + 1)) : 0,
defaultValue: {},
}));
}}
>
,
]}
>
{
refresh?.();
}}
edit={(defaultValue) => {
setmodal((s) => ({
...s,
open: true,
title: '任务池-编辑任务',
width: '1000px',
step_id: null,
defaultValue: defaultValue,
sort: null,
}));
}}
datas={datalist ?? []}
listId={'mission_pool'}
>
)}
);
};
const Project = () => {
// const location = useLocation();
// const id = location.state.id;
const screens = useBreakpoint();
const { setdom } = useOutletContext();
const { id } = useParams();
const [state, setState] = useState({
columns,
search: { status: '-1', mine: false, selectuser: null },
});
const [modal, setmodal] = useState({
open: false,
});
const [drawer, setdrawer] = useState({
open: false,
});
const [chooseusers, setchooseusers] = useState([]);
const [ganttype, setganttype] = useState('project');
//动态接口手动调用
const messagelist = useRequest(
async () => {
const extra = chooseusers?.length !== 0 ? { chooseusers: chooseusers.toString() } : {};
let res = await getFetch({
url: '/webtool/v1/notice',
params: { project_id: id, ...extra },
});
return res?.data ?? [];
},
{
manual: true,
debounceWait: 300,
},
);
const [pooldata, setpooldata] = useState([]);
const {
initialState: { currentUser, activeUserIdList, curitem },
setInitialState,
} = useModel('@@initialState');
const { data, loading, refresh } = useRequest(
async () => {
const res = await getFetch({
url: '/webtool/v1/project/' + id,
params: { ...state?.search, tags: state?.search?.tags?.join(',') },
});
return res?.data;
},
{
debounceWait: 300,
refreshDeps: [state.search, id, curitem],
onSuccess: (data) => {
const all =
data?.steps
?.map?.((it) =>
it.items?.map((its) => ({
...its,
step: it,
})),
)
?.flat?.() ?? [];
const allen = all?.length ?? 1;
const doing = all?.filter?.((it) => it.status === '1')?.length ?? 0;
const done = all?.filter?.((it) => it.status === '2')?.length ?? 0;
const progress = !isNaN(((doing * 0.5 + done) * 100) / allen)
? parseInt(((doing * 0.5 + done) * 100) / allen)
: 0;
const projectline = {
start: new Date(dayjs(data?.created_at).format('YYYY-MM-DD HH:mm')),
end: new Date(dayjs(data?.deadline).format('YYYY-MM-DD HH:mm')),
name: data?.project_name,
id: data?.id + 'project',
type: 'project',
progress,
styles: {
progressColor: 'rgba(24, 144, 255,0.6)',
progressSelectedColor: 'rgba(24, 144, 255,0.6)',
backgroundColor: '#999999',
backgroundSelectedColor: '#999999',
},
allen,
doing,
done,
users: data?.user_info_list,
};
const defaultgantt = [
projectline,
...data?.steps?.map((it) => {
const allen = it?.items?.length ?? 1;
const doing = it?.items?.filter?.((it) => it.status === '1')?.length ?? 0;
const done = it?.items?.filter?.((it) => it.status === '2')?.length ?? 0;
const progress = !isNaN(((doing * 0.5 + done) * 100) / allen)
? parseInt(((doing * 0.5 + done) * 100) / allen)
: 0;
let users = it?.items?.map((it) => it?.userid);
users = data?.user_info_list?.filter((it) => users.includes(it?.id)) ?? [];
const defaultdays = [
new Date(),
new Date(dayjs().add(2, 'day').format('YYYY-MM-DD HH:mm')),
];
let arr = it?.other?.split(',') ?? null;
arr = arr
? arr?.map((it) => {
const y = dayjs(it).format('YYYY');
const m = dayjs(it).format('MM');
const d = dayjs(it).format('DD');
const s = dayjs(it).format('HH');
const f = dayjs(it).format('mm');
return new Date(y, m - 1, d, s, f);
})
: defaultdays;
return {
start: arr[0],
end: arr[1],
name: it?.name,
id: it?.id + 'step',
type: 'task',
progress,
allen,
doing,
done,
users,
};
}),
];
// editables
const defaultganttp = [
projectline,
...all?.map?.((it) => {
//结束时间如果存在diy的则拿diy 否则拿阶段截止时间 阶段截止时间未设置 就设为明天
const defaultdays = [
new Date(),
new Date(dayjs().add(2, 'day').format('YYYY-MM-DD HH:mm')),
];
let arr = it?.step?.other?.split(',') ?? null,
users = data?.user_info_list?.filter((its) => its?.id === it?.userid) ?? [];
arr = arr
? arr?.map((it) => {
const y = dayjs(it).format('YYYY');
const m = dayjs(it).format('MM');
const d = dayjs(it).format('DD');
const s = dayjs(it).format('HH');
const f = dayjs(it).format('mm');
return new Date(y, m - 1, d, s, f);
})
: defaultdays;
const end = it?.deadline
? new Date(dayjs(it?.deadline).format('YYYY-MM-DD HH:mm'))
: arr[1];
const start = it?.starttime
? new Date(dayjs(it?.starttime).format('YYYY-MM-DD HH:mm'))
: new Date(dayjs(it?.created_at).format('YYYY-MM-DD HH:mm'));
return {
start,
end,
name: it?.step?.name + ' -- ' + it?.mission_name,
id: it?.id + 'mission',
type: 'task',
progress:
it?.status === '0' ? 0 : it.status === '1' ? 50 : it.status === '2' ? 100 : 0,
users,
status: it?.status,
};
}),
];
setState((s) => ({
...s,
columns: data?.steps,
gantt: defaultgantt,
ganttp: defaultganttp,
defaultgantt,
defaultganttp,
}));
},
},
);
const tags = useRequest(
async () => {
const res = await getFetch({ url: '/webtool/v1/tag', params: { project_id: parseInt(id) } });
return res?.data;
},
{
debounceWait: 300,
refreshDeps: [id],
},
);
const mission_pool = useRequest(
async () => {
const res = await getFetch({
url: '/webtool/v1/item',
params: { step_id: currentUser?.org_id + 9999999 },
});
return res?.data;
},
{
debounceWait: 300,
refreshDeps: [currentUser?.org_id],
onSuccess: (res, params) => {
setpooldata(res);
},
},
);
const onDragEnd = async (result) => {
// the only one that is required
const { destination, source, draggableId, combine } = result;
if (result.type === 'COLUMN') {
const submitarr = Object?.values?.(state?.columns);
let resarr = swapArray(submitarr, source.index, destination.index);
resarr = resarr.map((it, i) => ({
...it,
sort: i,
}));
setState((s) => ({
...s,
columns: resarr,
}));
resarr?.map((it, i) => {
doFetch({
url: '/webtool/v1/step/' + it?.id,
params: {
sort: i,
},
method: 'PUT',
});
});
return;
}
if (!destination) {
return;
}
if (destination.droppableId === 'mission_pool' && source.droppableId === 'mission_pool') {
let newColumns = pooldata ? JSON.parse(JSON.stringify(pooldata)) : [];
const moveItem = newColumns[source.index];
newColumns = newColumns?.filter((it, i) => i !== source.index);
newColumns.splice(destination.index, 0, { ...moveItem });
setpooldata(
newColumns?.map((it, i) => ({
...it,
sort: i,
})),
);
const sortlist = newColumns?.map((it, i) =>
_.pick(
{
...it,
},
['id', 'step_id', 'status', 'project_id'],
),
);
doFetch({
url: '/webtool/v1/mutisort',
params: {
sortlist,
},
});
return;
}
if (destination.droppableId === 'mission_pool' && source.droppableId !== 'mission_pool') {
const firstarrindex = state.columns
?.map((it) => it?.id?.toString())
.indexOf(source.droppableId);
let moveItem, donate;
setState((s) => {
let newColumns = JSON.parse(JSON.stringify(s.columns));
newColumns = newColumns?.map((item, index) => {
if (index === firstarrindex) {
return {
...item,
items: item.items.filter((it, i) => {
if (i === source.index) {
moveItem = { ...it, status: '3', starttime: null }; //状态重置
}
return i !== source.index;
}),
};
}
return item;
});
return {
...s,
columns: newColumns,
};
});
setpooldata((s) => {
const donates = JSON.parse(JSON.stringify(s));
const step_id = currentUser?.org_id + 9999999;
donates.splice(destination.index, 0, { ...moveItem });
donate = donates?.map((it, i) =>
_.pick(
{
...it,
sort: i,
step_id,
project_id: parseInt(id),
},
['id', 'step_id', 'status', 'project_id', 'starttime'],
),
);
doFetch({
url: '/webtool/v1/mutisort',
params: {
sortlist: donate,
},
});
return donates?.map((it, i) => ({
...it,
sort: i,
}));
});
return;
}
if (destination.droppableId !== 'mission_pool' && source.droppableId === 'mission_pool') {
const secondarrindex = state.columns
?.map((it) => it?.id?.toString())
.indexOf(destination.droppableId);
let moveItem, donate;
await setpooldata((s) => {
const donates = JSON.parse(JSON.stringify(s));
const res = donates?.filter((it, i) => {
if (i === source.index) {
moveItem = { ...it, status: '0', starttime: null }; //状态重置
}
return i !== source?.index;
});
return res;
});
await setState((s) => {
let newColumns = JSON.parse(JSON.stringify(s.columns));
newColumns = newColumns?.map((item, index) => {
if (index === secondarrindex) {
donate = JSON.parse(JSON.stringify(item.items));
donate.splice(destination.index, 0, { ...moveItem });
const sortlist = donate?.map((it, i) =>
_.pick(
{
...it,
sort: i,
step_id: item.id,
project_id: parseInt(id),
},
['id', 'step_id', 'status', 'project_id', 'starttime'],
),
);
doFetch({
url: '/webtool/v1/mutisort',
params: {
sortlist,
},
});
if (moveItem?.tags?.length > 0) {
const params = {
tags: moveItem?.tags?.map((it) => ({
...it,
project_id: parseInt(id),
})),
onlyupdate: true,
project_id: parseInt(id),
};
doFetch({ url: '/webtool/v1/mutitag', params: { ...params } });
}
return {
...item,
items: donate?.map((it, i) => ({
...it,
sort: i,
})),
};
}
return item;
});
return {
...s,
columns: newColumns,
};
});
return;
}
if (destination.droppableId === source.droppableId && destination.index === source.index) {
return;
}
const firstarrindex = state.columns
?.map((it) => it?.id?.toString())
.indexOf(source.droppableId);
const secondarrindex = state.columns
?.map((it) => it?.id?.toString())
.indexOf(destination.droppableId);
if (firstarrindex === secondarrindex) {
await setState((s) => {
let newColumns = JSON.parse(JSON.stringify(s.columns));
newColumns = newColumns?.map((item, index) => {
if (index === firstarrindex) {
let newColumnes = item.items ? JSON.parse(JSON.stringify(item.items)) : [];
const moveItem = newColumnes[source.index];
newColumnes = newColumnes?.filter((it, i) => i !== source.index);
newColumnes.splice(destination.index, 0, { ...moveItem });
const sortlist = newColumnes?.map((it, i) =>
_.pick(
{
...it,
},
['id', 'step_id', 'status', 'project_id'],
),
);
doFetch({
url: '/webtool/v1/mutisort',
params: {
sortlist,
},
});
return {
...item,
items: newColumnes?.map((it, i) => ({
...it,
sort: i,
})),
};
}
return item;
});
return {
...s,
columns: newColumns,
};
});
} else {
let moveItem, donate;
setState((s) => {
let newColumns = JSON.parse(JSON.stringify(s.columns));
newColumns = newColumns
?.map((item, index) => {
if (index === firstarrindex) {
return {
...item,
items: item.items.filter((it, i) => {
if (i === source.index) {
moveItem = { ...it, status: '0', starttime: null }; //状态重置
}
return i !== source.index;
}),
};
}
return item;
})
.map((item, index) => {
if (index === secondarrindex) {
donate = JSON.parse(JSON.stringify(item.items));
donate.splice(destination.index, 0, { ...moveItem, step_id: item.id });
return {
...item,
items: donate?.map((it, i) => ({
...it,
sort: i,
})),
};
}
return item;
});
return {
...s,
columns: newColumns,
};
});
const sortlist = donate?.map((it, i) =>
_.pick(
{
...it,
},
['id', 'step_id', 'status', 'project_id', 'starttime'],
),
);
doFetch({
url: '/webtool/v1/mutisort',
params: {
sortlist,
},
}).then((res) => {
if (res.code === 0) {
Modal.confirm({
title: '修改执行人',
maskClosable: true,
content: (
),
footer: false,
});
}
});
}
};
const notfinish = useMemo(() => {
if (state?.columns?.length === 0) {
return true;
}
let alltask = state?.columns?.map((it) => it.items.map((it) => it.status));
alltask = [...new Set(alltask.flat())];
if (alltask.length === 0 || alltask.some((it) => ['0', '1'].includes(it))) {
return true;
}
}, [state?.columns]);
//向父组件推子组件内容
useEffect(() => {
if (!data) return;
const dom = (
{currentUser?.id === data?.project_user_id ? (
{
let res = await doFetch({
url: '/webtool/v1/project/' + id,
params: {
project_name: value,
},
method: 'PUT',
});
if (res.code === 0) {
refresh();
}
},
}}
>
{data?.project_name}
) : (
{data?.project_name}
)}
{dayjs(data?.deadline).endOf('day').diff(dayjs(), 'hour') > 0 ? (
dayjs(data?.deadline).endOf('day').diff(dayjs(), 'hour') > 24 ? (
距截止{dayjs(data?.deadline).endOf('day').diff(dayjs(), 'day')}天
) : (
距截止{dayjs(data?.deadline).endOf('day').diff(dayjs(), 'hour')}小时
)
) : dayjs().diff(dayjs(data?.deadline).endOf('day'), 'hour') > 24 ? (
{notfinish ? '超过截止' : '已完成'}
{dayjs().diff(dayjs(data?.deadline).endOf('day'), 'day')}天
) : (
{notfinish ? '超过截止' : '已完成'}
{dayjs().diff(dayjs(data?.deadline).endOf('day'), 'hour')}小时
)}
{currentUser?.id === data?.project_user_id && (
{
let res = await doFetch({
url: '/webtool/v1/project/' + id,
params: {
deadline: value,
},
method: 'PUT',
});
if (res.code === 0) {
refresh();
}
}}
/>
}
placement="bottom"
>
- 修改
)}
{
setdrawer((s) => ({
...s,
title: '小组公告',
open: true,
width: 800,
}));
}}
>
{
setdrawer((s) => ({
...s,
title: '任务动态',
open: true,
width: 800,
}));
await messagelist?.runAsync();
}}
>
{
setdrawer((s) => ({
...s,
title: (
进度总览
{
setganttype(val);
}}
options={[
{
label: '项目',
value: 'project',
},
{
label: '任务',
value: 'task',
},
]}
/>
),
open: true,
closable: true,
width: '100vw',
}));
await messagelist?.runAsync();
}}
>
);
setdom(dom);
}, [data, screens.md]);
useEffect(() => {
if (drawer?.title !== '任务动态' && drawer?.title) {
setState((s) => {
if (ganttype === 'project') {
let newgantt = [...s?.defaultgantt];
if (chooseusers?.length > 0) {
newgantt = newgantt?.filter((it, i) => {
return chooseusers?.some((item) => it?.users?.some((itz) => itz?.id === item));
});
}
return {
...s,
gantt: newgantt,
};
} else {
let newganttp = [...s?.defaultganttp];
if (chooseusers?.length > 0) {
newganttp = newganttp?.filter((it, i) => {
return chooseusers?.some((item) => it?.users?.some((itz) => itz?.id === item));
});
}
return {
...s,
ganttp: newganttp,
};
}
});
}
messagelist?.run();
}, [chooseusers]);
const dragfn =
currentUser?.id === data?.project_user_id
? {
onDateChange: async (task, children) => {
if (currentUser?.id !== data?.project_user_id) {
return;
}
let res;
if (task?.id.indexOf('step') !== -1) {
let id = task?.id.replace('step', '');
res = await doFetch({
url: '/webtool/v1/step/' + id,
params: {
other: [
dayjs(task?.start).format('YYYY-MM-DD HH:mm'),
dayjs(task?.end).format('YYYY-MM-DD HH:mm'),
].toString(),
},
method: 'PUT',
});
} else if (task?.id.indexOf('mission') !== -1) {
let id = task?.id.replace('mission', '');
res = await doFetch({
url: '/webtool/v1/item/' + id,
params: {
starttime: task?.start,
deadline: task?.end,
},
method: 'PUT',
});
}
if (res.code === 0) {
refresh();
}
},
}
: {};
return (
{
setdrawer((s) => ({
...s,
open: false,
}));
if (!['小组公告', '任务动态', '编辑小组公告'].includes(drawer?.title)) {
refresh();
}
}}
placement="left"
extra={
drawer?.title === '编辑小组公告' ? (
{
setdrawer((s) => ({
...s,
title: '小组公告',
open: true,
width: 800,
}));
}}
>
) : drawer?.title === '小组公告' ? (
{
setdrawer((s) => ({
...s,
title: '编辑小组公告',
open: true,
width: 800,
}));
}}
style={{ display: currentUser?.id === data?.project_user_id ? 'flex' : 'none' }}
>
) : (
{
setchooseusers((s) => {
return [];
});
}}
>
全部
{data?.user_info_list?.map((it, i) => {
return (
{
setchooseusers((s) => {
if (s.includes(it?.id)) {
return s?.filter((itz) => itz !== it?.id);
} else {
return [...new Set([...s, it?.id])];
}
});
}}
>
{it?.head_url || it?.user_name.charAt(0)}
);
})}
)
}
width={'100%'}
contentWrapperStyle={{
maxWidth: ['小组公告', '任务动态', '编辑小组公告'].includes(drawer?.title) ? 680 : '100%',
}}
>
{drawer?.title === '任务动态' ? (
{
let div = document.createElement('div');
div.innerHTML = item?.reply;
const strings =
div.innerText.length > 25
? `${div.innerText.substring(0, 25)}...`
: div.innerText;
return (
{difftime(dayjs(), dayjs(item.created_at))}
,
]}
onClick={async () => {
await setInitialState((s) => ({
...s,
curitem: item,
}));
await setdrawer((s) => ({
...s,
open: false,
}));
if (currentUser?.id === item?.user?.id) {
//转为已读
await doFetch({
url: `/webtool/v1/notice/${item?.id}`,
params: { isread: true },
method: 'PUT',
});
}
}}
>
{item?.user?.head_url || item?.user?.user_name.charAt(0)}
) : (
{item?.other_user?.head_url ||
item?.other_user?.user_name.charAt(0)}
)
}
title={
item.title === '你有新的任务' ? (
发布了任务给
{item?.other_user?.user_name === item?.user?.user_name
? '自己'
: item?.user?.user_name}
:{item.mission_name}
) : item.title === '你有新的回复' ? (
在任务{item.mission_name}中 回复{' '}
{item?.other_user?.user_name === item?.user?.user_name
? '自己'
: item?.user?.user_name}
) : [
'编辑了任务',
'开始了任务',
'完成了任务',
'挂起了任务',
'删除了任务',
].includes(item.title) ? (
{item.title} {item.mission_name}
) : item.title === '删除了任务' ? (
删除了任务 {item.mission_name}
) : null
}
/>
);
}}
/>
) : drawer?.title === '小组公告' ? (
data?.output_path ? (
) : (
)
) : drawer?.title === '编辑小组公告' ? (
{
refresh();
setdrawer((s) => ({
...s,
title: '小组公告',
}));
}}
/>
) : (
{
const styles = {
style: {
flex: 1,
height: headerHeight,
borderLeft: '1px solid #ffffff',
},
};
if (!screens.md) {
return null;
}
return (
);
}}
TaskListTable={({ rowHeight, tasks }) => {
const style = {
style: {
width: '100%',
height: rowHeight,
display: 'flex',
},
};
if (!screens.md) {
return null;
}
return (
{tasks?.map((it, i) => {
return (
{it?.name}
(
{it?.user_name}
))}
>
{it.users?.length > 1
? it.users.length + '人'
: it.users[0]?.user_name}
);
})}
);
}}
TooltipContent={({ task }) => {
return (
{task?.name}
{dayjs(task?.start).format('YYYY.MM.DD')}至
{dayjs(task?.end).format('YYYY.MM.DD')}
进度: {task?.progress}%
时长:
{dayjs(task?.end).diff(dayjs(task?.start), 'day')}天
{task?.status ? (
{items[task?.status]?.icon}
{items[task?.status]?.statusName}
) : (
全部:{task?.allen}
进行中:{task?.doing}
已完成:{task?.done}
)}
);
}}
/>
)}
{
setmodal((s) => ({
...s,
open: false,
}));
}}
footer={false}
destroyOnClose={true}
style={{ top: 20 }}
>
{['新建任务', '编辑任务', '任务池-新建任务', '任务池-编辑任务'].includes(modal?.title) && (
{
refresh();
mission_pool?.refresh();
setmodal((s) => ({
...s,
open: false,
}));
}}
/>
)}
{['新建流程', '编辑起止时间'].includes(modal?.title) && (
{
refresh();
setmodal((s) => ({
...s,
open: false,
}));
}}
/>
)}
{modal?.title === '管理标签' && (
{
refresh();
setmodal((s) => ({
...s,
open: false,
}));
}}
/>
)}
{modal?.title === '编辑项目成员' && (
it.id),
}}
refresh={() => {
refresh();
setmodal((s) => ({
...s,
open: false,
}));
}}
/>
)}
{loading && !data ? (
) : (
<>
{
history.push('/welcome/homepage');
}}
style={{ marginRight: 12 }}
>
{
refresh();
mission_pool?.refresh();
}}
>
{
getFetch({
url: '/webtool/download',
params: {
...state?.search,
tags: state?.search?.tags?.join(','),
id: id,
filename: data?.project_name,
url: REACT_APP_URL,
},
});
}}
>
{
await setState((s) => ({
...s,
search: {
...s.search,
status: val,
},
}));
}}
options={[
{
label: '全部',
value: '-1',
},
].concat(
Object.values(items).map((it) => ({
label: it.statusName,
value: it.value,
})),
)}
/>
只看我的
{
setState((s) => ({
...s,
search: {
...s.search,
mine: val,
selectuser: null,
},
}));
}}
>
{currentUser?.id === data?.project_user_id && (
{
setmodal((s) => ({
...s,
title: '管理标签',
open: true,
}));
}}
>
)}
{[
...data?.user_info_list.filter((it) => it?.id === data?.project_user_id),
...[
...data?.user_info_list.filter(
(it) =>
it?.id !== data?.project_user_id &&
activeUserIdList.includes(it.id.toString()),
),
...data?.user_info_list.filter(
(it) =>
it?.id !== data?.project_user_id &&
!activeUserIdList.includes(it.id.toString()),
),
],
].map((it, i) => {
if (it?.head_url && it?.head_url !== '') {
return (
{
setState((s) => {
return {
...s,
search: {
...s.search,
selectuser: s.search.selectuser === it?.id ? null : it?.id,
mine: false,
},
};
});
}}
/>
);
} else {
return (
{
setState((s) => {
return {
...s,
search: {
...s.search,
selectuser: s.search.selectuser === it?.id ? null : it?.id,
mine: false,
},
};
});
}}
>
{it?.user_name?.charAt(0)}
);
}
})}
{currentUser?.id === data?.project_user_id && (
}
style={{ backgroundColor: '#73c0de', cursor: 'pointer', marginLeft: -20 }}
onClick={() => {
setmodal((s) => ({
...s,
title: '编辑项目成员',
open: true,
}));
}}
/>
)}
>
)}
{(provided, snapshot) => (
{state.columns
.sort((a, b) => a.sort - b.sort)
.map((column, index) => (
{(provided, snapshot) => (
{
let res = await doFetch({
url: '/webtool/v1/step/' + column?.id,
params: {
name: value,
},
method: 'PUT',
});
if (res.code === 0) {
refresh();
}
},
}}
>
{column?.name}
共{' '}
{column?.items?.length}
{' '}
个
) : (
{column?.name}
共{' '}
{column?.items?.length}
{' '}
个
)
}
className="card"
ref={provided.innerRef}
{...provided.draggableProps}
hoverable
extra={[
{
setmodal((s) => ({
...s,
open: true,
title: '新建任务',
width: '1000px',
step_id: column.id,
sort: column?.items?.length
? Math.max(...column?.items?.map((it) => it.sort + 1))
: 0,
defaultValue: {},
}));
}}
>
,
column?.items?.length === 0 &&
currentUser?.id === data?.project_user_id && (
{
let res = await doFetch({
url: '/webtool/v1/step/' + column.id,
method: 'DELETE',
});
if (res.code === 0) {
refresh();
}
}}
>
),
]}
>
{
if (currentUser?.id === data?.project_user_id) {
setmodal((s) => ({
...s,
open: true,
title: '编辑起止时间',
width: '400px',
initialValues: column?.other?.split(',') ?? [],
step_id: column?.id,
}));
}
}}
>
{(function () {
if (column?.other) {
let arr = column?.other?.split(',');
return (
起{dayjs(arr[0]).format('YYYY-MM-DD')}
止{dayjs(arr[1]).format('YYYY-MM-DD')}
);
}
return
未设置起止时间;
})()}
{
refresh();
mission_pool?.refresh();
}}
edit={(defaultValue) => {
setmodal((s) => ({
...s,
open: true,
title: '编辑任务',
width: '1000px',
step_id: column.id,
defaultValue: defaultValue,
sort: null,
}));
}}
datas={column?.items ?? []}
listId={column?.id?.toString()}
>
)}
))}
{
refresh();
mission_pool?.refresh();
}}
/>
{!snapshot.draggingFromThisWith && currentUser?.id === data?.project_user_id && (
{
setmodal((s) => ({
...s,
open: true,
title: '新建流程',
width: '400px',
initialValues: [],
}));
}}
>
)}
)}
);
};
export default Project;