Compare commits

...

350 Commits

Author SHA1 Message Date
9553e0c64f Tutorial packages 2017-02-27 19:28:21 -08:00
da40f4c96e [Plot] Add current conductor bounds to telemetry requests via the old API. Replaces telemetry decorator. Fixes #1458 2017-02-27 19:26:51 -08:00
6fa5a31217 Merge pull request #1433 from nasa/open1432
[Build] Installed sound suppression system for Bourbon deprecation messages.
2017-02-27 11:12:27 -08:00
5bc7a701dc Merge pull request #1455 from nasa/api-conductor-config
[Conductor] Allow configuration of conductor defaults
2017-02-24 14:58:50 -08:00
5cd0516048 Enable TC by default and hide
Set up TC so that it is always enabled and defaults to realtime mode.

This allows us to have warp-like functionality without showing
the TC interface, and simplifies a lot of tutorials.  We can still
reconfigure the TC by re-installing the plugin with different settings
2017-02-24 14:56:18 -08:00
48a603ece8 Merge branch 'api-legacy-telemetry-provider-v2' 2017-02-24 14:47:10 -08:00
abfa56464a Merge branch 'plugins-functions' 2017-02-24 14:34:54 -08:00
c1d6e21c3c Added tests. Fixes #1364 2017-02-23 13:50:14 -08:00
3bd556a406 Fixed failing tests 2017-02-23 10:21:33 -08:00
347fb6d882 Fixed style errors 2017-02-23 10:19:10 -08:00
b3cf7a5d93 Added support for new style telemetry providers from old screens. Converted SWG to new style data adapter 2017-02-23 09:58:46 -08:00
c7cffdeb3b Merge pull request #1453 from nasa/restore-search-navigation
[Search] Allow navigation from results
2017-02-22 13:21:03 -08:00
d45ae7908d [Search] Allow navigation from results
Fix search item so that navigation occurs after clicking on
a search result, while still properly preventing navigation
when required.

Related to #1366
2017-02-22 13:08:54 -08:00
b10fb4533e All builtin plugins now standardized as functions 2017-02-22 12:51:49 -08:00
c74fdb816f Merge pull request #1450 from nasa/fix-table-tests
Add hasCapability to mock
2017-02-21 18:14:18 -08:00
40985a56c8 Add hasCapability to mock 2017-02-21 18:01:43 -08:00
5c01f0be24 Merge branch 'open1077' into 1435-integration 2017-02-21 17:22:36 -08:00
f7ff5af60b Merge pull request #1448 from nasa/update-composition-policy
Update composition policy
2017-02-21 17:18:59 -08:00
2088fc52f3 Merge pull request #1446 from nasa/fix-orphan-navigation
Orphan check uses capability not model
2017-02-21 17:08:40 -08:00
db33ab143e Merge pull request #1445 from nasa/api-updates
Api updates
2017-02-21 17:04:45 -08:00
8c77d4006a Pass options to support checks 2017-02-21 17:03:16 -08:00
2fa567b98b [Table] Track by index, save the elements 2017-02-21 16:49:39 -08:00
e61f04663a Merge pull request #1444 from nasa/consistent-css-class
cssclass is now cssClass
2017-02-21 16:36:30 -08:00
4b905fa7d2 Merge pull request #1443 from nasa/remove-old-bundle-loading
Stop loading bundles.json
2017-02-21 16:32:26 -08:00
5e6e7f018a Merge pull request #1442 from nasa/dev-skip-optimize
[Build] Skip optimize in dev environment
2017-02-21 16:26:41 -08:00
53f56b430a Merge pull request #1449 from nasa/identifier-not-key
[API] Use proper key format
2017-02-21 16:24:17 -08:00
50c934820c Merge pull request #1424 from nasa/open1382
[Tables] Do not persist column configuration for non-editable objects
2017-02-21 15:18:56 -08:00
2a10a2cae2 Update specs to match composition policies 2017-02-21 15:14:35 -08:00
65325b90fd Composition policy takes child instance
The composition policy now takes a child instance instead
of the child type, as in all cases we have access to the child
object.

This allows new-style objects to be contained by old-style objects.

Updated all composition policies to use standardized argument names
instead of `context` and `candidate`; this makes it easier to
understand.

Updated AddActionProvider to hardcode the object types supported.
2017-02-21 12:32:49 -08:00
cfecc36ae6 Orphan check uses capability not model
Switch orphan checking to use capability instead of model.

This ensures that new-style composition providers work as intended.
2017-02-21 12:10:17 -08:00
d9f8622459 [Telemetry] Update TelemetryProvider API
Based on feedback from tutorial sprint, update provider API,
formatter API, and legacy adapter code.

Providers can now implement separate checks for providing realtime
and historical data, and providers are not registered with a specific
strategy.  Strategy is instead intended to be an attribute in the
request options.

Removed unused code in the telemetry API and simplify limitEvaluators.
2017-02-21 11:51:32 -08:00
8e13819e1e [API] composition providers receive new-style objects
Ensure that composition providers get new-style objects (with id
included) so that they can properly check for applicability.
2017-02-21 11:21:08 -08:00
aaedf5d576 cssclass is now cssClass
Make property name consistent with standard camelCase naming.
2017-02-21 11:14:46 -08:00
af9ffaf02d Stop loading bundles.json
Stop application from requesting bundles.json at first load.  This was
confusing to some external developers who would see an error in the
log and not know the cause.
2017-02-21 11:11:16 -08:00
970acbd56e [Build] Skip optimize in dev environment
Skip optimize in dev environment to speed up project rebuilds.  Very helpful
when integration testing openmct.js build artifact.
2017-02-21 11:05:20 -08:00
46c7399867 Merge pull request #1410 from joshbaldwin/master
adding MCT name to README
2017-02-21 09:09:51 -08:00
9a6745635d Merge pull request #1431 from dhrubomoy/master
[Documentation] Fixed filename
2017-02-15 10:18:46 -08:00
fa962b42bc [API] Use proper key format 2017-02-13 13:21:55 -08:00
34dc457aff [Tables] Restored telemetry datum field 'name'. Fixed bug with default sort not working 2017-02-10 15:39:39 -08:00
a3311e4c57 [Tables] Tests and style fixes 2017-02-10 14:22:30 -08:00
ef8efbd53d [Tables] Default UTC time system if available and none others defined 2017-02-10 14:22:28 -08:00
6cd99efbb9 [Tables] Added telemetry buffer so that subscription data is not discarded if it's beyond the end bounds 2017-02-10 14:22:28 -08:00
ae2b73a4f5 [Tables] Increase default table size 2017-02-10 14:22:28 -08:00
0c3ff82cfe [Table] Added ticking to combined historical/real-time table
Don't add duplicate telemetry data
2017-02-10 14:22:20 -08:00
50f303bbdc [Tables] limit digests to increase performance 2017-02-10 14:22:20 -08:00
2a4944d6ee [Tables] Refactoring for consolidation of historical and real-time tables
Added batch processing of large historical queries. #1077
2017-02-10 14:21:48 -08:00
3544caf4be [API] Observer path was accessing object key incorrectly 2017-02-10 14:21:47 -08:00
976333d7f7 [Tables] Support for subscriptions from new Telemetry API
Historical and real-time data flowing

Added formatting, and limits. Support telemetry objects themselves and not just composition of telemetry objects

Apply default time range if none supplied (15 minutes)
2017-02-10 14:21:26 -08:00
6d5530ba9c [Tables] Using new composition API to fetch all telemetry objects 2017-02-10 14:12:10 -08:00
77d0134e2e [Build] Added Bourbon deprecation warning suppression system. 2017-02-10 10:03:05 -08:00
d3b4ad41c2 [Documentation] Fixed filename
Fixed file name "Platform.md" to "platform.md". "Platform.md" was giving a 404 error when clicked, in github and in the official site as well.
2017-02-09 20:54:52 -05:00
b28eb049dc Merge pull request #1420 from BogdanAlexandru/tutorial-fix
[Tutorial] Replace glyph mentions with cssclass
2017-02-06 11:57:49 -08:00
3d3baddd23 [Tables] Do not persist column configuration for non-editable objects 2017-02-02 15:44:36 -08:00
e712edba4e [Tutorial] Fix icon set url 2017-01-31 21:35:42 +02:00
35d8024aaa [Tutorial] Better describe cssclass 2017-01-31 21:32:31 +02:00
17564aa489 [Tutorial] Replace glyph mentions with cssclass 2017-01-29 18:16:36 +02:00
3ae0fd7bc9 Merge pull request #1388 from nasa/open1386
[Config] Fixes for example/msl
2017-01-26 11:49:04 -08:00
df7d59bc9c [Config] Fixes for example/msl
Fixes #1386
2017-01-26 11:40:46 -08:00
4f24c46e9b Merge pull request #1406 from nasa/separate-timeline-and-plot
[Reorg] Make timeline-specific chart directive
2017-01-26 11:34:05 -08:00
d262c4428e Merge pull request #1389 from cseale/chrome-testrunner-1387
[Build] Move karma test browser from PhantomJS to Chrome
2017-01-23 10:42:15 -08:00
9f9d28deef adding MCT name to README 2017-01-21 11:27:20 -05:00
ea74385ac8 Merge pull request #1407 from nasa/fix-style-1374
[Style] Fix style bugs introduced in #1374
2017-01-19 09:33:06 -08:00
06cc95efb1 Merge pull request #1381 from ev1stensberg/master
[DOCUMENTATION] Add linting to tutorial section
2017-01-19 09:07:02 -08:00
09ebeeb8e4 Merge pull request #1376 from cseale/mct1298
[Overlay] Remove max-height and max-width from overlay CSS
2017-01-18 21:48:13 -08:00
7e8e861468 Merge pull request #1372 from nasa/api-review-followup-1122
[API] Address review followup items
2017-01-18 21:42:22 -08:00
df2ce72e39 Merge pull request #1369 from nasa/datum-fallback
Use series.getDatum when available
2017-01-18 21:37:31 -08:00
fe8398017c [Style] Fix style bugs introduced in #1374 2017-01-17 16:56:32 -08:00
c2253f5010 Merge pull request #1374 from cseale/mct1197
[Dialogs] Close dialogs by pressing the ESC key
2017-01-17 13:23:23 -08:00
290dd0abf0 Merge pull request #1400 from nasa/plugins-1398
[Plugins] Adapt legacy plugins
2017-01-17 13:22:24 -08:00
49560698f6 [Reorg] Make timeline-specific chart directive
Make a separate chart directive for drawing resource graphs in timelines.  This
is in preparation for a new plot bundle which will make a large number of
changes to the drawing API to support newly requested features.  By separating
code, there will be no impact to the timeline when the new plot features are
added.
2017-01-17 09:59:00 -08:00
1ce1d29c87 Merge branch 'master' into chrome-testrunner-1387 2017-01-14 02:08:13 +00:00
d522d105ad [Plugins] Document plugins 2017-01-13 11:57:00 -08:00
72b753c67f [Plugins] Use correct constant key for CouchDB 2017-01-13 11:46:14 -08:00
16ec65f38c [Plugins] De-camelcase Elasticsearch constructor
...since that's the way elastic does it, when they capitalize any letters.
2017-01-13 11:36:46 -08:00
ed67866f45 [Plugins] Use lodash API correctly 2017-01-13 11:34:05 -08:00
36b5197733 [Plugins] Add missing paren 2017-01-12 15:17:48 -08:00
fa28393c14 [Plugins] Add missing function keyword 2017-01-12 15:12:50 -08:00
077f076c43 [Plugins] Allow CouchDB URL to be specified 2017-01-12 15:10:14 -08:00
c7ae520d7e [Plugins] Only register elasticsearch url when provided 2017-01-12 15:08:45 -08:00
39eb7ba862 [Plugins] Allow ElasticSearch config 2017-01-12 15:07:07 -08:00
116bb2c25f [Plugins] Add persistence plugin constructors 2017-01-12 14:56:47 -08:00
6bf293f96b [Plugins] Install plugins for dev client 2017-01-12 14:51:46 -08:00
eceaa38ed8 [Plugins] Remove Espresso from defaultRegistry 2017-01-12 14:51:18 -08:00
b6aa087536 [Plugins] Expose bundle-enabling plugins
Fixes #1398
2017-01-12 14:50:55 -08:00
d94e8b10d8 Merge pull request #1385 from nasa/example-roots-1384
[Roots] Update examples
2017-01-11 15:07:05 -08:00
590a0fe080 [Build] Move karma test browser from PhantomJS to Chrome
Issue #1387
2017-01-10 18:53:56 +00:00
41d0e953f5 [Build] Specify phantomjs-prebuilt version
Attempting to resolve build failure
https://circleci.com/gh/nasa/openmct/3167
2017-01-09 15:00:32 -08:00
3436455201 [Roots] Update scratchpad bundle 2017-01-09 14:34:41 -08:00
bb63e13770 [Roots] Update taxonomy example
Fixes #1384
2017-01-09 14:32:19 -08:00
62685cb892 [DOCUMENTATION] Add linting to tutorial section
Adds code examples with linting
2017-01-07 13:49:03 +01:00
6fe0ce70eb [Overlay] Remove max-height and max-width from overlay CSS
Issue #1298
2016-12-29 23:27:10 +00:00
bee22311a7 [Dialogs] Close dialogs by pressing the ESC key
Issue #1197
2016-12-29 00:06:47 +00:00
2cde80237f [API] Inject eventEmitter 2016-12-23 16:55:18 -08:00
3b93454c53 [API] Fix EventEmitter import 2016-12-23 16:53:27 -08:00
a5a17b9502 [API] Remove singleton event emitter 2016-12-23 16:51:15 -08:00
381f3d9b69 [API] Document default composition provider
https://github.com/nasa/openmct/issues/1122#issuecomment-252115292

Fixes #1122
2016-12-23 16:40:21 -08:00
94319df69b Merge pull request #1371 from nasa/plugins-1248
[Plugins] Expose plugin functions
2016-12-23 14:20:54 -08:00
1666c42f78 [Plugins] Document plugins 2016-12-23 13:05:34 -08:00
f1870e286d [Plugins] Expose My Items plugin 2016-12-23 13:01:22 -08:00
94194ff675 [Plugins] Expose plugins on openmct project
...to allow a simple Open MCT to be configured for tutorials,
#1248
2016-12-23 12:57:52 -08:00
d37caa7665 Merge pull request #1370 from nasa/open1367
[Edit] Set key on represent
2016-12-23 11:33:54 -08:00
a768b12985 [Edit] Set key on represent
Set key on represent so that commit function can properly persist
configuration per object type.  Add tests to EditRepresenter

Fixes https://github.com/nasa/openmct/issues/1367
2016-12-23 11:22:29 -08:00
6f257593c8 Use series.getDatum when available 2016-12-22 10:02:28 -08:00
c4d47ddc26 Merge pull request #1366 from nasa/fix-navigation-warnings-1360
Fix navigation warnings, tidy editing, navigation, browse logic.
2016-12-21 12:38:54 -08:00
60d1b73160 Update tests and correct style
Update tests to reflect new functionality.

Closes https://github.com/nasa/openmct/issues/1360
2016-12-20 16:49:13 -08:00
96c054415d [Cleanup] Remove unused template in adapter 2016-12-20 16:43:23 -08:00
89be1c810a [Browse] tighter tree view integration
BrowseController uses new MCTTreeView parameters to prevent navigation
events before triggering digests.  It also no longer sets navigation
more frequently than it should.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
6328bd9354 [Edit] Cancel action depends on promise resolution
Cancel action no longer cares about return value, simply
will not execute if navigtion promise does not resolve.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
fcda211800 [Edit] manage editing in EditObjectController
EditObjectController now exits edit mode when it is destroyed.
It also injects a check function in the navigation service to
replace the old functionality implemented in EditNavigationPolicy.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
daa71c4f69 [Navigation] remove mct-before-unload
Remove mct-before-unload, and move the functionality to the navigation
service.  The navigation service considers "unload" to be a navigation
event and prompts in much the same way as it would before any other
navigation event.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
f2d61604f7 [Navigation] navigationService provides checking
Remove policy checking in navigation action and depend on navigation
service to provide those checks.

* Register checkFunctions with navigationService.checkBeforeNavigation
  which returns a function for unregistering them.
* navigationService.setNavigation will run checks before allowing
  navigation, unless a `force` argument is supplied.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
f0b9292458 [Tree] Add additional api methods
Add methods to tree view via scope for more fine grained control.

Can supply a "allowSelection" function which should return true
if a given selection is allowed.  This is executed before a node
is selected and allows you to prevent selection.  Before this, if
you wanted to prevent the selection from changing, you had to wait
for it to change and then change it back to the original value.

Can also supply an "onSelection" function which is called when a
value is successfully selected.  This allows you to handle the
selection event without waiting for digest.  You can still $watch
"selectedObject" if you prefer.

Additionally, this changes the tree node to trigger a digest only
when the value is set via a MouseClick, instead of every time.

Tidies up directive scope bindings to clarify usage.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
0b79ec1235 [Browse] Simplify Edit Representation
Simplify edit registration and remove extra abstractions.  No longer
attach a status listener for every representation-- just use a single watch
for the edit controller.  Simplifies logic involved in switching controllers.

https://github.com/nasa/openmct/issues/1360
2016-12-20 16:43:23 -08:00
b9601ff819 Merge pull request #1363 from BogdanAlexandru/testfix1361
[Test Fix] Mock cloned object in SaveAsActionSpec
2016-12-20 15:27:30 -08:00
6f417fc4c7 Merge pull request #1362 from nasa/open1348
[Telemetry] Added legacy provider to expose old style telemetry providers to users of the new telemetry API
2016-12-20 09:12:00 -08:00
d99b4d35ab [Failing Test] Mock cloned object in SaveAs spec 2016-12-20 12:41:58 +02:00
6936ab6100 [Telemetry] Added 'name' as a telemetry datum attribute. Fixes #1099 2016-12-19 16:14:05 -08:00
532f7a76f9 [Edit] Add notifications to Save & SaveAs (#1258)
* [Edit] Added notifications to SaveAsAction

* [Edit] Added notifications to SaveAction

* [Edit] Update SaveAsActionSpec

* [Edit] No error notif when user cancels SaveAs
2016-12-19 10:59:26 -08:00
09e79d38ff Added support for limits 2016-12-15 15:30:22 -08:00
1c40fa88ce Removed redundant methods from LegacyTelemetryProvider
Removed redundant methods from LegacyTelemetryProvider
2016-12-15 15:30:22 -08:00
a4ff5ffb43 Fix method name 2016-12-15 15:30:22 -08:00
799c418124 [Telemetry] include type telemetry metadata
Read telemetry metadata from type and include in telemetry.

Allows telemetry service to work with SWG.
2016-12-15 15:30:22 -08:00
215e9b26a8 [Telemetry] Add metadata and formatter support
Add TelemetryMetadataManager which assists developers in interrogating
telemetry metadata to find values that are useful for them.

Add TelemetryValueFormatter to simplify the parsing (retrieval of numerical
values) and formatting (retrieval of displayable string value) of datums.

https://github.com/nasa/openmct/issues/1310
2016-12-15 15:30:22 -08:00
43132ea6f8 [Telemetry] Added LegacyTelemetryProvider to make existing telemetry providers available to the new Telemetry API 2016-12-15 15:30:22 -08:00
90a7ca8ae5 [Generator] Support more config, data rates (#1353)
* [Generator] Support more config, data rates

Update sinewave generator to use webworker, have more
configuration options.  Now supports higher data rates.

Also wrote telemetry provider for new API, and updated
legacy provider as well while we flesh out the telemetry API.

Fixes https://github.com/nasa/openmct/issues/1337

* Proper Step Timing, proper value passthrough

* Remove unused value, remove non-functional plugin

Remove an unnecessary datum value, `time`, and remove the new style
plugin -- which does not actually work -- to prevent confusion.

Addresses
https://github.com/nasa/openmct/pull/1353#pullrequestreview-12571665
2016-12-14 15:02:53 -08:00
f077f4fc1b Merge pull request #1359 from nasa/open1358
[Images] Filters not working in older Chrome installs. Fixes #1358.
2016-12-14 14:15:26 -08:00
0cd849fe42 [Images] Filters not working in older Chrome installs. Fixes #1358. 2016-12-14 14:08:50 -08:00
06a24e3a7d Merge pull request #1354 from nasa/icon-assignment
Fix icon assignments
2016-12-14 13:38:57 -08:00
abd9fdec38 Merge pull request #1357 from nasa/umd-1356
[Build] Change global namespace name
2016-12-14 13:34:05 -08:00
bfdbb4dacb [Build] Change global namespace name
...to match name of module. Fixes #1356
2016-12-14 10:04:00 -08:00
b5b68e7439 Fix icon assignments
Icons had been accidentally swapped around, updated the
assignements and regenererated file.
2016-12-12 13:00:04 -08:00
a920220122 Merge pull request #1352 from nasa/open1351
[Navigation] Fix errors appearing in console on application load
2016-12-09 11:42:47 -08:00
83ed4f6b0d [Navigation] Fix errors appearing in console on initial navigation. Fixes #1351 2016-12-09 09:59:27 -08:00
6a32c53d05 Merge pull request #1350 from nasa/open1349
[Time Conductor] Fixed issue with zoom slider appearing for time systems that do not support it.
2016-12-09 09:44:29 -08:00
0785129b7f [Time Conductor] Fixed issue with zoom slider appearing for time systems that do not support it. Fixes #1349 2016-12-08 15:14:40 -08:00
45de84c183 [Time Conductor] Prevent route change when time conductor values change (#1342)
* [Time Conductor] Prevent route change on setting search parameters. fixes #1341

* [Inspector] Fixed incorrect listener deregistration which was causing errors on scope destruction

* Bare route is redirect to browse

* [Browse] handle routing without breaking $route

Manage route transitions such that route changes are properly
prevented and navigation events occur while still updating the url.

Resolves a number of issues where path and search updates had
to be supported in a very hacky manner.

https://github.com/nasa/openmct/pull/1342

* [URL] Set search without hacks

Changes in previous commit allow the search parameters to be modified
without accidentally triggering a page reload.

https://github.com/nasa/openmct/pull/1342

* [Views] Update on location changes

If the user has a bookmark or tries to change the current view of an
object by specifying view=someView as a search parameter, the change would
not previously take effect.  This resolves that bug.

https://github.com/nasa/openmct/pull/1342

* [TC] Set query params to undefined

Instead of setting params to null, which would eventually result in those
parameters equaling undefined, set them to undefined to skip the extra
step.

https://github.com/nasa/openmct/pull/1342

* [Instantiate] Instantiate objects with context

Add context to instantiate objects so that they can be navigated
to for editing.

https://github.com/nasa/openmct/pull/1342

* [Tests] Update specs

Update specs to match new expectations.

* [Style] Fix style

* [TC] Remove unused dependency

Remove $route dependency from time conductor controller as it was
not being used.  Resolves review comments.

https://github.com/nasa/openmct/pull/1342#pullrequestreview-11449260
2016-12-07 13:33:53 -08:00
b2da0cb12f Merge pull request #1335 from nasa/open1234
[Time Conductor] Remove previous time conductor. Fixes #1234
2016-12-07 13:10:45 -08:00
e121c0f8ac [Time Conductor] Remove previous time conductor. Fixes #1234 2016-12-07 12:36:52 -08:00
bf006b45e4 Merge pull request #1347 from nasa/open1278
[Edit Mode] Fix issue with navigation not triggering unsaved changes warning
2016-12-06 13:50:53 -08:00
a3f5873501 [Edit Mode] Fix issue with navigation not triggering unsaved changes message for new objects. Removed logic that prevented mutation of new objects from triggering a transactional persist call. Fixes #1278 2016-12-05 15:52:14 -08:00
86b337ec88 Revert "[Edit Mode] Fix issue with navigation not triggering unsaved changes message for new objects. Removed logic that prevented mutation of new objects from triggering a transactional persist call. Fixes #1278"
This reverts commit 7dda85cc5f.
2016-12-05 15:49:50 -08:00
7dda85cc5f [Edit Mode] Fix issue with navigation not triggering unsaved changes message for new objects. Removed logic that prevented mutation of new objects from triggering a transactional persist call. Fixes #1278 2016-12-05 15:46:56 -08:00
68d6920d38 Merge pull request #1305 from Brantron/notification-bell
Make notification icon clickable
2016-12-02 14:22:52 -08:00
f540fd08fa Merge pull request #1338 from nasa/my-items-as-model
[MyItems] Load via static model provider
2016-12-01 15:41:08 -08:00
aaf4877daa Merge pull request #1339 from nasa/open1336
[Documentation] Fixed non-functioning telemetry tutorial, updated glyphs.
2016-12-01 15:15:25 -08:00
828e5629c5 [Tutorials] Updated tutorials fixing errors preventing the Todo and Bar Graph tutorials from working. Have disabled the telemetry example for now as fixing it is more involved
[Documentation] Fixed failing telemetry tutorial

[Documentation] Fixed glyphs, fixed other minor issues

Fixes #1336. Fixes #1309. Fixes #1163
2016-12-01 15:03:24 -08:00
44ceb4e865 [Style] remove trailing comma
per https://github.com/nasa/openmct/pull/1338#discussion_r90542441
2016-12-01 14:18:55 -08:00
88f954b437 [MyItems] Load via static model provider
Define a model for my items to be used when the model
is not found in a storage provider.

Fixes https://github.com/nasa/openmct/issues/1284
2016-12-01 13:18:22 -08:00
f85595665f Merge pull request #1325 from nasa/open1231
[Time Conductor] Persist Time Conductor state in URL
2016-11-30 13:17:33 -08:00
73b3ae7264 [Composition] Composition api improvements (#1332). Fixes #1322 and Fixes #1253
* [Composition] provide ids, sync via mutation

Composition provides ids, and we sync things via mutation.  This
simplifies the composition provider interface some, and also
fixes some issues with the previous default composition provider
related to #1322
fixes #1253

* [Style] Fix style, update jsdoc

Fix style, update jsdoc, clean up composition api changes for

Fixes #1322

* [Style] Tidy and JSDoc

* [Composition] Utilize new composition API

Ensures that composition provided by new API works in old API.

Some functionality is not present in both places, but for the
time being this is sufficient.

https://github.com/nasa/openmct/pull/1332

* [Utils] add tests, fix bugs

Add tests to objectUtils to ensure correctness.  This caught a bug
where character escapes were not properly applied or removed.  As
a result, any missing object that contained a colon in it's key
would cause an infinite loop and cause the application to crash.

Bug discovered in VISTA integration.

* [Style] Fix style

* [Roots] Depend on new api for ROOT

Depend on new API for ROOT model, ensuring consistency when
fetching ROOT model.

* [Style] Remove commented code
2016-11-30 12:00:01 -08:00
eaae401d16 Added mode, timeSystem, and deltas
Fixing tests

Fixed broken tests

Added tests

Fixed style errors
2016-11-25 15:16:53 -08:00
efed5f68af [Time Conductor] Added support for loading and persisting time conductor bounds in URL. Fixes #1231 2016-11-25 15:16:31 -08:00
79b4f9a0f4 Squash-merge open1193 into master.
Closes https://github.com/nasa/openmct/pull/1287.

Squashed commit of the following:

commit af9ba3095859684cb2465f1d5222a14db231fdb7
Merge: c98286d 31308b1
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Nov 25 14:57:32 2016 -0800

    Merge branch 'open1193' into open1287-integration

    Resolve conflicts in glyph files as documented in pull request:
    https://github.com/nasa/openmct/pull/1287#issuecomment-263030180

    Closes https://github.com/nasa/openmct/pull/1287

commit 31308b1076
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Tue Nov 22 17:08:10 2016 +0000

    [Time Conductor] Addressed code review comments. Fixes #1287

commit db6386e21c
Author: Henry <akhenry@gmail.com>
Date:   Wed Nov 9 11:52:39 2016 -0800

    Removed redundant ConductorService

commit a9ec8db8c6
Merge: fc36674 dfa4591
Author: Henry <akhenry@gmail.com>
Date:   Wed Nov 9 08:23:07 2016 -0800

    Merge branch 'master' into open1193

commit fc36674b5c
Author: Henry <akhenry@gmail.com>
Date:   Wed Nov 9 08:23:01 2016 -0800

    Updated wording of docs

commit d0906baccf
Author: Henry <akhenry@gmail.com>
Date:   Fri Nov 4 10:48:05 2016 -0700

    Fixed TOI not showing

commit 099c56c407
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 28 16:46:06 2016 -0700

    Fixed failing tests

commit 7cc008ed01
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 28 10:28:41 2016 -0700

    Added tests for tables, TOI controller

commit b0901e83cb
Author: Henry <akhenry@gmail.com>
Date:   Thu Oct 27 10:42:31 2016 -0700

    Added tests for ConductorAxisController and TimeConductor

commit dfed0a0783
Author: Henry <akhenry@gmail.com>
Date:   Wed Oct 26 18:07:50 2016 -0700

    Added ConductorAxisController tests

commit c3322e3847
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 25 20:54:24 2016 -0700

    Added tests for MctTableController

commit 8e76ebb5a8
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 25 15:48:15 2016 -0700

    Removed debugging code

commit 93735bc404
Author: Henry <akhenry@gmail.com>
Date:   Mon Oct 24 15:13:45 2016 -0700

    Removed bundle definition of MctAxisController
    Documenting code

commit a942541724
Author: Henry <akhenry@gmail.com>
Date:   Sun Oct 23 19:54:01 2016 -0700

    [Time Conductor] Fixed memory leak due to listeners not being deregistered

commit 49e600dcc9
Author: Henry <akhenry@gmail.com>
Date:   Sat Oct 22 16:47:11 2016 -0700

    [Time Conductor] Fixed zoom slider behavior

commit f5806613b9
Author: Henry <akhenry@gmail.com>
Date:   Sat Oct 22 14:46:14 2016 -0700

    [Time Conductor] support TOI from real-time tables

commit 029d2b3058
Author: Henry <akhenry@gmail.com>
Date:   Thu Oct 20 14:32:34 2016 -0700

    [Examples] Simplified MSL example, fixed object tree not loading by default, renamed. Fixes #1256. Fixes #1255

commit 482eb4a5e8
Author: Henry <akhenry@gmail.com>
Date:   Sat Oct 22 13:09:05 2016 -0700

    [Time Conductor] Using new API

commit 843c678b0b
Merge: b56ab0a 08ca765
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 21 10:21:22 2016 -0700

    In process of merging

commit b56ab0aac2
Author: Henry <akhenry@gmail.com>
Date:   Wed Oct 19 16:30:26 2016 -0700

    [Time Conductor] Implement default sort, fix unpredictable positioning using % left, set TOI on conductor init. #1193

commit d12ae77d95
Author: Henry <akhenry@gmail.com>
Date:   Wed Oct 19 11:29:42 2016 -0700

    Further TOI improvements

commit 22564473b5
Merge: 9f3ec3b 86b51f6
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 18 16:32:12 2016 -0700

    Merge branch 'open1193' of https://github.com/nasa/openmctweb into open1193

commit 9f3ec3b18f
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 18 16:31:59 2016 -0700

    Fixed issue with scrolling to row after bounds change

commit 86b51f6cde
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Oct 17 17:19:50 2016 -0700

    [Frontend] Small refactor for mct-include

    Fixes #933
    Fixes #1193
    Markup and CSS tweaked to support using mct-include
    as the main container for the TOI element; TC, plots
    and tables all updated.

commit dadca62955
Author: Henry <akhenry@gmail.com>
Date:   Mon Oct 17 15:54:34 2016 -0700

    Positioning of TOI in tables and plots

commit 7a09bc1339
Author: Henry <akhenry@gmail.com>
Date:   Mon Oct 17 10:11:59 2016 -0700

    Migrated TOI functionality to common controller

commit 6bea6b3bc2
Merge: 660757f 8f67cbd
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 14 14:38:57 2016 -0700

    Merge branch 'open1193' of https://github.com/nasa/openmctweb into open1193

commit 660757fc1c
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 14 14:38:46 2016 -0700

    Added TimeOfInterestController

commit 8f67cbd717
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Oct 14 11:33:35 2016 -0700

    [Frontend] Fixed cursor: grab on Time Conductor

    Fixes #933
    Fixes #1193
    Moved cursor: grab into mixin; sass cleanups

commit 07a4e26317
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Oct 14 11:03:23 2016 -0700

    [Frontend] TOI finalizing

    Fixes #933
    Fixes #1193
    HTML template cleaned up; checked in snow theme,
    theme colors tweaked; padding finalized; now uses
    val-to-left instead of -to-right;

commit 271c788f20
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Oct 14 10:22:26 2016 -0700

    [Frontend] TOI in tables

    Fixes #933
    Fixes #1193
    WIP

commit b7e8a1b378
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Oct 13 15:55:48 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: Table TOI element in progress

commit 6042e4ad58
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Oct 13 13:46:27 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: plots and TC done, moving on to
    tables; moved sass into conductor-v2;
    moved constants;

commit 1a534301c5
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Oct 13 11:42:10 2016 -0700

    [Frontend] Refactor TOI element

    Fixes #933
    Fixes #1193
    WIP; TOI as mct-include; layout uses
    flex-box; preparing to move TOI sass
    into conductor-v2 directory;

commit 42acf9255e
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Oct 12 18:34:51 2016 -0700

    [Frontend] Adding resync and dedicated unpin buttons

    Fixes #933
    Fixes #1193
    VERY WIP!

commit 3f0eb0b7cb
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Oct 12 18:33:53 2016 -0700

    [Frontend] New glyphs for use by TOI

    Fixes #933
    Fixes #1193
    Symbols font updated

commit 086307ba3a
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 11 17:16:51 2016 -0700

    Fixed scrolling behavior with TOI

commit 938bf3c4df
Merge: 3910437 8b2047c
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 11 13:26:20 2016 -0700

    Merge branch 'open1182' into open1193

commit 8b2047ca32
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 11 13:25:24 2016 -0700

    Fixed issue with setting deltas

commit 3910437033
Merge: 70c4ce2 02c543f
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 11 12:48:37 2016 -0700

    Merged changes to zoom

commit 02c543fddc
Author: Henry <akhenry@gmail.com>
Date:   Tue Oct 11 12:45:18 2016 -0700

    Fixed zoom in real-time mode

commit 70c4ce24e4
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 7 17:57:14 2016 -0700

    Added support for clicking row to set TOI

commit b995a8b87b
Merge: 51a9557 b384e84
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 7 16:11:59 2016 -0700

    Merged from open1182

commit b384e84872
Merge: 5babf72 07140b1
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 7 15:02:41 2016 -0700

    Merge branch 'open933' into open1182

commit 07140b179f
Merge: 3e9c0eb cbd001e
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 7 14:54:18 2016 -0700

    Merge branch 'master' into open933

commit 51a95575f7
Author: Henry <akhenry@gmail.com>
Date:   Fri Oct 7 14:51:59 2016 -0700

    [Time Conductor] Refactored time of interest as optional generic behavior of MctTable

commit dfbbc3b0c5
Merge: 430645b 47a0aba
Author: Henry <akhenry@gmail.com>
Date:   Thu Oct 6 10:23:42 2016 -0700

    alt-click to select TOI from table

commit 3e9c0eb7a5
Merge: f1d2072 8a00181
Author: Henry <akhenry@gmail.com>
Date:   Wed Oct 5 12:25:04 2016 -0700

    Merged from master to resolve build issues

commit f1d2072bb9
Author: Henry <akhenry@gmail.com>
Date:   Wed Oct 5 11:17:22 2016 -0700

    Added license information

commit 430645b1f2
Author: Henry <akhenry@gmail.com>
Date:   Wed Oct 5 09:04:13 2016 -0700

    TOI working in time conductor

commit 47a0aba601
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Tue Oct 4 18:12:01 2016 -0700

    [Frontend] TOI sass and markup sanding

    Fixes #933
    Fixes #1193
    Color tweaks; Cleanups, commented
     code removal, etc.; tightened up
     tabular padding and font sizes;

commit 0ed0a48a8c
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Tue Oct 4 15:49:18 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    Tabular styling for TOI;

commit 1650aae518
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Oct 3 15:56:56 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: Tabular styling for TOI;
    TODO: make bottom border work

commit d3bf6c5857
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Oct 3 15:15:56 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: Markup and CSS for plots and TC near complete;
    TODO: revised styling in tabular views;

commit 5cd0c8a4fa
Author: Henry <akhenry@gmail.com>
Date:   Fri Sep 30 12:41:14 2016 -0700

    [Time Conductor] merged from open1182

commit 5babf7274d
Author: Henry <akhenry@gmail.com>
Date:   Thu Sep 29 11:21:11 2016 -0700

    [Time Conductor] Tweaked the break points for zoom level indicator

commit 22da34870d
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 29 10:41:21 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: Markup and CSS revisions for updated UX approach;
    TODO: cosmetic CSS

commit 99253a5904
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Tue Sep 27 20:42:33 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: Markup and CSS revisions for updated UX approach

commit 2db4aa6235
Author: Henry <akhenry@gmail.com>
Date:   Fri Sep 23 13:06:22 2016 -0700

    [Time Conductor] Added zoom level label

commit bb2ae2f8d1
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Fri Sep 23 11:07:06 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    Finalized TOI in plots, table and TC

commit 0cf4c92555
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 22 19:15:10 2016 -0700

    [Frontend] Styling for TOI element in tables

    Fixes #933
    Fixes #1193
    WIP: styling in tabular mostly done, needs more unit testing
    TODO: fix hide/show for pinned TOI in plots - don't
    show pinned TOI on hover when not .active

commit 3c95c095f1
Author: Henry <akhenry@gmail.com>
Date:   Thu Sep 22 17:22:25 2016 -0700

    [Time Conductor] Refactored out use of angular event bus in favor of making TimeConductorViewService an event emitter.

commit adbcc407ef
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 22 16:06:45 2016 -0700

    [Frontend] Styling for TOI element

    Fixes #933
    Fixes #1193
    WIP: TOI in tables

commit 1c3bd69b66
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 22 16:06:16 2016 -0700

    [Frontend] Styling for TOI element, some refactoring

    Fixes #933
    Fixes #1193
    Moves some TOI styling into dedicated new scss file;
    Enhancements to TOI in plots to bring into parity
    with TOI in TC approach;

commit 49ee5cb74b
Author: Henry <akhenry@gmail.com>
Date:   Thu Sep 22 15:18:48 2016 -0700

    [Time Conductor] Destroy listeners in ConductorAxisController

commit 1a93ba2c3d
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 22 15:09:42 2016 -0700

    [Frontend] Styling for TOI element in TC

    Fixes #933
    Fixes #1193
    Final for now; both types of TOI added to TC markup;
    Hover behavior; constant values in the right places;

commit 98122cc730
Author: Henry <akhenry@gmail.com>
Date:   Tue Sep 20 11:40:58 2016 -0700

    [Time Conductor] Added Zoom

commit 7fcafb6b58
Author: Henry <akhenry@gmail.com>
Date:   Mon Sep 12 16:53:48 2016 -0700

    [Time Conductor] Added pan to Time Conductor

commit d77922d66c
Author: Pete Richards <pete@pete-richards.com>
Date:   Thu Sep 15 09:37:11 2016 -0700

    Revert "[proxyUrl] pass URL parameters to proxied URL"

commit 2e81550c86
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 14 10:16:33 2016 -0700

    Revert "[Build] Check dependencies for vulnerabilities"

commit 8eb7585653
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 29 10:58:02 2016 -0700

    [README] Warn about root installation issues

    Mitigates #1151.

commit 904d56a089
Author: Henry <akhenry@gmail.com>
Date:   Thu Sep 22 13:32:43 2016 -0700

    [Time Conductor] #933 Clean up time conductor listeners on scope destruction

commit c0a96b3c5f
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 22 10:33:05 2016 -0700

    [Frontend] Styling for TOI element in TC

    Fixes #933
    Fixes #1193
    WIP, tweaking TOI in TC

commit 27e6caf69b
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Sep 16 18:51:51 2016 -0700

    [Frontend] Styling for TOI element in plots

    Fixes #933
    Fixes #1193
    Relates to #1182
    WIP, adding TOI to plot view;
    Integrated Andrew's work from #1182;
    Significant changes to markup and
    additions to plot scss;

commit 2c7ae95106
Merge: 2c81b72 41a160f
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Sep 16 15:11:25 2016 -0700

    Merge branch 'open1182' into open1193

commit 41a160fc4f
Merge: 92a80c3 156ba83
Author: Henry <akhenry@gmail.com>
Date:   Fri Sep 16 14:25:49 2016 -0700

    Merge branch 'master' into open1182

commit 92a80c39cb
Author: Henry <akhenry@gmail.com>
Date:   Mon Sep 12 16:53:48 2016 -0700

    [Time Conductor] Added pan to Time Conductor

commit 2c81b72d60
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 15 16:02:30 2016 -0700

    [Frontend] Styling for TOI element in plots

    Fixes #933
    Fixes #1193
    WIP, adding TOI to plot view.

commit 9e2debf801
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 15 15:43:29 2016 -0700

    [Frontend] Styling for TC's TOI element

    Fixes #933
    Fixes #1193
    I lied in my last commit - one more
    alignment tweak needed. Now I'm done.

commit 35872e284c
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 15 15:40:03 2016 -0700

    [Frontend] Styling for TC's TOI element

    Fixes #933
    Fixes #1193
    TOI in TC done for now.

commit 98e67f8dfb
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Thu Sep 15 14:55:06 2016 -0700

    [Frontend] Styling for TC's TOI element

    Fixes #933
    Fixes #1193
    WIP: adjust spacing;
    added pagination buttons

commit f912b9e273
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Sep 14 18:40:55 2016 -0700

    [Frontend] Styling for TC's TOI element

    Fixes #933
    WIP, TC v2 changes

commit 2df1e2b508
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Sep 14 18:40:29 2016 -0700

    [Frontend] Styling for TC's TOI element

    Fixes #933
    WIP, global changes

commit 9e85341aaa
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Sep 14 15:16:16 2016 -0700

    [Frontend] Fixed color for TC clock hands

    Fixes #933

commit 11e06039ec
Merge: a1331b7 f732387
Author: Henry <akhenry@gmail.com>
Date:   Tue Sep 13 13:25:37 2016 -0700

    Merge branch 'master' into open933

commit a1331b7bb3
Merge: d1960b2 e73bb4f
Author: Henry <akhenry@gmail.com>
Date:   Mon Sep 12 15:07:05 2016 -0700

    Merge branch 'master' into open933

commit d1960b2f46
Author: Henry <akhenry@gmail.com>
Date:   Mon Sep 12 14:54:16 2016 -0700

    [Time Conductor] Resolved merge conflicts

commit 9a06325533
Merge: e639e05 4c6ca58
Author: Henry <akhenry@gmail.com>
Date:   Mon Sep 12 14:39:24 2016 -0700

    Merge branch 'master' into open933

commit e639e056ba
Author: Henry <akhenry@gmail.com>
Date:   Fri Sep 9 16:39:21 2016 -0700

    [Time Conductor] Fixing bugs found in smoke testing. Fixes #933

commit fbab890081
Author: Henry <akhenry@gmail.com>
Date:   Wed Sep 7 14:29:21 2016 -0700

    [Time Conductor] Switched conductor to mct-include rather than mct-representation to avoid warnings

commit d37dd52ee1
Merge: 7af5875 58391de
Author: Henry <akhenry@gmail.com>
Date:   Tue Sep 6 16:43:17 2016 -0700

    Merge branch 'master' into open933

commit 7af5875dd5
Author: Henry <akhenry@gmail.com>
Date:   Tue Sep 6 10:04:29 2016 -0700

    [Time Conductor] #933 Fixed code style errors

commit c6eaa3d528
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Wed Aug 24 15:28:19 2016 +0100

    [Time Conductor] Adding tests and fixing failing ones. #933

commit 4cf6126d35
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 10 18:22:30 2016 -0700

    Refactoring based on feedback

    Refactoring controller

    Migrating functions off controller onto service class

    Simplified modes

    Adding comments

    Removed unnecessary validation

    Fixing testing issues

commit 4ae6da0334
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Tue Aug 9 17:47:31 2016 -0700

    [Frontend] Data viz in Time Conductor smaller

    Fixes #933
    Reduced height of data viz bar in Time Conductor
    v2;

commit ae39343b76
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Aug 8 12:14:20 2016 -0700

    [Frontend] Fix for bad fix

    Fixes #1112
    Put overflow: hidden back at
    outer wrapper level (now on .t-object.primary-pane
    ) which doens't clip the Inspector expand/collapse;
    did better unit testing;

commit 62ee7e569b
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Aug 8 11:21:01 2016 -0700

    [Frontend] Fix for collapse Inspector button

    Fixes #1112
    Moved min-width and overflow: hidden
    to TC-specific elements; removed
    overflow: hidden from .primary-pane

commit 7557a86208
Merge: 46e644e c8931f8
Author: Henry <akhenry@gmail.com>
Date:   Fri Aug 5 16:37:36 2016 -0700

    Merge branch 'master' into open933

commit 46e644e6dc
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 5 14:44:18 2016 -0700

    Use key to retrieve default

commit af7954c5a1
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 5 11:24:51 2016 -0700

    Trigger digests when bounds are set

commit 0e0ad64830
Author: Henry <akhenry@gmail.com>
Date:   Thu Aug 4 10:41:58 2016 -0700

    Fixed issue with wrong deltas being applied

commit f3fd386e3b
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 21:03:09 2016 -0700

    Retain time system on mode change

commit 25b9f371e2
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 20:16:03 2016 -0700

    Fixed loss of time system options on navigation

commit 6b482d487b
Merge: f96f78f 9a72c96
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 19:57:03 2016 -0700

    Merged mode-specific defaults, with some refactoring

commit f96f78ff79
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 19:34:31 2016 -0700

    Select appropriate tick source based on mode

commit 579233ade9
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 18:30:01 2016 -0700

    Fixed delta format issue on navigation

commit 9a72c96ea4
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 3 18:06:39 2016 -0700

    [TCv2] different defaults by mode

commit f4e1879a2d
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 17:43:07 2016 -0700

    stop listening to tick source on time system change

commit f844495cc1
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 17:40:37 2016 -0700

    Support deltaFormat on timeSystems

commit 900752208f
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Aug 3 13:05:43 2016 -0700

    [TCv2] get conductor without service

commit 6501e2eb5f
Author: Henry <akhenry@gmail.com>
Date:   Wed Aug 3 12:22:13 2016 -0700

    Added isUTCBased to TimeSystem interface

commit b9c41107c1
Author: Henry <akhenry@gmail.com>
Date:   Tue Aug 2 22:18:44 2016 -0700

    Time Conductor state retained on navigation

commit 34c62ba405
Author: Henry <akhenry@gmail.com>
Date:   Tue Aug 2 15:16:35 2016 -0700

    Time Conductor in edit mode

commit 1eea5ce480
Merge: 4cd579d 1173828
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 20:29:50 2016 -0700

    merged from master

commit 4cd579d274
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 20:16:46 2016 -0700

    Pass numerical value to format functions

commit 11738286df
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 18:56:33 2016 -0700

    [Frontend] Styling for unsynced elements

    Fixes #933

commit ca5206d4a0
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 18:55:49 2016 -0700

    [Frontend] Fixing issues with theme coloring

    Fixes #933

commit 573f1f9f99
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 18:04:17 2016 -0700

    [Frontend] Hide zoom slider control

    Fixes #933
    Temporarily hiding per request from Andrew
    today;

commit c5c45f0a0e
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 18:01:28 2016 -0700

    [Frontend] Update TC2 markup and sass

    Fixes #933
    Update markup and sass in TC2 to be in line with
    updates from master from #1047 glyphs
    to cssclass approach;

commit 121ab413ff
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 17:51:15 2016 -0700

    Apply formatting, filter modes by tick source availability

commit 753bd97c8a
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 17:12:44 2016 -0700

    Merge remote-tracking branch 'origin/master' into open933-c

    # Conflicts:
    #	platform/commonUI/edit/res/templates/create/create-menu.html
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.ttf
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.woff
    #	platform/commonUI/general/res/sass/_archetypes.scss
    #	platform/commonUI/general/res/sass/_constants.scss
    #	platform/commonUI/general/res/sass/_icons.scss
    #	platform/commonUI/general/res/sass/_main.scss
    #	platform/commonUI/general/res/sass/_mixins.scss
    #	platform/commonUI/general/res/sass/controls/_buttons.scss
    #	platform/commonUI/general/res/templates/controls/time-controller.html
    #	platform/commonUI/themes/snow/res/sass/_constants.scss

commit fcd7ab93e5
Merge: a75ea67 9b58aa0
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 17:12:00 2016 -0700

    Merge branch 'open933' of https://github.com/nasa/openmctweb into open933

commit c699cb8b4b
Merge: 579c6b6 d1e1ba1
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 17:11:37 2016 -0700

    Merge remote-tracking branch 'origin/master' into open933-c

    # Conflicts:
    #	platform/commonUI/edit/res/templates/create/create-menu.html
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.ttf
    #	platform/commonUI/general/res/fonts/symbols/wtdsymbols.woff
    #	platform/commonUI/general/res/sass/_archetypes.scss
    #	platform/commonUI/general/res/sass/_constants.scss
    #	platform/commonUI/general/res/sass/_icons.scss
    #	platform/commonUI/general/res/sass/_main.scss
    #	platform/commonUI/general/res/sass/_mixins.scss
    #	platform/commonUI/general/res/sass/controls/_buttons.scss
    #	platform/commonUI/general/res/templates/controls/time-controller.html
    #	platform/commonUI/themes/snow/res/sass/_constants.scss

commit a75ea67b8c
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 17:11:01 2016 -0700

    Format updates when time system selected

commit 9b58aa0052
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Mon Aug 1 17:03:00 2016 -0700

    [TCv2] Add conductorService for compatibility

    Add conductor service for compatibility with old plugins that depend
    on the conductor service.

commit 579c6b6d24
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 16:30:51 2016 -0700

    [Frontend] Styling TC unsynced elements

    Fixes #933
    WIP: Styling for unsynced elements

commit 762f43fa61
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 16:26:47 2016 -0700

    [Frontend] Styling TC unsynced elements

    Fixes #933
    WIP: Styling for unsynced elements

commit ce5d0ef5bd
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 16:03:27 2016 -0700

    Merged stylesheet changes

commit 142ee2f336
Merge: 482fcbf 523d674
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 15:44:49 2016 -0700

    Added LocalTimeSystem and merged latest styles

commit 482fcbf6ee
Author: Henry <akhenry@gmail.com>
Date:   Mon Aug 1 15:14:23 2016 -0700

    Refactored bundle

commit 523d6743fb
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Mon Aug 1 12:00:53 2016 -0700

    [Frontend] Added support for thematic styling of Time Conductor v2

    Fixes #933
    Added theme sass files

commit 7af22126d4
Author: Henry <akhenry@gmail.com>
Date:   Wed Jul 27 12:05:03 2016 -0400

    Prevent tabbing into end bounds when not in fixed mode

commit 8e59072537
Author: Henry <akhenry@gmail.com>
Date:   Wed Jul 27 11:55:12 2016 -0400

    Removed LAD and Realtime modes

commit c1bbc4f01d
Author: Henry <akhenry@gmail.com>
Date:   Wed Jul 27 10:38:04 2016 -0400

    Code cleanup

commit aa4a5e56f9
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 26 16:55:00 2016 -0400

    Improved support from plot

commit 5b2eb72b16
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 26 08:33:30 2016 -0400

    [Time Conductor] Addressed documentation issues

commit 1b7fc57d21
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 25 16:55:27 2016 -0400

    Added status support to plots

commit a4f6f6f50b
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 25 12:09:15 2016 -0400

    Added license

commit 19fd63b850
Merge: c2c8e16 a10ded2
Author: Henry <akhenry@gmail.com>
Date:   Thu Jul 21 20:06:50 2016 -0700

    Merge branch 'open933-frontend-b' into open933

commit c2c8e16453
Author: Henry <akhenry@gmail.com>
Date:   Thu Jul 21 20:03:40 2016 -0700

    Added scale sensitive formatting to UTCTimeFormat

commit a10ded25b4
Merge: da7c636 e6d8944
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 20 18:33:58 2016 -0700

    Merge remote-tracking branch 'origin/open933' into open933-frontend-b

    # Conflicts:
    #	platform/features/conductor-v2/res/sass/time-conductor.scss
    #	platform/features/conductor/res/sass/time-conductor.scss

commit da7c636724
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 20 18:22:20 2016 -0700

    [Frontend] Time Conductor v2 styling

    Fixes #933
    Redo TC icon to use font symbol, added
    new symbol for brackets to font files; font
    anti-aliasing mod for .ui-symbol class;
    layout tweaks; mobile tweaks.

commit b392633bc6
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 20 15:48:22 2016 -0700

    [Frontend] Time Conductor v2 styling

    Fixes #933
    WIP: Significant mobile and desktop style tweaks;
    moved constants into their own include file;

commit ff1678435e
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 20 11:43:40 2016 -0700

    [Frontend] Time Conductor v2 styling

    Fixes #933
    Changed desktop and mobile RT UI to display
    end datetime and hide start;
    WIP: mobile styling for main UI of TC;

commit 2124fe01e1
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 20 10:18:42 2016 -0700

    [Frontend] Renew support for Time Conductor v1

    Fixes #933
    Minor fixes to TCv1 for mobile

commit e6d8944547
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 19 20:17:06 2016 -0700

    Modified main.js

commit ea1defac28
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Tue Jul 19 18:33:24 2016 -0700

    [Frontend] Renew support for Time Conductor v1

    Fixes #933
    Time Conductors v1 and v2 now build and load their
    own isolated CSS files. All previous styling for TCv1
    should be re-enabled. Note that Conductor v2 mobile
    is not complete yet.

commit 2a19394334
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 19 19:54:52 2016 -0700

    Added compatibility layer to support existing plots and historical tables

commit f641edbce7
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Tue Jul 19 18:33:24 2016 -0700

    [Frontend] Renew support for Time Conductor v1

    Fixes #933
    Time Conductors v1 and v2 now build and load their
    own isolated CSS files. All previous styling for TCv1
    should be re-enabled. Note that Conductor v2 mobile
    is not complete yet.

commit 15a608a861
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 18 18:44:29 2016 -0700

    Populate format in input fields

commit 334ca64551
Merge: 0af49ef 4087b9c
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 18 14:25:02 2016 -0700

    Merged open933-frontend

commit 0af49efe06
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 18 08:23:27 2016 -0700

    Refactored out modes, time systems, etc.

commit 4087b9cdde
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Fri Jul 15 14:39:29 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    WIP: Fixed look for Firefox

commit 43a804eef4
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Jul 15 07:54:32 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    WIP: Added zoom current range indicator;
    tweaks to style

commit b3a4f52fe2
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Thu Jul 14 18:30:49 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    WIP: Adding zoom control with HTML5
    input range type; Refactored sass slightly
    to move display: inline-block out of mixin
    containerBase and into .s-btn.

commit 671e3016d4
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Thu Jul 14 16:40:05 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    New _animations scss include, moved
    scss around.

commit 379828315f
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Thu Jul 14 16:39:27 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    New _animations scss include, moved
    scss around.

commit 8c5538ec4d
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Thu Jul 14 14:58:18 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    "Sticky" clock anim for LAD mode

commit 2f9fbfef7f
Author: Henry <akhenry@gmail.com>
Date:   Wed Jul 13 20:33:47 2016 -0700

    More refactoring

commit 2baca659ca
Author: Henry <akhenry@gmail.com>
Date:   Wed Jul 13 19:50:58 2016 -0700

    Refactoring

commit 8b694ef337
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 19:42:51 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    In-progress: color/size tweaks, fixes for espresso
    theme

commit e193e3dfba
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 19:16:27 2016 -0700

    Merge open933 latest, resolve conflicts

    Fixes #933
    Fair amount of manual fixing in time-conductor.html

commit 8214c8e895
Merge: 33b2225 14463d3
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 19:16:00 2016 -0700

    Merge open933 latest, resolve conflicts

    Fixes #933
    Fair amount of manual fixing in time-conductor.html

commit 33b2225d10
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 18:48:17 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    In-progress: restructured markup to move
    modeModel farther out; animated icon

commit 14463d39a8
Author: Henry <akhenry@gmail.com>
Date:   Wed Jul 13 18:17:27 2016 -0700

    Added end delta

commit fcfda50e73
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 15:00:16 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    In-progress: color tweaks, bar sizing,
    field widths

commit 06af84c161
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 13:14:32 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    In-progress: fixed SVG text color, field
    styling for fixed vs. real-time, markup cleanup

commit 5238aa2731
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Wed Jul 13 08:07:59 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    In-progress; fixed SVG text color

commit fd29473664
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 12 15:02:39 2016 -0700

    Support resize

commit 97f3fd516b
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 12 10:14:26 2016 -0700

    Changed default duration to fifteen minutes

commit 088416905d
Author: Henry <akhenry@gmail.com>
Date:   Tue Jul 12 10:08:08 2016 -0700

    Added duration

commit 2056d87453
Merge: 585da38 64ce8a2
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 11 14:27:30 2016 -0700

    Merge branch 'open933-frontend' into open933

commit 64ce8a2b2a
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Jul 11 14:03:41 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    Color adjusts, mini super-menu size
    and font tweaks, glyphs added to selector,
    SVG style fixes in progress

commit 585da38a16
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 11 13:46:46 2016 -0700

    Fixed some merge issues

commit bf0e85a94c
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Jul 11 11:35:26 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #933
    Renamed main class; removed unused <style>
    defs

commit 84b7a9dc2f
Merge: 7b7b21d 11caa83
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Jul 11 11:29:35 2016 -0700

    Merge remote-tracking branch 'origin/open933' into open933-frontend

    Fixes #933
    Conflicts:
    	platform/features/conductor-v2/src/TimeConductorController.js

commit 11caa8396a
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 11 11:18:23 2016 -0700

    Updated modes

commit 0017b77439
Merge: 5cc81ba 788483e
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 11 11:06:22 2016 -0700

    Merged markup changes

commit 7b7b21d748
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Jul 11 11:05:47 2016 -0700

    [Frontend] Styling of Time Conductor v2

    Fixes #933
    Tweaks to language; tweak to class name in markup

commit 788483ec13
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Jul 11 10:37:08 2016 -0700

    [Frontend] Styling of Time Conductor v2

    Fixes #933
    Tweaks to language

commit 7b19f91ce6
Merge: 0a0bc55 4e7b69c
Author: Charles Hacskaylo <charles.f.hacskaylo@nasa.gov>
Date:   Mon Jul 11 10:31:14 2016 -0700

    [Frontend] Merge latest from open933

    Fixes #933
    Resolve conflicts in
    mode-menu.html, mode-selector.html,
    time-conductor.html; apply tweaks, language, etc.

commit 5cc81ba12a
Author: Henry <akhenry@gmail.com>
Date:   Mon Jul 11 10:26:34 2016 -0700

    [Time Conductor] Added mode class to time conductor

commit 0a0bc55f5f
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Jul 8 17:11:43 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #993
    In-progress; mode menu names and
    descriptors modified, markup cleaned up

commit 4e7b69c4df
Author: Henry <akhenry@gmail.com>
Date:   Fri Jul 8 16:57:50 2016 -0700

    Enabled fixed and real-time modes

commit cf83040c4b
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Jul 8 16:54:49 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #993
    In-progress; Create menu refactoring and new
    mini Create menu

commit 32f7bc86af
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Fri Jul 8 16:54:13 2016 -0700

    [Frontend] Styling for Time Conductor v2

    Fixes #993
    In-progress; class renaming continued,
    cleanups in markup file, in-page styles
    ported to scss

commit e230b92946
Author: Henry <akhenry@gmail.com>
Date:   Fri Jul 8 15:15:12 2016 -0700

    Fixed bug with date selector having to be clicked twice

commit 58ed500ecf
Author: Henry <akhenry@gmail.com>
Date:   Thu Jul 7 16:57:03 2016 -0700

    Time sync via conductor

commit bca5eb0fdb
Author: Henry <akhenry@gmail.com>
Date:   Thu Jul 7 09:47:46 2016 -0700

    [Time Conductor] #933 Initial markup
2016-11-25 15:02:34 -08:00
c98286d426 Merge pull request #1329 from nasa/jscs-reports-1314
[Build] Output JSCS reports
2016-11-17 11:08:30 -08:00
d368bc2351 Merge pull request #1328 from nasa/open1322
[Composition] Modified call to object utils to provide identifier correctly
2016-11-17 11:07:35 -08:00
6a7b77ccf5 Merge pull request #1326 from nasa/image-brightness-contrast
[Imagery] Brightness/contrast controls
2016-11-17 11:06:05 -08:00
242eb6d733 [Build] Restore missing semicolon
Semicolons are our friends.
2016-11-16 09:36:22 -08:00
2991e9894d [Build] Move report to correct location 2016-11-16 09:28:56 -08:00
3dc8bc87fc [Build] Add jscs html reporter
Fixes #1314
2016-11-15 16:00:40 -08:00
cfb99eaf80 [Imagery] Add doc to mct-background-image 2016-11-15 14:08:00 -08:00
5dee588c36 Revert "[Frontend] Updated example images"
This reverts commit 251e3b5646.
2016-11-15 14:00:51 -08:00
2f8c03ecb2 [Imagery] Simplify filter reset 2016-11-15 14:00:12 -08:00
2dfde9a612 [Imagery] Test mct-background-image filters 2016-11-15 13:54:23 -08:00
3dade275d4 Merge pull request #1318 from nasa/open1315
Add styling for .s-status-missing
2016-11-15 12:56:26 -08:00
2f5dc8a887 [Frontend] Styling for controls
Fixes #1324
New reset glyph; Reset button complete,
final sanding.
2016-11-15 12:24:14 -08:00
9b11684ae9 [Frontend] Styling for controls
Fixes #1324
CSS, markup, WIP adding reset button
2016-11-15 10:54:00 -08:00
251e3b5646 [Frontend] Updated example images
Fixes #1324
All images are open licensed for reuse
2016-11-15 10:42:34 -08:00
03b47b43ad [Build] Bump version number, restore SNAPSHOT status
...to open sprint Roddenberry,
https://github.com/nasa/openmct/milestones/Roddenberry
2016-11-15 10:11:37 -08:00
18e51aaff7 [Build] Remove SNAPSHOT status
...to close sprint Robinson,
https://github.com/nasa/openmct/milestones/Robinson
2016-11-15 10:00:16 -08:00
5c31c6084c [Composition] Modified call to object utils to provide identifier correctly. 2016-11-15 11:37:55 +00:00
b1464efdaf [Frontend] Styling for controls
Fixes #1324
CSS, markup, new glyphs for
brightness and contrast
2016-11-14 18:12:06 -08:00
3e6e068f7f [Imagery] Sketch in brightness/contrast controls
Fixes #1324
2016-11-14 12:19:23 -08:00
f7a08c7087 [Frontend] Styles for .s-status-missing
Fixes #1315
For https://developer.nasa.gov/ResourceProspector/warp/issues/219
2016-11-09 11:19:48 -08:00
dfa4591834 Merge pull request #1316 from nasa/ghost-object-problems
Ghost object problems
2016-11-08 16:27:09 -08:00
4d3ec398c9 [Style] Fix style, disable tests
disable tests for later follow-up.
2016-11-08 16:21:38 -08:00
b169089156 get rid of feel-good code 2016-11-08 16:07:53 -08:00
5b6f95bd4a [Fixed] Specify default layout grid (#1296)
* [Fixed] Specify default layout grid

Previously users would see blank values for grid size
even though a default was applied.  Users will now
see default values for grid size which should prevent
them from accidentally changing grid size.

Fixes https://github.com/nasa/openmct/issues/1285

* [Fixed] Don't hardcode grid size

Remove hardcoded grid size per comments.

https://github.com/nasa/openmct/pull/1296#issuecomment-259231499

* [Fixed] read layout before initial refresh

Read the layoutGrid sizes from scope (when watch is registered)
before refreshing elements, to ensure that layoutGrid is set
properly.

https://github.com/nasa/openmct/pull/1296#issuecomment-259231499

* [Spec] Update spec to match

Update spec to trigger watch on initialization to ensure
layoutGrid is set.

https://github.com/nasa/openmct/pull/1296
2016-11-08 14:59:09 -08:00
66a6b6d89b Always put in cache on mutation, assuming persistence 2016-11-08 14:58:15 -08:00
d74eba1922 Move mutation listening out of cache service 2016-11-08 14:14:56 -08:00
9a7f69a614 Model Cache updates models on mutation 2016-11-08 13:54:31 -08:00
0578a651da cache on instantiate 2016-11-08 13:51:50 -08:00
f991dcfb76 Clear cache when no transactions active 2016-11-08 13:51:30 -08:00
42c48cb93b disable cache 2016-11-08 11:20:34 -08:00
67b763c4c0 Merge pull request #1313 from nasa/disable-local-1270
[Build] Don't enable local storage by default
2016-11-08 11:18:49 -08:00
2708562872 [Transaction] Sync mutation within transaction 2016-11-08 10:34:20 -08:00
9578fb0cd8 [Views] Update representations on mutation (#1312)
* [Core] Log errors from topic

Log full error (including stack trace) when catching errors
from the topic service. Aids debugging of #1303 (and should
aid in future debugging of any similar issues.)

* [API] Fix identifier usage in handleMutation

To address console errors observed in the context of #1303

* [Views] Listen to mutation

Listen for mutation instead of watching modified timestamp;
more reliable due to recent API changes. Fixes #1303.

* [Views] Update spec for mct-representation

...to reflect changes for #1303
2016-11-07 10:08:53 -08:00
a728f2368c [Build] Don't enable local storage by default
...except for the dev instance of Open MCT run from index.html.
Fixes #1270
2016-11-04 14:58:35 -07:00
547696d797 [Views] Repair view registry for mainViews (#1308)
* [Views] Rewrite mct-view

...to make it a simple way to include non-Angular views, without
integrating unnecessarily with other architectural concerns.
Supports restoration of view registration functionality to fix
#1307

* [API] Use identifier as property name

* [API] Add adapter capability

...to simplify adapter layer (allowing new-style objects to be
retrieved via capability.)

* [API] Add AdaptedViewController

* [API] Add template for adapted views

* [API] Add AdaptedViewPolicy

* [API] Wire in view adapter

* [API] Fix adapter capability implementation

* [API] Don't create new scope from mct-view

...to allow use on same element as ng-controller (and because a
new scope just is not necessary.)
2016-11-03 10:37:58 -07:00
025b69541e Merge pull request #1222 from BogdanAlexandru/mct1221
[Notifications] Fix and harden the NotificationService
2016-11-03 09:45:06 -07:00
5aa95c0415 Merge pull request #1207 from Proekspert/fix-tutorial
[Documentation] Fixed module reference
2016-11-02 09:24:27 -07:00
d63c401e44 [Notifications] Remove custom autoDismiss 2016-10-29 11:18:07 +03:00
c9ac85089a Merge branch 'master' into mct1221 2016-10-29 10:41:18 +03:00
a8c9b6f7fe Fixes #1239 make notification icon clickable 2016-10-27 19:20:45 -04:00
eca9968a9f Merge pull request #1302 from nasa/types-nonfunctional-1294
[API] Fix type registration
2016-10-27 16:01:16 -07:00
736c89cfc6 Merge pull request #1301 from nasa/search-indexing-1279
Add modelService compatibility adapater
2016-10-27 15:54:06 -07:00
9a0fcc045c [API] Simplify type registration
https://github.com/nasa/openmct/pull/1302#discussion_r85417042
2016-10-27 15:30:34 -07:00
a3459679d0 [JSDoc] basic jsdoc 2016-10-27 13:01:29 -07:00
12333f3417 [API] Use correct method name in docstring 2016-10-27 12:22:46 -07:00
2bf05ae40f [API] Add missing semicolon, satisfy JSHint 2016-10-27 12:21:16 -07:00
833bad067e [API] Add creatable property to example 2016-10-27 12:16:57 -07:00
23eff4b924 [API] Fix TypeRegistry docstring
Fixes #1295
2016-10-27 12:16:07 -07:00
30b769d741 [API] Repair type registration
Fixes #1294
2016-10-27 12:10:45 -07:00
d813029046 [API] Providers get with identifier
Providers fetch objects using a full identifier.  This ensures a consistent
interface.

Related to https://github.com/nasa/openmct/issues/1279
2016-10-27 11:58:01 -07:00
81de6119fe [Compat] model service adapter
Provide adapter that ensures model service can fetch models
provided via new API.

Fixes https://github.com/nasa/openmct/issues/1279
2016-10-27 11:56:57 -07:00
365af918f3 Merge pull request #1297 from nasa/fast-gulp-develop-1268
[Dev] develop with stylesheets
2016-10-27 11:52:48 -07:00
40fb144d09 [Dev] develop with stylesheets
Remove 'install' step from gulp develop task, instead
run 'stylesheets' to build stylesheets.  Result is much
faster execution of gulp develop as is expected for
a development tool.

Fixes https://github.com/nasa/openmct/issues/1268.
2016-10-26 12:55:47 -07:00
8cacff37ab Merge pull request #1292 from nasa/my-items-1284
[Roots] Restore legacy root provider
2016-10-26 10:24:24 -07:00
70985c5dbd Revert "[Roots] Remove obsolete provider"
This reverts commit b49fef78f5.

Fixes #1284
2016-10-26 10:09:10 -07:00
9dec99824e Revert "[Roots] Remove obsolete spec"
This reverts commit 2cced53c97.
2016-10-26 10:08:35 -07:00
d4730e1656 Revert "[Roots] Remove legacy root model provider"
This reverts commit 7b0506bbdb.
2016-10-26 10:08:30 -07:00
c079868224 Merge pull request #1271 from nasa/open1256
[Examples] Simplified MSL example and fixed issues with new API
2016-10-26 09:55:18 -07:00
54a59c5e6f Merge pull request #1237 from tylerbrewer2/master
[Frontend] Ensure stacking order of save drop-down Fixes #1205
2016-10-26 09:54:37 -07:00
0804a16314 Merge pull request #1269 from nasa/my-items-1264
[Roots] Support async root registration, with My Items
2016-10-21 13:34:23 -07:00
4cc020f0ea [Examples] Simplified MSL example, fixed object tree not loading by default, renamed. Fixes #1256. Fixes #1255 2016-10-20 14:33:12 -07:00
b49fef78f5 [Roots] Remove obsolete provider 2016-10-19 17:02:12 -07:00
2cced53c97 [Roots] Remove obsolete spec 2016-10-19 16:54:26 -07:00
f6253ae7ed [Roots] Remove unnecessary model provider 2016-10-19 16:53:03 -07:00
3f50bdb334 [Roots] Distinguish objects.get
...which needs to accept full identifiers from namespace-specific
object providers, which only need to accept keys.
2016-10-19 16:47:11 -07:00
2a79813460 [Roots] Remove unnecessary RootRegistrar 2016-10-19 16:37:10 -07:00
650824574c [Roots] Add new root model provider
...to read roots from the new API's registry.
2016-10-19 16:20:02 -07:00
7b0506bbdb [Roots] Remove legacy root model provider 2016-10-19 16:19:11 -07:00
a3847bcca5 [Roots] Add useful logging for components 2016-10-19 16:18:50 -07:00
a143b21ea1 [Roots] Register roots with new API
Register roots added via old API with new API when the application
starts. Fixes #1264.
2016-10-19 15:01:39 -07:00
64ff463200 Revert "Revert "Async root registration"" 2016-10-19 14:55:07 -07:00
08ca7659e7 Merge pull request #1260 from nasa/open1257
[Composition] Fix adapter composition policy
2016-10-18 12:04:04 -07:00
d7edfb4cc6 Merge pull request #1263 from nasa/revert-1252-async-root-registration
Revert "Async root registration"
2016-10-18 10:52:42 -07:00
4eca80a770 Revert "Async root registration" 2016-10-18 10:48:26 -07:00
56a662841e Merge pull request #1254 from nasa/open1235
[Frontend] Fixes to Export buttons
2016-10-18 09:32:28 -07:00
8878ea4cf7 Merge pull request #1244 from nasa/restore-fixed-pos
[API] Enable fixed position view
2016-10-18 09:32:08 -07:00
eb32a798b8 Merge pull request #1252 from nasa/async-root-registration
Async root registration
2016-10-18 09:31:46 -07:00
0759ba6722 [Composition] Fix adapter composition policy
...as this had fallen out-of-date with existing APIs.
Fixes #1257.
2016-10-17 10:43:12 -07:00
bfdf7b822f [Notifications] Cover direct dismiss and minimize 2016-10-16 15:34:11 +03:00
7dde924fcc Merge branch 'master' into mct1221 2016-10-15 14:10:24 +03:00
b8cb41b1da [Frontend] Fixes to export buttons
Fixes #1235
Sass and markup mods; changes to
.l-btn-set and related classes
2016-10-14 16:53:00 -07:00
971b92acbb Merge remote-tracking branch 'origin/master' into restore-fixed-pos 2016-10-14 13:53:26 -07:00
d643efa9bb [Style] Remove unused function
https://github.com/nasa/openmct/issues/1251
2016-10-14 13:16:00 -07:00
08c0aeb2d5 [Test] Add tests for root registration
Add unit tests for RootRegistry and RootObjectProvider.

https://github.com/nasa/openmct/issues/1251
2016-10-14 13:12:45 -07:00
b0940eb33e [Objects] refactor out RootObjectProvider
Refactor RootObjectProvider to separate file for simplicty.

https://github.com/nasa/openmct/issues/1251
2016-10-14 12:47:09 -07:00
6ec858b237 [Docs] Update root registration in README.
https://github.com/nasa/openmct/issues/1251
2016-10-14 12:38:52 -07:00
891412bdb9 [Roots] Move my-items to separate bundle
My Items root is now opt-in, and does not need to be enabled for all
deployments.  My Items is enabled by default in the development edition.

https://github.com/nasa/openmct/issues/1251
2016-10-14 12:38:47 -07:00
1947802a35 [ObjectAPI] support async root loading
Overload addRoot method to support async root loading.  By supplying a
function you can defer loading to later, and by allowing those functions
to return a promise, execution can be asynchronous.

Remove "removeRoot" as the assumption will be that roots are opt in, and
instead of removing a Root, an application developer should never configure
it in the first place.

Fixes https://github.com/nasa/openmct/issues/1251
2016-10-14 12:38:28 -07:00
3b06e32b40 Merge pull request #1250 from nasa/open1249
[Documentation] Changed build location of docs so that API docs are pushed to website
2016-10-14 10:57:51 -07:00
a2711c2c08 [Documentation] Changed build script to produce new API docs for website. Fixes #1249t 2016-10-13 16:27:35 -07:00
3e6c9fa318 Merge pull request #1247 from nasa/fix-built-file
[Build] require correct module
2016-10-12 15:25:37 -07:00
2e49c5932a [Build] require correct module
Require the openmct module so that distributed files work properly.

Related to #1212
2016-10-12 15:21:57 -07:00
abf750f894 Merge branch '1089-integration' 2016-10-12 14:43:45 -07:00
137434af1b [API] Enable fixed position view 2016-10-12 14:06:39 -07:00
ac4d21b252 [Build] Load v2 conductor, don't enable
Loads the v2 conductor so that it is included in the build openmct
file.  It is not enabled by default.
2016-10-12 13:57:11 -07:00
db362a0efc Merge pull request #1243 from nasa/api-swg-enable
[API] Enable example bundles
2016-10-12 13:54:12 -07:00
887631500b [Style] Remove duplicate key
Remove duplicate entry, fix JSHint issues.
2016-10-12 13:53:22 -07:00
65043d0ff3 squash merge open933 into integration-1089, resolve merge conflicts. 2016-10-12 13:47:56 -07:00
1bf7c06b1e [API] Enable example bundles
Enable example bundles in the default build. Addresses regression
in development environments introduced by #1212.
2016-10-12 13:13:47 -07:00
7b218c7f02 Merge pull request #1212 from nasa/api-1124b
[API] Integrate new API
2016-10-12 12:33:44 -07:00
3572877a2e Merge pull request #1213 from nasa/api-platform-updates
[API] Miscellaneous platform updates
2016-10-12 12:28:52 -07:00
f2d44114fa Merge pull request #874 from nasa/persist-on-mutation-825
[Persistence] Persist on mutation
2016-10-11 10:52:44 -07:00
d1d2067ad5 [Notifications] Extract autoDismiss logic 2016-10-08 22:51:01 +03:00
9456370077 [Notifications] Extract minimize and dismiss logic 2016-10-08 21:36:31 +03:00
0833674b91 [Persistence] Address refactoring error
...caught by unit tests
2016-10-07 11:54:54 -07:00
947b54555a [Edit Mode] Simplify transaction stack
https://github.com/nasa/openmct/pull/874#r76593588
2016-10-07 11:35:35 -07:00
1a88c9a651 Merge remote-tracking branch 'origin/master' into persist-on-mutation-825 2016-10-07 11:27:58 -07:00
567bb6fa2a [API] Fix ActionDialogDecorator's dependencies 2016-10-07 11:10:41 -07:00
00d0b71080 [API] Use ViewRegistry from dialog adapter
https://github.com/nasa/openmct/pull/1212#pullrequestreview-2458991
2016-10-07 11:07:53 -07:00
580e10b024 [API] Only use strategy where needed
Satisfies JSHint.
2016-10-07 10:15:02 -07:00
fbe9621387 [API] Support telemetry request strategies
https://github.com/nasa/openmct/pull/1212#discussion_r81880741
2016-10-06 18:00:32 -07:00
13b5e7c00e [API] Remove toLegacyDefinition
https://github.com/nasa/openmct/pull/1212#discussion_r81666469
2016-10-06 17:50:01 -07:00
09d59f00e7 [API] Remove silly old comment
https://github.com/nasa/openmct/pull/1212#discussion_r82086807
2016-10-06 17:48:08 -07:00
772d24b173 [API] Avoid memory leak
https://github.com/nasa/openmct/pull/1212#discussion_r81882955
2016-10-06 17:46:26 -07:00
cbd001e280 Merge pull request #1232 from nasa/open1216
[Tables] Fixed table scroll by modifying selection of scrollable element. Fixes #1216
2016-10-06 17:41:54 -07:00
6d2c5f7fd4 [Frontend] Ensure stacking order of save drop-down Fixes #1205 2016-10-06 18:49:21 -04:00
1f6ca8bcc3 Merge branch 'master' of https://github.com/nasa/openmct into fix-tutorial
PR is also addresses #1206
2016-10-05 10:48:28 +03:00
bff4e120a7 [Tables] Modified selection of scrollable element. Fixes #1216 2016-10-04 19:14:47 -07:00
8a0018177a Merge pull request #1204 from BogdanAlexandru/mct1198
[Edit] Switch other edit actions to mct-control
2016-10-04 18:09:16 -07:00
c9c8998fa2 Merge pull request #1196 from hudsonfoo/open1185
[Timeline] Add battery starting state-of-charge
2016-10-04 18:06:50 -07:00
e19edbb27a Merge branch 'master' into mct1221 2016-10-03 04:50:41 +03:00
f2fe6a9885 [Notification] New tests + bugfix
New test suite for the notification service covering common use cases. Fixed the bug where autoDismiss would be set wrong for info notifications; also treating info notifications appropriately now.
2016-10-03 04:19:55 +03:00
0442a31153 [Notification] Rename variables for clarity
In the spec: NotificationService knows about concepts like "info", "alert" and "error" only, having a plain info notification model called successModel doesn't help much and may be confusing at times (makes you think it's something the service treats separately).
2016-10-02 23:41:19 +03:00
e03c725b86 [Style] Minor style changes 2016-10-01 22:40:21 +03:00
b0e842863d Squashed commit of the following:
commit 6b5528a4fc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 17:22:27 2016 -0700

    [API] Don't use new composition for legacy objects

commit 2af993b0bc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 17:19:52 2016 -0700

    [API] Enable bundles from spec

commit c762d58b5a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 17:12:42 2016 -0700

    [API] No, don't enable bundles by default

commit 219c9348d9
Merge: f8819ee 5b0fa90
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 17:11:05 2016 -0700

    Merge remote-tracking branch 'origin/master' into api-1124b

    Conflicts:
    	bower.json

commit f8819ee946
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 17:05:40 2016 -0700

    [API] Fix failing specs

commit ce6c6385c3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 16:55:58 2016 -0700

    [API] Remove failing spec

commit ef0264d864
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 16:23:17 2016 -0700

    [API] Satisfy JSCS

commit 044b1b627d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 16:17:35 2016 -0700

    [API] Run gulp fixstyle

commit 5b6f13f521
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 16:15:30 2016 -0700

    [API] Satisfy JSLint

commit 5b2c0e9aee
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 15:47:54 2016 -0700

    [API] Adapt composition capability

commit dd7d8d2642
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 15:18:51 2016 -0700

    [API] Fix dependency issues with Composition

commit 08e28018c1
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 15:09:09 2016 -0700

    [API] Don't instantiate Error

commit 3b1fe93191
Merge: 2b66a4d c874ae7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 15:08:01 2016 -0700

    Merge remote-tracking branch 'origin/api-platform-updates' into api-1124b

commit 2b66a4d604
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 15:06:50 2016 -0700

    [API] Wire in ObjectAPI appropriately

commit 70c810b85d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:51:26 2016 -0700

    [API] Remove obsolete define parameter

commit c874ae7afd
Merge: 34e07b9 c27c0c5
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:46:37 2016 -0700

    Merge remote-tracking branch 'origin/master' into api-platform-updates

commit fc5c07aeb6
Merge: 2976c9e ed10249
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:44:54 2016 -0700

    Merge remote-tracking branch 'origin/fix-jspdf-version-1214' into api-1124b

commit 2976c9e703
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:39:33 2016 -0700

    [API] Really fix EventEmitter import

commit 54d2b00e67
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:37:20 2016 -0700

    [API] Update licenses correctly

    Instead of double-documenting Zepto, document eventemitter3

commit 061f9d6deb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:32:10 2016 -0700

    [API] Update EventEmitter dependency

commit 1de9d182a7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 14:20:10 2016 -0700

    [API] Add license info for new dependencies

commit 810150d0d7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:41:28 2016 -0700

    [API] Update documentation to reflect API status

commit 1c0999b512
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:26:59 2016 -0700

    [API] Include revision info in minified openmct

commit 774ae03c3e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:23:11 2016 -0700

    [API] Add license headers

commit 1defee8953
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:16:36 2016 -0700

    [API] Decruft README.md for objects

    ...as this content is now in JSDoc

commit 7b9ac3e7fb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:11:03 2016 -0700

    [API] Remove tutorial directories

commit f2178e2b43
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:08:33 2016 -0700

    [API] Decruft unused view

    ...from context menu prototyping

commit 0094fea3f7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:07:55 2016 -0700

    [API] Decruft unused gesture

commit 7f79abe849
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:07:25 2016 -0700

    [API] Remove unused OverlayManager

commit f43bb6e03d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:05:16 2016 -0700

    [API] Decruft unused Region

commit 8f3c3d910e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:04:23 2016 -0700

    [API] Decruft unused gesture

commit 0956811adc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 13:00:00 2016 -0700

    [API] Remove obsolete Selection.js

commit bcc5a4e2ca
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:57:55 2016 -0700

    [API] Remove README to decruft

    Content is now provided in JSDoc

commit 27b6a51887
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:56:16 2016 -0700

    [API] Remove README to decruft

    Content is now provided in JSDoc

commit bb04d9db4a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:55:38 2016 -0700

    [API] Remove obsolete method to decruft

commit 7c3bfae0a6
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:53:26 2016 -0700

    [API] Remove obsolete script to decruft

commit 471fe7453b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:52:51 2016 -0700

    [API] Remove empty View script

    ...and move API docs to ViewRegistry

commit 0d0526627b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:50:37 2016 -0700

    [API] Decruft unused AngularView

commit 43e35179a3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:49:08 2016 -0700

    [API] Continue decrufting

commit 59634be565
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:46:36 2016 -0700

    [API] Decruft unused script

commit 3bd8dd9928
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:45:20 2016 -0700

    [API] Decruft unused script

commit b5f1f98555
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:38:03 2016 -0700

    [API] Minimize logic in openmct module

commit 11965304fb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:35:15 2016 -0700

    [API] Remove redundant openmct module

commit 742d649d38
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:29:34 2016 -0700

    [API] Decruft unused dependency

commit 6a47df095b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:27:53 2016 -0700

    [API] Remove gulp api task

commit 0012ca48c1
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 12:27:39 2016 -0700

    [API] Simplify JSDoc build

    ...since extraneous documentation no longer needs to be
    worked-around.

commit 34e07b938d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:42:48 2016 -0700

    [API] Update StyleSheetLoaderSpec

    ...to reflect asset path details

commit 230230aa94
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:37:31 2016 -0700

    [API] Remove js extension from import

    ...to avoid confusing RequireJS and breaking test suite

commit 901846e6c1
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:29:03 2016 -0700

    [API] Use correct property for RT table template

commit 04b8326900
Merge: aed01d3 a93f41f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:25:32 2016 -0700

    Merge branch 'api-platform-updates' into api-1124b

commit a93f41f1c3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:25:22 2016 -0700

    [API] Miscellaneous platform updates

    Adds miscellaneous platform updates to include templates
    via the RequireJS text plugin; to support modification of
    asset paths; and to support priority order for gestures.

    Supports integration of new API, #1124.

commit aed01d3a23
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:20:09 2016 -0700

    [API] Remove examples

    ...as these do not necessarily reflect API updates

commit 09c73ef5f8
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 10:09:42 2016 -0700

    [API] Update MCT implementation

commit b1b6080161
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 09:56:50 2016 -0700

    [API] Rename types in api module

commit cb93da5e15
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 09:56:06 2016 -0700

    [API] Fix CompositionAPI module

commit d0e7eb29a9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 30 09:51:35 2016 -0700

    [API] Mark MCT#selection as private

commit 5e9e6099b0
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 21:59:06 2016 -0700

    [API] Update TelemetryAPI to match docs

commit 6bd1af5c03
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 21:42:09 2016 -0700

    [API] Define LimitEvaluator interface

commit 3f20c1bb94
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:34:41 2016 -0700

    [API] Update ViewRegistry to match docs

commit 91214f2623
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:26:27 2016 -0700

    [API] Implement TypeRegistry methods

commit 1fde82e673
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:22:29 2016 -0700

    [API] Mark Selection as private

commit 0ae0abcfc3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:20:27 2016 -0700

    [API] Update ObjectAPI to match docs

commit 6fe1e775e0
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:16:56 2016 -0700

    [API] Update GestureAPI to match docs

commit d4d9f9c467
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:08:54 2016 -0700

    [API] Update CompositionCollection to match docs

commit 0cb1ec9366
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 17:04:15 2016 -0700

    [API] Rewrite CompositionAPI to match docs

commit 6ab27302f6
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 16:49:42 2016 -0700

    [API] Document remaining Dialog method

commit dfc5021e11
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 16:47:33 2016 -0700

    [API] Fix JSDoc for Dialog

commit 9e3a3529e0
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 16:46:22 2016 -0700

    [API] Rename main module

commit 434ea5487a
Merge: 987d98b 45ecc7b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 16:43:47 2016 -0700

    Merge branch 'api-1110' into api-1124b

commit 987d98b47e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 16:37:57 2016 -0700

    [API] Restore JSDoc for openmct module

commit 53974bd69a
Merge: ed8d331 d61f446
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 10:54:08 2016 -0700

    Merge branch 'subobject-selection-1126' into api-1124b

    Conflicts:
    	bower.json
    	index.html
    	main.js
    	src/openmct.js

commit ed8d331cd3
Merge: 7ce9bd9 7439d94
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 29 10:47:52 2016 -0700

    [API] Merge in latest from master

commit d61f446002
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Sep 26 15:21:43 2016 -0700

    [Selection] Add a click-elsewhere gesture

commit 763f7dd021
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Sep 26 12:37:02 2016 -0700

    [Selection] Begin adapting actions

commit cad255ce83
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Sep 26 11:52:14 2016 -0700

    [Selection] Use variable name expected by template

commit 3b4239fbd9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Sep 26 11:43:38 2016 -0700

    [Selection] Use AngularView for context menus

commit 15ef89f455
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Sep 26 11:38:37 2016 -0700

    [Selection] Bring over context menu template

commit c9a0a469f6
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Sun Sep 25 20:30:42 2016 -0700

    [Selection] Position context menus

commit f926bd9762
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Sun Sep 25 19:38:03 2016 -0700

    [Selection] Position overlays

commit d79392aeaa
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Sun Sep 25 18:26:00 2016 -0700

    [Selection] Begin integrating OverlayManager

commit 9a5bda4917
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Sun Sep 25 18:22:07 2016 -0700

    [Selection] Sketch in overlay manager

commit 407550e6f4
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:48:43 2016 -0700

    [Selection] Inject actionRegistry

commit 8b44b44e38
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:46:45 2016 -0700

    [Selection] Generalize Registry

commit 8dfa8df28a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:45:46 2016 -0700

    [Selection] Allow providers to return array

    ...to allow one-to-many providers for actions, as is useful
    for Create et al (and, in this specific case, to support
    adapters.)

commit 9e19296b14
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:35:40 2016 -0700

    [Selection] Add ActionRegistry

commit 106632c21c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:32:40 2016 -0700

    [Selection] Remove unused import

commit 235032a571
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:27:39 2016 -0700

    [Selection] Wire in new contextmenu

commit db41f6e64f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:19:16 2016 -0700

    [Selection] Obey priority order

commit e83e0da521
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:16:32 2016 -0700

    [Selection] Export openmct from main.js

commit c411f8fbe3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 23 15:07:03 2016 -0700

    [Selection] Go through openmct API

commit 4ce952846c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 22 11:51:00 2016 -0700

    [Selection] Expose context menu adapter

commit fdab4a614f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 22 11:48:44 2016 -0700

    [Selection] Expose contextual gesture

commit 152f55652f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 22 11:46:37 2016 -0700

    [Selection] Add adapter for context menu

commit c46c42e576
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 15:39:56 2016 -0700

    [Selection] Sketch in AngularView

    ...for use in the adapter layer.

commit 75bf956c3d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 14:54:22 2016 -0700

    [Selection] Use context typedef

commit 0a44c48338
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 13:27:59 2016 -0700

    [Selection] Sketch in context menu gesture

commit e4c3412e8a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 13:16:24 2016 -0700

    [Selection] Sketch in context menu view

commit 4e1cfac4b9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 12:30:36 2016 -0700

    [Selection] Expose inspector registry

commit 0a64e9f515
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 12:29:43 2016 -0700

    [Selection] Add ViewRegistry

commit 7341ed9d03
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 12:26:57 2016 -0700

    [Selection] Handle selection changes

    ...from the InspectorRegion

commit e2631bdcfd
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 11:27:24 2016 -0700

    [Selection] Listen/unlisten to selection

    ...from the inspector region

commit 773a7c0c24
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 21 11:25:21 2016 -0700

    [Selection] Begin adding Inspector region

commit fdcba66558
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 14 11:54:19 2016 -0700

    [Selection] Add legacy bundle

    ...to act as an adapter to legacy registration API

commit 3b1ed7821f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 14 11:50:33 2016 -0700

    [Selection] Add openmct module

    ...to expose selection APIs

commit 1be517f3ea
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 14 11:46:06 2016 -0700

    [Selection] Don't reuse old paths for new items

commit 5e3dcadfa4
Merge: fd97f4d f732387
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 14 11:06:05 2016 -0700

    Merge remote-tracking branch 'origin/master' into subobject-selection-1126

    Conflicts:
    	bower.json
    	main.js
    	test-main.js

commit 45ecc7bb2b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 14:10:51 2016 -0700

    [API] Ascending/descending order

commit a3c3f997cf
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 13:25:05 2016 -0700

    [API] Move down TC example

    ...to come after telemetry usage example

commit 1ae3ce57d0
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 13:23:06 2016 -0700

    [API] Telemetry registration example

commit 616e2b4d77
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 13:10:48 2016 -0700

    [API] Exemplify mutate/observe

commit 0e7d812db7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 13:04:30 2016 -0700

    [API] Document ObjectAPI registration

commit c074f29a07
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 11:26:13 2016 -0700

    [API] Add gesture example

commit 92118d353e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 11:24:01 2016 -0700

    [API] Add Time Conductor example

commit b111eeff07
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 11:16:24 2016 -0700

    [API] Update reference

commit 8042e84911
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 11:15:26 2016 -0700

    [API] Add composition-related content

commit 631c4b5dda
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 11:06:27 2016 -0700

    [API] Describe composition property

commit c6baf2dc1f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:58:00 2016 -0700

    [API] Make CompositionCollection an interface

commit 4db7e12d45
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:55:34 2016 -0700

    [API] Add example for views

commit b1799c695e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:46:49 2016 -0700

    [API] Add DomainObject

commit 5761c889bc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:41:48 2016 -0700

    [API] Move MutableObject methods to ObjectAPI

commit 97cf26d438
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:27:42 2016 -0700

    [API] Telemetry provider

commit c4b83b7589
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:18:43 2016 -0700

    [API] Account for provider strategies

commit d56f30c15a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:15:57 2016 -0700

    [API] TelemetryRequest

commit 7279c5d857
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:12:47 2016 -0700

    [API] Mark properties as optional

commit 5d53ab83a3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:11:52 2016 -0700

    [API] More TelemetryProperty properties

commit 4565e45b36
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 10:08:07 2016 -0700

    [API] Add TelemetryProperty for metadata

commit 5950daa6cb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 09:33:21 2016 -0700

    [API] Move out composition policy

commit 60800c913e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 09:28:26 2016 -0700

    [API] Gestures

commit 649567176d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 09:21:18 2016 -0700

    [API] Notes on context

commit 1df573b8c6
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 08:50:20 2016 -0700

    [API] Move types into registry

commit bc4ca10e53
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 08:45:18 2016 -0700

    [API] Separate out ViewRegistry

commit 1338f02541
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 08:32:21 2016 -0700

    [API] Clean up telemetry API docs slightly

commit 1cc6833c30
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 08:26:32 2016 -0700

    [API] Add request/subscribe JSDoc

commit a7a47a36d6
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 08:10:40 2016 -0700

    [API] Remove extraneous return jsdoc

commit 851d0f0d63
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Sep 7 08:09:37 2016 -0700

    [API] Clean up Composition API

commit 5a129de73d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 16:32:54 2016 -0700

    [API] Clarify language

commit 0cf634a412
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 16:30:05 2016 -0700

    [API] Add more front-page content

commit 702d7acf64
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 16:18:42 2016 -0700

    [API] Begin adding front page content

commit 69a500bf44
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 16:07:49 2016 -0700

    [API] Dedocument Selection

    ...and add a description to MCT#conductor

commit 82e5b009e8
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 13:58:19 2016 -0700

    [API] Move Identifier typedef

commit aafd0731ec
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 13:47:59 2016 -0700

    [API] Remove 'the API' section

    ...as this is now generated from JSDoc, more or less

commit c9705a5f2c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 13:46:02 2016 -0700

    [API] Normalize line length

commit 7cc4a1262c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 13:31:07 2016 -0700

    [API] Proofread intro

commit 02904a6081
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 13:28:49 2016 -0700

    [API] Link to openmct module in the preamble

commit 7ce9bd969a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 10:14:04 2016 -0700

    [API] Telemetry JSdoc

commit 8cafd2da7e
Merge: 6264ab7 bccd018
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 10:06:30 2016 -0700

    Merge remote-tracking branch 'origin/api-tutorial/telemetry' into api-1110

commit 6264ab75f3
Merge: 7a5cad2 b4dc502
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 10:03:59 2016 -0700

    Merge remote-tracking branch 'origin/api-tutorials' into api-1110

    Conflicts:
    	src/MCT.js
    	src/api/composition/CompositionCollection.js
    	src/api/composition/DefaultCompositionProvider.js
    	src/api/objects/MutableObject.js

commit 7a5cad20ec
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:58:08 2016 -0700

    [API] Add JSDoc for Dialog

commit 4de069b393
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:54:51 2016 -0700

    [API] JSDoc for Selection

commit 70abd5c1f9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:47:06 2016 -0700

    [API] Document start event

commit 2a3a61da86
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:45:24 2016 -0700

    [API] Fix event memberofs in TimeConductor

commit 018bd022cc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:42:04 2016 -0700

    [API] Document View API

commit 4739b36bc3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:14:04 2016 -0700

    [API] Add metadata to View jsdoc

commit c9b1035a6d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 09:13:01 2016 -0700

    [API] Document Type.check

commit 6768328475
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 08:43:01 2016 -0700

    [API] Document MutableObject

commit 60c179eac3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 08:32:18 2016 -0700

    [API] Add missing parameter names

commit a20e8d69b5
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 08:31:42 2016 -0700

    [API] More Objects doc

commit 1abcb248fe
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 08:13:26 2016 -0700

    [API] Include API.md as main page

commit a8151f5f22
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 08:09:03 2016 -0700

    [API] Document CompositionProvider

commit cdf21f3763
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 07:58:52 2016 -0700

    [API] Mark Composition as instance method

commit 341bceb4e2
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Sep 6 07:57:44 2016 -0700

    [API] Document composition API

commit 0470a02272
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 16:04:38 2016 -0700

    [API] Reference ObjectAPI

commit e3dc26c130
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 15:25:28 2016 -0700

    [API] Clean up docs

commit 96c3d1cac2
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 15:19:20 2016 -0700

    [API] Use JSDoc config

commit 2af778145d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 15:16:11 2016 -0700

    [API] Clean up JSDoc slightly

commit 5743eeb33a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 15:03:12 2016 -0700

    [API] Reference EventEmitter

commit f06f714bdc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 15:02:18 2016 -0700

    [API] Document some public fields

commit d592bd1035
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 14:58:06 2016 -0700

    [API] Give up on borrows-style documentation

commit b5f62541ce
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Sep 2 14:54:27 2016 -0700

    [API] Add watch for API docs

commit 33ced4bccf
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 15:51:25 2016 -0700

    [API] Expose MCT on openmct

commit e37510dbab
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 15:13:52 2016 -0700

    [API] Ignore internal API after processing

commit f27c41014d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 14:50:13 2016 -0700

    [API] JSDoc for openmct.start()

commit bd796f2beb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 14:44:24 2016 -0700

    [API] Simple constructor documentation

commit bcc32c76d0
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 14:42:55 2016 -0700

    [API] Module-level JSDoc

commit ff2ec6690a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 14:35:52 2016 -0700

    [API] Rename module to openmct

commit 1e0fb3611d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Sep 1 12:34:54 2016 -0700

    [API] Render API docs to HTML

commit 1d4f36a7d9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 26 11:48:27 2016 -0700

    [API] Include JSDoc for mct namespace only

commit 0f96fbdd62
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 26 11:31:56 2016 -0700

    [API] Treat mct as a namespace

commit e05fb57fe4
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 26 09:47:50 2016 -0700

    [API] Quasi-sensible JSDoc starting point

commit 185cdcab08
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 26 09:31:07 2016 -0700

    [API] Begin adding mct.js

    ...which will provide an instance of OpenMCT at startup,
    as well as house documentation for entry point to public API.

commit 50ccad5aaa
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 26 09:26:12 2016 -0700

    [API] Rename MCT to OpenMCT

commit 6a23df9454
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 14:54:07 2016 -0700

    [API] Add JSDoc for MCT

commit ab5b1d3754
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:49:21 2016 -0700

    [API] Add JSDoc task

commit b309f26b56
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:38:44 2016 -0700

    [API] Add gulp-jsdoc-to-markdown dep

    ...to aid in generating API docs as a measure of API completeness
    and consistency, for #1110 and #1111

commit b4dc50295c
Merge: 02aa08a 382dde3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:26:50 2016 -0700

    Merge pull request #1131 from nasa/open1094

    Resolve synchronization issues with MutableObject

commit 382dde300a
Merge: b1b8df4 02aa08a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:25:54 2016 -0700

    Merge remote-tracking branch 'origin/api-tutorials' into open1094

    Conflicts:
    	index.html
    	tutorials/todo/todo.js

commit 02aa08a3ef
Merge: c95d9c7 d73c505
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:19:14 2016 -0700

    Merge pull request #1121 from nasa/api-containment

    [API] Containment

commit c95d9c7956
Merge: 1147f3a 2463e4d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:17:26 2016 -0700

    Merge pull request #1107 from nasa/api-type-forms

    [API] Handle forms with a "properties" region

commit fd97f4db41
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 25 13:15:37 2016 -0700

    [Selection] Begin implementing Hover gesture

commit b1b8df4d87
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Tue Aug 23 13:57:12 2016 +0100

    Use MutationCapability

commit 3228a83802
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 16:31:27 2016 -0700

    [Selection] Begin adding hover gesture

commit 1dba551fc6
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 16:07:01 2016 -0700

    [Selection] Force single select

    ...as a simplifying assumption for the initial prototype.

commit 20f3b57ddd
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 14:18:26 2016 -0700

    [Selection] Release listeners

commit 58787c4436
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 14:13:46 2016 -0700

    [Selection] Remove obsolete include

commit 2a45893602
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 13:22:17 2016 -0700

    [Selection] Begin adding context management

commit a94ab44431
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 12:24:40 2016 -0700

    [Selection] Toggle selected class

commit cc9efdff31
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Aug 22 12:17:29 2016 -0700

    [Selection] At Path.toArray

commit bd3c6665fb
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Mon Aug 22 14:25:39 2016 +0100

    Added bridge between old and new event models

commit 10e90519c0
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 19 19:10:06 2016 -0700

    Tidy todo views, remove unnecessary code

commit d341a8be97
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Aug 19 19:07:53 2016 -0700

    Selection changes include new selection

commit 8c439d8109
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Sun Aug 21 23:01:48 2016 -0700

    Adding compatibility between old and new style mutation events

commit 9c88b7ce1d
Author: Henry <akhenry@gmail.com>
Date:   Thu Aug 18 10:38:16 2016 -0700

    Removed setters from MutableObject and fixed non-working todo list tutorial

    Refactoring MutableObject

    Fixed non-working todo example

commit 6e664003e3
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 18 13:11:09 2016 -0700

    [Sub-object] Sketch in SelectGesture

commit 70d804fc49
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 18 11:54:05 2016 -0700

    [Sub-object] Emit change events

commit 06c184821e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 18 11:51:09 2016 -0700

    [Sub-object] Add Path.append

commit b76be3d2e5
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 18 11:45:13 2016 -0700

    [Sub-object] Basic Path/Selection implementation

commit 8934ba96f7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 18 10:33:34 2016 -0700

    [Sub-object] Add empty Selection class

commit 3fb4ce7819
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 11:43:35 2016 -0700

    [Sub-object] Add EventEmitter dependency

    Selection state will be represented in #1126 by an EventEmitter.

commit 2463e4d59f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 12 12:54:39 2016 -0700

    [API] Update Dialog API usage

commit d73c505bea
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 12 11:17:00 2016 -0700

    [API] Fix typo, add missing this

commit 831ecc59d9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 12 10:24:59 2016 -0700

    [API] Wire in canContain via policy

commit 1de26d3c5d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 12 09:30:02 2016 -0700

    [API] Throw error on containment violation

commit 11409ce509
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Aug 12 09:27:46 2016 -0700

    [API] Add containment methods

commit 93872ce074
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 11 16:04:26 2016 -0700

    [API] Expose Dialog as constructor

    ...and use it that way from todo plugin

commit 8861644f2d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 11 16:02:04 2016 -0700

    [API] Adjust Dialog API

    ...to allow OK button to be enabled/disabled.

commit d4948f771b
Merge: 0656a29 8295a0b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 11 15:31:11 2016 -0700

    Merge branch 'api-todo-update' into api-type-forms

commit 8295a0bed1
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 11 15:29:46 2016 -0700

    [API] Update todo tutorial

    ...to expect new domain object API (instead of explicitly
    wrapping it.)

commit 0656a298da
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Aug 4 14:00:39 2016 -0700

    [API] Remove test usage of properties region

commit fe2ce91d50
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 16:16:22 2016 -0700

    [API] Show a custom view in dialog

commit 14f30b2489
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 16:05:02 2016 -0700

    [API] Restrict dialog overrides

    ...to those domain objects which have some view for the
    properties region registered.

commit 62d90a8114
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 15:57:15 2016 -0700

    [API] Show dialog via mct

commit 87682607a5
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 15:53:07 2016 -0700

    [API] Rename dependency in adapter layer

commit 7bf265b478
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 15:52:52 2016 -0700

    [API] Move mct service up

commit 1d31fe8d02
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 15:48:28 2016 -0700

    [API] Override dialogService in actions

    An ugly hack to allow dialogs to be shown for Save As
    and Edit Properties, without requiring form generation.
    This will permit views to be shown instead in certain
    cases, https://github.com/nasa/openmct/pull/999#issuecomment-236045158

commit bfdbc71e40
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Jul 28 15:34:03 2016 -0700

    [API] Define a properties region

commit 1147f3aa47
Author: Pete Richards <pete@pete-richards.com>
Date:   Mon Jul 25 14:38:44 2016 -0700

    tutorials: support arbitrary hosting directory (#1097)

    * Include all bundles in artifact

    change bundle registry such that all bundles are immediately registered,
    but must be specifically enabled.  A default registry class enables bundles
    that make sense for demonstration purposes.

    Added methods to the registry to allow enabling and disabling of bundles
    without having to load additional files.

    * support alternate asset/worker paths

    Change the gulp glob for assets to copy over a more minimal
    set of files-- only css, fonts, and images.  Results in a
    smaller distributable archive.

    Update stylesheet loader to use a constant for the assets path.

    This can be customized at run time via MCT.setAssetPath() to
    allow MCT to be hosted in various locations.

    Update worker loader to support loading workers from blobs to
    support packaging as standalone file.

    * Load templates via requirejs

    * [gulp] lazy-require where reasonable

    Require things right before starting tasks to reduce gulp start up time.

    * document setAssetPath

commit 719f9f45e8
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 22 14:09:31 2016 -0700

    [API] Add documentation for selection state (#1096)

commit 95ef70a24c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 22 13:56:45 2016 -0700

    [API] Use selection state from toolbar (#1070)

    * [API] Allow selection

    * [API] Keep in sync using model

    * [API] Add selection as EventEmitter

    * [API] Use selection from ToDo tutorial

    * [API] Restore selection functionality

commit d5aa998b4c
Author: Pete Richards <pete@pete-richards.com>
Date:   Fri Jul 22 13:53:03 2016 -0700

    [API] Draft Composition API (#1068)

    * [Objects] util for equality checking

    Add a method for checking object equality, useful for other services.

    * [Composition] Draft Composition API

    Draft composition API.  Composition collections provide an observable
    for watching and mutating the composition of an object.

    Composition providers implement the loading and modification of composition.

    The default composition provider uses the composition attribute of
    domain objects, while allowing other providers to implement their
    own loading and mutation behavior.

    * add todo about event listener bindings

    * [Type] Add form property for defining form fields

    * [tutorial] Add Composition tutorial

    * provider doesn't have to implement events, load returns array of children

    * use new composition in old api

    * correct key name

    * Override instantiate to provide model ids

    Override instantiate in public API adapter to prevent making changes to
    platform code.  Instantiate now passes the id of the domain object with the
    model so that capabilities can convert to a new-style domain object and use
    that to detect functionality.

    * Implement mutation capability with decorator

    Implementation mutation capability override with decorator to adapter code
    outside of platform.  Capability override ensures that models are kept in
    sync even though they are no longer shared objects.

    * override composition cleanly

    Override composition capability without making changes inside platform.

    * cleanup after temporary collections

    * remove unused try/catch

commit 7890fcae69
Author: Pete Richards <pete@pete-richards.com>
Date:   Thu Jul 21 14:39:02 2016 -0700

    tutorial consistency . (#1079)

    * [API] use new-style objects consistently

    * rewrite todo tutorial in test-api.html

    * [API] Add API doc, update object API

    * [Tutorials] Rename tutorials, remove old

    * Fix Links

    * updates

    * initial

    * hope this works

    * Object Utils always return new objects instead of mutating existing objects

    * keep domain object model in-sync when listening

    Keep the domain object model in sync with the latest version when
    listening for mutation events.

    * Remove old-style plugins

    * Update views to use new API

    * Tidy Code

    * Update API Docs

    * Add Plugin API and Example

commit 18843cee48
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Jul 20 13:46:03 2016 -0700

    [API] Change approach to applies-to checking (#1072)

    * [API] Allow selection

    * [API] Keep in sync using model

    * [API] Add selection as EventEmitter

    * [API] Use selection from ToDo tutorial

    * [API] Add appliesTo-style method

    * [API] Remove destroy method, simplify show

    * [View] Return a no-op

    * [API] Use new applies-to checking

    * [API] Rename TodoView to TodoRenderer

    * [API] Rewire views

    * [API] Wire up so that things work

    * [API] Begin adding container

    ...to attempt to give views something to listen to for destroy-like
    events

    * [API] Begin using regions...

    * [API] Begin working through Region stuff

    * [API] Revise Region API

    ...for similarity with Marionette,
    https://github.com/nasa/openmct/pull/1072#issuecomment-230902986

    * [API] Begin separating View, ViewDefinition

    * [API] Finish separating View/ViewDefinition

    * [API] Update MCTView

    ...to reflect updates to Region/View/ViewDefinition APIs

    * [API] Simplify View API

    ...merging closely-related populate/show methods, and restoring
    compatibility with todo tutorial

    * [API] Wire in from todo tutorial plugin

    * [API] Switch back to region constants

    * [API] Update method signature, add JSDoc

    * [API] Update variable name

    * [API] Remove unnecessary separate regions file

    * [API] Relocate Region; not external api

    * [API] Revert changes to api.js

    ...as these ended up becoming entirely superficial

commit 1879c122c7
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Thu Jul 7 14:30:45 2016 -0700

    Mutation API (#1074)

    * [API] Allow selection

    * [API] Keep in sync using model

    * [API] Add selection as EventEmitter

    * [API] Use selection from ToDo tutorial

    * Object events prototype

    * Added examples

    * Transitional API

    * Modified todo list code to work with new setters

    * [API] Removed emitting of events on container when property changes value to remove ambiguity. Listeners must be listening to the same path used in the setter to catch changes

commit d7ddb96c4e
Author: Pete Richards <pete@pete-richards.com>
Date:   Thu Jul 7 14:25:23 2016 -0700

    [API] UMD Packaging (#1078)

    * [Bundle] load filter with requirejs

    * [Build] Use almond, wrap in UMD

    Use almond for built version of application and wrap in UMD so that
    it supports requirejs, commonjs, and basic browser loading.

    * [Main] Can choose where to load app

    MCT.run allows you to specify a dom element to load application
    within.  If element is not specified, will use body.

    * [MCT] set class on injected div

    Set class on injected div so extra markup is not required.

    * [Build] Re-enable optimize

    * Add minimal bootstrap example

commit bccd018d97
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Jul 1 10:26:49 2016 -0700

    Telemetry Draft

commit b55668426d
Merge: 47a543b 5b656fa
Author: Andrew Henry <andrew.k.henry@nasa.gov>
Date:   Fri Jul 1 10:22:16 2016 -0700

    Merge pull request #1062 from nasa/tc-redux

    [Time Conductor] V2 Public API

commit 5b656faa9d
Author: Henry <akhenry@gmail.com>
Date:   Thu Jun 30 20:50:03 2016 -0700

    Added tests

commit 8d2c489fa9
Author: Pete Richards <pete@pete-richards.com>
Date:   Thu Jun 30 16:54:56 2016 -0700

    [TimeConductor] Set bounds on timeSystem Change

    Always set bounds on timeSystem change as not having valid bounds would
    put views in inconsistent states.

commit 4366b0870d
Author: Henry <akhenry@gmail.com>
Date:   Wed Jun 29 12:51:02 2016 -0700

    [Time Conductor] API redesign. Initial commit of V2 public API. Addresses #933

commit 47a543beb7
Merge: 06f87c1 c944080
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 1 10:17:36 2016 -0700

    Merge pull request #1067 from nasa/api-css

    [API] Remove stylesheet from example

commit 06f87c1472
Merge: 14a56ea c9c41cd
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 1 10:13:29 2016 -0700

    Merge pull request #1029 from nasa/api-toolbar-add-only

    [API Prototype] Add toolbar

commit c9c41cdcc8
Merge: 370b515 14a56ea
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 1 10:10:33 2016 -0700

    Merge remote-tracking branch 'origin/api-tutorials' into api-toolbar-add-only

    Conflicts:
    	src/MCT.js

commit 14a56ea17e
Merge: d51e6bf b2e7db7
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 1 10:09:29 2016 -0700

    Merge pull request #1028 from nasa/api-view

    [API Prototype] Support imperative view registration

commit b2e7db71cc
Merge: 96316de d51e6bf
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 1 10:08:05 2016 -0700

    Merge remote-tracking branch 'origin/api-tutorials' into api-view

    Conflicts:
    	src/MCT.js
    	src/api/api.js

commit d51e6bfd92
Merge: 5de7a96 d475d76
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jul 1 10:03:42 2016 -0700

    Merge pull request #1030 from nasa/api-tutorial/objects

    Api tutorial/objects

commit d475d767d5
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Jun 17 17:05:05 2016 -0700

    add grootprovider

commit a63e053399
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Jun 17 16:54:32 2016 -0700

    [ObjectAPI] Draft new Object API

    Rought prototype of new object API.

commit 370b515c23
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 14:21:37 2016 -0700

    [API] Synchronize view to model

commit 4a50f325cb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 14:18:51 2016 -0700

    [API] Allow tasks to be added

commit dbe6a4efc1
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 14:05:00 2016 -0700

    [API] Title dialog

commit 13920d8802
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 14:00:45 2016 -0700

    [API] Resolve/reject from dialog

commit b6a8c514aa
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 13:51:15 2016 -0700

    [API] Show dialog from toolbar

commit e4a4704baa
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 13:41:59 2016 -0700

    [API] Listen to add/remove buttons

commit be0029e59a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 13:38:54 2016 -0700

    [API] Get todo toolbar to look right

commit 9cb273ef0a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 13:30:08 2016 -0700

    [API] Get registered toolbar to appear

commit eec9b1cf4c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 13:10:24 2016 -0700

    [API] Support distinct region registration

commit 1f96e84542
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 12:16:46 2016 -0700

    [API] Override template to allow toolbar injection

commit c289a27305
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 11:43:18 2016 -0700

    [API] Begin adding toolbar

commit c944080790
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 11:27:04 2016 -0700

    [API] Remove stylesheet from example

    No need to provide custom API for this.

commit 96316de6e4
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 11:16:08 2016 -0700

    [API] Update view API

commit 2240a87ddc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 10:53:56 2016 -0700

    [API] Move view off of type

commit d891affe48
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 10:21:00 2016 -0700

    [API] Move view off of type

commit 21a618d1ce
Merge: 580a4e5 09a833f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 10:19:44 2016 -0700

    Merge branch 'api-type-proto' into api-view

commit 5de7a96ccc
Merge: 9c4e17b 09a833f
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 17 10:18:42 2016 -0700

    Merge pull request #1010 from nasa/api-type-proto

    [API Prototype] Type registration

commit 09a833f524
Merge: c4fec1a 9c4e17b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Jun 10 13:28:09 2016 -0700

    Merge branch 'api-tutorials' into api-type-proto

commit 580a4e52b5
Merge: 4ca2f51 9c4e17b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Jun 7 14:01:08 2016 -0700

    Merge branch 'api-tutorials' into api-type-driven

commit 9c4e17bfab
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Jun 7 13:14:36 2016 -0700

    [Tutorials] Add telemetry tutorial

commit d3e5d95d6b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Jun 7 13:00:38 2016 -0700

    [Tutorials] Add example server

commit c70793ac2d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Jun 7 12:55:29 2016 -0700

    [Tutorials] Add remainder of bargraph

commit a6ef1d3423
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Jun 7 12:49:38 2016 -0700

    [Tutorials] Add Bar Graph tutorial

commit 4ca2f51d5e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 17:08:04 2016 -0700

    [API] Use subclass style

commit 86ac80ddbd
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:56:08 2016 -0700

    [API] Persist mutations

commit 0525ba6b0b
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:55:10 2016 -0700

    [API] Check/uncheck todos

commit a79e958ffc
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:46:06 2016 -0700

    [API] Show tasks from todo

commit 03cb0ccb57
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:36:55 2016 -0700

    [API] Get View to render

commit 7205faa6bb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:27:47 2016 -0700

    [API] Add adapter bundle

commit 136f2ae785
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:19:20 2016 -0700

    [API] Add MCTView directive as an adapter

commit a07e2fb8e5
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 16:08:43 2016 -0700

    [API] Implement View

commit 55b531bdeb
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 15:49:16 2016 -0700

    [API] Sketch in view instantiation

commit 7ece5897e8
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 15:31:54 2016 -0700

    [API] Begin adding View

commit a29c7a6eab
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 13:46:30 2016 -0700

    [API] Deangularize todo templates

commit c4fec1af6a
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 13:31:30 2016 -0700

    [API] Move type toward a newer API

commit a6996df3df
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 13:17:16 2016 -0700

    [API] Begin moving out type

commit 0c660238f2
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 11:49:43 2016 -0700

    [API] Add MCT class

commit b73b824e55
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 11:43:35 2016 -0700

    [API] Add EventEmitter dep

commit 1954d98628
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri May 27 11:30:53 2016 -0700

    [Tutorials] Remove diff markings in TodoController

commit 7aa034ce23
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu May 26 16:05:38 2016 -0700

    Add todo tutorial

commit 385dc5d298
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu May 26 15:36:09 2016 -0700

    Begin adding tutorials
2016-09-30 17:31:33 -07:00
5b0fa90e39 Merge pull request #1220 from nasa/hasta-la-vista-jspdf
[export] remove pdf export
2016-09-30 17:01:23 -07:00
ae6f6565fa [export] remove pdf export
Remove pdf export with extreme prejudice due to issues with build process.

Fixes https://github.com/nasa/openmct/issues/1217
2016-09-30 16:54:42 -07:00
c874ae7afd Merge remote-tracking branch 'origin/master' into api-platform-updates 2016-09-30 14:46:37 -07:00
c27c0c5b8c Merge pull request #1215 from nasa/fix-jspdf-version-1214
[Bower] specify jspdf minor version
2016-09-30 14:45:59 -07:00
ed102492e5 [Bower] specify jspdf minor version
Specify jsPDF minor version to avoid updating to v1.3.0, which appears to
have problems with requirejs bundling.

Fixes https://github.com/nasa/openmct/issues/1214
2016-09-30 12:49:02 -07:00
e077f9ee18 [Timeline] Fix logic error
Issue #1185. Also removed direct modification of domain object.
2016-09-30 21:34:03 +02:00
e9f4db7719 Merge branch 'master' of github.com:nasa/openmct into open1185 2016-09-30 21:25:36 +02:00
34e07b938d [API] Update StyleSheetLoaderSpec
...to reflect asset path details
2016-09-30 10:42:48 -07:00
230230aa94 [API] Remove js extension from import
...to avoid confusing RequireJS and breaking test suite
2016-09-30 10:37:31 -07:00
901846e6c1 [API] Use correct property for RT table template 2016-09-30 10:29:03 -07:00
a93f41f1c3 [API] Miscellaneous platform updates
Adds miscellaneous platform updates to include templates
via the RequireJS text plugin; to support modification of
asset paths; and to support priority order for gestures.

Supports integration of new API, #1124.
2016-09-30 10:25:22 -07:00
77d4760945 fixed new code indication 2016-09-28 15:13:23 +03:00
a34e89d56a [Edit] Bind action to .perform() inside mct-button 2016-09-27 21:19:25 +03:00
4ec0d0633d fix module reference 2016-09-27 16:08:25 +03:00
4b51e604a7 [Edit] Switch other edit actions to mct-control 2016-09-24 20:43:35 +03:00
3d17435438 [Test] Update spec to use SOC percentage 2016-09-20 17:42:34 +09:00
f185254114 [Formatting] Fix missing spaces 2016-09-20 17:41:45 +09:00
943e2ebe14 [Timeline] Convert SOC to use percentages
Also includes updated validation params which allow for floats to a maximum
of 100 as well as a percentage sign which is later removed.
2016-09-20 17:40:08 +09:00
d913798d5b [Timeline] Add battery starting state-of-charge
Issue #1185
2016-09-18 22:52:41 +09:00
385d90b056 [Persistence] Fix code style 2016-08-08 13:51:10 -07:00
ecf526aa03 [Persistence] Add JSDoc for NestedTransaction 2016-08-08 13:49:34 -07:00
a35b158fd1 [Persistence] Add JSDoc for Transaction 2016-08-08 13:48:19 -07:00
2ebf05ae5b [Persistence] Test NestedTransaction 2016-08-08 13:41:13 -07:00
850da9de52 [Persistence] Fix member reference in NestedTransaction 2016-08-08 13:40:50 -07:00
353c24c70e [Persistence] Invoke parent constructor 2016-08-08 13:39:03 -07:00
73d10ab093 [Persistence] Test Transaction 2016-08-08 13:29:39 -07:00
668b7b6a39 [Persistence] Add empty specs for Transactions 2016-08-08 13:21:48 -07:00
70c072be0b [Persistence] Test more cases
Add more test cases for TransactingMutationListener to
distinguish active-transaction case from no-transaction
case.
2016-08-08 13:18:40 -07:00
eb2fbcd8d0 [Persistence] Cover TransactingMutationListener
Add test cases sufficient for line coverage of
TransactingMutationListener.
2016-08-08 12:34:46 -07:00
02f34d1c04 [Persistence] Begin testing TransactingMutationListener 2016-08-08 12:28:13 -07:00
7265b241a2 Merge remote-tracking branch 'origin/master' into persist-on-mutation-825 2016-07-28 13:21:45 -07:00
771542ee5f [Persistence] Reliably return promises 2016-07-26 15:32:59 -07:00
b60eff2f5e [Persistence] Update bundle definition 2016-07-26 15:26:43 -07:00
f6d6cb929f [Persistence] Add to transaction on mutation 2016-07-26 15:24:16 -07:00
6f2c80bc2e [Persistence] Use NestedTransaction 2016-07-26 15:20:40 -07:00
0fe0b21eda [Persistence] Add NestedTransaction 2016-07-26 15:18:21 -07:00
0bedc227f4 [Persistence] Allow nested transactions 2016-07-26 10:10:15 -07:00
6c4419fb72 [Persistence] Refactor out Transaction
https://github.com/nasa/openmct/pull/874#issuecomment-233068178
2016-07-25 16:45:32 -07:00
766e94ed62 Merge remote-tracking branch 'origin/master' into persist-on-mutation-825b
Conflicts:
	platform/core/src/capabilities/PersistenceCapability.js
2016-07-25 16:30:49 -07:00
fb8fe93529 [Persistence] Fix mistake in JSDoc
https://github.com/nasa/openmct/pull/874#discussion_r64639089
2016-05-25 13:06:58 -07:00
26839c7fd1 [Persistence] Fix code style after merge 2016-05-20 14:27:53 -07:00
264896c264 Merge branch 'master' into persist-on-mutation-825
Conflicts:
	platform/commonUI/edit/src/actions/RemoveAction.js
	platform/commonUI/edit/test/actions/EditAndComposeActionSpec.js
	platform/commonUI/edit/test/actions/RemoveActionSpec.js
	platform/entanglement/src/services/LinkService.js
	platform/features/timeline/src/controllers/drag/TimelineDragHandler.js
	platform/features/timeline/src/controllers/swimlane/TimelineSwimlaneDecorator.js
	platform/features/timeline/test/controllers/drag/TimelineDragHandlerSpec.js
	platform/features/timeline/test/controllers/swimlane/TimelineSwimlaneDropHandlerSpec.js
2016-05-20 14:26:39 -07:00
e3208187bf Merge branch 'master' into persist-on-mutation-825
Conflicts:
	platform/commonUI/edit/test/actions/EditAndComposeActionSpec.js
2016-05-20 10:59:54 -07:00
bcf85db9c4 [Persistence] Delegate new 'persisted' method 2016-05-19 13:31:27 -07:00
f1e81c359e [Persistence] Satisfy JSHint 2016-05-19 12:17:20 -07:00
8279acc9a5 [Persistence] Don't expect persist calls in PropertiesAction spec 2016-05-19 12:04:08 -07:00
63438ad9ba [Persistence] Don't expect persist calls in LinkAction spec 2016-05-19 12:02:42 -07:00
467f4d2257 [Persistence] Don't expect persist calls in RemoveAction spec 2016-05-19 12:00:51 -07:00
a5aaa6f103 [Persistence] Don't expect persist calls in LocationCapability spec 2016-05-19 11:55:05 -07:00
9b273bc148 [Persistence] Don't expect persist calls in EditRepresenter spec 2016-05-19 11:52:58 -07:00
0aba9122a1 [Persistence] Don't expect persist calls in LinkService spec 2016-05-19 11:51:50 -07:00
ac3706dfb6 [Persistence] Don't expect persist calls in specs 2016-05-19 11:50:12 -07:00
3905171457 [Persistence] Don't expect persist calls in spec 2016-05-19 11:48:16 -07:00
1e03f22086 [Persistence] Don't expect persist calls in spec 2016-05-19 11:46:50 -07:00
360fdeaec8 [Persistence] Don't expect persist calls in spec 2016-05-19 11:44:26 -07:00
d5914dfde9 [Persistence] Remove caching of persistence capability
...as this no longer needs to be invoked directly.
2016-05-19 11:42:58 -07:00
d3f2a24267 Merge branch 'master' into persist-on-mutation-825
Conflicts:
	platform/core/src/capabilities/PersistenceCapability.js
	platform/features/timeline/src/controllers/swimlane/TimelineSwimlaneDropHandler.js
2016-05-19 11:41:08 -07:00
f85ac79b4a [Persistence] Remove persistence usage from TimelineSwimlaneDropHandler 2016-04-29 11:53:15 -07:00
bea9f22a0c [Persistence] Remove persistence usage from TimelineSwimlaneDecorator 2016-04-29 11:51:21 -07:00
3f330dccf1 [Persistence] Remove persistence usage from TimelineDragHandler 2016-04-29 11:50:02 -07:00
f7f934f0e8 [Persistence] Remove persistence usage from AbstractStartTimerAction 2016-04-29 11:40:06 -07:00
0e683acde1 [Persistence] Remove persistence usage from LinkService 2016-04-29 11:38:40 -07:00
dd6414daf0 [Persistence] Remove persistence usage from LocationCapability 2016-04-29 11:37:03 -07:00
8756b7213f [Persistence] Remove persistence usage from EditRepresenter 2016-04-29 11:35:00 -07:00
b0cbb5a2b4 [Persistence] Only auto-persist previously saved domain objects 2016-04-29 11:31:36 -07:00
6418b0c634 [Persistence] Avoid redundant calls to persistenceService
Mutation now triggers persistence; this means that some legacy code
does or may issue redundant calls to persistence after mutating.
To avoid issuing redundant calls all the way down to the
persistenceService, bail out of persist calls early if there are
no unsaved changes to persist.
2016-04-26 16:58:10 -07:00
433d26e703 [Persistence] Remove persistence usage from Remove action 2016-04-26 16:53:12 -07:00
c99ffcb1f4 [Persistence] Remove persistence call from compose action 2016-04-26 16:50:15 -07:00
ef815cf060 [Persistence] Remove persistence reference
...from composition capability (as persistence is now triggered,
albeit indirectly.)
2016-04-26 16:46:30 -07:00
7fb7a5452f [Persistence] Remove persistence usage from Edit Properties 2016-04-26 16:43:52 -07:00
4b641f8723 [Persistence] Expose PersistingMutationListener from bundle 2016-04-26 16:39:49 -07:00
0d312def27 [Persistence] Add PersistingMutationListener
...to automatically trigger persistence after mutation.
#825
2016-04-26 16:37:44 -07:00
396 changed files with 18830 additions and 6939 deletions

View File

@ -14,7 +14,8 @@
"nonew": true,
"predef": [
"define",
"Promise"
"Promise",
"WeakMap"
],
"shadow": "outer",
"strict": "implied",

339
API.md Normal file
View File

@ -0,0 +1,339 @@
# Open MCT API
The Open MCT framework public api can be utilized by building the application
(`gulp install`) and then copying the file from `dist/main.js` to your
directory of choice.
Open MCT supports AMD, CommonJS, and loading via a script tag; it's easy to use
in your project. The [`openmct`]{@link module:openmct} module is exported
via AMD and CommonJS, and is also exposed as `openmct` in the global scope
if loaded via a script tag.
## Overview
Open MCT's goal is to allow you to browse, create, edit, and visualize all of
the domain knowledge you need on a daily basis.
To do this, the main building block provided by Open MCT is the _domain object_.
The temperature sensor on the starboard solar panel,
an overlay plot comparing the results of all temperature sensor,
the command dictionary for a spacecraft,
the individual commands in that dictionary, your "my documents" folder:
All of these things are domain objects.
Domain objects have Types, so a specific instrument temperature sensor is a
"Telemetry Point," and turning on a drill for a certain duration of time is
an "Activity". Types allow you to form an ontology of knowledge and provide
an abstraction for grouping, visualizing, and interpreting data.
And then we have Views. Views allow you to visualize domain objects. Views can
apply to specific domain objects; they may also apply to certain types of
domain objects, or they may apply to everything. Views are simply a method
of visualizing domain objects.
Regions allow you to specify what views are displayed for specific types of
domain objects in response to different user actions. For instance, you may
want to display a different view while editing, or you may want to update the
toolbar display when objects are selected. Regions allow you to map views to
specific user actions.
Domain objects can be mutated and persisted, developers can create custom
actions and apply them to domain objects, and many more things can be done.
For more information, read on!
## Running Open MCT
Once the [`openmct`](@link module:openmct) module has been loaded, you can
simply invoke [`start`]{@link module:openmct.MCT#start} to run Open MCT:
```
openmct.start();
```
Generally, however, you will want to configure Open MCT by adding plugins
before starting it. It is important to install plugins and configure Open MCT
_before_ calling [`start`]{@link module:openmct.MCT#start}; Open MCT is not
designed to be reconfigured once started.
## Configuring Open MCT
The [`openmct`]{@link module:openmct} module (more specifically, the
[`MCT`]{@link module:openmct.MCT} class, of which `openmct` is an instance)
exposes a variety of methods to allow the application to be configured,
extended, and customized before running.
Short examples follow; see the linked documentation for further details.
### Adding Domain Object Types
Custom types may be registered via
[`openmct.types`]{@link module:openmct.MCT#types}:
```
openmct.types.addType('my-type', {
label: "My Type",
description: "This is a type that I added!",
creatable: true
});
```
### Adding Views
Custom views may be registered based on the region in the application
where they should appear:
* [`openmct.mainViews`]{@link module:openmct.MCT#mainViews} is a registry
of views of domain objects which should appear in the main viewing area.
* [`openmct.inspectors`]{@link module:openmct.MCT#inspectors} is a registry
of views of domain objects and/or active selections, which should appear in
the Inspector.
* [`openmct.toolbars`]{@link module:openmct.MCT#toolbars} is a registry
of views of domain objects and/or active selections, which should appear in
the toolbar area while editing.
* [`openmct.indicators`]{@link module:openmct.MCT#inspectors} is a registry
of views which should appear in the status area of the application.
Example:
```
openmct.mainViews.addProvider({
canView: function (domainObject) {
return domainObject.type === 'my-type';
},
view: function (domainObject) {
return new MyView(domainObject);
}
});
```
### Adding a Root-level Object
In many cases, you'd like a certain object (or a certain hierarchy of
objects) to be accessible from the top level of the application (the
tree on the left-hand side of Open MCT.) It is typical to expose a telemetry
dictionary as a hierarchy of telemetry-providing domain objects in this
fashion.
To do so, use the [`addRoot`]{@link module:openmct.ObjectAPI#addRoot} method
of the [object API]{@link module:openmct.ObjectAPI}:
```
openmct.objects.addRoot({ key: "my-key", namespace: "my-namespace" });
```
Root objects are loaded just like any other objects, i.e. via an object
provider.
### Adding Composition Providers
The "composition" of a domain object is the list of objects it contains,
as shown (for example) in the tree for browsing. Open MCT provides a
[default solution](#default-composition-provider) for composition, but there
may be cases where you want to provide the composition of a certain object
(or type of object) dynamically.
For instance, you may want to populate a hierarchy under a custom root-level
object based on the contents of a telemetry dictionary.
To do this, you can add a new CompositionProvider:
```
openmct.composition.addProvider({
appliesTo: function (domainObject) {
return domainObject.type === 'my-type';
},
load: function (domainObject) {
return Promise.resolve(myDomainObjects);
}
});
```
#### Default Composition Provider
The default composition provider applies to any domain object with
a `composition` property. The value of `composition` should be an
array of identifiers, e.g.:
```js
var domainObject = {
name: "My Object",
type: 'folder',
composition: [
{
key: '412229c3-922c-444b-8624-736d85516247',
namespace: 'foo'
},
{
key: 'd6e0ce02-5b85-4e55-8006-a8a505b64c75',
namespace: 'foo'
}
]
};
```
### Adding Telemetry Providers
When connecting to a new telemetry source, you will want to register a new
[telemetry provider]{@link module:openmct.TelemetryAPI~TelemetryProvider}
with the [telemetry API]{@link module:openmct.TelemetryAPI#addProvider}:
```
openmct.telemetry.addProvider({
canProvideTelemetry: function (domainObject) {
return domainObject.type === 'my-type';
},
properties: function (domainObject) {
return [
{ key: 'value', name: "Temperature", units: "degC" },
{ key: 'time', name: "UTC" }
];
},
request: function (domainObject, options) {
var telemetryId = domainObject.myTelemetryId;
return myAdapter.request(telemetryId, options.start, options.end);
},
subscribe: function (domainObject, callback) {
var telemetryId = domainObject.myTelemetryId;
myAdapter.subscribe(telemetryId, callback);
return myAdapter.unsubscribe.bind(myAdapter, telemetryId, callback);
}
});
```
The implementations for `request` and `subscribe` can vary depending on the
nature of the endpoint which will provide telemetry. In the example above,
it is assumed that `myAdapter` contains the specific implementations
(HTTP requests, WebSocket connections, etc.) associated with some telemetry
source.
## Using Open MCT
When implementing new features, it is useful and sometimes necessary to
utilize functionality exposed by Open MCT.
### Retrieving Composition
To limit which objects are loaded at any given time, the composition of
a domain object must be requested asynchronously:
```
openmct.composition(myObject).load().then(function (childObjects) {
childObjects.forEach(doSomething);
});
```
### Support Common Gestures
Custom views may also want to support common gestures using the
[gesture API]{@link module:openmct.GestureAPI}. For instance, to make
a view (or part of a view) selectable:
```
openmct.gestures.selectable(myHtmlElement, myDomainObject);
```
### Working with Domain Objects
The [object API]{@link module:openmct.ObjectAPI} provides useful methods
for working with domain objects.
To make changes to a domain object, use the
[`mutate`]{@link module:openmct.ObjectAPI#mutate} method:
```
openmct.objects.mutate(myDomainObject, "name", "New name!");
```
Making modifications in this fashion allows other usages of the domain
object to remain up to date using the
[`observe`]{@link module:openmct.ObjectAPI#observe} method:
```
openmct.objects.observe(myDomainObject, "name", function (newName) {
myLabel.textContent = newName;
});
```
### Using Telemetry
Very often in Open MCT, you wish to work with telemetry data (for instance,
to display it in a custom visualization.)
### Synchronizing with the Time Conductor
Views which wish to remain synchronized with the state of Open MCT's
time conductor should utilize
[`openmct.conductor`]{@link module:openmct.TimeConductor}:
```
openmct.conductor.on('bounds', function (newBounds) {
requestTelemetry(newBounds.start, newBounds.end).then(displayTelemetry);
});
```
## Plugins
While you can register new features with Open MCT directly, it is generally
more useful to package these as a plugin. A plugin is a function that takes
[`openmct`]{@link module:openmct} as an argument, and performs configuration
upon `openmct` when invoked.
### Installing Plugins
To install plugins, use the [`install`]{@link module:openmct.MCT#install}
method:
```
openmct.install(myPlugin);
```
The plugin will be invoked to configure Open MCT before it is started.
### Included Plugins
Open MCT is packaged along with a few general-purpose plugins:
* `openmct.plugins.CouchDB` is an adapter for using CouchDB for persistence
of user-created objects. This is a constructor that takes the URL for the
CouchDB database as a parameter, e.g.
`openmct.install(new openmct.plugins.CouchDB('http://localhost:5984/openmct'))`
* `openmct.plugins.Elasticsearch` is an adapter for using Elasticsearch for
persistence of user-created objects. This is a
constructor that takes the URL for the Elasticsearch instance as a
parameter, e.g.
`openmct.install(new openmct.plugins.CouchDB('http://localhost:9200'))`.
Domain objects will be indexed at `/mct/domain_object`.
* `openmct.plugins.espresso` and `openmct.plugins.snow` are two different
themes (dark and light) available for Open MCT. Note that at least one
of these themes must be installed for Open MCT to appear correctly.
* `openmct.plugins.localStorage` provides persistence of user-created
objects in browser-local storage. This is particularly useful in
development environments.
* `openmct.plugins.myItems` adds a top-level folder named "My Items"
when the application is first started, providing a place for a
user to store created items.
* `openmct.plugins.utcTimeSystem` provides support for using the time
conductor with UTC time.
Generally, you will want to either install these plugins, or install
different plugins that provide persistence and an initial folder
hierarchy. Installation is as described [above](#installing-plugins):
```
openmct.install(openmct.plugins.localStorage);
openmct.install(openmct.plugins.myItems);
```
### Writing Plugins
Plugins configure Open MCT, and should utilize the
[`openmct`]{@link module:openmct} module to do so, as summarized above in
"Configuring Open MCT" and "Using Open MCT" above.
### Distributing Plugins
Hosting or downloading plugins is outside of the scope of this documentation.
We recommend distributing plugins as UMD modules which export a single
function.

View File

@ -560,3 +560,132 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
### Almond
* Link: https://github.com/requirejs/almond
* Version: 0.3.3
* Author: jQuery Foundation
* Description: Lightweight RequireJS replacement for builds
#### License
Copyright jQuery Foundation and other contributors, https://jquery.org/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/requirejs/almond
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.
CC0: http://creativecommons.org/publicdomain/zero/1.0/
====
Files located in the node_modules directory, and certain utilities used
to build or test the software in the test and dist directories, are
externally maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
### Lodash
* Link: https://lodash.com
* Version: 3.10.1
* Author: Dojo Foundation
* Description: Utility functions
#### License
Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
Based on Underscore.js, copyright 2009-2015 Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
### EventEmitter3
* Link: https://github.com/primus/eventemitter3
* Version: 1.2.0
* Author: Arnout Kazemier
* Description: Event-driven programming support
#### License
The MIT License (MIT)
Copyright (c) 2014 Arnout Kazemier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,6 +1,6 @@
# Open MCT [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0)
Open MCT is a next-generation mission control framework for visualization of data on desktop and mobile devices. It is developed at NASA's Ames Research Center, and is being used by NASA for data analysis of spacecraft missions, as well as planning and operation of experimental rover systems. As a generalizable and open source framework, Open MCT could be used as the basis for building applications for planning, operation, and analysis of any systems producing telemetry data.
Open MCT (Open Mission Control Technologies) is a next-generation mission control framework for visualization of data on desktop and mobile devices. It is developed at NASA's Ames Research Center, and is being used by NASA for data analysis of spacecraft missions, as well as planning and operation of experimental rover systems. As a generalizable and open source framework, Open MCT could be used as the basis for building applications for planning, operation, and analysis of any systems producing telemetry data.
Please visit our [Official Site](https://nasa.github.io/openmct/) and [Getting Started Guide](https://nasa.github.io/openmct/getting-started/)
@ -10,9 +10,24 @@ Try Open MCT now with our [live demo](https://openmct-demo.herokuapp.com/).
![Demo](https://nasa.github.io/openmct/static/res/images/Open-MCT.Browse.Layout.Mars-Weather-1.jpg)
## New API
A new API is currently under development that will deprecate a lot of the documentation currently in the docs directory, however Open MCT will remain compatible with the currently documented API. An updated set of tutorials is being developed with the new API, and progress on this task can be followed in the [associated pull request](https://github.com/nasa/openmct/pull/999). Any code in this branch should be considered experimental, and we welcome any feedback.
Differences between the two APIs include a move away from a declarative system of JSON configuration files towards an imperative system based on function calls. Developers will be able to extend and build on Open MCT by making direct function calls to a public API. Open MCT is also being refactored to minimize the dependencies that using Open MCT imposes on developers, such as the current requirement to use Angular JS.
A simpler, [easier-to-use API](https://nasa.github.io/openmct/docs/api/)
has been added to Open MCT. Changes in this
API include a move away from a declarative system of JSON configuration files
towards an imperative system based on function calls. Developers will be able
to extend and build on Open MCT by making direct function calls to a public
API. Open MCT is also being refactored to minimize the dependencies that using
Open MCT imposes on developers, such as the current requirement to use
AngularJS.
This new API has not yet been heavily used and is likely to contain defects.
You can help by trying it out, and reporting any issues you encounter
using our GitHub issue tracker. Such issues may include bugs, suggestions,
missing documentation, or even just requests for help if you're having
trouble.
We want Open MCT to be as easy to use, install, run, and develop for as
possible, and your feedback will help us get there!
## Building and Running Open MCT Locally

View File

@ -19,7 +19,10 @@
"comma-separated-values": "^3.6.4",
"FileSaver.js": "^0.0.2",
"zepto": "^1.1.6",
"html2canvas": "^0.4.1",
"jspdf": "^1.2.61"
"eventemitter3": "^1.2.0",
"lodash": "3.10.1",
"almond": "~0.3.2",
"d3": "~4.1.0",
"html2canvas": "^0.4.1"
}
}

View File

@ -24,7 +24,7 @@
# Script to build and deploy docs.
OUTPUT_DIRECTORY="target/docs"
OUTPUT_DIRECTORY="dist/docs"
# Docs, once built, are pushed to the private website repo
REPOSITORY_URL="git@github.com:nasa/openmct-website.git"
WEBSITE_DIRECTORY="website"

View File

@ -131,7 +131,7 @@ Keeping that in mind, there are a few useful patterns supported by the
framework that are useful to keep in mind.
The specific service infrastructure provided by the platform is described
in the [Platform Architecture](Platform.md).
in the [Platform Architecture](platform.md).
## Extension Categories

View File

@ -1338,55 +1338,6 @@ are supported:
Open MCT defines several Angular directives that are intended for use both
internally within the platform, and by plugins.
## Before Unload
The `mct-before-unload` directive is used to listen for (and prompt for user
confirmation) of navigation changes in the browser. This includes reloading,
following links out of Open MCT, or changing routes. It is used to hook into
both `onbeforeunload` event handling as well as route changes from within
Angular.
This directive is useable as an attribute. Its value should be an Angular
expression. When an action that would trigger an unload and/or route change
occurs, this Angular expression is evaluated. Its result should be a message to
display to the user to confirm their navigation change; if this expression
evaluates to a falsy value, no message will be displayed.
## Chart
The `mct-chart` directive is used to support drawing of simple charts. It is
present to support the Plot view, and its functionality is limited to the
functionality that is relevant for that view.
This directive is used at the element level and takes one attribute, `draw`
which is an Angular expression which will should evaluate to a drawing object.
This drawing object should contain the following properties:
* `dimensions`: The size, in logical coordinates, of the chart area. A
two-element array or numbers.
* `origin`: The position, in logical coordinates, of the lower-left corner of
the chart area. A two-element array or numbers.
* `lines`: An array of lines (e.g. as a plot line) to draw, where each line is
expressed as an object containing:
* `buffer`: A Float32Array containing points in the line, in logical
coordinates, in sequential x,y pairs.
* `color`: The color of the line, as a four-element RGBA array, where
each element is a number in the range of 0.0-1.0.
* `points`: The number of points in the line.
* `boxes`: An array of rectangles to draw in the chart area. Each is an object
containing:
* `start`: The first corner of the rectangle, as a two-element array of
numbers, in logical coordinates.
* `end`: The opposite corner of the rectangle, as a two-element array of
numbers, in logical coordinates. color : The color of the line, as a
four-element RGBA array, where each element is a number in the range of
0.0-1.0.
While `mct-chart` is intended to support plots specifically, it does perform
some useful management of canvas objects (e.g. choosing between WebGL and Canvas
2D APIs for drawing based on browser support) so its usage is recommended when
its supported drawing primitives are sufficient for other charting tasks.
## Container
@ -2310,10 +2261,7 @@ The platform understands the following policy categories (specifiable as the
* `action`: Determines whether or not a given action is allowable. The candidate
argument here is an Action; the context is its action context object.
* `composition`: Determines whether or not domain objects of a given type are
allowed to contain domain objects of another type. The candidate argument here
is the container's `Type`; the context argument is the `Type` of the object to be
contained.
* `composition`: Determines whether or not domain objects of a given type (first argument, `parentType`) can contain a given object (second argument, `child`).
* `view`: Determines whether or not a view is applicable for a domain object.
The candidate argument is the view's extension definition; the context argument
is the `DomainObject` to be viewed.

View File

@ -9,26 +9,29 @@
Open MCT provides functionality out of the box, but it's also a platform for
building rich mission operations applications based on modern web technology.
The platform is configured declaratively, and defines conventions for
building on the provided capabilities by creating modular 'bundles' that
extend the platform at a variety of extension points. The details of how to
The platform is configured by plugins which extend the platform at a variety
of extension points. The details of how to
extend the platform are provided in the following documentation.
## Sections
* The [Architecture Overview](architecture/) describes the concepts used
throughout Open MCT, and gives a high level overview of the platform's design.
* The [Developer's Guide](guide/) goes into more detail about how to use the
platform and the functionality that it provides.
* The [Tutorials](tutorials/) give examples of extending the platform to add
functionality,
and integrate with data sources.
* The [API](api/) document is generated from inline documentation
using [JSDoc](http://usejsdoc.org/), and describes the JavaScript objects and
functions that make up the software platform.
* Finally, the [Development Process](process/) document describes the
* The [Development Process](process/) document describes the
Open MCT software development cycle.
## Legacy Documentation
As we transition to a new API, the following documentation for the old API
(which is supported during the transtion) may be useful as well:
* The [Architecture Overview](architecture/) describes the concepts used
throughout Open MCT, and gives a high level overview of the platform's design.
* The [Developer's Guide](guide/) goes into more detail about how to use the
platform and the functionality that it provides.
* The [Tutorials](tutorials/) give examples of extending the platform to add
functionality, and integrate with data sources.

File diff suppressed because it is too large Load Diff

View File

@ -49,7 +49,7 @@ define([
{
"key": "eventGenerator",
"name": "Event Message Generator",
"cssclass": "icon-folder-new",
"cssClass": "icon-folder-new",
"description": "For development use. Creates sample event message data that mimics a live data stream.",
"priority": 10,
"features": "creation",

View File

@ -36,7 +36,7 @@ define([
"name": "Export Telemetry as CSV",
"implementation": ExportTelemetryAsCSVAction,
"category": "contextual",
"cssclass": "icon-download",
"cssClass": "icon-download",
"depends": [ "exportService" ]
}
]

View File

@ -0,0 +1,87 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([
'./WorkerInterface'
], function (
WorkerInterface
) {
var REQUEST_DEFAULTS = {
amplitude: 1,
period: 10,
offset: 0,
dataRateInHz: 1
};
function GeneratorProvider() {
this.workerInterface = new WorkerInterface();
}
GeneratorProvider.prototype.canProvideTelemetry = function (domainObject) {
return domainObject.type === 'generator';
};
GeneratorProvider.prototype.supportsRequest =
GeneratorProvider.prototype.supportsSubscribe =
GeneratorProvider.prototype.canProvideTelemetry;
GeneratorProvider.prototype.makeWorkerRequest = function (domainObject, request) {
var props = [
'amplitude',
'period',
'offset',
'dataRateInHz'
];
var workerRequest = {};
props.forEach(function (prop) {
if (domainObject.telemetry && domainObject.telemetry.hasOwnProperty(prop)) {
workerRequest[prop] = domainObject.telemetry[prop];
}
if (request.hasOwnProperty(prop)) {
workerRequest[prop] = request[prop];
}
if (!workerRequest[prop]) {
workerRequest[prop] = REQUEST_DEFAULTS[prop];
}
workerRequest[prop] = Number(workerRequest[prop]);
});
return workerRequest;
};
GeneratorProvider.prototype.request = function (domainObject, request) {
var workerRequest = this.makeWorkerRequest(domainObject, request);
workerRequest.start = request.start;
workerRequest.end = request.end;
return this.workerInterface.request(workerRequest);
};
GeneratorProvider.prototype.subscribe = function (domainObject, callback, request) {
var workerRequest = this.makeWorkerRequest(domainObject, request);
return this.workerInterface.subscribe(workerRequest, callback);
};
return GeneratorProvider;
});

View File

@ -19,7 +19,7 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/*global define*/
define({
START_TIME: Date.now() - 24 * 60 * 60 * 1000 // Now minus a day.

View File

@ -19,12 +19,11 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/*global define*/
define(
['./SinewaveConstants', 'moment'],
function (SinewaveConstants, moment) {
"use strict";
var START_TIME = SinewaveConstants.START_TIME,
FORMAT_REGEX = /^-?\d+:\d+:\d+$/,

View File

@ -0,0 +1,70 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/**
* Module defining SinewaveTelemetryProvider. Created by vwoeltje on 11/12/14.
*/
define([
"./SinewaveTelemetrySeries",
"./GeneratorProvider"
], function (
SinewaveTelemetrySeries,
GeneratorProvider
) {
function SinewaveTelemetryProvider() {
this.provider = new GeneratorProvider();
}
SinewaveTelemetryProvider.prototype.requestTelemetry = function (requests) {
if (requests[0].source !== 'generator') {
return Promise.resolve({});
}
return this.provider.request({}, requests[0])
.then(function (data) {
var res = {
generator: {}
};
res.generator[requests[0].key] = new SinewaveTelemetrySeries(data);
return res;
});
};
SinewaveTelemetryProvider.prototype.subscribe = function (callback, requests) {
if (requests[0].source !== 'generator') {
return function unsubscribe() {};
}
function wrapper(data) {
var res = {
generator: {}
};
res.generator[requests[0].key] = new SinewaveTelemetrySeries(data);
callback(res);
}
return this.provider.subscribe({}, wrapper, requests[0]);
};
return SinewaveTelemetryProvider;
});

View File

@ -0,0 +1,75 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/**
* Module defining SinewaveTelemetry. Created by vwoeltje on 11/12/14.
*/
define([
], function (
) {
"use strict";
function SinewaveTelemetrySeries(data) {
if (!Array.isArray(data)) {
data = [data];
}
this.data = data;
}
SinewaveTelemetrySeries.prototype.getPointCount = function () {
return this.data.length;
};
SinewaveTelemetrySeries.prototype.getDomainValue = function (
index,
domain
) {
domain = domain || 'time';
return this.getDatum(index)[domain];
};
SinewaveTelemetrySeries.prototype.getRangeValue = function (
index,
range
) {
range = range || 'sin';
return this.getDatum(index)[range];
};
SinewaveTelemetrySeries.prototype.getDatum = function (index) {
if (index > this.data.length || index < 0) {
throw new Error('IndexOutOfRange: index not available in series.');
}
return this.data[index];
};
SinewaveTelemetrySeries.prototype.getData = function () {
return this.data;
};
return SinewaveTelemetrySeries;
});

View File

@ -0,0 +1,115 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([
'text!./generatorWorker.js',
'uuid'
], function (
workerText,
uuid
) {
var workerBlob = new Blob(
[workerText],
{type: 'application/javascript'}
);
var workerUrl = URL.createObjectURL(workerBlob);
function WorkerInterface() {
this.worker = new Worker(workerUrl);
this.worker.onmessage = this.onMessage.bind(this);
this.callbacks = {};
}
WorkerInterface.prototype.onMessage = function (message) {
message = message.data;
var callback = this.callbacks[message.id];
if (callback) {
if (callback(message)) {
delete this.callbacks[message.id];
}
}
};
WorkerInterface.prototype.dispatch = function (request, data, callback) {
var message = {
request: request,
data: data,
id: uuid()
};
if (callback) {
this.callbacks[message.id] = callback;
}
this.worker.postMessage(message);
return message.id;
};
WorkerInterface.prototype.request = function (request) {
var deferred = {};
var promise = new Promise(function (resolve, reject) {
deferred.resolve = resolve;
deferred.reject = reject;
});
function callback(message) {
if (message.error) {
deferred.reject(message.error);
} else {
deferred.resolve(message.data);
}
return true;
}
this.dispatch('request', request, callback);
return promise;
};
WorkerInterface.prototype.subscribe = function (request, cb) {
var isCancelled = false;
var callback = function (message) {
if (isCancelled) {
return true;
}
cb(message.data);
};
var messageId = this.dispatch('subscribe', request, callback)
return function () {
isCancelled = true;
this.dispatch('unsubscribe', {
id: messageId
});
}.bind(this);
};
return WorkerInterface;
});

View File

@ -1,144 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define([
"./src/SinewaveTelemetryProvider",
"./src/SinewaveLimitCapability",
"./src/SinewaveDeltaFormat",
'legacyRegistry'
], function (
SinewaveTelemetryProvider,
SinewaveLimitCapability,
SinewaveDeltaFormat,
legacyRegistry
) {
"use strict";
legacyRegistry.register("example/generator", {
"name": "Sine Wave Generator",
"description": "For development use. Generates example streaming telemetry data using a simple sine wave algorithm.",
"extensions": {
"components": [
{
"implementation": SinewaveTelemetryProvider,
"type": "provider",
"provides": "telemetryService",
"depends": [
"$q",
"$timeout"
]
}
],
"capabilities": [
{
"key": "limit",
"implementation": SinewaveLimitCapability
}
],
"formats": [
{
"key": "example.delta",
"implementation": SinewaveDeltaFormat
}
],
"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",
"cssclass": "icon-telemetry",
"description": "For development use. Generates example streaming telemetry data using a simple sine wave algorithm.",
"priority": 10,
"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-input-sm l-numeric",
"key": "period",
"required": true,
"property": [
"telemetry",
"period"
],
"pattern": "^\\d*(\\.\\d*)?$"
}
]
}
]
}
});
});

View File

@ -0,0 +1,155 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global self*/
(function () {
var FIFTEEN_MINUTES = 15 * 60 * 1000;
var handlers = {
subscribe: onSubscribe,
unsubscribe: onUnsubscribe,
request: onRequest
};
var subscriptions = {};
function workSubscriptions(timestamp) {
var now = Date.now();
var nextWork = Math.min.apply(Math, Object.values(subscriptions).map(function (subscription) {
return subscription(now);
}));
var wait = nextWork - now;
if (wait < 0) {
wait = 0;
}
if (Number.isFinite(wait)) {
setTimeout(workSubscriptions, wait);
}
}
function onSubscribe(message) {
var data = message.data;
// Keep
var start = Date.now();
var step = 1000 / data.dataRateInHz;
var nextStep = start - (start % step) + step;
function work(now) {
while (nextStep < now) {
self.postMessage({
id: message.id,
data: {
utc: nextStep,
yesterday: nextStep - 60*60*24*1000,
delta: 60*60*24*1000,
sin: sin(nextStep, data.period, data.amplitude, data.offset),
cos: cos(nextStep, data.period, data.amplitude, data.offset)
}
});
nextStep += step;
}
return nextStep;
}
subscriptions[message.id] = work;
workSubscriptions();
}
function onUnsubscribe(message) {
delete subscriptions[message.data.id];
}
function onRequest(message) {
var data = message.data;
if (data.end == undefined) {
data.end = Date.now();
}
if (data.start == undefined){
data.start = data.end - FIFTEEN_MINUTES;
}
var now = Date.now();
var start = data.start;
var end = data.end > now ? now : data.end;
var amplitude = data.amplitude;
var period = data.period;
var offset = data.offset;
var dataRateInHz = data.dataRateInHz;
var step = 1000 / dataRateInHz;
var nextStep = start - (start % step) + step;
var data = [];
for (; nextStep < end; nextStep += step) {
data.push({
utc: nextStep,
yesterday: nextStep - 60*60*24*1000,
delta: 60*60*24*1000,
sin: sin(nextStep, period, amplitude, offset),
cos: cos(nextStep, period, amplitude, offset)
});
}
self.postMessage({
id: message.id,
data: data
});
}
function cos(timestamp, period, amplitude, offset) {
return amplitude *
Math.cos(timestamp / period / 1000 * Math.PI * 2) + offset;
}
function sin(timestamp, period, amplitude, offset) {
return amplitude *
Math.sin(timestamp / period / 1000 * Math.PI * 2) + offset;
}
function sendError(error, message) {
self.postMessage({
error: error.name + ': ' + error.message,
message: message,
id: message.id
});
}
self.onmessage = function handleMessage(event) {
var message = event.data;
var handler = handlers[message.request];
if (!handler) {
sendError(new Error('unknown message type'), message);
} else {
try {
handler(message);
} catch (e) {
sendError(e, message);
}
}
};
}());

171
example/generator/plugin.js Normal file
View File

@ -0,0 +1,171 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define([
"./GeneratorProvider",
"./SinewaveLimitCapability",
"./SinewaveDeltaFormat"
], function (
GeneratorProvider,
SinewaveLimitCapability,
SinewaveDeltaFormat
) {
var legacyExtensions = {
"capabilities": [
{
"key": "limit",
"implementation": SinewaveLimitCapability
}
],
"formats": [
{
"key": "example.delta",
"implementation": SinewaveDeltaFormat
}
],
"constants": [
{
"key": "TIME_CONDUCTOR_DOMAINS",
"value": [
{
"key": "time",
"name": "Time"
},
{
"key": "yesterday",
"name": "Yesterday"
},
{
"key": "delta",
"name": "Delta"
}
],
"priority": -1
}
]
}
return function(openmct){
//Register legacy extensions for things not yet supported by the new API
Object.keys(legacyExtensions).forEach(function (type){
var extensionsOfType = legacyExtensions[type];
extensionsOfType.forEach(function (extension) {
openmct.legacyExtension(type, extension)
})
});
openmct.types.addType("generator", {
label: "Sine Wave Generator",
description: "For development use. Generates example streaming telemetry data using a simple sine wave algorithm.",
cssClass: "icon-telemetry",
creatable: true,
form: [
{
name: "Period",
control: "textfield",
cssClass: "l-input-sm l-numeric",
key: "period",
required: true,
property: [
"telemetry",
"period"
],
pattern: "^\\d*(\\.\\d*)?$"
},
{
name: "Amplitude",
control: "textfield",
cssClass: "l-input-sm l-numeric",
key: "amplitude",
required: true,
property: [
"telemetry",
"amplitude"
],
pattern: "^\\d*(\\.\\d*)?$"
},
{
name: "Offset",
control: "textfield",
cssClass: "l-input-sm l-numeric",
key: "offset",
required: true,
property: [
"telemetry",
"offset"
],
pattern: "^\\d*(\\.\\d*)?$"
},
{
name: "Data Rate (hz)",
control: "textfield",
cssClass: "l-input-sm l-numeric",
key: "dataRateInHz",
required: true,
property: [
"telemetry",
"dataRateInHz"
],
pattern: "^\\d*(\\.\\d*)?$"
}
],
initialize: function (object) {
object.telemetry = {
period: 10,
amplitude: 1,
offset: 0,
dataRateInHz: 1,
domains: [
{
key: "utc",
name: "Time",
format: "utc"
},
{
key: "yesterday",
name: "Yesterday",
format: "utc"
},
{
key: "delta",
name: "Delta",
format: "example.delta"
}
],
ranges: [
{
key: "sin",
name: "Sine"
},
{
key: "cos",
name: "Cosine"
}
]
};
}
});
openmct.telemetry.addProvider(new GeneratorProvider());
};
});

View File

@ -1,119 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/**
* Module defining SinewaveTelemetryProvider. Created by vwoeltje on 11/12/14.
*/
define(
["./SinewaveTelemetrySeries"],
function (SinewaveTelemetrySeries) {
"use strict";
/**
*
* @constructor
*/
function SinewaveTelemetryProvider($q, $timeout) {
var subscriptions = [],
generating = false;
//
function matchesSource(request) {
return request.source === "generator";
}
// Used internally; this will be repacked by doPackage
function generateData(request) {
return {
key: request.key,
telemetry: new SinewaveTelemetrySeries(request)
};
}
//
function doPackage(results) {
var packaged = {};
results.forEach(function (result) {
packaged[result.key] = result.telemetry;
});
// Format as expected (sources -> keys -> telemetry)
return { generator: packaged };
}
function requestTelemetry(requests) {
return $timeout(function () {
return doPackage(requests.filter(matchesSource).map(generateData));
}, 0);
}
function handleSubscriptions() {
subscriptions.forEach(function (subscription) {
var requests = subscription.requests;
subscription.callback(doPackage(
requests.filter(matchesSource).map(generateData)
));
});
}
function startGenerating() {
generating = true;
$timeout(function () {
handleSubscriptions();
if (generating && subscriptions.length > 0) {
startGenerating();
} else {
generating = false;
}
}, 1000);
}
function subscribe(callback, requests) {
var subscription = {
callback: callback,
requests: requests
};
function unsubscribe() {
subscriptions = subscriptions.filter(function (s) {
return s !== subscription;
});
}
subscriptions.push(subscription);
if (!generating) {
startGenerating();
}
return unsubscribe;
}
return {
requestTelemetry: requestTelemetry,
subscribe: subscribe
};
}
return SinewaveTelemetryProvider;
}
);

View File

@ -1,78 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
/**
* Module defining SinewaveTelemetry. Created by vwoeltje on 11/12/14.
*/
define(
['./SinewaveConstants'],
function (SinewaveConstants) {
"use strict";
var ONE_DAY = 60 * 60 * 24,
firstObservedTime = Math.floor(SinewaveConstants.START_TIME / 1000);
/**
*
* @constructor
*/
function SinewaveTelemetrySeries(request) {
var timeOffset = (request.domain === 'yesterday') ? ONE_DAY : 0,
latestTime = Math.floor(Date.now() / 1000) - timeOffset,
firstTime = firstObservedTime - timeOffset,
endTime = (request.end !== undefined) ?
Math.floor(request.end / 1000) : latestTime,
count = Math.min(endTime, latestTime) - firstTime,
period = +request.period || 30,
generatorData = {},
requestStart = (request.start === undefined) ? firstTime :
Math.max(Math.floor(request.start / 1000), firstTime),
offset = requestStart - firstTime;
if (request.size !== undefined) {
offset = Math.max(offset, count - request.size);
}
generatorData.getPointCount = function () {
return count - offset;
};
generatorData.getDomainValue = function (i, domain) {
// delta uses the same numeric values as the default domain,
// so it's not checked for here, just formatted for display
// differently.
return (i + offset) * 1000 + firstTime * 1000 -
(domain === 'yesterday' ? (ONE_DAY * 1000) : 0);
};
generatorData.getRangeValue = function (i, range) {
range = range || "sin";
return Math[range]((i + offset) * Math.PI * 2 / period);
};
return generatorData;
}
return SinewaveTelemetrySeries;
}
);

View File

@ -49,7 +49,7 @@ define([
{
"key": "imagery",
"name": "Example Imagery",
"cssclass": "icon-image",
"cssClass": "icon-image",
"features": "creation",
"description": "For development use. Creates example imagery data that mimics a live imagery stream.",
"priority": 10,

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.
*****************************************************************************/
define([
"./src/LocalTimeSystem",
"./src/LocalTimeFormat",
'legacyRegistry'
], function (
LocalTimeSystem,
LocalTimeFormat,
legacyRegistry
) {
legacyRegistry.register("example/localTimeSystem", {
"extensions": {
"formats": [
{
"key": "local-format",
"implementation": LocalTimeFormat
}
],
"timeSystems": [
{
"implementation": LocalTimeSystem,
"depends": ["$timeout"]
}
]
}
});
});

View File

@ -0,0 +1,43 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(['../../../platform/features/conductor/core/src/timeSystems/LocalClock'], function (LocalClock) {
/**
* @implements TickSource
* @constructor
*/
function LADTickSource ($timeout, period) {
LocalClock.call(this, $timeout, period);
this.metadata = {
key: 'test-lad',
mode: 'lad',
cssClass: 'icon-clock',
label: 'Latest Available Data',
name: 'Latest available data',
description: 'Monitor real-time streaming data as it comes in. The Time Conductor and displays will automatically advance themselves based on a UTC clock.'
};
}
LADTickSource.prototype = Object.create(LocalClock.prototype);
return LADTickSource;
});

View File

@ -0,0 +1,112 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([
'moment'
], function (
moment
) {
var DATE_FORMAT = "YYYY-MM-DD h:mm:ss.SSS a",
DATE_FORMATS = [
DATE_FORMAT,
"YYYY-MM-DD h:mm:ss a",
"YYYY-MM-DD h:mm a",
"YYYY-MM-DD"
];
/**
* @typedef Scale
* @property {number} min the minimum scale value, in ms
* @property {number} max the maximum scale value, in ms
*/
/**
* Formatter for UTC timestamps. Interprets numeric values as
* milliseconds since the start of 1970.
*
* @implements {Format}
* @constructor
* @memberof platform/commonUI/formats
*/
function LocalTimeFormat() {
}
/**
* Returns an appropriate time format based on the provided value and
* the threshold required.
* @private
*/
function getScaledFormat (d) {
var m = moment.utc(d);
/**
* Uses logic from d3 Time-Scales, v3 of the API. See
* https://github.com/d3/d3-3.x-api-reference/blob/master/Time-Scales.md
*
* Licensed
*/
return [
[".SSS", function(m) { return m.milliseconds(); }],
[":ss", function(m) { return m.seconds(); }],
["hh:mma", function(m) { return m.minutes(); }],
["hha", function(m) { return m.hours(); }],
["ddd DD", function(m) {
return m.days() &&
m.date() != 1;
}],
["MMM DD", function(m) { return m.date() != 1; }],
["MMMM", function(m) {
return m.month();
}],
["YYYY", function() { return true; }]
].filter(function (row){
return row[1](m);
})[0][0];
};
/**
*
* @param value
* @param {Scale} [scale] Optionally provides context to the
* format request, allowing for scale-appropriate formatting.
* @returns {string} the formatted date
*/
LocalTimeFormat.prototype.format = function (value, scale) {
if (scale !== undefined){
var scaledFormat = getScaledFormat(value, scale);
if (scaledFormat) {
return moment.utc(value).format(scaledFormat);
}
}
return moment(value).format(DATE_FORMAT);
};
LocalTimeFormat.prototype.parse = function (text) {
return moment(text, DATE_FORMATS).valueOf();
};
LocalTimeFormat.prototype.validate = function (text) {
return moment(text, DATE_FORMATS).isValid();
};
return LocalTimeFormat;
});

View File

@ -0,0 +1,79 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([
'../../../platform/features/conductor/core/src/timeSystems/TimeSystem',
'../../../platform/features/conductor/core/src/timeSystems/LocalClock',
'./LADTickSource'
], function (TimeSystem, LocalClock, LADTickSource) {
var THIRTY_MINUTES = 30 * 60 * 1000,
DEFAULT_PERIOD = 1000;
/**
* This time system supports UTC dates and provides a ticking clock source.
* @implements TimeSystem
* @constructor
*/
function LocalTimeSystem ($timeout) {
TimeSystem.call(this);
/**
* Some metadata, which will be used to identify the time system in
* the UI
* @type {{key: string, name: string, glyph: string}}
*/
this.metadata = {
'key': 'local',
'name': 'Local',
'glyph': '\u0043'
};
this.fmts = ['local-format'];
this.sources = [new LocalClock($timeout, DEFAULT_PERIOD), new LADTickSource($timeout, DEFAULT_PERIOD)];
}
LocalTimeSystem.prototype = Object.create(TimeSystem.prototype);
LocalTimeSystem.prototype.formats = function () {
return this.fmts;
};
LocalTimeSystem.prototype.deltaFormat = function () {
return 'duration';
};
LocalTimeSystem.prototype.tickSources = function () {
return this.sources;
};
LocalTimeSystem.prototype.defaults = function (key) {
var now = Math.ceil(Date.now() / 1000) * 1000;
return {
key: 'local-default',
name: 'Local 12 hour time system defaults',
deltas: {start: THIRTY_MINUTES, end: 0},
bounds: {start: now - THIRTY_MINUTES, end: now}
};
};
return LocalTimeSystem;
});

View File

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

View File

@ -1,71 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define(
function (){
"use strict";
var TAXONOMY_ID = "msl:curiosity",
PREFIX = "msl_tlm:";
/**
* Function that is executed on application startup and populates
* the navigation tree with objects representing the MSL REMS
* telemetry points. The tree is populated based on the data
* dictionary on the provider.
*
* @param {RemsTelemetryServerAdapter} adapter The server adapter
* (necessary in order to retrieve data dictionary)
* @param objectService the ObjectService which allows for lookup of
* objects by ID
* @constructor
*/
function RemsTelemetryInitializer(adapter, objectService) {
function makeId(element) {
return PREFIX + element.identifier;
}
function initializeTaxonomy(dictionary) {
function getTaxonomyObject(domainObjects) {
return domainObjects[TAXONOMY_ID];
}
function populateModel (taxonomyObject) {
return taxonomyObject.useCapability(
"mutation",
function (model) {
model.name = dictionary.name;
model.composition = dictionary.instruments.map(makeId);
}
);
}
objectService.getObjects([TAXONOMY_ID])
.then(getTaxonomyObject)
.then(populateModel);
}
initializeTaxonomy(adapter.dictionary);
}
return RemsTelemetryInitializer;
}
);

View File

@ -81,7 +81,7 @@ define([
{
"key": "plot",
"name": "Example Telemetry Plot",
"cssclass": "icon-telemetry-panel",
"cssClass": "icon-telemetry-panel",
"description": "For development use. A plot for displaying telemetry.",
"priority": 10,
"delegates": [
@ -129,7 +129,7 @@ define([
{
"name": "Period",
"control": "textfield",
"cssclass": "l-input-sm l-numeric",
"cssClass": "l-input-sm l-numeric",
"key": "period",
"required": true,
"property": [

View File

@ -63,7 +63,7 @@ define(
* Get the CSS class that defines the icon
* to display in this indicator. This will appear
* as a dataflow icon.
* @returns {string} the cssclass of the dataflow icon
* @returns {string} the cssClass of the dataflow icon
*/
getCssClass: function () {
return "icon-connectivity";

View File

@ -33,6 +33,11 @@ define([
legacyRegistry.register("example/scratchpad", {
"extensions": {
"roots": [
{
"id": "scratch:root"
}
],
"models": [
{
"id": "scratch:root",
"model": {

View File

@ -35,6 +35,11 @@ define([
"description": "Example illustrating the addition of a static top-level hierarchy",
"extensions": {
"roots": [
{
"id": "exampleTaxonomy"
}
],
"models": [
{
"id": "exampleTaxonomy",
"model": {

View File

@ -21,41 +21,34 @@
*****************************************************************************/
/*global require,__dirname*/
var gulp = require('gulp'),
requirejsOptimize = require('gulp-requirejs-optimize'),
sourcemaps = require('gulp-sourcemaps'),
rename = require('gulp-rename'),
sass = require('gulp-sass'),
bourbon = require('node-bourbon'),
jshint = require('gulp-jshint'),
jscs = require('gulp-jscs'),
replace = require('gulp-replace-task'),
karma = require('karma'),
path = require('path'),
fs = require('fs'),
git = require('git-rev-sync'),
moment = require('moment'),
merge = require('merge-stream'),
project = require('./package.json'),
_ = require('lodash'),
paths = {
main: 'main.js',
main: 'openmct.js',
dist: 'dist',
assets: 'dist/assets',
reports: 'dist/reports',
scss: ['./platform/**/*.scss', './example/**/*.scss'],
scripts: [ 'main.js', 'platform/**/*.js', 'src/**/*.js' ],
assets: [
'./{example,platform}/**/*.{css,css.map,png,svg,ico,woff,eot,ttf}'
],
scripts: [ 'openmct.js', 'platform/**/*.js', 'src/**/*.js' ],
specs: [ 'platform/**/*Spec.js', 'src/**/*Spec.js' ],
static: [
'index.html',
'platform/**/*',
'example/**/*',
'bower_components/**/*'
]
},
options = {
requirejsOptimize: {
name: paths.main.replace(/\.js$/, ''),
name: 'bower_components/almond/almond.js',
include: paths.main.replace('.js', ''),
wrap: {
startFile: "src/start.frag",
endFile: "src/end.frag"
},
mainConfigFile: paths.main,
wrapShim: true
},
@ -64,7 +57,6 @@ var gulp = require('gulp'),
singleRun: true
},
sass: {
includePaths: bourbon.includePaths,
sourceComments: true
},
replace: {
@ -77,7 +69,14 @@ var gulp = require('gulp'),
}
};
if (process.env.NODE_ENV === 'development') {
options.requirejsOptimize.optimize = 'none';
}
gulp.task('scripts', function () {
var requirejsOptimize = require('gulp-requirejs-optimize');
var replace = require('gulp-replace-task');
return gulp.src(paths.main)
.pipe(sourcemaps.init())
.pipe(requirejsOptimize(options.requirejsOptimize))
@ -87,10 +86,16 @@ gulp.task('scripts', function () {
});
gulp.task('test', function (done) {
var karma = require('karma');
new karma.Server(options.karma, done).start();
});
gulp.task('stylesheets', function () {
var sass = require('gulp-sass');
var rename = require('gulp-rename');
var bourbon = require('node-bourbon');
options.sass.includePaths = bourbon.includePaths;
return gulp.src(paths.scss, {base: '.'})
.pipe(sourcemaps.init())
.pipe(sass(options.sass).on('error', sass.logError))
@ -104,6 +109,9 @@ gulp.task('stylesheets', function () {
});
gulp.task('lint', function () {
var jshint = require('gulp-jshint');
var merge = require('merge-stream');
var nonspecs = paths.specs.map(function (glob) {
return "!" + glob;
}),
@ -122,25 +130,36 @@ gulp.task('lint', function () {
});
gulp.task('checkstyle', function () {
var jscs = require('gulp-jscs');
var mkdirp = require('mkdirp');
var reportName = 'jscs-html-report.html';
var reportPath = path.resolve(paths.reports, 'checkstyle', reportName);
var moveReport = fs.rename.bind(fs, reportName, reportPath, _.noop);
mkdirp.sync(path.resolve(paths.reports, 'checkstyle'));
return gulp.src(paths.scripts)
.pipe(jscs())
.pipe(jscs.reporter())
.pipe(jscs.reporter('jscs-html-reporter')).on('finish', moveReport)
.pipe(jscs.reporter('fail'));
});
gulp.task('fixstyle', function () {
var jscs = require('gulp-jscs');
return gulp.src(paths.scripts, { base: '.' })
.pipe(jscs({ fix: true }))
.pipe(gulp.dest('.'));
});
gulp.task('static', ['stylesheets'], function () {
return gulp.src(paths.static, { base: '.' })
gulp.task('assets', ['stylesheets'], function () {
return gulp.src(paths.assets)
.pipe(gulp.dest(paths.dist));
});
gulp.task('watch', function () {
gulp.watch(paths.scss, ['stylesheets']);
return gulp.watch(paths.scss, ['stylesheets', 'assets']);
});
gulp.task('serve', function () {
@ -150,7 +169,7 @@ gulp.task('serve', function () {
gulp.task('develop', ['serve', 'stylesheets', 'watch']);
gulp.task('install', [ 'static', 'scripts' ]);
gulp.task('install', [ 'assets', 'scripts' ]);
gulp.task('verify', [ 'lint', 'test', 'checkstyle' ]);

View File

@ -25,15 +25,33 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title></title>
<script src="openmct-tutorial/lib/http.js">
</script>
<script src="bower_components/requirejs/require.js">
</script>
<script src="openmct-tutorial/dictionary-plugin.js">
</script>
<script src="openmct-tutorial/realtime-telemetry-plugin.js">
</script>
<script src="openmct-tutorial/historical-telemetry-plugin.js">
</script>
<script>
require(['main'], function (mct) {
require([
'./example/imagery/bundle',
'./example/eventGenerator/bundle',
'./example/generator/bundle'
], mct.run.bind(mct));
require(['openmct'], function (openmct) {
[
'example/imagery',
'example/eventGenerator'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
openmct.install(openmct.plugins.MyItems());
openmct.install(openmct.plugins.LocalStorage());
openmct.install(openmct.plugins.Espresso());
openmct.install(openmct.plugins.Generator());
openmct.install(openmct.plugins.UTCTimeSystem());
openmct.install(DictionaryPlugin());
openmct.install(RealtimeTelemetryPlugin());
openmct.install(HistoricalTelemetryPlugin());
openmct.start();
});
</script>
<link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
@ -47,7 +65,5 @@
<div class="l-splash-holder s-splash-holder">
<div class="l-splash s-splash"></div>
</div>
<div ng-view></div>
</body>
</html>

View File

@ -1,9 +1,9 @@
{
"source": {
"include": [
"platform/"
"src/"
],
"includePattern": "platform/.+\\.js$",
"includePattern": "src/.+\\.js$",
"excludePattern": ".+\\Spec\\.js$|lib/.+"
},
"plugins": [

View File

@ -37,9 +37,11 @@ module.exports = function(config) {
{pattern: 'bower_components/**/*.js', included: false},
{pattern: 'src/**/*.js', included: false},
{pattern: 'example/**/*.js', included: false},
{pattern: 'example/**/*.json', included: false},
{pattern: 'platform/**/*.js', included: false},
{pattern: 'warp/**/*.js', included: false},
{pattern: 'platform/**/*.html', included: false},
{pattern: 'src/**/*.html', included: false},
'test-main.js'
],
@ -74,7 +76,7 @@ module.exports = function(config) {
// Specify browsers to run tests in.
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: [
'PhantomJS'
'Chrome'
],
// Code coverage reporting.

1
openmct-tutorial Submodule

Submodule openmct-tutorial added at 7076a15d3a

View File

@ -27,16 +27,18 @@ requirejs.config({
"angular": "bower_components/angular/angular.min",
"angular-route": "bower_components/angular-route/angular-route.min",
"csv": "bower_components/comma-separated-values/csv.min",
"EventEmitter": "bower_components/eventemitter3/index",
"es6-promise": "bower_components/es6-promise/es6-promise.min",
"html2canvas": "bower_components/html2canvas/build/html2canvas.min",
"jsPDF": "bower_components/jspdf/dist/jspdf.debug",
"moment": "bower_components/moment/moment",
"moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format",
"saveAs": "bower_components/FileSaver.js/FileSaver.min",
"screenfull": "bower_components/screenfull/dist/screenfull.min",
"text": "bower_components/text/text",
"uuid": "bower_components/node-uuid/uuid",
"zepto": "bower_components/zepto/zepto.min"
"zepto": "bower_components/zepto/zepto.min",
"lodash": "bower_components/lodash/lodash",
"d3": "bower_components/d3/d3.min"
},
"shim": {
"angular": {
@ -45,12 +47,12 @@ requirejs.config({
"angular-route": {
"deps": ["angular"]
},
"EventEmitter": {
"exports": "EventEmitter"
},
"html2canvas": {
"exports": "html2canvas"
},
"jsPDF": {
"exports": "jsPDF"
},
"moment-duration-format": {
"deps": ["moment"]
},
@ -59,54 +61,34 @@ requirejs.config({
},
"zepto": {
"exports": "Zepto"
},
"lodash": {
"exports": "lodash"
},
"d3": {
"exports": "d3"
}
}
});
define([
'./platform/framework/src/Main',
'legacyRegistry',
'./src/defaultRegistry',
'./src/MCT'
], function (Main, defaultRegistry, MCT) {
var openmct = new MCT();
'./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/exporters/bundle',
'./platform/telemetry/bundle',
'./platform/features/clock/bundle',
'./platform/features/fixed/bundle',
'./platform/features/imagery/bundle',
'./platform/features/layout/bundle',
'./platform/features/pages/bundle',
'./platform/features/plot/bundle',
'./platform/features/timeline/bundle',
'./platform/features/table/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',
'./platform/commonUI/regions/bundle'
], function (Main, legacyRegistry) {
return {
legacyRegistry: legacyRegistry,
run: function () {
return new Main().run(legacyRegistry);
}
};
openmct.legacyRegistry = defaultRegistry;
openmct.on('start', function () {
return new Main().run(defaultRegistry);
});
// For now, install conductor by default
openmct.install(openmct.plugins.Conductor({
showConductor: false
}));
return openmct;
});

View File

@ -1,6 +1,6 @@
{
"name": "openmct",
"version": "0.12.0-SNAPSHOT",
"version": "0.12.1-SNAPSHOT",
"description": "The Open MCT core platform",
"dependencies": {
"express": "^4.13.1",
@ -21,16 +21,16 @@
"gulp-sass": "^2.2.0",
"gulp-sourcemaps": "^1.6.0",
"jasmine-core": "^2.3.0",
"jscs-html-reporter": "^0.1.0",
"jsdoc": "^3.3.2",
"jshint": "^2.7.0",
"karma": "^0.13.3",
"karma-chrome-launcher": "^0.1.8",
"karma-chrome-launcher": "^0.1.12",
"karma-cli": "0.0.4",
"karma-coverage": "^0.5.3",
"karma-html-reporter": "^0.2.7",
"karma-jasmine": "^0.1.5",
"karma-junit-reporter": "^0.3.8",
"karma-phantomjs-launcher": "^1.0.0",
"karma-requirejs": "^0.2.2",
"lodash": "^3.10.1",
"markdown-toc": "^0.11.7",
@ -39,7 +39,6 @@
"mkdirp": "^0.5.1",
"moment": "^2.11.1",
"node-bourbon": "^4.2.3",
"phantomjs-prebuilt": "2.1.11 || >2.1.12 <3.0.0",
"requirejs": "2.1.x",
"split": "^1.0.0"
},
@ -48,8 +47,8 @@
"test": "karma start --single-run",
"jshint": "jshint platform example",
"watch": "karma start",
"jsdoc": "jsdoc -c jsdoc.json -r -d target/docs/api",
"otherdoc": "node docs/gendocs.js --in docs/src --out target/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'",
"jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api",
"otherdoc": "node docs/gendocs.js --in docs/src --out dist/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'",
"docs": "npm run jsdoc ; npm run otherdoc",
"prepublish": "node ./node_modules/bower/bin/bower install && node ./node_modules/gulp/bin/gulp.js install"
},

View File

@ -70,14 +70,13 @@ define([
"extensions": {
"routes": [
{
"when": "/browse/:ids*",
"when": "/browse/:ids*?",
"template": browseTemplate,
"reloadOnSearch": false
},
{
"when": "",
"template": browseTemplate,
"reloadOnSearch": false
"redirectTo": "/browse/"
}
],
"constants": [
@ -140,10 +139,6 @@ define([
}
],
"representations": [
{
"key": "view-object",
"templateUrl": "templates/view-object.html"
},
{
"key": "browse-object",
"template": browseObjectTemplate,
@ -203,7 +198,10 @@ define([
"services": [
{
"key": "navigationService",
"implementation": NavigationService
"implementation": NavigationService,
"depends": [
"$window"
]
}
],
"actions": [
@ -211,10 +209,7 @@ define([
"key": "navigate",
"implementation": NavigateAction,
"depends": [
"navigationService",
"$q",
"policyService",
"$window"
"navigationService"
]
},
{
@ -231,7 +226,7 @@ define([
"$window"
],
"group": "windowing",
"cssclass": "icon-new-window",
"cssClass": "icon-new-window",
"priority": "preferred"
},
{
@ -246,7 +241,7 @@ define([
{
"key": "items",
"name": "Items",
"cssclass": "icon-thumbs-strip",
"cssClass": "icon-thumbs-strip",
"description": "Grid of available items",
"template": itemsTemplate,
"uses": [

View File

@ -43,7 +43,7 @@
</mct-representation>
</div>
</div>
<div class="holder l-flex-col flex-elem grows l-object-wrapper">
<div class="holder l-flex-col flex-elem grows l-object-wrapper l-controls-visible l-time-controller-visible">
<div class="holder l-flex-col flex-elem grows l-object-wrapper-inner">
<!-- Toolbar and Save/Cancel buttons -->
<div class="l-edit-controls flex-elem l-flex-row flex-align-end">
@ -59,4 +59,5 @@
</mct-representation>
</div>
</div>
<mct-include key="'conductor'" class="abs holder flex-elem flex-fixed l-flex-row l-time-conductor-holder"></mct-include>
</div>

View File

@ -63,7 +63,7 @@
<mct-split-pane class='l-object-and-inspector contents abs' anchor='right'>
<div class='split-pane-component t-object pane primary-pane left'>
<mct-representation mct-object="navigatedObject"
key="'view-object'"
key="navigatedObject.getCapability('status').get('editing') ? 'edit-object' : 'browse-object'"
class="abs holder holder-object">
</mct-representation>
<a class="mini-tab-icon anchor-right mobile-hide toggle-pane toggle-inspect flush-right"

View File

@ -22,7 +22,8 @@
<span class='type-icon flex-elem {{type.getCssClass()}}'></span>
<span class="l-elem-wrapper l-flex-row flex-elem grows">
<span ng-if="parameters.mode" class='action flex-elem'>{{parameters.mode}}</span>
<span class='title-label flex-elem flex-can-shrink'>{{model.name}}</span>
<span class='title-label flex-elem holder flex-can-shrink'>{{model.name}}</span>
<span class='t-object-alert t-alert-unsynced flex-elem holder' title='This object is not currently displaying real-time data'></span>
<mct-representation
key="'menu-arrow'"
mct-object='domainObject'

View File

@ -28,8 +28,6 @@ define(
[],
function () {
var ROOT_ID = "ROOT";
/**
* The BrowseController is used to populate the initial scope in Browse
* mode. It loads the root object from the objectService and makes it
@ -49,74 +47,26 @@ define(
urlService,
defaultPath
) {
var path = [ROOT_ID].concat(
($route.current.params.ids || defaultPath).split("/")
);
var initialPath = ($route.current.params.ids || defaultPath).split("/");
var currentIds;
function updateRoute(domainObject) {
var priorRoute = $route.current,
// Act as if params HADN'T changed to avoid page reload
unlisten;
unlisten = $scope.$on('$locationChangeSuccess', function () {
// Checks path to make sure /browse/ is at front
// if so, change $route.current
if ($location.path().indexOf("/browse/") === 0) {
$route.current = priorRoute;
}
unlisten();
});
// urlService.urlForLocation used to adjust current
// path to new, addressed, path based on
// domainObject
$location.path(urlService.urlForLocation("browse", domainObject));
$scope.treeModel = {
selectedObject: undefined,
onSelection: function (object) {
navigationService.setNavigation(object, true);
},
allowSelection: function (object) {
return navigationService.shouldNavigate();
}
};
function idsForObject(domainObject) {
return urlService
.urlForLocation("", domainObject)
.replace('/', '');
}
function setScopeObjects(domainObject, navigationAllowed) {
if (navigationAllowed) {
$scope.navigatedObject = domainObject;
$scope.treeModel.selectedObject = domainObject;
updateRoute(domainObject);
} else {
//If navigation was unsuccessful (ie. blocked), reset
// the selected object in the tree to the currently
// navigated object
$scope.treeModel.selectedObject = $scope.navigatedObject ;
}
}
// Callback for updating the in-scope reference to the object
// that is currently navigated-to.
function setNavigation(domainObject) {
if (domainObject === $scope.navigatedObject) {
//do nothing;
return;
}
if (domainObject) {
domainObject.getCapability("action").perform("navigate").then(setScopeObjects.bind(undefined, domainObject));
} else {
setScopeObjects(domainObject, true);
}
}
function navigateTo(domainObject) {
// Check if an object has been navigated-to already...
// If not, or if an ID path has been explicitly set in the URL,
// navigate to the URL-specified object.
if (!navigationService.getNavigation() || $route.current.params.ids) {
// If not, pick a default as the last
// root-level component (usually "mine")
navigationService.setNavigation(domainObject);
$scope.navigatedObject = domainObject;
} else {
// Otherwise, just expose the currently navigated object.
$scope.navigatedObject = navigationService.getNavigation();
updateRoute($scope.navigatedObject);
}
}
// Find an object in an array of objects.
function findObject(domainObjects, id) {
var i;
for (i = 0; i < domainObjects.length; i += 1) {
@ -126,63 +76,87 @@ define(
}
}
// Navigate to the domain object identified by path[index],
// which we expect to find in the composition of the passed
// domain object.
function doNavigate(domainObject, index) {
var composition = domainObject.useCapability("composition");
if (composition) {
composition.then(function (c) {
var nextObject = findObject(c, path[index]);
if (nextObject) {
if (index + 1 >= path.length) {
navigateTo(nextObject);
} else {
doNavigate(nextObject, index + 1);
}
} else if (index === 1 && c.length > 0) {
// Roots are in a top-level container that we don't
// want to be selected, so if we couldn't find an
// object at the path we wanted, at least select
// one of its children.
navigateTo(c[c.length - 1]);
} else {
// Couldn't find the next element of the path
// so navigate to the last path object we did find
navigateTo(domainObject);
}
// helper, fetch a single object from the object service.
function getObject(id) {
return objectService.getObjects([id])
.then(function (results) {
return results[id];
});
} else {
// Similar to above case; this object has no composition,
// so navigate to it instead of subsequent path elements.
navigateTo(domainObject);
}
// recursively locate and return an object inside of a container
// via a path. If at any point in the recursion it fails to find
// the next object, it will return the parent.
function findViaComposition(containerObject, path) {
var nextId = path.shift();
if (!nextId) {
return containerObject;
}
return containerObject.useCapability('composition')
.then(function (composees) {
var nextObject = findObject(composees, nextId);
if (!nextObject) {
return containerObject;
}
if (!nextObject.hasCapability('composition')) {
return nextObject;
}
return findViaComposition(nextObject, path);
});
}
function navigateToObject(desiredObject) {
$scope.navigatedObject = desiredObject;
$scope.treeModel.selectedObject = desiredObject;
currentIds = idsForObject(desiredObject);
$route.current.pathParams.ids = currentIds;
$location.path('/browse/' + currentIds);
}
function navigateToPath(path) {
return getObject('ROOT')
.then(function (root) {
return findViaComposition(root, path);
})
.then(function (object) {
navigationService.setNavigation(object);
});
}
getObject('ROOT')
.then(function (root) {
$scope.domainObject = root;
navigateToPath(initialPath);
});
// Handle navigation events from view service. Only navigates
// if path has changed.
function navigateDirectlyToModel(domainObject) {
var newIds = idsForObject(domainObject);
if (currentIds !== newIds) {
currentIds = newIds;
navigateToObject(domainObject);
}
}
// Load the root object, put it in the scope.
// Also, load its immediate children, and (possibly)
// navigate to one of them, so that navigation state has
// a useful initial value.
objectService.getObjects([path[0]]).then(function (objects) {
$scope.domainObject = objects[path[0]];
doNavigate($scope.domainObject, 1);
});
// Provide a model for the tree to modify
$scope.treeModel = {
selectedObject: navigationService.getNavigation()
};
// Listen for changes in navigation state.
navigationService.addListener(setNavigation);
navigationService.addListener(navigateDirectlyToModel);
// Also listen for changes which come from the tree. Changes in
// the tree will trigger a change in browse navigation state.
$scope.$watch("treeModel.selectedObject", setNavigation);
// Listen for route changes which are caused by browser events
// (e.g. bookmarks to pages in OpenMCT) and prevent them. Instead,
// navigate to the path ourselves, which results in it being
// properly set.
$scope.$on('$routeChangeStart', function (event, route) {
if (route.$$route === $route.current.$$route &&
route.pathParams.ids !== $route.current.pathParams.ids) {
event.preventDefault();
navigateToPath(route.pathParams.ids.split('/'));
}
});
// Clean up when the scope is destroyed
$scope.$on("$destroy", function () {
navigationService.removeListener(setNavigation);
navigationService.removeListener(navigateDirectlyToModel);
});
}

View File

@ -51,24 +51,16 @@ define(
}
function updateQueryParam(viewKey) {
var unlisten,
priorRoute = $route.current;
if (viewKey) {
if (viewKey && $location.search().view !== viewKey) {
$location.search('view', viewKey);
unlisten = $scope.$on('$locationChangeSuccess', function () {
// Checks path to make sure /browse/ is at front
// if so, change $route.current
if ($location.path().indexOf("/browse/") === 0) {
$route.current = priorRoute;
}
unlisten();
});
}
}
$scope.$watch('domainObject', setViewForDomainObject);
$scope.$watch('representation.selected.key', updateQueryParam);
$scope.$on('$locationChangeSuccess', function () {
setViewForDomainObject($scope.domainObject);
});
$scope.doAction = function (action) {
return $scope[action] && $scope[action]();

View File

@ -64,11 +64,11 @@ define(
attachStatusListener(domainObject);
}
var navigationListener = navigationService.addListener(attachStatusListener);
navigationService.addListener(attachStatusListener);
$scope.$on("$destroy", function () {
statusListener();
navigationListener();
navigationService.removeListener(attachStatusListener);
});
}

View File

@ -33,12 +33,9 @@ define(
* @constructor
* @implements {Action}
*/
function NavigateAction(navigationService, $q, policyService, $window, context) {
function NavigateAction(navigationService, context) {
this.domainObject = context.domainObject;
this.$q = $q;
this.navigationService = navigationService;
this.policyService = policyService;
this.$window = $window;
}
/**
@ -47,36 +44,12 @@ define(
* navigation has been updated
*/
NavigateAction.prototype.perform = function () {
var self = this,
navigateTo = this.domainObject,
currentObject = self.navigationService.getNavigation();
function allow() {
var navigationAllowed = true;
self.policyService.allow("navigation", currentObject, navigateTo, function (message) {
navigationAllowed = self.$window.confirm(message + "\r\n\r\n" +
" Are you sure you want to continue?");
});
return navigationAllowed;
}
function cancelIfEditing() {
var editing = currentObject.hasCapability('editor') &&
currentObject.getCapability('editor').isEditContextRoot();
return self.$q.when(editing && currentObject.getCapability("editor").finish());
}
function navigate() {
return self.navigationService.setNavigation(navigateTo);
}
if (allow()) {
return cancelIfEditing().then(navigate);
} else {
return this.$q.when(false);
if (this.navigationService.shouldNavigate()) {
this.navigationService.setNavigation(this.domainObject, true);
return Promise.resolve({});
}
return Promise.reject('Navigation Prevented by User');
};
/**

View File

@ -30,16 +30,23 @@ define(
/**
* The navigation service maintains the application's current
* navigation state, and allows listening for changes thereto.
*
* @memberof platform/commonUI/browse
* @constructor
*/
function NavigationService() {
function NavigationService($window) {
this.navigated = undefined;
this.callbacks = [];
this.checks = [];
this.$window = $window;
this.oldUnload = $window.onbeforeunload;
$window.onbeforeunload = this.onBeforeUnload.bind(this);
}
/**
* Get the current navigation state.
*
* @returns {DomainObject} the object that is navigated-to
*/
NavigationService.prototype.getNavigation = function () {
@ -47,16 +54,33 @@ define(
};
/**
* Set the current navigation state. This will invoke listeners.
* Navigate to a specified object. If navigation checks exist and
* return reasons to prevent navigation, it will prompt the user before
* continuing. Trying to navigate to the currently navigated object will
* do nothing.
*
* If a truthy value is passed for `force`, it will skip navigation
* and will not prevent navigation to an already selected object.
*
* @param {DomainObject} domainObject the domain object to navigate to
* @param {Boolean} force if true, force navigation to occur.
* @returns {Boolean} true if navigation occured, otherwise false.
*/
NavigationService.prototype.setNavigation = function (value) {
if (this.navigated !== value) {
this.navigated = value;
this.callbacks.forEach(function (callback) {
callback(value);
});
NavigationService.prototype.setNavigation = function (domainObject, force) {
if (force) {
this.doNavigation(domainObject);
return true;
}
if (this.navigated === domainObject) {
return true;
}
var doNotNavigate = this.shouldWarnBeforeNavigate();
if (doNotNavigate && !this.$window.confirm(doNotNavigate)) {
return false;
}
this.doNavigation(domainObject);
return true;
};
@ -64,6 +88,7 @@ define(
* Listen for changes in navigation. The passed callback will
* be invoked with the new domain object of navigation when
* this changes.
*
* @param {function} callback the callback to invoke when
* navigation state changes
*/
@ -73,6 +98,7 @@ define(
/**
* Stop listening for changes in navigation state.
*
* @param {function} callback the callback which should
* no longer be invoked when navigation state
* changes
@ -83,6 +109,89 @@ define(
});
};
/**
* Check if navigation should proceed. May prompt a user for input
* if any checkFns return messages. Returns true if the user wishes to
* navigate, otherwise false. If using this prior to calling
* `setNavigation`, you should call `setNavigation` with `force=true`
* to prevent duplicate dialogs being displayed to the user.
*
* @returns {Boolean} true if the user wishes to navigate, otherwise false.
*/
NavigationService.prototype.shouldNavigate = function () {
var doNotNavigate = this.shouldWarnBeforeNavigate();
return !doNotNavigate || this.$window.confirm(doNotNavigate);
};
/**
* Register a check function to be called before any navigation occurs.
* Check functions should return a human readable "message" if
* there are any reasons to prevent navigation. Otherwise, they should
* return falsy. Returns a function which can be called to remove the
* check function.
*
* @param {Function} checkFn a function to call before navigation occurs.
* @returns {Function} removeCheck call to remove check
*/
NavigationService.prototype.checkBeforeNavigation = function (checkFn) {
this.checks.push(checkFn);
return function removeCheck() {
this.checks = this.checks.filter(function (fn) {
return checkFn !== fn;
});
}.bind(this);
};
/**
* Private method to actually perform navigation.
*
* @private
*/
NavigationService.prototype.doNavigation = function (value) {
this.navigated = value;
this.callbacks.forEach(function (callback) {
callback(value);
});
};
/**
* Returns either a false value, or a string that should be displayed
* to the user before navigation is allowed.
*
* @private
*/
NavigationService.prototype.shouldWarnBeforeNavigate = function () {
var reasons = [];
this.checks.forEach(function (checkFn) {
var reason = checkFn();
if (reason) {
reasons.push(reason);
}
});
if (reasons.length) {
return reasons.join('\n');
}
return false;
};
/**
* Listener for window on before unload event-- will warn before
* navigation is allowed.
*
* @private
*/
NavigationService.prototype.onBeforeUnload = function () {
var shouldWarnBeforeNavigate = this.shouldWarnBeforeNavigate();
if (shouldWarnBeforeNavigate) {
return shouldWarnBeforeNavigate;
}
if (this.oldUnload) {
return this.oldUnload.apply(undefined, [].slice.apply(arguments));
}
};
return NavigationService;
}
);

View File

@ -43,24 +43,24 @@ define([], function () {
return context.getParent();
}
function isOrphan(domainObject) {
var parent = getParent(domainObject),
composition = parent.getModel().composition,
id = domainObject.getId();
return !composition || (composition.indexOf(id) === -1);
}
function navigateToParent(domainObject) {
function preventOrphanNavigation(domainObject) {
var parent = getParent(domainObject);
return parent.getCapability('action').perform('navigate');
parent.useCapability('composition')
.then(function (composees) {
var isOrphan = composees.every(function (c) {
return c.getId() !== domainObject.getId();
});
if (isOrphan) {
parent.getCapability('action').perform('navigate');
}
});
}
function checkNavigation() {
var navigatedObject = navigationService.getNavigation();
if (navigatedObject.hasCapability('context') &&
isOrphan(navigatedObject)) {
if (navigatedObject.hasCapability('context')) {
if (!navigatedObject.getCapability('editor').isEditContextRoot()) {
navigateToParent(navigatedObject);
preventOrphanNavigation(navigatedObject);
}
}
}

View File

@ -46,12 +46,12 @@ define(
};
FullscreenAction.prototype.getMetadata = function () {
// We override getMetadata, because the icon cssclass and
// We override getMetadata, because the icon cssClass and
// description need to be determined at run-time
// based on whether or not we are currently
// full screen.
var metadata = Object.create(FullscreenAction);
metadata.cssclass = screenfull.isFullscreen ? "icon-fullscreen-expand" : "icon-fullscreen-collapse";
metadata.cssClass = screenfull.isFullscreen ? "icon-fullscreen-expand" : "icon-fullscreen-collapse";
metadata.description = screenfull.isFullscreen ?
EXIT_FULLSCREEN : ENTER_FULLSCREEN;
metadata.group = "windowing";

View File

@ -24,8 +24,14 @@
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
*/
define(
["../src/BrowseController"],
function (BrowseController) {
[
"../src/BrowseController",
"../src/navigation/NavigationService"
],
function (
BrowseController,
NavigationService
) {
describe("The browse controller", function () {
var mockScope,
@ -35,18 +41,17 @@ define(
mockNavigationService,
mockRootObject,
mockUrlService,
mockDomainObject,
mockDefaultRootObject,
mockOtherDomainObject,
mockNextObject,
testDefaultRoot,
mockActionCapability,
controller;
function mockPromise(value) {
return {
then: function (callback) {
return mockPromise(callback(value));
}
};
function waitsForNavigation() {
var calls = mockNavigationService.setNavigation.calls.length;
waitsFor(function () {
return mockNavigationService.setNavigation.calls.length > calls;
});
}
function instantiateController() {
@ -68,85 +73,114 @@ define(
"$scope",
["$on", "$watch"]
);
mockRoute = { current: { params: {} } };
mockLocation = jasmine.createSpyObj(
"$location",
["path"]
);
mockRoute = { current: { params: {}, pathParams: {} } };
mockUrlService = jasmine.createSpyObj(
"urlService",
["urlForLocation"]
);
mockUrlService.urlForLocation.andCallFake(function (mode, object) {
if (object === mockDefaultRootObject) {
return [mode, testDefaultRoot].join('/');
}
if (object === mockOtherDomainObject) {
return [mode, 'other'].join('/');
}
if (object === mockNextObject) {
return [mode, testDefaultRoot, 'next'].join('/');
}
throw new Error('Tried to get url for unexpected object');
});
mockLocation = jasmine.createSpyObj(
"$location",
["path"]
);
mockObjectService = jasmine.createSpyObj(
"objectService",
["getObjects"]
);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[
"getNavigation",
"setNavigation",
"addListener",
"removeListener"
]
);
mockNavigationService = new NavigationService({});
[
"getNavigation",
"setNavigation",
"addListener",
"removeListener"
].forEach(function (method) {
spyOn(mockNavigationService, method)
.andCallThrough();
});
mockRootObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability", "getModel", "useCapability"]
"rootObjectContainer",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability", "getModel", "useCapability"]
mockDefaultRootObject = jasmine.createSpyObj(
"defaultRootObject",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockOtherDomainObject = jasmine.createSpyObj(
"otherDomainObject",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockNextObject = jasmine.createSpyObj(
"nextObject",
["getId", "getCapability", "getModel", "useCapability"]
"nestedDomainObject",
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
);
mockObjectService.getObjects.andReturn(mockPromise({
mockObjectService.getObjects.andReturn(Promise.resolve({
ROOT: mockRootObject
}));
mockRootObject.useCapability.andReturn(mockPromise([
mockDomainObject
mockRootObject.useCapability.andReturn(Promise.resolve([
mockOtherDomainObject,
mockDefaultRootObject
]));
mockDomainObject.useCapability.andReturn(mockPromise([
mockRootObject.hasCapability.andReturn(true);
mockDefaultRootObject.useCapability.andReturn(Promise.resolve([
mockNextObject
]));
mockDefaultRootObject.hasCapability.andReturn(true);
mockOtherDomainObject.hasCapability.andReturn(false);
mockNextObject.useCapability.andReturn(undefined);
mockNextObject.hasCapability.andReturn(false);
mockNextObject.getId.andReturn("next");
mockDomainObject.getId.andReturn(testDefaultRoot);
mockActionCapability = jasmine.createSpyObj('actionCapability', ['perform']);
mockDefaultRootObject.getId.andReturn(testDefaultRoot);
instantiateController();
waitsForNavigation();
});
it("uses composition to set the navigated object, if there is none", function () {
instantiateController();
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
waitsForNavigation();
runs(function () {
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDefaultRootObject);
});
});
it("navigates to a root-level object, even when default path is not found", function () {
mockDomainObject.getId
mockDefaultRootObject.getId
.andReturn("something-other-than-the-" + testDefaultRoot);
instantiateController();
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
});
waitsForNavigation();
runs(function () {
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDefaultRootObject);
});
});
//
it("does not try to override navigation", function () {
mockNavigationService.getNavigation.andReturn(mockDomainObject);
mockNavigationService.getNavigation.andReturn(mockDefaultRootObject);
instantiateController();
expect(mockScope.navigatedObject).toBe(mockDomainObject);
waitsForNavigation();
expect(mockScope.navigatedObject).toBe(mockDefaultRootObject);
});
//
it("updates scope when navigated object changes", function () {
// Should have registered a listener - call it
mockNavigationService.addListener.mostRecentCall.args[0](
mockDomainObject
mockOtherDomainObject
);
expect(mockScope.navigatedObject).toEqual(mockDomainObject);
expect(mockScope.navigatedObject).toEqual(mockOtherDomainObject);
});
@ -166,9 +200,12 @@ define(
it("uses route parameters to choose initially-navigated object", function () {
mockRoute.current.params.ids = testDefaultRoot + "/next";
instantiateController();
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
waitsForNavigation();
runs(function () {
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
});
});
it("handles invalid IDs by going as far as possible", function () {
@ -177,9 +214,13 @@ define(
// it hits an invalid ID.
mockRoute.current.params.ids = testDefaultRoot + "/junk";
instantiateController();
expect(mockScope.navigatedObject).toBe(mockDomainObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
waitsForNavigation();
runs(function () {
expect(mockScope.navigatedObject).toBe(mockDefaultRootObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDefaultRootObject);
});
});
it("handles compositionless objects by going as far as possible", function () {
@ -188,84 +229,33 @@ define(
// should stop at it since remaining IDs cannot be loaded.
mockRoute.current.params.ids = testDefaultRoot + "/next/junk";
instantiateController();
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
waitsForNavigation();
runs(function () {
expect(mockScope.navigatedObject).toBe(mockNextObject);
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockNextObject);
});
});
it("updates the displayed route to reflect current navigation", function () {
var mockContext = jasmine.createSpyObj('context', ['getPath']),
mockUnlisten = jasmine.createSpy('unlisten'),
mockMode = "browse";
mockContext.getPath.andReturn(
[mockRootObject, mockDomainObject, mockNextObject]
);
//Return true from navigate action
mockActionCapability.perform.andReturn(mockPromise(true));
mockNextObject.getCapability.andCallFake(function (c) {
return (c === 'context' && mockContext) ||
(c === 'action' && mockActionCapability);
// In order to trigger a route update and not a route change,
// the current route must be updated before location.path is
// called.
expect(mockRoute.current.pathParams.ids)
.not
.toBe(testDefaultRoot + '/next');
mockLocation.path.andCallFake(function () {
expect(mockRoute.current.pathParams.ids)
.toBe(testDefaultRoot + '/next');
});
mockScope.$on.andReturn(mockUnlisten);
// Provide a navigation change
mockNavigationService.addListener.mostRecentCall.args[0](
mockNextObject
);
// Allows the path index to be checked
// prior to setting $route.current
mockLocation.path.andReturn("/browse/");
mockNavigationService.setNavigation.andReturn(true);
mockActionCapability.perform.andReturn(mockPromise(true));
// Exercise the Angular workaround
mockNavigationService.addListener.mostRecentCall.args[0]();
mockScope.$on.mostRecentCall.args[1]();
expect(mockUnlisten).toHaveBeenCalled();
// location.path to be called with the urlService's
// urlFor function with the next domainObject and mode
expect(mockLocation.path).toHaveBeenCalledWith(
mockUrlService.urlForLocation(mockMode, mockNextObject)
'/browse/' + testDefaultRoot + '/next'
);
});
it("after successful navigation event sets the selected tree " +
"object", function () {
mockScope.navigatedObject = mockDomainObject;
mockNavigationService.setNavigation.andReturn(true);
mockActionCapability.perform.andReturn(mockPromise(true));
mockNextObject.getCapability.andReturn(mockActionCapability);
//Simulate a change in selected tree object
mockScope.treeModel = {selectedObject: mockDomainObject};
mockScope.$watch.mostRecentCall.args[1](mockNextObject);
expect(mockScope.treeModel.selectedObject).toBe(mockNextObject);
expect(mockScope.treeModel.selectedObject).not.toBe(mockDomainObject);
});
it("after failed navigation event resets the selected tree" +
" object", function () {
mockScope.navigatedObject = mockDomainObject;
//Return false from navigation action
mockActionCapability.perform.andReturn(mockPromise(false));
mockNextObject.getCapability.andReturn(mockActionCapability);
//Simulate a change in selected tree object
mockScope.treeModel = {selectedObject: mockDomainObject};
mockScope.$watch.mostRecentCall.args[1](mockNextObject);
expect(mockScope.treeModel.selectedObject).not.toBe(mockNextObject);
expect(mockScope.treeModel.selectedObject).toBe(mockDomainObject);
});
});
}
);

View File

@ -29,7 +29,6 @@ define(
var mockScope,
mockLocation,
mockRoute,
mockUnlisten,
controller;
// Utility function; look for a $watch on scope and fire it
@ -51,9 +50,7 @@ define(
"$location",
["path", "search"]
);
mockUnlisten = jasmine.createSpy("unlisten");
mockScope.$on.andReturn(mockUnlisten);
mockLocation.search.andReturn({});
controller = new BrowseObjectController(
mockScope,
@ -69,10 +66,6 @@ define(
// Allows the path index to be checked
// prior to setting $route.current
mockLocation.path.andReturn("/browse/");
// Exercise the Angular workaround
mockScope.$on.mostRecentCall.args[1]();
expect(mockUnlisten).toHaveBeenCalled();
});
it("sets the active view from query parameters", function () {

View File

@ -23,145 +23,74 @@
/**
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
*/
define(
["../../src/navigation/NavigateAction"],
function (NavigateAction) {
define([
"../../src/navigation/NavigateAction"
], function (
NavigateAction
) {
describe("The navigate action", function () {
var mockNavigationService,
mockQ,
mockDomainObject,
mockPolicyService,
mockNavigatedObject,
mockWindow,
capabilities,
action;
describe("The navigate action", function () {
var mockNavigationService,
mockDomainObject,
action;
function mockPromise(value) {
return {
then: function (callback) {
return mockPromise(callback(value));
}
};
}
beforeEach(function () {
capabilities = {};
mockQ = { when: mockPromise };
mockNavigatedObject = jasmine.createSpyObj(
"domainObject",
[
"getId",
"getModel",
"hasCapability",
"getCapability"
]
);
capabilities.editor = jasmine.createSpyObj("editorCapability", [
"isEditContextRoot",
"finish"
]);
mockNavigatedObject.getCapability.andCallFake(function (capability) {
return capabilities[capability];
});
mockNavigatedObject.hasCapability.andReturn(false);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[
"setNavigation",
"getNavigation"
]
);
mockNavigationService.getNavigation.andReturn(mockNavigatedObject);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[
"getId",
"getModel"
]
);
mockPolicyService = jasmine.createSpyObj("policyService",
[
"allow"
]);
mockWindow = jasmine.createSpyObj("$window",
[
"confirm"
]);
action = new NavigateAction(
mockNavigationService,
mockQ,
mockPolicyService,
mockWindow,
{ domainObject: mockDomainObject }
);
function waitForCall() {
var called = false;
waitsFor(function () {
return called;
});
return function () {
called = true;
};
}
it("invokes the policy service to determine if navigation" +
" allowed", function () {
action.perform();
expect(mockPolicyService.allow)
.toHaveBeenCalledWith("navigation", jasmine.any(Object), jasmine.any(Object), jasmine.any(Function));
});
beforeEach(function () {
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[
"shouldNavigate",
"setNavigation"
]
);
it("prompts user if policy rejection", function () {
action.perform();
expect(mockPolicyService.allow).toHaveBeenCalled();
mockPolicyService.allow.mostRecentCall.args[3]();
expect(mockWindow.confirm).toHaveBeenCalled();
});
describe("shows a prompt", function () {
beforeEach(function () {
// Ensure the allow callback is called synchronously
mockPolicyService.allow.andCallFake(function () {
return arguments[3]();
});
});
it("does not navigate on prompt rejection", function () {
mockWindow.confirm.andReturn(false);
action.perform();
expect(mockNavigationService.setNavigation)
.not.toHaveBeenCalled();
});
it("does navigate on prompt acceptance", function () {
mockWindow.confirm.andReturn(true);
action.perform();
expect(mockNavigationService.setNavigation)
.toHaveBeenCalled();
});
});
describe("in edit mode", function () {
beforeEach(function () {
mockNavigatedObject.hasCapability.andCallFake(function (capability) {
return capability === "editor";
});
capabilities.editor.isEditContextRoot.andReturn(true);
});
it("finishes editing if in edit mode", function () {
action.perform();
expect(capabilities.editor.finish)
.toHaveBeenCalled();
});
});
it("is only applicable when a domain object is in context", function () {
expect(NavigateAction.appliesTo({})).toBeFalsy();
expect(NavigateAction.appliesTo({
domainObject: mockDomainObject
})).toBeTruthy();
});
mockDomainObject = {};
action = new NavigateAction(
mockNavigationService,
{ domainObject: mockDomainObject }
);
});
}
);
it("sets navigation if it is allowed", function () {
mockNavigationService.shouldNavigate.andReturn(true);
action.perform()
.then(waitForCall());
runs(function () {
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject, true);
});
});
it("does not set navigation if it is not allowed", function () {
mockNavigationService.shouldNavigate.andReturn(false);
var onSuccess = jasmine.createSpy('onSuccess');
action.perform()
.then(onSuccess, waitForCall());
runs(function () {
expect(onSuccess).not.toHaveBeenCalled();
expect(mockNavigationService.setNavigation)
.not
.toHaveBeenCalledWith(mockDomainObject);
});
});
it("is only applicable when a domain object is in context", function () {
expect(NavigateAction.appliesTo({})).toBeFalsy();
expect(NavigateAction.appliesTo({
domainObject: mockDomainObject
})).toBeTruthy();
});
});
});

View File

@ -28,10 +28,12 @@ define(
function (NavigationService) {
describe("The navigation service", function () {
var navigationService;
var $window,
navigationService;
beforeEach(function () {
navigationService = new NavigationService();
$window = jasmine.createSpyObj('$window', ['confirm']);
navigationService = new NavigationService($window);
});
it("stores navigation state", function () {

View File

@ -33,7 +33,7 @@ define([
mockContext,
mockActionCapability,
mockEditor,
testParentModel,
testParentComposition,
testId,
mockThrottledFns;
@ -41,7 +41,6 @@ define([
testId = 'some-identifier';
mockThrottledFns = [];
testParentModel = {};
mockTopic = jasmine.createSpy('topic');
mockThrottle = jasmine.createSpy('throttle');
@ -55,14 +54,12 @@ define([
mockDomainObject = jasmine.createSpyObj('domainObject', [
'getId',
'getCapability',
'getModel',
'hasCapability'
]);
mockParentObject = jasmine.createSpyObj('domainObject', [
'getId',
'getCapability',
'getModel',
'hasCapability'
'useCapability'
]);
mockContext = jasmine.createSpyObj('context', ['getParent']);
mockActionCapability = jasmine.createSpyObj('action', ['perform']);
@ -75,9 +72,7 @@ define([
mockThrottledFns.push(mockThrottledFn);
return mockThrottledFn;
});
mockTopic.andCallFake(function (k) {
return k === 'mutation' && mockMutationTopic;
});
mockTopic.andReturn(mockMutationTopic);
mockDomainObject.getId.andReturn(testId);
mockDomainObject.getCapability.andCallFake(function (c) {
return {
@ -88,12 +83,13 @@ define([
mockDomainObject.hasCapability.andCallFake(function (c) {
return !!mockDomainObject.getCapability(c);
});
mockParentObject.getModel.andReturn(testParentModel);
mockParentObject.getCapability.andCallFake(function (c) {
return {
action: mockActionCapability
}[c];
});
testParentComposition = [];
mockParentObject.useCapability.andReturn(Promise.resolve(testParentComposition));
mockContext.getParent.andReturn(mockParentObject);
mockNavigationService.getNavigation.andReturn(mockDomainObject);
mockEditor.isEditContextRoot.andReturn(false);
@ -126,7 +122,9 @@ define([
var prefix = isOrphan ? "" : "non-";
describe("for " + prefix + "orphan objects", function () {
beforeEach(function () {
testParentModel.composition = isOrphan ? [] : [testId];
if (!isOrphan) {
testParentComposition.push(mockDomainObject);
}
});
[false, true].forEach(function (isEditRoot) {
@ -136,13 +134,31 @@ define([
function itNavigatesAsExpected() {
if (isOrphan && !isEditRoot) {
it("navigates to the parent", function () {
expect(mockActionCapability.perform)
.toHaveBeenCalledWith('navigate');
var done = false;
waitsFor(function () {
return done;
});
setTimeout(function () {
done = true;
}, 5);
runs(function () {
expect(mockActionCapability.perform)
.toHaveBeenCalledWith('navigate');
});
});
} else {
it("does nothing", function () {
expect(mockActionCapability.perform)
.not.toHaveBeenCalled();
var done = false;
waitsFor(function () {
return done;
});
setTimeout(function () {
done = true;
}, 5);
runs(function () {
expect(mockActionCapability.perform)
.not.toHaveBeenCalled();
});
});
}
}
@ -157,7 +173,6 @@ define([
mockNavigationService.addListener.mostRecentCall
.args[0](mockDomainObject);
});
itNavigatesAsExpected();
});

View File

@ -51,7 +51,7 @@ define(
});
it("provides displayable metadata", function () {
expect(action.getMetadata().cssclass).toBeDefined();
expect(action.getMetadata().cssClass).toBeDefined();
});
});

View File

@ -53,7 +53,8 @@ define([
"depends": [
"overlayService",
"$q",
"$log"
"$log",
"$document"
]
},
{

View File

@ -35,11 +35,15 @@ define(
* @memberof platform/commonUI/dialog
* @constructor
*/
function DialogService(overlayService, $q, $log) {
function DialogService(overlayService, $q, $log, $document) {
this.overlayService = overlayService;
this.$q = $q;
this.$log = $log;
this.activeOverlay = undefined;
this.findBody = function () {
return $document.find('body');
};
}
/**
@ -60,7 +64,8 @@ define(
// input is asynchronous.
var deferred = this.$q.defer(),
self = this,
overlay;
overlay,
handleEscKeydown;
// Confirm function; this will be passed in to the
// overlay-dialog template and associated with a
@ -76,13 +81,22 @@ define(
// Cancel or X button click
function cancel() {
deferred.reject();
self.findBody().off('keydown', handleEscKeydown);
self.dismissOverlay(overlay);
}
handleEscKeydown = function (event) {
if (event.keyCode === 27) {
cancel();
}
};
// Add confirm/cancel callbacks
model.confirm = confirm;
model.cancel = cancel;
this.findBody().on('keydown', handleEscKeydown);
if (this.canShowDialog(model)) {
// Add the overlay using the OverlayService, which
// will handle actual insertion into the DOM

View File

@ -33,6 +33,8 @@ define(
mockLog,
mockOverlay,
mockDeferred,
mockDocument,
mockBody,
dialogService;
beforeEach(function () {
@ -56,6 +58,13 @@ define(
"deferred",
["resolve", "reject"]
);
mockDocument = jasmine.createSpyObj(
"$document",
["find"]
);
mockBody = jasmine.createSpyObj('body', ['on', 'off']);
mockDocument.find.andReturn(mockBody);
mockDeferred.promise = "mock promise";
mockQ.defer.andReturn(mockDeferred);
@ -64,7 +73,8 @@ define(
dialogService = new DialogService(
mockOverlayService,
mockQ,
mockLog
mockLog,
mockDocument
);
});
@ -130,6 +140,36 @@ define(
);
});
it("adds a keydown event listener to the body", function () {
dialogService.getUserInput({}, {});
expect(mockDocument.find).toHaveBeenCalledWith("body");
expect(mockBody.on).toHaveBeenCalledWith("keydown", jasmine.any(Function));
});
it("destroys the event listener when the dialog is cancelled", function () {
dialogService.getUserInput({}, {});
mockOverlayService.createOverlay.mostRecentCall.args[1].cancel();
expect(mockBody.off).toHaveBeenCalledWith("keydown", jasmine.any(Function));
});
it("cancels the dialog when an escape keydown event is triggered", function () {
dialogService.getUserInput({}, {});
mockBody.on.mostRecentCall.args[1]({
keyCode: 27
});
expect(mockDeferred.reject).toHaveBeenCalled();
expect(mockDeferred.resolve).not.toHaveBeenCalled();
});
it("ignores non escape keydown events", function () {
dialogService.getUserInput({}, {});
mockBody.on.mostRecentCall.args[1]({
keyCode: 13
});
expect(mockDeferred.reject).not.toHaveBeenCalled();
expect(mockDeferred.resolve).not.toHaveBeenCalled();
});
describe("the blocking message dialog", function () {
var dialogModel = {};
var dialogHandle;

View File

@ -2,25 +2,6 @@ Contains sources and resources associated with Edit mode.
# Extensions
## Directives
This bundle introduces the `mct-before-unload` directive, primarily for
internal use (to prompt the user to confirm navigation away from unsaved
changes in Edit mode.)
The `mct-before-unload` directive is used as an attribute whose value is
an Angular expression that is evaluated when navigation changes (either
via browser-level changes, such as the refresh button, or changes to
the Angular route, which happens when hitting the back button in Edit
mode.) The result of this evaluation, when truthy, is shown in a browser
dialog to allow the user to confirm navigation. When falsy, no prompt is
shown, allowing these dialogs to be shown conditionally. (For instance, in
Edit mode, prompts are only shown if user-initiated changes have
occurred.)
This directive may be attached to any element; its behavior will be enforced
so long as that element remains within the DOM.
# Toolbars
Views may specify the contents of a toolbar through a `toolbar`

View File

@ -25,7 +25,6 @@ define([
"./src/controllers/EditPanesController",
"./src/controllers/ElementsController",
"./src/controllers/EditObjectController",
"./src/directives/MCTBeforeUnload",
"./src/actions/EditAndComposeAction",
"./src/actions/EditAction",
"./src/actions/PropertiesAction",
@ -37,7 +36,6 @@ define([
"./src/policies/EditActionPolicy",
"./src/policies/EditableLinkPolicy",
"./src/policies/EditableMovePolicy",
"./src/policies/EditNavigationPolicy",
"./src/policies/EditContextualActionPolicy",
"./src/representers/EditRepresenter",
"./src/representers/EditToolbarRepresenter",
@ -65,7 +63,6 @@ define([
EditPanesController,
ElementsController,
EditObjectController,
MCTBeforeUnload,
EditAndComposeAction,
EditAction,
PropertiesAction,
@ -77,7 +74,6 @@ define([
EditActionPolicy,
EditableLinkPolicy,
EditableMovePolicy,
EditNavigationPolicy,
EditContextualActionPolicy,
EditRepresenter,
EditToolbarRepresenter,
@ -132,7 +128,7 @@ define([
"depends": [
"$scope",
"$location",
"policyService"
"navigationService"
]
},
{
@ -152,15 +148,6 @@ define([
]
}
],
"directives": [
{
"key": "mctBeforeUnload",
"implementation": MCTBeforeUnload,
"depends": [
"$window"
]
}
],
"actions": [
{
"key": "compose",
@ -176,7 +163,7 @@ define([
],
"description": "Edit",
"category": "view-control",
"cssclass": "major icon-pencil"
"cssClass": "major icon-pencil"
},
{
"key": "properties",
@ -185,7 +172,7 @@ define([
"view-control"
],
"implementation": PropertiesAction,
"cssclass": "major icon-pencil",
"cssClass": "major icon-pencil",
"name": "Edit Properties...",
"description": "Edit properties of this object.",
"depends": [
@ -196,11 +183,10 @@ define([
"key": "remove",
"category": "contextual",
"implementation": RemoveAction,
"cssclass": "icon-trash",
"cssClass": "icon-trash",
"name": "Remove",
"description": "Remove this object from its containing object.",
"depends": [
"$q",
"navigationService"
]
},
@ -209,10 +195,11 @@ define([
"category": "save",
"implementation": SaveAndStopEditingAction,
"name": "Save and Finish Editing",
"cssclass": "icon-save labeled",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService"
"dialogService",
"notificationService"
]
},
{
@ -220,10 +207,11 @@ define([
"category": "save",
"implementation": SaveAction,
"name": "Save and Continue Editing",
"cssclass": "icon-save labeled",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService"
"dialogService",
"notificationService"
]
},
{
@ -231,13 +219,14 @@ define([
"category": "save",
"implementation": SaveAsAction,
"name": "Save As...",
"cssclass": "icon-save labeled",
"cssClass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"$injector",
"policyService",
"dialogService",
"copyService"
"copyService",
"notificationService"
],
"priority": "mandatory"
},
@ -245,8 +234,10 @@ define([
"key": "cancel",
"category": "conclude-editing",
"implementation": CancelAction,
"name": "Cancel",
"cssclass": "icon-x no-label",
// Because we use the name as label for edit buttons and mct-control buttons need
// the label to be set to undefined in order to not apply the labeled CSS rule.
"name": undefined,
"cssClass": "icon-x no-label",
"description": "Discard changes made to these objects.",
"depends": []
}
@ -269,11 +260,6 @@ define([
"category": "action",
"implementation": EditableLinkPolicy
},
{
"category": "navigation",
"message": "Continuing will cause the loss of any unsaved changes.",
"implementation": EditNavigationPolicy
},
{
"implementation": CreationPolicy,
"category": "creation"
@ -346,7 +332,8 @@ define([
"implementation": TransactionService,
"depends": [
"$q",
"$log"
"$log",
"cacheService"
]
},
{
@ -387,7 +374,6 @@ define([
{
"implementation": EditRepresenter,
"depends": [
"$q",
"$log"
]
},

View File

@ -25,14 +25,14 @@
<li ng-repeat="createAction in createActions" ng-click="createAction.perform()">
<a ng-mouseover="representation.activeMetadata = createAction.getMetadata()"
ng-mouseleave="representation.activeMetadata = undefined"
class="menu-item-a {{ createAction.getMetadata().cssclass }}">
class="menu-item-a {{ createAction.getMetadata().cssClass }}">
{{createAction.getMetadata().name}}
</a>
</li>
</ul>
</div>
<div class="pane right menu-item-description">
<div class="desc-area icon {{ representation.activeMetadata.cssclass }}"></div>
<div class="desc-area icon {{ representation.activeMetadata.cssClass }}"></div>
<div class="desc-area title">
{{representation.activeMetadata.name}}
</div>

View File

@ -25,8 +25,8 @@
<mct-control key="'button'"
structure="{
text: saveActions[0].getMetadata().name,
click: saveActions[0].perform,
cssclass: 'major ' + saveActions[0].getMetadata().cssclass
click: actionPerformer(saveActions[0]),
cssClass: 'major ' + saveActions[0].getMetadata().cssClass
}">
</mct-control>
</span>
@ -36,17 +36,18 @@
structure="{
options: saveActionsAsMenuOptions,
click: saveActionMenuClickHandler,
cssclass: 'btn-bar right icon-save no-label major'
cssClass: 'btn-bar right icon-save no-label major'
}">
</mct-control>
</span>
<span ng-repeat="currentAction in otherEditActions">
<a class='s-button {{currentAction.getMetadata().cssclass}}'
title='{{currentAction.getMetadata().name}}'
ng-click="currentAction.perform()"
ng-class="{ major: $index === 0 && saveActions.length === 0 }">
<span class="title-label">{{currentAction.getMetadata().name}}</span>
</a>
<mct-control key="'button'"
structure="{
text: currentAction.getMetadata().name,
click: actionPerformer(currentAction),
cssClass: currentAction.getMetadata().cssClass
}">
</mct-control>
</span>
</span>

View File

@ -20,8 +20,7 @@
at runtime from the About dialog for additional information.
-->
<div class="abs l-flex-col" ng-controller="EditObjectController as EditObjectController">
<div mct-before-unload="EditObjectController.getUnloadWarning()"
class="holder flex-elem l-flex-row object-browse-bar ">
<div class="holder flex-elem l-flex-row object-browse-bar ">
<div class="items-select left flex-elem l-flex-row grows">
<mct-representation key="'back-arrow'"
mct-object="domainObject"
@ -66,4 +65,9 @@
</mct-representation>
</div><!--/ l-object-wrapper-inner -->
</div>
<mct-representation mct-object="domainObject"
key="'time-conductor'"
class="abs holder flex-elem flex-fixed l-flex-row l-time-conductor-holder">
</mct-representation>
</div>

View File

@ -56,13 +56,13 @@ define(
//navigate back to parent because nothing to show.
return domainObject.getCapability("location").getOriginal().then(function (original) {
parent = original.getCapability("context").getParent();
parent.getCapability("action").perform("navigate");
return parent.getCapability("action").perform("navigate");
});
}
}
function cancel(allowed) {
return allowed && domainObject.getCapability("editor").finish();
function cancel() {
return domainObject.getCapability("editor").finish();
}
//Do navigation first in order to trigger unsaved changes dialog

View File

@ -40,19 +40,11 @@ define(
var self = this,
editAction = this.domainObject.getCapability('action').getActions("edit")[0];
// Persist changes to the domain object
function doPersist() {
var persistence =
self.domainObject.getCapability('persistence');
return persistence.persist();
}
// Link these objects
function doLink() {
var composition = self.domainObject &&
self.domainObject.getCapability('composition');
return composition && composition.add(self.selectedObject)
.then(doPersist);
return composition && composition.add(self.selectedObject);
}
if (editAction) {

View File

@ -50,12 +50,6 @@ define(
domainObject = this.domainObject,
dialogService = this.dialogService;
// Persist modifications to this domain object
function doPersist() {
var persistence = domainObject.getCapability('persistence');
return persistence && persistence.persist();
}
// Update the domain object model based on user input
function updateModel(userInput, dialog) {
return domainObject.useCapability('mutation', function (model) {
@ -73,11 +67,9 @@ define(
dialog.getFormStructure(),
dialog.getInitialFormValue()
).then(function (userInput) {
// Update the model, if user input was provided
return userInput && updateModel(userInput, dialog);
}).then(function (result) {
return result && doPersist();
});
// Update the model, if user input was provided
return userInput && updateModel(userInput, dialog);
});
}
return type && showDialog(type);
@ -94,9 +86,7 @@ define(
creatable = type && type.hasFeature('creation');
// Only allow creatable types to be edited
return domainObject &&
domainObject.hasCapability("persistence") &&
creatable;
return domainObject && creatable;
};
return PropertiesAction;

View File

@ -39,9 +39,8 @@ define(
* @constructor
* @implements {Action}
*/
function RemoveAction($q, navigationService, context) {
function RemoveAction(navigationService, context) {
this.domainObject = (context || {}).domainObject;
this.$q = $q;
this.navigationService = navigationService;
}
@ -51,8 +50,7 @@ define(
* fulfilled when the action has completed.
*/
RemoveAction.prototype.perform = function () {
var $q = this.$q,
navigationService = this.navigationService,
var navigationService = this.navigationService,
domainObject = this.domainObject;
/*
* Check whether an object ID matches the ID of the object being
@ -71,15 +69,6 @@ define(
model.composition = model.composition.filter(isNotObject);
}
/*
* Invoke persistence on a domain object. This will be called upon
* the removed object's parent (as its composition will have changed.)
*/
function doPersist(domainObj) {
var persistence = domainObj.getCapability('persistence');
return persistence && persistence.persist();
}
/*
* Checks current object and ascendants of current
* object with object being removed, if the current
@ -119,15 +108,10 @@ define(
// navigates to existing object up tree
checkObjectNavigation(object, parent);
return $q.when(
parent.useCapability('mutation', doMutate)
).then(function () {
return doPersist(parent);
});
return parent.useCapability('mutation', doMutate);
}
return $q.when(domainObject)
.then(removeFromContext);
return removeFromContext(domainObject);
};
// Object needs to have a parent for Remove to be applicable

View File

@ -33,10 +33,12 @@ define(
*/
function SaveAction(
dialogService,
notificationService,
context
) {
this.domainObject = (context || {}).domainObject;
this.dialogService = dialogService;
this.notificationService = notificationService;
}
/**
@ -47,7 +49,8 @@ define(
* @memberof platform/commonUI/edit.SaveAction#
*/
SaveAction.prototype.perform = function () {
var domainObject = this.domainObject,
var self = this,
domainObject = this.domainObject,
dialog = new SaveInProgressDialog(this.dialogService);
// Invoke any save behavior introduced by the editor capability;
@ -58,15 +61,21 @@ define(
return domainObject.getCapability("editor").save();
}
function hideBlockingDialog() {
function onSuccess() {
dialog.hide();
self.notificationService.info("Save Succeeded");
}
function onFailure() {
dialog.hide();
self.notificationService.error("Save Failed");
}
dialog.show();
return doSave()
.then(hideBlockingDialog)
.catch(hideBlockingDialog);
.then(onSuccess)
.catch(onFailure);
};
/**

View File

@ -33,11 +33,13 @@ define(
*/
function SaveAndStopEditingAction(
dialogService,
notificationService,
context
) {
this.context = context;
this.domainObject = (context || {}).domainObject;
this.dialogService = dialogService;
this.notificationService = notificationService;
}
/**
@ -49,7 +51,7 @@ define(
*/
SaveAndStopEditingAction.prototype.perform = function () {
var domainObject = this.domainObject,
saveAction = new SaveAction(this.dialogService, this.context);
saveAction = new SaveAction(this.dialogService, this.notificationService, this.context);
function closeEditor() {
return domainObject.getCapability("editor").finish();

View File

@ -43,6 +43,7 @@ define([
policyService,
dialogService,
copyService,
notificationService,
context
) {
this.domainObject = (context || {}).domainObject;
@ -52,6 +53,7 @@ define([
this.policyService = policyService;
this.dialogService = dialogService;
this.copyService = copyService;
this.notificationService = notificationService;
}
/**
@ -117,8 +119,10 @@ define([
return self.dialogService
.getUserInput(wizard.getFormStructure(true),
wizard.getInitialFormValue()
).then(wizard.populateObjectFromInput.bind(wizard));
wizard.getInitialFormValue())
.then(wizard.populateObjectFromInput.bind(wizard), function (failureReason) {
return Promise.reject("user canceled");
});
}
function showBlockingDialog(object) {
@ -171,11 +175,21 @@ define([
function finishEditing(clonedObject) {
return domainObject.getCapability("editor").finish()
.then(resolveWith(clonedObject));
.then(function () {
return fetchObject(clonedObject.getId());
});
}
function onFailure() {
function onSuccess(object) {
self.notificationService.info("Save Succeeded");
return object;
}
function onFailure(reason) {
hideBlockingDialog();
if (reason !== "user canceled") {
self.notificationService.error("Save Failed");
}
return false;
}
@ -188,6 +202,7 @@ define([
.then(saveAfterClone)
.then(finishEditing)
.then(hideBlockingDialog)
.then(onSuccess)
.catch(onFailure);
};

View File

@ -48,9 +48,10 @@ define(
* Decorate PersistenceCapability to queue persistence calls when a
* transaction is in progress.
*/
TransactionCapabilityDecorator.prototype.getCapabilities = function (model) {
TransactionCapabilityDecorator.prototype.getCapabilities = function () {
var self = this,
capabilities = this.capabilityService.getCapabilities(model),
capabilities = this.capabilityService.getCapabilities
.apply(this.capabilityService, arguments),
persistenceCapability = capabilities.persistence;
capabilities.persistence = function (domainObject) {

View File

@ -81,6 +81,10 @@ define(
return this.persistenceCapability.getSpace();
};
TransactionalPersistenceCapability.prototype.persisted = function () {
return this.persistenceCapability.persisted();
};
return TransactionalPersistenceCapability;
}
);

View File

@ -41,7 +41,7 @@ define(
return {
key: action,
name: action.getMetadata().name,
cssclass: action.getMetadata().cssclass
cssClass: action.getMetadata().cssClass
};
}
@ -61,6 +61,12 @@ define(
$scope.otherEditActions = $scope.action ?
$scope.action.getActions(OTHERS_ACTION_CONTEXT) :
[];
// Required because Angular does not allow 'bind'
// in expressions.
$scope.actionPerformer = function (action) {
return action.perform.bind(action);
};
}
// Update set of actions whenever the action capability

View File

@ -28,18 +28,49 @@ define(
[],
function () {
function isDirty(domainObject) {
var navigatedObject = domainObject,
editorCapability = navigatedObject &&
navigatedObject.getCapability("editor");
return editorCapability &&
editorCapability.isEditContextRoot() &&
editorCapability.dirty();
}
function cancelEditing(domainObject) {
var navigatedObject = domainObject,
editorCapability = navigatedObject &&
navigatedObject.getCapability("editor");
return editorCapability &&
editorCapability.finish();
}
/**
* Controller which is responsible for populating the scope for
* Edit mode
* @memberof platform/commonUI/edit
* @constructor
*/
function EditObjectController($scope, $location, policyService) {
function EditObjectController($scope, $location, navigationService) {
this.scope = $scope;
this.policyService = policyService;
var domainObject = $scope.domainObject;
var navigatedObject;
function setViewForDomainObject(domainObject) {
var removeCheck = navigationService
.checkBeforeNavigation(function () {
if (isDirty(domainObject)) {
return "Continuing will cause the loss of any unsaved changes.";
}
return false;
});
$scope.$on('$destroy', function () {
removeCheck();
cancelEditing(domainObject);
});
function setViewForDomainObject() {
var locationViewKey = $location.search().view;
@ -54,34 +85,15 @@ define(
((domainObject && domainObject.useCapability('view')) || [])
.forEach(selectViewIfMatching);
}
navigatedObject = domainObject;
}
$scope.$watch('domainObject', setViewForDomainObject);
setViewForDomainObject();
$scope.doAction = function (action) {
return $scope[action] && $scope[action]();
};
}
/**
* Get the warning to show if the user attempts to navigate
* away from Edit mode while unsaved changes are present.
* @returns {string} the warning to show, or undefined if
* there are no unsaved changes
*/
EditObjectController.prototype.getUnloadWarning = function () {
var navigatedObject = this.scope.domainObject,
policyMessage;
this.policyService.allow("navigation", navigatedObject, undefined, function (message) {
policyMessage = message;
});
return policyMessage;
};
return EditObjectController;
}
);

View File

@ -51,7 +51,7 @@ define(
function AddAction(type, parent, context, $q, dialogService, policyService) {
this.metadata = {
key: 'add',
cssclass: type.getCssClass(),
cssClass: type.getCssClass(),
name: type.getName(),
type: type.getKey(),
description: type.getDescription(),

View File

@ -54,8 +54,7 @@ define(
AddActionProvider.prototype.getActions = function (actionContext) {
var context = actionContext || {},
key = context.key,
destination = context.domainObject,
self = this;
destination = context.domainObject;
// We only provide Add actions, and we need a
// domain object to serve as the container for the
@ -66,18 +65,16 @@ define(
}
// Introduce one create action per type
return this.typeService.listTypes().filter(function (type) {
return self.policyService.allow("creation", type) && self.policyService.allow("composition", destination.getCapability('type'), type);
}).map(function (type) {
return ['timeline', 'activity'].map(function (type) {
return new AddAction(
type,
this.typeService.getType(type),
destination,
context,
self.$q,
self.dialogService,
self.policyService
this.$q,
this.dialogService,
this.policyService
);
});
}, this);
};
return AddActionProvider;

View File

@ -47,7 +47,7 @@ define(
function CreateAction(type, parent, context) {
this.metadata = {
key: 'create',
cssclass: type.getCssClass(),
cssClass: type.getCssClass(),
name: type.getName(),
type: type.getKey(),
description: type.getDescription(),

View File

@ -56,16 +56,16 @@ define(
*/
CreateWizard.prototype.getFormStructure = function (includeLocation) {
var sections = [],
type = this.type,
domainObject = this.domainObject,
policyService = this.policyService;
function validateLocation(locatingObject) {
var locatingType = locatingObject &&
locatingObject.getCapability('type');
return locatingType && policyService.allow(
function validateLocation(parent) {
var parentType = parent &&
parent.getCapability('type');
return parentType && policyService.allow(
"composition",
locatingType,
type
parentType,
domainObject
);
}
@ -91,7 +91,7 @@ define(
if (includeLocation) {
sections.push({
name: 'Location',
cssclass: "grows",
cssClass: "grows",
rows: [{
name: "Save In",
control: "locator",

View File

@ -1,104 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
[],
function () {
/**
* Defines the `mct-before-unload` directive. The expression bound
* to this attribute will be evaluated during page navigation events
* and, if it returns a truthy value, will be used to populate a
* prompt to the user to confirm this navigation.
* @memberof platform/commonUI/edit
* @constructor
* @param $window the window
*/
function MCTBeforeUnload($window) {
var unloads = [],
oldBeforeUnload = $window.onbeforeunload;
// Run all unload functions, returning the first returns truthily.
function checkUnloads() {
var result;
unloads.forEach(function (unload) {
result = result || unload();
});
return result;
}
// Link function for an mct-before-unload directive usage
function link(scope, element, attrs) {
// Invoke the
function unload() {
return scope.$eval(attrs.mctBeforeUnload);
}
// Stop using this unload expression
function removeUnload() {
unloads = unloads.filter(function (callback) {
return callback !== unload;
});
if (unloads.length === 0) {
$window.onbeforeunload = oldBeforeUnload;
}
}
// Show a dialog before allowing a location change
function checkLocationChange(event) {
// Get an unload message (if any)
var warning = unload();
// Prompt the user if there's an unload message
if (warning && !$window.confirm(warning)) {
// ...and prevent the route change if it was confirmed
event.preventDefault();
}
}
// If this is the first active instance of this directive,
// register as the window's beforeunload handler
if (unloads.length === 0) {
$window.onbeforeunload = checkUnloads;
}
// Include this instance of the directive's unload function
unloads.push(unload);
// Remove it when the scope is destroyed
scope.$on("$destroy", removeUnload);
// Also handle route changes
scope.$on("$locationChangeStart", checkLocationChange);
}
return {
// Applicable as an attribute
restrict: "A",
// Link with the provided function
link: link
};
}
return MCTBeforeUnload;
}
);

View File

@ -1,64 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
[],
function () {
/**
* Policy controlling whether navigation events should proceed
* when object is being edited.
* @memberof platform/commonUI/edit
* @constructor
* @implements {Policy.<Action, ActionContext>}
*/
function EditNavigationPolicy(policyService) {
this.policyService = policyService;
}
/**
* @private
*/
EditNavigationPolicy.prototype.isDirty = function (domainObject) {
var navigatedObject = domainObject,
editorCapability = navigatedObject &&
navigatedObject.getCapability("editor");
return editorCapability &&
editorCapability.isEditContextRoot() &&
editorCapability.dirty();
};
/**
* Allow navigation if an object is not dirty, or if the user elects
* to proceed anyway.
* @param currentNavigation
* @returns {boolean|*} true if the object model is clean; or if
* it's dirty and the user wishes to proceed anyway.
*/
EditNavigationPolicy.prototype.allow = function (currentNavigation) {
return !this.isDirty(currentNavigation);
};
return EditNavigationPolicy;
}
);

View File

@ -43,102 +43,55 @@ define(
* @implements {Representer}
* @constructor
*/
function EditRepresenter($q, $log, scope) {
var self = this;
this.scope = scope;
this.listenHandle = undefined;
// Mutate and persist a new version of a domain object's model.
function doPersist(model) {
var domainObject = self.domainObject;
// First, mutate; then, persist.
return $q.when(domainObject.useCapability("mutation", function () {
return model;
})).then(function (result) {
// Only persist when mutation was successful
return result &&
domainObject.getCapability("persistence").persist();
});
}
// Handle changes to model and/or view configuration
function commit(message) {
// Look up from scope; these will have been populated by
// mct-representation.
var model = scope.model,
configuration = scope.configuration,
domainObject = self.domainObject;
// Log the commit message
$log.debug([
"Committing ",
domainObject && domainObject.getModel().name,
"(" + (domainObject && domainObject.getId()) + "):",
message
].join(" "));
// Update the configuration stored in the model, and persist.
if (domainObject && domainObject.hasCapability("persistence")) {
// Configurations for specific views are stored by
// key in the "configuration" field of the model.
if (self.key && configuration) {
model.configuration = model.configuration || {};
model.configuration[self.key] = configuration;
}
doPersist(model);
}
}
// Place the "commit" method in the scope
scope.commit = commit;
// Clean up when the scope is destroyed
scope.$on("$destroy", function () {
self.destroy();
});
function EditRepresenter($log, $scope) {
this.$log = $log;
this.$scope = $scope;
this.$scope.commit = this.commit.bind(this);
}
// Handle a specific representation of a specific domain object
EditRepresenter.prototype.represent = function represent(representation, representedObject) {
var scope = this.scope;
/**
* Commit any changes made to the in-scope model to the domain object.
* Also commits any changes made to $scope.configuration to the proper
* configuration value for the current representation.
*
* @param {String} message a message to log with the commit message.
*/
EditRepresenter.prototype.commit = function (message) {
var model = this.$scope.model,
configuration = this.$scope.configuration,
domainObject = this.domainObject;
// Track the key, to know which view configuration to save to.
this.key = (representation || {}).key;
// Track the represented object
this.domainObject = representedObject;
this.$log.debug([
"Committing ",
domainObject && domainObject.getModel().name,
"(" + (domainObject && domainObject.getId()) + "):",
message
].join(" "));
// Ensure existing watches are released
this.destroy();
function setEditing() {
scope.viewObjectTemplate = 'edit-object';
}
/**
* Listen for changes in object state. If the object becomes
* editable then change the view and inspector regions
* object representation accordingly
*/
this.listenHandle = this.domainObject.getCapability('status').listen(function (statuses) {
if (statuses.indexOf('editing') !== -1) {
setEditing();
} else {
delete scope.viewObjectTemplate;
if (this.domainObject) {
if (this.key && configuration) {
model.configuration = model.configuration || {};
model.configuration[this.key] = configuration;
}
});
domainObject.useCapability('mutation', function () {
return model;
});
}
};
if (representedObject.hasCapability('editor') && representedObject.getCapability('editor').isEditContextRoot()) {
setEditing();
// Handle a specific representation of a specific domain object
EditRepresenter.prototype.represent = function (representation, representedObject) {
this.domainObject = representedObject;
if (representation) {
this.key = representation.key;
} else {
delete this.key;
}
};
// Respond to the destruction of the current representation.
EditRepresenter.prototype.destroy = function destroy() {
return this.listenHandle && this.listenHandle();
};
EditRepresenter.prototype.destroy = function () {};
return EditRepresenter;
}

View File

@ -0,0 +1,48 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(['./Transaction'], function (Transaction) {
/**
* A nested transaction is a transaction which takes place in the context
* of a larger parent transaction. It becomes part of the parent
* transaction when (and only when) committed.
* @param parent
* @constructor
* @extends {platform/commonUI/edit/services.Transaction}
* @memberof platform/commonUI/edit/services
*/
function NestedTransaction(parent) {
this.parent = parent;
Transaction.call(this, parent.$log);
}
NestedTransaction.prototype = Object.create(Transaction.prototype);
NestedTransaction.prototype.commit = function () {
this.parent.add(
Transaction.prototype.commit.bind(this),
Transaction.prototype.cancel.bind(this)
);
return Promise.resolve(true);
};
return NestedTransaction;
});

View File

@ -0,0 +1,96 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define([], function () {
/**
* A Transaction represents a set of changes that are intended to
* be kept or discarded as a unit.
* @param $log Angular's `$log` service, for logging messages
* @constructor
* @memberof platform/commonUI/edit/services
*/
function Transaction($log) {
this.$log = $log;
this.callbacks = [];
}
/**
* Add a change to the current transaction, as expressed by functions
* to either keep or discard the change.
* @param {Function} commit called when the transaction is committed
* @param {Function} cancel called when the transaction is cancelled
* @returns {Function) a function which may be called to remove this
* pair of callbacks from the transaction
*/
Transaction.prototype.add = function (commit, cancel) {
var callback = { commit: commit, cancel: cancel };
this.callbacks.push(callback);
return function () {
this.callbacks = this.callbacks.filter(function (c) {
return c !== callback;
});
}.bind(this);
};
/**
* Get the number of changes in the current transaction.
* @returns {number} the size of the current transaction
*/
Transaction.prototype.size = function () {
return this.callbacks.length;
};
/**
* Keep all changes associated with this transaction.
* @method {platform/commonUI/edit/services.Transaction#commit}
* @returns {Promise} a promise which will resolve when all callbacks
* have been handled.
*/
/**
* Discard all changes associated with this transaction.
* @method {platform/commonUI/edit/services.Transaction#cancel}
* @returns {Promise} a promise which will resolve when all callbacks
* have been handled.
*/
['commit', 'cancel'].forEach(function (method) {
Transaction.prototype[method] = function () {
var promises = [];
var callback;
while (this.callbacks.length > 0) {
callback = this.callbacks.shift();
try {
promises.push(callback[method]());
} catch (e) {
this.$log
.error("Error trying to " + method + " transaction.");
}
}
return Promise.all(promises);
};
});
return Transaction;
});

View File

@ -21,8 +21,8 @@
*****************************************************************************/
/*global define*/
define(
[],
function () {
['./Transaction', './NestedTransaction'],
function (Transaction, NestedTransaction) {
/**
* Implements an application-wide transaction state. Once a
* transaction is started, calls to
@ -34,13 +34,11 @@ define(
* @param $q
* @constructor
*/
function TransactionService($q, $log) {
function TransactionService($q, $log, cacheService) {
this.$q = $q;
this.$log = $log;
this.transaction = false;
this.onCommits = [];
this.onCancels = [];
this.cacheService = cacheService;
this.transactions = [];
}
/**
@ -50,18 +48,18 @@ define(
* #cancel} are called
*/
TransactionService.prototype.startTransaction = function () {
if (this.transaction) {
//Log error because this is a programming error if it occurs.
this.$log.error("Transaction already in progress");
}
this.transaction = true;
var transaction = this.isActive() ?
new NestedTransaction(this.transactions[0]) :
new Transaction(this.$log);
this.transactions.push(transaction);
};
/**
* @returns {boolean} If true, indicates that a transaction is in progress
*/
TransactionService.prototype.isActive = function () {
return this.transaction;
return this.transactions.length > 0;
};
/**
@ -72,52 +70,43 @@ define(
* @param onCancel A function to call on cancel
*/
TransactionService.prototype.addToTransaction = function (onCommit, onCancel) {
if (this.transaction) {
this.onCommits.push(onCommit);
if (onCancel) {
this.onCancels.push(onCancel);
}
if (this.isActive()) {
return this.activeTransaction().add(onCommit, onCancel);
} else {
//Log error because this is a programming error if it occurs.
this.$log.error("No transaction in progress");
}
};
return function () {
this.onCommits = this.onCommits.filter(function (callback) {
return callback !== onCommit;
});
this.onCancels = this.onCancels.filter(function (callback) {
return callback !== onCancel;
});
}.bind(this);
/**
* Get the transaction at the top of the stack.
* @private
*/
TransactionService.prototype.activeTransaction = function () {
return this.transactions[this.transactions.length - 1];
};
/**
* All persist calls deferred since the beginning of the transaction
* will be committed.
* will be committed. If this is the last transaction, clears the
* cache.
*
* @returns {Promise} resolved when all persist operations have
* completed. Will reject if any commit operations fail
*/
TransactionService.prototype.commit = function () {
var self = this,
promises = [],
onCommit;
while (this.onCommits.length > 0) { // ...using a while in case some onCommit adds to transaction
onCommit = this.onCommits.pop();
try { // ...also don't want to fail mid-loop...
promises.push(onCommit());
} catch (e) {
this.$log.error("Error committing transaction.");
}
var transaction = this.transactions.pop();
if (!transaction) {
return Promise.reject();
}
return this.$q.all(promises).then(function () {
self.transaction = false;
self.onCommits = [];
self.onCancels = [];
});
if (!this.isActive()) {
return transaction.commit()
.then(function (r) {
this.cacheService.flush();
return r;
}.bind(this));
}
return transaction.commit();
};
/**
@ -129,28 +118,17 @@ define(
* @returns {*}
*/
TransactionService.prototype.cancel = function () {
var self = this,
results = [],
onCancel;
while (this.onCancels.length > 0) {
onCancel = this.onCancels.pop();
try {
results.push(onCancel());
} catch (error) {
this.$log.error("Error cancelling transaction.");
}
}
return this.$q.all(results).then(function () {
self.transaction = false;
self.onCommits = [];
self.onCancels = [];
});
var transaction = this.transactions.pop();
return transaction ? transaction.cancel() : Promise.reject();
};
/**
* Get the size (the number of commit/cancel callbacks) of
* the active transaction.
* @returns {number} size of the active transaction
*/
TransactionService.prototype.size = function () {
return this.onCommits.length;
return this.isActive() ? this.activeTransaction().size() : 0;
};
return TransactionService;

View File

@ -30,7 +30,6 @@ define(
mockParent,
mockContext,
mockComposition,
mockPersistence,
mockActionCapability,
mockEditAction,
mockType,
@ -68,7 +67,6 @@ define(
};
mockContext = jasmine.createSpyObj("context", ["getParent"]);
mockComposition = jasmine.createSpyObj("composition", ["invoke", "add"]);
mockPersistence = jasmine.createSpyObj("persistence", ["persist"]);
mockType = jasmine.createSpyObj("type", ["hasFeature", "getKey"]);
mockActionCapability = jasmine.createSpyObj("actionCapability", ["getActions"]);
mockEditAction = jasmine.createSpyObj("editAction", ["perform"]);
@ -84,7 +82,6 @@ define(
capabilities = {
composition: mockComposition,
persistence: mockPersistence,
action: mockActionCapability,
type: mockType
};
@ -107,11 +104,6 @@ define(
.toHaveBeenCalledWith(mockDomainObject);
});
it("persists changes afterward", function () {
action.perform();
expect(mockPersistence.persist).toHaveBeenCalled();
});
it("enables edit mode for objects that have an edit action", function () {
mockActionCapability.getActions.andReturn([mockEditAction]);
action.perform();

View File

@ -43,7 +43,6 @@ define(
},
hasFeature: jasmine.createSpy('hasFeature')
},
persistence: jasmine.createSpyObj("persistence", ["persist"]),
mutation: jasmine.createSpy("mutation")
};
model = {};
@ -78,25 +77,18 @@ define(
action = new PropertiesAction(dialogService, context);
});
it("persists when an action is performed", function () {
action.perform();
expect(capabilities.persistence.persist)
.toHaveBeenCalled();
});
it("does not persist any changes upon cancel", function () {
input = undefined;
action.perform();
expect(capabilities.persistence.persist)
.not.toHaveBeenCalled();
});
it("mutates an object when performed", function () {
action.perform();
expect(capabilities.mutation).toHaveBeenCalled();
capabilities.mutation.mostRecentCall.args[0]({});
});
it("does not muate object upon cancel", function () {
input = undefined;
action.perform();
expect(capabilities.mutation).not.toHaveBeenCalled();
});
it("is only applicable when a domain object is in context", function () {
expect(PropertiesAction.appliesTo(context)).toBeTruthy();
expect(PropertiesAction.appliesTo({})).toBeFalsy();

View File

@ -37,7 +37,6 @@ define(
mockGrandchildContext,
mockRootContext,
mockMutation,
mockPersistence,
mockType,
actionContext,
model,
@ -53,8 +52,6 @@ define(
}
beforeEach(function () {
mockDomainObject = jasmine.createSpyObj(
"domainObject",
["getId", "getCapability"]
@ -88,7 +85,6 @@ define(
mockGrandchildContext = jasmine.createSpyObj("context", ["getParent"]);
mockRootContext = jasmine.createSpyObj("context", ["getParent"]);
mockMutation = jasmine.createSpyObj("mutation", ["invoke"]);
mockPersistence = jasmine.createSpyObj("persistence", ["persist"]);
mockType = jasmine.createSpyObj("type", ["hasFeature"]);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
@ -109,7 +105,6 @@ define(
capabilities = {
mutation: mockMutation,
persistence: mockPersistence,
type: mockType
};
model = {
@ -118,7 +113,7 @@ define(
actionContext = { domainObject: mockDomainObject };
action = new RemoveAction(mockQ, mockNavigationService, actionContext);
action = new RemoveAction(mockNavigationService, actionContext);
});
it("only applies to objects with parents", function () {
@ -154,9 +149,6 @@ define(
// Should have removed "test" - that was our
// mock domain object's id.
expect(result.composition).toEqual(["a", "b"]);
// Finally, should have persisted
expect(mockPersistence.persist).toHaveBeenCalled();
});
it("removes parent of object currently navigated to", function () {

View File

@ -19,6 +19,7 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global describe,it,expect,beforeEach,jasmine,waitsFor,runs*/
define(
["../../src/actions/SaveAction"],
@ -28,7 +29,8 @@ define(
var mockDomainObject,
mockEditorCapability,
actionContext,
dialogService,
mockDialogService,
mockNotificationService,
mockActionCapability,
capabilities = {},
action;
@ -68,11 +70,17 @@ define(
actionContext = {
domainObject: mockDomainObject
};
dialogService = jasmine.createSpyObj(
mockDialogService = jasmine.createSpyObj(
"dialogService",
["showBlockingMessage"]
);
mockNotificationService = jasmine.createSpyObj(
"notificationService",
["info", "error"]
);
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.getCapability.andCallFake(function (capability) {
return capabilities[capability];
@ -81,7 +89,7 @@ define(
mockEditorCapability.save.andReturn(mockPromise(true));
mockEditorCapability.isEditContextRoot.andReturn(true);
action = new SaveAction(dialogService, actionContext);
action = new SaveAction(mockDialogService, mockNotificationService, actionContext);
});
it("only applies to domain object with an editor capability", function () {
@ -105,30 +113,54 @@ define(
expect(mockEditorCapability.save).toHaveBeenCalled();
});
describe("a blocking dialog", function () {
describe("in order to keep the user in the loop", function () {
var mockDialogHandle;
beforeEach(function () {
mockDialogHandle = jasmine.createSpyObj("dialogHandle", ["dismiss"]);
dialogService.showBlockingMessage.andReturn(mockDialogHandle);
mockDialogService.showBlockingMessage.andReturn(mockDialogHandle);
});
it("shows a dialog while saving", function () {
mockEditorCapability.save.andReturn(new Promise(function () {
}));
action.perform();
expect(dialogService.showBlockingMessage).toHaveBeenCalled();
expect(mockDialogService.showBlockingMessage).toHaveBeenCalled();
expect(mockDialogHandle.dismiss).not.toHaveBeenCalled();
});
it("hides a dialog when saving is complete", function () {
it("hides the dialog when saving is complete", function () {
action.perform();
expect(dialogService.showBlockingMessage).toHaveBeenCalled();
expect(mockDialogService.showBlockingMessage).toHaveBeenCalled();
expect(mockDialogHandle.dismiss).toHaveBeenCalled();
});
});
it("notifies if saving succeeded", function () {
var mockCallback = jasmine.createSpy("callback");
mockEditorCapability.save.andReturn(Promise.resolve("success"));
action.perform().then(mockCallback);
waitsFor(function () {
return mockCallback.calls.length > 0;
});
runs(function () {
expect(mockNotificationService.info).toHaveBeenCalled();
expect(mockNotificationService.error).not.toHaveBeenCalled();
});
});
it("notifies if saving failed", function () {
var mockCallback = jasmine.createSpy("callback");
mockEditorCapability.save.andReturn(Promise.reject("some failure reason"));
action.perform().then(mockCallback);
waitsFor(function () {
return mockCallback.calls.length > 0;
});
runs(function () {
expect(mockNotificationService.error).toHaveBeenCalled();
expect(mockNotificationService.info).not.toHaveBeenCalled();
});
});
});
});
}
);

View File

@ -19,6 +19,7 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global describe,it,expect,beforeEach,jasmine*/
define(
["../../src/actions/SaveAndStopEditingAction"],
@ -35,6 +36,7 @@ define(
mockEditorCapability,
actionContext,
dialogService,
notificationService,
mockActionCapability,
capabilities = {},
action;
@ -79,6 +81,11 @@ define(
["showBlockingMessage"]
);
notificationService = jasmine.createSpyObj(
"notificationService",
["info", "error"]
);
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.getCapability.andCallFake(function (capability) {
return capabilities[capability];
@ -87,7 +94,7 @@ define(
mockEditorCapability.save.andReturn(mockPromise(true));
mockEditorCapability.isEditContextRoot.andReturn(true);
action = new SaveAndStopEditingAction(dialogService, actionContext);
action = new SaveAndStopEditingAction(dialogService, notificationService, actionContext);
});

View File

@ -27,11 +27,13 @@ define(
describe("The Save As action", function () {
var mockDomainObject,
mockClonedObject,
mockEditorCapability,
mockActionCapability,
mockObjectService,
mockDialogService,
mockCopyService,
mockNotificationService,
mockParent,
actionContext,
capabilities = {},
@ -57,7 +59,8 @@ define(
[
"getCapability",
"hasCapability",
"getModel"
"getModel",
"getId"
]
);
mockDomainObject.hasCapability.andReturn(true);
@ -65,6 +68,15 @@ define(
return capabilities[capability];
});
mockDomainObject.getModel.andReturn({location: 'a', persisted: undefined});
mockDomainObject.getId.andReturn(0);
mockClonedObject = jasmine.createSpyObj(
"clonedObject",
[
"getId"
]
);
mockClonedObject.getId.andReturn(1);
mockParent = jasmine.createSpyObj(
"parentObject",
@ -111,12 +123,27 @@ define(
"perform"
]
);
mockCopyService.perform.andReturn(mockPromise(mockClonedObject));
mockNotificationService = jasmine.createSpyObj(
"notificationService",
[
"info",
"error"
]
);
actionContext = {
domainObject: mockDomainObject
};
action = new SaveAsAction(undefined, undefined, mockDialogService, mockCopyService, actionContext);
action = new SaveAsAction(
undefined,
undefined,
mockDialogService,
mockCopyService,
mockNotificationService,
actionContext);
spyOn(action, "getObjectService");
action.getObjectService.andReturn(mockObjectService);
@ -186,7 +213,7 @@ define(
expect(mockDialogService.getUserInput).toHaveBeenCalled();
});
describe("a blocking dialog", function () {
describe("in order to keep the user in the loop", function () {
var mockDialogHandle;
beforeEach(function () {
@ -194,14 +221,14 @@ define(
mockDialogService.showBlockingMessage.andReturn(mockDialogHandle);
});
it("indicates that a save is taking place", function () {
it("shows a blocking dialog indicating that saving is in progress", function () {
mockEditorCapability.save.andReturn(new Promise(function () {}));
action.perform();
expect(mockDialogService.showBlockingMessage).toHaveBeenCalled();
expect(mockDialogHandle.dismiss).not.toHaveBeenCalled();
});
it("is hidden after saving", function () {
it("hides the blocking dialog after saving finishes", function () {
var mockCallback = jasmine.createSpy();
action.perform().then(mockCallback);
expect(mockDialogService.showBlockingMessage).toHaveBeenCalled();
@ -212,6 +239,31 @@ define(
expect(mockDialogHandle.dismiss).toHaveBeenCalled();
});
});
it("notifies if saving succeeded", function () {
var mockCallback = jasmine.createSpy();
action.perform().then(mockCallback);
waitsFor(function () {
return mockCallback.calls.length > 0;
});
runs(function () {
expect(mockNotificationService.info).toHaveBeenCalled();
expect(mockNotificationService.error).not.toHaveBeenCalled();
});
});
it("notifies if saving failed", function () {
mockCopyService.perform.andReturn(Promise.reject("some failure reason"));
var mockCallback = jasmine.createSpy();
action.perform().then(mockCallback);
waitsFor(function () {
return mockCallback.calls.length > 0;
});
runs(function () {
expect(mockNotificationService.error).toHaveBeenCalled();
expect(mockNotificationService.info).not.toHaveBeenCalled();
});
});
});
});
}

View File

@ -28,7 +28,7 @@ define(
describe("The Edit Action controller", function () {
var mockSaveActionMetadata = {
name: "mocked-save-action",
cssclass: "mocked-save-action-css"
cssClass: "mocked-save-action-css"
};
function fakeGetActions(actionContext) {
@ -86,7 +86,7 @@ define(
expect(menuOptions[1].key).toEqual(mockScope.saveActions[1]);
menuOptions.forEach(function (option) {
expect(option.name).toEqual(mockSaveActionMetadata.name);
expect(option.cssclass).toEqual(mockSaveActionMetadata.cssclass);
expect(option.cssClass).toEqual(mockSaveActionMetadata.cssClass);
});
});

View File

@ -24,32 +24,19 @@ define(
["../../src/controllers/EditObjectController"],
function (EditObjectController) {
describe("The Edit mode controller", function () {
describe("The Edit Object controller", function () {
var mockScope,
mockObject,
mockType,
testViews,
mockEditorCapability,
mockLocation,
mockNavigationService,
removeCheck,
mockStatusCapability,
mockCapabilities,
mockPolicyService,
controller;
// Utility function; look for a $watch on scope and fire it
function fireWatch(expr, value) {
mockScope.$watch.calls.forEach(function (call) {
if (call.args[0] === expr) {
call.args[1](value);
}
});
}
beforeEach(function () {
mockPolicyService = jasmine.createSpyObj(
"policyService",
[
"allow"
]
);
mockScope = jasmine.createSpyObj(
"$scope",
["$on", "$watch"]
@ -58,16 +45,16 @@ define(
"domainObject",
["getId", "getModel", "getCapability", "hasCapability", "useCapability"]
);
mockType = jasmine.createSpyObj(
"type",
["hasFeature"]
mockEditorCapability = jasmine.createSpyObj(
"mockEditorCapability",
["isEditContextRoot", "dirty", "finish"]
);
mockStatusCapability = jasmine.createSpyObj('statusCapability',
["get"]
);
mockCapabilities = {
"type" : mockType,
"editor" : mockEditorCapability,
"status": mockStatusCapability
};
@ -75,52 +62,70 @@ define(
["search"]
);
mockLocation.search.andReturn({"view": "fixed"});
mockNavigationService = jasmine.createSpyObj('navigationService',
["checkBeforeNavigation"]
);
removeCheck = jasmine.createSpy('removeCheck');
mockNavigationService.checkBeforeNavigation.andReturn(removeCheck);
mockObject.getId.andReturn("test");
mockObject.getModel.andReturn({ name: "Test object" });
mockObject.getCapability.andCallFake(function (key) {
return mockCapabilities[key];
});
mockType.hasFeature.andReturn(true);
mockScope.domainObject = mockObject;
controller = new EditObjectController(
mockScope,
mockLocation,
mockPolicyService
);
});
it("exposes a warning message for unload", function () {
var errorMessage = "Unsaved changes";
// Normally, should be undefined
expect(controller.getUnloadWarning()).toBeUndefined();
// Override the policy service to prevent navigation
mockPolicyService.allow.andCallFake(function (category, object, context, callback) {
callback(errorMessage);
});
// Should have some warning message here now
expect(controller.getUnloadWarning()).toEqual(errorMessage);
});
it("sets the active view from query parameters", function () {
var testViews = [
{ key: 'abc' },
{ key: 'def', someKey: 'some value' },
{ key: 'xyz' }
];
testViews = [
{ key: 'abc' },
{ key: 'def', someKey: 'some value' },
{ key: 'xyz' }
];
mockObject.useCapability.andCallFake(function (c) {
return (c === 'view') && testViews;
});
mockLocation.search.andReturn({ view: 'def' });
fireWatch('domainObject', mockObject);
mockScope.domainObject = mockObject;
controller = new EditObjectController(
mockScope,
mockLocation,
mockNavigationService
);
});
it("adds a check before navigation", function () {
expect(mockNavigationService.checkBeforeNavigation)
.toHaveBeenCalledWith(jasmine.any(Function));
var checkFn = mockNavigationService.checkBeforeNavigation.mostRecentCall.args[0];
mockEditorCapability.isEditContextRoot.andReturn(false);
mockEditorCapability.dirty.andReturn(false);
expect(checkFn()).toBe(false);
mockEditorCapability.isEditContextRoot.andReturn(true);
expect(checkFn()).toBe(false);
mockEditorCapability.dirty.andReturn(true);
expect(checkFn())
.toBe("Continuing will cause the loss of any unsaved changes.");
});
it("cleans up on destroy", function () {
expect(mockScope.$on)
.toHaveBeenCalledWith("$destroy", jasmine.any(Function));
mockScope.$on.mostRecentCall.args[1]();
expect(mockEditorCapability.finish).toHaveBeenCalled();
expect(removeCheck).toHaveBeenCalled();
});
it("sets the active view from query parameters", function () {
expect(mockScope.representation.selected)
.toEqual(testViews[1]);
});

View File

@ -31,9 +31,7 @@ define(
var mockTypeService,
mockDialogService,
mockPolicyService,
mockCreationPolicy,
mockCompositionPolicy,
mockPolicyMap = {},
mockTypeMap,
mockTypes,
mockDomainObject,
mockQ,
@ -55,49 +53,33 @@ define(
);
mockType.hasFeature.andReturn(true);
mockType.getName.andReturn(name);
mockType.getKey.andReturn(name);
return mockType;
}
beforeEach(function () {
mockTypeService = jasmine.createSpyObj(
"typeService",
["listTypes"]
);
mockDialogService = jasmine.createSpyObj(
"dialogService",
["getUserInput"]
);
mockPolicyService = jasmine.createSpyObj(
"policyService",
["allow"]
["getType"]
);
mockDialogService = {};
mockPolicyService = {};
mockDomainObject = {};
mockDomainObject = jasmine.createSpyObj(
"domainObject",
["getCapability"]
);
//Mocking getCapability because AddActionProvider uses the
// type capability of the destination object.
mockDomainObject.getCapability.andReturn({});
mockTypes = ["A", "B", "C"].map(createMockType);
mockTypes = [
"timeline",
"activity",
"other"
].map(createMockType);
mockTypeMap = {};
mockTypes.forEach(function (type) {
mockPolicyMap[type.getName()] = true;
mockTypeMap[type.getKey()] = type;
});
mockCreationPolicy = function (type) {
return mockPolicyMap[type.getName()];
};
mockCompositionPolicy = function () {
return true;
};
mockPolicyService.allow.andReturn(true);
mockTypeService.listTypes.andReturn(mockTypes);
mockTypeService.getType.andCallFake(function (key) {
return mockTypeMap[key];
});
provider = new AddActionProvider(
mockQ,
@ -107,29 +89,16 @@ define(
);
});
it("checks for creatability", function () {
provider.getActions({
it("provides actions for timeline and activity", function () {
var actions = provider.getActions({
key: "add",
domainObject: mockDomainObject
});
expect(actions.length).toBe(2);
expect(actions[0].metadata.type).toBe('timeline');
expect(actions[1].metadata.type).toBe('activity');
// Make sure it was creation which was used to check
expect(mockPolicyService.allow)
.toHaveBeenCalledWith("creation", mockTypes[0]);
});
it("checks for composability of type", function () {
provider.getActions({
key: "add",
domainObject: mockDomainObject
});
expect(mockPolicyService.allow).toHaveBeenCalledWith(
"composition",
jasmine.any(Object),
jasmine.any(Object)
);
expect(mockDomainObject.getCapability).toHaveBeenCalledWith('type');
});
});
}

View File

@ -138,7 +138,7 @@ define(
expect(metadata.name).toEqual("Test");
expect(metadata.description).toEqual("a test type");
expect(metadata.cssclass).toEqual("icon-telemetry");
expect(metadata.cssClass).toEqual("icon-telemetry");
});
describe("the perform function", function () {

View File

@ -175,7 +175,7 @@ define(
expect(mockPolicyService.allow).toHaveBeenCalledWith(
'composition',
mockOtherType,
mockType
mockDomainObject
);
});

View File

@ -1,114 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../../src/directives/MCTBeforeUnload"],
function (MCTBeforeUnload) {
describe("The mct-before-unload directive", function () {
var mockWindow,
mockScope,
testAttrs,
mockEvent,
directive;
function fireListener(eventType, value) {
mockScope.$on.calls.forEach(function (call) {
if (call.args[0] === eventType) {
call.args[1](value);
}
});
}
beforeEach(function () {
mockWindow = jasmine.createSpyObj("$window", ['confirm']);
mockScope = jasmine.createSpyObj("$scope", ['$eval', '$on']);
testAttrs = { mctBeforeUnload: "someExpression" };
mockEvent = jasmine.createSpyObj("event", ["preventDefault"]);
directive = new MCTBeforeUnload(mockWindow);
directive.link(mockScope, {}, testAttrs);
});
it("can be used only as an attribute", function () {
expect(directive.restrict).toEqual('A');
});
it("listens for beforeunload", function () {
expect(mockWindow.onbeforeunload).toEqual(jasmine.any(Function));
});
it("listens for route changes", function () {
expect(mockScope.$on).toHaveBeenCalledWith(
"$locationChangeStart",
jasmine.any(Function)
);
});
it("listens for its scope's destroy event", function () {
expect(mockScope.$on).toHaveBeenCalledWith(
"$destroy",
jasmine.any(Function)
);
});
it("uses result of evaluated expression as a warning", function () {
mockScope.$eval.andReturn(undefined);
expect(mockWindow.onbeforeunload(mockEvent)).toBeUndefined();
mockScope.$eval.andReturn("some message");
expect(mockWindow.onbeforeunload(mockEvent)).toEqual("some message");
// Verify that the right expression was evaluated
expect(mockScope.$eval).toHaveBeenCalledWith(testAttrs.mctBeforeUnload);
});
it("confirms route changes", function () {
// First, try with no unsaved changes;
// should not confirm or preventDefault
mockScope.$eval.andReturn(undefined);
fireListener("$locationChangeStart", mockEvent);
expect(mockWindow.confirm).not.toHaveBeenCalled();
expect(mockEvent.preventDefault).not.toHaveBeenCalled();
// Next, try with unsaved changes that the user confirms;
// should prompt, but not preventDefault
mockScope.$eval.andReturn("some message");
mockWindow.confirm.andReturn(true);
fireListener("$locationChangeStart", mockEvent);
expect(mockWindow.confirm).toHaveBeenCalledWith("some message");
expect(mockEvent.preventDefault).not.toHaveBeenCalled();
// Finally, act as if the user said no to this dialog;
// this should preventDefault on the location change.
mockWindow.confirm.andReturn(false);
fireListener("$locationChangeStart", mockEvent);
expect(mockWindow.confirm).toHaveBeenCalledWith("some message");
expect(mockEvent.preventDefault).toHaveBeenCalled();
});
it("cleans up listeners when destroyed", function () {
fireListener("$destroy", mockEvent);
expect(mockWindow.onbeforeunload).toBeUndefined();
});
});
}
);

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