Sitic has uploaded a new change for review.

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

Change subject: Show a edit diff when the user requests it
......................................................................

Show a edit diff when the user requests it

Show a diff for a watchlist edit event when clicking on it.

Bug: T103679
Change-Id: I8a25627b68813b3f0d3e77c53f066dc21ce2b9f6
---
M backend/celery/tasks.py
M backend/server/__init__.py
M frontend/src/app/index.css
M frontend/src/app/runBlock.js
M frontend/src/app/services.js
M frontend/src/components/watchlist/entry.directive.html
M frontend/src/components/watchlist/watchlist.controller.js
M frontend/src/components/watchlist/watchlist.html
8 files changed, 199 insertions(+), 3 deletions(-)


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

diff --git a/backend/celery/tasks.py b/backend/celery/tasks.py
index c49e1d2..c9e91c2 100644
--- a/backend/celery/tasks.py
+++ b/backend/celery/tasks.py
@@ -219,5 +219,32 @@
         mw.post(params, payload)
 
 
[email protected]
+def get_diff(obj):
+    """
+    Get a diff for a wiki page
+    """
+    mw = MediaWiki(host=obj['projecturl'],
+                   access_token=obj['access_token'],
+                   redis_channel=obj['redis_channel'])
+    params = {
+        'action': "query",
+        'prop': "revisions",
+        'rvstartid': obj['old_revid'],
+        'rvendid': obj['old_revid'],
+        'rvdiffto': obj['revid'],
+        'pageids': obj['pageid'],
+        'formatversion': 2
+        }
+    response = mw.query(params)
+    diff = response['query']['pages'][0]['revisions'][0]['diff']['body']
+
+    mw.publish({
+        'msgtype': 'diff_response',
+        'request_id': obj['request_id'],
+        'diff': diff
+    })
+
+
 if __name__ == '__main__':
     app.start()
diff --git a/backend/server/__init__.py b/backend/server/__init__.py
index 29979d9..f4c1f0d 100644
--- a/backend/server/__init__.py
+++ b/backend/server/__init__.py
@@ -59,6 +59,13 @@
         elif data[u'action'] == u'notifications_mark_read':
             
celery_app.send_task('backend.celery.tasks.notifications_mark_read',
                                  (data, ), expires=60)
+        elif data[u'action'] == u'diff':
+            redis_channel = str(uuid4())
+            self.channels.append(redis_channel)
+            subscriber.subscribe(redis_channel, self)
+
+            data['redis_channel'] = redis_channel
+            celery_app.send_task('backend.celery.tasks.get_diff', (data, ))
 
 
 class NoChacheStaticFileHandler(StaticFileHandler):
diff --git a/frontend/src/app/index.css b/frontend/src/app/index.css
index 3ec86fa..7d7131a 100644
--- a/frontend/src/app/index.css
+++ b/frontend/src/app/index.css
@@ -207,6 +207,101 @@
   overflow: hidden;
 }
 
+/*!
+ * Diff rendering
+ */
+table.diff {
+  border: none;
+  border-spacing: 4px;
+  margin: 0;
+  width: 100%;
+  /* Ensure that colums are of equal width */
+  table-layout: fixed;
+}
+
+table.diff td {
+  padding: 0.33em 0.5em;
+}
+
+table.diff td.diff-marker {
+  /* Compensate padding for increased font-size */
+  padding: 0.25em;
+}
+
+table.diff col.diff-marker {
+  width: 2%;
+}
+
+table.diff col.diff-content {
+  width: 48%;
+}
+
+table.diff td div {
+  /* Force-wrap very long lines such as URLs or page-widening char strings */
+  word-wrap: break-word;
+}
+
+td.diff-otitle,
+td.diff-ntitle {
+  text-align: center;
+}
+
+td.diff-lineno {
+  font-weight: bold;
+}
+
+td.diff-marker {
+  text-align: right;
+  font-weight: bold;
+  font-size: 1.25em;
+  line-height: 1.2;
+}
+
+td.diff-addedline,
+td.diff-deletedline,
+td.diff-context {
+  font-size: 88%;
+  line-height: 1.6;
+  vertical-align: top;
+  white-space: -moz-pre-wrap;
+  white-space: pre-wrap;
+  border-style: solid;
+  border-width: 1px 1px 1px 4px;
+  border-radius: 0.33em;
+}
+
+td.diff-addedline {
+  border-color: #a3d3ff;
+}
+
+td.diff-deletedline {
+  border-color: #ffe49c;
+}
+
+td.diff-context {
+  background: #f9f9f9;
+  border-color: #e6e6e6;
+  color: #333333;
+}
+
+.diffchange {
+  font-weight: bold;
+  text-decoration: none;
+}
+
+td.diff-addedline .diffchange,
+td.diff-deletedline .diffchange {
+  border-radius: 0.33em;
+  padding: 0.25em 0;
+}
+
+td.diff-addedline .diffchange {
+  background: #d8ecff;
+}
+
+td.diff-deletedline .diffchange {
+  background: #feeec8;
+}
 
 /** material design icons **/
 @font-face {
diff --git a/frontend/src/app/runBlock.js b/frontend/src/app/runBlock.js
index f52f1de..835a949 100644
--- a/frontend/src/app/runBlock.js
+++ b/frontend/src/app/runBlock.js
@@ -58,6 +58,8 @@
       dataService.addWatchlistEntries(data.entires);
     } else if (data.msgtype === 'notification') {
       dataService.addNotificationEntries(data)
+    } else if (data.msgtype === 'diff_response') {
+      dataService.diffResponseHandler(data)
     } else if (data.msgtype === 'loginerror') {
       $log.error('login failed!');
 
@@ -75,7 +77,7 @@
           });
       });
     } else {
-      $log.error(data);
+      $log.error("Unhandled message: %o", data);
     }
 
     if (connectionError) {
diff --git a/frontend/src/app/services.js b/frontend/src/app/services.js
index 8fcd7eb..f08e222 100644
--- a/frontend/src/app/services.js
+++ b/frontend/src/app/services.js
@@ -28,7 +28,7 @@
 
 }
 
-function dataService (socket, authService, localStorageService, $log, $filter, 
debounce) {
+function dataService (socket, authService, localStorageService, $log, $filter, 
debounce, $q) {
   var vm = this;
 
   vm.watchlist = {};
@@ -229,6 +229,53 @@
     }
   };
 
+  /**
+   * callbacks with associated request ids
+   */
+  var callbacks = {};
+  var requestId = 0;
+  vm.getRequestId = function() {
+    return requestId++;
+  };
+
+  /**
+   * Get diff for a watchlist edit event
+   */
+  vm.getDiff = function (event) {
+    var request = {
+      action: 'diff',
+      access_token: authService.tokens(),
+      request_id: vm.getRequestId(),
+      projecturl: event.projecturl,
+      old_revid: event.old_revid,
+      revid: event.revid,
+      pageid: event.pageid
+    };
+    var deferred = $q.defer();
+    callbacks[request.request_id] = deferred;
+    socket.send(angular.toJson(request));
+    return deferred.promise.then(function(response) {
+      request.response = response;
+      return response;
+    });
+  };
+
+  /**
+   * Handle diff response from sockjs
+   */
+  vm.diffResponseHandler = function (data) {
+    if (angular.isDefined(callbacks[data.request_id])) {
+      var callback = callbacks[data.request_id];
+      delete callbacks[data.request_id];
+      callback.resolve(data.diff);
+    } else {
+      $log.error("No callback for diff: %o", data);
+    }
+  };
+
+  /**
+   * General data storage
+   */
   vm.icons = {};
   vm.icons['wikibooks']   = 
"//upload.wikimedia.org/wikipedia/commons/f/fa/Wikibooks-logo.svg";
   vm.icons['wiktionary']  = 
"//upload.wikimedia.org/wikipedia/commons/e/ef/Wikitionary.svg";
diff --git a/frontend/src/components/watchlist/entry.directive.html 
b/frontend/src/components/watchlist/entry.directive.html
index abd5d41..c31c419 100644
--- a/frontend/src/components/watchlist/entry.directive.html
+++ b/frontend/src/components/watchlist/entry.directive.html
@@ -38,3 +38,13 @@
   </div>
 </div>
 
+<table ng-if="event.clicked && event.diff" class="diff diff-contentalign-left">
+  <colgroup><col class="diff-marker">
+    <col class="diff-content">
+    <col class="diff-marker">
+    <col class="diff-content">
+  </colgroup>
+  <tbody ng-bind-html="::event.diff">
+  </tbody>
+</table>
+
diff --git a/frontend/src/components/watchlist/watchlist.controller.js 
b/frontend/src/components/watchlist/watchlist.controller.js
index 0e967de..990d430 100644
--- a/frontend/src/components/watchlist/watchlist.controller.js
+++ b/frontend/src/components/watchlist/watchlist.controller.js
@@ -12,4 +12,12 @@
     vm.search = function (text) {
       dataService.filterWatchlist(text);
     };
+
+    vm.clicked = function (event) {
+      if ((event.type === 'edit') && !event.diff) {
+        dataService.getDiff(event).then(function (diff) {
+          event.diff = diff;
+        })
+      }
+    }
   });
diff --git a/frontend/src/components/watchlist/watchlist.html 
b/frontend/src/components/watchlist/watchlist.html
index 0380ad8..3b683a0 100644
--- a/frontend/src/components/watchlist/watchlist.html
+++ b/frontend/src/components/watchlist/watchlist.html
@@ -27,7 +27,7 @@
       <md-list-item layout="row" id="watchlist" class="watchlist"
                     ng-class="(ctrl.config.oneline) ? 
'watchlist-list-item-oneline' : ''"
                     ng-repeat="event in ctrl.watchlist.active track by 
event.id">
-        <watchlist-entry ng-click="event.clicked = !event.clicked" 
md-ink-ripple></watchlist-entry>
+        <watchlist-entry ng-click="event.clicked = !event.clicked; 
ctrl.clicked(event)" md-ink-ripple></watchlist-entry>
         <md-divider></md-divider>
       </md-list-item>
     </md-list>

-- 
To view, visit https://gerrit.wikimedia.org/r/223798
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8a25627b68813b3f0d3e77c53f066dc21ce2b9f6
Gerrit-PatchSet: 1
Gerrit-Project: labs/tools/crosswatch
Gerrit-Branch: master
Gerrit-Owner: Sitic <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to