From 1bb03b9ff1438b64f562a7c0dc1e1d5bee1a267c Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Wed, 29 Apr 2020 22:08:08 +0200
Subject: [PATCH] bugfix: regression of ctx menu

---
 e2e/src/layout/viewerCtxMenu.prod.e2e-spec.js | 10 ++++++++
 e2e/src/util.js                               |  6 +++++
 src/atlasViewer/atlasViewer.component.ts      | 24 ++++++++++++-------
 ...eContextualContainerDirective.directive.ts |  2 +-
 4 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/e2e/src/layout/viewerCtxMenu.prod.e2e-spec.js b/e2e/src/layout/viewerCtxMenu.prod.e2e-spec.js
index f5f208a3f..71aceb252 100644
--- a/e2e/src/layout/viewerCtxMenu.prod.e2e-spec.js
+++ b/e2e/src/layout/viewerCtxMenu.prod.e2e-spec.js
@@ -41,6 +41,16 @@ describe('> viewerCtxMenu', () => {
           expect(visible).toBeTrue()
         })
 
+        it('> pos does not change when click inside', async () => {
+          const { x: xBefore, y: yBefore, height: hBefore } = await iavPage.isAt(`[aria-label="${ARIA_LABELS.CONTEXT_MENU}"]`)
+          await iavPage.click(`[aria-label="${ARIA_LABELS.SHOW_IN_OTHER_REF_SPACE}"]`)
+          await iavPage.wait(500)
+          const { x: xAfter, y: yAfter, height: hAfter } = await iavPage.isAt(`[aria-label="${ARIA_LABELS.CONTEXT_MENU}"]`)
+          expect(xBefore).toEqual(xAfter)
+          expect(yBefore).toEqual(yAfter)
+          expect(hAfter).toBeGreaterThan(hBefore)
+        })
+
         it('> disappear again on click of anywhere else', async () => {
           await iavPage.cursorMoveToAndClick({ position: [10, 10] })
           await iavPage.wait(500)
diff --git a/e2e/src/util.js b/e2e/src/util.js
index 457dfcdd6..d14599598 100644
--- a/e2e/src/util.js
+++ b/e2e/src/util.js
@@ -122,6 +122,12 @@ class WdBase{
     return isDisplayed
   }
 
+  async isAt(cssSelector){
+    if (!cssSelector) throw new Error(`getText needs to define css selector`)
+    const { x, y, width, height } = await this._browser.findElement( By.css(cssSelector) ).getRect()
+    return { x, y, width, height }
+  }
+
   historyBack() {
     return this._browser.navigate().back()
   }
diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts
index b349816e4..817f342be 100644
--- a/src/atlasViewer/atlasViewer.component.ts
+++ b/src/atlasViewer/atlasViewer.component.ts
@@ -382,20 +382,28 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit {
     )
   }
 
-  public mouseClickDocument(event) {
+  public mouseClickDocument(event: MouseEvent) {
 
     const dismissRClCtxtMenu = this.rClContextualMenu.isShown
 
     const next = () => {
 
       if (!this.rClContextualMenu) { return }
-      this.rClContextualMenu.mousePos = [
-        event.clientX,
-        event.clientY,
-      ]
-  
-      if (dismissRClCtxtMenu) this.rClContextualMenu.hide()
-      else this.rClContextualMenu.show()
+
+      if (dismissRClCtxtMenu) {
+        if (this.rClContextualMenu.el.nativeElement.contains(event.target)) {
+
+        } else {
+          this.rClContextualMenu.hide()
+        }
+      } else {
+
+        this.rClContextualMenu.mousePos = [
+          event.clientX,
+          event.clientY,
+        ]
+        this.rClContextualMenu.show()
+      } 
     }
 
     this.nehubaClickOverride(next)
diff --git a/src/util/directives/FixedMouseContextualContainerDirective.directive.ts b/src/util/directives/FixedMouseContextualContainerDirective.directive.ts
index 058a27918..d7fbf0905 100644
--- a/src/util/directives/FixedMouseContextualContainerDirective.directive.ts
+++ b/src/util/directives/FixedMouseContextualContainerDirective.directive.ts
@@ -20,7 +20,7 @@ export class FixedMouseContextualContainerDirective implements AfterContentCheck
   public onHide: EventEmitter<null> = new EventEmitter()
 
   constructor(
-    private el: ElementRef,
+    public el: ElementRef,
     private cdr: ChangeDetectorRef,
   ) {
   }
-- 
GitLab