Introduce gr-tooltip-content element and add for draft comment This change introduces an element that can wrap a tooltip around arbitrary contents. Previously, we could only attach a tooltip to a Polymer element, and want more granularity than that for the purposes of positioning. The new tooltip element takes the following arguments: - title (the contents of the tooltip, required) - showIcon (optional, to show an info icon) - maxWidth (optional, to pass a max-width to the tooltip itself). The tooltip itself will be attached to the content inside of the <gr-tooltip-content> wrapper. One tooltip has been added using this new element for the 'DRAFT' text in the gr-diff-comment'. Bug: Issue 4539 Change-Id: Iff05c785052c643ef1f1cc01d101b21c48c6299f
diff --git a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js index da75236..e4c4d11 100644 --- a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js +++ b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js
@@ -63,6 +63,7 @@ var tooltip = document.createElement('gr-tooltip'); tooltip.text = this._titleText; + tooltip.maxWidth = this.getAttribute('max-width'); // Set visibility to hidden before appending to the DOM so that // calculations can be made based on the element’s size.
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html index 749ca12..4c00132 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html +++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
@@ -21,6 +21,8 @@ <link rel="import" href="../../shared/gr-formatted-text/gr-formatted-text.html"> <link rel="import" href="../../shared/gr-storage/gr-storage.html"> <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html"> +<link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html"> + <dom-module id="gr-diff-comment"> <template> @@ -183,7 +185,13 @@ <div class="header" id="header" on-click="_handleToggleCollapsed"> <div class="headerLeft"> <span class="authorName">[[comment.author.name]]</span> - <span class="draftLabel">DRAFT</span> + <gr-tooltip-content class="draftLabel" + has-tooltip + title="This draft is only visible to you. To publish drafts, click the red 'Reply' button at the top of the change or press the 'A' key." + max-width="20em" + show-icon> + DRAFT + </gr-tooltip-content> </div> <div class="headerMiddle"> <span class="collapsedContent">[[comment.message]]</span>
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html new file mode 100644 index 0000000..81e65e3 --- /dev/null +++ b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html
@@ -0,0 +1,26 @@ +<!-- +Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html"> +<link rel="import" href="../../../behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html"> + +<dom-module id="gr-tooltip-content"> + <template> + <content></content> + <span class="arrow" hidden$="[[!showIcon]]">ⓘ</span> + </template> + <script src="gr-tooltip-content.js"></script> +</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js new file mode 100644 index 0000000..26e1e2c --- /dev/null +++ b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js
@@ -0,0 +1,39 @@ +// Copyright (C) 2017 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-tooltip-content', + + properties: { + title: { + type: String, + reflectToAttribute: true, + }, + maxWidth: { + type: String, + reflectToAttribute: true, + }, + showIcon: { + type: Boolean, + value: false, + }, + }, + + behaviors: [ + Gerrit.TooltipBehavior, + ], + }); +})();
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html new file mode 100644 index 0000000..7925c91 --- /dev/null +++ b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<!-- +Copyright (C) 2017 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-storage</title> + +<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script> +<script src="../../../bower_components/web-component-tester/browser.js"></script> + +<link rel="import" href="gr-tooltip-content.html"> + +<test-fixture id="basic"> + <template> + <gr-tooltip-content> + </gr-tooltip-content> + </template> +</test-fixture> + +<script> + suite('gr-tooltip-content tests', function() { + var element; + setup(function() { + element = fixture('basic'); + }); + + test('icon is not visible by default', function() { + assert.equal(Polymer.dom(element.root) + .querySelector('.arrow').hidden, true); + }); + + test('icon is visible with showIcon property', function() { + element.showIcon = true; + assert.equal(Polymer.dom(element.root) + .querySelector('.arrow').hidden, false); + }); + }); +</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html index 57a7272..2af9c86 100644 --- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html +++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
@@ -30,6 +30,7 @@ padding: .5em .85em; position: absolute; z-index: 1000; + max-width: var(--tooltip-max-width); } .arrow { border-left: var(--gr-tooltip-arrow-size) solid transparent;
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js index 76372ba..4a5f631 100644 --- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js +++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js
@@ -19,6 +19,15 @@ properties: { text: String, + maxWidth: { + type: String, + observer: '_updateWidth', + }, + }, + + _updateWidth: function(maxWidth) { + this.customStyle['--tooltip-max-width'] = maxWidth; + this.updateStyles(); }, }); })();
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html new file mode 100644 index 0000000..9e46aa7 --- /dev/null +++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<!-- +Copyright (C) 2017 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-storage</title> + +<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script> +<script src="../../../bower_components/web-component-tester/browser.js"></script> + +<link rel="import" href="gr-tooltip.html"> + +<test-fixture id="basic"> + <template> + <gr-tooltip> + </gr-tooltip> + </template> +</test-fixture> + +<script> + suite('gr-tooltip tests', function() { + var element; + setup(function() { + element = fixture('basic'); + }); + + test('max-width is respected if set', function() { + element.text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit' + + ', sed do eiusmod tempor incididunt ut labore et dolore magna aliqua'; + element.maxWidth = '50px'; + assert.equal(getComputedStyle(element).width, '50px'); + }); + }); +</script>
diff --git a/polygerrit-ui/app/test/index.html b/polygerrit-ui/app/test/index.html index 37f3e3a..a593c8d 100644 --- a/polygerrit-ui/app/test/index.html +++ b/polygerrit-ui/app/test/index.html
@@ -103,6 +103,8 @@ 'shared/gr-rest-api-interface/gr-reviewer-updates-parser_test.html', 'shared/gr-select/gr-select_test.html', 'shared/gr-storage/gr-storage_test.html', + 'shared/gr-tooltip/gr-tooltip_test.html', + 'shared/gr-tooltip-content/gr-tooltip-content_test.html', ].forEach(function(file) { file = elementsPath + file; testFiles.push(file);