service and event

Addded findFirstMeetingsBySupervisor in the FindMeetingsService and maps the result
to a record FirstMeetingCalendarEvent.

Currently the MyCalendarPanel makes the call to be able to render the first meetings
onto the supervisors calendar.

There is still some work to be done with the rendering of events to make it prettier
This commit is contained in:
Nico Athanassiadis 2025-04-10 08:45:04 +02:00
parent 4a4aafda51
commit b82dc71aa5
4 changed files with 98 additions and 18 deletions
core/src/main/java/se/su/dsv/scipro/firstmeeting
view/src/main/java/se/su/dsv/scipro/supervisor/panels

@ -0,0 +1,11 @@
package se.su.dsv.scipro.firstmeeting;
import java.time.LocalDate;
public record FirstMeetingCalendarEvent(
String title,
LocalDate date,
String room,
String projectTitle,
Long projectId
) {}

@ -1,10 +1,15 @@
package se.su.dsv.scipro.firstmeeting;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.system.User;
public interface FirstMeetingService {
Optional<ProjectFirstMeeting> findByProject(Project project);
List<FirstMeetingCalendarEvent> findFirstMeetingsBySupervisor(User supervisor);
ProjectFirstMeeting schedule(Project project, Date date, String room, String description);
}

@ -1,15 +1,23 @@
package se.su.dsv.scipro.firstmeeting;
import com.querydsl.jpa.impl.JPAQuery;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import se.su.dsv.scipro.activityplan.Activity;
import se.su.dsv.scipro.activityplan.ActivityPlanFacade;
import se.su.dsv.scipro.activityplan.QActivity;
import se.su.dsv.scipro.activityplan.QActivityPlan;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.project.ProjectStatus;
import se.su.dsv.scipro.project.QProject;
import se.su.dsv.scipro.system.AbstractServiceImpl;
import se.su.dsv.scipro.system.User;
public class FirstMeetingServiceImpl
extends AbstractServiceImpl<ProjectFirstMeeting, Long>
@ -30,6 +38,41 @@ public class FirstMeetingServiceImpl
);
}
@Override
public List<FirstMeetingCalendarEvent> findFirstMeetingsBySupervisor(User supervisor) {
JPAQuery<ProjectFirstMeeting> firstMeetingsQuery = createQuery()
.select(QProjectFirstMeeting.projectFirstMeeting)
.from(QProjectFirstMeeting.projectFirstMeeting)
.join(QProjectFirstMeeting.projectFirstMeeting.activity, QActivity.activity)
.join(QActivity.activity.activityPlan, QActivityPlan.activityPlan)
.join(QActivityPlan.activityPlan.project, QProject.project)
.where(
QProject.project.headSupervisor
.eq(supervisor)
.and(QProject.project.projectStatus.eq(ProjectStatus.ACTIVE))
);
List<ProjectFirstMeeting> projectFirstMeetings = firstMeetingsQuery.fetch();
return projectFirstMeetings
.stream()
.map(projectFirstMeeting ->
new FirstMeetingCalendarEvent(
projectFirstMeeting.getActivity().getTitle(),
projectFirstMeeting
.getActivity()
.getDate()
.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate(),
projectFirstMeeting.getRoom(),
projectFirstMeeting.getActivity().getActivityPlan().getProject().getTitle(),
projectFirstMeeting.getActivity().getActivityPlan().getProject().getId()
)
)
.toList();
}
@Override
@Transactional
public ProjectFirstMeeting schedule(

@ -1,5 +1,6 @@
package se.su.dsv.scipro.supervisor.panels;
import jakarta.inject.Inject;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
@ -15,10 +16,20 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import se.su.dsv.scipro.io.dto.CalendarEvent;
import se.su.dsv.scipro.firstmeeting.FirstMeetingCalendarEvent;
import se.su.dsv.scipro.firstmeeting.FirstMeetingService;
import se.su.dsv.scipro.session.SciProSession;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.system.UserService;
public class MyCalendarPanel extends Panel {
@Inject
private UserService userService;
@Inject
private FirstMeetingService firstMeetingService;
private YearMonth currentMonth;
private WebMarkupContainer calendarBody;
private Label monthLabel;
@ -64,6 +75,12 @@ public class MyCalendarPanel extends Panel {
add(calendarBody);
renderCalendar(calendarBody);
findCalendarEvents();
}
private void findCalendarEvents() {
User user = SciProSession.get().getUser();
}
@Override
@ -92,7 +109,10 @@ public class MyCalendarPanel extends Panel {
days.add(date);
}
List<MyCalendarEvent> events = generateSampleEvents(currentMonth);
// List<FirstMeetingCalendarEvent> events = generateSampleEvents(currentMonth);
List<FirstMeetingCalendarEvent> events = firstMeetingService.findFirstMeetingsBySupervisor(
SciProSession.get().getUser()
);
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY;
int offset = (firstDayOfMonth.getDayOfWeek().getValue() - firstDayOfWeek.getValue() + 7) % 7;
@ -114,9 +134,12 @@ public class MyCalendarPanel extends Panel {
cell.add(dayLabel);
RepeatingView eventView = new RepeatingView("calendar-events");
for (MyCalendarEvent event : events) {
if (event.date.equals(day)) {
Label eventLabel = new Label(eventView.newChildId(), event.description());
for (FirstMeetingCalendarEvent event : events) {
if (event.date().equals(day)) {
Label eventLabel = new Label(
eventView.newChildId(),
String.format("%s - %s - %s", event.title(), event.room(), event.projectId())
);
eventLabel.add(new AttributeModifier("class", "calendar-event"));
eventView.add(eventLabel);
}
@ -138,19 +161,17 @@ public class MyCalendarPanel extends Panel {
return cell;
}
private static List<MyCalendarEvent> generateSampleEvents(YearMonth yearMonth) {
List<MyCalendarEvent> events = new ArrayList<>();
events.add(new MyCalendarEvent("event2", yearMonth.atDay(8), "Event 2"));
events.add(new MyCalendarEvent("event1", yearMonth.atDay(3), "Event 1"));
events.add(new MyCalendarEvent("event3", yearMonth.atDay(8), "Event 3"));
events.add(new MyCalendarEvent("event4", yearMonth.atDay(10), "Event 4"));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "Event 5"));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "Event 6"));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "Event 7"));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "Event 8"));
events.add(new MyCalendarEvent("event5", yearMonth.atDay(16), "Event 9"));
private static List<FirstMeetingCalendarEvent> generateSampleEvents(YearMonth yearMonth) {
List<FirstMeetingCalendarEvent> events = new ArrayList<>();
events.add(new FirstMeetingCalendarEvent("event2", yearMonth.atDay(8), "room1", "Project 1", 1l));
events.add(new FirstMeetingCalendarEvent("event1", yearMonth.atDay(3), "room2", "Project 2", 2l));
events.add(new FirstMeetingCalendarEvent("event3", yearMonth.atDay(8), "room1", "Project 3", 3l));
events.add(new FirstMeetingCalendarEvent("event4", yearMonth.atDay(10), "room4", "Project 4", 4l));
events.add(new FirstMeetingCalendarEvent("event5", yearMonth.atDay(16), "room1", "Project 5", 5l));
events.add(new FirstMeetingCalendarEvent("event5", yearMonth.atDay(16), "room1", "Project 6", 6l));
events.add(new FirstMeetingCalendarEvent("event5", yearMonth.atDay(16), "room1", "Project 7", 7l));
events.add(new FirstMeetingCalendarEvent("event5", yearMonth.atDay(16), "room2", "Project 8", 8l));
events.add(new FirstMeetingCalendarEvent("event5", yearMonth.atDay(16), "rooom2", "Project 9", 9l));
return events;
}
record MyCalendarEvent(String id, LocalDate date, String description) {}
}