Added refresh button UserList

This commit is contained in:
Andrey Terentev 2024-02-19 16:38:05 +07:00 committed by Andrey Terentev
parent a95700f7d3
commit 72bf68255c
2 changed files with 29 additions and 20 deletions

View File

@ -7,6 +7,7 @@ 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.Icon;
import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
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.UserRepository;
import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RRoom;
@ -15,10 +16,8 @@ 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 implements RefreshableTable {
private final RRoom room; private final RRoom room;
private final UserRepository userRepository; private final UserRepository userRepository;
@ -28,26 +27,26 @@ public class UserList extends VerticalLayout {
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, UserRepository userRepository) { public UserList(RRoom room, UserRepository userRepository) {
this.room = room; this.room = room;
this.userRepository = userRepository; this.userRepository = userRepository;
add(buttonRemove = createButtonRemove()); buttonRemove = createButtonRemove();
add(usersGrid = createUsersGrid()); add(usersGrid = createUsersGrid());
update(users); refresh();
updateButtonRemove(); updateButtonRemove();
} }
private Button createButtonRemove() { private Button createButtonRemove() {
var button = new Button("Unlink users"); var button = new Button("Unlink");
button.setPrefixComponent(new Icon(VaadinIcon.UNLINK)); button.setPrefixComponent(new Icon(VaadinIcon.UNLINK));
button.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_ERROR); button.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_ERROR);
button.addClickListener(event -> { button.addClickListener(event -> {
var users = usersGrid.getSelectedItems(); var users = usersGrid.getSelectedItems();
if (users.isEmpty()) return; if (users.isEmpty()) return;
userRepository.unlinkFromRoom(room, users); userRepository.unlinkFromRoom(room, users);
update(userRepository.all(room, UserRepository.ALL_DETAILS)); refresh();
}); });
return button; return button;
} }
@ -65,7 +64,8 @@ public class UserList extends VerticalLayout {
return Integer.compare(r1, r2); return Integer.compare(r1, r2);
}).setSortable(true).setFooter(occupancy); }).setSortable(true).setFooter(occupancy);
grid.addComponentColumn(this::createManageButton).setTextAlign(ColumnTextAlign.END).setFrozenToEnd(true); grid.addComponentColumn(this::createManageButton).setTextAlign(ColumnTextAlign.END).setFrozenToEnd(true)
.setTextAlign(ColumnTextAlign.END).setHeader(createManageTableButtons());
grid.setSelectionMode(Grid.SelectionMode.MULTI); grid.setSelectionMode(Grid.SelectionMode.MULTI);
grid.addSelectionListener(event -> updateButtonRemove()); grid.addSelectionListener(event -> updateButtonRemove());
@ -82,11 +82,14 @@ public class UserList extends VerticalLayout {
return button; return button;
} }
public void update(List<RUser> users) { private HorizontalLayout createManageTableButtons() {
cachedUsers = users; var layout = new HorizontalLayout();
usersGrid.setItems(users); layout.setJustifyContentMode(JustifyContentMode.END);
totalUsers.setText("Total users: " + users.size());
occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), users.size()) + "%")); layout.add(buttonRemove);
layout.add(createRefreshButton());
return layout;
} }
private void updateButtonRemove() { private void updateButtonRemove() {
@ -94,12 +97,12 @@ public class UserList extends VerticalLayout {
if (users.isEmpty()) { if (users.isEmpty()) {
buttonRemove.setEnabled(false); buttonRemove.setEnabled(false);
buttonRemove.setText("Unlink users"); buttonRemove.setText("Unlink");
return; return;
} }
buttonRemove.setEnabled(true); buttonRemove.setEnabled(true);
buttonRemove.setText("Unlink users(" + users.size() + ")"); buttonRemove.setText("Unlink(" + users.size() + ")");
} }
public static int getUsingPercentage(int slots, int usedSlots) { public static int getUsingPercentage(int slots, int usedSlots) {
@ -107,4 +110,12 @@ public class UserList extends VerticalLayout {
double percent = usedSlots / (double) slots * 100; double percent = usedSlots / (double) slots * 100;
return (int) percent; return (int) percent;
} }
@Override
public void refresh() {
cachedUsers = userRepository.all(room, UserRepository.ALL_DETAILS);
usersGrid.setItems(cachedUsers);
totalUsers.setText("Total users: " + cachedUsers.size());
occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), cachedUsers.size()) + "%"));
}
} }

View File

@ -20,7 +20,6 @@ import ru.dragonestia.picker.api.repository.response.type.RUser;
import ru.dragonestia.picker.api.repository.NodeRepository; import ru.dragonestia.picker.api.repository.NodeRepository;
import ru.dragonestia.picker.api.repository.RoomRepository; import ru.dragonestia.picker.api.repository.RoomRepository;
import ru.dragonestia.picker.api.repository.UserRepository; import ru.dragonestia.picker.api.repository.UserRepository;
import ru.dragonestia.picker.api.repository.details.UserDetails;
import ru.dragonestia.picker.cp.component.AddUsers; import ru.dragonestia.picker.cp.component.AddUsers;
import ru.dragonestia.picker.cp.component.NavPath; import ru.dragonestia.picker.cp.component.NavPath;
import ru.dragonestia.picker.cp.component.Notifications; import ru.dragonestia.picker.cp.component.Notifications;
@ -28,7 +27,6 @@ import ru.dragonestia.picker.cp.component.UserList;
import ru.dragonestia.picker.cp.util.RouteParamsExtractor; import ru.dragonestia.picker.cp.util.RouteParamsExtractor;
import java.util.Collection; import java.util.Collection;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@RequiredArgsConstructor @RequiredArgsConstructor
@ -64,7 +62,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), userRepository)); add(userList = new UserList(room, userRepository));
} }
private void updateRoomInfo() { private void updateRoomInfo() {
@ -125,7 +123,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv
}).toList(); }).toList();
userRepository.linkWithRoom(room, newUsers, ignoreLimitation); userRepository.linkWithRoom(room, newUsers, ignoreLimitation);
userList.update(userRepository.all(room, UserRepository.ALL_DETAILS)); userList.refresh();
if (validationFail.get()) { if (validationFail.get()) {
if (newUsers.isEmpty()) { if (newUsers.isEmpty()) {