[Time Conductor] Show appropriate arrow

...on info bubbles, when using bubbles shown via the
popupService.
This commit is contained in:
Victor Woeltjen
2015-10-01 16:59:12 -07:00
parent 6cbd3e5fae
commit dfe909d6b5
4 changed files with 111 additions and 27 deletions

View File

@ -0,0 +1,89 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define(
function () {
"use strict";
/**
* A popup is an element that has been displayed at a particular
* location within the page.
* @constructor
* @memberof platform/commonUI/general
* @param element the jqLite-wrapped element
* @param {object} styles an object containing key-value pairs
* of styles used to position the element.
*/
function Popup(element, styles) {
this.styles = styles;
this.element = element;
element.css(styles);
}
/**
* Stop showing this popup.
*/
Popup.prototype.dismiss = function () {
this.element.remove();
};
/**
* Check if this popup is positioned such that it appears to the
* left of its original location.
* @returns {boolean} true if the popup goes left
*/
Popup.prototype.goesLeft = function () {
return !this.styles.left;
};
/**
* Check if this popup is positioned such that it appears to the
* right of its original location.
* @returns {boolean} true if the popup goes right
*/
Popup.prototype.goesRight = function () {
return !this.styles.right;
};
/**
* Check if this popup is positioned such that it appears above
* its original location.
* @returns {boolean} true if the popup goes up
*/
Popup.prototype.goesUp = function () {
return !this.styles.top;
};
/**
* Check if this popup is positioned such that it appears below
* its original location.
* @returns {boolean} true if the popup goes down
*/
Popup.prototype.goesDown = function () {
return !this.styles.bottom;
};
return Popup;
}
);

View File

@ -22,7 +22,8 @@
/*global define*/ /*global define*/
define( define(
function () { ['./Popup'],
function (Popup) {
"use strict"; "use strict";
/** /**
@ -73,14 +74,14 @@ define(
* relative to the right or bottom of the window. * relative to the right or bottom of the window.
* @param {PopupOptions} [options] additional options to control * @param {PopupOptions} [options] additional options to control
* positioning of the popup * positioning of the popup
* @returns {Function} a function that may be invoked to * @returns {platform/commonUI/general.Popup} the popup
* dismiss the info bubble
*/ */
PopupService.prototype.display = function (element, position, options) { PopupService.prototype.display = function (element, position, options) {
var $document = this.$document, var $document = this.$document,
$window = this.$window, $window = this.$window,
body = $document.find('body'), body = $document.find('body'),
winDim = [ $window.innerWidth, $window.innerHeight ], winDim = [ $window.innerWidth, $window.innerHeight ],
styles = { position: 'absolute' },
margin, margin,
offset, offset,
bubble; bubble;
@ -107,32 +108,23 @@ define(
position = position.map(adjustNegatives); position = position.map(adjustNegatives);
// Position the element
element.css('position', 'absolute');
if (position[0] > margin[0]) { if (position[0] > margin[0]) {
element.css('right', (winDim[0] - position[0] + offset[0]) + 'px'); styles.right = (winDim[0] - position[0] + offset[0]) + 'px';
applyClassOption('left');
} else { } else {
element.css('left', position[0] + offset[0] + 'px'); styles.left = (position[0] + offset[0]) + 'px';
applyClassOption('right');
} }
if (position[1] > margin[1]) { if (position[1] > margin[1]) {
element.css('bottom', (winDim[1] - position[1] + offset[1]) + 'px'); styles.bottom = (winDim[1] - position[1] + offset[1]) + 'px';
applyClassOption('up');
} else { } else {
element.css('top', position[1] + offset[1] + 'px'); styles.top = (position[1] + offset[1]) + 'px';
applyClassOption('down');
} }
// Add the menu to the body // Add the menu to the body
body.append(element); body.append(element);
// Return a function to dismiss the bubble // Return a function to dismiss the bubble
return function () { return new Popup(element, styles);
element.remove();
};
}; };
return PopupService; return PopupService;

View File

@ -32,17 +32,14 @@ define({
"bubble-title=\"{{bubbleTitle}}\" " + "bubble-title=\"{{bubbleTitle}}\" " +
"bubble-layout=\"{{bubbleLayout}}\" " + "bubble-layout=\"{{bubbleLayout}}\" " +
"class=\"bubble-container\">" + "class=\"bubble-container\">" +
"<mct-include key=\"bubbleTemplate\" ng-model=\"bubbleModel\">" + "<mct-include key=\"bubbleTemplate\" " +
"ng-model=\"bubbleModel\">" +
"</mct-include>" + "</mct-include>" +
"</mct-container>", "</mct-container>",
// Options and classes for bubble // Options and classes for bubble
BUBBLE_OPTIONS: { BUBBLE_OPTIONS: {
offsetX: 0, offsetX: 0,
offsetY: -26, offsetY: -26
leftClass: 'arw-left',
rightClass: 'arw-right',
topClass: 'arw-top',
bottomClss: 'arw-btm'
}, },
BUBBLE_MOBILE_POSITION: [ 0, -25 ], BUBBLE_MOBILE_POSITION: [ 0, -25 ],
// Max width and margins allowed for bubbles; defined in /platform/commonUI/general/res/sass/_constants.scss // Max width and margins allowed for bubbles; defined in /platform/commonUI/general/res/sass/_constants.scss

View File

@ -60,7 +60,7 @@ define(
bubbleSpaceLR = InfoConstants.BUBBLE_MARGIN_LR + bubbleSpaceLR = InfoConstants.BUBBLE_MARGIN_LR +
InfoConstants.BUBBLE_MAX_WIDTH, InfoConstants.BUBBLE_MAX_WIDTH,
options, options,
dismissPopup, popup,
bubble; bubble;
// Pass model & container parameters into the scope // Pass model & container parameters into the scope
@ -81,12 +81,18 @@ define(
options = {}; options = {};
} }
dismissPopup = popup = this.popupService.display(bubble, position, options);
this.popupService.display(bubble, position, options);
// Style the bubble according to how it was positioned
if (popup.goesLeft()) {
scope.bubbleLayout = 'arw-right';
} else if (popup.goesRight()) {
scope.bubbleLayout = 'arw-left';
}
// Return a function to dismiss the info bubble // Return a function to dismiss the info bubble
return function dismiss() { return function dismiss() {
dismissPopup(); popup.dismiss();
scope.$destroy(); scope.$destroy();
}; };
}; };