feat:添加hook
This commit is contained in:
parent
0e3275fe33
commit
6982280de2
|
@ -14,6 +14,7 @@
|
||||||
"antd-mobile-icons": "^0.3.0",
|
"antd-mobile-icons": "^0.3.0",
|
||||||
"axios": "^1.2.2",
|
"axios": "^1.2.2",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
|
"dayjs-plugin-utc": "^0.1.2",
|
||||||
"js-cookie": "^2.2.1",
|
"js-cookie": "^2.2.1",
|
||||||
"node-gyp": "^9.3.1",
|
"node-gyp": "^9.3.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
|
@ -6431,6 +6432,11 @@
|
||||||
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
|
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
|
||||||
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
|
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
|
||||||
},
|
},
|
||||||
|
"node_modules/dayjs-plugin-utc": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/dayjs-plugin-utc/-/dayjs-plugin-utc-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg=="
|
||||||
|
},
|
||||||
"node_modules/debug": {
|
"node_modules/debug": {
|
||||||
"version": "4.3.4",
|
"version": "4.3.4",
|
||||||
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
|
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
|
||||||
|
@ -21947,6 +21953,11 @@
|
||||||
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
|
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
|
||||||
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
|
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
|
||||||
},
|
},
|
||||||
|
"dayjs-plugin-utc": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/dayjs-plugin-utc/-/dayjs-plugin-utc-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg=="
|
||||||
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "4.3.4",
|
"version": "4.3.4",
|
||||||
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
|
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
"antd-mobile-icons": "^0.3.0",
|
"antd-mobile-icons": "^0.3.0",
|
||||||
"axios": "^1.2.2",
|
"axios": "^1.2.2",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
|
"dayjs-plugin-utc": "^0.1.2",
|
||||||
"js-cookie": "^2.2.1",
|
"js-cookie": "^2.2.1",
|
||||||
"node-gyp": "^9.3.1",
|
"node-gyp": "^9.3.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-beautiful-dnd": "^13.1.1",
|
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-router-dom": "^6.6.2",
|
"react-router-dom": "^6.6.2",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
|
|
|
@ -68,7 +68,7 @@ const DetailSearchBar = (props) => {
|
||||||
if (searchObj.name === "state" && searchObj.value === "10") {
|
if (searchObj.name === "state" && searchObj.value === "10") {
|
||||||
const dict = stateDictionary.get(searchObj.value);
|
const dict = stateDictionary.get(searchObj.value);
|
||||||
if (dict && tagList.length > 0) {
|
if (dict && tagList.length > 0) {
|
||||||
tagList.push(<AddOutline/>)
|
tagList.push(<AddOutline key = "add-icon"/>)
|
||||||
} if (dict) {
|
} if (dict) {
|
||||||
tagList.push(<Tag key={dict.id} color={dict.jsonValue?.color}>
|
tagList.push(<Tag key={dict.id} color={dict.jsonValue?.color}>
|
||||||
{dict.itemName}
|
{dict.itemName}
|
||||||
|
@ -87,7 +87,7 @@ const DetailSearchBar = (props) => {
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
navigate("/detail/searchTask");
|
navigate("/detail/searchTask");
|
||||||
}}>
|
}}>
|
||||||
<SearchOutline/>
|
<SearchOutline key="search-icon"/>
|
||||||
{/*根据search处理搜素框展示内容*/}
|
{/*根据search处理搜素框展示内容*/}
|
||||||
{tags}
|
{tags}
|
||||||
</div>
|
</div>
|
||||||
|
@ -102,7 +102,7 @@ const DetailSearchBar = (props) => {
|
||||||
}});
|
}});
|
||||||
setTags([]);
|
setTags([]);
|
||||||
}}>
|
}}>
|
||||||
<CloseOutline style={{float: "right"}}/>
|
<CloseOutline key="close-icon" style={{float: "right"}}/>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
{/*<SearchBar placeholder='请输入内容,无法放入标签' onFocus={() => {*/}
|
{/*<SearchBar placeholder='请输入内容,无法放入标签' onFocus={() => {*/}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
import {useEffect, useState} from "react";
|
||||||
|
|
||||||
|
export default function StatusBar() {
|
||||||
|
const [isOnline, setIsOnline] = useState(true);
|
||||||
|
useEffect(() => {
|
||||||
|
function handleOnline() {
|
||||||
|
setIsOnline(true);
|
||||||
|
}
|
||||||
|
function handleOffline() {
|
||||||
|
setIsOnline(false);
|
||||||
|
}
|
||||||
|
window.addEventListener('online', handleOnline);
|
||||||
|
window.addEventListener('offline', handleOffline);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('online', handleOnline);
|
||||||
|
window.removeEventListener('offline', handleOffline);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return <h1>{isOnline ? '✅ Online' : '❌ Disconnected'}</h1>;
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
import {useEffect, useMemo, useState} from "react";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
import {DATE_TIME_FORMAT} from "../utils/timeFormatUtil";
|
||||||
|
import {getTaskByPid} from "../utils";
|
||||||
|
import {Cascader} from "antd-mobile";
|
||||||
|
|
||||||
|
export function useChildList() {
|
||||||
|
const [task, setTask] = useState({
|
||||||
|
name: "想做的事情",
|
||||||
|
description: "想做的事情描述",
|
||||||
|
expectedStartTime: dayjs().format(DATE_TIME_FORMAT),
|
||||||
|
expectedEndTime: "",
|
||||||
|
state: "",
|
||||||
|
priority: "",
|
||||||
|
});
|
||||||
|
// Map key为pid和他的子项
|
||||||
|
const [childList, setChildList] = useState({});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetchOptionsForValue('0', 0)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
// list嵌套选中项的list
|
||||||
|
const options = useMemo(() => {
|
||||||
|
function generate(v) {
|
||||||
|
const options = childList[v]
|
||||||
|
if (options === null) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
if (options === undefined) {
|
||||||
|
return Cascader.optionSkeleton
|
||||||
|
}
|
||||||
|
return options.map(option => ({
|
||||||
|
...option,
|
||||||
|
children: generate(option.value),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
return generate('0') ?? []
|
||||||
|
}, [childList])
|
||||||
|
|
||||||
|
async function fetchOptionsForValue(v, level) {
|
||||||
|
if (v in childList) return
|
||||||
|
const data = await getTaskByPid(v)
|
||||||
|
const options =
|
||||||
|
data.content.length === 0
|
||||||
|
? null
|
||||||
|
: data.content.map(task => ({
|
||||||
|
value: task.id,
|
||||||
|
label: task.name,
|
||||||
|
...task,
|
||||||
|
}))
|
||||||
|
|
||||||
|
setChildList(prev => ({
|
||||||
|
...prev,
|
||||||
|
[v]: options,
|
||||||
|
}))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeTaskId(taskId) {
|
||||||
|
if (!(taskId && taskId.length > 0)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let currentTaskId = taskId[taskId.length - 1];
|
||||||
|
fetchOptionsForValue(currentTaskId);
|
||||||
|
if (taskId.length > 1) {
|
||||||
|
setTask(childList[taskId[taskId.length - 2]].find(task => task.id === currentTaskId))
|
||||||
|
} else {
|
||||||
|
setTask(childList['0'].find(task => task.id === currentTaskId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeTaskId(taskId) {
|
||||||
|
childList.delete(taskId);
|
||||||
|
setChildList(...childList)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
changeTaskId,
|
||||||
|
removeTaskId,
|
||||||
|
options,
|
||||||
|
task
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
// React 应用是由组件构成,而组件由内置或自定义 Hook 构成。
|
||||||
|
// React 组件名称必须以大写字母开头,比如 StatusBar 和 SaveButton。React 组件还需要返回一些 React 能够显示的内容,比如一段 JSX。
|
||||||
|
// Hook 的名称必须以 use 开头,然后紧跟一个大写字母,就像内置的 useState 或者本文早前的自定义 useOnlineStatus 一样。Hook 可以返回任意值。
|
||||||
|
// 自定义 Hook 共享的是状态逻辑,而不是状态本身
|
||||||
|
// 随着时间的推移,应用中大部分 Effect 都会存在于自定义 Hook 内部。
|
||||||
|
export function useOnlineStatus() {
|
||||||
|
const [isOnline, setIsOnline] = useState(true);
|
||||||
|
useEffect(() => {
|
||||||
|
function handleOnline() {
|
||||||
|
setIsOnline(true);
|
||||||
|
}
|
||||||
|
function handleOffline() {
|
||||||
|
setIsOnline(false);
|
||||||
|
}
|
||||||
|
window.addEventListener('online', handleOnline);
|
||||||
|
window.addEventListener('offline', handleOffline);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('online', handleOnline);
|
||||||
|
window.removeEventListener('offline', handleOffline);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
return isOnline;
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ import {CloseCircleFill} from "antd-mobile-icons";
|
||||||
import {useLocation, useNavigate, useOutletContext} from "react-router-dom";
|
import {useLocation, useNavigate, useOutletContext} from "react-router-dom";
|
||||||
import {getDictionary} from "../../utils/dictUtil";
|
import {getDictionary} from "../../utils/dictUtil";
|
||||||
import {MyRootContext, UPDATE_SEARCH} from "../../components/MyRootContext";
|
import {MyRootContext, UPDATE_SEARCH} from "../../components/MyRootContext";
|
||||||
|
import {dayStartUtcFormat, nextDayStartUtcFormat} from "../../utils/timeFormatUtil";
|
||||||
|
|
||||||
const DetailSearchContext = () => {
|
const DetailSearchContext = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
@ -78,7 +79,7 @@ const DetailSearchContext = () => {
|
||||||
searchCondition.push({"name": "name", "value": pidArray[pidArray.length - 1], "operateType": "="})
|
searchCondition.push({"name": "name", "value": pidArray[pidArray.length - 1], "operateType": "="})
|
||||||
}
|
}
|
||||||
if (name && name !== "") {
|
if (name && name !== "") {
|
||||||
searchCondition.push({"name": "name", "value": name, "operateType": "LIKE"})
|
searchCondition.push({"name": "name", "value": name, "operateType": "%"})
|
||||||
}
|
}
|
||||||
if (priority && priority.length !== 0) {
|
if (priority && priority.length !== 0) {
|
||||||
searchCondition.push({"name": "priority", "value": priority.join(","), "operateType": "IN"})
|
searchCondition.push({"name": "priority", "value": priority.join(","), "operateType": "IN"})
|
||||||
|
@ -89,22 +90,22 @@ const DetailSearchContext = () => {
|
||||||
if (todoDay) {
|
if (todoDay) {
|
||||||
andSearchModel.andList = [{
|
andSearchModel.andList = [{
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
"value": dayjs(todoDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": nextDayStartUtcFormat(todoDay),
|
||||||
"operateType": "<"
|
"operateType": "<"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
"value": dayjs(todoDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": dayStartUtcFormat(todoDay),
|
||||||
"operateType": ">"
|
"operateType": ">"
|
||||||
}]
|
}]
|
||||||
andSearchModel.orSearchModel = {
|
andSearchModel.orSearchModel = {
|
||||||
"andList": [
|
"andList": [
|
||||||
{
|
{
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
"value": dayjs(todoDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": nextDayStartUtcFormat(todoDay),
|
||||||
"operateType": "<"
|
"operateType": "<"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
"value": dayjs(todoDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": dayStartUtcFormat(todoDay),
|
||||||
"operateType": ">"
|
"operateType": ">"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
|
@ -114,11 +115,11 @@ const DetailSearchContext = () => {
|
||||||
"andList": [
|
"andList": [
|
||||||
{
|
{
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
"value": dayjs(todoDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": nextDayStartUtcFormat(todoDay),
|
||||||
"operateType": "<"
|
"operateType": "<"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
"value": dayjs(todoDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": dayStartUtcFormat(todoDay),
|
||||||
"operateType": ">"
|
"operateType": ">"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
export const columnSortConstant = [
|
||||||
|
[
|
||||||
|
{ label: '创建时间', value: 'createdDate' },
|
||||||
|
{ label: '修改时间', value: 'lastModifiedDate' },
|
||||||
|
{ label: '期望开始时间', value: 'expectedStartTime' },
|
||||||
|
{ label: '期望结束时间', value: 'expectedEndTime' },
|
||||||
|
{ label: '任务优先级', value: 'priority' },
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{ label: '升序', value: 'am' },
|
||||||
|
{ label: '降序', value: 'pm' },
|
||||||
|
],
|
||||||
|
]
|
|
@ -1,13 +1,62 @@
|
||||||
import React from "react";
|
import React, {useState} from "react";
|
||||||
import {Button} from "antd-mobile";
|
import {Button, Form, List, Picker, Space, Switch} from "antd-mobile";
|
||||||
import Cookies from "js-cookie";
|
import Cookies from "js-cookie";
|
||||||
|
import {columnSortConstant} from "./columnSortConstant";
|
||||||
|
|
||||||
export function PersonalCenter() {
|
export function PersonalCenter() {
|
||||||
return <div>pc端可访问:http://www.hauruyu.com
|
const [columnSort, setColumnSort] = useState()
|
||||||
<Button color={"danger"} onClick={()=>{
|
return <div>
|
||||||
localStorage.removeItem('platform-security');
|
<List header='网站:http://www.hauruyu.com'>
|
||||||
Cookies.remove('platform-security');
|
<List.Item extra={<Switch defaultChecked/>}>新建任务时父任务只展示未完成任务</List.Item>
|
||||||
window.location.href="http:///www.huaruyu.com/login"
|
|
||||||
}}>退出登录</Button>
|
<Picker
|
||||||
|
columns={columnSortConstant}
|
||||||
|
value={columnSort}
|
||||||
|
onConfirm={setColumnSort}
|
||||||
|
onSelect={(val, extend) => {
|
||||||
|
console.log('onSelect', val, extend.items)
|
||||||
|
}}>
|
||||||
|
{(items, {open}) => {
|
||||||
|
return (
|
||||||
|
// <Space align='end'>
|
||||||
|
<List.Item onClick={open} extra={items.every(item => item === null)
|
||||||
|
? '未选择'
|
||||||
|
: items.map(item => item?.label ?? '未选择').join(' - ')}>
|
||||||
|
任务排序方式:
|
||||||
|
</List.Item>
|
||||||
|
// </Space>
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
</Picker>
|
||||||
|
|
||||||
|
<List.Item description='管理已授权的产品和设备' clickable>
|
||||||
|
授权管理
|
||||||
|
</List.Item>
|
||||||
|
<List.Item title='副标题信息A' description='副标题信息B' clickable>
|
||||||
|
这里是主信息
|
||||||
|
</List.Item>
|
||||||
|
</List>
|
||||||
|
{/*<Form*/}
|
||||||
|
{/* layout='horizontal'*/}
|
||||||
|
{/* footer={*/}
|
||||||
|
{/* <Button block type='submit' color='primary' size='large'>*/}
|
||||||
|
{/* 提交*/}
|
||||||
|
{/* </Button>*/}
|
||||||
|
{/* }*/}
|
||||||
|
{/*>*/}
|
||||||
|
{/* <Form.Header>网站:http://www.hauruyu.com</Form.Header>*/}
|
||||||
|
{/* <Form.Item*/}
|
||||||
|
{/* name='delivery'*/}
|
||||||
|
{/* label='新建任务时,父任务只展示未完成任务'*/}
|
||||||
|
{/* childElementPosition='right'*/}
|
||||||
|
{/* >*/}
|
||||||
|
{/* <Switch/>*/}
|
||||||
|
{/* </Form.Item>*/}
|
||||||
|
{/*</Form>*/}
|
||||||
|
<Button color={"danger"} onClick={() => {
|
||||||
|
localStorage.removeItem('platform-security');
|
||||||
|
Cookies.remove('platform-security');
|
||||||
|
window.location.href = "http:///www.huaruyu.com/login"
|
||||||
|
}}>退出登录</Button>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
import React, {Fragment, useContext, useEffect, useMemo} from "react";
|
import React, {Fragment, useContext, useEffect, useMemo} from "react";
|
||||||
import {getTaskCount} from "../../utils";
|
import {getTaskCount} from "../../utils";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import {DATE_FORMAT} from "../../utils/timeFormatUtil";
|
import {DATE_FORMAT, dayStartUtcFormat, nextDayStartUtcFormat} from "../../utils/timeFormatUtil";
|
||||||
import {getDictionary} from "../../utils/dictUtil";
|
import {getDictionary} from "../../utils/dictUtil";
|
||||||
import {Tag} from "antd-mobile";
|
import {Tag} from "antd-mobile";
|
||||||
import {useNavigate} from "react-router-dom";
|
import {useNavigate} from "react-router-dom";
|
||||||
|
@ -18,8 +18,8 @@ const TaskCount = (props) => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("useEffect");
|
console.log("useEffect");
|
||||||
if (currentDay) {
|
if (currentDay) {
|
||||||
getTaskCount(dayjs(currentDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0),
|
getTaskCount(dayStartUtcFormat(currentDay),
|
||||||
dayjs(currentDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0))
|
nextDayStartUtcFormat(currentDay))
|
||||||
.then(taskCount => {
|
.then(taskCount => {
|
||||||
setTaskCount(taskCount)
|
setTaskCount(taskCount)
|
||||||
})
|
})
|
||||||
|
@ -42,22 +42,22 @@ const TaskCount = (props) => {
|
||||||
if (currentDay) {
|
if (currentDay) {
|
||||||
andSearchModel.andList = [{
|
andSearchModel.andList = [{
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
"value": dayjs(currentDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": nextDayStartUtcFormat(currentDay),
|
||||||
"operateType": "<"
|
"operateType": "<"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
"value": dayjs(currentDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": dayStartUtcFormat(currentDay),
|
||||||
"operateType": ">"
|
"operateType": ">"
|
||||||
}]
|
}]
|
||||||
andSearchModel.orSearchModel = {
|
andSearchModel.orSearchModel = {
|
||||||
"andList": [
|
"andList": [
|
||||||
{
|
{
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
"value": dayjs(currentDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": nextDayStartUtcFormat(currentDay),
|
||||||
"operateType": "<"
|
"operateType": "<"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
"value": dayjs(currentDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": dayStartUtcFormat(currentDay),
|
||||||
"operateType": ">"
|
"operateType": ">"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
|
@ -67,11 +67,11 @@ const TaskCount = (props) => {
|
||||||
"andList": [
|
"andList": [
|
||||||
{
|
{
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
"value": dayjs(currentDay).add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": nextDayStartUtcFormat(currentDay),
|
||||||
"operateType": "<"
|
"operateType": "<"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedEndTime",
|
"name": "expectedEndTime",
|
||||||
"value": dayjs(currentDay).set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format(),
|
"value": dayStartUtcFormat(currentDay),
|
||||||
"operateType": ">"
|
"operateType": ">"
|
||||||
}, {
|
}, {
|
||||||
"name": "expectedStartTime",
|
"name": "expectedStartTime",
|
||||||
|
|
|
@ -1,70 +1,90 @@
|
||||||
import {Fragment, useEffect, useMemo, useState} from "react";
|
import {Fragment, useEffect, useMemo, useState} from "react";
|
||||||
import {Card, Cascader, CascaderView} from "antd-mobile";
|
import {Card, Cascader, CascaderView} from "antd-mobile";
|
||||||
import {getTaskByPid} from "../../utils";
|
import {getTaskByPid} from "../../utils";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
import {DATE_TIME_FORMAT} from "../../utils/timeFormatUtil";
|
||||||
|
import {useChildList} from "../../hooks/useChildList";
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
const [valueToOptions, setValueToOptions] = useState([])
|
// const [valueToOptions, setValueToOptions] = useState([])
|
||||||
const options = useMemo(() => {
|
// const [currentTask, setCurrentTask] = useState({
|
||||||
function generate(v) {
|
// name:"想做的事情",
|
||||||
const options = valueToOptions[v]
|
// description:"想做的事情描述",
|
||||||
if (options === null) {
|
// expectedStartTime:dayjs().format(DATE_TIME_FORMAT),
|
||||||
return undefined
|
// expectedEndTime:"",
|
||||||
}
|
// state:"",
|
||||||
if (options === undefined) {
|
// priority:"",
|
||||||
return Cascader.optionSkeleton
|
// })
|
||||||
}
|
// const options = useMemo(() => {
|
||||||
return options.map(option => ({
|
// function generate(v) {
|
||||||
...option,
|
// const options = valueToOptions[v]
|
||||||
children: generate(option.value),
|
// if (options === null || options === undefined) {
|
||||||
}))
|
// return undefined
|
||||||
}
|
// }
|
||||||
|
// // if (options === undefined) {
|
||||||
|
// // return Cascader.optionSkeleton
|
||||||
|
// // }
|
||||||
|
// return options.map(option => ({
|
||||||
|
// ...option,
|
||||||
|
// children: generate(option.value),
|
||||||
|
// }))
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return generate('0') ?? []
|
||||||
|
// }, [valueToOptions])
|
||||||
|
//
|
||||||
|
// async function fetchOptionsForValue(v, level) {
|
||||||
|
// if (v in valueToOptions) return
|
||||||
|
// // if (level >= 3) {
|
||||||
|
// // setValueToOptions(prev => ({
|
||||||
|
// // ...prev,
|
||||||
|
// // [v]: null,
|
||||||
|
// // }))
|
||||||
|
// // return
|
||||||
|
// // }
|
||||||
|
// const data = await getTaskByPid(v)
|
||||||
|
// console.log("await getTaskByPid(v)", data.content)
|
||||||
|
// const options =
|
||||||
|
// data.content.length === 0
|
||||||
|
// ? null
|
||||||
|
// : data.content.map(task => ({
|
||||||
|
// value: task.id,
|
||||||
|
// label: task.name,
|
||||||
|
// }))
|
||||||
|
// console.log("await getTaskByPid(v) options", options)
|
||||||
|
// if (options){
|
||||||
|
// setValueToOptions(prev => ({
|
||||||
|
// ...prev,
|
||||||
|
// [v]: options,
|
||||||
|
// }))
|
||||||
|
// }else {
|
||||||
|
// setValueToOptions(prev => ({
|
||||||
|
// ...prev,
|
||||||
|
// [v]: undefined,
|
||||||
|
// }))
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
return generate('0') ?? []
|
// useEffect(() => {
|
||||||
}, [valueToOptions])
|
// fetchOptionsForValue('0', 0)
|
||||||
|
// }, [])
|
||||||
|
|
||||||
async function fetchOptionsForValue(v, level) {
|
const {task, options, changeTaskId,} = useChildList();
|
||||||
if (v in valueToOptions) return
|
|
||||||
// if (level >= 3) {
|
|
||||||
// setValueToOptions(prev => ({
|
|
||||||
// ...prev,
|
|
||||||
// [v]: null,
|
|
||||||
// }))
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
const data = await getTaskByPid(v)
|
|
||||||
console.log("await getTaskByPid(v)", data.content)
|
|
||||||
const options =
|
|
||||||
data.content.length === 0
|
|
||||||
? null
|
|
||||||
: data.content.map(task => ({
|
|
||||||
value: task.id,
|
|
||||||
label: task.name,
|
|
||||||
}))
|
|
||||||
console.log("await getTaskByPid(v) options", options)
|
|
||||||
if (options){
|
|
||||||
setValueToOptions(prev => ({
|
|
||||||
...prev,
|
|
||||||
[v]: options,
|
|
||||||
}))
|
|
||||||
}else {
|
|
||||||
setValueToOptions(prev => ({
|
|
||||||
...prev,
|
|
||||||
[v]: [],
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
fetchOptionsForValue('0', 0)
|
|
||||||
}, [])
|
|
||||||
return <Fragment>
|
return <Fragment>
|
||||||
<Card title='任务名称'>
|
<Card title={task?.name} style={{height: "30vh", borderRadius: "10px"}}>
|
||||||
任务详情
|
<p>{task?.description}</p>
|
||||||
|
|
||||||
|
<p>预计开始时间:{task?.expectedStartTime}</p>
|
||||||
|
<p>预计结束时间:{task?.expectedEndTime}</p>
|
||||||
</Card>
|
</Card>
|
||||||
<CascaderView options={options} onChange={value => {
|
<CascaderView
|
||||||
fetchOptionsForValue(value)
|
options={options}
|
||||||
}}/>
|
onChange={value => {
|
||||||
|
// fetchOptionsForValue(value[value.length-1])
|
||||||
|
console.log({value})
|
||||||
|
changeTaskId(value)
|
||||||
|
}}
|
||||||
|
|
||||||
|
/>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@ import {requestUtil} from "./requestUtil";
|
||||||
|
|
||||||
export const getTaskList = (data) => {
|
export const getTaskList = (data) => {
|
||||||
let request = encodeURI(JSON.stringify(data))
|
let request = encodeURI(JSON.stringify(data))
|
||||||
return requestUtil.get('/V2/search/task_message_tree?search=' + request);
|
return requestUtil.get('/todo-server/V2/search/task_message_tree?search=' + request);
|
||||||
}
|
}
|
||||||
// 根据pid获取未完成的任务
|
// 根据pid获取未完成的任务
|
||||||
export const getTaskByPid = (pid) => {
|
export const getTaskByPid = (pid) => {
|
||||||
|
|
|
@ -1,23 +1,37 @@
|
||||||
import dayjs from "dayjs";
|
import dayjs, {isDayjs} from "dayjs";
|
||||||
|
import utc from "dayjs/plugin/utc";
|
||||||
|
dayjs.extend(utc)
|
||||||
const DATE_FORMAT = "YYYY-MM-DD"
|
const DATE_FORMAT = "YYYY-MM-DD"
|
||||||
// 到秒没啥意义
|
// 到秒没啥意义
|
||||||
const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm"
|
const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm"
|
||||||
|
|
||||||
const DATE_TIME_FORMAT_SIMPLE = "MM-DD HH:mm"
|
const DATE_TIME_FORMAT_SIMPLE = "MM-DD HH:mm"
|
||||||
|
|
||||||
function dayStartUtcFormat(dayjs) {
|
function dayStartUtcFormat(dayjsString) {
|
||||||
if (dayjs) {
|
|
||||||
return dayjs.set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format()
|
if (!dayjsString) {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
return null;
|
let dayJsObj;
|
||||||
|
if (isDayjs(dayjsString)) {
|
||||||
|
dayJsObj = dayjsString;
|
||||||
|
}else {
|
||||||
|
dayJsObj = dayjs(dayjsString);
|
||||||
|
}
|
||||||
|
return dayJsObj.set('h', 0).set('m', 0).set('s', 0).set('ms', 0).utc().format()
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextDayStartUtcFormat(dayjs) {
|
function nextDayStartUtcFormat(dayjsString) {
|
||||||
if (dayjs) {
|
if (!dayjsString) {
|
||||||
return dayjs.add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).format()
|
return
|
||||||
}
|
}
|
||||||
return null
|
let dayJsObj;
|
||||||
|
if (isDayjs(dayjsString)) {
|
||||||
|
dayJsObj = dayjsString;
|
||||||
|
}else {
|
||||||
|
dayJsObj = dayjs(dayjsString);
|
||||||
|
}
|
||||||
|
return dayJsObj.add(1, "d").set('h', 0).set('m', 0).set('s', 0).set('ms', 0).utc().format()
|
||||||
}
|
}
|
||||||
|
|
||||||
export {DATE_TIME_FORMAT, DATE_FORMAT,DATE_TIME_FORMAT_SIMPLE,dayStartUtcFormat,nextDayStartUtcFormat}
|
export {DATE_TIME_FORMAT, DATE_FORMAT,DATE_TIME_FORMAT_SIMPLE,dayStartUtcFormat,nextDayStartUtcFormat}
|
Loading…
Reference in New Issue