mirror of
https://github.com/nasa/openmct.git
synced 2025-01-31 16:36:13 +00:00
Merge remote-tracking branch 'slhale/open33' into open47b
Fix merge conflict in preparation to integrate nasa/openmctweb#47 Conflicts: platform/commonUI/browse/res/templates/browse/object-header.html
This commit is contained in:
commit
9435e75461
@ -32,6 +32,11 @@
|
|||||||
"key": "LocatorController",
|
"key": "LocatorController",
|
||||||
"implementation": "creation/LocatorController",
|
"implementation": "creation/LocatorController",
|
||||||
"depends": [ "$scope" ]
|
"depends": [ "$scope" ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "MenuArrowController",
|
||||||
|
"implementation": "MenuArrowController",
|
||||||
|
"depends": [ "$scope" ]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"controls": [
|
"controls": [
|
||||||
@ -71,6 +76,12 @@
|
|||||||
"key": "object-header",
|
"key": "object-header",
|
||||||
"templateUrl": "templates/browse/object-header.html",
|
"templateUrl": "templates/browse/object-header.html",
|
||||||
"uses": [ "type" ]
|
"uses": [ "type" ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "menu-arrow",
|
||||||
|
"templateUrl": "templates/menu-arrow.html",
|
||||||
|
"uses": [ "action" ],
|
||||||
|
"gestures": [ "menu" ]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"services": [
|
"services": [
|
||||||
|
@ -25,6 +25,6 @@
|
|||||||
<span ng-if="parameters.mode" class='action'>{{parameters.mode}}</span>
|
<span ng-if="parameters.mode" class='action'>{{parameters.mode}}</span>
|
||||||
<span class='type-name'>{{type.getName()}}</span>
|
<span class='type-name'>{{type.getName()}}</span>
|
||||||
<span class='title-label'>{{model.name}}</span>
|
<span class='title-label'>{{model.name}}</span>
|
||||||
<a id='actions-menu' class='ui-symbol context-available' onclick="alert('Not yet functional. This will display a dropdown menu of options for this object.');">v</a>
|
<mct-representation key="'menu-arrow'" mct-object='domainObject'></mct-representation>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
26
platform/commonUI/browse/res/templates/menu-arrow.html
Normal file
26
platform/commonUI/browse/res/templates/menu-arrow.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<span ng-controller="MenuArrowController as menuArrow">
|
||||||
|
<a class='ui-symbol context-available'
|
||||||
|
ng-click='menuArrow.showMenu($event)'>v</a>
|
||||||
|
</span>
|
51
platform/commonUI/browse/src/MenuArrowController.js
Normal file
51
platform/commonUI/browse/src/MenuArrowController.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining MenuArrowController. Created by shale on 06/30/2015.
|
||||||
|
*/
|
||||||
|
define(
|
||||||
|
[],
|
||||||
|
function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A left-click on the menu arrow should display a
|
||||||
|
* context menu. This controller launches the context
|
||||||
|
* menu.
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
function MenuArrowController($scope) {
|
||||||
|
function showMenu(event) {
|
||||||
|
var actionContext = {key: 'menu', domainObject: $scope.domainObject, event: event};
|
||||||
|
$scope.domainObject.getCapability('action').perform(actionContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
showMenu: showMenu
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return MenuArrowController;
|
||||||
|
}
|
||||||
|
);
|
81
platform/commonUI/browse/test/MenuArrowControllerSpec.js
Normal file
81
platform/commonUI/browse/test/MenuArrowControllerSpec.js
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MenuArrowControllerSpec. Created by shale on 07/02/2015.
|
||||||
|
*/
|
||||||
|
define(
|
||||||
|
["../src/MenuArrowController"],
|
||||||
|
function (MenuArrowController) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe("The menu arrow controller ", function () {
|
||||||
|
var mockScope,
|
||||||
|
mockDomainObject,
|
||||||
|
mockEvent,
|
||||||
|
mockContextMenuAction,
|
||||||
|
mockActionContext,
|
||||||
|
controller;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
mockScope = jasmine.createSpyObj(
|
||||||
|
"$scope",
|
||||||
|
[ "" ]
|
||||||
|
);
|
||||||
|
mockDomainObject = jasmine.createSpyObj(
|
||||||
|
"domainObject",
|
||||||
|
[ "getCapability" ]
|
||||||
|
);
|
||||||
|
mockEvent = jasmine.createSpyObj(
|
||||||
|
"event",
|
||||||
|
[ "preventDefault" ]
|
||||||
|
);
|
||||||
|
mockContextMenuAction = jasmine.createSpyObj(
|
||||||
|
"action",
|
||||||
|
[ "perform", "getActions" ]
|
||||||
|
);
|
||||||
|
mockActionContext = jasmine.createSpyObj(
|
||||||
|
"actionContext",
|
||||||
|
[ "" ]
|
||||||
|
);
|
||||||
|
|
||||||
|
mockActionContext.domainObject = mockDomainObject;
|
||||||
|
mockActionContext.event = mockEvent;
|
||||||
|
mockScope.domainObject = mockDomainObject;
|
||||||
|
mockDomainObject.getCapability.andReturn(mockContextMenuAction);
|
||||||
|
mockContextMenuAction.perform.andReturn(jasmine.any(Function));
|
||||||
|
|
||||||
|
controller = new MenuArrowController(mockScope);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("calls the context menu action when clicked", function () {
|
||||||
|
// Simulate a click on the menu arrow
|
||||||
|
controller.showMenu(mockEvent);
|
||||||
|
|
||||||
|
// Expect the menu action to be performed
|
||||||
|
expect(mockDomainObject.getCapability).toHaveBeenCalledWith('action');
|
||||||
|
expect(mockContextMenuAction.perform).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
@ -1,6 +1,7 @@
|
|||||||
[
|
[
|
||||||
"BrowseController",
|
"BrowseController",
|
||||||
"BrowseObjectController",
|
"BrowseObjectController",
|
||||||
|
"MenuArrowController",
|
||||||
"creation/CreateAction",
|
"creation/CreateAction",
|
||||||
"creation/CreateActionProvider",
|
"creation/CreateActionProvider",
|
||||||
"creation/CreateMenuController",
|
"creation/CreateMenuController",
|
||||||
|
@ -50,7 +50,7 @@ define(
|
|||||||
* expand-to-show-navigated-object behavior.)
|
* expand-to-show-navigated-object behavior.)
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function TreeNodeController($scope, $timeout) {
|
function TreeNodeController($scope, $timeout, $rootScope) {
|
||||||
var selectedObject = ($scope.ngModel || {}).selectedObject,
|
var selectedObject = ($scope.ngModel || {}).selectedObject,
|
||||||
isSelected = false,
|
isSelected = false,
|
||||||
hasBeenExpanded = false;
|
hasBeenExpanded = false;
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
{
|
{
|
||||||
"key": "menu",
|
"key": "menu",
|
||||||
"implementation": "gestures/ContextMenuGesture.js",
|
"implementation": "gestures/ContextMenuGesture.js",
|
||||||
"depends": [ "$compile", "$document", "$window", "$rootScope" ]
|
"depends": []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"components": [
|
"components": [
|
||||||
@ -49,6 +49,13 @@
|
|||||||
"implementation": "services/DndService.js",
|
"implementation": "services/DndService.js",
|
||||||
"depends": [ "$log" ]
|
"depends": [ "$log" ]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"key": "menu",
|
||||||
|
"implementation": "actions/ContextMenuAction.js",
|
||||||
|
"depends": [ "$compile", "$document", "$window", "$rootScope" ]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
116
platform/representation/src/actions/ContextMenuAction.js
Normal file
116
platform/representation/src/actions/ContextMenuAction.js
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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,Promise*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining ContextMenuAction. Created by shale on 06/30/2015.
|
||||||
|
*/
|
||||||
|
define(
|
||||||
|
["../gestures/GestureConstants"],
|
||||||
|
function (GestureConstants) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var MENU_TEMPLATE = "<mct-representation key=\"'context-menu'\" " +
|
||||||
|
"mct-object=\"domainObject\" " +
|
||||||
|
"ng-class=\"menuClass\"" +
|
||||||
|
"ng-style=\"menuStyle\">" +
|
||||||
|
"</mct-representation>",
|
||||||
|
dismissExistingMenu;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches a custom context menu for the domain object it contains.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @param $compile Angular's $compile service
|
||||||
|
* @param $document the current document
|
||||||
|
* @param $window the active window
|
||||||
|
* @param $rootScope Angular's root scope
|
||||||
|
* @param actionContexr the context in which the action
|
||||||
|
* should be performed
|
||||||
|
*/
|
||||||
|
function ContextMenuAction($compile, $document, $window, $rootScope, actionContext) {
|
||||||
|
|
||||||
|
function perform() {
|
||||||
|
var winDim = [$window.innerWidth, $window.innerHeight],
|
||||||
|
eventCoors = [actionContext.event.pageX, actionContext.event.pageY],
|
||||||
|
menuDim = GestureConstants.MCT_MENU_DIMENSIONS,
|
||||||
|
body = $document.find('body'),
|
||||||
|
scope = $rootScope.$new(),
|
||||||
|
goLeft = eventCoors[0] + menuDim[0] > winDim[0],
|
||||||
|
goUp = eventCoors[1] + menuDim[1] > winDim[1],
|
||||||
|
menu;
|
||||||
|
|
||||||
|
// Remove the context menu
|
||||||
|
function dismiss() {
|
||||||
|
menu.remove();
|
||||||
|
body.off("click", dismiss);
|
||||||
|
dismissExistingMenu = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dismiss any menu which was already showing
|
||||||
|
if (dismissExistingMenu) {
|
||||||
|
dismissExistingMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...and record the presence of this menu.
|
||||||
|
dismissExistingMenu = dismiss;
|
||||||
|
|
||||||
|
// Set up the scope, including menu positioning
|
||||||
|
scope.domainObject = actionContext.domainObject;
|
||||||
|
scope.menuStyle = {};
|
||||||
|
scope.menuStyle[goLeft ? "right" : "left"] =
|
||||||
|
(goLeft ? (winDim[0] - eventCoors[0]) : eventCoors[0]) + 'px';
|
||||||
|
scope.menuStyle[goUp ? "bottom" : "top"] =
|
||||||
|
(goUp ? (winDim[1] - eventCoors[1]) : eventCoors[1]) + 'px';
|
||||||
|
scope.menuClass = {
|
||||||
|
"go-left": goLeft,
|
||||||
|
"go-up": goUp,
|
||||||
|
"context-menu-holder": true
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create the context menu
|
||||||
|
menu = $compile(MENU_TEMPLATE)(scope);
|
||||||
|
|
||||||
|
// Add the menu to the body
|
||||||
|
body.append(menu);
|
||||||
|
|
||||||
|
// Stop propagation so that clicks on the menu do not close the menu
|
||||||
|
menu.on('mousedown', function (event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Dismiss the menu when body is clicked elsewhere
|
||||||
|
// ('mousedown' because 'click' breaks left-click context menus)
|
||||||
|
body.on('mousedown', dismiss);
|
||||||
|
|
||||||
|
// Don't launch browser's context menu
|
||||||
|
actionContext.event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
perform: perform
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return ContextMenuAction;
|
||||||
|
}
|
||||||
|
);
|
@ -22,102 +22,41 @@
|
|||||||
/*global define,Promise*/
|
/*global define,Promise*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining ContextMenuGesture. Created by vwoeltje on 11/17/14.
|
* Module defining ContextMenuGesture.
|
||||||
|
* Created by vwoeltje on 11/17/14. Modified by shale on 06/30/2015.
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
["./GestureConstants"],
|
function () {
|
||||||
function (GestureConstants) {
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var MENU_TEMPLATE = "<mct-representation key=\"'context-menu'\" " +
|
|
||||||
"mct-object=\"domainObject\" " +
|
|
||||||
"ng-class=\"menuClass\"" +
|
|
||||||
"ng-style=\"menuStyle\">" +
|
|
||||||
"</mct-representation>",
|
|
||||||
dismissExistingMenu;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add listeners to a representation such that it launches a
|
* Add listeners to a representation such that it calls the
|
||||||
* custom context menu for the domain object it contains.
|
* context menu action for the domain object it contains.
|
||||||
*
|
*
|
||||||
* @constructor
|
* @constructor
|
||||||
* @param $compile Angular's $compile service
|
|
||||||
* @param $document the current document
|
|
||||||
* @param $window the active window
|
|
||||||
* @param $rootScope Angular's root scope
|
|
||||||
* @param element the jqLite-wrapped element which should exhibit
|
* @param element the jqLite-wrapped element which should exhibit
|
||||||
* the context mennu
|
* the context mennu
|
||||||
* @param {DomainObject} domainObject the object on which actions
|
* @param {DomainObject} domainObject the object on which actions
|
||||||
* in the context menu will be performed
|
* in the context menu will be performed
|
||||||
*/
|
*/
|
||||||
function ContextMenuGesture($compile, $document, $window, $rootScope, element, domainObject) {
|
function ContextMenuGesture(element, domainObject) {
|
||||||
function showMenu(event) {
|
var actionContext,
|
||||||
var winDim = [$window.innerWidth, $window.innerHeight],
|
stop;
|
||||||
eventCoors = [event.pageX, event.pageY],
|
|
||||||
menuDim = GestureConstants.MCT_MENU_DIMENSIONS,
|
|
||||||
body = $document.find('body'),
|
|
||||||
scope = $rootScope.$new(),
|
|
||||||
goLeft = eventCoors[0] + menuDim[0] > winDim[0],
|
|
||||||
goUp = eventCoors[1] + menuDim[1] > winDim[1],
|
|
||||||
menu;
|
|
||||||
|
|
||||||
// Remove the context menu
|
|
||||||
function dismiss() {
|
|
||||||
menu.remove();
|
|
||||||
body.off("click", dismiss);
|
|
||||||
dismissExistingMenu = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dismiss any menu which was already showing
|
|
||||||
if (dismissExistingMenu) {
|
|
||||||
dismissExistingMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...and record the presence of this menu.
|
|
||||||
dismissExistingMenu = dismiss;
|
|
||||||
|
|
||||||
// Set up the scope, including menu positioning
|
|
||||||
scope.domainObject = domainObject;
|
|
||||||
scope.menuStyle = {};
|
|
||||||
scope.menuStyle[goLeft ? "right" : "left"] =
|
|
||||||
(goLeft ? (winDim[0] - eventCoors[0]) : eventCoors[0]) + 'px';
|
|
||||||
scope.menuStyle[goUp ? "bottom" : "top"] =
|
|
||||||
(goUp ? (winDim[1] - eventCoors[1]) : eventCoors[1]) + 'px';
|
|
||||||
scope.menuClass = {
|
|
||||||
"go-left": goLeft,
|
|
||||||
"go-up": goUp,
|
|
||||||
"context-menu-holder": true
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create the context menu
|
|
||||||
menu = $compile(MENU_TEMPLATE)(scope);
|
|
||||||
|
|
||||||
// Add the menu to the body
|
|
||||||
body.append(menu);
|
|
||||||
|
|
||||||
// Dismiss the menu when body is clicked elsewhere
|
|
||||||
body.on('click', dismiss);
|
|
||||||
|
|
||||||
// Don't launch browser's context menu
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
// When context menu event occurs, show object actions instead
|
// When context menu event occurs, show object actions instead
|
||||||
element.on('contextmenu', showMenu);
|
element.on('contextmenu', function (event) {
|
||||||
|
actionContext = {key: 'menu', domainObject: domainObject, event: event};
|
||||||
|
stop = domainObject.getCapability('action').perform(actionContext);
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
/**
|
/**
|
||||||
* Detach any event handlers associated with this gesture,
|
* Detach any event handlers associated with this gesture.
|
||||||
* and dismiss any visible menu.
|
|
||||||
* @method
|
* @method
|
||||||
* @memberof ContextMenuGesture
|
* @memberof ContextMenuGesture
|
||||||
*/
|
*/
|
||||||
destroy: function () {
|
destroy: function () {
|
||||||
// Scope has been destroyed, so remove all listeners.
|
element.off('contextmenu', stop);
|
||||||
if (dismissExistingMenu) {
|
|
||||||
dismissExistingMenu();
|
|
||||||
}
|
|
||||||
element.off('contextmenu', showMenu);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
140
platform/representation/test/actions/ContextMenuActionSpec.js
Normal file
140
platform/representation/test/actions/ContextMenuActionSpec.js
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining ContextMenuActionSpec. Created by shale on 07/02/2015.
|
||||||
|
*/
|
||||||
|
define(
|
||||||
|
["../../src/actions/ContextMenuAction", "../../src/gestures/GestureConstants"],
|
||||||
|
function (ContextMenuAction, GestureConstants) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var JQLITE_FUNCTIONS = [ "on", "off", "find", "append", "remove" ],
|
||||||
|
DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ],
|
||||||
|
MENU_DIMENSIONS = GestureConstants.MCT_MENU_DIMENSIONS;
|
||||||
|
|
||||||
|
|
||||||
|
describe("The 'context menu' action", function () {
|
||||||
|
var mockCompile,
|
||||||
|
mockCompiledTemplate,
|
||||||
|
mockMenu,
|
||||||
|
mockDocument,
|
||||||
|
mockBody,
|
||||||
|
mockWindow,
|
||||||
|
mockRootScope,
|
||||||
|
mockScope,
|
||||||
|
mockElement,
|
||||||
|
mockDomainObject,
|
||||||
|
mockEvent,
|
||||||
|
mockActionContext,
|
||||||
|
action;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
mockCompile = jasmine.createSpy("$compile");
|
||||||
|
mockCompiledTemplate = jasmine.createSpy("template");
|
||||||
|
mockMenu = jasmine.createSpyObj("menu", JQLITE_FUNCTIONS);
|
||||||
|
mockDocument = jasmine.createSpyObj("$document", JQLITE_FUNCTIONS);
|
||||||
|
mockBody = jasmine.createSpyObj("body", JQLITE_FUNCTIONS);
|
||||||
|
mockWindow = { innerWidth: MENU_DIMENSIONS[0] * 4, innerHeight: MENU_DIMENSIONS[1] * 4 };
|
||||||
|
mockRootScope = jasmine.createSpyObj("$rootScope", ["$new"]);
|
||||||
|
mockScope = {};
|
||||||
|
mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS);
|
||||||
|
mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS);
|
||||||
|
mockEvent = jasmine.createSpyObj("event", ["preventDefault"]);
|
||||||
|
mockEvent.pageX = 0;
|
||||||
|
mockEvent.pageY = 0;
|
||||||
|
|
||||||
|
mockCompile.andReturn(mockCompiledTemplate);
|
||||||
|
mockCompiledTemplate.andReturn(mockMenu);
|
||||||
|
mockDocument.find.andReturn(mockBody);
|
||||||
|
mockRootScope.$new.andReturn(mockScope);
|
||||||
|
|
||||||
|
mockActionContext = {key: 'menu', domainObject: mockDomainObject, event: mockEvent};
|
||||||
|
|
||||||
|
action = new ContextMenuAction(
|
||||||
|
mockCompile,
|
||||||
|
mockDocument,
|
||||||
|
mockWindow,
|
||||||
|
mockRootScope,
|
||||||
|
mockActionContext
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(" adds a menu to the DOM when perform is called", function () {
|
||||||
|
action.perform();
|
||||||
|
expect(mockBody.append).toHaveBeenCalledWith(mockMenu);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("prevents the default context menu behavior", function () {
|
||||||
|
action.perform();
|
||||||
|
expect(mockEvent.preventDefault).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("positions menus where clicked", function () {
|
||||||
|
mockEvent.pageX = 10;
|
||||||
|
mockEvent.pageY = 5;
|
||||||
|
action.perform();
|
||||||
|
expect(mockScope.menuStyle.left).toEqual("10px");
|
||||||
|
expect(mockScope.menuStyle.top).toEqual("5px");
|
||||||
|
expect(mockScope.menuStyle.right).toBeUndefined();
|
||||||
|
expect(mockScope.menuStyle.bottom).toBeUndefined();
|
||||||
|
expect(mockScope.menuClass['go-up']).toBeFalsy();
|
||||||
|
expect(mockScope.menuClass['go-left']).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("repositions menus near the screen edge", function () {
|
||||||
|
mockEvent.pageX = mockWindow.innerWidth - 10;
|
||||||
|
mockEvent.pageY = mockWindow.innerHeight - 5;
|
||||||
|
action.perform();
|
||||||
|
expect(mockScope.menuStyle.right).toEqual("10px");
|
||||||
|
expect(mockScope.menuStyle.bottom).toEqual("5px");
|
||||||
|
expect(mockScope.menuStyle.left).toBeUndefined();
|
||||||
|
expect(mockScope.menuStyle.top).toBeUndefined();
|
||||||
|
expect(mockScope.menuClass['go-up']).toBeTruthy();
|
||||||
|
expect(mockScope.menuClass['go-left']).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("removes a menu when body is clicked", function () {
|
||||||
|
// Show the menu
|
||||||
|
action.perform();
|
||||||
|
|
||||||
|
// Verify precondition
|
||||||
|
expect(mockBody.off).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
// Find and fire body's mousedown listener
|
||||||
|
mockBody.on.calls.forEach(function (call) {
|
||||||
|
if (call.args[0] === 'mousedown') {
|
||||||
|
call.args[1]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Menu should have been removed
|
||||||
|
expect(mockMenu.remove).toHaveBeenCalled();
|
||||||
|
|
||||||
|
// Listener should have been detached from body
|
||||||
|
expect(mockBody.off).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
@ -26,58 +26,27 @@
|
|||||||
* Module defining ContextMenuGestureSpec. Created by vwoeltje on 11/22/14.
|
* Module defining ContextMenuGestureSpec. Created by vwoeltje on 11/22/14.
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
["../../src/gestures/ContextMenuGesture", "../../src/gestures/GestureConstants"],
|
["../../src/gestures/ContextMenuGesture"],
|
||||||
function (ContextMenuGesture, GestureConstants) {
|
function (ContextMenuGesture) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var JQLITE_FUNCTIONS = [ "on", "off", "find", "append", "remove" ],
|
var JQLITE_FUNCTIONS = [ "on", "off", "find", "append", "remove" ],
|
||||||
DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ],
|
DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ];
|
||||||
MENU_DIMENSIONS = GestureConstants.MCT_MENU_DIMENSIONS;
|
|
||||||
|
|
||||||
|
|
||||||
describe("The 'context menu' gesture", function () {
|
describe("The 'context menu' gesture", function () {
|
||||||
var mockCompile,
|
var mockElement,
|
||||||
mockCompiledTemplate,
|
|
||||||
mockMenu,
|
|
||||||
mockDocument,
|
|
||||||
mockBody,
|
|
||||||
mockWindow,
|
|
||||||
mockRootScope,
|
|
||||||
mockScope,
|
|
||||||
mockElement,
|
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
mockEvent,
|
mockEvent,
|
||||||
gesture,
|
gesture,
|
||||||
fireGesture;
|
fireGesture;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
mockCompile = jasmine.createSpy("$compile");
|
|
||||||
mockCompiledTemplate = jasmine.createSpy("template");
|
|
||||||
mockMenu = jasmine.createSpyObj("menu", JQLITE_FUNCTIONS);
|
|
||||||
mockDocument = jasmine.createSpyObj("$document", JQLITE_FUNCTIONS);
|
|
||||||
mockBody = jasmine.createSpyObj("body", JQLITE_FUNCTIONS);
|
|
||||||
mockWindow = { innerWidth: MENU_DIMENSIONS[0] * 4, innerHeight: MENU_DIMENSIONS[1] * 4 };
|
|
||||||
mockRootScope = jasmine.createSpyObj("$rootScope", ["$new"]);
|
|
||||||
mockScope = {};
|
|
||||||
mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS);
|
mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS);
|
||||||
mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS);
|
mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS);
|
||||||
mockEvent = jasmine.createSpyObj("event", ["preventDefault"]);
|
mockEvent = jasmine.createSpyObj("event", ["preventDefault"]);
|
||||||
mockEvent.pageX = 0;
|
|
||||||
mockEvent.pageY = 0;
|
|
||||||
|
|
||||||
mockCompile.andReturn(mockCompiledTemplate);
|
gesture = new ContextMenuGesture(mockElement, mockDomainObject);
|
||||||
mockCompiledTemplate.andReturn(mockMenu);
|
|
||||||
mockDocument.find.andReturn(mockBody);
|
|
||||||
mockRootScope.$new.andReturn(mockScope);
|
|
||||||
|
|
||||||
gesture = new ContextMenuGesture(
|
|
||||||
mockCompile,
|
|
||||||
mockDocument,
|
|
||||||
mockWindow,
|
|
||||||
mockRootScope,
|
|
||||||
mockElement,
|
|
||||||
mockDomainObject
|
|
||||||
);
|
|
||||||
|
|
||||||
// Capture the contextmenu callback
|
// Capture the contextmenu callback
|
||||||
fireGesture = mockElement.on.mostRecentCall.args[1];
|
fireGesture = mockElement.on.mostRecentCall.args[1];
|
||||||
@ -97,85 +66,10 @@ define(
|
|||||||
|
|
||||||
expect(mockElement.off).toHaveBeenCalledWith(
|
expect(mockElement.off).toHaveBeenCalledWith(
|
||||||
"contextmenu",
|
"contextmenu",
|
||||||
mockElement.on.mostRecentCall.args[1]
|
//mockElement.on.mostRecentCall.args[1]
|
||||||
|
mockDomainObject.calls
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("compiles and adds a menu to the DOM on a contextmenu event", function () {
|
|
||||||
// Make sure that callback really is for the contextmenu event
|
|
||||||
expect(mockElement.on.mostRecentCall.args[0]).toEqual("contextmenu");
|
|
||||||
|
|
||||||
fireGesture(mockEvent);
|
|
||||||
|
|
||||||
expect(mockBody.append).toHaveBeenCalledWith(mockMenu);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("prevents the default context menu behavior", function () {
|
|
||||||
fireGesture(mockEvent);
|
|
||||||
expect(mockEvent.preventDefault).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("positions menus where clicked", function () {
|
|
||||||
mockEvent.pageX = 10;
|
|
||||||
mockEvent.pageY = 5;
|
|
||||||
fireGesture(mockEvent);
|
|
||||||
expect(mockScope.menuStyle.left).toEqual("10px");
|
|
||||||
expect(mockScope.menuStyle.top).toEqual("5px");
|
|
||||||
expect(mockScope.menuStyle.right).toBeUndefined();
|
|
||||||
expect(mockScope.menuStyle.bottom).toBeUndefined();
|
|
||||||
expect(mockScope.menuClass['go-up']).toBeFalsy();
|
|
||||||
expect(mockScope.menuClass['go-left']).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("repositions menus near the screen edge", function () {
|
|
||||||
mockEvent.pageX = mockWindow.innerWidth - 10;
|
|
||||||
mockEvent.pageY = mockWindow.innerHeight - 5;
|
|
||||||
fireGesture(mockEvent);
|
|
||||||
expect(mockScope.menuStyle.right).toEqual("10px");
|
|
||||||
expect(mockScope.menuStyle.bottom).toEqual("5px");
|
|
||||||
expect(mockScope.menuStyle.left).toBeUndefined();
|
|
||||||
expect(mockScope.menuStyle.top).toBeUndefined();
|
|
||||||
expect(mockScope.menuClass['go-up']).toBeTruthy();
|
|
||||||
expect(mockScope.menuClass['go-left']).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("removes a menu when body is clicked", function () {
|
|
||||||
// Show the menu
|
|
||||||
fireGesture(mockEvent);
|
|
||||||
|
|
||||||
// Verify precondition
|
|
||||||
expect(mockBody.off).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
// Find and fire body's click listener
|
|
||||||
mockBody.on.calls.forEach(function (call) {
|
|
||||||
if (call.args[0] === 'click') {
|
|
||||||
call.args[1]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Menu should have been removed
|
|
||||||
expect(mockMenu.remove).toHaveBeenCalled();
|
|
||||||
|
|
||||||
// Listener should have been detached from body
|
|
||||||
expect(mockBody.off).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("removes listeners from body if destroyed while menu is showing", function () {
|
|
||||||
// Show the menu
|
|
||||||
fireGesture(mockEvent);
|
|
||||||
|
|
||||||
// Verify preconditions
|
|
||||||
expect(mockBody.off).not.toHaveBeenCalled();
|
|
||||||
expect(mockMenu.remove).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
// Destroy the menu
|
|
||||||
gesture.destroy();
|
|
||||||
|
|
||||||
// Verify menu was removed and listener detached
|
|
||||||
expect(mockBody.off).toHaveBeenCalled();
|
|
||||||
expect(mockMenu.remove).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
@ -1,4 +1,5 @@
|
|||||||
[
|
[
|
||||||
|
"actions/ContextMenuAction",
|
||||||
"gestures/ContextMenuGesture",
|
"gestures/ContextMenuGesture",
|
||||||
"gestures/DragGesture",
|
"gestures/DragGesture",
|
||||||
"gestures/DropGesture",
|
"gestures/DropGesture",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user