[MediaWiki-commits] [Gerrit] JS performance optimization - change (labs...crosswatch)

2015-06-19 Thread Sitic (Code Review)
Sitic has submitted this change and it was merged.

Change subject: JS performance optimization
..


JS performance optimization

* give watchlist events a unique id to track them by (reusable DOM nodes)
* sort watchlist events when adding instead of a filter
* combined watchlist filters
* filtering is now done in JS not not the HTML
* using ngInfiniteScroll to display only a limited list of entries first
* debouncing when necessary
* various small fixes

Bug: T102569
Change-Id: Ib822ae65aecaf0c1f8fb15a33d338d6f56dad0f2
---
M backend/celery/tasks.py
M frontend/bower.json
M frontend/src/app/filters.js
M frontend/src/app/index.css
M frontend/src/app/index.js
M frontend/src/app/main/main.controller.js
M frontend/src/app/services.js
M frontend/src/components/settings/settings.controller.js
M frontend/src/components/watchlist/edit.directive.html
M frontend/src/components/watchlist/entry.directive.html
M frontend/src/components/watchlist/entry.directive.js
M frontend/src/components/watchlist/logevent.directive.html
M frontend/src/components/watchlist/watchlist.controller.js
M frontend/src/components/watchlist/watchlist.html
M frontend/src/i18n/locale-en.json
15 files changed, 213 insertions(+), 79 deletions(-)

Approvals:
  Sitic: Verified; Looks good to me, approved



diff --git a/backend/celery/tasks.py b/backend/celery/tasks.py
index 408ee0a..86e5a7a 100644
--- a/backend/celery/tasks.py
+++ b/backend/celery/tasks.py
@@ -4,6 +4,7 @@
 # Copyright (C) 2015 Jan Lebert
 from __future__ import absolute_import
 
+from uuid import uuid4
 from contextlib import closing
 import MySQLdb
 
@@ -143,6 +144,9 @@
 item['minor'] = m
 if 'new' in item:
 item['new'] = n
+
+# random id
+item['id'] = uuid4().hex[:8]
 items.append(item)
 message = {
 'msgtype': 'watchlist',
diff --git a/frontend/bower.json b/frontend/bower.json
index dd3f642..a0e0f36 100644
--- a/frontend/bower.json
+++ b/frontend/bower.json
@@ -15,7 +15,8 @@
 angular-local-storage: 0.2.x,
 angular-motion: ~0.4.2,
 angular-material: ~0.10.0,
-material-design-icons: ~2.0.0
+material-design-icons: ~2.0.0,
+ngInfiniteScroll: ~1.2.1
   },
   devDependencies: {
 angular-mocks: ~1.4.0
diff --git a/frontend/src/app/filters.js b/frontend/src/app/filters.js
index b057e63..9209e64 100644
--- a/frontend/src/app/filters.js
+++ b/frontend/src/app/filters.js
@@ -3,6 +3,7 @@
   .module('crosswatch')
   .filter('urlEncode', urlEncodeFilter)
   .filter('list', listFilter)
+  .filter('watchlist', watchlistFilter)
   .filter('projects', projectsFilter)
   .filter('editflags', editflagsFilter)
 ;
@@ -33,6 +34,45 @@
 }
 
 /**
+ * combined filter for watchlist
+ */
+function watchlistFilter () {
+  return function (items, config) {
+return items.filter(filter, config);
+  };
+
+  function filter (item) {
+var bool = projectsFilter(item, this.projectsSelected);
+
+if (bool) {
+  bool = editsflagsFilter(item, this.editflags);
+}
+return bool;
+  }
+
+  /**
+   * Filters watchlist based on selected / blacklisted wikis
+   */
+  function projectsFilter (item, projects) {
+return (projects.indexOf(item.project)  -1);
+  }
+
+  /**
+   * Filters watchlist based on editflags (minor, bot, registered)
+   */
+  function editsflagsFilter (item, flags) {
+if (item.type === 'log') {
+  return true;
+}
+var minor = flags.minor || !item.minor;
+var bot = flags.bot || !item.bot;
+var anon = flags.anon || !(item.anon === );
+var registered = flags.registered || !(item.userid !== 0);
+return (minor  bot  anon  registered);
+  }
+}
+
+/**
  * Filters watchlist based on selected / blacklisted wikis
  */
 function projectsFilter () {
diff --git a/frontend/src/app/index.css b/frontend/src/app/index.css
index e39a44b..9a44614 100644
--- a/frontend/src/app/index.css
+++ b/frontend/src/app/index.css
@@ -210,7 +210,8 @@
 }
 
 /* https://github.com/angular/material/issues/2769 */
-_:-ms-fullscreen, :root /* IE11 */ md-select-label *:first-child{
+_:-ms-fullscreen, :root /* IE11+ */ md-select-label :first-child{
   flex-basis: auto;
-  overflow: visible;
+  max-width: 100%;
+  overflow: hidden;
 }
diff --git a/frontend/src/app/index.js b/frontend/src/app/index.js
index bc1a3e1..7fd5700 100644
--- a/frontend/src/app/index.js
+++ b/frontend/src/app/index.js
@@ -6,10 +6,11 @@
 'ngRoute',
 'ngMaterial',
 'LocalStorageModule',
-'angular-translate-storage',
 'pascalprecht.translate',
+'angular-translate-storage',
 'bd.sockjs',
-'angularMoment'
+'angularMoment',
+'infinite-scroll'
   ])
   .config(routeConfig)
   .config(locationConfig)
diff --git a/frontend/src/app/main/main.controller.js 
b/frontend/src/app/main/main.controller.js
index 09f4719..15e465d 100644
--- a/frontend/src/app/main/main.controller.js
+++ 

[MediaWiki-commits] [Gerrit] JS performance optimization - change (labs...crosswatch)

2015-06-19 Thread Sitic (Code Review)
Sitic has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/219477

Change subject: JS performance optimization
..

JS performance optimization

* give watchlist events a unique id to track them by (reusable DOM nodes)
* sort watchlist events when adding instead of a filter
* combined watchlist filters
* filtering is now done in JS not not the HTML
* using ngInfiniteScroll to display only a limited list of entries first
* debouncing when necessary
* various small fixes

Bug: T102569
Change-Id: Ib822ae65aecaf0c1f8fb15a33d338d6f56dad0f2
---
M backend/celery/tasks.py
M frontend/bower.json
M frontend/src/app/filters.js
M frontend/src/app/index.css
M frontend/src/app/index.js
M frontend/src/app/main/main.controller.js
M frontend/src/app/services.js
M frontend/src/components/settings/settings.controller.js
M frontend/src/components/watchlist/edit.directive.html
M frontend/src/components/watchlist/entry.directive.html
M frontend/src/components/watchlist/entry.directive.js
M frontend/src/components/watchlist/logevent.directive.html
M frontend/src/components/watchlist/watchlist.controller.js
M frontend/src/components/watchlist/watchlist.html
M frontend/src/i18n/locale-en.json
15 files changed, 213 insertions(+), 79 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/labs/tools/crosswatch 
refs/changes/77/219477/1

diff --git a/backend/celery/tasks.py b/backend/celery/tasks.py
index 408ee0a..86e5a7a 100644
--- a/backend/celery/tasks.py
+++ b/backend/celery/tasks.py
@@ -4,6 +4,7 @@
 # Copyright (C) 2015 Jan Lebert
 from __future__ import absolute_import
 
+from uuid import uuid4
 from contextlib import closing
 import MySQLdb
 
@@ -143,6 +144,9 @@
 item['minor'] = m
 if 'new' in item:
 item['new'] = n
+
+# random id
+item['id'] = uuid4().hex[:8]
 items.append(item)
 message = {
 'msgtype': 'watchlist',
diff --git a/frontend/bower.json b/frontend/bower.json
index dd3f642..a0e0f36 100644
--- a/frontend/bower.json
+++ b/frontend/bower.json
@@ -15,7 +15,8 @@
 angular-local-storage: 0.2.x,
 angular-motion: ~0.4.2,
 angular-material: ~0.10.0,
-material-design-icons: ~2.0.0
+material-design-icons: ~2.0.0,
+ngInfiniteScroll: ~1.2.1
   },
   devDependencies: {
 angular-mocks: ~1.4.0
diff --git a/frontend/src/app/filters.js b/frontend/src/app/filters.js
index b057e63..9209e64 100644
--- a/frontend/src/app/filters.js
+++ b/frontend/src/app/filters.js
@@ -3,6 +3,7 @@
   .module('crosswatch')
   .filter('urlEncode', urlEncodeFilter)
   .filter('list', listFilter)
+  .filter('watchlist', watchlistFilter)
   .filter('projects', projectsFilter)
   .filter('editflags', editflagsFilter)
 ;
@@ -33,6 +34,45 @@
 }
 
 /**
+ * combined filter for watchlist
+ */
+function watchlistFilter () {
+  return function (items, config) {
+return items.filter(filter, config);
+  };
+
+  function filter (item) {
+var bool = projectsFilter(item, this.projectsSelected);
+
+if (bool) {
+  bool = editsflagsFilter(item, this.editflags);
+}
+return bool;
+  }
+
+  /**
+   * Filters watchlist based on selected / blacklisted wikis
+   */
+  function projectsFilter (item, projects) {
+return (projects.indexOf(item.project)  -1);
+  }
+
+  /**
+   * Filters watchlist based on editflags (minor, bot, registered)
+   */
+  function editsflagsFilter (item, flags) {
+if (item.type === 'log') {
+  return true;
+}
+var minor = flags.minor || !item.minor;
+var bot = flags.bot || !item.bot;
+var anon = flags.anon || !(item.anon === );
+var registered = flags.registered || !(item.userid !== 0);
+return (minor  bot  anon  registered);
+  }
+}
+
+/**
  * Filters watchlist based on selected / blacklisted wikis
  */
 function projectsFilter () {
diff --git a/frontend/src/app/index.css b/frontend/src/app/index.css
index e39a44b..9a44614 100644
--- a/frontend/src/app/index.css
+++ b/frontend/src/app/index.css
@@ -210,7 +210,8 @@
 }
 
 /* https://github.com/angular/material/issues/2769 */
-_:-ms-fullscreen, :root /* IE11 */ md-select-label *:first-child{
+_:-ms-fullscreen, :root /* IE11+ */ md-select-label :first-child{
   flex-basis: auto;
-  overflow: visible;
+  max-width: 100%;
+  overflow: hidden;
 }
diff --git a/frontend/src/app/index.js b/frontend/src/app/index.js
index bc1a3e1..7fd5700 100644
--- a/frontend/src/app/index.js
+++ b/frontend/src/app/index.js
@@ -6,10 +6,11 @@
 'ngRoute',
 'ngMaterial',
 'LocalStorageModule',
-'angular-translate-storage',
 'pascalprecht.translate',
+'angular-translate-storage',
 'bd.sockjs',
-'angularMoment'
+'angularMoment',
+'infinite-scroll'
   ])
   .config(routeConfig)
   .config(locationConfig)
diff --git a/frontend/src/app/main/main.controller.js 
b/frontend/src/app/main/main.controller.js
index 09f4719..15e465d