From 3e6c98ebccb0cc3752ed59fcbdeb4205e7e6ea5e Mon Sep 17 00:00:00 2001 From: Arpit Date: Thu, 22 Sep 2022 19:21:12 +0530 Subject: [PATCH] [Hotfix] Calendar widget : Default date is not updated dynamically and widget crashes for invalid dates (#4095) * hotfix: pr-4073 * hack to update the exposed variable --- frontend/src/Editor/Components/Calendar.jsx | 34 +++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/frontend/src/Editor/Components/Calendar.jsx b/frontend/src/Editor/Components/Calendar.jsx index d0584ea6cd..f582277513 100644 --- a/frontend/src/Editor/Components/Calendar.jsx +++ b/frontend/src/Editor/Components/Calendar.jsx @@ -3,6 +3,7 @@ import { Calendar as ReactCalendar, momentLocalizer } from 'react-big-calendar'; import moment from 'moment'; import 'react-big-calendar/lib/css/react-big-calendar.css'; import { CalendarEventPopover } from './CalendarPopover'; +import _ from 'lodash'; const localizer = momentLocalizer(moment); @@ -12,7 +13,16 @@ const prepareEvent = (event, dateFormat) => ({ end: moment(event.end, dateFormat).toDate(), }); -const parseDate = (date, dateFormat) => moment(date, dateFormat).toDate(); +const parseDate = (date, dateFormat) => { + const parsed = moment(date, dateFormat).toDate(); + + //handle invalid dates + if (isNaN(parsed.getTime())) { + return null; + } + + return parsed; +}; const allowedCalendarViews = ['month', 'week', 'day']; @@ -39,6 +49,7 @@ export const Calendar = function ({ const startTime = properties.startTime ? parseDate(properties.startTime, properties.dateFormat) : todayStartTime; const endTime = properties.endTime ? parseDate(properties.endTime, properties.dateFormat) : todayEndTime; + const [currentDate, setCurrentDate] = useState(defaultDate); const [eventPopoverOptions, setEventPopoverOptions] = useState({ show: false }); const eventPropGetter = (event) => { @@ -82,9 +93,15 @@ export const Calendar = function ({ : allowedCalendarViews[0]; useEffect(() => { - setExposedVariable('currentView', defaultView); + //check if the default date is a valid date + + if (defaultDate !== null && !_.isEqual(exposedVariables.currentDate, properties.defaultDate)) { + setExposedVariable('currentDate', moment(defaultDate).format(properties.dateFormat)); + setCurrentDate(defaultDate); + } + // eslint-disable-next-line react-hooks/exhaustive-deps - }, [defaultView]); + }, [JSON.stringify(moment(defaultDate).format('DD-MM-YYYY'))]); const components = { timeGutterHeader: () =>
All day
, @@ -93,7 +110,10 @@ export const Calendar = function ({ }, }; - if (exposedVariables.currentDate === undefined) setExposedVariable('currentDate', properties.defaultDate); + //! hack + if (exposedVariables.currentDate === undefined) { + setExposedVariable('currentDate', moment(defaultDate).format(properties.dateFormat)); + } return (
@@ -105,7 +125,7 @@ export const Calendar = function ({ ${exposedVariables.currentView === 'week' ? 'resources-week-cls' : ''} ${properties.displayViewSwitcher ? '' : 'hide-view-switcher'}`} localizer={localizer} - defaultDate={defaultDate} + date={currentDate} events={events} startAccessor="start" endAccessor="end" @@ -136,7 +156,9 @@ export const Calendar = function ({ }); }} onNavigate={(date) => { - setExposedVariable('currentDate', moment(date).format(properties.dateFormat)); + const formattedDate = moment(date).format(properties.dateFormat); + setExposedVariable('currentDate', formattedDate); + setCurrentDate(date); fireEvent('onCalendarNavigate'); }} selectable={true}