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 <[email protected]> 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>
