summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/resources/engagement/engagement_table.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/engagement/engagement_table.js')
-rw-r--r--chromium/chrome/browser/resources/engagement/engagement_table.js95
1 files changed, 91 insertions, 4 deletions
diff --git a/chromium/chrome/browser/resources/engagement/engagement_table.js b/chromium/chrome/browser/resources/engagement/engagement_table.js
index efd259e8dd0..976fbe975f0 100644
--- a/chromium/chrome/browser/resources/engagement/engagement_table.js
+++ b/chromium/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;
+ },
});