| // Copyright (C) 2008 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. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| 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.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.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.CheckBox; |
| 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; |
| |
| public class ProjectAccessScreen extends ProjectScreen { |
| private Panel parentPanel; |
| private Hyperlink parentName; |
| |
| private RightsTable rights; |
| private Button delRight; |
| private AccessRightEditor rightEditor; |
| |
| public ProjectAccessScreen(final Project.NameKey toShow) { |
| super(toShow); |
| } |
| |
| @Override |
| protected void onInitUI() { |
| super.onInitUI(); |
| initParent(); |
| initRights(); |
| } |
| |
| @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); |
| } |
| }); |
| } |
| |
| private void enableForm(final boolean on) { |
| delRight.setEnabled(on); |
| rightEditor.enableForm(on); |
| } |
| |
| private void initParent() { |
| parentPanel = new VerticalPanel(); |
| parentPanel.add(new SmallHeading(Util.C.headingParentProjectName())); |
| |
| parentName = new Hyperlink("", ""); |
| parentPanel.add(parentName); |
| add(parentPanel); |
| } |
| |
| private void initRights() { |
| rights = new RightsTable(); |
| |
| 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); |
| } |
| }); |
| |
| rightEditor = new AccessRightEditor(getProjectKey()); |
| rightEditor.addValueChangeHandler(new ValueChangeHandler<ProjectDetail>() { |
| @Override |
| public void onValueChange(ValueChangeEvent<ProjectDetail> event) { |
| display(event.getValue()); |
| } |
| }); |
| |
| add(new SmallHeading(Util.C.headingAccessRights())); |
| add(rights); |
| add(delRight); |
| add(rightEditor); |
| } |
| |
| void display(final ProjectDetail result) { |
| final Project project = result.project; |
| |
| final Project.NameKey wildKey = Gerrit.getConfig().getWildProject(); |
| final boolean isWild = wildKey.equals(project.getNameKey()); |
| Project.NameKey parent = project.getParent(); |
| if (parent == null) { |
| parent = wildKey; |
| } |
| |
| parentPanel.setVisible(!isWild); |
| parentName.setTargetHistoryToken(Dispatcher.toProjectAdmin(parent, ACCESS)); |
| parentName.setText(parent.get()); |
| |
| rights.display(result.groups, result.rights); |
| |
| rightEditor.setVisible(result.canModifyAccess); |
| delRight.setVisible(rights.getCanDelete()); |
| } |
| |
| 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); |
| } |
| }); |
| } |
| } |
| |
| private class RightsTable extends FancyFlexTable<RefRight> { |
| 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); |
| if (r != null && table.getWidget(row, 1) instanceof CheckBox |
| && ((CheckBox) table.getWidget(row, 1)).getValue()) { |
| refRightIds.add(r.getKey()); |
| } |
| } |
| return refRightIds; |
| } |
| |
| void display(final Map<AccountGroup.Id, AccountGroup> grps, |
| final List<InheritedRefRight> refRights) { |
| groups = grps; |
| canDelete = false; |
| |
| while (1 < table.getRowCount()) |
| table.removeRow(table.getRowCount() - 1); |
| |
| for (final InheritedRefRight r : refRights) { |
| final int row = table.getRowCount(); |
| table.insertRow(row); |
| applyDataRowStyle(row); |
| populate(row, r); |
| } |
| } |
| protected void onOpenRow(final int row) { |
| if (row > 0) { |
| RefRight right = getRowItem(row); |
| rightEditor.load(right, groups.get(right.getAccountGroupId())); |
| } |
| } |
| |
| 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, right); |
| } |
| |
| 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()); |
| } |
| } |
| |
| private boolean getCanDelete() { |
| return canDelete; |
| } |
| } |
| } |