package com.constellio.app.ui.pages.user;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.List;
import com.constellio.app.ui.entities.UserCredentialVO;
import com.constellio.app.ui.framework.buttons.AddButton;
import com.constellio.app.ui.framework.buttons.DisplayButton;
import com.constellio.app.ui.framework.buttons.EditButton;
import com.constellio.app.ui.framework.components.TableStringFilter;
import com.constellio.app.ui.framework.components.table.RecordVOTable;
import com.constellio.app.ui.framework.containers.ButtonsContainer;
import com.constellio.app.ui.framework.containers.ButtonsContainer.ContainerButton;
import com.constellio.app.ui.framework.containers.UserCredentialVOLazyContainer;
import com.constellio.app.ui.framework.data.UserCredentialVODataProvider;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.model.entities.security.global.UserCredentialStatus;
import com.vaadin.data.Container.Filterable;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.*;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
public class ListUsersCredentialsViewImpl extends BaseViewImpl implements ListUsersCredentialsView {
public static final String ADMIN = "admin";
public static final String AJOUTER = "Ajouter";
public static final String PENDING = "pending";
public static final String SUSPENDED = "suspended";
public static final String DELETED = "deleted";
private ListUserCredentialsPresenter presenter;
private static final String PROPERTY_BUTTONS = "buttons";
private VerticalLayout viewLayout;
private TabSheet sheet;
private HorizontalLayout filterAndAddButtonLayout;
private TableStringFilter tableFilter;
private Table table;
private UserCredentialStatus status;
private final int batchSize = 100;
public ListUsersCredentialsViewImpl() {
this.presenter = new ListUserCredentialsPresenter(this);
}
@Override
protected String getTitle() {
return $("ListUserCredentialsView.viewTitle");
}
@Override
protected List<Button> buildActionMenuButtons(ViewChangeEvent event) {
List<Button> buttons = super.buildActionMenuButtons(event);
buttons.add(new AddButton(AJOUTER) {
@Override
protected void buttonClick(ClickEvent event) {
presenter.addButtonClicked();
}
});
return buttons;
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
viewLayout = new VerticalLayout();
viewLayout.setSizeFull();
viewLayout.setSpacing(true);
filterAndAddButtonLayout = new HorizontalLayout();
filterAndAddButtonLayout.setWidth("100%");
table = buildTable(UserCredentialStatus.ACTIVE);
tableFilter = new TableStringFilter(table);
OptionGroup statusFilter = new OptionGroup();
statusFilter.addStyleName("horizontal");
statusFilter.addStyleName("status");
for (UserCredentialStatus status : UserCredentialStatus.values()) {
statusFilter.addItem(status);
statusFilter.setItemCaption(status, $("UserCredentialView.status." + status.getCode()));
if (this.status == null) {
statusFilter.setValue(UserCredentialStatus.ACTIVE);
} else if (status == this.status) {
statusFilter.setValue(status);
}
}
statusFilter.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
status = (UserCredentialStatus) event.getProperty().getValue();
refreshTable();
}
});
sheet = new TabSheet();
sheet.setSizeFull();
sheet.addSelectedTabChangeListener(new TabSheet.SelectedTabChangeListener() {
@Override
public void selectedTabChange(TabSheet.SelectedTabChangeEvent event) {
String selectedSheet = sheet.getSelectedTab().getId();
status = getTAbId(selectedSheet);
refreshTable();
}
});
for (String tabId : presenter.getTabs()) {
sheet.addTab(buildEmptyTab(tabId));
}
viewLayout.addComponents(sheet, tableFilter, table);
viewLayout.setExpandRatio(table, 1);
viewLayout.setComponentAlignment(tableFilter, Alignment.TOP_RIGHT);
return viewLayout;
}
private UserCredentialStatus getTAbId(String selectedSheet) {
switch (selectedSheet) {
case PENDING:
return UserCredentialStatus.PENDING;
case SUSPENDED:
return UserCredentialStatus.SUSPENDED;
case DELETED:
return UserCredentialStatus.DELETED;
default:
return UserCredentialStatus.ACTIVE;
}
}
private VerticalLayout buildEmptyTab(String tabId) {
VerticalLayout tab = new VerticalLayout();
tab.setCaption(presenter.getTabCaption(tabId));
tab.setId(tabId);
tab.setSpacing(true);
return tab;
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.backButtonClicked();
}
};
}
Table buildTable(UserCredentialStatus status) {
final UserCredentialVODataProvider dataProvider = presenter.getDataProvider();
List<UserCredentialVO> userCredentialVOs = dataProvider.listUserCredentialVOsWithStatus(status);
dataProvider.setUserCredentialVOs(userCredentialVOs);
Filterable tableContainer = new UserCredentialVOLazyContainer(dataProvider, batchSize);
ButtonsContainer buttonsContainer = new ButtonsContainer(tableContainer, PROPERTY_BUTTONS);
addButtons(dataProvider, buttonsContainer);
tableContainer = buttonsContainer;
Table table = new RecordVOTable($("ListUserCredentialsView.viewTitle", dataProvider.size()), tableContainer);
table.setWidth("100%");
table.setColumnHeader("username", $("ListUsersCredentialsView.usernameColumn"));
table.setColumnHeader("firstName", $("ListUsersCredentialsView.firstNameColumn"));
table.setColumnHeader("lastName", $("ListUsersCredentialsView.lastNameColumn"));
table.setColumnHeader("email", $("ListUsersCredentialsView.emailColumn"));
table.setColumnHeader(PROPERTY_BUTTONS, "");
table.setColumnWidth(PROPERTY_BUTTONS, 120);
table.setPageLength(Math.min(10, dataProvider.size()));
return table;
}
private void addButtons(final UserCredentialVODataProvider provider, ButtonsContainer buttonsContainer) {
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
UserCredentialVO entity = getUserCredentialVO((Integer) itemId, provider);
presenter.displayButtonClicked(entity);
}
};
}
});
buttonsContainer.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
final UserCredentialVO entity = getUserCredentialVO((Integer) itemId, provider);
Button editButton = new EditButton() {
@Override
protected void buttonClick(ClickEvent event) {
presenter.editButtonClicked(entity);
}
};
if (ADMIN.equals(entity.getUsername())) {
editButton.setEnabled(presenter.canModifyPassword(entity.getUsername()));
editButton.setVisible(presenter.canModifyPassword(entity.getUsername()));
} else {
editButton.setEnabled(presenter.canAddOrModify());
editButton.setVisible(presenter.canAddOrModify());
}
return editButton;
}
});
}
public void refreshTable() {
Table newTable = buildTable(status);
viewLayout.replaceComponent(table, newTable);
table = newTable;
refreshFilter();
}
private void refreshFilter() {
TableStringFilter newTableFilter = new TableStringFilter(table);
viewLayout.replaceComponent(tableFilter, newTableFilter);
tableFilter = newTableFilter;
}
private UserCredentialVO getUserCredentialVO(Integer itemId, UserCredentialVODataProvider provider) {
Integer index = itemId;
return provider.getUserCredentialVO(index);
}
}