Added time to the events

Changed events to take LocalDateTime instead of LocalDate.

Added time labels so events now get printed with the time.
This commit is contained in:
Nico Athanassiadis 2025-04-15 14:32:55 +02:00
parent 3176a5430e
commit 497bfd5038
6 changed files with 121 additions and 24 deletions
core/src/main/java/se/su/dsv/scipro/firstmeeting
test-data/src/main/java/se/su/dsv/scipro/testdata/populators
view/src/main/java/se/su/dsv/scipro

@ -61,7 +61,7 @@ public class FirstMeetingServiceImpl
.getDate()
.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate(),
.toLocalDateTime(),
projectFirstMeeting.getRoom(),
projectFirstMeeting.getActivity().getActivityPlan().getProject().getTitle(),
projectFirstMeeting.getActivity().getActivityPlan().getProject().getId()
@ -76,7 +76,7 @@ public class FirstMeetingServiceImpl
.map(ideaFirstMeeting ->
new MyCalendarEvent(
ideaFirstMeeting.getDescription(),
ideaFirstMeeting.getFirstMeetingDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
ideaFirstMeeting.getFirstMeetingDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(),
ideaFirstMeeting.getRoom(),
ideaFirstMeeting.getIdea().getTitle(),
(ideaFirstMeeting.getIdea().getProject() != null)

@ -1,5 +1,15 @@
package se.su.dsv.scipro.firstmeeting;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public record MyCalendarEvent(String title, LocalDate date, String room, String projectTitle, Long projectId) {}
public record MyCalendarEvent(String title, LocalDateTime date, String room, String projectTitle, Long projectId) {
public LocalTime time() {
return date.toLocalTime();
}
public LocalDate day() {
return date.toLocalDate();
}
}

@ -0,0 +1,94 @@
package se.su.dsv.scipro.testdata.populators;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import org.springframework.stereotype.Service;
import se.su.dsv.scipro.match.FirstMeeting;
import se.su.dsv.scipro.match.FirstMeetingRepository;
import se.su.dsv.scipro.match.Idea;
import se.su.dsv.scipro.match.IdeaService;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.project.ProjectService;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.testdata.BaseData;
import se.su.dsv.scipro.testdata.Factory;
import se.su.dsv.scipro.testdata.TestDataPopulator;
@Service
public class CalendarOverviewPopulator implements TestDataPopulator {
private final ProjectService projectService;
private final IdeaService ideaService;
private final FirstMeetingRepository firstMeetingRepository;
public CalendarOverviewPopulator(
ProjectService projectService,
IdeaService ideaService,
FirstMeetingRepository firstMeetingRepository
) {
this.projectService = projectService;
this.ideaService = ideaService;
this.firstMeetingRepository = firstMeetingRepository;
}
@Override
public void populate(BaseData baseData, Factory factory) {
// Participants
User author = factory.createAuthor("Hilary");
User supervisor = factory.createSupervisor("Salieri");
// Project
Project project = new Project();
project.setTitle("Calendar project 1");
project.setProjectType(baseData.bachelor());
project.setCredits(15);
project.setResearchArea(baseData.researchArea().researchArea());
project.setHeadSupervisor(supervisor);
project.addProjectParticipant(author);
project.setStartDate(LocalDate.now().minusDays(1));
project.setExpectedEndDate(LocalDate.now().plusDays(30));
projectService.save(project);
// Idea
Idea idea = new Idea();
idea.setTitle("Calendar project 1");
idea.setDescription("Calendar project 1");
idea.setProjectType(baseData.bachelor());
idea.setProject(project);
idea.setCreator(author);
ideaService.saveSupervisorIdea(idea, supervisor, baseData.researchArea().keywords(), true);
// First meeting
FirstMeeting firstMeeting = new FirstMeeting();
firstMeeting.setRoom("Ethereal room");
firstMeeting.setFirstMeetingDate(
Date.from(LocalDate.now().plusDays(1).atTime(14, 0).atZone(ZoneId.systemDefault()).toInstant())
);
firstMeeting.setDescription("First meeting with the supervisor");
firstMeeting.setIdea(idea);
firstMeetingRepository.save(firstMeeting);
// Idea no project
Idea ideaNoProject = new Idea();
ideaNoProject.setTitle("Calendar no project");
ideaNoProject.setDescription("Calendar no project");
ideaNoProject.setProjectType(baseData.bachelor());
ideaNoProject.setCreator(supervisor);
ideaService.saveSupervisorIdea(ideaNoProject, supervisor, baseData.researchArea().keywords(), true);
// First meeting idea no projct
FirstMeeting firstMeetingNoProject = new FirstMeeting();
firstMeetingNoProject.setRoom("No project room");
firstMeetingNoProject.setFirstMeetingDate(
Date.from(LocalDate.now().plusDays(3).atTime(14, 0).atZone(ZoneId.systemDefault()).toInstant())
);
firstMeetingNoProject.setDescription("First meeting with no project");
firstMeetingNoProject.setIdea(ideaNoProject);
firstMeetingRepository.save(firstMeetingNoProject);
}
}

@ -1,18 +1,18 @@
package se.su.dsv.scipro.components;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
/**
* A label that displays a LocalTime in the format HH:mm.
*/
public class HourMinuteLabel extends Label {
public HourMinuteLabel(String id, IModel<LocalTime> localTimeIModel) {
super(id, localTimeIModel);
}
@ -27,6 +27,7 @@ public class HourMinuteLabel extends Label {
}
private static class HourMinuteConverter implements IConverter<LocalTime> {
@Override
public LocalTime convertToObject(String value, Locale locale) throws ConversionException {
throw new UnsupportedOperationException();

@ -32,11 +32,13 @@
<div wicket:id="calendar-events">
<a wicket:id="projectLink" class="d-block">
<span wicket:id="eventLabel"></span><br>
<span wicket:id="roomLabel"></span>
<span wicket:id="roomLabel"></span><br>
<span wicket:id="timeLabel"></span>
</a>
<div wicket:id="eventInfo">
<span wicket:id="eventLabel"></span><br>
<span wicket:id="roomLabel"></span>
<span wicket:id="roomLabel"></span><br>
<span wicket:id="timeLabel"></span>
</div>
</div>
</div>

@ -22,6 +22,7 @@ import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import se.su.dsv.scipro.components.HourMinuteLabel;
import se.su.dsv.scipro.firstmeeting.FirstMeetingService;
import se.su.dsv.scipro.firstmeeting.MyCalendarEvent;
import se.su.dsv.scipro.project.Project;
@ -141,7 +142,7 @@ public class MyCalendarPanel extends Panel {
ListView<MyCalendarEvent> eventView = new ListView<>(
"calendar-events",
events.map(eventList -> eventList.stream().filter(event -> event.date().equals(day)).toList())
events.map(eventList -> eventList.stream().filter(event -> event.day().isEqual(day)).toList())
) {
@Override
protected void populateItem(ListItem<MyCalendarEvent> item) {
@ -178,10 +179,13 @@ public class MyCalendarPanel extends Panel {
Label eventLabel = new Label("eventLabel", item.getModel().map(MyCalendarEvent::title));
Label roomLabel = new Label("roomLabel", item.getModel().map(MyCalendarEvent::room));
Label timeLabel = new HourMinuteLabel("timeLabel", item.getModel().map(MyCalendarEvent::time));
projectLink.add(eventLabel);
projectLink.add(roomLabel);
projectLink.add(timeLabel);
eventInfo.add(new Label("eventLabel", item.getModel().map(MyCalendarEvent::title)));
eventInfo.add(new Label("roomLabel", item.getModel().map(MyCalendarEvent::room)));
eventInfo.add(new HourMinuteLabel("timeLabel", item.getModel().map(MyCalendarEvent::time)));
item.add(projectLink);
item.add(eventInfo);
}
@ -202,18 +206,4 @@ public class MyCalendarPanel extends Panel {
cell.add(new AttributeModifier("class", "calendar-cell"));
return cell;
}
private static List<MyCalendarEvent> generateSampleEvents(YearMonth yearMonth) {
List<MyCalendarEvent> events = new ArrayList<>();
events.add(new MyCalendarEvent("event2", yearMonth.atDay(8), "room1", "Project 1", 1l));
events.add(new MyCalendarEvent("event1", yearMonth.atDay(3), "room2", "Project 2", 2l));
events.add(new MyCalendarEvent("event3", yearMonth.atDay(8), "room1", "Project 3", 3l));
events.add(new MyCalendarEvent("event4", yearMonth.atDay(10), "room4", "Project 4", 4l));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "room1", "Project 5", 5l));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "room1", "Project 6", 6l));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "room1", "Project 7", 7l));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "room2", "Project 8", 8l));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "rooom2", "Project 9", 9l));
return events;
}
}