diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java index 9c207bc..cf32b19 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java @@ -5,28 +5,51 @@ import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.grid.ColumnTextAlign; import com.vaadin.flow.component.grid.Grid; 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 ru.dragonestia.picker.api.repository.UserRepository; import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.api.repository.details.UserDetails; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.function.Consumer; public class UserList extends VerticalLayout { private final RRoom room; + private final UserRepository userRepository; + private final Button buttonRemove; private final Grid usersGrid; private final Span totalUsers = new Span(); private final Span occupancy = new Span(); private List cachedUsers = new ArrayList<>(); - public UserList(RRoom room, List users) { + public UserList(RRoom room, List users, UserRepository userRepository) { this.room = room; + this.userRepository = userRepository; + add(buttonRemove = createButtonRemove()); add(usersGrid = createUsersGrid()); 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 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") .setFooter(occupancy); grid.addComponentColumn(this::createManageButton).setHeader("Manage"); + grid.setSelectionMode(Grid.SelectionMode.MULTI); + grid.addSelectionListener(event -> updateButtonRemove()); return grid; } @@ -54,6 +79,19 @@ public class UserList extends VerticalLayout { 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) { if (slots == RRoom.INFINITE_SLOTS) return "N/A"; double percent = usedSlots / (double) slots * 100; diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java index bee12fd..213dcd7 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java @@ -64,7 +64,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv add(addUsers = new AddUsers(room, (users, ignoreLimitation) -> appendUsers(room, users, ignoreLimitation))); add(new Hr()); 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() { diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/UserDetailsPage.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/UserDetailsPage.java index c627e1c..93a3d1b 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/UserDetailsPage.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/UserDetailsPage.java @@ -1,11 +1,11 @@ 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.ButtonVariant; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.html.H2; 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.router.BeforeEnterEvent; import com.vaadin.flow.router.BeforeEnterObserver; @@ -71,4 +71,8 @@ public class UserDetailsPage extends VerticalLayout implements BeforeEnterObserv public void update(List rooms) { gridRooms.setItems(cachedRooms = rooms); } + + private Html createComponent(String defaultValue) { + return new Html("" + defaultValue + ""); + } }