Compare commits
	
		
			5 Commits
		
	
	
		
			v1.7.4
			...
			new-folder
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					fc8663c049 | ||
| 
						 | 
					adfe30a891 | ||
| 
						 | 
					5218e350c3 | ||
| 
						 | 
					88615e92d2 | ||
| 
						 | 
					12477a220b | 
@@ -33,6 +33,7 @@ define([
 | 
			
		||||
    "./src/actions/SaveAndStopEditingAction",
 | 
			
		||||
    "./src/actions/SaveAsAction",
 | 
			
		||||
    "./src/actions/CancelAction",
 | 
			
		||||
    "./src/actions/CreateNewFolderAction",
 | 
			
		||||
    "./src/policies/EditActionPolicy",
 | 
			
		||||
    "./src/policies/EditPersistableObjectsPolicy",
 | 
			
		||||
    "./src/policies/EditableLinkPolicy",
 | 
			
		||||
@@ -71,6 +72,7 @@ define([
 | 
			
		||||
    SaveAndStopEditingAction,
 | 
			
		||||
    SaveAsAction,
 | 
			
		||||
    CancelAction,
 | 
			
		||||
    CreateNewFolderAction,
 | 
			
		||||
    EditActionPolicy,
 | 
			
		||||
    EditPersistableObjectsPolicy,
 | 
			
		||||
    EditableLinkPolicy,
 | 
			
		||||
@@ -145,7 +147,10 @@ define([
 | 
			
		||||
                    "depends": [
 | 
			
		||||
                        "$scope",
 | 
			
		||||
                        "$timeout",
 | 
			
		||||
                        "objectService"
 | 
			
		||||
                        "objectService",
 | 
			
		||||
                        "typeService",
 | 
			
		||||
                        "policyService",
 | 
			
		||||
                        "instantiate"
 | 
			
		||||
                    ]
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
@@ -242,6 +247,14 @@ define([
 | 
			
		||||
                    "cssClass": "icon-x no-label",
 | 
			
		||||
                    "description": "Discard changes made to these objects.",
 | 
			
		||||
                    "depends": []
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "key": "create-new-folder",
 | 
			
		||||
                    "implementation": CreateNewFolderAction,
 | 
			
		||||
                    "description": "Creates a new folder.",
 | 
			
		||||
                    "depends": [
 | 
			
		||||
                        "typeService"
 | 
			
		||||
                    ]
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "policies": [
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,33 @@
 | 
			
		||||
<!--span
 | 
			
		||||
 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.
 | 
			
		||||
-->
 | 
			
		||||
<div name="newFolder" ng-controller="LocatorController">
 | 
			
		||||
        <div ng-if="!createNewFolder">
 | 
			
		||||
            <a class="s-button icon-folder-new" ng-click="createNewFolderClickHandler()" > 
 | 
			
		||||
                <span class="title-label">New Folder</span>
 | 
			
		||||
            </a>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div ng-if="createNewFolder">
 | 
			
		||||
            <span><input type="text" ng-model="newFolderName" name="newFolderName"></span>
 | 
			
		||||
            <a class="s-button" ng-click="createClickHandler()">Create</a>
 | 
			
		||||
            <a class="s-button icon-x" ng-click="cancelClickHandler()"></a>
 | 
			
		||||
        </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -1,19 +1,16 @@
 | 
			
		||||
<!--
 | 
			
		||||
 Open MCT, Copyright (c) 2014-2018, United States Government
 | 
			
		||||
 Open MCT, Copyright (c) 2014-2017, 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
 | 
			
		||||
@@ -26,4 +23,22 @@
 | 
			
		||||
                            ng-model="treeModel">
 | 
			
		||||
        </mct-representation>
 | 
			
		||||
    </div>
 | 
			
		||||
    
 | 
			
		||||
    <!-- Create New Folder Action -->
 | 
			
		||||
    <div class="newFolderCreation" style="margin-top:10px; position:absolute; left:0px;">
 | 
			
		||||
        
 | 
			
		||||
        <!-- New folder button, triggers create new folder action. -->
 | 
			
		||||
        <div ng-show="!newFolderCreationTriggered">
 | 
			
		||||
            <a class="s-button icon-folder-new" ng-class="{disabled: !validParent()}" ng-click="newFolderButtonClickHandler()">
 | 
			
		||||
                <span class="text-label">New Folder</span>
 | 
			
		||||
            </a>
 | 
			
		||||
        </div>
 | 
			
		||||
        
 | 
			
		||||
        <!-- Get folder name -->
 | 
			
		||||
        <div ng-show="newFolderCreationTriggered">
 | 
			
		||||
            <input type="text" ng-model="newFolderNameInput">
 | 
			
		||||
            <a class="s-button" ng-class="{ disabled: !validParent() || !validFolderName() }" ng-click="newFolderCreateButtonClickHandler()">Create</a>
 | 
			
		||||
            <a class="s-button icon-x" ng-click="newFolderCancelButtonClickHandler()"></a>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										88
									
								
								platform/commonUI/edit/src/actions/CreateNewFolderAction.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								platform/commonUI/edit/src/actions/CreateNewFolderAction.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * 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 (
 | 
			
		||||
 | 
			
		||||
    ) {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The CreateNewFolderAction; action is triggered by the new folder button in the locator. 
 | 
			
		||||
         * 
 | 
			
		||||
         * @constructor
 | 
			
		||||
         * @implements {Action}
 | 
			
		||||
         * @memberof platform/commonUI/edit
 | 
			
		||||
         */
 | 
			
		||||
        function  CreateNewFolderAction(
 | 
			
		||||
            typeService,
 | 
			
		||||
            context
 | 
			
		||||
        ) {
 | 
			
		||||
            this.parent = (context || {}).domainObject;
 | 
			
		||||
            this.typeService = typeService;
 | 
			
		||||
            this.type = typeService.getType('folder');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        CreateNewFolderAction.prototype.perform = function (folderName) {
 | 
			
		||||
            var parent = this.parent,
 | 
			
		||||
                typeService = this.typeService,
 | 
			
		||||
                newModel = this.type.getInitialModel(),
 | 
			
		||||
                folderType = typeService.getType('folder');
 | 
			
		||||
 | 
			
		||||
            newModel.type = folderType.getKey();
 | 
			
		||||
            newModel.name = folderName;
 | 
			
		||||
 | 
			
		||||
            function instantiateObject(newModel, parent) {
 | 
			
		||||
                var newObject = parent.useCapability('instantiation', newModel);
 | 
			
		||||
                newObject.useCapability('mutation', function (newModel) {
 | 
			
		||||
                    newModel.location = parent.getId();
 | 
			
		||||
                });
 | 
			
		||||
                return addToParentAndReturn(newObject);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function addToParentAndReturn(newObject) {
 | 
			
		||||
                return parent.getCapability('composition').add(newObject)
 | 
			
		||||
                            .then(function () {
 | 
			
		||||
                                    return newObject;
 | 
			
		||||
                                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return instantiateObject(newModel, parent);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Check if this action is applicable in a given context.
 | 
			
		||||
         * This will ensure that a domain object is present in the context,
 | 
			
		||||
         * and that this domain object is in Edit mode.
 | 
			
		||||
         * @returns true if applicable
 | 
			
		||||
         */
 | 
			
		||||
        CreateNewFolderAction.appliesTo = function (context) {
 | 
			
		||||
            var parent = (context || {}).domainObject;
 | 
			
		||||
            return parent && parent.hasCapability('editor');
 | 
			
		||||
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return CreateNewFolderAction;
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2018, United States Government
 | 
			
		||||
 * Open MCT, Copyright (c) 2014-2017, United States Government
 | 
			
		||||
 * as represented by the Administrator of the National Aeronautics and Space
 | 
			
		||||
 * Administration. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
 * this source code distribution or the Licensing information page available
 | 
			
		||||
 * at runtime from the About dialog for additional information.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
/*global console*/
 | 
			
		||||
 | 
			
		||||
define(
 | 
			
		||||
    [],
 | 
			
		||||
@@ -31,7 +32,7 @@ define(
 | 
			
		||||
         * @memberof platform/commonUI/browse
 | 
			
		||||
         * @constructor
 | 
			
		||||
         */
 | 
			
		||||
        function LocatorController($scope, $timeout, objectService) {
 | 
			
		||||
        function LocatorController($scope, $timeout, objectService, typeService, policyService, instantiate) {
 | 
			
		||||
            // Populate values needed by the locator control. These are:
 | 
			
		||||
            // * rootObject: The top-level object, since we want to show
 | 
			
		||||
            //               the full tree
 | 
			
		||||
@@ -66,8 +67,8 @@ define(
 | 
			
		||||
 | 
			
		||||
                // Restrict which locations can be selected
 | 
			
		||||
                if (domainObject &&
 | 
			
		||||
                        $scope.structure &&
 | 
			
		||||
                            $scope.structure.validate) {
 | 
			
		||||
                    $scope.structure &&
 | 
			
		||||
                    $scope.structure.validate) {
 | 
			
		||||
                    if (!$scope.structure.validate(domainObject)) {
 | 
			
		||||
                        setLocatingObject(priorObject, undefined);
 | 
			
		||||
                        return;
 | 
			
		||||
@@ -81,11 +82,64 @@ define(
 | 
			
		||||
                        !!$scope.treeModel.selectedObject
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Check if create new folder is a valid action for selected object
 | 
			
		||||
                $scope.validParent = function () {
 | 
			
		||||
                    if ($scope.treeModel.selectedObject) {
 | 
			
		||||
                        return policyService.allow(
 | 
			
		||||
                                "composition",
 | 
			
		||||
                                $scope.treeModel.selectedObject,
 | 
			
		||||
                                instantiate(typeService.getType('folder').getInitialModel())
 | 
			
		||||
                        );
 | 
			
		||||
                    } else {
 | 
			
		||||
                        return false;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $scope.newFolderButtonClickHandler = function () {
 | 
			
		||||
                $scope.newFolderCreationTriggered = true;
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            $scope.newFolderCancelButtonClickHandler = function () {
 | 
			
		||||
                $scope.newFolderCreationTriggered = false;
 | 
			
		||||
                resetNewFolderNameInput();
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            // Get expected input pattern for folder name
 | 
			
		||||
            var folderNamePattern = new RegExp(
 | 
			
		||||
                typeService.getType('folder').getProperties()[0].propertyDefinition.pattern
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            // Validate folder name externally to avoid affecting overall form validation
 | 
			
		||||
            $scope.validFolderName = function () {
 | 
			
		||||
                return $scope.newFolderNameInput && folderNamePattern.test($scope.newFolderNameInput);
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            function selectAndScrollToNewFolder(newFolder) {
 | 
			
		||||
                $scope.treeModel.selectedObject = newFolder;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function resetNewFolderNameInput() {
 | 
			
		||||
                $scope.newFolderNameInput = "Unnamed Folder";
 | 
			
		||||
                $scope.newFolderCreationTriggered = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            // Create new folder, update selection to new folder and reset new folder button
 | 
			
		||||
            $scope.newFolderCreateButtonClickHandler = function () {
 | 
			
		||||
                createNewFolderAction = $scope.treeModel.selectedObject.getCapability('action').getActions('create-new-folder')[0];
 | 
			
		||||
                createNewFolderAction.perform($scope.newFolderNameInput)
 | 
			
		||||
                                     .then(selectAndScrollToNewFolder)
 | 
			
		||||
                                     .then(resetNewFolderNameInput);
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            // Initial state for the tree's model
 | 
			
		||||
            $scope.treeModel =
 | 
			
		||||
                { selectedObject: $scope.ngModel[$scope.field] };
 | 
			
		||||
            $scope.treeModel = { selectedObject: $scope.ngModel[$scope.field] };
 | 
			
		||||
 | 
			
		||||
            //Initial values for new folder action
 | 
			
		||||
            $scope.newFolderNameInput = "Unnamed Folder";
 | 
			
		||||
            $scope.newFolderCreationTriggered = false;
 | 
			
		||||
 | 
			
		||||
            // Watch for changes from the tree
 | 
			
		||||
            $scope.$watch("treeModel.selectedObject", setLocatingObject);
 | 
			
		||||
@@ -94,4 +148,3 @@ define(
 | 
			
		||||
        return LocatorController;
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										132
									
								
								platform/commonUI/edit/test/actions/CreateNewFolderActionSpec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								platform/commonUI/edit/test/actions/CreateNewFolderActionSpec.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
 * 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/actions/CreateNewFolderAction'],
 | 
			
		||||
    function (CreateNewFolderAction) {
 | 
			
		||||
 | 
			
		||||
        describe("The Create New Folder Action", function () {
 | 
			
		||||
            var mockDomainObject,
 | 
			
		||||
                mockNewObject,
 | 
			
		||||
                mockType,
 | 
			
		||||
                testModel,
 | 
			
		||||
                mockFolderName,
 | 
			
		||||
                mockTypeService,
 | 
			
		||||
                mockActionContext,
 | 
			
		||||
                capabilities,
 | 
			
		||||
                mockCompositionCapability,
 | 
			
		||||
                action;
 | 
			
		||||
            
 | 
			
		||||
            function mockPromise(value) {
 | 
			
		||||
                return (value && value.then) ? value : {
 | 
			
		||||
                    then: function (callback) {
 | 
			
		||||
                        return mockPromise(callback(value));
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            beforeEach(function () {
 | 
			
		||||
                mockDomainObject = jasmine.createSpyObj(
 | 
			
		||||
                    "domainObject",
 | 
			
		||||
                    [
 | 
			
		||||
                        "getCapability",
 | 
			
		||||
                        "useCapability",
 | 
			
		||||
                        "hasCapability",
 | 
			
		||||
                        "getId"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                
 | 
			
		||||
                mockNewObject = jasmine.createSpyObj(
 | 
			
		||||
                    "newObject",
 | 
			
		||||
                    [
 | 
			
		||||
                        "getCapability",
 | 
			
		||||
                        "useCapability",
 | 
			
		||||
                        "hasCapability",
 | 
			
		||||
                        "getId"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                
 | 
			
		||||
                mockType = jasmine.createSpyObj(
 | 
			
		||||
                    "type",
 | 
			
		||||
                    [
 | 
			
		||||
                        "getKey",
 | 
			
		||||
                        "getInitialModel"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                
 | 
			
		||||
                testModel = { 
 | 
			
		||||
                                type: mockType,
 | 
			
		||||
                                name: "Name",
 | 
			
		||||
                                location: "someLocation"
 | 
			
		||||
                            };
 | 
			
		||||
                
 | 
			
		||||
                mockFolderName = "Name";
 | 
			
		||||
                
 | 
			
		||||
                mockTypeService = jasmine.createSpyObj(
 | 
			
		||||
                    "typeService",
 | 
			
		||||
                    ["getType"]
 | 
			
		||||
                );    
 | 
			
		||||
                
 | 
			
		||||
                mockActionContext = { domainObject: mockDomainObject }
 | 
			
		||||
                
 | 
			
		||||
                mockCompositionCapability = jasmine.createSpyObj(
 | 
			
		||||
                    "composition",
 | 
			
		||||
                    ["add"]
 | 
			
		||||
                );
 | 
			
		||||
                
 | 
			
		||||
                mockType.getKey.and.returnValue("test");
 | 
			
		||||
                mockType.getInitialModel.and.returnValue(testModel);
 | 
			
		||||
                mockDomainObject.getCapability.and.callFake(function (capability) {
 | 
			
		||||
                    return (capability === 'composition') && mockCompositionCapability;
 | 
			
		||||
                });
 | 
			
		||||
                mockDomainObject.hasCapability.and.returnValue(true);
 | 
			
		||||
                mockCompositionCapability.add.and.returnValue(mockPromise(true));
 | 
			
		||||
                mockDomainObject.useCapability.and.callFake(function (capability) {
 | 
			
		||||
                    return (capability === 'instantiation') && mockNewObject;
 | 
			
		||||
                });
 | 
			
		||||
                mockTypeService.getType.and.returnValue(mockType);
 | 
			
		||||
                mockDomainObject.getId.and.returnValue("id");
 | 
			
		||||
                
 | 
			
		||||
                action = new CreateNewFolderAction(mockTypeService, mockActionContext);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it("uses the instantiation capability when performed", function () {
 | 
			
		||||
                action.perform(mockFolderName);
 | 
			
		||||
                expect(mockDomainObject.useCapability)
 | 
			
		||||
                    .toHaveBeenCalledWith("instantiation", jasmine.any(Object));
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it("adds new objects to the parent's composition", function () {
 | 
			
		||||
                action.perform(mockFolderName);
 | 
			
		||||
                expect(mockDomainObject.getCapability).toHaveBeenCalledWith("composition");
 | 
			
		||||
                expect(mockCompositionCapability.add).toHaveBeenCalled();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it("is only applicable when a domain object is in context", function () {
 | 
			
		||||
                expect(CreateNewFolderAction.appliesTo(mockActionContext)).toBeTruthy();
 | 
			
		||||
                expect(CreateNewFolderAction.appliesTo({})).toBeFalsy();
 | 
			
		||||
                expect(mockDomainObject.hasCapability).toHaveBeenCalledWith('editor');
 | 
			
		||||
            });
 | 
			
		||||
            
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
);
 | 
			
		||||
@@ -31,26 +31,64 @@ define(
 | 
			
		||||
            var mockScope,
 | 
			
		||||
                mockTimeout,
 | 
			
		||||
                mockDomainObject,
 | 
			
		||||
                mockFolderObject,
 | 
			
		||||
                mockRootObject,
 | 
			
		||||
                mockContext,
 | 
			
		||||
                mockActions,
 | 
			
		||||
                mockObjectService,
 | 
			
		||||
                mockTypeService,
 | 
			
		||||
                mockType,
 | 
			
		||||
                mockInstantiate,
 | 
			
		||||
                mockPolicyService,
 | 
			
		||||
                getObjectsPromise,
 | 
			
		||||
                testModel,
 | 
			
		||||
                capabilities,
 | 
			
		||||
                mockCreateNewFolderAction,
 | 
			
		||||
                mockActionCapability,
 | 
			
		||||
                mockProperties,
 | 
			
		||||
                controller;
 | 
			
		||||
 | 
			
		||||
            beforeEach(function () {
 | 
			
		||||
                
 | 
			
		||||
                mockScope = jasmine.createSpyObj(
 | 
			
		||||
                    "$scope",
 | 
			
		||||
                    ["$watch"]
 | 
			
		||||
                    ["$watch", "validParent"]
 | 
			
		||||
                );
 | 
			
		||||
                mockTimeout = jasmine.createSpy("$timeout");
 | 
			
		||||
                mockInstantiate = jasmine.createSpy("instantiate");
 | 
			
		||||
                mockDomainObject = jasmine.createSpyObj(
 | 
			
		||||
                    "domainObject",
 | 
			
		||||
                    ["getCapability"]
 | 
			
		||||
                    [
 | 
			
		||||
                        "useCapability",
 | 
			
		||||
                        "getModel",
 | 
			
		||||
                        "getCapability"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                mockFolderObject = jasmine.createSpyObj(
 | 
			
		||||
                    "folderObject",
 | 
			
		||||
                    [
 | 
			
		||||
                        "useCapability",
 | 
			
		||||
                        "getModel",
 | 
			
		||||
                        "getCapability"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                mockCreateNewFolderAction = jasmine.createSpyObj(
 | 
			
		||||
                    "createNewFolderAction",
 | 
			
		||||
                    [
 | 
			
		||||
                        "perform"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                mockRootObject = jasmine.createSpyObj(
 | 
			
		||||
                    "rootObject",
 | 
			
		||||
                    ["getCapability"]
 | 
			
		||||
                );
 | 
			
		||||
                mockActionCapability = jasmine.createSpyObj(
 | 
			
		||||
                    "actionCapability",
 | 
			
		||||
                    [
 | 
			
		||||
                        "getActions",
 | 
			
		||||
                        "perform"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                mockContext = jasmine.createSpyObj(
 | 
			
		||||
                    "context",
 | 
			
		||||
                    ["getRoot"]
 | 
			
		||||
@@ -59,25 +97,74 @@ define(
 | 
			
		||||
                    "objectService",
 | 
			
		||||
                    ["getObjects"]
 | 
			
		||||
                );
 | 
			
		||||
                mockTypeService = jasmine.createSpyObj(
 | 
			
		||||
                    "typeService",
 | 
			
		||||
                    ["getType"]
 | 
			
		||||
                );
 | 
			
		||||
                mockPolicyService = jasmine.createSpyObj(
 | 
			
		||||
                    "policyService",
 | 
			
		||||
                    ["allow"]
 | 
			
		||||
                );
 | 
			
		||||
                getObjectsPromise = jasmine.createSpyObj(
 | 
			
		||||
                    "promise",
 | 
			
		||||
                    ["then"]
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                mockDomainObject.getCapability.and.returnValue(mockContext);
 | 
			
		||||
                mockType = jasmine.createSpyObj(
 | 
			
		||||
                    "type",
 | 
			
		||||
                    [
 | 
			
		||||
                        "getKey",
 | 
			
		||||
                        "getProperties",
 | 
			
		||||
                        "getInitialModel"
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
                testModel = { someKey: "some value" };
 | 
			
		||||
                
 | 
			
		||||
                mockProperties = ['a', 'b', 'c'].map(function (k) {
 | 
			
		||||
                    var mockProperty = jasmine.createSpyObj(
 | 
			
		||||
                            'property-' + k,
 | 
			
		||||
                            ['propertyDefinition']
 | 
			
		||||
                        );
 | 
			
		||||
                    mockProperty.propertyDefinition = {
 | 
			
		||||
                            key: "name",
 | 
			
		||||
                            pattern: "test"
 | 
			
		||||
                        }
 | 
			
		||||
                    return mockProperty;
 | 
			
		||||
                });
 | 
			
		||||
                
 | 
			
		||||
                capabilities = {
 | 
			
		||||
                    "action" : mockActionCapability,
 | 
			
		||||
                    "context": mockContext
 | 
			
		||||
                };
 | 
			
		||||
                
 | 
			
		||||
                mockActions = [mockCreateNewFolderAction];
 | 
			
		||||
                
 | 
			
		||||
                mockContext.getRoot.and.returnValue(mockRootObject);
 | 
			
		||||
                mockObjectService.getObjects.and.returnValue(getObjectsPromise);
 | 
			
		||||
 | 
			
		||||
                mockTypeService.getType.and.callFake(function (typename) {
 | 
			
		||||
                    return mockType;
 | 
			
		||||
                });
 | 
			
		||||
                mockInstantiate.and.returnValue(mockFolderObject)
 | 
			
		||||
                mockType.getKey.and.returnValue("test");
 | 
			
		||||
                mockType.getInitialModel.and.returnValue(testModel);
 | 
			
		||||
                mockType.getProperties.and.returnValue(mockProperties);
 | 
			
		||||
                mockDomainObject.getCapability.and.callFake(function (capability) {
 | 
			
		||||
                    return capabilities[capability];
 | 
			
		||||
                });
 | 
			
		||||
                mockDomainObject.useCapability.and.returnValue();
 | 
			
		||||
                mockDomainObject.getModel.and.returnValue(testModel);
 | 
			
		||||
                mockFolderObject.getCapability.and.returnValue(capabilities);
 | 
			
		||||
                mockFolderObject.useCapability.and.returnValue();
 | 
			
		||||
                mockFolderObject.getModel.and.returnValue(testModel);
 | 
			
		||||
                mockScope.ngModel = {};
 | 
			
		||||
                mockScope.field = "someField";
 | 
			
		||||
 | 
			
		||||
                controller = new LocatorController(mockScope, mockTimeout, mockObjectService);
 | 
			
		||||
                controller = new LocatorController(mockScope, mockTimeout, mockObjectService, mockTypeService, mockPolicyService, mockInstantiate);
 | 
			
		||||
            });
 | 
			
		||||
            describe("when context is available", function () {
 | 
			
		||||
 | 
			
		||||
                beforeEach(function () {
 | 
			
		||||
                        mockContext.getRoot.and.returnValue(mockRootObject);
 | 
			
		||||
                        controller = new LocatorController(mockScope, mockTimeout, mockObjectService);
 | 
			
		||||
                        controller = new LocatorController(mockScope, mockTimeout, mockObjectService, mockTypeService, mockPolicyService, mockInstantiate);
 | 
			
		||||
                    });
 | 
			
		||||
 | 
			
		||||
                it("adds a treeModel to scope", function () {
 | 
			
		||||
@@ -136,6 +223,32 @@ define(
 | 
			
		||||
                        expect(mockScope.ngModelController.$setValidity)
 | 
			
		||||
                            .toHaveBeenCalledWith(jasmine.any(String), false);
 | 
			
		||||
                    });
 | 
			
		||||
                
 | 
			
		||||
                it("Checks if new folder could be created with policies", function () {
 | 
			
		||||
                    // validParent set to true if policy allows creation of new folders 
 | 
			
		||||
                    mockPolicyService.allow.and.returnValue(true);
 | 
			
		||||
                    expect(mockPolicyService.allow).toHaveBeenCalled;
 | 
			
		||||
                    expect(mockScope.validParent).toBeTruthy;
 | 
			
		||||
                    
 | 
			
		||||
                    // validParent set to false if policy allows creation of new folders 
 | 
			
		||||
                    mockPolicyService.allow.and.returnValue(false);
 | 
			
		||||
                    expect(mockPolicyService.allow).toHaveBeenCalled;
 | 
			
		||||
                    expect(mockScope.validParent).toBeFalsy;
 | 
			
		||||
                });
 | 
			
		||||
                    
 | 
			
		||||
                it("Validates folder name input with folder properties", function () {
 | 
			
		||||
                    // Get foldername pattern from folder type properties 
 | 
			
		||||
                    expect(mockTypeService.getType).toHaveBeenCalledWith('folder');
 | 
			
		||||
                    expect(mockType.getProperties).toHaveBeenCalled();
 | 
			
		||||
                    expect(mockScope.folderNamePattern).toBeDefined;
 | 
			
		||||
                    
 | 
			
		||||
                    // Validate folder name input
 | 
			
		||||
                    mockScope.newFolderNameInput = "test";
 | 
			
		||||
                    expect(mockScope.validFolderName).toBeTruthy;
 | 
			
		||||
                    
 | 
			
		||||
                    mockScope.newFolderNameInput = " ";
 | 
			
		||||
                    expect(mockScope.validFolderName).toBeFalsy;
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
            describe("when no context is available", function () {
 | 
			
		||||
                var defaultRoot = "DEFAULT_ROOT";
 | 
			
		||||
@@ -145,7 +258,7 @@ define(
 | 
			
		||||
                    getObjectsPromise.then.and.callFake(function (callback) {
 | 
			
		||||
                        callback({'ROOT': defaultRoot});
 | 
			
		||||
                    });
 | 
			
		||||
                    controller = new LocatorController(mockScope, mockTimeout, mockObjectService);
 | 
			
		||||
                    controller = new LocatorController(mockScope, mockTimeout, mockObjectService, mockTypeService, mockPolicyService, mockInstantiate);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                it("provides a default context where none is available", function () {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user