Commit e4c61a66 authored by stevenjb's avatar stevenjb Committed by Commit bot

MD Settings: Intenet: Fix network list

This CL:
* Fixes animation when using dom-if + iron-collapse.
* Uses CrScrollableBehavior to get keyboard focus and top/botom
  separators.

BUG=609156
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:closure_compilation

Review-Url: https://codereview.chromium.org/2260613003
Cr-Commit-Position: refs/heads/master@{#413465}
parent b80a3452
<link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-toggle-button/paper-toggle-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-toggle-button/paper-toggle-button.html">
...@@ -18,7 +19,6 @@ ...@@ -18,7 +19,6 @@
.button-row { .button-row {
align-items: center; align-items: center;
border-top: var(--settings-separator-line);
display: flex; display: flex;
min-height: var(--settings-row-min-height); min-height: var(--settings-row-min-height);
} }
...@@ -60,18 +60,21 @@ ...@@ -60,18 +60,21 @@
</div> </div>
</div> </div>
</div> </div>
<template is="dom-if" if="[[expanded]]"> <template is="dom-if" if="[[networksDomIfIsTrue_(expanded, wasExpanded)]]">
<div class="list-frame"> <iron-collapse
<cr-network-list id="networkList" max-height="[[maxHeight]]" opened="[[networksIronCollapseIsOpened_(expanded, wasExpanded)]]">
networks="[[networkStateList]]" opened="{{expanded}}" show-buttons> <div class="list-frame">
</cr-network-list> <cr-network-list id="networkList" max-height="[[maxHeight]]"
<template is="dom-if" networks="[[networkStateList]]" show-buttons>
if="[[knownNetworksIsVisible_(activeNetworkState)]]"> </cr-network-list>
<div class="button-row" actionable on-tap="onKnownNetworksTap_"> <template is="dom-if"
<a is="action-link">$i18n{knownNetworksButton}</a> if="[[knownNetworksIsVisible_(activeNetworkState)]]">
</div> <div class="button-row" actionable on-tap="onKnownNetworksTap_">
</template> <a is="action-link">$i18n{knownNetworksButton}</a>
</div> </div>
</template>
</div>
</iron-collapse>
</template> </template>
</template> </template>
<script src="network_summary_item.js"></script> <script src="network_summary_item.js"></script>
......
...@@ -14,15 +14,22 @@ Polymer({ ...@@ -14,15 +14,22 @@ Polymer({
is: 'network-summary-item', is: 'network-summary-item',
properties: { properties: {
/** /** The expanded state of the list of networks. */
* True if the list is expanded.
*/
expanded: { expanded: {
type: Boolean, type: Boolean,
value: false, value: false,
observer: 'expandedChanged_', observer: 'expandedChanged_',
}, },
/**
* Whether the list has been expanded. This is used to ensure the
* iron-collapse section animates correctly.
*/
wasExpanded: {
type: Boolean,
value: false,
},
/** /**
* The maximum height in pixels for the list of networks. * The maximum height in pixels for the list of networks.
*/ */
...@@ -100,6 +107,33 @@ Polymer({ ...@@ -100,6 +107,33 @@ Polymer({
return !!deviceState && deviceState.State == 'Enabled'; return !!deviceState && deviceState.State == 'Enabled';
}, },
/**
* @return {boolean} Whether the dom-if for the network list should be true.
* The logic here is designed to allow the enclosed content to be stamped
* before it is expanded.
* @private
*/
networksDomIfIsTrue_() {
if (this.expanded == this.wasExpanded)
return this.expanded;
if (this.expanded) {
Polymer.RenderStatus.afterNextRender(this, function() {
this.wasExpanded = true;
}.bind(this));
return true;
}
return this.wasExpanded;
},
/**
* @return {boolean} Whether the iron-collapse for the network list should
* be opened.
* @private
*/
networksIronCollapseIsOpened_() {
return this.expanded && this.wasExpanded;
},
/** /**
* @param {DeviceStateProperties} deviceState * @param {DeviceStateProperties} deviceState
* @return {boolean} * @return {boolean}
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
{ {
'target_name': 'cr_network_list', 'target_name': 'cr_network_list',
'dependencies': [ 'dependencies': [
'<(DEPTH)/ui/webui/resources/cr_elements/compiled_resources2.gyp:cr_scrollable_behavior',
'cr_network_list_types', 'cr_network_list_types',
'cr_onc_types', 'cr_onc_types',
], ],
......
<link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html">
<link rel="import" href="chrome://resources/cr_elements/network/cr_network_list_item.html"> <link rel="import" href="chrome://resources/cr_elements/network/cr_network_list_item.html">
<link rel="import" href="chrome://resources/cr_elements/network/cr_onc_types.html"> <link rel="import" href="chrome://resources/cr_elements/network/cr_onc_types.html">
...@@ -16,16 +17,18 @@ ...@@ -16,16 +17,18 @@
border-top: var(--cr-separator-line); border-top: var(--cr-separator-line);
} }
</style> </style>
<iron-collapse opened="{{opened}}"> <div id="container" class="layout vertical" scrollable>
<div id="container" class="layout vertical flex"> <iron-list items="[[getItems_(networks, customItems)]]"
<template is="dom-repeat" items="[[getItems_(networks, customItems)]]"> scroll-target="container" selection-enabled
selected-item="{{selectedItem}}">
<template>
<cr-network-list-item item="[[item]]" is-list-item <cr-network-list-item item="[[item]]" is-list-item
on-tap="onTap_" show-buttons="[[showButtons]]" show-buttons="[[showButtons]]" tabindex$="[[tabIndex]]"
show-separator$="[[showSeparators]]"> show-separator$="[[showSeparators]]">
</cr-network-list-item> </cr-network-list-item>
</template> </template>
</div> </iron-list>
</iron-collapse> </div>
</template> </template>
<script src="cr_network_list.js"></script> <script src="cr_network_list.js"></script>
</dom-module> </dom-module>
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
/** /**
* Polymer class definition for 'cr-network-list'. * Polymer class definition for 'cr-network-list'.
* TODO(stevenjb): Update with iron-list(?) once implemented in Polymer 1.0.
*/ */
Polymer({ Polymer({
is: 'cr-network-list', is: 'cr-network-list',
...@@ -45,12 +44,6 @@ Polymer({ ...@@ -45,12 +44,6 @@ Polymer({
} }
}, },
/** True if the list is opened. */
opened: {
type: Boolean,
value: true,
},
/** True if action buttons should be shown for the itmes. */ /** True if action buttons should be shown for the itmes. */
showButtons: { showButtons: {
type: Boolean, type: Boolean,
...@@ -64,8 +57,19 @@ Polymer({ ...@@ -64,8 +57,19 @@ Polymer({
value: false, value: false,
reflectToAttribute: true, reflectToAttribute: true,
}, },
/**
* Reflects the iron-list selecteditem property.
* @type {!CrNetworkList.CrNetworkListItemType}
*/
selectedItem: {
type: Object,
observer: 'selectedItemChanged_',
}
}, },
behaviors: [CrScrollableBehavior],
/** @private */ /** @private */
maxHeightChanged_: function() { maxHeightChanged_: function() {
this.$.container.style.maxHeight = this.maxHeight + 'px'; this.$.container.style.maxHeight = this.maxHeight + 'px';
...@@ -85,15 +89,23 @@ Polymer({ ...@@ -85,15 +89,23 @@ Polymer({
}, },
/** /**
* Event triggered when a list item is tapped. * Use iron-list selection (which is not the same as focus) to trigger
* @param {!{model: {item: !CrNetworkList.CrNetworkListItemType}}} event * tap (requires selection-enabled) or keyboard selection.
* @private
*/
selectedItemChanged_: function() {
if (this.selectedItem)
this.onItemAction_(this.selectedItem);
},
/**
* @param {!CrNetworkList.CrNetworkListItemType} item
* @private * @private
*/ */
onTap_: function(event) { onItemAction_: function(item) {
let item = event.model.item;
if (item.hasOwnProperty('customItemName')) if (item.hasOwnProperty('customItemName'))
this.fire('custom-item-selected', event.model.item); this.fire('custom-item-selected', item);
else else
this.fire('selected', event.model.item); this.fire('selected', item);
}, },
}); });
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
<style include="cr-shared-style"> <style include="cr-shared-style">
:host { :host {
display: inline-block; display: inline-block;
outline: none;
} }
#divButtons { #divButtons {
...@@ -105,7 +106,8 @@ ...@@ -105,7 +106,8 @@
<template is="dom-if" <template is="dom-if"
if="[[isSettingsButtonVisible_(networkState, showButtons)]]"> if="[[isSettingsButtonVisible_(networkState, showButtons)]]">
<div id="divButtons"> <div id="divButtons">
<paper-icon-button icon="cr:settings" on-tap="fireShowDetails_"> <paper-icon-button icon="cr:settings" on-tap="fireShowDetails_"
tabindex$="[[tabindex]]">
</paper-icon-button> </paper-icon-button>
</div> </div>
</template> </template>
......
...@@ -44,6 +44,17 @@ Polymer({ ...@@ -44,6 +44,17 @@ Polymer({
type: Boolean, type: Boolean,
reflectToAttribute: true, reflectToAttribute: true,
}, },
/**
* Reflect the element's tabindex attribute to a property so that embedded
* elements (e.g. the settings button) can become keyboard focusable when
* this element has keyboard focus.
*/
tabindex: {
type: Number,
value: -1,
reflectToAttribute: true,
},
}, },
behaviors: [I18nBehavior], behaviors: [I18nBehavior],
......
<link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/classes/iron-flex-layout.html">
<link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html">
<link rel="import" href="chrome://resources/cr_elements/network/cr_network_list.html"> <link rel="import" href="chrome://resources/cr_elements/network/cr_network_list.html">
...@@ -21,11 +22,13 @@ ...@@ -21,11 +22,13 @@
expanded="{{networkListOpened}}"> expanded="{{networkListOpened}}">
</cr-expand-button> </cr-expand-button>
</div> </div>
<cr-network-list opened="[[networkListOpened]]" max-height="[[maxHeight]]" <iron-collapse opened="[[networkListOpened]]">
networks="[[networkStateList]]" custom-items="[[customItems]]" <cr-network-list on-selected="onNetworkListItemSelected_"
on-selected="onNetworkListItemSelected_" show-buttons=[[showButtons]] max-height="[[maxHeight]]" networks="[[networkStateList]]"
show-separators="[[showSeparators]]"> custom-items="[[customItems]]" show-buttons=[[showButtons]]
</cr-network-list> show-separators="[[showSeparators]]">
</cr-network-list>
</iron-collapse>
</div> </div>
</template> </template>
<script src="cr_network_select.js"></script> <script src="cr_network_select.js"></script>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment