
io.imunity.furms.ui.views.fenix.sites.SitesView Maven / Gradle / Ivy
/*
* Copyright (c) 2020 Bixbit s.c. All rights reserved.
* See LICENSE file for licensing information.
*/
package io.imunity.furms.ui.views.fenix.sites;
import com.vaadin.flow.component.ClickEvent;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.Key;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.editor.Editor;
import com.vaadin.flow.component.grid.editor.EditorOpenEvent;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.orderedlayout.FlexLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.router.RouterLink;
import io.imunity.furms.api.sites.SiteService;
import io.imunity.furms.api.validation.exceptions.DuplicatedNameValidationError;
import io.imunity.furms.api.validation.exceptions.SiteHasResourceCreditsRemoveValidationError;
import io.imunity.furms.domain.sites.Site;
import io.imunity.furms.ui.components.DenseGrid;
import io.imunity.furms.ui.components.FurmsDialog;
import io.imunity.furms.ui.components.FurmsViewComponent;
import io.imunity.furms.ui.components.GridActionMenu;
import io.imunity.furms.ui.components.GridActionsButtonLayout;
import io.imunity.furms.ui.components.MenuButton;
import io.imunity.furms.ui.components.PageTitle;
import io.imunity.furms.ui.components.RouterGridLink;
import io.imunity.furms.ui.components.ViewHeaderLayout;
import io.imunity.furms.ui.views.fenix.menu.FenixAdminMenu;
import io.imunity.furms.ui.views.fenix.sites.add.SitesAddView;
import io.imunity.furms.ui.views.fenix.sites.admins.SitesAdminsView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import static com.vaadin.flow.component.button.ButtonVariant.LUMO_TERTIARY;
import static com.vaadin.flow.component.grid.ColumnTextAlign.END;
import static com.vaadin.flow.component.icon.VaadinIcon.EDIT;
import static com.vaadin.flow.component.icon.VaadinIcon.PLUS_CIRCLE;
import static com.vaadin.flow.component.icon.VaadinIcon.TRASH;
import static com.vaadin.flow.component.icon.VaadinIcon.USERS;
import static com.vaadin.flow.data.value.ValueChangeMode.EAGER;
import static io.imunity.furms.domain.constant.RoutesConst.FENIX_ADMIN_SITES;
import static io.imunity.furms.ui.utils.FormSettings.NAME_MAX_LENGTH;
import static io.imunity.furms.ui.utils.NotificationUtils.showErrorNotification;
import static io.imunity.furms.ui.utils.NotificationUtils.showSuccessNotification;
import static java.util.stream.Collectors.toList;
@Route(value = FENIX_ADMIN_SITES, layout = FenixAdminMenu.class)
@PageTitle(key = "view.fenix-admin.sites.page.title")
public class SitesView extends FurmsViewComponent {
private final static Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private final SiteService siteService;
private SiteGridItem bufferedSiteGridItem;
SitesView(SiteService siteService) {
this.siteService = siteService;
addHeader();
addTable();
addPreventionForMultiEnterClick();
}
private void addHeader() {
Button addButton = new Button(getTranslation("view.sites.main.add.button"), new Icon(PLUS_CIRCLE));
addButton.addClickListener(this::actionOpenSiteFormAdd);
getContent().add(new ViewHeaderLayout(getTranslation("view.sites.main.title"), addButton));
}
private void addTable() {
FlexLayout tableLayout = new FlexLayout();
tableLayout.setWidthFull();
List sites = fetchSites();
DenseGrid siteGrid = new DenseGrid<>(SiteGridItem.class);
siteGrid.setItems(sites);
Binder siteBinder = new Binder<>(SiteGridItem.class);
Editor siteEditor = siteGrid.getEditor();
siteEditor.setBinder(siteBinder);
siteEditor.setBuffered(true);
siteEditor.addOpenListener(event -> onEditorOpen(event, siteBinder));
siteEditor.addCloseListener(event -> onEditorClose(siteBinder));
siteGrid.addComponentColumn(site -> new RouterLink(site.getName(), SitesAdminsView.class, site.getId().id.toString()))
.setHeader(getTranslation("view.sites.main.grid.column.name"))
.setKey("name")
.setSortable(true)
.setComparator(SiteGridItem::getName)
.setEditorComponent(addEditForm(siteEditor));
siteGrid.addComponentColumn(site -> createLastColumnContent(site, siteGrid))
.setHeader(getTranslation("view.sites.main.grid.column.actions"))
.setKey("actions")
.setEditorComponent(addEditButtons(siteEditor))
.setTextAlign(END);
tableLayout.add(siteGrid);
getContent().add(tableLayout);
}
private Component createLastColumnContent(SiteGridItem site, Grid siteGrid) {
return new GridActionsButtonLayout(
new RouterGridLink(USERS, site.getId().id.toString(), SitesAdminsView.class),
createContextMenu(site, siteGrid)
);
}
private Component createContextMenu(SiteGridItem site, Grid siteGrid) {
GridActionMenu contextMenu = new GridActionMenu();
contextMenu.setId(site.getId().id.toString());
contextMenu.addItem(new MenuButton(getTranslation("view.sites.main.grid.item.menu.edit"), EDIT),
e -> actionEditSite(site, siteGrid));
contextMenu.addItem(new MenuButton(getTranslation("view.sites.main.grid.item.menu.delete"), TRASH),
e -> actionDeleteSite(site, siteGrid));
contextMenu.addItem(new MenuButton(getTranslation("view.sites.main.grid.item.menu.administrators"), USERS),
e -> actionOpenAdministrators(site));
getContent().add(contextMenu);
return contextMenu.getTarget();
}
private Component addEditForm(Editor siteEditor) {
TextField siteNameField = new TextField();
siteNameField.setMaxLength(NAME_MAX_LENGTH);
siteNameField.setWidthFull();
siteNameField.setValueChangeMode(EAGER);
siteEditor.getBinder().forField(siteNameField)
.withValidator(getNotEmptyStringValidator(), getTranslation("view.sites.form.error.validation.field.name.required"))
.withValidator(siteName -> !siteService.isNamePresentIgnoringRecord(siteName, siteEditor.getItem().getId()),
getTranslation("view.sites.form.error.validation.field.name.unique"))
.bind(SiteGridItem::getName, SiteGridItem::setName);
return new Div(siteNameField);
}
private Component addEditButtons(Editor siteEditor) {
Button save = new Button(getTranslation("view.sites.main.grid.editor.button.save"),
e -> updateAction(siteEditor));
save.addThemeVariants(LUMO_TERTIARY);
save.addClassName("save");
save.addClickShortcut(Key.ENTER);
Button cancel = new Button(getTranslation("view.sites.main.grid.editor.button.cancel"),
e -> cancelAction(siteEditor));
cancel.addThemeVariants(LUMO_TERTIARY);
cancel.addClassName("cancel");
siteEditor.getBinder().addStatusChangeListener(status -> save.setEnabled(!status.hasValidationErrors() && isNameChanged(siteEditor)));
siteEditor.addOpenListener(e -> save.setEnabled(false));
return new Div(save, cancel);
}
private void cancelAction(Editor siteEditor) {
siteEditor.cancel();
refreshGrid(siteEditor);
}
private void actionOpenSiteFormAdd(ClickEvent
© 2015 - 2025 Weber Informatics LLC | Privacy Policy