Compare commits

...

62 Commits

Author SHA1 Message Date
David Tsay
adde8f5b3a add theme style files 2019-12-05 15:05:34 -08:00
David Tsay
8a29387077 split style file entries by theme 2019-12-05 14:32:08 -08:00
David Tsay
14a0f84c1b Feature/eslint plugin vue (#2548)
* Use eslint-plugin-vue to lint vue files
2019-12-04 12:39:09 -08:00
Deep Tailor
14ce5e159b Webpage plugin vue (#2440)
* Move table cell selection to table cell component

* move webpage from angular to vue

* make review requested changes

* fix npm install error

* change cache version

* change cache version

* rename view provider

* rename file to WebPageViewProvider

* change webpage vue file

* change webpage vue file
2019-12-02 18:55:08 -08:00
Andrew Henry
c51fd21847 Experimental unit tests for the Telemetry Table component (#2533)
* Initial commit of telemetry table spec
* Added example directory to linter paths. Fixed outstanding linting issues
2019-11-27 16:04:52 -08:00
Deep Tailor
72e382c46a enable plugin path (#2549) 2019-11-21 13:11:09 -08:00
Nikhil
8825a458dc fixed console error with save + using this.$nextTick instead of setTimeout. (#2516) 2019-11-21 08:32:42 -08:00
Nikhil
cab51f2665 Code that ignores duplicate points for plotting is removing non-duplicate points (#2515)
* Code that ignores duplicate points for plotting is removing non-duplicate points

* updated as per suggestion: use generic way of reading Y value.
2019-11-21 08:31:05 -08:00
Nikhil
c6f83dea8d Save and Finish blocking modal dialog Refactor and Styles #2500 (#2501)
* Save and Finish blocking modal dialog Refactor and Styles #2500

* created new template for ProgressDialogComponent

* Tweaks for #2501

- Normalized dialog icon size;
- Enhanced text formatting in dialog;
- Changed "Saving..." to remove ellipsis;
2019-11-20 11:46:03 -08:00
Charles Hacskaylo
6e2497461a Merge pull request #2518 from nasa/modal-improvement
WIP: Modal improvement
2019-11-20 11:45:21 -08:00
Charles Hacskaylo
bdd55b3db0 Merge branch 'topic-core-refactor' into modal-improvement 2019-11-20 11:42:11 -08:00
Charles Hacskaylo
700ca90c8e Added new icon-history glyph for Time Conductor (#2545)
## Reviewer Checklist

* Changes appear to address issue? Y
* Appropriate unit tests included? N/A - Icon changes only
* Code style and in-line documentation are appropriate? Y
* Commit messages meet standards?
2019-11-20 11:37:53 -08:00
Charles Hacskaylo
360881cf66 Merge branch 'topic-core-refactor' into modal-improvement 2019-11-19 14:11:45 -08:00
Shefali Joshi
a4c2e944b3 Fixes issue #2537 Removes unused isEditing parameter for the view method of ViewProviders. (#2542) 2019-11-18 10:27:05 -08:00
Charles Hacskaylo
93abb09419 Styling to support Plotly integration (#2532)
* Mods to support NIRVSS spectra plot enhancements

- Plot legend can display a header element, related styles;
- Remove unneeded margin from propertiesHeader mixin;

* Mods to support NIRVSS spectra plot enhancements

- Finessing plot legend header styling;
- New theme constants for plot legend header;
- Increased size of plot color swatches;

* Mods to support NIRVSS spectra plot enhancements

- Major progress on Plotly style overrides;

* New glyphs for Spectra and Commands

* Icon backgrounds added for new glyphs

- bg-icon-spectra, -spectra-telemetry and -command;

* Plot legend enhancements

- Make selector for .hover-value-enabled less selective;

* Move plotly SCSS into its own file
2019-11-13 09:46:56 -08:00
Charles Hacskaylo
e58e9d3a26 Fix Plot Legend placement (#2527)
* Push test

* Enhance plot legend placement for #2486

- Left and right legends now maintain position when expanded;

* Update index.html

- Remove erroneously committed temp change ;
2019-11-08 15:31:29 -08:00
David Tsay
527c5ec7dd src/selection/Selection.js (#2535) 2019-11-06 15:14:05 -08:00
David Tsay
286d6e5082 Issue 2472 Disable selection in layouts when previewing (#2530)
* ISSUE-2472: disable selection in layouts during preview
2019-11-05 16:20:26 -08:00
Nikhil
fab8bb516a Plot label height adjustment. (#2524)
* Plot label height adjustment.

* initialize xaxis label.

* Plot label height adjustment.

* initialize xaxis label.

* Fixes incorrect width applied to the plot's X axis wrapper
2019-10-30 18:09:56 -07:00
Joel McKinnon
6d526eaf42 Fix lint errors (#2520)
* Fixed linting errors
* Disabled broken test
2019-10-29 15:49:55 -07:00
Deep Tailor
8b715f331c Search indexer (#2445)
* add a bare bones indexer
* use constant to fallback to legacy indexer
2019-10-22 16:53:06 -07:00
Nikhil
d6950a0976 Added listener that reacts to changes on interpolate + fetch data using correct strategy value. (#2469) 2019-10-21 10:27:52 -07:00
Nikhil
68f3436792 set deep property as true on watch (#2521) 2019-10-21 10:26:09 -07:00
Andrew Henry
4414161faf Fixes to enable testing by third party applications (#2523)
* Initial commit of telemetry table spec

* Fix errors found by running Open MCT app headless

* Do not double install import-export plugin

* Changes to allow Open MCT to be initialized more than once without binding to window.document

* Remove table spec accidentally added
2019-10-21 10:24:46 -07:00
Andrew Henry
7477536478 Disable broken unit tests (#2519)
* Disabling broken unit tests

* Removed legacy RemoveAction
2019-10-10 16:23:29 -07:00
Nikhil Mandlik
2dd7307fce Overlay Improvement #2517 2019-10-10 15:45:07 -07:00
Nikhil Mandlik
6b2f2b758d Multiple modal instances on 'Enter' button #2513 2019-10-10 15:04:14 -07:00
Deep Tailor
c13b07e648 separate search div from main tree, show search div when search value is present, else show main tree (#2512) 2019-10-10 12:48:50 -07:00
Nikhil
2ecff75da5 [Tables] Filtering fails when one or more cells contain undefined value #2493 (#2510)
* [Tables] Filtering fails when one or more cells contain undefined value #2493

* refactored to handle edge cases first
2019-10-10 12:46:25 -07:00
Nikhil
ff5b88b544 VSC enable debugger for testing (#2505) 2019-10-10 12:25:24 -07:00
Nikhil
9b7a986475 Add a sticky telemetry point select to on-click plot behavior #2379 (#2471)
* Add a sticky telemetry point select to on-click plot behavior #2379

* changed class 'lock-highlight-point' on parent element to drive lock/unlock feature on highlight points.

* Styling for sticky-telemetry-point

- New glyph: icon-cursor-lock;
- Better layout and SCSS for overlaid state indicators in plot area;

* single click on plot, lock/unlock highlight points.

* cleanup + added lock icon on legends.

* fixed panning does not end on mouse up.
2019-10-07 13:55:47 -07:00
Nikhil
c054914a9c [Plots] Zooming on plot causes console errors - Duplicates in a repeater are not allowed #2473 (#2474) 2019-09-24 16:33:16 -07:00
Andrew Henry
69b6f8afa9 Delete persisted timestamp (#2506) 2019-09-24 16:31:54 -07:00
Charles Hacskaylo
45164a2f68 Fix status bubbles (#2503)
- Status indicator bubbles now right-align;
2019-09-19 18:44:35 -07:00
Andrew Henry
b189a887e6 Emit refresh event when data cleared (#2502) 2019-09-19 18:37:09 -07:00
Nikhil
71abfbc336 Save and Finish no longer shows blocking modal dialog #2496 (#2498) 2019-09-19 18:16:41 -07:00
Charles Hacskaylo
ee690545fb VISTA Fixes 4 (#2499)
- Fixed is-selected styling so that if overrides table row EVR, limit
styling;
- Fix Summary Widget grippys #2494;
- Fix indent in Global filters UI: #2488;
- Fix Summary Widget overflow problem: #2495;
- Added new c-input-number--no-spinners class for https://github.jpl.nasa.gov/MissionControl/vista/issues/673
2019-09-19 17:56:17 -07:00
Charles Hacskaylo
fcf3c76aa1 Merge pull request #2492 from nasa/y-axis-label-fix
[Plot] Y axis label is not displayed when editing #2487
2019-09-18 15:05:23 -07:00
Nikhil
5dbd77d10c [Summary Widgets] Adding a new condition to a rule deletes the input value from previous ones #2411 (#2481)
* [Summary Widgets] Adding a new condition to a rule deletes the input value from previous ones #2411

* Summary Widget Rule conditions not persisting numeric values #2491
2019-09-18 13:19:26 -07:00
Nikhil
43515ca84e [Summary Widget] Adding a rule without setting anything in the rule causes error #2401 (#2478) 2019-09-18 13:18:55 -07:00
Nikhil Mandlik
54fe881e71 [Plot] Y axis label is not displayed when editing #2487 2019-09-17 11:50:17 -07:00
Andrew Henry
7c32700b69 [Import JSON] Support namespaces (#2483)
* Retain target namespace in generated identifiers

* Also replace identifier objects

* Do not duplicate newIds when replacing. Rename ID to Id
2019-09-13 13:45:32 -07:00
Charles Hacskaylo
e98d0cc7c5 UI Various 2 (#2480)
- Fixes icon-gear margin for #2477;
- Now applies mixed visual style to toggle frame visibility button in
Layout toolbar for #2460;
- Change Status area Indicators to right-justify;
- Adjust Status area collapse toggle button margin;
2019-09-13 13:34:08 -07:00
Andrew Henry
2200503e48 Hide filter fields if filtering not supported by view (#2479) 2019-09-11 11:16:50 -07:00
Deep Tailor
8f0081acc8 Clear data changes for tables and plots (#2475) 2019-09-06 17:17:24 -07:00
Andrew Henry
003c3e9fbe Do not attempt to select cells with no column defined 2019-09-06 15:54:44 -07:00
Charles Hacskaylo
02ef58ced1 Fixes normalize.min.css (#2467)
- Add as slightly renamed .scss file to avoid issues arising from
.gitignore excluding .css files;
2019-09-03 13:33:24 -07:00
Charles Hacskaylo
e89881c266 Fix Y axis plot label control (#2465)
* Fix Y axis plot label control
* Now uses writing-mode: vertical-lr instead of transform for vertical
text;
* Text overflow: hidden prevents scrollbars;
* Select displayed on hover over Y axis area;
* Dynamically adds icon-gear when Y axis can be configured;
* use child plot div for image exports
2019-09-03 11:10:02 -07:00
Charles Hacskaylo
fa66289d5c Misc UI 10 (#2441)
* Misc UI 10

- Add .c-input--sm CSS class for VISTA auto-clear input;

* Misc UI 10

- WIP!
- Add new glyohs: suitcase and clear data;
- Change icon-database to icon-suitcase;
- Need to unit test!

* Misc UI 10

- Refinements to shell__head Indicators layout;
- Refinements to collapse-buttons;
- Better color for Snow theme caution;

* Misc UI 10

- Better Open MCT logo for Snow theme;
- Renamed logo-app.svg to logo-openmct.svg;
- Removed unused image files;

* Misc UI 10

- Remove title attr from Angular indicator, interferes with hover
element;

* Misc UI 10

- Fix favicons, updated art;
- Removed favicon.ico;

* Misc UI 10

- Rebuild of Icomoon JSON file, which appeared to have gotten
damaged, probably due to merging;
- Font files updated, added .svg font back to repo;
- Font metrics modified to now use 20% baseline height;

* Misc UI 10

- Fix class in plot for control-bar element;
- Fix CSS in ObjectFrame.vue;

* Misc UI 10

- Rename folder styles-new to styles;

* Misc UI 10

- Remove unused src/fonts folder;

* Misc UI 10

- Symbols font now using baseline of 20%;
2019-08-30 15:51:52 -07:00
Deep Tailor
4f3a3befe0 Fix Row marking (#2458)
Fix row marking issue discovered during r4.2 testing
2019-08-30 15:46:36 -07:00
Deep Tailor
a0864a8702 prevents users from using empty strings as names (#2461) 2019-08-29 20:31:52 -07:00
Andrew Henry
a34ad4e58c Enabled column reordering on table load (#2462) 2019-08-29 19:18:55 -07:00
Deep Tailor
7e50010463 remove LADTables from default registry to optionally installed in index.html (#2455) 2019-08-28 15:55:51 -07:00
Andrew Henry
974be0ae2c Auto-correct lint errors (#2450)
* Auto-fixed linting errors and manually corrected spacing on some comments
2019-08-27 09:26:58 -07:00
Pegah Sarram
3dc6dac12d Global filtering (#2434)
* Adds global filtering
* Markup changes to support global filtering
* Adds toggle button
* Added row item spacing for tree__item in mct-tree.vue;
* Significant mods to tree-based properties displays in Inspector:
* Padding in c-object-label tweaked;
* Class naming normalized, legacy classes removed;
* Layout fixed for filters in Browse mode
2019-08-16 10:16:43 -07:00
Andrew Henry
aafe524454 bumped version number 2019-08-06 10:36:51 -07:00
Andrew Henry
e84ade1752 Removed unnecessary extra formatting (#2438) 2019-07-31 15:18:46 -07:00
Deep Tailor
3b094e43e3 Plot y axis label fix (#2437)
* set yAxis label if none is set yet

* remove empty listener
2019-07-31 10:24:27 -07:00
Andrew Henry
e6a7b4ed6c Move table cell selection to table cell component (#2436) 2019-07-31 10:08:27 -07:00
Deep Tailor
97230bb21f Context-Menu for Tables (#2424)
* add context menu capability to table rows, add view switcher to preview

* add an option to limit context menu actions to the ones requested, and modify preview action to also include a view historical data action

* extend preview action into view historical data action

* add context menu to LAD Table

* add keys to context menu actions, allow tables to conditionally attach context menu handler

* working switch y axis label

* New vertical select element for Y axis configuration in plots

- CSS for vertically rotated selects for Y axis label selection;
- New theme constants;
- Removed themedSelect theme mixins;
- New SASS svgColorFromHex function;

* use keys in lad table context menu options

* show historical view context menu on alpha-numerics

* make reviewer requested changes

* pass contextual object path from object view down etc

* made reviewer requested changes: removed options object, pass in object path instead

* remove redundant function from LADRow.vue
2019-07-26 16:09:59 -07:00
Deep Tailor
768d99d928 Select, Mark and export selected table rows (#2420)
* first pass

* add a unmark all rows button

* enable shift click to select multiple rows

* support row selection backwards

* Styling for marked table rows

- CSS class applied;
- Export button label modified;

* working pause

* working multi select
tables are paused when user selects a row

* Layout improvements for table and control bar elements

- Table markup re-org'd;
- New .c-separator css class;
- Renamed .c-table__control-bar to .c-table-control-bar;
- Added label to Pause button;
- TODO: refine styling for table within frame in Layouts;

* Refined styling for c-button in an object frame

- More compact, better alignment, font sizing and padding;

* change logic to marking/selecting

* use command key to mark multiple

* Fixed regression errors in markup

* add isSelectable functionality

* make reviewer requested changes

* remove key from v-for in table.vue
2019-07-25 13:47:40 -07:00
Deep Tailor
c760190a29 Time conductor Improvement 625 (#2432)
* when utc based time systems are switched, the bounds will stay the same

* inline check for utcBased time systems
2019-07-25 10:08:57 -07:00
329 changed files with 12667 additions and 16272 deletions

View File

@@ -5,9 +5,16 @@ module.exports = {
"jasmine": true,
"amd": true
},
"extends": "eslint:recommended",
"parser": "babel-eslint",
"globals": {
"_": "readonly"
},
"extends": [
"eslint:recommended",
"plugin:vue/recommended"
],
"parser": "vue-eslint-parser",
"parserOptions": {
"parser": "babel-eslint",
"allowImportExportEverywhere": true,
"ecmaVersion": 2015,
"ecmaFeatures": {
@@ -58,7 +65,38 @@ module.exports = {
}
],
"dot-notation": "error",
"indent": ["error", 4]
"indent": ["error", 4],
"vue/html-indent": [
"error",
4,
{
"attribute": 1,
"baseIndent": 0,
"closeBracket": 0,
"alignAttributesVertically": true,
"ignores": []
}
],
"vue/html-self-closing": ["error",
{
"html": {
"void": "never",
"normal": "never",
"component": "always"
},
"svg": "always",
"math": "always"
}
],
"vue/max-attributes-per-line": ["error", {
"singleline": 1,
"multiline": {
"max": 1,
"allowFirstLine": true
}
}],
"vue/multiline-html-element-content-newline": "off",
"vue/singleline-html-element-content-newline": "off"
},
"overrides": [
{

View File

@@ -22,15 +22,15 @@
/*global define*/
define([
"./src/EventTelemetryProvider",
'legacyRegistry'
"./src/EventTelemetryProvider"
], function (
EventTelemetryProvider,
legacyRegistry
EventTelemetryProvider
) {
"use strict";
legacyRegistry.register("example/eventGenerator", {
return {
name:"example/eventGenerator",
definition: {
"name": "Event Message Generator",
"description": "For development use. Creates sample event message data that mimics a live data stream.",
"extensions": {
@@ -76,5 +76,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -34,11 +34,9 @@ define(
* @constructor
*/
function EventTelemetryProvider($q, $timeout) {
var
subscriptions = [],
var subscriptions = [],
genInterval = 1000,
generating = false,
id = Math.random() * 100000;
generating = false;
//
function matchesSource(request) {
@@ -47,7 +45,6 @@ define(
// Used internally; this will be repacked by doPackage
function generateData(request) {
//console.log("generateData " + (Date.now() - startTime).toString());
return {
key: request.key,
telemetry: new EventTelemetry(request, genInterval)

View File

@@ -58,15 +58,15 @@ define([], function () {
row,
i;
function copyDomainsToRow(row, index) {
function copyDomainsToRow(telemetryRow, index) {
domains.forEach(function (domain) {
row[domain.name] = series.getDomainValue(index, domain.key);
telemetryRow[domain.name] = series.getDomainValue(index, domain.key);
});
}
function copyRangesToRow(row, index) {
function copyRangesToRow(telemetryRow, index) {
ranges.forEach(function (range) {
row[range.name] = series.getRangeValue(index, range.key);
telemetryRow[range.name] = series.getRangeValue(index, range.key);
});
}

View File

@@ -22,12 +22,13 @@
/*global define*/
define([
'legacyRegistry',
'./ExportTelemetryAsCSVAction'
], function (legacyRegistry, ExportTelemetryAsCSVAction) {
], function (ExportTelemetryAsCSVAction) {
"use strict";
legacyRegistry.register("example/export", {
return {
name:"example/export",
definition: {
"name": "Example of using CSV Export",
"extensions": {
"actions": [
@@ -41,5 +42,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,15 +22,15 @@
/*global define*/
define([
"./src/ExampleFormController",
'legacyRegistry'
"./src/ExampleFormController"
], function (
ExampleFormController,
legacyRegistry
ExampleFormController
) {
"use strict";
legacyRegistry.register("example/forms", {
return {
name:"example/forms",
definition: {
"name": "Declarative Forms example",
"sources": "src",
"extensions": {
@@ -49,5 +49,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -52,7 +52,7 @@ define([
'period',
'offset',
'dataRateInHz',
'phase',
'phase'
];
request = request || {};

View File

@@ -89,7 +89,7 @@ define([
WorkerInterface.prototype.subscribe = function (request, cb) {
function callback(message) {
cb(message.data);
};
}
var messageId = this.dispatch('subscribe', request, callback);

View File

@@ -84,10 +84,10 @@
function onRequest(message) {
var request = message.data;
if (request.end == undefined) {
if (request.end === undefined) {
request.end = Date.now();
}
if (request.start == undefined){
if (request.start === undefined) {
request.start = request.end - FIFTEEN_MINUTES;
}

View File

@@ -22,15 +22,15 @@
/*global define*/
define([
"./src/ExampleIdentityService",
'legacyRegistry'
"./src/ExampleIdentityService"
], function (
ExampleIdentityService,
legacyRegistry
ExampleIdentityService
) {
"use strict";
legacyRegistry.register("example/identity", {
return {
name:"example/identity",
definition: {
"extensions": {
"components": [
{
@@ -44,5 +44,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -65,7 +65,7 @@ define([
callback(pointForTimestamp(Date.now(), domainObject.name));
}, 5000);
return function (interval) {
return function () {
clearInterval(interval);
};
}

View File

@@ -21,16 +21,12 @@
*****************************************************************************/
/*global define*/
define([
'legacyRegistry'
], function (
legacyRegistry
) {
define([], function () {
"use strict";
legacyRegistry.register("example/mobile", {
return {
name:"example/mobile",
definition: {
"name": "Mobile",
"description": "Allows elements with pertinence to mobile usage and development",
"extensions": {
@@ -41,5 +37,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -24,17 +24,16 @@
define([
"./src/RemsTelemetryServerAdapter",
"./src/RemsTelemetryModelProvider",
"./src/RemsTelemetryProvider",
'legacyRegistry',
"module"
"./src/RemsTelemetryProvider"
], function (
RemsTelemetryServerAdapter,
RemsTelemetryModelProvider,
RemsTelemetryProvider,
legacyRegistry
RemsTelemetryProvider
) {
"use strict";
legacyRegistry.register("example/msl", {
return {
name:"example/msl",
definition: {
"name" : "Mars Science Laboratory Data Adapter",
"extensions" : {
"types": [
@@ -110,6 +109,7 @@ define([
}
]
}
});
}
};
});

View File

@@ -27,20 +27,20 @@ define([
"./src/DialogLaunchIndicator",
"./src/NotificationLaunchIndicator",
"./res/dialog-launch.html",
"./res/notification-launch.html",
'legacyRegistry'
"./res/notification-launch.html"
], function (
DialogLaunchController,
NotificationLaunchController,
DialogLaunchIndicator,
NotificationLaunchIndicator,
DialogLaunch,
NotificationLaunch,
legacyRegistry
NotificationLaunch
) {
"use strict";
legacyRegistry.register("example/notifications", {
return {
name:"example/notifications",
definition: {
"extensions": {
"templates": [
{
@@ -86,5 +86,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,15 +22,15 @@
/*global define*/
define([
"./src/BrowserPersistenceProvider",
'legacyRegistry'
"./src/BrowserPersistenceProvider"
], function (
BrowserPersistenceProvider,
legacyRegistry
BrowserPersistenceProvider
) {
"use strict";
legacyRegistry.register("example/persistence", {
return {
name:"example/persistence",
definition: {
"extensions": {
"components": [
{
@@ -50,5 +50,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,15 +22,15 @@
/*global define*/
define([
"./src/ExamplePolicy",
'legacyRegistry'
"./src/ExamplePolicy"
], function (
ExamplePolicy,
legacyRegistry
ExamplePolicy
) {
"use strict";
legacyRegistry.register("example/policy", {
return {
name:"example/policy",
definition: {
"name": "Example Policy",
"description": "Provides an example of using policies to prohibit actions.",
"extensions": {
@@ -41,5 +41,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -23,16 +23,16 @@
define([
"./src/WatchIndicator",
"./src/DigestIndicator",
'legacyRegistry'
"./src/DigestIndicator"
], function (
WatchIndicator,
DigestIndicator,
legacyRegistry
DigestIndicator
) {
"use strict";
legacyRegistry.register("example/profiling", {
return {
name:"example/profiling",
definition: {
"extensions": {
"indicators": [
{
@@ -51,5 +51,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,15 +22,15 @@
/*global define*/
define([
"./src/ScratchPersistenceProvider",
'legacyRegistry'
"./src/ScratchPersistenceProvider"
], function (
ScratchPersistenceProvider,
legacyRegistry
ScratchPersistenceProvider
) {
"use strict";
legacyRegistry.register("example/scratchpad", {
return {
name:"example/scratchpad",
definition: {
"extensions": {
"roots": [
{
@@ -59,5 +59,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -3,8 +3,6 @@ import HelloWorld from './HelloWorld.vue';
function SimpleVuePlugin() {
return function install(openmct) {
var views = (openmct.mainViews || openmct.objectViews);
openmct.types.addType('hello-world', {
name: 'Hello World',
description: 'An introduction object',

View File

@@ -8,8 +8,7 @@ define([
"./res/templates/glyphs.html",
"./res/templates/controls.html",
"./res/templates/input.html",
"./res/templates/menus.html",
'legacyRegistry'
"./res/templates/menus.html"
], function (
ExampleStyleGuideModelProvider,
MCTExample,
@@ -20,10 +19,11 @@ define([
glyphsTemplate,
controlsTemplate,
inputTemplate,
menusTemplate,
legacyRegistry
menusTemplate
) {
legacyRegistry.register("example/styleguide", {
return {
name:"example/styleguide",
definition: {
"name": "Open MCT Style Guide",
"description": "Examples and documentation illustrating UI styles in use in Open MCT.",
"extensions":
@@ -103,5 +103,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -30,14 +30,14 @@ define(
var pages = {};
// Add pages
pages['intro'] = { name: "Introduction", type: "styleguide.intro", location: "styleguide:home" };
pages['standards'] = { name: "Standards", type: "styleguide.standards", location: "styleguide:home" };
pages['colors'] = { name: "Colors", type: "styleguide.colors", location: "styleguide:home" };
pages['glyphs'] = { name: "Glyphs", type: "styleguide.glyphs", location: "styleguide:home" };
pages['status'] = { name: "Status Indication", type: "styleguide.status", location: "styleguide:home" };
pages['controls'] = { name: "Controls", type: "styleguide.controls", location: "styleguide:ui-elements" };
pages['input'] = { name: "Text Inputs", type: "styleguide.input", location: "styleguide:ui-elements" };
pages['menus'] = { name: "Menus", type: "styleguide.menus", location: "styleguide:ui-elements" };
pages.intro = { name: "Introduction", type: "styleguide.intro", location: "styleguide:home" };
pages.standards = { name: "Standards", type: "styleguide.standards", location: "styleguide:home" };
pages.colors = { name: "Colors", type: "styleguide.colors", location: "styleguide:home" };
pages.glyphs = { name: "Glyphs", type: "styleguide.glyphs", location: "styleguide:home" };
pages.status = { name: "Status Indication", type: "styleguide.status", location: "styleguide:home" };
pages.controls = { name: "Controls", type: "styleguide.controls", location: "styleguide:ui-elements" };
pages.input = { name: "Text Inputs", type: "styleguide.input", location: "styleguide:ui-elements" };
pages.menus = { name: "Menus", type: "styleguide.menus", location: "styleguide:ui-elements" };
return {
getModels: function () {

View File

@@ -27,11 +27,10 @@
<meta name="apple-mobile-web-app-capable" content="yes">
<title></title>
<script src="dist/openmct.js"></script>
<link rel="stylesheet" href="dist/styles/openmct.css">
<link rel="icon" type="image/png" href="dist/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="dist/favicons/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="dist/favicons/favicon-16x16.png" sizes="16x16">
<link rel="shortcut icon" href="dist/favicons/favicon.ico">
<link rel="stylesheet" href="espresso.css">
<link rel="icon" type="image/png" href="dist/favicons/favicon-96x96.png" sizes="96x96" type="image/x-icon">
<link rel="icon" type="image/png" href="dist/favicons/favicon-32x32.png" sizes="32x32" type="image/x-icon">
<link rel="icon" type="image/png" href="dist/favicons/favicon-16x16.png" sizes="16x16" type="image/x-icon">
</head>
<body>
</body>
@@ -39,49 +38,50 @@
const FIVE_MINUTES = 5 * 60 * 1000;
const THIRTY_MINUTES = 30 * 60 * 1000;
[
'example/eventGenerator',
'example/styleguide'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
// [
// 'example/eventGenerator',
// 'example/styleguide'
// ].forEach(
// openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
// );
openmct.install(openmct.plugins.MyItems());
openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.Generator());
openmct.install(openmct.plugins.ExampleImagery());
// openmct.install(openmct.plugins.Generator());
// openmct.install(openmct.plugins.ExampleImagery());
openmct.install(openmct.plugins.UTCTimeSystem());
openmct.install(openmct.plugins.AutoflowView({
type: "telemetry.panel"
}));
// openmct.install(openmct.plugins.AutoflowView({
// type: "telemetry.panel"
// }));
openmct.install(openmct.plugins.DisplayLayout({
showAsView: ['summary-widget', 'example.imagery']
}));
openmct.install(openmct.plugins.Conductor({
menuOptions: [
{
name: "Fixed",
timeSystem: 'utc',
bounds: {
start: Date.now() - THIRTY_MINUTES,
end: Date.now()
}
},
{
name: "Realtime",
timeSystem: 'utc',
clock: 'local',
clockOffsets: {
start: - THIRTY_MINUTES,
end: FIVE_MINUTES
}
}
]
}));
openmct.install(openmct.plugins.SummaryWidget());
openmct.install(openmct.plugins.Notebook());
openmct.install(openmct.plugins.Filters(['table', 'telemetry.plot.overlay']));
openmct.install(openmct.plugins.ObjectMigration());
openmct.install(openmct.plugins.ClearData(['table', 'telemetry.plot.overlay', 'telemetry.plot.stacked']));
// openmct.install(openmct.plugins.Conductor({
// menuOptions: [
// {
// name: "Fixed",
// timeSystem: 'utc',
// bounds: {
// start: Date.now() - THIRTY_MINUTES,
// end: Date.now()
// }
// },
// {
// name: "Realtime",
// timeSystem: 'utc',
// clock: 'local',
// clockOffsets: {
// start: - THIRTY_MINUTES,
// end: FIVE_MINUTES
// }
// }
// ]
// }));
// openmct.install(openmct.plugins.SummaryWidget());
// openmct.install(openmct.plugins.Notebook());
// openmct.install(openmct.plugins.LADTable());
// openmct.install(openmct.plugins.Filters(['table', 'telemetry.plot.overlay']));
// openmct.install(openmct.plugins.ObjectMigration());
// openmct.install(openmct.plugins.ClearData(['table', 'telemetry.plot.overlay', 'telemetry.plot.stacked']));
openmct.start();
</script>
</html>

View File

@@ -23,9 +23,9 @@
/*global module,process*/
const devMode = process.env.NODE_ENV !== 'production';
const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'ChromeHeadless'];
module.exports = (config) => {
const webpackConfig = require('./webpack.config.js');
delete webpackConfig.output;
@@ -50,11 +50,17 @@ module.exports = (config) => {
'coverage',
'html'
],
browsers: ['ChromeHeadless'],
browsers: browsers,
customLaunchers: {
ChromeDebugging: {
base: 'Chrome',
flags: ['--remote-debugging-port=9222'],
debug: true
}
},
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
coverageReporter: {
dir: process.env.CIRCLE_ARTIFACTS ?
process.env.CIRCLE_ARTIFACTS + '/coverage' :
@@ -66,22 +72,18 @@ module.exports = (config) => {
}
}
},
// HTML test reporting.
htmlReporter: {
outputDir: "dist/reports/tests",
preserveDescribeNesting: true,
foldAll: false
},
preprocessors: {
// add webpack as preprocessor
'platform/**/*Spec.js': [ 'webpack' ],
'src/**/*Spec.js': [ 'webpack' ]
'platform/**/*Spec.js': [ 'webpack', 'sourcemap' ],
'src/**/*Spec.js': [ 'webpack', 'sourcemap' ]
},
webpack: webpackConfig,
webpackMiddleware: {
stats: 'errors-only',
logLevel: 'warn'
@@ -89,4 +91,3 @@ module.exports = (config) => {
singleRun: true
});
}

View File

@@ -19,7 +19,7 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global module,BUILD_CONSTANTS*/
/*global module*/
const matcher = /\/openmct.js$/;
if (document.currentScript) {

View File

@@ -1,6 +1,6 @@
{
"name": "openmct",
"version": "0.14.0-SNAPSHOT",
"version": "1.0.0-beta",
"description": "The Open MCT core platform",
"dependencies": {},
"devDependencies": {
@@ -23,6 +23,7 @@
"d3-time": "1.0.x",
"d3-time-format": "2.1.x",
"eslint": "5.2.0",
"eslint-plugin-vue": "^6.0.0",
"eventemitter3": "^1.2.0",
"exports-loader": "^0.7.0",
"express": "^4.13.1",
@@ -43,6 +44,7 @@
"karma-coverage": "^1.1.2",
"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": "^3.10.1",
@@ -73,12 +75,13 @@
},
"scripts": {
"start": "node app.js",
"lint": "eslint platform src openmct.js",
"lint:fix": "eslint platform src 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": "NODE_ENV=production webpack",
"build:dev": "webpack",
"build:watch": "webpack --watch",
"test": "karma start --single-run",
"test-debug": "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",

View File

@@ -31,8 +31,7 @@ define([
"./res/templates/license-apache.html",
"./res/templates/license-mit.html",
"./res/templates/licenses.html",
"./res/templates/licenses-export-md.html",
'legacyRegistry'
"./res/templates/licenses-export-md.html"
], function (
aboutDialogTemplate,
LogoController,
@@ -44,11 +43,12 @@ define([
licenseApacheTemplate,
licenseMitTemplate,
licensesTemplate,
licensesExportMdTemplate,
legacyRegistry
licensesExportMdTemplate
) {
legacyRegistry.register("platform/commonUI/about", {
return {
name:"platform/commonUI/about",
definition: {
"name": "About Open MCT",
"extensions": {
"templates": [
@@ -176,5 +176,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -21,12 +21,6 @@
*****************************************************************************/
define([
"./src/BrowseController",
"./src/PaneController",
"./src/InspectorPaneController",
"./src/BrowseObjectController",
"./src/MenuArrowController",
"./src/ObjectHeaderController",
"./src/navigation/NavigationService",
"./src/navigation/NavigateAction",
"./src/navigation/OrphanNavigationHandler",
@@ -38,15 +32,8 @@ define([
"./res/templates/menu-arrow.html",
"./res/templates/back-arrow.html",
"./res/templates/browse/object-properties.html",
"./res/templates/browse/inspector-region.html",
'legacyRegistry'
"./res/templates/browse/inspector-region.html"
], function (
BrowseController,
PaneController,
InspectorPaneController,
BrowseObjectController,
MenuArrowController,
ObjectHeaderController,
NavigationService,
NavigateAction,
OrphanNavigationHandler,
@@ -58,11 +45,12 @@ define([
menuArrowTemplate,
backArrowTemplate,
objectPropertiesTemplate,
inspectorRegionTemplate,
legacyRegistry
inspectorRegionTemplate
) {
legacyRegistry.register("platform/commonUI/browse", {
return {
name:"platform/commonUI/browse",
definition: {
"extensions": {
"routes": [
],
@@ -73,70 +61,6 @@ define([
"priority": "fallback"
}
],
"controllers": [
{
"key": "BrowseController",
"implementation": BrowseController,
"depends": [
"$scope",
"$route",
"$location",
"objectService",
"navigationService",
"urlService",
"DEFAULT_PATH"
]
},
{
"key": "PaneController",
"implementation": PaneController,
"priority": "preferred",
"depends": [
"$scope",
"agentService",
"$window",
"$location",
"$attrs",
"navigationService"
]
},
{
"key": "BrowseObjectController",
"implementation": BrowseObjectController,
"depends": [
"$scope",
"$location",
"$route"
]
},
{
"key": "MenuArrowController",
"implementation": MenuArrowController,
"depends": [
"$scope"
]
},
{
"key": "InspectorPaneController",
"implementation": InspectorPaneController,
"priority": "preferred",
"depends": [
"$scope",
"agentService",
"$window",
"navigationService",
"$location",
"$attrs"
]
},
{
"key": "ObjectHeaderController",
"implementation": ObjectHeaderController,
"depends": [
"$scope"
]
}
],
"representations": [
{
"key": "browse-object",
@@ -248,5 +172,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -1,215 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/**
* This bundle implements Browse mode.
* @namespace platform/commonUI/browse
*/
define(
['lodash'],
function (_) {
/**
* The BrowseController is used to populate the initial scope in Browse
* mode. It loads the root object from the objectService and makes it
* available in the scope for Angular template's; this is the point at
* which Angular templates first have access to the domain object
* hierarchy.
*
* @memberof platform/commonUI/browse
* @constructor
*/
function BrowseController(
$scope,
$route,
$location,
objectService,
navigationService,
urlService,
defaultPath
) {
window.browseScope = $scope;
var initialPath = ($route.current.params.ids || defaultPath).split("/"),
currentIds;
$scope.treeModel = {
selectedObject: undefined,
onSelection: function (object) {
navigationService.setNavigation(object, true);
},
allowSelection: function (object) {
var domainObjectInView = navigationService.getNavigation(),
isInEditMode = domainObjectInView.getCapability('status').get('editing');
if (isInEditMode) {
var actions = object.getCapability('action'),
previewAction = actions.getActions({key: 'mct-preview-action'})[0];
if (previewAction && previewAction.perform) {
previewAction.perform();
return false;
} else {
return navigationService.shouldNavigate();
}
} else {
return true;
}
}
};
function idsForObject(domainObject) {
return urlService
.urlForLocation("", domainObject)
.replace('/', '');
}
// Find an object in an array of objects.
function findObject(domainObjects, id) {
var i;
for (i = 0; i < domainObjects.length; i += 1) {
if (domainObjects[i].getId() === id) {
return domainObjects[i];
}
}
}
// helper, fetch a single object from the object service.
function getObject(id) {
return objectService.getObjects([id])
.then(function (results) {
return results[id];
});
}
// recursively locate and return an object inside of a container
// via a path. If at any point in the recursion it fails to find
// the next object, it will return the parent.
function findViaComposition(containerObject, path) {
var nextId = path.shift();
if (!nextId) {
return containerObject;
}
return containerObject.useCapability('composition')
.then(function (composees) {
var nextObject = findObject(composees, nextId);
if (!nextObject) {
return containerObject;
}
if (!nextObject.hasCapability('composition')) {
return nextObject;
}
return findViaComposition(nextObject, path);
});
}
function navigateToObject(desiredObject) {
$scope.navigatedObject = desiredObject;
$scope.treeModel.selectedObject = desiredObject;
currentIds = idsForObject(desiredObject);
$route.current.pathParams.ids = currentIds;
$location.path('/browse/' + currentIds);
}
function getLastChildIfRoot(object) {
if (object.getId() !== 'ROOT') {
return object;
}
return object.useCapability('composition')
.then(function (composees) {
return composees[composees.length - 1];
});
}
function navigateToPath(path) {
return getObject('ROOT')
.then(function (root) {
return findViaComposition(root, path);
})
.then(getLastChildIfRoot)
.then(function (object) {
navigationService.setNavigation(object);
});
}
getObject('ROOT')
.then(function (root) {
$scope.domainObject = root;
navigateToPath(initialPath);
});
// Handle navigation events from view service. Only navigates
// if path has changed.
function navigateDirectlyToModel(domainObject) {
var newIds = idsForObject(domainObject);
if (currentIds !== newIds) {
currentIds = newIds;
navigateToObject(domainObject);
}
}
// Listen for changes in navigation state.
navigationService.addListener(navigateDirectlyToModel);
// Listen for route changes which are caused by browser events
// (e.g. bookmarks to pages in OpenMCT) and prevent them. Instead,
// navigate to the path ourselves, which results in it being
// properly set.
$scope.$on('$routeChangeStart', function (event, route, oldRoute) {
if (route.$$route === $route.current.$$route) {
if (route.pathParams.ids &&
route.pathParams.ids !== $route.current.pathParams.ids) {
var otherParams = _.omit(route.params, 'ids');
var oldOtherParams = _.omit(oldRoute.params, 'ids');
var deletedParams = _.omit(oldOtherParams, _.keys(otherParams));
event.preventDefault();
navigateToPath(route.pathParams.ids.split('/'))
.then(function () {
if (!_.isEqual(otherParams, oldOtherParams)) {
_.forEach(otherParams, function (v, k) {
$location.search(k, v);
});
_.forEach(deletedParams, function (k) {
$location.search(k, null);
});
}
});
} else {
navigateToPath([]);
}
}
});
// Clean up when the scope is destroyed
$scope.$on("$destroy", function () {
navigationService.removeListener(navigateDirectlyToModel);
});
}
return BrowseController;
}
);

View File

@@ -1,72 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
[],
function () {
/**
* Controller for the `browse-object` representation of a domain
* object (the right-hand side of Browse mode.)
* @memberof platform/commonUI/browse
* @constructor
*/
function BrowseObjectController($scope, $location, $route) {
function setViewForDomainObject(domainObject) {
var locationViewKey = $location.search().view;
function selectViewIfMatching(view) {
if (view.key === locationViewKey) {
$scope.representation = $scope.representation || {};
$scope.representation.selected = view;
}
}
if (locationViewKey) {
((domainObject && domainObject.useCapability('view')) || [])
.forEach(selectViewIfMatching);
}
}
function updateQueryParam(viewKey) {
if (viewKey && $location.search().view !== viewKey) {
$location.search('view', viewKey);
}
}
$scope.$watch('domainObject', setViewForDomainObject);
$scope.$watch('representation.selected.key', updateQueryParam);
$scope.$on('$locationChangeSuccess', function () {
setViewForDomainObject($scope.domainObject);
});
$scope.doAction = function (action) {
return $scope[action] && $scope[action]();
};
}
return BrowseObjectController;
}
);

View File

@@ -1,78 +0,0 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web 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 Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["./PaneController"],
function (PaneController) {
/**
* Pane controller that reveals inspector, if hidden, when object
* switches to edit mode.
*
* @param $scope
* @param agentService
* @param $window
* @param navigationService
* @constructor
*/
function InspectorPaneController($scope, agentService, $window, navigationService, $location, $attrs) {
PaneController.call(this, $scope, agentService, $window, $location, $attrs);
var statusListener,
self = this;
function showInspector(statuses) {
if (statuses.indexOf('editing') !== -1 && !self.visible()) {
self.toggle();
}
}
function attachStatusListener(domainObject) {
// Remove existing status listener if existing
if (statusListener) {
statusListener();
}
if (domainObject.hasCapability("status")) {
statusListener = domainObject.getCapability("status").listen(showInspector);
}
return statusListener;
}
var domainObject = navigationService.getNavigation();
if (domainObject) {
attachStatusListener(domainObject);
}
navigationService.addListener(attachStatusListener);
$scope.$on("$destroy", function () {
statusListener();
navigationService.removeListener(attachStatusListener);
});
}
InspectorPaneController.prototype = Object.create(PaneController.prototype);
return InspectorPaneController;
}
);

View File

@@ -1,92 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
[],
function () {
/**
* Controller to provide the ability to inline edit an object name.
*
* @constructor
* @memberof platform/commonUI/browse
*/
function ObjectHeaderController($scope) {
this.$scope = $scope;
this.domainObject = $scope.domainObject;
this.editable = this.allowEdit();
}
/**
* Updates the object name on blur and enter keypress events.
*
* @param event the mouse event
*/
ObjectHeaderController.prototype.updateName = function (event) {
if (!event || !event.currentTarget) {
return;
}
if (event.type === 'blur') {
this.updateModel(event);
} else if (event.which === 13) {
this.updateModel(event);
event.currentTarget.blur();
window.getSelection().removeAllRanges();
}
};
/**
* Updates the model.
*
* @param event the mouse event
* @param private
*/
ObjectHeaderController.prototype.updateModel = function (event) {
var name = event.currentTarget.textContent.replace(/\n/g, ' ');
if (name.length === 0) {
name = "Unnamed " + this.domainObject.getCapability("type").typeDef.name;
event.currentTarget.textContent = name;
}
if (name !== this.domainObject.getModel().name) {
this.domainObject.getCapability('mutation').mutate(function (model) {
model.name = name;
});
}
};
/**
* Checks if the domain object is editable.
*
* @private
* @return true if object is editable
*/
ObjectHeaderController.prototype.allowEdit = function () {
var type = this.domainObject && this.domainObject.getCapability('type');
return !!(type && type.hasFeature('creation'));
};
return ObjectHeaderController;
}
);

View File

@@ -1,88 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
[],
function () {
var navigationListenerAdded = false;
/**
* Controller to provide the ability to show/hide the tree in
* Browse mode.
* @constructor
* @memberof platform/commonUI/browse
*/
function PaneController($scope, agentService, $window, $location, $attrs, navigationService) {
var self = this;
this.agentService = agentService;
var hideParameterPresent = $location.search().hasOwnProperty($attrs.hideParameter);
if ($attrs.hideParameter && hideParameterPresent) {
this.state = false;
$location.search($attrs.hideParameter, undefined);
} else {
this.state = true;
}
/**
* Callback to invoke when any selection occurs in the tree.
* This controller can be passed in as the `parameters` object
* to the tree representation.
*
* @property {Function} callback
* @memberof platform/commonUI/browse.PaneController#
*/
this.callback = function () {
// Note that, since this is a callback to pass, this is not
// declared as a method but as a property which happens to
// be a function.
if (agentService.isPhone() && agentService.isPortrait()) {
// On phones, trees should collapse in portrait mode
// when something is navigated-to.
self.state = false;
}
};
if (navigationService && navigationService.addListener && !navigationListenerAdded) {
navigationService.addListener(this.callback);
navigationListenerAdded = true;
}
}
/**
* Toggle the visibility of the pane.
*/
PaneController.prototype.toggle = function () {
this.state = !this.state;
};
/**
* Get the desired visibility state of the pane.
* @returns {boolean} true when visible
*/
PaneController.prototype.visible = function () {
return !!this.state;
};
return PaneController;
}
);

View File

@@ -1,266 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global console*/
/**
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
*/
define(
[
"../src/BrowseController",
"../src/navigation/NavigationService"
],
function (
BrowseController,
NavigationService
) {
describe("The browse controller", function () {
var mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService,
mockRootObject,
mockUrlService,
mockDefaultRootObject,
mockOtherDomainObject,
mockNextObject,
testDefaultRoot,
controller;
function waitsForNavigation() {
return new Promise(function (resolve) {
mockNavigationService.setNavigation.and.callFake(function (obj) {
var returnValue;
try {
returnValue = NavigationService.prototype.setNavigation.call(mockNavigationService, obj);
} catch (err) {
console.error(err);
//Not rejecting because 'setNavigation' has been called, which is what's being tested here.
//Rejecting will fail tests.
}
resolve();
return returnValue;
});
});
}
function instantiateController() {
controller = new BrowseController(
mockScope,
mockRoute,
mockLocation,
mockObjectService,
mockNavigationService,
mockUrlService,
testDefaultRoot
);
}
beforeEach(function () {
testDefaultRoot = "some-root-level-domain-object";
mockScope = jasmine.createSpyObj(
"$scope",
["$on", "$watch"]
);
mockRoute = { current: { params: {}, pathParams: {} } };
mockUrlService = jasmine.createSpyObj(
"urlService",
["urlForLocation"]
);
mockUrlService.urlForLocation.and.callFake(function (mode, object) {
if (object === mockDefaultRootObject) {
return [mode, testDefaultRoot].join('/');
}
if (object === mockOtherDomainObject) {
return [mode, 'other'].join('/');
}
if (object === mockNextObject) {
return [mode, testDefaultRoot, 'next'].join('/');
}
throw new Error('Tried to get url for unexpected object');
});
mockLocation = jasmine.createSpyObj(
"$location",
["path"]
);
mockObjectService = jasmine.createSpyObj(
"objectService",
["getObjects"]
);
mockNavigationService = new NavigationService({});
[
"getNavigation",
"setNavigation",
"addListener",
"removeListener"
].forEach(function (method) {
spyOn(mockNavigationService, method)
.and.callThrough();
});
mockRootObject = jasmine.createSpyObj(
"rootObjectContainer",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockDefaultRootObject = jasmine.createSpyObj(
"defaultRootObject",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockOtherDomainObject = jasmine.createSpyObj(
"otherDomainObject",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockNextObject = jasmine.createSpyObj(
"nestedDomainObject",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockObjectService.getObjects.and.returnValue(Promise.resolve({
ROOT: mockRootObject
}));
mockRootObject.useCapability.and.returnValue(Promise.resolve([
mockOtherDomainObject,
mockDefaultRootObject
]));
mockRootObject.hasCapability.and.returnValue(true);
mockDefaultRootObject.useCapability.and.returnValue(Promise.resolve([
mockNextObject
]));
mockDefaultRootObject.hasCapability.and.returnValue(true);
mockOtherDomainObject.hasCapability.and.returnValue(false);
mockNextObject.useCapability.and.returnValue(undefined);
mockNextObject.hasCapability.and.returnValue(false);
mockNextObject.getId.and.returnValue("next");
mockDefaultRootObject.getId.and.returnValue(testDefaultRoot);
instantiateController();
return waitsForNavigation();
});
it("uses composition to set the navigated object, if there is none", function () {
instantiateController();
return waitsForNavigation().then(function () {
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDefaultRootObject);
});
});
it("navigates to a root-level object, even when default path is not found", function () {
mockDefaultRootObject.getId
.and.returnValue("something-other-than-the-" + testDefaultRoot);
instantiateController();
return waitsForNavigation().then(function () {
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDefaultRootObject);
});
});
it("does not try to override navigation", function () {
mockNavigationService.getNavigation.and.returnValue(mockDefaultRootObject);
instantiateController();
return waitsForNavigation().then(function () {
expect(mockScope.navigatedObject).toBe(mockDefaultRootObject);
});
});
it("updates scope when navigated object changes", function () {
// Should have registered a listener - call it
mockNavigationService.addListener.calls.mostRecent().args[0](
mockOtherDomainObject
);
expect(mockScope.navigatedObject).toEqual(mockOtherDomainObject);
});
it("releases its navigation listener when its scope is destroyed", function () {
expect(mockScope.$on).toHaveBeenCalledWith(
"$destroy",
jasmine.any(Function)
);
mockScope.$on.calls.mostRecent().args[1]();
// Should remove the listener it added earlier
expect(mockNavigationService.removeListener).toHaveBeenCalledWith(
mockNavigationService.addListener.calls.mostRecent().args[0]
);
});
it("uses route parameters to choose initially-navigated object", function () {
mockRoute.current.params.ids = testDefaultRoot + "/next";
instantiateController();
return waitsForNavigation().then(function () {
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
});
});
it("handles invalid IDs by going as far as possible", function () {
// Idea here is that if we get a bad path of IDs,
// browse controller should traverse down it until
// it hits an invalid ID.
mockRoute.current.params.ids = testDefaultRoot + "/junk";
instantiateController();
return waitsForNavigation().then(function () {
expect(mockScope.navigatedObject).toBe(mockDefaultRootObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDefaultRootObject);
});
});
it("handles compositionless objects by going as far as possible", function () {
// Idea here is that if we get a path which passes
// through an object without a composition, browse controller
// should stop at it since remaining IDs cannot be loaded.
mockRoute.current.params.ids = testDefaultRoot + "/next/junk";
instantiateController();
return waitsForNavigation().then(function () {
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
});
});
it("updates the displayed route to reflect current navigation", function () {
// In order to trigger a route update and not a route change,
// the current route must be updated before location.path is
// called.
expect(mockRoute.current.pathParams.ids)
.not
.toBe(testDefaultRoot + '/next');
mockLocation.path.and.callFake(function () {
expect(mockRoute.current.pathParams.ids)
.toBe(testDefaultRoot + '/next');
});
mockNavigationService.addListener.calls.mostRecent().args[0](
mockNextObject
);
expect(mockLocation.path).toHaveBeenCalledWith(
'/browse/' + testDefaultRoot + '/next'
);
});
});
}
);

View File

@@ -1,93 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../src/BrowseObjectController"],
function (BrowseObjectController) {
describe("The browse object controller", function () {
var mockScope,
mockLocation,
mockRoute,
controller;
// Utility function; look for a $watch on scope and fire it
function fireWatch(expr, value) {
mockScope.$watch.calls.all().forEach(function (call) {
if (call.args[0] === expr) {
call.args[1](value);
}
});
}
beforeEach(function () {
mockScope = jasmine.createSpyObj(
"$scope",
["$on", "$watch"]
);
mockRoute = { current: { params: {} } };
mockLocation = jasmine.createSpyObj(
"$location",
["path", "search"]
);
mockLocation.search.and.returnValue({});
controller = new BrowseObjectController(
mockScope,
mockLocation,
mockRoute
);
});
it("updates query parameters when selected view changes", function () {
fireWatch("representation.selected.key", "xyz");
expect(mockLocation.search).toHaveBeenCalledWith('view', "xyz");
// Allows the path index to be checked
// prior to setting $route.current
mockLocation.path.and.returnValue("/browse/");
});
it("sets the active view from query parameters", function () {
var mockDomainObject = jasmine.createSpyObj(
"domainObject",
['getId', 'getModel', 'getCapability', 'useCapability']
),
testViews = [
{ key: 'abc' },
{ key: 'def', someKey: 'some value' },
{ key: 'xyz' }
];
mockDomainObject.useCapability.and.callFake(function (c) {
return (c === 'view') && testViews;
});
mockLocation.search.and.returnValue({ view: 'def' });
fireWatch('domainObject', mockDomainObject);
expect(mockScope.representation.selected)
.toEqual(testViews[1]);
});
});
}
);

View File

@@ -1,103 +0,0 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web 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 Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../src/InspectorPaneController"],
function (InspectorPaneController) {
describe("The InspectorPaneController", function () {
var mockScope,
mockAgentService,
mockDomainObject,
mockWindow,
mockStatusCapability,
mockNavigationService,
mockNavigationUnlistener,
mockStatusUnlistener,
controller,
mockLocation,
mockAttrs;
beforeEach(function () {
mockScope = jasmine.createSpyObj("$scope", ["$on"]);
mockWindow = jasmine.createSpyObj("$window", ["open"]);
mockAgentService = jasmine.createSpyObj(
"agentService",
["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"]
);
mockNavigationUnlistener = jasmine.createSpy("navigationUnlistener");
mockNavigationService = jasmine.createSpyObj(
"navigationService",
["getNavigation", "addListener"]
);
mockNavigationService.addListener.and.returnValue(mockNavigationUnlistener);
mockStatusUnlistener = jasmine.createSpy("statusUnlistener");
mockStatusCapability = jasmine.createSpyObj(
"statusCapability",
["listen"]
);
mockStatusCapability.listen.and.returnValue(mockStatusUnlistener);
mockDomainObject = jasmine.createSpyObj(
'domainObject',
[
'getId',
'getModel',
'getCapability',
'hasCapability'
]
);
mockDomainObject.getId.and.returnValue("domainObject");
mockDomainObject.getModel.and.returnValue({});
mockDomainObject.hasCapability.and.returnValue(true);
mockDomainObject.getCapability.and.returnValue(mockStatusCapability);
mockLocation = jasmine.createSpyObj('location', ['search']);
mockLocation.search.and.returnValue({});
mockAttrs = {};
controller = new InspectorPaneController(mockScope, mockAgentService, mockWindow, mockNavigationService, mockLocation, mockAttrs);
});
it("listens for changes to navigation and attaches a status" +
" listener", function () {
expect(mockNavigationService.addListener).toHaveBeenCalledWith(jasmine.any(Function));
mockNavigationService.addListener.calls.mostRecent().args[0](mockDomainObject);
expect(mockStatusCapability.listen).toHaveBeenCalledWith(jasmine.any(Function));
});
it("if hidden, shows the inspector when domain object switches to" +
" edit mode", function () {
controller.toggle();
// test pre-condition that inspector is hidden
expect(controller.visible()).toBe(false);
mockNavigationService.addListener.calls.mostRecent().args[0](mockDomainObject);
mockStatusCapability.listen.calls.mostRecent().args[0](["editing"]);
expect(controller.visible()).toBe(true);
});
});
}
);

View File

@@ -1,79 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/**
* MenuArrowControllerSpec. Created by shale on 07/02/2015.
*/
define(
["../src/MenuArrowController"],
function (MenuArrowController) {
describe("The menu arrow controller ", function () {
var mockScope,
mockDomainObject,
mockEvent,
mockContextMenuAction,
mockActionContext,
controller;
beforeEach(function () {
mockScope = jasmine.createSpyObj(
"$scope",
[""]
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
["getCapability"]
);
mockEvent = jasmine.createSpyObj(
"event",
["preventDefault"]
);
mockContextMenuAction = jasmine.createSpyObj(
"action",
["perform", "getActions"]
);
mockActionContext = jasmine.createSpyObj(
"actionContext",
[""]
);
mockActionContext.domainObject = mockDomainObject;
mockActionContext.event = mockEvent;
mockScope.domainObject = mockDomainObject;
mockDomainObject.getCapability.and.returnValue(mockContextMenuAction);
mockContextMenuAction.perform.and.returnValue(jasmine.any(Function));
controller = new MenuArrowController(mockScope);
});
it("calls the context menu action when clicked", function () {
// Simulate a click on the menu arrow
controller.showMenu(mockEvent);
// Expect the menu action to be performed
expect(mockDomainObject.getCapability).toHaveBeenCalledWith('action');
expect(mockContextMenuAction.perform).toHaveBeenCalled();
});
});
}
);

View File

@@ -1,137 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../src/ObjectHeaderController"],
function (ObjectHeaderController) {
describe("The object header controller", function () {
var mockScope,
mockDomainObject,
mockCapabilities,
mockMutationCapability,
mockTypeCapability,
mockEvent,
mockCurrentTarget,
model,
controller;
beforeEach(function () {
mockMutationCapability = jasmine.createSpyObj("mutation", ["mutate"]);
mockTypeCapability = jasmine.createSpyObj("type", ["typeDef", "hasFeature"]);
mockTypeCapability.typeDef = { name: ""};
mockTypeCapability.hasFeature.and.callFake(function (feature) {
return feature === 'creation';
});
mockCapabilities = {
mutation: mockMutationCapability,
type: mockTypeCapability
};
model = {
name: "Test name"
};
mockDomainObject = jasmine.createSpyObj("domainObject", ["getCapability", "getModel"]);
mockDomainObject.getModel.and.returnValue(model);
mockDomainObject.getCapability.and.callFake(function (key) {
return mockCapabilities[key];
});
mockScope = {
domainObject: mockDomainObject
};
mockCurrentTarget = jasmine.createSpyObj("currentTarget", ["blur", "textContent"]);
mockCurrentTarget.blur.and.returnValue(mockCurrentTarget);
mockEvent = {
which: {},
type: {},
currentTarget: mockCurrentTarget
};
controller = new ObjectHeaderController(mockScope);
});
it("updates the model with new name on blur", function () {
mockEvent.type = "blur";
mockCurrentTarget.textContent = "New name";
controller.updateName(mockEvent);
expect(mockMutationCapability.mutate).toHaveBeenCalled();
});
it("updates the model with a default for blank names", function () {
mockEvent.type = "blur";
mockCurrentTarget.textContent = "";
controller.updateName(mockEvent);
expect(mockCurrentTarget.textContent.length).not.toEqual(0);
expect(mockMutationCapability.mutate).toHaveBeenCalled();
});
it("does not update the model if the same name", function () {
mockEvent.type = "blur";
mockCurrentTarget.textContent = mockDomainObject.getModel().name;
controller.updateName(mockEvent);
expect(mockMutationCapability.mutate).not.toHaveBeenCalled();
});
it("updates the model on enter keypress event only", function () {
mockCurrentTarget.textContent = "New name";
controller.updateName(mockEvent);
expect(mockMutationCapability.mutate).not.toHaveBeenCalled();
mockEvent.which = 13;
controller.updateName(mockEvent);
expect(mockMutationCapability.mutate).toHaveBeenCalledWith(jasmine.any(Function));
mockMutationCapability.mutate.calls.mostRecent().args[0](model);
expect(mockDomainObject.getModel().name).toBe("New name");
});
it("blurs the field on enter key press", function () {
mockCurrentTarget.textContent = "New name";
mockEvent.which = 13;
controller.updateName(mockEvent);
expect(mockEvent.currentTarget.blur).toHaveBeenCalled();
});
it("allows editting name when object is creatable", function () {
expect(controller.allowEdit()).toBe(true);
});
it("disallows editting name when object is non-creatable", function () {
mockTypeCapability.hasFeature.and.returnValue(false);
expect(controller.allowEdit()).toBe(false);
});
});
}
);

View File

@@ -1,106 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../src/PaneController"],
function (PaneController) {
describe("The PaneController", function () {
var mockScope,
mockAgentService,
mockWindow,
controller,
mockLocation,
mockAttrs;
// We want to reinstantiate for each test case
// because device state can influence constructor-time behavior
function instantiateController() {
return new PaneController(
mockScope,
mockAgentService,
mockWindow,
mockLocation,
mockAttrs
);
}
beforeEach(function () {
mockScope = jasmine.createSpyObj("$scope", ["$on"]);
mockAgentService = jasmine.createSpyObj(
"agentService",
["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"]
);
mockWindow = jasmine.createSpyObj("$window", ["open"]);
mockLocation = jasmine.createSpyObj('location', ['search']);
mockLocation.search.and.returnValue({});
mockAttrs = {};
});
it("is initially visible", function () {
expect(instantiateController().visible()).toBeTruthy();
});
it("allows visibility to be toggled", function () {
controller = instantiateController();
controller.toggle();
expect(controller.visible()).toBeFalsy();
controller.toggle();
expect(controller.visible()).toBeTruthy();
});
it("collapses on navigation changes on portrait-oriented phones", function () {
mockAgentService.isMobile.and.returnValue(true);
mockAgentService.isPhone.and.returnValue(true);
mockAgentService.isPortrait.and.returnValue(true);
controller = instantiateController();
expect(controller.visible()).toBeTruthy();
// Simulate a change from the tree by invoking controller's
controller.callback();
// Tree should have collapsed
expect(controller.visible()).toBeFalsy();
});
describe("specifying hideParameter", function () {
beforeEach(function () {
mockAttrs = {hideParameter: 'hideTree'};
});
it("sets pane state to false when in location.search", function () {
mockLocation.search.and.returnValue({'hideTree': true});
expect(instantiateController().visible()).toBe(false);
expect(mockLocation.search).toHaveBeenCalledWith('hideTree', undefined);
});
it("sets state to true when not found in location.search", function () {
mockLocation.search.and.returnValue({});
expect(instantiateController().visible()).toBe(true);
expect(mockLocation.search).not.toHaveBeenCalledWith('hideTree', undefined);
});
});
});
}
);

View File

@@ -30,8 +30,7 @@ define([
"./res/templates/message.html",
"./res/templates/notification-message.html",
"./res/templates/overlay-message-list.html",
"./res/templates/overlay.html",
'legacyRegistry'
"./res/templates/overlay.html"
], function (
DialogService,
OverlayService,
@@ -42,11 +41,12 @@ define([
messageTemplate,
notificationMessageTemplate,
overlayMessageListTemplate,
overlayTemplate,
legacyRegistry
overlayTemplate
) {
legacyRegistry.register("platform/commonUI/dialog", {
return {
name:"platform/commonUI/dialog",
definition: {
"extensions": {
"services": [
{
@@ -107,5 +107,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -27,7 +27,6 @@ define([
"./src/actions/EditAndComposeAction",
"./src/actions/EditAction",
"./src/actions/PropertiesAction",
"./src/actions/RemoveAction",
"./src/actions/SaveAction",
"./src/actions/SaveAndStopEditingAction",
"./src/actions/SaveAsAction",
@@ -49,8 +48,7 @@ define([
"./res/templates/library.html",
"./res/templates/edit-object.html",
"./res/templates/edit-action-buttons.html",
"./res/templates/topbar-edit.html",
'legacyRegistry'
"./res/templates/topbar-edit.html"
], function (
EditActionController,
EditPanesController,
@@ -58,7 +56,6 @@ define([
EditAndComposeAction,
EditAction,
PropertiesAction,
RemoveAction,
SaveAction,
SaveAndStopEditingAction,
SaveAsAction,
@@ -80,11 +77,11 @@ define([
libraryTemplate,
editObjectTemplate,
editActionButtonsTemplate,
topbarEditTemplate,
legacyRegistry
topbarEditTemplate
) {
legacyRegistry.register("platform/commonUI/edit", {
return {
name: "platform/commonUI/edit",
definition: {
"extensions": {
"controllers": [
{
@@ -158,18 +155,6 @@ define([
"dialogService"
]
},
{
"key": "remove",
"category": "legacy",
"implementation": RemoveAction,
"cssClass": "icon-trash",
"name": "Remove",
"description": "Remove this object from its containing object.",
"depends": [
"openmct",
"navigationService"
]
},
{
"key": "save-and-stop-editing",
"category": "save",
@@ -363,5 +348,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -1,131 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/**
* Module defining RemoveAction. Created by vwoeltje on 11/17/14.
*/
define([], function () {
/**
* Construct an action which will remove the provided object manifestation.
* The object will be removed from its parent's composition; the parent
* is looked up via the "context" capability (so this will be the
* immediate ancestor by which this specific object was reached.)
*
* @param {DialogService} dialogService a service which will show the dialog
* @param {NavigationService} navigationService a service that maintains the current navigation state
* @param {ActionContext} context the context in which this action is performed
* @memberof platform/commonUI/edit
* @constructor
* @implements {Action}
*/
function RemoveAction(openmct, navigationService, context) {
this.domainObject = (context || {}).domainObject;
this.openmct = openmct;
this.navigationService = navigationService;
}
/**
* Perform this action.
*/
RemoveAction.prototype.perform = function () {
var dialog,
domainObject = this.domainObject,
navigationService = this.navigationService;
/*
* Check whether an object ID matches the ID of the object being
* removed (used to filter a parent's composition to handle the
* removal.)
*/
function isNotObject(otherObjectId) {
return otherObjectId !== domainObject.getId();
}
/*
* Mutate a parent object such that it no longer contains the object
* which is being removed.
*/
function doMutate(model) {
model.composition = model.composition.filter(isNotObject);
}
/*
* Checks current object and ascendants of current
* object with object being removed, if the current
* object or any in the current object's path is being removed,
* navigate back to parent of removed object.
*/
function checkObjectNavigation(object, parentObject) {
// Traverse object starts at current location
var traverseObject = (navigationService).getNavigation(),
context;
// Stop when object is not defined (above ROOT)
while (traverseObject) {
// If object currently traversed to is object being removed
// navigate to parent of current object and then exit loop
if (traverseObject.getId() === object.getId()) {
navigationService.setNavigation(parentObject);
return;
}
// Traverses to parent of current object, moving
// up the ascendant path
context = traverseObject.getCapability('context');
traverseObject = context && context.getParent();
}
}
/*
* Remove the object from its parent, as identified by its context
* capability. Based on object's location and selected object's location
* user may be navigated to existing parent object
*/
function removeFromContext() {
var contextCapability = domainObject.getCapability('context'),
parent = contextCapability.getParent();
// If currently within path of removed object(s),
// navigates to existing object up tree
checkObjectNavigation(domainObject, parent);
return parent.useCapability('mutation', doMutate);
}
removeFromContext();
};
// Object needs to have a parent for Remove to be applicable
RemoveAction.appliesTo = function (context) {
var object = (context || {}).domainObject,
contextCapability = object && object.getCapability("context"),
parent = contextCapability && contextCapability.getParent(),
parentType = parent && parent.getCapability('type'),
parentCreatable = parentType && parentType.hasFeature('creation');
// Only creatable types should be modifiable
return parent !== undefined &&
Array.isArray(parent.getModel().composition) &&
parentCreatable;
};
return RemoveAction;
});

View File

@@ -6,7 +6,7 @@ define([], function () {
SaveInProgressDialog.prototype.show = function () {
this.dialog = this.dialogService.showBlockingMessage({
title: "Saving...",
title: "Saving",
hint: "Do not navigate away from this page or close this browser tab while this message is displayed.",
unknownProgress: true,
severity: "info",

View File

@@ -1,255 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2018, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../../src/actions/RemoveAction"],
function (RemoveAction) {
describe("The Remove action", function () {
var action,
actionContext,
capabilities,
mockContext,
mockOverlayAPI,
mockDomainObject,
mockMutation,
mockNavigationService,
mockParent,
mockType,
model;
beforeEach(function () {
mockDomainObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability", "getModel"]
);
mockMutation = jasmine.createSpyObj("mutation", ["invoke"]);
mockType = jasmine.createSpyObj("type", ["hasFeature"]);
mockType.hasFeature.and.returnValue(true);
capabilities = {
mutation: mockMutation,
type: mockType
};
model = {
composition: ["a", "test", "b"]
};
mockParent = {
getModel: function () {
return model;
},
getCapability: function (k) {
return capabilities[k];
},
useCapability: function (k, v) {
return capabilities[k].invoke(v);
}
};
mockOverlayAPI = jasmine.createSpyObj(
"overlayAPI",
["dialog"]
);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[
"getNavigation",
"setNavigation",
"addListener",
"removeListener"
]
);
mockNavigationService.getNavigation.and.returnValue(mockDomainObject);
mockContext = jasmine.createSpyObj("context", ["getParent"]);
mockContext.getParent.and.returnValue(mockParent);
mockDomainObject.getId.and.returnValue("test");
mockDomainObject.getCapability.and.returnValue(mockContext);
mockDomainObject.getModel.and.returnValue({name: 'test object'});
mockContext.getParent.and.returnValue(mockParent);
mockType.hasFeature.and.returnValue(true);
actionContext = { domainObject: mockDomainObject };
action = new RemoveAction({overlays: mockOverlayAPI}, mockNavigationService, actionContext);
});
it("only applies to objects with parents", function () {
expect(RemoveAction.appliesTo(actionContext)).toBeTruthy();
mockContext.getParent.and.returnValue(undefined);
expect(RemoveAction.appliesTo(actionContext)).toBeFalsy();
// Also verify that creatability was checked
expect(mockType.hasFeature).toHaveBeenCalledWith('creation');
});
it("shows a blocking message dialog", function () {
mockParent = jasmine.createSpyObj(
"parent",
["getModel", "getCapability", "useCapability"]
);
action.perform();
expect(mockOverlayAPI.dialog).toHaveBeenCalled();
// Also check that no mutation happens at this point
expect(mockParent.useCapability).not.toHaveBeenCalledWith("mutation", jasmine.any(Function));
});
describe("after the remove callback is triggered", function () {
var mockChildContext,
mockChildObject,
mockDialogHandle,
mockGrandchildContext,
mockGrandchildObject,
mockRootContext,
mockRootObject;
beforeEach(function () {
mockChildObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability"]
);
mockDialogHandle = jasmine.createSpyObj(
"dialogHandle",
["dismiss"]
);
mockGrandchildObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability"]
);
mockRootObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability"]
);
mockChildContext = jasmine.createSpyObj("context", ["getParent"]);
mockGrandchildContext = jasmine.createSpyObj("context", ["getParent"]);
mockRootContext = jasmine.createSpyObj("context", ["getParent"]);
mockOverlayAPI.dialog.and.returnValue(mockDialogHandle);
});
it("mutates the parent when performed", function () {
action.perform();
mockOverlayAPI.dialog.calls.mostRecent().args[0]
.buttons[0].callback();
expect(mockMutation.invoke)
.toHaveBeenCalledWith(jasmine.any(Function));
});
it("changes composition from its mutation function", function () {
var mutator, result;
action.perform();
mockOverlayAPI.dialog.calls.mostRecent().args[0]
.buttons[0].callback();
mutator = mockMutation.invoke.calls.mostRecent().args[0];
result = mutator(model);
// Should not have cancelled the mutation
expect(result).not.toBe(false);
// Simulate mutate's behavior (remove can either return a
// new model or modify this one in-place)
result = result || model;
// Should have removed "test" - that was our
// mock domain object's id.
expect(result.composition).toEqual(["a", "b"]);
});
it("removes parent of object currently navigated to", function () {
// Navigates to child object
mockNavigationService.getNavigation.and.returnValue(mockChildObject);
// Test is id of object being removed
// Child object has different id
mockDomainObject.getId.and.returnValue("test");
mockChildObject.getId.and.returnValue("not test");
// Sets context for the child and domainObject
mockDomainObject.getCapability.and.returnValue(mockContext);
mockChildObject.getCapability.and.returnValue(mockChildContext);
// Parents of child and domainObject are set
mockContext.getParent.and.returnValue(mockParent);
mockChildContext.getParent.and.returnValue(mockDomainObject);
mockType.hasFeature.and.returnValue(true);
action.perform();
mockOverlayAPI.dialog.calls.mostRecent().args[0]
.buttons[0].callback();
// Expects navigation to parent of domainObject (removed object)
expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(mockParent);
});
it("checks if removing object not in ascendent path (reaches ROOT)", function () {
// Navigates to grandchild of ROOT
mockNavigationService.getNavigation.and.returnValue(mockGrandchildObject);
// domainObject (grandparent) is set as ROOT, child and grandchild
// are set objects not being removed
mockDomainObject.getId.and.returnValue("test 1");
mockRootObject.getId.and.returnValue("ROOT");
mockChildObject.getId.and.returnValue("not test 2");
mockGrandchildObject.getId.and.returnValue("not test 3");
// Sets context for the grandchild, child, and domainObject
mockRootObject.getCapability.and.returnValue(mockRootContext);
mockChildObject.getCapability.and.returnValue(mockChildContext);
mockGrandchildObject.getCapability.and.returnValue(mockGrandchildContext);
// Parents of grandchild and child are set
mockChildContext.getParent.and.returnValue(mockRootObject);
mockGrandchildContext.getParent.and.returnValue(mockChildObject);
mockType.hasFeature.and.returnValue(true);
action.perform();
mockOverlayAPI.dialog.calls.mostRecent().args[0]
.buttons[0].callback();
// Expects no navigation to occur
expect(mockNavigationService.setNavigation).not.toHaveBeenCalled();
});
});
});
}
);

View File

@@ -25,7 +25,7 @@ define(
["../../src/actions/SaveAsAction"],
function (SaveAsAction) {
describe("The Save As action", function () {
xdescribe("The Save As action", function () {
var mockDomainObject,
mockClonedObject,
mockEditorCapability,

View File

@@ -24,7 +24,7 @@ define(
["../../src/capabilities/EditorCapability"],
function (EditorCapability) {
describe("The editor capability", function () {
xdescribe("The editor capability", function () {
var mockDomainObject,
capabilities,
mockParentObject,

View File

@@ -27,7 +27,7 @@ define(
["../../src/creation/CreateAction"],
function (CreateAction) {
describe("The create action", function () {
xdescribe("The create action", function () {
var mockType,
mockParent,
mockContext,

View File

@@ -27,7 +27,7 @@ define(
["../../src/creation/CreateWizard"],
function (CreateWizard) {
describe("The create wizard", function () {
xdescribe("The create wizard", function () {
var mockType,
mockParent,
mockProperties,

View File

@@ -23,16 +23,16 @@
define([
"./src/FormatProvider",
"./src/UTCTimeFormat",
"./src/DurationFormat",
'legacyRegistry'
"./src/DurationFormat"
], function (
FormatProvider,
UTCTimeFormat,
DurationFormat,
legacyRegistry
DurationFormat
) {
legacyRegistry.register("platform/commonUI/formats", {
return {
name:"platform/commonUI/formats",
definition: {
"name": "Format Registry",
"description": "Provides a registry for formats, which allow parsing and formatting of values.",
"extensions": {
@@ -74,5 +74,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -66,8 +66,7 @@ define([
"./res/templates/object-inspector.html",
"./res/templates/controls/selector.html",
"./res/templates/controls/datetime-picker.html",
"./res/templates/controls/datetime-field.html",
'legacyRegistry'
"./res/templates/controls/datetime-field.html"
], function (
UrlService,
PopupService,
@@ -114,11 +113,12 @@ define([
objectInspectorTemplate,
selectorTemplate,
datetimePickerTemplate,
datetimeFieldTemplate,
legacyRegistry
datetimeFieldTemplate
) {
legacyRegistry.register("platform/commonUI/general", {
return {
name:"platform/commonUI/general",
definition: {
"name": "General UI elements",
"description": "General UI elements, meant to be reused across modes",
"resources": "res",
@@ -524,5 +524,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -21,7 +21,6 @@
-->
<!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! -->
<div class="c-indicator {{ngModel.getCssClass()}}"
title="{{ngModel.getDescription()}}"
ng-show="ngModel.getText().length > 0">
<span class="label c-indicator__label">{{ngModel.getText()}}</span>
</div>

View File

@@ -26,7 +26,7 @@ define([
'zepto'
], function (TreeView, $) {
describe("TreeView", function () {
xdescribe("TreeView", function () {
var mockGestureService,
mockGestureHandle,
mockDomainObject,

View File

@@ -27,8 +27,7 @@ define([
"./res/info-table.html",
"./res/info-bubble.html",
"./res/bubble.html",
"./res/templates/info-button.html",
'legacyRegistry'
"./res/templates/info-button.html"
], function (
InfoGesture,
InfoButtonGesture,
@@ -36,11 +35,12 @@ define([
infoTableTemplate,
infoBubbleTemplate,
bubbleTemplate,
infoButtonTemplate,
legacyRegistry
infoButtonTemplate
) {
legacyRegistry.register("platform/commonUI/inspect", {
return {
name:"platform/commonUI/inspect",
definition: {
"extensions": {
"templates": [
{
@@ -112,5 +112,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -23,16 +23,16 @@
define([
"./src/MCTDevice",
"./src/AgentService",
"./src/DeviceClassifier",
'legacyRegistry'
"./src/DeviceClassifier"
], function (
MCTDevice,
AgentService,
DeviceClassifier,
legacyRegistry
DeviceClassifier
) {
legacyRegistry.register("platform/commonUI/mobile", {
return {
name:"platform/commonUI/mobile",
definition: {
"extensions": {
"directives": [
{
@@ -62,5 +62,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -24,17 +24,17 @@ define([
"./src/NotificationIndicatorController",
"./src/NotificationIndicator",
"./src/NotificationService",
"./res/notification-indicator.html",
'legacyRegistry'
"./res/notification-indicator.html"
], function (
NotificationIndicatorController,
NotificationIndicator,
NotificationService,
notificationIndicatorTemplate,
legacyRegistry
notificationIndicatorTemplate
) {
legacyRegistry.register("platform/commonUI/notification", {
return {
name:"platform/commonUI/notification",
definition: {
"extensions": {
"templates": [
{
@@ -71,5 +71,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -24,7 +24,7 @@ define(
['../src/NotificationIndicatorController'],
function (NotificationIndicatorController) {
describe("The notification indicator controller ", function () {
xdescribe("The notification indicator controller ", function () {
var mockNotificationService,
mockScope,
mockDialogService,

View File

@@ -22,15 +22,15 @@
define([
'./src/InspectorController',
'./src/EditableRegionPolicy',
'legacyRegistry'
'./src/EditableRegionPolicy'
], function (
InspectorController,
EditableRegionPolicy,
legacyRegistry
EditableRegionPolicy
) {
legacyRegistry.register("platform/commonUI/regions", {
return {
name:"platform/commonUI/regions",
definition: {
"extensions": {
"controllers": [
{
@@ -50,5 +50,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -25,18 +25,18 @@ define([
"./src/CompositionMutabilityPolicy",
"./src/CompositionModelPolicy",
"./src/ComposeActionPolicy",
"./src/PersistableCompositionPolicy",
'legacyRegistry'
"./src/PersistableCompositionPolicy"
], function (
CompositionPolicy,
CompositionMutabilityPolicy,
CompositionModelPolicy,
ComposeActionPolicy,
PersistableCompositionPolicy,
legacyRegistry
PersistableCompositionPolicy
) {
legacyRegistry.register("platform/containment", {
return {
name:"platform/containment",
definition: {
"extensions": {
"policies": [
{
@@ -71,5 +71,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -23,7 +23,7 @@
define(
["../src/ComposeActionPolicy"],
function (ComposeActionPolicy) {
describe("The compose action policy", function () {
xdescribe("The compose action policy", function () {
var mockInjector,
mockPolicyService,
mockTypes,

View File

@@ -49,8 +49,7 @@ define([
"./src/services/Now",
"./src/services/Throttle",
"./src/services/Topic",
"./src/services/Instantiate",
'legacyRegistry'
"./src/services/Instantiate"
], function (
DomainObjectProvider,
CoreCapabilityProvider,
@@ -80,11 +79,12 @@ define([
Now,
Throttle,
Topic,
Instantiate,
legacyRegistry
Instantiate
) {
legacyRegistry.register("platform/core", {
return {
name:"platform/core",
definition: {
"name": "Open MCT Core",
"description": "Defines core concepts of Open MCT.",
"sources": "src",
@@ -387,5 +387,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -34,8 +34,7 @@ define([
"./src/services/MoveService",
"./src/services/LinkService",
"./src/services/CopyService",
"./src/services/LocationService",
'legacyRegistry'
"./src/services/LocationService"
], function (
MoveAction,
CopyAction,
@@ -50,11 +49,12 @@ define([
MoveService,
LinkService,
CopyService,
LocationService,
legacyRegistry
LocationService
) {
legacyRegistry.register("platform/entanglement", {
return {
name:"platform/entanglement",
definition: {
"name": "Entanglement",
"description": "Tools to assist you in entangling the world of WARP.",
"configuration": {},
@@ -197,5 +197,6 @@ define([
],
"licenses": []
}
});
}
};
});

View File

@@ -42,7 +42,7 @@ define(
return promise;
}
describe("CopyService", function () {
xdescribe("CopyService", function () {
var policyService;
beforeEach(function () {

View File

@@ -29,7 +29,7 @@ define(
],
function (LinkService, domainObjectFactory, ControlledPromise) {
describe("LinkService", function () {
xdescribe("LinkService", function () {
var linkService,
mockPolicyService;

View File

@@ -34,7 +34,7 @@ define(
ControlledPromise
) {
describe("MoveService", function () {
xdescribe("MoveService", function () {
var moveService,
policyService,

View File

@@ -21,14 +21,14 @@
*****************************************************************************/
define([
"./src/WorkerService",
'legacyRegistry'
"./src/WorkerService"
], function (
WorkerService,
legacyRegistry
WorkerService
) {
legacyRegistry.register("platform/execution", {
return {
name:"platform/execution",
definition: {
"extensions": {
"services": [
{
@@ -41,5 +41,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,11 +22,12 @@
define([
"./ExportService",
"saveAs",
"legacyRegistry"
], function (ExportService, saveAs, legacyRegistry) {
"saveAs"
], function (ExportService, saveAs) {
legacyRegistry.register("platform/exporters", {
return {
name:"platform/exporters",
definition: {
extensions: {
services: [
{
@@ -59,5 +60,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -35,8 +35,7 @@ define([
"./src/actions/StopTimerAction",
"./src/actions/PauseTimerAction",
"./res/templates/clock.html",
"./res/templates/timer.html",
'legacyRegistry'
"./res/templates/timer.html"
], function (
MomentTimezone,
ClockIndicator,
@@ -52,10 +51,11 @@ define([
StopTimerAction,
PauseTimerAction,
clockTemplate,
timerTemplate,
legacyRegistry
timerTemplate
) {
legacyRegistry.register("platform/features/clock", {
return {
name:"platform/features/clock",
definition: {
"name": "Clocks/Timers",
"descriptions": "Domain objects for displaying current & relative times.",
"configuration": {
@@ -316,5 +316,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -31,7 +31,7 @@ define([
MCT,
$
) {
describe("The timer-following indicator", function () {
xdescribe("The timer-following indicator", function () {
var timerService;
var openmct;

View File

@@ -22,14 +22,14 @@
define([
'./src/HyperlinkController',
'legacyRegistry',
'./res/templates/hyperlink.html'
], function (
HyperlinkController,
legacyRegistry,
hyperlinkTemplate
) {
legacyRegistry.register("platform/features/hyperlink", {
return {
name:"platform/features/hyperlink",
definition: {
"name": "Hyperlink",
"description": "Insert a hyperlink to reference a link",
"extensions": {
@@ -115,5 +115,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -24,17 +24,17 @@ define([
"./src/policies/ImageryViewPolicy",
"./src/controllers/ImageryController",
"./src/directives/MCTBackgroundImage",
"./res/templates/imagery.html",
'legacyRegistry'
"./res/templates/imagery.html"
], function (
ImageryViewPolicy,
ImageryController,
MCTBackgroundImage,
imageryTemplate,
legacyRegistry
imageryTemplate
) {
legacyRegistry.register("platform/features/imagery", {
return {
name:"platform/features/imagery",
definition: {
"name": "Plot view for telemetry",
"extensions": {
"views": [
@@ -81,5 +81,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -30,7 +30,7 @@ define(
var MOCK_ELEMENT_TEMPLATE =
'<div class="l-image-thumbs-wrapper"></div>';
describe("The Imagery controller", function () {
xdescribe("The Imagery controller", function () {
var $scope,
openmct,
oldDomainObject,

View File

@@ -20,13 +20,10 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([
'legacyRegistry'
], function (
legacyRegistry
) {
legacyRegistry.register("platform/features/my-items", {
define([], function () {
return {
name:"platform/features/my-items",
definition: {
"name": "My Items",
"description": "Defines a root named My Items",
"extensions": {
@@ -47,5 +44,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,15 +22,15 @@
define([
"./src/EmbeddedPageController",
"./res/iframe.html",
'legacyRegistry'
"./res/iframe.html"
], function (
EmbeddedPageController,
iframeTemplate,
legacyRegistry
iframeTemplate
) {
legacyRegistry.register("platform/features/pages", {
return {
name:"platform/features/pages",
definition: {
"extensions": {
"types": [
{
@@ -72,5 +72,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -1,26 +0,0 @@
<!--
Open MCT, Copyright (c) 2014-2018, United States Government
as represented by the Administrator of the National Aeronautics and Space
Administration. All rights reserved.
Open MCT is licensed under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
Open MCT includes source code licensed under additional open source
licenses. See the Open Source Licenses file (LICENSES.md) included with
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<div class="l-iframe abs">
<iframe ng-controller="EmbeddedPageController as ctl"
ng-src="{{ctl.trust(model.url)}}">
</iframe>
</div>

View File

@@ -22,15 +22,14 @@
define([
"./res/markup.html",
'legacyRegistry'
"./res/markup.html"
], function (
markupTemplate,
legacyRegistry
markupTemplate
) {
legacyRegistry.register("platform/features/static-markup", {
return {
name:"platform/features/static-markup",
definition: {
"extensions": {
"types": [
{
@@ -52,5 +51,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -21,13 +21,13 @@
*****************************************************************************/
define([
"./res/templates/deprecated-timeline-message.html",
'legacyRegistry'
"./res/templates/deprecated-timeline-message.html"
], function (
deprecatedTimelineMessage,
legacyRegistry
deprecatedTimelineMessage
) {
legacyRegistry.register('platform/features/timeline', {
return {
name: 'platform/features/timeline',
definition: {
extensions: {
types: [
{
@@ -47,5 +47,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -45,8 +45,7 @@ define([
"./res/templates/controls/dialog.html",
"./res/templates/controls/radio.html",
"./res/templates/controls/file-input.html",
"./res/templates/controls/snap-view.html",
'legacyRegistry'
"./res/templates/controls/snap-view.html"
], function (
MCTForm,
MCTControl,
@@ -72,11 +71,12 @@ define([
dialogTemplate,
radioTemplate,
fileInputTemplate,
snapViewTemplate,
legacyRegistry
snapViewTemplate
) {
legacyRegistry.register("platform/forms", {
return {
name:"platform/forms",
definition: {
"name": "MCT Forms",
"description": "Form generator; includes directive and some controls.",
"extensions": {
@@ -213,5 +213,6 @@ define([
]
}
});
}
};
});

View File

@@ -24,7 +24,7 @@ define(
["../src/MCTFileInput"],
function (MCTFileInput) {
describe("The mct-file-input directive", function () {
xdescribe("The mct-file-input directive", function () {
var mockScope,
mockFileInputService,

View File

@@ -20,15 +20,11 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([
define([], function () {
'legacyRegistry'
], function (
legacyRegistry
) {
legacyRegistry.register("platform/framework", {
return {
name:"platform/framework",
definition: {
"name": "Open MCT Framework Component",
"description": "Framework layer for Open MCT; interprets bundle definitions and serves as an intermediary between Require and Angular",
"libraries": "lib",
@@ -106,5 +102,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -55,13 +55,13 @@ define([
FrameworkLayer.prototype.initializeApplication = function (
angular,
legacyRegistry,
openmct,
logLevel
) {
var $http = this.$http,
$log = this.$log,
app = angular.module(Constants.MODULE_NAME, ["ngRoute"]),
loader = new BundleLoader($http, $log, legacyRegistry),
loader = new BundleLoader($http, $log, openmct.legacyRegistry),
resolver = new BundleResolver(
new ExtensionResolver(
new ImplementationLoader({}),
@@ -77,7 +77,7 @@ define([
),
bootstrapper = new ApplicationBootstrapper(
angular,
window.document,
openmct.element,
$log
),
initializer = new FrameworkInitializer(

View File

@@ -41,7 +41,7 @@ define(
function Main() {
}
Main.prototype.run = function (legacyRegistry) {
Main.prototype.run = function (openmct) {
// Get a reference to Angular's injector, so we can get $http and $log
// services, which are useful to the framework layer.
var injector = angular.injector(['ng']);
@@ -53,7 +53,7 @@ define(
}
return injector.instantiate(['$http', '$log', FrameworkLayer])
.initializeApplication(angular, legacyRegistry, logLevel());
.initializeApplication(angular, openmct, logLevel());
};
return Main;

View File

@@ -24,17 +24,17 @@ define([
"./src/IdentityAggregator",
"./src/IdentityProvider",
"./src/IdentityCreationDecorator",
"./src/IdentityIndicator",
'legacyRegistry'
"./src/IdentityIndicator"
], function (
IdentityAggregator,
IdentityProvider,
IdentityCreationDecorator,
IdentityIndicator,
legacyRegistry
IdentityIndicator
) {
legacyRegistry.register("platform/identity", {
return {
name:"platform/identity",
definition: {
"extensions": {
"components": [
{
@@ -82,5 +82,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -72,6 +72,7 @@ define([
]
}
});
openmct.legacyRegistry.enable('platform/import-export');
};
};

View File

@@ -19,8 +19,7 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(['zepto'], function ($) {
define(['zepto', '../../../../src/api/objects/object-utils.js'], function ($, objectUtils) {
/**
* The ImportAsJSONAction is available from context menus and allows a user
@@ -61,9 +60,15 @@ define(['zepto'], function ($) {
ImportAsJSONAction.prototype.importObjectTree = function (objTree) {
var parent = this.context.domainObject;
var tree = this.generateNewIdentifiers(objTree);
var namespace = parent.useCapability('adapter').identifier.namespace;
var tree = this.generateNewIdentifiers(objTree, namespace);
var rootId = tree.rootId;
var rootObj = this.instantiate(tree.openmct[rootId], rootId);
var rootModel = tree.openmct[rootId];
delete rootModel.persisted;
var rootObj = this.instantiate(rootModel, rootId);
var newStyleParent = parent.useCapability('adapter');
var newStyleRootObj = rootObj.useCapability('adapter');
@@ -105,8 +110,10 @@ define(['zepto'], function ($) {
if (!tree[keystring] || seen.includes(keystring)) {
return;
}
let newModel = tree[keystring];
delete newModel.persisted;
newObj = this.instantiate(tree[keystring], keystring);
newObj = this.instantiate(newModel, keystring);
newObj.getCapability("location")
.setPrimaryLocation(tree[keystring].location);
this.deepInstantiate(newObj, tree, seen);
@@ -114,11 +121,17 @@ define(['zepto'], function ($) {
}
};
ImportAsJSONAction.prototype.generateNewIdentifiers = function (tree) {
ImportAsJSONAction.prototype.generateNewIdentifiers = function (tree, namespace) {
// For each domain object in the file, generate new ID, replace in tree
Object.keys(tree.openmct).forEach(function (domainObjectId) {
var newId = this.identifierService.generate();
tree = this.rewriteId(domainObjectId, newId, tree);
let newId = {
namespace: namespace,
key: this.identifierService.generate()
};
let oldId = objectUtils.parseKeyString(domainObjectId);
tree = this.rewriteId(oldId, newId, tree);
}, this);
return tree;
};
@@ -129,9 +142,21 @@ define(['zepto'], function ($) {
*
* @private
*/
ImportAsJSONAction.prototype.rewriteId = function (oldID, newID, tree) {
tree = JSON.stringify(tree).replace(new RegExp(oldID, 'g'), newID);
return JSON.parse(tree);
ImportAsJSONAction.prototype.rewriteId = function (oldId, newId, tree) {
let newIdKeyString = this.openmct.objects.makeKeyString(newId);
let oldIdKeyString = this.openmct.objects.makeKeyString(oldId);
tree = JSON.stringify(tree).replace(new RegExp(oldIdKeyString, 'g'), newIdKeyString);
return JSON.parse(tree, (key, value) => {
if (Object.prototype.hasOwnProperty.call(value, 'key') &&
Object.prototype.hasOwnProperty.call(value, 'namespace') &&
value.key === oldId.key &&
value.namespace === oldId.namespace) {
return newId
} else {
return value;
}
});
};
ImportAsJSONAction.prototype.getFormModel = function () {

View File

@@ -29,7 +29,7 @@ define(
],
function (ExportAsJSONAction, domainObjectFactory, MCT, AdapterCapability) {
describe("The export JSON action", function () {
xdescribe("The export JSON action", function () {
var context,
action,

View File

@@ -27,7 +27,7 @@ define(
],
function (ImportAsJSONAction, domainObjectFactory) {
describe("The import JSON action", function () {
xdescribe("The import JSON action", function () {
var context = {};
var action,

View File

@@ -21,14 +21,14 @@
*****************************************************************************/
define([
"./src/PersistenceAggregator",
'legacyRegistry'
"./src/PersistenceAggregator"
], function (
PersistenceAggregator,
legacyRegistry
PersistenceAggregator
) {
legacyRegistry.register("platform/persistence/aggregator", {
return {
name:"platform/persistence/aggregator",
definition: {
"extensions": {
"components": [
{
@@ -41,5 +41,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -22,15 +22,15 @@
define([
"./src/CouchPersistenceProvider",
"./src/CouchIndicator",
'legacyRegistry'
"./src/CouchIndicator"
], function (
CouchPersistenceProvider,
CouchIndicator,
legacyRegistry
CouchIndicator
) {
legacyRegistry.register("platform/persistence/couch", {
return {
name:"platform/persistence/couch",
definition: {
"name": "Couch Persistence",
"description": "Adapter to read and write objects using a CouchDB instance.",
"extensions": {
@@ -73,5 +73,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -100,7 +100,7 @@ define(
}
CouchIndicator.prototype.getCssClass = function () {
return "c-indicator--clickable icon-database " + this.state.statusClass;
return "c-indicator--clickable icon-suitcase " + this.state.statusClass;
};
CouchIndicator.prototype.getGlyphClass = function () {

View File

@@ -24,7 +24,7 @@ define(
["../src/CouchIndicator"],
function (CouchIndicator) {
describe("The CouchDB status indicator", function () {
xdescribe("The CouchDB status indicator", function () {
var mockHttp,
mockInterval,
testPath,

View File

@@ -23,16 +23,16 @@
define([
"./src/ElasticPersistenceProvider",
"./src/ElasticSearchProvider",
"./src/ElasticIndicator",
'legacyRegistry'
"./src/ElasticIndicator"
], function (
ElasticPersistenceProvider,
ElasticSearchProvider,
ElasticIndicator,
legacyRegistry
ElasticIndicator
) {
legacyRegistry.register("platform/persistence/elastic", {
return {
name:"platform/persistence/elastic",
definition: {
"name": "ElasticSearch Persistence",
"description": "Adapter to read and write objects using an ElasticSearch instance.",
"extensions": {
@@ -92,5 +92,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -84,7 +84,7 @@ define(
}
ElasticIndicator.prototype.getCssClass = function () {
return "c-indicator--clickable icon-database";
return "c-indicator--clickable icon-suitcase";
};
ElasticIndicator.prototype.getGlyphClass = function () {
return this.state.glyphClass;

View File

@@ -24,7 +24,7 @@ define(
["../src/ElasticIndicator"],
function (ElasticIndicator) {
describe("The ElasticSearch status indicator", function () {
xdescribe("The ElasticSearch status indicator", function () {
var mockHttp,
mockInterval,
testPath,
@@ -59,7 +59,7 @@ define(
});
it("has a database icon", function () {
expect(indicator.getCssClass()).toEqual("icon-database");
expect(indicator.getCssClass()).toEqual("icon-suitcase");
});
it("consults the database at the configured path", function () {

View File

@@ -22,15 +22,15 @@
define([
"./src/LocalStoragePersistenceProvider",
"./src/LocalStorageIndicator",
'legacyRegistry'
"./src/LocalStorageIndicator"
], function (
LocalStoragePersistenceProvider,
LocalStorageIndicator,
legacyRegistry
LocalStorageIndicator
) {
legacyRegistry.register("platform/persistence/local", {
return {
name:"platform/persistence/local",
definition: {
"extensions": {
"components": [
{
@@ -56,5 +56,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -41,7 +41,7 @@ define(
}
LocalStorageIndicator.prototype.getCssClass = function () {
return "c-indicator--clickable icon-database s-status-caution";
return "c-indicator--clickable icon-suitcase s-status-caution";
};
LocalStorageIndicator.prototype.getGlyphClass = function () {
return 'caution';

View File

@@ -24,7 +24,7 @@ define(
["../src/LocalStorageIndicator"],
function (LocalStorageIndicator) {
describe("The local storage status indicator", function () {
xdescribe("The local storage status indicator", function () {
var indicator;
beforeEach(function () {
@@ -38,7 +38,7 @@ define(
});
it("has a database icon", function () {
expect(indicator.getCssClass()).toEqual("icon-database s-status-caution");
expect(indicator.getCssClass()).toEqual("icon-suitcase s-status-caution");
});
it("has a 'caution' class to draw attention", function () {

View File

@@ -24,17 +24,17 @@ define([
"./src/QueuingPersistenceCapabilityDecorator",
"./src/PersistenceQueue",
"./src/PersistenceFailureController",
"./res/templates/persistence-failure-dialog.html",
'legacyRegistry'
"./res/templates/persistence-failure-dialog.html"
], function (
QueuingPersistenceCapabilityDecorator,
PersistenceQueue,
PersistenceFailureController,
persistenceFailureDialogTemplate,
legacyRegistry
persistenceFailureDialogTemplate
) {
legacyRegistry.register("platform/persistence/queue", {
return {
name:"platform/persistence/queue",
definition: {
"extensions": {
"components": [
{
@@ -77,5 +77,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -32,14 +32,6 @@ define(
mockPromise,
handler;
function asPromise(value) {
return (value || {}).then ? value : {
then: function (callback) {
return asPromise(callback(value));
}
};
}
function makeMockFailure(id, index) {
var mockFailure = jasmine.createSpyObj(
'failure-' + id,

View File

@@ -23,16 +23,16 @@
define([
"./src/PolicyActionDecorator",
"./src/PolicyViewDecorator",
"./src/PolicyProvider",
'legacyRegistry'
"./src/PolicyProvider"
], function (
PolicyActionDecorator,
PolicyViewDecorator,
PolicyProvider,
legacyRegistry
PolicyProvider
) {
legacyRegistry.register("platform/policy", {
return {
name:"platform/policy",
definition: {
"name": "Policy Service",
"description": "Provides support for extension-driven decisions.",
"sources": "src",
@@ -64,5 +64,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -29,8 +29,7 @@ define([
"./src/gestures/GestureRepresenter",
"./src/services/DndService",
"./src/TemplateLinker",
"./src/TemplatePrefetcher",
'legacyRegistry'
"./src/TemplatePrefetcher"
], function (
MCTInclude,
MCTRepresentation,
@@ -40,11 +39,12 @@ define([
GestureRepresenter,
DndService,
TemplateLinker,
TemplatePrefetcher,
legacyRegistry
TemplatePrefetcher
) {
legacyRegistry.register("platform/representation", {
return {
name:"platform/representation",
definition: {
"extensions": {
"directives": [
{
@@ -139,5 +139,6 @@ define([
}
]
}
});
}
};
});

View File

@@ -29,7 +29,7 @@ define([
"./res/templates/search.html",
"./res/templates/search-menu.html",
"raw-loader!./src/services/GenericSearchWorker.js",
'legacyRegistry'
"raw-loader!./src/services/BareBonesSearchWorker.js"
], function (
SearchController,
SearchMenuController,
@@ -39,10 +39,12 @@ define([
searchTemplate,
searchMenuTemplate,
searchWorkerText,
legacyRegistry
BareBonesSearchWorkerText
) {
legacyRegistry.register("platform/search", {
return {
name:"platform/search",
definition: {
"name": "Search",
"description": "Allows the user to search through the file tree.",
"extensions": {
@@ -53,6 +55,11 @@ define([
"ROOT"
],
"priority": "fallback"
},
{
"key": "USE_LEGACY_INDEXER",
"value": false,
"priority": 2
}
],
"controllers": [
@@ -101,6 +108,7 @@ define([
"workerService",
"topic",
"GENERIC_SEARCH_ROOTS",
"USE_LEGACY_INDEXER",
"openmct"
]
},
@@ -115,11 +123,16 @@ define([
}
],
"workers": [
{
"key": "bareBonesSearchWorker",
"scriptText": BareBonesSearchWorkerText
},
{
"key": "genericSearchWorker",
"scriptText": searchWorkerText
}
]
}
});
}
};
});

Some files were not shown because too many files have changed in this diff Show More