| Index: lib/src/paper-dropdown-menu/paper-dropdown-menu.html
|
| diff --git a/lib/src/paper-dropdown-menu/paper-dropdown-menu.html b/lib/src/paper-dropdown-menu/paper-dropdown-menu.html
|
| index 092ce11eebfe316eb3659dd99ef1bfa872bbde70..c02d9b5848f578121c40f93a45a03fecc0e9ae23 100644
|
| --- a/lib/src/paper-dropdown-menu/paper-dropdown-menu.html
|
| +++ b/lib/src/paper-dropdown-menu/paper-dropdown-menu.html
|
| @@ -19,8 +19,12 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
| <link rel="import" href="../iron-icons/iron-icons.html">
|
| <link rel="import" href="../iron-icon/iron-icon.html">
|
| <link rel="import" href="../iron-selector/iron-selectable.html">
|
| +<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
|
| +<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
|
|
|
| <!--
|
| +Material design: [Dropdown menus](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)
|
| +
|
| `paper-dropdown-menu` is similar to a native browser select element.
|
| `paper-dropdown-menu` works with selectable content. The currently selected
|
| item is displayed in the control. If no item is selected, the `label` is
|
| @@ -43,6 +47,9 @@ Example:
|
|
|
| This example renders a dropdown menu with 4 options.
|
|
|
| +Similarly to using `iron-select`, `iron-deselect` events will cause the
|
| +current selection of the `paper-dropdown-menu` to be cleared.
|
| +
|
| ### Styling
|
|
|
| The following custom properties and mixins are also available for styling:
|
| @@ -74,6 +81,12 @@ respectively.
|
| text-align: left;
|
| cursor: pointer;
|
|
|
| + /* NOTE(cdata): Both values are needed, since some phones require the
|
| + * value to be `transparent`.
|
| + */
|
| + -webkit-tap-highlight-color: rgba(0,0,0,0);
|
| + -webkit-tap-highlight-color: transparent;
|
| +
|
| --paper-input-container-input: {
|
| overflow: hidden;
|
| white-space: nowrap;
|
| @@ -99,15 +112,17 @@ respectively.
|
| }
|
|
|
| paper-ripple {
|
| - top: 20px;
|
| - left: 8px;
|
| - bottom: 16px;
|
| - right: 8px;
|
| + top: 12px;
|
| + left: 0px;
|
| + bottom: 8px;
|
| + right: 0px;
|
|
|
| @apply(--paper-dropdown-menu-ripple);
|
| }
|
|
|
| paper-menu-button {
|
| + display: block;
|
| + padding: 0;
|
| @apply(--paper-dropdown-menu-button);
|
| }
|
|
|
| @@ -131,10 +146,12 @@ respectively.
|
| disabled="[[disabled]]"
|
| no-animations="[[noAnimations]]"
|
| on-iron-select="_onIronSelect"
|
| + on-iron-deselect="_onIronDeselect"
|
| opened="{{opened}}">
|
| <div class="dropdown-trigger">
|
| <paper-ripple></paper-ripple>
|
| <paper-input
|
| + invalid="[[invalid]]"
|
| readonly
|
| disabled="[[disabled]]"
|
| value="[[selectedItemLabel]]"
|
| @@ -170,7 +187,9 @@ respectively.
|
|
|
| behaviors: [
|
| Polymer.IronControlState,
|
| - Polymer.IronButtonState
|
| + Polymer.IronButtonState,
|
| + Polymer.IronFormElementBehavior,
|
| + Polymer.IronValidatableBehavior
|
| ],
|
|
|
| properties: {
|
| @@ -182,13 +201,15 @@ respectively.
|
| selectedItemLabel: {
|
| type: String,
|
| notify: true,
|
| - computed: '_computeSelectedItemLabel(selectedItem)'
|
| + readOnly: true
|
| },
|
|
|
| /**
|
| * The last selected item. An item is selected if the dropdown menu has
|
| * a child with class `dropdown-content`, and that child triggers an
|
| * `iron-select` event with the selected `item` in the `detail`.
|
| + *
|
| + * @type {?Object}
|
| */
|
| selectedItem: {
|
| type: Object,
|
| @@ -197,6 +218,17 @@ respectively.
|
| },
|
|
|
| /**
|
| + * The value for this element that will be used when submitting in
|
| + * a form. It is read only, and will always have the same value
|
| + * as `selectedItemLabel`.
|
| + */
|
| + value: {
|
| + type: String,
|
| + notify: true,
|
| + readOnly: true
|
| + },
|
| +
|
| + /**
|
| * The label for the dropdown.
|
| */
|
| label: {
|
| @@ -262,6 +294,10 @@ respectively.
|
| 'aria-haspopup': 'true'
|
| },
|
|
|
| + observers: [
|
| + '_selectedItemChanged(selectedItem)'
|
| + ],
|
| +
|
| attached: function() {
|
| // NOTE(cdata): Due to timing, a preselected value in a `IronSelectable`
|
| // child will cause an `iron-select` event to fire while the element is
|
| @@ -304,6 +340,15 @@ respectively.
|
| },
|
|
|
| /**
|
| + * A handler that is called when `iron-deselect` is fired.
|
| + *
|
| + * @param {CustomEvent} event An `iron-deselect` event.
|
| + */
|
| + _onIronDeselect: function(event) {
|
| + this._setSelectedItem(null);
|
| + },
|
| +
|
| + /**
|
| * A handler that is called when the dropdown is tapped.
|
| *
|
| * @param {CustomEvent} event A tap event.
|
| @@ -320,12 +365,16 @@ respectively.
|
| * @param {Element} selectedItem A selected Element item, with an
|
| * optional `label` property.
|
| */
|
| - _computeSelectedItemLabel: function(selectedItem) {
|
| + _selectedItemChanged: function(selectedItem) {
|
| + var value = '';
|
| if (!selectedItem) {
|
| - return '';
|
| + value = '';
|
| + } else {
|
| + value = selectedItem.label || selectedItem.textContent.trim();
|
| }
|
|
|
| - return selectedItem.label || selectedItem.textContent.trim();
|
| + this._setValue(value);
|
| + this._setSelectedItemLabel(value);
|
| },
|
|
|
| /**
|
| @@ -340,9 +389,18 @@ respectively.
|
| // derived from the metrics of elements internal to `paper-input`'s
|
| // template. The metrics will change depending on whether or not the
|
| // input has a floating label.
|
| - return noLabelFloat ? -4 : 16;
|
| + return noLabelFloat ? -4 : 8;
|
| + },
|
| +
|
| + /**
|
| + * Returns false if the element is required and does not have a selection,
|
| + * and true otherwise.
|
| + * @return {Boolean} true if `required` is false, or if `required` is true
|
| + * and the element has a valid selection.
|
| + */
|
| + _getValidity: function() {
|
| + return this.disabled || !this.required || (this.required && this.value);
|
| }
|
| });
|
| })();
|
| </script>
|
| -
|
|
|