Repository: zeppelin
Updated Branches:
  refs/heads/master d1606c248 -> 14534da9e


[ZEPPELIN-3616] fix editor sections auto-collapse

This PR change logic of add new event listener on frontend. Now then add new 
event listener, also added destroy listener. Destroy listener attach to some 
DOM element and then this element destroyed listener drop event listener.
Since the old listeners were not deleted when changing the size of the 
paragraph / window, an error occurred. Because of this error, updating the text 
in the paragraph did not happen until the end.

<p align="center">before (77 lis.)</p>

![before](https://user-images.githubusercontent.com/30798933/43723409-421e44a0-99a0-11e8-8945-5d52e275ed02.png)

<p align="center">after (16 lis.)</p>

![after](https://user-images.githubusercontent.com/30798933/43723425-4ce02a3e-99a0-11e8-96ee-59ac177945d4.png)

* Does the licenses files need update? no
* Is there breaking changes for older versions? no
* Does this needs documentation? no

Author: Savalek <def...@mail.ru>

Closes #3113 from Savalek/ZEPPELIN-3616 and squashes the following commits:

259703e [Savalek] [ZEPPELIN-3616] remove event if dom's element destroy

Change-Id: I35cadc40f152973d6a2d1e9b8f1a797f7ea08445


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/14534da9
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/14534da9
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/14534da9

Branch: refs/heads/master
Commit: 14534da9e064bf5926d2ec095c723f2107635eb9
Parents: d1606c2
Author: Savalek <def...@mail.ru>
Authored: Mon Aug 6 16:29:22 2018 +0300
Committer: Prabhjyot Singh <prabhjyotsi...@gmail.com>
Committed: Fri Nov 9 17:37:14 2018 +0530

----------------------------------------------------------------------
 .../src/app/notebook/notebook.controller.js     | 34 ++++++++++++++++++--
 .../notebook/paragraph/paragraph.controller.js  |  7 ++--
 .../notebook/paragraph/resizable.directive.js   | 26 +++++++++++++--
 .../paragraph/result/result.controller.js       | 14 ++++++--
 4 files changed, 71 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/14534da9/zeppelin-web/src/app/notebook/notebook.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js 
b/zeppelin-web/src/app/notebook/notebook.controller.js
index bf4fea7..047b022 100644
--- a/zeppelin-web/src/app/notebook/notebook.controller.js
+++ b/zeppelin-web/src/app/notebook/notebook.controller.js
@@ -103,6 +103,27 @@ function NotebookCtrl($scope, $route, $routeParams, 
$location, $rootScope,
     connectedOnce = true;
   });
 
+  $scope.addEvent = function(config) {
+    let removeEventByID = function(id) {
+      let events = jQuery._data(config.element, 'events')[config.eventType];
+      if (!events) {
+        return;
+      }
+      for (let i=0; i < events.length; i++) {
+        if (events[i].data && events[i].data.eventID === id) {
+          events.splice(i, 1);
+          i--;
+        }
+      }
+    };
+
+    removeEventByID(config.eventID);
+    angular.element(config.element).bind(config.eventType, {eventID: 
config.eventID}, config.handler);
+    angular.element(config.onDestroyElement).scope().$on('$destroy', () => {
+      removeEventByID(config.eventID);
+    });
+  };
+
   $scope.getCronOptionNameFromValue = function(value) {
     if (!value) {
       return '';
@@ -1564,8 +1585,15 @@ function NotebookCtrl($scope, $route, $routeParams, 
$location, $rootScope,
     document.removeEventListener('keydown', $scope.keyboardShortcut);
   });
 
-  angular.element(window).bind('resize', function() {
-    const actionbarHeight = 
document.getElementById('actionbar').lastElementChild.clientHeight;
-    angular.element(document.getElementById('content')).css('padding-top', 
actionbarHeight - 20);
+  let content = document.getElementById('content');
+  $scope.addEvent({
+    eventID: content.id,
+    eventType: 'resize',
+    element: window,
+    onDestroyElement: content,
+    handler: () => {
+      const actionbarHeight = 
document.getElementById('actionbar').lastElementChild.clientHeight;
+      angular.element(document.getElementById('content')).css('padding-top', 
actionbarHeight - 20);
+    },
   });
 }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/14534da9/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js 
b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
index 1a1569a..b332b59 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -755,9 +755,10 @@ function ParagraphCtrl($scope, $rootScope, $route, 
$window, $routeParams, $locat
       }
 
       autoAdjustEditorHeight(_editor);
-      angular.element(window).resize(function() {
-        autoAdjustEditorHeight(_editor);
-      });
+
+      let adjustEditorListener = () => autoAdjustEditorHeight(_editor);
+      angular.element(window).resize(adjustEditorListener);
+      $scope.$on('$destroy', () => angular.element(window).unbind('resize', 
adjustEditorListener));
 
       if (navigator.appVersion.indexOf('Mac') !== -1) {
         $scope.editor.setKeyboardHandler('ace/keyboard/emacs');

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/14534da9/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js 
b/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
index 874f9d8..d629f6e 100644
--- a/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
+++ b/zeppelin-web/src/app/notebook/paragraph/resizable.directive.js
@@ -24,6 +24,23 @@ function ResizableDirective() {
     },
   };
 
+  let addEvent = function(config) {
+    let removeEventByID = function(id) {
+      let events = jQuery._data(config.element, 'events')[config.eventType];
+      for (let i=0; i < events.length; i++) {
+        if (events[i].data && events[i].data.eventID === id) {
+          events.splice(i, 1);
+          i--;
+        }
+      }
+    };
+    removeEventByID(config.eventID);
+    angular.element(config.element).bind(config.eventType, {eventID: 
config.eventID}, config.handler);
+    angular.element(config.onDestroyElement).scope().$on('$destroy', () => {
+      removeEventByID(config.eventID);
+    });
+  };
+
   return {
     restrict: 'A',
     scope: {
@@ -59,8 +76,13 @@ function ResizableDirective() {
         resize = JSON.parse(resize);
         if (resize.allowresize === 'true') {
           resetResize(elem, resize);
-          angular.element(window).resize(function() {
-            resetResize(elem, resize);
+
+          addEvent({
+            eventID: elem[0].id,
+            eventType: 'resize',
+            element: window,
+            onDestroyElement: elem[0],
+            handler: () => resetResize(elem, resize),
           });
         }
       });

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/14534da9/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
----------------------------------------------------------------------
diff --git 
a/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js 
b/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
index 98940ab..86f112b 100644
--- a/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/result/result.controller.js
@@ -683,8 +683,18 @@ function ResultCtrl($scope, $rootScope, $route, $window, 
$routeParams, $location
           builtInViz.instance.render(transformed);
           builtInViz.instance.renderSetting(visualizationSettingTargetEl);
           builtInViz.instance.activate();
-          angular.element(window).resize(() => {
-            builtInViz.instance.resize();
+
+          let eventID = builtInViz.instance.targetEl.id;
+          if (!eventID) {
+            eventID = builtInViz.instance.targetEl[0].id;
+          }
+
+          $scope.addEvent({
+            eventID: eventID,
+            eventType: 'resize',
+            element: window,
+            onDestroyElement: builtInViz.instance.targetEl,
+            handler: () => builtInViz.instance.resize(),
           });
         } catch (err) {
           console.error('Graph drawing error %o', err);

Reply via email to