diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchSetPublishDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchSetPublishDetail.java index 70cc10dda6..7a0ada3029 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchSetPublishDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchSetPublishDetail.java @@ -32,6 +32,7 @@ public class PatchSetPublishDetail { protected List drafts; protected Map> allowed; protected Map given; + protected boolean isSubmitAllowed; public Map> getAllowed() { return allowed; @@ -66,6 +67,10 @@ public class PatchSetPublishDetail { this.drafts = drafts; } + public void setSubmitAllowed(boolean allowed) { + isSubmitAllowed = allowed; + } + public AccountInfoCache getAccounts() { return accounts; } @@ -94,4 +99,8 @@ public class PatchSetPublishDetail { public PatchSetApproval getChangeApproval(final ApprovalCategory.Id id) { return given.get(id); } + + public boolean isSubmitAllowed() { + return isSubmitAllowed; + } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java index e79d1a2d42..fed0927ca6 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java @@ -96,6 +96,7 @@ public interface ChangeConstants extends Constants { String buttonReview(); String buttonPublishCommentsSend(); + String buttonPublishSubmitSend(); String buttonPublishCommentsCancel(); String headingCoverMessage(); String headingPatchComments(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties index 7c4c986a15..155d6575e7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties @@ -73,6 +73,7 @@ abandonChangeTitle = Code Review - Abandon Change buttonReview = Review buttonPublishCommentsSend = Publish Comments +buttonPublishSubmitSend = Publish and Submit buttonPublishCommentsCancel = Cancel headingCoverMessage = Cover Message: headingPatchComments = Patch Comments: diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java index 96911198e2..d0d148eb03 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java @@ -25,6 +25,7 @@ import com.google.gerrit.client.ui.PatchLink; import com.google.gerrit.client.ui.SmallHeading; import com.google.gerrit.common.PageLinks; import com.google.gerrit.common.data.ApprovalType; +import com.google.gerrit.common.data.ChangeDetail; import com.google.gerrit.common.data.PatchSetPublishDetail; import com.google.gerrit.reviewdb.ApprovalCategory; import com.google.gerrit.reviewdb.ApprovalCategoryValue; @@ -67,6 +68,7 @@ public class PublishCommentScreen extends AccountScreen implements private NpTextArea message; private FlowPanel draftsPanel; private Button send; + private Button submit; private Button cancel; private boolean saveStateOnUnload = true; private List commentEditors; @@ -103,12 +105,17 @@ public class PublishCommentScreen extends AccountScreen implements body.add(draftsPanel); final FlowPanel buttonRow = new FlowPanel(); + buttonRow.setStyleName(Gerrit.RESOURCES.css().patchSetActions()); body.add(buttonRow); send = new Button(Util.C.buttonPublishCommentsSend()); send.addClickHandler(this); buttonRow.add(send); + submit = new Button(Util.C.buttonPublishSubmitSend()); + submit.addClickHandler(this); + buttonRow.add(submit); + cancel = new Button(Util.C.buttonPublishCommentsCancel()); cancel.addClickHandler(this); buttonRow.add(cancel); @@ -142,7 +149,9 @@ public class PublishCommentScreen extends AccountScreen implements public void onClick(final ClickEvent event) { final Widget sender = (Widget) event.getSource(); if (send == sender) { - onSend(); + onSend(false); + } else if (submit == sender) { + onSend(true); } else if (cancel == sender) { saveStateOnUnload = false; goChange(); @@ -250,6 +259,7 @@ public class PublishCommentScreen extends AccountScreen implements if (r.getChange().getStatus().isOpen()) { initApprovals(r, approvalPanel); } + if (lastState != null && patchSetId.equals(lastState.patchSetId)) { message.setText(lastState.message); } @@ -285,11 +295,13 @@ public class PublishCommentScreen extends AccountScreen implements panel.add(editor); } } + + submit.setVisible(r.isSubmitAllowed()); } - private void onSend() { + private void onSend(final boolean submit) { if (commentEditors.isEmpty()) { - onSend2(); + onSend2(submit); } else { final GerritCallback afterSaveDraft = new GerritCallback() { @@ -298,7 +310,7 @@ public class PublishCommentScreen extends AccountScreen implements @Override public void onSuccess(final VoidResult result) { if (++done == commentEditors.size()) { - onSend2(); + onSend2(submit); } } }; @@ -308,7 +320,7 @@ public class PublishCommentScreen extends AccountScreen implements } } - private void onSend2() { + private void onSend2(final boolean submit) { final Map values = new HashMap(); for (final ValueRadioButton b : approvalButtons) { @@ -321,6 +333,20 @@ public class PublishCommentScreen extends AccountScreen implements new HashSet(values.values()), new GerritCallback() { public void onSuccess(final VoidResult result) { + if(submit) { + submit(); + } else { + saveStateOnUnload = false; + goChange(); + } + } + }); + } + + private void submit() { + Util.MANAGE_SVC.submit(patchSetId, + new GerritCallback() { + public void onSuccess(ChangeDetail result) { saveStateOnUnload = false; goChange(); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetPublishDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetPublishDetailFactory.java index c98d12974f..3d201dbe1d 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetPublishDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetPublishDetailFactory.java @@ -33,6 +33,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountInfoCacheFactory; import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException; +import com.google.gerrit.server.project.CanSubmitResult; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.ProjectCache; @@ -122,6 +123,9 @@ final class PatchSetPublishDetailFactory extends Handler detail.setAllowed(allowed); detail.setGiven(given); + final CanSubmitResult canSubmitResult = control.canSubmit(patchSetId); + detail.setSubmitAllowed(canSubmitResult == CanSubmitResult.OK); + return detail; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java index 1664178c53..0ee2c9ee0e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java @@ -185,11 +185,7 @@ public class ChangeControl { } /** @return {@link CanSubmitResult#OK}, or a result with an error message. */ - public CanSubmitResult canSubmit(final PatchSet.Id patchSetId, final ReviewDb db, - final ApprovalTypes approvalTypes, - FunctionState.Factory functionStateFactory) - throws OrmException { - + public CanSubmitResult canSubmit(final PatchSet.Id patchSetId) { if (change.getStatus().isClosed()) { return new CanSubmitResult("Change " + change.getId() + " is closed"); } @@ -202,6 +198,19 @@ public class ChangeControl { if (!(getCurrentUser() instanceof IdentifiedUser)) { return new CanSubmitResult("User is not signed-in"); } + return CanSubmitResult.OK; + } + + /** @return {@link CanSubmitResult#OK}, or a result with an error message. */ + public CanSubmitResult canSubmit(final PatchSet.Id patchSetId, final ReviewDb db, + final ApprovalTypes approvalTypes, + FunctionState.Factory functionStateFactory) + throws OrmException { + + CanSubmitResult result = canSubmit(patchSetId); + if (result != CanSubmitResult.OK) { + return result; + } final List allApprovals = new ArrayList(db.patchSetApprovals().byPatchSet(