Merge "Allow diff file picker to not text transform gr-button text"
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
index 5cdb583..b140a6e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
@@ -22,9 +22,11 @@
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.server.project.DashboardsCollection;
import java.util.List;
import org.eclipse.jgit.junit.TestRepository;
@@ -43,20 +45,20 @@
@Test
public void defaultDashboardDoesNotExist() throws Exception {
exception.expect(ResourceNotFoundException.class);
- gApi.projects().name(project.get()).defaultDashboard().get();
+ project().defaultDashboard().get();
}
@Test
public void dashboardDoesNotExist() throws Exception {
exception.expect(ResourceNotFoundException.class);
- gApi.projects().name(project.get()).dashboard("my:dashboard").get();
+ project().dashboard("my:dashboard").get();
}
@Test
public void getDashboard() throws Exception {
assertThat(dashboards()).isEmpty();
DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
- DashboardInfo result = gApi.projects().name(project.get()).dashboard(info.id).get();
+ DashboardInfo result = project().dashboard(info.id).get();
assertThat(result.id).isEqualTo(info.id);
assertThat(result.path).isEqualTo(info.path);
assertThat(result.ref).isEqualTo(info.ref);
@@ -69,9 +71,24 @@
public void setDefaultDashboard() throws Exception {
DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
assertThat(info.isDefault).isNull();
- gApi.projects().name(project.get()).dashboard(info.id).setDefault();
- assertThat(gApi.projects().name(project.get()).dashboard(info.id).get().isDefault).isTrue();
- assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(info.id);
+ project().dashboard(info.id).setDefault();
+ assertThat(project().dashboard(info.id).get().isDefault).isTrue();
+ assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
+ }
+
+ @Test
+ public void setDefaultDashboardByProject() throws Exception {
+ DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
+ assertThat(info.isDefault).isNull();
+ project().defaultDashboard(info.id);
+ assertThat(project().dashboard(info.id).get().isDefault).isTrue();
+ assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
+
+ project().removeDefaultDashboard();
+ assertThat(project().dashboard(info.id).get().isDefault).isNull();
+
+ exception.expect(ResourceNotFoundException.class);
+ project().defaultDashboard().get();
}
@Test
@@ -80,14 +97,14 @@
DashboardInfo d2 = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test2");
assertThat(d1.isDefault).isNull();
assertThat(d2.isDefault).isNull();
- gApi.projects().name(project.get()).dashboard(d1.id).setDefault();
- assertThat(gApi.projects().name(project.get()).dashboard(d1.id).get().isDefault).isTrue();
- assertThat(gApi.projects().name(project.get()).dashboard(d2.id).get().isDefault).isNull();
- assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(d1.id);
- gApi.projects().name(project.get()).dashboard(d2.id).setDefault();
- assertThat(gApi.projects().name(project.get()).defaultDashboard().get().id).isEqualTo(d2.id);
- assertThat(gApi.projects().name(project.get()).dashboard(d1.id).get().isDefault).isNull();
- assertThat(gApi.projects().name(project.get()).dashboard(d2.id).get().isDefault).isTrue();
+ project().dashboard(d1.id).setDefault();
+ assertThat(project().dashboard(d1.id).get().isDefault).isTrue();
+ assertThat(project().dashboard(d2.id).get().isDefault).isNull();
+ assertThat(project().defaultDashboard().get().id).isEqualTo(d1.id);
+ project().dashboard(d2.id).setDefault();
+ assertThat(project().defaultDashboard().get().id).isEqualTo(d2.id);
+ assertThat(project().dashboard(d1.id).get().isDefault).isNull();
+ assertThat(project().dashboard(d2.id).get().isDefault).isTrue();
}
@Test
@@ -95,18 +112,22 @@
DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
exception.expect(BadRequestException.class);
exception.expectMessage("inherited flag can only be used with default");
- gApi.projects().name(project.get()).dashboard(info.id).get(true);
+ project().dashboard(info.id).get(true);
}
private List<DashboardInfo> dashboards() throws Exception {
- return gApi.projects().name(project.get()).dashboards().get();
+ return project().dashboards().get();
+ }
+
+ private ProjectApi project() throws RestApiException {
+ return gApi.projects().name(project.get());
}
private DashboardInfo createDashboard(String ref, String path) throws Exception {
DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path);
String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref);
try {
- gApi.projects().name(project.get()).branch(canonicalRef).create(new BranchInput());
+ project().branch(canonicalRef).create(new BranchInput());
} catch (ResourceConflictException e) {
// The branch already exists if this method has already been called once.
if (!e.getMessage().contains("already exists")) {
@@ -124,7 +145,7 @@
+ "query = is:open";
cb.add(info.path, content);
RevCommit c = cb.create();
- gApi.projects().name(project.get()).commit(c.name());
+ project().commit(c.name());
}
return info;
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
index 3379edc..8320ef7 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
@@ -154,6 +154,16 @@
*/
DashboardApi defaultDashboard() throws RestApiException;
+ /**
+ * Set the project's default dashboard.
+ *
+ * @param name the dashboard to set as default.
+ */
+ void defaultDashboard(String name) throws RestApiException;
+
+ /** Remove the project's default dashboard. */
+ void removeDefaultDashboard() throws RestApiException;
+
abstract class ListDashboardsRequest {
public abstract List<DashboardInfo> get() throws RestApiException;
}
@@ -284,5 +294,15 @@
public ListDashboardsRequest dashboards() throws RestApiException {
throw new NotImplementedException();
}
+
+ @Override
+ public void defaultDashboard(String name) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void removeDefaultDashboard() throws RestApiException {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
index f0a6009..0d4afd6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
@@ -16,6 +16,7 @@
import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.api.projects.DashboardApi;
import com.google.gerrit.extensions.api.projects.DashboardInfo;
import com.google.gerrit.extensions.common.SetDashboardInput;
@@ -51,7 +52,7 @@
Provider<GetDashboard> get,
SetDashboard set,
@Assisted ProjectResource project,
- @Assisted String id) {
+ @Assisted @Nullable String id) {
this.dashboards = dashboards;
this.get = get;
this.set = set;
@@ -80,7 +81,8 @@
try {
set.apply(DashboardResource.projectDefault(project.getControl()), input);
} catch (Exception e) {
- throw asRestApiException("Cannot set default dashboard", e);
+ String msg = String.format("Cannot %s default dashboard", id != null ? "set" : "remove");
+ throw asRestApiException(msg, e);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
index 89c92d0..9fd4d48 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
@@ -486,6 +486,24 @@
}
@Override
+ public void defaultDashboard(String name) throws RestApiException {
+ try {
+ dashboardApi.create(checkExists(), name).setDefault();
+ } catch (Exception e) {
+ throw asRestApiException("Cannot set default dashboard", e);
+ }
+ }
+
+ @Override
+ public void removeDefaultDashboard() throws RestApiException {
+ try {
+ dashboardApi.create(checkExists(), null).setDefault();
+ } catch (Exception e) {
+ throw asRestApiException("Cannot remove default dashboard", e);
+ }
+ }
+
+ @Override
public ListDashboardsRequest dashboards() throws RestApiException {
return new ListDashboardsRequest() {
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index db90199..f360734 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -219,11 +219,6 @@
return Capable.OK;
}
- /** Does this user have ownership on at least one reference name? */
- public boolean isOwnerAnyRef() {
- return canPerformOnAnyRef(Permission.OWNER) || isAdmin();
- }
-
/** Can the user run upload pack? */
private boolean canRunUploadPack() {
for (AccountGroup.UUID group : uploadGroups) {
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index f6966683..e4eea51 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -200,13 +200,6 @@
.showOnEdit {
display: none;
}
- .patchInfo {
- border: 1px solid #ddd;
- margin: 1em var(--default-horizontal-margin);
- }
- #fileList {
- padding: 0 calc(var(--default-horizontal-margin) / 2) .5em;
- }
.scrollable {
overflow: auto;
}
@@ -226,6 +219,9 @@
min-width: 0;
}
}
+ .patchInfo {
+ margin-top: 1em;
+ }
/* NOTE: If you update this breakpoint, also update the
BREAKPOINT_RELATED_SMALL in the JS */
@media screen and (max-width: 50em) {
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
index b9c1328..2befcb2 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
@@ -44,8 +44,9 @@
display: initial;
}
.patchInfo-header {
- background-color: #f6f6f6;
- border-bottom: 1px solid #ebebeb;
+ background-color: #fafafa;
+ border-bottom: 1px solid #ddd;
+ border-top: 1px solid #ddd;
display: flex;
height: 3.2em;
padding: 0 calc(var(--default-horizontal-margin) / 2);
@@ -56,9 +57,16 @@
margin: 0 .25em;
width: 100%;
}
+ .patchInfo-left {
+ align-items: center;
+ display: flex;
+ }
.latestPatchContainer {
display: none;
}
+ .latestPatchContainer a {
+ text-decoration: none;
+ }
gr-editable-label.descriptionLabel {
max-width: 100%;
}
@@ -79,6 +87,13 @@
.editLoaded .showOnEdit {
display: initial;
}
+ .patchInfo-header-wrapper .container {
+ align-items: center;
+ display: flex;
+ }
+ #modeSelect {
+ margin-left: .1em;
+ }
.fileList-header {
align-items: center;
display: flex;
@@ -95,7 +110,13 @@
justify-content: flex-end;
}
.separator {
- margin: 0 .25em;
+ background-color: rgba(0, 0, 0, .3);
+ height: 1.5em;
+ margin: 0 .4em;
+ width: 1px;
+ }
+ .separator.transparent {
+ background-color: transparent;
}
.expandInline {
padding-right: .25em;
@@ -118,7 +139,7 @@
</style>
<div class$="patchInfo-header [[_computeEditLoadedClass(editLoaded)]] [[_computePatchInfoClass(patchNum, allPatchSets)]]">
<div class="patchInfo-header-wrapper">
- <div>
+ <div class="patchInfo-left">
<span class="label">Files</span>
<gr-patch-range-select
id="rangeSelect"
@@ -130,23 +151,23 @@
revisions="[[change.revisions]]"
on-patch-range-change="_handlePatchChange">
</gr-patch-range-select>
- /
+ <span class="separator"></span>
<gr-commit-info
change="[[change]]"
server-config="[[serverConfig]]"
commit-info="[[commitInfo]]"></gr-commit-info>
- <span class="latestPatchContainer">
- /
+ <span class="container latestPatchContainer">
+ <span class="separator"></span>
<a href$="[[changeUrl]]">Go to latest patch set</a>
</span>
- <span class="downloadContainer desktop">
- /
+ <span class="container downloadContainer desktop">
+ <span class="separator"></span>
<gr-button link
class="download"
on-tap="_handleDownloadTap">Download</gr-button>
</span>
- <span class="descriptionContainer hideOnEdit">
- /
+ <span class="container descriptionContainer hideOnEdit">
+ <span class="separator"></span>
<gr-editable-label
id="descriptionLabel"
class="descriptionLabel"
@@ -176,7 +197,7 @@
id="expandBtn"
link
on-tap="_expandAllDiffs">Show diffs</gr-button>
- <span class="separator">/</span>
+ <span class="separator"></span>
<gr-button
id="collapseBtn"
link
@@ -188,7 +209,7 @@
Bulk actions disabled because there are too many files.
</div>
</template>
- <span class="separator">/</span>
+ <span class="separator"></span>
<gr-select
id="modeSelect"
bind-value="{{diffViewMode}}">
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index c450fee..1a164b6 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -39,10 +39,10 @@
}
.row {
align-items: center;
- border-top: 1px solid #eee;
+ border-top: 1px solid #ddd;
display: flex;
height: 2.25em;
- padding: 0 .25em;
+ padding: 0 calc(var(--default-horizontal-margin) / 2 + .25em);
}
:host(.loading) .row {
opacity: .5;
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.html b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
index c0e55ef..845bdaf 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
@@ -28,7 +28,7 @@
<template>
<style include="shared-styles">
:host {
- border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
display: block;
position: relative;
cursor: pointer;
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
index 2eed88b..b2beb47 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
@@ -28,9 +28,13 @@
display: block;
}
.header {
+ align-items: center;
+ background-color: #fafafa;
+ border-bottom: 1px solid #ddd;
+ border-top: 1px solid #ddd;
display: flex;
+ height: 3.2em;
justify-content: space-between;
- margin-bottom: .35em;
}
.header,
#messageControlsContainer {
@@ -45,25 +49,40 @@
}
#messageControlsContainer {
align-items: center;
- background-color: #fef;
+ border-bottom: 1px solid #ddd;
display: flex;
+ height: 2.25em;
justify-content: center;
}
#messageControlsContainer gr-button {
- padding: 0.4em;
+ padding: 0.4em 0;
+ }
+ .separator {
+ background-color: rgba(0, 0, 0, .3);
+ height: 1.5em;
+ margin: 0 .4em;
+ width: 1px;
+ }
+ .separator.transparent {
+ background-color: transparent;
+ }
+ .container {
+ align-items: center;
+ display: flex;
}
</style>
<div class="header">
<h3>Messages</h3>
- <div class="messageListControls">
+ <div class="messageListControls container">
<gr-button id="collapse-messages" link
on-tap="_handleExpandCollapseTap">
[[_computeExpandCollapseMessage(_expanded)]]
</gr-button>
<span
id="automatedMessageToggleContainer"
+ class="container"
hidden$="[[!_hasAutomatedMessages(messages)]]">
- /
+ <span class="transparent separator"></span>
<gr-button id="automatedMessageToggle" link
on-tap="_handleAutomatedMessageToggleTap">
[[_computeAutomatedToggleText(_hideAutomated)]]
@@ -78,8 +97,9 @@
[[_computeNumMessagesText(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]
</gr-button>
<span
+ class="container"
hidden$="[[_computeIncrementHidden(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]">
- /
+ <span class="transparent separator"></span>
<gr-button id="incrementMessagesBtn" link
on-tap="_handleIncrementShownMessages">
[[_computeIncrementText(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
index 4f90502..08e6c2c 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
@@ -30,6 +30,9 @@
select {
max-width: 15em;
}
+ .arrow {
+ margin: 0 .5em;
+ }
@media screen and (max-width: 50em) {
.filesWeblinks {
display: none;
@@ -49,7 +52,7 @@
href$="[[weblink.url]]">[[weblink.name]]</a>
</template>
</span>
- →
+ <span class="arrow">→</span>
<span class="patchRange">
<gr-dropdown-list
id="patchNumDropdown"
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
index 6f37981..c0b17af 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
@@ -60,6 +60,10 @@
background-color: var(--color-link);
color: #fff;
}
+ :host([primary][disabled]) paper-button[raised],
+ :host([disabled]) paper-button {
+ opacity: .5;
+ }
:host([link]) paper-button:hover,
:host([link]) paper-button:focus,
paper-button[raised]:hover,
@@ -91,14 +95,15 @@
}
:host:not([down-arrow]) .downArrow {display: none; }
:host([down-arrow]) .downArrow {
+ border-top: .36em solid var(--gr-button-arrow-color, #ccc);
border-left: .36em solid transparent;
border-right: .36em solid transparent;
- border-top: .36em solid #ccc;
+ margin-bottom: .05em;
margin-left: .5em;
transition: border-top-color 200ms;
}
- :host([down-arrow]):hover .downArrow {
- border-top-color: #666;
+ :host([down-arrow]) paper-button:hover .downArrow {
+ border-top-color: var(--gr-button-arrow-hover-color, #666);
}
:host([loading]) paper-button,
:host([disabled]) paper-button {
@@ -111,7 +116,7 @@
color: #aaa;
}
</style>
- <paper-button raised="[[!link]]">
+ <paper-button raised="[[!link]]" disabled="[[disabled]]">
<content></content>
<i class="downArrow"></i>
</paper-button>
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
index 8a3de33..91c2def 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
@@ -37,12 +37,6 @@
-webkit-user-select: text;
user-select: text;
}
- .downArrow {
- display: inline-block;
- font-size: .6em;
- user-select: none;
- vertical-align: middle;
- }
.dropdown-trigger {
cursor: pointer;
padding: 0;
@@ -52,7 +46,8 @@
box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
max-height: 70vh;
margin-top: 1.5em;
- width: 266px;
+ min-width: 266px;
+ max-width: 300px;
}
paper-listbox {
--paper-listbox: {
@@ -77,14 +72,15 @@
background-color: #f2f2f2;
}
}
+ gr-button {
+ --gr-button-arrow-color: var(--color-link);
+ --gr-button-arrow-hover-color: var(--color-link-hover);
+ }
paper-item:not(:last-of-type) {
border-bottom: 1px solid #ddd;
}
#trigger {
- color: black;
- font: inherit;
padding: .3em 0;
- text-decoration: none;
}
.bottomContent {
color: rgba(0,0,0,.54);
@@ -130,15 +126,13 @@
}
</style>
<gr-button
+ down-arrow
link
id="trigger"
class="dropdown-trigger"
on-tap="_showDropdownTapHandler"
slot="dropdown-trigger">
<span>[[text]]</span>
- <span
- class="downArrow"
- on-tap="_showDropdownTapHandler">▼</span>
</gr-button>
<iron-dropdown
id="dropdown"