Skip to content

Commit

Permalink
Merge pull request primefaces#1 in TEDU_COMMON/primeng from feature/o…
Browse files Browse the repository at this point in the history
…verlaypanel-position to version2

* commit 'e2bcf99bd1e7abb0a9f649ffafbe471e9ca75025':
  FIX: newline
  FIX: better position
  FIX: leave default behaviour of prime
  FIX: bug with dimensions when not correctly positioned
  no message
  • Loading branch information
televic-education-ruben committed Apr 19, 2017
2 parents eb9bfbb + e2bcf99 commit 52064bf
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 22 deletions.
51 changes: 31 additions & 20 deletions components/dom/domhandler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { Injectable } from '@angular/core';

class Position {
public static LEFT: string = "left";
public static RIGHT: string = "right";
}

@Injectable()
export class DomHandler {

Expand Down Expand Up @@ -88,28 +93,32 @@ export class DomHandler {
element.style.left = left + 'px';
}

public absolutePosition(element: any, target: any): void {
public absolutePosition(element: any, target: any, position: string = Position.LEFT): void {
let elementDimensions = element.offsetParent ? { width: element.offsetWidth, height: element.offsetHeight } : this.getHiddenElementDimensions(element);
let elementOuterHeight = elementDimensions.height;
let elementOuterWidth = elementDimensions.width;
let targetOuterHeight = target.offsetHeight;
let targetOuterWidth = target.offsetWidth;
let targetOffset = target.getBoundingClientRect();
let windowScrollTop = this.getWindowScrollTop();
let windowScrollLeft = this.getWindowScrollLeft();
let viewport = this.getViewport();
let top, left;

if (targetOffset.top + targetOuterHeight + elementOuterHeight > viewport.height)
top = targetOffset.top + windowScrollTop - elementOuterHeight;
else
top = targetOuterHeight + targetOffset.top + windowScrollTop;

if (targetOffset.left + targetOuterWidth + elementOuterWidth > viewport.width)
left = targetOffset.left + windowScrollLeft + targetOuterWidth - elementOuterWidth;
else
left = targetOffset.left + windowScrollLeft;

if (position === Position.LEFT) {
let elementOuterHeight = elementDimensions.height;
let elementOuterWidth = elementDimensions.width;
let targetOuterHeight = target.offsetHeight;
let targetOuterWidth = target.offsetWidth;
let targetOffset = target.getBoundingClientRect();
let windowScrollTop = this.getWindowScrollTop();
let windowScrollLeft = this.getWindowScrollLeft();
let viewport = this.getViewport();

if (targetOffset.top + targetOuterHeight + elementOuterHeight > viewport.height)
top = targetOffset.top + windowScrollTop - elementOuterHeight;
else
top = targetOuterHeight + targetOffset.top + windowScrollTop;

if (targetOffset.left + targetOuterWidth + elementOuterWidth > viewport.width)
left = targetOffset.left + windowScrollLeft + targetOuterWidth - elementOuterWidth;
else
left = targetOffset.left + windowScrollLeft;
} else {
top = target.offsetTop + target.offsetHeight;
left = (target.offsetLeft + target.offsetWidth) - elementDimensions.width;
}
element.style.top = top + 'px';
element.style.left = left + 'px';
}
Expand All @@ -136,6 +145,8 @@ export class DomHandler {

public getHiddenElementDimensions(element: any): any {
let dimensions: any = {};
element.style.top = '0px';
element.style.left = '0px';
element.style.visibility = 'hidden';
element.style.display = 'block';
dimensions.width = element.offsetWidth;
Expand Down
6 changes: 4 additions & 2 deletions components/overlaypanel/overlaypanel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ export class OverlayPanel implements OnInit,AfterViewInit,OnDestroy {

@Input() appendTo: any;

@Input() position: string;

@Output() onBeforeShow: EventEmitter<any> = new EventEmitter();

@Output() onAfterShow: EventEmitter<any> = new EventEmitter();
Expand Down Expand Up @@ -103,11 +105,11 @@ export class OverlayPanel implements OnInit,AfterViewInit,OnDestroy {
this.container.style.zIndex = ++DomHandler.zindex;

if(this.visible) {
this.domHandler.absolutePosition(this.container, elementTarget);
this.domHandler.absolutePosition(this.container, elementTarget, this.position);
}
else {
this.visible = true;
this.domHandler.absolutePosition(this.container, elementTarget);
this.domHandler.absolutePosition(this.container, elementTarget, this.position);
this.domHandler.fadeIn(this.container, 250);
}
this.onAfterShow.emit(null);
Expand Down

0 comments on commit 52064bf

Please sign in to comment.