Compare commits
	
		
			11 Commits
		
	
	
		
			tree-refac
			...
			V4.4.1-RC1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 480e327c63 | ||
|   | e8b10f0193 | ||
|   | 1d64dc4653 | ||
|   | 08c1053a66 | ||
|   | 7508062aac | ||
|   | 2f58dfbfe7 | ||
|   | 166cb55945 | ||
|   | 83116257fc | ||
|   | 775f1048bc | ||
|   | 71a8b377bb | ||
|   | c43d3fcfc9 | 
| @@ -20,8 +20,8 @@ jobs: | ||||
|             paths: | ||||
|               - node_modules | ||||
|         - run: | ||||
|             name: npm run test:coverage | ||||
|             command: npm run test:coverage | ||||
|             name: npm run test | ||||
|             command: npm run test | ||||
|         - run: | ||||
|             name: npm run lint | ||||
|             command: npm run lint | ||||
|   | ||||
| @@ -10,8 +10,7 @@ module.exports = { | ||||
|     }, | ||||
|     "extends": [ | ||||
|         "eslint:recommended", | ||||
|         "plugin:vue/recommended", | ||||
|         "plugin:you-dont-need-lodash-underscore/compatible" | ||||
|         "plugin:vue/recommended" | ||||
|     ], | ||||
|     "parser": "vue-eslint-parser", | ||||
|     "parserOptions": { | ||||
| @@ -23,9 +22,6 @@ module.exports = { | ||||
|         } | ||||
|     }, | ||||
|     "rules": { | ||||
|         "you-dont-need-lodash-underscore/omit": "off", | ||||
|         "you-dont-need-lodash-underscore/throttle": "off", | ||||
|         "you-dont-need-lodash-underscore/flatten": "off", | ||||
|         "no-bitwise": "error", | ||||
|         "curly": "error", | ||||
|         "eqeqeq": "error", | ||||
|   | ||||
							
								
								
									
										4
									
								
								API.md
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								API.md
									
									
									
									
									
								
							| @@ -427,8 +427,8 @@ Each telemetry value description has an object defining hints.  Keys in this thi | ||||
|  | ||||
| Known hints: | ||||
|  | ||||
| * `domain`: Values with a `domain` hint will be used for the x-axis of a plot, and tables will render columns for these values first. | ||||
| * `range`: Values with a `range` hint will be used as the y-axis on a plot, and tables will render columns for these values after the `domain` values. | ||||
| * `domain`: Indicates that the value represents the "input" of a datum. Values with a `domain` hint will be used for the x-axis of a plot, and tables will render columns for these values first. | ||||
| * `range`: Indicates that the value is the "output" of a datum.  Values with a `range` hint will be used as the y-axis on a plot, and tables will render columns for these values after the `domain` values. | ||||
| * `image`: Indicates that the value may be interpreted as the URL to an image file, in which case appropriate views will be made available. | ||||
|  | ||||
| ##### The Time Conductor and Telemetry  | ||||
|   | ||||
| @@ -103,7 +103,7 @@ the name chosen could not be mistaken for a topic or master branch. | ||||
| ### Merging | ||||
|  | ||||
| When development is complete on an issue, the first step toward merging it | ||||
| back into the master branch is to file a Pull Request (PR). The contributions | ||||
| back into the master branch is to file a Pull Request. The contributions | ||||
| should meet code, test, and commit message standards as described below, | ||||
| and the pull request should include a completed author checklist, also | ||||
| as described below. Pull requests may be assigned to specific team | ||||
| @@ -114,15 +114,6 @@ request. When the reviewer is satisfied, they should add a comment to | ||||
| the pull request containing the reviewer checklist (from below) and complete | ||||
| the merge back to the master branch. | ||||
|  | ||||
| Additionally: | ||||
| * Every pull request must link to the issue that it addresses. Eg. “Addresses #1234” or “Closes #1234”. This is the responsibility of the pull request’s __author__. If no issue exists, create one. | ||||
| * Every __author__ must include testing instructions. These instructions should identify the areas of code affected, and some minimal test steps. If addressing a bug, reproduction steps should be included, if they were not included in the original issue. If reproduction steps were included on the original issue, and are sufficient, refer to them. | ||||
| * A pull request that closes an issue should say so in the description. Including the text “Closes #1234” will cause the linked issue to be automatically closed when the pull request is merged. This is the responsibility of the pull request’s __author__. | ||||
| * When a pull request is merged, and the corresponding issue closed, the __reviewer__ must add the tag “unverified” to the original issue. This will indicate that although the issue is closed, it has not been tested yet. | ||||
| * Every PR must have two reviewers assigned, though only one approval is necessary for merge. | ||||
| * Changes to API require approval by a senior developer. | ||||
| * When creating a PR, it is the author's responsibility to apply any priority label from the issue to the PR as well. This helps with prioritization. | ||||
|  | ||||
| ## Standards | ||||
|  | ||||
| Contributions to Open MCT are expected to meet the following standards. | ||||
| @@ -301,7 +292,6 @@ checklist). | ||||
| 2. Unit tests included and/or updated with changes? | ||||
| 3. Command line build passes? | ||||
| 4. Changes have been smoke-tested? | ||||
| 5. Testing instructions included? | ||||
|  | ||||
| ### Reviewer Checklist | ||||
|  | ||||
| @@ -309,4 +299,3 @@ checklist). | ||||
| 2. Appropriate unit tests included? | ||||
| 3. Code style and in-line documentation are appropriate? | ||||
| 4. Commit messages meet standards? | ||||
| 5. Has associated issue been labelled `unverified`? (only applicable if this PR closes the issue) | ||||
|   | ||||
| @@ -50,8 +50,7 @@ define([ | ||||
|             values: [ | ||||
|                 { | ||||
|                     key: "name", | ||||
|                     name: "Name", | ||||
|                     format: "string" | ||||
|                     name: "Name" | ||||
|                 }, | ||||
|                 { | ||||
|                     key: "utc", | ||||
| @@ -100,7 +99,7 @@ define([ | ||||
|     }; | ||||
|  | ||||
|     GeneratorMetadataProvider.prototype.getMetadata = function (domainObject) { | ||||
|         return Object.assign( | ||||
|         return _.extend( | ||||
|             {}, | ||||
|             domainObject.telemetry, | ||||
|             METADATA_BY_TYPE[domainObject.type] | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
| <template> | ||||
| <div class="example">{{ msg }}</div> | ||||
|   <div class="example">{{ msg }}</div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|     data() { | ||||
|         return { | ||||
|             msg: 'Hello world!' | ||||
|         } | ||||
|   data () { | ||||
|     return { | ||||
|       msg: 'Hello world!' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
|   | ||||
							
								
								
									
										44
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								index.html
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| <!-- | ||||
|  Open MCT, Copyright (c) 2014-2020, United States Government | ||||
|  Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  as represented by the Administrator of the National Aeronautics and Space | ||||
|  Administration. All rights reserved. | ||||
|  | ||||
| @@ -34,8 +34,8 @@ | ||||
|     <body> | ||||
|     </body> | ||||
|     <script> | ||||
|         const FIVE_MINUTES = 5 * 60 * 1000; | ||||
|         const THIRTY_MINUTES = 30 * 60 * 1000; | ||||
|         const THIRTY_SECONDS = 30 * 1000; | ||||
|         const THIRTY_MINUTES = THIRTY_SECONDS * 60; | ||||
|  | ||||
|         [ | ||||
|             'example/eventGenerator' | ||||
| @@ -43,9 +43,9 @@ | ||||
|             openmct.legacyRegistry.enable.bind(openmct.legacyRegistry) | ||||
|         ); | ||||
|  | ||||
|         openmct.install(openmct.plugins.LocalStorage()); | ||||
|         openmct.install(openmct.plugins.Espresso()); | ||||
|         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()); | ||||
| @@ -63,7 +63,39 @@ | ||||
|                     bounds: { | ||||
|                         start: Date.now() - THIRTY_MINUTES, | ||||
|                         end: Date.now() | ||||
|                     } | ||||
|                     }, | ||||
|                     // commonly used bounds can be stored in history | ||||
|                     // bounds (start and end) can accept either a milliseconds number | ||||
|                     // or a callback function returning a milliseconds number | ||||
|                     // a function is useful for invoking Date.now() at exact moment of preset selection | ||||
|                     presets: [ | ||||
|                         { | ||||
|                             label: 'Last Day', | ||||
|                             bounds: { | ||||
|                                 start: () => Date.now() - 1000 * 60 * 60 * 24, | ||||
|                                 end: () => Date.now() | ||||
|                             } | ||||
|                         }, | ||||
|                         { | ||||
|                             label: 'Last 2 hours', | ||||
|                             bounds: { | ||||
|                                 start: () => Date.now() - 1000 * 60 * 60 * 2, | ||||
|                                 end: () => Date.now() | ||||
|                             } | ||||
|                         }, | ||||
|                         { | ||||
|                             label: 'Last hour', | ||||
|                             bounds: { | ||||
|                                 start: () => Date.now() - 1000 * 60 * 60, | ||||
|                                 end: () => Date.now() | ||||
|                             } | ||||
|                         } | ||||
|                     ], | ||||
|                     // maximum recent bounds to retain in conductor history | ||||
|                     records: 10, | ||||
|                     // maximum duration between start and end bounds | ||||
|                     // for utc-based time systems this is in milliseconds | ||||
|                     limit: 1000 * 60 * 60 * 24 | ||||
|                 }, | ||||
|                 { | ||||
|                     name: "Realtime", | ||||
| @@ -71,7 +103,7 @@ | ||||
|                     clock: 'local', | ||||
|                     clockOffsets: { | ||||
|                         start: - THIRTY_MINUTES, | ||||
|                         end: FIVE_MINUTES | ||||
|                         end: THIRTY_SECONDS | ||||
|                     } | ||||
|                 } | ||||
|             ] | ||||
|   | ||||
| @@ -24,27 +24,16 @@ | ||||
|  | ||||
| const devMode = process.env.NODE_ENV !== 'production'; | ||||
| const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'ChromeHeadless']; | ||||
| const coverageEnabled = process.env.COVERAGE === 'true'; | ||||
| const reporters = ['progress', 'html']; | ||||
|  | ||||
| if (coverageEnabled) { | ||||
|     reporters.push('coverage-istanbul'); | ||||
| } | ||||
|  | ||||
| module.exports = (config) => { | ||||
|     const webpackConfig = require('./webpack.config.js'); | ||||
|     delete webpackConfig.output; | ||||
|  | ||||
|     if (!devMode || coverageEnabled) { | ||||
|     if (!devMode) { | ||||
|         webpackConfig.module.rules.push({ | ||||
|             test: /\.js$/, | ||||
|             exclude: /node_modules|example|lib|dist/, | ||||
|             use: { | ||||
|                 loader: 'istanbul-instrumenter-loader', | ||||
|                 options: { | ||||
|                     esModules: true | ||||
|                 } | ||||
|             } | ||||
|             exclude: /node_modules|example/, | ||||
|             use: 'istanbul-instrumenter-loader' | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @@ -56,7 +45,11 @@ module.exports = (config) => { | ||||
|             'src/**/*Spec.js' | ||||
|         ], | ||||
|         port: 9876, | ||||
|         reporters: reporters, | ||||
|         reporters: [ | ||||
|             'progress', | ||||
|             'coverage', | ||||
|             'html' | ||||
|         ], | ||||
|         browsers: browsers, | ||||
|         customLaunchers: { | ||||
|             ChromeDebugging: { | ||||
| @@ -68,27 +61,27 @@ module.exports = (config) => { | ||||
|         colors: true, | ||||
|         logLevel: config.LOG_INFO, | ||||
|         autoWatch: true, | ||||
|         coverageReporter: { | ||||
|             dir: process.env.CIRCLE_ARTIFACTS ? | ||||
|                 process.env.CIRCLE_ARTIFACTS + '/coverage' : | ||||
|                 "dist/reports/coverage", | ||||
|             check: { | ||||
|                 global: { | ||||
|                     lines: 80, | ||||
|                     excludes: ['src/plugins/plot/**/*.js'] | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         // HTML test reporting. | ||||
|         htmlReporter: { | ||||
|             outputDir: "dist/reports/tests", | ||||
|             preserveDescribeNesting: true, | ||||
|             foldAll: false | ||||
|         }, | ||||
|         coverageIstanbulReporter: { | ||||
|             fixWebpackSourcePaths: true, | ||||
|             dir: process.env.CIRCLE_ARTIFACTS ? | ||||
|                 process.env.CIRCLE_ARTIFACTS + '/coverage' : | ||||
|                 "dist/reports/coverage", | ||||
|             reports: ['html', 'lcovonly', 'text-summary'], | ||||
|             thresholds: { | ||||
|                 global: { | ||||
|                     lines: 62 | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         preprocessors: { | ||||
|             'platform/**/*Spec.js': ['webpack', 'sourcemap'], | ||||
|             'src/**/*Spec.js': ['webpack', 'sourcemap'] | ||||
|             // add webpack as preprocessor | ||||
|             'platform/**/*Spec.js': [ 'webpack', 'sourcemap' ], | ||||
|             'src/**/*Spec.js': [ 'webpack', 'sourcemap' ] | ||||
|         }, | ||||
|         webpack: webpackConfig, | ||||
|         webpackMiddleware: { | ||||
|   | ||||
							
								
								
									
										15
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								package.json
									
									
									
									
									
								
							| @@ -4,7 +4,8 @@ | ||||
|   "description": "The Open MCT core platform", | ||||
|   "dependencies": {}, | ||||
|   "devDependencies": { | ||||
|     "angular": "1.7.9", | ||||
|     "acorn": "6.2.0", | ||||
|     "angular": "1.4.14", | ||||
|     "angular-route": "1.4.14", | ||||
|     "babel-eslint": "8.2.6", | ||||
|     "comma-separated-values": "^3.6.4", | ||||
| @@ -24,7 +25,6 @@ | ||||
|     "d3-time-format": "2.1.x", | ||||
|     "eslint": "5.2.0", | ||||
|     "eslint-plugin-vue": "^6.0.0", | ||||
|     "eslint-plugin-you-dont-need-lodash-underscore": "^6.10.0", | ||||
|     "eventemitter3": "^1.2.0", | ||||
|     "exports-loader": "^0.7.0", | ||||
|     "express": "^4.13.1", | ||||
| @@ -43,13 +43,12 @@ | ||||
|     "karma-chrome-launcher": "^2.2.0", | ||||
|     "karma-cli": "^1.0.1", | ||||
|     "karma-coverage": "^1.1.2", | ||||
|     "karma-coverage-istanbul-reporter": "^2.1.1", | ||||
|     "karma-html-reporter": "^0.2.7", | ||||
|     "karma-jasmine": "^1.1.2", | ||||
|     "karma-sourcemap-loader": "^0.3.7", | ||||
|     "karma-webpack": "^3.0.0", | ||||
|     "location-bar": "^3.0.1", | ||||
|     "lodash": "^4.17.12", | ||||
|     "lodash": "^3.10.1", | ||||
|     "markdown-toc": "^0.11.7", | ||||
|     "marked": "^0.3.5", | ||||
|     "mini-css-extract-plugin": "^0.4.1", | ||||
| @@ -77,16 +76,14 @@ | ||||
|     "zepto": "^1.2.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "clean": "rm -rf ./dist", | ||||
|     "start": "node app.js", | ||||
|     "lint": "eslint platform example src --ext .js,.vue openmct.js", | ||||
|     "lint:fix": "eslint platform example src --ext .js,.vue openmct.js --fix", | ||||
|     "lint": "eslint platform example src/**/*.{js,vue} openmct.js", | ||||
|     "lint:fix": "eslint platform example src/**/*.{js,vue} openmct.js --fix", | ||||
|     "build:prod": "cross-env NODE_ENV=production webpack", | ||||
|     "build:dev": "webpack", | ||||
|     "build:watch": "webpack --watch", | ||||
|     "test": "karma start --single-run", | ||||
|     "test:debug": "cross-env NODE_ENV=debug karma start --no-single-run", | ||||
|     "test:coverage": "./scripts/test-coverage.sh", | ||||
|     "test-debug": "cross-env NODE_ENV=debug karma start --no-single-run", | ||||
|     "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", | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ['objectUtils'], | ||||
|     ['../../../../../src/api/objects/object-utils'], | ||||
|     function (objectUtils) { | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
|  * @namespace platform/containment | ||||
|  */ | ||||
| define( | ||||
|     ['objectUtils'], | ||||
|     ['../../../src/api/objects/object-utils'], | ||||
|     function (objectUtils) { | ||||
|  | ||||
|         function PersistableCompositionPolicy(openmct) { | ||||
|   | ||||
| @@ -81,7 +81,7 @@ define( | ||||
|                 baseContext = context || {}; | ||||
|             } | ||||
|  | ||||
|             var actionContext = Object.assign({}, baseContext); | ||||
|             var actionContext = _.extend({}, baseContext); | ||||
|             actionContext.domainObject = this.domainObject; | ||||
|  | ||||
|             return this.actionService.getActions(actionContext); | ||||
|   | ||||
| @@ -87,11 +87,6 @@ define([ | ||||
|                 bootstrapper | ||||
|             ); | ||||
|  | ||||
|         // Override of angular1.6 ! hashPrefix | ||||
|         app.config(['$locationProvider', function ($locationProvider) { | ||||
|             $locationProvider.hashPrefix(''); | ||||
|         }]); | ||||
|  | ||||
|         // Apply logging levels; this must be done now, before the | ||||
|         // first log statement. | ||||
|         new LogLevel(logLevel).configure(app, $log); | ||||
|   | ||||
| @@ -121,7 +121,7 @@ define(['lodash'], function (_) { | ||||
|      */ | ||||
|     ExportAsJSONAction.prototype.rewriteLink = function (child, parent) { | ||||
|         this.externalIdentifiers.push(this.getId(child)); | ||||
|         var index = parent.composition.findIndex(id => { | ||||
|         var index = _.findIndex(parent.composition, function (id) { | ||||
|             return _.isEqual(child.identifier, id); | ||||
|         }); | ||||
|         var copyOfChild = this.copyObject(child); | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| define(['zepto', 'objectUtils'], function ($, objectUtils) { | ||||
| define(['zepto', '../../../../src/api/objects/object-utils.js'], function ($, objectUtils) { | ||||
|  | ||||
|     /** | ||||
|      * The ImportAsJSONAction is available from context menus and allows a user | ||||
|   | ||||
| @@ -71,7 +71,7 @@ define([ | ||||
|                     }, | ||||
|                     { | ||||
|                         "key": "ELASTIC_PATH", | ||||
|                         "value": "mct/_doc", | ||||
|                         "value": "mct/domain_object", | ||||
|                         "priority": "fallback" | ||||
|                     }, | ||||
|                     { | ||||
|   | ||||
| @@ -32,9 +32,9 @@ define( | ||||
|         // JSLint doesn't like underscore-prefixed properties, | ||||
|         // so hide them here. | ||||
|         var SRC = "_source", | ||||
|             CONFLICT = 409, | ||||
|             SEQ_NO = "_seq_no", | ||||
|             PRIMARY_TERM = "_primary_term"; | ||||
|             REV = "_version", | ||||
|             ID = "_id", | ||||
|             CONFLICT = 409; | ||||
|  | ||||
|         /** | ||||
|          * The ElasticPersistenceProvider reads and writes JSON documents | ||||
| @@ -104,8 +104,7 @@ define( | ||||
|         // Get a domain object model out of ElasticSearch's response | ||||
|         ElasticPersistenceProvider.prototype.getModel = function (response) { | ||||
|             if (response && response[SRC]) { | ||||
|                 this.revs[response[SEQ_NO]] = response[SEQ_NO]; | ||||
|                 this.revs[response[PRIMARY_TERM]] = response[PRIMARY_TERM]; | ||||
|                 this.revs[response[ID]] = response[REV]; | ||||
|                 return response[SRC]; | ||||
|             } else { | ||||
|                 return undefined; | ||||
| @@ -117,8 +116,7 @@ define( | ||||
|         // indicate that the request failed. | ||||
|         ElasticPersistenceProvider.prototype.checkResponse = function (response, key) { | ||||
|             if (response && !response.error) { | ||||
|                 this.revs[SEQ_NO] = response[SEQ_NO]; | ||||
|                 this.revs[PRIMARY_TERM] = response[PRIMARY_TERM]; | ||||
|                 this.revs[key] = response[REV]; | ||||
|                 return response; | ||||
|             } else { | ||||
|                 return this.handleError(response, key); | ||||
| @@ -149,7 +147,7 @@ define( | ||||
|             function checkUpdate(response) { | ||||
|                 return self.checkResponse(response, key); | ||||
|             } | ||||
|             return this.put(key, value) | ||||
|             return this.put(key, value, { version: this.revs[key] }) | ||||
|                 .then(checkUpdate); | ||||
|         }; | ||||
|  | ||||
|   | ||||
| @@ -85,7 +85,7 @@ define( | ||||
|             it("allows object creation", function () { | ||||
|                 var model = { someKey: "some value" }; | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_seq_no": 1, "_primary_term": 1 } | ||||
|                     data: { "_id": "abc", "_version": 1 } | ||||
|                 })); | ||||
|                 provider.createObject("testSpace", "abc", model).then(capture); | ||||
|                 expect(mockHttp).toHaveBeenCalledWith({ | ||||
| @@ -100,7 +100,7 @@ define( | ||||
|             it("allows object models to be read back", function () { | ||||
|                 var model = { someKey: "some value" }; | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_seq_no": 1, "_primary_term": 1, "_source": model } | ||||
|                     data: { "_id": "abc", "_version": 1, "_source": model } | ||||
|                 })); | ||||
|                 provider.readObject("testSpace", "abc").then(capture); | ||||
|                 expect(mockHttp).toHaveBeenCalledWith({ | ||||
| @@ -117,19 +117,19 @@ define( | ||||
|  | ||||
|                 // First do a read to populate rev tags... | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_source": {} } | ||||
|                     data: { "_id": "abc", "_version": 42, "_source": {} } | ||||
|                 })); | ||||
|                 provider.readObject("testSpace", "abc"); | ||||
|  | ||||
|                 // Now perform an update | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_seq_no": 1, "_source": {} } | ||||
|                     data: { "_id": "abc", "_version": 43, "_source": {} } | ||||
|                 })); | ||||
|                 provider.updateObject("testSpace", "abc", model).then(capture); | ||||
|                 expect(mockHttp).toHaveBeenCalledWith({ | ||||
|                     url: "/test/db/abc", | ||||
|                     method: "PUT", | ||||
|                     params: undefined, | ||||
|                     params: { version: 42 }, | ||||
|                     data: model | ||||
|                 }); | ||||
|                 expect(capture.calls.mostRecent().args[0]).toBeTruthy(); | ||||
| @@ -138,13 +138,13 @@ define( | ||||
|             it("allows object deletion", function () { | ||||
|                 // First do a read to populate rev tags... | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_source": {} } | ||||
|                     data: { "_id": "abc", "_version": 42, "_source": {} } | ||||
|                 })); | ||||
|                 provider.readObject("testSpace", "abc"); | ||||
|  | ||||
|                 // Now perform an update | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_source": {} } | ||||
|                     data: { "_id": "abc", "_version": 42, "_source": {} } | ||||
|                 })); | ||||
|                 provider.deleteObject("testSpace", "abc", {}).then(capture); | ||||
|                 expect(mockHttp).toHaveBeenCalledWith({ | ||||
| @@ -167,13 +167,13 @@ define( | ||||
|                 expect(capture).toHaveBeenCalledWith(undefined); | ||||
|             }); | ||||
|  | ||||
|             it("handles rejection due to _seq_no", function () { | ||||
|             it("handles rejection due to version", function () { | ||||
|                 var model = { someKey: "some value" }, | ||||
|                     mockErrorCallback = jasmine.createSpy('error'); | ||||
|  | ||||
|                 // First do a read to populate rev tags... | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_seq_no": 1, "_source": {} } | ||||
|                     data: { "_id": "abc", "_version": 42, "_source": {} } | ||||
|                 })); | ||||
|                 provider.readObject("testSpace", "abc"); | ||||
|  | ||||
| @@ -196,7 +196,7 @@ define( | ||||
|  | ||||
|                 // First do a read to populate rev tags... | ||||
|                 mockHttp.and.returnValue(mockPromise({ | ||||
|                     data: { "_id": "abc", "_seq_no": 1, "_source": {} } | ||||
|                     data: { "_id": "abc", "_version": 42, "_source": {} } | ||||
|                 })); | ||||
|                 provider.readObject("testSpace", "abc"); | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|  * Module defining GenericSearchProvider. Created by shale on 07/16/2015. | ||||
|  */ | ||||
| define([ | ||||
|     'objectUtils', | ||||
|     '../../../../src/api/objects/object-utils', | ||||
|     'lodash' | ||||
| ], function ( | ||||
|     objectUtils, | ||||
| @@ -191,7 +191,7 @@ define([ | ||||
|         } | ||||
|  | ||||
|         var domainObject = objectUtils.toNewFormat(model, id); | ||||
|         var composition = this.openmct.composition.registry.find(p => { | ||||
|         var composition = _.find(this.openmct.composition.registry, function (p) { | ||||
|             return p.appliesTo(domainObject); | ||||
|         }); | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|  */ | ||||
| define( | ||||
|     [ | ||||
|         'objectUtils', | ||||
|         '../../../src/api/objects/object-utils', | ||||
|         'lodash' | ||||
|     ], | ||||
|     function ( | ||||
| @@ -235,7 +235,7 @@ define( | ||||
|             var defaultRange = metadata.valuesForHints(['range'])[0]; | ||||
|             defaultRange = defaultRange ? defaultRange.key : undefined; | ||||
|  | ||||
|             var sourceMap = _.keyBy(metadata.values(), 'key'); | ||||
|             var sourceMap = _.indexBy(metadata.values(), 'key'); | ||||
|  | ||||
|             var isLegacyProvider = telemetryAPI.findRequestProvider(domainObject) === | ||||
|                 telemetryAPI.legacyProvider; | ||||
| @@ -300,7 +300,7 @@ define( | ||||
|             var defaultRange = metadata.valuesForHints(['range'])[0]; | ||||
|             defaultRange = defaultRange ? defaultRange.key : undefined; | ||||
|  | ||||
|             var sourceMap = _.keyBy(metadata.values(), 'key'); | ||||
|             var sourceMap = _.indexBy(metadata.values(), 'key'); | ||||
|  | ||||
|             var isLegacyProvider = telemetryAPI.findSubscriptionProvider(domainObject) === | ||||
|                 telemetryAPI.legacyProvider; | ||||
|   | ||||
| @@ -1,2 +0,0 @@ | ||||
| export NODE_OPTIONS=--max_old_space_size=4096 | ||||
| cross-env COVERAGE=true karma start --single-run | ||||
							
								
								
									
										41
									
								
								src/MCT.js
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								src/MCT.js
									
									
									
									
									
								
							| @@ -28,7 +28,7 @@ define([ | ||||
|     './api/api', | ||||
|     './api/overlays/OverlayAPI', | ||||
|     './selection/Selection', | ||||
|     'objectUtils', | ||||
|     './api/objects/object-utils', | ||||
|     './plugins/plugins', | ||||
|     './adapter/indicators/legacy-indicators-plugin', | ||||
|     './plugins/buildInfo/plugin', | ||||
| @@ -249,7 +249,7 @@ define([ | ||||
|         this.legacyRegistry = new BundleRegistry(); | ||||
|         installDefaultBundles(this.legacyRegistry); | ||||
|  | ||||
|         // Plugins that are installed by default | ||||
|         // Plugin's that are installed by default | ||||
|  | ||||
|         this.install(this.plugins.Plot()); | ||||
|         this.install(this.plugins.TelemetryTable()); | ||||
| @@ -350,13 +350,17 @@ define([ | ||||
|      * @param {HTMLElement} [domElement] the DOM element in which to run | ||||
|      *        MCT; if undefined, MCT will be run in the body of the document | ||||
|      */ | ||||
|     MCT.prototype.start = function (domElement = document.body, isHeadlessMode = false) { | ||||
|     MCT.prototype.start = function (domElement) { | ||||
|         if (!this.plugins.DisplayLayout._installed) { | ||||
|             this.install(this.plugins.DisplayLayout({ | ||||
|                 showAsView: ['summary-widget'] | ||||
|             })); | ||||
|         } | ||||
|  | ||||
|         if (!domElement) { | ||||
|             domElement = document.body; | ||||
|         } | ||||
|  | ||||
|         this.element = domElement; | ||||
|  | ||||
|         this.legacyExtension('runs', { | ||||
| @@ -396,31 +400,24 @@ define([ | ||||
|                 // something has depended upon objectService.  Cool, right? | ||||
|                 this.$injector.get('objectService'); | ||||
|  | ||||
|                 if (!isHeadlessMode) { | ||||
|                     var appLayout = new Vue({ | ||||
|                         components: { | ||||
|                             'Layout': Layout.default | ||||
|                         }, | ||||
|                         provide: { | ||||
|                             openmct: this | ||||
|                         }, | ||||
|                         template: '<Layout ref="layout"></Layout>' | ||||
|                     }); | ||||
|                     domElement.appendChild(appLayout.$mount().$el); | ||||
|                 var appLayout = new Vue({ | ||||
|                     components: { | ||||
|                         'Layout': Layout.default | ||||
|                     }, | ||||
|                     provide: { | ||||
|                         openmct: this | ||||
|                     }, | ||||
|                     template: '<Layout ref="layout"></Layout>' | ||||
|                 }); | ||||
|                 domElement.appendChild(appLayout.$mount().$el); | ||||
|  | ||||
|                     this.layout = appLayout.$refs.layout; | ||||
|                     Browse(this); | ||||
|                 } | ||||
|                 this.layout = appLayout.$refs.layout; | ||||
|                 Browse(this); | ||||
|                 this.router.start(); | ||||
|                 this.emit('start'); | ||||
|             }.bind(this)); | ||||
|     }; | ||||
|  | ||||
|     MCT.prototype.startHeadless = function () { | ||||
|         let unreachableNode = document.createElement('div'); | ||||
|         return this.start(unreachableNode, true); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Install a plugin in MCT. | ||||
|      * | ||||
|   | ||||
| @@ -21,11 +21,11 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     './MCT', | ||||
|     './plugins/plugins', | ||||
|     'legacyRegistry', | ||||
|     'testUtils' | ||||
| ], function (plugins, legacyRegistry, testUtils) { | ||||
|     describe("MCT", function () { | ||||
|     'legacyRegistry' | ||||
| ], function (MCT, plugins, legacyRegistry) { | ||||
|     xdescribe("MCT", function () { | ||||
|         var openmct; | ||||
|         var mockPlugin; | ||||
|         var mockPlugin2; | ||||
| @@ -38,7 +38,7 @@ define([ | ||||
|             mockListener = jasmine.createSpy('listener'); | ||||
|             oldBundles = legacyRegistry.list(); | ||||
|  | ||||
|             openmct = testUtils.createOpenMct(); | ||||
|             openmct = new MCT(); | ||||
|  | ||||
|             openmct.install(mockPlugin); | ||||
|             openmct.install(mockPlugin2); | ||||
| @@ -63,11 +63,8 @@ define([ | ||||
|         }); | ||||
|  | ||||
|         describe("start", function () { | ||||
|             let appHolder; | ||||
|             beforeEach(function (done) { | ||||
|                 appHolder = document.createElement("div"); | ||||
|                 openmct.on('start', done); | ||||
|                 openmct.start(appHolder); | ||||
|             beforeEach(function () { | ||||
|                 openmct.start(); | ||||
|             }); | ||||
|  | ||||
|             it("calls plugins for configuration", function () { | ||||
| @@ -78,51 +75,25 @@ define([ | ||||
|             it("emits a start event", function () { | ||||
|                 expect(mockListener).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("Renders the application into the provided container element", function () { | ||||
|                 let openMctShellElements = appHolder.querySelectorAll('div.l-shell'); | ||||
|                 expect(openMctShellElements.length).toBe(1); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         describe("startHeadless", function () { | ||||
|             beforeEach(function (done) { | ||||
|                 openmct.on('start', done); | ||||
|                 openmct.startHeadless(); | ||||
|             }); | ||||
|  | ||||
|             it("calls plugins for configuration", function () { | ||||
|                 expect(mockPlugin).toHaveBeenCalledWith(openmct); | ||||
|                 expect(mockPlugin2).toHaveBeenCalledWith(openmct); | ||||
|             }); | ||||
|  | ||||
|             it("emits a start event", function () { | ||||
|                 expect(mockListener).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("Does not render Open MCT", function () { | ||||
|                 let openMctShellElements = document.body.querySelectorAll('div.l-shell'); | ||||
|                 expect(openMctShellElements.length).toBe(0); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         describe("setAssetPath", function () { | ||||
|             var testAssetPath; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 openmct.legacyExtension = jasmine.createSpy('legacyExtension'); | ||||
|             }); | ||||
|  | ||||
|             it("configures the path for assets", function () { | ||||
|                 testAssetPath = "some/path/"; | ||||
|                 openmct.setAssetPath(testAssetPath); | ||||
|                 expect(openmct.getAssetPath()).toBe(testAssetPath); | ||||
|             }); | ||||
|  | ||||
|             it("adds a trailing /", function () { | ||||
|                 testAssetPath = "some/path"; | ||||
|                 openmct.legacyExtension = jasmine.createSpy('legacyExtension'); | ||||
|                 openmct.setAssetPath(testAssetPath); | ||||
|                 expect(openmct.getAssetPath()).toBe(testAssetPath + "/"); | ||||
|             }); | ||||
|  | ||||
|             it("internally configures the path for assets", function () { | ||||
|                 expect(openmct.legacyExtension).toHaveBeenCalledWith( | ||||
|                     'constants', | ||||
|                     { | ||||
|                         key: "ASSETS_PATH", | ||||
|                         value: testAssetPath | ||||
|                     } | ||||
|                 ); | ||||
|             }); | ||||
|         }); | ||||
|     }); | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function (objectUtils) { | ||||
|     function ActionDialogDecorator(mct, actionService) { | ||||
|         this.mct = mct; | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define(['objectUtils'], function (objectUtils) { | ||||
| define(['../../api/objects/object-utils'], function (objectUtils) { | ||||
|     function AdapterCapability(domainObject) { | ||||
|         this.domainObject = domainObject; | ||||
|     } | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
|  * Module defining AlternateCompositionCapability. Created by vwoeltje on 11/7/14. | ||||
|  */ | ||||
| define([ | ||||
|     'objectUtils', | ||||
|     '../../api/objects/object-utils', | ||||
|     '../../../platform/core/src/capabilities/ContextualDomainObject' | ||||
| ], function (objectUtils, ContextualDomainObject) { | ||||
|     function AlternateCompositionCapability($injector, domainObject) { | ||||
|   | ||||
| @@ -31,7 +31,6 @@ define([ | ||||
|             var capability = viewConstructor(domainObject); | ||||
|             var oldInvoke = capability.invoke.bind(capability); | ||||
|  | ||||
|             /* eslint-disable you-dont-need-lodash-underscore/map */ | ||||
|             capability.invoke = function () { | ||||
|                 var availableViews = oldInvoke(); | ||||
|                 var newDomainObject = capability | ||||
| @@ -53,8 +52,6 @@ define([ | ||||
|                     .map('view') | ||||
|                     .value(); | ||||
|             }; | ||||
|             /* eslint-enable you-dont-need-lodash-underscore/map */ | ||||
|  | ||||
|             return capability; | ||||
|         }; | ||||
|     } | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     '../capabilities/AlternateCompositionCapability', | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     AlternateCompositionCapability, | ||||
|     objectUtils | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     utils | ||||
| ) { | ||||
|   | ||||
| @@ -78,7 +78,7 @@ define([ | ||||
|     }; | ||||
|  | ||||
|     TimeSettingsURLHandler.prototype.parseQueryParams = function () { | ||||
|         var searchParams = _.pick(this.$location.search(), Object.values(SEARCH)); | ||||
|         var searchParams = _.pick(this.$location.search(), _.values(SEARCH)); | ||||
|         var parsedParams = { | ||||
|             clock: searchParams[SEARCH.MODE], | ||||
|             timeSystem: searchParams[SEARCH.TIME_SYSTEM] | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     utils | ||||
| ) { | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     objectUtils | ||||
| ) { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| define([ | ||||
|     './LegacyViewProvider', | ||||
|     './TypeInspectorViewProvider', | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     LegacyViewProvider, | ||||
|     TypeInspectorViewProvider, | ||||
|   | ||||
| @@ -70,7 +70,7 @@ define([ | ||||
|      * @memberof module:openmct.CompositionAPI# | ||||
|      */ | ||||
|     CompositionAPI.prototype.get = function (domainObject) { | ||||
|         var provider = this.registry.find(p => { | ||||
|         var provider = _.find(this.registry, function (p) { | ||||
|             return p.appliesTo(domainObject); | ||||
|         }); | ||||
|  | ||||
|   | ||||
| @@ -122,7 +122,7 @@ define([ | ||||
|             throw new Error('Event not supported by composition: ' + event); | ||||
|         } | ||||
|  | ||||
|         var index = this.listeners[event].findIndex(l => { | ||||
|         var index = _.findIndex(this.listeners[event], function (l) { | ||||
|             return l.callback === callback && l.context === context; | ||||
|         }); | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     'lodash', | ||||
|     'objectUtils' | ||||
|     '../objects/object-utils' | ||||
| ], function ( | ||||
|     _, | ||||
|     objectUtils | ||||
| @@ -143,7 +143,7 @@ define([ | ||||
|         var keyString = objectUtils.makeKeyString(domainObject.identifier); | ||||
|         var objectListeners = this.listeningTo[keyString]; | ||||
|  | ||||
|         var index = objectListeners[event].findIndex(l => { | ||||
|         var index = _.findIndex(objectListeners[event], function (l) { | ||||
|             return l.callback === callback && l.context === context; | ||||
|         }); | ||||
|  | ||||
| @@ -196,8 +196,8 @@ define([ | ||||
|      * @private | ||||
|      */ | ||||
|     DefaultCompositionProvider.prototype.includes = function (parent, childId) { | ||||
|         return parent.composition.some(composee => | ||||
|             this.publicAPI.objects.areIdsEqual(composee, childId)); | ||||
|         return parent.composition.findIndex(composee => | ||||
|             this.publicAPI.objects.areIdsEqual(composee, childId)) !== -1; | ||||
|     }; | ||||
|  | ||||
|     DefaultCompositionProvider.prototype.reorder = function (domainObject, oldIndex, newIndex) { | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'objectUtils', | ||||
|     './object-utils.js', | ||||
|     'lodash' | ||||
| ], function ( | ||||
|     utils, | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     'lodash', | ||||
|     'objectUtils', | ||||
|     './object-utils', | ||||
|     './MutableObject', | ||||
|     './RootRegistry', | ||||
|     './RootObjectProvider', | ||||
|   | ||||
| @@ -43,7 +43,7 @@ define([ | ||||
|     } | ||||
|  | ||||
|     RootRegistry.prototype.addRoot = function (key) { | ||||
|         if (isKey(key) || (Array.isArray(key) && key.every(isKey))) { | ||||
|         if (isKey(key) || (_.isArray(key) && _.every(key, isKey))) { | ||||
|             this.providers.push(function () { | ||||
|                 return key; | ||||
|             }); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| define([ | ||||
|     'objectUtils' | ||||
|     '../object-utils' | ||||
| ], function ( | ||||
|     objectUtils | ||||
| ) { | ||||
|   | ||||
| @@ -85,9 +85,9 @@ define([ | ||||
|                             value: +e.value | ||||
|                         }; | ||||
|                     }), 'e.value'); | ||||
|                 valueMetadata.values = valueMetadata.enumerations.map(e => e.value); | ||||
|                 valueMetadata.max = Math.max(valueMetadata.values); | ||||
|                 valueMetadata.min = Math.min(valueMetadata.values); | ||||
|                 valueMetadata.values = _.pluck(valueMetadata.enumerations, 'value'); | ||||
|                 valueMetadata.max = _.max(valueMetadata.values); | ||||
|                 valueMetadata.min = _.min(valueMetadata.values); | ||||
|             } | ||||
|  | ||||
|             valueMetadatas.push(valueMetadata); | ||||
| @@ -103,7 +103,7 @@ define([ | ||||
|         var metadata = domainObject.telemetry || {}; | ||||
|         if (this.typeHasTelemetry(domainObject)) { | ||||
|             var typeMetadata = this.typeService.getType(domainObject.type).typeDef.telemetry; | ||||
|             Object.assign(metadata, typeMetadata); | ||||
|             _.extend(metadata, typeMetadata); | ||||
|             if (!metadata.values) { | ||||
|                 metadata.values = valueMetadatasFromOldFormat(metadata); | ||||
|             } | ||||
|   | ||||
| @@ -24,7 +24,7 @@ define([ | ||||
|     './TelemetryMetadataManager', | ||||
|     './TelemetryValueFormatter', | ||||
|     './DefaultMetadataProvider', | ||||
|     'objectUtils', | ||||
|     '../objects/object-utils', | ||||
|     'lodash' | ||||
| ], function ( | ||||
|     TelemetryMetadataManager, | ||||
| @@ -370,7 +370,7 @@ define([ | ||||
|     TelemetryAPI.prototype.commonValuesForHints = function (metadatas, hints) { | ||||
|         var options = metadatas.map(function (metadata) { | ||||
|             var values = metadata.valuesForHints(hints); | ||||
|             return _.keyBy(values, 'key'); | ||||
|             return _.indexBy(values, 'key'); | ||||
|         }).reduce(function (a, b) { | ||||
|             var results = {}; | ||||
|             Object.keys(a).forEach(function (key) { | ||||
| @@ -383,7 +383,7 @@ define([ | ||||
|         var sortKeys = hints.map(function (h) { | ||||
|             return 'hints.' + h; | ||||
|         }); | ||||
|         return _.sortBy(options, sortKeys); | ||||
|         return _.sortByAll(options, sortKeys); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -57,13 +57,13 @@ define([ | ||||
|  | ||||
|         if (valueMetadata.format === 'enum') { | ||||
|             if (!valueMetadata.values) { | ||||
|                 valueMetadata.values = valueMetadata.enumerations.map(e => e.value); | ||||
|                 valueMetadata.values = _.pluck(valueMetadata.enumerations, 'value'); | ||||
|             } | ||||
|             if (!valueMetadata.hasOwnProperty('max')) { | ||||
|                 valueMetadata.max = Math.max(valueMetadata.values) + 1; | ||||
|                 valueMetadata.max = _.max(valueMetadata.values) + 1; | ||||
|             } | ||||
|             if (!valueMetadata.hasOwnProperty('min')) { | ||||
|                 valueMetadata.min = Math.min(valueMetadata.values) - 1; | ||||
|                 valueMetadata.min = _.min(valueMetadata.values) - 1; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -121,7 +121,7 @@ define([ | ||||
|                 return metadata.hints[hint]; | ||||
|             } | ||||
|         }); | ||||
|         return _.sortBy(matchingMetadata, ...iteratees); | ||||
|         return _.sortByAll(matchingMetadata, ...iteratees); | ||||
|     }; | ||||
|  | ||||
|     TelemetryMetadataManager.prototype.getFilterableValues = function () { | ||||
|   | ||||
| @@ -75,7 +75,7 @@ export default { | ||||
|             this.items.push(item); | ||||
|         }, | ||||
|         removeItem(identifier) { | ||||
|             let index = this.items.findIndex(item => this.openmct.objects.makeKeyString(identifier) === item.key); | ||||
|             let index = _.findIndex(this.items, (item) => this.openmct.objects.makeKeyString(identifier) === item.key); | ||||
|  | ||||
|             this.items.splice(index, 1); | ||||
|         }, | ||||
|   | ||||
| @@ -102,7 +102,7 @@ export default { | ||||
|             this.compositions.push({composition, addCallback, removeCallback}); | ||||
|         }, | ||||
|         removePrimary(identifier) { | ||||
|             let index = this.primaryTelemetryObjects.findIndex(primary => this.openmct.objects.makeKeyString(identifier) === primary.key), | ||||
|             let index = _.findIndex(this.primaryTelemetryObjects, (primary) => this.openmct.objects.makeKeyString(identifier) === primary.key), | ||||
|                 primary = this.primaryTelemetryObjects[index]; | ||||
|  | ||||
|             this.$set(this.secondaryTelemetryObjects, primary.key, undefined); | ||||
| @@ -130,7 +130,7 @@ export default { | ||||
|         removeSecondary(primary) { | ||||
|             return (identifier) => { | ||||
|                 let array = this.secondaryTelemetryObjects[primary.key], | ||||
|                     index = array.findIndex(secondary => this.openmct.objects.makeKeyString(identifier) === secondary.key); | ||||
|                     index = _.findIndex(array, (secondary) => this.openmct.objects.makeKeyString(identifier) === secondary.key); | ||||
|  | ||||
|                 array.splice(index, 1); | ||||
|  | ||||
|   | ||||
| @@ -70,18 +70,15 @@ export default class ConditionClass extends EventEmitter { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (this.isTelemetryUsed(datum.id)) { | ||||
|         this.criteria.forEach(criterion => { | ||||
|             if (this.isAnyOrAllTelemetry(criterion)) { | ||||
|                 criterion.getResult(datum, this.conditionManager.telemetryObjects); | ||||
|             } else { | ||||
|                 criterion.getResult(datum); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|             this.criteria.forEach(criterion => { | ||||
|                 if (this.isAnyOrAllTelemetry(criterion)) { | ||||
|                     criterion.getResult(datum, this.conditionManager.telemetryObjects); | ||||
|                 } else { | ||||
|                     criterion.getResult(datum); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             this.result = evaluateResults(this.criteria.map(criterion => criterion.result), this.trigger); | ||||
|         } | ||||
|         this.result = evaluateResults(this.criteria.map(criterion => criterion.result), this.trigger); | ||||
|     } | ||||
|  | ||||
|     isAnyOrAllTelemetry(criterion) { | ||||
|   | ||||
| @@ -47,24 +47,17 @@ describe("The condition", function () { | ||||
|             name: "Test Object", | ||||
|             telemetry: { | ||||
|                 values: [{ | ||||
|                     key: "value", | ||||
|                     name: "Value", | ||||
|                     hints: { | ||||
|                         range: 2 | ||||
|                     } | ||||
|                 }, | ||||
|                 { | ||||
|                     key: "utc", | ||||
|                     name: "Time", | ||||
|                     format: "utc", | ||||
|                     key: "some-key", | ||||
|                     name: "Some attribute", | ||||
|                     hints: { | ||||
|                         domain: 1 | ||||
|                     } | ||||
|                 }, { | ||||
|                     key: "testSource", | ||||
|                     source: "value", | ||||
|                     name: "Test", | ||||
|                     format: "string" | ||||
|                     key: "some-other-key", | ||||
|                     name: "Another attribute", | ||||
|                     hints: { | ||||
|                         range: 1 | ||||
|                     } | ||||
|                 }] | ||||
|             } | ||||
|         }; | ||||
| @@ -143,38 +136,4 @@ describe("The condition", function () { | ||||
|         expect(result).toBeTrue(); | ||||
|         expect(conditionObj.criteria.length).toEqual(0); | ||||
|     }); | ||||
|  | ||||
|     it("gets the result of a condition when new telemetry data is received", function () { | ||||
|         conditionObj.getResult({ | ||||
|             value: '0', | ||||
|             utc: 'Hi', | ||||
|             id: testTelemetryObject.identifier.key | ||||
|         }); | ||||
|         expect(conditionObj.result).toBeTrue(); | ||||
|     }); | ||||
|  | ||||
|     it("gets the result of a condition when new telemetry data is received", function () { | ||||
|         conditionObj.getResult({ | ||||
|             value: '1', | ||||
|             utc: 'Hi', | ||||
|             id: testTelemetryObject.identifier.key | ||||
|         }); | ||||
|         expect(conditionObj.result).toBeFalse(); | ||||
|     }); | ||||
|  | ||||
|     it("keeps the old result new telemetry data is not used by it", function () { | ||||
|         conditionObj.getResult({ | ||||
|             value: '0', | ||||
|             utc: 'Hi', | ||||
|             id: testTelemetryObject.identifier.key | ||||
|         }); | ||||
|         expect(conditionObj.result).toBeTrue(); | ||||
|  | ||||
|         conditionObj.getResult({ | ||||
|             value: '1', | ||||
|             utc: 'Hi', | ||||
|             id: '1234' | ||||
|         }); | ||||
|         expect(conditionObj.result).toBeTrue(); | ||||
|     }); | ||||
| }); | ||||
|   | ||||
| @@ -23,13 +23,10 @@ | ||||
| import EventEmitter from 'EventEmitter'; | ||||
|  | ||||
| export default class StyleRuleManager extends EventEmitter { | ||||
|     constructor(styleConfiguration, openmct, callback, suppressSubscriptionOnEdit) { | ||||
|     constructor(styleConfiguration, openmct, callback) { | ||||
|         super(); | ||||
|         this.openmct = openmct; | ||||
|         this.callback = callback; | ||||
|         if (suppressSubscriptionOnEdit) { | ||||
|             this.openmct.editor.on('isEditing', this.toggleSubscription.bind(this)); | ||||
|         } | ||||
|         if (styleConfiguration) { | ||||
|             this.initialize(styleConfiguration); | ||||
|             if (styleConfiguration.conditionSetIdentifier) { | ||||
| @@ -40,25 +37,9 @@ export default class StyleRuleManager extends EventEmitter { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     toggleSubscription(isEditing) { | ||||
|         this.isEditing = isEditing; | ||||
|         if (this.isEditing) { | ||||
|             if (this.stopProvidingTelemetry) { | ||||
|                 this.stopProvidingTelemetry(); | ||||
|             } | ||||
|             if (this.conditionSetIdentifier) { | ||||
|                 this.applySelectedConditionStyle(); | ||||
|             } | ||||
|         } else if (this.conditionSetIdentifier) { | ||||
|             this.subscribeToConditionSet(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     initialize(styleConfiguration) { | ||||
|         this.conditionSetIdentifier = styleConfiguration.conditionSetIdentifier; | ||||
|         this.staticStyle = styleConfiguration.staticStyle; | ||||
|         this.selectedConditionId = styleConfiguration.selectedConditionId; | ||||
|         this.defaultConditionId = styleConfiguration.defaultConditionId; | ||||
|         this.updateConditionStylesMap(styleConfiguration.styles || []); | ||||
|     } | ||||
|  | ||||
| @@ -73,7 +54,7 @@ export default class StyleRuleManager extends EventEmitter { | ||||
|                         this.handleConditionSetResultUpdated(output[0]); | ||||
|                     } | ||||
|                 }); | ||||
|             this.stopProvidingTelemetry = this.openmct.telemetry.subscribe(conditionSetDomainObject, this.handleConditionSetResultUpdated.bind(this)); | ||||
|             this.stopProvidingTelemetry = this.openmct.telemetry.subscribe(conditionSetDomainObject, output => this.handleConditionSetResultUpdated(output)); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @@ -85,13 +66,9 @@ export default class StyleRuleManager extends EventEmitter { | ||||
|             let isNewConditionSet = !this.conditionSetIdentifier || | ||||
|                                     !this.openmct.objects.areIdsEqual(this.conditionSetIdentifier, styleConfiguration.conditionSetIdentifier); | ||||
|             this.initialize(styleConfiguration); | ||||
|             if (this.isEditing) { | ||||
|                 this.applySelectedConditionStyle(); | ||||
|             } else { | ||||
|                 //Only resubscribe if the conditionSet has changed. | ||||
|                 if (isNewConditionSet) { | ||||
|                     this.subscribeToConditionSet(); | ||||
|                 } | ||||
|             //Only resubscribe if the conditionSet has changed. | ||||
|             if (isNewConditionSet) { | ||||
|                 this.subscribeToConditionSet(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -126,16 +103,6 @@ export default class StyleRuleManager extends EventEmitter { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     applySelectedConditionStyle() { | ||||
|         const conditionId = this.selectedConditionId || this.defaultConditionId; | ||||
|         if (!conditionId) { | ||||
|             this.applyStaticStyle(); | ||||
|         } else if (this.conditionalStyleMap[conditionId]) { | ||||
|             this.currentStyle = this.conditionalStyleMap[conditionId]; | ||||
|             this.updateDomainObjectStyle(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     applyStaticStyle() { | ||||
|         if (this.staticStyle) { | ||||
|             this.currentStyle = this.staticStyle.style; | ||||
| @@ -156,7 +123,6 @@ export default class StyleRuleManager extends EventEmitter { | ||||
|         } | ||||
|         delete this.stopProvidingTelemetry; | ||||
|         this.conditionSetIdentifier = undefined; | ||||
|         this.isEditing = undefined; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -30,7 +30,6 @@ | ||||
| > | ||||
|     <div class="c-condition-h__drop-target"></div> | ||||
|     <div v-if="isEditing" | ||||
|          :class="{'is-current': condition.id === currentConditionId}" | ||||
|          class="c-condition c-condition--edit" | ||||
|     > | ||||
|         <!-- Edit view --> | ||||
| @@ -168,7 +167,6 @@ | ||||
|     </div> | ||||
|     <div v-else | ||||
|          class="c-condition c-condition--browse" | ||||
|          :class="{'is-current': condition.id === currentConditionId}" | ||||
|     > | ||||
|         <!-- Browse view --> | ||||
|         <div class="c-condition__header"> | ||||
| @@ -201,10 +199,6 @@ export default { | ||||
|         ConditionDescription | ||||
|     }, | ||||
|     props: { | ||||
|         currentConditionId: { | ||||
|             type: String, | ||||
|             default: '' | ||||
|         }, | ||||
|         condition: { | ||||
|             type: Object, | ||||
|             required: true | ||||
|   | ||||
| @@ -58,7 +58,6 @@ | ||||
|             <Condition v-for="(condition, index) in conditionCollection" | ||||
|                        :key="condition.id" | ||||
|                        :condition="condition" | ||||
|                        :current-condition-id="currentConditionId" | ||||
|                        :condition-index="index" | ||||
|                        :telemetry="telemetryObjs" | ||||
|                        :is-editing="isEditing" | ||||
| @@ -108,8 +107,7 @@ export default { | ||||
|             moveIndex: undefined, | ||||
|             isDragging: false, | ||||
|             defaultOutput: undefined, | ||||
|             dragCounter: 0, | ||||
|             currentConditionId: '' | ||||
|             dragCounter: 0 | ||||
|         }; | ||||
|     }, | ||||
|     watch: { | ||||
| @@ -147,7 +145,6 @@ export default { | ||||
|     }, | ||||
|     methods: { | ||||
|         handleConditionSetResultUpdated(data) { | ||||
|             this.currentConditionId = data.conditionId; | ||||
|             this.$emit('conditionSetResultUpdated', data) | ||||
|         }, | ||||
|         observeForChanges() { | ||||
| @@ -200,7 +197,7 @@ export default { | ||||
|             this.$emit('telemetryUpdated', this.telemetryObjs); | ||||
|         }, | ||||
|         removeTelemetryObject(identifier) { | ||||
|             let index = this.telemetryObjs.findIndex(obj => { | ||||
|             let index = _.findIndex(this.telemetryObjs, (obj) => { | ||||
|                 let objId = this.openmct.objects.makeKeyString(obj.identifier); | ||||
|                 let id = this.openmct.objects.makeKeyString(identifier); | ||||
|                 return objId === id; | ||||
|   | ||||
| @@ -190,7 +190,6 @@ | ||||
| } | ||||
|  | ||||
| .c-condition { | ||||
|     border: 1px solid transparent; | ||||
|     flex-direction: column; | ||||
|     min-width: 400px; | ||||
|  | ||||
| @@ -235,12 +234,6 @@ | ||||
|     &__summary { | ||||
|         flex: 1 1 auto; | ||||
|     } | ||||
|  | ||||
|     &.is-current { | ||||
|         $c: $colorBodyFg; | ||||
|         border-color: rgba($c, 0.2); | ||||
|         background: rgba($c, 0.2); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /***************************** CONDITION DEFINITION, EDITING */ | ||||
|   | ||||
| @@ -79,8 +79,6 @@ | ||||
|             <div v-for="(conditionStyle, index) in conditionalStyles" | ||||
|                  :key="index" | ||||
|                  class="c-inspect-styles__condition" | ||||
|                  :class="{'is-current': conditionStyle.conditionId === selectedConditionId}" | ||||
|                  @click="applySelectedConditionStyle(conditionStyle.conditionId)" | ||||
|             > | ||||
|                 <condition-error :show-label="true" | ||||
|                                  :condition="getCondition(conditionStyle.conditionId)" | ||||
| @@ -108,7 +106,6 @@ import ConditionError from "@/plugins/condition/components/ConditionError.vue"; | ||||
| import Vue from 'vue'; | ||||
| import PreviewAction from "@/ui/preview/PreviewAction.js"; | ||||
| import {getApplicableStylesForItem} from "@/plugins/condition/utils/styleUtils"; | ||||
| import isEmpty from 'lodash/isEmpty'; | ||||
|  | ||||
| export default { | ||||
|     name: 'ConditionalStylesView', | ||||
| @@ -129,8 +126,7 @@ export default { | ||||
|             isEditing: this.openmct.editor.isEditing(), | ||||
|             conditions: undefined, | ||||
|             conditionsLoaded: false, | ||||
|             navigateToPath: '', | ||||
|             selectedConditionId: '' | ||||
|             navigateToPath: '' | ||||
|         } | ||||
|     }, | ||||
|     destroyed() { | ||||
| @@ -195,9 +191,6 @@ export default { | ||||
|             if (this.stopObservingItems) { | ||||
|                 this.stopObservingItems(); | ||||
|             } | ||||
|             if (this.stopProvidingTelemetry) { | ||||
|                 this.stopProvidingTelemetry(); | ||||
|             } | ||||
|         }, | ||||
|         initialize(conditionSetDomainObject) { | ||||
|             //If there are new conditions in the conditionSet we need to set those styles to default | ||||
| @@ -207,13 +200,6 @@ export default { | ||||
|         }, | ||||
|         setEditState(isEditing) { | ||||
|             this.isEditing = isEditing; | ||||
|             if (this.isEditing) { | ||||
|                 if (this.stopProvidingTelemetry) { | ||||
|                     this.stopProvidingTelemetry(); | ||||
|                 } | ||||
|             } else { | ||||
|                 this.subscribeToConditionSet(); | ||||
|             } | ||||
|         }, | ||||
|         addConditionSet() { | ||||
|             let conditionSetDomainObject; | ||||
| @@ -284,44 +270,33 @@ export default { | ||||
|             let domainObjectStyles =  (this.domainObject.configuration && this.domainObject.configuration.objectStyles) || {}; | ||||
|             if (this.itemId) { | ||||
|                 domainObjectStyles[this.itemId].conditionSetIdentifier = undefined; | ||||
|                 domainObjectStyles[this.itemId].selectedConditionId = undefined; | ||||
|                 domainObjectStyles[this.itemId].defaultConditionId = undefined; | ||||
|                 delete domainObjectStyles[this.itemId].conditionSetIdentifier; | ||||
|                 domainObjectStyles[this.itemId].styles = undefined; | ||||
|                 delete domainObjectStyles[this.itemId].styles; | ||||
|                 if (isEmpty(domainObjectStyles[this.itemId])) { | ||||
|                 if (_.isEmpty(domainObjectStyles[this.itemId])) { | ||||
|                     delete domainObjectStyles[this.itemId]; | ||||
|                 } | ||||
|             } else { | ||||
|                 domainObjectStyles.conditionSetIdentifier = undefined; | ||||
|                 domainObjectStyles.selectedConditionId = undefined; | ||||
|                 domainObjectStyles.defaultConditionId = undefined; | ||||
|                 delete domainObjectStyles.conditionSetIdentifier; | ||||
|                 domainObjectStyles.styles = undefined; | ||||
|                 delete domainObjectStyles.styles; | ||||
|             } | ||||
|             if (isEmpty(domainObjectStyles)) { | ||||
|             if (_.isEmpty(domainObjectStyles)) { | ||||
|                 domainObjectStyles = undefined; | ||||
|             } | ||||
|  | ||||
|             this.persist(domainObjectStyles); | ||||
|             if (this.stopProvidingTelemetry) { | ||||
|                 this.stopProvidingTelemetry(); | ||||
|             } | ||||
|         }, | ||||
|         updateDomainObjectItemStyles(newItems) { | ||||
|             //check that all items that have been styles still exist. Otherwise delete those styles | ||||
|             let domainObjectStyles =  (this.domainObject.configuration && this.domainObject.configuration.objectStyles) || {}; | ||||
|             let itemsToRemove = []; | ||||
|             let keys = Object.keys(domainObjectStyles); | ||||
|             //TODO: Need an easier way to find which properties are itemIds | ||||
|             keys.forEach((key) => { | ||||
|                 const keyIsItemId = (key !== 'styles') && | ||||
|                 if ((key !== 'styles') && | ||||
|                     (key !== 'staticStyle') && | ||||
|                     (key !== 'defaultConditionId') && | ||||
|                     (key !== 'selectedConditionId') && | ||||
|                     (key !== 'conditionSetIdentifier'); | ||||
|                 if (keyIsItemId) { | ||||
|                     (key !== 'conditionSetIdentifier')) { | ||||
|                     if (!(newItems.find(item => item.id === key))) { | ||||
|                         itemsToRemove.push(key); | ||||
|                     } | ||||
| @@ -338,7 +313,7 @@ export default { | ||||
|                     delete domainObjectStyles[this.itemId]; | ||||
|                 } | ||||
|             }); | ||||
|             if (isEmpty(domainObjectStyles)) { | ||||
|             if (_.isEmpty(domainObjectStyles)) { | ||||
|                 domainObjectStyles = undefined; | ||||
|             } | ||||
|             this.persist(domainObjectStyles); | ||||
| @@ -349,9 +324,6 @@ export default { | ||||
|             } | ||||
|             let conditionalStyles = []; | ||||
|             this.conditionSetDomainObject.configuration.conditionCollection.forEach((conditionConfiguration, index) => { | ||||
|                 if (conditionConfiguration.isDefault) { | ||||
|                     this.selectedConditionId = conditionConfiguration.id; | ||||
|                 } | ||||
|                 this.conditions[conditionConfiguration.id] = conditionConfiguration; | ||||
|                 let foundStyle = this.findStyleByConditionId(conditionConfiguration.id); | ||||
|                 if (foundStyle) { | ||||
| @@ -367,27 +339,7 @@ export default { | ||||
|             //we're doing this so that we remove styles for any conditions that have been removed from the condition set | ||||
|             this.conditionalStyles = conditionalStyles; | ||||
|             this.conditionsLoaded = true; | ||||
|             this.persist(this.getDomainObjectConditionalStyle(this.selectedConditionId)); | ||||
|             if (!this.isEditing) { | ||||
|                 this.subscribeToConditionSet(); | ||||
|             } | ||||
|         }, | ||||
|         subscribeToConditionSet() { | ||||
|             if (this.stopProvidingTelemetry) { | ||||
|                 this.stopProvidingTelemetry(); | ||||
|             } | ||||
|             if (this.conditionSetDomainObject) { | ||||
|                 this.openmct.telemetry.request(this.conditionSetDomainObject) | ||||
|                     .then(output => { | ||||
|                         if (output && output.length) { | ||||
|                             this.handleConditionSetResultUpdated(output[0]); | ||||
|                         } | ||||
|                     }); | ||||
|                 this.stopProvidingTelemetry = this.openmct.telemetry.subscribe(this.conditionSetDomainObject, this.handleConditionSetResultUpdated.bind(this)); | ||||
|             } | ||||
|         }, | ||||
|         handleConditionSetResultUpdated(resultData) { | ||||
|             this.selectedConditionId = resultData ? resultData.conditionId : ''; | ||||
|             this.persist(this.getDomainObjectConditionalStyle()); | ||||
|         }, | ||||
|         initializeStaticStyle(objectStyles) { | ||||
|             let staticStyle = objectStyles && objectStyles.staticStyle; | ||||
| @@ -412,19 +364,14 @@ export default { | ||||
|             let found = this.findStyleByConditionId(conditionStyle.conditionId); | ||||
|             if (found) { | ||||
|                 found.style = conditionStyle.style; | ||||
|                 this.selectedConditionId = found.conditionId; | ||||
|                 this.persist(this.getDomainObjectConditionalStyle()); | ||||
|             } | ||||
|         }, | ||||
|         getDomainObjectConditionalStyle(defaultConditionId) { | ||||
|         getDomainObjectConditionalStyle() { | ||||
|             let objectStyle = { | ||||
|                 styles: this.conditionalStyles, | ||||
|                 staticStyle: this.staticStyle, | ||||
|                 selectedConditionId: this.selectedConditionId | ||||
|                 staticStyle: this.staticStyle | ||||
|             }; | ||||
|             if (defaultConditionId) { | ||||
|                 objectStyle.defaultConditionId = defaultConditionId; | ||||
|             } | ||||
|             if (this.conditionSetDomainObject) { | ||||
|                 objectStyle.conditionSetIdentifier = this.conditionSetDomainObject.identifier; | ||||
|             } | ||||
| @@ -446,10 +393,6 @@ export default { | ||||
|         getCondition(id) { | ||||
|             return this.conditions ? this.conditions[id] : {}; | ||||
|         }, | ||||
|         applySelectedConditionStyle(conditionId) { | ||||
|             this.selectedConditionId = conditionId; | ||||
|             this.persist(this.getDomainObjectConditionalStyle()); | ||||
|         }, | ||||
|         persist(style) { | ||||
|             this.openmct.objects.mutate(this.domainObject, 'configuration.objectStyles', style); | ||||
|         } | ||||
|   | ||||
| @@ -50,7 +50,6 @@ | ||||
| import StyleEditor from "./StyleEditor.vue"; | ||||
| import PreviewAction from "@/ui/preview/PreviewAction.js"; | ||||
| import { getApplicableStylesForItem, getConsolidatedStyleValues, getConditionalStyleForItem } from "@/plugins/condition/utils/styleUtils"; | ||||
| import isEmpty from 'lodash/isEmpty'; | ||||
|  | ||||
| export default { | ||||
|     name: 'MultiSelectStylesView', | ||||
| @@ -179,7 +178,7 @@ export default { | ||||
|                 domainObjectStyles[itemId] = undefined; | ||||
|                 delete domainObjectStyles[this.itemId]; | ||||
|  | ||||
|                 if (isEmpty(domainObjectStyles)) { | ||||
|                 if (_.isEmpty(domainObjectStyles)) { | ||||
|                     domainObjectStyles = undefined; | ||||
|                 } | ||||
|                 this.persist(this.domainObject, domainObjectStyles); | ||||
| @@ -240,7 +239,7 @@ export default { | ||||
|                     if (this.isStaticAndConditionalStyles) { | ||||
|                         this.removeConditionalStyles(domainObjectStyles, item.id); | ||||
|                     } | ||||
|                     if (isEmpty(itemStaticStyle)) { | ||||
|                     if (_.isEmpty(itemStaticStyle)) { | ||||
|                         itemStaticStyle = undefined; | ||||
|                         domainObjectStyles[item.id] = undefined; | ||||
|                     } else { | ||||
|   | ||||
| @@ -60,31 +60,6 @@ | ||||
|  | ||||
|     &__condition { | ||||
|         @include discreteItem(); | ||||
|         border: 1px solid transparent; | ||||
|         pointer-events: none; // Prevent selecting when the object isn't being edited | ||||
|  | ||||
|         &.is-current { | ||||
|             $c: $colorBodyFg; | ||||
|             border-color: rgba($c, 0.2); | ||||
|             background: rgba($c, 0.2); | ||||
|         } | ||||
|  | ||||
|         .is-editing & { | ||||
|             cursor: pointer; | ||||
|             pointer-events: initial; | ||||
|             transition: $transOut; | ||||
|  | ||||
|             &:hover { | ||||
|                 background: rgba($colorBodyFg, 0.1); | ||||
|                 transition: $transIn; | ||||
|             } | ||||
|  | ||||
|             &.is-current { | ||||
|                 $c: $editUIColorBg; | ||||
|                 border-color: $c; | ||||
|                 background: rgba($c, 0.1); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .c-style { | ||||
|   | ||||
| @@ -20,21 +20,25 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| import { createOpenMct } from "testUtils"; | ||||
| import { createOpenMct } from "testTools"; | ||||
| import ConditionPlugin from "./plugin"; | ||||
|  | ||||
| let openmct = createOpenMct(); | ||||
| openmct.install(new ConditionPlugin()); | ||||
|  | ||||
| let conditionSetDefinition; | ||||
| let mockConditionSetDomainObject; | ||||
| let element; | ||||
| let child; | ||||
|  | ||||
| describe('the plugin', function () { | ||||
|     let conditionSetDefinition; | ||||
|     let mockConditionSetDomainObject; | ||||
|     let element; | ||||
|     let child; | ||||
|     let openmct; | ||||
|  | ||||
|     beforeAll((done) => { | ||||
|         openmct = createOpenMct(); | ||||
|         openmct.install(new ConditionPlugin()); | ||||
|  | ||||
|         conditionSetDefinition = openmct.types.get('conditionSet').definition; | ||||
|         const appHolder = document.createElement('div'); | ||||
|         appHolder.style.width = '640px'; | ||||
|         appHolder.style.height = '480px'; | ||||
|  | ||||
|         element = document.createElement('div'); | ||||
|         child = document.createElement('div'); | ||||
| @@ -51,7 +55,7 @@ describe('the plugin', function () { | ||||
|         conditionSetDefinition.initialize(mockConditionSetDomainObject); | ||||
|  | ||||
|         openmct.on('start', done); | ||||
|         openmct.startHeadless(); | ||||
|         openmct.start(appHolder); | ||||
|     }); | ||||
|  | ||||
|     let mockConditionSetObject = { | ||||
|   | ||||
| @@ -20,6 +20,8 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| import _ from 'lodash'; | ||||
|  | ||||
| const convertToNumbers = (input) => { | ||||
|     let numberInputs = []; | ||||
|     input.forEach(inputValue => numberInputs.push(Number(inputValue))); | ||||
| @@ -32,10 +34,6 @@ const convertToStrings = (input) => { | ||||
|     return stringInputs; | ||||
| }; | ||||
|  | ||||
| const joinValues = (values, length) => { | ||||
|     return values.slice(0, length).join(', '); | ||||
| }; | ||||
|  | ||||
| export const OPERATIONS = [ | ||||
|     { | ||||
|         name: 'equalTo', | ||||
| @@ -46,7 +44,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['number'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' is ' + joinValues(values, 1); | ||||
|             return ' is ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -58,7 +56,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['number'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' is not ' + joinValues(values, 1); | ||||
|             return ' is not ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -70,7 +68,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['number'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' > ' + joinValues(values, 1); | ||||
|             return ' > ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -82,7 +80,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['number'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' < ' + joinValues(values, 1); | ||||
|             return ' < ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -94,7 +92,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['number'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' >= ' + joinValues(values, 1); | ||||
|             return ' >= ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -106,7 +104,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['number'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' <= ' + joinValues(values, 1); | ||||
|             return ' <= ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -148,7 +146,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['string'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' contains ' + joinValues(values, 1); | ||||
|             return ' contains ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -160,7 +158,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['string'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' does not contain ' + joinValues(values, 1); | ||||
|             return ' does not contain ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -172,7 +170,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['string'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' starts with ' + joinValues(values, 1); | ||||
|             return ' starts with ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -184,7 +182,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['string'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' ends with ' + joinValues(values, 1); | ||||
|             return ' ends with ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -196,7 +194,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['string'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' is exactly ' + joinValues(values, 1); | ||||
|             return ' is exactly ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -233,7 +231,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['enum'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' is ' + joinValues(values, 1); | ||||
|             return ' is ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -246,7 +244,7 @@ export const OPERATIONS = [ | ||||
|         appliesTo: ['enum'], | ||||
|         inputCount: 1, | ||||
|         getDescription: function (values) { | ||||
|             return ' is not ' + joinValues(values, 1); | ||||
|             return ' is not ' + values.join(', '); | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
| @@ -255,7 +253,7 @@ export const OPERATIONS = [ | ||||
|             const lhsValue = input[0] !== undefined ? input[0].toString() : ''; | ||||
|             if (input[1]) { | ||||
|                 const values = input[1].split(','); | ||||
|                 return values.find((value) => lhsValue === value.toString().trim()); | ||||
|                 return values.find((value) => lhsValue === _.trim(value.toString())); | ||||
|             } | ||||
|             return false; | ||||
|         }, | ||||
| @@ -272,7 +270,7 @@ export const OPERATIONS = [ | ||||
|             const lhsValue = input[0] !== undefined ? input[0].toString() : ''; | ||||
|             if (input[1]) { | ||||
|                 const values = input[1].split(','); | ||||
|                 const found = values.find((value) => lhsValue === value.toString().trim()); | ||||
|                 const found = values.find((value) => lhsValue === _.trim(value.toString())); | ||||
|                 return !found; | ||||
|             } | ||||
|             return false; | ||||
|   | ||||
| @@ -19,8 +19,6 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| import isEmpty from 'lodash/isEmpty'; | ||||
|  | ||||
| const NONE_VALUE = '__no_value'; | ||||
|  | ||||
| const styleProps = { | ||||
| @@ -156,7 +154,7 @@ export const getApplicableStylesForItem = (domainObject, item) => { | ||||
| }; | ||||
|  | ||||
| export const getStylesWithoutNoneValue = (style) => { | ||||
|     if (isEmpty(style) || !style) { | ||||
|     if (_.isEmpty(style) || !style) { | ||||
|         return; | ||||
|     } | ||||
|     let styleObj = {}; | ||||
|   | ||||
| @@ -68,6 +68,7 @@ | ||||
|  | ||||
| <script> | ||||
| import uuid from 'uuid'; | ||||
|  | ||||
| import SubobjectView from './SubobjectView.vue' | ||||
| import TelemetryView from './TelemetryView.vue' | ||||
| import BoxView from './BoxView.vue' | ||||
| @@ -75,7 +76,6 @@ import TextView from './TextView.vue' | ||||
| import LineView from './LineView.vue' | ||||
| import ImageView from './ImageView.vue' | ||||
| import EditMarquee from './EditMarquee.vue' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| const ITEM_TYPE_VIEW_MAP = { | ||||
|     'subobject-view': SubobjectView, | ||||
| @@ -512,7 +512,7 @@ export default { | ||||
|             } | ||||
|         }, | ||||
|         updateTelemetryFormat(item, format) { | ||||
|             let index = this.layoutItems.findIndex(item); | ||||
|             let index = _.findIndex(this.layoutItems, item); | ||||
|             item.format = format; | ||||
|             this.mutate(`configuration.items[${index}]`, item); | ||||
|         } | ||||
|   | ||||
| @@ -40,7 +40,6 @@ | ||||
|  | ||||
| <script> | ||||
| import LayoutDrag from './../LayoutDrag' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|     inject: ['openmct'], | ||||
|   | ||||
| @@ -62,7 +62,6 @@ | ||||
| <script> | ||||
|  | ||||
| import conditionalStylesMixin from "../mixins/objectStyles-mixin"; | ||||
| import _ from 'lodash'; | ||||
|  | ||||
| const START_HANDLE_QUADRANTS = { | ||||
|     1: 'c-frame-edit__handle--sw', | ||||
|   | ||||
| @@ -52,7 +52,7 @@ export default { | ||||
|         }, | ||||
|         initObjectStyles() { | ||||
|             if (!this.styleRuleManager) { | ||||
|                 this.styleRuleManager = new StyleRuleManager(this.objectStyle, this.openmct, this.updateStyle.bind(this), true); | ||||
|                 this.styleRuleManager = new StyleRuleManager(this.objectStyle, this.openmct, this.updateStyle.bind(this)); | ||||
|             } else { | ||||
|                 this.styleRuleManager.updateObjectStyleConfig(this.objectStyle); | ||||
|             } | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| import Layout from './components/DisplayLayout.vue' | ||||
| import Vue from 'vue' | ||||
| import objectUtils from 'objectUtils' | ||||
| import objectUtils from '../../api/objects/object-utils.js' | ||||
| import DisplayLayoutType from './DisplayLayoutType.js' | ||||
| import DisplayLayoutToolbar from './DisplayLayoutToolbar.js' | ||||
| import AlphaNumericFormatViewProvider from './AlphanumericFormatViewProvider.js' | ||||
|   | ||||
| @@ -62,7 +62,6 @@ | ||||
| <script> | ||||
| import FilterField from './FilterField.vue'; | ||||
| import ToggleSwitch from '../../../ui/components/ToggleSwitch.vue'; | ||||
| import isEmpty from 'lodash/isEmpty'; | ||||
|  | ||||
| export default { | ||||
|     inject: ['openmct'], | ||||
| @@ -103,7 +102,7 @@ export default { | ||||
|         hasActiveFilters() { | ||||
|             // Should be true when the user has entered any filter values. | ||||
|             return Object.values(this.persistedFilters).some(comparator => { | ||||
|                 return (typeof(comparator) === 'object' && !isEmpty(comparator)); | ||||
|                 return (typeof(comparator) === 'object' && !_.isEmpty(comparator)); | ||||
|             }); | ||||
|         } | ||||
|     }, | ||||
|   | ||||
| @@ -27,8 +27,7 @@ | ||||
|  | ||||
| <script> | ||||
| import FilterObject from './FilterObject.vue'; | ||||
| import GlobalFilters from './GlobalFilters.vue'; | ||||
| import _ from 'lodash'; | ||||
| import GlobalFilters from './GlobalFilters.vue' | ||||
|  | ||||
| const FILTER_VIEW_TITLE = 'Filters applied'; | ||||
| const FILTER_VIEW_TITLE_MIXED = 'Mixed filters applied'; | ||||
|   | ||||
| @@ -64,7 +64,6 @@ | ||||
| <script> | ||||
| import compositionLoader from './composition-loader'; | ||||
| import ListItem from './ListItem.vue'; | ||||
| import _ from 'lodash'; | ||||
|  | ||||
| export default { | ||||
|     components: {ListItem}, | ||||
|   | ||||
| @@ -220,7 +220,7 @@ export default { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             const index = _.sortedIndexBy(this.imageHistory, datum, this.timeFormat.format.bind(this.timeFormat)); | ||||
|             const index = _.sortedIndex(this.imageHistory, datum, this.timeFormat.format.bind(this.timeFormat)); | ||||
|             this.imageHistory.splice(index, 0, datum); | ||||
|         }, | ||||
|         updateValues(datum) { | ||||
|   | ||||
| @@ -41,7 +41,7 @@ define([], function () { | ||||
|         this.timeFormat = 'local-format'; | ||||
|         this.durationFormat = 'duration'; | ||||
|  | ||||
|         this.isUTCBased = false; | ||||
|         this.isUTCBased = true; | ||||
|     } | ||||
|  | ||||
|     return LocalTimeSystem; | ||||
|   | ||||
| @@ -162,32 +162,19 @@ export default { | ||||
|             }).show(this.embed.snapshot.src); | ||||
|         }, | ||||
|         changeLocation() { | ||||
|             this.openmct.time.stopClock(); | ||||
|             this.openmct.time.bounds({ | ||||
|                 start: this.embed.bounds.start, | ||||
|                 end: this.embed.bounds.end | ||||
|             }); | ||||
|  | ||||
|             const link = this.embed.historicLink; | ||||
|             if (!link) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             const bounds = this.openmct.time.bounds(); | ||||
|             const isTimeBoundChanged = this.embed.bounds.start !== bounds.start | ||||
|                 && this.embed.bounds.end !== bounds.end; | ||||
|             const isFixedTimespanMode = !this.openmct.time.clock(); | ||||
|  | ||||
|             this.openmct.time.stopClock(); | ||||
|             window.location.href = link; | ||||
|  | ||||
|             let message = ''; | ||||
|             if (isTimeBoundChanged) { | ||||
|                 this.openmct.time.bounds({ | ||||
|                     start: this.embed.bounds.start, | ||||
|                     end: this.embed.bounds.end | ||||
|                 }); | ||||
|                 message = 'Time bound values changed'; | ||||
|             } | ||||
|  | ||||
|             if (!isFixedTimespanMode) { | ||||
|                 message = 'Time bound values changed to fixed timespan mode'; | ||||
|             } | ||||
|  | ||||
|             const message = 'Time bounds changed to fixed timespan mode'; | ||||
|             this.openmct.notifications.alert(message); | ||||
|         }, | ||||
|         formatTime(unixTime, timeFormat) { | ||||
|   | ||||
| @@ -221,7 +221,7 @@ export default { | ||||
|             return position; | ||||
|         }, | ||||
|         formatTime(unixTime, timeFormat) { | ||||
|             return Moment.utc(unixTime).format(timeFormat); | ||||
|             return Moment(unixTime).format(timeFormat); | ||||
|         }, | ||||
|         moveSnapshot(snapshotId) { | ||||
|             const snapshot = this.snapshotContainer.getSnapshot(snapshotId); | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
|  | ||||
| <script> | ||||
| import Snapshot from '../snapshot'; | ||||
| import { getDefaultNotebook } from '../utils/notebook-storage'; | ||||
| import { clearDefaultNotebook, getDefaultNotebook } from '../utils/notebook-storage'; | ||||
| import { NOTEBOOK_DEFAULT, NOTEBOOK_SNAPSHOT } from '../notebook-constants'; | ||||
|  | ||||
| export default { | ||||
| @@ -40,18 +40,6 @@ export default { | ||||
|             default() { | ||||
|                 return {}; | ||||
|             } | ||||
|         }, | ||||
|         ignoreLink: { | ||||
|             type: Boolean, | ||||
|             default() { | ||||
|                 return false; | ||||
|             } | ||||
|         }, | ||||
|         objectPath: { | ||||
|             type: Array, | ||||
|             default() { | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     data() { | ||||
| @@ -72,22 +60,28 @@ export default { | ||||
|     methods: { | ||||
|         async setNotebookTypes() { | ||||
|             const notebookTypes = []; | ||||
|             let defaultPath = ''; | ||||
|             const defaultNotebook = getDefaultNotebook(); | ||||
|  | ||||
|             if (defaultNotebook) { | ||||
|                 const domainObject = defaultNotebook.domainObject; | ||||
|                 const domainObject = await this.openmct.objects.get(defaultNotebook.notebookMeta.identifier) | ||||
|                     .then(d => d); | ||||
|  | ||||
|                 if (domainObject.location) { | ||||
|                     const defaultPath = `${domainObject.name} - ${defaultNotebook.section.name} - ${defaultNotebook.page.name}`; | ||||
|  | ||||
|                     notebookTypes.push({ | ||||
|                         cssClass: 'icon-notebook', | ||||
|                         name: `Save to Notebook ${defaultPath}`, | ||||
|                         type: NOTEBOOK_DEFAULT | ||||
|                     }); | ||||
|                 if (!domainObject.location) { | ||||
|                     clearDefaultNotebook(); | ||||
|                 } else { | ||||
|                     defaultPath = `${domainObject.name} - ${defaultNotebook.section.name} - ${defaultNotebook.page.name}`; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (defaultPath.length !== 0) { | ||||
|                 notebookTypes.push({ | ||||
|                     cssClass: 'icon-notebook', | ||||
|                     name: `Save to Notebook ${defaultPath}`, | ||||
|                     type: NOTEBOOK_DEFAULT | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             notebookTypes.push({ | ||||
|                 cssClass: 'icon-notebook', | ||||
|                 name: 'Save to Notebook Snapshots', | ||||
| @@ -103,27 +97,17 @@ export default { | ||||
|             this.showMenu = false; | ||||
|         }, | ||||
|         snapshot(notebook) { | ||||
|             this.hideMenu(); | ||||
|             let element = document.getElementsByClassName("l-shell__main-container")[0]; | ||||
|             const bounds = this.openmct.time.bounds(); | ||||
|             const objectPath = this.openmct.router.path; | ||||
|             const snapshotMeta = { | ||||
|                 bounds, | ||||
|                 link: window.location.href, | ||||
|                 objectPath, | ||||
|                 openmct: this.openmct | ||||
|             }; | ||||
|  | ||||
|             this.$nextTick(() => { | ||||
|                 const element = document.querySelector('.c-overlay__contents') | ||||
|                     || document.getElementsByClassName('l-shell__main-container')[0]; | ||||
|  | ||||
|                 const bounds = this.openmct.time.bounds(); | ||||
|                 const link = !this.ignoreLink | ||||
|                     ? window.location.href | ||||
|                     : null; | ||||
|  | ||||
|                 const objectPath = this.objectPath || this.openmct.router.path; | ||||
|                 const snapshotMeta = { | ||||
|                     bounds, | ||||
|                     link, | ||||
|                     objectPath, | ||||
|                     openmct: this.openmct | ||||
|                 }; | ||||
|  | ||||
|                 this.notebookSnapshot.capture(snapshotMeta, notebook.type, element); | ||||
|             }); | ||||
|             this.notebookSnapshot.capture(snapshotMeta, notebook.type, element); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -239,7 +239,6 @@ export default { | ||||
|             const section = this.getSelectedSection(); | ||||
|  | ||||
|             return { | ||||
|                 domainObject: this.internalDomainObject, | ||||
|                 notebookMeta, | ||||
|                 section, | ||||
|                 page | ||||
| @@ -441,7 +440,7 @@ export default { | ||||
|         async updateDefaultNotebook(notebookStorage) { | ||||
|             const defaultNotebookObject = await this.getDefaultNotebookObject(); | ||||
|             this.removeDefaultClass(defaultNotebookObject); | ||||
|             setDefaultNotebook(this.openmct, notebookStorage); | ||||
|             setDefaultNotebook(notebookStorage); | ||||
|             this.addDefaultClass(); | ||||
|             this.defaultSectionId = notebookStorage.section.id; | ||||
|             this.defaultPageId = notebookStorage.page.id; | ||||
| @@ -496,7 +495,7 @@ export default { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (id !== defaultNotebookSection.id) { | ||||
|             if (section.id !== defaultNotebookSection.id) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -1,46 +1,6 @@ | ||||
| const NOTEBOOK_LOCAL_STORAGE = 'notebook-storage'; | ||||
| let currentNotebookObject = null; | ||||
| let unlisten = null; | ||||
|  | ||||
| function defaultNotebookObjectChanged(newDomainObject) { | ||||
|     if (newDomainObject.location !== null) { | ||||
|         currentNotebookObject = newDomainObject; | ||||
|         const notebookStorage = getDefaultNotebook(); | ||||
|         notebookStorage.domainObject = newDomainObject; | ||||
|         saveDefaultNotebook(notebookStorage); | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (unlisten) { | ||||
|         unlisten(); | ||||
|         unlisten = null; | ||||
|     } | ||||
|  | ||||
|     clearDefaultNotebook(); | ||||
| } | ||||
|  | ||||
| function observeDefaultNotebookObject(openmct, notebookStorage) { | ||||
|     const domainObject = notebookStorage.domainObject; | ||||
|     if (currentNotebookObject | ||||
|             && currentNotebookObject.identifier.key === domainObject.identifier.key) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (unlisten) { | ||||
|         unlisten(); | ||||
|         unlisten = null; | ||||
|     } | ||||
|  | ||||
|     unlisten = openmct.objects.observe(notebookStorage.domainObject, '*', defaultNotebookObjectChanged); | ||||
| } | ||||
|  | ||||
| function saveDefaultNotebook(notebookStorage) { | ||||
|     window.localStorage.setItem(NOTEBOOK_LOCAL_STORAGE, JSON.stringify(notebookStorage)); | ||||
| } | ||||
|  | ||||
| export function clearDefaultNotebook() { | ||||
|     currentNotebookObject = null; | ||||
|     window.localStorage.setItem(NOTEBOOK_LOCAL_STORAGE, null); | ||||
| } | ||||
|  | ||||
| @@ -50,21 +10,20 @@ export function getDefaultNotebook() { | ||||
|     return JSON.parse(notebookStorage); | ||||
| } | ||||
|  | ||||
| export function setDefaultNotebook(openmct, notebookStorage) { | ||||
|     observeDefaultNotebookObject(openmct, notebookStorage); | ||||
|     saveDefaultNotebook(notebookStorage); | ||||
| export function setDefaultNotebook(notebookStorage) { | ||||
|     window.localStorage.setItem(NOTEBOOK_LOCAL_STORAGE, JSON.stringify(notebookStorage)); | ||||
| } | ||||
|  | ||||
| export function setDefaultNotebookSection(section) { | ||||
|     const notebookStorage = getDefaultNotebook(); | ||||
|  | ||||
|     notebookStorage.section = section; | ||||
|     saveDefaultNotebook(notebookStorage); | ||||
|     window.localStorage.setItem(NOTEBOOK_LOCAL_STORAGE, JSON.stringify(notebookStorage)); | ||||
|  | ||||
| } | ||||
|  | ||||
| export function setDefaultNotebookPage(page) { | ||||
|     const notebookStorage = getDefaultNotebook(); | ||||
|     notebookStorage.page = page; | ||||
|     saveDefaultNotebook(notebookStorage); | ||||
|     window.localStorage.setItem(NOTEBOOK_LOCAL_STORAGE, JSON.stringify(notebookStorage)); | ||||
| } | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
| --> | ||||
| <div ng-controller="StackedPlotController as stackedPlot" | ||||
|       class="c-plot c-plot--stacked holder holder-plot has-control-bar"> | ||||
|     <div class="c-control-bar" ng-show="!stackedPlot.hideExportButtons"> | ||||
|     <div class="l-control-bar" ng-show="!stackedPlot.hideExportButtons"> | ||||
|        <span class="c-button-set c-button-set--strip-h"> | ||||
|           <button class="c-button icon-download" | ||||
|              ng-click="stackedPlot.exportPNG()" | ||||
|   | ||||
| @@ -54,29 +54,27 @@ function ( | ||||
|      * @constructor | ||||
|      */ | ||||
|     function MCTChartController($scope) { | ||||
|         this.$onInit = () => { | ||||
|             this.$scope = $scope; | ||||
|             this.isDestroyed = false; | ||||
|             this.lines = []; | ||||
|             this.pointSets = []; | ||||
|             this.alarmSets = []; | ||||
|             this.offset = {}; | ||||
|             this.config = $scope.config; | ||||
|             this.listenTo(this.$scope, '$destroy', this.destroy, this); | ||||
|             this.draw = this.draw.bind(this); | ||||
|             this.scheduleDraw = this.scheduleDraw.bind(this); | ||||
|             this.seriesElements = new WeakMap(); | ||||
|         this.$scope = $scope; | ||||
|         this.isDestroyed = false; | ||||
|         this.lines = []; | ||||
|         this.pointSets = []; | ||||
|         this.alarmSets = []; | ||||
|         this.offset = {}; | ||||
|         this.config = $scope.config; | ||||
|         this.listenTo(this.$scope, '$destroy', this.destroy, this); | ||||
|         this.draw = this.draw.bind(this); | ||||
|         this.scheduleDraw = this.scheduleDraw.bind(this); | ||||
|         this.seriesElements = new WeakMap(); | ||||
|  | ||||
|             this.listenTo(this.config.series, 'add', this.onSeriesAdd, this); | ||||
|             this.listenTo(this.config.series, 'remove', this.onSeriesRemove, this); | ||||
|             this.listenTo(this.config.yAxis, 'change:key', this.clearOffset, this); | ||||
|             this.listenTo(this.config.xAxis, 'change:key', this.clearOffset, this); | ||||
|             this.listenTo(this.config.yAxis, 'change', this.scheduleDraw); | ||||
|             this.listenTo(this.config.xAxis, 'change', this.scheduleDraw); | ||||
|             this.$scope.$watch('highlights', this.scheduleDraw); | ||||
|             this.$scope.$watch('rectangles', this.scheduleDraw); | ||||
|             this.config.series.forEach(this.onSeriesAdd, this); | ||||
|         } | ||||
|         this.listenTo(this.config.series, 'add', this.onSeriesAdd, this); | ||||
|         this.listenTo(this.config.series, 'remove', this.onSeriesRemove, this); | ||||
|         this.listenTo(this.config.yAxis, 'change:key', this.clearOffset, this); | ||||
|         this.listenTo(this.config.xAxis, 'change:key', this.clearOffset, this); | ||||
|         this.listenTo(this.config.yAxis, 'change', this.scheduleDraw); | ||||
|         this.listenTo(this.config.xAxis, 'change', this.scheduleDraw); | ||||
|         this.$scope.$watch('highlights', this.scheduleDraw); | ||||
|         this.$scope.$watch('rectangles', this.scheduleDraw); | ||||
|         this.config.series.forEach(this.onSeriesAdd, this); | ||||
|     } | ||||
|  | ||||
|     eventHelpers.extend(MCTChartController.prototype); | ||||
| @@ -152,7 +150,7 @@ function ( | ||||
|     MCTChartController.prototype.destroy = function () { | ||||
|         this.isDestroyed = true; | ||||
|         this.stopListening(); | ||||
|         this.lines.forEach(line => line.destroy()); | ||||
|         _.invoke(this.lines, 'destroy'); | ||||
|         DrawLoader.releaseDrawAPI(this.drawAPI); | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -44,7 +44,7 @@ define([ | ||||
|         this.initialize(options); | ||||
|     } | ||||
|  | ||||
|     Object.assign(Collection.prototype, EventEmitter.prototype); | ||||
|     _.extend(Collection.prototype, EventEmitter.prototype); | ||||
|     eventHelpers.extend(Collection.prototype); | ||||
|  | ||||
|     Collection.extend = extend; | ||||
| @@ -105,7 +105,12 @@ define([ | ||||
|     }; | ||||
|  | ||||
|     Collection.prototype.indexOf = function (model) { | ||||
|         return this.models.findIndex(m => m === model); | ||||
|         return _.findIndex( | ||||
|             this.models, | ||||
|             function (m) { | ||||
|                 return m === model; | ||||
|             } | ||||
|         ); | ||||
|     }; | ||||
|  | ||||
|     Collection.prototype.remove = function (model) { | ||||
|   | ||||
| @@ -49,7 +49,7 @@ define([ | ||||
|         this.initialize(options); | ||||
|     } | ||||
|  | ||||
|     Object.assign(Model.prototype, EventEmitter.prototype); | ||||
|     _.extend(Model.prototype, EventEmitter.prototype); | ||||
|     eventHelpers.extend(Model.prototype); | ||||
|  | ||||
|     Model.extend = extend; | ||||
|   | ||||
| @@ -146,7 +146,7 @@ define([ | ||||
|                 strategy = 'minmax'; | ||||
|             } | ||||
|  | ||||
|             options = Object.assign({}, { size: 1000, strategy, filters: this.filters }, options || {}); | ||||
|             options = _.extend({}, { size: 1000, strategy, filters: this.filters }, options || {}); | ||||
|  | ||||
|             if (!this.unsubscribe) { | ||||
|                 this.unsubscribe = this.openmct | ||||
| @@ -160,7 +160,6 @@ define([ | ||||
|                     ); | ||||
|             } | ||||
|  | ||||
|             /* eslint-disable you-dont-need-lodash-underscore/concat */ | ||||
|             return this.openmct | ||||
|                 .telemetry | ||||
|                 .request(this.domainObject, options) | ||||
| @@ -172,7 +171,6 @@ define([ | ||||
|                         .value(); | ||||
|                     this.reset(newPoints); | ||||
|                 }.bind(this)); | ||||
|             /* eslint-enable you-dont-need-lodash-underscore/concat */ | ||||
|         }, | ||||
|         /** | ||||
|          * Update x formatter on x change. | ||||
| @@ -272,7 +270,7 @@ define([ | ||||
|          * @private | ||||
|          */ | ||||
|         sortedIndex: function (point) { | ||||
|             return _.sortedIndexBy(this.data, point, this.getXVal); | ||||
|             return _.sortedIndex(this.data, point, this.getXVal); | ||||
|         }, | ||||
|         /** | ||||
|          * Update min/max stats for the series. | ||||
| @@ -324,7 +322,15 @@ define([ | ||||
|          *                  a point to the end without dupe checking. | ||||
|          */ | ||||
|         add: function (point, appendOnly) { | ||||
|             var insertIndex = this.data.length; | ||||
|             var insertIndex = this.data.length, | ||||
|                 currentYVal = this.getYVal(point), | ||||
|                 lastYVal = this.getYVal(this.data[insertIndex - 1]); | ||||
|  | ||||
|             if (this.isValueInvalid(currentYVal) && this.isValueInvalid(lastYVal)) { | ||||
|                 console.warn('[Plot] Invalid Y Values detected'); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (!appendOnly) { | ||||
|                 insertIndex = this.sortedIndex(point); | ||||
|                 if (this.getXVal(this.data[insertIndex]) === this.getXVal(point)) { | ||||
| @@ -334,11 +340,21 @@ define([ | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             this.updateStats(point); | ||||
|             point.mctLimitState = this.evaluate(point); | ||||
|             this.data.splice(insertIndex, 0, point); | ||||
|             this.emit('add', point, insertIndex, this); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @private | ||||
|          */ | ||||
|         isValueInvalid: function (val) { | ||||
|             return Number.isNaN(val) || val === undefined; | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Remove a point from the data array and notify listeners. | ||||
|          * @private | ||||
|   | ||||
| @@ -101,11 +101,11 @@ define([ | ||||
|             var plotObject = this.plot.get('domainObject'); | ||||
|             if (plotObject.type === 'telemetry.plot.overlay') { | ||||
|  | ||||
|                 var persistedIndex = plotObject.configuration.series.findIndex(s => { | ||||
|                 var persistedIndex = _.findIndex(plotObject.configuration.series, function (s) { | ||||
|                     return _.isEqual(identifier, s.identifier); | ||||
|                 }); | ||||
|  | ||||
|                 var configIndex = this.models.findIndex(m => { | ||||
|                 var configIndex = _.findIndex(this.models, function (m) { | ||||
|                     return _.isEqual(m.domainObject.identifier, identifier); | ||||
|                 }); | ||||
|  | ||||
|   | ||||
| @@ -182,21 +182,6 @@ define([ | ||||
|             this.set('format', yFormat.format.bind(yFormat)); | ||||
|             this.set('values', yMetadata.values); | ||||
|             if (!label) { | ||||
|                 var labelUnits = series.map(function (s) { | ||||
|                     return s.metadata.value(s.get('yKey')).units; | ||||
|                 }).reduce(function (a, b) { | ||||
|                     if (a === undefined) { | ||||
|                         return b; | ||||
|                     } | ||||
|                     if (a === b) { | ||||
|                         return a; | ||||
|                     } | ||||
|                     return ''; | ||||
|                 }, undefined); | ||||
|                 if (labelUnits) { | ||||
|                     this.set('label', labelUnits); | ||||
|                     return; | ||||
|                 } | ||||
|                 var labelName = series.map(function (s) { | ||||
|                     return s.metadata.value(s.get('yKey')).name; | ||||
|                 }).reduce(function (a, b) { | ||||
| @@ -208,7 +193,28 @@ define([ | ||||
|                     } | ||||
|                     return ''; | ||||
|                 }, undefined); | ||||
|                 this.set('label', labelName); | ||||
|  | ||||
|                 if (labelName) { | ||||
|                     this.set('label', labelName); | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 var labelUnits = series.map(function (s) { | ||||
|                     return s.metadata.value(s.get('yKey')).units; | ||||
|                 }).reduce(function (a, b) { | ||||
|                     if (a === undefined) { | ||||
|                         return b; | ||||
|                     } | ||||
|                     if (a === b) { | ||||
|                         return a; | ||||
|                     } | ||||
|                     return ''; | ||||
|                 }, undefined); | ||||
|  | ||||
|                 if (labelUnits) { | ||||
|                     this.set('label', labelUnits); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         defaults: function (options) { | ||||
|   | ||||
| @@ -51,7 +51,7 @@ define([ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Object.assign(Draw2D.prototype, EventEmitter.prototype); | ||||
|     _.extend(Draw2D.prototype, EventEmitter.prototype); | ||||
|     eventHelpers.extend(Draw2D.prototype); | ||||
|  | ||||
|     // Convert from logical to physical x coordinates | ||||
|   | ||||
| @@ -78,7 +78,7 @@ define([ | ||||
|         this.listenTo(this.canvas, "webglcontextlost", this.onContextLost, this); | ||||
|     } | ||||
|  | ||||
|     Object.assign(DrawWebGL.prototype, EventEmitter.prototype); | ||||
|     _.extend(DrawWebGL.prototype, EventEmitter.prototype); | ||||
|     eventHelpers.extend(DrawWebGL.prototype); | ||||
|  | ||||
|     DrawWebGL.prototype.onContextLost = function (event) { | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| define([ | ||||
|     '../configuration/configStore', | ||||
|     '../lib/eventHelpers', | ||||
|     'objectUtils', | ||||
|     '../../../../api/objects/object-utils', | ||||
|     'lodash' | ||||
| ], function ( | ||||
|     configStore, | ||||
|   | ||||
| @@ -31,7 +31,7 @@ define([ | ||||
|     function dynamicPathForKey(key) { | ||||
|         return function (object, model) { | ||||
|             var modelIdentifier = model.get('identifier'); | ||||
|             var index = object.configuration.series.findIndex(s => { | ||||
|             var index = _.findIndex(object.configuration.series, function (s) { | ||||
|                 return _.isEqual(s.identifier, modelIdentifier); | ||||
|             }); | ||||
|             return 'configuration.series[' + index + '].' + key; | ||||
|   | ||||
| @@ -73,10 +73,10 @@ define([ | ||||
|                     if (range.max === '' || range.max === null || typeof range.max === 'undefined') { | ||||
|                         return 'Must specify Maximum'; | ||||
|                     } | ||||
|                     if (Number.isNaN(Number(range.min))) { | ||||
|                     if (_.isNaN(Number(range.min))) { | ||||
|                         return 'Minimum must be a number.'; | ||||
|                     } | ||||
|                     if (Number.isNaN(Number(range.max))) { | ||||
|                     if (_.isNaN(Number(range.max))) { | ||||
|                         return 'Maximum must be a number.'; | ||||
|                     } | ||||
|                     if (Number(range.min) > Number(range.max)) { | ||||
|   | ||||
| @@ -34,27 +34,25 @@ define([ | ||||
|      * values near the cursor. | ||||
|      */ | ||||
|     function MCTPlotController($scope, $element, $window) { | ||||
|         this.$onInit = () => { | ||||
|             this.$scope = $scope; | ||||
|             this.$scope.config = this.config; | ||||
|             this.$scope.plot = this; | ||||
|             this.$element = $element; | ||||
|             this.$window = $window; | ||||
|         this.$scope = $scope; | ||||
|         this.$scope.config = this.config; | ||||
|         this.$scope.plot = this; | ||||
|         this.$element = $element; | ||||
|         this.$window = $window; | ||||
|  | ||||
|             this.xScale = new LinearScale(this.config.xAxis.get('displayRange')); | ||||
|             this.yScale = new LinearScale(this.config.yAxis.get('displayRange')); | ||||
|         this.xScale = new LinearScale(this.config.xAxis.get('displayRange')); | ||||
|         this.yScale = new LinearScale(this.config.yAxis.get('displayRange')); | ||||
|  | ||||
|             this.pan = undefined; | ||||
|             this.marquee = undefined; | ||||
|         this.pan = undefined; | ||||
|         this.marquee = undefined; | ||||
|  | ||||
|             this.chartElementBounds = undefined; | ||||
|             this.tickUpdate = false; | ||||
|         this.chartElementBounds = undefined; | ||||
|         this.tickUpdate = false; | ||||
|  | ||||
|             this.$scope.plotHistory = this.plotHistory = []; | ||||
|             this.listenTo(this.$scope, 'plot:clearHistory', this.clear, this); | ||||
|         this.$scope.plotHistory = this.plotHistory = []; | ||||
|         this.listenTo(this.$scope, 'plot:clearHistory', this.clear, this); | ||||
|  | ||||
|             this.initialize(); | ||||
|         } | ||||
|         this.initialize(); | ||||
|     } | ||||
|  | ||||
|     MCTPlotController.$inject = ['$scope', '$element', '$window']; | ||||
|   | ||||
| @@ -114,17 +114,15 @@ define([ | ||||
|     } | ||||
|  | ||||
|     function MCTTicksController($scope, $element) { | ||||
|         this.$onInit = () => { | ||||
|             this.$scope = $scope; | ||||
|             this.$element = $element; | ||||
|         this.$scope = $scope; | ||||
|         this.$element = $element; | ||||
|  | ||||
|             this.tickCount = 4; | ||||
|             this.tickUpdate = false; | ||||
|             this.listenTo(this.axis, 'change:displayRange', this.updateTicks, this); | ||||
|             this.listenTo(this.axis, 'change:format', this.updateTicks, this); | ||||
|             this.listenTo(this.$scope, '$destroy', this.stopListening, this); | ||||
|             this.updateTicks(); | ||||
|         } | ||||
|         this.tickCount = 4; | ||||
|         this.tickUpdate = false; | ||||
|         this.listenTo(this.axis, 'change:displayRange', this.updateTicks, this); | ||||
|         this.listenTo(this.axis, 'change:format', this.updateTicks, this); | ||||
|         this.listenTo(this.$scope, '$destroy', this.stopListening, this); | ||||
|         this.updateTicks(); | ||||
|     } | ||||
|  | ||||
|     MCTTicksController.$inject = ['$scope', '$element']; | ||||
|   | ||||
| @@ -81,8 +81,7 @@ define( | ||||
|                         clonedElement.classList.add(className); | ||||
|                     } | ||||
|                     element.id = oldId; | ||||
|                 }, | ||||
|                 removeContainer: true // Set to false to debug what html2canvas renders | ||||
|                 } | ||||
|             }).then(function (canvas) { | ||||
|                 dialog.dismiss(); | ||||
|                 return new Promise(function (resolve, reject) { | ||||
|   | ||||
| @@ -227,9 +227,8 @@ define([ | ||||
|     }; | ||||
|  | ||||
|     PlotController.prototype.stopLoading = function () { | ||||
|         this.$scope.$evalAsync(() => { | ||||
|             this.$scope.pending -= 1; | ||||
|         }); | ||||
|         this.$scope.pending -= 1; | ||||
|         this.$scope.$digest(); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -76,7 +76,7 @@ define([ | ||||
|                 if (childObj) { | ||||
|                     var index = telemetryObjects.indexOf(childObj); | ||||
|                     telemetryObjects.splice(index, 1); | ||||
|                     $scope.$broadcast('plot:tickWidth', Math.max(...Object.values(tickWidthMap))); | ||||
|                     $scope.$broadcast('plot:tickWidth', _.max(tickWidthMap)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -88,8 +88,7 @@ define([ | ||||
|     var bundleMap = { | ||||
|         LocalStorage: 'platform/persistence/local', | ||||
|         MyItems: 'platform/features/my-items', | ||||
|         CouchDB: 'platform/persistence/couch', | ||||
|         Elasticsearch: 'platform/persistence/elastic' | ||||
|         CouchDB: 'platform/persistence/couch' | ||||
|     }; | ||||
|  | ||||
|     var plugins = _.mapValues(bundleMap, function (bundleName, pluginName) { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| define([ | ||||
|     'objectUtils' | ||||
|     '../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     objectUtils | ||||
| ) { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| define ([ | ||||
|     './ConditionEvaluator', | ||||
|     'objectUtils', | ||||
|     '../../../api/objects/object-utils', | ||||
|     'EventEmitter', | ||||
|     'zepto', | ||||
|     'lodash' | ||||
| @@ -9,8 +9,7 @@ define ([ | ||||
|     objectUtils, | ||||
|     EventEmitter, | ||||
|     $, | ||||
|     _, | ||||
|  | ||||
|     _ | ||||
| ) { | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -5,7 +5,7 @@ define([ | ||||
|     './TestDataManager', | ||||
|     './WidgetDnD', | ||||
|     './eventHelpers', | ||||
|     'objectUtils', | ||||
|     '../../../api/objects/object-utils', | ||||
|     'lodash', | ||||
|     'zepto' | ||||
| ], function ( | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| define([ | ||||
|     './Select', | ||||
|     'objectUtils' | ||||
|     '../../../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     Select, | ||||
|     objectUtils | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
|  | ||||
| define([ | ||||
|     './SummaryWidgetEvaluator', | ||||
|     'objectUtils' | ||||
|     '../../../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     SummaryWidgetEvaluator, | ||||
|     objectUtils | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| define([ | ||||
|     './SummaryWidgetRule', | ||||
|     '../eventHelpers', | ||||
|     'objectUtils', | ||||
|     '../../../../api/objects/object-utils', | ||||
|     'lodash' | ||||
| ], function ( | ||||
|     SummaryWidgetRule, | ||||
| @@ -80,12 +80,10 @@ define([ | ||||
|                     } | ||||
|                 }.bind(this); | ||||
|  | ||||
|                 /* eslint-disable you-dont-need-lodash-underscore/map */ | ||||
|                 unsubscribes = _.map( | ||||
|                     realtimeStates, | ||||
|                     this.subscribeToObjectState.bind(this, updateCallback) | ||||
|                 ); | ||||
|                 /* eslint-enable you-dont-need-lodash-underscore/map */ | ||||
|             }.bind(this)); | ||||
|  | ||||
|         return function () { | ||||
| @@ -153,13 +151,11 @@ define([ | ||||
|     SummaryWidgetEvaluator.prototype.getBaseStateClone = function () { | ||||
|         return this.load() | ||||
|             .then(function () { | ||||
|                 /* eslint-disable you-dont-need-lodash-underscore/values */ | ||||
|                 return _(this.baseState) | ||||
|                     .values() | ||||
|                     .map(_.clone) | ||||
|                     .keyBy('id') | ||||
|                     .indexBy('id') | ||||
|                     .value(); | ||||
|                 /* eslint-enable you-dont-need-lodash-underscore/values */ | ||||
|             }.bind(this)); | ||||
|     }; | ||||
|  | ||||
| @@ -186,7 +182,7 @@ define([ | ||||
|      * @private. | ||||
|      */ | ||||
|     SummaryWidgetEvaluator.prototype.updateObjectStateFromLAD = function (options, objectState) { | ||||
|         options = Object.assign({}, options, { | ||||
|         options = _.extend({}, options, { | ||||
|             strategy: 'latest', | ||||
|             size: 1 | ||||
|         }); | ||||
| @@ -259,12 +255,10 @@ define([ | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /* eslint-disable you-dont-need-lodash-underscore/map */ | ||||
|         var latestTimestamp = _(state) | ||||
|             .map('timestamps') | ||||
|             .sortBy(timestampKey) | ||||
|             .last(); | ||||
|         /* eslint-enable you-dont-need-lodash-underscore/map */ | ||||
|  | ||||
|         if (!latestTimestamp) { | ||||
|             latestTimestamp = {}; | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| define([ | ||||
|     '../SummaryWidget', | ||||
|     './SummaryWidgetView', | ||||
|     'objectUtils' | ||||
|     '../../../../api/objects/object-utils' | ||||
| ], function ( | ||||
|     SummaryWidgetEditView, | ||||
|     SummaryWidgetView, | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
| /*jshint latedef: nofunc */ | ||||
| /*global console */ | ||||
| define([ | ||||
|     'objectUtils', | ||||
|     '../../../api/objects/object-utils', | ||||
|     './TelemetryAverager' | ||||
| ], function (objectUtils, TelemetryAverager) { | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'objectUtils', | ||||
|     '../../api/objects/object-utils', | ||||
|     './components/table-configuration.vue', | ||||
|     './TelemetryTableConfiguration', | ||||
|     'vue' | ||||
|   | ||||
| @@ -100,7 +100,7 @@ define([ | ||||
|  | ||||
|         hasColumnWithKey(columnKey) { | ||||
|             return _.flatten(Object.values(this.columns)) | ||||
|                 .some(column => column.getKey() === columnKey); | ||||
|                 .findIndex(column => column.getKey() === columnKey) !== -1; | ||||
|         } | ||||
|  | ||||
|         getColumns() { | ||||
| @@ -109,10 +109,9 @@ define([ | ||||
|  | ||||
|         getAllHeaders() { | ||||
|             let flattenedColumns = _.flatten(Object.values(this.columns)); | ||||
|             /* eslint-disable you-dont-need-lodash-underscore/uniq */ | ||||
|             let headers = _.uniq(flattenedColumns, false, column => column.getKey()) | ||||
|                 .reduce(fromColumnsToHeadersMap, {}); | ||||
|             /* eslint-enable you-dont-need-lodash-underscore/uniq */ | ||||
|  | ||||
|             function fromColumnsToHeadersMap(headersMap, column) { | ||||
|                 headersMap[column.getKey()] = column.getTitle(); | ||||
|                 return headersMap; | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user