Merge branch 'stable-2.16' into stable-3.0
* origin/stable-2.16:
PG: autocomplete reviewers
Bazel: Fix standalone build mode
Switch required bazel version to 0.29.1
Change-Id: I269536e99c0f925ac9064a851dc862835f5c4568
diff --git a/.bazelversion b/.bazelversion
index 8862dba..25939d3 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-1.0.0rc2
+0.29.1
diff --git a/WORKSPACE b/WORKSPACE
index 8a2fd3d..3970fd2 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -7,6 +7,32 @@
#local_path = "/home/<user>/projects/bazlets",
)
+# Polymer dependencies
+load(
+ "@com_googlesource_gerrit_bazlets//:gerrit_polymer.bzl",
+ "gerrit_polymer",
+)
+
+gerrit_polymer()
+
+# Load closure compiler with transitive dependencies
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
+
+closure_repositories()
+
+# Load Gerrit npm_binary toolchain
+load("@com_googlesource_gerrit_bazlets//tools:js.bzl", "GERRIT", "npm_binary")
+
+npm_binary(
+ name = "polymer-bundler",
+ repository = GERRIT,
+)
+
+npm_binary(
+ name = "crisper",
+ repository = GERRIT,
+)
+
# Release Plugin API
load(
"@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
diff --git a/rv-reviewers/rv-filter-section.html b/rv-reviewers/rv-filter-section.html
index d4784cc..104ecbd 100644
--- a/rv-reviewers/rv-filter-section.html
+++ b/rv-reviewers/rv-filter-section.html
@@ -77,6 +77,7 @@
<rv-reviewer
reviewer="{{item}}"
can-modify-config="[[canModifyConfig]]"
+ plugin-rest-api="[[pluginRestApi]]"
on-reviewer-deleted="_handleReviewerDeleted"
on-reviewer-added="_handleReviewerAdded">
</rv-reviewer>
diff --git a/rv-reviewers/rv-reviewer.html b/rv-reviewers/rv-reviewer.html
index 3609612..339eff7 100644
--- a/rv-reviewers/rv-reviewer.html
+++ b/rv-reviewers/rv-reviewer.html
@@ -19,24 +19,52 @@
<style include="shared-styles">
#editReviewerInput {
display: block;
+ width: 250px;
}
.reviewerRow {
align-items: center;
display: flex;
}
- #reviewerHeader, #editReviewerInput, #deleteCancelBtn, #addBtn {
+ #reviewerHeader,
+ #editReviewerInput,
+ #deleteCancelBtn,
+ #addBtn,
+ #reviewerField {
margin-left: 3px;
}
+ #reviewerField {
+ width: 250px;
+ text-indent: 1px;
+ border: 1px solid var(--border-color);
+ }
</style>
<style include="gr-form-styles"></style>
<div class="reviewerRow">
<h4 id="reviewerHeader">Reviewer:</h4>
- <input
- id="editReviewerInput"
- bind-value="{{reviewer}}"
- is="iron-input"
- type="text"
- disabled="[[_computeReviewerDisabled(reviewer, _originalReviewer)]]">
+ <template is="dom-if" if="[[_computeEditing(reviewer, _originalReviewer)]]">
+ <span class="value">
+ <!--
+ TODO:
+ Investigate wether we could reuse gr-account-list.
+ If the REST API returns AccountInfo instead of an account
+ identifier String we should be able to use gr-account-list(size=1)
+ for all reviewers, including those who are non-editable
+ (#reviewerField below) and allign the plugin with how accounts
+ are displayed in core Gerrit's UI.
+ -->
+ <gr-autocomplete
+ id="editReviewerInput"
+ text="{{reviewer}}"
+ value="{{_reviewerSearchId}}"
+ query="[[_queryReviewers]]"
+ placeholder="Name Or Email"
+ disabled="[[_computeReviewerDisabled(reviewer, _originalReviewer)]]">
+ </gr-autocomplete>
+ </span>
+ </template>
+ <template is="dom-if" if="[[!_computeEditing(reviewer, _originalReviewer)]]">
+ <td id="reviewerField">[[reviewer]]</td>
+ </template>
<gr-button
id="deleteCancelBtn"
on-tap="_handleDeleteCancel"
diff --git a/rv-reviewers/rv-reviewer.js b/rv-reviewers/rv-reviewer.js
index 9698a22..a8da113 100644
--- a/rv-reviewers/rv-reviewer.js
+++ b/rv-reviewers/rv-reviewer.js
@@ -16,8 +16,16 @@
is: 'rv-reviewer',
properties: {
- reviewer: String,
canModifyConfig: Boolean,
+ pluginRestAPi: Object,
+ reviewer: String,
+ _reviewerSearchId: String,
+ _queryReviewers: {
+ type: Function,
+ value() {
+ return this._getAccountSuggestions.bind(this);
+ },
+ },
_originalReviewer: String,
_deleted: Boolean,
_editing: {
@@ -48,13 +56,50 @@
_computeHideAddButton(reviewer, _originalReviewer) {
return !(this._computeEditing(reviewer, _originalReviewer)
- && this.$.editReviewerInput.value);
+ && this._reviewerSearchId);
},
_computeHideDeleteButton(canModifyConfig) {
return !canModifyConfig;
},
+ _getAccountSuggestions(input) {
+ if (input.length === 0) { return Promise.resolve([]); }
+ return this._getSuggestedAccounts(
+ input).then(accounts => {
+ const accountSuggestions = [];
+ let nameAndEmail;
+ let value;
+ if (!accounts) { return []; }
+ for (const key in accounts) {
+ if (!accounts.hasOwnProperty(key)) { continue; }
+ if (accounts[key].email) {
+ nameAndEmail = accounts[key].name +
+ ' <' + accounts[key].email + '>';
+ } else {
+ nameAndEmail = accounts[key].name;
+ }
+ if (accounts[key].username) {
+ value = accounts[key].username;
+ } else if (accounts[key].email) {
+ value = accounts[key].email;
+ } else {
+ value = accounts[key]._account_id;
+ }
+ accountSuggestions.push({
+ name: nameAndEmail,
+ value,
+ });
+ }
+ return accountSuggestions;
+ });
+ },
+
+ _getSuggestedAccounts(input) {
+ const suggestUrl = `/accounts/?suggest&q=${input}`;
+ return this.pluginRestApi.get(suggestUrl);
+ },
+
_handleDeleteCancel() {
const detail = {editing: this._editing};
if (this._editing) {
@@ -65,7 +110,7 @@
},
_handleAddReviewer() {
- const detail = {reviewer: this.reviewer};
+ const detail = {reviewer: this._reviewerSearchId};
this._originalReviewer = this.reviewer;
this.dispatchEvent(
new CustomEvent('reviewer-added', {detail, bubbles: true}));
diff --git a/tools/bzl/genrule2.bzl b/tools/bzl/genrule2.bzl
new file mode 100644
index 0000000..61c4e18
--- /dev/null
+++ b/tools/bzl/genrule2.bzl
@@ -0,0 +1,3 @@
+load("@com_googlesource_gerrit_bazlets//tools:genrule2.bzl", _genrule2 = "genrule2")
+
+genrule2 = _genrule2
diff --git a/tools/bzl/js.bzl b/tools/bzl/js.bzl
new file mode 100644
index 0000000..0f9e367
--- /dev/null
+++ b/tools/bzl/js.bzl
@@ -0,0 +1,3 @@
+load("@com_googlesource_gerrit_bazlets//tools:js.bzl", _polygerrit_plugin = "polygerrit_plugin")
+
+polygerrit_plugin = _polygerrit_plugin