diff --git a/package.json b/package.json index d405162e0a..a0b367dc96 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "printj": "^1.1.0", "raw-loader": "^0.5.1", "request": "^2.69.0", - "screenfull": "^3.3.2", "split": "^1.0.0", "style-loader": "^0.21.0", "v8-compile-cache": "^1.1.0", diff --git a/platform/commonUI/browse/bundle.js b/platform/commonUI/browse/bundle.js index 415f58b3e7..21347cf5c5 100644 --- a/platform/commonUI/browse/bundle.js +++ b/platform/commonUI/browse/bundle.js @@ -31,7 +31,6 @@ define([ "./src/navigation/NavigateAction", "./src/navigation/OrphanNavigationHandler", "./src/windowing/NewTabAction", - "./src/windowing/FullscreenAction", "./src/windowing/WindowTitler", "./res/templates/browse.html", "./res/templates/browse-object.html", @@ -53,7 +52,6 @@ define([ NavigateAction, OrphanNavigationHandler, NewTabAction, - FullscreenAction, WindowTitler, browseTemplate, browseObjectTemplate, @@ -225,13 +223,6 @@ define([ "group": "windowing", "cssClass": "icon-new-window", "priority": "preferred" - }, - { - "key": "fullscreen", - "implementation": FullscreenAction, - "category": "view-control", - "group": "windowing", - "priority": "default" } ], "runs": [ @@ -265,18 +256,6 @@ define([ key: "inspectorRegion", template: inspectorRegionTemplate } - ], - "licenses": [ - { - "name": "screenfull.js", - "version": "1.2.0", - "description": "Wrapper for cross-browser usage of fullscreen API", - "author": "Sindre Sorhus", - "website": "https://github.com/sindresorhus/screenfull.js/", - "copyright": "Copyright (c) Sindre Sorhus (sindresorhus.com)", - "license": "license-mit", - "link": "https://github.com/sindresorhus/screenfull.js/blob/gh-pages/license" - } ] } }); diff --git a/platform/commonUI/browse/src/windowing/FullscreenAction.js b/platform/commonUI/browse/src/windowing/FullscreenAction.js deleted file mode 100644 index 7fc720a91b..0000000000 --- a/platform/commonUI/browse/src/windowing/FullscreenAction.js +++ /dev/null @@ -1,64 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -/** - * Module defining FullscreenAction. Created by vwoeltje on 11/18/14. - */ -define( - ["screenfull"], - function (screenfull) { - - var ENTER_FULLSCREEN = "Enter full screen mode", - EXIT_FULLSCREEN = "Exit full screen mode"; - - /** - * The fullscreen action toggles between fullscreen display - * and regular in-window display. - * @memberof platform/commonUI/browse - * @constructor - * @implements {Action} - */ - function FullscreenAction(context) { - this.context = context; - } - - FullscreenAction.prototype.perform = function () { - screenfull.toggle(); - }; - - FullscreenAction.prototype.getMetadata = function () { - // We override getMetadata, because the icon cssClass and - // description need to be determined at run-time - // based on whether or not we are currently - // full screen. - var metadata = Object.create(FullscreenAction); - metadata.cssClass = screenfull.isFullscreen ? "icon-fullscreen-expand" : "icon-fullscreen-collapse"; - metadata.description = screenfull.isFullscreen ? - EXIT_FULLSCREEN : ENTER_FULLSCREEN; - metadata.group = "windowing"; - metadata.context = this.context; - return metadata; - }; - - return FullscreenAction; - } -); diff --git a/platform/commonUI/browse/test/windowing/FullscreenActionSpec.js b/platform/commonUI/browse/test/windowing/FullscreenActionSpec.js deleted file mode 100644 index 3709f4c1b1..0000000000 --- a/platform/commonUI/browse/test/windowing/FullscreenActionSpec.js +++ /dev/null @@ -1,59 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -/** - * MCTRepresentationSpec. Created by vwoeltje on 11/6/14. - */ -define( - ["../../src/windowing/FullscreenAction", "screenfull"], - function (FullscreenAction, screenfull) { - - describe("The fullscreen action", function () { - var action, - oldToggle; - - beforeEach(function () { - // Screenfull is not shimmed or injected, so - // we need to spy on it in the global scope. - oldToggle = screenfull.toggle; - - screenfull.toggle = jasmine.createSpy("toggle"); - - action = new FullscreenAction({}); - }); - - afterEach(function () { - screenfull.toggle = oldToggle; - }); - - it("toggles fullscreen mode when performed", function () { - action.perform(); - expect(screenfull.toggle).toHaveBeenCalled(); - }); - - it("provides displayable metadata", function () { - expect(action.getMetadata().cssClass).toBeDefined(); - }); - - }); - } -); diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index b0bede1f1f..d421c4bec8 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -34,9 +34,6 @@ define([ "./src/actions/CancelAction", "./src/policies/EditActionPolicy", "./src/policies/EditPersistableObjectsPolicy", - "./src/policies/EditableLinkPolicy", - "./src/policies/EditableMovePolicy", - "./src/policies/EditContextualActionPolicy", "./src/representers/EditRepresenter", "./src/capabilities/EditorCapability", "./src/capabilities/TransactionCapabilityDecorator", @@ -69,9 +66,6 @@ define([ CancelAction, EditActionPolicy, EditPersistableObjectsPolicy, - EditableLinkPolicy, - EditableMovePolicy, - EditContextualActionPolicy, EditRepresenter, EditorCapability, TransactionCapabilityDecorator, @@ -174,7 +168,7 @@ define([ "name": "Remove", "description": "Remove this object from its containing object.", "depends": [ - "dialogService", + "openmct", "navigationService" ] }, @@ -240,19 +234,6 @@ define([ "implementation": EditPersistableObjectsPolicy, "depends": ["openmct"] }, - { - "category": "action", - "implementation": EditContextualActionPolicy, - "depends": ["navigationService", "editModeBlacklist", "nonEditContextBlacklist"] - }, - { - "category": "action", - "implementation": EditableMovePolicy - }, - { - "category": "action", - "implementation": EditableLinkPolicy - }, { "implementation": CreationPolicy, "category": "creation" @@ -349,16 +330,6 @@ define([ ] } ], - "constants": [ - { - "key": "editModeBlacklist", - "value": ["copy", "follow", "link", "locate"] - }, - { - "key": "nonEditContextBlacklist", - "value": ["copy", "follow", "properties", "move", "link", "remove", "locate"] - } - ], "capabilities": [ { "key": "editor", diff --git a/platform/commonUI/edit/src/actions/RemoveAction.js b/platform/commonUI/edit/src/actions/RemoveAction.js index 3c921b316b..fc5fbaa86a 100644 --- a/platform/commonUI/edit/src/actions/RemoveAction.js +++ b/platform/commonUI/edit/src/actions/RemoveAction.js @@ -42,9 +42,9 @@ define([ * @constructor * @implements {Action} */ - function RemoveAction(dialogService, navigationService, context) { + function RemoveAction(openmct, navigationService, context) { this.domainObject = (context || {}).domainObject; - this.dialogService = dialogService; + this.openmct = openmct; this.navigationService = navigationService; } @@ -53,7 +53,6 @@ define([ */ RemoveAction.prototype.perform = function () { var dialog, - dialogService = this.dialogService, domainObject = this.domainObject, navigationService = this.navigationService; /* @@ -104,13 +103,13 @@ define([ * capability. Based on object's location and selected object's location * user may be navigated to existing parent object */ - function removeFromContext(object) { - var contextCapability = object.getCapability('context'), + function removeFromContext() { + var contextCapability = domainObject.getCapability('context'), parent = contextCapability.getParent(); // If currently within path of removed object(s), // navigates to existing object up tree - checkObjectNavigation(object, parent); + checkObjectNavigation(domainObject, parent); return parent.useCapability('mutation', doMutate); } @@ -119,7 +118,7 @@ define([ * Pass in the function to remove the domain object so it can be * associated with an 'OK' button press */ - dialog = new RemoveDialog(dialogService, domainObject, removeFromContext); + dialog = new RemoveDialog(this.openmct, domainObject, removeFromContext); dialog.show(); }; diff --git a/platform/commonUI/edit/src/actions/RemoveDialog.js b/platform/commonUI/edit/src/actions/RemoveDialog.js index 751d9e0560..9a45fa1480 100644 --- a/platform/commonUI/edit/src/actions/RemoveDialog.js +++ b/platform/commonUI/edit/src/actions/RemoveDialog.js @@ -36,8 +36,8 @@ define([], function () { * @memberof platform/commonUI/edit * @constructor */ - function RemoveDialog(dialogService, domainObject, removeCallback) { - this.dialogService = dialogService; + function RemoveDialog(openmct, domainObject, removeCallback) { + this.openmct = openmct; this.domainObject = domainObject; this.removeCallback = removeCallback; } @@ -46,31 +46,26 @@ define([], function () { * Display a dialog to confirm the removal of a domain object. */ RemoveDialog.prototype.show = function () { - var dialog, - domainObject = this.domainObject, - removeCallback = this.removeCallback, - model = { - title: 'Remove ' + domainObject.getModel().name, - actionText: 'Warning! This action will permanently remove this object. Are you sure you want to continue?', - severity: 'alert', - primaryOption: { + let dialog = this.openmct.overlays.dialog({ + title: 'Remove ' + this.domainObject.getModel().name, + iconClass: 'alert', + message: 'Warning! This action will permanently remove this object. Are you sure you want to continue?', + buttons: [ + { label: 'OK', - callback: function () { - removeCallback(domainObject); + callback: () => { + this.removeCallback(); dialog.dismiss(); } }, - options: [ - { - label: 'Cancel', - callback: function () { - dialog.dismiss(); - } + { + label: 'Cancel', + callback: () => { + dialog.dismiss(); } - ] - }; - setTimeout(() => this.removeCallback(domainObject)); - + } + ] + }); }; return RemoveDialog; diff --git a/platform/commonUI/edit/src/policies/EditContextualActionPolicy.js b/platform/commonUI/edit/src/policies/EditContextualActionPolicy.js deleted file mode 100644 index a9e2da3cf7..0000000000 --- a/platform/commonUI/edit/src/policies/EditContextualActionPolicy.js +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -define( - [], - function () { - - /** - * Policy controlling whether the context menu is visible when - * objects are being edited - * @param navigationService - * @param editModeBlacklist A blacklist of actions disallowed from - * context menu when navigated object is being edited - * @param nonEditContextBlacklist A blacklist of actions disallowed - * from context menu of non-editable objects, when navigated object - * is being edited - * @constructor - * @param editModeBlacklist A blacklist of actions disallowed from - * context menu when navigated object is being edited - * @param nonEditContextBlacklist A blacklist of actions disallowed - * from context menu of non-editable objects, when navigated object - * @implements {Policy.} - */ - function EditContextualActionPolicy(navigationService, editModeBlacklist, nonEditContextBlacklist) { - this.navigationService = navigationService; - - //The list of objects disallowed on target object when in edit mode - this.editModeBlacklist = editModeBlacklist; - //The list of objects disallowed on target object that is not in - // edit mode (ie. the context menu in the tree on the LHS). - this.nonEditContextBlacklist = nonEditContextBlacklist; - } - - EditContextualActionPolicy.prototype.allow = function (action, context) { - var selectedObject = context.domainObject, - navigatedObject = this.navigationService.getNavigation(), - actionMetadata = action.getMetadata ? action.getMetadata() : {}; - - // FIXME: need to restore support for changing contextual actions - // based on edit mode. - // if (navigatedObject.hasCapability("editor") && navigatedObject.getCapability("editor").isEditContextRoot()) { - // if (selectedObject.hasCapability("editor") && selectedObject.getCapability("editor").inEditContext()) { - // return this.editModeBlacklist.indexOf(actionMetadata.key) === -1; - // } else { - // //Target is in the context menu - // return this.nonEditContextBlacklist.indexOf(actionMetadata.key) === -1; - // } - // } else { - // return true; - // } - return true; - }; - - return EditContextualActionPolicy; - } -); diff --git a/platform/commonUI/edit/src/policies/EditableLinkPolicy.js b/platform/commonUI/edit/src/policies/EditableLinkPolicy.js deleted file mode 100644 index 9fab9ed803..0000000000 --- a/platform/commonUI/edit/src/policies/EditableLinkPolicy.js +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -define([], function () { - - /** - * Policy suppressing links when the linked-to domain object is in - * edit mode. Domain objects being edited may not have been persisted, - * so creating links to these can result in inconsistent state. - * - * @memberof platform/commonUI/edit - * @constructor - * @implements {Policy.} - */ - function EditableLinkPolicy() { - } - - EditableLinkPolicy.prototype.allow = function (action, context) { - var key = action.getMetadata().key, - object; - - if (key === 'link') { - object = context.selectedObject || context.domainObject; - return !(object.hasCapability("editor") && object.getCapability("editor").inEditContext()); - } - - // Like all policies, allow by default. - return true; - }; - - return EditableLinkPolicy; -}); diff --git a/platform/commonUI/edit/src/policies/EditableMovePolicy.js b/platform/commonUI/edit/src/policies/EditableMovePolicy.js deleted file mode 100644 index 1f5d30cd91..0000000000 --- a/platform/commonUI/edit/src/policies/EditableMovePolicy.js +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -define([], function () { - - /** - * Policy suppressing move actions among editable and non-editable - * domain objects. - * @memberof platform/commonUI/edit - * @constructor - * @implements {Policy.} - */ - function EditableMovePolicy() { - } - - EditableMovePolicy.prototype.allow = function (action, context) { - var domainObject = context.domainObject, - selectedObject = context.selectedObject, - key = action.getMetadata().key, - isDomainObjectEditing = domainObject.hasCapability('editor') && - domainObject.getCapability('editor').inEditContext(); - - if (key === 'move' && isDomainObjectEditing) { - return !!selectedObject && selectedObject.hasCapability('editor') && - selectedObject.getCapability('editor').inEditContext(); - } - - // Like all policies, allow by default. - return true; - }; - - return EditableMovePolicy; -}); diff --git a/platform/commonUI/edit/test/actions/RemoveActionSpec.js b/platform/commonUI/edit/test/actions/RemoveActionSpec.js index fdf686df4e..2fa64b9180 100644 --- a/platform/commonUI/edit/test/actions/RemoveActionSpec.js +++ b/platform/commonUI/edit/test/actions/RemoveActionSpec.js @@ -29,7 +29,7 @@ define( actionContext, capabilities, mockContext, - mockDialogService, + mockOverlayAPI, mockDomainObject, mockMutation, mockNavigationService, @@ -68,9 +68,9 @@ define( } }; - mockDialogService = jasmine.createSpyObj( - "dialogService", - ["showBlockingMessage"] + mockOverlayAPI = jasmine.createSpyObj( + "overlayAPI", + ["dialog"] ); mockNavigationService = jasmine.createSpyObj( @@ -96,7 +96,7 @@ define( actionContext = { domainObject: mockDomainObject }; - action = new RemoveAction(mockDialogService, mockNavigationService, actionContext); + action = new RemoveAction({overlays: mockOverlayAPI}, mockNavigationService, actionContext); }); it("only applies to objects with parents", function () { @@ -118,7 +118,7 @@ define( action.perform(); - expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockOverlayAPI.dialog).toHaveBeenCalled(); // Also check that no mutation happens at this point expect(mockParent.useCapability).not.toHaveBeenCalledWith("mutation", jasmine.any(Function)); @@ -158,13 +158,13 @@ define( mockGrandchildContext = jasmine.createSpyObj("context", ["getParent"]); mockRootContext = jasmine.createSpyObj("context", ["getParent"]); - mockDialogService.showBlockingMessage.and.returnValue(mockDialogHandle); + mockOverlayAPI.dialog.and.returnValue(mockDialogHandle); }); it("mutates the parent when performed", function () { action.perform(); - mockDialogService.showBlockingMessage.calls.mostRecent().args[0] - .primaryOption.callback(); + mockOverlayAPI.dialog.calls.mostRecent().args[0] + .buttons[0].callback(); expect(mockMutation.invoke) .toHaveBeenCalledWith(jasmine.any(Function)); @@ -174,8 +174,8 @@ define( var mutator, result; action.perform(); - mockDialogService.showBlockingMessage.calls.mostRecent().args[0] - .primaryOption.callback(); + mockOverlayAPI.dialog.calls.mostRecent().args[0] + .buttons[0].callback(); mutator = mockMutation.invoke.calls.mostRecent().args[0]; result = mutator(model); @@ -212,8 +212,8 @@ define( mockType.hasFeature.and.returnValue(true); action.perform(); - mockDialogService.showBlockingMessage.calls.mostRecent().args[0] - .primaryOption.callback(); + mockOverlayAPI.dialog.calls.mostRecent().args[0] + .buttons[0].callback(); // Expects navigation to parent of domainObject (removed object) expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(mockParent); @@ -242,8 +242,8 @@ define( mockType.hasFeature.and.returnValue(true); action.perform(); - mockDialogService.showBlockingMessage.calls.mostRecent().args[0] - .primaryOption.callback(); + mockOverlayAPI.dialog.calls.mostRecent().args[0] + .buttons[0].callback(); // Expects no navigation to occur expect(mockNavigationService.setNavigation).not.toHaveBeenCalled(); diff --git a/platform/commonUI/edit/test/policies/EditContextualActionPolicySpec.js b/platform/commonUI/edit/test/policies/EditContextualActionPolicySpec.js deleted file mode 100644 index 3a650a0516..0000000000 --- a/platform/commonUI/edit/test/policies/EditContextualActionPolicySpec.js +++ /dev/null @@ -1,120 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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 describe,it,expect,beforeEach,jasmine*/ - -define( - ["../../src/policies/EditContextualActionPolicy"], - function (EditContextualActionPolicy) { - - describe("The Edit contextual action policy", function () { - var policy, - navigationService, - mockAction, - context, - navigatedObject, - mockDomainObject, - mockEditorCapability, - metadata, - editModeBlacklist = ["copy", "follow", "window", "link", "locate"], - nonEditContextBlacklist = ["copy", "follow", "properties", "move", "link", "remove", "locate"]; - - beforeEach(function () { - mockEditorCapability = jasmine.createSpyObj("editorCapability", ["isEditContextRoot", "inEditContext"]); - - navigatedObject = jasmine.createSpyObj("navigatedObject", ["hasCapability", "getCapability"]); - navigatedObject.getCapability.and.returnValue(mockEditorCapability); - navigatedObject.hasCapability.and.returnValue(false); - - - mockDomainObject = jasmine.createSpyObj("domainObject", ["hasCapability", "getCapability"]); - mockDomainObject.hasCapability.and.returnValue(false); - mockDomainObject.getCapability.and.returnValue(mockEditorCapability); - - navigationService = jasmine.createSpyObj("navigationService", ["getNavigation"]); - navigationService.getNavigation.and.returnValue(navigatedObject); - - metadata = {key: "move"}; - mockAction = jasmine.createSpyObj("action", ["getMetadata"]); - mockAction.getMetadata.and.returnValue(metadata); - - context = {domainObject: mockDomainObject}; - - policy = new EditContextualActionPolicy(navigationService, editModeBlacklist, nonEditContextBlacklist); - }); - - it('Allows all actions when navigated object not in edit mode', function () { - expect(policy.allow(mockAction, context)).toBe(true); - }); - - it('Allows "window" action when navigated object in edit mode,' + - ' but selected object not in edit mode ', function () { - navigatedObject.hasCapability.and.returnValue(true); - mockEditorCapability.isEditContextRoot.and.returnValue(true); - metadata.key = "window"; - expect(policy.allow(mockAction, context)).toBe(true); - }); - - it('Allows "remove" action when navigated object in edit mode,' + - ' and selected object not editable, but its parent is.', - function () { - var mockParent = jasmine.createSpyObj("parentObject", ["hasCapability"]), - mockContextCapability = jasmine.createSpyObj("contextCapability", ["getParent"]); - - mockParent.hasCapability.and.returnValue(true); - mockContextCapability.getParent.and.returnValue(mockParent); - navigatedObject.hasCapability.and.returnValue(true); - - mockDomainObject.getCapability.and.returnValue(mockContextCapability); - mockDomainObject.hasCapability.and.callFake(function (capability) { - switch (capability) { - case "editor": return false; - case "context": return true; - } - }); - metadata.key = "remove"; - - expect(policy.allow(mockAction, context)).toBe(true); - }); - - it('Disallows "move" action when navigated object in edit mode,' + - ' but selected object not in edit mode ', function () { - navigatedObject.hasCapability.and.returnValue(true); - mockEditorCapability.isEditContextRoot.and.returnValue(true); - mockEditorCapability.inEditContext.and.returnValue(false); - metadata.key = "move"; - expect(policy.allow(mockAction, context)).toBe(false); - }); - - it('Disallows copy action when navigated object and' + - ' selected object in edit mode', function () { - navigatedObject.hasCapability.and.returnValue(true); - mockDomainObject.hasCapability.and.returnValue(true); - mockEditorCapability.isEditContextRoot.and.returnValue(true); - mockEditorCapability.inEditContext.and.returnValue(true); - - metadata.key = "copy"; - expect(policy.allow(mockAction, context)).toBe(false); - }); - - }); - } -); diff --git a/platform/commonUI/general/bundle.js b/platform/commonUI/general/bundle.js index 76c952188d..fed06df5a3 100644 --- a/platform/commonUI/general/bundle.js +++ b/platform/commonUI/general/bundle.js @@ -31,7 +31,6 @@ define([ "./src/controllers/TreeNodeController", "./src/controllers/ActionGroupController", "./src/controllers/ToggleController", - "./src/controllers/ContextMenuController", "./src/controllers/ClickAwayController", "./src/controllers/ViewSwitcherController", "./src/controllers/GetterSetterController", @@ -65,7 +64,6 @@ define([ "./res/templates/tree-node.html", "./res/templates/label.html", "./res/templates/controls/action-group.html", - "./res/templates/menu/context-menu.html", "./res/templates/controls/switcher.html", "./res/templates/object-inspector.html", "./res/templates/controls/selector.html", @@ -84,7 +82,6 @@ define([ TreeNodeController, ActionGroupController, ToggleController, - ContextMenuController, ClickAwayController, ViewSwitcherController, GetterSetterController, @@ -118,7 +115,6 @@ define([ treeNodeTemplate, labelTemplate, actionGroupTemplate, - contextMenuTemplate, switcherTemplate, objectInspectorTemplate, selectorTemplate, @@ -252,13 +248,6 @@ define([ "key": "ToggleController", "implementation": ToggleController }, - { - "key": "ContextMenuController", - "implementation": ContextMenuController, - "depends": [ - "$scope" - ] - }, { "key": "ClickAwayController", "implementation": ClickAwayController, @@ -517,13 +506,6 @@ define([ "action" ] }, - { - "key": "context-menu", - "template": contextMenuTemplate, - "uses": [ - "action" - ] - }, { "key": "switcher", "template": switcherTemplate, diff --git a/platform/commonUI/general/res/templates/menu/context-menu.html b/platform/commonUI/general/res/templates/menu/context-menu.html deleted file mode 100644 index 5cafddf27f..0000000000 --- a/platform/commonUI/general/res/templates/menu/context-menu.html +++ /dev/null @@ -1,33 +0,0 @@ - - diff --git a/platform/commonUI/general/src/controllers/ContextMenuController.js b/platform/commonUI/general/src/controllers/ContextMenuController.js deleted file mode 100644 index 59cec37be5..0000000000 --- a/platform/commonUI/general/src/controllers/ContextMenuController.js +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -/** - * Module defining ContextMenuController. Created by vwoeltje on 11/17/14. - */ -define( - [], - function () { - - /** - * Controller for the context menu. Maintains an up-to-date - * list of applicable actions (those from category "contextual") - * - * @memberof platform/commonUI/general - * @constructor - */ - function ContextMenuController($scope) { - // Refresh variable "menuActions" in the scope - function updateActions() { - $scope.menuActions = $scope.action ? - $scope.action.getActions({ category: 'contextual' }) : - []; - } - - // Update using the action capability - $scope.$watch("action", updateActions); - } - - return ContextMenuController; - } -); diff --git a/platform/commonUI/general/test/controllers/ContextMenuControllerSpec.js b/platform/commonUI/general/test/controllers/ContextMenuControllerSpec.js deleted file mode 100644 index ba695a7477..0000000000 --- a/platform/commonUI/general/test/controllers/ContextMenuControllerSpec.js +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -define( - ["../../src/controllers/ContextMenuController"], - function (ContextMenuController) { - - describe("The context menu controller", function () { - var mockScope, - mockActions, - controller; - - beforeEach(function () { - mockActions = jasmine.createSpyObj("action", ["getActions"]); - mockScope = jasmine.createSpyObj("$scope", ["$watch"]); - controller = new ContextMenuController(mockScope); - }); - - it("watches scope that may change applicable actions", function () { - // The action capability - expect(mockScope.$watch).toHaveBeenCalledWith( - "action", - jasmine.any(Function) - ); - }); - - it("populates the scope with grouped and ungrouped actions", function () { - mockScope.action = mockActions; - mockScope.parameters = { category: "test" }; - - mockActions.getActions.and.returnValue(["a", "b", "c"]); - - // Call the watch - mockScope.$watch.calls.mostRecent().args[1](); - - // Should have grouped and ungrouped actions in scope now - expect(mockScope.menuActions.length).toEqual(3); - }); - }); - } -); diff --git a/platform/representation/bundle.js b/platform/representation/bundle.js index b38deee743..b967ef9b86 100644 --- a/platform/representation/bundle.js +++ b/platform/representation/bundle.js @@ -25,12 +25,10 @@ define([ "./src/MCTRepresentation", "./src/gestures/DragGesture", "./src/gestures/DropGesture", - "./src/gestures/ContextMenuGesture", "./src/gestures/GestureProvider", "./src/gestures/GestureRepresenter", "./src/services/DndService", "./src/TemplateLinker", - "./src/actions/ContextMenuAction", "./src/TemplatePrefetcher", 'legacyRegistry' ], function ( @@ -38,12 +36,10 @@ define([ MCTRepresentation, DragGesture, DropGesture, - ContextMenuGesture, GestureProvider, GestureRepresenter, DndService, TemplateLinker, - ContextMenuAction, TemplatePrefetcher, legacyRegistry ) { @@ -88,14 +84,6 @@ define([ "dndService", "$q" ] - }, - { - "key": "menu", - "implementation": ContextMenuGesture, - "depends": [ - "$timeout", - "agentService" - ] } ], "components": [ @@ -136,19 +124,6 @@ define([ "comment": "For internal use by mct-include and mct-representation." } ], - "actions": [ - { - "key": "menu", - "implementation": ContextMenuAction, - "depends": [ - "$compile", - "$document", - "$rootScope", - "popupService", - "agentService" - ] - } - ], "runs": [ { "priority": "mandatory", diff --git a/platform/representation/src/actions/ContextMenuAction.js b/platform/representation/src/actions/ContextMenuAction.js deleted file mode 100644 index 2365c41584..0000000000 --- a/platform/representation/src/actions/ContextMenuAction.js +++ /dev/null @@ -1,138 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -/** - * Module defining ContextMenuAction. Created by shale on 06/30/2015. - */ -define( - ["../gestures/GestureConstants"], - function (GestureConstants) { - - var MENU_TEMPLATE = "" + - "", - dismissExistingMenu; - - /** - * Launches a custom context menu for the domain object it contains. - * - * @memberof platform/representation - * @constructor - * @param $compile Angular's $compile service - * @param $document the current document - * @param $rootScope Angular's root scope - * @param {platform/commonUI/general.PopupService} popupService - * @param actionContext the context in which the action - * should be performed - * @implements {Action} - */ - function ContextMenuAction( - $compile, - $document, - $rootScope, - popupService, - agentService, - actionContext - ) { - this.$compile = $compile; - this.agentService = agentService; - this.actionContext = actionContext; - this.popupService = popupService; - this.getDocument = function () { - return $document; - }; - this.getRootScope = function () { - return $rootScope; - }; - } - - ContextMenuAction.prototype.perform = function () { - var $compile = this.$compile, - $document = this.getDocument(), - $rootScope = this.getRootScope(), - actionContext = this.actionContext, - eventCoords = [ - actionContext.event.pageX, - actionContext.event.pageY - ], - menuDim = GestureConstants.MCT_MENU_DIMENSIONS, - body = $document.find('body'), - scope = $rootScope.$new(), - initiatingEvent = this.agentService.isMobile() ? - 'touchstart' : 'mousedown', - menu, - popup; - - // Remove the context menu - function dismiss() { - if (popup) { - popup.dismiss(); - popup = undefined; - } - scope.$destroy(); - body.off("mousedown", 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.menuClass = { "context-menu-holder": true }; - // Create the context menu - menu = $compile(MENU_TEMPLATE)(scope); - - popup = this.popupService.display(menu, eventCoords, { - marginX: -menuDim[0], - marginY: -menuDim[1] - }); - - scope.menuClass['go-left'] = popup.goesLeft(); - scope.menuClass['go-up'] = popup.goesUp(); - - // Stop propagation so that clicks or touches on the menu do not close the menu - menu.on(initiatingEvent, function (event) { - event.stopPropagation(); - }); - - // Dismiss the menu when body is clicked/touched elsewhere - // ('mousedown' because 'click' breaks left-click context menus) - // ('touchstart' because 'touch' breaks context menus up) - body.on(initiatingEvent, dismiss); - // NOTE: Apply to mobile? - menu.on('click', dismiss); - - // Don't launch browser's context menu - actionContext.event.preventDefault(); - }; - - return ContextMenuAction; - } -); diff --git a/platform/representation/src/gestures/ContextMenuGesture.js b/platform/representation/src/gestures/ContextMenuGesture.js deleted file mode 100644 index 6e02664394..0000000000 --- a/platform/representation/src/gestures/ContextMenuGesture.js +++ /dev/null @@ -1,100 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - -/** - * Module defining ContextMenuGesture. - * Created by vwoeltje on 11/17/14. Modified by shale on 06/30/2015. - */ -define( - function () { - - /** - * Add listeners to a representation such that it calls the - * context menu action for the domain object it contains. - * - * @memberof platform/representation - * @constructor - * @param element the jqLite-wrapped element which should exhibit - * the context menu - * @param {DomainObject} domainObject the object on which actions - * in the context menu will be performed - * @implements {Gesture} - */ - function ContextMenuGesture($timeout, agentService, element, domainObject) { - var isPressing, - isDragging, - longTouchTime = 500; - - function showMenu(event) { - domainObject.getCapability('action').perform({ - key: 'menu', - domainObject: domainObject, - event: event - }); - } - - // When context menu event occurs, show object actions instead - if (!agentService.isMobile()) { - - // When context menu event occurs, show object actions instead - element.on('contextmenu', showMenu); - } else if (agentService.isMobile()) { - - // If on mobile device, then start timeout for the single touch event - // during the timeout 'isPressing' is true. - element.on('touchstart', function (event) { - if (event.touches.length < 2) { - isPressing = true; - - // After the timeout, if 'isPressing' is - // true, display context menu for object - $timeout(function () { - if (isPressing && !isDragging) { - showMenu(event); - } - }, longTouchTime); - } - }); - - // If on Mobile Device, and user scrolls/drags set flag to true - element.on('touchmove', function () { - isDragging = true; - }); - - // Whenever the touch event ends, 'isPressing' & 'isDragging' is false. - element.on('touchend', function () { - isPressing = false; - isDragging = false; - }); - } - - this.showMenuCallback = showMenu; - this.element = element; - } - - ContextMenuGesture.prototype.destroy = function () { - this.element.off('contextmenu', this.showMenu); - }; - - return ContextMenuGesture; - } -); diff --git a/platform/representation/test/actions/ContextMenuActionSpec.js b/platform/representation/test/actions/ContextMenuActionSpec.js deleted file mode 100644 index 07827d6f7c..0000000000 --- a/platform/representation/test/actions/ContextMenuActionSpec.js +++ /dev/null @@ -1,202 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - - -/** - * Module defining ContextMenuActionSpec. Created by shale on 07/02/2015. - */ -define( - ["../../src/actions/ContextMenuAction"], - function (ContextMenuAction) { - - var JQLITE_FUNCTIONS = ["on", "off", "find", "append", "remove"], - DOMAIN_OBJECT_METHODS = ["getId", "getModel", "getCapability", "hasCapability", "useCapability"]; - - - describe("The 'context menu' action", function () { - var mockCompile, - mockCompiledTemplate, - mockMenu, - mockDocument, - mockBody, - mockPopupService, - mockRootScope, - mockAgentService, - mockScope, - mockDomainObject, - mockEvent, - mockPopup, - 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); - mockPopupService = - jasmine.createSpyObj("popupService", ["display"]); - mockPopup = jasmine.createSpyObj("popup", [ - "dismiss", - "goesLeft", - "goesUp" - ]); - mockRootScope = jasmine.createSpyObj("$rootScope", ["$new"]); - mockAgentService = jasmine.createSpyObj("agentService", ["isMobile"]); - mockScope = jasmine.createSpyObj("scope", ["$destroy"]); - mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS); - mockEvent = jasmine.createSpyObj("event", ["preventDefault", "stopPropagation"]); - mockEvent.pageX = 123; - mockEvent.pageY = 321; - - mockCompile.and.returnValue(mockCompiledTemplate); - mockCompiledTemplate.and.returnValue(mockMenu); - mockDocument.find.and.returnValue(mockBody); - mockRootScope.$new.and.returnValue(mockScope); - mockPopupService.display.and.returnValue(mockPopup); - - mockActionContext = {key: 'menu', domainObject: mockDomainObject, event: mockEvent}; - - action = new ContextMenuAction( - mockCompile, - mockDocument, - mockRootScope, - mockPopupService, - mockAgentService, - mockActionContext - ); - }); - - it("displays a popup when performed", function () { - action.perform(); - expect(mockPopupService.display).toHaveBeenCalledWith( - mockMenu, - [mockEvent.pageX, mockEvent.pageY], - jasmine.any(Object) - ); - }); - - it("prevents the default context menu behavior", function () { - action.perform(); - expect(mockEvent.preventDefault).toHaveBeenCalled(); - }); - - it("adds classes to menus based on position", function () { - var booleans = [false, true]; - - booleans.forEach(function (goLeft) { - booleans.forEach(function (goUp) { - mockPopup.goesLeft.and.returnValue(goLeft); - mockPopup.goesUp.and.returnValue(goUp); - action.perform(); - expect(!!mockScope.menuClass['go-up']) - .toEqual(goUp); - expect(!!mockScope.menuClass['go-left']) - .toEqual(goLeft); - }); - }); - }); - - - it("removes a menu when body is clicked", function () { - // Show the menu - action.perform(); - - // Verify precondition - expect(mockBody.remove).not.toHaveBeenCalled(); - - // Find and fire body's mousedown listener - mockBody.on.calls.all().forEach(function (call) { - if (call.args[0] === 'mousedown') { - call.args[1](); - } - }); - - // Menu should have been removed - expect(mockPopup.dismiss).toHaveBeenCalled(); - - // Listener should have been detached from body - expect(mockBody.off).toHaveBeenCalledWith( - 'mousedown', - jasmine.any(Function) - ); - }); - - it("removes a menu when it is clicked", function () { - // Show the menu - action.perform(); - - // Verify precondition - expect(mockMenu.remove).not.toHaveBeenCalled(); - - // Find and fire menu's click listener - mockMenu.on.calls.all().forEach(function (call) { - if (call.args[0] === 'click') { - call.args[1](); - } - }); - - // Menu should have been removed - expect(mockPopup.dismiss).toHaveBeenCalled(); - }); - - it("keeps a menu when menu is clicked", function () { - // Show the menu - action.perform(); - // Find and fire body's mousedown listener - mockMenu.on.calls.all().forEach(function (call) { - if (call.args[0] === 'mousedown') { - call.args[1](mockEvent); - } - }); - - // Menu should have been removed - expect(mockPopup.dismiss).not.toHaveBeenCalled(); - - // Listener should have been detached from body - expect(mockBody.off).not.toHaveBeenCalled(); - }); - - it("keeps a menu when menu is clicked on mobile", function () { - mockAgentService.isMobile.and.returnValue(true); - action = new ContextMenuAction( - mockCompile, - mockDocument, - mockRootScope, - mockPopupService, - mockAgentService, - mockActionContext - ); - action.perform(); - - mockMenu.on.calls.all().forEach(function (call) { - if (call.args[0] === 'touchstart') { - call.args[1](mockEvent); - } - }); - - expect(mockPopup.dismiss).not.toHaveBeenCalled(); - }); - }); - } -); diff --git a/platform/representation/test/gestures/ContextMenuGestureSpec.js b/platform/representation/test/gestures/ContextMenuGestureSpec.js deleted file mode 100644 index aed8bada4b..0000000000 --- a/platform/representation/test/gestures/ContextMenuGestureSpec.js +++ /dev/null @@ -1,119 +0,0 @@ -/***************************************************************************** - * Open MCT, Copyright (c) 2014-2018, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT 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 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. - *****************************************************************************/ - - -/** - * Module defining ContextMenuGestureSpec. Created by vwoeltje on 11/22/14. - */ -define( - ["../../src/gestures/ContextMenuGesture"], - function (ContextMenuGesture) { - - var JQLITE_FUNCTIONS = ["on", "off", "find", "append", "remove"], - DOMAIN_OBJECT_METHODS = ["getId", "getModel", "getCapability", "hasCapability", "useCapability"]; - - - describe("The 'context menu' gesture", function () { - var mockTimeout, - mockElement, - mockAgentService, - mockDomainObject, - mockTouchEvent, - mockContextMenuAction, - mockTouch, - gesture, - fireGesture, - fireTouchStartGesture, - fireTouchEndGesture; - - beforeEach(function () { - mockTimeout = jasmine.createSpy("$timeout"); - mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS); - mockAgentService = jasmine.createSpyObj("agentService", ["isMobile"]); - mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS); - mockContextMenuAction = jasmine.createSpyObj( - "action", - ["perform", "getActions"] - ); - - mockDomainObject.getCapability.and.returnValue(mockContextMenuAction); - mockContextMenuAction.perform.and.returnValue(jasmine.any(Function)); - mockAgentService.isMobile.and.returnValue(false); - - - gesture = new ContextMenuGesture(mockTimeout, mockAgentService, mockElement, mockDomainObject); - - // Capture the contextmenu callback - fireGesture = mockElement.on.calls.mostRecent().args[1]; - }); - - it("attaches a callback for context menu events", function () { - // Fire a click and expect it to happen - fireGesture(); - expect(mockElement.on).toHaveBeenCalledWith( - "contextmenu", - jasmine.any(Function) - ); - }); - - it("detaches a callback for context menu events when destroyed", function () { - expect(mockElement.off).not.toHaveBeenCalled(); - - gesture.destroy(); - - expect(mockElement.off).toHaveBeenCalledWith( - "contextmenu", - //mockElement.on.calls.mostRecent().args[1] - mockDomainObject.calls - ); - }); - - it("attaches a callback for context menu events on mobile", function () { - // Mock touch event and set to mobile device - mockTouchEvent = jasmine.createSpyObj("event", ["preventDefault", "touches"]); - mockTouch = jasmine.createSpyObj("touch", ["length"]); - mockTouch.length = 1; - mockTouchEvent.touches.and.returnValue(mockTouch); - mockAgentService.isMobile.and.returnValue(true); - - // Then create new (mobile) gesture - gesture = new ContextMenuGesture(mockTimeout, mockAgentService, mockElement, mockDomainObject); - - // Set calls for the touchstart and touchend gestures - fireTouchStartGesture = mockElement.on.calls.all()[1].args[1]; - fireTouchEndGesture = mockElement.on.calls.mostRecent().args[1]; - - // Fire touchstart and expect touch start to begin - fireTouchStartGesture(mockTouchEvent); - expect(mockElement.on).toHaveBeenCalledWith( - "touchstart", - jasmine.any(Function) - ); - - // Expect timeout to begin and then fireTouchEnd - expect(mockTimeout).toHaveBeenCalled(); - mockTimeout.calls.mostRecent().args[0](); - fireTouchEndGesture(mockTouchEvent); - }); - }); - } -); diff --git a/src/adapter/actions/LegacyActionAdapter.js b/src/adapter/actions/LegacyActionAdapter.js index b91516d9b8..039c3854fd 100644 --- a/src/adapter/actions/LegacyActionAdapter.js +++ b/src/adapter/actions/LegacyActionAdapter.js @@ -24,7 +24,7 @@ import LegacyContextMenuAction from './LegacyContextMenuAction'; export default function LegacyActionAdapter(openmct, legacyActions) { function contextualCategoryOnly(action) { - if (action.category === 'contextual') { + if (action.category === 'contextual' || (Array.isArray(action.category) && action.category.includes('contextual'))) { return true; } console.warn(`DEPRECATION WARNING: Action ${action.definition.key} in bundle ${action.bundle.path} is non-contextual and should be migrated.`); diff --git a/src/adapter/actions/LegacyContextMenuAction.js b/src/adapter/actions/LegacyContextMenuAction.js index d72897786f..ef3c1d1daf 100644 --- a/src/adapter/actions/LegacyContextMenuAction.js +++ b/src/adapter/actions/LegacyContextMenuAction.js @@ -1,5 +1,3 @@ -import { timingSafeEqual } from "crypto"; - /***************************************************************************** * Open MCT, Copyright (c) 2014-2018, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -21,6 +19,9 @@ import { timingSafeEqual } from "crypto"; * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ +import _ from 'lodash'; +const INSIDE_EDIT_PATH_BLACKLIST = ["copy", "follow", "link", "locate", "move", "link"]; +const OUTSIDE_EDIT_PATH_BLACKLIST = ["copy", "follow", "properties", "move", "link", "remove", "locate"]; export default class LegacyContextMenuAction { constructor(openmct, LegacyAction) { @@ -33,9 +34,34 @@ export default class LegacyContextMenuAction { appliesTo(objectPath) { let legacyObject = this.openmct.legacyObject(objectPath); - return this.LegacyAction.appliesTo({ - domainObject: legacyObject - }); + + return (this.LegacyAction.appliesTo === undefined || + this.LegacyAction.appliesTo({domainObject: legacyObject})) && + !this.isBlacklisted(objectPath); + } + + /** + * @private + */ + isBlacklisted(objectPath) { + let navigatedObject = this.openmct.router.path[0]; + let isEditing = this.openmct.editor.isEditing(); + + /** + * Is the object being edited, or a child of the object being edited? + */ + function isInsideEditPath() { + return objectPath.some((object) => _.eq(object.identifier, navigatedObject.identifier)); + } + + if (isEditing) { + if (isInsideEditPath()) { + return INSIDE_EDIT_PATH_BLACKLIST.some(actionKey => this.LegacyAction.key === actionKey); + } else { + return OUTSIDE_EDIT_PATH_BLACKLIST.some(actionKey => this.LegacyAction.key === actionKey); + } + } + return false; } invoke(objectPath) { diff --git a/src/api/overlays/components/DialogComponent.vue b/src/api/overlays/components/DialogComponent.vue index 0e42a40bf7..eb1fb8b515 100644 --- a/src/api/overlays/components/DialogComponent.vue +++ b/src/api/overlays/components/DialogComponent.vue @@ -50,7 +50,6 @@ flex: 1 1 auto; > * + * { - @include test(); margin-top: $interiorMargin; } } diff --git a/src/plugins/displayLayout/components/contextMenuDropDown.vue b/src/plugins/displayLayout/components/contextMenuDropDown.vue index 45a906300a..04c2b79459 100644 --- a/src/plugins/displayLayout/components/contextMenuDropDown.vue +++ b/src/plugins/displayLayout/components/contextMenuDropDown.vue @@ -4,11 +4,11 @@ diff --git a/src/plugins/folderView/components/GridItem.vue b/src/plugins/folderView/components/GridItem.vue index ee0d46a4ce..561dc0db0e 100644 --- a/src/plugins/folderView/components/GridItem.vue +++ b/src/plugins/folderView/components/GridItem.vue @@ -150,11 +150,11 @@ diff --git a/src/plugins/folderView/components/ListItem.vue b/src/plugins/folderView/components/ListItem.vue index c15232913c..50d666afe4 100644 --- a/src/plugins/folderView/components/ListItem.vue +++ b/src/plugins/folderView/components/ListItem.vue @@ -54,11 +54,11 @@