Add a web interface to configure the comments rule Currently, only the "Block when unresolved comments are present" option is present. Other settings will be added at a later point. Change-Id: I95702d612b9dd45ca801d63dc380ef99e6320821
diff --git a/BUILD b/BUILD index 273cf24..38fcfd6 100644 --- a/BUILD +++ b/BUILD
@@ -1,5 +1,7 @@ -load("//tools/bzl:plugin.bzl", "gerrit_plugin", "PLUGIN_DEPS", "PLUGIN_TEST_DEPS") +load("//tools/bzl:genrule2.bzl", "genrule2") +load("//tools/bzl:js.bzl", "polygerrit_plugin") load("//tools/bzl:junit.bzl", "junit_tests") +load("//tools/bzl:plugin.bzl", "gerrit_plugin", "PLUGIN_DEPS", "PLUGIN_TEST_DEPS") gerrit_plugin( name = "simple-submit-rules", @@ -9,6 +11,7 @@ "Gerrit-Module: com.googlesource.gerrit.plugins.simplesubmitrules.Module", "Gerrit-BatchModule: com.googlesource.gerrit.plugins.simplesubmitrules.BatchModule", ], + resource_jars = [":ssr-static"], resources = glob(["src/main/resources/**/*"]), ) @@ -36,3 +39,24 @@ ":simple-submit-rules__plugin", ], ) + +genrule2( + name = "ssr-static", + srcs = [":ssr"], + outs = ["ssr-static.jar"], + cmd = " && ".join([ + "mkdir $$TMP/static", + "cp -rp $(locations :ssr) $$TMP/static", + "cd $$TMP", + "zip -Drq $$ROOT/$@ -g .", + ]), +) + +polygerrit_plugin( + name = "ssr", + srcs = glob([ + "**/*.html", + "**/*.js", + ]), + app = "plugin.html", +)
diff --git a/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html new file mode 100644 index 0000000..3e1ade1 --- /dev/null +++ b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html
@@ -0,0 +1,49 @@ +<!-- +@license +Copyright (C) 2018 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. +--> + +<dom-module id="gr-simple-submit-rules-repo-config"> + <template> + <style include="shared-styles"></style> + <style include="gr-form-styles"></style> + + <main class="gr-form-styles"> + <h3 id="options">Simple Submit Rules</h3> + + <fieldset id="unresolved_comments"> + <section> + <span class="title">Allow submission with unresolved comments</span> + <span class="value"> + <gr-select id="allowUnresolvedComments" + bind-value="{{_repoConfig.comments.block_if_unresolved_comments}}"> + <select disabled$="[[_readOnly]]"> + <option value="true">Yes</option> + <option value="false">No</option> + </select> + </gr-select> + </span> + </section> + </fieldset> + + <gr-button on-tap="_handleSaveRepoConfig" + disabled$="[[_computeButtonDisabled(_readOnly, _configChanged)]]"> + Save Changes + </gr-button> + + </main> + </template> + <script src="./gr-simple-submit-rules-repo-config.js"></script> +</dom-module>
diff --git a/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.js b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.js new file mode 100644 index 0000000..960d654 --- /dev/null +++ b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.js
@@ -0,0 +1,124 @@ +/** + * @license + * Copyright (C) 2018 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. + */ + +(function () { + 'use strict'; + Polymer({ + is: 'gr-simple-submit-rules-repo-config', + + properties: { + repoName: String, + /** @type {?} */ + _repoConfig: Object, + _configChanged: { + type: Boolean, + value: false, + }, + _readOnly: { + type: Boolean, + value: true, + }, + _pluginRestApi: Object, + }, + + observers: [ + '_handleConfigChanged(_repoConfig.*)', + ], + + attached() { + return this._loadRepo(); + }, + + _isLoading() { + return this._loading || this._loading === undefined; + }, + + _handleConfigChanged() { + if (this._isLoading()) { return; } + this._configChanged = true; + }, + + _computeButtonDisabled(readOnly, configChanged) { + return readOnly || !configChanged; + }, + + _loadRepo() { + this.repoConfig = {}; + if (!this.repoName) { return; } + const promises = []; + + promises.push(this._pluginRestApi().getLoggedIn().then(loggedIn => { + this._loggedIn = loggedIn; + if (loggedIn) { + this._getRepoAccess(this.repoName).then(access => { + if (!access) { return; } + // If the user is not an owner, is_owner is not a property. + this._readOnly = !access[this.repoName].is_owner; + }); + } + })); + + promises.push(this._pluginRestApi().get(this._endpointUrl()) + .then(config => { + if (!config) { return; } + this._repoConfig = config; + this._loading = false; + })); + + return Promise.all(promises); + }, + + _formatRepoConfigForSave(repoConfig) { + return repoConfig; + }, + + _endpointUrl() { + return "projects/" + encodeURIComponent(this.repoName) + "/simple-submit-rules"; + }, + + _handleSaveRepoConfig() { + this._loading = true; + return this._pluginRestApi().put(this._endpointUrl(), this._repoConfig) + .then(config => { + if (!config) { return Promise.resolve(); } + + this.dispatchEvent(new CustomEvent('show-alert', { + detail: { + message: "Simple submit rules: configuration updated." + }, + bubbles: true + })); + + this._repoConfig = config; + this._loading = false; + this._configChanged = false; + }) + }, + + _pluginRestApi() { + if (this._pluginRestApi === undefined) { + this._pluginRestApi = this.plugin.restApi(); + } + return this._pluginRestApi; + }, + + _getRepoAccess(repoName) { + return this._pluginRestApi().get('/access/?project=' + encodeURIComponent(repoName)); + }, + + }); +})();
diff --git a/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html new file mode 100644 index 0000000..4e35e86 --- /dev/null +++ b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html
@@ -0,0 +1,139 @@ +<!DOCTYPE html> +<!-- +@license +Copyright (C) 2016 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. +--> + +<meta name="viewport" + content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> +<title>gr-simple-submit-rules-repo-config</title> + +<script src="../../../polygerrit-ui/app/bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> +<script src="../../../polygerrit-ui/app/bower_components/web-component-tester/browser.js"></script> +<link rel="import" + href="../../../polygerrit-ui/app/test/common-test-setup.html" /> +<!-- TODO(maximeg) find if there is a better way to do this, like .. not in tests --> +<link rel="import" + href="../../../polygerrit-ui/app/elements/shared/gr-select/gr-select.html" /> +<link rel="import" + href="../../../polygerrit-ui/app/styles/shared-styles.html" /> +<link rel="import" + href="../../../polygerrit-ui/app/styles/gr-form-styles.html" /> + +<link rel="import" + href="gr-simple-submit-rules-repo-config.html"> + +<script>void (0);</script> + +<test-fixture id="basic"> + <template> + <gr-simple-submit-rules-repo-config repo-name="test-repo"></gr-simple-submit-rules-repo-config> + </template> +</test-fixture> + +<script> + suite('gr-simple-submit-rules-repo-config tests', () => { + let element; + let sandbox; + let unresolvedCommentsEl; + + setup(() => { + sandbox = sinon.sandbox.create(); + + stub('gr-simple-submit-rules-repo-config', { + _pluginRestApi() { + return { + get(url) { + return Promise.resolve({ + comments: { + block_if_unresolved_comments: false, + }, + }); + }, + getLoggedIn() { return Promise.resolve(true); }, + } + }, + + _getRepoAccess(repoName) { + return Promise.resolve({ + 'test-repo': { + is_owner: true, + }, + }); + }, + + }); + + element = fixture('basic'); + unresolvedCommentsEl = element.$$('#unresolved_comments select'); + return element._loadRepo(); + }); + + teardown(() => { + sandbox.restore(); + }); + + test('unresolved comments option exists', () => { + const unresolvedCommentsEl = element.$$('#unresolved_comments'); + assert.ok(unresolvedCommentsEl); + }); + + test('readOnly disables fields', () => { + element._readOnly = false; + assert.equal(unresolvedCommentsEl.disabled, false); + + element._readOnly = true; + assert.equal(unresolvedCommentsEl.disabled, true); + }); + + test('unresolved comment uses the repoConfig value (false)', done => { + element.set('_repoConfig.comments.block_if_unresolved_comments', false); + + flush(function () { + assert.equal(unresolvedCommentsEl.value, 'false'); + done(); + }); + }); + + test('unresolved comment uses the repoConfig value (true)', done => { + element.set('_repoConfig.comments.block_if_unresolved_comments', true); + + flush(function () { + assert.equal(unresolvedCommentsEl.value, 'true'); + done(); + }); + }); + + test('unresolved comment sets the repoConfig value (true)', done => { + unresolvedCommentsEl.value = 'true'; + element.$$('#allowUnresolvedComments').dispatchEvent(new Event('change')); + + flush(function () { + assert.equal(element._repoConfig.comments.block_if_unresolved_comments, 'true'); + done(); + }); + }); + + test('unresolved comment sets the repoConfig value (false)', done => { + unresolvedCommentsEl.value = 'false'; + element.$$('#allowUnresolvedComments').dispatchEvent(new Event('change')); + + flush(function () { + assert.equal(element._repoConfig.comments.block_if_unresolved_comments, 'false'); + done(); + }); + }); + }); +</script>
diff --git a/plugin.html b/plugin.html new file mode 100644 index 0000000..ab42d17 --- /dev/null +++ b/plugin.html
@@ -0,0 +1,27 @@ +<!-- +@license +Copyright (C) 2018 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. +--> + +<link rel="import" + href="./gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html"> + +<dom-module id="simple-submit-rules"> + <script> + Gerrit.install(plugin => { + plugin.registerCustomComponent('repo-config', 'gr-simple-submit-rules-repo-config'); + }); + </script> +</dom-module>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java b/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java index 5aa4cb0..f8721e6 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java +++ b/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java
@@ -14,7 +14,10 @@ package com.googlesource.gerrit.plugins.simplesubmitrules; +import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.restapi.RestApiModule; +import com.google.gerrit.extensions.webui.JavaScriptPlugin; +import com.google.gerrit.extensions.webui.WebUiPlugin; import com.google.gerrit.server.project.ProjectResource; import com.google.inject.AbstractModule; import com.googlesource.gerrit.plugins.simplesubmitrules.config.ConfigServlet; @@ -33,6 +36,8 @@ put(ProjectResource.PROJECT_KIND, API_ENDPOINT).to(ConfigServlet.class); } }); + + DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin("ssr.html")); install(new BatchModule()); } }
diff --git a/tests.html b/tests.html new file mode 100644 index 0000000..e4dbfc4 --- /dev/null +++ b/tests.html
@@ -0,0 +1,18 @@ +<!doctype html> +<html> + +<head> + <meta charset="utf-8"> + <script src="../../polygerrit-ui/app//bower_components/webcomponentsjs/webcomponents-lite.js"></script> + <script src="../../polygerrit-ui/app/bower_components/web-component-tester/browser.js"></script> +</head> + +<body> + <script> + WCT.loadSuites([ + 'gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html', + ]); + </script> +</body> + +</html>