Implemented sorting RoomList

This commit is contained in:
Andrey Terentev 2024-02-14 17:25:54 +07:00 committed by Andrey Terentev
parent bbbcc64abe
commit 2649bdbb72
2 changed files with 27 additions and 10 deletions

View File

@ -19,6 +19,7 @@ import lombok.extern.log4j.Log4j2;
import ru.dragonestia.picker.api.repository.details.RoomDetails; import ru.dragonestia.picker.api.repository.details.RoomDetails;
import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RRoom;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -63,7 +64,8 @@ public class RoomList extends VerticalLayout {
private Grid<RRoom.Short> createGrid() { private Grid<RRoom.Short> createGrid() {
var grid = new Grid<>(RRoom.Short.class, false); var grid = new Grid<>(RRoom.Short.class, false);
grid.addColumn(RRoom.Short::id).setHeader("Identifier");
grid.addColumn(RRoom.Short::id).setHeader("Identifier").setSortable(true);
grid.addComponentColumn(room -> { grid.addComponentColumn(room -> {
var result = new Span(); var result = new Span();
@ -74,12 +76,24 @@ public class RoomList extends VerticalLayout {
result.setText(Integer.toString(room.slots())); result.setText(Integer.toString(room.slots()));
} }
return result; return result;
}).setHeader("Slots").setTextAlign(ColumnTextAlign.CENTER); }).setHeader("Slots").setComparator((room1, room2) -> {
var r1 = room1.slots() == -1? Integer.MAX_VALUE : room1.slots();
var r2 = room2.slots() == -1? Integer.MAX_VALUE : room2.slots();
grid.addColumn(this::getUsers).setHeader("Users").setTextAlign(ColumnTextAlign.CENTER).setFooter(totalUsers); return Integer.compare(r1, r2);
}).setSortable(true).setTextAlign(ColumnTextAlign.CENTER);
grid.addColumn(room -> UserList.getUsingPercentage(room.slots(), getUsers(room))) grid.addColumn(this::getUsers).setHeader("Users")
.setHeader("Occupancy").setTextAlign(ColumnTextAlign.CENTER); .setComparator((room1, room2) -> Integer.compare(getUsers(room1), getUsers(room2))).setSortable(true)
.setTextAlign(ColumnTextAlign.CENTER).setFooter(totalUsers);
grid.addColumn(room -> Math.max(UserList.getUsingPercentage(room.slots(), getUsers(room)), 0) + "%")
.setComparator((room1, room2) -> {
var p1 = UserList.getUsingPercentage(room1.slots(), getUsers(room1));
var p2 = UserList.getUsingPercentage(room2.slots(), getUsers(room2));
return Integer.compare(p1, p2);
}).setHeader("Occupancy").setTextAlign(ColumnTextAlign.CENTER);
grid.addComponentColumn(room -> { grid.addComponentColumn(room -> {
var result = new Span(); var result = new Span();
@ -90,9 +104,12 @@ public class RoomList extends VerticalLayout {
result.setText("No"); result.setText("No");
} }
return result; return result;
}).setHeader("Locked").setTextAlign(ColumnTextAlign.CENTER); }).setComparator((room1, room2) -> Boolean.compare(room1.locked(), room2.locked())).setSortable(true)
.setHeader("Locked").setTextAlign(ColumnTextAlign.CENTER);
grid.addComponentColumn(this::createManageButtons).setHeader("Manage"); grid.addComponentColumn(this::createManageButtons).setHeader("Manage");
grid.setMultiSort(true, Grid.MultiSortPriority.APPEND);
return grid; return grid;
} }

View File

@ -76,7 +76,7 @@ public class UserList extends VerticalLayout {
cachedUsers = users; cachedUsers = users;
usersGrid.setItems(users); usersGrid.setItems(users);
totalUsers.setText("Total users: " + users.size()); totalUsers.setText("Total users: " + users.size());
occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), users.size()))); occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), users.size()) + "%"));
} }
private void updateButtonRemove() { private void updateButtonRemove() {
@ -92,9 +92,9 @@ public class UserList extends VerticalLayout {
buttonRemove.setText("Unlink users(" + users.size() + ")"); buttonRemove.setText("Unlink users(" + users.size() + ")");
} }
public static String getUsingPercentage(int slots, int usedSlots) { public static int getUsingPercentage(int slots, int usedSlots) {
if (slots == RRoom.INFINITE_SLOTS) return "N/A"; if (slots == RRoom.INFINITE_SLOTS) return -1;
double percent = usedSlots / (double) slots * 100; double percent = usedSlots / (double) slots * 100;
return ((int) percent) + "%"; return (int) percent;
} }
} }