'use client' import React, {useCallback, useContext, useEffect, useMemo} from "react"; import {Calendar, dayjsLocalizer, Event, SlotInfo, View} from 'react-big-calendar' // https://day.js.org/docs/zh-CN/get-set/get-set import dayjs, {Dayjs} from 'dayjs' import 'react-big-calendar/lib/css/react-big-calendar.css' import {getTaskTreeResult, OPERATION_BUTTON_TYPE} from "@/lib/task/project/data"; import {useSearchParams} from "next/dist/client/components/navigation"; import {DetailModelForm} from "@/ui/task/project/DetailModelForm"; import {SearchObject} from "@/lib/definitions"; import LocalContext from "@/ui/LocalContent"; /** * https://github.com/jquense/react-big-calendar?tab=readme-ov-file * @constructor */ const localizer = dayjsLocalizer(dayjs) const CalShow: React.FC = () => { dayjs.locale('zh-cn') const [view, setView] = React.useState('month'); const [date, setDate] = React.useState(new Date()); // 展示在页面的任务,默认获取当前月的信息。 const [events, setEvents] = React.useState([]); const [open, setOpen] = React.useState(false); const [description, setDescription] = React.useState(''); const [operationId, setOperationId] = React.useState(-1); const [itemId,setItemId] = React.useState(-1); const [expectedStartTime,setExpectedStartTime] = React.useState(); const [expectedEndTime,setExpectedEndTime] = React.useState(); let state:string=useContext(LocalContext).taskState const handleViewChange = (newView: View) => { setView(newView); }; var pid = useSearchParams().get('pid'); const handleNavigate = (newDate: Date) => { console.log('handleNavigate', newDate) setDate(newDate); const searchList:SearchObject[] = [] if (pid != null) { searchList.push({name: "pid", value: pid, operateType: "="}, { name: 'TREE', value: "false", operateType: "TREE" }); } searchList.push({name: "expectedStartTime", value: dayjs(newDate).startOf('month'), operateType: ">="}) searchList.push({name: 'expectedStartTime', value: dayjs(newDate).endOf('month'), operateType: "<="}) loadData(searchList); }; useEffect(() => { const searchListE = [] if (pid != null) { searchListE.push({name: "pid", value: pid, operateType: "="}, { name: 'TREE', value: "false", operateType: "TREE" }); } if (view === 'month') { searchListE.push({name: 'expectedStartTime', value: dayjs(date).startOf('month'), operateType: ">="}) searchListE.push({name: 'expectedStartTime', value: dayjs(date).endOf('month'), operateType: "<="}) } else { searchListE.push({name: 'expectedStartTime', value: dayjs(date).startOf('week'), operateType: ">="}) searchListE.push({name: 'expectedStartTime', value: dayjs(date).endOf('week'), operateType: "<="}) } loadData(searchListE); }, [useContext(LocalContext)]); const message = { week: '周', work_week: '工作周', day: '天', month: '月', previous: '前', next: '后', today: '当下', agenda: '日程' } const loadData = (searchList:SearchObject[])=>{ if (state.length > 0){ searchList.push({name: 'state', value: state, operateType: "IN"}) } searchList.push({name: 'expectedEndTime', value: dayjs(date).endOf('month'), operateType: "NOT NULL"}) let request = JSON.stringify({ pageSize: 9999, pageNumber: 1, data: searchList }) getTaskTreeResult(request).then(responseD => { if (responseD.status.success) { setEvents(responseD.data.content.map(taskState => { return { start: dayjs(taskState.expectedStartTime).toDate(), end: dayjs(taskState.expectedEndTime).toDate(), title: taskState.name, resource:taskState.id } })) } }) } const reloadData = ()=>{ setOpen(false) handleNavigate(expectedStartTime?expectedStartTime.toDate():date) } const handleSelectSlot = useCallback( ({start, end}: SlotInfo) => { setExpectedEndTime(dayjs(end)) setExpectedStartTime(dayjs(start)) setOperationId(OPERATION_BUTTON_TYPE.ADD) setDescription("添加任务") setOpen(true); }, [setEvents] ) const handleSelectEvent = useCallback( (event: Event, e: React.SyntheticEvent) => { // window.alert(event.title); console.log(event) setOperationId(OPERATION_BUTTON_TYPE.DETAIL) setDescription("任务详情") setItemId(event.resource) setOpen(true); }, [] ) const {defaultDate, scrollToTime} = useMemo( () => ({ defaultDate: new Date(2015, 3, 12), scrollToTime: new Date(1970, 1, 1, 6), }), [] ) return
} export default CalShow;