diff options
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java')
-rw-r--r-- | gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java | 384 |
1 files changed, 112 insertions, 272 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java index b87f6f1fc6..1ed919b401 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java @@ -1,4 +1,4 @@ -// Copyright (C) 2008 The Android Open Source Project +// Copyright (C) 2011 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,314 +14,154 @@ package com.google.gerrit.client.admin; -import com.google.gerrit.client.Dispatcher; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.ScreenLoadCallback; -import com.google.gerrit.client.ui.FancyFlexTable; -import com.google.gerrit.client.ui.Hyperlink; -import com.google.gerrit.client.ui.SmallHeading; -import com.google.gerrit.common.data.ApprovalType; -import com.google.gerrit.common.data.GerritConfig; -import com.google.gerrit.common.data.InheritedRefRight; -import com.google.gerrit.common.data.ProjectDetail; -import com.google.gerrit.reviewdb.AccountGroup; -import com.google.gerrit.reviewdb.ApprovalCategoryValue; -import com.google.gerrit.reviewdb.Project; -import com.google.gerrit.reviewdb.RefRight; +import com.google.gerrit.common.PageLinks; +import com.google.gerrit.common.data.ProjectAccess; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.editor.client.SimpleBeanEditorDriver; import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.CheckBox; -import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.Panel; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; -import com.google.gwtexpui.safehtml.client.SafeHtml; -import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.UIObject; +import com.google.gwtexpui.globalkey.client.NpTextArea; public class ProjectAccessScreen extends ProjectScreen { - private Panel parentPanel; - private Hyperlink parentName; - - private RightsTable rights; - private Button delRight; - private AccessRightEditor rightEditor; - private CheckBox showInherited; - - public ProjectAccessScreen(final Project.NameKey toShow) { - super(toShow); + interface Binder extends UiBinder<HTMLPanel, ProjectAccessScreen> { } - @Override - protected void onInitUI() { - super.onInitUI(); - initParent(); - initRights(); - } + private static final Binder uiBinder = GWT.create(Binder.class); - @Override - protected void onLoad() { - super.onLoad(); - Util.PROJECT_SVC.projectDetail(getProjectKey(), - new ScreenLoadCallback<ProjectDetail>(this) { - public void preDisplay(final ProjectDetail result) { - enableForm(true); - display(result); - } - }); + interface Driver extends SimpleBeanEditorDriver< // + ProjectAccess, // + ProjectAccessEditor> { } - private void enableForm(final boolean on) { - delRight.setEnabled(on); - rightEditor.enableForm(on); - } + @UiField + DivElement editTools; - private void initParent() { - parentName = new Hyperlink("", ""); + @UiField + Button edit; - showInherited = new CheckBox(); - showInherited.setValue(true); - showInherited.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - rights.showInherited(showInherited.getValue()); - } - }); + @UiField + Button cancel1; - Grid g = new Grid(2, 3); - g.setWidget(0, 0, new SmallHeading(Util.C.headingParentProjectName())); - g.setWidget(1, 0, parentName); - g.setWidget(1, 1, showInherited); - g.setText(1, 2, Util.C.headingShowInherited()); + @UiField + Button cancel2; - parentPanel = new VerticalPanel(); - parentPanel.add(g); - add(parentPanel); - } - - private void initRights() { - rights = new RightsTable(); + @UiField + ProjectAccessEditor accessEditor; - delRight = new Button(Util.C.buttonDeleteGroupMembers()); - delRight.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - final HashSet<RefRight.Key> refRightIds = rights.getRefRightIdsChecked(); - doDeleteRefRights(refRightIds); - } - }); + @UiField + DivElement commitTools; - rightEditor = new AccessRightEditor(getProjectKey()); - rightEditor.addValueChangeHandler(new ValueChangeHandler<ProjectDetail>() { - @Override - public void onValueChange(ValueChangeEvent<ProjectDetail> event) { - display(event.getValue()); - } - }); + @UiField + NpTextArea commitMessage; - add(new SmallHeading(Util.C.headingAccessRights())); - add(rights); - add(delRight); - add(rightEditor); - } + @UiField + Button commit; - void display(final ProjectDetail result) { - final Project project = result.project; + private Driver driver; - final Project.NameKey wildKey = Gerrit.getConfig().getWildProject(); - final boolean isWild = wildKey.equals(project.getNameKey()); - Project.NameKey parent = project.getParent(); - if (parent == null) { - parent = wildKey; - } + private ProjectAccess access; - parentPanel.setVisible(!isWild); - parentName.setTargetHistoryToken(Dispatcher.toProjectAdmin(parent, ACCESS)); - parentName.setText(parent.get()); + public ProjectAccessScreen(final Project.NameKey toShow) { + super(toShow); + } - rights.display(result.groups, result.rights); + @Override + protected void onInitUI() { + super.onInitUI(); + add(uiBinder.createAndBindUi(this)); - rightEditor.setVisible(result.canModifyAccess); - delRight.setVisible(rights.getCanDelete()); + driver = GWT.create(Driver.class); + accessEditor.setEditing(false); + driver.initialize(accessEditor); } - private void doDeleteRefRights(final HashSet<RefRight.Key> refRightIds) { - if (!refRightIds.isEmpty()) { - Util.PROJECT_SVC.deleteRight(getProjectKey(), refRightIds, - new GerritCallback<ProjectDetail>() { - @Override - public void onSuccess(final ProjectDetail result) { - //The user could no longer modify access after deleting a ref right. - display(result); - } - }); - } + @Override + protected void onLoad() { + super.onLoad(); + Util.PROJECT_SVC.projectAccess(getProjectKey(), + new ScreenLoadCallback<ProjectAccess>(this) { + @Override + public void preDisplay(ProjectAccess access) { + displayReadOnly(access); + } + }); } - private class RightsTable extends FancyFlexTable<InheritedRefRight> { - boolean canDelete; - Map<AccountGroup.Id, AccountGroup> groups; - - RightsTable() { - table.setWidth(""); - table.setText(0, 2, Util.C.columnRightOrigin()); - table.setText(0, 3, Util.C.columnApprovalCategory()); - table.setText(0, 4, Util.C.columnGroupName()); - table.setText(0, 5, Util.C.columnRefName()); - table.setText(0, 6, Util.C.columnRightRange()); - - final FlexCellFormatter fmt = table.getFlexCellFormatter(); - fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().iconHeader()); - fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader()); - fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader()); - fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader()); - fmt.addStyleName(0, 5, Gerrit.RESOURCES.css().dataHeader()); - fmt.addStyleName(0, 6, Gerrit.RESOURCES.css().dataHeader()); - - table.addClickHandler(new ClickHandler() { - @Override - public void onClick(final ClickEvent event) { - onOpenRow(table.getCellForEvent(event).getRowIndex()); - } - }); - } - - HashSet<RefRight.Key> getRefRightIdsChecked() { - final HashSet<RefRight.Key> refRightIds = new HashSet<RefRight.Key>(); - for (int row = 1; row < table.getRowCount(); row++) { - RefRight r = getRowItem(row).getRight(); - if (r != null && table.getWidget(row, 1) instanceof CheckBox - && ((CheckBox) table.getWidget(row, 1)).getValue()) { - refRightIds.add(r.getKey()); - } - } - return refRightIds; - } + private void displayReadOnly(ProjectAccess access) { + this.access = access; + accessEditor.setEditing(false); + UIObject.setVisible(editTools, !access.getOwnerOf().isEmpty()); + edit.setEnabled(!access.getOwnerOf().isEmpty()); + cancel1.setVisible(false); + UIObject.setVisible(commitTools, false); + driver.edit(access); + } - void display(final Map<AccountGroup.Id, AccountGroup> grps, - final List<InheritedRefRight> refRights) { - groups = grps; - canDelete = false; + @UiHandler("edit") + void onEdit(ClickEvent event) { + edit.setEnabled(false); + cancel1.setVisible(true); + UIObject.setVisible(commitTools, true); + accessEditor.setEditing(true); + driver.edit(access); + } - while (1 < table.getRowCount()) - table.removeRow(table.getRowCount() - 1); + @UiHandler(value={"cancel1", "cancel2"}) + void onCancel(ClickEvent event) { + Gerrit.display(PageLinks.toProjectAcceess(getProjectKey())); + } - for (final InheritedRefRight r : refRights) { - final int row = table.getRowCount(); - table.insertRow(row); - if (! showInherited.getValue() && r.isInherited()) { - table.getRowFormatter().setVisible(row, false); - } - applyDataRowStyle(row); - populate(row, r); - } - } + @UiHandler("commit") + void onCommit(ClickEvent event) { + ProjectAccess access = driver.flush(); - protected void onOpenRow(final int row) { - if (row > 0) { - RefRight right = getRowItem(row).getRight(); - rightEditor.load(right, groups.get(right.getAccountGroupId())); - } + if (driver.hasErrors()) { + Window.alert(Util.C.errorsMustBeFixed()); + return; } - void populate(final int row, final InheritedRefRight r) { - final GerritConfig config = Gerrit.getConfig(); - final RefRight right = r.getRight(); - final ApprovalType ar = - config.getApprovalTypes().getApprovalType( - right.getApprovalCategoryId()); - final AccountGroup group = groups.get(right.getAccountGroupId()); - - if (r.isInherited() || !r.isOwner()) { - table.setText(row, 1, ""); - } else { - table.setWidget(row, 1, new CheckBox()); - canDelete = true; - } - - if (r.isInherited()) { - Project.NameKey fromProject = right.getKey().getProjectNameKey(); - table.setWidget(row, 2, new Hyperlink(fromProject.get(), Dispatcher - .toProjectAdmin(fromProject, ACCESS))); - } else { - table.setText(row, 2, ""); - } - - table.setText(row, 3, ar != null ? ar.getCategory().getName() - : right.getApprovalCategoryId().get() ); - - if (group != null) { - table.setWidget(row, 4, new Hyperlink(group.getName(), Dispatcher - .toAccountGroup(group.getId()))); - } else { - table.setText(row, 4, Util.M.deletedGroup(right.getAccountGroupId() - .get())); - } - - table.setText(row, 5, right.getRefPatternForDisplay()); - - { - final SafeHtmlBuilder m = new SafeHtmlBuilder(); - final ApprovalCategoryValue min, max; - min = ar != null ? ar.getValue(right.getMinValue()) : null; - max = ar != null ? ar.getValue(right.getMaxValue()) : null; - - if (ar != null && ar.getCategory().isRange()) { - formatValue(m, right.getMinValue(), min); - m.br(); - } - formatValue(m, right.getMaxValue(), max); - SafeHtml.set(table, row, 6, m); - } - - final FlexCellFormatter fmt = table.getFlexCellFormatter(); - fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell()); - fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell()); - fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell()); - fmt.addStyleName(row, 4, Gerrit.RESOURCES.css().dataCell()); - fmt.addStyleName(row, 5, Gerrit.RESOURCES.css().dataCell()); - fmt.addStyleName(row, 6, Gerrit.RESOURCES.css().dataCell()); - fmt.addStyleName(row, 6, Gerrit.RESOURCES.css() - .projectAdminApprovalCategoryRangeLine()); - - setRowItem(row, r); + String message = commitMessage.getText().trim(); + if ("".equals(message)) { + message = null; } - public void showInherited(boolean visible) { - for (int r = 0; r < table.getRowCount(); r++) { - if (getRowItem(r) != null && getRowItem(r).isInherited()) { - table.getRowFormatter().setVisible(r, visible); - } - } - } + enable(false); + Util.PROJECT_SVC.changeProjectAccess( // + getProjectKey(), // + access.getRevision(), // + message, // + access.getLocal(), // + new GerritCallback<ProjectAccess>() { + @Override + public void onSuccess(ProjectAccess access) { + enable(true); + commitMessage.setText(""); + displayReadOnly(access); + } - private void formatValue(final SafeHtmlBuilder m, final short v, - final ApprovalCategoryValue e) { - m.openSpan(); - m - .setStyleName(Gerrit.RESOURCES.css() - .projectAdminApprovalCategoryValue()); - if (v == 0) { - m.append(' '); - } else if (v > 0) { - m.append('+'); - } - m.append(v); - m.closeSpan(); - if (e != null) { - m.append(": "); - m.append(e.getName()); - } - } + @Override + public void onFailure(Throwable caught) { + enable(true); + super.onFailure(caught); + } + }); + } - private boolean getCanDelete() { - return canDelete; - } + private void enable(boolean enabled) { + commitMessage.setEnabled(enabled); + commit.setEnabled(enabled); + cancel1.setEnabled(enabled); + cancel2.setEnabled(enabled); } } |