Files
gerrit/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.js
Kasper Nilsson 0c21086732 Remove two-way databinding from patch range select
Two-way databinding was causing some cyclical UI updating, resulting in
an incorrect redirect URL. Instead of binding to the patchNum and
basePatchNum in both directions, the patch-range-select fires an event
when it notices a change in the selected patchsets.

Bug: Issue 7336, Issue 7315, Issue 7316
Change-Id: Ifdf476dcf4fa1353d0b280d7e6dd25e4ef40865a
(cherry picked from commit a7f7f3bf47)
2017-10-03 13:49:39 +00:00

116 lines
2.8 KiB
JavaScript

// 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';
/**
* fired when the selected value of the dropdown changes
*
* @event {change}
*/
const Defs = {};
/**
* Requred values are text and value. mobileText and triggerText will
* fall back to text if not provided.
*
* If bottomText is not provided, nothing will display on the second
* line.
*
* If date is not provided, nothing will be displayed in its place.
*
* @typedef {{
* text: string,
* value: (string|number),
* bottomText: (string|undefined),
* triggerText: (string|undefined),
* mobileText: (string|undefined),
* date: (!Date|undefined),
* }}
*/
Defs.item;
Polymer({
is: 'gr-dropdown-list',
/**
* Fired when the selected value changes
*
* @event value-change
*
* @property {string|number} value
*/
properties: {
/** @type {!Array<!Defs.item>} */
items: Object,
text: String,
value: {
type: String,
notify: true,
},
},
observers: [
'_handleValueChange(value, items)',
],
/**
* Handle a click on the iron-dropdown element.
* @param {!Event} e
*/
_handleDropdownTap(e) {
// async is needed so that that the click event is fired before the
// dropdown closes (This was a bug for touch devices).
this.async(() => {
this.$.dropdown.close();
}, 1);
},
/**
* Handle a click on the button to open the dropdown.
* @param {!Event} e
*/
_showDropdownTapHandler(e) {
this._open();
},
/**
* Open the dropdown.
*/
_open() {
this.$.dropdown.open();
},
_computeMobileText(item) {
return item.mobileText ? item.mobileText : item.text;
},
_handleValueChange(value, items) {
if (!value) { return; }
const selectedObj = items.find(item => {
return item.value + '' === value + '';
});
if (!selectedObj) { return; }
this.text = selectedObj.triggerText? selectedObj.triggerText :
selectedObj.text;
this.dispatchEvent(new CustomEvent('value-change', {
detail: {value},
bubbles: false,
}));
},
});
})();