Вы можете просто создать Grid
типа персона / пользователь и добавить столбцы для каждого события, пример кода ниже. Ваши занятия, вероятно, отличаются, но, надеюсь, вы поняли идею. Обратите внимание, что код для фактического создания сетки состоит всего из 8 строк.
Вы также можете инкапсулировать все данные в классе режима просмотра, как предложил Саймон Мартинелли, например, EventGridModel
, который содержит участников, события, людей ивозможно некоторые служебные функции.
@Route
public class MainView extends VerticalLayout {
public MainView() {
Person[] persons = new Person[]{
new Person(0, "Foo", "Bar"),
new Person(1, "John", "Doe"),
new Person(2, "Scala", "JVM"),
new Person(3, "Jeht-Phuel", "Steelbeam"),
new Person(4, "Ilike", "Turtles")
};
Event[] events = new Event[] {
new Event(0, Arrays.asList(persons[0], persons[1], persons[2], persons[4]), LocalDate.of(2019, 9, 5)),
new Event(0, Arrays.asList(persons[0], persons[1], persons[2], persons[3]), LocalDate.of(2019, 9, 5)),
new Event(0, Arrays.asList(persons[1], persons[2], persons[3]), LocalDate.of(2019, 9, 5)),
new Event(0, Arrays.asList(persons[0], persons[2], persons[3]), LocalDate.of(2019, 9, 5)),
new Event(0, Arrays.asList(persons[1], persons[2], persons[3], persons[4]), LocalDate.of(2019, 9, 5)),
};
Grid<Person> grid = new Grid<>();
grid.addColumn(person -> person.getFirstName() + " " + person.getLastName()).setHeader("Name");
for (Event event: events) {
grid.addColumn(person -> event.getAttendees().contains(person) ? "X" : "")
.setHeader(event.getDate().toString());
}
grid.setItems(persons);
add(grid);
}
class Person {
private final Integer id;
private final String firstName;
private final String lastName;
Person(Integer id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public Integer getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public boolean equals(Object other) {
return other instanceof Person && Objects.equals(((Person) other).getId(), id);
}
}
class Event {
private final Integer id;
private final List<Person> attendees;
private final LocalDate date;
Event(Integer id, List<Person> attendees, LocalDate date) {
this.id = id;
this.attendees = attendees;
this.date = date;
}
public Integer getId() {
return id;
}
public List<Person> getAttendees() {
return attendees;
}
public LocalDate getDate() {
return date;
}
@Override
public boolean equals(Object other) {
return other instanceof Event && Objects.equals(((Event) other).getId(), id);
}
}
}