Implemented user selection and deletion

This commit is contained in:
Andrey Terentev 2024-02-05 15:30:05 +07:00 committed by Andrey Terentev
parent 6bbfc9394c
commit aee8cb8236
3 changed files with 45 additions and 3 deletions

View File

@ -5,28 +5,51 @@ import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.grid.ColumnTextAlign; import com.vaadin.flow.component.grid.ColumnTextAlign;
import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import ru.dragonestia.picker.api.repository.UserRepository;
import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RRoom;
import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.api.repository.response.type.RUser;
import ru.dragonestia.picker.api.repository.details.UserDetails; import ru.dragonestia.picker.api.repository.details.UserDetails;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
public class UserList extends VerticalLayout { public class UserList extends VerticalLayout {
private final RRoom room; private final RRoom room;
private final UserRepository userRepository;
private final Button buttonRemove;
private final Grid<RUser> usersGrid; private final Grid<RUser> usersGrid;
private final Span totalUsers = new Span(); private final Span totalUsers = new Span();
private final Span occupancy = new Span(); private final Span occupancy = new Span();
private List<RUser> cachedUsers = new ArrayList<>(); private List<RUser> cachedUsers = new ArrayList<>();
public UserList(RRoom room, List<RUser> users) { public UserList(RRoom room, List<RUser> users, UserRepository userRepository) {
this.room = room; this.room = room;
this.userRepository = userRepository;
add(buttonRemove = createButtonRemove());
add(usersGrid = createUsersGrid()); add(usersGrid = createUsersGrid());
update(users); update(users);
updateButtonRemove();
}
private Button createButtonRemove() {
var button = new Button("Unlink users");
button.setPrefixComponent(new Icon(VaadinIcon.UNLINK));
button.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_ERROR);
button.addClickListener(event -> {
var users = usersGrid.getSelectedItems();
if (users.isEmpty()) return;
userRepository.unlinkFromRoom(room, users);
update(userRepository.all(room, UserRepository.ALL_DETAILS));
});
return button;
} }
private Grid<RUser> createUsersGrid() { private Grid<RUser> createUsersGrid() {
@ -35,6 +58,8 @@ public class UserList extends VerticalLayout {
grid.addColumn(user -> user.getDetail(UserDetails.COUNT_ROOMS)).setTextAlign(ColumnTextAlign.CENTER).setHeader("Linked with rooms") grid.addColumn(user -> user.getDetail(UserDetails.COUNT_ROOMS)).setTextAlign(ColumnTextAlign.CENTER).setHeader("Linked with rooms")
.setFooter(occupancy); .setFooter(occupancy);
grid.addComponentColumn(this::createManageButton).setHeader("Manage"); grid.addComponentColumn(this::createManageButton).setHeader("Manage");
grid.setSelectionMode(Grid.SelectionMode.MULTI);
grid.addSelectionListener(event -> updateButtonRemove());
return grid; return grid;
} }
@ -54,6 +79,19 @@ public class UserList extends VerticalLayout {
occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), users.size()))); occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), users.size())));
} }
private void updateButtonRemove() {
var users = usersGrid.getSelectedItems();
if (users.isEmpty()) {
buttonRemove.setEnabled(false);
buttonRemove.setText("Unlink users");
return;
}
buttonRemove.setEnabled(true);
buttonRemove.setText("Unlink users(" + users.size() + ")");
}
public static String getUsingPercentage(int slots, int usedSlots) { public static String getUsingPercentage(int slots, int usedSlots) {
if (slots == RRoom.INFINITE_SLOTS) return "N/A"; if (slots == RRoom.INFINITE_SLOTS) return "N/A";
double percent = usedSlots / (double) slots * 100; double percent = usedSlots / (double) slots * 100;

View File

@ -64,7 +64,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv
add(addUsers = new AddUsers(room, (users, ignoreLimitation) -> appendUsers(room, users, ignoreLimitation))); add(addUsers = new AddUsers(room, (users, ignoreLimitation) -> appendUsers(room, users, ignoreLimitation)));
add(new Hr()); add(new Hr());
add(new H2("Users")); add(new H2("Users"));
add(userList = new UserList(room, userRepository.all(room, UserRepository.ALL_DETAILS))); add(userList = new UserList(room, userRepository.all(room, UserRepository.ALL_DETAILS), userRepository));
} }
private void updateRoomInfo() { private void updateRoomInfo() {

View File

@ -1,11 +1,11 @@
package ru.dragonestia.picker.cp.page; package ru.dragonestia.picker.cp.page;
import com.vaadin.flow.component.Html;
import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.BeforeEnterEvent; import com.vaadin.flow.router.BeforeEnterEvent;
import com.vaadin.flow.router.BeforeEnterObserver; import com.vaadin.flow.router.BeforeEnterObserver;
@ -71,4 +71,8 @@ public class UserDetailsPage extends VerticalLayout implements BeforeEnterObserv
public void update(List<RRoom.Short> rooms) { public void update(List<RRoom.Short> rooms) {
gridRooms.setItems(cachedRooms = rooms); gridRooms.setItems(cachedRooms = rooms);
} }
private Html createComponent(String defaultValue) {
return new Html("<span>" + defaultValue + "</span>");
}
} }