feat:localStorage处理,日历背景颜色处理
This commit is contained in:
parent
03626f9f58
commit
ccea84285c
|
@ -6,36 +6,52 @@ import {
|
||||||
ProFormText,
|
ProFormText,
|
||||||
ProFormTextArea
|
ProFormTextArea
|
||||||
} from "@ant-design/pro-components";
|
} from "@ant-design/pro-components";
|
||||||
import {TaskScheduleRecordForm, TaskScheduleRecordVO} from "@/components/type/TaskSchedule.d";
|
import {TaskScheduleRecordForm} from "@/components/type/TaskSchedule.d";
|
||||||
import {clickRecordAPI, getRecordById} from "@/components/service/ScheduleTask";
|
import {
|
||||||
|
clickRecordAPI,
|
||||||
|
deleteClickRecordAPI,
|
||||||
|
editClickRecordAPI,
|
||||||
|
getRecordById
|
||||||
|
} from "@/components/service/ScheduleTask";
|
||||||
import dayjs, {UnitTypeShort} from "dayjs";
|
import dayjs, {UnitTypeShort} from "dayjs";
|
||||||
import {onceConsumerRead} from "@/utils/codeToReadName";
|
import {onceConsumerRead} from "@/utils/codeToReadName";
|
||||||
import {betweenTime} from "@/utils/timeFormatUtil";
|
import {betweenTime} from "@/utils/timeFormatUtil";
|
||||||
|
|
||||||
interface ClickRecordProps {
|
interface ClickRecordProps {
|
||||||
openClickRecord?:boolean;
|
openClickRecord?: boolean;
|
||||||
recordId?:string;
|
recordId?: string;
|
||||||
taskId?: string;
|
taskId?: string;
|
||||||
taskName: string;
|
taskName: string;
|
||||||
onceConsume?: string;
|
onceConsume?: string;
|
||||||
setOpenClickRecord?:(boolean: boolean) => void;
|
setOpenClickRecord?: (boolean: boolean) => void;
|
||||||
|
reloadData?:()=>void
|
||||||
}
|
}
|
||||||
|
|
||||||
const ClickRecord: React.FC<ClickRecordProps> = ({recordId,openClickRecord,setOpenClickRecord,taskId, taskName, onceConsume}) => {
|
const ClickRecord: React.FC<ClickRecordProps> = ({
|
||||||
|
recordId,
|
||||||
|
openClickRecord,
|
||||||
|
setOpenClickRecord,
|
||||||
|
taskId,
|
||||||
|
taskName,
|
||||||
|
onceConsume,
|
||||||
|
reloadData
|
||||||
|
}) => {
|
||||||
const [form] = Form.useForm<TaskScheduleRecordForm>();
|
const [form] = Form.useForm<TaskScheduleRecordForm>();
|
||||||
const [editAble, setEditAble] = useState<boolean>(true);
|
const [editAble, setEditAble] = useState<boolean>(true);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("ClickRecord:useEffect:",openClickRecord)
|
console.log("ClickRecord:useEffect:", openClickRecord)
|
||||||
if (recordId){
|
if (recordId) {
|
||||||
setEditAble(false)
|
setEditAble(false)
|
||||||
getRecordById(recordId).then(res=>{
|
getRecordById(recordId).then(res => {
|
||||||
if (res.data.status.success){
|
if (res.data.status.success) {
|
||||||
form.setFieldsValue({...res.data.data,
|
form.setFieldsValue({
|
||||||
recordTimeRange:[res.data.data.startDate?dayjs(res.data.data.startDate).toDate():undefined,
|
...res.data.data,
|
||||||
res.data.data.startDate?dayjs(res.data.data.recordDate).toDate():undefined]})
|
recordTimeRange: [res.data.data.startDate ? dayjs(res.data.data.startDate) : undefined,
|
||||||
|
res.data.data.startDate ? dayjs(res.data.data.recordDate) : undefined]
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}else {
|
} else {
|
||||||
let data = {
|
let data = {
|
||||||
'recordTimeRange': [onceConsume ? dayjs().subtract(Number(onceConsume.split(",")[0]), onceConsume.split(",")[1] as UnitTypeShort) : dayjs(), dayjs()],
|
'recordTimeRange': [onceConsume ? dayjs().subtract(Number(onceConsume.split(",")[0]), onceConsume.split(",")[1] as UnitTypeShort) : dayjs(), dayjs()],
|
||||||
'timeDifference': onceConsumerRead(onceConsume),
|
'timeDifference': onceConsumerRead(onceConsume),
|
||||||
|
@ -48,7 +64,7 @@ const ClickRecord: React.FC<ClickRecordProps> = ({recordId,openClickRecord,setOp
|
||||||
<ModalForm<TaskScheduleRecordForm>
|
<ModalForm<TaskScheduleRecordForm>
|
||||||
title={`${taskName}打卡`}
|
title={`${taskName}打卡`}
|
||||||
layout="horizontal"
|
layout="horizontal"
|
||||||
trigger={(recordId?undefined:
|
trigger={(recordId ? undefined :
|
||||||
<Button type="primary">
|
<Button type="primary">
|
||||||
打卡记录
|
打卡记录
|
||||||
</Button>)}
|
</Button>)}
|
||||||
|
@ -62,14 +78,24 @@ const ClickRecord: React.FC<ClickRecordProps> = ({recordId,openClickRecord,setOp
|
||||||
submitter={{
|
submitter={{
|
||||||
render: (prop, defaultDoms) => {
|
render: (prop, defaultDoms) => {
|
||||||
const result = [];
|
const result = [];
|
||||||
if (recordId&&!editAble){
|
if (recordId && !editAble) {
|
||||||
result.push(<Button color="danger" key="edit"
|
result.push(<Button color="danger" key="edit"
|
||||||
onClick={() => setEditAble(true)}>编辑
|
onClick={() => setEditAble(true)}>编辑
|
||||||
</Button>)
|
</Button>)
|
||||||
result.push(<Button type="primary" key="close"
|
result.push(<Button type="primary" key="close"
|
||||||
onClick={() => setOpenClickRecord?.(false)}>关闭
|
onClick={() => setOpenClickRecord?.(false)}>关闭
|
||||||
</Button>)
|
</Button>)
|
||||||
}else{
|
result.push(<Button color="danger" key="delete"
|
||||||
|
onClick={() => {
|
||||||
|
deleteClickRecordAPI(recordId).then(res => {
|
||||||
|
if (res.data.status.success) {
|
||||||
|
setOpenClickRecord?.(false)
|
||||||
|
reloadData?.()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}}>删除
|
||||||
|
</Button>)
|
||||||
|
} else {
|
||||||
result.push(defaultDoms)
|
result.push(defaultDoms)
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -80,7 +106,8 @@ const ClickRecord: React.FC<ClickRecordProps> = ({recordId,openClickRecord,setOp
|
||||||
autoFocusFirstInput
|
autoFocusFirstInput
|
||||||
readonly={!editAble}
|
readonly={!editAble}
|
||||||
onFinish={async (values) => {
|
onFinish={async (values) => {
|
||||||
if(taskId){
|
console.log({values})
|
||||||
|
if (taskId) {
|
||||||
values.taskId = taskId
|
values.taskId = taskId
|
||||||
}
|
}
|
||||||
if (values.recordTimeRange[0]) {
|
if (values.recordTimeRange[0]) {
|
||||||
|
@ -89,7 +116,13 @@ const ClickRecord: React.FC<ClickRecordProps> = ({recordId,openClickRecord,setOp
|
||||||
if (values.recordTimeRange[1]) {
|
if (values.recordTimeRange[1]) {
|
||||||
values.recordDate = new Date(values.recordTimeRange[1])
|
values.recordDate = new Date(values.recordTimeRange[1])
|
||||||
}
|
}
|
||||||
|
if (values.id) {
|
||||||
|
await editClickRecordAPI(values);
|
||||||
|
} else {
|
||||||
await clickRecordAPI(values);
|
await clickRecordAPI(values);
|
||||||
|
}
|
||||||
|
setOpenClickRecord?.(false)
|
||||||
|
reloadData?.()
|
||||||
return true
|
return true
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
@ -118,6 +151,16 @@ const ClickRecord: React.FC<ClickRecordProps> = ({recordId,openClickRecord,setOp
|
||||||
label="耗时"
|
label="耗时"
|
||||||
readonly={true}
|
readonly={true}
|
||||||
/>
|
/>
|
||||||
|
<ProFormText
|
||||||
|
width="xs"
|
||||||
|
name="id"
|
||||||
|
hidden={true}
|
||||||
|
/>
|
||||||
|
<ProFormText
|
||||||
|
width="xs"
|
||||||
|
hidden={true}
|
||||||
|
name="taskId"
|
||||||
|
/>
|
||||||
<ProFormTextArea name="remarks" label="备注"/>
|
<ProFormTextArea name="remarks" label="备注"/>
|
||||||
</ModalForm>)
|
</ModalForm>)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import React, {useState, useEffect, Fragment} from 'react';
|
import React, {useState, useEffect, Fragment} from 'react';
|
||||||
import dayjs, {Dayjs} from 'dayjs';
|
import dayjs, {Dayjs, UnitTypeShort} from 'dayjs';
|
||||||
import {Button, Input, Modal, Segmented} from 'antd';
|
import {Button, Input, Modal, Segmented} from 'antd';
|
||||||
import style from "@/components/SettingCton.module.css"
|
import style from "@/components/SettingCton.module.css"
|
||||||
import {generateNextTimeAPI} from "@/components/service/ScheduleTask";
|
import {generateNextTimeAPI} from "@/components/service/ScheduleTask";
|
||||||
|
@ -7,7 +7,9 @@ import {generateNextTimeAPI} from "@/components/service/ScheduleTask";
|
||||||
type PresetType = 'everyMinute' | 'everyHour' | 'daily' | 'weekly' | 'monthly';
|
type PresetType = 'everyMinute' | 'everyHour' | 'daily' | 'weekly' | 'monthly';
|
||||||
|
|
||||||
interface CronGeneratorProps {
|
interface CronGeneratorProps {
|
||||||
setCronFunction: (data: boolean) => void;
|
onceConsumer:string[]
|
||||||
|
setCronFunction: (data: string) => void;
|
||||||
|
setExpectedTimeRange:(expect:(Dayjs|undefined)[]) => void;
|
||||||
cron?: string;
|
cron?: string;
|
||||||
canSetting:boolean;
|
canSetting:boolean;
|
||||||
}
|
}
|
||||||
|
@ -148,7 +150,9 @@ function cronToChinese(cronExpression: string) {
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction, cron,canSetting}) => {
|
const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpectedTimeRange,
|
||||||
|
onceConsumer,
|
||||||
|
cron,canSetting}) => {
|
||||||
const [showModal, setShowModal] = useState(false);
|
const [showModal, setShowModal] = useState(false);
|
||||||
const [current, setCurrent] = useState<number>(0);
|
const [current, setCurrent] = useState<number>(0);
|
||||||
const [cronSeconds, setCronSeconds] = useState<string>(cron ? cron.split(' ')[0] : '*');
|
const [cronSeconds, setCronSeconds] = useState<string>(cron ? cron.split(' ')[0] : '*');
|
||||||
|
@ -183,16 +187,14 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction, cron,canS
|
||||||
try {
|
try {
|
||||||
generateNextTimeAPI('0 ' + fullCronExpression).then(res => {
|
generateNextTimeAPI('0 ' + fullCronExpression).then(res => {
|
||||||
setNextOccurrences(res.data.data.map((next: string) => dayjs(next)));
|
setNextOccurrences(res.data.data.map((next: string) => dayjs(next)));
|
||||||
setCronFunction(false);
|
setExpectedTimeRange([dayjs(res.data.data[0]),
|
||||||
|
onceConsumer&&onceConsumer.length==2 ? dayjs(res.data.data[0]).add(Number(onceConsumer[0]), onceConsumer[1] as UnitTypeShort):undefined])
|
||||||
|
setCronFunction(fullCronExpression);
|
||||||
});
|
});
|
||||||
console.log('Cron confirmed:', fullCronExpression);
|
|
||||||
setCronFunction(false);
|
|
||||||
setShowModal(false)
|
setShowModal(false)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Cron expression is invalid', error);
|
console.error('Cron expression is invalid', error);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
setCronFunction(false);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -268,7 +270,7 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction, cron,canS
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<text style={{"paddingRight":"5px"}}>{canReadCron}</text>
|
<text style={{"paddingRight":"5px"}}>{cron&&canReadCron}</text>
|
||||||
<Button type="primary" onClick={() => setShowModal(!showModal)} disabled={!canSetting}>
|
<Button type="primary" onClick={() => setShowModal(!showModal)} disabled={!canSetting}>
|
||||||
设置时间
|
设置时间
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
@ -11,11 +11,21 @@ export const clickRecordAPI = (data: TaskScheduleRecordVO) => {
|
||||||
return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
||||||
`/task/schedule/click`, data)
|
`/task/schedule/click`, data)
|
||||||
}
|
}
|
||||||
|
export const editClickRecordAPI = (data: TaskScheduleRecordVO) => {
|
||||||
|
return httpReq.put(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
||||||
|
`/task/schedule/record/edit`, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const deleteClickRecordAPI = (recordId: string):Promise<AxiosResponse<ResponseVO<string>>> => {
|
||||||
|
return httpReq.delete(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
||||||
|
`/task/schedule?id=${recordId}`)
|
||||||
|
}
|
||||||
|
|
||||||
export const getRecordById = (recordId: string): Promise<AxiosResponse<ResponseVO<TaskScheduleRecordForm>>> => {
|
export const getRecordById = (recordId: string): Promise<AxiosResponse<ResponseVO<TaskScheduleRecordForm>>> => {
|
||||||
return httpReq.get(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
return httpReq.get(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
||||||
`/task/schedule/id?id=${recordId}`)
|
`/task/schedule/id?id=${recordId}`)
|
||||||
}
|
}
|
||||||
export const editClickRecordAPI = (data:TaskScheduleRangeVO):Promise<AxiosResponse<ResponseVO<TaskScheduleRecordVO>>> =>{
|
export const editClickRecordRangeAPI = (data:TaskScheduleRangeVO):Promise<AxiosResponse<ResponseVO<TaskScheduleRecordVO>>> =>{
|
||||||
return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL +
|
||||||
`/task/schedule/updateRange`,data)
|
`/task/schedule/updateRange`,data)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,3 +9,12 @@ export type CaptchaLoginSuccess = {
|
||||||
username: string;
|
username: string;
|
||||||
token: string;
|
token: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type AskLoginResult = {
|
||||||
|
username:string;
|
||||||
|
nickname:string;
|
||||||
|
token:string;
|
||||||
|
setting:string;
|
||||||
|
autoLogin:boolean;
|
||||||
|
expireAt:string;
|
||||||
|
}
|
|
@ -1,10 +1,13 @@
|
||||||
import {httpReq} from "@/utils/axiosReq";
|
import {httpReq} from "@/utils/axiosReq";
|
||||||
|
import {AskLoginResult} from "@/lib/login/definitions";
|
||||||
|
import {Axios, AxiosResponse} from "axios";
|
||||||
|
import {ResponseVO} from "@/lib/definitions";
|
||||||
|
|
||||||
export const generateQrcodeAPI = (data:{}) => {
|
export const generateQrcodeAPI = (data:{}) => {
|
||||||
return httpReq.post(process.env.NEXT_PUBLIC_SECURITY_REQUEST_URL + "/V2/wx/login/generate/qrcode",
|
return httpReq.post(process.env.NEXT_PUBLIC_SECURITY_REQUEST_URL + "/V2/wx/login/generate/qrcode",
|
||||||
data)
|
data)
|
||||||
}
|
}
|
||||||
export const askLoginAPI = (data:{})=>{
|
export const askLoginAPI = (data:{}):Promise<AxiosResponse<ResponseVO<AskLoginResult[]>>> =>{
|
||||||
return httpReq.post(process.env.NEXT_PUBLIC_SECURITY_REQUEST_URL + "/V2/wx/login/pc/ask/login",
|
return httpReq.post(process.env.NEXT_PUBLIC_SECURITY_REQUEST_URL + "/V2/wx/login/pc/ask/login",
|
||||||
data)
|
data)
|
||||||
}
|
}
|
|
@ -78,6 +78,9 @@ export default function XcxLoginPage() {
|
||||||
}
|
}
|
||||||
// localStorage.removeItem("platform-security")
|
// localStorage.removeItem("platform-security")
|
||||||
localStorage.setItem('platform-security', res.data.data[0].token)
|
localStorage.setItem('platform-security', res.data.data[0].token)
|
||||||
|
localStorage.setItem('user-message', JSON.stringify(res.data.data[0],(key, value) => {
|
||||||
|
return key === 'password' ? undefined : value;
|
||||||
|
}))
|
||||||
// 删除名为 'platform-security' 的Cookie
|
// 删除名为 'platform-security' 的Cookie
|
||||||
// Cookies.remove('platform-security');
|
// Cookies.remove('platform-security');
|
||||||
// 设置一个有效期为7天的Cookie
|
// 设置一个有效期为7天的Cookie
|
||||||
|
|
|
@ -31,6 +31,7 @@ export const TitleOperation: React.FC<TitleOperationProps> = ({
|
||||||
const [pathParam, setPathParam] = useState<string | undefined>(searchParams.toString());
|
const [pathParam, setPathParam] = useState<string | undefined>(searchParams.toString());
|
||||||
const [pathName, setPathName] = useState(pathname);
|
const [pathName, setPathName] = useState(pathname);
|
||||||
|
|
||||||
|
|
||||||
console.log('usePathname()', pathname);
|
console.log('usePathname()', pathname);
|
||||||
console.log('useSearchParams()', searchParams.toString(), searchParams.get('pName'), searchParams.get('pid'));
|
console.log('useSearchParams()', searchParams.toString(), searchParams.get('pName'), searchParams.get('pid'));
|
||||||
const data = useContext(LocalContext);
|
const data = useContext(LocalContext);
|
||||||
|
@ -41,7 +42,7 @@ export const TitleOperation: React.FC<TitleOperationProps> = ({
|
||||||
expectStartTimeParseResult[0] && expectStartTimeParseResult[0].value ? dayjs(expectStartTimeParseResult[0].value.toString()) : undefined,
|
expectStartTimeParseResult[0] && expectStartTimeParseResult[0].value ? dayjs(expectStartTimeParseResult[0].value.toString()) : undefined,
|
||||||
expectStartTimeParseResult[1] && expectStartTimeParseResult[1].value ? dayjs(expectStartTimeParseResult[1].value.toString()) : undefined
|
expectStartTimeParseResult[1] && expectStartTimeParseResult[1].value ? dayjs(expectStartTimeParseResult[1].value.toString()) : undefined
|
||||||
];
|
];
|
||||||
|
const [nickName,setNickName]=useState("微信用户")
|
||||||
const typeList: CheckboxOptionType<string>[] = [
|
const typeList: CheckboxOptionType<string>[] = [
|
||||||
{label: '计划', value: '0,1,2,3'},
|
{label: '计划', value: '0,1,2,3'},
|
||||||
{label: '打卡', value: '4'},
|
{label: '打卡', value: '4'},
|
||||||
|
@ -58,9 +59,18 @@ export const TitleOperation: React.FC<TitleOperationProps> = ({
|
||||||
setPathParam(searchParams.toString());
|
setPathParam(searchParams.toString());
|
||||||
}, [searchParams]); // searchParams 变化时触发
|
}, [searchParams]); // searchParams 变化时触发
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let userMessage = localStorage.getItem('user-message');
|
||||||
|
if (userMessage){
|
||||||
|
let parse = JSON.parse(userMessage);
|
||||||
|
setNickName(parse.nickname)
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
const onClick: MenuProps['onClick'] = ({key}) => {
|
const onClick: MenuProps['onClick'] = ({key}) => {
|
||||||
if (key == "1") {
|
if (key == "1") {
|
||||||
|
localStorage.removeItem('platform-security')
|
||||||
|
replace(`/login`)
|
||||||
} else if (key == "2") {
|
} else if (key == "2") {
|
||||||
replace(pathName)
|
replace(pathName)
|
||||||
setPathParam(undefined)
|
setPathParam(undefined)
|
||||||
|
@ -191,9 +201,12 @@ export const TitleOperation: React.FC<TitleOperationProps> = ({
|
||||||
}
|
}
|
||||||
</Space>
|
</Space>
|
||||||
<Dropdown menu={{items: pathParam ? itemsPid : items, onClick}}>
|
<Dropdown menu={{items: pathParam ? itemsPid : items, onClick}}>
|
||||||
<svg style={{height: "32px", width: "32px", alignItems: "center"}} className="icon" aria-hidden="true">
|
<div style={{display:"flex", height: "32px", alignItems: "center"}}>
|
||||||
|
<svg style={{ height: "32px",width: "32px",marginRight:"0.5rem" }} className="icon" aria-hidden="true">
|
||||||
<use xlinkHref="#icon-user__easyico"></use>
|
<use xlinkHref="#icon-user__easyico"></use>
|
||||||
</svg>
|
</svg>
|
||||||
|
<span>{nickName}</span>
|
||||||
|
</div>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import 'react-big-calendar/lib/css/react-big-calendar.css'
|
||||||
import 'react-big-calendar/lib/sass/styles.scss'
|
import 'react-big-calendar/lib/sass/styles.scss'
|
||||||
import 'react-big-calendar/lib/addons/dragAndDrop/styles.scss'
|
import 'react-big-calendar/lib/addons/dragAndDrop/styles.scss'
|
||||||
import '@/ui/task/calendar/index.modules.css'
|
import '@/ui/task/calendar/index.modules.css'
|
||||||
import {commonUpdate, getTaskTreeResult, getTaskTreeResultAPI, OPERATION_BUTTON_TYPE} from "@/lib/task/project/data";
|
import {commonUpdate, OPERATION_BUTTON_TYPE} from "@/lib/task/project/data";
|
||||||
import {useSearchParams} from "next/dist/client/components/navigation";
|
import {useSearchParams} from "next/dist/client/components/navigation";
|
||||||
import {DetailModelForm} from "@/ui/task/project/DetailModelForm";
|
import {DetailModelForm} from "@/ui/task/project/DetailModelForm";
|
||||||
import {Request, SearchObject} from "@/lib/definitions";
|
import {Request, SearchObject} from "@/lib/definitions";
|
||||||
|
@ -14,12 +14,11 @@ import LocalContext from "@/ui/LocalContent";
|
||||||
import withDragAndDrop, {EventInteractionArgs} from "react-big-calendar/lib/addons/dragAndDrop";
|
import withDragAndDrop, {EventInteractionArgs} from "react-big-calendar/lib/addons/dragAndDrop";
|
||||||
import {TaskEvent} from "@/lib/task/calendar/data";
|
import {TaskEvent} from "@/lib/task/calendar/data";
|
||||||
import {editExpectAPI, getTaskAndScheduleRecordAPI} from "@/lib/task/calendar/service";
|
import {editExpectAPI, getTaskAndScheduleRecordAPI} from "@/lib/task/calendar/service";
|
||||||
import TaskNamePrefixIcon from "@/components/TaskNameAndIcon";
|
|
||||||
import TaskNameAndIcon from "@/components/TaskNameAndIcon";
|
import TaskNameAndIcon from "@/components/TaskNameAndIcon";
|
||||||
import {TaskWebSelectVO} from "@/lib/task/project/definitions";
|
import {TaskWebSelectVO} from "@/lib/task/project/definitions";
|
||||||
import {message} from "antd";
|
import {message} from "antd";
|
||||||
import ClickRecord from "@/components/ClickRecord";
|
import ClickRecord from "@/components/ClickRecord";
|
||||||
import {editClickRecordAPI} from "@/components/service/ScheduleTask";
|
import {editClickRecordRangeAPI} from "@/components/service/ScheduleTask";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* https://github.com/jquense/react-big-calendar?tab=readme-ov-file
|
* https://github.com/jquense/react-big-calendar?tab=readme-ov-file
|
||||||
|
@ -138,7 +137,11 @@ const CalShow: React.FC = () => {
|
||||||
return {
|
return {
|
||||||
start: dayjs(taskState.expectedStartTime).toDate(),
|
start: dayjs(taskState.expectedStartTime).toDate(),
|
||||||
end: dayjs(taskState.expectedEndTime).toDate(),
|
end: dayjs(taskState.expectedEndTime).toDate(),
|
||||||
title: <TaskNameAndIcon task={taskState}/>,
|
title: <Fragment><TaskNameAndIcon task={taskState}/><div>{taskState.description}</div></Fragment>,
|
||||||
|
// style: {
|
||||||
|
// backgroundColor: 'green',
|
||||||
|
// color: 'white',
|
||||||
|
// },
|
||||||
name:taskState.name,
|
name:taskState.name,
|
||||||
resource: taskState.id,
|
resource: taskState.id,
|
||||||
id: taskState.id,
|
id: taskState.id,
|
||||||
|
@ -252,7 +255,7 @@ const CalShow: React.FC = () => {
|
||||||
}
|
}
|
||||||
let strings = state.split(",");
|
let strings = state.split(",");
|
||||||
console.log('result', result, strings)
|
console.log('result', result, strings)
|
||||||
return result.filter((ev: TaskEvent) => strings.indexOf(ev.state.toString()) >= 0);
|
return result.filter((ev: TaskEvent) => !ev.state || strings.indexOf(ev.state.toString()) >= 0);
|
||||||
})
|
})
|
||||||
}, 250)
|
}, 250)
|
||||||
}
|
}
|
||||||
|
@ -265,7 +268,7 @@ const CalShow: React.FC = () => {
|
||||||
event.allDay = true
|
event.allDay = true
|
||||||
}
|
}
|
||||||
if (event.taskType=='4'){
|
if (event.taskType=='4'){
|
||||||
editClickRecordAPI({
|
editClickRecordRangeAPI({
|
||||||
id:event.id,
|
id:event.id,
|
||||||
startDate:dayjs(start!).toDate(),
|
startDate:dayjs(start!).toDate(),
|
||||||
recordDate:dayjs(end!).toDate(),
|
recordDate:dayjs(end!).toDate(),
|
||||||
|
@ -294,11 +297,11 @@ const CalShow: React.FC = () => {
|
||||||
|
|
||||||
const eventPropGetter = useCallback(
|
const eventPropGetter = useCallback(
|
||||||
(event: TaskEvent) => ({
|
(event: TaskEvent) => ({
|
||||||
...(event.state === 7
|
...(event.state === '7'
|
||||||
? {className: 'completeTask'}
|
? {className: 'completeTask'}
|
||||||
: event.priority === 3 ? {className: 'importantUrgentTask'} :
|
: event.priority === '3' ? {className: 'importantUrgentTask'} :
|
||||||
event.priority === 2 ? {className: 'importantNotUrgentTask'} :
|
event.priority === '2' ? {className: 'importantNotUrgentTask'} :
|
||||||
event.priority === 1 ? {className: 'notImportantUrgentTask'} :
|
event.priority === '1' ? {className: 'notImportantUrgentTask'} :
|
||||||
{className: 'notImportantNotUrgentTask'}),
|
{className: 'notImportantNotUrgentTask'}),
|
||||||
}),
|
}),
|
||||||
[setEvents]
|
[setEvents]
|
||||||
|
@ -343,7 +346,9 @@ const CalShow: React.FC = () => {
|
||||||
closeOpen={() => setOpen(false)}
|
closeOpen={() => setOpen(false)}
|
||||||
expectedEndTime={expectedEndTime}/>}
|
expectedEndTime={expectedEndTime}/>}
|
||||||
{openClickRecord &&
|
{openClickRecord &&
|
||||||
<ClickRecord recordId={recordId} taskName={taskName} openClickRecord={openClickRecord} setOpenClickRecord={setOpenClickRecord}/>}
|
<ClickRecord recordId={recordId} taskName={taskName}
|
||||||
|
openClickRecord={openClickRecord} setOpenClickRecord={setOpenClickRecord}
|
||||||
|
reloadData={loadData}/>}
|
||||||
<DragAndDropCalendar
|
<DragAndDropCalendar
|
||||||
// 本地设置
|
// 本地设置
|
||||||
localizer={localizer}
|
localizer={localizer}
|
||||||
|
|
|
@ -329,6 +329,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
}
|
}
|
||||||
if (taskType == '3') {
|
if (taskType == '3') {
|
||||||
result.push(<ClickRecord taskId={props.itemId!} taskName={requestTask!.name}
|
result.push(<ClickRecord taskId={props.itemId!} taskName={requestTask!.name}
|
||||||
|
reloadData={props.reloadData}
|
||||||
onceConsume={requestTask!.onceConsume}/>)
|
onceConsume={requestTask!.onceConsume}/>)
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -557,7 +558,8 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
placeholder="请输入任务描述"
|
placeholder="请输入任务描述"
|
||||||
disabled={editFormDisable}
|
disabled={editFormDisable}
|
||||||
/>
|
/>
|
||||||
<TaskRemindComponent remindTypeList={remindTypeList} setRemindTypeList={(a:string[])=>setRemindTypeList(a)} readonly={editFormDisable} />
|
{taskType=='0'&&
|
||||||
|
<TaskRemindComponent remindTypeList={remindTypeList} setRemindTypeList={(a:string[])=>setRemindTypeList(a)} readonly={editFormDisable} />}
|
||||||
<ProForm.Group>
|
<ProForm.Group>
|
||||||
<ProFormSelect
|
<ProFormSelect
|
||||||
request={async () =>
|
request={async () =>
|
||||||
|
@ -596,7 +598,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
</ProForm.Group>
|
</ProForm.Group>
|
||||||
|
|
||||||
<ProForm.Group>
|
<ProForm.Group>
|
||||||
<ProFormDateTimeRangePicker
|
{taskType!='3'&& <ProFormDateTimeRangePicker
|
||||||
initialValue={[dayjs(), undefined]}
|
initialValue={[dayjs(), undefined]}
|
||||||
name="expectedTimeRange"
|
name="expectedTimeRange"
|
||||||
label="期望时间"
|
label="期望时间"
|
||||||
|
@ -609,8 +611,22 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
placeholder={['开始时间', '结束时间']}
|
placeholder={['开始时间', '结束时间']}
|
||||||
disabled={editFormDisable}
|
disabled={editFormDisable}
|
||||||
|
|
||||||
/>
|
/>}
|
||||||
<ProFormDateTimeRangePicker
|
{taskType=='3'&& <ProFormDateTimeRangePicker
|
||||||
|
initialValue={[dayjs(), undefined]}
|
||||||
|
name="expectedTimeRange"
|
||||||
|
label="下次触发时间"
|
||||||
|
fieldProps={{
|
||||||
|
showTime: {
|
||||||
|
format: 'HH:mm',
|
||||||
|
},
|
||||||
|
format: "YYYY-MM-DD HH:mm", allowEmpty: [true, true], needConfirm: true
|
||||||
|
}}
|
||||||
|
placeholder={['开始时间', '结束时间']}
|
||||||
|
disabled={editFormDisable}
|
||||||
|
|
||||||
|
/>}
|
||||||
|
{taskType!='3'&&<ProFormDateTimeRangePicker
|
||||||
name="actualTimeRange"
|
name="actualTimeRange"
|
||||||
label="实际时间"
|
label="实际时间"
|
||||||
fieldProps={{
|
fieldProps={{
|
||||||
|
@ -621,7 +637,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
}}
|
}}
|
||||||
placeholder={['开始时间', '结束时间']}
|
placeholder={['开始时间', '结束时间']}
|
||||||
disabled={editFormDisable}
|
disabled={editFormDisable}
|
||||||
/>
|
/>}
|
||||||
</ProForm.Group>
|
</ProForm.Group>
|
||||||
{taskType == "3" &&
|
{taskType == "3" &&
|
||||||
<Fragment>
|
<Fragment>
|
||||||
|
@ -665,8 +681,11 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
{/*</Space>*/}
|
{/*</Space>*/}
|
||||||
</div>}
|
</div>}
|
||||||
|
|
||||||
<SettingCron canSetting={!editFormDisable} setCronFunction={() => {
|
<SettingCron canSetting={!editFormDisable} cron={form.getFieldValue("cron")}
|
||||||
}}/></Fragment>}
|
setCronFunction={(cron:string) => {form.setFieldValue("cron",cron)}}
|
||||||
|
onceConsumer={onceConsumeChange}
|
||||||
|
setExpectedTimeRange={(expect:(Dayjs|undefined)[])=>{form.setFieldValue("expectedTimeRange",expect)}}
|
||||||
|
/></Fragment>}
|
||||||
</ModalForm>
|
</ModalForm>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import axios, {Canceler, CancelToken, CancelTokenSource} from "axios";
|
import axios, {CancelTokenSource} from "axios";
|
||||||
import {message} from "antd";
|
import {message} from "antd";
|
||||||
import {usePathname, useSearchParams} from "next/navigation";
|
|
||||||
|
|
||||||
|
|
||||||
export const httpReq = axios.create({
|
export const httpReq = axios.create({
|
||||||
|
|
Loading…
Reference in New Issue