package org.ovirt.engine.ui.webadmin.section.main.view.tab;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.searchbackend.VdcUserConditionFieldAutoCompleter;
import org.ovirt.engine.core.searchbackend.VdcUserConditionFieldAutoCompleter.UserOrGroup;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider;
import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn;
import org.ovirt.engine.ui.common.widget.uicommon.users.UserTypeChangeHandler;
import org.ovirt.engine.ui.common.widget.uicommon.users.UsersTypeRadioGroup;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.CommonModel;
import org.ovirt.engine.ui.uicommonweb.models.users.UserListModel;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.MainTabUserPresenter;
import org.ovirt.engine.ui.webadmin.section.main.view.AbstractMainTabWithDetailsTableView;
import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition;
import org.ovirt.engine.ui.webadmin.widget.table.column.UserStatusColumn;
import com.google.gwt.core.client.GWT;
import com.google.gwt.regexp.shared.RegExp;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class MainTabUserView extends AbstractMainTabWithDetailsTableView<DbUser, UserListModel>
implements MainTabUserPresenter.ViewDef, UserTypeChangeHandler {
interface ViewIdHandler extends ElementIdHandler<MainTabUserView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
private static final ApplicationConstants constants = AssetProvider.getConstants();
private static final String searchRegexTypeClause = "\\s*((and|or)\\s+)?type\\s*=\\s*\\S+"; //$NON-NLS-1$
private static final String searchRegexFlags = "ig"; //$NON-NLS-1$
private static final RegExp searchPatternDiskTypeClause = RegExp.compile(searchRegexTypeClause, searchRegexFlags);
private AbstractTextColumn<DbUser> firstNameColumn;
private AbstractTextColumn<DbUser> groupNameColumn;
private AbstractTextColumn<DbUser> lastNameColumn;
private AbstractTextColumn<DbUser> userNameColumn;
private AbstractTextColumn<DbUser> authzColumn;
private AbstractTextColumn<DbUser> namespaceColumn;
private UserStatusColumn userStatusColumn;
private AbstractTextColumn<DbUser> emailColumn;
private UsersTypeRadioGroup userTypes;
@Inject
Provider<CommonModel> commonModelProvider;
@Inject
public MainTabUserView(MainModelProvider<DbUser, UserListModel> modelProvider) {
super(modelProvider);
ViewIdHandler.idHandler.generateAndSetIds(this);
initTable();
initTableOverhead();
initWidget(getTable());
}
private void initTableOverhead() {
userTypes = new UsersTypeRadioGroup();
userTypes.addChangeHandler(this);
getTable().setTableOverhead(userTypes);
//Needs this to not hide the overhead behind the buttons.
getTable().setTableTopMargin(20);
}
void initTable() {
getTable().enableColumnResizing();
userStatusColumn = new UserStatusColumn();
userStatusColumn.setContextMenuTitle(constants.statusUser());
getTable().addColumn(userStatusColumn, constants.empty(), "30px"); //$NON-NLS-1$
firstNameColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getFirstName();
}
};
firstNameColumn.makeSortable(VdcUserConditionFieldAutoCompleter.FIRST_NAME);
getTable().addColumn(firstNameColumn, constants.firstnameUser(), "150px"); //$NON-NLS-1$
groupNameColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getFirstName();
}
};
groupNameColumn.makeSortable(VdcUserConditionFieldAutoCompleter.FIRST_NAME);
getTable().addColumn(groupNameColumn, constants.groupNameUser(), "150px"); //$NON-NLS-1$
lastNameColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getLastName();
}
};
lastNameColumn.makeSortable(VdcUserConditionFieldAutoCompleter.LAST_NAME);
getTable().addColumn(lastNameColumn, constants.lastNameUser(), "150px"); //$NON-NLS-1$
userNameColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getLoginName();
}
};
userNameColumn.makeSortable(VdcUserConditionFieldAutoCompleter.USER_NAME);
getTable().addColumn(userNameColumn, constants.userNameUser(), "150px"); //$NON-NLS-1$
authzColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getDomain();
}
};
authzColumn.makeSortable(VdcUserConditionFieldAutoCompleter.DIRECTORY);
getTable().addColumn(authzColumn, constants.authz(), "150px"); //$NON-NLS-1$
namespaceColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getNamespace();
}
};
namespaceColumn.makeSortable();
getTable().addColumn(namespaceColumn, constants.namespace(), "150px"); //$NON-NLS-1$
emailColumn = new AbstractTextColumn<DbUser>() {
@Override
public String getValue(DbUser object) {
return object.getEmail();
}
};
getTable().addColumn(emailColumn, constants.emailUser());
getTable().addActionButton(new WebAdminButtonDefinition<DbUser>(constants.addUser()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getAddCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<DbUser>(constants.removeUser()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getRemoveCommand();
}
});
getTable().addActionButton(new WebAdminButtonDefinition<DbUser>(constants.assignTagsUser()) {
@Override
protected UICommand resolveCommand() {
return getMainModel().getAssignTagsCommand();
}
});
}
@Override
public void userTypeChanged(UserOrGroup newType) {
boolean isUser = newType == UserOrGroup.User;
getTable().ensureColumnVisible(firstNameColumn, constants.firstnameUser(), isUser, "150px"); //$NON-NLS-1$
getTable().ensureColumnVisible(groupNameColumn, constants.groupNameUser(), !isUser, "150px"); //$NON-NLS-1$
getTable().ensureColumnVisible(lastNameColumn, constants.lastNameUser(), isUser, "150px"); //$NON-NLS-1$
getTable().ensureColumnVisible(userNameColumn, constants.userNameUser(), isUser, "150px"); //$NON-NLS-1$
getTable().ensureColumnVisible(authzColumn, constants.authz(), isUser, "150px"); //$NON-NLS-1$
getTable().ensureColumnVisible(namespaceColumn, constants.namespace(), isUser, "150px"); //$NON-NLS-1$
getTable().ensureColumnVisible(emailColumn, constants.emailUser(), isUser);
updateSearchString(newType);
userTypes.updateSelectedValue(newType, false);
}
private void updateSearchString(UserOrGroup userType) {
final String usersSearchPrefix = "Users:"; //$NON-NLS-1$
final String space = " "; //$NON-NLS-1$
final String empty = ""; //$NON-NLS-1$
final String colon = ":"; //$NON-NLS-1$
String inputSearchString = commonModelProvider.get().getSearchString() != null
? commonModelProvider.get().getSearchString().trim().toLowerCase() : "";
String inputSearchStringPrefix = commonModelProvider.get().getSearchStringPrefix() != null
? commonModelProvider.get().getSearchStringPrefix().trim().toLowerCase() : "";
if (!inputSearchString.isEmpty() && inputSearchStringPrefix.isEmpty()) {
int indexOfColon = inputSearchString.indexOf(colon);
inputSearchStringPrefix = inputSearchString.substring(0, indexOfColon + 1).trim();
inputSearchString = inputSearchString.substring(indexOfColon + 1).trim();
}
if (inputSearchStringPrefix.isEmpty()) {
inputSearchStringPrefix = usersSearchPrefix;
inputSearchString = empty;
}
//Strip out all '(and|or) type=X' patterns.
inputSearchString = searchPatternDiskTypeClause
.replace(inputSearchString, empty).trim();
inputSearchStringPrefix = searchPatternDiskTypeClause
.replace(inputSearchStringPrefix, empty).trim();
String[] prefixSplit = inputSearchStringPrefix.split(colon);
if (prefixSplit.length > 1 && !prefixSplit[prefixSplit.length - 1].isEmpty()) {
// We have a tag or bookmark or something in the prefix already, add an ' and ' to the prefix.
inputSearchStringPrefix += " and "; //$NON-NLS-1$
}
inputSearchStringPrefix += VdcUserConditionFieldAutoCompleter.TYPE.toLowerCase()
+ " = " + userType.name().toLowerCase() + space; //$NON-NLS-1$
commonModelProvider.get().setSearchStringPrefix(inputSearchStringPrefix);
commonModelProvider.get().setSearchString(inputSearchString);
getTable().getSelectionModel().clear();
getMainModel().setUserOrGroup(userType);
getMainModel().setItems(null);
getMainModel().setSearchString(commonModelProvider.get().getEffectiveSearchString());
getMainModel().search();
}
}