Add UiAction to create change from project info page
Change-Id: I2c9f23e644a020bcd30a478fbd3156e94a0c00d5
This commit is contained in:
		
				
					committed by
					
						
						Dave Borowitz
					
				
			
			
				
	
			
			
			
						parent
						
							74b27c6ac4
						
					
				
				
					commit
					0ec2763bc3
				
			@@ -138,4 +138,9 @@ public interface AdminConstants extends Constants {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  String pagedListPrev();
 | 
					  String pagedListPrev();
 | 
				
			||||||
  String pagedListNext();
 | 
					  String pagedListNext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  String buttonCreate();
 | 
				
			||||||
 | 
					  String buttonCreateDescription();
 | 
				
			||||||
 | 
					  String buttonCreateChange();
 | 
				
			||||||
 | 
					  String buttonCreateChangeDescription();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,3 +162,8 @@ sectionTypeSection = Section:
 | 
				
			|||||||
sectionNames = \
 | 
					sectionNames = \
 | 
				
			||||||
  GLOBAL_CAPABILITIES
 | 
					  GLOBAL_CAPABILITIES
 | 
				
			||||||
GLOBAL_CAPABILITIES = Global Capabilities
 | 
					GLOBAL_CAPABILITIES = Global Capabilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					buttonCreate = Create
 | 
				
			||||||
 | 
					buttonCreateDescription = Insert the description of the change.
 | 
				
			||||||
 | 
					buttonCreateChange = Create Change
 | 
				
			||||||
 | 
					buttonCreateChangeDescription = Create change directly in the browser.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					// Copyright (C) 2014 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.Gerrit;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.changes.ChangeApi;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.changes.ChangeInfo;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.rpc.GerritCallback;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.ui.CreateChangeDialog;
 | 
				
			||||||
 | 
					import com.google.gerrit.common.PageLinks;
 | 
				
			||||||
 | 
					import com.google.gerrit.reviewdb.client.Project;
 | 
				
			||||||
 | 
					import com.google.gwt.user.client.ui.Button;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CreateChangeAction {
 | 
				
			||||||
 | 
					  static void call(Button b, final String project) {
 | 
				
			||||||
 | 
					    // TODO Replace CreateChangeDialog with a nicer looking display.
 | 
				
			||||||
 | 
					    b.setEnabled(false);
 | 
				
			||||||
 | 
					    new CreateChangeDialog(b, new Project.NameKey(project)) {
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        sendButton.setText(Util.C.buttonCreate());
 | 
				
			||||||
 | 
					        message.setText(Util.C.buttonCreateDescription());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @Override
 | 
				
			||||||
 | 
					      public void onSend() {
 | 
				
			||||||
 | 
					        ChangeApi.createChange(project, getDestinationBranch(),
 | 
				
			||||||
 | 
					          message.getText(),
 | 
				
			||||||
 | 
					          new GerritCallback<ChangeInfo>() {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void onSuccess(ChangeInfo result) {
 | 
				
			||||||
 | 
					              sent = true;
 | 
				
			||||||
 | 
					              hide();
 | 
				
			||||||
 | 
					              Gerrit.display(PageLinks.toChange(result.legacy_id()));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void onFailure(Throwable caught) {
 | 
				
			||||||
 | 
					              enableButtons(true);
 | 
				
			||||||
 | 
					              super.onFailure(caught);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }.center();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -565,10 +565,27 @@ public class ProjectInfoScreen extends ProjectScreen {
 | 
				
			|||||||
    actionsPanel.setStyleName(Gerrit.RESOURCES.css().projectActions());
 | 
					    actionsPanel.setStyleName(Gerrit.RESOURCES.css().projectActions());
 | 
				
			||||||
    actionsPanel.setVisible(true);
 | 
					    actionsPanel.setVisible(true);
 | 
				
			||||||
    actionsGrid.add(Util.C.headingCommands(), actionsPanel);
 | 
					    actionsGrid.add(Util.C.headingCommands(), actionsPanel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (String id : actions.keySet()) {
 | 
					    for (String id : actions.keySet()) {
 | 
				
			||||||
      actionsPanel.add(new ActionButton(getProjectKey(),
 | 
					      actionsPanel.add(new ActionButton(getProjectKey(),
 | 
				
			||||||
          actions.get(id)));
 | 
					          actions.get(id)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (Gerrit.isSignedIn()) {
 | 
				
			||||||
 | 
					      actionsPanel.add(createChangeAction());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private Button createChangeAction() {
 | 
				
			||||||
 | 
					    final Button createChange = new Button(Util.C.buttonCreateChange());
 | 
				
			||||||
 | 
					    createChange.setTitle(Util.C.buttonCreateChangeDescription());
 | 
				
			||||||
 | 
					    createChange.addClickHandler(new ClickHandler() {
 | 
				
			||||||
 | 
					      @Override
 | 
				
			||||||
 | 
					      public void onClick(ClickEvent event) {
 | 
				
			||||||
 | 
					        CreateChangeAction.call(createChange, getProjectKey().get());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return createChange;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private void doSave() {
 | 
					  private void doSave() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,17 @@ public class ChangeApi {
 | 
				
			|||||||
    call(id, "abandon").post(input, cb);
 | 
					    call(id, "abandon").post(input, cb);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Create a new change. */
 | 
				
			||||||
 | 
					  public static void createChange(String project, String branch,
 | 
				
			||||||
 | 
					      String subject, AsyncCallback<ChangeInfo> cb) {
 | 
				
			||||||
 | 
					    CreateChangeInput input = CreateChangeInput.create();
 | 
				
			||||||
 | 
					    input.project(emptyToNull(project));
 | 
				
			||||||
 | 
					    input.branch(emptyToNull(branch));
 | 
				
			||||||
 | 
					    input.subject(emptyToNull(subject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new RestApi("/changes/").post(input, cb);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** Restore a previously abandoned change to be open again. */
 | 
					  /** Restore a previously abandoned change to be open again. */
 | 
				
			||||||
  public static void restore(int id, String msg, AsyncCallback<ChangeInfo> cb) {
 | 
					  public static void restore(int id, String msg, AsyncCallback<ChangeInfo> cb) {
 | 
				
			||||||
    Input input = Input.create();
 | 
					    Input input = Input.create();
 | 
				
			||||||
@@ -194,6 +205,19 @@ public class ChangeApi {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private static class CreateChangeInput extends JavaScriptObject {
 | 
				
			||||||
 | 
					    static CreateChangeInput create() {
 | 
				
			||||||
 | 
					      return (CreateChangeInput) createObject();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public final native void branch(String b) /*-{ if(b)this.branch=b; }-*/;
 | 
				
			||||||
 | 
					    public final native void project(String p) /*-{ if(p)this.project=p; }-*/;
 | 
				
			||||||
 | 
					    public final native void subject(String s) /*-{ if(s)this.subject=s; }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected CreateChangeInput() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private static class CherryPickInput extends JavaScriptObject {
 | 
					  private static class CherryPickInput extends JavaScriptObject {
 | 
				
			||||||
    static CherryPickInput create() {
 | 
					    static CherryPickInput create() {
 | 
				
			||||||
      return (CherryPickInput) createObject();
 | 
					      return (CherryPickInput) createObject();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					// Copyright (C) 2014 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.ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gerrit.client.Gerrit;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.projects.BranchInfo;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.projects.ProjectApi;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.rpc.GerritCallback;
 | 
				
			||||||
 | 
					import com.google.gerrit.client.rpc.Natives;
 | 
				
			||||||
 | 
					import com.google.gerrit.reviewdb.client.Branch;
 | 
				
			||||||
 | 
					import com.google.gerrit.reviewdb.client.Project;
 | 
				
			||||||
 | 
					import com.google.gwt.core.client.JsArray;
 | 
				
			||||||
 | 
					import com.google.gwt.user.client.ui.FlowPanel;
 | 
				
			||||||
 | 
					import com.google.gwt.user.client.ui.FocusWidget;
 | 
				
			||||||
 | 
					import com.google.gwt.user.client.ui.SuggestBox;
 | 
				
			||||||
 | 
					import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 | 
				
			||||||
 | 
					import com.google.gwtexpui.globalkey.client.GlobalKey;
 | 
				
			||||||
 | 
					import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public abstract class CreateChangeDialog extends ActionDialog {
 | 
				
			||||||
 | 
					  private SuggestBox newChange;
 | 
				
			||||||
 | 
					  private List<BranchInfo> branches;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public CreateChangeDialog(final FocusWidget enableOnFailure, Project.NameKey project) {
 | 
				
			||||||
 | 
					    super(enableOnFailure, true, Util.C.dialogCreateChangeTitle(),
 | 
				
			||||||
 | 
					        Util.C.dialogCreateChangeHeading());
 | 
				
			||||||
 | 
					    ProjectApi.getBranches(project,
 | 
				
			||||||
 | 
					        new GerritCallback<JsArray<BranchInfo>>() {
 | 
				
			||||||
 | 
					          @Override
 | 
				
			||||||
 | 
					          public void onSuccess(JsArray<BranchInfo> result) {
 | 
				
			||||||
 | 
					            branches = Natives.asList(result);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    newChange = new SuggestBox(new HighlightSuggestOracle() {
 | 
				
			||||||
 | 
					      @Override
 | 
				
			||||||
 | 
					      protected void onRequestSuggestions(Request request, Callback done) {
 | 
				
			||||||
 | 
					        List<BranchSuggestion> suggestions = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (BranchInfo b : branches) {
 | 
				
			||||||
 | 
					          if (b.ref().contains(request.getQuery())) {
 | 
				
			||||||
 | 
					            suggestions.add(new BranchSuggestion(b));
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        done.onSuggestionsReady(request, new Response(suggestions));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    newChange.setWidth("100%");
 | 
				
			||||||
 | 
					    newChange.getElement().getStyle().setProperty("boxSizing", "border-box");
 | 
				
			||||||
 | 
					    message.setCharacterWidth(70);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FlowPanel mwrap = new FlowPanel();
 | 
				
			||||||
 | 
					    mwrap.setStyleName(Gerrit.RESOURCES.css().commentedActionMessage());
 | 
				
			||||||
 | 
					    mwrap.add(newChange);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    panel.insert(mwrap, 0);
 | 
				
			||||||
 | 
					    panel.insert(new SmallHeading(Util.C.newChangeBranchSuggestion()), 0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Override
 | 
				
			||||||
 | 
					  public void center() {
 | 
				
			||||||
 | 
					    super.center();
 | 
				
			||||||
 | 
					    GlobalKey.dialog(this);
 | 
				
			||||||
 | 
					    newChange.setFocus(true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public String getDestinationBranch() {
 | 
				
			||||||
 | 
					    return newChange.getText();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  class BranchSuggestion implements Suggestion {
 | 
				
			||||||
 | 
					    private BranchInfo branch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public BranchSuggestion(BranchInfo branch) {
 | 
				
			||||||
 | 
					      this.branch = branch;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String getDisplayString() {
 | 
				
			||||||
 | 
					      if (branch.ref().startsWith(Branch.R_HEADS)) {
 | 
				
			||||||
 | 
					        return branch.ref().substring(Branch.R_HEADS.length());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return branch.ref();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String getReplacementString() {
 | 
				
			||||||
 | 
					      return branch.getShortName();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -25,4 +25,8 @@ public interface UIConstants extends Constants {
 | 
				
			|||||||
  String projectItemHelp();
 | 
					  String projectItemHelp();
 | 
				
			||||||
  String projectStateAbbrev();
 | 
					  String projectStateAbbrev();
 | 
				
			||||||
  String projectStateHelp();
 | 
					  String projectStateHelp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  String dialogCreateChangeTitle();
 | 
				
			||||||
 | 
					  String dialogCreateChangeHeading();
 | 
				
			||||||
 | 
					  String newChangeBranchSuggestion();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,3 +6,7 @@ projectDescription = Project Description
 | 
				
			|||||||
projectItemHelp = project
 | 
					projectItemHelp = project
 | 
				
			||||||
projectStateAbbrev = S
 | 
					projectStateAbbrev = S
 | 
				
			||||||
projectStateHelp = State
 | 
					projectStateHelp = State
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dialogCreateChangeTitle = Create Change
 | 
				
			||||||
 | 
					dialogCreateChangeHeading = Description
 | 
				
			||||||
 | 
					newChangeBranchSuggestion = Select branch for new change
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user