/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ /** * */ package org.roda.wui.client.management; import java.util.HashSet; import java.util.List; import java.util.Set; import org.roda.core.data.v2.user.Group; import org.roda.wui.client.common.utils.AsyncCallbackUtils; import org.roda.wui.client.common.utils.StringUtils; import org.roda.wui.common.client.ClientLogger; import org.roda.wui.common.client.tools.HistoryUtils; import org.roda.wui.common.client.widgets.wcag.WCAGUtilities; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; /** * @author Luis Faria * */ public class GroupDataPanel extends Composite implements HasValueChangeHandlers<Group> { interface MyUiBinder extends UiBinder<Widget, GroupDataPanel> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); private Group group = new Group(); @UiField TextBox groupname; @UiField TextBox fullname; @UiField Label usersLabel, usersValue; @UiField FlowPanel permissionsSelectPanel; @UiField PermissionsPanel permissionsPanel; @SuppressWarnings("unused") private ClientLogger logger = new ClientLogger(getClass().getName()); private boolean editmode; private boolean changed = false; private boolean checked = false; /** * Create a new group data panel * * @param editmode * if group name should be editable */ public GroupDataPanel(boolean editmode) { this(true, editmode); } /** * * @param visible * @param editmode */ public GroupDataPanel(boolean visible, boolean editmode) { initWidget(uiBinder.createAndBindUi(this)); this.editmode = editmode; super.setVisible(visible); ChangeHandler changeHandler = new ChangeHandler() { @Override public void onChange(ChangeEvent event) { GroupDataPanel.this.onChange(); } }; KeyUpHandler keyUpHandler = new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { onChange(); } }; groupname.setEnabled(!isEditmode()); groupname.addKeyDownHandler(new UserAndGroupKeyDownHandler()); groupname.addChangeHandler(changeHandler); groupname.addKeyUpHandler(keyUpHandler); fullname.addChangeHandler(changeHandler); fullname.addKeyUpHandler(keyUpHandler); permissionsPanel.addValueChangeHandler(new ValueChangeHandler<List<String>>() { @Override public void onValueChange(ValueChangeEvent<List<String>> event) { onChange(); } }); } /** * Set group information of group * * @param group */ public void setGroup(Group group) { this.group = group; this.groupname.setText(group.getName()); this.fullname.setText(group.getFullName()); this.usersValue.setText(StringUtils.prettyPrint(group.getUsers())); this.setPermissions(group.getDirectRoles(), group.getAllRoles()); // update visibility this.usersLabel.setVisible(!group.getUsers().isEmpty()); this.usersValue.setVisible(!group.getUsers().isEmpty()); } private void setPermissions(final Set<String> directRoles, final Set<String> allRoles) { permissionsPanel.init(new AsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { Set<String> indirectRoles = new HashSet<>(allRoles); indirectRoles.removeAll(directRoles); permissionsPanel.checkPermissions(directRoles, false); permissionsPanel.checkPermissions(indirectRoles, true); WCAGUtilities.getInstance().makeAccessible(permissionsSelectPanel.getElement()); } @Override public void onFailure(Throwable caught) { AsyncCallbackUtils.defaultFailureTreatment(caught); HistoryUtils.newHistory(MemberManagement.RESOLVER); } }); } /** * Get group defined by this panel. This panel defines: name, fullname * * @return the group modified by this panel */ public Group getGroup() { group.setId(groupname.getText()); group.setName(groupname.getText()); group.setFullName(fullname.getText()); group.setDirectRoles(permissionsPanel.getDirectRoles()); return group; } /** * Is group data panel valid * * @return true if valid */ public boolean isValid() { boolean valid = true; if (groupname.getText().length() == 0) { valid = false; groupname.addStyleName("isWrong"); } else { groupname.removeStyleName("isWrong"); } if (fullname.getText().length() == 0) { valid = false; fullname.addStyleName("isWrong"); } else { fullname.removeStyleName("isWrong"); } checked = true; return valid; } /** * Is group name read only * * @return true if read only */ public boolean isGroupnameReadOnly() { return groupname.isReadOnly(); } /** * Set group name read only * * @param readonly */ public void setGroupnameReadOnly(boolean readonly) { groupname.setReadOnly(readonly); } public void clear() { groupname.setText(""); fullname.setText(""); } /** * Is group data panel editable, i.e. on create group mode * * @return true if editable */ public boolean isEditmode() { return editmode; } /** * Is group data panel has been changed * * @return changed */ public boolean isChanged() { return changed; } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Group> handler) { return addHandler(handler, ValueChangeEvent.getType()); } protected void onChange() { changed = true; if (checked) { isValid(); } ValueChangeEvent.fire(this, getValue()); } public Group getValue() { return getGroup(); } }