import { LeftOutlined, RightOutlined } from '@ant-design/icons'; import { VoidField } from '@formily/core'; import { observer, RecursionField, Schema, useField, useFieldSchema } from '@formily/react'; import moment from 'moment'; import React, { useState } from 'react'; import { Calendar as BigCalendar, momentLocalizer } from 'react-big-calendar'; import * as dates from 'react-big-calendar/lib/utils/dates'; import { SchemaComponent } from '../..'; import { AsyncDataProvider, RecordProvider, useRequest } from '../../../'; import { i18n } from '../../../i18n'; import { ActionBar, ActionContext } from '../action'; import { CalendarDesigner } from './Calendar.Designer'; import { CalendarContext, ToolbarContext } from './context'; import { Event } from './Event'; import { Nav } from './Nav'; import './style.less'; import { Title } from './Title'; import { Today } from './Today'; import type { ToolbarProps } from './types'; import { toEvents } from './utils'; import { ViewSelect } from './ViewSelect'; const localizer = momentLocalizer(moment); function Toolbar(props: ToolbarProps) { const fieldSchema = useFieldSchema(); const toolBarSchema: Schema = fieldSchema.reduceProperties((buf, current) => { if (current['x-component'] === 'Calendar.ActionBar') { return current; } return buf; }, null); return ( ); } const messages: any = { allDay: '', previous: (
), next: (
), today: i18n.t('Today'), month: i18n.t('Month'), week: i18n.t('Week'), work_week: i18n.t('Work week'), day: i18n.t('Day'), agenda: i18n.t('Agenda'), date: i18n.t('Date'), time: i18n.t('Time'), event: i18n.t('Event'), noEventsInRange: i18n.t('None'), showMore: (count) => i18n.t('{{count}} more items', { count }), }; const useRequestProps = (props) => { const { request, dataSource } = props; if (request) { return request; } return (params: any = {}) => { return Promise.resolve({ data: dataSource, }); }; }; const useDefDataSource = (options, props) => { return useRequest(useRequestProps(props), options); }; export const Calendar: any = observer((props: any) => { const { useDataSource = useDefDataSource, fieldNames = { id: 'id', title: 'title', start: 'start', end: 'end', }, } = props; const field = useField(); const fieldSchema = useFieldSchema(); const [dataSource, setDataSource] = useState(props.dataSource || []); const [visible, setVisible] = useState(false); const [record, setRecord] = useState({}); const result = useDataSource( { uid: fieldSchema['x-uid'], refreshDeps: [props.dataSource], onSuccess(data) { const events = toEvents(data?.data, fieldNames); setDataSource(events); }, }, props, ); const eventSchema: Schema = fieldSchema.reduceProperties((buf, current) => { if (current['x-component'] === 'Calendar.Event') { return current; } return buf; }, null); return (
{eventSchema && ( )} { console.log('onSelectSlot', slotInfo); }} onDoubleClickEvent={(event) => { console.log('onDoubleClickEvent'); }} onSelectEvent={(event) => { const record = result?.data?.data?.find((item) => item.id === event.id); if (!record) { return; } setRecord(record); setVisible(true); console.log('onSelectEvent', record); }} formats={{ monthHeaderFormat: 'Y-M', agendaDateFormat: 'M-DD', dayHeaderFormat: 'Y-M-DD', dayRangeHeaderFormat: ({ start, end }, culture, local) => { if (dates.eq(start, end, 'month')) { return local.format(start, 'Y-M', culture); } return `${local.format(start, 'Y-M', culture)} - ${local.format(end, 'Y-M', culture)}`; }, }} defaultDate={new Date()} components={{ toolbar: Toolbar, }} localizer={localizer} />
); }); Calendar.ActionBar = ActionBar; Calendar.Event = Event; Calendar.Title = Title; Calendar.Today = Today; Calendar.Nav = Nav; Calendar.ViewSelect = ViewSelect; Calendar.Designer = CalendarDesigner;