@@ -15,7 +15,7 @@ import timeGridPlugin from "@fullcalendar/timegrid";
15
15
import interactionPlugin , { EventResizeDoneArg } from "@fullcalendar/interaction" ;
16
16
import listPlugin from "@fullcalendar/list" ;
17
17
import allLocales from "@fullcalendar/core/locales-all" ;
18
- import { EventContentArg , DateSelectArg , EventDropArg } from "@fullcalendar/core" ;
18
+ import { EventContentArg , DateSelectArg , EventDropArg , EventInput } from "@fullcalendar/core" ;
19
19
import momentPlugin from "@fullcalendar/moment" ;
20
20
21
21
import ErrorBoundary from "./errorBoundary" ;
@@ -58,6 +58,8 @@ import {
58
58
depsConfig ,
59
59
stateComp ,
60
60
JSONObject ,
61
+ isDynamicSegment ,
62
+ Theme ,
61
63
} from 'lowcoder-sdk' ;
62
64
63
65
import {
@@ -81,11 +83,14 @@ import {
81
83
resourcesDefaultData ,
82
84
resourceTimeLineHeaderToolbar ,
83
85
resourceTimeGridHeaderToolbar ,
86
+ formattedEvents ,
84
87
} from "./calendarConstants" ;
85
88
import { EventOptionControl } from "./eventOptionsControl" ;
86
89
import { EventImpl } from "@fullcalendar/core/internal" ;
87
90
import DatePicker from "antd/es/date-picker" ;
88
91
92
+ type Theme = typeof Theme ;
93
+
89
94
const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss" ;
90
95
91
96
function fixOldData ( oldData : any ) {
@@ -206,6 +211,7 @@ let childrenMap: any = {
206
211
showVerticalScrollbar : withDefault ( BoolControl , false ) ,
207
212
showResourceEventsInFreeView : withDefault ( BoolControl , false ) ,
208
213
initialData : stateComp < JSONObject > ( { } ) ,
214
+ updatedEventsData : stateComp < JSONObject > ( defaultEvents ) ,
209
215
updatedEvents : stateComp < JSONObject > ( { } ) ,
210
216
insertedEvents : stateComp < JSONObject > ( { } ) ,
211
217
deletedEvents : stateComp < JSONObject > ( { } ) ,
@@ -251,15 +257,16 @@ let CalendarBasicComp = (function () {
251
257
showVerticalScrollbar ?:boolean ;
252
258
showResourceEventsInFreeView ?: boolean ;
253
259
initialData : Array < EventType > ;
260
+ updatedEventsData : Array < EventType > ;
254
261
inputFormat : string ;
255
262
} , dispatch : any ) => {
256
263
const comp = useContext ( EditorContext ) ?. getUICompByName (
257
264
useContext ( CompNameContext )
258
265
) ;
259
266
260
- const theme = useContext ( ThemeContext ) ;
267
+ const theme : Theme | undefined = useContext ( ThemeContext ) ;
261
268
const ref = createRef < HTMLDivElement > ( ) ;
262
- const editEvent = useRef < EventType > ( ) ;
269
+ const editEvent = useRef < EventInput > ( ) ;
263
270
const initData = useRef < boolean > ( false ) ;
264
271
const [ form ] = Form . useForm ( ) ;
265
272
const [ left , setLeft ] = useState < number | undefined > ( undefined ) ;
@@ -294,63 +301,75 @@ let CalendarBasicComp = (function () {
294
301
295
302
const currentEvents = useMemo ( ( ) => {
296
303
if ( props . showResourceEventsInFreeView && Boolean ( props . licenseKey ) ) {
297
- return props . events . filter ( ( event : { resourceId : any ; } ) => Boolean ( event . resourceId ) )
304
+ return props . updatedEventsData . filter ( ( event : { resourceId ? : any ; } ) => Boolean ( event . resourceId ) )
298
305
}
299
306
return currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay"
300
- ? props . events . filter ( ( event : { resourceId : any ; } ) => Boolean ( event . resourceId ) )
301
- : props . events . filter ( ( event : { resourceId : any ; } ) => ! Boolean ( event . resourceId ) ) ;
307
+ ? props . updatedEventsData . filter ( ( event : { resourceId ? : any ; } ) => Boolean ( event . resourceId ) )
308
+ : props . updatedEventsData . filter ( ( event : { resourceId ? : any ; } ) => ! Boolean ( event . resourceId ) ) ;
302
309
} , [
303
310
currentView ,
304
- props . events ,
311
+ props . updatedEventsData ,
305
312
props . showResourceEventsInFreeView ,
306
313
] )
307
314
308
315
// we use one central stack of events for all views
309
- const events = useMemo ( ( ) => {
310
- return Array . isArray ( currentEvents ) ? currentEvents . map ( ( item : EventType ) => {
311
- return {
312
- title : item . label ,
313
- id : item . id ,
314
- start : dayjs ( item . start , DateParser ) . format ( ) ,
315
- end : dayjs ( item . end , DateParser ) . format ( ) ,
316
- allDay : item . allDay ,
317
- ...( item . resourceId ? { resourceId : item . resourceId } : { } ) ,
318
- ...( item . groupId ? { groupId : item . groupId } : { } ) ,
319
- backgroundColor : item . backgroundColor ,
320
- extendedProps : { // Ensure color is in extendedProps
321
- color : isValidColor ( item . color || "" ) ? item . color : theme ?. theme ?. primary ,
322
- detail : item . detail ,
323
- titleColor :item . titleColor ,
324
- detailColor :item . detailColor ,
325
- titleFontWeight :item . titleFontWeight ,
326
- titleFontStyle :item . titleFontStyle ,
327
- detailFontWeight :item . detailFontWeight ,
328
- detailFontStyle :item . detailFontStyle ,
329
- animation :item ?. animation ,
330
- animationDelay :item ?. animationDelay ,
331
- animationDuration :item ?. animationDuration ,
332
- animationIterationCount :item ?. animationIterationCount
333
- }
334
- }
335
- } ) : [ currentEvents ] ;
316
+ const events : EventInput = useMemo ( ( ) => {
317
+ return formattedEvents ( currentEvents , theme ) ;
336
318
} , [ currentEvents , theme ] )
337
319
320
+ const initialEvents = useMemo ( ( ) => {
321
+ let eventsList :EventType [ ] = [ ] ;
322
+ if ( props . showResourceEventsInFreeView && Boolean ( props . licenseKey ) ) {
323
+ eventsList = props . events . filter ( ( event : { resourceId ?: any ; } ) => Boolean ( event . resourceId ) )
324
+ }
325
+ else {
326
+ if ( currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay" ) {
327
+ eventsList = props . events . filter ( ( event : { resourceId ?: any ; } ) => Boolean ( event . resourceId ) )
328
+ } else {
329
+ eventsList = props . events . filter ( ( event : { resourceId ?: any ; } ) => ! Boolean ( event . resourceId ) ) ;
330
+ }
331
+ }
332
+
333
+ return eventsList . map ( event => ( {
334
+ ...event ,
335
+ start : dayjs ( event . start , DateParser ) . format ( ) ,
336
+ end : dayjs ( event . end , DateParser ) . format ( ) ,
337
+ } ) ) ;
338
+ } , [
339
+ JSON . stringify ( props . events ) ,
340
+ ] )
341
+
342
+ useEffect ( ( ) => {
343
+ initData . current = false ;
344
+ } , [ JSON . stringify ( props . events ) ] ) ;
345
+
338
346
useEffect ( ( ) => {
339
347
if ( initData . current ) return ;
340
348
341
349
const mapData : Record < string , number > = { } ;
342
- events ?. forEach ( ( item : any , index : number ) => {
350
+ initialEvents ?. forEach ( ( item : any , index : number ) => {
343
351
mapData [ `${ item . id } ` ] = index ;
344
352
} )
345
353
346
- if ( ! initData . current && events ?. length && comp ?. children ?. comp ?. children ?. initialData ) {
354
+ if ( ! initData . current && initialEvents ?. length && comp ?. children ?. comp ?. children ?. initialData ) {
347
355
setInitDataMap ( mapData ) ;
348
356
comp ?. children ?. comp ?. children ?. initialData ?. dispatch ?.(
349
- comp ?. children ?. comp ?. children ?. initialData ?. changeValueAction ?.( [ ...events ] )
357
+ comp ?. children ?. comp ?. children ?. initialData ?. changeValueAction ?.( [ ...initialEvents ] )
358
+ ) ;
359
+
360
+ const eventsList = props . events . map ( ( event : EventType ) => ( {
361
+ ...event ,
362
+ start : dayjs ( event . start , DateParser ) . format ( ) ,
363
+ end : dayjs ( event . end , DateParser ) . format ( ) ,
364
+ } ) ) ;
365
+
366
+ comp ?. children ?. comp ?. children ?. updatedEventsData ?. dispatch ?.(
367
+ comp ?. children ?. comp ?. children ?. updatedEventsData ?. changeValueAction ?.( eventsList )
350
368
) ;
369
+
351
370
initData . current = true ;
352
371
}
353
- } , [ JSON . stringify ( events ) , comp ?. children ?. comp ?. children ?. initialData ] ) ;
372
+ } , [ JSON . stringify ( initialEvents ) , comp ?. children ?. comp ?. children ?. initialData ] ) ;
354
373
355
374
const resources = useMemo ( ( ) => props . resources . value , [ props . resources . value ] ) ;
356
375
@@ -413,35 +432,10 @@ let CalendarBasicComp = (function () {
413
432
const findUpdatedInsertedDeletedEvents = useCallback ( ( data : Array < EventType > ) => {
414
433
if ( ! initData . current ) return ;
415
434
416
- let eventsData : Array < Record < string , any > > = currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay"
435
+ const eventsData : Array < EventType > = currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay"
417
436
? data . filter ( ( event : { resourceId ?: string ; } ) => Boolean ( event . resourceId ) )
418
437
: data . filter ( ( event : { resourceId ?: string ; } ) => ! Boolean ( event . resourceId ) ) ;
419
438
420
- eventsData = eventsData . map ( ( item ) => ( {
421
- title : item . label ,
422
- id : item . id ,
423
- start : dayjs ( item . start , DateParser ) . format ( ) ,
424
- end : dayjs ( item . end , DateParser ) . format ( ) ,
425
- allDay : item . allDay ,
426
- ...( item . resourceId ? { resourceId : item . resourceId } : { } ) ,
427
- ...( item . groupId ? { groupId : item . groupId } : { } ) ,
428
- backgroundColor : item . backgroundColor ,
429
- extendedProps : { // Ensure color is in extendedProps
430
- color : isValidColor ( item . color || "" ) ? item . color : theme ?. theme ?. primary ,
431
- detail : item . detail ,
432
- titleColor :item . titleColor ,
433
- detailColor :item . detailColor ,
434
- titleFontWeight :item . titleFontWeight ,
435
- titleFontStyle :item . titleFontStyle ,
436
- detailFontWeight :item . detailFontWeight ,
437
- detailFontStyle :item . detailFontStyle ,
438
- animation :item ?. animation ,
439
- animationDelay :item ?. animationDelay ,
440
- animationDuration :item ?. animationDuration ,
441
- animationIterationCount :item ?. animationIterationCount
442
- }
443
- } ) ) ;
444
-
445
439
const mapData : Record < string , number > = { } ;
446
440
eventsData ?. forEach ( ( item : any , index : number ) => {
447
441
mapData [ `${ item . id } ` ] = index ;
@@ -458,13 +452,8 @@ let CalendarBasicComp = (function () {
458
452
} , [ initDataMap , currentView , props . initialData , initData . current ] ) ;
459
453
460
454
const handleEventDataChange = useCallback ( ( data : Array < EventType > ) => {
461
- comp ?. children ?. comp . children . events . children . manual . children . manual . dispatch (
462
- comp ?. children ?. comp . children . events . children . manual . children . manual . setChildrensAction (
463
- data
464
- )
465
- ) ;
466
- comp ?. children ?. comp . children . events . children . mapData . children . data . dispatchChangeValueAction (
467
- JSON . stringify ( data )
455
+ comp ?. children ?. comp ?. children ?. updatedEventsData ?. dispatch ?.(
456
+ comp ?. children ?. comp ?. children ?. updatedEventsData ?. changeValueAction ?.( data )
468
457
) ;
469
458
470
459
findUpdatedInsertedDeletedEvents ( data ) ;
@@ -522,7 +511,7 @@ let CalendarBasicComp = (function () {
522
511
className = "event-remove"
523
512
onClick = { ( e ) => {
524
513
e . stopPropagation ( ) ;
525
- const events = props . events . filter (
514
+ const events = props . updatedEventsData . filter (
526
515
( item : EventType ) => item . id !== eventInfo . event . id
527
516
) ;
528
517
handleEventDataChange ( events ) ;
@@ -541,7 +530,7 @@ let CalendarBasicComp = (function () {
541
530
} , [
542
531
theme ,
543
532
props . style ,
544
- props . events ,
533
+ props . updatedEventsData ,
545
534
props . showAllDay ,
546
535
handleEventDataChange ,
547
536
] ) ;
@@ -780,7 +769,7 @@ let CalendarBasicComp = (function () {
780
769
end,
781
770
allDay,
782
771
} = form . getFieldsValue ( ) ;
783
- const idExist = props . events . findIndex (
772
+ const idExist = props . updatedEventsData . findIndex (
784
773
( item : EventType ) => item . id === id
785
774
) ;
786
775
if ( idExist > - 1 && id !== eventId ) {
@@ -790,7 +779,7 @@ let CalendarBasicComp = (function () {
790
779
throw new Error ( ) ;
791
780
}
792
781
if ( ifEdit ) {
793
- const changeEvents = props . events . map ( ( item : EventType ) => {
782
+ const changeEvents = props . updatedEventsData . map ( ( item : EventType ) => {
794
783
if ( item . id === eventId ) {
795
784
return {
796
785
...item ,
@@ -843,7 +832,7 @@ let CalendarBasicComp = (function () {
843
832
...( titleColor !== undefined ? { titleColor } : null ) ,
844
833
...( detailColor !== undefined ? { detailColor } : null ) ,
845
834
} ;
846
- handleEventDataChange ( [ ...props . events , createInfo ] ) ;
835
+ handleEventDataChange ( [ ...props . updatedEventsData , createInfo ] ) ;
847
836
}
848
837
form . resetFields ( ) ;
849
838
} ) ; //small change
@@ -855,14 +844,14 @@ let CalendarBasicComp = (function () {
855
844
} , [
856
845
form ,
857
846
editEvent ,
858
- props . events ,
847
+ props . updatedEventsData ,
859
848
props ?. modalStyle ,
860
849
props ?. animationStyle ,
861
850
handleEventDataChange ,
862
851
] ) ;
863
852
864
853
const handleDbClick = useCallback ( ( ) => {
865
- const event = props . events . find (
854
+ const event = props . updatedEventsData . find (
866
855
( item : EventType ) => item . id === editEvent . current ?. id
867
856
) as EventType ;
868
857
if ( ! props . editable || ! editEvent . current ) {
@@ -880,7 +869,7 @@ let CalendarBasicComp = (function () {
880
869
}
881
870
} , [
882
871
editEvent ,
883
- props . events ,
872
+ props . updatedEventsData ,
884
873
props . editable ,
885
874
onEventVal ,
886
875
showModal ,
@@ -911,7 +900,7 @@ let CalendarBasicComp = (function () {
911
900
const updateEventsOnDragOrResize = useCallback ( ( eventInfo : EventImpl ) => {
912
901
const { extendedProps, title, ...event } = eventInfo . toJSON ( ) ;
913
902
914
- let eventsList = [ ...props . events ] ;
903
+ let eventsList = [ ...props . updatedEventsData ] ;
915
904
const eventIdx = eventsList . findIndex (
916
905
( item : EventType ) => item . id === event . id
917
906
) ;
@@ -923,7 +912,7 @@ let CalendarBasicComp = (function () {
923
912
} ;
924
913
handleEventDataChange ( eventsList ) ;
925
914
}
926
- } , [ props . events , handleEventDataChange ] ) ;
915
+ } , [ props . updatedEventsData , handleEventDataChange ] ) ;
927
916
928
917
const handleDrop = useCallback ( ( eventInfo : EventDropArg ) => {
929
918
updateEventsOnDragOrResize ( eventInfo . event ) ;
@@ -987,7 +976,7 @@ let CalendarBasicComp = (function () {
987
976
select = { ( info ) => handleCreate ( info ) }
988
977
eventClick = { ( info ) => {
989
978
const event = events . find (
990
- ( item : EventType ) => item . id === info . event . id
979
+ ( item : EventInput ) => item . id === info . event . id
991
980
) ;
992
981
editEvent . current = event ;
993
982
setTimeout ( ( ) => {
@@ -1018,9 +1007,9 @@ let CalendarBasicComp = (function () {
1018
1007
} }
1019
1008
eventsSet = { ( info ) => {
1020
1009
let needChange = false ;
1021
- let changeEvents : EventType [ ] = [ ] ;
1010
+ let changeEvents : EventInput [ ] = [ ] ;
1022
1011
info . forEach ( ( item ) => {
1023
- const event = events . find ( ( i : EventType ) => i . id === item . id ) ;
1012
+ const event = events . find ( ( i : EventInput ) => i . id === item . id ) ;
1024
1013
const start = dayjs ( item . start , DateParser ) . format ( ) ;
1025
1014
const end = dayjs ( item . end , DateParser ) . format ( ) ;
1026
1015
if (
@@ -1076,7 +1065,7 @@ let CalendarBasicComp = (function () {
1076
1065
style : { getPropertyView : ( ) => any ; } ;
1077
1066
animationStyle : { getPropertyView : ( ) => any ; } ;
1078
1067
modalStyle : { getPropertyView : ( ) => any ; } ;
1079
- licenseKey : { getView : ( ) => any ; propertyView : ( arg0 : { label : string ; } ) => any ; } ;
1068
+ licenseKey : { getView : ( ) => any ; propertyView : ( arg0 : { label : string ; tooltip : string } ) => any ; } ;
1080
1069
showVerticalScrollbar : { propertyView : ( arg0 : { label : string ; } ) => any ; } ;
1081
1070
showResourceEventsInFreeView : { propertyView : ( arg0 : { label : string ; } ) => any ; } ;
1082
1071
inputFormat : { propertyView : ( arg0 : { } ) => any ; } ;
@@ -1172,25 +1161,25 @@ const TmpCalendarComp = withExposingConfigs(CalendarBasicComp, [
1172
1161
depsConfig ( {
1173
1162
name : "allEvents" ,
1174
1163
desc : trans ( "calendar.events" ) ,
1175
- depKeys : [ "events " ] ,
1176
- func : ( input : { events : any [ ] ; } ) => {
1177
- return input . events ;
1164
+ depKeys : [ "updatedEventsData " ] ,
1165
+ func : ( input : { updatedEventsData : any [ ] ; } ) => {
1166
+ return input . updatedEventsData ;
1178
1167
} ,
1179
1168
} ) ,
1180
1169
depsConfig ( {
1181
1170
name : "events" ,
1182
1171
desc : trans ( "calendar.events" ) ,
1183
- depKeys : [ "events " ] ,
1184
- func : ( input : { events : any [ ] ; } ) => {
1185
- return input . events . filter ( event => ! Boolean ( event . resourceId ) ) ;
1172
+ depKeys : [ "updatedEventsData " ] ,
1173
+ func : ( input : { updatedEventsData : any [ ] ; } ) => {
1174
+ return input . updatedEventsData . filter ( event => ! Boolean ( event . resourceId ) ) ;
1186
1175
} ,
1187
1176
} ) ,
1188
1177
depsConfig ( {
1189
1178
name : "resourcesEvents" ,
1190
1179
desc : trans ( "calendar.resourcesEvents" ) ,
1191
- depKeys : [ "events " ] ,
1192
- func : ( input : { events : any [ ] ; } ) => {
1193
- return input . events . filter ( event => Boolean ( event . resourceId ) ) ;
1180
+ depKeys : [ "updatedEventsData " ] ,
1181
+ func : ( input : { updatedEventsData : any [ ] ; } ) => {
1182
+ return input . updatedEventsData . filter ( event => Boolean ( event . resourceId ) ) ;
1194
1183
} ,
1195
1184
} ) ,
1196
1185
depsConfig ( {
0 commit comments