@@ -20,10 +20,11 @@ import {
2020 CustomModal ,
2121 jsonValueExposingStateControl ,
2222 CalendarDeleteIcon ,
23+ Tooltip ,
2324} from "openblocks-sdk" ;
2425import { Input , Form } from "antd" ;
2526import { trans , getCalendarLocale } from "../../i18n/comps" ;
26- import { createRef , useContext , useRef } from "react" ;
27+ import { createRef , useContext , useRef , useState } from "react" ;
2728import FullCalendar from "@fullcalendar/react" ;
2829import dayGridPlugin from "@fullcalendar/daygrid" ;
2930import timeGridPlugin from "@fullcalendar/timegrid" ;
@@ -46,6 +47,7 @@ import {
4647 views ,
4748 slotLabelFormat ,
4849 viewClassNames ,
50+ FormWrapper ,
4951} from "./calendarConstants" ;
5052import moment from "moment" ;
5153
@@ -71,6 +73,7 @@ let CalendarBasicComp = (function () {
7173 const ref = createRef < HTMLDivElement > ( ) ;
7274 const editEvent = useRef < EventType > ( ) ;
7375 const [ form ] = Form . useForm ( ) ;
76+ const [ left , setLeft ] = useState < number | undefined > ( undefined ) ;
7477
7578 const events = props . events . value . map ( ( item : EventType ) => {
7679 return {
@@ -154,11 +157,12 @@ let CalendarBasicComp = (function () {
154157 return ;
155158 }
156159 if ( event ) {
157- const { title, groupId, color } = event ;
160+ const { title, groupId, color, id } = event ;
158161 const eventInfo = {
159162 title,
160163 groupId,
161164 color,
165+ id,
162166 } ;
163167 showModal ( eventInfo , true ) ;
164168 } else {
@@ -171,7 +175,6 @@ let CalendarBasicComp = (function () {
171175 allDay : info . allDay ,
172176 start : info . startStr ,
173177 end : info . endStr ,
174- id : events . length + 1 + "" ,
175178 } ;
176179 const view = info . view . type as ViewType ;
177180 const duration = moment ( info . end ) . diff ( moment ( info . start ) , "minutes" ) ;
@@ -181,6 +184,9 @@ let CalendarBasicComp = (function () {
181184 ( info . allDay && duration === 1440 ) ;
182185 if ( singleClick ) {
183186 editEvent . current = event ;
187+ setTimeout ( ( ) => {
188+ editEvent . current = undefined ;
189+ } , 500 ) ;
184190 return ;
185191 }
186192 showModal ( event , false ) ;
@@ -189,56 +195,86 @@ let CalendarBasicComp = (function () {
189195 const showModal = ( event : EventType , ifEdit : boolean ) => {
190196 const modalTitle = ifEdit ? trans ( "calendar.editEvent" ) : trans ( "calendar.creatEvent" ) ;
191197 form && form . setFieldsValue ( event ) ;
198+ const eventId = editEvent . current ?. id ;
192199 CustomModal . confirm ( {
193200 title : modalTitle ,
194201 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+ >
197219 < Input />
198220 </ Form . Item >
199221 < Form . Item label = { trans ( "calendar.eventColor" ) } name = "color" >
200222 < Input />
201223 </ 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+ >
203232 < Input />
204233 </ Form . Item >
205- </ Form >
234+ </ FormWrapper >
206235 ) ,
207236 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+ } ) ;
238275 } ,
239276 onCancel : ( ) => {
240277 form . resetFields ( ) ;
241- editEvent . current = undefined ;
242278 } ,
243279 } ) ;
244280 } ;
@@ -250,6 +286,7 @@ let CalendarBasicComp = (function () {
250286 $style = { style }
251287 theme = { theme ?. theme }
252288 onDoubleClick = { handleDbClick }
289+ left = { left }
253290 >
254291 < FullCalendar
255292 slotEventOverlap = { false }
@@ -261,8 +298,28 @@ let CalendarBasicComp = (function () {
261298 firstDay = { Number ( firstDay ) }
262299 plugins = { [ dayGridPlugin , timeGridPlugin , interactionPlugin , listPlugin , momentPlugin ] }
263300 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+ } }
264320 buttonText = { buttonText }
265321 views = { views }
322+ eventClassNames = { ( ) => ( ! showEventTime ? "no-time" : "" ) }
266323 slotLabelFormat = { slotLabelFormat }
267324 viewClassNames = { viewClassNames }
268325 moreLinkText = { trans ( "calendar.more" ) }
@@ -281,6 +338,9 @@ let CalendarBasicComp = (function () {
281338 eventClick = { ( info ) => {
282339 const event = events . find ( ( item : EventType ) => item . id === info . event . id ) ;
283340 editEvent . current = event ;
341+ setTimeout ( ( ) => {
342+ editEvent . current = undefined ;
343+ } , 500 ) ;
284344 } }
285345 eventsSet = { ( info ) => {
286346 let needChange = false ;
0 commit comments