blob: 547e81faee3af6c9b91ebf53089748d9eacf387a [file] [log] [blame]
// 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;
}
}
}