| <!DOCTYPE html> |
| <!-- |
| Copyright 2015 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. |
| --> |
| |
| <link rel="import" href="/tracing/base/statistics.html"> |
| <link rel="import" href="/tracing/model/event_set.html"> |
| <link rel="import" href="/tracing/ui/base/table.html"> |
| <link rel="import" href="/tracing/ui/side_panel/side_panel.html"> |
| <link rel="import" href="/tracing/ui/base/dom_helpers.html"> |
| <link rel="import" href="/tracing/ui/base/line_chart.html"> |
| |
| <polymer-element name='tr-ui-e-s-alerts-side-panel' |
| extends='tr-ui-side-panel'> |
| <template> |
| <style> |
| :host { |
| display: block; |
| width: 250px; |
| } |
| #content { |
| flex-direction: column; |
| display: flex; |
| } |
| </style> |
| |
| <div id='content'> |
| <toolbar id='toolbar'></toolbar> |
| <result-area id='result_area'></result-area> |
| </div> |
| </template> |
| |
| <script> |
| 'use strict'; |
| |
| Polymer({ |
| ready: function() { |
| this.rangeOfInterest_ = new tr.b.Range(); |
| this.selection_ = undefined; |
| }, |
| |
| get model() { |
| return this.model_; |
| }, |
| |
| set model(model) { |
| this.model_ = model; |
| this.updateContents_(); |
| }, |
| |
| set selection(selection) { |
| }, |
| |
| set rangeOfInterest(rangeOfInterest) { |
| }, |
| |
| /** |
| * Fires a selection event selecting all alerts of the specified |
| * type. |
| */ |
| selectAlertsOfType: function(alertTypeString) { |
| var alertsOfType = this.model_.alerts.filter(function(alert) { |
| return alert.title === alertTypeString; |
| }); |
| |
| var event = new tr.model.RequestSelectionChangeEvent(); |
| event.selection = new tr.model.EventSet(alertsOfType); |
| this.dispatchEvent(event); |
| }, |
| |
| /** |
| * Returns a map for the specified alerts where each key is the |
| * alert type string and each value is a list of alerts with that |
| * type. |
| */ |
| alertsByType_: function(alerts) { |
| var alertsByType = {}; |
| alerts.forEach(function(alert) { |
| if (!alertsByType[alert.title]) |
| alertsByType[alert.title] = []; |
| |
| alertsByType[alert.title].push(alert); |
| }); |
| return alertsByType; |
| }, |
| |
| alertsTableRows_: function(alertsByType) { |
| return Object.keys(alertsByType).map(function(key) { |
| return { |
| alertType: key, |
| count: alertsByType[key].length |
| }; |
| }); |
| }, |
| |
| alertsTableColumns_: function() { |
| return [ |
| { |
| title: 'Alert type', |
| value: function(row) { return row.alertType; }, |
| width: '180px' |
| }, |
| { |
| title: 'Count', |
| width: '100%', |
| value: function(row) { return row.count; } |
| } |
| ]; |
| }, |
| |
| createAlertsTable_: function(alerts) { |
| var alertsByType = this.alertsByType_(alerts); |
| |
| var table = document.createElement('tr-ui-b-table'); |
| table.tableColumns = this.alertsTableColumns_(); |
| table.tableRows = this.alertsTableRows_(alertsByType); |
| table.selectionMode = tr.ui.b.TableFormat.SelectionMode.ROW; |
| table.addEventListener('selection-changed', function(e) { |
| var row = table.selectedTableRow; |
| if (row) |
| this.selectAlertsOfType(row.alertType); |
| }.bind(this)); |
| |
| return table; |
| }, |
| |
| updateContents_: function() { |
| this.$.result_area.textContent = ''; |
| if (this.model_ === undefined) |
| return; |
| |
| var panel = this.createAlertsTable_(this.model_.alerts); |
| this.$.result_area.appendChild(panel); |
| }, |
| |
| supportsModel: function(m) { |
| if (m == undefined) { |
| return { |
| supported: false, |
| reason: 'Unknown tracing model' |
| }; |
| } else if (m.alerts.length === 0) { |
| return { |
| supported: false, |
| reason: 'No alerts in tracing model' |
| }; |
| } |
| |
| return { |
| supported: true |
| }; |
| }, |
| |
| get textLabel() { |
| return 'Alerts'; |
| } |
| }); |
| </script> |
| </polymer-element> |