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

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..15061344d8a581af0ccb27c05215c3bdca3f03cd 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 the URL.
+ * @param {string} url
+ */
+function stripScheme(url) {
+ return url.replace(/^[a-z]*:\/\//, '');
+}
+
Polymer({
is: 'engagement-table',
properties: {
@@ -11,10 +19,87 @@ 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},
tsergeant 2015/10/28 04:57:03 As discussed, maybe set the default value here
calamity 2015/10/28 05:43:11 Done.
+
+ /**
+ * Whether the table is in reverse sorting order.
+ * @type {boolean}
+ * @private
+ */
+ sortReverse_: {type: Boolean, value: true, reflectToAttribute: true},
},
+ ready: function() { this.sortTable_(this.$['initial-sort-column']); },
+
+ /**
+ * @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.
+ * @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;
+
+ console.log('Unsupported sort key:' + sortKey);
+ return 0;
+ },
});

Powered by Google App Engine
This is Rietveld 408576698