diff --git a/src/atlasViewer/widgetUnit/widgetUnit.component.ts b/src/atlasViewer/widgetUnit/widgetUnit.component.ts index 22ae81ec3bbcc7d3b33d07406cced04d6bfe8b82..3be619d899d9293eaff612448acc35bebb394663 100644 --- a/src/atlasViewer/widgetUnit/widgetUnit.component.ts +++ b/src/atlasViewer/widgetUnit/widgetUnit.component.ts @@ -1,4 +1,4 @@ -import { Component, ViewChild, ViewContainerRef,ComponentRef, HostBinding, HostListener, Output, EventEmitter, Input } from "@angular/core"; +import { Component, ViewChild, ViewContainerRef,ComponentRef, HostBinding, HostListener, Output, EventEmitter, Input, ElementRef } from "@angular/core"; import { WidgetServices } from "./widgetService.service"; @@ -11,6 +11,7 @@ import { WidgetServices } from "./widgetService.service"; export class WidgetUnit { @ViewChild('container',{read:ViewContainerRef}) container : ViewContainerRef + @ViewChild('emptyspan',{read:ElementRef}) emtpy : ElementRef @HostBinding('attr.state') public state : 'docked' | 'floating' = 'docked' @@ -96,31 +97,34 @@ export class WidgetUnit { reposStartMousePos : [number,number] = [0,0] repositionFlag : boolean = false - @HostListener('document:mousemove',['$event']) + /* nb FF does not provide event.clientX / event.clientY on drag event. So will have to attach dragover event listener */ + /* ref: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 */ + @HostListener('document:dragover',['$event']) mousemove(ev:MouseEvent){ - if(!this.repositionFlag) return + if(this.repositionFlag){ + this.position[0] = this.reposStartViewPos[0] - this.reposStartMousePos[0] + ev.clientX + this.position[1] = this.reposStartViewPos[1] - this.reposStartMousePos[1] + ev.clientY + } + } - this.position[0] = this.reposStartViewPos[0] - this.reposStartMousePos[0] + ev.clientX - this.position[1] = this.reposStartViewPos[1] - this.reposStartMousePos[1] + ev.clientY + dragend(ev:DragEvent){ + this.repositionFlag = false } - mousedown(ev:MouseEvent){ + dragstart(ev:DragEvent){ this.reposStartMousePos[0] = ev.clientX this.reposStartMousePos[1] = ev.clientY this.reposStartViewPos[0] = this.position[0] this.reposStartViewPos[1] = this.position[1] - this.repositionFlag = true; - document.body.style.pointerEvents = 'none' - document.body.style.userSelect = 'none' - } + this.repositionFlag = true + + /* nb FF requires dataTransfer.setData in order to fire the drag or dragover event */ + ev.dataTransfer.setData('application/node type', '') - @HostListener('document:mouseup',['$event']) - mouseup(_ev:MouseEvent){ - this.repositionFlag = false; - document.body.style.pointerEvents = 'all' - document.body.style.userSelect = 'initial' + /* nb FF will render any invisible DOM element as a file icon. */ + ev.dataTransfer.setDragImage(this.emtpy.nativeElement, 0, 0) } get transform(){ diff --git a/src/atlasViewer/widgetUnit/widgetUnit.style.css b/src/atlasViewer/widgetUnit/widgetUnit.style.css index 069324b2ff59852bebbd148559a1ad1c13a1e08e..f3f1e776489729696d6204df809f43f953258cbe 100644 --- a/src/atlasViewer/widgetUnit/widgetUnit.style.css +++ b/src/atlasViewer/widgetUnit/widgetUnit.style.css @@ -41,4 +41,9 @@ panel-component[widgetUnitPanel] :host-context([state='floating']) div[widgetUnitHeading]:hover { cursor : move; +} + +[emptyspan] +{ + opacity:0.01; } \ No newline at end of file diff --git a/src/atlasViewer/widgetUnit/widgetUnit.template.html b/src/atlasViewer/widgetUnit/widgetUnit.template.html index a5d003462ca65cc42247756711610193f62795a4..9c70830616324ecdf38c10b84761805ff1ebd6d1 100644 --- a/src/atlasViewer/widgetUnit/widgetUnit.template.html +++ b/src/atlasViewer/widgetUnit/widgetUnit.template.html @@ -2,12 +2,14 @@ [style.transform] = "transform" [containerClass] = "containerClass" widgetUnitPanel - [bodyCollapsable] = "state === 'docked'" - > + [bodyCollapsable] = "state === 'docked'"> <div - (mousedown) = "mousedown($event)" + draggable = "true" + (dragend) = "dragend($event)" + (dragstart) = "dragstart($event)" widgetUnitHeading heading> + <div #emptyspan emptyspan>.</div> <div title>{{ title }}</div> <div icons> <i *ngIf = "state === 'floating'" diff --git a/src/components/dropdown/dropdown.component.ts b/src/components/dropdown/dropdown.component.ts index 69a07cf45af5a244f99f5fa3fe7824b833bbdef9..4b7a52da659b52b1d393ff2daaa23aba0f8f7363 100644 --- a/src/components/dropdown/dropdown.component.ts +++ b/src/components/dropdown/dropdown.component.ts @@ -45,8 +45,10 @@ export class DropdownComponent{ @HostListener('document:click',['$event']) close(event:MouseEvent){ - /* FF does not implement event.srcElement so use event.originalTarget to polyfill for FF */ - const contains = this.dropdownToggle.nativeElement.contains(event.srcElement) || this.dropdownToggle.nativeElement.contains((event as any).originalTarget) + /* FF <62 does not implement event.srcElement so use event.originalTarget to polyfill for FF */ + const contains = event.srcElement + ? this.dropdownToggle.nativeElement.contains(event.srcElement) + : this.dropdownToggle.nativeElement.contains((event as any).originalTarget) if(contains) this.openState = !this.openState else diff --git a/src/ui/banner/banner.component.ts b/src/ui/banner/banner.component.ts index 71fba9c5cc47ca0da862295ecbeeb5b0d2c608fc..654748941103461cfec72ae6eb6ff0f9d2936adf 100644 --- a/src/ui/banner/banner.component.ts +++ b/src/ui/banner/banner.component.ts @@ -185,8 +185,11 @@ export class AtlasBanner implements OnDestroy{ if(!this.inputRegionPopover) return - /* FF does not implement event.srcElement so use event.originalTarget to polyfill for FF */ - const contains = this.inputRegionPopover.nativeElement.contains(event.srcElement) || this.inputRegionPopover.nativeElement.contains((event as any).originalTarget) + /* FF < 62 does not implement event.srcElement so use event.originalTarget to polyfill for FF */ + + const contains = event.srcElement + ? this.inputRegionPopover.nativeElement.contains(event.srcElement) + : this.inputRegionPopover.nativeElement.contains((event as any).originalTarget) if(contains) this.showRegionTree = true else