Renaming, styling and polishing

Renamed FirstMeetingCalendarEvent to MyCalendarEvent.
Added link to the projects detail page.
Changed styling of the calendar.
This commit is contained in:
Nico Athanassiadis 2025-04-10 14:57:18 +02:00
parent db291ebace
commit 2ef8efbaee
8 changed files with 68 additions and 62 deletions

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

@ -9,7 +9,7 @@ import se.su.dsv.scipro.system.User;
public interface FirstMeetingService {
Optional<ProjectFirstMeeting> findByProject(Project project);
List<FirstMeetingCalendarEvent> findFirstMeetingsBySupervisor(User supervisor);
List<MyCalendarEvent> findFirstMeetingsBySupervisor(User supervisor);
ProjectFirstMeeting schedule(Project project, Date date, String room, String description);
}

@ -39,7 +39,7 @@ public class FirstMeetingServiceImpl
}
@Override
public List<FirstMeetingCalendarEvent> findFirstMeetingsBySupervisor(User supervisor) {
public List<MyCalendarEvent> findFirstMeetingsBySupervisor(User supervisor) {
JPAQuery<ProjectFirstMeeting> firstMeetingsQuery = createQuery()
.select(QProjectFirstMeeting.projectFirstMeeting)
.from(QProjectFirstMeeting.projectFirstMeeting)
@ -57,7 +57,7 @@ public class FirstMeetingServiceImpl
return projectFirstMeetings
.stream()
.map(projectFirstMeeting ->
new FirstMeetingCalendarEvent(
new MyCalendarEvent(
projectFirstMeeting.getActivity().getTitle(),
projectFirstMeeting
.getActivity()

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

@ -29,12 +29,12 @@
<wicket:container wicket:id="rows">
<div wicket:id="cells" class="calendar-cell">
<div wicket:id="day-number" class="day-number"></div>
<wicket:container wicket:id="calendar-events">
<div wicket:id="eventContainer">
<div wicket:id="eventLabel"></div>
<div wicket:id="roomLabel"></div>
</div>
</wicket:container>
<div wicket:id="calendar-events">
<a wicket:id="projectLink" class="d-block">
<span wicket:id="eventLabel"></span><br>
<span wicket:id="roomLabel"></span>
</a>
</div>
</div>
</wicket:container>
</div>

@ -1,11 +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;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
@ -14,17 +9,28 @@ import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import se.su.dsv.scipro.firstmeeting.FirstMeetingCalendarEvent;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import se.su.dsv.scipro.firstmeeting.FirstMeetingService;
import se.su.dsv.scipro.firstmeeting.MyCalendarEvent;
import se.su.dsv.scipro.project.Project;
import se.su.dsv.scipro.session.SciProSession;
import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage;
import se.su.dsv.scipro.system.User;
import se.su.dsv.scipro.system.UserService;
import se.su.dsv.scipro.util.PageParameterKeys;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.List;
public class MyCalendarPanel extends Panel {
@ -81,9 +87,9 @@ public class MyCalendarPanel extends Panel {
renderCalendar(calendarBody);
}
private List<FirstMeetingCalendarEvent> findCalendarEvents() {
private List<MyCalendarEvent> findCalendarEvents() {
User user = SciProSession.get().getUser();
List<FirstMeetingCalendarEvent> events = firstMeetingService.findFirstMeetingsBySupervisor(user);
List<MyCalendarEvent> events = firstMeetingService.findFirstMeetingsBySupervisor(user);
return events;
}
@ -113,7 +119,7 @@ public class MyCalendarPanel extends Panel {
days.add(date);
}
IModel<List<FirstMeetingCalendarEvent>> events = LoadableDetachableModel.of(this::findCalendarEvents);
IModel<List<MyCalendarEvent>> events = LoadableDetachableModel.of(this::findCalendarEvents);
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY;
int offset = (firstDayOfMonth.getDayOfWeek().getValue() - firstDayOfWeek.getValue() + 7) % 7;
@ -134,24 +140,30 @@ public class MyCalendarPanel extends Panel {
dayLabel.add(new AttributeModifier("class", dayClass)); // AttributeModifiler.append?
cell.add(dayLabel);
ListView<FirstMeetingCalendarEvent> eventView = new ListView<>(
ListView<MyCalendarEvent> eventView = new ListView<>(
"calendar-events",
events.map(eventList -> eventList.stream().filter(event -> event.date().equals(day)).toList())
) {
@Override
protected void populateItem(ListItem<FirstMeetingCalendarEvent> item) {
FirstMeetingCalendarEvent event = item.getModelObject();
protected void populateItem(ListItem<MyCalendarEvent> item) {
MyCalendarEvent event = item.getModelObject();
WebMarkupContainer eventContainer = new WebMarkupContainer("eventContainer");
eventContainer.add(new AttributeModifier("class", "calendar-event-container"));
eventContainer.add(new AttributeModifier("title", event.projectTitle()));
item.add(new AttributeModifier("class", "calendar-event-container"));
item.add(new AttributeModifier("title", event.projectTitle()));
PageParameters pp = new PageParameters();
pp.add(PageParameterKeys.MAP.get(Project.class), event.projectId());
BookmarkablePageLink<Void> projectLink = new BookmarkablePageLink<>(
"projectLink",
SupervisorProjectDetailsPage.class,
pp
);
Label eventLabel = new Label("eventLabel", event.title());
Label roomLabel = new Label("roomLabel", event.room());
eventContainer.add(eventLabel);
eventContainer.add(roomLabel);
item.add(eventContainer);
projectLink.add(eventLabel);
projectLink.add(roomLabel);
item.add(projectLink);
}
};
@ -171,17 +183,17 @@ public class MyCalendarPanel extends Panel {
return cell;
}
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));
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;
}
}

@ -7,14 +7,14 @@
/* Core grid layout: 7 days */
.calendar-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
grid-template-columns: repeat(7, minmax(0, 1fr));
background-color: transparent; /* removes gray gaps */
}
/* Headers */
.calendar-header {
background-color: #002F5F;
color: #FFFFFF;
background-color: #EBF0F5;
/*color: #FFFFFF;*/
font-weight: bold;
text-align: center;
padding: 6px;
@ -37,7 +37,11 @@
display: flex;
flex-direction: column;
justify-content: flex-start;
height: 100%;
min-height: 8em;
}
.calendar-cell a {
display: block;
text-decoration: none;
}
/* Top and left borders added only to first row/column */
@ -75,14 +79,11 @@
.calendar-event-container {
display: block;
padding: 2px 4px;
font-size: 0.75em;
background-color: #a5c995;
border-left: 3px solid #007acc;
border-radius: 2px;
color: #1a1a1a;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
/* Spacing between events */
@ -99,7 +100,7 @@
justify-content: space-between;
grid-template-columns: 1fr auto 1fr;
align-items: center;
background-color: #002F5F;
background-color: #DCE4EE;
padding: 8px 16px;
}
@ -120,10 +121,9 @@
}
.calendar-nav-button {
color: white;
/*color: white;*/
border: none;
padding: 8px 12px;
font-size: 1em;
cursor: pointer;
border-radius: 4px;
margin: 0 5px;
@ -139,5 +139,5 @@
.calendar-title {
font-size: 1.3em;
font-weight: bold;
color: white;
/*color: white;*/
}

@ -11,7 +11,7 @@ function normalizeCalendarHeights() {
});
cells.forEach((cell) => {
cell.style.height = maxHeight + "px";
//cell.style.height = maxHeight + "px";
});
}