Compare commits
	
		
			7 Commits
		
	
	
		
			mmgis-cust
			...
			revert-402
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 8f8d902172 | ||
|   | 1f5cb7ca42 | ||
|   | 4a7ebe326c | ||
|   | 10da314a4a | ||
|   | b3ceccd7fb | ||
|   | 1bde4c9a0c | ||
|   | 4b85360446 | 
| @@ -1,36 +1,69 @@ | ||||
| version: 2 | ||||
| jobs: | ||||
|   build: | ||||
| version: 2.1 | ||||
| executors: | ||||
|   linux: | ||||
|     docker: | ||||
|         - image: circleci/node:13-browsers | ||||
|           environment: | ||||
|             CHROME_BIN: "/usr/bin/google-chrome" | ||||
|     steps: | ||||
|         - checkout | ||||
|         - run: | ||||
|             name: Update npm | ||||
|             command: 'sudo npm install -g npm@latest' | ||||
|         - restore_cache: | ||||
|             key: dependency-cache-{{ checksum "package.json" }} | ||||
|         - run: | ||||
|             name: Installing dependencies (npm install) | ||||
|             command: npm install | ||||
|         - save_cache: | ||||
|             key: dependency-cache-{{ checksum "package.json" }} | ||||
|             paths: | ||||
|               - node_modules | ||||
|         - run: | ||||
|             name: npm run test:coverage | ||||
|             command: npm run test:coverage | ||||
|         - run: | ||||
|             name: npm run lint | ||||
|             command: npm run lint | ||||
|         - store_artifacts: | ||||
|             path: dist | ||||
|             prefix: dist | ||||
|  | ||||
| workflows: | ||||
|   version: 2 | ||||
|       - image: cimg/base:stable | ||||
| orbs: | ||||
|   node: circleci/node@4.5.1 | ||||
|   browser-tools: circleci/browser-tools@1.1.3 | ||||
| jobs: | ||||
|   test: | ||||
|     parameters: | ||||
|       node-version: | ||||
|         type: string | ||||
|       browser: | ||||
|         type: string | ||||
|       always-pass: | ||||
|         type: boolean   | ||||
|     executor: linux | ||||
|     steps: | ||||
|       - checkout | ||||
|       - restore_cache: | ||||
|           key: deps-{{ .Branch }}--<< parameters.node-version >>--{{ checksum "package.json" }} | ||||
|       - node/install: | ||||
|           node-version: << parameters.node-version >> | ||||
|       - node/install-packages: | ||||
|           override-ci-command: npm install | ||||
|       - when: # Just to save time until caching saves the browser bin | ||||
|           condition: | ||||
|             equal: [ "FirefoxESR", <<parameters.browser>> ] | ||||
|           steps: | ||||
|             - browser-tools/install-firefox: | ||||
|                 version: "78.11.0esr" #https://archive.mozilla.org/pub/firefox/releases/           | ||||
|       - when: # Just to save time until caching saves the browser bin | ||||
|           condition: | ||||
|             equal: [ "ChromeHeadless", <<parameters.browser>> ] | ||||
|           steps: | ||||
|             - browser-tools/install-chrome: | ||||
|                 replace-existing: false | ||||
|       - save_cache: | ||||
|           key: deps-{{ .Branch }}--<< parameters.node-version >>--{{ checksum "package.json" }} | ||||
|           paths: | ||||
|             - ~/.npm | ||||
|             - ~/.cache | ||||
|             - node_modules | ||||
|       - run: npm run test:coverage -- --browsers=<<parameters.browser>> || <<parameters.always-pass>> | ||||
|       - store_test_results: | ||||
|           path: dist/reports/tests/ | ||||
|       - store_artifacts: | ||||
|           path: dist/reports/ | ||||
| workflows: | ||||
|   matrix-tests: | ||||
|     jobs: | ||||
|       - build | ||||
|       - test: | ||||
|           name: node10-chrome | ||||
|           node-version: lts/dubnium | ||||
|           browser: ChromeHeadless | ||||
|           always-pass: false | ||||
|       - test: | ||||
|           name: node12-firefoxESR | ||||
|           node-version: lts/erbium | ||||
|           browser: FirefoxESR | ||||
|           always-pass: true | ||||
|       - test: | ||||
|           name: node14-chrome | ||||
|           node-version: lts/fermium | ||||
|           browser: ChromeHeadless | ||||
|           always-pass: true | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/lighthouse.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/lighthouse.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,6 +13,8 @@ jobs: | ||||
|       - uses: actions/checkout@v2 | ||||
|         with: | ||||
|           ref: ${{ github.event.inputs.version }} | ||||
|       - uses: actions/setup-node@v1 | ||||
|       - uses: actions/setup-node@v2 | ||||
|         with: | ||||
|           node-version: '14' | ||||
|       - run: npm install && npm install -g @lhci/cli #Don't want to include this in our deps | ||||
|       - run: lhci autorun | ||||
| @@ -23,9 +23,9 @@ | ||||
| /*global module,process*/ | ||||
|  | ||||
| const devMode = process.env.NODE_ENV !== 'production'; | ||||
| const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'FirefoxHeadless']; | ||||
| const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'ChromeHeadless']; | ||||
| const coverageEnabled = process.env.COVERAGE === 'true'; | ||||
| const reporters = ['progress', 'html']; | ||||
| const reporters = ['progress', 'html', 'junit']; | ||||
|  | ||||
| if (coverageEnabled) { | ||||
|     reporters.push('coverage-istanbul'); | ||||
| @@ -59,7 +59,8 @@ module.exports = (config) => { | ||||
|         browsers: browsers, | ||||
|         client: { | ||||
|             jasmine: { | ||||
|                 random: false | ||||
|                 random: false, | ||||
|                 timeoutInterval: 30000 | ||||
|             } | ||||
|         }, | ||||
|         customLaunchers: { | ||||
| @@ -67,6 +68,10 @@ module.exports = (config) => { | ||||
|                 base: 'Chrome', | ||||
|                 flags: ['--remote-debugging-port=9222'], | ||||
|                 debug: true | ||||
|             }, | ||||
|             FirefoxESR: { | ||||
|                 base: 'FirefoxHeadless', | ||||
|                 name: 'FirefoxESR' | ||||
|             } | ||||
|         }, | ||||
|         colors: true, | ||||
| @@ -78,12 +83,21 @@ module.exports = (config) => { | ||||
|             preserveDescribeNesting: true, | ||||
|             foldAll: false | ||||
|         }, | ||||
|         browserConsoleLogOptions: { level: "error",  format: "%b %T: %m",  terminal: true }, | ||||
|         junitReporter: { | ||||
|             outputDir: "dist/reports/tests", | ||||
|             outputFile: "test-results.xml", | ||||
|             useBrowserName: false | ||||
|         }, | ||||
|         browserConsoleLogOptions: { | ||||
|             level: "error", | ||||
|             format: "%b %T: %m", | ||||
|             terminal: true | ||||
|         }, | ||||
|         coverageIstanbulReporter: { | ||||
|             fixWebpackSourcePaths: true, | ||||
|             dir: process.env.CIRCLE_ARTIFACTS ? | ||||
|                 process.env.CIRCLE_ARTIFACTS + '/coverage' : | ||||
|                 "dist/reports/coverage", | ||||
|             dir: process.env.CIRCLE_ARTIFACTS | ||||
|                 ? process.env.CIRCLE_ARTIFACTS + '/coverage' | ||||
|                 : "dist/reports/coverage", | ||||
|             reports: ['html', 'lcovonly', 'text-summary'], | ||||
|             thresholds: { | ||||
|                 global: { | ||||
|   | ||||
							
								
								
									
										19
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								package.json
									
									
									
									
									
								
							| @@ -2,9 +2,7 @@ | ||||
|   "name": "openmct", | ||||
|   "version": "1.7.4", | ||||
|   "description": "The Open MCT core platform", | ||||
|   "dependencies": { | ||||
|     "openmct-mmgis": "git+https://trunk.arc.nasa.gov/bitbucket/scm/vipergds/openmct-mmgis.git#api-mmgis-inspector" | ||||
|   }, | ||||
|   "dependencies": {}, | ||||
|   "devDependencies": { | ||||
|     "angular": ">=1.8.0", | ||||
|     "angular-route": "1.4.14", | ||||
| @@ -39,17 +37,18 @@ | ||||
|     "html2canvas": "^1.0.0-rc.7", | ||||
|     "imports-loader": "^0.8.0", | ||||
|     "istanbul-instrumenter-loader": "^3.0.1", | ||||
|     "jasmine-core": "^3.1.0", | ||||
|     "jasmine-core": "^3.7.1", | ||||
|     "jsdoc": "^3.3.2", | ||||
|     "karma": "5.1.1", | ||||
|     "karma": "6.3.4", | ||||
|     "karma-chrome-launcher": "3.1.0", | ||||
|     "karma-firefox-launcher": "2.1.0", | ||||
|     "karma-cli": "2.0.0", | ||||
|     "karma-coverage": "2.0.3", | ||||
|     "karma-coverage-istanbul-reporter": "3.0.3", | ||||
|     "karma-firefox-launcher": "1.3.0", | ||||
|     "karma-junit-reporter": "2.0.1", | ||||
|     "karma-html-reporter": "0.2.7", | ||||
|     "karma-jasmine": "3.3.1", | ||||
|     "karma-sourcemap-loader": "0.3.7", | ||||
|     "karma-jasmine": "4.0.1", | ||||
|     "karma-sourcemap-loader": "0.3.8", | ||||
|     "karma-webpack": "4.0.2", | ||||
|     "location-bar": "^3.0.1", | ||||
|     "lodash": "^4.17.12", | ||||
| @@ -91,6 +90,7 @@ | ||||
|     "test": "cross-env NODE_OPTIONS=\"--max_old_space_size=4096\" karma start --single-run", | ||||
|     "test:debug": "cross-env NODE_ENV=debug karma start --no-single-run", | ||||
|     "test:coverage": "cross-env NODE_OPTIONS=\"--max_old_space_size=4096\" COVERAGE=true karma start --single-run", | ||||
|     "test:coverage:firefox": "cross-env NODE_OPTIONS=\"--max_old_space_size=4096\" karma start --single-run --browsers=FirefoxHeadless", | ||||
|     "test:watch": "cross-env NODE_OPTIONS=\"--max_old_space_size=4096\" karma start --no-single-run", | ||||
|     "verify": "concurrently 'npm:test' 'npm:lint'", | ||||
|     "jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api", | ||||
| @@ -102,6 +102,9 @@ | ||||
|     "type": "git", | ||||
|     "url": "https://github.com/nasa/openmct.git" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">=10.10.2 <16.0.0" | ||||
|   }, | ||||
|   "author": "", | ||||
|   "license": "Apache-2.0", | ||||
|   "private": true | ||||
|   | ||||
| @@ -181,7 +181,7 @@ define([ | ||||
|                         ], | ||||
|                         "category": "contextual", | ||||
|                         "name": "Stop", | ||||
|                         "cssClass": "icon-box", | ||||
|                         "cssClass": "icon-box-round-corners", | ||||
|                         "priority": "preferred" | ||||
|                     } | ||||
|                 ], | ||||
|   | ||||
| @@ -101,7 +101,7 @@ define( | ||||
|                     name: "Pause" | ||||
|                 }); | ||||
|                 mockStop.getMetadata.and.returnValue({ | ||||
|                     cssClass: "icon-box", | ||||
|                     cssClass: "icon-box-round-corners", | ||||
|                     name: "Stop" | ||||
|                 }); | ||||
|                 mockScope.domainObject = mockDomainObject; | ||||
|   | ||||
| @@ -45,6 +45,7 @@ export default class URLTimeSettingsSynchronizer { | ||||
|     } | ||||
|  | ||||
|     initialize() { | ||||
|         this.updateTimeSettings(); | ||||
|         this.openmct.router.on('change:params', this.updateTimeSettings); | ||||
|  | ||||
|         TIME_EVENTS.forEach(event => { | ||||
|   | ||||
| @@ -41,7 +41,7 @@ export default class ConditionManager extends EventEmitter { | ||||
|         this.subscriptions = {}; | ||||
|         this.telemetryObjects = {}; | ||||
|         this.testData = { | ||||
|             conditionTestData: [], | ||||
|             conditionTestInputs: this.conditionSetDomainObject.configuration.conditionTestData, | ||||
|             applied: false | ||||
|         }; | ||||
|         this.initialize(); | ||||
| @@ -154,8 +154,10 @@ export default class ConditionManager extends EventEmitter { | ||||
|  | ||||
|     updateConditionDescription(condition) { | ||||
|         const found = this.conditionSetDomainObject.configuration.conditionCollection.find(conditionConfiguration => (conditionConfiguration.id === condition.id)); | ||||
|         found.summary = condition.description; | ||||
|         this.persistConditions(); | ||||
|         if (found.summary !== condition.description) { | ||||
|             found.summary = condition.description; | ||||
|             this.persistConditions(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     initCondition(conditionConfiguration, index) { | ||||
| @@ -414,8 +416,10 @@ export default class ConditionManager extends EventEmitter { | ||||
|     } | ||||
|  | ||||
|     updateTestData(testData) { | ||||
|         this.testData = testData; | ||||
|         this.openmct.objects.mutate(this.conditionSetDomainObject, 'configuration.conditionTestData', this.testData.conditionTestInputs); | ||||
|         if (!_.isEqual(testData, this.testData)) { | ||||
|             this.testData = testData; | ||||
|             this.openmct.objects.mutate(this.conditionSetDomainObject, 'configuration.conditionTestData', this.testData.conditionTestInputs); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     persistConditions() { | ||||
|   | ||||
| @@ -280,7 +280,7 @@ describe("The Imagery View Layout", () => { | ||||
|             expect(imageInfo.url.indexOf(imageTelemetry[COUNT - 1].timeId)).not.toEqual(-1); | ||||
|         }); | ||||
|  | ||||
|         it("should show the clicked thumbnail as the main image", (done) => { | ||||
|         xit("should show the clicked thumbnail as the main image", (done) => { | ||||
|             const target = imageTelemetry[5].url; | ||||
|             parent.querySelectorAll(`img[src='${target}']`)[0].click(); | ||||
|             Vue.nextTick(() => { | ||||
| @@ -317,7 +317,7 @@ describe("The Imagery View Layout", () => { | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it("should navigate via arrow keys", (done) => { | ||||
|         xit("should navigate via arrow keys", (done) => { | ||||
|             let keyOpts = { | ||||
|                 element: parent.querySelector('.c-imagery'), | ||||
|                 key: 'ArrowLeft', | ||||
|   | ||||
| @@ -101,7 +101,6 @@ export default { | ||||
|                 buttons: [ | ||||
|                     { | ||||
|                         label: 'Cancel', | ||||
|                         emphasis: true, | ||||
|                         callback: () => { | ||||
|                             painterroInstance.dismiss(); | ||||
|                             annotateOverlay.dismiss(); | ||||
| @@ -109,6 +108,7 @@ export default { | ||||
|                     }, | ||||
|                     { | ||||
|                         label: 'Save', | ||||
|                         emphasis: true, | ||||
|                         callback: () => { | ||||
|                             painterroInstance.save((snapshotObject) => { | ||||
|                                 annotateOverlay.dismiss(); | ||||
|   | ||||
| @@ -7,10 +7,10 @@ | ||||
|                     <div class="c-object-label__type-icon icon-camera"></div> | ||||
|                     <div class="c-object-label__name"> | ||||
|                         Notebook Snapshots | ||||
|                         <span v-if="snapshots.length" | ||||
|                               class="l-browse-bar__object-details" | ||||
|                         > {{ snapshots.length }} of {{ getNotebookSnapshotMaxCount() }} | ||||
|                         </span> | ||||
|                     </div> | ||||
|                     <div v-if="snapshots.length" | ||||
|                          class="l-browse-bar__object-details" | ||||
|                     >{{ snapshots.length }} of {{ getNotebookSnapshotMaxCount() }} | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <PopupMenu v-if="snapshots.length > 0" | ||||
|   | ||||
| @@ -4,8 +4,10 @@ | ||||
|         <div class="l-browse-bar__start"> | ||||
|             <div class="l-browse-bar__object-name--w"> | ||||
|                 <span class="c-object-label l-browse-bar__object-name" | ||||
|                     v-bind:class="cssClass" | ||||
|                 > | ||||
|                     <span class="c-object-label__type-icon" | ||||
|                           v-bind:class="cssClass" | ||||
|                     ></span> | ||||
|                     <span class="c-object-label__name">{{ name }}</span> | ||||
|                 </span> | ||||
|             </div> | ||||
|   | ||||
| @@ -49,10 +49,6 @@ describe('the plugin', function () { | ||||
|         child.style.height = '480px'; | ||||
|         element.appendChild(child); | ||||
|  | ||||
|         openmct.time.timeSystem('utc', { | ||||
|             start: 1597160002854, | ||||
|             end: 1597181232854 | ||||
|         }); | ||||
|         openmct.on('start', done); | ||||
|         openmct.start(appHolder); | ||||
|     }); | ||||
| @@ -105,6 +101,11 @@ describe('the plugin', function () { | ||||
|         let planView; | ||||
|  | ||||
|         beforeEach(() => { | ||||
|             openmct.time.timeSystem('utc', { | ||||
|                 start: 1597160002854, | ||||
|                 end: 1597181232854 | ||||
|             }); | ||||
|  | ||||
|             planDomainObject = { | ||||
|                 identifier: { | ||||
|                     key: 'test-object', | ||||
|   | ||||
| @@ -427,9 +427,12 @@ export default { | ||||
|                 this.skipReloadOnInteraction = false; | ||||
|                 this.loadMoreData(newRange, true); | ||||
|             } else { | ||||
|                 // If we're not panning or zooming (time conductor and plot x-axis times are not out of sync) | ||||
|                 // Drop any data that is more than 1x (max-min) before min. | ||||
|                 // Limit these purges to once a second. | ||||
|                 if (!this.nextPurge || this.nextPurge < Date.now()) { | ||||
|                 const isPanningOrZooming = this.isTimeOutOfSync; | ||||
|                 const purgeRecords = !isPanningOrZooming && (!this.nextPurge || (this.nextPurge < Date.now())); | ||||
|                 if (purgeRecords) { | ||||
|                     const keepRange = { | ||||
|                         min: newRange.min - (newRange.max - newRange.min), | ||||
|                         max: newRange.max | ||||
|   | ||||
| @@ -24,19 +24,23 @@ import Plot from './Plot.vue'; | ||||
| import Vue from 'vue'; | ||||
|  | ||||
| export default function PlotViewProvider(openmct) { | ||||
|     function hasTelemetry(domainObject) { | ||||
|     function hasNumericTelemetry(domainObject) { | ||||
|         if (!Object.prototype.hasOwnProperty.call(domainObject, 'telemetry')) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         let metadata = openmct.telemetry.getMetadata(domainObject); | ||||
|  | ||||
|         return metadata.values().length > 0 && hasDomainAndRange(metadata); | ||||
|         return metadata.values().length > 0 && hasDomainAndNumericRange(metadata); | ||||
|     } | ||||
|  | ||||
|     function hasDomainAndRange(metadata) { | ||||
|         return (metadata.valuesForHints(['range']).length > 0 | ||||
|             && metadata.valuesForHints(['domain']).length > 0); | ||||
|     function hasDomainAndNumericRange(metadata) { | ||||
|         const rangeValues = metadata.valuesForHints(['range']); | ||||
|         const domains = metadata.valuesForHints(['domain']); | ||||
|  | ||||
|         return domains.length > 0 | ||||
|             && rangeValues.length > 0 | ||||
|             && !rangeValues.every(value => value.format === 'string'); | ||||
|     } | ||||
|  | ||||
|     function isCompactView(objectPath) { | ||||
| @@ -44,11 +48,11 @@ export default function PlotViewProvider(openmct) { | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|         key: 'plot-simple', | ||||
|         key: 'plot-single', | ||||
|         name: 'Plot', | ||||
|         cssClass: 'icon-telemetry', | ||||
|         canView(domainObject, objectPath) { | ||||
|             return hasTelemetry(domainObject, openmct); | ||||
|             return hasNumericTelemetry(domainObject); | ||||
|         }, | ||||
|  | ||||
|         view: function (domainObject, objectPath) { | ||||
|   | ||||
| @@ -201,15 +201,57 @@ describe("the plugin", function () { | ||||
|                         hints: { | ||||
|                             range: 1 | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         key: "yet-another-key", | ||||
|                         format: "string", | ||||
|                         hints: { | ||||
|                             range: 2 | ||||
|                         } | ||||
|                     }] | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             const applicableViews = openmct.objectViews.get(testTelemetryObject, mockObjectPath); | ||||
|             let plotView = applicableViews.find((viewProvider) => viewProvider.key === "plot-simple"); | ||||
|             const plotView = applicableViews.find((viewProvider) => viewProvider.key === "plot-single"); | ||||
|  | ||||
|             expect(plotView).toBeDefined(); | ||||
|         }); | ||||
|  | ||||
|         it("does not provide a plot view if the telemetry is entirely non numeric", () => { | ||||
|             const testTelemetryObject = { | ||||
|                 id: "test-object", | ||||
|                 type: "test-object", | ||||
|                 telemetry: { | ||||
|                     values: [{ | ||||
|                         key: "some-key", | ||||
|                         hints: { | ||||
|                             domain: 1 | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         key: "other-key", | ||||
|                         format: "string", | ||||
|                         hints: { | ||||
|                             range: 1 | ||||
|                         } | ||||
|                     }, | ||||
|                     { | ||||
|                         key: "yet-another-key", | ||||
|                         format: "string", | ||||
|                         hints: { | ||||
|                             range: 1 | ||||
|                         } | ||||
|                     }] | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             const applicableViews = openmct.objectViews.get(testTelemetryObject, mockObjectPath); | ||||
|             const plotView = applicableViews.find((viewProvider) => viewProvider.key === "plot-single"); | ||||
|  | ||||
|             expect(plotView).toBeUndefined(); | ||||
|         }); | ||||
|  | ||||
|         it("provides an overlay plot view for objects with telemetry", () => { | ||||
|             const testTelemetryObject = { | ||||
|                 id: "test-object", | ||||
| @@ -279,6 +321,10 @@ describe("the plugin", function () { | ||||
|         let plotView; | ||||
|  | ||||
|         beforeEach(() => { | ||||
|             openmct.time.timeSystem("utc", { | ||||
|                 start: 0, | ||||
|                 end: 4 | ||||
|             }); | ||||
|             const getFunc = openmct.$injector.get; | ||||
|             spyOn(openmct.$injector, "get") | ||||
|                 .withArgs("exportImageService").and.returnValue({ | ||||
| @@ -319,7 +365,7 @@ describe("the plugin", function () { | ||||
|             }; | ||||
|  | ||||
|             applicableViews = openmct.objectViews.get(testTelemetryObject, mockObjectPath); | ||||
|             plotViewProvider = applicableViews.find((viewProvider) => viewProvider.key === "plot-simple"); | ||||
|             plotViewProvider = applicableViews.find((viewProvider) => viewProvider.key === "plot-single"); | ||||
|             plotView = plotViewProvider.view(testTelemetryObject, [testTelemetryObject]); | ||||
|             plotView.show(child, true); | ||||
|  | ||||
| @@ -567,7 +613,7 @@ describe("the plugin", function () { | ||||
|             expect(legend.length).toBe(6); | ||||
|         }); | ||||
|  | ||||
|         it("Renders X-axis ticks for the telemetry object", () => { | ||||
|         xit("Renders X-axis ticks for the telemetry object", () => { | ||||
|             let xAxisElement = element.querySelectorAll(".gl-plot-axis-area.gl-plot-x .gl-plot-tick-wrapper"); | ||||
|             expect(xAxisElement.length).toBe(1); | ||||
|  | ||||
|   | ||||
| @@ -65,8 +65,7 @@ define([ | ||||
|     './interceptors/plugin', | ||||
|     './performanceIndicator/plugin', | ||||
|     './CouchDBSearchFolder/plugin', | ||||
|     './timeline/plugin', | ||||
|     '/node_modules/openmct-mmgis/dist/openmct-mmgis' | ||||
|     './timeline/plugin' | ||||
| ], function ( | ||||
|     _, | ||||
|     UTCTimeSystem, | ||||
| @@ -112,8 +111,7 @@ define([ | ||||
|     ObjectInterceptors, | ||||
|     PerformanceIndicator, | ||||
|     CouchDBSearchFolder, | ||||
|     Timeline, | ||||
|     Mmgis | ||||
|     Timeline | ||||
| ) { | ||||
|     const bundleMap = { | ||||
|         LocalStorage: 'platform/persistence/local', | ||||
| @@ -214,7 +212,6 @@ define([ | ||||
|     plugins.PerformanceIndicator = PerformanceIndicator.default; | ||||
|     plugins.CouchDBSearchFolder = CouchDBSearchFolder.default; | ||||
|     plugins.Timeline = Timeline.default; | ||||
|     plugins.Mmgis = Mmgis.default; | ||||
|  | ||||
|     return plugins; | ||||
| }); | ||||
|   | ||||
| @@ -121,6 +121,11 @@ describe("the plugin", () => { | ||||
|         let tableInstance; | ||||
|  | ||||
|         beforeEach(() => { | ||||
|             openmct.time.timeSystem('utc', { | ||||
|                 start: 0, | ||||
|                 end: 4 | ||||
|             }); | ||||
|  | ||||
|             testTelemetryObject = { | ||||
|                 identifier: { | ||||
|                     namespace: "", | ||||
|   | ||||
| @@ -237,7 +237,6 @@ | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Prototype | ||||
| [class^='pr-tc-input-menu'] { | ||||
|     // Uses ^= here to target both start and end menus | ||||
|     background: $colorBodyBg; | ||||
| @@ -247,8 +246,7 @@ | ||||
|     grid-column-gap: 3px; | ||||
|     grid-row-gap: 4px; | ||||
|     align-items: start; | ||||
|  | ||||
|     filter: brightness(1.4); | ||||
|     filter: $filterMenu; | ||||
|     box-shadow: $shdwMenu; | ||||
|     padding: $interiorMargin; | ||||
|     position: absolute; | ||||
|   | ||||
| @@ -237,11 +237,12 @@ $shdwSelect: rgba(black, 0.5) 0 0.5px 3px; | ||||
| $controlDisabledOpacity: 0.2; | ||||
|  | ||||
| // Menus | ||||
| $colorMenuBg: pullForward($colorBodyBg, 15%); | ||||
| $colorMenuFg: pullForward($colorBodyFg, 30%); | ||||
| $colorMenuIc: pullForward($colorKey, 15%); | ||||
| $colorMenuHovBg: $colorMenuIc; | ||||
| $colorMenuHovFg: pullForward($colorMenuFg, 10%); | ||||
| $colorMenuBg: $colorBodyBg; | ||||
| $colorMenuFg: $colorBodyFg; | ||||
| $colorMenuIc: $colorKey; | ||||
| $filterMenu:  brightness(1.4); | ||||
| $colorMenuHovBg: rgba($colorKey, 0.5); | ||||
| $colorMenuHovFg: $colorBodyFgEm; | ||||
| $colorMenuHovIc: $colorMenuHovFg; | ||||
| $colorMenuElementHilite: pullForward($colorMenuBg, 10%); | ||||
| $shdwMenu: rgba(black, 0.5) 0 1px 5px; | ||||
|   | ||||
| @@ -241,11 +241,12 @@ $shdwSelect: rgba(black, 0.5) 0 0.5px 3px; | ||||
| $controlDisabledOpacity: 0.2; | ||||
|  | ||||
| // Menus | ||||
| $colorMenuBg: pullForward($colorBodyBg, 15%); | ||||
| $colorMenuFg: pullForward($colorBodyFg, 30%); | ||||
| $colorMenuIc: pullForward($colorKey, 15%); | ||||
| $colorMenuHovBg: $colorMenuIc; | ||||
| $colorMenuHovFg: pullForward($colorMenuFg, 10%); | ||||
| $colorMenuBg: $colorBodyBg; | ||||
| $colorMenuFg: $colorBodyFg; | ||||
| $colorMenuIc: $colorKey; | ||||
| $filterMenu:  brightness(1.4); | ||||
| $colorMenuHovBg: rgba($colorKey, 0.5); | ||||
| $colorMenuHovFg: $colorBodyFgEm; | ||||
| $colorMenuHovIc: $colorMenuHovFg; | ||||
| $colorMenuElementHilite: pullForward($colorMenuBg, 10%); | ||||
| $shdwMenu: rgba(black, 0.5) 0 1px 5px; | ||||
|   | ||||
| @@ -237,9 +237,10 @@ $shdwSelect: none; | ||||
| $controlDisabledOpacity: 0.3; | ||||
|  | ||||
| // Menus | ||||
| $colorMenuBg: pushBack($colorBodyBg, 10%); | ||||
| $colorMenuFg: pullForward($colorMenuBg, 70%); | ||||
| $colorMenuBg: $colorBodyBg; | ||||
| $colorMenuFg: $colorBodyFg; | ||||
| $colorMenuIc: $colorKey; | ||||
| $filterMenu: brightness(0.95); | ||||
| $colorMenuHovBg: $colorMenuIc; | ||||
| $colorMenuHovFg: $colorMenuBg; | ||||
| $colorMenuHovIc: $colorMenuBg; | ||||
|   | ||||
| @@ -458,6 +458,7 @@ select { | ||||
| @mixin menuOuter() { | ||||
|     border-radius: $basicCr; | ||||
|     background: $colorMenuBg; | ||||
|     filter: $filterMenu; | ||||
|     text-shadow: $shdwMenuText; | ||||
|     padding: $interiorMarginSm; | ||||
|     box-shadow: $shdwMenu; | ||||
|   | ||||
| @@ -490,7 +490,7 @@ | ||||
| } | ||||
|  | ||||
| #snap-annotation { | ||||
|     $m: $interiorMargin; | ||||
|     $m: 0; //$interiorMargin; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     position: absolute; | ||||
| @@ -514,21 +514,32 @@ | ||||
|     // Holds tool buttons, color selectors, etc. | ||||
|     $h: 22px; | ||||
|     $fs: 0.8rem; | ||||
|     $m: $interiorMarginSm; | ||||
|  | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: $h + ($m * 2) !important; | ||||
|     margin-bottom: $interiorMarginLg; | ||||
|     order: 1; | ||||
|     flex: 0 0 auto; | ||||
|     height: auto; | ||||
|     background-color: transparent !important; | ||||
|     margin-bottom: $interiorMargin; | ||||
|     padding: $interiorMarginSm; | ||||
|  | ||||
|     > div > span { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         font-size: $fs; | ||||
|     > div { | ||||
|         display: contents; | ||||
|  | ||||
|         > * + * { margin-left: $interiorMargin !important; } | ||||
|     } | ||||
|  | ||||
|     .ptro-tool-controls { | ||||
|         display: flex; | ||||
|         margin-left: $interiorMarginLg !important; | ||||
|  | ||||
|         > * + * { | ||||
|             margin-left: $interiorMargin !important; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     > div, | ||||
|     > div > span, | ||||
|     .ptro-icon-btn, | ||||
|     .ptro-named-btn, | ||||
|     .ptro-color-btn, | ||||
| @@ -538,27 +549,18 @@ | ||||
|     .tool-controls, | ||||
|     .ptro-input { | ||||
|         // Lot of resets for crappy CSS in Painterro | ||||
|         &:first-child { | ||||
|             margin-left: 0 !important; | ||||
|         } | ||||
|         display: inline-block; | ||||
|         font-family: inherit; | ||||
|         font-size: $fs !important; | ||||
|         height: $h !important; | ||||
|         margin: 0 0 0 5px; | ||||
|         margin: 0; | ||||
|         position: relative; | ||||
|         width: auto !important; | ||||
|         line-height: $h !important; | ||||
|         top: auto; | ||||
|         right: auto; | ||||
|         bottom: auto; | ||||
|         left: auto; | ||||
|         vertical-align: top; | ||||
|     } | ||||
|  | ||||
|     .ptro-tool-ctl-name { | ||||
|         border-radius: 0; | ||||
|         background: none; | ||||
|         color: $colorBodyFg; | ||||
|         top: auto; | ||||
|         font-family: inherit; | ||||
|         padding: 0; | ||||
| @@ -568,13 +570,15 @@ | ||||
|         width: $h !important; | ||||
|     } | ||||
|  | ||||
|     .ptro-check, | ||||
|     .ptro-color-control, | ||||
|     .ptro-icon-btn, | ||||
|     .ptro-named-btn { | ||||
|         // Buttons in toolbar. Why the f* they're named like this is a mystery | ||||
|         background-color: $colorBtnBg; | ||||
|         color: $colorBtnFg; | ||||
|         padding: 0 $interiorMargin; | ||||
|         // Buttons in toolbar | ||||
|         border-radius: $smallCr; | ||||
|         box-shadow: rgba($colorBtnFg, 0.3) 0 0 0 1px; | ||||
|         color: $colorBtnFg !important; | ||||
|         padding: 1px $interiorMargin; | ||||
|  | ||||
|         &:hover { | ||||
|             background: $colorBtnBgHov; | ||||
| @@ -588,6 +592,13 @@ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .ptro-color-control, | ||||
|     .ptro-icon-btn, | ||||
|     .ptro-named-btn { | ||||
|         // Buttons in toolbar | ||||
|         background-color: $colorBtnBg; | ||||
|     } | ||||
|  | ||||
|     .ptro-color-active-control { | ||||
|         background: $colorBtnMajorBg  !important; | ||||
|         color: $colorBtnMajorFg !important; | ||||
|   | ||||
| @@ -1,43 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <li class="c-inspect-properties__row"> | ||||
|     <div class="c-inspect-properties__label"> | ||||
|         {{ detail.name }} | ||||
|     </div> | ||||
|     <div class="c-inspect-properties__value"> | ||||
|         {{ detail.value }} | ||||
|     </div> | ||||
| </li> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|     props: { | ||||
|         detail: { | ||||
|             type: Object, | ||||
|             required: true | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| </script> | ||||
| @@ -1,50 +0,0 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <li class="c-inspect-properties__row"> | ||||
|     <div class="c-inspect-properties__label"> | ||||
|         {{ detail.name }} | ||||
|     </div> | ||||
|     <div class="c-inspect-properties__value"> | ||||
|         {{ formattedTime }} | ||||
|     </div> | ||||
| </li> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Moment from 'moment'; | ||||
|  | ||||
| export default { | ||||
|     props: { | ||||
|         detail: { | ||||
|             type: Object, | ||||
|             required: true | ||||
|         } | ||||
|     }, | ||||
|     computed: { | ||||
|         formattedTime() { | ||||
|             return Moment.utc(this.detail.value).format('YYYY-MM-DD[\n]HH:mm:ss') + ' UTC'; | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| </script> | ||||
| @@ -1,25 +1,3 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <li | ||||
|     draggable="true" | ||||
|   | ||||
| @@ -1,25 +1,3 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <div class="c-elements-pool"> | ||||
|     <Search | ||||
|   | ||||
| @@ -1,25 +1,3 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <div class="c-inspector"> | ||||
|     <object-name /> | ||||
| @@ -41,9 +19,7 @@ | ||||
|                    type="vertical" | ||||
|         > | ||||
|             <pane class="c-inspector__properties"> | ||||
|                 <Properties | ||||
|                     v-if="!activity" | ||||
|                 /> | ||||
|                 <properties /> | ||||
|                 <location /> | ||||
|                 <inspector-views /> | ||||
|             </pane> | ||||
| @@ -122,8 +98,7 @@ export default { | ||||
|                 key: '__styles', | ||||
|                 name: 'Styles' | ||||
|             }], | ||||
|             currentTabbedView: {}, | ||||
|             activity: undefined | ||||
|             currentTabbedView: {} | ||||
|         }; | ||||
|     }, | ||||
|     mounted() { | ||||
| @@ -136,12 +111,9 @@ export default { | ||||
|     methods: { | ||||
|         updateInspectorViews(selection) { | ||||
|             this.refreshComposition(selection); | ||||
|  | ||||
|             if (this.openmct.types.get('conditionSet')) { | ||||
|                 this.refreshTabs(selection); | ||||
|             } | ||||
|  | ||||
|             this.setActivity(selection); | ||||
|         }, | ||||
|         refreshComposition(selection) { | ||||
|             if (selection.length > 0 && selection[0].length > 0) { | ||||
| @@ -178,12 +150,6 @@ export default { | ||||
|         }, | ||||
|         isCurrent(view) { | ||||
|             return _.isEqual(this.currentTabbedView, view); | ||||
|         }, | ||||
|         setActivity(selection) { | ||||
|             this.activity = selection | ||||
|                 && selection.length | ||||
|                 && selection[0].length | ||||
|                 && selection[0][0].activity; | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|   | ||||
| @@ -1,25 +1,3 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| export const mockTelemetryTableSelection = [ | ||||
|     [{ | ||||
|         context: { | ||||
|   | ||||
| @@ -1,29 +1,10 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <div></div> | ||||
| </template> | ||||
|  | ||||
| <style> | ||||
| </style> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|     inject: ['openmct'], | ||||
|   | ||||
| @@ -1,25 +1,3 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <div class="c-inspect-properties c-inspect-properties--location"> | ||||
|     <div | ||||
|   | ||||
| @@ -1,25 +1,3 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <div class="c-inspector__header"> | ||||
|     <div v-if="!multiSelect" | ||||
| @@ -39,15 +17,7 @@ | ||||
|         <div v-if="singleSelectNonObject" | ||||
|              class="c-inspector__selected c-inspector__selected--non-domain-object  c-object-label" | ||||
|         > | ||||
|             <span class="c-object-label__type-icon" | ||||
|                   :class="typeCssClass" | ||||
|             ></span> | ||||
|             <span v-if="!activity" | ||||
|                   class="c-object-label__name" | ||||
|             >Layout Object</span> | ||||
|             <span v-else | ||||
|                   class="c-object-label__name" | ||||
|             >{{ activity.name }}</span> | ||||
|             <span class="c-object-label__name">Layout Object</span> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div v-if="multiSelect" | ||||
|   | ||||
| @@ -1,149 +1,105 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2021, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| <template> | ||||
| <div class="c-inspector__properties c-inspect-properties"> | ||||
| <div v-if="!activity" | ||||
|      class="c-inspector__properties c-inspect-properties" | ||||
| > | ||||
|     <div class="c-inspect-properties__header"> | ||||
|         Details | ||||
|     </div> | ||||
|     <ul | ||||
|         v-if="hasDetails" | ||||
|         v-if="!multiSelect && !singleSelectNonObject" | ||||
|         class="c-inspect-properties__section" | ||||
|     > | ||||
|         <Component | ||||
|             :is="getComponent(detail)" | ||||
|             v-for="detail in details" | ||||
|             :key="detail.name" | ||||
|             :detail="detail" | ||||
|         /> | ||||
|  | ||||
|         <li class="c-inspect-properties__row"> | ||||
|             <div class="c-inspect-properties__label"> | ||||
|                 Title | ||||
|             </div> | ||||
|             <div class="c-inspect-properties__value"> | ||||
|                 {{ item.name }} | ||||
|             </div> | ||||
|         </li> | ||||
|         <li class="c-inspect-properties__row"> | ||||
|             <div class="c-inspect-properties__label"> | ||||
|                 Type | ||||
|             </div> | ||||
|             <div class="c-inspect-properties__value"> | ||||
|                 {{ typeName }} | ||||
|             </div> | ||||
|         </li> | ||||
|         <li | ||||
|             v-if="item.created" | ||||
|             class="c-inspect-properties__row" | ||||
|         > | ||||
|             <div class="c-inspect-properties__label"> | ||||
|                 Created | ||||
|             </div> | ||||
|             <div class="c-inspect-properties__value"> | ||||
|                 {{ formatTime(item.created) }} | ||||
|             </div> | ||||
|         </li> | ||||
|         <li | ||||
|             v-if="item.modified" | ||||
|             class="c-inspect-properties__row" | ||||
|         > | ||||
|             <div class="c-inspect-properties__label"> | ||||
|                 Modified | ||||
|             </div> | ||||
|             <div class="c-inspect-properties__value"> | ||||
|                 {{ formatTime(item.modified) }} | ||||
|             </div> | ||||
|         </li> | ||||
|         <li | ||||
|             v-for="prop in typeProperties" | ||||
|             :key="prop.name" | ||||
|             class="c-inspect-properties__row" | ||||
|         > | ||||
|             <div class="c-inspect-properties__label"> | ||||
|                 {{ prop.name }} | ||||
|             </div> | ||||
|             <div class="c-inspect-properties__value"> | ||||
|                 {{ prop.value }} | ||||
|             </div> | ||||
|         </li> | ||||
|     </ul> | ||||
|     <div | ||||
|         v-else | ||||
|         v-if="multiSelect" | ||||
|         class="c-inspect-properties__row--span-all" | ||||
|     > | ||||
|         {{ noDetailsMessage }} | ||||
|         No properties to display for multiple items | ||||
|     </div> | ||||
|     <div | ||||
|         v-if="singleSelectNonObject" | ||||
|         class="c-inspect-properties__row--span-all" | ||||
|     > | ||||
|         No properties to display for this item | ||||
|     </div> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import DetailText from './DetailText.vue'; | ||||
| import DetailTime from './DetailTime.vue'; | ||||
| import Moment from "moment"; | ||||
|  | ||||
| export default { | ||||
|     components: { | ||||
|         DetailText, | ||||
|         DetailTime | ||||
|     }, | ||||
|     inject: ['openmct'], | ||||
|     data() { | ||||
|         return { | ||||
|             selection: undefined | ||||
|             domainObject: {}, | ||||
|             activity: undefined, | ||||
|             multiSelect: false | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         details() { | ||||
|             return this.customDetails ? this.customDetails : this.domainObjectDetails; | ||||
|         }, | ||||
|         customDetails() { | ||||
|             if (this.context === undefined) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             return this.context.details; | ||||
|         }, | ||||
|         domainObject() { | ||||
|             if (this.context === undefined) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             return this.context.item; | ||||
|         item() { | ||||
|             return this.domainObject || {}; | ||||
|         }, | ||||
|         type() { | ||||
|             if (this.domainObject === undefined) { | ||||
|                 return; | ||||
|             return this.openmct.types.get(this.item.type); | ||||
|         }, | ||||
|         typeName() { | ||||
|             if (!this.type) { | ||||
|                 return `Unknown: ${this.item.type}`; | ||||
|             } | ||||
|  | ||||
|             return this.openmct.types.get(this.domainObject.type); | ||||
|         }, | ||||
|         domainObjectDetails() { | ||||
|             if (this.domainObject === undefined) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             const title = this.domainObject.name; | ||||
|             const typeName = this.type ? this.type.definition.name : `Unknown: ${this.domainObject.type}`; | ||||
|             const timestampLabel = this.domainObject.modified ? 'Modified' : 'Created'; | ||||
|             const timestamp = this.domainObject.modified ? this.domainObject.modified : this.domainObject.created; | ||||
|  | ||||
|             const details = [ | ||||
|                 { | ||||
|                     name: 'Title', | ||||
|                     value: title | ||||
|                 }, | ||||
|                 { | ||||
|                     name: 'Type', | ||||
|                     value: typeName | ||||
|                 } | ||||
|             ]; | ||||
|  | ||||
|             if (timestamp !== undefined) { | ||||
|                 details.push( | ||||
|                     { | ||||
|                         name: timestampLabel, | ||||
|                         value: timestamp, | ||||
|                         component: 'time' | ||||
|                     } | ||||
|                 ); | ||||
|             } | ||||
|  | ||||
|             return [...details, ...this.typeProperties]; | ||||
|         }, | ||||
|         context() { | ||||
|             if ( | ||||
|                 !this.selection | ||||
|                 || !this.selection.length | ||||
|                 || !this.selection[0].length | ||||
|             ) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             return this.selection[0][0].context; | ||||
|         }, | ||||
|         hasDetails() { | ||||
|             return Boolean( | ||||
|                 this.details | ||||
|                 && this.details.length | ||||
|                 && !this.multiSelection | ||||
|             ); | ||||
|         }, | ||||
|         multiSelection() { | ||||
|             return this.selection && this.selection.length > 1; | ||||
|         }, | ||||
|         noDetailsMessage() { | ||||
|             return this.multiSelection | ||||
|                 ? 'No properties to display for multiple items' | ||||
|                 : 'No properties to display for this item'; | ||||
|             return this.type.definition.name; | ||||
|         }, | ||||
|         typeProperties() { | ||||
|             if (!this.type) { | ||||
| @@ -173,9 +129,12 @@ export default { | ||||
|                         name: field.name, | ||||
|                         value: field.path.reduce((object, key) => { | ||||
|                             return object[key]; | ||||
|                         }, this.domainObject) | ||||
|                         }, this.item) | ||||
|                     }; | ||||
|                 }); | ||||
|         }, | ||||
|         singleSelectNonObject() { | ||||
|             return !this.item.identifier && !this.multiSelect; | ||||
|         } | ||||
|     }, | ||||
|     mounted() { | ||||
| @@ -186,13 +145,26 @@ export default { | ||||
|         this.openmct.selection.off('change', this.updateSelection); | ||||
|     }, | ||||
|     methods: { | ||||
|         getComponent(detail) { | ||||
|             const component = detail.component ? detail.component : 'text'; | ||||
|  | ||||
|             return `detail-${component}`; | ||||
|         }, | ||||
|         updateSelection(selection) { | ||||
|             this.selection = selection; | ||||
|             if (selection.length === 0 || selection[0].length === 0) { | ||||
|                 this.domainObject = {}; | ||||
|  | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (selection.length > 1) { | ||||
|                 this.multiSelect = true; | ||||
|                 this.domainObject = {}; | ||||
|  | ||||
|                 return; | ||||
|             } else { | ||||
|                 this.multiSelect = false; | ||||
|                 this.domainObject = selection[0][0].context.item; | ||||
|                 this.activity = selection[0][0].context.activity; | ||||
|             } | ||||
|         }, | ||||
|         formatTime(unixTime) { | ||||
|             return Moment.utc(unixTime).format('YYYY-MM-DD[\n]HH:mm:ss') + ' UTC'; | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|   | ||||
| @@ -46,6 +46,7 @@ | ||||
|  | ||||
|     <multipane | ||||
|         class="l-shell__main" | ||||
|         :class="[resizingClass]" | ||||
|         type="horizontal" | ||||
|     > | ||||
|         <pane | ||||
| @@ -53,6 +54,8 @@ | ||||
|             handle="after" | ||||
|             label="Browse" | ||||
|             collapsable | ||||
|             @start-resizing="onStartResizing" | ||||
|             @end-resizing="onEndResizing" | ||||
|         > | ||||
|             <button | ||||
|                 slot="controls" | ||||
| @@ -102,6 +105,8 @@ | ||||
|             handle="before" | ||||
|             label="Inspect" | ||||
|             collapsable | ||||
|             @start-resizing="onStartResizing" | ||||
|             @end-resizing="onEndResizing" | ||||
|         > | ||||
|             <Inspector | ||||
|                 ref="inspector" | ||||
| @@ -157,12 +162,16 @@ export default { | ||||
|             actionCollection: undefined, | ||||
|             triggerSync: false, | ||||
|             triggerReset: false, | ||||
|             headExpanded | ||||
|             headExpanded, | ||||
|             isResizing: false | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         toolbar() { | ||||
|             return this.hasToolbar && this.isEditing; | ||||
|         }, | ||||
|         resizingClass() { | ||||
|             return this.isResizing ? 'l-shell__resizing' : ''; | ||||
|         } | ||||
|     }, | ||||
|     mounted() { | ||||
| @@ -240,6 +249,12 @@ export default { | ||||
|         }, | ||||
|         handleTreeReset() { | ||||
|             this.triggerReset = !this.triggerReset; | ||||
|         }, | ||||
|         onStartResizing() { | ||||
|             this.isResizing = true; | ||||
|         }, | ||||
|         onEndResizing() { | ||||
|             this.isResizing = false; | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|   | ||||
| @@ -293,6 +293,12 @@ | ||||
|         justify-content: space-between; | ||||
|         padding: $p; | ||||
|     } | ||||
|  | ||||
|     &__resizing { | ||||
|         iframe { | ||||
|             pointer-events: none; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .is-editing { | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
|  | ||||
|         &__scrollable { | ||||
|             overflow: auto; | ||||
|             padding-right: $interiorMargin; | ||||
|         } | ||||
|  | ||||
|         &__item--empty { | ||||
|   | ||||
| @@ -113,7 +113,7 @@ import search from '../components/search.vue'; | ||||
| const ITEM_BUFFER = 25; | ||||
| const LOCAL_STORAGE_KEY__TREE_EXPANDED = 'mct-tree-expanded'; | ||||
| const RETURN_ALL_DESCDNDANTS = true; | ||||
| const TREE_ITEM_INDENT_PX = 15; | ||||
| const TREE_ITEM_INDENT_PX = 18; | ||||
|  | ||||
| export default { | ||||
|     name: 'MctTree', | ||||
|   | ||||
| @@ -126,12 +126,14 @@ export default { | ||||
|             document.body.addEventListener('mousemove', this.updatePosition); | ||||
|             document.body.addEventListener('mouseup', this.end); | ||||
|             this.resizing = true; | ||||
|             this.$emit('start-resizing'); | ||||
|             this.trackSize(); | ||||
|         }, | ||||
|         end: function (event) { | ||||
|             document.body.removeEventListener('mousemove', this.updatePosition); | ||||
|             document.body.removeEventListener('mouseup', this.end); | ||||
|             this.resizing = false; | ||||
|             this.$emit('end-resizing'); | ||||
|             this.trackSize(); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -103,10 +103,16 @@ export default { | ||||
|     }, | ||||
|     mounted() { | ||||
|         if (this.actionCollection) { | ||||
|             this.actionCollection.hide(HIDDEN_ACTIONS); | ||||
|             this.actionCollection.on('update', this.updateActionItems); | ||||
|             this.updateActionItems(this.actionCollection.getActionsObject()); | ||||
|         } | ||||
|     }, | ||||
|     destroyed() { | ||||
|         if (this.actionCollection) { | ||||
|             this.actionCollection.off('update', this.updateActionItems); | ||||
|         } | ||||
|     }, | ||||
|     methods: { | ||||
|         setView(view) { | ||||
|             this.$emit('setView', view); | ||||
| @@ -116,7 +122,6 @@ export default { | ||||
|             delete this.actionCollection; | ||||
|         }, | ||||
|         updateActionItems() { | ||||
|             this.actionCollection.hide(HIDDEN_ACTIONS); | ||||
|             this.statusBarItems = this.actionCollection.getStatusBarActions(); | ||||
|             this.menuActionItems = this.actionCollection.getVisibleActions(); | ||||
|         }, | ||||
|   | ||||
| @@ -8,7 +8,7 @@ let resolveFunction; | ||||
|  | ||||
| let initialHash = ''; | ||||
|  | ||||
| describe('Application router utility functions', () => { | ||||
| xdescribe('Application router utility functions', () => { | ||||
|     beforeAll(done => { | ||||
|         appHolder = document.createElement('div'); | ||||
|         appHolder.style.width = '640px'; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user