Merged from Master

This commit is contained in:
Henry 2016-01-14 17:23:53 -08:00
commit 032b2542f0
84 changed files with 605 additions and 3970 deletions

View File

@ -43,29 +43,24 @@ that Open MCT Web (and its build and tests) execute correctly.
## Tests
The repository for Open MCT Web includes a test suite that can be run
directly from the web browser, `test.html`. This page will:
Tests are written for [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html)
and run by [Karma](http://karma-runner.github.io). To run:
* Load `bundles.json` to determine which bundles are in the application.
* Load `test/suite.json` to determine which source files are to be tested.
This should contain an array of strings, where each is the name of an
AMD module in the bundle's source directory. For each source file:
* Code coverage instrumentation will be added, via Blanket.
* The associated test file will be loaded, via RequireJS. These will
be located in the bundle's test folder; the test runner will presume
these follow a naming convention where each module to be tested has a
corresponding test module with the suffix `Spec` in that folder.
* Jasmine will then be invoked to run all tests defined in the loaded
test modules. Code coverage reporting will be displayed at the bottom
of the test page.
`npm test`
At present, the test runner presumes that bundle conventions are followed
as above; that is, sources are contained in `src`, and tests are contained
in `test`. Additionally, individual test files must use the `Spec` suffix
as described above.
The test suite is configured to load any scripts ending with `Spec.js` found
in the `src` hierarchy. Full configuration details are found in
`karma.conf.js`. By convention, unit test scripts should be located
alongside the units that they test; for example, `src/foo/Bar.js` would be
tested by `src/foo/BarSpec.js`. (For legacy reasons, some existing tests may
be located in separate `test` folders near the units they test, but the
naming convention is otherwise the same.)
### Test Reporting
When `npm test` is run, test results will be written as HTML to
`target/tests`. Code coverage information is written to `target/coverage`.
An example of this is expressed in `platform/framework`, which follows
bundle conventions.
### Functional Testing
@ -84,8 +79,7 @@ To run:
Open MCT Web includes a Maven command line build. Although Open MCT Web
can be run as-is using the repository contents (that is, by viewing
`index.html` in a web browser), and its tests can be run in-place
similarly (that is, by viewing `test.html` in a browser), the command
`index.html` in a web browser), the command
line build allows machine-driven verification and packaging.
This build will:
@ -93,8 +87,7 @@ This build will:
* Check all sources (excluding those in directories named `lib`) with
JSLint for code style compliance. The build will fail if any sources
do not satisfy JSLint.
* Run unit tests. This is done by running `test.html` in a PhantomJS
browser-like environment. The build will fail if any tests fail.
* Run the [unit test suite](#tests).
* Package the application as a `war` (web archive) file. This is
convenient for deployment on Tomcat or similar. This archive will
include sources, resources, and libraries for bundles, as well

8
app.js
View File

@ -41,7 +41,13 @@
// Override bundles.json for HTTP requests
app.use('/' + BUNDLE_FILE, function (req, res) {
var bundles = JSON.parse(fs.readFileSync(BUNDLE_FILE, 'utf8'));
var bundles;
try {
bundles = JSON.parse(fs.readFileSync(BUNDLE_FILE, 'utf8'));
} catch (e) {
bundles = [];
}
// Handle command line inclusions/exclusions
bundles = bundles.concat(options.include);

View File

@ -1,39 +0,0 @@
[
"platform/framework",
"platform/core",
"platform/representation",
"platform/commonUI/about",
"platform/commonUI/browse",
"platform/commonUI/edit",
"platform/commonUI/dialog",
"platform/commonUI/formats",
"platform/commonUI/general",
"platform/commonUI/inspect",
"platform/commonUI/mobile",
"platform/commonUI/themes/espresso",
"platform/commonUI/notification",
"platform/containment",
"platform/execution",
"platform/telemetry",
"platform/features/clock",
"platform/features/events",
"platform/features/imagery",
"platform/features/layout",
"platform/features/pages",
"platform/features/plot",
"platform/features/scrolling",
"platform/features/timeline",
"platform/forms",
"platform/identity",
"platform/persistence/aggregator",
"platform/persistence/local",
"platform/persistence/queue",
"platform/policy",
"platform/entanglement",
"platform/search",
"platform/status",
"example/imagery",
"example/eventGenerator",
"example/generator"
]

View File

@ -407,7 +407,7 @@ In addition to the directories defined in the bundle definition, a bundle will
typically contain other directories not used at run-time. Additionally, some
useful development scripts (such as the command line build and the test suite)
expect this directory structure to be in use, and may ignore options chosen by
`b undle.json`. It is recommended that the directory structure described below be
`bundle.json`. It is recommended that the directory structure described below be
used for new bundles.
* `src`: Contains JavaScript sources for this bundle. May contain additional
@ -2245,7 +2245,7 @@ options. The sources can be deployed in the same directory structure used during
development. A few utilities are included to support development processes.
## Command-line Build
Open MCT Web includes a script for building via command line using Maven 3.0.4
Open MCT Web includes a script for building via command line using Maven 3.3.9
https://maven.apache.org/ .
Invoking mvn clean install will:
@ -2263,50 +2263,31 @@ download build dependencies.
## Test Suite
Open MCT Web uses Jasmine http://jasmine.github.io/ for automated testing.
The file `test.html` included at the top level of the source repository, can be
run from the browser to perform tests for all active bundles, as defined in
`bundle.json`.
Open MCT Web uses [Jasmine 1.3](http://jasmine.github.io/) and
[Karma](http://karma-runner.github.io) for automated testing.
To define tests for a bundle:
The test suite is configured to load any scripts ending with `Spec.js` found
in the `src` hierarchy. Full configuration details are found in
`karma.conf.js`. By convention, unit test scripts should be located
alongside the units that they test; for example, `src/foo/Bar.js` would be
tested by `src/foo/BarSpec.js`. (For legacy reasons, some existing tests may
be located in separate `test` folders near the units they test, but the
naming convention is otherwise the same.)
* Include a directory named `test` within that bundle.
* In the `test` directory, include a file named `suite.json`. This will identify
which scripts will be tested.
* The file `suite.json` must contain a JSON array of strings, where each string
is the name of a script to be tested. These names should include any directory
paths to the script after (but not including) the `src` folder, and should not
include the file's `.js` extension. (Note that while Open MCT Web's framework
allows a different name to be chosen for the src directory, the test runner
does not: This directory must be named `src` for the test runner to find it.)
* For each script to be tested, a corresponding test script should be located in
the bundle's `test` directory. This should include the suffix Spec at the end of
the filename (but before the `.js` extension.) This test script should be an AMD
module which uses the Jasmine API to declare its test behavior. It should
declare an AMD dependency on the script to be tested, using a relative path.
For example, if writing tests for a bundle at example/foo with two scripts:
* `example/foo/src/controllers/FooController.js`
* `example/foo/src/directives/FooDirective.js`
First, these scripts should be identified in `example/foo/test/suite.json` e.g.
with contents:`[ "controllers/FooController", "directives/FooDirective" ]`
Then, scripts which describe these tests should be written. For example, test
`example/foo/test/controllers/FooControllerSpec.js` could look like:
Tests are written as AMD modules which depend (at minimum) upon the
unit under test. For example, `src/foo/BarSpec.js` could look like:
/*global define,Promise,describe,it,expect,beforeEach*/
define(
["../../src/controllers/FooController"],
function (FooController) {
["./Bar"],
function (Bar) {
"use strict";
describe("The foo controller", function () {
describe("Bar", function () {
it("does something", function () {
var controller = new FooController();
expect(controller.foo()).toEqual("foo");
var bar = new Bar();
expect(controller.baz()).toEqual("foo");
});
});
}
@ -2435,4 +2416,4 @@ The following configuration constants are recognized by Open MCT Web bundles:
* `ELASTIC_ROOT`: URL or path to the ElasticSearch instance to be used for
domain object persistence. Should not include a trailing slash.
* `ELASTIC_PATH`: Path relative to the ElasticSearch instance where domain
object models should be persisted. Should take the form `<index>/<type>`.
object models should be persisted. Should take the form `<index>/<type>`.

View File

@ -1,32 +0,0 @@
{
"name": "Angular Built-ins Example",
"description": "Example showing how to declare extensions with built-in support from Angular.",
"sources": "src",
"extensions": {
"controllers": [
{
"key": "ExampleController",
"implementation": "ExampleController.js",
"depends": [ "$scope", "exampleService" ]
}
],
"directives": [
{
"key": "exampleDirective",
"implementation": "ExampleDirective.js",
"depends": [ "examples[]" ]
}
],
"routes": [
{
"templateUrl": "templates/example.html"
}
],
"services": [
{
"key": "exampleService",
"implementation": "ExampleService.js"
}
]
}
}

View File

@ -1,37 +0,0 @@
{
"extensions": {
"components": [
{
"implementation": "SomeProvider.js",
"provides": "someService",
"type": "provider"
},
{
"implementation": "SomeOtherProvider.js",
"provides": "someService",
"type": "provider"
},
{
"implementation": "SomeDecorator.js",
"provides": "someService",
"type": "decorator"
},
{
"implementation": "SomeOtherDecorator.js",
"provides": "someService",
"type": "decorator"
},
{
"implementation": "SomeAggregator.js",
"provides": "someService",
"type": "aggregator"
}
],
"examples": [
{
"implementation": "SomeOtherExample.js",
"depends": [ "someService" ]
}
]
}
}

View File

@ -1,32 +0,0 @@
{
"name": "Event Message Generator",
"description": "Example of a component that produces event data.",
"extensions": {
"components": [
{
"implementation": "EventTelemetryProvider.js",
"type": "provider",
"provides": "telemetryService",
"depends": [ "$q", "$timeout" ]
}
],
"types": [
{
"key": "eventGenerator",
"name": "Event Message Generator",
"glyph": "f",
"description": "An event message generator",
"features": "creation",
"model": {
"telemetry": {}
},
"telemetry": {
"source": "eventGenerator",
"ranges": [
{ "format": "string" }
]
}
}
]
}
}

View File

@ -1,16 +0,0 @@
{
"name": "Custom Extensions Examples",
"description": "Example showing how to declare custom extensions.",
"sources": "src",
"extensions": {
"examples": [
{
"text": "I came from example/extensions"
},
{
"implementation": "SomeExample.js",
"depends": [ "exampleService" ]
}
]
}
}

View File

@ -1,18 +0,0 @@
{
"name": "Declarative Forms example",
"sources": "src",
"extensions": {
"controllers": [
{
"key": "ExampleFormController",
"implementation": "ExampleFormController.js",
"depends": [ "$scope" ]
}
],
"routes": [
{
"templateUrl": "templates/exampleForm.html"
}
]
}
}

View File

@ -1,90 +0,0 @@
{
"name": "Sine Wave Generator",
"description": "Example of a component that produces dataa.",
"extensions": {
"components": [
{
"implementation": "SinewaveTelemetryProvider.js",
"type": "provider",
"provides": "telemetryService",
"depends": [ "$q", "$timeout" ]
}
],
"capabilities": [
{
"key": "limit",
"implementation": "SinewaveLimitCapability.js"
}
],
"formats": [
{
"key": "example.delta",
"implementation": "SinewaveDeltaFormat.js"
}
],
"constants": [
{
"key": "TIME_CONDUCTOR_DOMAINS",
"value": [
{ "key": "time", "name": "Time" },
{ "key": "yesterday", "name": "Yesterday" },
{ "key": "delta", "name": "Delta", "format": "example.delta" }
],
"priority": -1
}
],
"types": [
{
"key": "generator",
"name": "Sine Wave Generator",
"glyph": "T",
"description": "A sine wave generator",
"features": "creation",
"model": {
"telemetry": {
"period": 10
}
},
"telemetry": {
"source": "generator",
"domains": [
{
"key": "time",
"name": "Time"
},
{
"key": "yesterday",
"name": "Yesterday"
},
{
"key": "delta",
"name": "Delta",
"format": "example.delta"
}
],
"ranges": [
{
"key": "sin",
"name": "Sine"
},
{
"key": "cos",
"name": "Cosine"
}
]
},
"properties": [
{
"name": "Period",
"control": "textfield",
"cssclass": "l-small l-numeric",
"key": "period",
"required": true,
"property": [ "telemetry", "period" ],
"pattern": "^\\d*(\\.\\d*)?$"
}
]
}
]
}
}

View File

@ -1,12 +0,0 @@
{
"extensions": {
"components": [
{
"implementation": "ExampleIdentityService.js",
"provides": "identityService",
"type": "provider",
"depends": [ "dialogService" ]
}
]
}
}

View File

@ -1,42 +0,0 @@
{
"name": "Imagery",
"description": "Example of a component that produces image telemetry.",
"extensions": {
"components": [
{
"implementation": "ImageTelemetryProvider.js",
"type": "provider",
"provides": "telemetryService",
"depends": [ "$q", "$timeout" ]
}
],
"types": [
{
"key": "imagery",
"name": "Example Imagery",
"glyph": "T",
"features": "creation",
"model": {
"telemetry": {}
},
"telemetry": {
"source": "imagery",
"domains": [
{
"name": "Time",
"key": "time",
"format": "timestamp"
}
],
"ranges": [
{
"name": "Image",
"key": "url",
"format": "imageUrl"
}
]
}
}
]
}
}

View File

@ -1,12 +0,0 @@
{
"name": "Mobile",
"description": "Allows elements with pertinence to mobile usage and development",
"extensions": {
"stylesheets": [
{
"stylesheetUrl": "css/mobile-example.css",
"priority": "mandatory"
}
]
}
}

View File

@ -1,47 +0,0 @@
{
"extensions": {
"templates": [
{
"key": "dialogLaunchTemplate",
"templateUrl": "dialog-launch.html"
},
{
"key": "notificationLaunchTemplate",
"templateUrl": "notification-launch.html"
}
],
"controllers": [
{
"key": "DialogLaunchController",
"implementation": "DialogLaunchController.js",
"depends": [
"$scope",
"$timeout",
"$log",
"dialogService",
"notificationService"
]
},
{
"key": "NotificationLaunchController",
"implementation": "NotificationLaunchController.js",
"depends": [
"$scope",
"$timeout",
"$log",
"notificationService"
]
}
],
"indicators": [
{
"implementation": "DialogLaunchIndicator.js",
"priority": "fallback"
},
{
"implementation": "NotificationLaunchIndicator.js",
"priority": "fallback"
}
]
}
}

View File

@ -1,18 +0,0 @@
{
"extensions": {
"components": [
{
"provides": "persistenceService",
"type": "provider",
"implementation": "BrowserPersistenceProvider.js",
"depends": [ "$q", "PERSISTENCE_SPACE" ]
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",
"value": "mct"
}
]
}
}

View File

@ -1,12 +0,0 @@
{
"name": "Example Policy",
"description": "Provides an example of using policies to prohibit actions.",
"extensions": {
"policies": [
{
"implementation": "ExamplePolicy.js",
"category": "action"
}
]
}
}

View File

@ -1,14 +0,0 @@
{
"extensions": {
"indicators": [
{
"implementation": "WatchIndicator.js",
"depends": ["$interval", "$rootScope"]
},
{
"implementation": "DigestIndicator.js",
"depends": ["$interval", "$rootScope"]
}
]
}
}

View File

@ -1,23 +0,0 @@
{
"extensions": {
"roots": [
{
"id": "scratch:root",
"model": {
"type": "folder",
"composition": [],
"name": "Scratchpad"
},
"priority": "preferred"
}
],
"components": [
{
"provides": "persistenceService",
"type": "provider",
"implementation": "ScratchPersistenceProvider.js",
"depends": [ "$q" ]
}
]
}
}

View File

@ -1,29 +0,0 @@
{
"name": "Example taxonomy",
"description": "Example illustrating the addition of a static top-level hierarchy",
"extensions": {
"roots": [
{
"id": "exampleTaxonomy",
"model": {
"type": "folder",
"name": "Stub Subsystems",
"composition": [
"examplePacket0",
"examplePacket1",
"examplePacket2"
]
}
}
],
"components": [
{
"provides": "modelService",
"type": "provider",
"implementation": "ExampleTaxonomyModelProvider.js",
"depends": [ "$q" ]
}
]
}
}

View File

@ -1,16 +0,0 @@
{
"extensions": {
"indicators": [
{
"implementation": "FibonacciIndicator.js",
"depends": [ "workerService", "$rootScope" ]
}
],
"workers": [
{
"key": "example.fibonacci",
"scriptUrl": "FibonacciWorker.js"
}
]
}
}

View File

@ -27,7 +27,7 @@
<title></title>
<script type="text/javascript"
src="platform/framework/lib/require.js"
data-main="platform/framework/src/Main.js">
data-main="main.js">
</script>
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96">

View File

@ -34,6 +34,7 @@ module.exports = function(config) {
// List of files / patterns to load in the browser.
// By default, files are also included in a script tag.
files: [
{pattern: 'src/**/*.js', included: false},
{pattern: 'example/**/*.js', included: false},
{pattern: 'platform/**/*.js', included: false},
{pattern: 'warp/**/*.js', included: false},
@ -47,12 +48,14 @@ module.exports = function(config) {
// Preprocess matching files before serving them to the browser.
// https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {},
preprocessors: {
'**/src/**/!(*Spec).js': [ 'coverage' ]
},
// Test results reporter to use
// Possible values: 'dots', 'progress'
// Available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
reporters: ['progress', 'coverage', 'html'],
// Web server port.
port: 9876,
@ -71,8 +74,20 @@ module.exports = function(config) {
'Chrome'
],
// Code coverage reporting.
coverageReporter: {
dir: "target/coverage"
},
// HTML test reporting.
htmlReporter: {
outputDir: "target/tests",
preserveDescribeNesting: true,
foldAll: false
},
// Continuous Integration mode.
// If true, Karma captures browsers, runs the tests and exits.
singleRun: false
singleRun: true
});
};

81
main.js Normal file
View File

@ -0,0 +1,81 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define, window, requirejs*/
requirejs.config({
"paths": {
"legacyRegistry": "src/legacyRegistry",
"angular": "platform/framework/lib/angular.min",
"moment": 'platform/telemetry/lib/moment.min'
},
"shim": {
"angular": {
"exports": "angular"
}
}
});
define([
'./platform/framework/src/Main',
'legacyRegistry',
'./platform/framework/bundle',
'./platform/core/bundle',
'./platform/representation/bundle',
'./platform/commonUI/about/bundle',
'./platform/commonUI/browse/bundle',
'./platform/commonUI/edit/bundle',
'./platform/commonUI/dialog/bundle',
'./platform/commonUI/formats/bundle',
'./platform/commonUI/general/bundle',
'./platform/commonUI/inspect/bundle',
'./platform/commonUI/mobile/bundle',
'./platform/commonUI/themes/espresso/bundle',
'./platform/commonUI/notification/bundle',
'./platform/containment/bundle',
'./platform/execution/bundle',
'./platform/telemetry/bundle',
'./platform/features/clock/bundle',
'./platform/features/events/bundle',
'./platform/features/imagery/bundle',
'./platform/features/layout/bundle',
'./platform/features/pages/bundle',
'./platform/features/plot/bundle',
'./platform/features/scrolling/bundle',
'./platform/features/timeline/bundle',
'./platform/forms/bundle',
'./platform/identity/bundle',
'./platform/persistence/aggregator/bundle',
'./platform/persistence/local/bundle',
'./platform/persistence/queue/bundle',
'./platform/policy/bundle',
'./platform/entanglement/bundle',
'./platform/search/bundle',
'./platform/status/bundle',
'./example/imagery/bundle',
'./example/eventGenerator/bundle',
'./example/generator/bundle'
], function (Main, legacyRegistry) {
'use strict';
new Main().run(legacyRegistry);
});

View File

@ -1,122 +0,0 @@
{
"name": "About Open MCT Web",
"extensions": {
"templates": [
{
"key": "app-logo",
"priority": "optional",
"templateUrl": "templates/app-logo.html"
},
{
"key": "about-logo",
"priority": "preferred",
"templateUrl": "templates/about-logo.html"
},
{
"key": "about-dialog",
"templateUrl": "templates/about-dialog.html"
},
{
"key": "overlay-about",
"templateUrl": "templates/overlay-about.html"
},
{
"key": "license-apache",
"templateUrl": "templates/license-apache.html"
},
{
"key": "license-mit",
"templateUrl": "templates/license-mit.html"
}
],
"controllers": [
{
"key": "LogoController",
"depends": [ "overlayService" ],
"implementation": "LogoController.js"
},
{
"key": "AboutController",
"depends": [ "versions[]", "$window" ],
"implementation": "AboutController.js"
},
{
"key": "LicenseController",
"depends": [ "licenses[]" ],
"implementation": "LicenseController.js"
}
],
"licenses": [
{
"name": "Json.NET",
"version": "6.0.8",
"author": "Newtonsoft",
"description": "JSON serialization/deserialization",
"website": "http://www.newtonsoft.com/json",
"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",
"description": "Embedded web server",
"website": "http://nancyfx.org/",
"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",
"description": "Embedded web server",
"website": "http://nancyfx.org/",
"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",
"description": "Supports SuperWebSocket",
"website": "https://supersocket.codeplex.com/",
"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",
"description": "WebSocket implementation for client-server communication",
"website": "https://superwebsocket.codeplex.com/",
"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",
"description": "Logging",
"website": "http://logging.apache.org/log4net/",
"copyright": "Copyright © 2004-2015 Apache Software Foundation.",
"license": "license-apache",
"link": "http://logging.apache.org/log4net/license.html"
}
],
"routes": [
{
"when": "/licenses",
"templateUrl": "templates/licenses.html"
},
{
"when": "/licenses-md",
"templateUrl": "templates/licenses-export-md.html"
}
]
}
}

View File

@ -1,189 +0,0 @@
{
"extensions": {
"routes": [
{
"when": "/browse/:ids*",
"templateUrl": "templates/browse.html",
"reloadOnSearch": false
},
{
"when": "",
"templateUrl": "templates/browse.html",
"reloadOnSearch": false
}
],
"controllers": [
{
"key": "BrowseController",
"implementation": "BrowseController.js",
"depends": [
"$scope",
"$route",
"$location",
"$q",
"objectService",
"navigationService",
"urlService"
]
},
{
"key": "PaneController",
"implementation": "PaneController.js",
"priority": "preferred",
"depends": [ "$scope", "agentService","$window" ]
},
{
"key": "BrowseObjectController",
"implementation": "BrowseObjectController.js",
"depends": [ "$scope", "$location", "$route", "$q",
"navigationService" ]
},
{
"key": "CreateMenuController",
"implementation": "creation/CreateMenuController.js",
"depends": [ "$scope" ]
},
{
"key": "LocatorController",
"implementation": "creation/LocatorController.js",
"depends": [ "$scope", "$timeout" ]
},
{
"key": "MenuArrowController",
"implementation": "MenuArrowController.js",
"depends": [ "$scope" ]
}
],
"controls": [
{
"key": "locator",
"templateUrl": "templates/create/locator.html"
}
],
"representations": [
{
"key": "browse-object",
"templateUrl": "templates/browse-object.html",
"gestures": [ "drop" ],
"uses": [ "view" ]
},
{
"key": "create-button",
"templateUrl": "templates/create/create-button.html"
},
{
"key": "create-menu",
"templateUrl": "templates/create/create-menu.html",
"uses": [ "action" ]
},
{
"key": "grid-item",
"templateUrl": "templates/items/grid-item.html",
"uses": [ "type", "action", "location" ],
"gestures": [ "info", "menu" ]
},
{
"key": "object-header",
"templateUrl": "templates/browse/object-header.html",
"uses": [ "type" ]
},
{
"key": "menu-arrow",
"templateUrl": "templates/menu-arrow.html",
"uses": [ "action" ],
"gestures": [ "menu" ]
},
{
"key": "back-arrow",
"uses": [ "context" ],
"templateUrl": "templates/back-arrow.html"
}
],
"services": [
{
"key": "navigationService",
"implementation": "navigation/NavigationService.js"
}
],
"policies": [
{
"implementation": "creation/CreationPolicy.js",
"category": "creation"
}
],
"actions": [
{
"key": "navigate",
"implementation": "navigation/NavigateAction.js",
"depends": [ "navigationService", "$q" ]
},
{
"key": "window",
"name": "Open In New Tab",
"implementation": "windowing/NewTabAction.js",
"description": "Open in a new browser tab",
"category": ["view-control", "contextual"],
"depends": [ "urlService", "$window" ],
"group": "windowing",
"glyph": "y",
"priority": "preferred"
},
{
"key": "fullscreen",
"implementation": "windowing/FullscreenAction.js",
"category": "view-control",
"group": "windowing",
"glyph": "z",
"priority": "default"
}
],
"views": [
{
"key": "items",
"name": "Items",
"glyph": "9",
"description": "Grid of available items",
"templateUrl": "templates/items/items.html",
"uses": [ "composition" ],
"gestures": [ "drop" ],
"type": "folder",
"editable": false
}
],
"components": [
{
"key": "CreateActionProvider",
"provides": "actionService",
"type": "provider",
"implementation": "creation/CreateActionProvider.js",
"depends": ["$q", "typeService",
"navigationService", "policyService"]
},
{
"key": "CreationService",
"provides": "creationService",
"type": "provider",
"implementation": "creation/CreationService.js",
"depends": [ "$q", "$log" ]
}
],
"runs": [
{
"implementation": "windowing/WindowTitler.js",
"depends": [ "navigationService", "$rootScope", "$document" ]
}
],
"licenses": [
{
"name": "screenfull.js",
"version": "1.2.0",
"description": "Wrapper for cross-browser usage of fullscreen API",
"author": "Sindre Sorhus",
"website": "https://github.com/sindresorhus/screenfull.js/",
"copyright": "Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)",
"license": "license-mit",
"link": "https://github.com/sindresorhus/screenfull.js/blob/gh-pages/license"
}
]
}
}

View File

@ -1,48 +0,0 @@
{
"extensions": {
"services": [
{
"key": "dialogService",
"implementation": "DialogService.js",
"depends": [ "overlayService", "$q", "$log" ]
},
{
"key": "overlayService",
"implementation": "OverlayService.js",
"depends": [ "$document", "$compile", "$rootScope" ]
}
],
"templates": [
{
"key": "overlay-dialog",
"templateUrl": "templates/overlay-dialog.html"
},
{
"key": "overlay-options",
"templateUrl": "templates/overlay-options.html"
},
{
"key": "form-dialog",
"templateUrl": "templates/dialog.html"
},
{
"key": "overlay-blocking-message",
"templateUrl": "templates/overlay-blocking-message.html"
},
{
"key": "message",
"templateUrl": "templates/message.html"
},
{
"key": "overlay-message-list",
"templateUrl": "templates/overlay-message-list.html"
}
],
"containers": [
{
"key": "overlay",
"templateUrl": "templates/overlay.html"
}
]
}
}

View File

@ -1,133 +0,0 @@
{
"extensions": {
"routes": [
{
"when": "/edit",
"templateUrl": "templates/edit.html"
}
],
"controllers": [
{
"key": "EditController",
"implementation": "controllers/EditController.js",
"depends": [ "$scope", "$q", "navigationService" ]
},
{
"key": "EditActionController",
"implementation": "controllers/EditActionController.js",
"depends": [ "$scope" ]
},
{
"key": "EditPanesController",
"implementation": "controllers/EditPanesController.js",
"depends": [ "$scope" ]
},
{
"key": "ElementsController",
"implementation": "controllers/ElementsController.js",
"depends": [ "$scope" ]
}
],
"directives": [
{
"key": "mctBeforeUnload",
"implementation": "directives/MCTBeforeUnload.js",
"depends": [ "$window" ]
}
],
"actions": [
{
"key": "compose",
"implementation": "actions/LinkAction.js"
},
{
"key": "edit",
"implementation": "actions/EditAction.js",
"depends": [ "$location", "navigationService", "$log", "$q" ],
"description": "Edit this object.",
"category": "view-control",
"glyph": "p"
},
{
"key": "properties",
"category": ["contextual", "view-control"],
"implementation": "actions/PropertiesAction.js",
"glyph": "p",
"name": "Edit Properties...",
"description": "Edit properties of this object.",
"depends": [ "dialogService" ]
},
{
"key": "remove",
"category": "contextual",
"implementation": "actions/RemoveAction.js",
"glyph": "Z",
"name": "Remove",
"description": "Remove this object from its containing object.",
"depends": [ "$q", "navigationService" ]
},
{
"key": "save",
"category": "conclude-editing",
"implementation": "actions/SaveAction.js",
"name": "Save",
"description": "Save changes made to these objects.",
"depends": [ "$q", "$location", "$injector", "urlService",
"navigationService", "policyService", "dialogService",
"creationService" ],
"priority": "mandatory"
},
{
"key": "cancel",
"category": "conclude-editing",
"implementation": "actions/CancelAction.js",
"name": "Cancel",
"description": "Discard changes made to these objects.",
"depends": ["$injector", "navigationService"]
}
],
"policies": [
{
"category": "action",
"implementation": "policies/EditActionPolicy.js"
}
],
"templates": [
{
"key": "edit-library",
"templateUrl": "templates/library.html"
}
],
"representations": [
{
"key": "edit-object",
"templateUrl": "templates/edit-object.html",
"uses": [ "view" ]
},
{
"key": "edit-action-buttons",
"templateUrl": "templates/edit-action-buttons.html",
"uses": [ "action" ]
},
{
"key": "edit-elements",
"templateUrl": "templates/elements.html",
"uses": [ "composition" ],
"gestures": [ "drop" ]
},
{
"key": "topbar-edit",
"templateUrl": "templates/topbar-edit.html"
}
],
"representers": [
{
"implementation": "representers/EditRepresenter.js",
"depends": [ "$q", "$log" ]
},
{
"implementation": "representers/EditToolbarRepresenter.js"
}
]
}
}

View File

@ -1,26 +0,0 @@
{
"name": "Time services bundle",
"description": "Defines interfaces and provides default implementations for handling different time systems.",
"extensions": {
"components": [
{
"provides": "formatService",
"type": "provider",
"implementation": "FormatProvider.js",
"depends": [ "formats[]" ]
}
],
"formats": [
{
"key": "utc",
"implementation": "UTCTimeFormat.js"
}
],
"constants": [
{
"key": "DEFAULT_TIME_FORMAT",
"value": "utc"
}
]
}
}

View File

@ -1,302 +0,0 @@
{
"name": "General UI elements",
"description": "General UI elements, meant to be reused across modes",
"resources": "res",
"extensions": {
"services": [
{
"key": "urlService",
"implementation": "services/UrlService.js",
"depends": [ "$location" ]
},
{
"key": "popupService",
"implementation": "services/PopupService.js",
"depends": [ "$document", "$window" ]
}
],
"runs": [
{
"implementation": "StyleSheetLoader.js",
"depends": [ "stylesheets[]", "$document", "THEME" ]
},
{
"implementation": "UnsupportedBrowserWarning.js",
"depends": [ "notificationService", "agentService" ]
}
],
"stylesheets": [
{
"stylesheetUrl": "css/normalize.min.css",
"priority": "mandatory"
}
],
"templates": [
{
"key": "bottombar",
"templateUrl": "templates/bottombar.html"
},
{
"key": "action-button",
"templateUrl": "templates/controls/action-button.html"
},
{
"key": "input-filter",
"templateUrl": "templates/controls/input-filter.html"
},
{
"key": "indicator",
"templateUrl": "templates/indicator.html"
},
{
"key": "message-banner",
"templateUrl": "templates/message-banner.html"
},
{
"key": "progress-bar",
"templateUrl": "templates/progress-bar.html"
},
{
"key": "time-controller",
"templateUrl": "templates/controls/time-controller.html"
}
],
"controllers": [
{
"key": "TimeRangeController",
"implementation": "controllers/TimeRangeController.js",
"depends": [ "$scope", "formatService", "DEFAULT_TIME_FORMAT", "now" ]
},
{
"key": "DateTimePickerController",
"implementation": "controllers/DateTimePickerController.js",
"depends": [ "$scope", "now" ]
},
{
"key": "DateTimeFieldController",
"implementation": "controllers/DateTimeFieldController.js",
"depends": [ "$scope", "formatService", "DEFAULT_TIME_FORMAT" ]
},
{
"key": "TreeNodeController",
"implementation": "controllers/TreeNodeController.js",
"depends": [ "$scope", "$timeout", "navigationService" ]
},
{
"key": "ActionGroupController",
"implementation": "controllers/ActionGroupController.js",
"depends": [ "$scope" ]
},
{
"key": "ToggleController",
"implementation": "controllers/ToggleController.js"
},
{
"key": "ContextMenuController",
"implementation": "controllers/ContextMenuController.js",
"depends": [ "$scope" ]
},
{
"key": "ClickAwayController",
"implementation": "controllers/ClickAwayController.js",
"depends": [ "$scope", "$document" ]
},
{
"key": "ViewSwitcherController",
"implementation": "controllers/ViewSwitcherController.js",
"depends": [ "$scope", "$timeout" ]
},
{
"key": "BottomBarController",
"implementation": "controllers/BottomBarController.js",
"depends": [ "indicators[]" ]
},
{
"key": "GetterSetterController",
"implementation": "controllers/GetterSetterController.js",
"depends": [ "$scope" ]
},
{
"key": "SelectorController",
"implementation": "controllers/SelectorController.js",
"depends": [ "objectService", "$scope" ]
},
{
"key": "ObjectInspectorController",
"implementation": "controllers/ObjectInspectorController.js",
"depends": [ "$scope", "objectService" ]
},
{
"key": "BannerController",
"implementation": "controllers/BannerController.js",
"depends": ["$scope", "notificationService", "dialogService"]
}
],
"directives": [
{
"key": "mctContainer",
"implementation": "directives/MCTContainer.js",
"depends": [ "containers[]" ]
},
{
"key": "mctDrag",
"implementation": "directives/MCTDrag.js",
"depends": [ "$document" ]
},
{
"key": "mctClickElsewhere",
"implementation": "directives/MCTClickElsewhere.js",
"depends": [ "$document" ]
},
{
"key": "mctResize",
"implementation": "directives/MCTResize.js",
"depends": [ "$timeout" ]
},
{
"key": "mctPopup",
"implementation": "directives/MCTPopup.js",
"depends": [ "$compile", "popupService" ]
},
{
"key": "mctScrollX",
"implementation": "directives/MCTScroll.js",
"depends": [ "$parse", "MCT_SCROLL_X_PROPERTY", "MCT_SCROLL_X_ATTRIBUTE" ]
},
{
"key": "mctScrollY",
"implementation": "directives/MCTScroll.js",
"depends": [ "$parse", "MCT_SCROLL_Y_PROPERTY", "MCT_SCROLL_Y_ATTRIBUTE" ]
},
{
"key": "mctSplitPane",
"implementation": "directives/MCTSplitPane.js",
"depends": [ "$parse", "$log", "$interval" ]
},
{
"key": "mctSplitter",
"implementation": "directives/MCTSplitter.js"
}
],
"constants": [
{
"key": "MCT_SCROLL_X_PROPERTY",
"value": "scrollLeft"
},
{
"key": "MCT_SCROLL_X_ATTRIBUTE",
"value": "mctScrollX"
},
{
"key": "MCT_SCROLL_Y_PROPERTY",
"value": "scrollTop"
},
{
"key": "MCT_SCROLL_Y_ATTRIBUTE",
"value": "mctScrollY"
},
{
"key": "THEME",
"value": "unspecified",
"priority": "fallback"
}
],
"containers": [
{
"key": "accordion",
"templateUrl": "templates/containers/accordion.html",
"attributes": [ "label" ]
}
],
"representations": [
{
"key": "tree",
"templateUrl": "templates/subtree.html",
"uses": [ "composition" ],
"type": "root",
"priority": "preferred"
},
{
"key": "tree",
"templateUrl": "templates/tree.html"
},
{
"key": "subtree",
"templateUrl": "templates/subtree.html",
"uses": [ "composition" ]
},
{
"key": "tree-node",
"templateUrl": "templates/tree-node.html",
"uses": [ "action" ]
},
{
"key": "label",
"templateUrl": "templates/label.html",
"uses": [ "type", "location" ],
"gestures": [ "drag", "menu", "info" ]
},
{
"key": "node",
"templateUrl": "templates/label.html",
"uses": [ "type" ],
"gestures": [ "drag", "menu" ]
},
{
"key": "action-group",
"templateUrl": "templates/controls/action-group.html",
"uses": [ "action" ]
},
{
"key": "context-menu",
"templateUrl": "templates/menu/context-menu.html",
"uses": [ "action" ]
},
{
"key": "switcher",
"templateUrl": "templates/controls/switcher.html",
"uses": [ "view" ]
},
{
"key": "object-inspector",
"templateUrl": "templates/object-inspector.html"
}
],
"controls": [
{
"key": "selector",
"templateUrl": "templates/controls/selector.html"
},
{
"key": "datetime-picker",
"templateUrl": "templates/controls/datetime-picker.html"
},
{
"key": "datetime-field",
"templateUrl": "templates/controls/datetime-field.html"
}
],
"licenses": [
{
"name": "Modernizr",
"version": "2.6.2",
"description": "Browser/device capability finding",
"author": "Faruk Ateş",
"website": "http://modernizr.com",
"copyright": "Copyright (c) 20092015",
"license": "license-mit",
"link": "http://modernizr.com/license/"
},
{
"name": "Normalize.css",
"version": "1.1.2",
"description": "Browser style normalization",
"author": "Nicolas Gallagher, Jonathan Neal",
"website": "http://necolas.github.io/normalize.css/",
"copyright": "Copyright (c) Nicolas Gallagher and Jonathan Neal",
"license": "license-mit",
"link": "https://github.com/necolas/normalize.css/blob/v1.1.2/LICENSE.md"
}
]
}
}

View File

@ -1,68 +0,0 @@
{
"extensions": {
"templates": [
{
"key": "info-table",
"templateUrl": "info-table.html"
},
{
"key": "info-bubble",
"templateUrl": "info-bubble.html"
}
],
"containers": [
{
"key": "bubble",
"templateUrl": "bubble.html",
"attributes": [ "bubbleTitle", "bubbleLayout" ],
"alias": "bubble"
}
],
"gestures": [
{
"key": "info",
"implementation": "gestures/InfoGesture.js",
"depends": [
"$timeout",
"agentService",
"infoService",
"INFO_HOVER_DELAY"
]
},
{
"key": "infobutton",
"implementation": "gestures/InfoButtonGesture.js",
"depends": [
"$document",
"agentService",
"infoService"
]
}
],
"services": [
{
"key": "infoService",
"implementation": "services/InfoService.js",
"depends": [
"$compile",
"$rootScope",
"popupService",
"agentService"
]
}
],
"constants": [
{
"key": "INFO_HOVER_DELAY",
"value": 2000
}
],
"representations": [
{
"key": "info-button",
"templateUrl": "templates/info-button.html",
"gestures": [ "infobutton" ]
}
]
}
}

View File

@ -1,24 +0,0 @@
{
"extensions": {
"directives": [
{
"key": "mctDevice",
"implementation": "MCTDevice.js",
"depends": [ "agentService" ]
}
],
"services": [
{
"key": "agentService",
"implementation": "AgentService.js",
"depends": [ "$window" ]
}
],
"runs": [
{
"implementation": "DeviceClassifier.js",
"depends": [ "agentService", "$document" ]
}
]
}
}

View File

@ -1,45 +0,0 @@
{
"extensions": {
"constants": [
{
"key": "DEFAULT_AUTO_DISMISS",
"value": 3000
},
{
"key": "FORCE_AUTO_DISMISS",
"value": 1000
},
{
"key": "MINIMIZE_TIMEOUT",
"value": 300
}
],
"templates": [
{
"key":"notificationIndicatorTemplate",
"templateUrl": "notification-indicator.html"
}
],
"controllers": [
{
"key": "NotificationIndicatorController",
"implementation": "NotificationIndicatorController.js",
"depends": ["$scope", "notificationService", "dialogService"]
}
],
"indicators": [
{
"implementation": "NotificationIndicator.js",
"priority": "fallback"
}
],
"services": [
{
"key": "notificationService",
"implementation": "NotificationService.js",
"depends": [ "$timeout", "DEFAULT_AUTO_DISMISS",
"MINIMIZE_TIMEOUT" ]
}
]
}
}

View File

@ -1,18 +0,0 @@
{
"name": "Espresso",
"description": "Espresso theme: dark and rich",
"extensions": {
"stylesheets": [
{
"stylesheetUrl": "css/theme-espresso.css",
"priority": 1000
}
],
"constants": [
{
"key": "THEME",
"value": "espresso"
}
]
}
}

View File

@ -1,18 +0,0 @@
{
"name": "Snow",
"description": "Snow theme: light and cool",
"extensions": {
"stylesheets": [
{
"stylesheetUrl": "css/theme-snow.css",
"priority": 1000
}
],
"constants": [
{
"key": "THEME",
"value": "snow"
}
]
}
}

View File

@ -1,28 +0,0 @@
{
"extensions": {
"policies": [
{
"category": "composition",
"implementation": "CompositionPolicy.js",
"depends": [ "$injector" ],
"message": "Objects of this type cannot contain objects of that type."
},
{
"category": "composition",
"implementation": "CompositionMutabilityPolicy.js",
"message": "Objects of this type cannot be modified."
},
{
"category": "composition",
"implementation": "CompositionModelPolicy.js",
"message": "Objects of this type cannot contain other objects."
},
{
"category": "action",
"implementation": "ComposeActionPolicy.js",
"depends": [ "$injector" ],
"message": "Objects of this type cannot contain objects of that type."
}
]
}
}

View File

@ -1,269 +0,0 @@
{
"name": "Open MCT Web Core",
"description": "Defines core concepts of Open MCT Web.",
"sources": "src",
"configuration": {
"paths": {
"uuid": "uuid"
}
},
"extensions": {
"versions": [
{
"name": "Version",
"value": "${project.version}",
"priority": 999
},
{
"name": "Built",
"value": "${timestamp}",
"description": "The date on which this version of the client was built.",
"priority": 990
},
{
"name": "Revision",
"value": "${buildNumber}",
"description": "A unique revision identifier for the client sources.",
"priority": 995
},
{
"name": "Branch",
"value": "${scmBranch}",
"description": "The date on which this version of the client was built.",
"priority": 994
}
],
"components": [
{
"provides": "objectService",
"type": "provider",
"implementation": "objects/DomainObjectProvider.js",
"depends": [ "modelService", "instantiate" ]
},
{
"provides": "capabilityService",
"type": "provider",
"implementation": "capabilities/CoreCapabilityProvider.js",
"depends": [ "capabilities[]", "$log" ]
},
{
"provides": "modelService",
"type": "provider",
"implementation": "models/StaticModelProvider",
"depends": [ "models[]", "$q", "$log" ]
},
{
"provides": "modelService",
"type": "provider",
"implementation": "models/RootModelProvider.js",
"depends": [ "roots[]", "$q", "$log" ]
},
{
"provides": "modelService",
"type": "aggregator",
"implementation": "models/ModelAggregator.js",
"depends": [ "$q" ]
},
{
"provides": "modelService",
"type": "provider",
"implementation": "models/PersistedModelProvider.js",
"depends": [
"persistenceService",
"$q",
"now",
"PERSISTENCE_SPACE"
]
},
{
"provides": "modelService",
"type": "decorator",
"implementation": "models/CachingModelDecorator.js"
},
{
"provides": "modelService",
"type": "decorator",
"priority": "fallback",
"implementation": "models/MissingModelDecorator.js"
},
{
"provides": "typeService",
"type": "provider",
"implementation": "types/TypeProvider.js",
"depends": [ "types[]" ]
},
{
"provides": "actionService",
"type": "provider",
"implementation": "actions/ActionProvider.js",
"depends": [ "actions[]", "$log" ]
},
{
"provides": "actionService",
"type": "aggregator",
"implementation": "actions/ActionAggregator.js"
},
{
"provides": "actionService",
"type": "decorator",
"implementation": "actions/LoggingActionDecorator.js",
"depends": [ "$log" ]
},
{
"provides": "viewService",
"type": "provider",
"implementation": "views/ViewProvider.js",
"depends": [ "views[]", "$log" ]
},
{
"provides": "identifierService",
"type": "provider",
"implementation": "identifiers/IdentifierProvider.js",
"depends": [ "PERSISTENCE_SPACE" ]
}
],
"types": [
{
"properties": [
{
"control": "textfield",
"name": "Title",
"key": "name",
"property": "name",
"pattern": "\\S+",
"required": true,
"cssclass": "l-med"
}
]
},
{
"key": "root",
"name": "Root",
"glyph": "F"
},
{
"key": "folder",
"name": "Folder",
"glyph": "F",
"features": "creation",
"description": "Useful for storing and organizing domain objects.",
"model": { "composition": [] }
},
{
"key": "unknown",
"name": "Unknown Type",
"glyph": "\u003f"
},
{
"name": "Unknown Type",
"glyph": "\u003f"
}
],
"capabilities": [
{
"key": "composition",
"implementation": "capabilities/CompositionCapability.js",
"depends": [ "$injector", "contextualize" ]
},
{
"key": "relationship",
"implementation": "capabilities/RelationshipCapability.js",
"depends": [ "$injector" ]
},
{
"key": "type",
"implementation": "types/TypeCapability.js",
"depends": [ "typeService" ]
},
{
"key": "action",
"implementation": "actions/ActionCapability.js",
"depends": [ "$q", "actionService" ]
},
{
"key": "view",
"implementation": "views/ViewCapability.js",
"depends": [ "viewService" ]
},
{
"key": "persistence",
"implementation": "capabilities/PersistenceCapability.js",
"depends": [ "persistenceService", "identifierService",
"notificationService", "$q" ]
},
{
"key": "metadata",
"implementation": "capabilities/MetadataCapability.js"
},
{
"key": "mutation",
"implementation": "capabilities/MutationCapability.js",
"depends": [ "topic", "now" ]
},
{
"key": "delegation",
"implementation": "capabilities/DelegationCapability.js",
"depends": [ "$q" ]
},
{
"key": "instantiation",
"implementation": "capabilities/InstantiationCapability.js",
"depends": [ "$injector", "identifierService" ]
}
],
"services": [
{
"key": "now",
"implementation": "services/Now.js"
},
{
"key": "throttle",
"implementation": "services/Throttle.js",
"depends": [ "$timeout" ]
},
{
"key": "topic",
"implementation": "services/Topic.js",
"depends": [ "$log" ]
},
{
"key": "contextualize",
"implementation": "services/Contextualize.js",
"depends": [ "$log" ]
},
{
"key": "instantiate",
"implementation": "services/Instantiate.js",
"depends": [ "capabilityService" ]
}
],
"roots": [
{
"id": "mine",
"model": {
"name": "My Items",
"type": "folder",
"composition": []
}
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",
"value": "mct"
}
],
"licenses": [
{
"name": "Math.uuid.js",
"version": "1.4",
"description": "Unique identifer generation (code adapted.)",
"author": "Robert Kieffer",
"website": "https://github.com/broofa/node-uuid",
"copyright": "Copyright (c) 2010 Robert Kieffer",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
}
]
}
}

View File

@ -22,7 +22,7 @@
/*global define*/
define(
["uuid", "./Identifier"],
["../../lib/uuid", "./Identifier"],
function (uuid, Identifier) {
'use strict';

View File

@ -1,115 +0,0 @@
{
"name": "Entanglement",
"description": "Tools to assist you in entangling the world of WARP.",
"configuration": {},
"extensions": {
"actions": [
{
"key": "move",
"name": "Move",
"description": "Move object to another location.",
"glyph": "f",
"category": "contextual",
"implementation": "actions/MoveAction.js",
"depends": ["policyService", "locationService", "moveService"]
},
{
"key": "copy",
"name": "Duplicate",
"description": "Duplicate object to another location.",
"glyph": "+",
"category": "contextual",
"implementation": "actions/CopyAction.js",
"depends": ["$log", "policyService", "locationService", "copyService",
"dialogService", "notificationService"]
},
{
"key": "link",
"name": "Create Link",
"description": "Create Link to object in another location.",
"glyph": "\u00E8",
"category": "contextual",
"implementation": "actions/LinkAction.js",
"depends": ["policyService", "locationService", "linkService"]
},
{
"key": "follow",
"name": "Go To Original",
"description": "Go to the original, un-linked instance of this object.",
"glyph": "\u00F4",
"category": "contextual",
"implementation": "actions/GoToOriginalAction.js"
},
{
"key": "locate",
"name": "Set Primary Location",
"description": "Set a domain object's primary location.",
"glyph": "",
"category": "contextual",
"implementation": "actions/SetPrimaryLocationAction.js"
}
],
"components": [
{
"type": "decorator",
"provides": "creationService",
"implementation": "services/LocatingCreationDecorator.js"
},
{
"type": "decorator",
"provides": "objectService",
"implementation": "services/LocatingObjectDecorator.js",
"depends": ["contextualize", "$q", "$log"]
}
],
"policies": [
{
"category": "action",
"implementation": "policies/CrossSpacePolicy.js"
}
],
"capabilities": [
{
"key": "location",
"name": "Location Capability",
"description": "Provides a capability for retrieving the location of an object based upon it's context.",
"implementation": "capabilities/LocationCapability",
"depends": [ "$q", "$injector" ]
}
],
"services": [
{
"key": "moveService",
"name": "Move Service",
"description": "Provides a service for moving objects",
"implementation": "services/MoveService.js",
"depends": ["policyService", "linkService", "$q"]
},
{
"key": "linkService",
"name": "Link Service",
"description": "Provides a service for linking objects",
"implementation": "services/LinkService.js",
"depends": ["policyService"]
},
{
"key": "copyService",
"name": "Copy Service",
"description": "Provides a service for copying objects",
"implementation": "services/CopyService.js",
"depends": ["$q", "policyService", "now"]
},
{
"key": "locationService",
"name": "Location Service",
"description": "Provides a service for prompting a user for locations.",
"implementation": "services/LocationService.js",
"depends": ["dialogService"]
}
],
"licenses": [
]
}
}

View File

@ -23,11 +23,8 @@
/*global define */
define(
[
"uuid",
"./CopyTask"
],
function (uuid, CopyTask) {
[ "./CopyTask" ],
function (CopyTask) {
"use strict";
/**

View File

@ -1,11 +0,0 @@
{
"extensions": {
"services": [
{
"key": "workerService",
"implementation": "WorkerService.js",
"depends": [ "$window", "workers[]" ]
}
]
}
}

View File

@ -1,180 +0,0 @@
{
"name": "Clocks/Timers",
"descriptions": "Domain objects for displaying current & relative times.",
"configuration": {
"paths": {
"moment-duration-format": "moment-duration-format"
},
"shim": {
"moment-duration-format": {
"deps": [ "moment" ]
}
}
},
"extensions": {
"constants": [
{
"key": "CLOCK_INDICATOR_FORMAT",
"value": "YYYY/MM/DD HH:mm:ss"
}
],
"indicators": [
{
"implementation": "indicators/ClockIndicator.js",
"depends": [ "tickerService", "CLOCK_INDICATOR_FORMAT" ],
"priority": "preferred"
}
],
"services": [
{
"key": "tickerService",
"implementation": "services/TickerService.js",
"depends": [ "$timeout", "now" ]
}
],
"controllers": [
{
"key": "ClockController",
"implementation": "controllers/ClockController.js",
"depends": [ "$scope", "tickerService" ]
},
{
"key": "TimerController",
"implementation": "controllers/TimerController.js",
"depends": [ "$scope", "$window", "now" ]
},
{
"key": "RefreshingController",
"implementation": "controllers/RefreshingController.js",
"depends": [ "$scope", "tickerService" ]
}
],
"views": [
{
"key": "clock",
"type": "clock",
"editable": false,
"templateUrl": "templates/clock.html"
},
{
"key": "timer",
"type": "timer",
"editable": false,
"templateUrl": "templates/timer.html"
}
],
"actions": [
{
"key": "timer.start",
"implementation": "actions/StartTimerAction.js",
"depends": ["now"],
"category": "contextual",
"name": "Start",
"glyph": "\u00EF",
"priority": "preferred"
},
{
"key": "timer.restart",
"implementation": "actions/RestartTimerAction.js",
"depends": ["now"],
"category": "contextual",
"name": "Restart at 0",
"glyph": "r",
"priority": "preferred"
}
],
"types": [
{
"key": "clock",
"name": "Clock",
"glyph": "C",
"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"
}
]
},
{
"control": "select",
"options": [
{
"value": "clock12",
"name": "12hr"
},
{
"value": "clock24",
"name": "24hr"
}
]
}
]
}
],
"model": {
"clockFormat": [ "YYYY/MM/DD hh:mm:ss", "clock12" ]
}
},
{
"key": "timer",
"name": "Timer",
"glyph": "\u00F5",
"features": [ "creation" ],
"properties": [
{
"key": "timestamp",
"control": "datetime",
"name": "Target"
},
{
"key": "timerFormat",
"control": "select",
"options": [
{
"value": "long",
"name": "DDD hh:mm:ss"
},
{
"value": "short",
"name": "hh:mm:ss"
}
]
}
],
"model": {
"timerFormat": "DDD hh:mm:ss"
}
}
],
"licenses": [
{
"name": "moment-duration-format",
"version": "1.3.0",
"author": "John Madhavan-Reese",
"description": "Duration parsing/formatting",
"website": "https://github.com/jsmreese/moment-duration-format",
"copyright": "Copyright 2014 John Madhavan-Reese",
"license": "license-mit",
"link": "https://github.com/jsmreese/moment-duration-format/blob/master/LICENSE"
}
]
}
}

View File

@ -19,10 +19,18 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
/*global define,requirejs*/
requirejs.config({
shim: {
'platform/features/clock/lib/moment-duration-format': {
deps: [ 'moment' ]
}
}
});
define(
['moment', 'moment-duration-format'],
['moment', '../../lib/moment-duration-format'],
function (moment) {
"use strict";

View File

@ -1,46 +0,0 @@
{
"extensions": {
"representers": [
{
"implementation": "ConductorRepresenter.js",
"depends": [
"throttle",
"conductorService",
"$compile",
"views[]"
]
}
],
"components": [
{
"type": "decorator",
"provides": "telemetryService",
"implementation": "ConductorTelemetryDecorator.js",
"depends": [ "conductorService" ]
}
],
"services": [
{
"key": "conductorService",
"implementation": "ConductorService.js",
"depends": [ "now", "TIME_CONDUCTOR_DOMAINS" ]
}
],
"templates": [
{
"key": "time-conductor",
"templateUrl": "templates/time-conductor.html"
}
],
"constants": [
{
"key": "TIME_CONDUCTOR_DOMAINS",
"value": [
{ "key": "time", "name": "UTC", "format": "utc" }
],
"priority": "fallback",
"comment": "Placeholder; to be replaced by inspection of available domains."
}
]
}
}

View File

@ -1,37 +0,0 @@
{
"name": "Event Messages",
"description": "List of time-ordered event messages",
"extensions": {
"views": [
{
"key": "messages",
"name": "Messages",
"glyph": "5",
"description": "Scrolling list of messages.",
"templateUrl": "templates/messages.html",
"needs": [ "telemetry" ],
"delegation": true
}
],
"controllers": [
{
"key": "EventListController",
"implementation": "EventListController.js",
"depends": [ "$scope", "telemetryFormatter" ]
}
],
"directives": [
{
"key": "mctDataTable",
"implementation": "directives/MCTDataTable.js",
"depends": [ "$window" ]
}
],
"policies": [
{
"category": "view",
"implementation": "policies/MessagesViewPolicy.js"
}
]
}
}

View File

@ -1,36 +0,0 @@
{
"name": "Plot view for telemetry",
"extensions": {
"views": [
{
"name": "Imagery",
"key": "imagery",
"glyph": "\u00E3",
"templateUrl": "templates/imagery.html",
"priority": "preferred",
"needs": [ "telemetry" ],
"editable": false
}
],
"policies": [
{
"category": "view",
"implementation": "policies/ImageryViewPolicy.js"
}
],
"controllers": [
{
"key": "ImageryController",
"implementation": "controllers/ImageryController.js",
"depends": [ "$scope", "telemetryHandler" ]
}
],
"directives": [
{
"key": "mctBackgroundImage",
"implementation": "directives/MCTBackgroundImage.js",
"depends": [ "$document" ]
}
]
}
}

View File

@ -1,267 +0,0 @@
{
"name": "Layout components.",
"description": "Plug in adding Layout capabilities.",
"extensions": {
"views": [
{
"key": "layout",
"name": "Display Layout",
"glyph": "L",
"type": "layout",
"templateUrl": "templates/layout.html",
"editable": true,
"uses": []
},
{
"key": "fixed",
"name": "Fixed Position",
"glyph": "3",
"type": "telemetry.panel",
"templateUrl": "templates/fixed.html",
"uses": [ "composition" ],
"gestures": [ "drop" ],
"toolbar": {
"sections": [
{
"items": [
{
"method": "add",
"glyph": "+",
"control": "menu-button",
"text": "Add",
"options": [
{
"name": "Box",
"glyph": "\u00E0",
"key": "fixed.box"
},
{
"name": "Line",
"glyph": "\u00E2",
"key": "fixed.line"
},
{
"name": "Text",
"glyph": "\u00E4",
"key": "fixed.text"
},
{
"name": "Image",
"glyph": "\u00E3",
"key": "fixed.image"
}
]
}
]
},
{
"items": [
{
"method": "order",
"glyph": "\u00E1",
"control": "menu-button",
"options": [
{
"name": "Move to Top",
"glyph": "^",
"key": "top"
},
{
"name": "Move Up",
"glyph": "^",
"key": "up"
},
{
"name": "Move Down",
"glyph": "v",
"key": "down"
},
{
"name": "Move to Bottom",
"glyph": "v",
"key": "bottom"
}
]
},
{
"property": "fill",
"glyph": "\ue606",
"control": "color"
},
{
"property": "stroke",
"glyph": "\u00E2",
"control": "color"
},
{
"property": "color",
"glyph": "\u00E4",
"mandatory": true,
"control": "color"
},
{
"property": "url",
"glyph": "\u00E3",
"control": "dialog-button",
"title": "Image Properties",
"dialog": {
"control": "textfield",
"name": "Image URL",
"required": true
}
},
{
"property": "text",
"glyph": "G",
"control": "dialog-button",
"title": "Text Properties",
"dialog": {
"control": "textfield",
"name": "Text",
"required": true
}
},
{
"method": "showTitle",
"glyph": "\u00E7",
"control": "button",
"description": "Show telemetry element title."
},
{
"method": "hideTitle",
"glyph": "\u00E5",
"control": "button",
"description": "Hide telemetry element title."
}
]
},
{
"items": [
{
"method": "remove",
"control": "button",
"glyph": "Z"
}
]
}
]
}
}
],
"representations": [
{
"key": "frame",
"templateUrl": "templates/frame.html"
}
],
"controllers": [
{
"key": "LayoutController",
"implementation": "LayoutController.js",
"depends": [ "$scope" ]
},
{
"key": "FixedController",
"implementation": "FixedController.js",
"depends": [
"$scope",
"$q",
"dialogService",
"telemetryHandler",
"telemetryFormatter",
"throttle"
]
}
],
"templates": [
{
"key": "fixed.telemetry",
"templateUrl": "templates/elements/telemetry.html"
},
{
"key": "fixed.box",
"templateUrl": "templates/elements/box.html"
},
{
"key": "fixed.line",
"templateUrl": "templates/elements/line.html"
},
{
"key": "fixed.text",
"templateUrl": "templates/elements/text.html"
},
{
"key": "fixed.image",
"templateUrl": "templates/elements/image.html"
}
],
"policies": [
{
"category": "composition",
"implementation": "LayoutCompositionPolicy.js"
}
],
"types": [
{
"key": "layout",
"name": "Display Layout",
"glyph": "L",
"description": "A layout in which multiple telemetry panels may be displayed.",
"features": "creation",
"model": { "composition": [] },
"properties": [
{
"name": "Layout Grid",
"control": "composite",
"pattern": "^(\\d*[1-9]\\d*)?$",
"items": [
{
"name": "Horizontal grid (px)",
"control": "textfield",
"cssclass": "l-small l-numeric"
},
{
"name": "Vertical grid (px)",
"control": "textfield",
"cssclass": "l-small l-numeric"
}
],
"key": "layoutGrid",
"conversion": "number[]"
}
]
},
{
"key": "telemetry.panel",
"name": "Telemetry Panel",
"glyph": "t",
"description": "A panel for collecting telemetry elements.",
"delegates": [ "telemetry" ],
"features": "creation",
"contains": [ { "has": "telemetry" } ],
"model": { "composition": [] },
"properties": [
{
"name": "Layout Grid",
"control": "composite",
"items": [
{
"name": "Horizontal grid (px)",
"control": "textfield",
"cssclass": "l-small l-numeric"
},
{
"name": "Vertical grid (px)",
"control": "textfield",
"cssclass": "l-small l-numeric"
}
],
"pattern": "^(\\d*[1-9]\\d*)?$",
"property": "layoutGrid",
"conversion": "number[]"
}
]
}
]
}
}

View File

@ -1,38 +0,0 @@
{
"extensions": {
"types": [
{
"key": "example.page",
"name": "Web Page",
"glyph": "\u00EA",
"description": "A component to display a web page or image with a valid URL. Can be added to a Display Layout.",
"features": [ "creation" ],
"properties": [
{
"key": "url",
"name": "URL",
"control": "textfield",
"pattern": "^(ftp|https?)\\:\\/\\/\\w+(\\.\\w+)*(\\:\\d+)?(\\/\\S*)*$",
"required": true
}
]
}
],
"views": [
{
"templateUrl": "iframe.html",
"name": "Page",
"type": "example.page",
"key": "example.page",
"editable": false
}
],
"controllers": [
{
"key": "EmbeddedPageController",
"implementation": "EmbeddedPageController.js",
"depends": ["$sce"]
}
]
}
}

View File

@ -1,50 +0,0 @@
{
"name": "Plot view for telemetry",
"extensions": {
"views": [
{
"name": "Plot",
"key": "plot",
"glyph": "6",
"templateUrl": "templates/plot.html",
"needs": [ "telemetry" ],
"priority": "preferred",
"delegation": true
}
],
"directives": [
{
"key": "mctChart",
"implementation": "MCTChart.js",
"depends": [ "$interval", "$log" ]
}
],
"controllers": [
{
"key": "PlotController",
"implementation": "PlotController.js",
"depends": [
"$scope",
"telemetryFormatter",
"telemetryHandler",
"throttle",
"PLOT_FIXED_DURATION"
]
}
],
"constants": [
{
"key": "PLOT_FIXED_DURATION",
"value": 900000,
"priority": "fallback",
"comment": "Fifteen minutes."
}
],
"policies": [
{
"category": "view",
"implementation": "policies/PlotViewPolicy.js"
}
]
}
}

View File

@ -1,37 +0,0 @@
{
"name": "Event Messages",
"description": "List of time-ordered event messages",
"extensions": {
"views": [
{
"key": "rtmessages",
"name": "RT Messages",
"glyph": "5",
"description": "Scrolling list of real time messages.",
"templateUrl": "templates/rtmessages.html",
"needs": [ "telemetry" ],
"delegation": true
}
],
"controllers": [
{
"key": "RTEventListController",
"implementation": "RTEventListController.js",
"depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ]
}
],
"directives": [
{
"key": "mctRtDataTable",
"implementation": "directives/MCTRTDataTable.js",
"depends": [ "$window" ]
}
],
"policies": [
{
"category": "view",
"implementation": "policies/RTMessagesViewPolicy.js"
}
]
}
}

View File

@ -1,25 +0,0 @@
{
"name": "Scrolling Lists",
"description": "Time-ordered list of latest data.",
"extensions": {
"views": [
{
"key": "scrolling",
"name": "Scrolling",
"glyph": "5",
"description": "Scrolling list of data values.",
"templateUrl": "templates/rtscrolling.html",
"needs": [ "telemetry" ],
"delegation": true
}
],
"controllers": [
{
"key": "RTScrollingListController",
"implementation": "RTScrollingListController.js",
"depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ]
}
]
}
}

View File

@ -1,25 +0,0 @@
{
"name": "Scrolling Lists",
"description": "Time-ordered list of latest data.",
"extensions": {
"views": [
{
"key": "scrolling",
"name": "Scrolling",
"glyph": "5",
"description": "Scrolling list of data values.",
"templateUrl": "templates/scrolling.html",
"needs": [ "telemetry" ],
"delegation": true
}
],
"controllers": [
{
"key": "ScrollingListController",
"implementation": "ScrollingListController.js",
"depends": [ "$scope", "telemetryFormatter" ]
}
]
}
}

View File

@ -1,21 +0,0 @@
{
"extensions": {
"types": [
{
"key": "static.markup",
"name": "Static Markup",
"glyph": "\u0070",
"description": "Static markup sandbox",
"features": [ "creation" ]
}
],
"views": [
{
"templateUrl": "markup.html",
"name": "Static Markup",
"type": "static.markup",
"key": "static.markup"
}
]
}
}

View File

@ -1,386 +0,0 @@
{
"name": "Timelines",
"description": "Resources, templates, CSS, and code for Timelines.",
"resources": "res",
"extensions": {
"constants": [
{
"key": "TIMELINE_MINIMUM_DURATION",
"description": "The minimum duration to display in a timeline view (one hour.)",
"value": 3600000
},
{
"key": "TIMELINE_MAXIMUM_OFFSCREEN",
"description": "Maximum amount, in pixels, of a Gantt bar which may go off screen.",
"value": 1000
},
{
"key": "TIMELINE_ZOOM_CONFIGURATION",
"description": "Describes major tick sizes in milliseconds, and width in pixels.",
"value": {
"levels": [
1000,
2000,
5000,
10000,
20000,
30000,
60000,
120000,
300000,
600000,
1200000,
1800000,
3600000,
7200000,
14400000,
28800000,
43200000,
86400000
],
"width": 200
}
}
],
"types": [
{
"key": "timeline",
"name": "Timeline",
"glyph": "S",
"description": "A container for arranging Timelines and Activities in time.",
"features": [ "creation" ],
"contains": [ "timeline", "activity" ],
"properties": [
{
"name": "Start date/time",
"control": "timeline-datetime",
"required": true,
"property": [ "start" ],
"options": [ "SET" ]
},
{
"name": "Battery capacity (Watt-hours)",
"control": "textfield",
"required": false,
"conversion": "number",
"property": [ "capacity" ],
"pattern": "^-?\\d+(\\.\\d*)?$"
}
],
"model": { "composition": [] }
},
{
"key": "activity",
"name": "Activity",
"glyph": "a",
"features": [ "creation" ],
"contains": [ "activity" ],
"description": "An action that takes place in time. You can define a start time and duration. Activities can be nested within other Activities, or within Timelines.",
"properties": [
{
"name": "Start date/time",
"control": "timeline-datetime",
"required": true,
"property": [ "start" ],
"options": [ "SET" ]
},
{
"name": "Duration",
"control": "duration",
"required": true,
"property": [ "duration" ]
}
],
"model": { "composition": [], "relationships": { "modes": [] } }
},
{
"key": "mode",
"name": "Activity Mode",
"glyph": "A",
"features": [ "creation" ],
"description": "Define resource utilizations over time, then apply to an Activity.",
"model": { "resources": { "comms": 0, "power": 0 } },
"properties": [
{
"name": "Comms (Kbps)",
"control": "textfield",
"conversion": "number",
"pattern": "^-?\\d+(\\.\\d*)?$",
"property": [ "resources", "comms" ]
},
{
"name": "Power (watts)",
"control": "textfield",
"conversion": "number",
"pattern": "^-?\\d+(\\.\\d*)?$",
"property": [ "resources", "power" ]
}
]
}
],
"views": [
{
"key": "values",
"name": "Values",
"glyph": "A",
"templateUrl": "templates/values.html",
"type": "mode",
"uses": [ "cost" ],
"editable": false
},
{
"key": "timeline",
"name": "Timeline",
"glyph": "S",
"type": "timeline",
"description": "A timeline view of Timelines and Activities.",
"templateUrl": "templates/timeline.html",
"editable": true,
"toolbar": {
"sections": [
{
"items": [
{
"method": "add",
"glyph": "+",
"control": "menu-button",
"text": "Add",
"options": [
{
"name": "Timeline",
"glyph": "S",
"key": "timeline"
},
{
"name": "Activity",
"glyph": "a",
"key": "activity"
}
]
}
]
},
{
"items": [
{
"glyph": "\u00E9",
"description": "Graph resource utilization",
"control": "button",
"method": "toggleGraph"
},
{
"glyph": "A",
"control": "dialog-button",
"description": "Apply Activity Modes...",
"title": "Apply Activity Modes",
"dialog": {
"control": "selector",
"name": "Modes",
"type": "mode"
},
"property": "modes"
},
{
"glyph": "\u00E8",
"description": "Edit Activity Link",
"title": "Activity Link",
"control": "dialog-button",
"dialog": {
"control": "textfield",
"name": "Link",
"pattern": "^(ftp|https?)\\:\\/\\/\\w+(\\.\\w+)*(\\:\\d+)?(\\/\\S*)*$"
},
"property": "link"
},
{
"glyph": "\u0047",
"description": "Edit Properties...",
"control": "button",
"method": "properties"
}
]
},
{
"items": [
{
"method": "remove",
"description": "Remove item",
"control": "button",
"glyph": "Z"
}
]
}
]
}
}
],
"stylesheets": [
{
"stylesheetUrl": "css/timeline.css"
},
{
"stylesheetUrl": "css/timeline-espresso.css",
"theme": "espresso"
},
{
"stylesheetUrl": "css/timeline-snow.css",
"theme": "snow"
}
],
"representations": [
{
"key": "gantt",
"templateUrl": "templates/activity-gantt.html",
"uses": [ "timespan", "type" ]
}
],
"templates": [
{
"key": "timeline-tabular-swimlane-cols-tree",
"priority": "mandatory",
"templateUrl": "templates/tabular-swimlane-cols-tree.html"
},
{
"key": "timeline-tabular-swimlane-cols-data",
"priority": "mandatory",
"templateUrl": "templates/tabular-swimlane-cols-data.html"
},
{
"key": "timeline-resource-graphs",
"priority": "mandatory",
"templateUrl": "templates/resource-graphs.html"
},
{
"key": "timeline-resource-graph-labels",
"priority": "mandatory",
"templateUrl": "templates/resource-graph-labels.html"
},
{
"key": "timeline-legend-item",
"priority": "mandatory",
"templateUrl": "templates/legend-item.html"
},
{
"key": "timeline-ticks",
"priority": "mandatory",
"templateUrl": "templates/ticks.html"
}
],
"controls": [
{
"key": "timeline-datetime",
"templateUrl": "templates/controls/datetime.html"
},
{
"key": "duration",
"templateUrl": "templates/controls/datetime.html"
}
],
"controllers": [
{
"key": "TimelineController",
"implementation": "controllers/TimelineController.js",
"depends": [ "$scope", "$q", "objectLoader", "TIMELINE_MINIMUM_DURATION" ]
},
{
"key": "TimelineGraphController",
"implementation": "controllers/TimelineGraphController.js",
"depends": [ "$scope", "resources[]" ]
},
{
"key": "TimelineDateTimeController",
"implementation": "controllers/TimelineDateTimeController.js",
"depends": [ "$scope" ]
},
{
"key": "TimelineZoomController",
"implementation": "controllers/TimelineZoomController.js",
"depends": [ "$scope", "TIMELINE_ZOOM_CONFIGURATION" ]
},
{
"key": "TimelineTickController",
"implementation": "controllers/TimelineTickController.js"
},
{
"key": "TimelineTableController",
"implementation": "controllers/TimelineTableController.js"
},
{
"key": "TimelineGanttController",
"implementation": "controllers/TimelineGanttController.js",
"depends": [ "TIMELINE_MAXIMUM_OFFSCREEN" ]
},
{
"key": "ActivityModeValuesController",
"implementation": "controllers/ActivityModeValuesController.js",
"depends": [ "resources[]" ]
}
],
"capabilities": [
{
"key": "timespan",
"implementation": "capabilities/ActivityTimespanCapability.js",
"depends": [ "$q" ]
},
{
"key": "timespan",
"implementation": "capabilities/TimelineTimespanCapability.js",
"depends": [ "$q" ]
},
{
"key": "utilization",
"implementation": "capabilities/UtilizationCapability.js",
"depends": [ "$q" ]
},
{
"key": "graph",
"implementation": "capabilities/GraphCapability.js",
"depends": [ "$q" ]
},
{
"key": "cost",
"implementation": "capabilities/CostCapability.js"
}
],
"directives": [
{
"key": "mctSwimlaneDrop",
"implementation": "directives/MCTSwimlaneDrop.js",
"depends": [ "dndService" ]
},
{
"key": "mctSwimlaneDrag",
"implementation": "directives/MCTSwimlaneDrag.js",
"depends": [ "dndService" ]
}
],
"services": [
{
"key": "objectLoader",
"implementation": "services/ObjectLoader.js",
"depends": [ "$q" ]
}
],
"resources": [
{
"key": "power",
"name": "Power",
"units": "watts"
},
{
"key": "comms",
"name": "Comms",
"units": "Kbps"
},
{
"key": "battery",
"name": "Battery State-of-Charge",
"units": "%"
}
]
}
}

View File

@ -1,79 +0,0 @@
{
"name": "MCT Forms",
"description": "Form generator; includes directive and some controls.",
"extensions": {
"directives": [
{
"key": "mctForm",
"implementation": "MCTForm.js"
},
{
"key": "mctToolbar",
"implementation": "MCTToolbar.js"
},
{
"key": "mctControl",
"implementation": "MCTControl.js",
"depends": [ "controls[]" ]
}
],
"controls": [
{
"key": "checkbox",
"templateUrl": "templates/controls/checkbox.html"
},
{
"key": "datetime",
"templateUrl": "templates/controls/datetime.html"
},
{
"key": "select",
"templateUrl": "templates/controls/select.html"
},
{
"key": "textfield",
"templateUrl": "templates/controls/textfield.html"
},
{
"key": "button",
"templateUrl": "templates/controls/button.html"
},
{
"key": "color",
"templateUrl": "templates/controls/color.html"
},
{
"key": "composite",
"templateUrl": "templates/controls/composite.html"
},
{
"key": "menu-button",
"templateUrl": "templates/controls/menu-button.html"
},
{
"key": "dialog-button",
"templateUrl": "templates/controls/dialog.html"
}
],
"controllers": [
{
"key": "DateTimeController",
"implementation": "controllers/DateTimeController.js",
"depends": [ "$scope" ]
},
{
"key": "CompositeController",
"implementation": "controllers/CompositeController.js"
},
{
"key": "ColorController",
"implementation": "controllers/ColorController.js"
},
{
"key": "DialogButtonController",
"implementation": "controllers/DialogButtonController.js",
"depends": [ "$scope", "dialogService" ]
}
]
}
}

View File

@ -66,7 +66,7 @@ define(
templateUrl: templatePath,
// Use FormController to populate/respond to changes in scope
controller: FormController,
controller: [ '$scope', FormController ],
// Initial an isolate scope
scope: {

View File

@ -30,6 +30,12 @@ define(
var mockScope,
mctForm;
function installController() {
var controllerProperty = mctForm.controller,
Controller = mctForm.controller[1];
return new Controller(mockScope);
}
beforeEach(function () {
mockScope = jasmine.createSpyObj("$scope", [ "$watch" ]);
mockScope.$parent = {};
@ -44,7 +50,7 @@ define(
// mct-form needs to watch for the form by name
// in order to convey changes in $valid, $dirty, etc
// up to the parent scope.
mctForm.controller(mockScope);
installController();
expect(mockScope.$watch).toHaveBeenCalledWith(
"mctForm",
@ -56,7 +62,7 @@ define(
var someState = { someKey: "some value" };
mockScope.name = "someName";
mctForm.controller(mockScope);
installController();
mockScope.$watch.mostRecentCall.args[1](someState);
@ -65,7 +71,7 @@ define(
it("allows strings to be converted to RegExps", function () {
// This is needed to support ng-pattern in the template
mctForm.controller(mockScope);
installController();
// Should have added getRegExp to the scope,
// to convert strings to regular expressions
@ -78,7 +84,7 @@ define(
regExp;
// Add getRegExp to scope
mctForm.controller(mockScope);
installController();
regExp = mockScope.getRegExp(strRegExp);
// Same object instance each time...
@ -91,7 +97,7 @@ define(
var regExp = /^\d+[a-d]$/;
// Add getRegExp to scope
mctForm.controller(mockScope);
installController();
// Should have added getRegExp to the scope,
// to convert strings to regular expressions
@ -100,7 +106,7 @@ define(
it("passes a non-whitespace regexp when no pattern is defined", function () {
// If no pattern is supplied, ng-pattern should match anything
mctForm.controller(mockScope);
installController();
expect(mockScope.getRegExp()).toEqual(/\S/);
expect(mockScope.getRegExp(undefined)).toEqual(/\S/);
});

View File

@ -1,81 +0,0 @@
{
"name": "Open MCT Web Framework Component",
"description": "Framework layer for Open MCT Web; interprets bundle definitions and serves as an intermediary between Require and Angular",
"libraries": "lib",
"configuration": {
"paths": {
"angular": "angular.min"
},
"shim": {
"angular": {
"exports": "angular"
}
}
},
"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.9",
"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.2.26",
"description": "Client-side web application framework",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2014 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.2.26/LICENSE"
},
{
"name": "Angular-Route",
"version": "1.2.26",
"description": "Client-side view routing",
"author": "Google",
"website": "http://angularjs.org/",
"copyright": "Copyright (c) 2010-2014 Google, Inc. http://angularjs.org",
"license": "license-mit",
"link": "https://github.com/angular/angular.js/blob/v1.2.26/LICENSE"
},
{
"name": "ES6-Promise",
"version": "2.0.0",
"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

@ -0,0 +1,105 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define, window, requirejs*/
define([
'require',
'./Constants',
'./FrameworkInitializer',
'./LogLevel',
'./load/BundleLoader',
'./resolve/ImplementationLoader',
'./resolve/ExtensionResolver',
'./resolve/BundleResolver',
'./resolve/RequireConfigurator',
'./register/CustomRegistrars',
'./register/ExtensionRegistrar',
'./register/ExtensionSorter',
'./bootstrap/ApplicationBootstrapper'
], function (
require,
Constants,
FrameworkInitializer,
LogLevel,
BundleLoader,
ImplementationLoader,
ExtensionResolver,
BundleResolver,
RequireConfigurator,
CustomRegistrars,
ExtensionRegistrar,
ExtensionSorter,
ApplicationBootstrapper
) {
'use strict';
function FrameworkLayer($http, $log) {
this.$http = $http;
this.$log = $log;
}
FrameworkLayer.prototype.initializeApplication = function (
angular,
legacyRegistry,
logLevel
) {
var $http = this.$http,
$log = this.$log,
app = angular.module(Constants.MODULE_NAME, ["ngRoute"]),
loader = new BundleLoader($http, $log, legacyRegistry),
resolver = new BundleResolver(
new ExtensionResolver(
new ImplementationLoader(require),
$log
),
new RequireConfigurator(requirejs),
$log
),
registrar = new ExtensionRegistrar(
app,
new CustomRegistrars(app, $log),
new ExtensionSorter($log),
$log
),
bootstrapper = new ApplicationBootstrapper(
angular,
window.document,
$log
),
initializer = new FrameworkInitializer(
loader,
resolver,
registrar,
bootstrapper
);
// Apply logging levels; this must be done now, before the
// first log statement.
new LogLevel(logLevel).configure(app, $log);
// Initialize the application
$log.info("Initializing application.");
initializer.runApplication(Constants.BUNDLE_LISTING_FILE);
};
return FrameworkLayer;
});

View File

@ -90,12 +90,10 @@ define(
}
decorate($log);
app.config(function ($provide) {
$provide.decorator('$log', function ($delegate) {
decorate($delegate);
return $delegate;
});
});
app.decorator('$log', ['$delegate', function ($delegate) {
decorate($delegate);
return $delegate;
}]);
};
return LogLevel;

View File

@ -22,12 +22,9 @@
/*global define, window, requirejs*/
requirejs.config({
"shim": {
"../lib/angular.min": {
"exports": "angular"
},
"../lib/angular-route.min": {
"deps": [ "../lib/angular.min" ]
shim: {
'platform/framework/lib/angular-route.min': {
deps: [ 'angular' ]
}
}
});
@ -41,97 +38,42 @@ define(
[
'require',
'../lib/es6-promise-2.0.0.min',
'../lib/angular.min',
'../lib/angular-route.min',
'./Constants',
'./FrameworkInitializer',
'./LogLevel',
'./load/BundleLoader',
'./resolve/ImplementationLoader',
'./resolve/ExtensionResolver',
'./resolve/BundleResolver',
'./resolve/RequireConfigurator',
'./register/CustomRegistrars',
'./register/ExtensionRegistrar',
'./register/ExtensionSorter',
'./bootstrap/ApplicationBootstrapper'
'./FrameworkLayer',
'angular',
'../lib/angular-route.min'
],
function (
require,
es6promise,
angular,
angularRoute,
Constants,
FrameworkInitializer,
LogLevel,
BundleLoader,
ImplementationLoader,
ExtensionResolver,
BundleResolver,
RequireConfigurator,
CustomRegistrars,
ExtensionRegistrar,
ExtensionSorter,
ApplicationBootstrapper
FrameworkLayer,
angular
) {
"use strict";
// Get a reference to Angular's injector, so we can get $http and $log
// services, which are useful to the framework layer.
var injector = angular.injector(['ng']);
// Look up log level from query string
function logLevel() {
var match = /[?&]log=([a-z]+)/.exec(window.location.search);
return match ? match[1] : "";
function Main() {
}
// Polyfill Promise, in case browser does not natively provide Promise
window.Promise = window.Promise || es6promise.Promise;
Main.prototype.run = function (legacyRegistry) {
// Get a reference to Angular's injector, so we can get $http and $log
// services, which are useful to the framework layer.
var injector = angular.injector(['ng']);
// Wire up framework layer components necessary to complete framework
// initialization phases.
function initializeApplication($http, $log) {
var app = angular.module(Constants.MODULE_NAME, ["ngRoute"]),
loader = new BundleLoader($http, $log),
resolver = new BundleResolver(
new ExtensionResolver(
new ImplementationLoader(require),
$log
),
new RequireConfigurator(requirejs),
$log
),
registrar = new ExtensionRegistrar(
app,
new CustomRegistrars(app, $log),
new ExtensionSorter($log),
$log
),
bootstrapper = new ApplicationBootstrapper(
angular,
window.document,
$log
),
initializer = new FrameworkInitializer(
loader,
resolver,
registrar,
bootstrapper
);
// Look up log level from query string
function logLevel() {
var match = /[?&]log=([a-z]+)/.exec(window.location.search);
return match ? match[1] : "";
}
// Apply logging levels; this must be done now, before the
// first log statement.
new LogLevel(logLevel()).configure(app, $log);
// Polyfill Promise, in case browser does not natively provide Promise
window.Promise = window.Promise || es6promise.Promise;
// Initialize the application
$log.info("Initializing application.");
initializer.runApplication(Constants.BUNDLE_LISTING_FILE);
}
// Reconfigure base url, since bundle paths will all be relative
// to the root now.
requirejs.config({"baseUrl": ""});
injector.instantiate(['$http', '$log', FrameworkLayer])
.initializeApplication(angular, legacyRegistry, logLevel());
};
// Reconfigure base url, since bundle paths will all be relative
// to the root now.
requirejs.config({ "baseUrl": "" });
injector.invoke(['$http', '$log', initializeApplication]);
return Main;
}
);

View File

@ -59,7 +59,7 @@ define(
$log = this.$log;
$log.info("Bootstrapping application " + (app || {}).name);
angular.element(document).ready(function () {
angular.bootstrap(document, [app.name]);
angular.bootstrap(document, [app.name], { strictDi: true });
});
};

View File

@ -44,10 +44,10 @@ define(
* @param $http Angular's HTTP requester
* @param $log Angular's logging service
*/
function BundleLoader($http, $log) {
function BundleLoader($http, $log, legacyRegistry) {
this.$http = $http;
this.$log = $log;
this.legacyRegistry = legacyRegistry;
}
/**
@ -60,7 +60,8 @@ define(
*/
BundleLoader.prototype.loadBundles = function (bundles) {
var $http = this.$http,
$log = this.$log;
$log = this.$log,
legacyRegistry = this.legacyRegistry;
// Utility function; load contents of JSON file using $http
function getJSON(file) {
@ -97,15 +98,30 @@ define(
// Load an individual bundle, as a Bundle object.
// Returns undefined if the definition could not be loaded.
function loadBundle(bundlePath) {
if (legacyRegistry.contains(bundlePath)) {
return Promise.resolve(new Bundle(
bundlePath,
legacyRegistry.get(bundlePath)
));
}
return loadBundleDefinition(bundlePath).then(function (definition) {
return definition && (new Bundle(bundlePath, definition));
});
}
// Used to filter out redundant bundles
function unique(element, index, array) {
return array.indexOf(element) === index;
}
// Load all named bundles from the array, returned as an array
// of Bundle objects.
function loadBundlesFromArray(bundleArray) {
var bundlePromises = bundleArray.map(loadBundle);
var bundlePromises = legacyRegistry.list()
.concat(bundleArray)
.filter(unique)
.map(loadBundle);
return Promise.all(bundlePromises)
.then(filterBundles);
@ -114,12 +130,25 @@ define(
// Load all bundles named in the referenced file. The file is
// presumed to be a JSON file
function loadBundlesFromFile(listFile) {
return getJSON(listFile).then(loadBundlesFromArray);
function handleError(err) {
$log.info([
"No external bundles loaded;",
"could not load bundle listing in",
listFile,
"due to error",
err.status,
err.statusText
].join(' '));
return loadBundlesFromArray([]);
}
return getJSON(listFile)
.then(loadBundlesFromArray, handleError);
}
return Array.isArray(bundles) ? loadBundlesFromArray(bundles) :
(typeof bundles === 'string') ? loadBundlesFromFile(bundles) :
Promise.reject(new Error(INVALID_ARGUMENT_MESSAGE));
(typeof bundles === 'string') ? loadBundlesFromFile(bundles) :
Promise.reject(new Error(INVALID_ARGUMENT_MESSAGE));
};
return BundleLoader;

View File

@ -133,9 +133,29 @@ define(
* @returns {string} path to implementation, or undefined
*/
Extension.prototype.getImplementationPath = function () {
return this.definition.implementation ?
this.bundle.getSourcePath(this.definition.implementation) :
undefined;
return (this.hasImplementation() && !this.hasImplementationValue()) ?
this.bundle.getSourcePath(this.definition.implementation) :
undefined;
};
/**
* Check if an extension has an actual implementation value
* (and not just a path to an implementation) defined.
* @returns {function} the constructor for this extension instance
*/
Extension.prototype.getImplementationValue = function () {
return typeof this.definition.implementation === 'function' ?
this.definition.implementation :
undefined;
};
/**
* Check if an extension has an actual implementation value
* (and not just a path to an implementation) defined.
* @returns {boolean} true if a value is available
*/
Extension.prototype.hasImplementationValue = function () {
return typeof this.definition.implementation === 'function';
};
/**

View File

@ -61,8 +61,9 @@ define(
$log = this.$log;
function loadImplementation(extension) {
var implPath = extension.getImplementationPath(),
implPromise = loader.load(implPath),
var implPromise = extension.hasImplementationValue() ?
Promise.resolve(extension.getImplementationValue()) :
loader.load(extension.getImplementationPath()),
definition = extension.getDefinition();
// Wrap a constructor function (to avoid modifying the original)
@ -117,13 +118,15 @@ define(
return extension.getDefinition();
}
// Log that loading has begun
$log.info([
"Loading implementation ",
implPath,
" for extension ",
extension.getLogName()
].join(""));
if (!extension.hasImplementationValue()) {
// Log that loading has begun
$log.info([
"Loading implementation ",
extension.getImplementationPath(),
" for extension ",
extension.getLogName()
].join(""));
}
return implPromise.then(attachDefinition, handleError);
}

View File

@ -37,7 +37,6 @@ define(
describe("The logging level handler", function () {
var mockLog,
mockApp,
mockProvide,
mockDelegate,
mockMethods;
@ -61,8 +60,7 @@ define(
beforeEach(function () {
mockMethods = jasmine.createSpyObj("levels", LOG_METHODS);
mockLog = jasmine.createSpyObj('$log', LOG_METHODS);
mockApp = jasmine.createSpyObj('app', ['config']);
mockProvide = jasmine.createSpyObj('$provide', ['decorator']);
mockApp = jasmine.createSpyObj('app', ['config', 'decorator']);
mockDelegate = jasmine.createSpyObj('$delegate', LOG_METHODS);
LOG_METHODS.forEach(function (m) {
@ -70,14 +68,11 @@ define(
mockDelegate[m].andCallFake(mockMethods[m]);
});
mockApp.config.andCallFake(function (callback) {
callback(mockProvide);
});
mockProvide.decorator.andCallFake(function (key, callback) {
// Only $log should be configured in any case
expect(key).toEqual('$log');
callback(mockDelegate);
mockApp.decorator.andCallFake(function (key, decoration) {
// We only expect $log to be decorated
if (key === '$log' && decoration[0] === '$delegate') {
decoration[1](mockDelegate);
}
});
});

View File

@ -34,6 +34,7 @@ define(
mockCallback,
mockHttp,
mockLog,
mockRegistry,
testBundles;
// Used to wait for then-chain resolution;
@ -53,7 +54,13 @@ define(
mockCallback = jasmine.createSpy("callback");
mockHttp = jasmine.createSpyObj("$http", ["get"]);
mockLog = jasmine.createSpyObj("$log", ["error", "warn", "info", "debug"]);
loader = new BundleLoader(mockHttp, mockLog);
mockRegistry = jasmine.createSpyObj(
'legacyRegistry',
[ 'list', 'contains', 'get' ]
);
mockRegistry.list.andReturn([]);
mockRegistry.contains.andReturn(false);
loader = new BundleLoader(mockHttp, mockLog, mockRegistry);
});
it("accepts a JSON file name and loads all bundles", function () {

View File

@ -1,41 +0,0 @@
{
"extensions": {
"components": [
{
"implementation": "IdentityAggregator.js",
"type": "aggregator",
"provides": "identityService",
"depends": [ "$q" ]
},
{
"implementation": "IdentityProvider.js",
"type": "provider",
"provides": "identityService",
"depends": [ "$q" ],
"priority": "fallback"
},
{
"type": "decorator",
"provides": "creationService",
"implementation": "IdentityCreationDecorator.js",
"depends": [ "identityService" ]
}
],
"indicators": [
{
"implementation": "IdentityIndicator.js",
"depends": [ "identityService" ]
}
],
"types": [
{
"properties": [
{
"key": "creator",
"name": "Creator"
}
]
}
]
}
}

View File

@ -1,12 +0,0 @@
{
"extensions": {
"components": [
{
"provides": "persistenceService",
"type": "aggregator",
"depends": [ "$q" ],
"implementation": "PersistenceAggregator.js"
}
]
}
}

View File

@ -1,14 +0,0 @@
{
"name": "Persistence cache",
"description": "Cache to improve availability of persisted objects.",
"extensions": {
"components": [
{
"provides": "persistenceService",
"type": "decorator",
"implementation": "CachingPersistenceDecorator.js",
"depends": [ "PERSISTENCE_SPACE" ]
}
]
}
}

View File

@ -1,39 +0,0 @@
{
"name": "Couch Persistence",
"description": "Adapter to read and write objects using a CouchDB instance.",
"extensions": {
"components": [
{
"provides": "persistenceService",
"type": "provider",
"implementation": "CouchPersistenceProvider.js",
"depends": [ "$http", "$q", "PERSISTENCE_SPACE", "COUCHDB_PATH" ]
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",
"value": "mct"
},
{
"key": "COUCHDB_PATH",
"value": "/couch/openmct"
},
{
"key": "COUCHDB_INDICATOR_INTERVAL",
"value": 15000
}
],
"indicators": [
{
"implementation": "CouchIndicator.js",
"depends": [
"$http",
"$interval",
"COUCHDB_PATH",
"COUCHDB_INDICATOR_INTERVAL"
]
}
]
}
}

View File

@ -1,52 +0,0 @@
{
"name": "ElasticSearch Persistence",
"description": "Adapter to read and write objects using an ElasticSearch instance.",
"extensions": {
"components": [
{
"provides": "persistenceService",
"type": "provider",
"implementation": "ElasticPersistenceProvider.js",
"depends": [ "$http", "$q", "PERSISTENCE_SPACE", "ELASTIC_ROOT", "ELASTIC_PATH" ]
},
{
"provides": "searchService",
"type": "provider",
"implementation": "ElasticSearchProvider.js",
"depends": [ "$http", "ELASTIC_ROOT" ]
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",
"value": "mct"
},
{
"key": "ELASTIC_ROOT",
"value": "http://localhost:9200",
"priority": "fallback"
},
{
"key": "ELASTIC_PATH",
"value": "mct/domain_object",
"priority": "fallback"
},
{
"key": "ELASTIC_INDICATOR_INTERVAL",
"value": 15000,
"priority": "fallback"
}
],
"indicators": [
{
"implementation": "ElasticIndicator.js",
"depends": [
"$http",
"$interval",
"ELASTIC_ROOT",
"ELASTIC_INDICATOR_INTERVAL"
]
}
]
}
}

View File

@ -1,23 +0,0 @@
{
"extensions": {
"components": [
{
"provides": "persistenceService",
"type": "provider",
"implementation": "LocalStoragePersistenceProvider.js",
"depends": [ "$q", "PERSISTENCE_SPACE" ]
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",
"value": "mct"
}
],
"indicators": [
{
"implementation": "LocalStorageIndicator.js"
}
]
}
}

View File

@ -1,42 +0,0 @@
{
"extensions": {
"components": [
{
"type": "decorator",
"provides": "capabilityService",
"implementation": "QueuingPersistenceCapabilityDecorator.js",
"depends": [ "persistenceQueue" ]
}
],
"services": [
{
"key": "persistenceQueue",
"implementation": "PersistenceQueue.js",
"depends": [
"$q",
"$timeout",
"dialogService",
"PERSISTENCE_QUEUE_DELAY"
]
}
],
"constants": [
{
"key": "PERSISTENCE_QUEUE_DELAY",
"value": 5
}
],
"templates": [
{
"key": "persistence-failure-dialog",
"templateUrl": "templates/persistence-failure-dialog.html"
}
],
"controllers": [
{
"key": "PersistenceFailureController",
"implementation": "PersistenceFailureController.js"
}
]
}
}

View File

@ -1,27 +0,0 @@
{
"name": "Policy Service",
"description": "Provides support for extension-driven decisions.",
"sources": "src",
"extensions": {
"components": [
{
"type": "decorator",
"provides": "actionService",
"implementation": "PolicyActionDecorator.js",
"depends": [ "policyService" ]
},
{
"type": "decorator",
"provides": "viewService",
"implementation": "PolicyViewDecorator.js",
"depends": [ "policyService" ]
},
{
"type": "provider",
"provides": "policyService",
"implementation": "PolicyProvider.js",
"depends": [ "policies[]" ]
}
]
}
}

View File

@ -1,89 +0,0 @@
{
"extensions": {
"directives": [
{
"key": "mctInclude",
"implementation": "MCTInclude.js",
"depends": [ "templates[]", "templateLinker" ]
},
{
"key": "mctRepresentation",
"implementation": "MCTRepresentation.js",
"depends": [ "representations[]", "views[]", "representers[]", "$q", "templateLinker", "$log" ]
}
],
"gestures": [
{
"key": "drag",
"implementation": "gestures/DragGesture.js",
"depends": [ "$log", "dndService" ]
},
{
"key": "drop",
"implementation": "gestures/DropGesture.js",
"depends": [ "dndService", "$q", "navigationService",
"objectService", "instantiate", "typeService" ]
},
{
"key": "menu",
"implementation": "gestures/ContextMenuGesture.js",
"depends": ["$timeout", "$parse", "agentService",
"navigationService"]
}
],
"components": [
{
"provides": "gestureService",
"type": "provider",
"implementation": "gestures/GestureProvider.js",
"depends": ["gestures[]"]
}
],
"representers": [
{
"implementation": "gestures/GestureRepresenter.js",
"depends": [ "gestureService" ]
}
],
"services": [
{
"key": "dndService",
"implementation": "services/DndService.js",
"depends": [ "$log" ]
},
{
"key": "templateLinker",
"implementation": "TemplateLinker.js",
"depends": [ "$templateRequest", "$sce", "$compile", "$log" ],
"comment": "For internal use by mct-include and mct-representation."
}
],
"actions": [
{
"key": "menu",
"implementation": "actions/ContextMenuAction.js",
"depends": [
"$compile",
"$document",
"$rootScope",
"popupService",
"agentService"
]
}
],
"runs": [
{
"priority": "mandatory",
"implementation": "TemplatePrefetcher.js",
"depends": [
"templateLinker",
"templates[]",
"views[]",
"representations[]",
"controls[]",
"containers[]"
]
}
]
}
}

View File

@ -1,73 +0,0 @@
{
"name": "Search",
"description": "Allows the user to search through the file tree.",
"extensions": {
"constants": [
{
"key": "GENERIC_SEARCH_ROOTS",
"value": [ "ROOT" ],
"priority": "fallback"
}
],
"controllers": [
{
"key": "SearchController",
"implementation": "controllers/SearchController.js",
"depends": [ "$scope", "searchService" ]
},
{
"key": "SearchMenuController",
"implementation": "controllers/SearchMenuController.js",
"depends": [ "$scope", "types[]" ]
},
{
"key": "ClickAwayController",
"implementation": "controllers/ClickAwayController.js",
"depends": [ "$scope", "$document" ]
}
],
"representations": [
{
"key": "search-item",
"templateUrl": "templates/search-item.html"
}
],
"templates": [
{
"key": "search",
"templateUrl": "templates/search.html"
},
{
"key": "search-menu",
"templateUrl": "templates/search-menu.html"
}
],
"components": [
{
"provides": "searchService",
"type": "provider",
"implementation": "services/GenericSearchProvider.js",
"depends": [
"$q",
"$log",
"modelService",
"workerService",
"topic",
"GENERIC_SEARCH_ROOTS"
]
},
{
"provides": "searchService",
"type": "aggregator",
"implementation": "services/SearchAggregator.js",
"depends": [ "$q", "objectService" ]
}
],
"workers": [
{
"key": "genericSearchWorker",
"scriptUrl": "services/GenericSearchWorker.js"
}
]
}
}

View File

@ -1,23 +0,0 @@
{
"extensions": {
"representers": [
{
"implementation": "StatusRepresenter.js"
}
],
"capabilities": [
{
"key": "status",
"implementation": "StatusCapability.js",
"depends": [ "statusService" ]
}
],
"services": [
{
"key": "statusService",
"implementation": "StatusService.js",
"depends": [ "topic" ]
}
]
}
}

View File

@ -1,67 +0,0 @@
{
"name": "Data bundle",
"description": "Interfaces and infrastructure for real-time and historical data",
"configuration": {
"paths": {
"moment": "moment.min"
},
"shim": {
"moment": {
"exports": "moment"
}
}
},
"extensions": {
"components": [
{
"provides": "telemetryService",
"type": "aggregator",
"implementation": "TelemetryAggregator.js",
"depends": [ "$q" ]
}
],
"controllers": [
{
"key": "TelemetryController",
"implementation": "TelemetryController.js",
"depends": [ "$scope", "$q", "$timeout", "$log" ]
}
],
"capabilities": [
{
"key": "telemetry",
"implementation": "TelemetryCapability.js",
"depends": [ "$injector", "$q", "$log" ]
}
],
"services": [
{
"key": "telemetryFormatter",
"implementation": "TelemetryFormatter.js",
"depends": [ "formatService", "DEFAULT_TIME_FORMAT" ]
},
{
"key": "telemetrySubscriber",
"implementation": "TelemetrySubscriber.js",
"depends": [ "$q", "$timeout" ]
},
{
"key": "telemetryHandler",
"implementation": "TelemetryHandler.js",
"depends": [ "$q", "telemetrySubscriber" ]
}
],
"licenses": [
{
"name": "Moment.js",
"version": "2.7.0",
"author": "Tim Wood, Iskren Chernev, Moment.js contributors",
"description": "Time/date parsing/formatting",
"website": "http://momentjs.com",
"copyright": "Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors",
"license": "license-mit",
"link": "https://raw.githubusercontent.com/moment/moment/develop/LICENSE"
}
]
}
}

67
pom.xml
View File

@ -33,6 +33,7 @@
<directory>.</directory>
<includes>
<include>index.html</include>
<include>main.js</include>
<include>*.json</include>
<include>**/src/**/*</include>
<include>**/res/**/*</include>
@ -80,52 +81,36 @@
</configuration>
</plugin>
<!-- Get PhantomJS plugin -->
<!-- Run specs using npm -->
<plugin>
<groupId>com.github.klieber</groupId>
<artifactId>phantomjs-maven-plugin</artifactId>
<version>0.2.1</version>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>0.0.26</version>
<configuration>
<installDirectory>target</installDirectory>
<nodeVersion>v0.12.2</nodeVersion>
<npmVersion>2.7.6</npmVersion>
</configuration>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install</goal>
<goal>install-node-and-npm</goal>
</goals>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
</execution>
<execution>
<id>javascript tests</id>
<goals>
<goal>karma</goal>
</goals>
</execution>
</executions>
<configuration>
<version>1.9.2</version>
</configuration>
</plugin>
<!-- Run specs -->
<!-- https://github.com/detro/phantomjs-jasminexml-example -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>Jasmine Specs</id>
<phase>test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<workingDirectory>.</workingDirectory>
<arguments>
<argument>platform/framework/test/lib/run_jasmine_test.coffee</argument>
<argument>test.html</argument>
<argument>${project.build.directory}/platform-test-results.html</argument>
</arguments>
</configuration>
</execution>
</executions>
<configuration>
<executable>${phantomjs.binary}</executable>
</configuration>
</plugin>
@ -162,9 +147,11 @@
<sourceJsFolder>${basedir}</sourceJsFolder>
<excludes>
<exclude>**/lib/**</exclude>
<exclude>app.js</exclude>
<exclude>*.js</exclude>
<exclude>node_modules/**/*</exclude>
<exclude>protractor/**/*</exclude>
<exclude>target/**/*</exclude>
<exclude>scripts/**/*</exclude>
</excludes>
</configuration>
<executions>

48
src/BundleRegistry.js Normal file
View File

@ -0,0 +1,48 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define*/
define(function () {
'use strict';
function BundleRegistry() {
this.bundles = {};
}
BundleRegistry.prototype.register = function (path, definition) {
this.bundles[path] = definition;
};
BundleRegistry.prototype.contains = function (path) {
return !!this.bundles[path];
};
BundleRegistry.prototype.get = function (path) {
return this.bundles[path];
};
BundleRegistry.prototype.list = function () {
return Object.keys(this.bundles);
};
return BundleRegistry;
});

75
src/BundleRegistrySpec.js Normal file
View File

@ -0,0 +1,75 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,runs,jasmine*/
define(['./BundleRegistry'], function (BundleRegistry) {
'use strict';
describe("BundleRegistry", function () {
var testPath,
bundleRegistry;
beforeEach(function () {
testPath = 'some/bundle';
bundleRegistry = new BundleRegistry();
});
it("initially lists no bundles", function () {
expect(bundleRegistry.list()).toEqual([]);
});
it("initially contains no bundles", function () {
expect(bundleRegistry.contains(testPath))
.toBe(false);
});
it("initially provides no bundles", function () {
expect(bundleRegistry.get(testPath))
.toBeUndefined();
});
describe("when a bundle has been registered", function () {
var testBundleDef;
beforeEach(function () {
testBundleDef = { someKey: "some value" };
bundleRegistry.register(testPath, testBundleDef);
});
it("lists registered bundles", function () {
expect(bundleRegistry.list()).toEqual([testPath]);
});
it("contains registered bundles", function () {
expect(bundleRegistry.contains(testPath))
.toBe(true);
});
it("provides registered bundles", function () {
expect(bundleRegistry.get(testPath))
.toBe(testBundleDef);
});
});
});
});

27
src/legacyRegistry.js Normal file
View File

@ -0,0 +1,27 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define, window, requirejs*/
define(['src/BundleRegistry'], function (BundleRegistry) {
'use strict';
return new BundleRegistry();
});

35
src/legacyRegistrySpec.js Normal file
View File

@ -0,0 +1,35 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,runs,jasmine*/
define([
'./legacyRegistry',
'./BundleRegistry'
], function (legacyRegistry, BundleRegistry) {
'use strict';
describe("legacyRegistry", function () {
it("is a BundleRegistry", function () {
expect(legacyRegistry instanceof BundleRegistry).toBe(true);
});
});
});

View File

@ -44,15 +44,7 @@ require.config({
paths: {
'es6-promise': 'platform/framework/lib/es6-promise-2.0.0.min',
'moment': 'platform/telemetry/lib/moment.min',
'moment-duration-format': 'platform/features/clock/lib/moment-duration-format',
'uuid': 'platform/core/lib/uuid'
},
shim: {
'moment-duration-format': {
deps: [ 'moment' ]
}
'moment': 'platform/telemetry/lib/moment.min'
},
// dynamically load all test files