package com.constellio.app.ui.pages.collection;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.List;
import java.util.Locale;
import org.apache.commons.lang.StringUtils;
import org.vaadin.dialogs.ConfirmDialog;
import com.constellio.app.ui.entities.GlobalGroupVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RoleVO;
import com.constellio.app.ui.entities.UserCredentialVO;
import com.constellio.app.ui.framework.buttons.AddButton;
import com.constellio.app.ui.framework.buttons.AuthorizationsButton;
import com.constellio.app.ui.framework.buttons.DeleteButton;
import com.constellio.app.ui.framework.buttons.DisplayButton;
import com.constellio.app.ui.framework.buttons.RolesButton;
import com.constellio.app.ui.framework.components.fields.lookup.LookupField;
import com.constellio.app.ui.framework.components.table.BaseTable;
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.GlobalGroupVOLazyContainer;
import com.constellio.app.ui.framework.containers.RecordVOLazyContainer;
import com.constellio.app.ui.framework.data.GlobalGroupVODataProvider;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.vaadin.data.Container;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.converter.Converter;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
// After rename CollectionSecurityManagementViewImpl
public class ListCollectionUserViewImpl extends BaseViewImpl implements ListCollectionUserView {
public static final String USER_LOOKUP = "user-lookup";
public static final String ROLES_USERS_COMBO = "roles-users-combo";
public static final String ROLES_GROUPS_COMBO = "roles-groups-combo";
public static final String USER_ADD = "user-addUserRole";
public static final String USER_TABLE = "users";
public static final String GROUP_LOOKUP = "group-lookup";
public static final String GROUP_ADD = "group-add";
public static final String GROUP_TABLE = "groups";
private final ListCollectionUserPresenter presenter;
private Table usersTable;
private Table groupsTable;
private VerticalLayout layout;
private ComboBox comboboxUserRoles;
private ComboBox comboboxGroupRoles;
private Button addUserRole;
private Button addGroupRole;
private UserCredentialLookup lookupUser;
private GlobalGroupLookup lookupGroup;
private final int batchSize = 20;
public ListCollectionUserViewImpl() {
presenter = new ListCollectionUserPresenter(this);
}
@Override
protected String getTitle() {
return $("ListCollectionUserView.viewTitle");
}
@Override
protected Component buildMainComponent(ViewChangeEvent event) {
Label groupsCaption = new Label($("ListCollectionUserView.groupsCaption"));
groupsCaption.addStyleName(ValoTheme.LABEL_H2);
groupsTable = buildGroupsTable();
Label usersCaption = new Label($("ListCollectionUserView.usersCaption"));
usersCaption.addStyleName(ValoTheme.LABEL_H2);
usersTable = buildUserTable();
layout = new VerticalLayout(groupsCaption, buildGroupRolesAndAdder(), groupsTable, usersCaption, buildUserRolesAndAdder(),
usersTable);
layout.setSpacing(true);
return layout;
}
@Override
protected ClickListener getBackButtonClickListener() {
return new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.backButtonClicked();
}
};
}
private HorizontalLayout buildUserRolesAndAdder() {
lookupUser = new UserCredentialLookup(presenter.getUserLookupProvider());
lookupUser.addStyleName(USER_LOOKUP);
comboboxUserRoles = new ComboBox();
comboboxUserRoles.setNullSelectionAllowed(false);
comboboxUserRoles.addStyleName(ROLES_USERS_COMBO);
for (RoleVO roleVO : presenter.getRoles()) {
comboboxUserRoles.addItem(roleVO.getCode());
comboboxUserRoles.setItemCaption(roleVO.getCode(), roleVO.getTitle());
}
comboboxUserRoles.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
enableOrDisableButton(lookupUser.getValue(), (String) comboboxUserRoles.getValue(), addUserRole);
}
});
addUserRole = new AddButton() {
@Override
protected void buttonClick(ClickEvent event) {
presenter.addButtonClicked(lookupUser.getValue(), (String) comboboxUserRoles.getValue());
}
};
addUserRole.addStyleName(USER_ADD);
addUserRole.setEnabled(false);
lookupUser.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
enableOrDisableButton(lookupUser.getValue(), (String) comboboxUserRoles.getValue(), addUserRole);
}
});
HorizontalLayout layout = new HorizontalLayout(lookupUser, comboboxUserRoles, addUserRole);
layout.setSpacing(true);
return layout;
}
private void enableOrDisableButton(Object vo, String role, Button button) {
if (vo != null && role != null) {
button.setEnabled(true);
} else {
button.setEnabled(false);
}
}
private Table buildUserTable() {
RecordVODataProvider dataProvider = presenter.getDataProvider();
Container container = buildContainer(dataProvider);
RecordVOTable table = new RecordVOTable($("ListCollectionUserView.tableTitle", dataProvider.size()), container);
table.setWidth("100%");
table.setColumnHeader("buttons", "");
table.setColumnWidth(dataProvider.getSchema().getCode() + "_id", 120);
table.setColumnWidth("buttons", 158);
int tableSize = batchSize;
if (tableSize > table.size()) {
tableSize = table.size();
}
table.setPageLength(tableSize);
table.addStyleName(USER_TABLE);
return table;
}
private HorizontalLayout buildGroupRolesAndAdder() {
lookupGroup = new GlobalGroupLookup(presenter.getGlobalGroupLookupProvider());
lookupGroup.addStyleName(GROUP_LOOKUP);
lookupGroup.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
enableOrDisableButton(lookupGroup.getValue(), (String) comboboxGroupRoles.getValue(), addGroupRole);
}
});
comboboxGroupRoles = new ComboBox();
comboboxGroupRoles.setNullSelectionAllowed(false);
comboboxGroupRoles.addStyleName(ROLES_GROUPS_COMBO);
for (RoleVO roleVO : presenter.getRoles()) {
comboboxGroupRoles.addItem(roleVO.getCode());
comboboxGroupRoles.setItemCaption(roleVO.getCode(), roleVO.getTitle());
}
comboboxGroupRoles.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
enableOrDisableButton(lookupGroup.getValue(), (String) comboboxGroupRoles.getValue(), addGroupRole);
}
});
addGroupRole = new AddButton() {
@Override
protected void buttonClick(ClickEvent event) {
presenter.addGlobalGroupButtonClicked(lookupGroup.getValue(), (String) comboboxGroupRoles.getValue());
}
};
addGroupRole.addStyleName(GROUP_ADD);
addGroupRole.setEnabled(false);
HorizontalLayout layout = new HorizontalLayout(lookupGroup, comboboxGroupRoles, addGroupRole);
layout.setSpacing(true);
return layout;
}
private Table buildGroupsTable() {
GlobalGroupVODataProvider globalGroupVODataProvider = presenter.getGlobalGroupVODataProvider();
List<GlobalGroupVO> globalGroupsVO = globalGroupVODataProvider.listActiveGlobalGroupVOsWithUsersInCollection(getCollection());
globalGroupVODataProvider.setGlobalGroupVOs(globalGroupsVO);
Container container = buildGroupContainer(globalGroupVODataProvider);
BaseTable table = new BaseTable("ListCollectionUserView.globalGroupsTableTitle", $("ListCollectionUserView.globalGroupsTableTitle", globalGroupVODataProvider.size()), container);
table.setWidth("100%");
table.setColumnHeader("buttons", "");
table.setColumnHeader("code", $("ListCollectionUserView.groupCodeColumn"));
table.setColumnHeader("name", $("ListCollectionUserView.groupNameColumn"));
table.setColumnWidth("", 120);
table.setColumnWidth("buttons", 158);
int tableSize = batchSize;
if (tableSize > table.getItemIds().size()) {
tableSize = table.getItemIds().size();
}
table.setPageLength(tableSize);
table.addStyleName(GROUP_TABLE);
return table;
}
private Container buildContainer(final RecordVODataProvider dataProvider) {
RecordVOLazyContainer records = new RecordVOLazyContainer(dataProvider);
ButtonsContainer container = new ButtonsContainer<>(records, "buttons");
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.displayButtonClicked(entity);
}
};
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new AuthorizationsButton(true) {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.accessAuthorizationsButtonClicked(entity);
}
};
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new RolesButton(true) {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.permissionsButtonClicked(entity);
}
};
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new DeleteButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
Integer index = (Integer) itemId;
RecordVO entity = dataProvider.getRecordVO(index);
presenter.deleteButtonClicked(entity);
}
};
}
});
return container;
}
private Container buildGroupContainer(final GlobalGroupVODataProvider dataProvider) {
GlobalGroupVOLazyContainer globalGroupsContainer = new GlobalGroupVOLazyContainer(dataProvider, batchSize);
ButtonsContainer container = new ButtonsContainer<>(globalGroupsContainer, "buttons");
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
Button displayButton = new DisplayButton() {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
GlobalGroupVO entity = dataProvider.getGlobalGroupVO(index);
presenter.displayGlobalGroupButtonClicked(entity);
}
};
return displayButton;
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new AuthorizationsButton(true) {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
GlobalGroupVO entity = dataProvider.getGlobalGroupVO(index);
presenter.accessAuthorizationsGlobalGroupButtonClicked(entity);
}
};
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
return new RolesButton(true) {
@Override
protected void buttonClick(ClickEvent event) {
Integer index = (Integer) itemId;
GlobalGroupVO entity = dataProvider.getGlobalGroupVO(index);
presenter.permissionsGlobalGroupButtonClicked(entity);
}
};
}
});
container.addButton(new ContainerButton() {
@Override
protected Button newButtonInstance(final Object itemId, ButtonsContainer<?> container) {
Button deleteButton = new DeleteButton() {
@Override
protected void confirmButtonClick(ConfirmDialog dialog) {
Integer index = (Integer) itemId;
GlobalGroupVO entity = dataProvider.getGlobalGroupVO(index);
presenter.deleteGlobalGroupButtonClicked(entity);
}
};
return deleteButton;
}
});
return container;
}
@Override
public void refreshTable() {
Table newUsersTable = buildUserTable();
Table newGlobalGroupsTable = buildGroupsTable();
layout.replaceComponent(usersTable, newUsersTable);
layout.replaceComponent(groupsTable, newGlobalGroupsTable);
usersTable = newUsersTable;
groupsTable = newGlobalGroupsTable;
cleanUserAndRoles();
cleanGroupsAndRoles();
}
public void cleanUserAndRoles() {
comboboxUserRoles.setValue(null);
lookupUser.setValue(null);
}
public void cleanGroupsAndRoles() {
comboboxGroupRoles.setValue(null);
lookupUser.setValue(null);
}
public static class UserCredentialLookup extends LookupField<UserCredentialVO> {
public UserCredentialLookup(TextInputDataProvider<UserCredentialVO> suggestInputDataProvider) {
super(suggestInputDataProvider);
setItemConverter(new Converter<String, UserCredentialVO>() {
@Override
public UserCredentialVO convertToModel(String value, Class<? extends UserCredentialVO> targetType, Locale locale)
throws ConversionException {
return null;
}
@Override
public String convertToPresentation(UserCredentialVO value, Class<? extends String> targetType, Locale locale)
throws ConversionException {
String title = value.getFirstName() + " " + value.getLastName();
if (StringUtils.isBlank(title)) {
title = value.getUsername();
}
return title;
}
@Override
public Class<UserCredentialVO> getModelType() {
return UserCredentialVO.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
@Override
public Class<? extends UserCredentialVO> getType() {
return UserCredentialVO.class;
}
}
public static class GlobalGroupLookup extends LookupField<GlobalGroupVO> {
public GlobalGroupLookup(TextInputDataProvider<GlobalGroupVO> suggestInputDataProvider) {
super(suggestInputDataProvider);
setItemConverter(new Converter<String, GlobalGroupVO>() {
@Override
public GlobalGroupVO convertToModel(String value, Class<? extends GlobalGroupVO> targetType, Locale locale)
throws ConversionException {
return null;
}
@Override
public String convertToPresentation(GlobalGroupVO value, Class<? extends String> targetType, Locale locale)
throws ConversionException {
return value.getName();
}
@Override
public Class<GlobalGroupVO> getModelType() {
return GlobalGroupVO.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
});
}
@Override
public Class<? extends GlobalGroupVO> getType() {
return GlobalGroupVO.class;
}
}
}