You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2024/06/26 08:30:38 UTC

(openmeetings) 01/01: [OPENMEETINGS-2784] calendar v6 seems to work as expected

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch calendar6
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit f447e35edbed43ca50c4f5806a7bf4fa08f65239
Author: Maxim Solodovnik <so...@apache.org>
AuthorDate: Wed Jun 26 15:30:22 2024 +0700

    [OPENMEETINGS-2784] calendar v6 seems to work as expected
---
 openmeetings-web/pom.xml                           |  4 ++
 openmeetings-web/src/main/java/module-info.java    |  8 +--
 .../web/user/calendar/AppointmentModel.java        |  6 +-
 .../web/user/calendar/CalendarPanel.java           | 80 ++++++++++++++--------
 .../web/user/calendar/OmCalendarEvent.java         |  2 +-
 .../web/user/calendar/calendar-functions.js        |  4 +-
 .../org/apache/openmeetings/web/TestCalendar.java  |  4 +-
 pom.xml                                            |  8 ++-
 8 files changed, 74 insertions(+), 42 deletions(-)

diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index d249ac4cc..653691240 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -465,6 +465,10 @@
 			<groupId>org.webjars</groupId>
 			<artifactId>jquery-ui-touch-punch</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.webjars.npm</groupId>
+			<artifactId>fullcalendar__bootstrap5</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>dev.samstevens.totp</groupId>
 			<artifactId>totp</artifactId>
diff --git a/openmeetings-web/src/main/java/module-info.java b/openmeetings-web/src/main/java/module-info.java
index 7630d283b..b8f956224 100644
--- a/openmeetings-web/src/main/java/module-info.java
+++ b/openmeetings-web/src/main/java/module-info.java
@@ -54,10 +54,10 @@ module org.apache.openmeetings.web {
 	requires org.wicketstuff.urlfragment;
 	requires org.wicketstuff.jqplot;
 	requires org.wicketstuff.jqplot4j;
-	requires wicketstuff.jquery.ui;
-	requires wicketstuff.jquery.ui.calendar;
-	requires wicketstuff.jquery.ui.core;
-	requires wicketstuff.jquery.ui.plugins;
+	requires org.wicketstuff.jquery.ui;
+	requires org.wicketstuff.jquery.ui.calendar;
+	requires org.wicketstuff.jquery.ui.core;
+	requires org.wicketstuff.jquery.ui.plugins;
 	requires wicket.bootstrap.extensions;
 	requires wicket.bootstrap.core;
 	requires wicket.bootstrap.themes;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java
index 3b58b5167..95aca466d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentModel.java
@@ -28,9 +28,9 @@ import java.util.List;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 
-import org.wicketstuff.jquery.ui.calendar.CalendarEvent;
-import org.wicketstuff.jquery.ui.calendar.CalendarModel;
-import org.wicketstuff.jquery.ui.calendar.ICalendarVisitor;
+import org.wicketstuff.jquery.ui.calendar6.CalendarEvent;
+import org.wicketstuff.jquery.ui.calendar6.CalendarModel;
+import org.wicketstuff.jquery.ui.calendar6.ICalendarVisitor;
 
 public class AppointmentModel extends CalendarModel implements ICalendarVisitor {
 	private static final long serialVersionUID = 1L;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
index 4703db21b..b62f24926 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
@@ -65,18 +65,21 @@ import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 import org.wicketstuff.jquery.core.Options;
-import org.wicketstuff.jquery.ui.calendar.Calendar;
-import org.wicketstuff.jquery.ui.calendar.CalendarView;
-import org.wicketstuff.jquery.ui.calendar.EventSource.GoogleCalendar;
+import org.wicketstuff.jquery.ui.calendar6.Calendar;
+import org.wicketstuff.jquery.ui.calendar6.CalendarView;
+import org.wicketstuff.jquery.ui.calendar6.DateTimeDelta;
+import org.wicketstuff.jquery.ui.calendar6.EventSource.GoogleCalendar;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxLink;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import de.agilecoders.wicket.webjars.request.resource.WebjarsJavaScriptResourceReference;
 import jakarta.inject.Inject;
 
 public class CalendarPanel extends UserBasePanel {
 	private static final Logger log = LoggerFactory.getLogger(CalendarPanel.class);
 	private static final long serialVersionUID = 1L;
 	private static final ResourceReference CALJS = new JavaScriptResourceReference(CalendarPanel.class, "calendar-functions.js");
+	private static final ResourceReference BS5_THEME = new WebjarsJavaScriptResourceReference("fullcalendar__bootstrap5/current/index.global.js");
 	private final AbstractAjaxTimerBehavior refreshTimer = new AbstractAjaxTimerBehavior(Duration.ofSeconds(10)) {
 		private static final long serialVersionUID = 1L;
 
@@ -125,25 +128,34 @@ public class CalendarPanel extends UserBasePanel {
 		add(dialog);
 
 		boolean isRtl = isRtl();
-		Options options = new Options();
-		options.set("isRTL", isRtl);
-		options.set("height", Options.asString("parent"));
-		options.set("customButtons", "{gotoBtn: {text: ' ', click: onOmGotoClick}}");
-		options.set("header", isRtl ? "{left: 'agendaDay,agendaWeek,month', center: 'title', right: 'gotoBtn,today nextYear,next,prev,prevYear'}"
-				: "{left: 'prevYear,prev,next,nextYear today,gotoBtn', center: 'title', right: 'month,agendaWeek,agendaDay'}");
-		options.set("allDaySlot", false);
-		options.set("axisFormat", Options.asString("H(:mm)"));
-		options.set("defaultEventMinutes", 60);
-		options.set("timeFormat", Options.asString("H(:mm)"));
-		options.set("themeSystem", Options.asString("bootstrap4"));
-
-		options.set("buttonText", new JSONObject()
-				.put("month", getString("801"))
-				.put("week", getString("800"))
-				.put("day", getString("799"))
-				.put("today", getString("1555")).toString());
-
-		options.set("locale", Options.asString(WebSession.get().getLocale().toLanguageTag()));
+		Options options = new Options()
+				.set("direction", Options.asString(isRtl ? "rtl" : "ltr"))
+				.set("height", Options.asString("100%"))
+				.set("customButtons", "{gotoBtn: {text: ' ', click: onOmGotoClick}}")
+				.set("headerToolbar", isRtl
+						? "{left: 'timeGridDay,timeGridWeek,dayGridMonth', center: 'title', right: 'gotoBtn,today nextYear,next,prev,prevYear'}"
+						: "{left: 'prevYear,prev,next,nextYear today,gotoBtn', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay'}")
+				.set("allDaySlot", false)
+				.set("axisFormat", Options.asString("H(:mm)"))
+				.set("defaultEventMinutes", 60)
+				.set("timeFormat", Options.asString("H(:mm)"))
+
+				.set("themeSystem", Options.asString("bootstrap5"))
+				.set("buttonIcons", new JSONObject()
+						.put("close", "bi fa-solid fa-times")
+						.put("prev", "bi fa-solid fa-chevron-left")
+						.put("next", "bi fa-solid fa-chevron-right")
+						.put("prevYear", "bi fa-solid fa-angles-left")
+						.put("nextYear", "bi fa-solid fa-angles-right")
+						.toString())
+				.set("buttonText", new JSONObject()
+						.put("month", getString("801"))
+						.put("week", getString("800"))
+						.put("day", getString("799"))
+						.put("today", getString("1555"))
+						.toString())
+
+				.set("locale", Options.asString(WebSession.get().getLocale().toLanguageTag()));
 
 		calendar = new Calendar("calendar", new AppointmentModel(), options) {
 			private static final long serialVersionUID = 1L;
@@ -154,7 +166,7 @@ public class CalendarPanel extends UserBasePanel {
 			}
 
 			@Override
-			public boolean isDayClickEnabled() {
+			public boolean isDateClickEnabled() {
 				return true;
 			}
 
@@ -178,7 +190,7 @@ public class CalendarPanel extends UserBasePanel {
 			public void onSelect(AjaxRequestTarget target, CalendarView view, LocalDateTime start, LocalDateTime end, boolean allDay) {
 				Appointment a = getDefault();
 				LocalDateTime s = start, e = end;
-				if (CalendarView.month == view) {
+				if (CalendarView.dayGridMonth == view) {
 					LocalDateTime now = ZonedDateTime.now(getZoneId()).toLocalDateTime();
 					s = start.withHour(now.getHour()).withMinute(now.getMinute());
 					e = s.plus(1, ChronoUnit.HOURS);
@@ -202,7 +214,7 @@ public class CalendarPanel extends UserBasePanel {
 			}
 
 			@Override
-			public void onEventDrop(AjaxRequestTarget target, String eventId, long delta, boolean allDay) {
+			public void onEventDrop(AjaxRequestTarget target, String eventId, DateTimeDelta delta, boolean allDay) {
 				if (!StringUtils.isNumeric(eventId)) {
 					refresh(target);
 					return;
@@ -213,11 +225,17 @@ public class CalendarPanel extends UserBasePanel {
 				}
 				java.util.Calendar cal = WebSession.getCalendar();
 				cal.setTime(a.getStart());
-				cal.add(java.util.Calendar.MILLISECOND, (int)delta);
+				cal.add(java.util.Calendar.YEAR, delta.years());
+				cal.add(java.util.Calendar.MONTH, delta.months());
+				cal.add(java.util.Calendar.DAY_OF_MONTH, delta.days());
+				cal.add(java.util.Calendar.MILLISECOND, delta.millis());
 				a.setStart(cal.getTime());
 
 				cal.setTime(a.getEnd());
-				cal.add(java.util.Calendar.MILLISECOND, (int)delta);
+				cal.add(java.util.Calendar.YEAR, delta.years());
+				cal.add(java.util.Calendar.MONTH, delta.months());
+				cal.add(java.util.Calendar.DAY_OF_MONTH, delta.days());
+				cal.add(java.util.Calendar.MILLISECOND, delta.millis());
 				a.setEnd(cal.getTime());
 
 				apptDao.update(a, getUserId());
@@ -228,7 +246,7 @@ public class CalendarPanel extends UserBasePanel {
 			}
 
 			@Override
-			public void onEventResize(AjaxRequestTarget target, String eventId, long delta) {
+			public void onEventResize(AjaxRequestTarget target, String eventId, DateTimeDelta delta) {
 				if (!StringUtils.isNumeric(eventId)) {
 					refresh(target);
 					return;
@@ -239,7 +257,10 @@ public class CalendarPanel extends UserBasePanel {
 				}
 				java.util.Calendar cal = WebSession.getCalendar();
 				cal.setTime(a.getEnd());
-				cal.add(java.util.Calendar.MILLISECOND, (int)delta);
+				cal.add(java.util.Calendar.YEAR, delta.years());
+				cal.add(java.util.Calendar.MONTH, delta.months());
+				cal.add(java.util.Calendar.DAY_OF_MONTH, delta.days());
+				cal.add(java.util.Calendar.MILLISECOND, delta.millis());
 				a.setEnd(cal.getTime());
 
 				apptDao.update(a, getUserId());
@@ -341,6 +362,7 @@ public class CalendarPanel extends UserBasePanel {
 		super.renderHead(response);
 		response.render(JavaScriptHeaderItem.forReference(CALJS));
 		response.render(JavaScriptHeaderItem.forReference(TouchPunchResourceReference.instance()));
+		response.render(JavaScriptHeaderItem.forReference(BS5_THEME));
 	}
 
 	// Client creation here, because the client is not created until necessary
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/OmCalendarEvent.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/OmCalendarEvent.java
index 007699625..4b8728c73 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/OmCalendarEvent.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/OmCalendarEvent.java
@@ -22,7 +22,7 @@ import static org.apache.openmeetings.web.util.CalendarWebHelper.getDateTime;
 
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 
-import org.wicketstuff.jquery.ui.calendar.CalendarEvent;
+import org.wicketstuff.jquery.ui.calendar6.CalendarEvent;
 
 public class OmCalendarEvent extends CalendarEvent {
 	private static final long serialVersionUID = 1L;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/calendar-functions.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/calendar-functions.js
index 7949f5286..3a42ab081 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/calendar-functions.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/calendar-functions.js
@@ -7,7 +7,7 @@ function onOmGotoClick() {
 	}
 	gotoSpan = gotoBtn.parent().find('.goto-span');
 	gotoSpan.datetimepicker({
-		locale: $('#calendar').fullCalendar('option', 'locale')
+		locale: document.querySelector('#calendar').calendar.getOption('locale')
 		, format: 'L'
 		, icons: {
 			time: 'fas fa-clock'
@@ -29,7 +29,7 @@ function onOmGotoClick() {
 	gotoSpan
 		.off()
 		.on('hide.datetimepicker', function(e){
-			$('#calendar').fullCalendar('gotoDate', e.date.startOf('day'));
+			document.querySelector('#calendar').calendar.gotoDate(e.date.startOf('day').toDate());
 		})
 		.datetimepicker('show');
 }
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
index 9884d35dc..4d6557f59 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/web/TestCalendar.java
@@ -33,7 +33,7 @@ import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.util.tester.FormTester;
 import org.junit.jupiter.api.Test;
 
-import org.wicketstuff.jquery.ui.calendar.CalendarView;
+import org.wicketstuff.jquery.ui.calendar6.CalendarView;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar;
 
@@ -57,7 +57,7 @@ class TestCalendar extends AbstractWicketTesterTest {
 			tester.getRequest().setParameter("allDay", String.valueOf(false));
 			tester.getRequest().setParameter("startDate", LocalDateTime.of(2017, 11, 13, 13, 13).toString());
 			tester.getRequest().setParameter("endDate", LocalDateTime.of(2017, 11, 13, 13, 13).toString());
-			tester.getRequest().setParameter("viewName", CalendarView.month.name());
+			tester.getRequest().setParameter("viewName", CalendarView.dayGridMonth.name());
 			tester.executeBehavior((AbstractAjaxBehavior)cal.get("form:calendar").getBehaviorById(0)); //select-event
 			FormTester appTester = tester.newFormTester(PATH_APPOINTMENT_DLG_FRM);
 			//check inviteeType:groupContainer:groups is invisible for regular user
diff --git a/pom.xml b/pom.xml
index 7d49d90e0..3a015a507 100644
--- a/pom.xml
+++ b/pom.xml
@@ -84,8 +84,9 @@
 		<!-- dependency versions -->
 		<junit.version>5.10.2</junit.version>
 		<wicket.version>10.1.0</wicket.version>
-		<wicketstuff.version>10.1.1</wicketstuff.version>
+		<wicketstuff.version>10.2.0-SNAPSHOT</wicketstuff.version>
 		<wicket-bootstrap.version>7.0.5</wicket-bootstrap.version>
+		<fullcalendar.version>6.1.14</fullcalendar.version>
 		<spring.version>6.1.10</spring.version>
 		<tomcat.version>10.1.25</tomcat.version>
 		<jetty.version>11.0.21</jetty.version>
@@ -507,6 +508,11 @@
 				<artifactId>spring-web</artifactId>
 				<version>${spring.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.webjars.npm</groupId>
+				<artifactId>fullcalendar__bootstrap5</artifactId>
+				<version>${fullcalendar.version}</version>
+			</dependency>
 			<dependency>
 				<groupId>org.mnode.ical4j</groupId>
 				<artifactId>ical4j</artifactId>