Compare commits
	
		
			19 Commits
		
	
	
		
			remove-con
			...
			vue-main-s
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f8fe37d41f | ||
|   | 4f5b9902a6 | ||
|   | e5c2d7b256 | ||
|   | 6737c71c45 | ||
|   | ca055ab765 | ||
|   | 4ba90ff73e | ||
|   | eaa971cb56 | ||
|   | 0301d88033 | ||
|   | e2e0cf17db | ||
|   | 01a39f4fb7 | ||
|   | 1bb1330cba | ||
|   | 78c731dbf7 | ||
|   | 0d53898af9 | ||
|   | 9582fb2b06 | ||
|   | 3c075b7ff2 | ||
|   | 081edfbd70 | ||
|   | 04cc8f7aa2 | ||
|   | a1d206bfc3 | ||
|   | ef9c6d5fed | 
| @@ -11,24 +11,20 @@ jobs: | ||||
|             name: Update npm | ||||
|             command: 'sudo npm install -g npm@latest' | ||||
|         - restore_cache: | ||||
|             key: dependency-cache-{{ checksum "package.json" }}-{{ checksum "bower.json" }} | ||||
|             key: dependency-cache-{{ checksum "package.json" }} | ||||
|         - run: | ||||
|             name: Installing dependencies (npm install) | ||||
|             command: npm install | ||||
|         - save_cache: | ||||
|             key: dependency-cache-{{ checksum "package.json" }}-{{ checksum "bower.json" }} | ||||
|             key: dependency-cache-{{ checksum "package.json" }} | ||||
|             paths: | ||||
|               - node_modules | ||||
|               - bower_components | ||||
|         - run: | ||||
|             name: npm run test | ||||
|             command: npm run test | ||||
|         - run: | ||||
|             name: npm run lint | ||||
|             command: npm run lint | ||||
|         - run: | ||||
|             name: npm run checkstyle | ||||
|             command: npm run checkstyle | ||||
|         - store_artifacts: | ||||
|             path: dist | ||||
|             prefix: dist | ||||
|   | ||||
							
								
								
									
										79
									
								
								.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| module.exports = { | ||||
|     "env": { | ||||
|         "browser": true, | ||||
|         "es6": true, | ||||
|         "jasmine": true, | ||||
|         "amd": true | ||||
|     }, | ||||
|     "extends": "eslint:recommended", | ||||
|     "parser": "babel-eslint", | ||||
|     "parserOptions": { | ||||
|         "allowImportExportEverywhere": true, | ||||
|         "ecmaVersion": 2015, | ||||
|         "ecmaFeatures": { | ||||
|             "impliedStrict": true | ||||
|         } | ||||
|     }, | ||||
|     "rules": { | ||||
|         "no-bitwise": "error", | ||||
|         "curly": "error", | ||||
|         "eqeqeq": "error", | ||||
|         "guard-for-in": "error", | ||||
|         "no-extend-native": "error", | ||||
|         "no-inner-declarations": "off", | ||||
|         "no-use-before-define": ["error", "nofunc"], | ||||
|         "no-caller": "error", | ||||
|         "no-sequences": "error", | ||||
|         "no-irregular-whitespace": "error", | ||||
|         "no-new": "error", | ||||
|         "no-shadow": "error", | ||||
|         "no-undef": "error", | ||||
|         "no-unused-vars": [ | ||||
|             "error", | ||||
|             { | ||||
|                 "vars": "all", | ||||
|                 "args": "none" | ||||
|             } | ||||
|         ], | ||||
|         "no-console": "off", | ||||
|         "no-trailing-spaces": "error", | ||||
|         "space-before-function-paren": [ | ||||
|             "error", | ||||
|             { | ||||
|                 "anonymous": "always", | ||||
|                 "asyncArrow": "always", | ||||
|                 "named": "never", | ||||
|             } | ||||
|         ], | ||||
|         "array-bracket-spacing": "error", | ||||
|         "space-in-parens": "error", | ||||
|         "space-before-blocks": "error", | ||||
|         "comma-dangle": "error", | ||||
|         "eol-last": "error", | ||||
|         "new-cap": [ | ||||
|             "error", | ||||
|             { | ||||
|                 "capIsNew": false, | ||||
|                 "properties": false | ||||
|             } | ||||
|         ], | ||||
|         "dot-notation": "error", | ||||
|         "indent": ["error", 4] | ||||
|     }, | ||||
|     "overrides": [ | ||||
|         { | ||||
|             "files": ["*Spec.js"], | ||||
|             "rules": { | ||||
|                 "no-unused-vars": [ | ||||
|                     "warn", | ||||
|                     { | ||||
|                         "vars": "all", | ||||
|                         "args": "none", | ||||
|                         "varsIgnorePattern": "controller", | ||||
|  | ||||
|                     } | ||||
|                 ] | ||||
|             } | ||||
|         } | ||||
|     ] | ||||
| }; | ||||
							
								
								
									
										5
									
								
								.jscsrc
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								.jscsrc
									
									
									
									
									
								
							| @@ -1,5 +0,0 @@ | ||||
| { | ||||
|     "preset": "crockford", | ||||
|     "requireMultipleVarDecl": false, | ||||
|     "requireVarDeclFirst": false | ||||
| } | ||||
							
								
								
									
										26
									
								
								.jshintrc
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								.jshintrc
									
									
									
									
									
								
							| @@ -1,26 +0,0 @@ | ||||
| { | ||||
|     "bitwise": true, | ||||
|     "browser": true, | ||||
|     "curly": true, | ||||
|     "eqeqeq": true, | ||||
|     "forin": true, | ||||
|     "freeze": true, | ||||
|     "funcscope": false, | ||||
|     "futurehostile": true, | ||||
|     "latedef": true, | ||||
|     "noarg": true, | ||||
|     "nocomma": true, | ||||
|     "nonbsp": true, | ||||
|     "nonew": true, | ||||
|     "predef": [ | ||||
|         "define", | ||||
|         "Promise", | ||||
|         "WeakMap", | ||||
|         "Map" | ||||
|     ], | ||||
|     "shadow": "outer", | ||||
|     "strict": "implied", | ||||
|     "undef": true, | ||||
|     "unused": "vars", | ||||
|     "latedef": "nofunc" | ||||
| } | ||||
							
								
								
									
										28
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README.md
									
									
									
									
									
								
							| @@ -84,7 +84,6 @@ Documentation will be generated in `target/docs`. | ||||
| ## Deploying Open MCT | ||||
|  | ||||
| Open MCT is built using [`npm`](http://npmjs.com/) | ||||
| and [`gulp`](http://gulpjs.com/). | ||||
|  | ||||
| To build Open MCT for deployment: | ||||
|  | ||||
| @@ -94,32 +93,13 @@ This will compile and minify JavaScript sources, as well as copy over assets. | ||||
| The contents of the `dist` folder will contain a runnable Open MCT | ||||
| instance (e.g. by starting an HTTP server in that directory), including: | ||||
|  | ||||
| * A `main.js` file containing Open MCT source code. | ||||
| * Various assets in the `example` and `platform` directories. | ||||
| * An `index.html` that runs Open MCT in its default configuration. | ||||
|  | ||||
| Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). | ||||
|  | ||||
| ## Bundles | ||||
|  | ||||
| A bundle is a group of software components (including source code, declared | ||||
| as AMD modules, as well as resources such as images and HTML templates) | ||||
| that is intended to be added or removed as a single unit. A plug-in for | ||||
| Open MCT will be expressed as a bundle; platform components are also | ||||
| expressed as bundles. | ||||
|  | ||||
| A bundle is also just a directory which contains a file `bundle.json`, | ||||
| which declares its contents. | ||||
|  | ||||
| The file `bundles.json` (note the plural), at the top level of the | ||||
| repository, is a JSON file containing an array of all bundles (expressed as | ||||
| directory names) to include in a running instance of Open MCT. Adding or | ||||
| removing paths from this list will add or remove bundles from the running | ||||
| application. | ||||
| * `openmct.js` - Open MCT source code. | ||||
| * `openmct.css` - Basic styles to load to prevent a FOUC. | ||||
| * `index.html`, an example to run Open MCT in the basic configuration. | ||||
|  | ||||
| ## Tests | ||||
|  | ||||
| Tests are written for [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html) | ||||
| Tests are written for [Jasmine 3](http://jasmine.github.io/) | ||||
| and run by [Karma](http://karma-runner.github.io). To run: | ||||
|  | ||||
| `npm test` | ||||
|   | ||||
							
								
								
									
										129
									
								
								app.js
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								app.js
									
									
									
									
									
								
							| @@ -7,79 +7,72 @@ | ||||
|  * node app.js [options] | ||||
|  */ | ||||
|  | ||||
| (function () { | ||||
|     "use strict"; | ||||
|  | ||||
|     var BUNDLE_FILE = 'bundles.json', | ||||
|         options = require('minimist')(process.argv.slice(2)), | ||||
|         express = require('express'), | ||||
|         app = express(), | ||||
|         fs = require('fs'), | ||||
|         request = require('request'); | ||||
| const options = require('minimist')(process.argv.slice(2)); | ||||
| const express = require('express'); | ||||
| const app = express(); | ||||
| const fs = require('fs'); | ||||
| const request = require('request'); | ||||
|  | ||||
|     // Defaults | ||||
|     options.port = options.port || options.p || 8080; | ||||
|     options.host = options.host || options.h || 'localhost' | ||||
|     options.directory = options.directory || options.D || '.'; | ||||
|     ['include', 'exclude', 'i', 'x'].forEach(function (opt) { | ||||
|         options[opt] = options[opt] || []; | ||||
|         // Make sure includes/excludes always end up as arrays | ||||
|         options[opt] = Array.isArray(options[opt]) ? | ||||
|                 options[opt] : [options[opt]]; | ||||
|     }); | ||||
|     options.include = options.include.concat(options.i); | ||||
|     options.exclude = options.exclude.concat(options.x); | ||||
| // Defaults | ||||
| options.port = options.port || options.p || 8080; | ||||
| options.host = options.host || options.h || 'localhost' | ||||
| options.directory = options.directory || options.D || '.'; | ||||
|  | ||||
|     // Show command line options | ||||
|     if (options.help || options.h) { | ||||
|         console.log("\nUsage: node app.js [options]\n"); | ||||
|         console.log("Options:"); | ||||
|         console.log("  --help, -h               Show this message."); | ||||
|         console.log("  --port, -p <number>      Specify port."); | ||||
|         console.log("  --include, -i <bundle>   Include the specified bundle."); | ||||
|         console.log("  --exclude, -x <bundle>   Exclude the specified bundle."); | ||||
|         console.log("  --directory, -D <bundle>   Serve files from specified directory."); | ||||
|         console.log(""); | ||||
|         process.exit(0); | ||||
| // Show command line options | ||||
| if (options.help || options.h) { | ||||
|     console.log("\nUsage: node app.js [options]\n"); | ||||
|     console.log("Options:"); | ||||
|     console.log("  --help, -h               Show this message."); | ||||
|     console.log("  --port, -p <number>      Specify port."); | ||||
|     console.log("  --directory, -D <bundle>   Serve files from specified directory."); | ||||
|     console.log(""); | ||||
|     process.exit(0); | ||||
| } | ||||
|  | ||||
| app.disable('x-powered-by'); | ||||
|  | ||||
| app.use('/proxyUrl', function proxyRequest(req, res, next) { | ||||
|     console.log('Proxying request to: ', req.query.url); | ||||
|     req.pipe(request({ | ||||
|         url: req.query.url, | ||||
|         strictSSL: false | ||||
|     }).on('error', next)).pipe(res); | ||||
| }); | ||||
|  | ||||
| const webpack = require('webpack'); | ||||
| const webpackConfig = require('./webpack.config.js'); | ||||
| webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin()); | ||||
| webpackConfig.plugins.push(function() { this.plugin('watch-run', function(watching, callback) { console.log('Begin compile at ' + new Date()); callback(); }) }); | ||||
|  | ||||
| webpackConfig.entry.openmct = [ | ||||
|     'webpack-hot-middleware/client', | ||||
|     webpackConfig.entry.openmct | ||||
| ]; | ||||
|  | ||||
| const compiler = webpack(webpackConfig); | ||||
|  | ||||
| app.use(require('webpack-dev-middleware')( | ||||
|     compiler, | ||||
|     { | ||||
|         publicPath: '/dist', | ||||
|         logLevel: 'warn' | ||||
|     } | ||||
| )); | ||||
|  | ||||
|     app.disable('x-powered-by'); | ||||
| app.use(require('webpack-hot-middleware')( | ||||
|     compiler, | ||||
|     { | ||||
|  | ||||
|     // Override bundles.json for HTTP requests | ||||
|     app.use('/' + BUNDLE_FILE, function (req, res) { | ||||
|         var bundles; | ||||
|     } | ||||
| )); | ||||
|  | ||||
|         try { | ||||
|             bundles = JSON.parse(fs.readFileSync(BUNDLE_FILE, 'utf8')); | ||||
|         } catch (e) { | ||||
|             bundles = []; | ||||
|         } | ||||
| // Expose index.html for development users. | ||||
| app.get('/', function (req, res) { | ||||
|     fs.createReadStream('index.html').pipe(res); | ||||
| }); | ||||
|  | ||||
|         // Handle command line inclusions/exclusions | ||||
|         bundles = bundles.concat(options.include); | ||||
|         bundles = bundles.filter(function (bundle) { | ||||
|             return options.exclude.indexOf(bundle) === -1; | ||||
|         }); | ||||
|         bundles = bundles.filter(function (bundle, index) { // Uniquify | ||||
|             return bundles.indexOf(bundle) === index; | ||||
|         }); | ||||
|  | ||||
|         res.send(JSON.stringify(bundles)); | ||||
|     }); | ||||
|  | ||||
|     app.use('/proxyUrl', function proxyRequest(req, res, next) { | ||||
|         console.log('Proxying request to: ', req.query.url); | ||||
|         req.pipe(request({ | ||||
|             url: req.query.url, | ||||
|             strictSSL: false | ||||
|         }).on('error', next)).pipe(res); | ||||
|     }); | ||||
|  | ||||
|     // Expose everything else as static files | ||||
|     app.use(express['static'](options.directory)); | ||||
|  | ||||
|     // Finally, open the HTTP server and log the instance to the console | ||||
|     app.listen(options.port, options.host, function() { | ||||
|         console.log('Open MCT application running at %s:%s', options.host, options.port) | ||||
|     }); | ||||
| }()); | ||||
| // Finally, open the HTTP server and log the instance to the console | ||||
| app.listen(options.port, options.host, function() { | ||||
|     console.log('Open MCT application running at %s:%s', options.host, options.port) | ||||
| }); | ||||
|   | ||||
							
								
								
									
										27
									
								
								bower.json
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								bower.json
									
									
									
									
									
								
							| @@ -1,27 +0,0 @@ | ||||
| { | ||||
|   "name": "openmct", | ||||
|   "description": "The Open MCT core platform", | ||||
|   "main": "", | ||||
|   "license": "Apache-2.0", | ||||
|   "moduleType": [], | ||||
|   "homepage": "http://nasa.github.io/openmct/", | ||||
|   "private": true, | ||||
|   "dependencies": { | ||||
|     "angular": "1.4.4", | ||||
|     "angular-route": "1.4.4", | ||||
|     "moment": "^2.11.1", | ||||
|     "moment-duration-format": "^1.3.0", | ||||
|     "requirejs": "~2.1.22", | ||||
|     "text": "requirejs-text#^2.0.14", | ||||
|     "es6-promise": "^3.3.0", | ||||
|     "screenfull": "^3.0.0", | ||||
|     "node-uuid": "^1.4.7", | ||||
|     "comma-separated-values": "^3.6.4", | ||||
|     "file-saver": "1.3.3", | ||||
|     "zepto": "^1.1.6", | ||||
|     "eventemitter3": "^1.2.0", | ||||
|     "lodash": "3.10.1", | ||||
|     "almond": "~0.3.2", | ||||
|     "moment-timezone": "^0.5.13" | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +0,0 @@ | ||||
| This bundle is intended to serve as an example of registering | ||||
| extensions which are mapped directly to built-in Angular features. | ||||
|  | ||||
| These are: | ||||
| * Controllers | ||||
| * Directives | ||||
| * Routes | ||||
| * Services | ||||
| @@ -1,74 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/ExampleController", | ||||
|     "./src/ExampleDirective", | ||||
|     "./src/ExampleService", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     ExampleController, | ||||
|     ExampleDirective, | ||||
|     ExampleService, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("example/builtins", { | ||||
|         "name": "Angular Built-ins Example", | ||||
|         "description": "Example showing how to declare extensions with built-in support from Angular.", | ||||
|         "sources": "src", | ||||
|         "extensions": { | ||||
|             "controllers": [ | ||||
|                 { | ||||
|                     "key": "ExampleController", | ||||
|                     "implementation": ExampleController, | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "exampleService" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "directives": [ | ||||
|                 { | ||||
|                     "key": "exampleDirective", | ||||
|                     "implementation": ExampleDirective, | ||||
|                     "depends": [ | ||||
|                         "examples[]" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "routes": [ | ||||
|                 { | ||||
|                     "templateUrl": "templates/example.html" | ||||
|                 } | ||||
|             ], | ||||
|             "services": [ | ||||
|                 { | ||||
|                     "key": "exampleService", | ||||
|                     "implementation": ExampleService | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,24 +0,0 @@ | ||||
| <!-- | ||||
|  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 | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <p>Hello, world! I am the default route.</p> | ||||
| <p ng-controller="ExampleController">My controller has told me: "{{phrase}}"</p> | ||||
| <span example-directive></span> | ||||
| @@ -1,42 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining ExampleController. Created by vwoeltje on 11/4/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function ExampleController($scope, exampleService) { | ||||
|             $scope.phrase = exampleService.getMessage(); | ||||
|         } | ||||
|  | ||||
|         return ExampleController; | ||||
|     } | ||||
| ); | ||||
| @@ -1,66 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining ExampleDirective. Created by vwoeltje on 11/4/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         var HAS_EXTENSIONS = "A directive loaded these message from " + | ||||
|                     "example extensions.", | ||||
|             NO_EXTENSIONS = "A directive tried to load example extensions," + | ||||
|                     " but found none.", | ||||
|             MESSAGE = "I heard this from my partial constructor."; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function ExampleDirective(examples) { | ||||
|             // Build up a template from example extensions | ||||
|             var template = examples.length > 0 ? | ||||
|                     HAS_EXTENSIONS : NO_EXTENSIONS; | ||||
|  | ||||
|             template += "<ul>"; | ||||
|             examples.forEach(function (E) { | ||||
|                 template += "<li>"; | ||||
|                 if (typeof E === 'function') { | ||||
|                     template += (new E(MESSAGE)).getText(); | ||||
|                 } else { | ||||
|                     template += E.text; | ||||
|                 } | ||||
|                 template += "</li>"; | ||||
|             }); | ||||
|             template += "</ul>"; | ||||
|  | ||||
|             return { | ||||
|                 template: template | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return ExampleDirective; | ||||
|     } | ||||
| ); | ||||
| @@ -1,46 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining ExampleService. Created by vwoeltje on 11/4/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function ExampleService() { | ||||
|             return { | ||||
|                 getMessage: function () { | ||||
|                     return "I heard this from a service"; | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return ExampleService; | ||||
|     } | ||||
| ); | ||||
| @@ -1,82 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/SomeProvider", | ||||
|     "./src/SomeOtherProvider", | ||||
|     "./src/SomeDecorator", | ||||
|     "./src/SomeOtherDecorator", | ||||
|     "./src/SomeAggregator", | ||||
|     "./src/SomeOtherExample", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     SomeProvider, | ||||
|     SomeOtherProvider, | ||||
|     SomeDecorator, | ||||
|     SomeOtherDecorator, | ||||
|     SomeAggregator, | ||||
|     SomeOtherExample, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("example/composite", { | ||||
|         "extensions": { | ||||
|             "components": [ | ||||
|                 { | ||||
|                     "implementation": SomeProvider, | ||||
|                     "provides": "someService", | ||||
|                     "type": "provider" | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": SomeOtherProvider, | ||||
|                     "provides": "someService", | ||||
|                     "type": "provider" | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": SomeDecorator, | ||||
|                     "provides": "someService", | ||||
|                     "type": "decorator" | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": SomeOtherDecorator, | ||||
|                     "provides": "someService", | ||||
|                     "type": "decorator" | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": SomeAggregator, | ||||
|                     "provides": "someService", | ||||
|                     "type": "aggregator" | ||||
|                 } | ||||
|             ], | ||||
|             "examples": [ | ||||
|                 { | ||||
|                     "implementation": SomeOtherExample, | ||||
|                     "depends": [ | ||||
|                         "someService" | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,50 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeAggregator. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeAggregator(someProviders) { | ||||
|             return { | ||||
|                 getMessages: function () { | ||||
|                     return someProviders.map(function (provider) { | ||||
|                         return provider.getMessages(); | ||||
|                     }).reduce(function (a, b) { | ||||
|                         return a.concat(b); | ||||
|                     }, []); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeAggregator; | ||||
|     } | ||||
| ); | ||||
| @@ -1,48 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeDecorator. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeDecorator(someProvider) { | ||||
|             return { | ||||
|                 getMessages: function () { | ||||
|                     return someProvider.getMessages().map(function (msg) { | ||||
|                         return msg.toLocaleUpperCase(); | ||||
|                     }); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeDecorator; | ||||
|     } | ||||
| ); | ||||
| @@ -1,48 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeOtherDecorator. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeOtherDecorator(someProvider) { | ||||
|             return { | ||||
|                 getMessages: function () { | ||||
|                     return someProvider.getMessages().map(function (msg) { | ||||
|                         return msg + "..."; | ||||
|                     }); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeOtherDecorator; | ||||
|     } | ||||
| ); | ||||
| @@ -1,46 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeOtherExample. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeOtherExample(someService) { | ||||
|             return { | ||||
|                 getText: function () { | ||||
|                     return someService.getMessages().join(" | "); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeOtherExample; | ||||
|     } | ||||
| ); | ||||
| @@ -1,48 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeOtherProvider. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeOtherProvider() { | ||||
|             return { | ||||
|                 getMessages: function () { | ||||
|                     return [ | ||||
|                         "I am a message from some other provider." | ||||
|                     ]; | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeOtherProvider; | ||||
|     } | ||||
| ); | ||||
| @@ -1,48 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeProvider. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeProvider() { | ||||
|             return { | ||||
|                 getMessages: function () { | ||||
|                     return [ | ||||
|                         "I am a message from some provider." | ||||
|                     ]; | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeProvider; | ||||
|     } | ||||
| ); | ||||
| @@ -22,24 +22,23 @@ | ||||
| /*global define */ | ||||
|  | ||||
| /** | ||||
|  * Module defining EventTelemetry.  | ||||
|  * Module defining EventTelemetry. | ||||
|  * Created by chacskaylo on 06/18/2015. | ||||
|  * Modified by shale on 06/23/2015.  | ||||
|  * Modified by shale on 06/23/2015. | ||||
|  */ | ||||
| define( | ||||
|     ['text!../data/transcript.json'], | ||||
|     function (transcript) { | ||||
|     ['../data/transcript.json'], | ||||
|     function (messages) { | ||||
|         "use strict"; | ||||
|  | ||||
|         var firstObservedTime = Date.now(), | ||||
|             messages = JSON.parse(transcript); | ||||
|          | ||||
|         var firstObservedTime = Date.now(); | ||||
|  | ||||
|         function EventTelemetry(request, interval) { | ||||
|  | ||||
|             var latestObservedTime = Date.now(), | ||||
|                 count = Math.floor((latestObservedTime - firstObservedTime) / interval), | ||||
|                 generatorData = {}; | ||||
|              | ||||
|  | ||||
|             generatorData.getPointCount = function () { | ||||
|                 return count; | ||||
|             }; | ||||
| @@ -48,13 +47,13 @@ define( | ||||
|                 return i * interval + | ||||
|                         (domain !== 'delta' ? firstObservedTime : 0); | ||||
|             }; | ||||
|              | ||||
|  | ||||
| 	        generatorData.getRangeValue = function (i, range) { | ||||
| 		        var domainDelta = this.getDomainValue(i) - firstObservedTime, | ||||
|                     ind = i % messages.length; | ||||
|                 return messages[ind] + " - [" + domainDelta.toString() + "]"; | ||||
| 	        }; | ||||
|              | ||||
|  | ||||
|             return generatorData; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -1,51 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/SomeExample", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     SomeExample, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("example/extensions", { | ||||
|         "name": "Custom Extensions Examples", | ||||
|         "description": "Example showing how to declare custom extensions.", | ||||
|         "sources": "src", | ||||
|         "extensions": { | ||||
|             "examples": [ | ||||
|                 { | ||||
|                     "text": "I came from example/extensions" | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": SomeExample, | ||||
|                     "depends": [ | ||||
|                         "exampleService" | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,52 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define,Promise*/ | ||||
|  | ||||
| /** | ||||
|  * Module defining SomeExample. Created by vwoeltje on 11/5/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function SomeExample(exampleService, message) { | ||||
|             return { | ||||
|                 getText: function () { | ||||
|                     return [ | ||||
|                         '"', | ||||
|                         exampleService.getMessage(), | ||||
|                         '" and "', | ||||
|                         message, | ||||
|                         '"' | ||||
|                     ].join(""); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return SomeExample; | ||||
|     } | ||||
| ); | ||||
| @@ -27,8 +27,14 @@ define([ | ||||
|  | ||||
| ) { | ||||
|  | ||||
|     var RED = 0.9, | ||||
|         YELLOW = 0.5, | ||||
|     var RED = { | ||||
|             sin: 0.9,  | ||||
|             cos: 0.9 | ||||
|         }, | ||||
|         YELLOW = { | ||||
|             sin: 0.5, | ||||
|             cos: 0.5 | ||||
|         }, | ||||
|         LIMITS = { | ||||
|             rh: { | ||||
|                 cssClass: "s-limit-upr s-limit-red", | ||||
| @@ -67,17 +73,18 @@ define([ | ||||
|     SinewaveLimitProvider.prototype.getLimitEvaluator = function (domainObject) { | ||||
|         return { | ||||
|             evaluate: function (datum, valueMetadata) { | ||||
|                 var range = valueMetadata ? valueMetadata.key : 'sin' | ||||
|                 if (datum[range] > RED) { | ||||
|                 var range = valueMetadata && valueMetadata.key; | ||||
|                  | ||||
|                 if (datum[range] > RED[range]) { | ||||
|                     return LIMITS.rh; | ||||
|                 } | ||||
|                 if (datum[range] < -RED) { | ||||
|                 if (datum[range] < -RED[range]) { | ||||
|                     return LIMITS.rl; | ||||
|                 } | ||||
|                 if (datum[range] > YELLOW) { | ||||
|                 if (datum[range] > YELLOW[range]) { | ||||
|                     return LIMITS.yh; | ||||
|                 } | ||||
|                 if (datum[range] < -YELLOW) { | ||||
|                 if (datum[range] < -YELLOW[range]) { | ||||
|                     return LIMITS.yl; | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'text!./generatorWorker.js', | ||||
|     'raw-loader!./generatorWorker.js', | ||||
|     'uuid' | ||||
| ], function ( | ||||
|     workerText, | ||||
|   | ||||
							
								
								
									
										19
									
								
								example/simpleVuePlugin/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								example/simpleVuePlugin/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| <template> | ||||
|   <div class="example">{{ msg }}</div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   data () { | ||||
|     return { | ||||
|       msg: 'Hello world!' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style> | ||||
| .example { | ||||
|   color: red; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										37
									
								
								example/simpleVuePlugin/plugin.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								example/simpleVuePlugin/plugin.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| import Vue from 'Vue'; | ||||
| import HelloWorld from './HelloWorld.vue'; | ||||
|  | ||||
| function SimpleVuePlugin () { | ||||
|     return function install(openmct) { | ||||
|         var views = (openmct.mainViews || openmct.objectViews); | ||||
|  | ||||
|         openmct.types.addType('hello-world', { | ||||
|             name: 'Hello World', | ||||
|             description: 'An introduction object', | ||||
|             creatable: true | ||||
|         }); | ||||
|         openmct.objectViews.addProvider({ | ||||
|             name: "demo-provider", | ||||
|             key: "hello-world", | ||||
|             cssClass: "icon-packet", | ||||
|             canView: function (d) { | ||||
|                 return d.type === 'hello-world'; | ||||
|             }, | ||||
|             view: function (domainObject) { | ||||
|                 var vm; | ||||
|                 return { | ||||
|                     show: function (container) { | ||||
|                         vm = new Vue(HelloWorld); | ||||
|                         container.appendChild(vm.$mount().$el); | ||||
|                     }, | ||||
|                     destroy: function (container) { | ||||
|                         vm.$destroy(); | ||||
|                     } | ||||
|                 }; | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| export default SimpleVuePlugin | ||||
| @@ -1,10 +1,26 @@ | ||||
| define([ | ||||
|     "./src/ExampleStyleGuideModelProvider", | ||||
|     "./src/MCTExample", | ||||
|     "./res/templates/intro.html", | ||||
|     "./res/templates/standards.html", | ||||
|     "./res/templates/colors.html", | ||||
|     "./res/templates/status.html", | ||||
|     "./res/templates/glyphs.html", | ||||
|     "./res/templates/controls.html", | ||||
|     "./res/templates/input.html", | ||||
|     "./res/templates/menus.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     ExampleStyleGuideModelProvider, | ||||
|     MCTExample, | ||||
|     introTemplate, | ||||
|     standardsTemplate, | ||||
|     colorsTemplate, | ||||
|     statusTemplate, | ||||
|     glyphsTemplate, | ||||
|     controlsTemplate, | ||||
|     inputTemplate, | ||||
|     menusTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     legacyRegistry.register("example/styleguide", { | ||||
| @@ -23,14 +39,14 @@ define([ | ||||
|                 { "key": "styleguide.menus", "name": "Menus", "cssClass": "icon-page", "description": "Context menus, dropdowns" } | ||||
|             ], | ||||
|             "views": [ | ||||
|                 { "key": "styleguide.intro", "type": "styleguide.intro", "templateUrl": "templates/intro.html", "editable": false }, | ||||
|                 { "key": "styleguide.standards", "type": "styleguide.standards", "templateUrl": "templates/standards.html", "editable": false }, | ||||
|                 { "key": "styleguide.colors", "type": "styleguide.colors", "templateUrl": "templates/colors.html", "editable": false }, | ||||
|                 { "key": "styleguide.status", "type": "styleguide.status", "templateUrl": "templates/status.html", "editable": false }, | ||||
|                 { "key": "styleguide.glyphs", "type": "styleguide.glyphs", "templateUrl": "templates/glyphs.html", "editable": false }, | ||||
|                 { "key": "styleguide.controls", "type": "styleguide.controls", "templateUrl": "templates/controls.html", "editable": false }, | ||||
|                 { "key": "styleguide.input", "type": "styleguide.input", "templateUrl": "templates/input.html", "editable": false }, | ||||
|                 { "key": "styleguide.menus", "type": "styleguide.menus", "templateUrl": "templates/menus.html", "editable": false } | ||||
|                 { "key": "styleguide.intro", "type": "styleguide.intro", "template": introTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.standards", "type": "styleguide.standards", "template": standardsTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.colors", "type": "styleguide.colors", "template": colorsTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.status", "type": "styleguide.status", "template": statusTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.glyphs", "type": "styleguide.glyphs", "template": glyphsTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.controls", "type": "styleguide.controls", "template": controlsTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.input", "type": "styleguide.input", "template": inputTemplate, "editable": false }, | ||||
|                 { "key": "styleguide.menus", "type": "styleguide.menus", "template": menusTemplate, "editable": false } | ||||
|             ], | ||||
|             "roots": [ | ||||
|                 { | ||||
| @@ -85,16 +101,6 @@ define([ | ||||
|                         "$q" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "stylesheets": [ | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/style-guide-espresso.css", | ||||
|                     "theme": "espresso" | ||||
|                 }, | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/style-guide-snow.css", | ||||
|                     "theme": "snow" | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
|   | ||||
| @@ -34,7 +34,7 @@ | ||||
|             <p>As you develop plugins for Open MCT, consider how a generalized component might be combined with others when designing to create a rich and powerful larger object, rather than adding a single monolithic, non-modular plugin. To solve a particular problem or allow a new feature in Open MCT, you may need to introduce more than just one new object type.</p> | ||||
|             </div> | ||||
|             <div class="col"> | ||||
|                 <img src="/example/styleguide/res/images/diagram-objects.svg" /> | ||||
|                 <img src="../images/diagram-objects.svg" /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| @@ -48,7 +48,7 @@ | ||||
|             <p>The types of objects that a container can hold should be based on the purpose of the container and the views that it affords. For example, a Folder’s purpose is to allow a user to conceptually organize objects of all other types; a Folder must therefore be able to contain an object of any type.</p> | ||||
|             </div> | ||||
|             <div class="col"> | ||||
|                 <img src="/example/styleguide/res/images/diagram-containment.svg" /> | ||||
|                 <img src="../images/diagram-containment.svg" /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| @@ -60,7 +60,7 @@ | ||||
|                 <p>Views are simply different ways to view the content of a given object. For example, telemetry data could be viewed as a plot or a table. A clock can display its time in analog fashion or with digital numbers. In each view, all of the content is present; it’s just represented differently. When providing views for an object, all the content of the object should be present in each view.</p> | ||||
|             </div> | ||||
|             <div class="col"> | ||||
|                 <img src="/example/styleguide/res/images/diagram-views.svg" /> | ||||
|                 <img src="../images/diagram-views.svg" /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| @@ -70,4 +70,4 @@ | ||||
|     <p></p> | ||||
|     <p></p> | ||||
|     <p></p> | ||||
| </div> | ||||
| </div> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| define([ | ||||
|     'text!../res/templates/mct-example.html' | ||||
|     '../res/templates/mct-example.html' | ||||
| ], function ( | ||||
|     MCTExampleTemplate | ||||
| ) { | ||||
|   | ||||
| @@ -1,68 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/ExampleTaxonomyModelProvider", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     ExampleTaxonomyModelProvider, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("example/taxonomy", { | ||||
|         "name": "Example taxonomy", | ||||
|         "description": "Example illustrating the addition of a static top-level hierarchy", | ||||
|         "extensions": { | ||||
|             "roots": [ | ||||
|                 { | ||||
|                     "id": "exampleTaxonomy" | ||||
|                 } | ||||
|             ], | ||||
|             "models": [ | ||||
|                 { | ||||
|                     "id": "exampleTaxonomy", | ||||
|                     "model": { | ||||
|                         "type": "folder", | ||||
|                         "name": "Stub Subsystems", | ||||
|                         "composition": [ | ||||
|                             "examplePacket0", | ||||
|                             "examplePacket1", | ||||
|                             "examplePacket2" | ||||
|                         ] | ||||
|                     } | ||||
|                 } | ||||
|             ], | ||||
|             "components": [ | ||||
|                 { | ||||
|                     "provides": "modelService", | ||||
|                     "type": "provider", | ||||
|                     "implementation": ExampleTaxonomyModelProvider, | ||||
|                     "depends": [ | ||||
|                         "$q" | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,69 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         function ExampleTaxonomyModelProvider($q) { | ||||
|             var models = {}, | ||||
|                 packetId, | ||||
|                 telemetryId, | ||||
|                 i, | ||||
|                 j; | ||||
|  | ||||
|             // Add some "subsystems" | ||||
|             for (i = 0; i < 3; i += 1) { | ||||
|                 packetId = "examplePacket" + i; | ||||
|  | ||||
|                 models[packetId] = { | ||||
|                     name: "Stub Subsystem " + (i + 1), | ||||
|                     type: "telemetry.panel", | ||||
|                     composition: [] | ||||
|                 }; | ||||
|  | ||||
|                 // Add some "telemetry points" | ||||
|                 for (j = 0; j < 100 * (i + 1); j += 1) { | ||||
|                     telemetryId = "exampleTelemetry" + j; | ||||
|                     models[telemetryId] = { | ||||
|                         name: "SWG" + i + "." + j, | ||||
|                         type: "generator", | ||||
|                         telemetry: { | ||||
|                             period: 10 + i + j | ||||
|                         } | ||||
|                     }; | ||||
|                     models[packetId].composition.push(telemetryId); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|                 getModels: function () { | ||||
|                     return $q.when(models); | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return ExampleTaxonomyModelProvider; | ||||
|     } | ||||
| ); | ||||
| @@ -1 +0,0 @@ | ||||
| Example of running a Web Worker using the `workerService`. | ||||
| @@ -1,52 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define([ | ||||
|     "./src/FibonacciIndicator", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     FibonacciIndicator, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|     "use strict"; | ||||
|  | ||||
|     legacyRegistry.register("example/worker", { | ||||
|         "extensions": { | ||||
|             "indicators": [ | ||||
|                 { | ||||
|                     "implementation": FibonacciIndicator, | ||||
|                     "depends": [ | ||||
|                         "workerService", | ||||
|                         "$rootScope" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "workers": [ | ||||
|                 { | ||||
|                     "key": "example.fibonacci", | ||||
|                     "scriptUrl": "FibonacciWorker.js" | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -1,67 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global define*/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|         "use strict"; | ||||
|  | ||||
|         /** | ||||
|          * Displays Fibonacci numbers in the status area. | ||||
|          * @constructor | ||||
|          */ | ||||
|         function FibonacciIndicator(workerService, $rootScope) { | ||||
|             var latest, | ||||
|                 counter = 0, | ||||
|                 worker = workerService.run('example.fibonacci'); | ||||
|  | ||||
|             function requestNext() { | ||||
|                 worker.postMessage([counter]); | ||||
|                 counter += 1; | ||||
|             } | ||||
|  | ||||
|             function handleResponse(event) { | ||||
|                 latest = event.data; | ||||
|                 $rootScope.$apply(); | ||||
|                 requestNext(); | ||||
|             } | ||||
|  | ||||
|             worker.onmessage = handleResponse; | ||||
|             requestNext(); | ||||
|  | ||||
|             return { | ||||
|                 getCssClass: function () { | ||||
|                     return "icon-object-unknown"; | ||||
|                 }, | ||||
|                 getText: function () { | ||||
|                     return "" + latest; | ||||
|                 }, | ||||
|                 getDescription: function () { | ||||
|                     return ""; | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return FibonacciIndicator; | ||||
|     } | ||||
| ); | ||||
| @@ -1,15 +0,0 @@ | ||||
| /*global self*/ | ||||
| (function () { | ||||
|     "use strict"; | ||||
|  | ||||
|     // Calculate fibonacci numbers inefficiently. | ||||
|     // We can do this because we're on a background thread, and | ||||
|     // won't halt the UI. | ||||
|     function fib(n) { | ||||
|         return n < 2 ? n : (fib(n - 1) + fib(n - 2)); | ||||
|     } | ||||
|  | ||||
|     self.onmessage = function (event) { | ||||
|         self.postMessage(fib(event.data)); | ||||
|     }; | ||||
| }()); | ||||
							
								
								
									
										182
									
								
								gulpfile.js
									
									
									
									
									
								
							
							
						
						
									
										182
									
								
								gulpfile.js
									
									
									
									
									
								
							| @@ -1,182 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /*global require,__dirname*/ | ||||
|  | ||||
| require("v8-compile-cache"); | ||||
|  | ||||
| var gulp = require('gulp'), | ||||
|     sourcemaps = require('gulp-sourcemaps'), | ||||
|     path = require('path'), | ||||
|     fs = require('fs'), | ||||
|     git = require('git-rev-sync'), | ||||
|     moment = require('moment'), | ||||
|     project = require('./package.json'), | ||||
|     _ = require('lodash'), | ||||
|     paths = { | ||||
|         main: 'openmct.js', | ||||
|         dist: 'dist', | ||||
|         reports: 'dist/reports', | ||||
|         scss: ['./platform/**/*.scss', './example/**/*.scss'], | ||||
|         assets: [ | ||||
|             './{example,platform}/**/*.{css,css.map,png,svg,ico,woff,eot,ttf}' | ||||
|         ], | ||||
|         scripts: [ 'openmct.js', 'platform/**/*.js', 'src/**/*.js' ], | ||||
|         specs: [ 'platform/**/*Spec.js', 'src/**/*Spec.js' ], | ||||
|     }, | ||||
|     options = { | ||||
|         requirejsOptimize: { | ||||
|             name: 'bower_components/almond/almond.js', | ||||
|             include: paths.main.replace('.js', ''), | ||||
|             wrap: { | ||||
|                 start: (function () { | ||||
|                     var buildVariables = { | ||||
|                         version: project.version, | ||||
|                         timestamp: moment.utc(Date.now()).format(), | ||||
|                         revision: fs.existsSync('.git') ? git.long() : 'Unknown', | ||||
|                         branch: fs.existsSync('.git') ? git.branch() : 'Unknown' | ||||
|                     }; | ||||
|                     return fs.readFileSync("src/start.frag", 'utf-8') | ||||
|                         .replace(/@@(\w+)/g, function (match, key) { | ||||
|                             return buildVariables[key]; | ||||
|                         });; | ||||
|                 }()), | ||||
|                 endFile: "src/end.frag" | ||||
|             }, | ||||
|             optimize: 'uglify2', | ||||
|             uglify2: { output: { comments: /@preserve/ } }, | ||||
|             mainConfigFile: paths.main, | ||||
|             wrapShim: true | ||||
|         }, | ||||
|         karma: { | ||||
|             configFile: path.resolve(__dirname, 'karma.conf.js'), | ||||
|             singleRun: true | ||||
|         }, | ||||
|         sass: { | ||||
|             sourceComments: true | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| if (process.env.NODE_ENV === 'development') { | ||||
|     options.requirejsOptimize.optimize = 'none'; | ||||
| } | ||||
|  | ||||
|  | ||||
| gulp.task('scripts', function () { | ||||
|     var requirejsOptimize = require('gulp-requirejs-optimize'); | ||||
|  | ||||
|     return gulp.src(paths.main) | ||||
|         .pipe(sourcemaps.init()) | ||||
|         .pipe(requirejsOptimize(options.requirejsOptimize)) | ||||
|         .pipe(sourcemaps.write('.')) | ||||
|         .pipe(gulp.dest(paths.dist)); | ||||
| }); | ||||
|  | ||||
| gulp.task('test', function (done) { | ||||
|     var karma = require('karma'); | ||||
|     new karma.Server(options.karma, done).start(); | ||||
| }); | ||||
|  | ||||
| gulp.task('stylesheets', function () { | ||||
|     var sass = require('gulp-sass'); | ||||
|     var rename = require('gulp-rename'); | ||||
|     var bourbon = require('node-bourbon'); | ||||
|     options.sass.includePaths = bourbon.includePaths; | ||||
|  | ||||
|     return gulp.src(paths.scss, {base: '.'}) | ||||
|         .pipe(sourcemaps.init()) | ||||
|         .pipe(sass(options.sass).on('error', sass.logError)) | ||||
|         .pipe(rename(function (file) { | ||||
|             file.dirname = | ||||
|                 file.dirname.replace(path.sep + 'sass', path.sep + 'css'); | ||||
|             return file; | ||||
|         })) | ||||
|         .pipe(sourcemaps.write('.')) | ||||
|         .pipe(gulp.dest(__dirname)); | ||||
| }); | ||||
|  | ||||
| gulp.task('lint', function () { | ||||
|     var jshint = require('gulp-jshint'); | ||||
|     var merge = require('merge-stream'); | ||||
|  | ||||
|     var nonspecs = paths.specs.map(function (glob) { | ||||
|             return "!" + glob; | ||||
|         }), | ||||
|         scriptLint = gulp.src(paths.scripts.concat(nonspecs)) | ||||
|             .pipe(jshint()), | ||||
|         specLint = gulp.src(paths.specs) | ||||
|             .pipe(jshint({ jasmine: true })); | ||||
|  | ||||
|     return merge(scriptLint, specLint) | ||||
|         .pipe(jshint.reporter('gulp-jshint-html-reporter', { | ||||
|             filename: paths.reports + '/lint/jshint-report.html', | ||||
|             createMissingFolders : true | ||||
|         })) | ||||
|         .pipe(jshint.reporter('default')) | ||||
|         .pipe(jshint.reporter('fail')); | ||||
| }); | ||||
|  | ||||
| gulp.task('checkstyle', function () { | ||||
|     var jscs = require('gulp-jscs'); | ||||
|     var mkdirp = require('mkdirp'); | ||||
|     var reportName = 'jscs-html-report.html'; | ||||
|     var reportPath = path.resolve(paths.reports, 'checkstyle', reportName); | ||||
|     var moveReport = fs.rename.bind(fs, reportName, reportPath, _.noop); | ||||
|  | ||||
|     mkdirp.sync(path.resolve(paths.reports, 'checkstyle')); | ||||
|  | ||||
|     return gulp.src(paths.scripts) | ||||
|         .pipe(jscs()) | ||||
|         .pipe(jscs.reporter()) | ||||
|         .pipe(jscs.reporter('jscs-html-reporter')).on('finish', moveReport) | ||||
|         .pipe(jscs.reporter('fail')); | ||||
| }); | ||||
|  | ||||
| gulp.task('fixstyle', function () { | ||||
|     var jscs = require('gulp-jscs'); | ||||
|  | ||||
|     return gulp.src(paths.scripts, { base: '.' }) | ||||
|         .pipe(jscs({ fix: true })) | ||||
|         .pipe(gulp.dest('.')); | ||||
| }); | ||||
|  | ||||
| gulp.task('assets', ['stylesheets'], function () { | ||||
|     return gulp.src(paths.assets) | ||||
|         .pipe(gulp.dest(paths.dist)); | ||||
| }); | ||||
|  | ||||
| gulp.task('watch', function () { | ||||
|     return gulp.watch(paths.scss, ['stylesheets', 'assets']); | ||||
| }); | ||||
|  | ||||
| gulp.task('serve', function () { | ||||
|     console.log('Running development server with all defaults'); | ||||
|     var app = require('./app.js'); | ||||
| }); | ||||
|  | ||||
| gulp.task('develop', ['serve', 'stylesheets', 'watch']); | ||||
|  | ||||
| gulp.task('install', [ 'assets', 'scripts' ]); | ||||
|  | ||||
| gulp.task('verify', [ 'lint', 'test', 'checkstyle' ]); | ||||
|  | ||||
| gulp.task('build', [ 'verify', 'install' ]); | ||||
							
								
								
									
										109
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								index.html
									
									
									
									
									
								
							| @@ -26,66 +26,57 @@ | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no"> | ||||
|         <meta name="apple-mobile-web-app-capable" content="yes"> | ||||
|         <title></title> | ||||
|         <script src="bower_components/requirejs/require.js"> </script> | ||||
|         <script> | ||||
|             var THIRTY_MINUTES = 30 * 60 * 1000; | ||||
|  | ||||
|             require(['openmct'], function (openmct) { | ||||
|                 [ | ||||
|                     'example/eventGenerator', | ||||
|                     'example/styleguide' | ||||
|                 ].forEach( | ||||
|                     openmct.legacyRegistry.enable.bind(openmct.legacyRegistry) | ||||
|                 ); | ||||
|                 openmct.install(openmct.plugins.MyItems()); | ||||
|                 openmct.install(openmct.plugins.LocalStorage()); | ||||
|                 openmct.install(openmct.plugins.Espresso()); | ||||
|                 openmct.install(openmct.plugins.Generator()); | ||||
|                 openmct.install(openmct.plugins.ExampleImagery()); | ||||
|                 openmct.install(openmct.plugins.UTCTimeSystem()); | ||||
|                 openmct.install(openmct.plugins.ImportExport()); | ||||
|                 openmct.install(openmct.plugins.AutoflowView({ | ||||
|                     type: "telemetry.panel" | ||||
|                 })); | ||||
|                 openmct.install(openmct.plugins.Conductor({ | ||||
|                     menuOptions: [ | ||||
|                         { | ||||
|                             name: "Fixed", | ||||
|                             timeSystem: 'utc', | ||||
|                             bounds: { | ||||
|                                 start: Date.now() - THIRTY_MINUTES, | ||||
|                                 end: Date.now() | ||||
|                             } | ||||
|                         }, | ||||
|                         { | ||||
|                             name: "Realtime", | ||||
|                             timeSystem: 'utc', | ||||
|                             clock: 'local', | ||||
|                             clockOffsets: { | ||||
|                                 start: -25 * 60 * 1000, | ||||
|                                 end: 5 * 60 * 1000 | ||||
|                             } | ||||
|                         } | ||||
|                     ] | ||||
|                 })); | ||||
|                 openmct.install(openmct.plugins.SummaryWidget()); | ||||
|                 openmct.install(openmct.plugins.Notebook()); | ||||
|                 openmct.time.clock('local', {start: -THIRTY_MINUTES, end: 0}); | ||||
|                 openmct.time.timeSystem('utc'); | ||||
|                 openmct.start(); | ||||
|                 window.openmct = openmct; | ||||
|             }); | ||||
|         </script> | ||||
|         <link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css"> | ||||
|         <link rel="stylesheet" href="platform/commonUI/general/res/css/openmct.css"> | ||||
|         <link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32"> | ||||
|         <link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96"> | ||||
|         <link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16"> | ||||
|         <link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico"> | ||||
|         <script src="dist/openmct.js"></script> | ||||
|         <link rel="stylesheet" href="dist/openmct.css"> | ||||
|         <link rel="icon" type="image/png" href="dist/favicons/favicon-32x32.png" sizes="32x32"> | ||||
|         <link rel="icon" type="image/png" href="dist/favicons/favicon-96x96.png" sizes="96x96"> | ||||
|         <link rel="icon" type="image/png" href="dist/favicons/favicon-16x16.png" sizes="16x16"> | ||||
|         <link rel="shortcut icon" href="dist/favicons/favicon.ico"> | ||||
|     </head> | ||||
|     <body> | ||||
|         <div class="l-splash-holder s-splash-holder"> | ||||
|             <div class="l-splash s-splash"></div> | ||||
|         </div> | ||||
|     </body> | ||||
|     <script> | ||||
|         var THIRTY_MINUTES = 30 * 60 * 1000; | ||||
|         [ | ||||
|             'example/eventGenerator', | ||||
|             'example/styleguide' | ||||
|         ].forEach( | ||||
|             openmct.legacyRegistry.enable.bind(openmct.legacyRegistry) | ||||
|         ); | ||||
|         openmct.install(openmct.plugins.MyItems()); | ||||
|         openmct.install(openmct.plugins.LocalStorage()); | ||||
|         openmct.install(openmct.plugins.Generator()); | ||||
|         openmct.install(openmct.plugins.ExampleImagery()); | ||||
|         openmct.install(openmct.plugins.UTCTimeSystem()); | ||||
|         openmct.install(openmct.plugins.ImportExport()); | ||||
|         openmct.install(openmct.plugins.AutoflowView({ | ||||
|             type: "telemetry.panel" | ||||
|         })); | ||||
|         openmct.install(openmct.plugins.Conductor({ | ||||
|             menuOptions: [ | ||||
|                 { | ||||
|                     name: "Fixed", | ||||
|                     timeSystem: 'utc', | ||||
|                     bounds: { | ||||
|                         start: Date.now() - THIRTY_MINUTES, | ||||
|                         end: Date.now() | ||||
|                     } | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "Realtime", | ||||
|                     timeSystem: 'utc', | ||||
|                     clock: 'local', | ||||
|                     clockOffsets: { | ||||
|                         start: -25 * 60 * 1000, | ||||
|                         end: 5 * 60 * 1000 | ||||
|                     } | ||||
|                 } | ||||
|             ] | ||||
|         })); | ||||
|         openmct.install(openmct.plugins.SummaryWidget()); | ||||
|         openmct.install(openmct.plugins.Notebook()); | ||||
|         openmct.time.clock('local', {start: -THIRTY_MINUTES, end: 0}); | ||||
|         openmct.time.timeSystem('utc'); | ||||
|         openmct.start(); | ||||
|     </script> | ||||
| </html> | ||||
|   | ||||
| @@ -21,70 +21,40 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /*global module,process*/ | ||||
| module.exports = function(config) { | ||||
|  | ||||
| const devMode = process.env.NODE_ENV !== 'production'; | ||||
|  | ||||
| module.exports = (config) => { | ||||
|  | ||||
|     const webpackConfig = require('./webpack.config.js'); | ||||
|     delete webpackConfig.output; | ||||
|  | ||||
|     if (!devMode) { | ||||
|         webpackConfig.module.rules.push({ | ||||
|             test: /\.js$/, | ||||
|             exclude: /node_modules|example/, | ||||
|             use: 'istanbul-instrumenter-loader' | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     config.set({ | ||||
|  | ||||
|         // Base path that will be used to resolve all file patterns. | ||||
|         basePath: '', | ||||
|  | ||||
|         // Frameworks to use | ||||
|         // Available frameworks: https://npmjs.org/browse/keyword/karma-adapter | ||||
|         frameworks: ['jasmine', 'requirejs'], | ||||
|  | ||||
|         // List of files / patterns to load in the browser. | ||||
|         // By default, files are also included in a script tag. | ||||
|         frameworks: ['jasmine'], | ||||
|         files: [ | ||||
|             {pattern: 'bower_components/**/*.js', included: false}, | ||||
|             {pattern: 'node_modules/d3-*/**/*.js', included: false}, | ||||
|             {pattern: 'node_modules/vue/**/*.js', included: false}, | ||||
|             {pattern: 'node_modules/printj/dist/*.js', included: false}, | ||||
|             {pattern: 'src/**/*', included: false}, | ||||
|             {pattern: 'node_modules/painterro/build/*.js', included: false}, | ||||
|             {pattern: 'node_modules/html2canvas/dist/*', included: false}, | ||||
|             {pattern: 'example/**/*.html', included: false}, | ||||
|             {pattern: 'example/**/*.js', included: false}, | ||||
|             {pattern: 'example/**/*.json', included: false}, | ||||
|             {pattern: 'platform/**/*.js', included: false}, | ||||
|             {pattern: 'warp/**/*.js', included: false}, | ||||
|             {pattern: 'platform/**/*.html', included: false}, | ||||
|             'test-main.js' | ||||
|             'platform/**/*Spec.js', | ||||
|             'src/**/*Spec.js' | ||||
|         ], | ||||
|  | ||||
|         // List of files to exclude. | ||||
|         exclude: [ | ||||
|             'platform/framework/src/Main.js' | ||||
|         ], | ||||
|  | ||||
|         // Preprocess matching files before serving them to the browser. | ||||
|         // https://npmjs.org/browse/keyword/karma-preprocessor | ||||
|         preprocessors: { | ||||
|             'src/**/!(*Spec).js': [ 'coverage' ], | ||||
|             'platform/**/src/**/!(*Spec).js': [ 'coverage' ] | ||||
|         }, | ||||
|  | ||||
|         // Test results reporter to use | ||||
|         // Possible values: 'dots', 'progress' | ||||
|         // Available reporters: https://npmjs.org/browse/keyword/karma-reporter | ||||
|         reporters: ['progress', 'coverage', 'html'], | ||||
|  | ||||
|         // Web server port. | ||||
|         port: 9876, | ||||
|  | ||||
|         // Wnable / disable colors in the output (reporters and logs). | ||||
|         reporters: [ | ||||
|             'progress', | ||||
|             'coverage', | ||||
|             'html' | ||||
|         ], | ||||
|         browsers: ['ChromeHeadless'], | ||||
|         colors: true, | ||||
|  | ||||
|         logLevel: config.LOG_INFO, | ||||
|  | ||||
|         // Rerun tests when any file changes. | ||||
|         autoWatch: true, | ||||
|  | ||||
|         // Specify browsers to run tests in. | ||||
|         // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher | ||||
|         browsers: [ | ||||
|             'ChromeHeadless' | ||||
|         ], | ||||
|  | ||||
|         // Code coverage reporting. | ||||
|         coverageReporter: { | ||||
|             dir: process.env.CIRCLE_ARTIFACTS ? | ||||
|                 process.env.CIRCLE_ARTIFACTS + '/coverage' : | ||||
| @@ -104,8 +74,19 @@ module.exports = function(config) { | ||||
|             foldAll: false | ||||
|         }, | ||||
|  | ||||
|         // Continuous Integration mode. | ||||
|         // If true, Karma captures browsers, runs the tests and exits. | ||||
|         preprocessors: { | ||||
|             // add webpack as preprocessor | ||||
|             'platform/**/*Spec.js': [ 'webpack' ], | ||||
|             'src/**/*Spec.js': [ 'webpack' ] | ||||
|         }, | ||||
|  | ||||
|         webpack: webpackConfig, | ||||
|  | ||||
|         webpackMiddleware: { | ||||
|             stats: 'errors-only', | ||||
|             logLevel: 'warn' | ||||
|         }, | ||||
|         singleRun: true | ||||
|     }); | ||||
| }; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										105
									
								
								openmct.js
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								openmct.js
									
									
									
									
									
								
							| @@ -19,102 +19,19 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global requirejs,BUILD_CONSTANTS*/ | ||||
| /*global module,BUILD_CONSTANTS*/ | ||||
|  | ||||
| requirejs.config({ | ||||
|     "paths": { | ||||
|         "legacyRegistry": "src/legacyRegistry", | ||||
|         "angular": "bower_components/angular/angular.min", | ||||
|         "angular-route": "bower_components/angular-route/angular-route.min", | ||||
|         "csv": "bower_components/comma-separated-values/csv.min", | ||||
|         "EventEmitter": "bower_components/eventemitter3/index", | ||||
|         "es6-promise": "bower_components/es6-promise/es6-promise.min", | ||||
|         "moment": "bower_components/moment/moment", | ||||
|         "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", | ||||
|         "moment-timezone": "bower_components/moment-timezone/builds/moment-timezone-with-data", | ||||
|         "saveAs": "bower_components/file-saver/FileSaver.min", | ||||
|         "screenfull": "bower_components/screenfull/dist/screenfull.min", | ||||
|         "text": "bower_components/text/text", | ||||
|         "uuid": "bower_components/node-uuid/uuid", | ||||
|         "vue": "node_modules/vue/dist/vue.min", | ||||
|         "zepto": "bower_components/zepto/zepto.min", | ||||
|         "lodash": "bower_components/lodash/lodash", | ||||
|         "d3-selection": "node_modules/d3-selection/dist/d3-selection.min", | ||||
|         "d3-scale": "node_modules/d3-scale/build/d3-scale.min", | ||||
|         "d3-axis": "node_modules/d3-axis/build/d3-axis.min", | ||||
|         "d3-array": "node_modules/d3-array/build/d3-array.min", | ||||
|         "d3-collection": "node_modules/d3-collection/build/d3-collection.min", | ||||
|         "d3-color": "node_modules/d3-color/build/d3-color.min", | ||||
|         "d3-format": "node_modules/d3-format/build/d3-format.min", | ||||
|         "d3-interpolate": "node_modules/d3-interpolate/build/d3-interpolate.min", | ||||
|         "d3-time": "node_modules/d3-time/build/d3-time.min", | ||||
|         "d3-time-format": "node_modules/d3-time-format/build/d3-time-format.min", | ||||
|         "html2canvas": "node_modules/html2canvas/dist/html2canvas.min", | ||||
|         "painterro": "node_modules/painterro/build/painterro.min", | ||||
|         "printj": "node_modules/printj/dist/printj.min" | ||||
|     }, | ||||
|     "shim": { | ||||
|         "angular": { | ||||
|             "exports": "angular" | ||||
|         }, | ||||
|         "angular-route": { | ||||
|             "deps": ["angular"] | ||||
|         }, | ||||
|         "EventEmitter": { | ||||
|             "exports": "EventEmitter" | ||||
|         }, | ||||
|         "moment-duration-format": { | ||||
|             "deps": ["moment"] | ||||
|         }, | ||||
|         "painterro": { | ||||
|             "exports": "Painterro" | ||||
|         }, | ||||
|         "saveAs": { | ||||
|             "exports": "saveAs" | ||||
|         }, | ||||
|         "screenfull": { | ||||
|             "exports": "screenfull" | ||||
|         }, | ||||
|         "zepto": { | ||||
|             "exports": "Zepto" | ||||
|         }, | ||||
|         "lodash": { | ||||
|             "exports": "lodash" | ||||
|         }, | ||||
|         "d3-selection": { | ||||
|             "exports": "d3-selection" | ||||
|         }, | ||||
|         "d3-scale": { | ||||
|             "deps": ["d3-array", "d3-collection", "d3-color", "d3-format", "d3-interpolate", "d3-time", "d3-time-format"], | ||||
|             "exports": "d3-scale" | ||||
|         }, | ||||
|         "d3-axis": { | ||||
|             "exports": "d3-axis" | ||||
|         }, | ||||
|         "dom-to-image": { | ||||
|             "exports": "domtoimage" | ||||
|         } | ||||
| const matcher = /\/openmct.js$/; | ||||
| if (document.currentScript) { | ||||
|     let src = document.currentScript.src; | ||||
|     if (src && matcher.test(src)) { | ||||
|         // eslint-disable-next-line no-undef | ||||
|         __webpack_public_path__ = src.replace(matcher, '') + '/'; | ||||
|     } | ||||
| }); | ||||
| } | ||||
|  | ||||
| define([ | ||||
|     './platform/framework/src/Main', | ||||
|     './src/defaultRegistry', | ||||
|     './src/MCT', | ||||
|     './src/plugins/buildInfo/plugin' | ||||
| ], function (Main, defaultRegistry, MCT, buildInfo) { | ||||
|     var openmct = new MCT(); | ||||
| const MCT = require('./src/MCT'); | ||||
|  | ||||
|     openmct.legacyRegistry = defaultRegistry; | ||||
|     openmct.install(openmct.plugins.Plot()); | ||||
| var openmct = new MCT(); | ||||
|  | ||||
|     if (typeof BUILD_CONSTANTS !== 'undefined') { | ||||
|         openmct.install(buildInfo(BUILD_CONSTANTS)); | ||||
|     } | ||||
|  | ||||
|     openmct.on('start', function () { | ||||
|         return new Main().run(defaultRegistry); | ||||
|     }); | ||||
|  | ||||
|     return openmct; | ||||
| }); | ||||
| module.exports = openmct; | ||||
|   | ||||
							
								
								
									
										75
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								package.json
									
									
									
									
									
								
							| @@ -2,7 +2,15 @@ | ||||
|   "name": "openmct", | ||||
|   "version": "0.14.0-SNAPSHOT", | ||||
|   "description": "The Open MCT core platform", | ||||
|   "dependencies": { | ||||
|   "dependencies": {}, | ||||
|   "devDependencies": { | ||||
|     "angular": "1.4.14", | ||||
|     "angular-route": "1.4.14", | ||||
|     "babel-eslint": "8.2.6", | ||||
|     "comma-separated-values": "^3.6.4", | ||||
|     "concurrently": "^3.6.1", | ||||
|     "copy-webpack-plugin": "^4.5.2", | ||||
|     "css-loader": "^1.0.0", | ||||
|     "d3-array": "1.2.x", | ||||
|     "d3-axis": "1.0.x", | ||||
|     "d3-collection": "1.0.x", | ||||
| @@ -13,59 +21,70 @@ | ||||
|     "d3-selection": "1.3.x", | ||||
|     "d3-time": "1.0.x", | ||||
|     "d3-time-format": "2.1.x", | ||||
|     "eslint": "5.2.0", | ||||
|     "eventemitter3": "^1.2.0", | ||||
|     "exports-loader": "^0.7.0", | ||||
|     "express": "^4.13.1", | ||||
|     "minimist": "^1.1.1", | ||||
|     "painterro": "^0.2.65", | ||||
|     "request": "^2.69.0", | ||||
|     "vue": "^2.5.6" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "bower": "^1.7.7", | ||||
|     "fast-sass-loader": "^1.4.5", | ||||
|     "file-loader": "^1.1.11", | ||||
|     "file-saver": "^1.3.8", | ||||
|     "git-rev-sync": "^1.4.0", | ||||
|     "glob": ">= 3.0.0", | ||||
|     "gulp": "^3.9.1", | ||||
|     "gulp-jscs": "^3.0.2", | ||||
|     "gulp-jshint": "^2.0.0", | ||||
|     "gulp-jshint-html-reporter": "^0.1.3", | ||||
|     "gulp-rename": "^1.2.2", | ||||
|     "gulp-requirejs-optimize": "^0.3.1", | ||||
|     "gulp-sass": "^3.1.0", | ||||
|     "gulp-sourcemaps": "^1.6.0", | ||||
|     "html-loader": "^0.5.5", | ||||
|     "html2canvas": "^1.0.0-alpha.12", | ||||
|     "imports-loader": "^0.8.0", | ||||
|     "istanbul-instrumenter-loader": "^3.0.1", | ||||
|     "jasmine-core": "^3.1.0", | ||||
|     "jscs-html-reporter": "^0.1.0", | ||||
|     "jsdoc": "^3.3.2", | ||||
|     "jshint": "^2.7.0", | ||||
|     "karma": "^2.0.3", | ||||
|     "karma-chrome-launcher": "^2.2.0", | ||||
|     "karma-cli": "^1.0.1", | ||||
|     "karma-coverage": "^1.1.2", | ||||
|     "karma-html-reporter": "^0.2.7", | ||||
|     "karma-jasmine": "^1.1.2", | ||||
|     "karma-requirejs": "^1.1.0", | ||||
|     "karma-webpack": "^3.0.0", | ||||
|     "location-bar": "^3.0.1", | ||||
|     "lodash": "^3.10.1", | ||||
|     "markdown-toc": "^0.11.7", | ||||
|     "marked": "^0.3.5", | ||||
|     "merge-stream": "^1.0.0", | ||||
|     "mkdirp": "^0.5.1", | ||||
|     "mini-css-extract-plugin": "^0.4.1", | ||||
|     "minimist": "^1.1.1", | ||||
|     "moment": "^2.11.1", | ||||
|     "moment-duration-format": "^2.2.2", | ||||
|     "moment-timezone": "^0.5.21", | ||||
|     "node-bourbon": "^4.2.3", | ||||
|     "node-sass": "^4.9.2", | ||||
|     "painterro": "^0.2.65", | ||||
|     "printj": "^1.1.0", | ||||
|     "requirejs": "2.1.x", | ||||
|     "raw-loader": "^0.5.1", | ||||
|     "request": "^2.69.0", | ||||
|     "screenfull": "^3.3.2", | ||||
|     "split": "^1.0.0", | ||||
|     "v8-compile-cache": "^1.1.0" | ||||
|     "style-loader": "^0.21.0", | ||||
|     "v8-compile-cache": "^1.1.0", | ||||
|     "vue": "2.5.6", | ||||
|     "vue-loader": "^15.2.6", | ||||
|     "vue-template-compiler": "2.5.6", | ||||
|     "webpack": "^4.16.2", | ||||
|     "webpack-cli": "^3.1.0", | ||||
|     "webpack-dev-middleware": "^3.1.3", | ||||
|     "webpack-hot-middleware": "^2.22.3", | ||||
|     "zepto": "^1.2.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "start": "node app.js", | ||||
|     "lint": "eslint platform src openmct.js", | ||||
|     "lint:fix": "eslint platform src openmct.js --fix", | ||||
|     "build:prod": "NODE_ENV=production webpack", | ||||
|     "build:dev": "webpack", | ||||
|     "build:watch": "webpack --watch", | ||||
|     "test": "karma start --single-run", | ||||
|     "jshint": "jshint platform example", | ||||
|     "lint": "./node_modules/gulp/bin/gulp.js lint", | ||||
|     "checkstyle": "./node_modules/gulp/bin/gulp.js checkstyle", | ||||
|     "watch": "karma start", | ||||
|     "test:watch": "karma start --no-single-run", | ||||
|     "verify": "concurrently 'npm:test' 'npm:lint'", | ||||
|     "jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api", | ||||
|     "otherdoc": "node docs/gendocs.js --in docs/src --out dist/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'", | ||||
|     "docs": "npm run jsdoc ; npm run otherdoc", | ||||
|     "prepare": "node ./node_modules/bower/bin/bower install && node ./node_modules/gulp/bin/gulp.js install" | ||||
|     "prepare": "npm run build:prod" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|   | ||||
| @@ -21,17 +21,17 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     "text!./res/templates/about-dialog.html", | ||||
|     "./res/templates/about-dialog.html", | ||||
|     "./src/LogoController", | ||||
|     "./src/AboutController", | ||||
|     "./src/LicenseController", | ||||
|     "text!./res/templates/app-logo.html", | ||||
|     "text!./res/templates/about-logo.html", | ||||
|     "text!./res/templates/overlay-about.html", | ||||
|     "text!./res/templates/license-apache.html", | ||||
|     "text!./res/templates/license-mit.html", | ||||
|     "text!./res/templates/licenses.html", | ||||
|     "text!./res/templates/licenses-export-md.html", | ||||
|     "./res/templates/app-logo.html", | ||||
|     "./res/templates/about-logo.html", | ||||
|     "./res/templates/overlay-about.html", | ||||
|     "./res/templates/license-apache.html", | ||||
|     "./res/templates/license-mit.html", | ||||
|     "./res/templates/licenses.html", | ||||
|     "./res/templates/licenses-export-md.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     aboutDialogTemplate, | ||||
|   | ||||
| @@ -33,16 +33,16 @@ define([ | ||||
|     "./src/windowing/NewTabAction", | ||||
|     "./src/windowing/FullscreenAction", | ||||
|     "./src/windowing/WindowTitler", | ||||
|     "text!./res/templates/browse.html", | ||||
|     "text!./res/templates/browse-object.html", | ||||
|     "text!./res/templates/items/grid-item.html", | ||||
|     "text!./res/templates/browse/object-header.html", | ||||
|     "text!./res/templates/browse/object-header-frame.html", | ||||
|     "text!./res/templates/menu-arrow.html", | ||||
|     "text!./res/templates/back-arrow.html", | ||||
|     "text!./res/templates/items/items.html", | ||||
|     "text!./res/templates/browse/object-properties.html", | ||||
|     "text!./res/templates/browse/inspector-region.html", | ||||
|     "./res/templates/browse.html", | ||||
|     "./res/templates/browse-object.html", | ||||
|     "./res/templates/items/grid-item.html", | ||||
|     "./res/templates/browse/object-header.html", | ||||
|     "./res/templates/browse/object-header-frame.html", | ||||
|     "./res/templates/menu-arrow.html", | ||||
|     "./res/templates/back-arrow.html", | ||||
|     "./res/templates/items/items.html", | ||||
|     "./res/templates/browse/object-properties.html", | ||||
|     "./res/templates/browse/inspector-region.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     BrowseController, | ||||
| @@ -73,15 +73,6 @@ define([ | ||||
|     legacyRegistry.register("platform/commonUI/browse", { | ||||
|         "extensions": { | ||||
|             "routes": [ | ||||
|                 { | ||||
|                     "when": "/browse/:ids*?", | ||||
|                     "template": browseTemplate, | ||||
|                     "reloadOnSearch": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "when": "", | ||||
|                     "redirectTo": "/browse/" | ||||
|                 } | ||||
|             ], | ||||
|             "constants": [ | ||||
|                 { | ||||
| @@ -295,6 +286,20 @@ define([ | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "templates": [ | ||||
|                 { | ||||
|                     key: "browseRoot", | ||||
|                     template: browseTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     key: "browseObject", | ||||
|                     template: browseObjectTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     key: "inspectorRegion", | ||||
|                     template: inspectorRegionTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "licenses": [ | ||||
|                 { | ||||
|                     "name": "screenfull.js", | ||||
|   | ||||
| @@ -66,5 +66,4 @@ | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|     </div> | ||||
|     <mct-include key="'conductor'" class="abs holder flex-elem flex-fixed l-flex-row l-time-conductor-holder"></mct-include> | ||||
| </div> | ||||
|   | ||||
| @@ -47,6 +47,7 @@ define( | ||||
|             urlService, | ||||
|             defaultPath | ||||
|         ) { | ||||
|             window.browseScope = $scope; | ||||
|             var initialPath = ($route.current.params.ids || defaultPath).split("/"), | ||||
|                 currentIds; | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,6 @@ define( | ||||
|          * @constructor | ||||
|          */ | ||||
|         function BrowseObjectController($scope, $location, $route) { | ||||
|             var navigatedObject; | ||||
|             function setViewForDomainObject(domainObject) { | ||||
|  | ||||
|                 var locationViewKey = $location.search().view; | ||||
| @@ -47,7 +46,6 @@ define( | ||||
|                     ((domainObject && domainObject.useCapability('view')) || []) | ||||
|                         .forEach(selectViewIfMatching); | ||||
|                 } | ||||
|                 navigatedObject = domainObject; | ||||
|             } | ||||
|  | ||||
|             function updateQueryParam(viewKey) { | ||||
|   | ||||
| @@ -161,7 +161,7 @@ define( | ||||
|                 instantiateController(); | ||||
|                 return waitsForNavigation().then(function () { | ||||
|                     expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockDefaultRootObject); | ||||
|                         .toHaveBeenCalledWith(mockDefaultRootObject); | ||||
|                 }); | ||||
|             }); | ||||
|  | ||||
| @@ -172,7 +172,7 @@ define( | ||||
|  | ||||
|                 return waitsForNavigation().then(function () { | ||||
|                     expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockDefaultRootObject); | ||||
|                         .toHaveBeenCalledWith(mockDefaultRootObject); | ||||
|                 }); | ||||
|             }); | ||||
|  | ||||
|   | ||||
| @@ -27,7 +27,6 @@ define( | ||||
|         describe("The PaneController", function () { | ||||
|             var mockScope, | ||||
|                 mockAgentService, | ||||
|                 mockDomainObjects, | ||||
|                 mockWindow, | ||||
|                 controller, | ||||
|                 mockLocation, | ||||
| @@ -47,17 +46,6 @@ define( | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockScope = jasmine.createSpyObj("$scope", ["$on"]); | ||||
|                 mockDomainObjects = ['a', 'b'].map(function (id) { | ||||
|                     var mockDomainObject = jasmine.createSpyObj( | ||||
|                         'domainObject-' + id, | ||||
|                         ['getId', 'getModel', 'getCapability'] | ||||
|                     ); | ||||
|  | ||||
|                     mockDomainObject.getId.and.returnValue(id); | ||||
|                     mockDomainObject.getModel.and.returnValue({}); | ||||
|  | ||||
|                     return mockDomainObject; | ||||
|                 }); | ||||
|                 mockAgentService = jasmine.createSpyObj( | ||||
|                     "agentService", | ||||
|                     ["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"] | ||||
|   | ||||
| @@ -56,7 +56,7 @@ define([ | ||||
|             return action.perform() | ||||
|                 .then(function () { | ||||
|                     expect(mockNavigationService.setNavigation) | ||||
|                     .toHaveBeenCalledWith(mockDomainObject, true); | ||||
|                         .toHaveBeenCalledWith(mockDomainObject, true); | ||||
|                 }); | ||||
|         }); | ||||
|  | ||||
|   | ||||
| @@ -47,7 +47,7 @@ define( | ||||
|  | ||||
|             it("toggles fullscreen mode when performed", function () { | ||||
|                 action.perform(); | ||||
|                 expect(window.screenfull.toggle).toHaveBeenCalled(); | ||||
|                 expect(screenfull.toggle).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("provides displayable metadata", function () { | ||||
|   | ||||
| @@ -46,7 +46,7 @@ define( | ||||
|                 // tree is opened in a new tab using the | ||||
|                 // context menu | ||||
|                 mockContextSelected = jasmine.createSpyObj("context", ["selectedObject", | ||||
|                                                                "domainObject"]); | ||||
|                     "domainObject"]); | ||||
|  | ||||
|                 // Mocks the urlService used to make the new tab's url from a | ||||
|                 // domainObject and mode | ||||
| @@ -54,11 +54,11 @@ define( | ||||
|  | ||||
|                 // Action done using the current context or mockContextCurrent | ||||
|                 actionCurrent = new NewTabAction(mockUrlService, mockWindow, | ||||
|                                                  mockContextCurrent); | ||||
|                     mockContextCurrent); | ||||
|  | ||||
|                 // Action done using the selected context or mockContextSelected | ||||
|                 actionSelected = new NewTabAction(mockUrlService, mockWindow, | ||||
|                                                   mockContextSelected); | ||||
|                     mockContextSelected); | ||||
|  | ||||
|             }); | ||||
|  | ||||
|   | ||||
| @@ -32,7 +32,7 @@ define( | ||||
|                 mockRootScope, | ||||
|                 mockDocument, | ||||
|                 mockDomainObject, | ||||
|                 titler; | ||||
|                 titler; // eslint-disable-line | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockNavigationService = jasmine.createSpyObj( | ||||
|   | ||||
| @@ -23,13 +23,13 @@ | ||||
| define([ | ||||
|     "./src/DialogService", | ||||
|     "./src/OverlayService", | ||||
|     "text!./res/templates/overlay-dialog.html", | ||||
|     "text!./res/templates/overlay-options.html", | ||||
|     "text!./res/templates/dialog.html", | ||||
|     "text!./res/templates/overlay-blocking-message.html", | ||||
|     "text!./res/templates/message.html", | ||||
|     "text!./res/templates/overlay-message-list.html", | ||||
|     "text!./res/templates/overlay.html", | ||||
|     "./res/templates/overlay-dialog.html", | ||||
|     "./res/templates/overlay-options.html", | ||||
|     "./res/templates/dialog.html", | ||||
|     "./res/templates/overlay-blocking-message.html", | ||||
|     "./res/templates/message.html", | ||||
|     "./res/templates/overlay-message-list.html", | ||||
|     "./res/templates/overlay.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     DialogService, | ||||
|   | ||||
| @@ -59,8 +59,8 @@ define( | ||||
|                     ["resolve", "reject"] | ||||
|                 ); | ||||
|                 mockDocument = jasmine.createSpyObj( | ||||
|                   "$document", | ||||
|                   ["find"] | ||||
|                     "$document", | ||||
|                     ["find"] | ||||
|                 ); | ||||
|                 mockBody = jasmine.createSpyObj('body', ['on', 'off']); | ||||
|                 mockDocument.find.and.returnValue(mockBody); | ||||
|   | ||||
| @@ -49,14 +49,14 @@ define([ | ||||
|     "./src/creation/CreateActionProvider", | ||||
|     "./src/creation/AddActionProvider", | ||||
|     "./src/creation/CreationService", | ||||
|     "text!./res/templates/create/locator.html", | ||||
|     "text!./res/templates/create/create-button.html", | ||||
|     "text!./res/templates/create/create-menu.html", | ||||
|     "text!./res/templates/library.html", | ||||
|     "text!./res/templates/edit-object.html", | ||||
|     "text!./res/templates/edit-action-buttons.html", | ||||
|     "text!./res/templates/elements.html", | ||||
|     "text!./res/templates/topbar-edit.html", | ||||
|     "./res/templates/create/locator.html", | ||||
|     "./res/templates/create/create-button.html", | ||||
|     "./res/templates/create/create-menu.html", | ||||
|     "./res/templates/library.html", | ||||
|     "./res/templates/edit-object.html", | ||||
|     "./res/templates/edit-action-buttons.html", | ||||
|     "./res/templates/elements.html", | ||||
|     "./res/templates/topbar-edit.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     EditActionController, | ||||
| @@ -188,8 +188,8 @@ define([ | ||||
|                     "name": "Remove", | ||||
|                     "description": "Remove this object from its containing object.", | ||||
|                     "depends": [ | ||||
|                         "navigationService", | ||||
|                         "dialogService" | ||||
|                         "dialogService", | ||||
|                         "navigationService" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
| @@ -319,6 +319,12 @@ define([ | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "templates": [ | ||||
|                 { | ||||
|                     key: "elementsPool", | ||||
|                     template: elementsTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "components": [ | ||||
|                 { | ||||
|                     "type": "decorator", | ||||
|   | ||||
| @@ -23,136 +23,119 @@ | ||||
| /** | ||||
|  * Module defining RemoveAction. Created by vwoeltje on 11/17/14. | ||||
|  */ | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
| define([ | ||||
|     './RemoveDialog' | ||||
| ], function ( | ||||
|     RemoveDialog | ||||
| ) { | ||||
|  | ||||
|         /** | ||||
|          * Construct an action which will remove the provided object manifestation. | ||||
|          * The object will be removed from its parent's composition; the parent | ||||
|          * is looked up via the "context" capability (so this will be the | ||||
|          * immediate ancestor by which this specific object was reached.) | ||||
|          * | ||||
|          * @param {DomainObject} object the object to be removed | ||||
|          * @param {ActionContext} context the context in which this action is performed | ||||
|          * @memberof platform/commonUI/edit | ||||
|          * @constructor | ||||
|          * @implements {Action} | ||||
|     /** | ||||
|      * Construct an action which will remove the provided object manifestation. | ||||
|      * The object will be removed from its parent's composition; the parent | ||||
|      * is looked up via the "context" capability (so this will be the | ||||
|      * immediate ancestor by which this specific object was reached.) | ||||
|      * | ||||
|      * @param {DialogService} dialogService a service which will show the dialog | ||||
|      * @param {NavigationService} navigationService a service that maintains the current navigation state | ||||
|      * @param {ActionContext} context the context in which this action is performed | ||||
|      * @memberof platform/commonUI/edit | ||||
|      * @constructor | ||||
|      * @implements {Action} | ||||
|      */ | ||||
|     function RemoveAction(dialogService, navigationService, context) { | ||||
|         this.domainObject = (context || {}).domainObject; | ||||
|         this.dialogService = dialogService; | ||||
|         this.navigationService = navigationService; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Perform this action. | ||||
|      */ | ||||
|     RemoveAction.prototype.perform = function () { | ||||
|         var dialog, | ||||
|             dialogService = this.dialogService, | ||||
|             domainObject = this.domainObject, | ||||
|             navigationService = this.navigationService; | ||||
|         /* | ||||
|          * Check whether an object ID matches the ID of the object being | ||||
|          * removed (used to filter a parent's composition to handle the | ||||
|          * removal.) | ||||
|          */ | ||||
|         function RemoveAction(navigationService, dialogService, context) { | ||||
|             this.domainObject = (context || {}).domainObject; | ||||
|             this.navigationService = navigationService; | ||||
|             this.dialogService = dialogService; | ||||
|  | ||||
|             this.delete = this.delete.bind(this); | ||||
|         function isNotObject(otherObjectId) { | ||||
|             return otherObjectId !== domainObject.getId(); | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Perform this action. | ||||
|          * @return {Promise} a promise which will be | ||||
|          *         fulfilled when the action has completed. | ||||
|         /* | ||||
|          * Mutate a parent object such that it no longer contains the object | ||||
|          * which is being removed. | ||||
|          */ | ||||
|         RemoveAction.prototype.delete = function () { | ||||
|             var navigationService = this.navigationService, | ||||
|                 domainObject = this.domainObject; | ||||
|             /* | ||||
|              * Check whether an object ID matches the ID of the object being | ||||
|              * removed (used to filter a parent's composition to handle the | ||||
|              * removal.) | ||||
|              */ | ||||
|             function isNotObject(otherObjectId) { | ||||
|                 return otherObjectId !== domainObject.getId(); | ||||
|             } | ||||
|         function doMutate(model) { | ||||
|             model.composition = model.composition.filter(isNotObject); | ||||
|         } | ||||
|  | ||||
|             /* | ||||
|              * Mutate a parent object such that it no longer contains the object | ||||
|              * which is being removed. | ||||
|              */ | ||||
|             function doMutate(model) { | ||||
|                 model.composition = model.composition.filter(isNotObject); | ||||
|             } | ||||
|         /* | ||||
|          * Checks current object and ascendants of current | ||||
|          * object with object being removed, if the current | ||||
|          * object or any in the current object's path is being removed, | ||||
|          * navigate back to parent of removed object. | ||||
|          */ | ||||
|         function checkObjectNavigation(object, parentObject) { | ||||
|             // Traverse object starts at current location | ||||
|             var traverseObject = (navigationService).getNavigation(), | ||||
|                 context; | ||||
|  | ||||
|             /* | ||||
|              * Checks current object and ascendants of current | ||||
|              * object with object being removed, if the current | ||||
|              * object or any in the current object's path is being removed, | ||||
|              * navigate back to parent of removed object. | ||||
|              */ | ||||
|             function checkObjectNavigation(object, parentObject) { | ||||
|                 // Traverse object starts at current location | ||||
|                 var traverseObject = (navigationService).getNavigation(), | ||||
|                     context; | ||||
|  | ||||
|                 // Stop when object is not defined (above ROOT) | ||||
|                 while (traverseObject) { | ||||
|                     // If object currently traversed to is object being removed | ||||
|                     // navigate to parent of current object and then exit loop | ||||
|                     if (traverseObject.getId() === object.getId()) { | ||||
|                         navigationService.setNavigation(parentObject); | ||||
|                         return; | ||||
|                     } | ||||
|                     // Traverses to parent of current object, moving | ||||
|                     // up the ascendant path | ||||
|                     context = traverseObject.getCapability('context'); | ||||
|                     traverseObject = context && context.getParent(); | ||||
|             // Stop when object is not defined (above ROOT) | ||||
|             while (traverseObject) { | ||||
|                 // If object currently traversed to is object being removed | ||||
|                 // navigate to parent of current object and then exit loop | ||||
|                 if (traverseObject.getId() === object.getId()) { | ||||
|                     navigationService.setNavigation(parentObject); | ||||
|                     return; | ||||
|                 } | ||||
|                 // Traverses to parent of current object, moving | ||||
|                 // up the ascendant path | ||||
|                 context = traverseObject.getCapability('context'); | ||||
|                 traverseObject = context && context.getParent(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|             /* | ||||
|              * Remove the object from its parent, as identified by its context | ||||
|              * 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'), | ||||
|                     parent = contextCapability.getParent(); | ||||
|         /* | ||||
|          * Remove the object from its parent, as identified by its context | ||||
|          * 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'), | ||||
|                 parent = contextCapability.getParent(); | ||||
|  | ||||
|                 // If currently within path of removed object(s), | ||||
|                 // navigates to existing object up tree | ||||
|                 checkObjectNavigation(object, parent); | ||||
|             // If currently within path of removed object(s), | ||||
|             // navigates to existing object up tree | ||||
|             checkObjectNavigation(object, parent); | ||||
|  | ||||
|                 return parent.useCapability('mutation', doMutate); | ||||
|             } | ||||
|             return parent.useCapability('mutation', doMutate); | ||||
|         } | ||||
|  | ||||
|             return removeFromContext(domainObject); | ||||
|         }; | ||||
|         /* | ||||
|          * 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.show(); | ||||
|     }; | ||||
|  | ||||
|         RemoveAction.prototype.perform = function () { | ||||
|             var self = this; | ||||
|             var confirmationDialog = this.dialogService.showBlockingMessage({ | ||||
|                 severity: "error", | ||||
|                 title: "Warning! This action will permanently remove this object. Are you sure you want to continue?", | ||||
|                 minimized: true, // want the notification to be minimized initially (don't show banner) | ||||
|                 options: [{ | ||||
|                     label: "OK", | ||||
|                     callback: function () { | ||||
|                         self.delete().then(function () { | ||||
|                             confirmationDialog.dismiss(); | ||||
|                         }); | ||||
|                     } | ||||
|                 },{ | ||||
|                     label: "Cancel", | ||||
|                     callback: function () { | ||||
|                         confirmationDialog.dismiss(); | ||||
|                     } | ||||
|                 }] | ||||
|             }); | ||||
|         }; | ||||
|     // Object needs to have a parent for Remove to be applicable | ||||
|     RemoveAction.appliesTo = function (context) { | ||||
|         var object = (context || {}).domainObject, | ||||
|             contextCapability = object && object.getCapability("context"), | ||||
|             parent = contextCapability && contextCapability.getParent(), | ||||
|             parentType = parent && parent.getCapability('type'), | ||||
|             parentCreatable = parentType && parentType.hasFeature('creation'); | ||||
|  | ||||
|         // Object needs to have a parent for Remove to be applicable | ||||
|         RemoveAction.appliesTo = function (context) { | ||||
|             var object = (context || {}).domainObject, | ||||
|                 contextCapability = object && object.getCapability("context"), | ||||
|                 parent = contextCapability && contextCapability.getParent(), | ||||
|                 parentType = parent && parent.getCapability('type'), | ||||
|                 parentCreatable = parentType && parentType.hasFeature('creation'); | ||||
|         // Only creatable types should be modifiable | ||||
|         return parent !== undefined && | ||||
|                 Array.isArray(parent.getModel().composition) && | ||||
|                 parentCreatable; | ||||
|     }; | ||||
|  | ||||
|             // Only creatable types should be modifiable | ||||
|             return parent !== undefined && | ||||
|                     Array.isArray(parent.getModel().composition) && | ||||
|                     parentCreatable; | ||||
|         }; | ||||
|  | ||||
|         return RemoveAction; | ||||
|     } | ||||
| ); | ||||
|     return RemoveAction; | ||||
| }); | ||||
|   | ||||
							
								
								
									
										77
									
								
								platform/commonUI/edit/src/actions/RemoveDialog.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								platform/commonUI/edit/src/actions/RemoveDialog.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([], function () { | ||||
|  | ||||
|     /** | ||||
|      * @callback removeCallback | ||||
|      * @param {DomainObject} domainObject the domain object to be removed | ||||
|      */ | ||||
|  | ||||
|     /** | ||||
|      * Construct a new Remove dialog. | ||||
|      * | ||||
|      * @param {DialogService} dialogService the service that shows the dialog | ||||
|      * @param {DomainObject} domainObject the domain object to be removed | ||||
|      * @param {removeCallback} removeCallback callback that handles removal of the domain object | ||||
|      * @memberof platform/commonUI/edit | ||||
|      * @constructor | ||||
|      */ | ||||
|     function RemoveDialog(dialogService, domainObject, removeCallback) { | ||||
|         this.dialogService = dialogService; | ||||
|         this.domainObject = domainObject; | ||||
|         this.removeCallback = removeCallback; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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: { | ||||
|                     label: 'OK', | ||||
|                     callback: function () { | ||||
|                         removeCallback(domainObject); | ||||
|                         dialog.dismiss(); | ||||
|                     } | ||||
|                 }, | ||||
|                 options: [ | ||||
|                     { | ||||
|                         label: 'Cancel', | ||||
|                         callback: function () { | ||||
|                             dialog.dismiss(); | ||||
|                         } | ||||
|                     } | ||||
|                 ] | ||||
|             }; | ||||
|  | ||||
|         dialog = this.dialogService.showBlockingMessage(model); | ||||
|     }; | ||||
|  | ||||
|     return RemoveDialog; | ||||
| }); | ||||
| @@ -25,12 +25,12 @@ define([ | ||||
|     '../creation/CreateWizard', | ||||
|     './SaveInProgressDialog' | ||||
| ], | ||||
|     function ( | ||||
|         CreateWizard, | ||||
|         SaveInProgressDialog | ||||
|     ) { | ||||
| function ( | ||||
|     CreateWizard, | ||||
|     SaveInProgressDialog | ||||
| ) { | ||||
|  | ||||
|         /** | ||||
|     /** | ||||
|          * The "Save" action; the action triggered by clicking Save from | ||||
|          * Edit Mode. Exits the editing user interface and invokes object | ||||
|          * capabilities to persist the changes that have been made. | ||||
| @@ -38,189 +38,189 @@ define([ | ||||
|          * @implements {Action} | ||||
|          * @memberof platform/commonUI/edit | ||||
|          */ | ||||
|         function SaveAsAction( | ||||
|             $injector, | ||||
|             policyService, | ||||
|             dialogService, | ||||
|             copyService, | ||||
|             notificationService, | ||||
|             context | ||||
|         ) { | ||||
|             this.domainObject = (context || {}).domainObject; | ||||
|             this.injectObjectService = function () { | ||||
|                 this.objectService = $injector.get("objectService"); | ||||
|             }; | ||||
|             this.policyService = policyService; | ||||
|             this.dialogService = dialogService; | ||||
|             this.copyService = copyService; | ||||
|             this.notificationService = notificationService; | ||||
|         } | ||||
|     function SaveAsAction( | ||||
|         $injector, | ||||
|         policyService, | ||||
|         dialogService, | ||||
|         copyService, | ||||
|         notificationService, | ||||
|         context | ||||
|     ) { | ||||
|         this.domainObject = (context || {}).domainObject; | ||||
|         this.injectObjectService = function () { | ||||
|             this.objectService = $injector.get("objectService"); | ||||
|         }; | ||||
|         this.policyService = policyService; | ||||
|         this.dialogService = dialogService; | ||||
|         this.copyService = copyService; | ||||
|         this.notificationService = notificationService; | ||||
|     } | ||||
|  | ||||
|         /** | ||||
|     /** | ||||
|          * @private | ||||
|          */ | ||||
|         SaveAsAction.prototype.createWizard = function (parent) { | ||||
|             return new CreateWizard( | ||||
|                 this.domainObject, | ||||
|                 parent, | ||||
|                 this.policyService | ||||
|             ); | ||||
|         }; | ||||
|     SaveAsAction.prototype.createWizard = function (parent) { | ||||
|         return new CreateWizard( | ||||
|             this.domainObject, | ||||
|             parent, | ||||
|             this.policyService | ||||
|         ); | ||||
|     }; | ||||
|  | ||||
|         /** | ||||
|     /** | ||||
|          * @private | ||||
|          */ | ||||
|         SaveAsAction.prototype.getObjectService = function () { | ||||
|             // Lazily acquire object service (avoids cyclical dependency) | ||||
|             if (!this.objectService) { | ||||
|                 this.injectObjectService(); | ||||
|             } | ||||
|             return this.objectService; | ||||
|         }; | ||||
|  | ||||
|         function resolveWith(object) { | ||||
|             return function () { | ||||
|                 return object; | ||||
|             }; | ||||
|     SaveAsAction.prototype.getObjectService = function () { | ||||
|         // Lazily acquire object service (avoids cyclical dependency) | ||||
|         if (!this.objectService) { | ||||
|             this.injectObjectService(); | ||||
|         } | ||||
|         return this.objectService; | ||||
|     }; | ||||
|  | ||||
|         /** | ||||
|     function resolveWith(object) { | ||||
|         return function () { | ||||
|             return object; | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|          * Save changes and conclude editing. | ||||
|          * | ||||
|          * @returns {Promise} a promise that will be fulfilled when | ||||
|          *          cancellation has completed | ||||
|          * @memberof platform/commonUI/edit.SaveAction# | ||||
|          */ | ||||
|         SaveAsAction.prototype.perform = function () { | ||||
|             // Discard the current root view (which will be the editing | ||||
|             // UI, which will have been pushed atop the Browse UI.) | ||||
|             function returnToBrowse(object) { | ||||
|                 if (object) { | ||||
|                     object.getCapability("action").perform("navigate"); | ||||
|                 } | ||||
|                 return object; | ||||
|     SaveAsAction.prototype.perform = function () { | ||||
|         // Discard the current root view (which will be the editing | ||||
|         // UI, which will have been pushed atop the Browse UI.) | ||||
|         function returnToBrowse(object) { | ||||
|             if (object) { | ||||
|                 object.getCapability("action").perform("navigate"); | ||||
|             } | ||||
|             return object; | ||||
|         } | ||||
|  | ||||
|             return this.save().then(returnToBrowse); | ||||
|         }; | ||||
|         return this.save().then(returnToBrowse); | ||||
|     }; | ||||
|  | ||||
|         /** | ||||
|     /** | ||||
|          * @private | ||||
|          */ | ||||
|         SaveAsAction.prototype.save = function () { | ||||
|             var self = this, | ||||
|                 domainObject = this.domainObject, | ||||
|                 copyService = this.copyService, | ||||
|                 dialog = new SaveInProgressDialog(this.dialogService), | ||||
|                 toUndirty = []; | ||||
|     SaveAsAction.prototype.save = function () { | ||||
|         var self = this, | ||||
|             domainObject = this.domainObject, | ||||
|             copyService = this.copyService, | ||||
|             dialog = new SaveInProgressDialog(this.dialogService), | ||||
|             toUndirty = []; | ||||
|  | ||||
|             function doWizardSave(parent) { | ||||
|                 var wizard = self.createWizard(parent); | ||||
|         function doWizardSave(parent) { | ||||
|             var wizard = self.createWizard(parent); | ||||
|  | ||||
|                 return self.dialogService | ||||
|                     .getUserInput(wizard.getFormStructure(true), | ||||
|                         wizard.getInitialFormValue()) | ||||
|                     .then(wizard.populateObjectFromInput.bind(wizard), function (failureReason) { | ||||
|                         return Promise.reject("user canceled"); | ||||
|                     }); | ||||
|             } | ||||
|  | ||||
|             function showBlockingDialog(object) { | ||||
|                 dialog.show(); | ||||
|                 return object; | ||||
|             } | ||||
|  | ||||
|             function hideBlockingDialog(object) { | ||||
|                 dialog.hide(); | ||||
|                 return object; | ||||
|             } | ||||
|  | ||||
|             function fetchObject(objectId) { | ||||
|                 return self.getObjectService().getObjects([objectId]).then(function (objects) { | ||||
|                     return objects[objectId]; | ||||
|             return self.dialogService | ||||
|                 .getUserInput(wizard.getFormStructure(true), | ||||
|                     wizard.getInitialFormValue()) | ||||
|                 .then(wizard.populateObjectFromInput.bind(wizard), function (failureReason) { | ||||
|                     return Promise.reject("user canceled"); | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|             function getParent(object) { | ||||
|                 return fetchObject(object.getModel().location); | ||||
|             } | ||||
|         function showBlockingDialog(object) { | ||||
|             dialog.show(); | ||||
|             return object; | ||||
|         } | ||||
|  | ||||
|             function allowClone(objectToClone) { | ||||
|                 var allowed = | ||||
|         function hideBlockingDialog(object) { | ||||
|             dialog.hide(); | ||||
|             return object; | ||||
|         } | ||||
|  | ||||
|         function fetchObject(objectId) { | ||||
|             return self.getObjectService().getObjects([objectId]).then(function (objects) { | ||||
|                 return objects[objectId]; | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         function getParent(object) { | ||||
|             return fetchObject(object.getModel().location); | ||||
|         } | ||||
|  | ||||
|         function allowClone(objectToClone) { | ||||
|             var allowed = | ||||
|                     (objectToClone.getId() === domainObject.getId()) || | ||||
|                         objectToClone.getCapability('location').isOriginal(); | ||||
|                 if (allowed) { | ||||
|                     toUndirty.push(objectToClone); | ||||
|                 } | ||||
|                 return allowed; | ||||
|             if (allowed) { | ||||
|                 toUndirty.push(objectToClone); | ||||
|             } | ||||
|             return allowed; | ||||
|         } | ||||
|  | ||||
|             function cloneIntoParent(parent) { | ||||
|                 return copyService.perform(domainObject, parent, allowClone); | ||||
|         function cloneIntoParent(parent) { | ||||
|             return copyService.perform(domainObject, parent, allowClone); | ||||
|         } | ||||
|  | ||||
|         function undirty(object) { | ||||
|             return object.getCapability('persistence').refresh(); | ||||
|         } | ||||
|  | ||||
|         function undirtyOriginals(object) { | ||||
|             return Promise.all(toUndirty.map(undirty)) | ||||
|                 .then(resolveWith(object)); | ||||
|         } | ||||
|  | ||||
|         function saveAfterClone(clonedObject) { | ||||
|             return domainObject.getCapability("editor").save() | ||||
|                 .then(resolveWith(clonedObject)); | ||||
|         } | ||||
|  | ||||
|         function finishEditing(clonedObject) { | ||||
|             return domainObject.getCapability("editor").finish() | ||||
|                 .then(function () { | ||||
|                     return fetchObject(clonedObject.getId()); | ||||
|                 }); | ||||
|         } | ||||
|  | ||||
|         function onSuccess(object) { | ||||
|             self.notificationService.info("Save Succeeded"); | ||||
|             return object; | ||||
|         } | ||||
|  | ||||
|         function onFailure(reason) { | ||||
|             hideBlockingDialog(); | ||||
|             if (reason !== "user canceled") { | ||||
|                 self.notificationService.error("Save Failed"); | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|             function undirty(object) { | ||||
|                 return object.getCapability('persistence').refresh(); | ||||
|             } | ||||
|  | ||||
|             function undirtyOriginals(object) { | ||||
|                 return Promise.all(toUndirty.map(undirty)) | ||||
|                     .then(resolveWith(object)); | ||||
|             } | ||||
|  | ||||
|             function saveAfterClone(clonedObject) { | ||||
|                 return domainObject.getCapability("editor").save() | ||||
|                     .then(resolveWith(clonedObject)); | ||||
|             } | ||||
|  | ||||
|             function finishEditing(clonedObject) { | ||||
|                 return domainObject.getCapability("editor").finish() | ||||
|                     .then(function () { | ||||
|                         return fetchObject(clonedObject.getId()); | ||||
|                     }); | ||||
|             } | ||||
|  | ||||
|             function onSuccess(object) { | ||||
|                 self.notificationService.info("Save Succeeded"); | ||||
|                 return object; | ||||
|             } | ||||
|  | ||||
|             function onFailure(reason) { | ||||
|                 hideBlockingDialog(); | ||||
|                 if (reason !== "user canceled") { | ||||
|                     self.notificationService.error("Save Failed"); | ||||
|                 } | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             return getParent(domainObject) | ||||
|                 .then(doWizardSave) | ||||
|                 .then(showBlockingDialog) | ||||
|                 .then(getParent) | ||||
|                 .then(cloneIntoParent) | ||||
|                 .then(undirtyOriginals) | ||||
|                 .then(saveAfterClone) | ||||
|                 .then(finishEditing) | ||||
|                 .then(hideBlockingDialog) | ||||
|                 .then(onSuccess) | ||||
|                 .catch(onFailure); | ||||
|         }; | ||||
|         return getParent(domainObject) | ||||
|             .then(doWizardSave) | ||||
|             .then(showBlockingDialog) | ||||
|             .then(getParent) | ||||
|             .then(cloneIntoParent) | ||||
|             .then(undirtyOriginals) | ||||
|             .then(saveAfterClone) | ||||
|             .then(finishEditing) | ||||
|             .then(hideBlockingDialog) | ||||
|             .then(onSuccess) | ||||
|             .catch(onFailure); | ||||
|     }; | ||||
|  | ||||
|  | ||||
|         /** | ||||
|     /** | ||||
|          * 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 | ||||
|          */ | ||||
|         SaveAsAction.appliesTo = function (context) { | ||||
|             var domainObject = (context || {}).domainObject; | ||||
|             return domainObject !== undefined && | ||||
|     SaveAsAction.appliesTo = function (context) { | ||||
|         var domainObject = (context || {}).domainObject; | ||||
|         return domainObject !== undefined && | ||||
|                 domainObject.hasCapability('editor') && | ||||
|                 domainObject.getCapability('editor').isEditContextRoot() && | ||||
|                 domainObject.getModel().persisted === undefined; | ||||
|         }; | ||||
|     }; | ||||
|  | ||||
|         return SaveAsAction; | ||||
|     } | ||||
|     return SaveAsAction; | ||||
| } | ||||
| ); | ||||
|   | ||||
| @@ -49,8 +49,8 @@ define( | ||||
|             // present context. | ||||
|             function updateActions() { | ||||
|                 $scope.saveActions = $scope.action ? | ||||
|                         $scope.action.getActions(SAVE_ACTION_CONTEXT) : | ||||
|                         []; | ||||
|                     $scope.action.getActions(SAVE_ACTION_CONTEXT) : | ||||
|                     []; | ||||
|  | ||||
|                 $scope.saveActionsAsMenuOptions = $scope.saveActions.map(actionToMenuOption); | ||||
|  | ||||
| @@ -59,8 +59,8 @@ define( | ||||
|                 }; | ||||
|  | ||||
|                 $scope.otherEditActions = $scope.action ? | ||||
|                         $scope.action.getActions(OTHERS_ACTION_CONTEXT) : | ||||
|                         []; | ||||
|                     $scope.action.getActions(OTHERS_ACTION_CONTEXT) : | ||||
|                     []; | ||||
|  | ||||
|                 // Required because Angular does not allow 'bind' | ||||
|                 // in expressions. | ||||
|   | ||||
| @@ -49,7 +49,7 @@ define( | ||||
|             function searchElements(value) { | ||||
|                 if ($scope.searchText) { | ||||
|                     return value.getModel().name.toLowerCase().search( | ||||
|                             $scope.searchText.toLowerCase()) !== -1; | ||||
|                         $scope.searchText.toLowerCase()) !== -1; | ||||
|                 } else { | ||||
|                     return true; | ||||
|                 } | ||||
|   | ||||
| @@ -39,8 +39,8 @@ define( | ||||
|             // Update the set of Create actions | ||||
|             function refreshActions() { | ||||
|                 $scope.createActions = $scope.action ? | ||||
|                         $scope.action.getActions('create') : | ||||
|                         []; | ||||
|                     $scope.action.getActions('create') : | ||||
|                     []; | ||||
|             } | ||||
|  | ||||
|             // Listen for new instances of the represented object's | ||||
|   | ||||
| @@ -59,7 +59,7 @@ define( | ||||
|                     (view.key === 'plot' && type.getKey() === 'telemetry.panel') || | ||||
|                     (view.key === 'table' && type.getKey() === 'table') || | ||||
|                     (view.key === 'rt-table' && type.getKey() === 'rttable') | ||||
|                     ) { | ||||
|                 ) { | ||||
|                     count++; | ||||
|                 } | ||||
|             }); | ||||
|   | ||||
| @@ -55,16 +55,16 @@ define( | ||||
|                 navigatedObject = this.navigationService.getNavigation(), | ||||
|                 actionMetadata = action.getMetadata ? action.getMetadata() : {}; | ||||
|  | ||||
|             if (navigatedObject.hasCapability("editor") && navigatedObject.getCapability("editor").isEditContextRoot()) { | ||||
|             // 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; | ||||
|             } | ||||
|             // } else { | ||||
|             //     return true; | ||||
|             // } | ||||
|         }; | ||||
|  | ||||
|         return EditContextualActionPolicy; | ||||
|   | ||||
| @@ -25,8 +25,7 @@ define( | ||||
|     function (EditAndComposeAction) { | ||||
|  | ||||
|         describe("The Link action", function () { | ||||
|             var mockQ, | ||||
|                 mockDomainObject, | ||||
|             var mockDomainObject, | ||||
|                 mockParent, | ||||
|                 mockContext, | ||||
|                 mockComposition, | ||||
| @@ -47,13 +46,10 @@ define( | ||||
|             } | ||||
|  | ||||
|             beforeEach(function () { | ||||
|  | ||||
|  | ||||
|                 mockDomainObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     ["getId", "getCapability"] | ||||
|                 ); | ||||
|                 mockQ = { when: mockPromise }; | ||||
|                 mockParent = { | ||||
|                     getModel: function () { | ||||
|                         return model; | ||||
|   | ||||
| @@ -25,50 +25,37 @@ define( | ||||
|     function (RemoveAction) { | ||||
|  | ||||
|         describe("The Remove action", function () { | ||||
|             var mockQ, | ||||
|                 mockNavigationService, | ||||
|                 mockDomainObject, | ||||
|                 mockParent, | ||||
|                 mockChildObject, | ||||
|                 mockGrandchildObject, | ||||
|                 mockRootObject, | ||||
|                 mockContext, | ||||
|                 mockChildContext, | ||||
|                 mockGrandchildContext, | ||||
|                 mockRootContext, | ||||
|                 mockMutation, | ||||
|                 mockType, | ||||
|             var action, | ||||
|                 actionContext, | ||||
|                 model, | ||||
|                 capabilities, | ||||
|                 action; | ||||
|  | ||||
|             function mockPromise(value) { | ||||
|                 return { | ||||
|                     then: function (callback) { | ||||
|                         return mockPromise(callback(value)); | ||||
|                     } | ||||
|                 }; | ||||
|             } | ||||
|                 mockContext, | ||||
|                 mockDialogService, | ||||
|                 mockDomainObject, | ||||
|                 mockMutation, | ||||
|                 mockNavigationService, | ||||
|                 mockParent, | ||||
|                 mockType, | ||||
|                 model; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockDomainObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     ["getId", "getCapability"] | ||||
|                     ["getId", "getCapability", "getModel"] | ||||
|                 ); | ||||
|                 mockChildObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     ["getId", "getCapability"] | ||||
|                 ); | ||||
|                 mockGrandchildObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     ["getId", "getCapability"] | ||||
|                 ); | ||||
|                 mockRootObject = jasmine.createSpyObj( | ||||
|                     "domainObject", | ||||
|                     ["getId", "getCapability"] | ||||
|                 ); | ||||
|                 mockQ = { when: mockPromise }; | ||||
|  | ||||
|                 mockMutation = jasmine.createSpyObj("mutation", ["invoke"]); | ||||
|                 mockType = jasmine.createSpyObj("type", ["hasFeature"]); | ||||
|                 mockType.hasFeature.and.returnValue(true); | ||||
|  | ||||
|                 capabilities = { | ||||
|                     mutation: mockMutation, | ||||
|                     type: mockType | ||||
|                 }; | ||||
|  | ||||
|                 model = { | ||||
|                     composition: ["a", "test", "b"] | ||||
|                 }; | ||||
|  | ||||
|                 mockParent = { | ||||
|                     getModel: function () { | ||||
|                         return model; | ||||
| @@ -80,12 +67,12 @@ define( | ||||
|                         return capabilities[k].invoke(v); | ||||
|                     } | ||||
|                 }; | ||||
|                 mockContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                 mockChildContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                 mockGrandchildContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                 mockRootContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                 mockMutation = jasmine.createSpyObj("mutation", ["invoke"]); | ||||
|                 mockType = jasmine.createSpyObj("type", ["hasFeature"]); | ||||
|  | ||||
|                 mockDialogService = jasmine.createSpyObj( | ||||
|                     "dialogService", | ||||
|                     ["showBlockingMessage"] | ||||
|                 ); | ||||
|  | ||||
|                 mockNavigationService = jasmine.createSpyObj( | ||||
|                     "navigationService", | ||||
|                     [ | ||||
| @@ -97,23 +84,19 @@ define( | ||||
|                 ); | ||||
|                 mockNavigationService.getNavigation.and.returnValue(mockDomainObject); | ||||
|  | ||||
|                 mockContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                 mockContext.getParent.and.returnValue(mockParent); | ||||
|  | ||||
|                 mockDomainObject.getId.and.returnValue("test"); | ||||
|                 mockDomainObject.getCapability.and.returnValue(mockContext); | ||||
|                 mockDomainObject.getModel.and.returnValue({name: 'test object'}); | ||||
|  | ||||
|                 mockContext.getParent.and.returnValue(mockParent); | ||||
|                 mockType.hasFeature.and.returnValue(true); | ||||
|  | ||||
|                 capabilities = { | ||||
|                     mutation: mockMutation, | ||||
|                     type: mockType | ||||
|                 }; | ||||
|                 model = { | ||||
|                     composition: ["a", "test", "b"] | ||||
|                 }; | ||||
|  | ||||
|                 actionContext = { domainObject: mockDomainObject }; | ||||
|  | ||||
|                 action = new RemoveAction(mockNavigationService, actionContext); | ||||
|                 action = new RemoveAction(mockDialogService, mockNavigationService, actionContext); | ||||
|             }); | ||||
|  | ||||
|             it("only applies to objects with parents", function () { | ||||
| @@ -127,83 +110,146 @@ define( | ||||
|                 expect(mockType.hasFeature).toHaveBeenCalledWith('creation'); | ||||
|             }); | ||||
|  | ||||
|             it("mutates the parent when performed", function () { | ||||
|                 action.delete(); | ||||
|                 expect(mockMutation.invoke) | ||||
|                     .toHaveBeenCalledWith(jasmine.any(Function)); | ||||
|             it("shows a blocking message dialog", function () { | ||||
|                 mockParent = jasmine.createSpyObj( | ||||
|                     "parent", | ||||
|                     ["getModel", "getCapability", "useCapability"] | ||||
|                 ); | ||||
|  | ||||
|                 action.perform(); | ||||
|  | ||||
|                 expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); | ||||
|  | ||||
|                 // Also check that no mutation happens at this point | ||||
|                 expect(mockParent.useCapability).not.toHaveBeenCalledWith("mutation", jasmine.any(Function)); | ||||
|             }); | ||||
|  | ||||
|             it("changes composition from its mutation function", function () { | ||||
|                 var mutator, result; | ||||
|                 action.delete(); | ||||
|                 mutator = mockMutation.invoke.calls.mostRecent().args[0]; | ||||
|                 result = mutator(model); | ||||
|             describe("after the remove callback is triggered", function () { | ||||
|                 var mockChildContext, | ||||
|                     mockChildObject, | ||||
|                     mockDialogHandle, | ||||
|                     mockGrandchildContext, | ||||
|                     mockGrandchildObject, | ||||
|                     mockRootContext, | ||||
|                     mockRootObject; | ||||
|  | ||||
|                 // Should not have cancelled the mutation | ||||
|                 expect(result).not.toBe(false); | ||||
|                 beforeEach(function () { | ||||
|                     mockChildObject = jasmine.createSpyObj( | ||||
|                         "domainObject", | ||||
|                         ["getId", "getCapability"] | ||||
|                     ); | ||||
|  | ||||
|                 // Simulate mutate's behavior (remove can either return a | ||||
|                 // new model or modify this one in-place) | ||||
|                 result = result || model; | ||||
|                     mockDialogHandle = jasmine.createSpyObj( | ||||
|                         "dialogHandle", | ||||
|                         ["dismiss"] | ||||
|                     ); | ||||
|  | ||||
|                     mockGrandchildObject = jasmine.createSpyObj( | ||||
|                         "domainObject", | ||||
|                         ["getId", "getCapability"] | ||||
|                     ); | ||||
|  | ||||
|                     mockRootObject = jasmine.createSpyObj( | ||||
|                         "domainObject", | ||||
|                         ["getId", "getCapability"] | ||||
|                     ); | ||||
|  | ||||
|                     mockChildContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                     mockGrandchildContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|                     mockRootContext = jasmine.createSpyObj("context", ["getParent"]); | ||||
|  | ||||
|                     mockDialogService.showBlockingMessage.and.returnValue(mockDialogHandle); | ||||
|                 }); | ||||
|  | ||||
|                 it("mutates the parent when performed", function () { | ||||
|                     action.perform(); | ||||
|                     mockDialogService.showBlockingMessage.calls.mostRecent().args[0] | ||||
|                         .primaryOption.callback(); | ||||
|  | ||||
|                     expect(mockMutation.invoke) | ||||
|                         .toHaveBeenCalledWith(jasmine.any(Function)); | ||||
|                 }); | ||||
|  | ||||
|                 it("changes composition from its mutation function", function () { | ||||
|                     var mutator, result; | ||||
|  | ||||
|                     action.perform(); | ||||
|                     mockDialogService.showBlockingMessage.calls.mostRecent().args[0] | ||||
|                         .primaryOption.callback(); | ||||
|  | ||||
|                     mutator = mockMutation.invoke.calls.mostRecent().args[0]; | ||||
|                     result = mutator(model); | ||||
|  | ||||
|                     // Should not have cancelled the mutation | ||||
|                     expect(result).not.toBe(false); | ||||
|  | ||||
|                     // Simulate mutate's behavior (remove can either return a | ||||
|                     // new model or modify this one in-place) | ||||
|                     result = result || model; | ||||
|  | ||||
|                     // Should have removed "test" - that was our | ||||
|                     // mock domain object's id. | ||||
|                     expect(result.composition).toEqual(["a", "b"]); | ||||
|                 }); | ||||
|  | ||||
|                 it("removes parent of object currently navigated to", function () { | ||||
|                     // Navigates to child object | ||||
|                     mockNavigationService.getNavigation.and.returnValue(mockChildObject); | ||||
|  | ||||
|                     // Test is id of object being removed | ||||
|                     // Child object has different id | ||||
|                     mockDomainObject.getId.and.returnValue("test"); | ||||
|                     mockChildObject.getId.and.returnValue("not test"); | ||||
|  | ||||
|                     // Sets context for the child and domainObject | ||||
|                     mockDomainObject.getCapability.and.returnValue(mockContext); | ||||
|                     mockChildObject.getCapability.and.returnValue(mockChildContext); | ||||
|  | ||||
|                     // Parents of child and domainObject are set | ||||
|                     mockContext.getParent.and.returnValue(mockParent); | ||||
|                     mockChildContext.getParent.and.returnValue(mockDomainObject); | ||||
|  | ||||
|                     mockType.hasFeature.and.returnValue(true); | ||||
|  | ||||
|                     action.perform(); | ||||
|                     mockDialogService.showBlockingMessage.calls.mostRecent().args[0] | ||||
|                         .primaryOption.callback(); | ||||
|  | ||||
|                     // Expects navigation to parent of domainObject (removed object) | ||||
|                     expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(mockParent); | ||||
|                 }); | ||||
|  | ||||
|                 it("checks if removing object not in ascendent path (reaches ROOT)", function () { | ||||
|                     // Navigates to grandchild of ROOT | ||||
|                     mockNavigationService.getNavigation.and.returnValue(mockGrandchildObject); | ||||
|  | ||||
|                     // domainObject (grandparent) is set as ROOT, child and grandchild | ||||
|                     // are set objects not being removed | ||||
|                     mockDomainObject.getId.and.returnValue("test 1"); | ||||
|                     mockRootObject.getId.and.returnValue("ROOT"); | ||||
|                     mockChildObject.getId.and.returnValue("not test 2"); | ||||
|                     mockGrandchildObject.getId.and.returnValue("not test 3"); | ||||
|  | ||||
|                     // Sets context for the grandchild, child, and domainObject | ||||
|                     mockRootObject.getCapability.and.returnValue(mockRootContext); | ||||
|                     mockChildObject.getCapability.and.returnValue(mockChildContext); | ||||
|                     mockGrandchildObject.getCapability.and.returnValue(mockGrandchildContext); | ||||
|  | ||||
|                     // Parents of grandchild and child are set | ||||
|                     mockChildContext.getParent.and.returnValue(mockRootObject); | ||||
|                     mockGrandchildContext.getParent.and.returnValue(mockChildObject); | ||||
|  | ||||
|                     mockType.hasFeature.and.returnValue(true); | ||||
|  | ||||
|                     action.perform(); | ||||
|                     mockDialogService.showBlockingMessage.calls.mostRecent().args[0] | ||||
|                         .primaryOption.callback(); | ||||
|  | ||||
|                     // Expects no navigation to occur | ||||
|                     expect(mockNavigationService.setNavigation).not.toHaveBeenCalled(); | ||||
|                 }); | ||||
|  | ||||
|                 // Should have removed "test" - that was our | ||||
|                 // mock domain object's id. | ||||
|                 expect(result.composition).toEqual(["a", "b"]); | ||||
|             }); | ||||
|  | ||||
|             it("removes parent of object currently navigated to", function () { | ||||
|                 // Navigates to child object | ||||
|                 mockNavigationService.getNavigation.and.returnValue(mockChildObject); | ||||
|  | ||||
|                 // Test is id of object being removed | ||||
|                 // Child object has different id | ||||
|                 mockDomainObject.getId.and.returnValue("test"); | ||||
|                 mockChildObject.getId.and.returnValue("not test"); | ||||
|  | ||||
|                 // Sets context for the child and domainObject | ||||
|                 mockDomainObject.getCapability.and.returnValue(mockContext); | ||||
|                 mockChildObject.getCapability.and.returnValue(mockChildContext); | ||||
|  | ||||
|                 // Parents of child and domainObject are set | ||||
|                 mockContext.getParent.and.returnValue(mockParent); | ||||
|                 mockChildContext.getParent.and.returnValue(mockDomainObject); | ||||
|  | ||||
|                 mockType.hasFeature.and.returnValue(true); | ||||
|  | ||||
|                 action.delete(); | ||||
|  | ||||
|                 // Expects navigation to parent of domainObject (removed object) | ||||
|                 expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(mockParent); | ||||
|             }); | ||||
|  | ||||
|             it("checks if removing object not in ascendent path (reaches ROOT)", function () { | ||||
|                 // Navigates to grandchild of ROOT | ||||
|                 mockNavigationService.getNavigation.and.returnValue(mockGrandchildObject); | ||||
|  | ||||
|                 // domainObject (grandparent) is set as ROOT, child and grandchild | ||||
|                 // are set objects not being removed | ||||
|                 mockDomainObject.getId.and.returnValue("test 1"); | ||||
|                 mockRootObject.getId.and.returnValue("ROOT"); | ||||
|                 mockChildObject.getId.and.returnValue("not test 2"); | ||||
|                 mockGrandchildObject.getId.and.returnValue("not test 3"); | ||||
|  | ||||
|                 // Sets context for the grandchild, child, and domainObject | ||||
|                 mockRootObject.getCapability.and.returnValue(mockRootContext); | ||||
|                 mockChildObject.getCapability.and.returnValue(mockChildContext); | ||||
|                 mockGrandchildObject.getCapability.and.returnValue(mockGrandchildContext); | ||||
|  | ||||
|                 // Parents of grandchild and child are set | ||||
|                 mockChildContext.getParent.and.returnValue(mockRootObject); | ||||
|                 mockGrandchildContext.getParent.and.returnValue(mockChildObject); | ||||
|  | ||||
|                 mockType.hasFeature.and.returnValue(true); | ||||
|  | ||||
|                 action.delete(); | ||||
|  | ||||
|                 // Expects no navigation to occur | ||||
|                 expect(mockNavigationService.setNavigation).not.toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
|   | ||||
| @@ -34,7 +34,6 @@ define( | ||||
|                 mockDomainObject, | ||||
|                 capabilities = {}, | ||||
|                 mockEditAction, | ||||
|                 mockSaveAction, | ||||
|                 action; | ||||
|  | ||||
|             function mockPromise(value) { | ||||
| @@ -83,12 +82,6 @@ define( | ||||
|                 mockDomainObject.getCapability.and.callFake(function (name) { | ||||
|                     return capabilities[name]; | ||||
|                 }); | ||||
|                 mockSaveAction = jasmine.createSpyObj( | ||||
|                     "saveAction", | ||||
|                     [ | ||||
|                         "perform" | ||||
|                     ] | ||||
|                 ); | ||||
|  | ||||
|                 capabilities.action = jasmine.createSpyObj( | ||||
|                     "actionCapability", | ||||
|   | ||||
| @@ -142,11 +142,11 @@ define( | ||||
|  | ||||
|             it("populates the model on the associated object", function () { | ||||
|                 var formValue = { | ||||
|                     "A": "ValueA", | ||||
|                     "B": "ValueB", | ||||
|                     "C": "ValueC" | ||||
|                 }, | ||||
|                 compareModel = wizard.createModel(formValue); | ||||
|                         "A": "ValueA", | ||||
|                         "B": "ValueB", | ||||
|                         "C": "ValueC" | ||||
|                     }, | ||||
|                     compareModel = wizard.createModel(formValue); | ||||
|                 //populateObjectFromInput adds a .location attribute that is not added by createModel. | ||||
|                 compareModel.location = undefined; | ||||
|                 wizard.populateObjectFromInput(formValue); | ||||
|   | ||||
| @@ -114,7 +114,7 @@ define( | ||||
|                 mockNewObject.getId.and.returnValue('newId'); | ||||
|                 mockNewObject.getCapability.and.callFake(function (c) { | ||||
|                     return c === 'persistence' ? | ||||
|                             mockNewPersistenceCapability : undefined; | ||||
|                         mockNewPersistenceCapability : undefined; | ||||
|                 }); | ||||
|  | ||||
|                 mockPersistenceCapability.persist | ||||
|   | ||||
| @@ -76,66 +76,66 @@ define( | ||||
|             describe("when context is available", function () { | ||||
|  | ||||
|                 beforeEach(function () { | ||||
|                         mockContext.getRoot.and.returnValue(mockRootObject); | ||||
|                         controller = new LocatorController(mockScope, mockTimeout, mockObjectService); | ||||
|                     }); | ||||
|                     mockContext.getRoot.and.returnValue(mockRootObject); | ||||
|                     controller = new LocatorController(mockScope, mockTimeout, mockObjectService); | ||||
|                 }); | ||||
|  | ||||
|                 it("adds a treeModel to scope", function () { | ||||
|                         expect(mockScope.treeModel).toBeDefined(); | ||||
|                     }); | ||||
|                     expect(mockScope.treeModel).toBeDefined(); | ||||
|                 }); | ||||
|  | ||||
|                 it("watches for changes to treeModel", function () { | ||||
|                         // This is what the embedded tree representation | ||||
|                         // will be modifying. | ||||
|                         expect(mockScope.$watch).toHaveBeenCalledWith( | ||||
|                             "treeModel.selectedObject", | ||||
|                             jasmine.any(Function) | ||||
|                         ); | ||||
|                     }); | ||||
|                     // This is what the embedded tree representation | ||||
|                     // will be modifying. | ||||
|                     expect(mockScope.$watch).toHaveBeenCalledWith( | ||||
|                         "treeModel.selectedObject", | ||||
|                         jasmine.any(Function) | ||||
|                     ); | ||||
|                 }); | ||||
|  | ||||
|                 it("changes its own model on embedded model updates", function () { | ||||
|                         // Need to pass on selection changes as updates to | ||||
|                         // the control's value | ||||
|                         mockScope.$watch.calls.mostRecent().args[1](mockDomainObject); | ||||
|                         mockTimeout.calls.mostRecent().args[0](); | ||||
|                         expect(mockScope.ngModel.someField).toEqual(mockDomainObject); | ||||
|                         expect(mockScope.rootObject).toEqual(mockRootObject); | ||||
|                     // Need to pass on selection changes as updates to | ||||
|                     // the control's value | ||||
|                     mockScope.$watch.calls.mostRecent().args[1](mockDomainObject); | ||||
|                     mockTimeout.calls.mostRecent().args[0](); | ||||
|                     expect(mockScope.ngModel.someField).toEqual(mockDomainObject); | ||||
|                     expect(mockScope.rootObject).toEqual(mockRootObject); | ||||
|  | ||||
|                         // Verify that the capability we expect to have been used | ||||
|                         // was used. | ||||
|                         expect(mockDomainObject.getCapability) | ||||
|                             .toHaveBeenCalledWith("context"); | ||||
|                     }); | ||||
|                     // Verify that the capability we expect to have been used | ||||
|                     // was used. | ||||
|                     expect(mockDomainObject.getCapability) | ||||
|                         .toHaveBeenCalledWith("context"); | ||||
|                 }); | ||||
|  | ||||
|                 it("rejects changes which fail validation", function () { | ||||
|                         mockScope.structure = { validate: jasmine.createSpy('validate') }; | ||||
|                         mockScope.structure.validate.and.returnValue(false); | ||||
|                     mockScope.structure = { validate: jasmine.createSpy('validate') }; | ||||
|                     mockScope.structure.validate.and.returnValue(false); | ||||
|  | ||||
|                         // Pass selection change | ||||
|                         mockScope.$watch.calls.mostRecent().args[1](mockDomainObject); | ||||
|                         mockTimeout.calls.mostRecent().args[0](); | ||||
|                     // Pass selection change | ||||
|                     mockScope.$watch.calls.mostRecent().args[1](mockDomainObject); | ||||
|                     mockTimeout.calls.mostRecent().args[0](); | ||||
|  | ||||
|                         expect(mockScope.structure.validate).toHaveBeenCalled(); | ||||
|                         // Change should have been rejected | ||||
|                         expect(mockScope.ngModel.someField).not.toEqual(mockDomainObject); | ||||
|                     }); | ||||
|                     expect(mockScope.structure.validate).toHaveBeenCalled(); | ||||
|                     // Change should have been rejected | ||||
|                     expect(mockScope.ngModel.someField).not.toEqual(mockDomainObject); | ||||
|                 }); | ||||
|  | ||||
|                 it("treats a lack of a selection as invalid", function () { | ||||
|                         mockScope.ngModelController = jasmine.createSpyObj( | ||||
|                             'ngModelController', | ||||
|                             ['$setValidity'] | ||||
|                         ); | ||||
|                     mockScope.ngModelController = jasmine.createSpyObj( | ||||
|                         'ngModelController', | ||||
|                         ['$setValidity'] | ||||
|                     ); | ||||
|  | ||||
|                         mockScope.$watch.calls.mostRecent().args[1](mockDomainObject); | ||||
|                         mockTimeout.calls.mostRecent().args[0](); | ||||
|                         expect(mockScope.ngModelController.$setValidity) | ||||
|                             .toHaveBeenCalledWith(jasmine.any(String), true); | ||||
|                     mockScope.$watch.calls.mostRecent().args[1](mockDomainObject); | ||||
|                     mockTimeout.calls.mostRecent().args[0](); | ||||
|                     expect(mockScope.ngModelController.$setValidity) | ||||
|                         .toHaveBeenCalledWith(jasmine.any(String), true); | ||||
|  | ||||
|                         mockScope.$watch.calls.mostRecent().args[1](undefined); | ||||
|                         mockTimeout.calls.mostRecent().args[0](); | ||||
|                         expect(mockScope.ngModelController.$setValidity) | ||||
|                             .toHaveBeenCalledWith(jasmine.any(String), false); | ||||
|                     }); | ||||
|                     mockScope.$watch.calls.mostRecent().args[1](undefined); | ||||
|                     mockTimeout.calls.mostRecent().args[0](); | ||||
|                     expect(mockScope.ngModelController.$setValidity) | ||||
|                         .toHaveBeenCalledWith(jasmine.any(String), false); | ||||
|                 }); | ||||
|             }); | ||||
|             describe("when no context is available", function () { | ||||
|                 var defaultRoot = "DEFAULT_ROOT"; | ||||
|   | ||||
| @@ -27,7 +27,6 @@ define( | ||||
|         describe("The Edit action policy", function () { | ||||
|             var editableView, | ||||
|                 nonEditableView, | ||||
|                 undefinedView, | ||||
|                 testViews, | ||||
|                 testContext, | ||||
|                 mockDomainObject, | ||||
| @@ -67,7 +66,6 @@ define( | ||||
|  | ||||
|                 editableView = { editable: true }; | ||||
|                 nonEditableView = { editable: false }; | ||||
|                 undefinedView = { someKey: "some value" }; | ||||
|                 plotView = { key: "plot", editable: false }; | ||||
|                 testViews = []; | ||||
|  | ||||
|   | ||||
| @@ -75,25 +75,25 @@ define( | ||||
|  | ||||
|             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"]); | ||||
|             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); | ||||
|                 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); | ||||
|                 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 () { | ||||
|   | ||||
| @@ -37,8 +37,8 @@ define( | ||||
|                 ); | ||||
|                 mockDomainObject.getCapability.and.returnValue({ | ||||
|                     inEditContext: function () { | ||||
|                        return true; | ||||
|                    } | ||||
|                         return true; | ||||
|                     } | ||||
|                 }); | ||||
|                 mockDomainObject.hasCapability.and.callFake(function (c) { | ||||
|                     return (c === 'editor') && testMode; | ||||
|   | ||||
| @@ -30,12 +30,6 @@ define( | ||||
|                 mockObjects, | ||||
|                 mockDomainObject, | ||||
|                 testStructure, | ||||
|                 testAB, | ||||
|                 testABC, | ||||
|                 testABC2, | ||||
|                 testABCXYZ, | ||||
|                 testABCYZ, | ||||
|                 testM, | ||||
|                 toolbar; | ||||
|  | ||||
|             beforeEach(function () { | ||||
| @@ -53,22 +47,15 @@ define( | ||||
|                 ]); | ||||
|  | ||||
|                 testStructure = [ | ||||
|                         { name: "A", property: "a", domainObject: mockDomainObject }, | ||||
|                         { name: "B", property: "b", domainObject: mockDomainObject }, | ||||
|                         { name: "C", property: "c", domainObject: mockDomainObject }, | ||||
|                         { name: "X", property: "x", domainObject: mockDomainObject }, | ||||
|                         { name: "Y", property: "y", domainObject: mockDomainObject }, | ||||
|                         { name: "Z", property: "z", domainObject: mockDomainObject }, | ||||
|                         { name: "M", method: "m", domainObject: mockDomainObject } | ||||
|                     { name: "A", property: "a", domainObject: mockDomainObject }, | ||||
|                     { name: "B", property: "b", domainObject: mockDomainObject }, | ||||
|                     { name: "C", property: "c", domainObject: mockDomainObject }, | ||||
|                     { name: "X", property: "x", domainObject: mockDomainObject }, | ||||
|                     { name: "Y", property: "y", domainObject: mockDomainObject }, | ||||
|                     { name: "Z", property: "z", domainObject: mockDomainObject }, | ||||
|                     { name: "M", method: "m", domainObject: mockDomainObject } | ||||
|                 ]; | ||||
|  | ||||
|                 testAB = { a: 0, b: 1 }; | ||||
|                 testABC = { a: 0, b: 1, c: 2 }; | ||||
|                 testABC2 = { a: 4, b: 1, c: 2 }; // For inconsistent-state checking | ||||
|                 testABCXYZ = { a: 0, b: 1, c: 2, x: 'X!', y: 'Y!', z: 'Z!' }; | ||||
|                 testABCYZ = { a: 0, b: 1, c: 2, y: 'Y!', z: 'Z!' }; | ||||
|                 testM = { m: jasmine.createSpy("method") }; | ||||
|  | ||||
|                 toolbar = new EditToolbar(mockScope, mockOpenMCT, testStructure); | ||||
|             }); | ||||
|  | ||||
|   | ||||
| @@ -43,13 +43,12 @@ define(["../../src/services/NestedTransaction"], function (NestedTransaction) { | ||||
|  | ||||
|         describe("when callbacks are added", function () { | ||||
|             var mockCommit, | ||||
|                 mockCancel, | ||||
|                 remove; | ||||
|                 mockCancel; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockCommit = jasmine.createSpy('commit'); | ||||
|                 mockCancel = jasmine.createSpy('cancel'); | ||||
|                 remove = nestedTransaction.add(mockCommit, mockCancel); | ||||
|                 nestedTransaction.add(mockCommit, mockCancel); | ||||
|             }); | ||||
|  | ||||
|             it("does not interact with its parent transaction", function () { | ||||
|   | ||||
| @@ -76,8 +76,8 @@ define( | ||||
|  | ||||
|                 beforeEach(function () { | ||||
|                     onCommits = [0, 1, 2].map(function (val) { | ||||
|                             return jasmine.createSpy("onCommit" + val); | ||||
|                         }); | ||||
|                         return jasmine.createSpy("onCommit" + val); | ||||
|                     }); | ||||
|  | ||||
|                     transactionService.startTransaction(); | ||||
|                     onCommits.forEach(transactionService.addToTransaction.bind(transactionService)); | ||||
|   | ||||
| @@ -92,8 +92,8 @@ define([ | ||||
|                 return true; | ||||
|             }] | ||||
|         ].filter(function (row) { | ||||
|                 return row[1](momentified); | ||||
|             })[0][0]; | ||||
|             return row[1](momentified); | ||||
|         })[0][0]; | ||||
|  | ||||
|         if (format !== undefined) { | ||||
|             return moment.utc(d).format(format); | ||||
|   | ||||
| @@ -52,26 +52,26 @@ define([ | ||||
|     "./src/directives/MCTPreview", | ||||
|     "./src/actions/MCTPreviewAction", | ||||
|     "./src/filters/ReverseFilter", | ||||
|     "text!./res/templates/bottombar.html", | ||||
|     "text!./res/templates/controls/action-button.html", | ||||
|     "text!./res/templates/controls/input-filter.html", | ||||
|     "text!./res/templates/angular-indicator.html", | ||||
|     "text!./res/templates/message-banner.html", | ||||
|     "text!./res/templates/progress-bar.html", | ||||
|     "text!./res/templates/controls/time-controller.html", | ||||
|     "text!./res/templates/containers/accordion.html", | ||||
|     "text!./res/templates/subtree.html", | ||||
|     "text!./res/templates/tree.html", | ||||
|     "text!./res/templates/tree-node.html", | ||||
|     "text!./res/templates/label.html", | ||||
|     "text!./res/templates/controls/action-group.html", | ||||
|     "text!./res/templates/menu/context-menu.html", | ||||
|     "text!./res/templates/controls/switcher.html", | ||||
|     "text!./res/templates/object-inspector.html", | ||||
|     "text!./res/templates/controls/selector.html", | ||||
|     "text!./res/templates/controls/datetime-picker.html", | ||||
|     "text!./res/templates/controls/datetime-field.html", | ||||
|     "text!./res/templates/preview.html", | ||||
|     "./res/templates/bottombar.html", | ||||
|     "./res/templates/controls/action-button.html", | ||||
|     "./res/templates/controls/input-filter.html", | ||||
|     "./res/templates/angular-indicator.html", | ||||
|     "./res/templates/message-banner.html", | ||||
|     "./res/templates/progress-bar.html", | ||||
|     "./res/templates/controls/time-controller.html", | ||||
|     "./res/templates/containers/accordion.html", | ||||
|     "./res/templates/subtree.html", | ||||
|     "./res/templates/tree.html", | ||||
|     "./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", | ||||
|     "./res/templates/controls/datetime-picker.html", | ||||
|     "./res/templates/controls/datetime-field.html", | ||||
|     "./res/templates/preview.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     UrlService, | ||||
| @@ -173,12 +173,6 @@ define([ | ||||
|                     "key": "reverse" | ||||
|                 } | ||||
|             ], | ||||
|             "stylesheets": [ | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/normalize.min.css", | ||||
|                     "priority": "mandatory" | ||||
|                 } | ||||
|             ], | ||||
|             "templates": [ | ||||
|                 { | ||||
|                     "key": "bottombar", | ||||
| @@ -418,11 +412,11 @@ define([ | ||||
|                     "description": "Preview in large dialog", | ||||
|                     "category": [ | ||||
|                         "contextual", | ||||
|                          "view-control" | ||||
|                         "view-control" | ||||
|                     ], | ||||
|                     "depends": [ | ||||
|                       "$compile", | ||||
|                       "$rootScope" | ||||
|                         "$compile", | ||||
|                         "$rootScope" | ||||
|                     ], | ||||
|                     "priority": "preferred" | ||||
|                 } | ||||
|   | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* http://meyerweb.com/eric/tools/css/reset/ | ||||
|    v2.0 | 20110126 | ||||
|    License: none (public domain) | ||||
| */ | ||||
|  | ||||
| html, body, div, span, applet, object, iframe, | ||||
| h1, h2, h3, h4, h5, h6, p, blockquote, pre, | ||||
| a, abbr, acronym, address, big, cite, code, | ||||
| del, dfn, em, img, ins, kbd, q, s, samp, | ||||
| small, strike, strong, sub, sup, tt, var, | ||||
| b, u, i, center, | ||||
| dl, dt, dd, ol, ul, li, | ||||
| fieldset, form, label, legend, | ||||
| table, caption, tbody, tfoot, thead, tr, th, td, | ||||
| article, aside, canvas, details, embed, | ||||
| figure, figcaption, footer, header, hgroup, | ||||
| menu, nav, output, ruby, section, summary, | ||||
| time, mark, audio, video { | ||||
| 	margin: 0; | ||||
| 	padding: 0; | ||||
| 	border: 0; | ||||
| 	font-size: 100%; | ||||
| 	font: inherit; | ||||
| 	vertical-align: baseline; | ||||
| } | ||||
| /* HTML5 display-role reset for older browsers */ | ||||
| article, aside, details, figcaption, figure, | ||||
| footer, header, hgroup, menu, nav, section { | ||||
| 	display: block; | ||||
| } | ||||
| body { | ||||
| 	line-height: 1; | ||||
| } | ||||
| ol, ul { | ||||
| 	list-style: none; | ||||
| } | ||||
| blockquote, q { | ||||
| 	quotes: none; | ||||
| } | ||||
| blockquote:before, blockquote:after, | ||||
| q:before, q:after { | ||||
| 	content: ''; | ||||
| 	content: none; | ||||
| } | ||||
| table { | ||||
| 	border-collapse: collapse; | ||||
| 	border-spacing: 0; | ||||
| } | ||||
| @@ -38,8 +38,8 @@ define( | ||||
|             // Refresh variable "menuActions" in the scope | ||||
|             function updateActions() { | ||||
|                 $scope.menuActions = $scope.action ? | ||||
|                         $scope.action.getActions({ category: 'contextual' }) : | ||||
|                         []; | ||||
|                     $scope.action.getActions({ category: 'contextual' }) : | ||||
|                     []; | ||||
|             } | ||||
|  | ||||
|             // Update using the action capability | ||||
|   | ||||
| @@ -188,7 +188,7 @@ define( | ||||
|             // Ensure some useful default | ||||
|             $scope.ngModel[$scope.field] = | ||||
|                 $scope.ngModel[$scope.field] === undefined ? | ||||
|                         now() : $scope.ngModel[$scope.field]; | ||||
|                     now() : $scope.ngModel[$scope.field]; | ||||
|  | ||||
|             $scope.$watch('ngModel[field]', updateFromModel); | ||||
|             $scope.$watchCollection('date', updateFromView); | ||||
|   | ||||
| @@ -28,16 +28,16 @@ define(['zepto', '../services/Overlay'], function ($, Overlay) { | ||||
|                 notebookAction = actions.getActions({key: 'notebook-new-entry'})[0]; | ||||
|  | ||||
|             var notebookButton = notebookAction ? | ||||
|             [ | ||||
|                 { | ||||
|                     class: 'icon-notebook new-notebook-entry', | ||||
|                     title: 'New Notebook Entry', | ||||
|                     clickHandler: function (event) { | ||||
|                         event.stopPropagation(); | ||||
|                         notebookAction.perform(); | ||||
|                 [ | ||||
|                     { | ||||
|                         class: 'icon-notebook new-notebook-entry', | ||||
|                         title: 'New Notebook Entry', | ||||
|                         clickHandler: function (event) { | ||||
|                             event.stopPropagation(); | ||||
|                             notebookAction.perform(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             ] : []; | ||||
|                 ] : []; | ||||
|  | ||||
|             var overlayService = new Overlay({ | ||||
|                 $document: $document, | ||||
|   | ||||
| @@ -62,8 +62,8 @@ define( | ||||
|                 // Determine how long to wait before the next update | ||||
|                 function currentInterval() { | ||||
|                     return attrs.mctResizeInterval ? | ||||
|                             scope.$eval(attrs.mctResizeInterval) : | ||||
|                             DEFAULT_INTERVAL; | ||||
|                         scope.$eval(attrs.mctResizeInterval) : | ||||
|                         DEFAULT_INTERVAL; | ||||
|                 } | ||||
|  | ||||
|                 // Evaluate mct-resize with the current bounds | ||||
|   | ||||
| @@ -45,15 +45,27 @@ define( | ||||
|  | ||||
|             // Link; install event handlers. | ||||
|             function link(scope, element, attrs) { | ||||
|                 var removeSelectable = openmct.selection.selectable( | ||||
|                     element[0], | ||||
|                     scope.$eval(attrs.mctSelectable), | ||||
|                     attrs.hasOwnProperty('mctInitSelect') && scope.$eval(attrs.mctInitSelect) !== false | ||||
|                 ); | ||||
|  | ||||
|                 var isDestroyed = false; | ||||
|                 scope.$on("$destroy", function () { | ||||
|                     removeSelectable(); | ||||
|                     isDestroyed = true; | ||||
|                 }); | ||||
|  | ||||
|                 openmct.$injector.get('$timeout')(function () { | ||||
|                     if (isDestroyed) { | ||||
|                         return; | ||||
|                     } | ||||
|                     var removeSelectable = openmct.selection.selectable( | ||||
|                         element[0], | ||||
|                         scope.$eval(attrs.mctSelectable), | ||||
|                         attrs.hasOwnProperty('mctInitSelect') && scope.$eval(attrs.mctInitSelect) !== false | ||||
|                     ); | ||||
|  | ||||
|                     scope.$on("$destroy", function () { | ||||
|                         removeSelectable(); | ||||
|                     }); | ||||
|                 }); | ||||
|  | ||||
|  | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|   | ||||
| @@ -103,16 +103,16 @@ define( | ||||
|                     splitterSize, | ||||
|  | ||||
|                     alias = $attrs.alias !== undefined ? | ||||
|                       "mctSplitPane-" + $attrs.alias : undefined, | ||||
|                         "mctSplitPane-" + $attrs.alias : undefined, | ||||
|  | ||||
|                     //convert string to number from localStorage | ||||
|                     userWidthPreference = $window.localStorage.getItem(alias) === null ? | ||||
|                       undefined : Number($window.localStorage.getItem(alias)); | ||||
|                         undefined : Number($window.localStorage.getItem(alias)); | ||||
|  | ||||
|                 // Get relevant size (height or width) of DOM element | ||||
|                 function getSize(domElement) { | ||||
|                     return (anchor.orientation === 'vertical' ? | ||||
|                             domElement.offsetWidth : domElement.offsetHeight); | ||||
|                         domElement.offsetWidth : domElement.offsetHeight); | ||||
|                 } | ||||
|  | ||||
|                 // Apply styles to child elements | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
|  /** | ||||
| /** | ||||
|  * Module defining OverlayService. Created by deeptailor on 03/29/2018 | ||||
|  */ | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     'zepto', | ||||
|     'text!../../res/templates/tree/toggle.html' | ||||
|     '../../res/templates/tree/toggle.html' | ||||
| ], function ($, toggleTemplate) { | ||||
|     function ToggleView(state) { | ||||
|         this.expanded = !!state; | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     'zepto', | ||||
|     'text!../../res/templates/tree/tree-label.html' | ||||
|     '../../res/templates/tree/tree-label.html' | ||||
| ], function ($, labelTemplate) { | ||||
|  | ||||
|     function TreeLabelView(gestureService) { | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     'zepto', | ||||
|     'text!../../res/templates/tree/node.html', | ||||
|     '../../res/templates/tree/node.html', | ||||
|     './ToggleView', | ||||
|     './TreeLabelView' | ||||
| ], function ($, nodeTemplate, ToggleView, TreeLabelView) { | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| define([ | ||||
|     'zepto', | ||||
|     './TreeNodeView', | ||||
|     'text!../../res/templates/tree/wait-node.html' | ||||
|     '../../res/templates/tree/wait-node.html' | ||||
| ], function ($, TreeNodeView, spinnerTemplate) { | ||||
|  | ||||
|     function TreeView(gestureService, openmct, selectFn) { | ||||
|   | ||||
| @@ -31,7 +31,7 @@ define( | ||||
|                 mockHead, | ||||
|                 mockElement, | ||||
|                 testBundle, | ||||
|                 loader; | ||||
|                 loader; // eslint-disable-line | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 testBundle = { | ||||
|   | ||||
| @@ -41,7 +41,6 @@ define( | ||||
|                 mockScope, | ||||
|                 mockElement, | ||||
|                 testAttrs, | ||||
|                 mockBody, | ||||
|                 mockTransclude, | ||||
|                 mockParentEl, | ||||
|                 mockNewElement, | ||||
| @@ -59,8 +58,6 @@ define( | ||||
|                     jasmine.createSpyObj("$scope", ["$eval", "$apply", "$on"]); | ||||
|                 mockElement = | ||||
|                     jasmine.createSpyObj("element", JQLITE_METHODS); | ||||
|                 mockBody = | ||||
|                     jasmine.createSpyObj("body", JQLITE_METHODS); | ||||
|                 mockTransclude = | ||||
|                     jasmine.createSpy("transclude"); | ||||
|                 mockParentEl = | ||||
|   | ||||
| @@ -25,13 +25,13 @@ define( | ||||
|     function (MCTSplitPane) { | ||||
|  | ||||
|         var JQLITE_METHODS = [ | ||||
|                 'on', | ||||
|                 'addClass', | ||||
|                 'children', | ||||
|                 'eq', | ||||
|                 'toggleClass', | ||||
|                 'css' | ||||
|             ]; | ||||
|             'on', | ||||
|             'addClass', | ||||
|             'children', | ||||
|             'eq', | ||||
|             'toggleClass', | ||||
|             'css' | ||||
|         ]; | ||||
|  | ||||
|         describe("The mct-split-pane directive", function () { | ||||
|             var mockParse, | ||||
|   | ||||
| @@ -24,10 +24,10 @@ define([ | ||||
|     "./src/gestures/InfoGesture", | ||||
|     "./src/gestures/InfoButtonGesture", | ||||
|     "./src/services/InfoService", | ||||
|     "text!./res/info-table.html", | ||||
|     "text!./res/info-bubble.html", | ||||
|     "text!./res/bubble.html", | ||||
|     "text!./res/templates/info-button.html", | ||||
|     "./res/info-table.html", | ||||
|     "./res/info-bubble.html", | ||||
|     "./res/bubble.html", | ||||
|     "./res/templates/info-button.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     InfoGesture, | ||||
|   | ||||
| @@ -25,8 +25,7 @@ define( | ||||
|     function (InfoButtonGesture) { | ||||
|  | ||||
|         describe("The info button gesture", function () { | ||||
|             var mockTimeout, | ||||
|                 mockDocument, | ||||
|             var mockDocument, | ||||
|                 mockBody, | ||||
|                 mockAgentService, | ||||
|                 mockInfoService, | ||||
| @@ -42,7 +41,6 @@ define( | ||||
|                 fireDismissGesture; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockTimeout = jasmine.createSpy('$timeout'); | ||||
|                 mockDocument = jasmine.createSpyObj('$document', ['find']); | ||||
|                 mockBody = jasmine.createSpyObj('body', ['on', 'off', 'scope', 'css', 'unbind']); | ||||
|                 mockDocument.find.and.returnValue(mockBody); | ||||
|   | ||||
| @@ -114,9 +114,9 @@ define( | ||||
|                         location = [vertical, horizontal].join('-'); | ||||
|                     describe("when bubble goes " + location, function () { | ||||
|                         var expectedLocation = [ | ||||
|                                 goesUp ? "bottom" : "top", | ||||
|                                 goesLeft ? "right" : "left" | ||||
|                             ].join('-'); | ||||
|                             goesUp ? "bottom" : "top", | ||||
|                             goesLeft ? "right" : "left" | ||||
|                         ].join('-'); | ||||
|  | ||||
|                         beforeEach(function () { | ||||
|                             mockPopup.goesUp.and.returnValue(goesUp); | ||||
|   | ||||
| @@ -70,11 +70,11 @@ define( | ||||
|  | ||||
|             TEST_PERMUTATIONS.forEach(function (trueMethods) { | ||||
|                 var summary = trueMethods.length === 0 ? | ||||
|                         "device has no detected characteristics" : | ||||
|                         "device " + (trueMethods.join(", ")); | ||||
|                     "device has no detected characteristics" : | ||||
|                     "device " + (trueMethods.join(", ")); | ||||
|  | ||||
|                 describe("when " + summary, function () { | ||||
|                     var classifier; | ||||
|                     var classifier; // eslint-disable-line | ||||
|  | ||||
|                     beforeEach(function () { | ||||
|                         trueMethods.forEach(function (m) { | ||||
|   | ||||
| @@ -24,7 +24,7 @@ define([ | ||||
|     "./src/NotificationIndicatorController", | ||||
|     "./src/NotificationIndicator", | ||||
|     "./src/NotificationService", | ||||
|     "text!./res/notification-indicator.html", | ||||
|     "./res/notification-indicator.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     NotificationIndicatorController, | ||||
|   | ||||
| @@ -283,10 +283,10 @@ define( | ||||
|          */ | ||||
|         NotificationService.prototype.setHighestSeverity = function () { | ||||
|             var severity = { | ||||
|                     "info": 1, | ||||
|                     "alert": 2, | ||||
|                     "error": 3 | ||||
|                 }; | ||||
|                 "info": 1, | ||||
|                 "alert": 2, | ||||
|                 "error": 3 | ||||
|             }; | ||||
|             this.highest.severity = this.notifications.reduce(function (previous, notification) { | ||||
|                 if (severity[notification.model.severity] > severity[previous]) { | ||||
|                     return notification.model.severity; | ||||
|   | ||||
| @@ -76,7 +76,7 @@ define( | ||||
|          * @returns a domain object | ||||
|          */ | ||||
|         InspectorController.prototype.selectedItem = function () { | ||||
|             return this.$scope.selection[0].context.oldItem; | ||||
|             return this.$scope.selection[0] && this.$scope.selection[0].context.oldItem; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -41,7 +41,7 @@ define( | ||||
|                 editableRegionPolicy = new EditableRegionPolicy(); | ||||
|  | ||||
|                 mockEditorCapability = jasmine.createSpyObj("editorCapability", [ | ||||
|                    "inEditContext" | ||||
|                     "inEditContext" | ||||
|                 ]); | ||||
|                 mockDomainObject = jasmine.createSpyObj("domainObject", [ | ||||
|                     "hasCapability", "getCapability" | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user