Compare commits

...

62 Commits

Author SHA1 Message Date
Nikhil
37a8cf071c https://github.com/nasa/openmct/issues/2577 (#2580)
* https://github.com/nasa/openmct/issues/2577
* Remove notebook.scss import. Move to vue-styles.scss
2019-12-11 15:56:00 -08:00
Deep Tailor
490cb2225d Move check for linestyle to plotseries fetch function (#2561) 2019-12-11 14:49:12 -08:00
Nikhil
50173a4413 Theming (#2567)
* Separate Vue component styles out from SFCs.
* Added 'MCT.prototype.getAssetPath' and using 'openmct.setAssetPath' to get relative path for assets.
* Re-implements `openmct.plugins.Snow()`, and `openmct.plugins.Espresso()` (as well as a new theme `openmct.plugins.Maelstron()`)
2019-12-11 14:27:13 -08:00
Andrew Henry
23781fa686 Correct release number (#2575) 2019-12-11 14:16:24 -08:00
Andrew Henry
8ec1b9965a Updates to README in topic-core-refactor (#2573)
* Updates to README in topic-core-refactor 

In preparation for merge into Master

* Added section on v1.0.0 and link to Migration Guide

* Minor wording change

* More minor wording changes
2019-12-11 10:28:47 -08:00
Charles Hacskaylo
a16a44208a Fixes Notebook and Inspector layout issues (#2568)
* Fix linting-related issues
* Fix Notebook overlay display issues
2019-12-10 16:44:54 -08:00
Shefali Joshi
d6faa25888 Fixes issue-2536: cross-env handles cross platform environment variable setting. (#2554) 2019-12-06 09:44:37 -08:00
Shefali Joshi
55327a0150 [refactor-doc] Updates the API doc for new API usage. (#2553)
* [refactor-doc] Updates the API doc to new API usage.
2019-12-06 09:40:24 -08:00
Deep Tailor
28d2194d51 fix bugs caused by shouldUseMinMax reported by VISTA (#2555) 2019-12-05 18:07:30 -08:00
David Tsay
b3bc618bb0 fix template markup after lint merge mutilation (#2558) 2019-12-05 18:04:24 -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
373 changed files with 15575 additions and 20398 deletions

View File

@@ -5,9 +5,16 @@ module.exports = {
"jasmine": true, "jasmine": true,
"amd": true "amd": true
}, },
"extends": "eslint:recommended", "globals": {
"parser": "babel-eslint", "_": "readonly"
},
"extends": [
"eslint:recommended",
"plugin:vue/recommended"
],
"parser": "vue-eslint-parser",
"parserOptions": { "parserOptions": {
"parser": "babel-eslint",
"allowImportExportEverywhere": true, "allowImportExportEverywhere": true,
"ecmaVersion": 2015, "ecmaVersion": 2015,
"ecmaFeatures": { "ecmaFeatures": {
@@ -58,7 +65,38 @@ module.exports = {
} }
], ],
"dot-notation": "error", "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": [ "overrides": [
{ {

7
API.md
View File

@@ -109,15 +109,13 @@ script loaders are also supported.
<html> <html>
<head> <head>
<title>Open MCT</title> <title>Open MCT</title>
<script src="openmct.js"></script> <script src="dist/openmct.js"></script>
</head> </head>
<body> <body>
<script> <script>
openmct.setAssetPath('openmct/dist');
openmct.install(openmct.plugins.LocalStorage()); openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.MyItems()); openmct.install(openmct.plugins.MyItems());
openmct.install(openmct.plugins.UTCTimeSystem()); openmct.install(openmct.plugins.UTCTimeSystem());
openmct.install(openmct.plugins.Espresso());
openmct.start(); openmct.start();
</script> </script>
</body> </body>
@@ -128,9 +126,6 @@ The Open MCT library included above requires certain assets such as html
templates, images, and css. If you installed Open MCT from GitHub as described templates, images, and css. If you installed Open MCT from GitHub as described
in the section on [Building from Source](#building-from-source) then these in the section on [Building from Source](#building-from-source) then these
assets will have been downloaded along with the Open MCT javascript library. assets will have been downloaded along with the Open MCT javascript library.
You can specify the location of these assets by calling `openmct.setAssetPath()`.
Typically this will be the same location as the `openmct.js` library is
included from.
There are some plugins bundled with the application that provide UI, There are some plugins bundled with the application that provide UI,
persistence, and other default configuration which are necessary to be able to persistence, and other default configuration which are necessary to be able to

View File

@@ -9,26 +9,6 @@ Please visit our [Official Site](https://nasa.github.io/openmct/) and [Getting S
Try Open MCT now with our [live demo](https://openmct-demo.herokuapp.com/). Try Open MCT now with our [live demo](https://openmct-demo.herokuapp.com/).
![Demo](https://nasa.github.io/openmct/static/res/images/Open-MCT.Browse.Layout.Mars-Weather-1.jpg) ![Demo](https://nasa.github.io/openmct/static/res/images/Open-MCT.Browse.Layout.Mars-Weather-1.jpg)
## New API
A simpler, [easier-to-use API](https://nasa.github.io/openmct/docs/api/)
has been added to Open MCT. Changes in this
API include a move away from a declarative system of JSON configuration files
towards an imperative system based on function calls. Developers will be able
to extend and build on Open MCT by making direct function calls to a public
API. Open MCT is also being refactored to minimize the dependencies that using
Open MCT imposes on developers, such as the current requirement to use
AngularJS.
This new API has not yet been heavily used and is likely to contain defects.
You can help by trying it out, and reporting any issues you encounter
using our GitHub issue tracker. Such issues may include bugs, suggestions,
missing documentation, or even just requests for help if you're having
trouble.
We want Open MCT to be as easy to use, install, run, and develop for as
possible, and your feedback will help us get there!
## Building and Running Open MCT Locally ## Building and Running Open MCT Locally
Building and running Open MCT in your local dev environment is very easy. Be sure you have [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/) installed, then follow the directions below. Need additional information? Check out the [Getting Started](https://nasa.github.io/openmct/getting-started/) page on our website. Building and running Open MCT in your local dev environment is very easy. Be sure you have [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/) installed, then follow the directions below. Need additional information? Check out the [Getting Started](https://nasa.github.io/openmct/getting-started/) page on our website.
@@ -48,9 +28,14 @@ Building and running Open MCT in your local dev environment is very easy. Be sur
Open MCT is now running, and can be accessed by pointing a web browser at [http://localhost:8080/](http://localhost:8080/) Open MCT is now running, and can be accessed by pointing a web browser at [http://localhost:8080/](http://localhost:8080/)
## Open MCT v1.0.0
This represents a major overhaul of Open MCT with significant changes under the hood. We aim to maintain backward compatibility but if you do find compatibility issues, please let us know by filing an issue in this repository. If you are having major issues with v1.0.0 please check-out the v0.14.0 tag until we can resolve them for you.
If you are migrating an application built with Open MCT as a dependency to v1.0.0 from an earlier version, please refer to [our migration guide](https://nasa.github.io/openmct/documentation/migration-guide).
## Documentation ## Documentation
Documentation is available on the [Open MCT website](https://nasa.github.io/openmct/documentation/). The documentation can also be built locally. Documentation is available on the [Open MCT website](https://nasa.github.io/openmct/documentation/).
### Examples ### Examples
@@ -58,48 +43,29 @@ The clearest examples for developing Open MCT plugins are in the
[tutorials](https://github.com/nasa/openmct-tutorial) provided in [tutorials](https://github.com/nasa/openmct-tutorial) provided in
our documentation. our documentation.
For a practical example of a telemetry adapter, see David Hudson's We want Open MCT to be as easy to use, install, run, and develop for as
[Kerbal Space Program plugin](https://github.com/hudsonfoo/kerbal-openmct), possible, and your feedback will help us get there! Feedback can be provided via [GitHub issues](https://github.com/nasa/openmct/issues), or by emailing us at [arc-dl-openmct@mail.nasa.gov](mailto:arc-dl-openmct@mail.nasa.gov).
which allows [Kerbal Space Program](https://kerbalspaceprogram.com) players
to build and use displays for their own missions in Open MCT.
Additional examples are available in the `examples` hierarchy of this ## Building Applications With Open MCT
repository; however, be aware that these examples are
[not fully-documented](https://github.com/nasa/openmct/issues/846), so
the tutorials will likely serve as a better starting point.
### Building the Open MCT Documentation Locally Open MCT is built using [`npm`](http://npmjs.com/) and [`webpack`](https://webpack.js.org/).
Open MCT's documentation is generated by an
[npm](https://www.npmjs.com/)-based build. It has additional dependencies that
may not be available on every platform and thus is not covered in the standard
npm install. Ensure your system has [libcairo](http://cairographics.org/)
installed and then run the following commands:
* `npm install` See our documentation for a guide on [building Applications with Open MCT](https://github.com/nasa/openmct/blob/master/API.md#starting-an-open-mct-application).
* `npm install canvas nomnoml`
* `npm run docs`
Documentation will be generated in `target/docs`. ## Plugins
## Deploying Open MCT Open MCT can be extended via plugins that make calls to the Open MCT API. A plugin is a group
of software components (including source code and resources such as images and HTML templates)
that is intended to be added or removed as a single unit.
Open MCT is built using [`npm`](http://npmjs.com/) As well as providing an extension mechanism, most of the core Open MCT codebase is also
written as plugins.
To build Open MCT for deployment: For information on writing plugins, please see [our API documentation](https://github.com/nasa/openmct/blob/master/API.md#plugins).
`npm run prepare`
This will compile and minify JavaScript sources, as well as copy over assets.
The contents of the `dist` folder will contain a runnable Open MCT
instance (e.g. by starting an HTTP server in that directory), including:
* `openmct.js` - Open MCT source code.
* `openmct.css` - Basic styles to load to prevent a FOUC.
* `index.html`, an example to run Open MCT in the basic configuration.
## Tests ## Tests
Tests are written for [Jasmine 3](http://jasmine.github.io/) Tests are written for [Jasmine 3](https://jasmine.github.io/api/3.1/global)
and run by [Karma](http://karma-runner.github.io). To run: and run by [Karma](http://karma-runner.github.io). To run:
`npm test` `npm test`
@@ -115,7 +81,7 @@ naming convention is otherwise the same.)
### Test Reporting ### Test Reporting
When `npm test` is run, test results will be written as HTML to When `npm test` is run, test results will be written as HTML to
`target/tests`. Code coverage information is written to `target/coverage`. `dist/reports/tests/`. Code coverage information is written to `dist/reports/coverage`.
# Glossary # Glossary
@@ -125,11 +91,8 @@ addressed (either by updating this glossary or changing code to reflect
correct usage.) Other developer documentation, particularly in-line correct usage.) Other developer documentation, particularly in-line
documentation, may presume an understanding of these terms. documentation, may presume an understanding of these terms.
* _bundle_: A bundle is a removable, reusable grouping of software elements. * _plugin_: A plugin is a removable, reusable grouping of software elements.
The application is composed of bundles. Plug-ins are bundles. For more The application is composed of plugins.
information, refer to framework documentation (under `platform/framework`.)
* _capability_: An object which exposes dynamic behavior or non-persistent
state associated with a domain object.
* _composition_: In the context of a domain object, this refers to the set of * _composition_: In the context of a domain object, this refers to the set of
other domain objects that compose or are contained by that object. A domain other domain objects that compose or are contained by that object. A domain
object's composition is the set of domain objects that should appear object's composition is the set of domain objects that should appear
@@ -144,13 +107,8 @@ documentation, may presume an understanding of these terms.
* _domain object_: A meaningful object to the user; a distinct thing in * _domain object_: A meaningful object to the user; a distinct thing in
the work support by Open MCT. Anything that appears in the left-hand the work support by Open MCT. Anything that appears in the left-hand
tree is a domain object. tree is a domain object.
* _extension_: An extension is a unit of functionality exposed to the * _identifier_: A tuple consisting of a namespace and a key, which together uniquely
platform in a declarative fashion by a bundle. For more identifies a domain object.
information, refer to framework documentation (under `platform/framework`.)
* _id_: A string which uniquely identifies a domain object.
* _key_: When used as an object property, this refers to the machine-readable
identifier for a specific thing in a set of things. (Most often used in the
context of extensions or other similar application-specific object sets.)
* _model_: The persistent state associated with a domain object. A domain * _model_: The persistent state associated with a domain object. A domain
object's model is a JavaScript object which can be converted to JSON object's model is a JavaScript object which can be converted to JSON
without losing information (that is, it contains no methods.) without losing information (that is, it contains no methods.)
@@ -162,7 +120,5 @@ documentation, may presume an understanding of these terms.
a user clicks on a domain object in the tree, they are _navigating_ to a user clicks on a domain object in the tree, they are _navigating_ to
it, and it is thereafter considered the _navigated_ object (until the it, and it is thereafter considered the _navigated_ object (until the
user makes another such choice.) user makes another such choice.)
* _space_: A name used to identify a persistence store. Interactions with * _namespace_: A name used to identify a persistence store. A running open MCT
persistence will generally involve a `space` parameter in some form, to application could potentially use multiple persistence stores, with the
distinguish multiple persistence stores from one another (for cases
where there are multiple valid persistence locations available.)

View File

@@ -22,59 +22,60 @@
/*global define*/ /*global define*/
define([ define([
"./src/EventTelemetryProvider", "./src/EventTelemetryProvider"
'legacyRegistry'
], function ( ], function (
EventTelemetryProvider, EventTelemetryProvider
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/eventGenerator", { return {
"name": "Event Message Generator", name:"example/eventGenerator",
"description": "For development use. Creates sample event message data that mimics a live data stream.", definition: {
"extensions": { "name": "Event Message Generator",
"components": [ "description": "For development use. Creates sample event message data that mimics a live data stream.",
{ "extensions": {
"implementation": EventTelemetryProvider, "components": [
"type": "provider", {
"provides": "telemetryService", "implementation": EventTelemetryProvider,
"depends": [ "type": "provider",
"$q", "provides": "telemetryService",
"$timeout" "depends": [
] "$q",
} "$timeout"
],
"types": [
{
"key": "eventGenerator",
"name": "Event Message Generator",
"cssClass": "icon-generator-events",
"description": "For development use. Creates sample event message data that mimics a live data stream.",
"priority": 10,
"features": "creation",
"model": {
"telemetry": {}
},
"telemetry": {
"source": "eventGenerator",
"domains": [
{
"key": "utc",
"name": "Timestamp",
"format": "utc"
}
],
"ranges": [
{
"key": "message",
"name": "Message",
"format": "string"
}
] ]
} }
} ],
] "types": [
{
"key": "eventGenerator",
"name": "Event Message Generator",
"cssClass": "icon-generator-events",
"description": "For development use. Creates sample event message data that mimics a live data stream.",
"priority": 10,
"features": "creation",
"model": {
"telemetry": {}
},
"telemetry": {
"source": "eventGenerator",
"domains": [
{
"key": "utc",
"name": "Timestamp",
"format": "utc"
}
],
"ranges": [
{
"key": "message",
"name": "Message",
"format": "string"
}
]
}
}
]
}
} }
}); };
}); });

View File

@@ -48,11 +48,11 @@ define(
(domain !== 'delta' ? firstObservedTime : 0); (domain !== 'delta' ? firstObservedTime : 0);
}; };
generatorData.getRangeValue = function (i, range) { generatorData.getRangeValue = function (i, range) {
var domainDelta = this.getDomainValue(i) - firstObservedTime, var domainDelta = this.getDomainValue(i) - firstObservedTime,
ind = i % messages.length; ind = i % messages.length;
return messages[ind] + " - [" + domainDelta.toString() + "]"; return messages[ind] + " - [" + domainDelta.toString() + "]";
}; };
return generatorData; return generatorData;
} }

View File

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

View File

@@ -58,15 +58,15 @@ define([], function () {
row, row,
i; i;
function copyDomainsToRow(row, index) { function copyDomainsToRow(telemetryRow, index) {
domains.forEach(function (domain) { 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) { ranges.forEach(function (range) {
row[range.name] = series.getRangeValue(index, range.key); telemetryRow[range.name] = series.getRangeValue(index, range.key);
}); });
} }

View File

@@ -22,24 +22,26 @@
/*global define*/ /*global define*/
define([ define([
'legacyRegistry',
'./ExportTelemetryAsCSVAction' './ExportTelemetryAsCSVAction'
], function (legacyRegistry, ExportTelemetryAsCSVAction) { ], function (ExportTelemetryAsCSVAction) {
"use strict"; "use strict";
legacyRegistry.register("example/export", { return {
"name": "Example of using CSV Export", name:"example/export",
"extensions": { definition: {
"actions": [ "name": "Example of using CSV Export",
{ "extensions": {
"key": "example.export", "actions": [
"name": "Export Telemetry as CSV", {
"implementation": ExportTelemetryAsCSVAction, "key": "example.export",
"category": "contextual", "name": "Export Telemetry as CSV",
"cssClass": "icon-download", "implementation": ExportTelemetryAsCSVAction,
"depends": [ "exportService" ] "category": "contextual",
} "cssClass": "icon-download",
] "depends": ["exportService"]
}
]
}
} }
}); };
}); });

View File

@@ -22,32 +22,33 @@
/*global define*/ /*global define*/
define([ define([
"./src/ExampleFormController", "./src/ExampleFormController"
'legacyRegistry'
], function ( ], function (
ExampleFormController, ExampleFormController
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/forms", { return {
"name": "Declarative Forms example", name:"example/forms",
"sources": "src", definition: {
"extensions": { "name": "Declarative Forms example",
"controllers": [ "sources": "src",
{ "extensions": {
"key": "ExampleFormController", "controllers": [
"implementation": ExampleFormController, {
"depends": [ "key": "ExampleFormController",
"$scope" "implementation": ExampleFormController,
] "depends": [
} "$scope"
], ]
"routes": [ }
{ ],
"templateUrl": "templates/exampleForm.html" "routes": [
} {
] "templateUrl": "templates/exampleForm.html"
}
]
}
} }
}); };
}); });

View File

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

View File

@@ -28,7 +28,7 @@ define([
) { ) {
var RED = { var RED = {
sin: 0.9, sin: 0.9,
cos: 0.9 cos: 0.9
}, },
YELLOW = { YELLOW = {
@@ -74,7 +74,7 @@ define([
return { return {
evaluate: function (datum, valueMetadata) { evaluate: function (datum, valueMetadata) {
var range = valueMetadata && valueMetadata.key; var range = valueMetadata && valueMetadata.key;
if (datum[range] > RED[range]) { if (datum[range] > RED[range]) {
return LIMITS.rh; return LIMITS.rh;
} }

View File

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

View File

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

View File

@@ -33,7 +33,7 @@ define([
GeneratorMetadataProvider GeneratorMetadataProvider
) { ) {
return function(openmct){ return function (openmct) {
openmct.types.addType("example.state-generator", { openmct.types.addType("example.state-generator", {
name: "State Generator", name: "State Generator",

View File

@@ -22,27 +22,28 @@
/*global define*/ /*global define*/
define([ define([
"./src/ExampleIdentityService", "./src/ExampleIdentityService"
'legacyRegistry'
], function ( ], function (
ExampleIdentityService, ExampleIdentityService
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/identity", { return {
"extensions": { name:"example/identity",
"components": [ definition: {
{ "extensions": {
"implementation": ExampleIdentityService, "components": [
"provides": "identityService", {
"type": "provider", "implementation": ExampleIdentityService,
"depends": [ "provides": "identityService",
"dialogService", "type": "provider",
"$q" "depends": [
] "dialogService",
} "$q"
] ]
}
]
}
} }
}); };
}); });

View File

@@ -22,31 +22,31 @@
define([ define([
], function( ], function (
) { ) {
function ImageryPlugin() { function ImageryPlugin() {
var IMAGE_SAMPLES = [ var IMAGE_SAMPLES = [
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18731.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18731.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18732.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18732.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18733.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18733.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18734.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18734.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18735.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18735.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18736.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18736.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18737.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18737.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18738.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18738.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18739.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18739.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18740.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18740.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18741.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18741.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18742.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18742.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18743.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18743.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18744.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18744.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18745.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18745.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18746.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18746.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18747.jpg", "https://www.hq.nasa.gov/alsj/a16/AS16-117-18747.jpg",
"https://www.hq.nasa.gov/alsj/a16/AS16-117-18748.jpg" "https://www.hq.nasa.gov/alsj/a16/AS16-117-18748.jpg"
]; ];
function pointForTimestamp(timestamp, name) { function pointForTimestamp(timestamp, name) {
return { return {
@@ -65,7 +65,7 @@ define([
callback(pointForTimestamp(Date.now(), domainObject.name)); callback(pointForTimestamp(Date.now(), domainObject.name));
}, 5000); }, 5000);
return function (interval) { return function () {
clearInterval(interval); clearInterval(interval);
}; };
} }

View File

@@ -21,25 +21,22 @@
*****************************************************************************/ *****************************************************************************/
/*global define*/ /*global define*/
define([ define([], function () {
'legacyRegistry'
], function (
legacyRegistry
) {
"use strict"; "use strict";
legacyRegistry.register("example/mobile", { return {
"name": "Mobile", name:"example/mobile",
"description": "Allows elements with pertinence to mobile usage and development", definition: {
"extensions": { "name": "Mobile",
"stylesheets": [ "description": "Allows elements with pertinence to mobile usage and development",
{ "extensions": {
"stylesheetUrl": "css/mobile-example.css", "stylesheets": [
"priority": "mandatory" {
} "stylesheetUrl": "css/mobile-example.css",
] "priority": "mandatory"
}
]
}
} }
}); };
}); });

View File

@@ -24,92 +24,92 @@
define([ define([
"./src/RemsTelemetryServerAdapter", "./src/RemsTelemetryServerAdapter",
"./src/RemsTelemetryModelProvider", "./src/RemsTelemetryModelProvider",
"./src/RemsTelemetryProvider", "./src/RemsTelemetryProvider"
'legacyRegistry',
"module"
], function ( ], function (
RemsTelemetryServerAdapter, RemsTelemetryServerAdapter,
RemsTelemetryModelProvider, RemsTelemetryModelProvider,
RemsTelemetryProvider, RemsTelemetryProvider
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/msl", { return {
"name" : "Mars Science Laboratory Data Adapter", name:"example/msl",
"extensions" : { definition: {
"types": [ "name" : "Mars Science Laboratory Data Adapter",
{ "extensions" : {
"name":"Mars Science Laboratory", "types": [
"key": "msl.curiosity", {
"cssClass": "icon-object" "name":"Mars Science Laboratory",
}, "key": "msl.curiosity",
{ "cssClass": "icon-object"
"name": "Instrument", },
"key": "msl.instrument", {
"cssClass": "icon-object", "name": "Instrument",
"model": {"composition": []} "key": "msl.instrument",
}, "cssClass": "icon-object",
{ "model": {"composition": []}
"name": "Measurement", },
"key": "msl.measurement", {
"cssClass": "icon-telemetry", "name": "Measurement",
"model": {"telemetry": {}}, "key": "msl.measurement",
"telemetry": { "cssClass": "icon-telemetry",
"source": "rems.source", "model": {"telemetry": {}},
"domains": [ "telemetry": {
{ "source": "rems.source",
"name": "Time", "domains": [
"key": "utc", {
"format": "utc" "name": "Time",
} "key": "utc",
] "format": "utc"
}
]
}
} }
} ],
], "constants": [
"constants": [ {
{ "key": "REMS_WS_URL",
"key": "REMS_WS_URL", "value": "/proxyUrl?url=http://cab.inta-csic.es/rems/wp-content/plugins/marsweather-widget/api.php"
"value": "/proxyUrl?url=http://cab.inta-csic.es/rems/wp-content/plugins/marsweather-widget/api.php"
}
],
"roots": [
{
"id": "msl:curiosity"
}
],
"models": [
{
"id": "msl:curiosity",
"priority": "preferred",
"model": {
"type": "msl.curiosity",
"name": "Mars Science Laboratory",
"composition": ["msl_tlm:rems"]
} }
} ],
], "roots": [
"services": [ {
{ "id": "msl:curiosity"
"key":"rems.adapter", }
"implementation": RemsTelemetryServerAdapter, ],
"depends": ["$http", "$log", "REMS_WS_URL"] "models": [
} {
], "id": "msl:curiosity",
"components": [ "priority": "preferred",
{ "model": {
"provides": "modelService", "type": "msl.curiosity",
"type": "provider", "name": "Mars Science Laboratory",
"implementation": RemsTelemetryModelProvider, "composition": ["msl_tlm:rems"]
"depends": ["rems.adapter"] }
}, }
{ ],
"provides": "telemetryService", "services": [
"type": "provider", {
"implementation": RemsTelemetryProvider, "key":"rems.adapter",
"depends": ["rems.adapter", "$q"] "implementation": RemsTelemetryServerAdapter,
} "depends": ["$http", "$log", "REMS_WS_URL"]
] }
],
"components": [
{
"provides": "modelService",
"type": "provider",
"implementation": RemsTelemetryModelProvider,
"depends": ["rems.adapter"]
},
{
"provides": "telemetryService",
"type": "provider",
"implementation": RemsTelemetryProvider,
"depends": ["rems.adapter", "$q"]
}
]
}
} }
}); };
}); });

View File

@@ -76,4 +76,4 @@ define(
] ]
}; };
} }
); );

View File

@@ -22,7 +22,7 @@
/*global define*/ /*global define*/
define( define(
function (){ function () {
"use strict"; "use strict";
var PREFIX = "msl_tlm:", var PREFIX = "msl_tlm:",
@@ -32,20 +32,20 @@ define(
string: "string" string: "string"
}; };
function RemsTelemetryModelProvider(adapter){ function RemsTelemetryModelProvider(adapter) {
function isRelevant(id) { function isRelevant(id) {
return id.indexOf(PREFIX) === 0; return id.indexOf(PREFIX) === 0;
} }
function makeId(element){ function makeId(element) {
return PREFIX + element.identifier; return PREFIX + element.identifier;
} }
function buildTaxonomy(dictionary){ function buildTaxonomy(dictionary) {
var models = {}; var models = {};
function addMeasurement(measurement, parent){ function addMeasurement(measurement, parent) {
var format = FORMAT_MAPPINGS[measurement.type]; var format = FORMAT_MAPPINGS[measurement.type];
models[makeId(measurement)] = { models[makeId(measurement)] = {
type: "msl.measurement", type: "msl.measurement",
@@ -73,12 +73,12 @@ define(
location: spacecraftId, location: spacecraftId,
composition: measurements.map(makeId) composition: measurements.map(makeId)
}; };
measurements.forEach(function(measurement) { measurements.forEach(function (measurement) {
addMeasurement(measurement, instrumentId); addMeasurement(measurement, instrumentId);
}); });
} }
(dictionary.instruments || []).forEach(function(instrument) { (dictionary.instruments || []).forEach(function (instrument) {
addInstrument(instrument, "msl:curiosity"); addInstrument(instrument, "msl:curiosity");
}); });
return models; return models;

View File

@@ -72,10 +72,10 @@ define (
* This data source does not support real-time subscriptions * This data source does not support real-time subscriptions
*/ */
RemsTelemetryProvider.prototype.subscribe = function (callback, requests) { RemsTelemetryProvider.prototype.subscribe = function (callback, requests) {
return function() {}; return function () {};
}; };
RemsTelemetryProvider.prototype.unsubscribe = function (callback, requests) { RemsTelemetryProvider.prototype.unsubscribe = function (callback, requests) {
return function() {}; return function () {};
}; };
return RemsTelemetryProvider; return RemsTelemetryProvider;

View File

@@ -54,8 +54,8 @@ define(
* @returns {number} A count of the number of data values available in * @returns {number} A count of the number of data values available in
* this series * this series
*/ */
RemsTelemetrySeries.prototype.getPointCount = function() { RemsTelemetrySeries.prototype.getPointCount = function () {
return this.data.length; return this.data.length;
}; };
/** /**
* The domain value at the given index. The Rems telemetry data is * The domain value at the given index. The Rems telemetry data is
@@ -64,8 +64,8 @@ define(
* @param index * @param index
* @returns {number} the time value in ms since 1 January 1970 * @returns {number} the time value in ms since 1 January 1970
*/ */
RemsTelemetrySeries.prototype.getDomainValue = function(index) { RemsTelemetrySeries.prototype.getDomainValue = function (index) {
return this.data[index].date; return this.data[index].date;
}; };
/** /**
@@ -75,8 +75,8 @@ define(
* value of. * value of.
* @returns {number} A floating point number * @returns {number} A floating point number
*/ */
RemsTelemetrySeries.prototype.getRangeValue = function(index) { RemsTelemetrySeries.prototype.getRangeValue = function (index) {
return this.data[index].value; return this.data[index].value;
}; };
return RemsTelemetrySeries; return RemsTelemetrySeries;

View File

@@ -68,18 +68,18 @@ define(
* given request ID. * given request ID.
* @private * @private
*/ */
RemsTelemetryServerAdapter.prototype.requestHistory = function(request) { RemsTelemetryServerAdapter.prototype.requestHistory = function (request) {
var self = this, var self = this,
id = request.key; id = request.key;
var dataTransforms = this.dataTransforms; var dataTransforms = this.dataTransforms;
function processResponse(response){ function processResponse(response) {
var data = []; var data = [];
/* /*
* History data is organised by Sol. Iterate over sols... * History data is organised by Sol. Iterate over sols...
*/ */
response.data.soles.forEach(function(solData){ response.data.soles.forEach(function (solData) {
/* /*
* Check that valid data exists * Check that valid data exists
*/ */
@@ -106,13 +106,13 @@ define(
//Filter results to match request parameters //Filter results to match request parameters
function filterResults(results) { function filterResults(results) {
return results.filter(function(result){ return results.filter(function (result) {
return result.date >= (request.start || Number.MIN_VALUE) && return result.date >= (request.start || Number.MIN_VALUE) &&
result.date <= (request.end || Number.MAX_VALUE); result.date <= (request.end || Number.MAX_VALUE);
}); });
} }
function packageAndResolve(results){ function packageAndResolve(results) {
return {id: id, values: results}; return {id: id, values: results};
} }
@@ -132,7 +132,7 @@ define(
* @param id The telemetry data point key to be queried. * @param id The telemetry data point key to be queried.
* @returns {Promise | Array<RemsTelemetryValue>} that resolves with an Array of {@link RemsTelemetryValue} objects for the request data key. * @returns {Promise | Array<RemsTelemetryValue>} that resolves with an Array of {@link RemsTelemetryValue} objects for the request data key.
*/ */
RemsTelemetryServerAdapter.prototype.history = function(request) { RemsTelemetryServerAdapter.prototype.history = function (request) {
return this.requestHistory(request); return this.requestHistory(request);
}; };

View File

@@ -27,64 +27,65 @@ define([
"./src/DialogLaunchIndicator", "./src/DialogLaunchIndicator",
"./src/NotificationLaunchIndicator", "./src/NotificationLaunchIndicator",
"./res/dialog-launch.html", "./res/dialog-launch.html",
"./res/notification-launch.html", "./res/notification-launch.html"
'legacyRegistry'
], function ( ], function (
DialogLaunchController, DialogLaunchController,
NotificationLaunchController, NotificationLaunchController,
DialogLaunchIndicator, DialogLaunchIndicator,
NotificationLaunchIndicator, NotificationLaunchIndicator,
DialogLaunch, DialogLaunch,
NotificationLaunch, NotificationLaunch
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/notifications", { return {
"extensions": { name:"example/notifications",
"templates": [ definition: {
{ "extensions": {
"key": "dialogLaunchTemplate", "templates": [
"template": DialogLaunch {
}, "key": "dialogLaunchTemplate",
{ "template": DialogLaunch
"key": "notificationLaunchTemplate", },
"template": NotificationLaunch {
} "key": "notificationLaunchTemplate",
], "template": NotificationLaunch
"controllers": [ }
{ ],
"key": "DialogLaunchController", "controllers": [
"implementation": DialogLaunchController, {
"depends": [ "key": "DialogLaunchController",
"$scope", "implementation": DialogLaunchController,
"$timeout", "depends": [
"$log", "$scope",
"dialogService", "$timeout",
"notificationService" "$log",
] "dialogService",
}, "notificationService"
{ ]
"key": "NotificationLaunchController", },
"implementation": NotificationLaunchController, {
"depends": [ "key": "NotificationLaunchController",
"$scope", "implementation": NotificationLaunchController,
"$timeout", "depends": [
"$log", "$scope",
"notificationService" "$timeout",
] "$log",
} "notificationService"
], ]
"indicators": [ }
{ ],
"implementation": DialogLaunchIndicator, "indicators": [
"priority": "fallback" {
}, "implementation": DialogLaunchIndicator,
{ "priority": "fallback"
"implementation": NotificationLaunchIndicator, },
"priority": "fallback" {
} "implementation": NotificationLaunchIndicator,
] "priority": "fallback"
}
]
}
} }
}); };
}); });

View File

@@ -137,12 +137,12 @@ define(
" attention to an event.", " attention to an event.",
severity: "info", severity: "info",
primaryOption: { primaryOption: {
label: "OK", label: "OK",
callback: function () { callback: function () {
$log.debug("OK Pressed"); $log.debug("OK Pressed");
dialog.dismiss(); dialog.dismiss();
}
} }
}
}; };
dialog = dialogService.showBlockingMessage(model); dialog = dialogService.showBlockingMessage(model);

View File

@@ -22,33 +22,34 @@
/*global define*/ /*global define*/
define([ define([
"./src/BrowserPersistenceProvider", "./src/BrowserPersistenceProvider"
'legacyRegistry'
], function ( ], function (
BrowserPersistenceProvider, BrowserPersistenceProvider
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/persistence", { return {
"extensions": { name:"example/persistence",
"components": [ definition: {
{ "extensions": {
"provides": "persistenceService", "components": [
"type": "provider", {
"implementation": BrowserPersistenceProvider, "provides": "persistenceService",
"depends": [ "type": "provider",
"$q", "implementation": BrowserPersistenceProvider,
"PERSISTENCE_SPACE" "depends": [
] "$q",
} "PERSISTENCE_SPACE"
], ]
"constants": [ }
{ ],
"key": "PERSISTENCE_SPACE", "constants": [
"value": "mct" {
} "key": "PERSISTENCE_SPACE",
] "value": "mct"
}
]
}
} }
}); };
}); });

View File

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

View File

@@ -23,33 +23,34 @@
define([ define([
"./src/WatchIndicator", "./src/WatchIndicator",
"./src/DigestIndicator", "./src/DigestIndicator"
'legacyRegistry'
], function ( ], function (
WatchIndicator, WatchIndicator,
DigestIndicator, DigestIndicator
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/profiling", { return {
"extensions": { name:"example/profiling",
"indicators": [ definition: {
{ "extensions": {
"implementation": WatchIndicator, "indicators": [
"depends": [ {
"$interval", "implementation": WatchIndicator,
"$rootScope" "depends": [
] "$interval",
}, "$rootScope"
{ ]
"implementation": DigestIndicator, },
"depends": [ {
"$interval", "implementation": DigestIndicator,
"$rootScope" "depends": [
] "$interval",
} "$rootScope"
] ]
}
]
}
} }
}); };
}); });

View File

@@ -22,42 +22,43 @@
/*global define*/ /*global define*/
define([ define([
"./src/ScratchPersistenceProvider", "./src/ScratchPersistenceProvider"
'legacyRegistry'
], function ( ], function (
ScratchPersistenceProvider, ScratchPersistenceProvider
legacyRegistry
) { ) {
"use strict"; "use strict";
legacyRegistry.register("example/scratchpad", { return {
"extensions": { name:"example/scratchpad",
"roots": [ definition: {
{ "extensions": {
"id": "scratch:root" "roots": [
} {
], "id": "scratch:root"
"models": [ }
{ ],
"id": "scratch:root", "models": [
"model": { {
"type": "folder", "id": "scratch:root",
"composition": [], "model": {
"name": "Scratchpad" "type": "folder",
}, "composition": [],
"priority": "preferred" "name": "Scratchpad"
} },
], "priority": "preferred"
"components": [ }
{ ],
"provides": "persistenceService", "components": [
"type": "provider", {
"implementation": ScratchPersistenceProvider, "provides": "persistenceService",
"depends": [ "type": "provider",
"$q" "implementation": ScratchPersistenceProvider,
] "depends": [
} "$q"
] ]
}
]
}
} }
}); };
}); });

View File

@@ -60,7 +60,7 @@ define(
ScratchPersistenceProvider.prototype.readObject = function (space, key) { ScratchPersistenceProvider.prototype.readObject = function (space, key) {
return this.$q.when( return this.$q.when(
(space === 'scratch' && this.table[key]) ? (space === 'scratch' && this.table[key]) ?
JSON.parse(this.table[key]) : undefined JSON.parse(this.table[key]) : undefined
); );
}; };

View File

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

View File

@@ -8,8 +8,7 @@ define([
"./res/templates/glyphs.html", "./res/templates/glyphs.html",
"./res/templates/controls.html", "./res/templates/controls.html",
"./res/templates/input.html", "./res/templates/input.html",
"./res/templates/menus.html", "./res/templates/menus.html"
'legacyRegistry'
], function ( ], function (
ExampleStyleGuideModelProvider, ExampleStyleGuideModelProvider,
MCTExample, MCTExample,
@@ -20,13 +19,14 @@ define([
glyphsTemplate, glyphsTemplate,
controlsTemplate, controlsTemplate,
inputTemplate, inputTemplate,
menusTemplate, menusTemplate
legacyRegistry
) { ) {
legacyRegistry.register("example/styleguide", { return {
"name": "Open MCT Style Guide", name:"example/styleguide",
"description": "Examples and documentation illustrating UI styles in use in Open MCT.", definition: {
"extensions": "name": "Open MCT Style Guide",
"description": "Examples and documentation illustrating UI styles in use in Open MCT.",
"extensions":
{ {
"types": [ "types": [
{ "key": "styleguide.intro", "name": "Introduction", "cssClass": "icon-page", "description": "Introduction and overview to the style guide" }, { "key": "styleguide.intro", "name": "Introduction", "cssClass": "icon-page", "description": "Introduction and overview to the style guide" },
@@ -103,5 +103,6 @@ define([
} }
] ]
} }
}); }
};
}); });

View File

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

View File

@@ -27,11 +27,9 @@
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<title></title> <title></title>
<script src="dist/openmct.js"></script> <script src="dist/openmct.js"></script>
<link rel="stylesheet" href="dist/styles/openmct.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"> <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-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="dist/favicons/favicon-16x16.png" sizes="16x16" type="image/x-icon">
<link rel="icon" type="image/png" href="dist/favicons/favicon-16x16.png" sizes="16x16">
<link rel="shortcut icon" href="dist/favicons/favicon.ico">
</head> </head>
<body> <body>
</body> </body>
@@ -45,6 +43,8 @@
].forEach( ].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry) openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
); );
openmct.install(openmct.plugins.Espresso());
openmct.install(openmct.plugins.MyItems()); openmct.install(openmct.plugins.MyItems());
openmct.install(openmct.plugins.LocalStorage()); openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.Generator()); openmct.install(openmct.plugins.Generator());
@@ -79,6 +79,7 @@
})); }));
openmct.install(openmct.plugins.SummaryWidget()); openmct.install(openmct.plugins.SummaryWidget());
openmct.install(openmct.plugins.Notebook()); openmct.install(openmct.plugins.Notebook());
openmct.install(openmct.plugins.LADTable());
openmct.install(openmct.plugins.Filters(['table', 'telemetry.plot.overlay'])); openmct.install(openmct.plugins.Filters(['table', 'telemetry.plot.overlay']));
openmct.install(openmct.plugins.ObjectMigration()); openmct.install(openmct.plugins.ObjectMigration());
openmct.install(openmct.plugins.ClearData(['table', 'telemetry.plot.overlay', 'telemetry.plot.stacked'])); openmct.install(openmct.plugins.ClearData(['table', 'telemetry.plot.overlay', 'telemetry.plot.stacked']));

View File

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

View File

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

View File

@@ -11,6 +11,7 @@
"comma-separated-values": "^3.6.4", "comma-separated-values": "^3.6.4",
"concurrently": "^3.6.1", "concurrently": "^3.6.1",
"copy-webpack-plugin": "^4.5.2", "copy-webpack-plugin": "^4.5.2",
"cross-env": "^6.0.3",
"css-loader": "^1.0.0", "css-loader": "^1.0.0",
"d3-array": "1.2.x", "d3-array": "1.2.x",
"d3-axis": "1.0.x", "d3-axis": "1.0.x",
@@ -23,6 +24,7 @@
"d3-time": "1.0.x", "d3-time": "1.0.x",
"d3-time-format": "2.1.x", "d3-time-format": "2.1.x",
"eslint": "5.2.0", "eslint": "5.2.0",
"eslint-plugin-vue": "^6.0.0",
"eventemitter3": "^1.2.0", "eventemitter3": "^1.2.0",
"exports-loader": "^0.7.0", "exports-loader": "^0.7.0",
"express": "^4.13.1", "express": "^4.13.1",
@@ -43,6 +45,7 @@
"karma-coverage": "^1.1.2", "karma-coverage": "^1.1.2",
"karma-html-reporter": "^0.2.7", "karma-html-reporter": "^0.2.7",
"karma-jasmine": "^1.1.2", "karma-jasmine": "^1.1.2",
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^3.0.0", "karma-webpack": "^3.0.0",
"location-bar": "^3.0.1", "location-bar": "^3.0.1",
"lodash": "^3.10.1", "lodash": "^3.10.1",
@@ -60,7 +63,7 @@
"raw-loader": "^0.5.1", "raw-loader": "^0.5.1",
"request": "^2.69.0", "request": "^2.69.0",
"split": "^1.0.0", "split": "^1.0.0",
"style-loader": "^0.21.0", "style-loader": "^1.0.1",
"v8-compile-cache": "^1.1.0", "v8-compile-cache": "^1.1.0",
"vue": "2.5.6", "vue": "2.5.6",
"vue-loader": "^15.2.6", "vue-loader": "^15.2.6",
@@ -73,12 +76,13 @@
}, },
"scripts": { "scripts": {
"start": "node app.js", "start": "node app.js",
"lint": "eslint platform src openmct.js", "lint": "eslint platform example src/**/*.{js,vue} openmct.js",
"lint:fix": "eslint platform src openmct.js --fix", "lint:fix": "eslint platform example src/**/*.{js,vue} openmct.js --fix",
"build:prod": "NODE_ENV=production webpack", "build:prod": "cross-env NODE_ENV=production webpack",
"build:dev": "webpack", "build:dev": "webpack",
"build:watch": "webpack --watch", "build:watch": "webpack --watch",
"test": "karma start --single-run", "test": "karma start --single-run",
"test-debug": "cross-env NODE_ENV=debug karma start --no-single-run",
"test:watch": "karma start --no-single-run", "test:watch": "karma start --no-single-run",
"verify": "concurrently 'npm:test' 'npm:lint'", "verify": "concurrently 'npm:test' 'npm:lint'",
"jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api", "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-apache.html",
"./res/templates/license-mit.html", "./res/templates/license-mit.html",
"./res/templates/licenses.html", "./res/templates/licenses.html",
"./res/templates/licenses-export-md.html", "./res/templates/licenses-export-md.html"
'legacyRegistry'
], function ( ], function (
aboutDialogTemplate, aboutDialogTemplate,
LogoController, LogoController,
@@ -44,137 +43,139 @@ define([
licenseApacheTemplate, licenseApacheTemplate,
licenseMitTemplate, licenseMitTemplate,
licensesTemplate, licensesTemplate,
licensesExportMdTemplate, licensesExportMdTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/about", { return {
"name": "About Open MCT", name:"platform/commonUI/about",
"extensions": { definition: {
"templates": [ "name": "About Open MCT",
{ "extensions": {
"key": "app-logo", "templates": [
"priority": "optional", {
"template": appLogoTemplate "key": "app-logo",
}, "priority": "optional",
{ "template": appLogoTemplate
"key": "about-logo", },
"priority": "preferred", {
"template": aboutLogoTemplate "key": "about-logo",
}, "priority": "preferred",
{ "template": aboutLogoTemplate
"key": "about-dialog", },
"template": aboutDialogTemplate {
}, "key": "about-dialog",
{ "template": aboutDialogTemplate
"key": "overlay-about", },
"template": overlayAboutTemplate {
}, "key": "overlay-about",
{ "template": overlayAboutTemplate
"key": "license-apache", },
"template": licenseApacheTemplate {
}, "key": "license-apache",
{ "template": licenseApacheTemplate
"key": "license-mit", },
"template": licenseMitTemplate {
} "key": "license-mit",
], "template": licenseMitTemplate
"controllers": [ }
{ ],
"key": "LogoController", "controllers": [
"depends": [ {
"overlayService" "key": "LogoController",
], "depends": [
"implementation": LogoController "overlayService"
}, ],
{ "implementation": LogoController
"key": "AboutController", },
"depends": [ {
"versions[]", "key": "AboutController",
"$window" "depends": [
], "versions[]",
"implementation": AboutController "$window"
}, ],
{ "implementation": AboutController
"key": "LicenseController", },
"depends": [ {
"licenses[]" "key": "LicenseController",
], "depends": [
"implementation": LicenseController "licenses[]"
} ],
], "implementation": LicenseController
"licenses": [ }
{ ],
"name": "Json.NET", "licenses": [
"version": "6.0.8", {
"author": "Newtonsoft", "name": "Json.NET",
"description": "JSON serialization/deserialization", "version": "6.0.8",
"website": "http://www.newtonsoft.com/json", "author": "Newtonsoft",
"copyright": "Copyright (c) 2007 James Newton-King", "description": "JSON serialization/deserialization",
"license": "license-mit", "website": "http://www.newtonsoft.com/json",
"link": "https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md" "copyright": "Copyright (c) 2007 James Newton-King",
}, "license": "license-mit",
{ "link": "https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md"
"name": "Nancy", },
"version": "0.23.2", {
"author": "Andreas Håkansson, Steven Robbins and contributors", "name": "Nancy",
"description": "Embedded web server", "version": "0.23.2",
"website": "http://nancyfx.org/", "author": "Andreas Håkansson, Steven Robbins and contributors",
"copyright": "Copyright © 2010 Andreas Håkansson, Steven Robbins and contributors", "description": "Embedded web server",
"license": "license-mit", "website": "http://nancyfx.org/",
"link": "http://www.opensource.org/licenses/mit-license.php" "copyright": "Copyright © 2010 Andreas Håkansson, Steven Robbins and contributors",
}, "license": "license-mit",
{ "link": "http://www.opensource.org/licenses/mit-license.php"
"name": "Nancy.Hosting.Self", },
"version": "0.23.2", {
"author": "Andreas Håkansson, Steven Robbins and contributors", "name": "Nancy.Hosting.Self",
"description": "Embedded web server", "version": "0.23.2",
"website": "http://nancyfx.org/", "author": "Andreas Håkansson, Steven Robbins and contributors",
"copyright": "Copyright © 2010 Andreas Håkansson, Steven Robbins and contributors", "description": "Embedded web server",
"license": "license-mit", "website": "http://nancyfx.org/",
"link": "http://www.opensource.org/licenses/mit-license.php" "copyright": "Copyright © 2010 Andreas Håkansson, Steven Robbins and contributors",
}, "license": "license-mit",
{ "link": "http://www.opensource.org/licenses/mit-license.php"
"name": "SuperSocket", },
"version": "0.9.0.2", {
"author": " Kerry Jiang", "name": "SuperSocket",
"description": "Supports SuperWebSocket", "version": "0.9.0.2",
"website": "https://supersocket.codeplex.com/", "author": " Kerry Jiang",
"copyright": "Copyright 2010-2014 Kerry Jiang (kerry-jiang@hotmail.com)", "description": "Supports SuperWebSocket",
"license": "license-apache", "website": "https://supersocket.codeplex.com/",
"link": "https://supersocket.codeplex.com/license" "copyright": "Copyright 2010-2014 Kerry Jiang (kerry-jiang@hotmail.com)",
}, "license": "license-apache",
{ "link": "https://supersocket.codeplex.com/license"
"name": "SuperWebSocket", },
"version": "0.9.0.2", {
"author": " Kerry Jiang", "name": "SuperWebSocket",
"description": "WebSocket implementation for client-server communication", "version": "0.9.0.2",
"website": "https://superwebsocket.codeplex.com/", "author": " Kerry Jiang",
"copyright": "Copyright 2010-2014 Kerry Jiang (kerry-jiang@hotmail.com)", "description": "WebSocket implementation for client-server communication",
"license": "license-apache", "website": "https://superwebsocket.codeplex.com/",
"link": "https://superwebsocket.codeplex.com/license" "copyright": "Copyright 2010-2014 Kerry Jiang (kerry-jiang@hotmail.com)",
}, "license": "license-apache",
{ "link": "https://superwebsocket.codeplex.com/license"
"name": "log4net", },
"version": "2.0.3", {
"author": "Apache Software Foundation", "name": "log4net",
"description": "Logging", "version": "2.0.3",
"website": "http://logging.apache.org/log4net/", "author": "Apache Software Foundation",
"copyright": "Copyright © 2004-2015 Apache Software Foundation.", "description": "Logging",
"license": "license-apache", "website": "http://logging.apache.org/log4net/",
"link": "http://logging.apache.org/log4net/license.html" "copyright": "Copyright © 2004-2015 Apache Software Foundation.",
} "license": "license-apache",
], "link": "http://logging.apache.org/log4net/license.html"
"routes": [ }
{ ],
"when": "/licenses", "routes": [
"template": licensesTemplate {
}, "when": "/licenses",
{ "template": licensesTemplate
"when": "/licenses-md", },
"template": licensesExportMdTemplate {
} "when": "/licenses-md",
] "template": licensesExportMdTemplate
}
]
}
} }
}); };
}); });

View File

@@ -21,12 +21,6 @@
*****************************************************************************/ *****************************************************************************/
define([ define([
"./src/BrowseController",
"./src/PaneController",
"./src/InspectorPaneController",
"./src/BrowseObjectController",
"./src/MenuArrowController",
"./src/ObjectHeaderController",
"./src/navigation/NavigationService", "./src/navigation/NavigationService",
"./src/navigation/NavigateAction", "./src/navigation/NavigateAction",
"./src/navigation/OrphanNavigationHandler", "./src/navigation/OrphanNavigationHandler",
@@ -38,15 +32,8 @@ define([
"./res/templates/menu-arrow.html", "./res/templates/menu-arrow.html",
"./res/templates/back-arrow.html", "./res/templates/back-arrow.html",
"./res/templates/browse/object-properties.html", "./res/templates/browse/object-properties.html",
"./res/templates/browse/inspector-region.html", "./res/templates/browse/inspector-region.html"
'legacyRegistry'
], function ( ], function (
BrowseController,
PaneController,
InspectorPaneController,
BrowseObjectController,
MenuArrowController,
ObjectHeaderController,
NavigationService, NavigationService,
NavigateAction, NavigateAction,
OrphanNavigationHandler, OrphanNavigationHandler,
@@ -58,195 +45,133 @@ define([
menuArrowTemplate, menuArrowTemplate,
backArrowTemplate, backArrowTemplate,
objectPropertiesTemplate, objectPropertiesTemplate,
inspectorRegionTemplate, inspectorRegionTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/browse", { return {
"extensions": { name:"platform/commonUI/browse",
"routes": [ definition: {
], "extensions": {
"constants": [ "routes": [
{ ],
"key": "DEFAULT_PATH", "constants": [
"value": "mine", {
"priority": "fallback" "key": "DEFAULT_PATH",
} "value": "mine",
], "priority": "fallback"
"controllers": [ }
{ ],
"key": "BrowseController", "representations": [
"implementation": BrowseController, {
"depends": [ "key": "browse-object",
"$scope", "template": browseObjectTemplate,
"$route", "gestures": [
"$location", "drop"
"objectService", ],
"navigationService", "uses": [
"urlService", "view"
"DEFAULT_PATH" ]
] },
}, {
{ "key": "object-header",
"key": "PaneController", "template": objectHeaderTemplate,
"implementation": PaneController, "uses": [
"priority": "preferred", "type"
"depends": [ ]
"$scope", },
"agentService", {
"$window", "key": "object-header-frame",
"$location", "template": objectHeaderFrameTemplate,
"$attrs", "uses": [
"navigationService" "type"
] ]
}, },
{ {
"key": "BrowseObjectController", "key": "menu-arrow",
"implementation": BrowseObjectController, "template": menuArrowTemplate,
"depends": [ "uses": [
"$scope", "action"
"$location", ],
"$route" "gestures": [
] "menu"
}, ]
{ },
"key": "MenuArrowController", {
"implementation": MenuArrowController, "key": "back-arrow",
"depends": [ "uses": [
"$scope" "context"
] ],
}, "template": backArrowTemplate
{ },
"key": "InspectorPaneController", {
"implementation": InspectorPaneController, "key": "object-properties",
"priority": "preferred", "template": objectPropertiesTemplate
"depends": [ },
"$scope", {
"agentService", "key": "inspector-region",
"$window", "template": inspectorRegionTemplate
"navigationService", }
"$location", ],
"$attrs" "services": [
] {
}, "key": "navigationService",
{ "implementation": NavigationService,
"key": "ObjectHeaderController", "depends": [
"implementation": ObjectHeaderController, "$window"
"depends": [ ]
"$scope" }
] ],
} "actions": [
], {
"representations": [ "key": "navigate",
{ "implementation": NavigateAction,
"key": "browse-object", "depends": [
"template": browseObjectTemplate, "navigationService"
"gestures": [ ]
"drop" },
], {
"uses": [ "key": "window",
"view" "name": "Open In New Tab",
] "implementation": NewTabAction,
}, "description": "Open in a new browser tab",
{ "category": [
"key": "object-header", "view-control",
"template": objectHeaderTemplate, "contextual"
"uses": [ ],
"type" "depends": [
] "urlService",
}, "$window"
{ ],
"key": "object-header-frame", "group": "windowing",
"template": objectHeaderFrameTemplate, "cssClass": "icon-new-window",
"uses": [ "priority": "preferred"
"type" }
] ],
}, "runs": [
{ {
"key": "menu-arrow", "implementation": OrphanNavigationHandler,
"template": menuArrowTemplate, "depends": [
"uses": [ "throttle",
"action" "topic",
], "navigationService"
"gestures": [ ]
"menu" }
] ],
}, "templates": [
{ {
"key": "back-arrow", key: "browseRoot",
"uses": [ template: browseTemplate
"context" },
], {
"template": backArrowTemplate key: "browseObject",
}, template: browseObjectTemplate
{ },
"key": "object-properties", {
"template": objectPropertiesTemplate key: "inspectorRegion",
}, template: inspectorRegionTemplate
{ }
"key": "inspector-region", ]
"template": inspectorRegionTemplate }
}
],
"services": [
{
"key": "navigationService",
"implementation": NavigationService,
"depends": [
"$window"
]
}
],
"actions": [
{
"key": "navigate",
"implementation": NavigateAction,
"depends": [
"navigationService"
]
},
{
"key": "window",
"name": "Open In New Tab",
"implementation": NewTabAction,
"description": "Open in a new browser tab",
"category": [
"view-control",
"contextual"
],
"depends": [
"urlService",
"$window"
],
"group": "windowing",
"cssClass": "icon-new-window",
"priority": "preferred"
}
],
"runs": [
{
"implementation": OrphanNavigationHandler,
"depends": [
"throttle",
"topic",
"navigationService"
]
}
],
"templates": [
{
key: "browseRoot",
template: browseTemplate
},
{
key: "browseObject",
template: browseObjectTemplate
},
{
key: "inspectorRegion",
template: inspectorRegionTemplate
}
]
} }
}); };
}); });

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,59 +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 MenuArrowController. Created by shale on 06/30/2015.
*/
define(
[],
function () {
/**
* A left-click on the menu arrow should display a
* context menu. This controller launches the context
* menu.
* @memberof platform/commonUI/browse
* @constructor
*/
function MenuArrowController($scope) {
this.$scope = $scope;
}
/**
* Show a context menu for the domain object in this scope.
*
* @param event the browser event which caused this (used to
* position the menu)
*/
MenuArrowController.prototype.showMenu = function (event) {
var actionContext = {
key: 'menu',
domainObject: this.$scope.domainObject,
event: event
};
this.$scope.domainObject.getCapability('action').perform(actionContext);
};
return MenuArrowController;
}
);

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/message.html",
"./res/templates/notification-message.html", "./res/templates/notification-message.html",
"./res/templates/overlay-message-list.html", "./res/templates/overlay-message-list.html",
"./res/templates/overlay.html", "./res/templates/overlay.html"
'legacyRegistry'
], function ( ], function (
DialogService, DialogService,
OverlayService, OverlayService,
@@ -42,70 +41,72 @@ define([
messageTemplate, messageTemplate,
notificationMessageTemplate, notificationMessageTemplate,
overlayMessageListTemplate, overlayMessageListTemplate,
overlayTemplate, overlayTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/dialog", { return {
"extensions": { name:"platform/commonUI/dialog",
"services": [ definition: {
{ "extensions": {
"key": "dialogService", "services": [
"implementation": DialogService, {
"depends": [ "key": "dialogService",
"overlayService", "implementation": DialogService,
"$q", "depends": [
"$log", "overlayService",
"$document" "$q",
] "$log",
}, "$document"
{ ]
"key": "overlayService", },
"implementation": OverlayService, {
"depends": [ "key": "overlayService",
"$document", "implementation": OverlayService,
"$compile", "depends": [
"$rootScope", "$document",
"$timeout" "$compile",
] "$rootScope",
} "$timeout"
], ]
"templates": [ }
{ ],
"key": "overlay-dialog", "templates": [
"template": overlayDialogTemplate {
}, "key": "overlay-dialog",
{ "template": overlayDialogTemplate
"key": "overlay-options", },
"template": overlayOptionsTemplate {
}, "key": "overlay-options",
{ "template": overlayOptionsTemplate
"key": "form-dialog", },
"template": dialogTemplate {
}, "key": "form-dialog",
{ "template": dialogTemplate
"key": "overlay-blocking-message", },
"template": overlayBlockingMessageTemplate {
}, "key": "overlay-blocking-message",
{ "template": overlayBlockingMessageTemplate
"key": "message", },
"template": messageTemplate {
}, "key": "message",
{ "template": messageTemplate
"key": "notification-message", },
"template": notificationMessageTemplate {
}, "key": "notification-message",
{ "template": notificationMessageTemplate
"key": "overlay-message-list", },
"template": overlayMessageListTemplate {
} "key": "overlay-message-list",
], "template": overlayMessageListTemplate
"containers": [ }
{ ],
"key": "overlay", "containers": [
"template": overlayTemplate {
} "key": "overlay",
] "template": overlayTemplate
}
]
}
} }
}); };
}); });

View File

@@ -97,7 +97,7 @@ define(
this.$timeout(() => { this.$timeout(() => {
// Create the overlay element and add it to the document's body // Create the overlay element and add it to the document's body
element = this.$compile(TEMPLATE)(scope); element = this.$compile(TEMPLATE)(scope);
// Append so that most recent dialog is last in DOM. This means the most recent dialog will be on top when // Append so that most recent dialog is last in DOM. This means the most recent dialog will be on top when
// multiple overlays with the same z-index are active. // multiple overlays with the same z-index are active.
this.findBody().append(element); this.findBody().append(element);

View File

@@ -27,7 +27,6 @@ define([
"./src/actions/EditAndComposeAction", "./src/actions/EditAndComposeAction",
"./src/actions/EditAction", "./src/actions/EditAction",
"./src/actions/PropertiesAction", "./src/actions/PropertiesAction",
"./src/actions/RemoveAction",
"./src/actions/SaveAction", "./src/actions/SaveAction",
"./src/actions/SaveAndStopEditingAction", "./src/actions/SaveAndStopEditingAction",
"./src/actions/SaveAsAction", "./src/actions/SaveAsAction",
@@ -49,8 +48,7 @@ define([
"./res/templates/library.html", "./res/templates/library.html",
"./res/templates/edit-object.html", "./res/templates/edit-object.html",
"./res/templates/edit-action-buttons.html", "./res/templates/edit-action-buttons.html",
"./res/templates/topbar-edit.html", "./res/templates/topbar-edit.html"
'legacyRegistry'
], function ( ], function (
EditActionController, EditActionController,
EditPanesController, EditPanesController,
@@ -58,7 +56,6 @@ define([
EditAndComposeAction, EditAndComposeAction,
EditAction, EditAction,
PropertiesAction, PropertiesAction,
RemoveAction,
SaveAction, SaveAction,
SaveAndStopEditingAction, SaveAndStopEditingAction,
SaveAsAction, SaveAsAction,
@@ -80,288 +77,277 @@ define([
libraryTemplate, libraryTemplate,
editObjectTemplate, editObjectTemplate,
editActionButtonsTemplate, editActionButtonsTemplate,
topbarEditTemplate, topbarEditTemplate
legacyRegistry
) { ) {
return {
legacyRegistry.register("platform/commonUI/edit", { name: "platform/commonUI/edit",
"extensions": { definition: {
"controllers": [ "extensions": {
{ "controllers": [
"key": "EditActionController", {
"implementation": EditActionController, "key": "EditActionController",
"depends": [ "implementation": EditActionController,
"$scope" "depends": [
] "$scope"
}, ]
{ },
"key": "EditPanesController", {
"implementation": EditPanesController, "key": "EditPanesController",
"depends": [ "implementation": EditPanesController,
"$scope" "depends": [
] "$scope"
}, ]
{ },
"key": "EditObjectController", {
"implementation": EditObjectController, "key": "EditObjectController",
"depends": [ "implementation": EditObjectController,
"$scope", "depends": [
"$location", "$scope",
"navigationService" "$location",
] "navigationService"
}, ]
{ },
"key": "CreateMenuController", {
"implementation": CreateMenuController, "key": "CreateMenuController",
"depends": [ "implementation": CreateMenuController,
"$scope" "depends": [
] "$scope"
}, ]
{ },
"key": "LocatorController", {
"implementation": LocatorController, "key": "LocatorController",
"depends": [ "implementation": LocatorController,
"$scope", "depends": [
"$timeout", "$scope",
"objectService" "$timeout",
] "objectService"
} ]
],
"actions": [
{
"key": "compose",
"implementation": EditAndComposeAction
},
{
"key": "edit",
"implementation": EditAction,
"depends": [
"$location",
"navigationService",
"$log"
],
"description": "Edit",
"category": "view-control",
"cssClass": "major icon-pencil"
},
{
"key": "properties",
"category": [
"contextual",
"view-control"
],
"implementation": PropertiesAction,
"cssClass": "major icon-pencil",
"name": "Edit Properties...",
"description": "Edit properties of this object.",
"depends": [
"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",
"implementation": SaveAndStopEditingAction,
"name": "Save and Finish Editing",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService",
"notificationService"
]
},
{
"key": "save",
"category": "save",
"implementation": SaveAction,
"name": "Save and Continue Editing",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService",
"notificationService"
]
},
{
"key": "save-as",
"category": "save",
"implementation": SaveAsAction,
"name": "Save As...",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"$injector",
"dialogService",
"copyService",
"notificationService",
"openmct"
],
"priority": "mandatory"
},
{
"key": "cancel",
"category": "conclude-editing",
"implementation": CancelAction,
// Because we use the name as label for edit buttons and mct-control buttons need
// the label to be set to undefined in order to not apply the labeled CSS rule.
"name": undefined,
"cssClass": "icon-x no-label",
"description": "Discard changes made to these objects.",
"depends": []
}
],
"policies": [
{
"category": "action",
"implementation": EditPersistableObjectsPolicy,
"depends": ["openmct"]
},
{
"implementation": CreationPolicy,
"category": "creation"
}
],
"templates": [
{
"key": "edit-library",
"template": libraryTemplate
}
],
"representations": [
{
"key": "edit-object",
"template": editObjectTemplate,
"uses": [
"view"
],
"gestures": [
"drop"
]
},
{
"key": "edit-action-buttons",
"template": editActionButtonsTemplate,
"uses": [
"action"
]
},
{
"key": "topbar-edit",
"template": topbarEditTemplate
},
{
"key": "create-button",
"template": createButtonTemplate
},
{
"key": "create-menu",
"template": createMenuTemplate,
"uses": [
"action"
]
}
],
"components": [
{
"type": "decorator",
"provides": "capabilityService",
"implementation": TransactionCapabilityDecorator,
"depends": [
"$q",
"transactionManager"
],
"priority": "fallback"
},
{
"type": "provider",
"provides": "transactionService",
"implementation": TransactionService,
"depends": [
"$q",
"$log",
"cacheService"
]
},
{
"key": "CreateActionProvider",
"provides": "actionService",
"type": "provider",
"implementation": CreateActionProvider,
"depends": [
"typeService",
"policyService"
]
},
{
"key": "CreationService",
"provides": "creationService",
"type": "provider",
"implementation": CreationService,
"depends": [
"$q",
"$log"
]
}
],
"representers": [
{
"implementation": EditRepresenter,
"depends": [
"$log"
]
}
],
"capabilities": [
{
"key": "editor",
"name": "Editor Capability",
"description": "Provides transactional editing capabilities",
"implementation": EditorCapability,
"depends": [
"transactionService",
"openmct"
]
}
],
"controls": [
{
"key": "locator",
"template": locatorTemplate
}
],
"services": [
{
"key": "transactionManager",
"implementation": TransactionManager,
"depends": [
"transactionService"
]
}
],
"runs": [
{
depends: [
"toolbars[]",
"openmct"
],
implementation: function (toolbars, openmct) {
toolbars.forEach(openmct.toolbars.addProvider, openmct.toolbars);
} }
} ],
] "actions": [
{
"key": "compose",
"implementation": EditAndComposeAction
},
{
"key": "edit",
"implementation": EditAction,
"depends": [
"$location",
"navigationService",
"$log"
],
"description": "Edit",
"category": "view-control",
"cssClass": "major icon-pencil"
},
{
"key": "properties",
"category": [
"contextual",
"view-control"
],
"implementation": PropertiesAction,
"cssClass": "major icon-pencil",
"name": "Edit Properties...",
"description": "Edit properties of this object.",
"depends": [
"dialogService"
]
},
{
"key": "save-and-stop-editing",
"category": "save",
"implementation": SaveAndStopEditingAction,
"name": "Save and Finish Editing",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService",
"notificationService"
]
},
{
"key": "save",
"category": "save",
"implementation": SaveAction,
"name": "Save and Continue Editing",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService",
"notificationService"
]
},
{
"key": "save-as",
"category": "save",
"implementation": SaveAsAction,
"name": "Save As...",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"$injector",
"dialogService",
"copyService",
"notificationService",
"openmct"
],
"priority": "mandatory"
},
{
"key": "cancel",
"category": "conclude-editing",
"implementation": CancelAction,
// Because we use the name as label for edit buttons and mct-control buttons need
// the label to be set to undefined in order to not apply the labeled CSS rule.
"name": undefined,
"cssClass": "icon-x no-label",
"description": "Discard changes made to these objects.",
"depends": []
}
],
"policies": [
{
"category": "action",
"implementation": EditPersistableObjectsPolicy,
"depends": ["openmct"]
},
{
"implementation": CreationPolicy,
"category": "creation"
}
],
"templates": [
{
"key": "edit-library",
"template": libraryTemplate
}
],
"representations": [
{
"key": "edit-object",
"template": editObjectTemplate,
"uses": [
"view"
],
"gestures": [
"drop"
]
},
{
"key": "edit-action-buttons",
"template": editActionButtonsTemplate,
"uses": [
"action"
]
},
{
"key": "topbar-edit",
"template": topbarEditTemplate
},
{
"key": "create-button",
"template": createButtonTemplate
},
{
"key": "create-menu",
"template": createMenuTemplate,
"uses": [
"action"
]
}
],
"components": [
{
"type": "decorator",
"provides": "capabilityService",
"implementation": TransactionCapabilityDecorator,
"depends": [
"$q",
"transactionManager"
],
"priority": "fallback"
},
{
"type": "provider",
"provides": "transactionService",
"implementation": TransactionService,
"depends": [
"$q",
"$log",
"cacheService"
]
},
{
"key": "CreateActionProvider",
"provides": "actionService",
"type": "provider",
"implementation": CreateActionProvider,
"depends": [
"typeService",
"policyService"
]
},
{
"key": "CreationService",
"provides": "creationService",
"type": "provider",
"implementation": CreationService,
"depends": [
"$q",
"$log"
]
}
],
"representers": [
{
"implementation": EditRepresenter,
"depends": [
"$log"
]
}
],
"capabilities": [
{
"key": "editor",
"name": "Editor Capability",
"description": "Provides transactional editing capabilities",
"implementation": EditorCapability,
"depends": [
"transactionService",
"openmct"
]
}
],
"controls": [
{
"key": "locator",
"template": locatorTemplate
}
],
"services": [
{
"key": "transactionManager",
"implementation": TransactionManager,
"depends": [
"transactionService"
]
}
],
"runs": [
{
depends: [
"toolbars[]",
"openmct"
],
implementation: function (toolbars, openmct) {
toolbars.forEach(openmct.toolbars.addProvider, openmct.toolbars);
}
}
]
}
} }
}); };
}); });

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 () { SaveInProgressDialog.prototype.show = function () {
this.dialog = this.dialogService.showBlockingMessage({ 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.", hint: "Do not navigate away from this page or close this browser tab while this message is displayed.",
unknownProgress: true, unknownProgress: true,
severity: "info", 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"], ["../../src/actions/SaveAsAction"],
function (SaveAsAction) { function (SaveAsAction) {
describe("The Save As action", function () { xdescribe("The Save As action", function () {
var mockDomainObject, var mockDomainObject,
mockClonedObject, mockClonedObject,
mockEditorCapability, mockEditorCapability,

View File

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

View File

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

View File

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

View File

@@ -23,56 +23,57 @@
define([ define([
"./src/FormatProvider", "./src/FormatProvider",
"./src/UTCTimeFormat", "./src/UTCTimeFormat",
"./src/DurationFormat", "./src/DurationFormat"
'legacyRegistry'
], function ( ], function (
FormatProvider, FormatProvider,
UTCTimeFormat, UTCTimeFormat,
DurationFormat, DurationFormat
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/formats", { return {
"name": "Format Registry", name:"platform/commonUI/formats",
"description": "Provides a registry for formats, which allow parsing and formatting of values.", definition: {
"extensions": { "name": "Format Registry",
"components": [ "description": "Provides a registry for formats, which allow parsing and formatting of values.",
{ "extensions": {
"provides": "formatService", "components": [
"type": "provider", {
"implementation": FormatProvider, "provides": "formatService",
"depends": [ "type": "provider",
"formats[]" "implementation": FormatProvider,
] "depends": [
} "formats[]"
], ]
"formats": [ }
{ ],
"key": "utc", "formats": [
"implementation": UTCTimeFormat {
}, "key": "utc",
{ "implementation": UTCTimeFormat
"key": "duration", },
"implementation": DurationFormat {
} "key": "duration",
], "implementation": DurationFormat
"constants": [ }
{ ],
"key": "DEFAULT_TIME_FORMAT", "constants": [
"value": "utc" {
} "key": "DEFAULT_TIME_FORMAT",
], "value": "utc"
"licenses": [ }
{ ],
"name": "d3", "licenses": [
"version": "3.0.0", {
"description": "Incorporates modified code from d3 Time Scales", "name": "d3",
"author": "Mike Bostock", "version": "3.0.0",
"copyright": "Copyright 2010-2016 Mike Bostock. " + "description": "Incorporates modified code from d3 Time Scales",
"author": "Mike Bostock",
"copyright": "Copyright 2010-2016 Mike Bostock. " +
"All rights reserved.", "All rights reserved.",
"link": "https://github.com/d3/d3/blob/master/LICENSE" "link": "https://github.com/d3/d3/blob/master/LICENSE"
} }
] ]
}
} }
}); };
}); });

View File

@@ -66,8 +66,7 @@ define([
"./res/templates/object-inspector.html", "./res/templates/object-inspector.html",
"./res/templates/controls/selector.html", "./res/templates/controls/selector.html",
"./res/templates/controls/datetime-picker.html", "./res/templates/controls/datetime-picker.html",
"./res/templates/controls/datetime-field.html", "./res/templates/controls/datetime-field.html"
'legacyRegistry'
], function ( ], function (
UrlService, UrlService,
PopupService, PopupService,
@@ -114,415 +113,417 @@ define([
objectInspectorTemplate, objectInspectorTemplate,
selectorTemplate, selectorTemplate,
datetimePickerTemplate, datetimePickerTemplate,
datetimeFieldTemplate, datetimeFieldTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/general", { return {
"name": "General UI elements", name:"platform/commonUI/general",
"description": "General UI elements, meant to be reused across modes", definition: {
"resources": "res", "name": "General UI elements",
"extensions": { "description": "General UI elements, meant to be reused across modes",
"services": [ "resources": "res",
{ "extensions": {
"key": "urlService", "services": [
"implementation": UrlService, {
"depends": [ "key": "urlService",
"$location" "implementation": UrlService,
] "depends": [
}, "$location"
{ ]
"key": "popupService", },
"implementation": PopupService, {
"depends": [ "key": "popupService",
"$document", "implementation": PopupService,
"$window" "depends": [
] "$document",
} "$window"
], ]
"runs": [ }
{ ],
"implementation": StyleSheetLoader, "runs": [
"depends": [ {
"stylesheets[]", "implementation": StyleSheetLoader,
"$document", "depends": [
"THEME", "stylesheets[]",
"ASSETS_PATH" "$document",
] "THEME",
}, "ASSETS_PATH"
{ ]
"implementation": SplashScreenManager, },
"depends": [ {
"$document" "implementation": SplashScreenManager,
] "depends": [
} "$document"
], ]
"filters": [ }
{ ],
"implementation": ReverseFilter, "filters": [
"key": "reverse" {
} "implementation": ReverseFilter,
], "key": "reverse"
"templates": [ }
{ ],
"key": "bottombar", "templates": [
"template": bottombarTemplate {
}, "key": "bottombar",
{ "template": bottombarTemplate
"key": "action-button", },
"template": actionButtonTemplate {
}, "key": "action-button",
{ "template": actionButtonTemplate
"key": "input-filter", },
"template": inputFilterTemplate {
}, "key": "input-filter",
{ "template": inputFilterTemplate
"key": "indicator", },
"template": indicatorTemplate {
}, "key": "indicator",
{ "template": indicatorTemplate
"key": "message-banner", },
"template": messageBannerTemplate {
}, "key": "message-banner",
{ "template": messageBannerTemplate
"key": "progress-bar", },
"template": progressBarTemplate {
}, "key": "progress-bar",
{ "template": progressBarTemplate
"key": "time-controller", },
"template": timeControllerTemplate {
} "key": "time-controller",
], "template": timeControllerTemplate
"controllers": [ }
{ ],
"key": "TimeRangeController", "controllers": [
"implementation": TimeRangeController, {
"depends": [ "key": "TimeRangeController",
"$scope", "implementation": TimeRangeController,
"$timeout", "depends": [
"formatService", "$scope",
"DEFAULT_TIME_FORMAT", "$timeout",
"now" "formatService",
] "DEFAULT_TIME_FORMAT",
}, "now"
{ ]
"key": "DateTimePickerController", },
"implementation": DateTimePickerController, {
"depends": [ "key": "DateTimePickerController",
"$scope", "implementation": DateTimePickerController,
"now" "depends": [
] "$scope",
}, "now"
{ ]
"key": "DateTimeFieldController", },
"implementation": DateTimeFieldController, {
"depends": [ "key": "DateTimeFieldController",
"$scope", "implementation": DateTimeFieldController,
"formatService", "depends": [
"DEFAULT_TIME_FORMAT" "$scope",
] "formatService",
}, "DEFAULT_TIME_FORMAT"
{ ]
"key": "TreeNodeController", },
"implementation": TreeNodeController, {
"depends": [ "key": "TreeNodeController",
"$scope", "implementation": TreeNodeController,
"$timeout", "depends": [
"navigationService" "$scope",
] "$timeout",
}, "navigationService"
{ ]
"key": "ActionGroupController", },
"implementation": ActionGroupController, {
"depends": [ "key": "ActionGroupController",
"$scope" "implementation": ActionGroupController,
] "depends": [
}, "$scope"
{ ]
"key": "ToggleController", },
"implementation": ToggleController {
}, "key": "ToggleController",
{ "implementation": ToggleController
"key": "ClickAwayController", },
"implementation": ClickAwayController, {
"depends": [ "key": "ClickAwayController",
"$document", "implementation": ClickAwayController,
"$timeout" "depends": [
] "$document",
}, "$timeout"
{ ]
"key": "ViewSwitcherController", },
"implementation": ViewSwitcherController, {
"depends": [ "key": "ViewSwitcherController",
"$scope", "implementation": ViewSwitcherController,
"$timeout" "depends": [
] "$scope",
}, "$timeout"
{ ]
"key": "GetterSetterController", },
"implementation": GetterSetterController, {
"depends": [ "key": "GetterSetterController",
"$scope" "implementation": GetterSetterController,
] "depends": [
}, "$scope"
{ ]
"key": "SelectorController", },
"implementation": SelectorController, {
"depends": [ "key": "SelectorController",
"objectService", "implementation": SelectorController,
"$scope" "depends": [
] "objectService",
}, "$scope"
{ ]
"key": "ObjectInspectorController", },
"implementation": ObjectInspectorController, {
"depends": [ "key": "ObjectInspectorController",
"$scope", "implementation": ObjectInspectorController,
"objectService" "depends": [
] "$scope",
}, "objectService"
{ ]
"key": "BannerController", },
"implementation": BannerController, {
"depends": [ "key": "BannerController",
"$scope", "implementation": BannerController,
"notificationService", "depends": [
"dialogService" "$scope",
] "notificationService",
} "dialogService"
], ]
"directives": [ }
{ ],
"key": "mctContainer", "directives": [
"implementation": MCTContainer, {
"depends": [ "key": "mctContainer",
"containers[]" "implementation": MCTContainer,
] "depends": [
}, "containers[]"
{ ]
"key": "mctDrag", },
"implementation": MCTDrag, {
"depends": [ "key": "mctDrag",
"$document", "implementation": MCTDrag,
"agentService" "depends": [
] "$document",
}, "agentService"
{ ]
"key": "mctSelectable", },
"implementation": MCTSelectable, {
"depends": [ "key": "mctSelectable",
"openmct" "implementation": MCTSelectable,
] "depends": [
}, "openmct"
{ ]
"key": "mctClickElsewhere", },
"implementation": MCTClickElsewhere, {
"depends": [ "key": "mctClickElsewhere",
"$document" "implementation": MCTClickElsewhere,
] "depends": [
}, "$document"
{ ]
"key": "mctResize", },
"implementation": MCTResize, {
"depends": [ "key": "mctResize",
"$timeout" "implementation": MCTResize,
] "depends": [
}, "$timeout"
{ ]
"key": "mctPopup", },
"implementation": MCTPopup, {
"depends": [ "key": "mctPopup",
"$compile", "implementation": MCTPopup,
"popupService" "depends": [
] "$compile",
}, "popupService"
{ ]
"key": "mctScrollX", },
"implementation": MCTScroll, {
"depends": [ "key": "mctScrollX",
"$parse", "implementation": MCTScroll,
"MCT_SCROLL_X_PROPERTY", "depends": [
"MCT_SCROLL_X_ATTRIBUTE" "$parse",
] "MCT_SCROLL_X_PROPERTY",
}, "MCT_SCROLL_X_ATTRIBUTE"
{ ]
"key": "mctScrollY", },
"implementation": MCTScroll, {
"depends": [ "key": "mctScrollY",
"$parse", "implementation": MCTScroll,
"MCT_SCROLL_Y_PROPERTY", "depends": [
"MCT_SCROLL_Y_ATTRIBUTE" "$parse",
] "MCT_SCROLL_Y_PROPERTY",
}, "MCT_SCROLL_Y_ATTRIBUTE"
{ ]
"key": "mctSplitPane", },
"implementation": MCTSplitPane, {
"depends": [ "key": "mctSplitPane",
"$parse", "implementation": MCTSplitPane,
"$log", "depends": [
"$interval", "$parse",
"$window" "$log",
] "$interval",
}, "$window"
{ ]
"key": "mctSplitter", },
"implementation": MCTSplitter {
}, "key": "mctSplitter",
{ "implementation": MCTSplitter
"key": "mctTree", },
"implementation": MCTTree, {
"depends": ['gestureService', 'openmct'] "key": "mctTree",
}, "implementation": MCTTree,
{ "depends": ['gestureService', 'openmct']
"key": "mctIndicators", },
"implementation": MCTIndicators, {
"depends": ['openmct'] "key": "mctIndicators",
} "implementation": MCTIndicators,
], "depends": ['openmct']
"constants": [ }
{ ],
"key": "MCT_SCROLL_X_PROPERTY", "constants": [
"value": "scrollLeft" {
}, "key": "MCT_SCROLL_X_PROPERTY",
{ "value": "scrollLeft"
"key": "MCT_SCROLL_X_ATTRIBUTE", },
"value": "mctScrollX" {
}, "key": "MCT_SCROLL_X_ATTRIBUTE",
{ "value": "mctScrollX"
"key": "MCT_SCROLL_Y_PROPERTY", },
"value": "scrollTop" {
}, "key": "MCT_SCROLL_Y_PROPERTY",
{ "value": "scrollTop"
"key": "MCT_SCROLL_Y_ATTRIBUTE", },
"value": "mctScrollY" {
}, "key": "MCT_SCROLL_Y_ATTRIBUTE",
{ "value": "mctScrollY"
"key": "THEME", },
"value": "unspecified", {
"priority": "fallback" "key": "THEME",
}, "value": "unspecified",
{ "priority": "fallback"
"key": "ASSETS_PATH", },
"value": ".", {
"priority": "fallback" "key": "ASSETS_PATH",
} "value": ".",
], "priority": "fallback"
"containers": [ }
{ ],
"key": "accordion", "containers": [
"template": accordionTemplate, {
"attributes": [ "key": "accordion",
"label" "template": accordionTemplate,
] "attributes": [
} "label"
], ]
"representations": [ }
{ ],
"key": "tree", "representations": [
"template": subtreeTemplate, {
"uses": [ "key": "tree",
"composition" "template": subtreeTemplate,
], "uses": [
"type": "root", "composition"
"priority": "preferred" ],
}, "type": "root",
{ "priority": "preferred"
"key": "tree", },
"template": treeTemplate {
}, "key": "tree",
{ "template": treeTemplate
"key": "subtree", },
"template": subtreeTemplate, {
"uses": [ "key": "subtree",
"composition" "template": subtreeTemplate,
] "uses": [
}, "composition"
{ ]
"key": "tree-node", },
"template": treeNodeTemplate, {
"uses": [ "key": "tree-node",
"action" "template": treeNodeTemplate,
] "uses": [
}, "action"
{ ]
"key": "label", },
"template": labelTemplate, {
"uses": [ "key": "label",
"type", "template": labelTemplate,
"location" "uses": [
], "type",
"gestures": [ "location"
"drag", ],
"menu", "gestures": [
"info" "drag",
] "menu",
}, "info"
{ ]
"key": "node", },
"template": labelTemplate, {
"uses": [ "key": "node",
"type" "template": labelTemplate,
], "uses": [
"gestures": [ "type"
"drag", ],
"menu" "gestures": [
] "drag",
}, "menu"
{ ]
"key": "action-group", },
"template": actionGroupTemplate, {
"uses": [ "key": "action-group",
"action" "template": actionGroupTemplate,
] "uses": [
}, "action"
{ ]
"key": "switcher", },
"template": switcherTemplate, {
"uses": [ "key": "switcher",
"view" "template": switcherTemplate,
] "uses": [
}, "view"
{ ]
"key": "object-inspector", },
"template": objectInspectorTemplate {
} "key": "object-inspector",
], "template": objectInspectorTemplate
"controls": [ }
{ ],
"key": "selector", "controls": [
"template": selectorTemplate {
}, "key": "selector",
{ "template": selectorTemplate
"key": "datetime-picker", },
"template": datetimePickerTemplate {
}, "key": "datetime-picker",
{ "template": datetimePickerTemplate
"key": "datetime-field", },
"template": datetimeFieldTemplate {
} "key": "datetime-field",
], "template": datetimeFieldTemplate
"licenses": [ }
{ ],
"name": "Normalize.css", "licenses": [
"version": "1.1.2", {
"description": "Browser style normalization", "name": "Normalize.css",
"author": "Nicolas Gallagher, Jonathan Neal", "version": "1.1.2",
"website": "http://necolas.github.io/normalize.css/", "description": "Browser style normalization",
"copyright": "Copyright (c) Nicolas Gallagher and Jonathan Neal", "author": "Nicolas Gallagher, Jonathan Neal",
"license": "license-mit", "website": "http://necolas.github.io/normalize.css/",
"link": "https://github.com/necolas/normalize.css/blob/v1.1.2/LICENSE.md" "copyright": "Copyright (c) Nicolas Gallagher and Jonathan Neal",
}, "license": "license-mit",
{ "link": "https://github.com/necolas/normalize.css/blob/v1.1.2/LICENSE.md"
"name": "Zepto", },
"version": "1.1.6", {
"description": "DOM manipulation", "name": "Zepto",
"author": "Thomas Fuchs", "version": "1.1.6",
"website": "http://zeptojs.com/", "description": "DOM manipulation",
"copyright": "Copyright (c) 2010-2016 Thomas Fuchs", "author": "Thomas Fuchs",
"license": "license-mit", "website": "http://zeptojs.com/",
"link": "https://github.com/madrobby/zepto/blob/master/MIT-LICENSE" "copyright": "Copyright (c) 2010-2016 Thomas Fuchs",
} "license": "license-mit",
] "link": "https://github.com/madrobby/zepto/blob/master/MIT-LICENSE"
}
]
}
} }
}); };
}); });

View File

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

View File

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

View File

@@ -27,8 +27,7 @@ define([
"./res/info-table.html", "./res/info-table.html",
"./res/info-bubble.html", "./res/info-bubble.html",
"./res/bubble.html", "./res/bubble.html",
"./res/templates/info-button.html", "./res/templates/info-button.html"
'legacyRegistry'
], function ( ], function (
InfoGesture, InfoGesture,
InfoButtonGesture, InfoButtonGesture,
@@ -36,81 +35,83 @@ define([
infoTableTemplate, infoTableTemplate,
infoBubbleTemplate, infoBubbleTemplate,
bubbleTemplate, bubbleTemplate,
infoButtonTemplate, infoButtonTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/inspect", { return {
"extensions": { name:"platform/commonUI/inspect",
"templates": [ definition: {
{ "extensions": {
"key": "info-table", "templates": [
"template": infoTableTemplate {
}, "key": "info-table",
{ "template": infoTableTemplate
"key": "info-bubble", },
"template": infoBubbleTemplate {
} "key": "info-bubble",
], "template": infoBubbleTemplate
"containers": [ }
{ ],
"key": "bubble", "containers": [
"template": bubbleTemplate, {
"attributes": [ "key": "bubble",
"bubbleTitle", "template": bubbleTemplate,
"bubbleLayout" "attributes": [
], "bubbleTitle",
"alias": "bubble" "bubbleLayout"
} ],
], "alias": "bubble"
"gestures": [ }
{ ],
"key": "info", "gestures": [
"implementation": InfoGesture, {
"depends": [ "key": "info",
"$timeout", "implementation": InfoGesture,
"agentService", "depends": [
"infoService", "$timeout",
"INFO_HOVER_DELAY" "agentService",
] "infoService",
}, "INFO_HOVER_DELAY"
{ ]
"key": "infobutton", },
"implementation": InfoButtonGesture, {
"depends": [ "key": "infobutton",
"$document", "implementation": InfoButtonGesture,
"agentService", "depends": [
"infoService" "$document",
] "agentService",
} "infoService"
], ]
"services": [ }
{ ],
"key": "infoService", "services": [
"implementation": InfoService, {
"depends": [ "key": "infoService",
"$compile", "implementation": InfoService,
"$rootScope", "depends": [
"popupService", "$compile",
"agentService" "$rootScope",
] "popupService",
} "agentService"
], ]
"constants": [ }
{ ],
"key": "INFO_HOVER_DELAY", "constants": [
"value": 2000 {
} "key": "INFO_HOVER_DELAY",
], "value": 2000
"representations": [ }
{ ],
"key": "info-button", "representations": [
"template": infoButtonTemplate, {
"gestures": [ "key": "info-button",
"infobutton" "template": infoButtonTemplate,
] "gestures": [
} "infobutton"
] ]
}
]
}
} }
}); };
}); });

View File

@@ -23,44 +23,45 @@
define([ define([
"./src/MCTDevice", "./src/MCTDevice",
"./src/AgentService", "./src/AgentService",
"./src/DeviceClassifier", "./src/DeviceClassifier"
'legacyRegistry'
], function ( ], function (
MCTDevice, MCTDevice,
AgentService, AgentService,
DeviceClassifier, DeviceClassifier
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/mobile", { return {
"extensions": { name:"platform/commonUI/mobile",
"directives": [ definition: {
{ "extensions": {
"key": "mctDevice", "directives": [
"implementation": MCTDevice, {
"depends": [ "key": "mctDevice",
"agentService" "implementation": MCTDevice,
] "depends": [
} "agentService"
], ]
"services": [ }
{ ],
"key": "agentService", "services": [
"implementation": AgentService, {
"depends": [ "key": "agentService",
"$window" "implementation": AgentService,
] "depends": [
} "$window"
], ]
"runs": [ }
{ ],
"implementation": DeviceClassifier, "runs": [
"depends": [ {
"agentService", "implementation": DeviceClassifier,
"$document" "depends": [
] "agentService",
} "$document"
] ]
}
]
}
} }
}); };
}); });

View File

@@ -24,52 +24,53 @@ define([
"./src/NotificationIndicatorController", "./src/NotificationIndicatorController",
"./src/NotificationIndicator", "./src/NotificationIndicator",
"./src/NotificationService", "./src/NotificationService",
"./res/notification-indicator.html", "./res/notification-indicator.html"
'legacyRegistry'
], function ( ], function (
NotificationIndicatorController, NotificationIndicatorController,
NotificationIndicator, NotificationIndicator,
NotificationService, NotificationService,
notificationIndicatorTemplate, notificationIndicatorTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/notification", { return {
"extensions": { name:"platform/commonUI/notification",
"templates": [ definition: {
{ "extensions": {
"key": "notificationIndicatorTemplate", "templates": [
"template": notificationIndicatorTemplate {
} "key": "notificationIndicatorTemplate",
], "template": notificationIndicatorTemplate
"controllers": [ }
{ ],
"key": "NotificationIndicatorController", "controllers": [
"implementation": NotificationIndicatorController, {
"depends": [ "key": "NotificationIndicatorController",
"$scope", "implementation": NotificationIndicatorController,
"openmct", "depends": [
"dialogService" "$scope",
] "openmct",
} "dialogService"
], ]
"indicators": [ }
{ ],
"implementation": NotificationIndicator, "indicators": [
"priority": "fallback" {
} "implementation": NotificationIndicator,
], "priority": "fallback"
"services": [ }
{ ],
"key": "notificationService", "services": [
"implementation": function (openmct) { {
return new NotificationService.default(openmct); "key": "notificationService",
}, "implementation": function (openmct) {
"depends": [ return new NotificationService.default(openmct);
"openmct" },
] "depends": [
} "openmct"
] ]
}
]
}
} }
}); };
}); });

View File

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

View File

@@ -22,33 +22,34 @@
define([ define([
'./src/InspectorController', './src/InspectorController',
'./src/EditableRegionPolicy', './src/EditableRegionPolicy'
'legacyRegistry'
], function ( ], function (
InspectorController, InspectorController,
EditableRegionPolicy, EditableRegionPolicy
legacyRegistry
) { ) {
legacyRegistry.register("platform/commonUI/regions", { return {
"extensions": { name:"platform/commonUI/regions",
"controllers": [ definition: {
{ "extensions": {
"key": "InspectorController", "controllers": [
"implementation": InspectorController, {
"depends": [ "key": "InspectorController",
"$scope", "implementation": InspectorController,
"openmct", "depends": [
"$document" "$scope",
] "openmct",
} "$document"
], ]
"policies": [ }
{ ],
"category": "region", "policies": [
"implementation": EditableRegionPolicy {
} "category": "region",
] "implementation": EditableRegionPolicy
}
]
}
} }
}); };
}); });

View File

@@ -25,51 +25,52 @@ define([
"./src/CompositionMutabilityPolicy", "./src/CompositionMutabilityPolicy",
"./src/CompositionModelPolicy", "./src/CompositionModelPolicy",
"./src/ComposeActionPolicy", "./src/ComposeActionPolicy",
"./src/PersistableCompositionPolicy", "./src/PersistableCompositionPolicy"
'legacyRegistry'
], function ( ], function (
CompositionPolicy, CompositionPolicy,
CompositionMutabilityPolicy, CompositionMutabilityPolicy,
CompositionModelPolicy, CompositionModelPolicy,
ComposeActionPolicy, ComposeActionPolicy,
PersistableCompositionPolicy, PersistableCompositionPolicy
legacyRegistry
) { ) {
legacyRegistry.register("platform/containment", { return {
"extensions": { name:"platform/containment",
"policies": [ definition: {
{ "extensions": {
"category": "composition", "policies": [
"implementation": CompositionPolicy, {
"message": "Objects of this type cannot contain objects of that type." "category": "composition",
}, "implementation": CompositionPolicy,
{ "message": "Objects of this type cannot contain objects of that type."
"category": "composition", },
"implementation": CompositionMutabilityPolicy, {
"message": "Objects of this type cannot be modified." "category": "composition",
}, "implementation": CompositionMutabilityPolicy,
{ "message": "Objects of this type cannot be modified."
"category": "composition", },
"implementation": CompositionModelPolicy, {
"message": "Objects of this type cannot contain other objects." "category": "composition",
}, "implementation": CompositionModelPolicy,
{ "message": "Objects of this type cannot contain other objects."
"category": "action", },
"implementation": ComposeActionPolicy, {
"depends": [ "category": "action",
"$injector", "implementation": ComposeActionPolicy,
"openmct" "depends": [
], "$injector",
"message": "Objects of this type cannot contain objects of that type." "openmct"
}, ],
{ "message": "Objects of this type cannot contain objects of that type."
"category": "composition", },
"implementation": PersistableCompositionPolicy, {
"depends": ["openmct"], "category": "composition",
"message": "Change cannot be made to composition of non-persistable object" "implementation": PersistableCompositionPolicy,
} "depends": ["openmct"],
] "message": "Change cannot be made to composition of non-persistable object"
}
]
}
} }
}); };
}); });

View File

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

View File

@@ -49,8 +49,7 @@ define([
"./src/services/Now", "./src/services/Now",
"./src/services/Throttle", "./src/services/Throttle",
"./src/services/Topic", "./src/services/Topic",
"./src/services/Instantiate", "./src/services/Instantiate"
'legacyRegistry'
], function ( ], function (
DomainObjectProvider, DomainObjectProvider,
CoreCapabilityProvider, CoreCapabilityProvider,
@@ -80,312 +79,314 @@ define([
Now, Now,
Throttle, Throttle,
Topic, Topic,
Instantiate, Instantiate
legacyRegistry
) { ) {
legacyRegistry.register("platform/core", { return {
"name": "Open MCT Core", name:"platform/core",
"description": "Defines core concepts of Open MCT.", definition: {
"sources": "src", "name": "Open MCT Core",
"configuration": { "description": "Defines core concepts of Open MCT.",
"paths": { "sources": "src",
"uuid": "uuid" "configuration": {
} "paths": {
}, "uuid": "uuid"
"extensions": {
"components": [
{
"provides": "objectService",
"type": "provider",
"implementation": DomainObjectProvider,
"depends": [
"modelService",
"instantiate"
]
},
{
"provides": "capabilityService",
"type": "provider",
"implementation": CoreCapabilityProvider,
"depends": [
"capabilities[]",
"$log"
]
},
{
"provides": "modelService",
"type": "provider",
"implementation": StaticModelProvider,
"depends": [
"models[]",
"$q",
"$log"
]
},
{
"provides": "modelService",
"type": "aggregator",
"implementation": ModelAggregator,
"depends": [
"$q"
]
},
{
"provides": "modelService",
"type": "provider",
"implementation": PersistedModelProvider,
"depends": [
"persistenceService",
"$q",
"now",
"PERSISTENCE_SPACE"
]
},
{
"provides": "modelService",
"type": "decorator",
"implementation": CachingModelDecorator,
"depends": [
"cacheService"
]
},
{
"provides": "modelService",
"type": "decorator",
"priority": "fallback",
"implementation": MissingModelDecorator
},
{
"provides": "typeService",
"type": "provider",
"implementation": TypeProvider,
"depends": [
"types[]"
]
},
{
"provides": "actionService",
"type": "provider",
"implementation": ActionProvider,
"depends": [
"actions[]",
"$log"
]
},
{
"provides": "actionService",
"type": "aggregator",
"implementation": ActionAggregator
},
{
"provides": "actionService",
"type": "decorator",
"implementation": LoggingActionDecorator,
"depends": [
"$log"
]
},
{
"provides": "viewService",
"type": "provider",
"implementation": ViewProvider,
"depends": [
"views[]",
"$log"
]
},
{
"provides": "identifierService",
"type": "provider",
"implementation": IdentifierProvider,
"depends": [
"PERSISTENCE_SPACE"
]
} }
], },
"types": [ "extensions": {
{ "components": [
"properties": [ {
{ "provides": "objectService",
"control": "textfield", "type": "provider",
"name": "Title", "implementation": DomainObjectProvider,
"key": "name", "depends": [
"property": "name", "modelService",
"pattern": "\\S+", "instantiate"
"required": true, ]
"cssClass": "l-input-lg" },
}, {
{ "provides": "capabilityService",
"name": "Notes", "type": "provider",
"key": "notes", "implementation": CoreCapabilityProvider,
"property": "notes", "depends": [
"control": "textarea", "capabilities[]",
"required": false, "$log"
"cssClass": "l-textarea-sm" ]
} },
] {
}, "provides": "modelService",
{ "type": "provider",
"key": "root", "implementation": StaticModelProvider,
"name": "Root", "depends": [
"cssClass": "icon-folder" "models[]",
}, "$q",
{ "$log"
"key": "folder", ]
"name": "Folder", },
"cssClass": "icon-folder", {
"features": "creation", "provides": "modelService",
"description": "Create folders to organize other objects or links to objects.", "type": "aggregator",
"priority": 1000, "implementation": ModelAggregator,
"model": { "depends": [
"composition": [] "$q"
]
},
{
"provides": "modelService",
"type": "provider",
"implementation": PersistedModelProvider,
"depends": [
"persistenceService",
"$q",
"now",
"PERSISTENCE_SPACE"
]
},
{
"provides": "modelService",
"type": "decorator",
"implementation": CachingModelDecorator,
"depends": [
"cacheService"
]
},
{
"provides": "modelService",
"type": "decorator",
"priority": "fallback",
"implementation": MissingModelDecorator
},
{
"provides": "typeService",
"type": "provider",
"implementation": TypeProvider,
"depends": [
"types[]"
]
},
{
"provides": "actionService",
"type": "provider",
"implementation": ActionProvider,
"depends": [
"actions[]",
"$log"
]
},
{
"provides": "actionService",
"type": "aggregator",
"implementation": ActionAggregator
},
{
"provides": "actionService",
"type": "decorator",
"implementation": LoggingActionDecorator,
"depends": [
"$log"
]
},
{
"provides": "viewService",
"type": "provider",
"implementation": ViewProvider,
"depends": [
"views[]",
"$log"
]
},
{
"provides": "identifierService",
"type": "provider",
"implementation": IdentifierProvider,
"depends": [
"PERSISTENCE_SPACE"
]
} }
}, ],
{ "types": [
"key": "unknown", {
"name": "Unknown Type", "properties": [
"cssClass": "icon-object-unknown" {
}, "control": "textfield",
{ "name": "Title",
"name": "Unknown Type", "key": "name",
"cssClass": "icon-object-unknown" "property": "name",
} "pattern": "\\S+",
], "required": true,
"capabilities": [ "cssClass": "l-input-lg"
{ },
"key": "composition", {
"implementation": CompositionCapability, "name": "Notes",
"depends": [ "key": "notes",
"$injector" "property": "notes",
] "control": "textarea",
}, "required": false,
{ "cssClass": "l-textarea-sm"
"key": "relationship", }
"implementation": RelationshipCapability, ]
"depends": [ },
"$injector" {
] "key": "root",
}, "name": "Root",
{ "cssClass": "icon-folder"
"key": "type", },
"implementation": TypeCapability, {
"depends": [ "key": "folder",
"typeService" "name": "Folder",
] "cssClass": "icon-folder",
}, "features": "creation",
{ "description": "Create folders to organize other objects or links to objects.",
"key": "action", "priority": 1000,
"implementation": ActionCapability, "model": {
"depends": [ "composition": []
"$q", }
"actionService" },
] {
}, "key": "unknown",
{ "name": "Unknown Type",
"key": "view", "cssClass": "icon-object-unknown"
"implementation": ViewCapability, },
"depends": [ {
"viewService" "name": "Unknown Type",
] "cssClass": "icon-object-unknown"
}, }
{ ],
"key": "persistence", "capabilities": [
"implementation": PersistenceCapability, {
"depends": [ "key": "composition",
"cacheService", "implementation": CompositionCapability,
"persistenceService", "depends": [
"identifierService", "$injector"
"notificationService", ]
"$q" },
] {
}, "key": "relationship",
{ "implementation": RelationshipCapability,
"key": "metadata", "depends": [
"implementation": MetadataCapability "$injector"
}, ]
{ },
"key": "mutation", {
"implementation": MutationCapability, "key": "type",
"depends": [ "implementation": TypeCapability,
"topic", "depends": [
"now" "typeService"
] ]
}, },
{ {
"key": "delegation", "key": "action",
"implementation": DelegationCapability, "implementation": ActionCapability,
"depends": [ "depends": [
"$q" "$q",
] "actionService"
}, ]
{ },
"key": "instantiation", {
"implementation": InstantiationCapability, "key": "view",
"depends": [ "implementation": ViewCapability,
"$injector", "depends": [
"identifierService", "viewService"
"now" ]
] },
} {
], "key": "persistence",
"services": [ "implementation": PersistenceCapability,
{ "depends": [
"key": "cacheService", "cacheService",
"implementation": ModelCacheService "persistenceService",
}, "identifierService",
{ "notificationService",
"key": "now", "$q"
"implementation": Now ]
}, },
{ {
"key": "throttle", "key": "metadata",
"implementation": Throttle, "implementation": MetadataCapability
"depends": [ },
"$timeout" {
] "key": "mutation",
}, "implementation": MutationCapability,
{ "depends": [
"key": "topic", "topic",
"implementation": Topic, "now"
"depends": [ ]
"$log" },
] {
}, "key": "delegation",
{ "implementation": DelegationCapability,
"key": "instantiate", "depends": [
"implementation": Instantiate, "$q"
"depends": [ ]
"capabilityService", },
"identifierService", {
"cacheService" "key": "instantiation",
] "implementation": InstantiationCapability,
} "depends": [
], "$injector",
"runs": [ "identifierService",
{ "now"
"implementation": TransactingMutationListener, ]
"depends": ["topic", "transactionService", "cacheService"] }
} ],
], "services": [
"constants": [ {
{ "key": "cacheService",
"key": "PERSISTENCE_SPACE", "implementation": ModelCacheService
"value": "mct" },
} {
], "key": "now",
"licenses": [ "implementation": Now
{ },
"name": "Math.uuid.js", {
"version": "1.4.7", "key": "throttle",
"description": "Unique identifer generation (code adapted.)", "implementation": Throttle,
"author": "Robert Kieffer", "depends": [
"website": "https://github.com/broofa/node-uuid", "$timeout"
"copyright": "Copyright (c) 2010-2012 Robert Kieffer", ]
"license": "license-mit", },
"link": "http://opensource.org/licenses/MIT" {
} "key": "topic",
] "implementation": Topic,
"depends": [
"$log"
]
},
{
"key": "instantiate",
"implementation": Instantiate,
"depends": [
"capabilityService",
"identifierService",
"cacheService"
]
}
],
"runs": [
{
"implementation": TransactingMutationListener,
"depends": ["topic", "transactionService", "cacheService"]
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",
"value": "mct"
}
],
"licenses": [
{
"name": "Math.uuid.js",
"version": "1.4.7",
"description": "Unique identifer generation (code adapted.)",
"author": "Robert Kieffer",
"website": "https://github.com/broofa/node-uuid",
"copyright": "Copyright (c) 2010-2012 Robert Kieffer",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
}
]
}
} }
}); };
}); });

View File

@@ -34,8 +34,7 @@ define([
"./src/services/MoveService", "./src/services/MoveService",
"./src/services/LinkService", "./src/services/LinkService",
"./src/services/CopyService", "./src/services/CopyService",
"./src/services/LocationService", "./src/services/LocationService"
'legacyRegistry'
], function ( ], function (
MoveAction, MoveAction,
CopyAction, CopyAction,
@@ -50,152 +49,154 @@ define([
MoveService, MoveService,
LinkService, LinkService,
CopyService, CopyService,
LocationService, LocationService
legacyRegistry
) { ) {
legacyRegistry.register("platform/entanglement", { return {
"name": "Entanglement", name:"platform/entanglement",
"description": "Tools to assist you in entangling the world of WARP.", definition: {
"configuration": {}, "name": "Entanglement",
"extensions": { "description": "Tools to assist you in entangling the world of WARP.",
"actions": [ "configuration": {},
{ "extensions": {
"key": "move", "actions": [
"name": "Move", {
"description": "Move object to another location.", "key": "move",
"cssClass": "icon-move", "name": "Move",
"category": "contextual", "description": "Move object to another location.",
"implementation": MoveAction, "cssClass": "icon-move",
"depends": [ "category": "contextual",
"policyService", "implementation": MoveAction,
"locationService", "depends": [
"moveService" "policyService",
] "locationService",
}, "moveService"
{ ]
"key": "copy", },
"name": "Duplicate", {
"description": "Duplicate object to another location.", "key": "copy",
"cssClass": "icon-duplicate", "name": "Duplicate",
"category": "contextual", "description": "Duplicate object to another location.",
"implementation": CopyAction, "cssClass": "icon-duplicate",
"depends": [ "category": "contextual",
"$log", "implementation": CopyAction,
"policyService", "depends": [
"locationService", "$log",
"copyService", "policyService",
"dialogService", "locationService",
"notificationService" "copyService",
] "dialogService",
}, "notificationService"
{ ]
"key": "link", },
"name": "Create Link", {
"description": "Create Link to object in another location.", "key": "link",
"cssClass": "icon-link", "name": "Create Link",
"category": "contextual", "description": "Create Link to object in another location.",
"implementation": LinkAction, "cssClass": "icon-link",
"depends": [ "category": "contextual",
"policyService", "implementation": LinkAction,
"locationService", "depends": [
"linkService" "policyService",
] "locationService",
}, "linkService"
{ ]
"key": "locate", },
"name": "Set Primary Location", {
"description": "Set a domain object's primary location.", "key": "locate",
"cssClass": "", "name": "Set Primary Location",
"category": "contextual", "description": "Set a domain object's primary location.",
"implementation": SetPrimaryLocationAction "cssClass": "",
} "category": "contextual",
], "implementation": SetPrimaryLocationAction
"components": [ }
{ ],
"type": "decorator", "components": [
"provides": "creationService", {
"implementation": LocatingCreationDecorator "type": "decorator",
}, "provides": "creationService",
{ "implementation": LocatingCreationDecorator
"type": "decorator", },
"provides": "objectService", {
"implementation": LocatingObjectDecorator, "type": "decorator",
"depends": [ "provides": "objectService",
"$q", "implementation": LocatingObjectDecorator,
"$log" "depends": [
] "$q",
} "$log"
], ]
"policies": [ }
{ ],
"category": "action", "policies": [
"implementation": CrossSpacePolicy {
}, "category": "action",
{ "implementation": CrossSpacePolicy
"category": "action", },
"implementation": CopyPolicy {
}, "category": "action",
{ "implementation": CopyPolicy
"category": "action", },
"implementation": MovePolicy {
} "category": "action",
], "implementation": MovePolicy
"capabilities": [ }
{ ],
"key": "location", "capabilities": [
"name": "Location Capability", {
"description": "Provides a capability for retrieving the location of an object based upon it's context.", "key": "location",
"implementation": LocationCapability, "name": "Location Capability",
"depends": [ "description": "Provides a capability for retrieving the location of an object based upon it's context.",
"$q", "implementation": LocationCapability,
"$injector" "depends": [
] "$q",
} "$injector"
], ]
"services": [ }
{ ],
"key": "moveService", "services": [
"name": "Move Service", {
"description": "Provides a service for moving objects", "key": "moveService",
"implementation": MoveService, "name": "Move Service",
"depends": [ "description": "Provides a service for moving objects",
"openmct", "implementation": MoveService,
"linkService", "depends": [
"$q" "openmct",
] "linkService",
}, "$q"
{ ]
"key": "linkService", },
"name": "Link Service", {
"description": "Provides a service for linking objects", "key": "linkService",
"implementation": LinkService, "name": "Link Service",
"depends": [ "description": "Provides a service for linking objects",
"openmct" "implementation": LinkService,
] "depends": [
}, "openmct"
{ ]
"key": "copyService", },
"name": "Copy Service", {
"description": "Provides a service for copying objects", "key": "copyService",
"implementation": CopyService, "name": "Copy Service",
"depends": [ "description": "Provides a service for copying objects",
"$q", "implementation": CopyService,
"policyService", "depends": [
"openmct" "$q",
] "policyService",
}, "openmct"
{ ]
"key": "locationService", },
"name": "Location Service", {
"description": "Provides a service for prompting a user for locations.", "key": "locationService",
"implementation": LocationService, "name": "Location Service",
"depends": [ "description": "Provides a service for prompting a user for locations.",
"dialogService" "implementation": LocationService,
] "depends": [
} "dialogService"
], ]
"licenses": [] }
],
"licenses": []
}
} }
}); };
}); });

View File

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

View File

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

View File

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

View File

@@ -21,25 +21,26 @@
*****************************************************************************/ *****************************************************************************/
define([ define([
"./src/WorkerService", "./src/WorkerService"
'legacyRegistry'
], function ( ], function (
WorkerService, WorkerService
legacyRegistry
) { ) {
legacyRegistry.register("platform/execution", { return {
"extensions": { name:"platform/execution",
"services": [ definition: {
{ "extensions": {
"key": "workerService", "services": [
"implementation": WorkerService, {
"depends": [ "key": "workerService",
"$window", "implementation": WorkerService,
"workers[]" "depends": [
] "$window",
} "workers[]"
] ]
}
]
}
} }
}); };
}); });

View File

@@ -22,42 +22,44 @@
define([ define([
"./ExportService", "./ExportService",
"saveAs", "saveAs"
"legacyRegistry" ], function (ExportService, saveAs) {
], function (ExportService, saveAs, legacyRegistry) {
legacyRegistry.register("platform/exporters", { return {
extensions: { name:"platform/exporters",
services: [ definition: {
{ extensions: {
key: "exportService", services: [
implementation: function () { {
return new ExportService(saveAs.saveAs); key: "exportService",
implementation: function () {
return new ExportService(saveAs.saveAs);
}
} }
} ],
], licenses: [
licenses: [ {
{ "name": "CSV.js",
"name": "CSV.js", "version": "3.6.4",
"version": "3.6.4", "author": "Kash Nouroozi",
"author": "Kash Nouroozi", "description": "Encoder for CSV (comma separated values) export",
"description": "Encoder for CSV (comma separated values) export", "website": "https://github.com/knrz/CSV.js",
"website": "https://github.com/knrz/CSV.js", "copyright": "Copyright (c) 2014 Kash Nouroozi",
"copyright": "Copyright (c) 2014 Kash Nouroozi", "license": "license-mit",
"license": "license-mit", "link": "https://github.com/knrz/CSV.js/blob/3.6.4/LICENSE"
"link": "https://github.com/knrz/CSV.js/blob/3.6.4/LICENSE" },
}, {
{ "name": "FileSaver.js",
"name": "FileSaver.js", "version": "0.0.2",
"version": "0.0.2", "author": "Eli Grey",
"author": "Eli Grey", "description": "File download initiator (for file exports)",
"description": "File download initiator (for file exports)", "website": "https://github.com/eligrey/FileSaver.js/",
"website": "https://github.com/eligrey/FileSaver.js/", "copyright": "Copyright © 2015 Eli Grey.",
"copyright": "Copyright © 2015 Eli Grey.", "license": "license-mit",
"license": "license-mit", "link": "https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md"
"link": "https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md" }
} ]
] }
} }
}); };
}); });

View File

@@ -35,8 +35,7 @@ define([
"./src/actions/StopTimerAction", "./src/actions/StopTimerAction",
"./src/actions/PauseTimerAction", "./src/actions/PauseTimerAction",
"./res/templates/clock.html", "./res/templates/clock.html",
"./res/templates/timer.html", "./res/templates/timer.html"
'legacyRegistry'
], function ( ], function (
MomentTimezone, MomentTimezone,
ClockIndicator, ClockIndicator,
@@ -52,269 +51,271 @@ define([
StopTimerAction, StopTimerAction,
PauseTimerAction, PauseTimerAction,
clockTemplate, clockTemplate,
timerTemplate, timerTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/features/clock", { return {
"name": "Clocks/Timers", name:"platform/features/clock",
"descriptions": "Domain objects for displaying current & relative times.", definition: {
"configuration": { "name": "Clocks/Timers",
"paths": { "descriptions": "Domain objects for displaying current & relative times.",
"moment-duration-format": "moment-duration-format" "configuration": {
"paths": {
"moment-duration-format": "moment-duration-format"
},
"shim": {
"moment-duration-format": {
"deps": [
"moment"
]
}
}
}, },
"shim": { "extensions": {
"moment-duration-format": { "constants": [
"deps": [ {
"moment" "key": "CLOCK_INDICATOR_FORMAT",
] "value": "YYYY/MM/DD HH:mm:ss"
} }
} ],
}, "indicators": [
"extensions": { {
"constants": [ "implementation": ClockIndicator,
{ "depends": [
"key": "CLOCK_INDICATOR_FORMAT", "tickerService",
"value": "YYYY/MM/DD HH:mm:ss" "CLOCK_INDICATOR_FORMAT"
}
],
"indicators": [
{
"implementation": ClockIndicator,
"depends": [
"tickerService",
"CLOCK_INDICATOR_FORMAT"
],
"priority": "preferred"
}
],
"services": [
{
"key": "tickerService",
"implementation": TickerService,
"depends": [
"$timeout",
"now"
]
},
{
"key": "timerService",
"implementation": TimerService,
"depends": ["openmct"]
}
],
"controllers": [
{
"key": "ClockController",
"implementation": ClockController,
"depends": [
"$scope",
"tickerService"
]
},
{
"key": "TimerController",
"implementation": TimerController,
"depends": [
"$scope",
"$window",
"now"
]
},
{
"key": "RefreshingController",
"implementation": RefreshingController,
"depends": [
"$scope",
"tickerService"
]
}
],
"views": [
{
"key": "clock",
"type": "clock",
"editable": false,
"template": clockTemplate
},
{
"key": "timer",
"type": "timer",
"editable": false,
"template": timerTemplate
}
],
"actions": [
{
"key": "timer.follow",
"implementation": FollowTimerAction,
"depends": ["timerService"],
"category": "contextual",
"name": "Follow Timer",
"cssClass": "icon-clock",
"priority": "optional"
},
{
"key": "timer.start",
"implementation": StartTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Start",
"cssClass": "icon-play",
"priority": "preferred"
},
{
"key": "timer.pause",
"implementation": PauseTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Pause",
"cssClass": "icon-pause",
"priority": "preferred"
},
{
"key": "timer.restart",
"implementation": RestartTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Restart at 0",
"cssClass": "icon-refresh",
"priority": "preferred"
},
{
"key": "timer.stop",
"implementation": StopTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Stop",
"cssClass": "icon-box",
"priority": "preferred"
}
],
"types": [
{
"key": "clock",
"name": "Clock",
"cssClass": "icon-clock",
"description": "A UTC-based clock that supports a variety of display formats. Clocks can be added to Display Layouts.",
"priority": 101,
"features": [
"creation"
],
"properties": [
{
"key": "clockFormat",
"name": "Display Format",
"control": "composite",
"items": [
{
"control": "select",
"options": [
{
"value": "YYYY/MM/DD hh:mm:ss",
"name": "YYYY/MM/DD hh:mm:ss"
},
{
"value": "YYYY/DDD hh:mm:ss",
"name": "YYYY/DDD hh:mm:ss"
},
{
"value": "hh:mm:ss",
"name": "hh:mm:ss"
}
],
"cssClass": "l-inline"
},
{
"control": "select",
"options": [
{
"value": "clock12",
"name": "12hr"
},
{
"value": "clock24",
"name": "24hr"
}
],
"cssClass": "l-inline"
}
]
},
{
"key": "timezone",
"name": "Timezone",
"control": "autocomplete",
"options": MomentTimezone.tz.names()
}
],
"model": {
"clockFormat": [
"YYYY/MM/DD hh:mm:ss",
"clock12"
], ],
"timezone": "UTC" "priority": "preferred"
} }
}, ],
{ "services": [
"key": "timer", {
"name": "Timer", "key": "tickerService",
"cssClass": "icon-timer", "implementation": TickerService,
"description": "A timer that counts up or down to a datetime. Timers can be started, stopped and reset whenever needed, and support a variety of display formats. Each Timer displays the same value to all users. Timers can be added to Display Layouts.", "depends": [
"priority": 100, "$timeout",
"features": [ "now"
"creation" ]
], },
"properties": [ {
{ "key": "timerService",
"key": "timestamp", "implementation": TimerService,
"control": "datetime", "depends": ["openmct"]
"name": "Target" }
}, ],
{ "controllers": [
"key": "timerFormat", {
"control": "select", "key": "ClockController",
"name": "Display Format", "implementation": ClockController,
"options": [ "depends": [
{ "$scope",
"value": "long", "tickerService"
"name": "DDD hh:mm:ss" ]
}, },
{ {
"value": "short", "key": "TimerController",
"name": "hh:mm:ss" "implementation": TimerController,
} "depends": [
] "$scope",
"$window",
"now"
]
},
{
"key": "RefreshingController",
"implementation": RefreshingController,
"depends": [
"$scope",
"tickerService"
]
}
],
"views": [
{
"key": "clock",
"type": "clock",
"editable": false,
"template": clockTemplate
},
{
"key": "timer",
"type": "timer",
"editable": false,
"template": timerTemplate
}
],
"actions": [
{
"key": "timer.follow",
"implementation": FollowTimerAction,
"depends": ["timerService"],
"category": "contextual",
"name": "Follow Timer",
"cssClass": "icon-clock",
"priority": "optional"
},
{
"key": "timer.start",
"implementation": StartTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Start",
"cssClass": "icon-play",
"priority": "preferred"
},
{
"key": "timer.pause",
"implementation": PauseTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Pause",
"cssClass": "icon-pause",
"priority": "preferred"
},
{
"key": "timer.restart",
"implementation": RestartTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Restart at 0",
"cssClass": "icon-refresh",
"priority": "preferred"
},
{
"key": "timer.stop",
"implementation": StopTimerAction,
"depends": [
"now"
],
"category": "contextual",
"name": "Stop",
"cssClass": "icon-box",
"priority": "preferred"
}
],
"types": [
{
"key": "clock",
"name": "Clock",
"cssClass": "icon-clock",
"description": "A UTC-based clock that supports a variety of display formats. Clocks can be added to Display Layouts.",
"priority": 101,
"features": [
"creation"
],
"properties": [
{
"key": "clockFormat",
"name": "Display Format",
"control": "composite",
"items": [
{
"control": "select",
"options": [
{
"value": "YYYY/MM/DD hh:mm:ss",
"name": "YYYY/MM/DD hh:mm:ss"
},
{
"value": "YYYY/DDD hh:mm:ss",
"name": "YYYY/DDD hh:mm:ss"
},
{
"value": "hh:mm:ss",
"name": "hh:mm:ss"
}
],
"cssClass": "l-inline"
},
{
"control": "select",
"options": [
{
"value": "clock12",
"name": "12hr"
},
{
"value": "clock24",
"name": "24hr"
}
],
"cssClass": "l-inline"
}
]
},
{
"key": "timezone",
"name": "Timezone",
"control": "autocomplete",
"options": MomentTimezone.tz.names()
}
],
"model": {
"clockFormat": [
"YYYY/MM/DD hh:mm:ss",
"clock12"
],
"timezone": "UTC"
}
},
{
"key": "timer",
"name": "Timer",
"cssClass": "icon-timer",
"description": "A timer that counts up or down to a datetime. Timers can be started, stopped and reset whenever needed, and support a variety of display formats. Each Timer displays the same value to all users. Timers can be added to Display Layouts.",
"priority": 100,
"features": [
"creation"
],
"properties": [
{
"key": "timestamp",
"control": "datetime",
"name": "Target"
},
{
"key": "timerFormat",
"control": "select",
"name": "Display Format",
"options": [
{
"value": "long",
"name": "DDD hh:mm:ss"
},
{
"value": "short",
"name": "hh:mm:ss"
}
]
}
],
"model": {
"timerFormat": "DDD hh:mm:ss"
} }
],
"model": {
"timerFormat": "DDD hh:mm:ss"
} }
} ],
], "runs": [{
"runs": [{ "implementation": FollowIndicator,
"implementation": FollowIndicator, "depends": ["openmct", "timerService"]
"depends": ["openmct", "timerService"] }],
}], "licenses": [
"licenses": [ {
{ "name": "moment-duration-format",
"name": "moment-duration-format", "version": "1.3.0",
"version": "1.3.0", "author": "John Madhavan-Reese",
"author": "John Madhavan-Reese", "description": "Duration parsing/formatting",
"description": "Duration parsing/formatting", "website": "https://github.com/jsmreese/moment-duration-format",
"website": "https://github.com/jsmreese/moment-duration-format", "copyright": "Copyright 2014 John Madhavan-Reese",
"copyright": "Copyright 2014 John Madhavan-Reese", "license": "license-mit",
"license": "license-mit", "link": "https://github.com/jsmreese/moment-duration-format/blob/master/LICENSE"
"link": "https://github.com/jsmreese/moment-duration-format/blob/master/LICENSE" }
} ]
] }
} }
}); };
}); });

View File

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

View File

@@ -22,98 +22,99 @@
define([ define([
'./src/HyperlinkController', './src/HyperlinkController',
'legacyRegistry',
'./res/templates/hyperlink.html' './res/templates/hyperlink.html'
], function ( ], function (
HyperlinkController, HyperlinkController,
legacyRegistry,
hyperlinkTemplate hyperlinkTemplate
) { ) {
legacyRegistry.register("platform/features/hyperlink", { return {
"name": "Hyperlink", name:"platform/features/hyperlink",
"description": "Insert a hyperlink to reference a link", definition: {
"extensions": { "name": "Hyperlink",
"types": [ "description": "Insert a hyperlink to reference a link",
{ "extensions": {
"key": "hyperlink", "types": [
"name": "Hyperlink", {
"cssClass": "icon-chain-links", "key": "hyperlink",
"description": "A hyperlink to redirect to a different link", "name": "Hyperlink",
"features": ["creation"], "cssClass": "icon-chain-links",
"properties": [ "description": "A hyperlink to redirect to a different link",
{ "features": ["creation"],
"key": "url", "properties": [
"name": "URL", {
"control": "textfield", "key": "url",
"required": true, "name": "URL",
"cssClass": "l-input-lg" "control": "textfield",
}, "required": true,
"cssClass": "l-input-lg"
},
{ {
"key": "displayText", "key": "displayText",
"name": "Text to Display", "name": "Text to Display",
"control": "textfield", "control": "textfield",
"required": true, "required": true,
"cssClass": "l-input-lg" "cssClass": "l-input-lg"
}, },
{ {
"key": "displayFormat", "key": "displayFormat",
"name": "Display Format", "name": "Display Format",
"control": "select", "control": "select",
"options": [ "options": [
{ {
"name": "Link", "name": "Link",
"value": "link" "value": "link"
}, },
{ {
"value": "button", "value": "button",
"name": "Button" "name": "Button"
} }
], ],
"cssClass": "l-inline" "cssClass": "l-inline"
}, },
{ {
"key": "openNewTab", "key": "openNewTab",
"name": "Tab to Open Hyperlink", "name": "Tab to Open Hyperlink",
"control": "select", "control": "select",
"options": [ "options": [
{ {
"name": "Open in this tab", "name": "Open in this tab",
"value": "thisTab" "value": "thisTab"
}, },
{ {
"value": "newTab", "value": "newTab",
"name": "Open in a new tab" "name": "Open in a new tab"
} }
], ],
"cssClass": "l-inline" "cssClass": "l-inline"
}
],
"model": {
"displayFormat": "link",
"openNewTab": "thisTab",
"removeTitle": true
} }
],
"model": {
"displayFormat": "link",
"openNewTab": "thisTab",
"removeTitle": true
}
} }
], ],
"views": [ "views": [
{ {
"key": "hyperlink", "key": "hyperlink",
"type": "hyperlink", "type": "hyperlink",
"name": "Hyperlink Display", "name": "Hyperlink Display",
"template": hyperlinkTemplate, "template": hyperlinkTemplate,
"editable": false "editable": false
} }
], ],
"controllers": [ "controllers": [
{ {
"key": "HyperlinkController", "key": "HyperlinkController",
"implementation": HyperlinkController, "implementation": HyperlinkController,
"depends": ["$scope"] "depends": ["$scope"]
} }
] ]
}
} }
}); };
}); });

View File

@@ -24,62 +24,63 @@ define([
"./src/policies/ImageryViewPolicy", "./src/policies/ImageryViewPolicy",
"./src/controllers/ImageryController", "./src/controllers/ImageryController",
"./src/directives/MCTBackgroundImage", "./src/directives/MCTBackgroundImage",
"./res/templates/imagery.html", "./res/templates/imagery.html"
'legacyRegistry'
], function ( ], function (
ImageryViewPolicy, ImageryViewPolicy,
ImageryController, ImageryController,
MCTBackgroundImage, MCTBackgroundImage,
imageryTemplate, imageryTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/features/imagery", { return {
"name": "Plot view for telemetry", name:"platform/features/imagery",
"extensions": { definition: {
"views": [ "name": "Plot view for telemetry",
{ "extensions": {
"name": "Imagery", "views": [
"key": "imagery", {
"cssClass": "icon-image", "name": "Imagery",
"template": imageryTemplate, "key": "imagery",
"priority": "preferred", "cssClass": "icon-image",
"needs": [ "template": imageryTemplate,
"telemetry" "priority": "preferred",
], "needs": [
"editable": false "telemetry"
} ],
], "editable": false
"policies": [ }
{ ],
"category": "view", "policies": [
"implementation": ImageryViewPolicy, {
"depends": [ "category": "view",
"openmct" "implementation": ImageryViewPolicy,
] "depends": [
} "openmct"
], ]
"controllers": [ }
{ ],
"key": "ImageryController", "controllers": [
"implementation": ImageryController, {
"depends": [ "key": "ImageryController",
"$scope", "implementation": ImageryController,
"$window", "depends": [
"$element", "$scope",
"openmct" "$window",
] "$element",
} "openmct"
], ]
"directives": [ }
{ ],
"key": "mctBackgroundImage", "directives": [
"implementation": MCTBackgroundImage, {
"depends": [ "key": "mctBackgroundImage",
"$document" "implementation": MCTBackgroundImage,
] "depends": [
} "$document"
] ]
}
]
}
} }
}); };
}); });

View File

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

View File

@@ -20,32 +20,30 @@
* at runtime from the About dialog for additional information. * at runtime from the About dialog for additional information.
*****************************************************************************/ *****************************************************************************/
define([ define([], function () {
'legacyRegistry' return {
], function ( name:"platform/features/my-items",
legacyRegistry definition: {
) { "name": "My Items",
"description": "Defines a root named My Items",
legacyRegistry.register("platform/features/my-items", { "extensions": {
"name": "My Items", "roots": [
"description": "Defines a root named My Items", {
"extensions": { "id": "mine"
"roots": [
{
"id": "mine"
}
],
"models": [
{
"id": "mine",
"model": {
"name": "My Items",
"type": "folder",
"composition": [],
"location": "ROOT"
} }
} ],
] "models": [
{
"id": "mine",
"model": {
"name": "My Items",
"type": "folder",
"composition": [],
"location": "ROOT"
}
}
]
}
} }
}); };
}); });

View File

@@ -22,55 +22,56 @@
define([ define([
"./src/EmbeddedPageController", "./src/EmbeddedPageController",
"./res/iframe.html", "./res/iframe.html"
'legacyRegistry'
], function ( ], function (
EmbeddedPageController, EmbeddedPageController,
iframeTemplate, iframeTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/features/pages", { return {
"extensions": { name:"platform/features/pages",
"types": [ definition: {
{ "extensions": {
"key": "example.page", "types": [
"name": "Web Page", {
"cssClass": "icon-page", "key": "example.page",
"description": "Embed a web page or web-based image in a resizeable window component. Can be added to Display Layouts. Note that the URL being embedded must allow iframing.", "name": "Web Page",
"priority": 50, "cssClass": "icon-page",
"features": [ "description": "Embed a web page or web-based image in a resizeable window component. Can be added to Display Layouts. Note that the URL being embedded must allow iframing.",
"creation" "priority": 50,
], "features": [
"properties": [ "creation"
{ ],
"key": "url", "properties": [
"name": "URL", {
"control": "textfield", "key": "url",
"required": true, "name": "URL",
"cssClass": "l-input-lg" "control": "textfield",
} "required": true,
] "cssClass": "l-input-lg"
} }
], ]
"views": [ }
{ ],
"template": iframeTemplate, "views": [
"name": "Page", {
"type": "example.page", "template": iframeTemplate,
"key": "example.page", "name": "Page",
"editable": false "type": "example.page",
} "key": "example.page",
], "editable": false
"controllers": [ }
{ ],
"key": "EmbeddedPageController", "controllers": [
"implementation": EmbeddedPageController, {
"depends": [ "key": "EmbeddedPageController",
"$sce" "implementation": EmbeddedPageController,
] "depends": [
} "$sce"
] ]
}
]
}
} }
}); };
}); });

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

@@ -1,55 +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 adds the Web Page object type, which can be used to embed
* other web pages with layouts.
* @namespace platform/features/pages
*/
define(
[],
function () {
/**
* Controller for embedded web pages; serves simply as a
* wrapper for `$sce` to mark pages as trusted.
* @constructor
* @memberof platform/features/pages
*/
function EmbeddedPageController($sce) {
this.$sce = $sce;
}
/**
* Alias of `$sce.trustAsResourceUrl`.
* @param {string} url the URL to trust
* @returns {string} the trusted URL
*/
EmbeddedPageController.prototype.trust = function (url) {
return this.$sce.trustAsResourceUrl(url);
};
return EmbeddedPageController;
}
);

View File

@@ -1,56 +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/EmbeddedPageController"],
function (EmbeddedPageController) {
describe("The controller for embedded pages", function () {
var mockSCE,
controller;
beforeEach(function () {
mockSCE = jasmine.createSpyObj(
'$sce',
["trustAsResourceUrl"]
);
mockSCE.trustAsResourceUrl.and.callFake(function (v) {
return v;
});
controller = new EmbeddedPageController(mockSCE);
});
it("allows URLs to be marked as trusted", function () {
var testURL = "http://www.nasa.gov";
expect(controller.trust(testURL))
.toEqual(testURL);
expect(mockSCE.trustAsResourceUrl)
.toHaveBeenCalledWith(testURL);
});
});
}
);

View File

@@ -22,35 +22,35 @@
define([ define([
"./res/markup.html", "./res/markup.html"
'legacyRegistry'
], function ( ], function (
markupTemplate
markupTemplate,
legacyRegistry
) { ) {
legacyRegistry.register("platform/features/static-markup", { return {
"extensions": { name:"platform/features/static-markup",
"types": [ definition: {
{ "extensions": {
"key": "static.markup", "types": [
"name": "Static Markup", {
"cssClass": "icon-pencil", "key": "static.markup",
"description": "Static markup sandbox", "name": "Static Markup",
"features": [ "cssClass": "icon-pencil",
"creation" "description": "Static markup sandbox",
] "features": [
} "creation"
], ]
"views": [ }
{ ],
"template": markupTemplate, "views": [
"name": "Static Markup", {
"type": "static.markup", "template": markupTemplate,
"key": "static.markup" "name": "Static Markup",
} "type": "static.markup",
] "key": "static.markup"
}
]
}
} }
}); };
}); });

View File

@@ -21,31 +21,32 @@
*****************************************************************************/ *****************************************************************************/
define([ define([
"./res/templates/deprecated-timeline-message.html", "./res/templates/deprecated-timeline-message.html"
'legacyRegistry'
], function ( ], function (
deprecatedTimelineMessage, deprecatedTimelineMessage
legacyRegistry
) { ) {
legacyRegistry.register('platform/features/timeline', { return {
extensions: { name: 'platform/features/timeline',
types: [ definition: {
{ extensions: {
key: "timeline", types: [
name: "Timeline", {
description: "Timeline, Activity and Activity Mode objects have been deprecated and will no longer be supported. (07/18/2018)", key: "timeline",
priority: 502 name: "Timeline",
} description: "Timeline, Activity and Activity Mode objects have been deprecated and will no longer be supported. (07/18/2018)",
], priority: 502
views: [ }
{ ],
key: "timeline", views: [
name: "Timeline", {
type: "timeline", key: "timeline",
description: "Timeline, Activity and Activity Mode objects have been deprecated and will no longer be supported. (07/18/2018)", name: "Timeline",
template: deprecatedTimelineMessage type: "timeline",
} description: "Timeline, Activity and Activity Mode objects have been deprecated and will no longer be supported. (07/18/2018)",
] template: deprecatedTimelineMessage
}
]
}
} }
}); };
}); });

View File

@@ -45,8 +45,7 @@ define([
"./res/templates/controls/dialog.html", "./res/templates/controls/dialog.html",
"./res/templates/controls/radio.html", "./res/templates/controls/radio.html",
"./res/templates/controls/file-input.html", "./res/templates/controls/file-input.html",
"./res/templates/controls/snap-view.html", "./res/templates/controls/snap-view.html"
'legacyRegistry'
], function ( ], function (
MCTForm, MCTForm,
MCTControl, MCTControl,
@@ -72,146 +71,148 @@ define([
dialogTemplate, dialogTemplate,
radioTemplate, radioTemplate,
fileInputTemplate, fileInputTemplate,
snapViewTemplate, snapViewTemplate
legacyRegistry
) { ) {
legacyRegistry.register("platform/forms", { return {
"name": "MCT Forms", name:"platform/forms",
"description": "Form generator; includes directive and some controls.", definition: {
"extensions": { "name": "MCT Forms",
"directives": [ "description": "Form generator; includes directive and some controls.",
{ "extensions": {
"key": "mctForm", "directives": [
"implementation": MCTForm {
}, "key": "mctForm",
{ "implementation": MCTForm
"key": "mctControl", },
"implementation": MCTControl, {
"depends": [ "key": "mctControl",
"templateLinker", "implementation": MCTControl,
"controls[]" "depends": [
] "templateLinker",
}, "controls[]"
{ ]
"key": "mctFileInput", },
"implementation": MCTFileInput, {
"depends": [ "key": "mctFileInput",
"fileInputService" "implementation": MCTFileInput,
] "depends": [
} "fileInputService"
], ]
"controls": [ }
{ ],
"key": "autocomplete", "controls": [
"template": autocompleteTemplate {
}, "key": "autocomplete",
{ "template": autocompleteTemplate
"key": "checkbox", },
"template": checkboxTemplate {
}, "key": "checkbox",
{ "template": checkboxTemplate
"key": "radio", },
"template": radioTemplate {
}, "key": "radio",
{ "template": radioTemplate
"key": "datetime", },
"template": datetimeTemplate {
}, "key": "datetime",
{ "template": datetimeTemplate
"key": "select", },
"template": selectTemplate {
}, "key": "select",
{ "template": selectTemplate
"key": "textfield", },
"template": textfieldTemplate {
}, "key": "textfield",
{ "template": textfieldTemplate
"key": "numberfield", },
"template": numberfieldTemplate {
}, "key": "numberfield",
{ "template": numberfieldTemplate
"key": "textarea", },
"template": textareaTemplate {
}, "key": "textarea",
{ "template": textareaTemplate
"key": "button", },
"template": buttonTemplate {
}, "key": "button",
{ "template": buttonTemplate
"key": "color", },
"template": colorTemplate {
}, "key": "color",
{ "template": colorTemplate
"key": "composite", },
"template": compositeTemplate {
}, "key": "composite",
{ "template": compositeTemplate
"key": "menu-button", },
"template": menuButtonTemplate {
}, "key": "menu-button",
{ "template": menuButtonTemplate
"key": "dialog-button", },
"template": dialogTemplate {
}, "key": "dialog-button",
{ "template": dialogTemplate
"key": "file-input", },
"template": fileInputTemplate {
}, "key": "file-input",
{ "template": fileInputTemplate
"key": "snap-view", },
"template": snapViewTemplate {
} "key": "snap-view",
], "template": snapViewTemplate
"controllers": [ }
{ ],
"key": "AutocompleteController", "controllers": [
"implementation": AutocompleteController, {
"depends": [ "key": "AutocompleteController",
"$scope", "implementation": AutocompleteController,
"$element" "depends": [
] "$scope",
}, "$element"
{ ]
"key": "DateTimeController", },
"implementation": DateTimeController, {
"depends": [ "key": "DateTimeController",
"$scope" "implementation": DateTimeController,
] "depends": [
}, "$scope"
{ ]
"key": "CompositeController", },
"implementation": CompositeController {
}, "key": "CompositeController",
{ "implementation": CompositeController
"key": "ColorController", },
"implementation": ColorController {
}, "key": "ColorController",
{ "implementation": ColorController
"key": "DialogButtonController", },
"implementation": DialogButtonController, {
"depends": [ "key": "DialogButtonController",
"$scope", "implementation": DialogButtonController,
"dialogService" "depends": [
] "$scope",
}, "dialogService"
{ ]
"key": "SnapshotPreviewController", },
"implementation": SnapshotPreviewController, {
"depends": [ "key": "SnapshotPreviewController",
"$scope", "implementation": SnapshotPreviewController,
"openmct" "depends": [
] "$scope",
} "openmct"
], ]
"components": [ }
{ ],
"provides": "fileInputService", "components": [
"type": "provider", {
"implementation": FileInputService "provides": "fileInputService",
} "type": "provider",
"implementation": FileInputService
}
] ]
}
} }
}); };
}); });

View File

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

View File

@@ -20,91 +20,88 @@
* at runtime from the About dialog for additional information. * at runtime from the About dialog for additional information.
*****************************************************************************/ *****************************************************************************/
define([ define([], function () {
'legacyRegistry' return {
], function ( name:"platform/framework",
definition: {
legacyRegistry "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",
legacyRegistry.register("platform/framework", { "configuration": {
"name": "Open MCT Framework Component", "paths": {
"description": "Framework layer for Open MCT; interprets bundle definitions and serves as an intermediary between Require and Angular", "angular": "angular.min"
"libraries": "lib", },
"configuration": { "shim": {
"paths": { "angular": {
"angular": "angular.min" "exports": "angular"
}
}
}, },
"shim": { "extensions": {
"angular": { "licenses": [
"exports": "angular" {
} "name": "Blanket.js",
"version": "1.1.5",
"description": "Code coverage measurement and reporting",
"author": "Alex Seville",
"website": "http://blanketjs.org/",
"copyright": "Copyright (c) 2013 Alex Seville",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
},
{
"name": "Jasmine",
"version": "1.3.1",
"description": "Unit testing",
"author": "Pivotal Labs",
"website": "http://jasmine.github.io/",
"copyright": "Copyright (c) 2008-2011 Pivotal Labs",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
},
{
"name": "RequireJS",
"version": "2.1.22",
"description": "Script loader",
"author": "The Dojo Foundation",
"website": "http://requirejs.org/",
"copyright": "Copyright (c) 2010-2015, The Dojo Foundation",
"license": "license-mit",
"link": "https://github.com/jrburke/requirejs/blob/master/LICENSE"
},
{
"name": "AngularJS",
"version": "1.4.4",
"description": "Client-side web application framework",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2015 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.4.4/LICENSE"
},
{
"name": "Angular-Route",
"version": "1.4.4",
"description": "Client-side view routing",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2015 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.4.4/LICENSE"
},
{
"name": "ES6-Promise",
"version": "3.0.2",
"description": "Promise polyfill for pre-ECMAScript 6 browsers",
"author": "Yehuda Katz, Tom Dale, Stefan Penner and contributors",
"website": "https://github.com/jakearchibald/es6-promise",
"copyright": "Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors",
"license": "license-mit",
"link": "https://github.com/jakearchibald/es6-promise/blob/master/LICENSE"
}
]
} }
},
"extensions": {
"licenses": [
{
"name": "Blanket.js",
"version": "1.1.5",
"description": "Code coverage measurement and reporting",
"author": "Alex Seville",
"website": "http://blanketjs.org/",
"copyright": "Copyright (c) 2013 Alex Seville",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
},
{
"name": "Jasmine",
"version": "1.3.1",
"description": "Unit testing",
"author": "Pivotal Labs",
"website": "http://jasmine.github.io/",
"copyright": "Copyright (c) 2008-2011 Pivotal Labs",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
},
{
"name": "RequireJS",
"version": "2.1.22",
"description": "Script loader",
"author": "The Dojo Foundation",
"website": "http://requirejs.org/",
"copyright": "Copyright (c) 2010-2015, The Dojo Foundation",
"license": "license-mit",
"link": "https://github.com/jrburke/requirejs/blob/master/LICENSE"
},
{
"name": "AngularJS",
"version": "1.4.4",
"description": "Client-side web application framework",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2015 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.4.4/LICENSE"
},
{
"name": "Angular-Route",
"version": "1.4.4",
"description": "Client-side view routing",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2015 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.4.4/LICENSE"
},
{
"name": "ES6-Promise",
"version": "3.0.2",
"description": "Promise polyfill for pre-ECMAScript 6 browsers",
"author": "Yehuda Katz, Tom Dale, Stefan Penner and contributors",
"website": "https://github.com/jakearchibald/es6-promise",
"copyright": "Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors",
"license": "license-mit",
"link": "https://github.com/jakearchibald/es6-promise/blob/master/LICENSE"
}
]
} }
}); };
}); });

View File

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

View File

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

View File

@@ -24,63 +24,64 @@ define([
"./src/IdentityAggregator", "./src/IdentityAggregator",
"./src/IdentityProvider", "./src/IdentityProvider",
"./src/IdentityCreationDecorator", "./src/IdentityCreationDecorator",
"./src/IdentityIndicator", "./src/IdentityIndicator"
'legacyRegistry'
], function ( ], function (
IdentityAggregator, IdentityAggregator,
IdentityProvider, IdentityProvider,
IdentityCreationDecorator, IdentityCreationDecorator,
IdentityIndicator, IdentityIndicator
legacyRegistry
) { ) {
legacyRegistry.register("platform/identity", { return {
"extensions": { name:"platform/identity",
"components": [ definition: {
{ "extensions": {
"implementation": IdentityAggregator, "components": [
"type": "aggregator", {
"provides": "identityService", "implementation": IdentityAggregator,
"depends": [ "type": "aggregator",
"$q" "provides": "identityService",
] "depends": [
}, "$q"
{ ]
"implementation": IdentityProvider, },
"type": "provider", {
"provides": "identityService", "implementation": IdentityProvider,
"depends": [ "type": "provider",
"$q" "provides": "identityService",
], "depends": [
"priority": "fallback" "$q"
}, ],
{ "priority": "fallback"
"type": "decorator", },
"provides": "creationService", {
"implementation": IdentityCreationDecorator, "type": "decorator",
"depends": [ "provides": "creationService",
"identityService" "implementation": IdentityCreationDecorator,
] "depends": [
} "identityService"
], ]
"indicators": [ }
{ ],
"implementation": IdentityIndicator, "indicators": [
"depends": [ {
"identityService" "implementation": IdentityIndicator,
] "depends": [
} "identityService"
], ]
"types": [ }
{ ],
"properties": [ "types": [
{ {
"key": "creator", "properties": [
"name": "Creator" {
} "key": "creator",
] "name": "Creator"
} }
] ]
}
]
}
} }
}); };
}); });

View File

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

View File

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

View File

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

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