| Index: chrome/browser/resources/engagement/engagement_table.js
|
| diff --git a/chrome/browser/resources/engagement/engagement_table.js b/chrome/browser/resources/engagement/engagement_table.js
|
| index efd259e8dd097e162a6546f19b22af8da3e7720a..976fbe975f0adff26c90eeff02213f5b4eeb3020 100644
|
| --- a/chrome/browser/resources/engagement/engagement_table.js
|
| +++ b/chrome/browser/resources/engagement/engagement_table.js
|
| @@ -4,6 +4,15 @@
|
|
|
| 'use strict';
|
|
|
| +/**
|
| + * Strips a scheme from an origin.
|
| + * @param {string} origin
|
| + * @return {string} The host of the given origin.
|
| + */
|
| +function stripScheme(origin) {
|
| + return new URL(origin).host;
|
| +}
|
| +
|
| Polymer({
|
| is: 'engagement-table',
|
| properties: {
|
| @@ -11,10 +20,88 @@ Polymer({
|
| * A list of engagement info objects.
|
| * @type !Array<!SiteEngagementInfo>
|
| */
|
| - engagementInfo: {
|
| - type: Array,
|
| - value: () => []
|
| - },
|
| + engagementInfo: {type: Array, value: function() { return []; } },
|
| +
|
| + /**
|
| + * The table's current sort key.
|
| + * @type {string}
|
| + * @private
|
| + */
|
| + sortKey_: {type: String, value: 'score'},
|
| +
|
| + /**
|
| + * Whether the table is in reverse sorting order.
|
| + * @type {boolean}
|
| + * @private
|
| + */
|
| + sortReverse: {type: Boolean, value: true, reflectToAttribute: true},
|
| + },
|
| +
|
| + /**
|
| + * @param {Event} e
|
| + */
|
| + handleSortColumnTap: function(e) {
|
| + this.sortTable_(e.currentTarget);
|
| + e.preventDefault();
|
| + },
|
| +
|
| + /**
|
| + * Sorts the engagement table based on the provided sort column header. Sort
|
| + * columns have a 'sort-key' attribute that is a property name of a
|
| + * SiteEngagementInfo.
|
| + * @param {HTMLElement} th The column to sort by.
|
| + * @private
|
| + */
|
| + sortTable_: function(th) {
|
| + // Remove the old sort indicator column.
|
| + var sortColumn = this.$$('.sort-column');
|
| + if (sortColumn)
|
| + sortColumn.className = '';
|
| +
|
| + // Updating these properties recomputes the template sort function.
|
| + var newSortKey = th.getAttribute('sort-key');
|
| + if (this.sortKey_)
|
| + this.sortReverse = (newSortKey == this.sortKey_) && !this.sortReverse;
|
| +
|
| + this.sortKey_ = newSortKey;
|
| +
|
| + // Specify the new sort indicator column.
|
| + th.className = 'sort-column';
|
| + },
|
| +
|
| + /**
|
| + * Returns a sorting function for SiteEngagementInfo objects that sorts based
|
| + * on sortKey.
|
| + * @param {string} sortKey The name of the property to sort by.
|
| + * @param {boolean} reverse Whether the sort should be in reverse order.
|
| + * @return {function} A comparator for SiteEngagementInfos.
|
| + * @private
|
| + */
|
| + getTableSortFunction_: function(sortKey, reverse) {
|
| + return function(a, b) {
|
| + return (reverse ? -1 : 1) *
|
| + this.compareTableItem_(sortKey, a, b);
|
| + }.bind(this);
|
| },
|
|
|
| + /**
|
| + * Compares two SiteEngagementInfo objects based on the sortKey.
|
| + * @param {string} sortKey The name of the property to sort by.
|
| + * @return {number} A negative number if |a| should be ordered before |b|, a
|
| + * positive number otherwise.
|
| + * @private
|
| + */
|
| + compareTableItem_: function(sortKey, a, b) {
|
| + var val1 = a[sortKey];
|
| + var val2 = b[sortKey];
|
| +
|
| + if (sortKey == 'origin')
|
| + return stripScheme(val1) > stripScheme(val2) ? 1 : -1;
|
| +
|
| + if (sortKey == 'score')
|
| + return val1 - val2;
|
| +
|
| + assertNotReached('Unsupported sort key: ' + sortKey);
|
| + return 0;
|
| + },
|
| });
|
|
|