Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(365)

Unified Diff: chrome/browser/resources/engagement/engagement_table.js

Issue 1407363010: Make table in chrome:site-engagement sortable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..be6a711a60ed091167baacff930667d0278128d6 100644
--- a/chrome/browser/resources/engagement/engagement_table.js
+++ b/chrome/browser/resources/engagement/engagement_table.js
@@ -4,6 +4,14 @@
'use strict';
+/**
+ * Strips a scheme from an origin.
+ * @param {string} origin
+ */
Dan Beam 2015/10/29 22:03:16 @return
calamity 2015/10/30 03:56:27 Done.
+function stripScheme(origin) {
+ return new URL(origin).host;
+}
+
Polymer({
is: 'engagement-table',
properties: {
@@ -11,10 +19,85 @@ Polymer({
* A list of engagement info objects.
* @type !Array<!SiteEngagementInfo>
*/
- engagementInfo: {
- type: Array,
- value: () => []
- },
+ engagementInfo: {type: Array, value: () => []},
+
+ /**
+ * 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.
+ * @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.
Dan Beam 2015/10/29 22:03:16 @return
calamity 2015/10/30 03:56:27 Done.
+ * @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;
+ },
});
« no previous file with comments | « chrome/browser/resources/engagement/engagement_table.html ('k') | chrome/browser/resources/engagement/site_engagement.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698