+
微信小程序二维码
-
+
-
+
小程序扫描二维码,有效期7天
-
-
+
+
}
-
+ {buttonIndex == 2 &&
+
分享链接7日内有效
+
+
+
+
+
}
);
diff --git a/src/components/StepSort.tsx b/src/components/StepSort.tsx
new file mode 100644
index 0000000..356f4ba
--- /dev/null
+++ b/src/components/StepSort.tsx
@@ -0,0 +1,112 @@
+import React, {CSSProperties, Fragment, useState} from "react";
+import {DragDropContext, Droppable, Draggable, DropResult, DraggingStyle, NotDraggingStyle} from "react-beautiful-dnd";
+import {TaskStepSortVO} from "@/components/type/TaskSort.d";
+import {Button, Drawer} from "antd";
+
+// fake data generator
+const getItems = (count: number, offset = 0) =>
+ Array.from({length: count}, (v, k) => k).map(k => ({
+ id: `item-${k + offset}-${new Date().getTime()}`,
+ stepDesc: `item ${k + offset}`,
+ sortIndex: k + offset,
+ }));
+
+const reorder = (list: TaskStepSortVO[], startIndex: number, endIndex: number) => {
+ const result = Array.from(list);
+ const [removed] = result.splice(startIndex, 1);
+ result.splice(endIndex, 0, removed);
+
+ return result;
+};
+const grid = 8;
+
+const getItemStyle = (isDragging: boolean, draggableStyle: DraggingStyle | NotDraggingStyle | undefined): CSSProperties => ({
+ // some basic styles to make the items look a bit nicer
+ userSelect: "none",
+ padding: grid * 2,
+ margin: `0 0 ${grid}px 0`,
+
+ // change background colour if dragging
+ background: isDragging ? "lightgreen" : "grey",
+
+ // styles we need to apply on draggables
+ ...draggableStyle
+});
+const getListStyle = (isDraggingOver: boolean) => ({
+ background: isDraggingOver ? "lightblue" : "lightgrey",
+ padding: grid,
+ width: 250
+});
+
+const StepSort = (props: { taskId: string }) => {
+ const [state, setState] = useState
(getItems(5, 10));
+ // 抽屉 start
+ const [open, setOpen] = useState(false);
+
+ function onDragEnd(result: DropResult) {
+ const {source, destination} = result;
+ // dropped outside the list
+ if (!destination) {
+ return;
+ }
+ const items = reorder(state, source.index, destination.index);
+ let newState = [...state];
+ newState = items;
+ setState(newState);
+ }
+
+ return (
+
+
+
+
+
+
+ {(provided, snapshot) => (
+
+ {state.map((item, index) => (
+
+ {(provided, snapshot) => (
+
+ )}
+
+ ))}
+ {provided.placeholder}
+
+ )}
+
+
+
+
+
+ );
+}
+export default StepSort
+
diff --git a/src/components/type/TaskSort.d.tsx b/src/components/type/TaskSort.d.tsx
new file mode 100644
index 0000000..5bd8a46
--- /dev/null
+++ b/src/components/type/TaskSort.d.tsx
@@ -0,0 +1,5 @@
+export type TaskStepSortVO = {
+ id: string,
+ sortIndex: number,
+ stepDesc: string
+}
\ No newline at end of file
diff --git a/src/ui/task/calendar/CalShow.tsx b/src/ui/task/calendar/CalShow.tsx
index 1499ade..b722231 100644
--- a/src/ui/task/calendar/CalShow.tsx
+++ b/src/ui/task/calendar/CalShow.tsx
@@ -148,7 +148,7 @@ const CalShow: React.FC = () => {
clearClickTimeout()
clickRef.current = window.setTimeout(() => {
// window.alert(event.title);
- console.log(event)
+ console.log("event")
setOperationId(OPERATION_BUTTON_TYPE.DETAIL)
setDescription("任务详情")
setItemId(event.resource)
@@ -265,7 +265,10 @@ const CalShow: React.FC = () => {
}
return
- {open &&
setOpen(false)}
diff --git a/src/ui/task/project/DetailModelForm.tsx b/src/ui/task/project/DetailModelForm.tsx
index 571685b..114afb1 100644
--- a/src/ui/task/project/DetailModelForm.tsx
+++ b/src/ui/task/project/DetailModelForm.tsx
@@ -6,8 +6,8 @@ import {
ProFormSelect,
ProFormText, ProFormTextArea, ProFormTreeSelect,
} from '@ant-design/pro-components';
-import {Button, Form, message, Popconfirm} from 'antd';
-import React, {useEffect, useState} from "react";
+import {Button, Form, message, Popconfirm, Spin} from 'antd';
+import React, {Fragment, useEffect, useState} from "react";
import {
addTask, deleteTask, getTask,
getTaskTreeResult,
@@ -19,12 +19,14 @@ import {DataType} from "@/lib/definitions";
import dayjs, {Dayjs} from "dayjs";
import DiaryOption from "@/components/DiaryOption";
import ShareOption from "@/components/ShareOption";
+import StepSort from "@/components/StepSort";
+import SettingCron from "@/components/SettingCron";
export type DetailModelFormProps = {
// 当前内容id
itemId?: string,
pid?: string,
- taskType?:string,
+ taskType?: string,
// 祖宗任务id
pPid?: string,
// 操作id
@@ -52,6 +54,8 @@ export const DetailModelForm: React.FC = (props) => {
const [editFormDisable, setEditFormDisable] = useState(props.operationId === OPERATION_BUTTON_TYPE.DETAIL)
// 团队第一层 pid必须为0
const [taskType, setTaskType] = useState('0')
+ const [spinning, setSpinning] = useState(true)
+ const [operationRequest,setOperationRequest] = useState(false)
useEffect(() => {
if (props.itemId != undefined && (
props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE)) {
@@ -69,13 +73,19 @@ export const DetailModelForm: React.FC = (props) => {
if (task.data.pid == "0") {
form.setFieldValue("pid", undefined)
}
+ if (task.data.taskType) {
+ setTaskType(task.data.taskType)
+ }
setRequestTask(task.data)
console.log("form.setFieldsValue(task.data)" + JSON.stringify(task.data))
} else {
message.error(task.status.message);
props.reloadData?.()
}
- })
+ }).finally(() => {
+ setSpinning(false)
+ }
+ )
} else if (props.operationId === OPERATION_BUTTON_TYPE.ADD || props.operationId === OPERATION_BUTTON_TYPE.ADD_CHILD) {
let data = {
'expectedTimeRange': [props.expectedStartTime ? props.expectedStartTime : dayjs(), props.expectedEndTime],
@@ -84,6 +94,7 @@ export const DetailModelForm: React.FC = (props) => {
'name': props.taskContent && props.taskContent?.length > 10 ? props.taskContent.substring(0, 10) : props.taskContent,
};
form.setFieldsValue(data)
+ setSpinning(false)
}
}, [props])
@@ -105,309 +116,324 @@ export const DetailModelForm: React.FC = (props) => {
// 所以你需要用 setFieldsValue 来更新。 initialValues 只在 form 初始化时生效且只生效一次,如果你需要异步加载,
// 推荐使用 request,或者 initialValues ? : null
return (
-
- title={props.description}
- open={props.open && !props.haveButton}
- trigger={props.haveButton ?
- : undefined
- }
- form={form}
- autoFocusFirstInput
- modalProps={{
- destroyOnClose: true,
- onCancel: () => {
- props.reloadData?.();
- },
- }}
- readonly={editFormDisable}
- submitter={props.itemId !== undefined && props.itemId !== '-1' ? {
- render: (prop, defaultDoms) => {
- console.log("submitter render: ", {prop})
- let result = [
- editFormDisable ? : undefined,
- props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE ?
- }
- okText="确认"
- cancelText="取消"
- onConfirm={() => {
- if (props.itemId !== undefined) {
- deleteTask(props.itemId).then((response => {
- console.log('response', response)
- if (response.status.success) {
- message.success("删除任务成功:" + response.data)
- props.reloadData?.()
- }
- }));
- }
+
+
+
+ title={props.description}
+ open={!spinning&&props.open && !props.haveButton}
+ trigger={props.haveButton ?
+ : undefined
+ }
+ form={form}
+ loading={operationRequest}
+ autoFocusFirstInput
+ modalProps={{
+ destroyOnClose: true,
+ onCancel: () => {
+ props.reloadData?.();
+ },
+ }}
+ readonly={editFormDisable}
+ submitter={props.itemId !== undefined && props.itemId !== '-1' ? {
+ render: (prop, defaultDoms) => {
+ console.log("submitter render: ", {prop})
+ let result = [
+ editFormDisable ? : undefined,
+ props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE ?
+ }
+ okText="确认"
+ cancelText="取消"
+ onConfirm={() => {
+ if (props.itemId !== undefined) {
+ deleteTask(props.itemId).then((response => {
+ console.log('response', response)
+ if (response.status.success) {
+ message.success("删除任务成功:" + response.data)
+ props.reloadData?.()
+ }
+ }));
+ }
+ }}
+ >
+
+ 删除
+
+ : undefined,
+ requestTask && requestTask.id ?
+ : undefined,
+ ]
- // 非新增或者编辑状态不展示
- if (!editFormDisable) {
- result.push(...defaultDoms)
+ // 非新增或者编辑状态不展示
+ if (!editFormDisable) {
+ result.push(...defaultDoms)
+ } else {
+ if (editFormDisable && taskType == '1') {
+ result.push()
+ }
+ if (editFormDisable && taskType == '2') {
+ result.push()
+ }
+ result.push( props.closeOpen?.()}>关闭)
+ }
+ return result;
+ },
+ } : {
+ render: (prop, defaultDoms) => {
+ console.log("submitter render: ", {prop}, {props}, {taskType}, {defaultDoms})
+ // if ( prop.searchConfig) {
+ // if (taskType == '1') {
+ // prop.searchConfig.submitText = "创建团队"
+ // }else {
+ // prop.searchConfig.submitText = "确认"
+ // }
+ // }
+ // return defaultDoms;
+ const result = defaultDoms.filter(defaultButton => defaultButton.key == 'rest');
+ result.push( form.submit()}>{taskType == '1' ? "创建团队" : "确认"}
+ )
+ return result;
+ }
+ }
+ }
+ onFinish={async (values) => {
+ {/* onFinish 返回true关闭窗口,范湖false不关闭窗口 */
+ }
+ console.log('Received values of form: ', values, {...requestTask, ...values});
+ setOperationRequest(true)
+ if (requestTask) {
+ const {sortNo} = requestTask;
+ values.sortNo = sortNo;
+ }
+ if (values.pid === undefined) {
+ values.pid = '0'
+ }
+ if (values.expectedTimeRange?.[0] != undefined) {
+ values.expectedStartTime = dayjs(values.expectedTimeRange[0]).format()
+ }
+ if (values.expectedTimeRange?.[1] != undefined) {
+ values.expectedEndTime = dayjs(values.expectedTimeRange[1]).format()
+ }
+ if (values.actualTimeRange?.[0] != undefined) {
+ values.actualStartTime = dayjs(values.actualTimeRange[0]).toDate()
+ }
+ if (values.actualTimeRange?.[1] != undefined) {
+ values.actualEndTime = dayjs(values.actualTimeRange[1]).toDate()
+ }
+ var result: boolean = false;
+
+ let state = taskStateList.find(taskState => taskState.name === values.state?.toString());
+ if (state) {
+ values.state = state.code
+ }
+ let priority = taskPriorityList.find(taskPriority => taskPriority.name === values.priority?.toString())
+ if (priority) {
+ values.priority = priority.code
+ }
+ // todo 修改
+ if (props.operationId === OPERATION_BUTTON_TYPE.UPDATE || (props.operationId === OPERATION_BUTTON_TYPE.DETAIL && !editFormDisable)) {
+ await updateTask(values).then(response => {
+ console.log('response', response)
+ if (response.status.success) {
+ message.success("修改任务成功:" + response.data)
+ // 树任务重新刷新
+ // 四象限任务重新刷新
+ // 如果可以直接更新列表而不请求。。。。。。
+ console.log('props.reloadData?.()', props.reloadData)
+ props.reloadData?.()
+ result = true
+ } else {
+ message.error(response.status.message)
+ result = false
+ }
+ }
+ );
} else {
- if (props.taskType=='1') {
- result.push()
- }
- result.push( props.closeOpen?.()}>关闭)
+ await addTask(values).then(response => {
+ console.log('response', response)
+ if (response.data.status.success) {
+ message.success(`添加计划${response.data.data.name}成功`)
+ // 树任务重新刷新
+ // 四象限任务重新刷新
+ // 如果可以直接更新列表而不请求。。。。。。
+ console.log('props.reloadData?.()', props.reloadData)
+ result = (taskType != '1')
+ props.reloadData?.()
+ } else {
+ message.error(response.data.status.message)
+ result = false
+ }
+ }
+ );
}
+ setOperationRequest(false)
return result;
- },
- } : {
- render: (prop, defaultDoms) => {
- console.log("submitter render: ", {prop}, {props},{taskType},{defaultDoms})
- // if ( prop.searchConfig) {
- // if (taskType == '1') {
- // prop.searchConfig.submitText = "创建团队"
- // }else {
- // prop.searchConfig.submitText = "确认"
- // }
- // }
- // return defaultDoms;
- const result = defaultDoms.filter(defaultButton=>defaultButton.key=='rest');
- result.push( form.submit()}>{taskType=='1'?"创建团队":"确认"}
- )
- return result;
- }
- }
- }
- onFinish={async (values) => {
- {/* onFinish 返回true关闭窗口,范湖false不关闭窗口 */
- }
- console.log('Received values of form: ', values, {...requestTask, ...values});
- if (requestTask) {
- const {sortNo} = requestTask;
- values.sortNo = sortNo;
- }
- if (values.pid === undefined) {
- values.pid = '0'
- }
- if (values.expectedTimeRange?.[0] != undefined) {
- values.expectedStartTime = dayjs(values.expectedTimeRange[0]).format()
- }
- if (values.expectedTimeRange?.[1] != undefined) {
- values.expectedEndTime = dayjs(values.expectedTimeRange[1]).format()
- }
- if (values.actualTimeRange?.[0] != undefined) {
- values.actualStartTime = dayjs(values.actualTimeRange[0]).toDate()
- }
- if (values.actualTimeRange?.[1] != undefined) {
- values.actualEndTime = dayjs(values.actualTimeRange[1]).toDate()
- }
- var result: boolean = false;
-
- let state = taskStateList.find(taskState => taskState.name === values.state?.toString());
- if (state) {
- values.state = state.code
- }
- let priority = taskPriorityList.find(taskPriority => taskPriority.name === values.priority?.toString())
- if (priority) {
- values.priority = priority.code
- }
- // todo 修改
- if (props.operationId === OPERATION_BUTTON_TYPE.UPDATE || (props.operationId === OPERATION_BUTTON_TYPE.DETAIL && !editFormDisable)) {
- await updateTask(values).then(response => {
- console.log('response', response)
- if (response.status.success) {
- message.success("修改任务成功:" + response.data)
- // 树任务重新刷新
- // 四象限任务重新刷新
- // 如果可以直接更新列表而不请求。。。。。。
- console.log('props.reloadData?.()', props.reloadData)
- props.reloadData?.()
- result = true
- } else {
- message.error(response.status.message)
- result = false
- }
- }
- );
- } else {
- await addTask(values).then(response => {
- console.log('response', response)
- if (response.data.status.success) {
- message.success(`添加计划${response.data.data.name}成功`)
- // 树任务重新刷新
- // 四象限任务重新刷新
- // 如果可以直接更新列表而不请求。。。。。。
- console.log('props.reloadData?.()', props.reloadData)
- result = (taskType!='1')
- props.reloadData?.()
- } else {
- message.error(response.data.status.message)
- result = false
- }
- }
- );
- }
- return result;
- }}
- >
-
-
-
-
- {
- setTaskType(value)
- }}
- rules={[
- {
- required: true,
- message: "请输入计划类型"
- }
- ]}
- />
-
- {
- return getTaskTreeResult(JSON.stringify(
- {
- pageSize: 1000,
- pageNumber: 1,
- data: [{code: 'pid', value: '0', operateType: '='},
- // 如果父任务完成会导致父任务不展示
- // {
- // code: 'state',
- // value: '8,9',
- // operateType: 'IN'
- // },
- {code: '', value: true, operateType: "TREE"}]
- }
- )).then(result => childReduce(result.data.content))
- }}
- name="pid"
- label="父级任务"
- fieldProps={{
- onSelect: (e, node) => {
- console.log('onSelect', e, node);
- // setPid(e)
- },
- }}
- disabled={editFormDisable}
- />
-
-
-
-
-
-
- taskPriorityList.map
- (
- taskState => {
- return {'label': taskState.name, 'value': taskState.code}
- }
- )
- }
- width="sm"
- name="priority"
- label="任务优先级"
- initialValue='3'
- disabled={editFormDisable}
- rules={[{required: true, message: "请选择计划优先级"}]}
- />
- {
- return {'label': taskState.name, 'value': taskState.code}
- })}
- name="state"
- label="任务状态"
- initialValue='8'
- disabled={editFormDisable}
- rules={
- [
+ }}
+ >
+
+
+
+
+ {
+ setTaskType(value)
+ }}
+ rules={[
{
required: true,
- message: "请选择计划状态"
+ message: "请输入计划类型"
}
- ]
- }
- />
-
-
-
-
+
+ {
+ return getTaskTreeResult(JSON.stringify(
+ {
+ pageSize: 1000,
+ pageNumber: 1,
+ data: [{code: 'pid', value: '0', operateType: '='},
+ // 如果父任务完成会导致父任务不展示
+ // {
+ // code: 'state',
+ // value: '8,9',
+ // operateType: 'IN'
+ // },
+ {code: '', value: true, operateType: "TREE"}]
+ }
+ )).then(result => childReduce(result.data.content))
+ }}
+ name="pid"
+ label="父级任务"
+ fieldProps={{
+ onSelect: (e, node) => {
+ console.log('onSelect', e, node);
+ // setPid(e)
+ },
+ }}
+ disabled={editFormDisable}
+ />
+
+
+
-
-
-
+
+
+ taskPriorityList.map
+ (
+ taskState => {
+ return {'label': taskState.name, 'value': taskState.code}
+ }
+ )
+ }
+ width="sm"
+ name="priority"
+ label="任务优先级"
+ initialValue='3'
+ disabled={editFormDisable}
+ rules={[{required: true, message: "请选择计划优先级"}]}
+ />
+ {
+ return {'label': taskState.name, 'value': taskState.code}
+ })}
+ name="state"
+ label="任务状态"
+ initialValue='8'
+ disabled={editFormDisable}
+ rules={
+ [
+ {
+ required: true,
+ message: "请选择计划状态"
+ }
+ ]
+ }
+ />
+
+
+
+
+
+
+ {taskType=="3"&&{}
+ }/>}
+
+
+
+
);
};
\ No newline at end of file