@@ -20,10 +20,11 @@ import {
20
20
CustomModal ,
21
21
jsonValueExposingStateControl ,
22
22
CalendarDeleteIcon ,
23
+ Tooltip ,
23
24
} from "openblocks-sdk" ;
24
25
import { Input , Form } from "antd" ;
25
26
import { trans , getCalendarLocale } from "../../i18n/comps" ;
26
- import { createRef , useContext , useRef } from "react" ;
27
+ import { createRef , useContext , useRef , useState } from "react" ;
27
28
import FullCalendar from "@fullcalendar/react" ;
28
29
import dayGridPlugin from "@fullcalendar/daygrid" ;
29
30
import timeGridPlugin from "@fullcalendar/timegrid" ;
@@ -46,6 +47,7 @@ import {
46
47
views ,
47
48
slotLabelFormat ,
48
49
viewClassNames ,
50
+ FormWrapper ,
49
51
} from "./calendarConstants" ;
50
52
import moment from "moment" ;
51
53
@@ -71,6 +73,7 @@ let CalendarBasicComp = (function () {
71
73
const ref = createRef < HTMLDivElement > ( ) ;
72
74
const editEvent = useRef < EventType > ( ) ;
73
75
const [ form ] = Form . useForm ( ) ;
76
+ const [ left , setLeft ] = useState < number | undefined > ( undefined ) ;
74
77
75
78
const events = props . events . value . map ( ( item : EventType ) => {
76
79
return {
@@ -154,11 +157,12 @@ let CalendarBasicComp = (function () {
154
157
return ;
155
158
}
156
159
if ( event ) {
157
- const { title, groupId, color } = event ;
160
+ const { title, groupId, color, id } = event ;
158
161
const eventInfo = {
159
162
title,
160
163
groupId,
161
164
color,
165
+ id,
162
166
} ;
163
167
showModal ( eventInfo , true ) ;
164
168
} else {
@@ -171,7 +175,6 @@ let CalendarBasicComp = (function () {
171
175
allDay : info . allDay ,
172
176
start : info . startStr ,
173
177
end : info . endStr ,
174
- id : events . length + 1 + "" ,
175
178
} ;
176
179
const view = info . view . type as ViewType ;
177
180
const duration = moment ( info . end ) . diff ( moment ( info . start ) , "minutes" ) ;
@@ -181,6 +184,9 @@ let CalendarBasicComp = (function () {
181
184
( info . allDay && duration === 1440 ) ;
182
185
if ( singleClick ) {
183
186
editEvent . current = event ;
187
+ setTimeout ( ( ) => {
188
+ editEvent . current = undefined ;
189
+ } , 500 ) ;
184
190
return ;
185
191
}
186
192
showModal ( event , false ) ;
@@ -189,56 +195,86 @@ let CalendarBasicComp = (function () {
189
195
const showModal = ( event : EventType , ifEdit : boolean ) => {
190
196
const modalTitle = ifEdit ? trans ( "calendar.editEvent" ) : trans ( "calendar.creatEvent" ) ;
191
197
form && form . setFieldsValue ( event ) ;
198
+ const eventId = editEvent . current ?. id ;
192
199
CustomModal . confirm ( {
193
200
title : modalTitle ,
194
201
content : (
195
- < Form form = { form } >
196
- < Form . Item label = { trans ( "calendar.eventName" ) } name = "title" >
202
+ < FormWrapper form = { form } >
203
+ < Form . Item
204
+ label = {
205
+ < Tooltip title = { trans ( "calendar.eventIdTooltip" ) } >
206
+ { trans ( "calendar.eventId" ) }
207
+ </ Tooltip >
208
+ }
209
+ name = "id"
210
+ rules = { [ { required : true , message : trans ( "calendar.eventIdRequire" ) } ] }
211
+ >
212
+ < Input />
213
+ </ Form . Item >
214
+ < Form . Item
215
+ label = { trans ( "calendar.eventName" ) }
216
+ name = "title"
217
+ rules = { [ { required : true , message : trans ( "calendar.eventNameRequire" ) } ] }
218
+ >
197
219
< Input />
198
220
</ Form . Item >
199
221
< Form . Item label = { trans ( "calendar.eventColor" ) } name = "color" >
200
222
< Input />
201
223
</ Form . Item >
202
- < Form . Item label = { trans ( "calendar.eventGroupId" ) } name = "groupId" >
224
+ < Form . Item
225
+ label = {
226
+ < Tooltip title = { trans ( "calendar.groupIdTooltip" ) } >
227
+ { trans ( "calendar.eventGroupId" ) }
228
+ </ Tooltip >
229
+ }
230
+ name = "groupId"
231
+ >
203
232
< Input />
204
233
</ Form . Item >
205
- </ Form >
234
+ </ FormWrapper >
206
235
) ,
207
236
onConfirm : ( ) => {
208
- const { groupId, color, title = "" } = form . getFieldsValue ( ) ;
209
- if ( ifEdit ) {
210
- const changeEvents = props . events . value . map ( ( item : EventType ) => {
211
- if ( item . id === editEvent . current ?. id ) {
212
- return {
213
- ...item ,
214
- title,
215
- ...( groupId !== undefined ? { groupId } : null ) ,
216
- ...( color !== undefined ? { color } : null ) ,
217
- } ;
218
- } else {
219
- return item ;
220
- }
221
- } ) ;
222
- props . events . onChange ( changeEvents ) ;
223
- } else {
224
- const createInfo = {
225
- allDay : event . allDay ,
226
- start : event . start ,
227
- end : event . end ,
228
- id : event . id ,
229
- title,
230
- ...( groupId !== undefined ? { groupId } : null ) ,
231
- ...( color !== undefined ? { color } : null ) ,
232
- } ;
233
- props . events . onChange ( [ ...props . events . value , createInfo ] ) ;
234
- }
235
- props . onEvent ( "change" ) ;
236
- form . resetFields ( ) ;
237
- editEvent . current = undefined ;
237
+ form . submit ( ) ;
238
+ return form . validateFields ( ) . then ( ( ) => {
239
+ const { id, groupId, color, title = "" } = form . getFieldsValue ( ) ;
240
+ const idExist = props . events . value . findIndex ( ( item : EventType ) => item . id === id ) ;
241
+ if ( idExist > - 1 && id !== eventId ) {
242
+ form . setFields ( [ { name : "id" , errors : [ trans ( "calendar.eventIdExist" ) ] } ] ) ;
243
+ throw new Error ( ) ;
244
+ }
245
+ if ( ifEdit ) {
246
+ const changeEvents = props . events . value . map ( ( item : EventType ) => {
247
+ if ( item . id === eventId ) {
248
+ return {
249
+ ...item ,
250
+ title,
251
+ id,
252
+ ...( groupId !== undefined ? { groupId } : null ) ,
253
+ ...( color !== undefined ? { color } : null ) ,
254
+ } ;
255
+ } else {
256
+ return item ;
257
+ }
258
+ } ) ;
259
+ props . events . onChange ( changeEvents ) ;
260
+ } else {
261
+ const createInfo = {
262
+ allDay : event . allDay ,
263
+ start : event . start ,
264
+ end : event . end ,
265
+ id,
266
+ title,
267
+ ...( groupId !== undefined ? { groupId } : null ) ,
268
+ ...( color !== undefined ? { color } : null ) ,
269
+ } ;
270
+ props . events . onChange ( [ ...props . events . value , createInfo ] ) ;
271
+ }
272
+ props . onEvent ( "change" ) ;
273
+ form . resetFields ( ) ;
274
+ } ) ;
238
275
} ,
239
276
onCancel : ( ) => {
240
277
form . resetFields ( ) ;
241
- editEvent . current = undefined ;
242
278
} ,
243
279
} ) ;
244
280
} ;
@@ -250,6 +286,7 @@ let CalendarBasicComp = (function () {
250
286
$style = { style }
251
287
theme = { theme ?. theme }
252
288
onDoubleClick = { handleDbClick }
289
+ left = { left }
253
290
>
254
291
< FullCalendar
255
292
slotEventOverlap = { false }
@@ -261,8 +298,28 @@ let CalendarBasicComp = (function () {
261
298
firstDay = { Number ( firstDay ) }
262
299
plugins = { [ dayGridPlugin , timeGridPlugin , interactionPlugin , listPlugin , momentPlugin ] }
263
300
headerToolbar = { headerToolbar }
301
+ moreLinkClick = { ( info ) => {
302
+ let left = 0 ;
303
+ const ele = info . jsEvent . target as HTMLElement ;
304
+ if ( info . view . type === ViewType . DAY ) {
305
+ if ( info . allDay ) {
306
+ left = ele . offsetParent ?. parentElement ?. offsetLeft || 0 ;
307
+ } else {
308
+ left = ele . parentElement ?. offsetLeft || 0 ;
309
+ }
310
+ } else {
311
+ if ( info . allDay ) {
312
+ left = ele . offsetParent ?. parentElement ?. parentElement ?. offsetLeft || 0 ;
313
+ } else {
314
+ left =
315
+ ele . offsetParent ?. parentElement ?. parentElement ?. parentElement ?. offsetLeft || 0 ;
316
+ }
317
+ }
318
+ setLeft ( left ) ;
319
+ } }
264
320
buttonText = { buttonText }
265
321
views = { views }
322
+ eventClassNames = { ( ) => ( ! showEventTime ? "no-time" : "" ) }
266
323
slotLabelFormat = { slotLabelFormat }
267
324
viewClassNames = { viewClassNames }
268
325
moreLinkText = { trans ( "calendar.more" ) }
@@ -281,6 +338,9 @@ let CalendarBasicComp = (function () {
281
338
eventClick = { ( info ) => {
282
339
const event = events . find ( ( item : EventType ) => item . id === info . event . id ) ;
283
340
editEvent . current = event ;
341
+ setTimeout ( ( ) => {
342
+ editEvent . current = undefined ;
343
+ } , 500 ) ;
284
344
} }
285
345
eventsSet = { ( info ) => {
286
346
let needChange = false ;
0 commit comments