Chromium Code Reviews| Index: chrome/browser/resources/bluetooth_internals/device_table.js |
| diff --git a/chrome/browser/resources/bluetooth_internals/device_table.js b/chrome/browser/resources/bluetooth_internals/device_table.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..554355ea2278588b40f0fca8a94f728c2baba7e7 |
| --- /dev/null |
| +++ b/chrome/browser/resources/bluetooth_internals/device_table.js |
| @@ -0,0 +1,146 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * Javascript for DeviceTable UI, served from |
| + * chrome://bluetooth-internals/. |
| + */ |
| + |
| +cr.define('device_table', function() { |
| + var REMOVED_CSS = 'removed'; |
| + |
| + /** |
| + * A table that lists the devices and responds to changes in the given |
| + * DeviceCollection. |
| + * @constructor |
| + * @extends {HTMLTableElement} |
| + */ |
| + var DeviceTable = cr.ui.define(function() { |
| + this.devices_ = null; |
| + |
| + return document.importNode($('table-template').content.children[0], |
| + true /* deep */); |
| + }); |
| + DeviceTable.prototype = { |
| + __proto__: HTMLTableElement.prototype, |
| + |
| + /** |
| + * Decorates an element as a UI element class. Caches references to the |
| + * table body and headers. |
| + */ |
| + decorate: function() { |
| + this.body_ = this.tBodies[0]; |
| + this.headers_ = this.tHead.rows[0].cells; |
| + }, |
| + |
| + /** |
| + * Sets the tables device collection. |
| + * @param {!device_collection.DeviceCollection} deviceCollection |
| + */ |
| + setDevices: function(deviceCollection) { |
| + if (this.devices_) { |
|
ortuno
2016/11/03 22:14:15
Are you planning on being able to replace the devi
mbrunson
2016/11/03 23:59:40
I originally had this for easier testing, but I ju
|
| + this.devices_.removeEventListener('sorted', this.redraw_.bind(this)); |
| + this.devices_.removeEventListener('change', |
| + this.handleChange_.bind(this)); |
| + this.devices_.removeEventListener('splice', |
| + this.handleSplice_.bind(this)); |
| + } |
| + |
| + this.devices_ = deviceCollection; |
| + this.devices_.addEventListener('sorted', this.redraw_.bind(this)); |
| + this.devices_.addEventListener('change', this.handleChange_.bind(this)); |
| + this.devices_.addEventListener('splice', this.handleSplice_.bind(this)); |
| + |
| + this.redraw_(); |
| + }, |
| + |
| + /** |
| + * Updates table row on change event of the device collection. |
| + * @param {!Event} event |
| + */ |
| + handleChange_: function(event) { |
| + this.updateRow_(this.devices_.item(event.index), event.index); |
| + }, |
| + |
| + /** |
| + * Updates table row on splice event of the device collection. |
| + * @param {!Event} event |
| + */ |
| + handleSplice_: function(event) { |
| + event.removed.forEach(function() { |
| + this.body_.deleteRow(event.index); |
| + }, this); |
| + |
| + event.added.forEach(function(device, index) { |
| + this.newRowForDevice_(device, event.index + index); |
| + }, this); |
| + }, |
| + |
| + /** |
| + * Inserts a new row at |index| and updates it with info from |device|. |
| + * @param {!device_collection.Device} device |
| + * @param {?number} index |
| + */ |
| + newRowForDevice_: function(device, index) { |
| + var row = this.body_.insertRow(index); |
| + row.id = device.info.address; |
| + |
| + for (var i = 0; i < this.headers_.length; i++) { |
| + row.insertCell(); |
| + } |
| + |
| + this.updateRow_(device, row.sectionRowIndex); |
| + }, |
| + |
| + /** |
| + * Deletes and recreates the table using the cached |devices_|. |
| + */ |
| + redraw_: function() { |
| + this.removeChild(this.body_); |
| + this.appendChild(document.createElement('tbody')); |
| + this.body_ = this.tBodies[0]; |
| + this.body_.classList.add('table-body'); |
| + |
| + for (var i = 0; i < this.devices_.length; i++) { |
| + this.newRowForDevice_(this.devices_.item(i)); |
| + } |
| + }, |
| + |
| + /** |
| + * Updates the row at |index| with the info from |device|. |
| + * @param {!device_collection.Device} device |
| + * @param {!number} index |
| + */ |
| + updateRow_: function(device, index) { |
| + var row = this.body_.rows[index]; |
| + |
| + if (device.removed) { |
| + row.classList.add(REMOVED_CSS); |
| + } else { |
| + row.classList.remove(REMOVED_CSS); |
| + } |
| + |
| + // Update the properties based on the header field path. |
| + for (var i = 0; i < this.headers_.length; i++) { |
| + var header = this.headers_[i]; |
| + var propName = header.dataset.field; |
| + |
| + var parts = propName.split('.'); |
| + var obj = device.info; |
| + while (obj != null && parts.length > 0) { |
| + var part = parts.shift(); |
| + obj = obj[part]; |
| + } |
| + |
| + var cell = row.cells[i]; |
| + cell.textContent = obj || 'Unknown'; |
| + cell.dataset.label = header.innerText; |
| + } |
| + }, |
| + }; |
| + |
| + return { |
| + DeviceTable: DeviceTable, |
| + }; |
| +}); |