diff options
| -rw-r--r-- | bower.json | 2 | ||||
| -rw-r--r-- | example/index.html | 5 | ||||
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | src/nsPopover.js | 43 |
4 files changed, 40 insertions, 12 deletions
@@ -1,6 +1,6 @@ { "name": "nsPopover", - "version": "0.1.0", + "version": "0.2.0", "homepage": "https://github.com/nohros/nsPopover", "description": "Popover for angularjs library", "authors": [ diff --git a/example/index.html b/example/index.html index 9c7f01a..c9bd47e 100644 --- a/example/index.html +++ b/example/index.html @@ -25,15 +25,14 @@ <article>
<button ns-popover
ns-popover-template="popover"
- ns-popover-trigger="click"
- ns-popover-placement="bottom">
+ ns-popover-trigger="click">
Popover on bottom
</button>
<button ns-popover
ns-popover-template="popover"
ns-popover-trigger="click"
- ns-popover-placement="top">
+ ns-popover-placement="top|left">
Popover on top
</button>
diff --git a/package.json b/package.json index 1ad001a..9a10e21 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "author": "Neylor Ohmaly", "name": "nsPopover", - "version": "0.1.0", + "version": "0.2.0", "homepage": "http://nohros.com/nsPopover", "licenses": { "type": "MIT", diff --git a/src/nsPopover.js b/src/nsPopover.js index d31aad5..d391fac 100644 --- a/src/nsPopover.js +++ b/src/nsPopover.js @@ -36,7 +36,7 @@ plain: attrs.nsPopoverPlain,
trigger: attrs.nsPopoverTrigger || 'click',
container: attrs.nsPopoverContainer,
- placement: attrs.nsPopoverPlacement || 'bottom'
+ placement: attrs.nsPopoverPlacement || 'bottom|left'
};
var timeoutId_ = {};
@@ -47,6 +47,18 @@ }
var $popover = $el('<div></div>');
+ var placement_;
+ var align_;
+
+ var match = options.placement
+ .match(/^(top|bottom|left|right)$|((top|bottom)\|(center|left|right)+)|((left|right)\|(center|top|bottom)+)/);
+
+ if (!match) {
+ throw new Error('"' + options.placement + '" is not a valid placement or has a invalid combination of placements.');
+ }
+
+ placement_ = match[3] || match[1];
+ align_ = match[4] || match[2] || 'center';
$q.when(loadTemplate(options.template, options.plain)).then(function(template) {
template = angular.isString(template) ?
@@ -85,7 +97,7 @@ // position the popover accordingly to the defined placement around the
// |elm|.
- move($popover, options.placement, elm[0].getBoundingClientRect());
+ move($popover, placement_, align_, elm[0].getBoundingClientRect());
// Hide the popover without delay on click events.
$popover.on('click', function() {
@@ -112,20 +124,37 @@ * @param placement {String} The relative position to move the popover - top | bottom | left | right.
* @param rect {ClientRect} The ClientRect of the object to move the popover around.
*/
- function move(popover, placement, rect) {
+ function move(popover, placement, align, rect) {
var popoverRect = popover[0].getBoundingClientRect();
var top, left;
+
+ var positionX = function() {
+ if (align === 'center') {
+ return Math.round(rect.left + rect.width/2 - popoverRect.width/2);
+ } else {
+ return rect[align];
+ }
+ };
+
+ var positionY = function() {
+ if (align === 'center') {
+ return Math.round(rect.top + rect.height/2 - popoverRect.height/2);
+ } else {
+ return rect[align];
+ }
+ };
+
if (placement === 'top') {
top = rect.top - popoverRect.height - 1;
- left = rect.left;
+ left = positionX();
} else if (placement === 'right') {
- top = rect.top;
+ top = positionY();
left = rect.right +1;
} else if (placement === 'bottom') {
top = rect.bottom + 1;
- left = rect.left;
+ left = positionX(align);
} else if (placement === 'left') {
- top = rect.top;
+ top = positionY(align);
left = rect.left - popoverRect.width - 1;
}
popover
|
