Compare commits

...

230 Commits

Author SHA1 Message Date
Victor Woeltjen
a41c54f711 Merge remote-tracking branch 'origin/master' into subobject-select-1126 2016-12-16 11:22:33 -08:00
Victor Woeltjen
06a24e3a7d Merge pull request #1354 from nasa/icon-assignment
Fix icon assignments
2016-12-14 13:38:57 -08:00
Pete Richards
abd9fdec38 Merge pull request #1357 from nasa/umd-1356
[Build] Change global namespace name
2016-12-14 13:34:05 -08:00
Victor Woeltjen
bfdbb4dacb [Build] Change global namespace name
...to match name of module. Fixes #1356
2016-12-14 10:04:00 -08:00
Pete Richards
b5b68e7439 Fix icon assignments
Icons had been accidentally swapped around, updated the
assignements and regenererated file.
2016-12-12 13:00:04 -08:00
Victor Woeltjen
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
Henry
83ed4f6b0d [Navigation] Fix errors appearing in console on initial navigation. Fixes #1351 2016-12-09 09:59:27 -08:00
Victor Woeltjen
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
Henry
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
Victor Woeltjen
995790d32d [Inspection] Correct variable name 2016-12-08 13:06:32 -08:00
Andrew Henry
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
Pete Richards
b2da0cb12f Merge pull request #1335 from nasa/open1234
[Time Conductor] Remove previous time conductor. Fixes #1234
2016-12-07 13:10:45 -08:00
Henry
e121c0f8ac [Time Conductor] Remove previous time conductor. Fixes #1234 2016-12-07 12:36:52 -08:00
Victor Woeltjen
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
Henry
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
Henry
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
Henry
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
Andrew Henry
68d6920d38 Merge pull request #1305 from Brantron/notification-bell
Make notification icon clickable
2016-12-02 14:22:52 -08:00
Victor Woeltjen
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
Victor Woeltjen
aaf4877daa Merge pull request #1339 from nasa/open1336
[Documentation] Fixed non-functioning telemetry tutorial, updated glyphs.
2016-12-01 15:15:25 -08:00
Henry
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
Pete Richards
44ceb4e865 [Style] remove trailing comma
per https://github.com/nasa/openmct/pull/1338#discussion_r90542441
2016-12-01 14:18:55 -08:00
Pete Richards
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
Victor Woeltjen
f85595665f Merge pull request #1325 from nasa/open1231
[Time Conductor] Persist Time Conductor state in URL
2016-11-30 13:17:33 -08:00
Pete Richards
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
Henry
eaae401d16 Added mode, timeSystem, and deltas
Fixing tests

Fixed broken tests

Added tests

Fixed style errors
2016-11-25 15:16:53 -08:00
Henry
efed5f68af [Time Conductor] Added support for loading and persisting time conductor bounds in URL. Fixes #1231 2016-11-25 15:16:31 -08:00
Pete Richards
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
Victor Woeltjen
074548964a [Inspection] Update selection on navigation 2016-11-21 14:19:30 -08:00
Victor Woeltjen
d6deb533dd [Inspection] Change ViewRegistry to accept context
https://github.com/nasa/openmct/issues/1126#issuecomment-248112837
https://github.com/nasa/openmct/issues/1126#issuecomment-248127507
2016-11-21 13:39:37 -08:00
Victor Woeltjen
8834b11b56 [Inspector] Fix/clarify active check 2016-11-21 12:50:20 -08:00
Victor Woeltjen
f2d588be4b [Inspection] Simplify InspectorController
...such that it doees not depend upon navigation state (instead,
expect navigation changes to also update selection when appropriate)
2016-11-21 12:06:31 -08:00
Victor Woeltjen
f88da89b78 [Inspection] Sketch in InspectorView 2016-11-21 12:04:06 -08:00
Victor Woeltjen
f4547d333e [Inspection] Add template 2016-11-18 16:08:49 -08:00
Victor Woeltjen
309ec07bc7 [Inspection] Sketch in InspectorPanelView 2016-11-17 14:45:34 -08:00
Pete Richards
c98286d426 Merge pull request #1329 from nasa/jscs-reports-1314
[Build] Output JSCS reports
2016-11-17 11:08:30 -08:00
Pete Richards
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
Pete Richards
6a7b77ccf5 Merge pull request #1326 from nasa/image-brightness-contrast
[Imagery] Brightness/contrast controls
2016-11-17 11:06:05 -08:00
Victor Woeltjen
d9226568b7 [Inspection] Update API usage from SelectGesture 2016-11-16 16:07:56 -08:00
Victor Woeltjen
936a668fe3 [Inspection] Sketch in InspectorController
...to mediate between selection/navigation changes and UI updates.
#1126
2016-11-16 15:57:41 -08:00
Victor Woeltjen
242eb6d733 [Build] Restore missing semicolon
Semicolons are our friends.
2016-11-16 09:36:22 -08:00
Victor Woeltjen
2991e9894d [Build] Move report to correct location 2016-11-16 09:28:56 -08:00
Victor Woeltjen
3dc8bc87fc [Build] Add jscs html reporter
Fixes #1314
2016-11-15 16:00:40 -08:00
Victor Woeltjen
cfb99eaf80 [Imagery] Add doc to mct-background-image 2016-11-15 14:08:00 -08:00
Victor Woeltjen
5dee588c36 Revert "[Frontend] Updated example images"
This reverts commit 251e3b5646.
2016-11-15 14:00:51 -08:00
Victor Woeltjen
2f8c03ecb2 [Imagery] Simplify filter reset 2016-11-15 14:00:12 -08:00
Victor Woeltjen
2dfde9a612 [Imagery] Test mct-background-image filters 2016-11-15 13:54:23 -08:00
Victor Woeltjen
3dade275d4 Merge pull request #1318 from nasa/open1315
Add styling for .s-status-missing
2016-11-15 12:56:26 -08:00
Charles Hacskaylo
2f5dc8a887 [Frontend] Styling for controls
Fixes #1324
New reset glyph; Reset button complete,
final sanding.
2016-11-15 12:24:14 -08:00
Charles Hacskaylo
9b11684ae9 [Frontend] Styling for controls
Fixes #1324
CSS, markup, WIP adding reset button
2016-11-15 10:54:00 -08:00
Charles Hacskaylo
251e3b5646 [Frontend] Updated example images
Fixes #1324
All images are open licensed for reuse
2016-11-15 10:42:34 -08:00
Victor Woeltjen
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
Victor Woeltjen
18e51aaff7 [Build] Remove SNAPSHOT status
...to close sprint Robinson,
https://github.com/nasa/openmct/milestones/Robinson
2016-11-15 10:00:16 -08:00
Andrew Henry
5c31c6084c [Composition] Modified call to object utils to provide identifier correctly. 2016-11-15 11:37:55 +00:00
Charles Hacskaylo
b1464efdaf [Frontend] Styling for controls
Fixes #1324
CSS, markup, new glyphs for
brightness and contrast
2016-11-14 18:12:06 -08:00
Victor Woeltjen
3e6e068f7f [Imagery] Sketch in brightness/contrast controls
Fixes #1324
2016-11-14 12:19:23 -08:00
Charles Hacskaylo
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
Victor Woeltjen
dfa4591834 Merge pull request #1316 from nasa/ghost-object-problems
Ghost object problems
2016-11-08 16:27:09 -08:00
Pete Richards
4d3ec398c9 [Style] Fix style, disable tests
disable tests for later follow-up.
2016-11-08 16:21:38 -08:00
Pete Richards
b169089156 get rid of feel-good code 2016-11-08 16:07:53 -08:00
Pete Richards
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
Pete Richards
66a6b6d89b Always put in cache on mutation, assuming persistence 2016-11-08 14:58:15 -08:00
Pete Richards
d74eba1922 Move mutation listening out of cache service 2016-11-08 14:14:56 -08:00
Pete Richards
9a7f69a614 Model Cache updates models on mutation 2016-11-08 13:54:31 -08:00
Pete Richards
0578a651da cache on instantiate 2016-11-08 13:51:50 -08:00
Pete Richards
f991dcfb76 Clear cache when no transactions active 2016-11-08 13:51:30 -08:00
Pete Richards
42c48cb93b disable cache 2016-11-08 11:20:34 -08:00
Andrew Henry
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
Pete Richards
2708562872 [Transaction] Sync mutation within transaction 2016-11-08 10:34:20 -08:00
Victor Woeltjen
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
Victor Woeltjen
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
Victor Woeltjen
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
Andrew Henry
025b69541e Merge pull request #1222 from BogdanAlexandru/mct1221
[Notifications] Fix and harden the NotificationService
2016-11-03 09:45:06 -07:00
Victor Woeltjen
5aa95c0415 Merge pull request #1207 from Proekspert/fix-tutorial
[Documentation] Fixed module reference
2016-11-02 09:24:27 -07:00
Alex M
d63c401e44 [Notifications] Remove custom autoDismiss 2016-10-29 11:18:07 +03:00
Alex M
c9ac85089a Merge branch 'master' into mct1221 2016-10-29 10:41:18 +03:00
Brandon Lawrence
a8c9b6f7fe Fixes #1239 make notification icon clickable 2016-10-27 19:20:45 -04:00
Pete Richards
eca9968a9f Merge pull request #1302 from nasa/types-nonfunctional-1294
[API] Fix type registration
2016-10-27 16:01:16 -07:00
Victor Woeltjen
736c89cfc6 Merge pull request #1301 from nasa/search-indexing-1279
Add modelService compatibility adapater
2016-10-27 15:54:06 -07:00
Victor Woeltjen
9a0fcc045c [API] Simplify type registration
https://github.com/nasa/openmct/pull/1302#discussion_r85417042
2016-10-27 15:30:34 -07:00
Pete Richards
a3459679d0 [JSDoc] basic jsdoc 2016-10-27 13:01:29 -07:00
Victor Woeltjen
12333f3417 [API] Use correct method name in docstring 2016-10-27 12:22:46 -07:00
Victor Woeltjen
2bf05ae40f [API] Add missing semicolon, satisfy JSHint 2016-10-27 12:21:16 -07:00
Victor Woeltjen
833bad067e [API] Add creatable property to example 2016-10-27 12:16:57 -07:00
Victor Woeltjen
23eff4b924 [API] Fix TypeRegistry docstring
Fixes #1295
2016-10-27 12:16:07 -07:00
Victor Woeltjen
30b769d741 [API] Repair type registration
Fixes #1294
2016-10-27 12:10:45 -07:00
Pete Richards
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
Pete Richards
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
Victor Woeltjen
365af918f3 Merge pull request #1297 from nasa/fast-gulp-develop-1268
[Dev] develop with stylesheets
2016-10-27 11:52:48 -07:00
Pete Richards
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
Pete Richards
8cacff37ab Merge pull request #1292 from nasa/my-items-1284
[Roots] Restore legacy root provider
2016-10-26 10:24:24 -07:00
Victor Woeltjen
70985c5dbd Revert "[Roots] Remove obsolete provider"
This reverts commit b49fef78f5.

Fixes #1284
2016-10-26 10:09:10 -07:00
Victor Woeltjen
9dec99824e Revert "[Roots] Remove obsolete spec"
This reverts commit 2cced53c97.
2016-10-26 10:08:35 -07:00
Victor Woeltjen
d4730e1656 Revert "[Roots] Remove legacy root model provider"
This reverts commit 7b0506bbdb.
2016-10-26 10:08:30 -07:00
Victor Woeltjen
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
Victor Woeltjen
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
Pete Richards
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
Henry
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
Victor Woeltjen
b49fef78f5 [Roots] Remove obsolete provider 2016-10-19 17:02:12 -07:00
Victor Woeltjen
2cced53c97 [Roots] Remove obsolete spec 2016-10-19 16:54:26 -07:00
Victor Woeltjen
f6253ae7ed [Roots] Remove unnecessary model provider 2016-10-19 16:53:03 -07:00
Victor Woeltjen
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
Victor Woeltjen
2a79813460 [Roots] Remove unnecessary RootRegistrar 2016-10-19 16:37:10 -07:00
Victor Woeltjen
650824574c [Roots] Add new root model provider
...to read roots from the new API's registry.
2016-10-19 16:20:02 -07:00
Victor Woeltjen
7b0506bbdb [Roots] Remove legacy root model provider 2016-10-19 16:19:11 -07:00
Victor Woeltjen
a3847bcca5 [Roots] Add useful logging for components 2016-10-19 16:18:50 -07:00
Victor Woeltjen
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
Victor Woeltjen
64ff463200 Revert "Revert "Async root registration"" 2016-10-19 14:55:07 -07:00
Andrew Henry
08ca7659e7 Merge pull request #1260 from nasa/open1257
[Composition] Fix adapter composition policy
2016-10-18 12:04:04 -07:00
Victor Woeltjen
d7edfb4cc6 Merge pull request #1263 from nasa/revert-1252-async-root-registration
Revert "Async root registration"
2016-10-18 10:52:42 -07:00
Victor Woeltjen
4eca80a770 Revert "Async root registration" 2016-10-18 10:48:26 -07:00
Andrew Henry
56a662841e Merge pull request #1254 from nasa/open1235
[Frontend] Fixes to Export buttons
2016-10-18 09:32:28 -07:00
Victor Woeltjen
8878ea4cf7 Merge pull request #1244 from nasa/restore-fixed-pos
[API] Enable fixed position view
2016-10-18 09:32:08 -07:00
Victor Woeltjen
eb32a798b8 Merge pull request #1252 from nasa/async-root-registration
Async root registration
2016-10-18 09:31:46 -07:00
Victor Woeltjen
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
Alex M
bfdf7b822f [Notifications] Cover direct dismiss and minimize 2016-10-16 15:34:11 +03:00
Alex M
7dde924fcc Merge branch 'master' into mct1221 2016-10-15 14:10:24 +03:00
Charles Hacskaylo
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
Victor Woeltjen
971b92acbb Merge remote-tracking branch 'origin/master' into restore-fixed-pos 2016-10-14 13:53:26 -07:00
Pete Richards
d643efa9bb [Style] Remove unused function
https://github.com/nasa/openmct/issues/1251
2016-10-14 13:16:00 -07:00
Pete Richards
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
Pete Richards
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
Pete Richards
6ec858b237 [Docs] Update root registration in README.
https://github.com/nasa/openmct/issues/1251
2016-10-14 12:38:52 -07:00
Pete Richards
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
Pete Richards
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
Victor Woeltjen
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
Henry
a2711c2c08 [Documentation] Changed build script to produce new API docs for website. Fixes #1249t 2016-10-13 16:27:35 -07:00
Victor Woeltjen
3e6c9fa318 Merge pull request #1247 from nasa/fix-built-file
[Build] require correct module
2016-10-12 15:25:37 -07:00
Pete Richards
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
Pete Richards
abf750f894 Merge branch '1089-integration' 2016-10-12 14:43:45 -07:00
Henry
137434af1b [API] Enable fixed position view 2016-10-12 14:06:39 -07:00
Pete Richards
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
Andrew Henry
db362a0efc Merge pull request #1243 from nasa/api-swg-enable
[API] Enable example bundles
2016-10-12 13:54:12 -07:00
Pete Richards
887631500b [Style] Remove duplicate key
Remove duplicate entry, fix JSHint issues.
2016-10-12 13:53:22 -07:00
Pete Richards
65043d0ff3 squash merge open933 into integration-1089, resolve merge conflicts. 2016-10-12 13:47:56 -07:00
Victor Woeltjen
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
Andrew Henry
7b218c7f02 Merge pull request #1212 from nasa/api-1124b
[API] Integrate new API
2016-10-12 12:33:44 -07:00
Andrew Henry
3572877a2e Merge pull request #1213 from nasa/api-platform-updates
[API] Miscellaneous platform updates
2016-10-12 12:28:52 -07:00
Andrew Henry
f2d44114fa Merge pull request #874 from nasa/persist-on-mutation-825
[Persistence] Persist on mutation
2016-10-11 10:52:44 -07:00
Alex M
d1d2067ad5 [Notifications] Extract autoDismiss logic 2016-10-08 22:51:01 +03:00
Alex M
9456370077 [Notifications] Extract minimize and dismiss logic 2016-10-08 21:36:31 +03:00
Victor Woeltjen
0833674b91 [Persistence] Address refactoring error
...caught by unit tests
2016-10-07 11:54:54 -07:00
Victor Woeltjen
947b54555a [Edit Mode] Simplify transaction stack
https://github.com/nasa/openmct/pull/874#r76593588
2016-10-07 11:35:35 -07:00
Victor Woeltjen
1a88c9a651 Merge remote-tracking branch 'origin/master' into persist-on-mutation-825 2016-10-07 11:27:58 -07:00
Victor Woeltjen
567bb6fa2a [API] Fix ActionDialogDecorator's dependencies 2016-10-07 11:10:41 -07:00
Victor Woeltjen
00d0b71080 [API] Use ViewRegistry from dialog adapter
https://github.com/nasa/openmct/pull/1212#pullrequestreview-2458991
2016-10-07 11:07:53 -07:00
Victor Woeltjen
580e10b024 [API] Only use strategy where needed
Satisfies JSHint.
2016-10-07 10:15:02 -07:00
Victor Woeltjen
fbe9621387 [API] Support telemetry request strategies
https://github.com/nasa/openmct/pull/1212#discussion_r81880741
2016-10-06 18:00:32 -07:00
Victor Woeltjen
13b5e7c00e [API] Remove toLegacyDefinition
https://github.com/nasa/openmct/pull/1212#discussion_r81666469
2016-10-06 17:50:01 -07:00
Victor Woeltjen
09d59f00e7 [API] Remove silly old comment
https://github.com/nasa/openmct/pull/1212#discussion_r82086807
2016-10-06 17:48:08 -07:00
Victor Woeltjen
772d24b173 [API] Avoid memory leak
https://github.com/nasa/openmct/pull/1212#discussion_r81882955
2016-10-06 17:46:26 -07:00
Victor Woeltjen
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
tylerbrewer2
6d2c5f7fd4 [Frontend] Ensure stacking order of save drop-down Fixes #1205 2016-10-06 18:49:21 -04:00
Ilya Bolkhovsky
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
Henry
bff4e120a7 [Tables] Modified selection of scrollable element. Fixes #1216 2016-10-04 19:14:47 -07:00
Victor Woeltjen
8a0018177a Merge pull request #1204 from BogdanAlexandru/mct1198
[Edit] Switch other edit actions to mct-control
2016-10-04 18:09:16 -07:00
Victor Woeltjen
c9c8998fa2 Merge pull request #1196 from hudsonfoo/open1185
[Timeline] Add battery starting state-of-charge
2016-10-04 18:06:50 -07:00
Alex M
e19edbb27a Merge branch 'master' into mct1221 2016-10-03 04:50:41 +03:00
Alex M
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
Alex M
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
Alex M
e03c725b86 [Style] Minor style changes 2016-10-01 22:40:21 +03:00
Victor Woeltjen
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
Victor Woeltjen
c874ae7afd Merge remote-tracking branch 'origin/master' into api-platform-updates 2016-09-30 14:46:37 -07:00
David Hudson
e077f9ee18 [Timeline] Fix logic error
Issue #1185. Also removed direct modification of domain object.
2016-09-30 21:34:03 +02:00
David Hudson
e9f4db7719 Merge branch 'master' of github.com:nasa/openmct into open1185 2016-09-30 21:25:36 +02:00
Victor Woeltjen
34e07b938d [API] Update StyleSheetLoaderSpec
...to reflect asset path details
2016-09-30 10:42:48 -07:00
Victor Woeltjen
230230aa94 [API] Remove js extension from import
...to avoid confusing RequireJS and breaking test suite
2016-09-30 10:37:31 -07:00
Victor Woeltjen
901846e6c1 [API] Use correct property for RT table template 2016-09-30 10:29:03 -07:00
Victor Woeltjen
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
Ilya Bolkhovsky
77d4760945 fixed new code indication 2016-09-28 15:13:23 +03:00
Alex M
a34e89d56a [Edit] Bind action to .perform() inside mct-button 2016-09-27 21:19:25 +03:00
Ilya Bolkhovsky
4ec0d0633d fix module reference 2016-09-27 16:08:25 +03:00
Alex M
4b51e604a7 [Edit] Switch other edit actions to mct-control 2016-09-24 20:43:35 +03:00
David Hudson
3d17435438 [Test] Update spec to use SOC percentage 2016-09-20 17:42:34 +09:00
David Hudson
f185254114 [Formatting] Fix missing spaces 2016-09-20 17:41:45 +09:00
David Hudson
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
David Hudson
d913798d5b [Timeline] Add battery starting state-of-charge
Issue #1185
2016-09-18 22:52:41 +09:00
Victor Woeltjen
385d90b056 [Persistence] Fix code style 2016-08-08 13:51:10 -07:00
Victor Woeltjen
ecf526aa03 [Persistence] Add JSDoc for NestedTransaction 2016-08-08 13:49:34 -07:00
Victor Woeltjen
a35b158fd1 [Persistence] Add JSDoc for Transaction 2016-08-08 13:48:19 -07:00
Victor Woeltjen
2ebf05ae5b [Persistence] Test NestedTransaction 2016-08-08 13:41:13 -07:00
Victor Woeltjen
850da9de52 [Persistence] Fix member reference in NestedTransaction 2016-08-08 13:40:50 -07:00
Victor Woeltjen
353c24c70e [Persistence] Invoke parent constructor 2016-08-08 13:39:03 -07:00
Victor Woeltjen
73d10ab093 [Persistence] Test Transaction 2016-08-08 13:29:39 -07:00
Victor Woeltjen
668b7b6a39 [Persistence] Add empty specs for Transactions 2016-08-08 13:21:48 -07:00
Victor Woeltjen
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
Victor Woeltjen
eb2fbcd8d0 [Persistence] Cover TransactingMutationListener
Add test cases sufficient for line coverage of
TransactingMutationListener.
2016-08-08 12:34:46 -07:00
Victor Woeltjen
02f34d1c04 [Persistence] Begin testing TransactingMutationListener 2016-08-08 12:28:13 -07:00
Victor Woeltjen
7265b241a2 Merge remote-tracking branch 'origin/master' into persist-on-mutation-825 2016-07-28 13:21:45 -07:00
Victor Woeltjen
771542ee5f [Persistence] Reliably return promises 2016-07-26 15:32:59 -07:00
Victor Woeltjen
b60eff2f5e [Persistence] Update bundle definition 2016-07-26 15:26:43 -07:00
Victor Woeltjen
f6d6cb929f [Persistence] Add to transaction on mutation 2016-07-26 15:24:16 -07:00
Victor Woeltjen
6f2c80bc2e [Persistence] Use NestedTransaction 2016-07-26 15:20:40 -07:00
Victor Woeltjen
0fe0b21eda [Persistence] Add NestedTransaction 2016-07-26 15:18:21 -07:00
Victor Woeltjen
0bedc227f4 [Persistence] Allow nested transactions 2016-07-26 10:10:15 -07:00
Victor Woeltjen
6c4419fb72 [Persistence] Refactor out Transaction
https://github.com/nasa/openmct/pull/874#issuecomment-233068178
2016-07-25 16:45:32 -07:00
Victor Woeltjen
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
Victor Woeltjen
fb8fe93529 [Persistence] Fix mistake in JSDoc
https://github.com/nasa/openmct/pull/874#discussion_r64639089
2016-05-25 13:06:58 -07:00
Victor Woeltjen
26839c7fd1 [Persistence] Fix code style after merge 2016-05-20 14:27:53 -07:00
Victor Woeltjen
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
Victor Woeltjen
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
Victor Woeltjen
bcf85db9c4 [Persistence] Delegate new 'persisted' method 2016-05-19 13:31:27 -07:00
Victor Woeltjen
f1e81c359e [Persistence] Satisfy JSHint 2016-05-19 12:17:20 -07:00
Victor Woeltjen
8279acc9a5 [Persistence] Don't expect persist calls in PropertiesAction spec 2016-05-19 12:04:08 -07:00
Victor Woeltjen
63438ad9ba [Persistence] Don't expect persist calls in LinkAction spec 2016-05-19 12:02:42 -07:00
Victor Woeltjen
467f4d2257 [Persistence] Don't expect persist calls in RemoveAction spec 2016-05-19 12:00:51 -07:00
Victor Woeltjen
a5aaa6f103 [Persistence] Don't expect persist calls in LocationCapability spec 2016-05-19 11:55:05 -07:00
Victor Woeltjen
9b273bc148 [Persistence] Don't expect persist calls in EditRepresenter spec 2016-05-19 11:52:58 -07:00
Victor Woeltjen
0aba9122a1 [Persistence] Don't expect persist calls in LinkService spec 2016-05-19 11:51:50 -07:00
Victor Woeltjen
ac3706dfb6 [Persistence] Don't expect persist calls in specs 2016-05-19 11:50:12 -07:00
Victor Woeltjen
3905171457 [Persistence] Don't expect persist calls in spec 2016-05-19 11:48:16 -07:00
Victor Woeltjen
1e03f22086 [Persistence] Don't expect persist calls in spec 2016-05-19 11:46:50 -07:00
Victor Woeltjen
360fdeaec8 [Persistence] Don't expect persist calls in spec 2016-05-19 11:44:26 -07:00
Victor Woeltjen
d5914dfde9 [Persistence] Remove caching of persistence capability
...as this no longer needs to be invoked directly.
2016-05-19 11:42:58 -07:00
Victor Woeltjen
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
Victor Woeltjen
f85ac79b4a [Persistence] Remove persistence usage from TimelineSwimlaneDropHandler 2016-04-29 11:53:15 -07:00
Victor Woeltjen
bea9f22a0c [Persistence] Remove persistence usage from TimelineSwimlaneDecorator 2016-04-29 11:51:21 -07:00
Victor Woeltjen
3f330dccf1 [Persistence] Remove persistence usage from TimelineDragHandler 2016-04-29 11:50:02 -07:00
Victor Woeltjen
f7f934f0e8 [Persistence] Remove persistence usage from AbstractStartTimerAction 2016-04-29 11:40:06 -07:00
Victor Woeltjen
0e683acde1 [Persistence] Remove persistence usage from LinkService 2016-04-29 11:38:40 -07:00
Victor Woeltjen
dd6414daf0 [Persistence] Remove persistence usage from LocationCapability 2016-04-29 11:37:03 -07:00
Victor Woeltjen
8756b7213f [Persistence] Remove persistence usage from EditRepresenter 2016-04-29 11:35:00 -07:00
Victor Woeltjen
b0cbb5a2b4 [Persistence] Only auto-persist previously saved domain objects 2016-04-29 11:31:36 -07:00
Victor Woeltjen
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
Victor Woeltjen
433d26e703 [Persistence] Remove persistence usage from Remove action 2016-04-26 16:53:12 -07:00
Victor Woeltjen
c99ffcb1f4 [Persistence] Remove persistence call from compose action 2016-04-26 16:50:15 -07:00
Victor Woeltjen
ef815cf060 [Persistence] Remove persistence reference
...from composition capability (as persistence is now triggered,
albeit indirectly.)
2016-04-26 16:46:30 -07:00
Victor Woeltjen
7fb7a5452f [Persistence] Remove persistence usage from Edit Properties 2016-04-26 16:43:52 -07:00
Victor Woeltjen
4b641f8723 [Persistence] Expose PersistingMutationListener from bundle 2016-04-26 16:39:49 -07:00
Victor Woeltjen
0d312def27 [Persistence] Add PersistingMutationListener
...to automatically trigger persistence after mutation.
#825
2016-04-26 16:37:44 -07:00
251 changed files with 14004 additions and 3282 deletions

279
API.md Normal file
View File

@@ -0,0 +1,279 @@
# 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 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);
}
});
```
### 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.
### 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

@@ -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,6 +19,10 @@
"comma-separated-values": "^3.6.4",
"FileSaver.js": "^0.0.2",
"zepto": "^1.1.6",
"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

@@ -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.

View File

@@ -131,11 +131,11 @@ one which exposes no extensions - which looks like:
```diff
define([
'legacyRegistry'
'openmct'
], function (
legacyRegistry
openmct
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions":
@@ -155,176 +155,134 @@ has been finalized.
#### Before
```diff
requirejs.config({
"paths": {
"legacyRegistry": "src/legacyRegistry",
"angular": "bower_components/angular/angular.min",
"angular-route": "bower_components/angular-route/angular-route.min",
"csv": "bower_components/comma-separated-values/csv.min",
"es6-promise": "bower_components/es6-promise/promise.min",
"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"
},
"shim": {
"angular": {
"exports": "angular"
},
"angular-route": {
"deps": [ "angular" ]
},
"moment-duration-format": {
"deps": [ "moment" ]
},
"screenfull": {
"exports": "screenfull"
},
"zepto": {
"exports": "Zepto"
}
}
});
<!--
Open MCT, Copyright (c) 2014-2016, United States Government
as represented by the Administrator of the National Aeronautics and Space
Administration. All rights reserved.
define([
'./platform/framework/src/Main',
'legacyRegistry',
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.
-->
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title></title>
<script src="bower_components/requirejs/require.js">
</script>
<script>
require([
'openmct'
], function (openmct) {
[
'example/imagery',
'example/eventGenerator',
'example/generator',
'platform/features/my-items',
'platform/persistence/local'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
openmct.start();
});
</script>
<link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
<link rel="stylesheet" href="platform/commonUI/general/res/css/openmct.css">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16">
<link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico">
</head>
<body class="user-environ">
<div class="l-splash-holder s-splash-holder">
<div class="l-splash s-splash"></div>
</div>
</body>
</html>
'./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/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);
}
};
});
```
__main.js__
__index.html__
#### After
```diff
requirejs.config({
"paths": {
"legacyRegistry": "src/legacyRegistry",
"angular": "bower_components/angular/angular.min",
"angular-route": "bower_components/angular-route/angular-route.min",
"csv": "bower_components/comma-separated-values/csv.min",
"es6-promise": "bower_components/es6-promise/promise.min",
"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"
},
"shim": {
"angular": {
"exports": "angular"
},
"angular-route": {
"deps": [ "angular" ]
},
"moment-duration-format": {
"deps": [ "moment" ]
},
"screenfull": {
"exports": "screenfull"
},
"zepto": {
"exports": "Zepto"
}
}
});
<!--
Open MCT, Copyright (c) 2014-2016, United States Government
as represented by the Administrator of the National Aeronautics and Space
Administration. All rights reserved.
define([
'./platform/framework/src/Main',
'legacyRegistry',
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.
-->
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title></title>
<script src="bower_components/requirejs/require.js">
</script>
<script>
require([
'openmct',
+ 'tutorials/todo/bundle'
], function (openmct) {
[
'example/imagery',
'example/eventGenerator',
'example/generator',
'platform/features/my-items',
'platform/persistence/local',
+ 'tutorials/todo'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
openmct.start();
});
</script>
<link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
<link rel="stylesheet" href="platform/commonUI/general/res/css/openmct.css">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16">
<link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico">
</head>
<body class="user-environ">
<div class="l-splash-holder s-splash-holder">
<div class="l-splash s-splash"></div>
</div>
</body>
</html>
'./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/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',
+ './tutorials/todo/bundle'
], function (Main, legacyRegistry) {
return {
legacyRegistry: legacyRegistry,
run: function () {
return new Main().run(legacyRegistry);
}
};
});
```
__main.js__
__index.html__
At this point, we can reload Open MCT. We haven't introduced any new
functionality, so we don't see anything different, but if we run with logging
@@ -349,11 +307,11 @@ our bundle definition:
```diff
define([
'legacyRegistry'
'openmct'
], function (
legacyRegistry
openmct
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions":
@@ -362,7 +320,7 @@ define([
+ {
+ "key": "example.todo",
+ "name": "To-Do List",
+ "glyph": "2",
+ "cssclass": "icon-check",
+ "description": "A list of things that need to be done.",
+ "features": ["creation"]
+ }
@@ -445,11 +403,11 @@ definition:
```diff
define([
'legacyRegistry'
'openmct'
], function (
legacyRegistry
openmct
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions": {
@@ -457,7 +415,7 @@ define([
{
"key": "example.todo",
"name": "To-Do List",
"glyph": "2",
"cssclass": "icon-check",
"description": "A list of things that need to be done.",
"features": ["creation"]
}
@@ -466,7 +424,7 @@ define([
+ {
+ "key": "example.todo",
+ "type": "example.todo",
+ "glyph": "2",
+ "cssclass": "icon-check",
+ "name": "List",
+ "templateUrl": "templates/todo.html",
+ "editable": true
@@ -502,11 +460,11 @@ definition of that type.
```diff
define([
'legacyRegistry'
'openmct'
], function (
legacyRegistry
openmct
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions": {
@@ -514,7 +472,7 @@ define([
{
"key": "example.todo",
"name": "To-Do List",
"glyph": "2",
"cssclass": "icon-check",
"description": "A list of things that need to be done.",
"features": ["creation"],
+ "model": {
@@ -529,7 +487,7 @@ define([
{
"key": "example.todo",
"type": "example.todo",
"glyph": "2",
"cssclass": "icon-check",
"name": "List",
"templateUrl": "templates/todo.html",
"editable": true
@@ -674,13 +632,13 @@ it in our bundle definition, as an extension of category `controllers`:
```diff
define([
'legacyRegistry',
'./src/controllers/TodoController'
'openmct',
+ './src/controllers/TodoController'
], function (
legacyRegistry,
TodoController
openmct,
+ TodoController
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions": {
@@ -688,7 +646,7 @@ define([
{
"key": "example.todo",
"name": "To-Do List",
"glyph": "2",
"cssclass": "icon-check",
"description": "A list of things that need to be done.",
"features": ["creation"],
"model": {
@@ -703,7 +661,7 @@ define([
{
"key": "example.todo",
"type": "example.todo",
"glyph": "2",
"cssclass": "icon-check",
"name": "List",
"templateUrl": "templates/todo.html",
"editable": true
@@ -768,13 +726,13 @@ extension definition.
```diff
define([
'legacyRegistry',
'openmct',
'./src/controllers/TodoController'
], function (
legacyRegistry,
openmct,
TodoController
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions": {
@@ -782,7 +740,7 @@ define([
{
"key": "example.todo",
"name": "To-Do List",
"glyph": "2",
"cssclass": "icon-check",
"description": "A list of things that need to be done.",
"features": ["creation"],
"model": {
@@ -797,7 +755,7 @@ define([
{
"key": "example.todo",
"type": "example.todo",
"glyph": "2",
"cssclass": "icon-check",
"name": "List",
"templateUrl": "templates/todo.html",
"editable": true,
@@ -807,7 +765,7 @@ define([
+ "items": [
+ {
+ "text": "Add Task",
+ "glyph": "+",
+ "cssclass": "icon-plus",
+ "method": "addTask",
+ "control": "button"
+ }
@@ -816,7 +774,7 @@ define([
+ {
+ "items": [
+ {
+ "glyph": "Z",
+ "cssclass": "icon-trash",
+ "method": "removeTask",
+ "control": "button"
+ }
@@ -998,13 +956,13 @@ declare that dependency in its extension definition:
```diff
define([
'legacyRegistry',
'openmct',
'./src/controllers/TodoController'
], function (
legacyRegistry,
openmct,
TodoController
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions": {
@@ -1012,7 +970,7 @@ define([
{
"key": "example.todo",
"name": "To-Do List",
"glyph": "2",
"cssclass": "icon-check",
"description": "A list of things that need to be done.",
"features": ["creation"],
"model": {
@@ -1027,7 +985,7 @@ define([
{
"key": "example.todo",
"type": "example.todo",
"glyph": "2",
"cssclass": "icon-check",
"name": "List",
"templateUrl": "templates/todo.html",
"editable": true,
@@ -1037,7 +995,7 @@ define([
"items": [
{
"text": "Add Task",
"glyph": "+",
"cssclass": "icon-plus",
"method": "addTask",
"control": "button"
}
@@ -1046,7 +1004,7 @@ define([
{
"items": [
{
"glyph": "Z",
"cssclass": "icon-trash",
"method": "removeTask",
"control": "button"
}
@@ -1263,13 +1221,13 @@ declare it in our bundle definition, this time as an extension of category
```diff
define([
'legacyRegistry',
'openmct',
'./src/controllers/TodoController'
], function (
legacyRegistry,
openmct,
TodoController
) {
legacyRegistry.register("tutorials/todo", {
openmct.legacyRegistry.register("tutorials/todo", {
"name": "To-do Plugin",
"description": "Allows creating and editing to-do lists.",
"extensions": {
@@ -1277,7 +1235,7 @@ define([
{
"key": "example.todo",
"name": "To-Do List",
"glyph": "2",
"cssclass": "icon-check",
"description": "A list of things that need to be done.",
"features": ["creation"],
"model": {
@@ -1289,7 +1247,7 @@ define([
{
"key": "example.todo",
"type": "example.todo",
"glyph": "2",
"cssclass": "icon-check",
"name": "List",
"templateUrl": "templates/todo.html",
"editable": true,
@@ -1299,7 +1257,7 @@ define([
"items": [
{
"text": "Add Task",
"glyph": "+",
"cssclass": "icon-plus",
"method": "addTask",
"control": "button"
}
@@ -1308,7 +1266,7 @@ define([
{
"items": [
{
"glyph": "Z",
"cssclass": "icon-trash",
"method": "removeTask",
"control": "button"
}
@@ -1403,11 +1361,11 @@ bundle definition looks like:
```diff
define([
'legacyRegistry'
'openmct'
], function (
legacyRegistry
openmct
) {
legacyRegistry.register("tutorials/bargraph", {
openmct.legacyRegistry.register("tutorials/bargraph", {
"name": "Bar Graph",
"description": "Provides the Bar Graph view of telemetry elements.",
"extensions": {
@@ -1415,7 +1373,7 @@ define([
{
"name": "Bar Graph",
"key": "example.bargraph",
"glyph": "H",
"cssclass": "icon-autoflow-tabular",
"templateUrl": "templates/bargraph.html",
"needs": [ "telemetry" ],
"delegation": true
@@ -1573,7 +1531,7 @@ The corresponding CSS file which styles and positions these elements:
```
__tutorials/bargraph/res/css/bargraph.css__
This is already enough that, if we add `"tutorials/bargraph"` to `main.js`,
This is already enough that, if we add `"tutorials/bargraph"` to `index.html`,
we should be able to run Open MCT and see our Bar Graph as an available view
for domain objects which provide telemetry (such as the example
_Sine Wave Generator_) as well as for _Telemetry Panel_ objects:
@@ -1704,13 +1662,13 @@ service we made use of.
```diff
define([
'legacyRegistry',
'openmct',
'./src/controllers/BarGraphController'
], function (
legacyRegistry,
openmct,
BarGraphController
) {
legacyRegistry.register("tutorials/bargraph", {
openmct.legacyRegistry.register("tutorials/bargraph", {
"name": "Bar Graph",
"description": "Provides the Bar Graph view of telemetry elements.",
"extensions": {
@@ -1718,7 +1676,7 @@ define([
{
"name": "Bar Graph",
"key": "example.bargraph",
"glyph": "H",
"cssclass": "icon-autoflow-tabular",
"templateUrl": "templates/bargraph.html",
"needs": [ "telemetry" ],
"delegation": true
@@ -1870,13 +1828,13 @@ First, let's add a tool bar for changing these three values in Edit mode:
```diff
define([
'legacyRegistry',
'openmct',
'./src/controllers/BarGraphController'
], function (
legacyRegistry,
openmct,
BarGraphController
) {
legacyRegistry.register("tutorials/bargraph", {
openmct.legacyRegistry.register("tutorials/bargraph", {
"name": "Bar Graph",
"description": "Provides the Bar Graph view of telemetry elements.",
"extensions": {
@@ -1884,7 +1842,7 @@ define([
{
"name": "Bar Graph",
"key": "example.bargraph",
"glyph": "H",
"cssclass": "icon-autoflow-tabular",
"templateUrl": "templates/bargraph.html",
"needs": [ "telemetry" ],
"delegation": true,
@@ -2350,27 +2308,33 @@ will retrieve from the server.)
```diff
define([
'legacyRegistry'
'openmct'
], function (
legacyRegistry
openmct
) {
legacyRegistry.register("tutorials/telemetry", {
openmct.legacyRegistry.register("tutorials/telemetry", {
"name": "Example Telemetry Adapter",
"extensions": {
"types": [
{
"name": "Spacecraft",
"key": "example.spacecraft",
"glyph": "o"
"cssclass": "icon-object"
}
],
"roots": [
{
"id": "example:sc",
"priority": "preferred",
"priority": "preferred"
}
],
"models": [
{
"id": "example:sc",
"model": {
"type": "example.spacecraft",
"name": "My Spacecraft",
"location": "ROOT",
"composition": []
}
}
@@ -2389,91 +2353,70 @@ preferred so that this shows up near the top, instead of below My Items.
If we include this in our set of active bundles:
```diff
requirejs.config({
"paths": {
"legacyRegistry": "src/legacyRegistry",
"angular": "bower_components/angular/angular.min",
"angular-route": "bower_components/angular-route/angular-route.min",
"csv": "bower_components/comma-separated-values/csv.min",
"es6-promise": "bower_components/es6-promise/promise.min",
"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"
},
"shim": {
"angular": {
"exports": "angular"
},
"angular-route": {
"deps": [ "angular" ]
},
"moment-duration-format": {
"deps": [ "moment" ]
},
"screenfull": {
"exports": "screenfull"
},
"zepto": {
"exports": "Zepto"
}
}
});
```html
<!--
Open MCT, Copyright (c) 2014-2016, United States Government
as represented by the Administrator of the National Aeronautics and Space
Administration. All rights reserved.
define([
'./platform/framework/src/Main',
'legacyRegistry',
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.
-->
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title></title>
<script src="bower_components/requirejs/require.js">
</script>
<script>
require([
'openmct',
'./tutorials/telemetry/bundle'
], function (openmct) {
[
'example/imagery',
'example/eventGenerator',
'example/generator',
'platform/features/my-items',
'platform/persistence/local',
'tutorials/telemetry'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
openmct.start();
});
</script>
<link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
<link rel="stylesheet" href="platform/commonUI/general/res/css/openmct.css">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="platform/commonUI/general/res/images/favicons/favicon-16x16.png" sizes="16x16">
<link rel="shortcut icon" href="platform/commonUI/general/res/images/favicons/favicon.ico">
</head>
<body class="user-environ">
<div class="l-splash-holder s-splash-holder">
<div class="l-splash s-splash"></div>
</div>
</body>
</html>
'./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/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',
+ './tutorials/telemetry/bundle'
], function (Main, legacyRegistry) {
return {
legacyRegistry: legacyRegistry,
run: function () {
return new Main().run(legacyRegistry);
}
};
});
```
__main.js__
__index.html__
...we will be able to reload Open MCT and see that it is present:
@@ -2745,35 +2688,35 @@ with the platform):
```diff
define([
'legacyRegistry',
'openmct',
+ './src/ExampleTelemetryServerAdapter',
+ './src/ExampleTelemetryInitializer',
+ './src/ExampleTelemetryModelProvider'
], function (
legacyRegistry,
openmct,
+ ExampleTelemetryServerAdapter,
+ ExampleTelemetryInitializer,
+ ExampleTelemetryModelProvider
) {
legacyRegistry.register("tutorials/telemetry", {
openmct.legacyRegistry.register("tutorials/telemetry", {
"name": "Example Telemetry Adapter",
"extensions": {
"types": [
{
"name": "Spacecraft",
"key": "example.spacecraft",
"glyph": "o"
"cssclass": "icon-object"
},
+ {
+ "name": "Subsystem",
+ "key": "example.subsystem",
+ "glyph": "o",
+ "cssclass": "icon-object",
+ "model": { "composition": [] }
+ },
+ {
+ "name": "Measurement",
+ "key": "example.measurement",
+ "glyph": "T",
+ "cssclass": "icon-telemetry",
+ "model": { "telemetry": {} },
+ "telemetry": {
+ "source": "example.source",
@@ -2790,9 +2733,15 @@ define([
{
"id": "example:sc",
"priority": "preferred",
}
],
"models": [
{
"id": "example:sc",
"model": {
"type": "example.spacecraft",
"name": "My Spacecraft",
"location": "ROOT",
"composition": []
}
}
@@ -2948,7 +2897,7 @@ will implement:
/*global define*/
define(
['./src/ExampleTelemetrySeries'],
['./ExampleTelemetrySeries'],
function (ExampleTelemetrySeries) {
"use strict";
@@ -3064,35 +3013,35 @@ Finally, we expose this `telemetryService` provider declaratively:
```diff
define([
'legacyRegistry',
'openmct',
'./src/ExampleTelemetryServerAdapter',
'./src/ExampleTelemetryInitializer',
'./src/ExampleTelemetryModelProvider'
], function (
legacyRegistry,
openmct,
ExampleTelemetryServerAdapter,
ExampleTelemetryInitializer,
ExampleTelemetryModelProvider
) {
legacyRegistry.register("tutorials/telemetry", {
openmct.legacyRegistry.register("tutorials/telemetry", {
"name": "Example Telemetry Adapter",
"extensions": {
"types": [
{
"name": "Spacecraft",
"key": "example.spacecraft",
"glyph": "o"
"cssclass": "icon-object"
},
{
"name": "Subsystem",
"key": "example.subsystem",
"glyph": "o",
"cssclass": "icon-object",
"model": { "composition": [] }
},
{
"name": "Measurement",
"key": "example.measurement",
"glyph": "T",
"cssclass": "icon-telemetry",
"model": { "telemetry": {} },
"telemetry": {
"source": "example.source",
@@ -3108,10 +3057,16 @@ define([
"roots": [
{
"id": "example:sc",
"priority": "preferred",
"priority": "preferred"
}
],
"models": [
{
"id": "example:sc",
"model": {
"type": "example.spacecraft",
"name": "My Spacecraft",
"location": "ROOT",
"composition": []
}
}
@@ -3248,7 +3203,7 @@ We then need only to utilize these methods from our `telemetryService`:
/*global define*/
define(
['./src/ExampleTelemetrySeries'],
['./ExampleTelemetrySeries'],
function (ExampleTelemetrySeries) {
"use strict";
@@ -3350,3 +3305,4 @@ server can handle this.)
Running Open MCT again, we can still plot our historical telemetry - but
now we also see that it updates in real-time as more data comes in from the
server.

View File

@@ -99,7 +99,7 @@ define([
"source": "generator",
"domains": [
{
"key": "time",
"key": "utc",
"name": "Time"
},
{

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,20 +23,18 @@
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": [
@@ -61,7 +59,7 @@ define([
"domains": [
{
"name": "Time",
"key": "timestamp",
"key": "utc",
"format": "utc"
}
]
@@ -81,7 +79,7 @@ define([
"model": {
"type": "msl.curiosity",
"name": "Mars Science Laboratory",
"composition": []
"composition": ["msl_tlm:rems"]
}
}
],
@@ -92,12 +90,6 @@ define([
"depends": ["$q", "$http", "$log", "REMS_WS_URL"]
}
],
"runs": [
{
"implementation": RemsTelemetryInitializer,
"depends": ["rems.adapter", "objectService"]
}
],
"components": [
{
"provides": "modelService",

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

@@ -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: {
@@ -78,6 +70,8 @@ var gulp = require('gulp'),
};
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 +81,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 +104,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 +125,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 +164,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

@@ -28,12 +28,17 @@
<script src="bower_components/requirejs/require.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',
'example/generator',
'platform/features/my-items',
'platform/persistence/local'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
openmct.start();
});
</script>
<link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
@@ -47,7 +52,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'
],

View File

@@ -27,6 +27,7 @@ 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",
"moment": "bower_components/moment/moment",
@@ -35,7 +36,9 @@ requirejs.config({
"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": {
@@ -44,6 +47,9 @@ requirejs.config({
"angular-route": {
"deps": ["angular"]
},
"EventEmitter": {
"exports": "EventEmitter"
},
"html2canvas": {
"exports": "html2canvas"
},
@@ -55,54 +61,28 @@ 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);
});
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,6 +21,7 @@
"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",
@@ -48,8 +49,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

@@ -41,6 +41,7 @@ define([
"text!./res/templates/items/items.html",
"text!./res/templates/browse/object-properties.html",
"text!./res/templates/browse/inspector-region.html",
"text!./res/templates/view-object.html",
'legacyRegistry'
], function (
BrowseController,
@@ -63,6 +64,7 @@ define([
itemsTemplate,
objectPropertiesTemplate,
inspectorRegionTemplate,
viewObjectTemplate,
legacyRegistry
) {
@@ -70,14 +72,13 @@ define([
"extensions": {
"routes": [
{
"when": "/browse/:ids*",
"when": "/browse/:ids*?",
"template": browseTemplate,
"reloadOnSearch": false
},
{
"when": "",
"template": browseTemplate,
"reloadOnSearch": false
"redirectTo": "/browse/"
}
],
"constants": [
@@ -142,7 +143,7 @@ define([
"representations": [
{
"key": "view-object",
"templateUrl": "templates/view-object.html"
"template": viewObjectTemplate
},
{
"key": "browse-object",

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

@@ -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,21 @@ define(
urlService,
defaultPath
) {
var path = [ROOT_ID].concat(
($route.current.params.ids || defaultPath).split("/")
);
var initialPath = ($route.current.params.ids || defaultPath).split("/");
function updateRoute(domainObject) {
var priorRoute = $route.current,
// Act as if params HADN'T changed to avoid page reload
unlisten;
var currentIds = $route.current.params.ids;
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
};
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 +71,96 @@ 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;
navigationService.setNavigation(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(navigateToObject);
}
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);
$scope.$watch("treeModel.selectedObject", function (newObject, oldObject) {
if (oldObject !== newObject) {
navigateDirectlyToModel(newObject);
}
});
// 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

@@ -35,18 +35,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,15 +67,27 @@ 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"]
@@ -91,62 +102,78 @@ define(
]
);
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 +193,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 +207,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 +222,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

@@ -200,7 +200,6 @@ define([
"name": "Remove",
"description": "Remove this object from its containing object.",
"depends": [
"$q",
"navigationService"
]
},
@@ -245,7 +244,9 @@ define([
"key": "cancel",
"category": "conclude-editing",
"implementation": CancelAction,
"name": "Cancel",
// 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": []
@@ -346,7 +347,8 @@ define([
"implementation": TransactionService,
"depends": [
"$q",
"$log"
"$log",
"cacheService"
]
},
{

View File

@@ -25,7 +25,7 @@
<mct-control key="'button'"
structure="{
text: saveActions[0].getMetadata().name,
click: saveActions[0].perform,
click: actionPerformer(saveActions[0]),
cssclass: 'major ' + saveActions[0].getMetadata().cssclass
}">
</mct-control>
@@ -42,11 +42,12 @@
</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

@@ -66,4 +66,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

@@ -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

@@ -171,7 +171,9 @@ define([
function finishEditing(clonedObject) {
return domainObject.getCapability("editor").finish()
.then(resolveWith(clonedObject));
.then(function () {
return fetchObject(clonedObject.getId());
});
}
function onFailure() {

View File

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

View File

@@ -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

@@ -50,17 +50,13 @@ define(
this.listenHandle = undefined;
// Mutate and persist a new version of a domain object's model.
function doPersist(model) {
function doMutate(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
@@ -80,14 +76,14 @@ define(
].join(" "));
// Update the configuration stored in the model, and persist.
if (domainObject && domainObject.hasCapability("persistence")) {
if (domainObject) {
// 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);
doMutate(model);
}
}

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

@@ -30,7 +30,6 @@ define(
mockScope,
testRepresentation,
mockDomainObject,
mockPersistence,
mockStatusCapability,
mockEditorCapability,
mockCapabilities,
@@ -56,15 +55,12 @@ define(
"useCapability",
"hasCapability"
]);
mockPersistence =
jasmine.createSpyObj("persistence", ["persist"]);
mockStatusCapability =
jasmine.createSpyObj("statusCapability", ["listen"]);
mockEditorCapability =
jasmine.createSpyObj("editorCapability", ["isEditContextRoot"]);
mockCapabilities = {
'persistence': mockPersistence,
'status': mockStatusCapability,
'editor': mockEditorCapability
};
@@ -96,7 +92,7 @@ define(
expect(representer.listenHandle).toHaveBeenCalled();
});
it("mutates and persists upon observed changes", function () {
it("mutates upon observed changes", function () {
mockScope.model = { someKey: "some value" };
mockScope.configuration = { someConfiguration: "something" };
@@ -108,9 +104,6 @@ define(
jasmine.any(Function)
);
// ... and should have persisted the mutation
expect(mockPersistence.persist).toHaveBeenCalled();
// Finally, check that the provided mutation function
// includes both model and configuration
expect(

View File

@@ -0,0 +1,78 @@
/*****************************************************************************
* 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,describe,it,expect,beforeEach,jasmine*/
define(["../../src/services/NestedTransaction"], function (NestedTransaction) {
var TRANSACTION_METHODS = ['add', 'commit', 'cancel', 'size'];
describe("A NestedTransaction", function () {
var mockTransaction,
nestedTransaction;
beforeEach(function () {
mockTransaction =
jasmine.createSpyObj('transaction', TRANSACTION_METHODS);
nestedTransaction = new NestedTransaction(mockTransaction);
});
it("exposes a Transaction's interface", function () {
TRANSACTION_METHODS.forEach(function (method) {
expect(nestedTransaction[method])
.toEqual(jasmine.any(Function));
});
});
describe("when callbacks are added", function () {
var mockCommit,
mockCancel,
remove;
beforeEach(function () {
mockCommit = jasmine.createSpy('commit');
mockCancel = jasmine.createSpy('cancel');
remove = nestedTransaction.add(mockCommit, mockCancel);
});
it("does not interact with its parent transaction", function () {
TRANSACTION_METHODS.forEach(function (method) {
expect(mockTransaction[method])
.not.toHaveBeenCalled();
});
});
describe("and the transaction is committed", function () {
beforeEach(function () {
nestedTransaction.commit();
});
it("adds to its parent transaction", function () {
expect(mockTransaction.add).toHaveBeenCalledWith(
jasmine.any(Function),
jasmine.any(Function)
);
});
});
});
});
});

View File

@@ -57,8 +57,7 @@ define(
transactionService.startTransaction();
transactionService.addToTransaction(onCommit, onCancel);
expect(transactionService.onCommits.length).toBe(1);
expect(transactionService.onCancels.length).toBe(1);
expect(transactionService.size()).toBe(1);
});
it("size function returns size of commit and cancel queues", function () {
@@ -85,7 +84,7 @@ define(
});
it("commit calls all queued commit functions", function () {
expect(transactionService.onCommits.length).toBe(3);
expect(transactionService.size()).toBe(3);
transactionService.commit();
onCommits.forEach(function (spy) {
expect(spy).toHaveBeenCalled();
@@ -95,8 +94,8 @@ define(
it("commit resets active state and clears queues", function () {
transactionService.commit();
expect(transactionService.isActive()).toBe(false);
expect(transactionService.onCommits.length).toBe(0);
expect(transactionService.onCancels.length).toBe(0);
expect(transactionService.size()).toBe(0);
expect(transactionService.size()).toBe(0);
});
});
@@ -116,7 +115,7 @@ define(
});
it("cancel calls all queued cancel functions", function () {
expect(transactionService.onCancels.length).toBe(3);
expect(transactionService.size()).toBe(3);
transactionService.cancel();
onCancels.forEach(function (spy) {
expect(spy).toHaveBeenCalled();
@@ -126,8 +125,7 @@ define(
it("cancel resets active state and clears queues", function () {
transactionService.cancel();
expect(transactionService.isActive()).toBe(false);
expect(transactionService.onCommits.length).toBe(0);
expect(transactionService.onCancels.length).toBe(0);
expect(transactionService.size()).toBe(0);
});
});

View File

@@ -0,0 +1,110 @@
/*****************************************************************************
* 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,describe,it,expect,beforeEach,jasmine*/
define(
["../../src/services/Transaction"],
function (Transaction) {
describe("A Transaction", function () {
var mockLog,
transaction;
beforeEach(function () {
mockLog = jasmine.createSpyObj(
'$log',
['warn', 'info', 'error', 'debug']
);
transaction = new Transaction(mockLog);
});
it("initially has a size of zero", function () {
expect(transaction.size()).toEqual(0);
});
describe("when callbacks are added", function () {
var mockCommit,
mockCancel,
remove;
beforeEach(function () {
mockCommit = jasmine.createSpy('commit');
mockCancel = jasmine.createSpy('cancel');
remove = transaction.add(mockCommit, mockCancel);
});
it("reports a new size", function () {
expect(transaction.size()).toEqual(1);
});
it("returns a function to remove those callbacks", function () {
expect(remove).toEqual(jasmine.any(Function));
remove();
expect(transaction.size()).toEqual(0);
});
describe("and the transaction is committed", function () {
beforeEach(function () {
transaction.commit();
});
it("triggers the commit callback", function () {
expect(mockCommit).toHaveBeenCalled();
});
it("does not trigger the cancel callback", function () {
expect(mockCancel).not.toHaveBeenCalled();
});
});
describe("and the transaction is cancelled", function () {
beforeEach(function () {
transaction.cancel();
});
it("triggers the cancel callback", function () {
expect(mockCancel).toHaveBeenCalled();
});
it("does not trigger the commit callback", function () {
expect(mockCommit).not.toHaveBeenCalled();
});
});
describe("and an exception is encountered during commit", function () {
beforeEach(function () {
mockCommit.andCallFake(function () {
throw new Error("test error");
});
transaction.commit();
});
it("logs an error", function () {
expect(mockLog.error).toHaveBeenCalled();
});
});
});
});
}
);

View File

@@ -23,10 +23,12 @@
define([
"./src/FormatProvider",
"./src/UTCTimeFormat",
"./src/DurationFormat",
'legacyRegistry'
], function (
FormatProvider,
UTCTimeFormat,
DurationFormat,
legacyRegistry
) {
@@ -48,6 +50,10 @@ define([
{
"key": "utc",
"implementation": UTCTimeFormat
},
{
"key": "duration",
"implementation": DurationFormat
}
],
"constants": [
@@ -55,6 +61,17 @@ define([
"key": "DEFAULT_TIME_FORMAT",
"value": "utc"
}
],
"licenses": [
{
"name": "d3",
"version": "3.0.0",
"description": "Incorporates modified code from d3 Time Scales",
"author": "Mike Bostock",
"copyright": "Copyright 2010-2016 Mike Bostock. " +
"All rights reserved.",
"link": "https://github.com/d3/d3/blob/master/LICENSE"
}
]
}
});

View File

@@ -0,0 +1,62 @@
/*****************************************************************************
* 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 = "HH:mm:ss",
DATE_FORMATS = [
DATE_FORMAT
];
/**
* Formatter for duration. Uses moment to produce a date from a given
* value, but output is formatted to display only time. Can be used for
* specifying a time duration. For specifying duration, it's best to
* specify a date of January 1, 1970, as the ms offset will equal the
* duration represented by the time.
*
* @implements {Format}
* @constructor
* @memberof platform/commonUI/formats
*/
function DurationFormat() {
}
DurationFormat.prototype.format = function (value) {
return moment.utc(value).format(DATE_FORMAT);
};
DurationFormat.prototype.parse = function (text) {
return moment.duration(text).asMilliseconds();
};
DurationFormat.prototype.validate = function (text) {
return moment.utc(text, DATE_FORMATS).isValid();
};
return DurationFormat;
});

View File

@@ -58,6 +58,10 @@ define([
* @method format
* @memberof Format#
* @param {number} value the numeric value to format
* @param {number} [threshold] Optionally provides context to the
* format request, allowing for scale-appropriate formatting. This value
* should be the minimum unit to be represented by this format, in ms. For
* example, to display seconds, a threshold of 1 * 1000 should be provided.
* @returns {string} the text representation of the value
*/

View File

@@ -34,6 +34,11 @@ define([
"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
@@ -46,7 +51,103 @@ define([
function UTCTimeFormat() {
}
UTCTimeFormat.prototype.format = function (value) {
/**
* Returns an appropriate time format based on the provided value and
* the threshold required.
* @private
*/
function getScaledFormat(d) {
var momentified = 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:mm", function (m) {
return m.minutes();
}],
["HH", 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](momentified);
})[0][0];
}
/**
* Returns a description of the current range of the time conductor's
* bounds.
* @param timeRange
* @returns {*}
*/
UTCTimeFormat.prototype.timeUnits = function (timeRange) {
var momentified = moment.duration(timeRange);
return [
["Decades", function (r) {
return r.years() > 15;
}],
["Years", function (r) {
return r.years() > 1;
}],
["Months", function (r) {
return r.years() === 1 || r.months() > 1;
}],
["Days", function (r) {
return r.months() === 1 || r.days() > 1;
}],
["Hours", function (r) {
return r.days() === 1 || r.hours() > 1;
}],
["Minutes", function (r) {
return r.hours() === 1 || r.minutes() > 1;
}],
["Seconds", function (r) {
return r.minutes() === 1 || r.seconds() > 1;
}],
["Milliseconds", function (r) {
return true;
}]
].filter(function (row) {
return row[1](momentified);
})[0][0];
};
/**
*
* @param value
* @param {Scale} [scale] Optionally provides context to the
* format request, allowing for scale-appropriate formatting.
* @returns {string} the formatted date
*/
UTCTimeFormat.prototype.format = function (value, scale) {
if (scale !== undefined) {
var scaledFormat = getScaledFormat(value, scale);
if (scaledFormat) {
return moment.utc(value).format(scaledFormat);
}
}
return moment.utc(value).format(DATE_FORMAT) + "Z";
};

View File

@@ -0,0 +1,83 @@
/*****************************************************************************
* 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([
"./UTCTimeFormat",
"moment"
], function (
UTCTimeFormat,
moment
) {
describe("The UTCTimeFormat class", function () {
var format;
var scale;
beforeEach(function () {
format = new UTCTimeFormat();
scale = {min: 0, max: 0};
});
it("Provides an appropriately scaled time format based on the input" +
" time", function () {
var TWO_HUNDRED_MS = 200;
var THREE_SECONDS = 3000;
var FIVE_MINUTES = 5 * 60 * 1000;
var ONE_HOUR_TWENTY_MINS = (1 * 60 * 60 * 1000) + (20 * 60 * 1000);
var TEN_HOURS = (10 * 60 * 60 * 1000);
var JUNE_THIRD = moment.utc("2016-06-03", "YYYY-MM-DD");
var APRIL = moment.utc("2016-04", "YYYY-MM");
var TWENTY_SIXTEEN = moment.utc("2016", "YYYY");
expect(format.format(TWO_HUNDRED_MS, scale)).toBe(".200");
expect(format.format(THREE_SECONDS, scale)).toBe(":03");
expect(format.format(FIVE_MINUTES, scale)).toBe("00:05");
expect(format.format(ONE_HOUR_TWENTY_MINS, scale)).toBe("01:20");
expect(format.format(TEN_HOURS, scale)).toBe("10");
expect(format.format(JUNE_THIRD, scale)).toBe("Fri 03");
expect(format.format(APRIL, scale)).toBe("April");
expect(format.format(TWENTY_SIXTEEN, scale)).toBe("2016");
});
it("Returns appropriate time units for a given time span", function () {
var ONE_DAY = 1000 * 60 * 60 * 24;
var FIVE_DAYS = 5 * ONE_DAY;
var FIVE_MONTHS = 60 * ONE_DAY;
var ONE_YEAR = 365 * ONE_DAY;
var SEVEN_YEARS = 7 * ONE_YEAR;
var TWO_DECADES = 20 * ONE_YEAR;
//A span of one day should show a zoom label of "Hours"
expect(format.timeUnits(ONE_DAY)).toEqual("Hours");
//Multiple days should display "Days"
expect(format.timeUnits(FIVE_DAYS)).toEqual("Days");
expect(format.timeUnits(FIVE_MONTHS)).toEqual("Days");
//A span of one year should show a zoom level of "Months".
// Multiple years will show "Years"
expect(format.timeUnits(ONE_YEAR)).toEqual("Months");
expect(format.timeUnits(SEVEN_YEARS)).toEqual("Years");
expect(format.timeUnits(TWO_DECADES)).toEqual("Decades");
});
});
});

View File

@@ -48,6 +48,7 @@ define([
"./src/directives/MCTSplitPane",
"./src/directives/MCTSplitter",
"./src/directives/MCTTree",
"./src/filters/ReverseFilter",
"text!./res/templates/bottombar.html",
"text!./res/templates/controls/action-button.html",
"text!./res/templates/controls/input-filter.html",
@@ -96,6 +97,7 @@ define([
MCTSplitPane,
MCTSplitter,
MCTTree,
ReverseFilter,
bottombarTemplate,
actionButtonTemplate,
inputFilterTemplate,
@@ -146,7 +148,8 @@ define([
"depends": [
"stylesheets[]",
"$document",
"THEME"
"THEME",
"ASSETS_PATH"
]
},
{
@@ -158,7 +161,7 @@ define([
],
"filters": [
{
"implementation": "filters/ReverseFilter.js",
"implementation": ReverseFilter,
"key": "reverse"
}
],
@@ -405,6 +408,11 @@ define([
"key": "THEME",
"value": "unspecified",
"priority": "fallback"
},
{
"key": "ASSETS_PATH",
"value": ".",
"priority": "fallback"
}
],
"containers": [

View File

@@ -1,8 +1,8 @@
{
"metadata": {
"name": "openmct-symbols-16px",
"lastOpened": 1469724858940,
"created": 1469724856623
"lastOpened": 1481575258437,
"created": 1481575255265
},
"iconSets": [
{
@@ -535,18 +535,50 @@
{
"order": 21,
"prevSize": 24,
"name": "icon-x-in-circle",
"name": "icon-resync",
"id": 16,
"code": 921654,
"tempChar": ""
},
{
"order": 121,
"id": 103,
"name": "icon-x-in-circle",
"prevSize": 24,
"code": 921656,
"tempChar": ""
},
{
"order": 118,
"id": 102,
"name": "icon-brightness",
"prevSize": 24,
"code": 921657,
"tempChar": ""
},
{
"order": 119,
"id": 104,
"name": "icon-contrast",
"prevSize": 24,
"code": 921664,
"tempChar": ""
},
{
"order": 120,
"id": 105,
"name": "icon-reset",
"prevSize": 24,
"code": 921655,
"tempChar": ""
},
{
"order": 37,
"prevSize": 24,
"name": "icon-activity",
"id": 32,
"code": 921856,
"tempChar": ""
"tempChar": ""
},
{
"order": 36,
@@ -554,7 +586,7 @@
"name": "icon-activity-mode",
"id": 31,
"code": 921857,
"tempChar": ""
"tempChar": ""
},
{
"order": 52,
@@ -562,7 +594,7 @@
"name": "icon-autoflow-tabular",
"id": 47,
"code": 921858,
"tempChar": ""
"tempChar": ""
},
{
"order": 55,
@@ -570,7 +602,7 @@
"name": "icon-clock",
"id": 50,
"code": 921859,
"tempChar": ""
"tempChar": ""
},
{
"order": 58,
@@ -578,7 +610,7 @@
"name": "icon-database",
"id": 53,
"code": 921860,
"tempChar": ""
"tempChar": ""
},
{
"order": 57,
@@ -586,7 +618,7 @@
"name": "icon-database-query",
"id": 52,
"code": 921861,
"tempChar": ""
"tempChar": ""
},
{
"order": 17,
@@ -594,7 +626,7 @@
"name": "icon-dataset",
"id": 12,
"code": 921862,
"tempChar": ""
"tempChar": ""
},
{
"order": 22,
@@ -602,7 +634,7 @@
"name": "icon-datatable",
"id": 17,
"code": 921863,
"tempChar": ""
"tempChar": ""
},
{
"order": 59,
@@ -610,7 +642,7 @@
"name": "icon-dictionary",
"id": 54,
"code": 921864,
"tempChar": ""
"tempChar": ""
},
{
"order": 62,
@@ -618,7 +650,7 @@
"name": "icon-folder",
"id": 57,
"code": 921865,
"tempChar": ""
"tempChar": ""
},
{
"order": 66,
@@ -626,7 +658,7 @@
"name": "icon-image",
"id": 61,
"code": 921872,
"tempChar": ""
"tempChar": ""
},
{
"order": 68,
@@ -634,7 +666,7 @@
"name": "icon-layout",
"id": 63,
"code": 921873,
"tempChar": ""
"tempChar": ""
},
{
"order": 77,
@@ -642,7 +674,7 @@
"name": "icon-object",
"id": 72,
"code": 921874,
"tempChar": ""
"tempChar": ""
},
{
"order": 78,
@@ -650,7 +682,7 @@
"name": "icon-object-unknown",
"id": 73,
"code": 921875,
"tempChar": ""
"tempChar": ""
},
{
"order": 79,
@@ -658,7 +690,7 @@
"name": "icon-packet",
"id": 74,
"code": 921876,
"tempChar": ""
"tempChar": ""
},
{
"order": 80,
@@ -666,7 +698,7 @@
"name": "icon-page",
"id": 75,
"code": 921877,
"tempChar": ""
"tempChar": ""
},
{
"order": 114,
@@ -674,7 +706,7 @@
"name": "icon-plot-overlay",
"prevSize": 24,
"code": 921878,
"tempChar": ""
"tempChar": ""
},
{
"order": 113,
@@ -682,7 +714,7 @@
"name": "icon-plot-stacked",
"prevSize": 24,
"code": 921879,
"tempChar": ""
"tempChar": ""
},
{
"order": 10,
@@ -690,7 +722,7 @@
"name": "icon-session",
"id": 5,
"code": 921880,
"tempChar": ""
"tempChar": ""
},
{
"order": 24,
@@ -698,7 +730,7 @@
"name": "icon-tabular",
"id": 19,
"code": 921881,
"tempChar": ""
"tempChar": ""
},
{
"order": 7,
@@ -706,7 +738,7 @@
"name": "icon-tabular-lad",
"id": 2,
"code": 921888,
"tempChar": ""
"tempChar": ""
},
{
"order": 6,
@@ -714,7 +746,7 @@
"name": "icon-tabular-lad-set",
"id": 1,
"code": 921889,
"tempChar": ""
"tempChar": ""
},
{
"order": 8,
@@ -722,7 +754,7 @@
"name": "icon-tabular-realtime",
"id": 3,
"code": 921890,
"tempChar": ""
"tempChar": ""
},
{
"order": 23,
@@ -730,7 +762,7 @@
"name": "icon-tabular-scrolling",
"id": 18,
"code": 921891,
"tempChar": ""
"tempChar": ""
},
{
"order": 112,
@@ -738,7 +770,7 @@
"name": "icon-telemetry",
"id": 86,
"code": 921892,
"tempChar": ""
"tempChar": ""
},
{
"order": 90,
@@ -746,7 +778,7 @@
"name": "icon-telemetry-panel",
"id": 85,
"code": 921893,
"tempChar": ""
"tempChar": ""
},
{
"order": 93,
@@ -754,7 +786,7 @@
"name": "icon-timeline",
"id": 88,
"code": 921894,
"tempChar": ""
"tempChar": ""
},
{
"order": 116,
@@ -762,7 +794,7 @@
"name": "icon-timer-v1.5",
"prevSize": 24,
"code": 921895,
"tempChar": ""
"tempChar": ""
},
{
"order": 11,
@@ -770,7 +802,7 @@
"name": "icon-topic",
"id": 6,
"code": 921896,
"tempChar": ""
"tempChar": ""
},
{
"order": 115,
@@ -778,13 +810,13 @@
"name": "icon-box-with-dashed-lines",
"id": 29,
"code": 921897,
"tempChar": ""
"tempChar": ""
}
],
"metadata": {
"name": "openmct-symbols-16px",
"importSize": {
"width": 448,
"width": 512,
"height": 512
},
"designer": "Charles Hacskaylo",
@@ -1973,7 +2005,7 @@
},
{
"paths": [
"M1012.8 414.2v-391.6l-127.6 127.4c-96.6-96.8-225.2-150-362-150s-265.2 53.2-362 150c-96.8 96.8-150 225.2-150 362s53.2 265.4 150 362c96.8 96.8 225.2 150 362 150s265.4-53.2 362-150l-136.6-136.6c-124.2 124.2-326.4 124.2-450.8 0-124.2-124.2-124.2-326.4 0-450.8 124.2-124.2 326.4-124.2 450.8 0l-127.4 127.4h391.6z"
"M960 432v-432l-164.8 164.8c-79.8-65.2-178.8-100.8-283.2-100.8-119.6 0-232.2 46.6-316.8 131.2s-131.2 197.2-131.2 316.8 46.6 232.2 131.2 316.8c84.6 84.6 197.2 131.2 316.8 131.2s232.2-46.6 316.8-131.2c69.4-69.4 113.2-157.4 126.6-252.8h-130c-29.8 145.8-159 256-313.6 256-176.4 0-320-143.6-320-320s143.8-320 320.2-320c72 0 138.4 23.8 192 64l-176 176h432z"
],
"grid": 16,
"tags": [
@@ -1981,9 +2013,19 @@
],
"defaultCode": 114,
"id": 27,
"attrs": [],
"attrs": [
{
"fill": "rgb(0, 161, 75)"
}
],
"isMulticolor": false,
"isMulticolor2": false,
"colorPermutations": {
"1161751207457516161751": []
"1161751207457516161751": [
{
"f": 1
}
]
}
},
{
@@ -2110,6 +2152,37 @@
"1161751207457516161751": []
}
},
{
"id": 105,
"paths": [
"M795.2 164.8c-79.8-65.2-178.8-100.8-283.2-100.8-119.6 0-232.2 46.6-316.8 131.2-69.4 69.4-113.2 157.4-126.6 252.8h130c29.6-145.8 158.8-256 313.4-256 72 0 138.4 23.8 192 64l-176 176h432v-432l-164.8 164.8z",
"M512 832c-72 0-138.4-23.8-192-64l176-176h-432v432l164.8-164.8c79.8 65.2 178.8 100.8 283.2 100.8 119.6 0 232.2-46.6 316.8-131.2 69.4-69.4 113.2-157.4 126.6-252.8h-130c-29.6 145.8-158.8 256-313.4 256z"
],
"attrs": [
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 16,
"tags": [
"icon-resync"
],
"colorPermutations": {
"1161751207457516161751": [
{
"f": 1
},
{
"f": 1
}
]
}
},
{
"paths": [
"M512 0c-282.8 0-512 229.2-512 512s229.2 512 512 512 512-229.2 512-512-229.2-512-512-512zM832 704l-128 128-192-192-192 192-128-128 192-192-192-192 128-128 192 192 192-192 128 128-192 192 192 192z"
@@ -2125,6 +2198,134 @@
"1161751207457516161751": []
}
},
{
"id": 103,
"paths": [
"M253.414 318.061l-155.172-116.384c-50.233 66.209-85.127 146.713-97.91 234.39l191.586 30.216c8.145-56.552 29.998-106.879 62.068-149.006z",
"M191.98 557.717l-191.919 27.434c13.115 90.459 48.009 170.963 99.174 238.453l154.18-117.665c-31.476-41.347-53.309-91.675-61.231-146.504z",
"M466.283 191.98l-27.434-191.919c-90.459 13.115-170.963 48.009-238.453 99.174l117.665 154.18c41.347-31.476 91.675-53.309 146.504-61.231z",
"M822.323 98.242c-66.209-50.233-146.713-85.127-234.39-97.91l-30.216 191.586c56.552 8.145 106.879 29.998 149.006 62.068z",
"M832.020 466.283l191.919-27.434c-13.115-90.459-48.009-170.963-99.174-238.453l-154.18 117.665c31.476 41.347 53.309 91.675 61.231 146.504z",
"M201.677 925.758c66.209 50.233 146.713 85.127 234.39 97.91l30.216-191.586c-56.552-8.145-106.879-29.998-149.006-62.068z",
"M770.586 705.939l155.131 116.343c50.233-66.209 85.127-146.713 97.91-234.39l-191.586-30.216c-8.125 56.564-29.966 106.906-62.028 149.049z",
"M557.717 832.020l27.434 191.919c90.459-13.115 170.963-48.009 238.453-99.174l-117.665-154.18c-41.347 31.476-91.675 53.309-146.504 61.231z",
"M770.586 512c0 142.813-115.773 258.586-258.586 258.586s-258.586-115.773-258.586-258.586c0-142.813 115.773-258.586 258.586-258.586s258.586 115.773 258.586 258.586z"
],
"attrs": [
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
},
{
"fill": "rgb(0, 161, 75)"
}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 16,
"tags": [
"icon-brightness"
],
"colorPermutations": {
"1161751207457516161751": [
{
"f": 1
},
{
"f": 1
},
{
"f": 1
},
{
"f": 1
},
{
"f": 1
},
{
"f": 1
},
{
"f": 1
},
{
"f": 1
},
{
"f": 1
}
]
}
},
{
"id": 102,
"paths": [
"M512 0c-282.78 0-512 229.24-512 512s229.22 512 512 512 512-229.24 512-512-229.22-512-512-512zM783.52 783.52c-69.111 69.481-164.785 112.481-270.502 112.481-0.358 0-0.716-0-1.074-0.001l0.055-768c212.070 0.010 383.982 171.929 383.982 384 0 106.034-42.977 202.031-112.462 271.52z"
],
"attrs": [
{
"fill": "rgb(0, 161, 75)"
}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 16,
"tags": [
"icon-contrast"
],
"colorPermutations": {
"1161751207457516161751": [
{
"f": 1
}
]
}
},
{
"id": 104,
"paths": [
"M460.8 460.8l-187.8-187.8c57.2-42.8 128-68.2 204.8-68.2 188.2 0 341.6 153.2 341.6 341.4s-153.2 341.2-341.4 341.2c-165 0-302.8-117.6-334.6-273h-138.4c14.2 101.8 61 195.6 135 269.6 90.2 90.2 210.4 140 338 140s247.6-49.8 338-140 140-210.4 140-338-49.8-247.6-140-338-210.4-140-338-140c-111.4 0-217 38-302 107.6l-176-175.6v460.8h460.8z"
],
"attrs": [
{
"fill": "rgb(0, 161, 75)"
}
],
"isMulticolor": false,
"isMulticolor2": false,
"grid": 16,
"tags": [
"icon-reset"
],
"colorPermutations": {
"1161751207457516161751": [
{
"f": 1
}
]
}
},
{
"paths": [
"M576 64h-256l320 320h-290.256c-44.264-76.516-126.99-128-221.744-128h-128v512h128c94.754 0 177.48-51.484 221.744-128h290.256l-320 320h256l448-448-448-448z"

View File

@@ -65,14 +65,18 @@
<glyph unicode="&#xe1026;" glyph-name="icon-plot-resource" d="M255.884 256c0.040 0.034 0.082 0.074 0.116 0.116v127.884c0 70.58 57.42 128 128 128h255.884c0.040 0.034 0.082 0.074 0.116 0.116v127.884c0 70.58 57.42 128 128 128h143.658c-93.832 117.038-237.98 192-399.658 192-282.77 0-512-229.23-512-512 0-67.904 13.25-132.704 37.256-192h218.628zM768.116 640c-0.040-0.034-0.082-0.074-0.116-0.116v-127.884c0-70.58-57.42-128-128-128h-255.884c-0.040-0.034-0.082-0.074-0.116-0.116v-127.884c0-70.58-57.42-128-128-128h-143.658c93.832-117.038 237.98-192 399.658-192 282.77 0 512 229.23 512 512 0 67.904-13.25 132.704-37.256 192h-218.628z" />
<glyph unicode="&#xe1027;" glyph-name="icon-pointer-left" horiz-adv-x="512" d="M510-64l-256 512 256 512h-256l-256-512 256-512z" />
<glyph unicode="&#xe1028;" glyph-name="icon-pointer-right" horiz-adv-x="512" d="M-2 960l256-512-256-512h256l256 512-256 512z" />
<glyph unicode="&#xe1029;" glyph-name="icon-refresh" d="M1012.8 545.8v391.6l-127.6-127.4c-96.6 96.8-225.2 150-362 150s-265.2-53.2-362-150c-96.8-96.8-150-225.2-150-362s53.2-265.4 150-362c96.8-96.8 225.2-150 362-150s265.4 53.2 362 150l-136.6 136.6c-124.2-124.2-326.4-124.2-450.8 0-124.2 124.2-124.2 326.4 0 450.8 124.2 124.2 326.4 124.2 450.8 0l-127.4-127.4h391.6z" />
<glyph unicode="&#xe1029;" glyph-name="icon-refresh" d="M960 528v432l-164.8-164.8c-79.8 65.2-178.8 100.8-283.2 100.8-119.6 0-232.2-46.6-316.8-131.2s-131.2-197.2-131.2-316.8 46.6-232.2 131.2-316.8c84.6-84.6 197.2-131.2 316.8-131.2s232.2 46.6 316.8 131.2c69.4 69.4 113.2 157.4 126.6 252.8h-130c-29.8-145.8-159-256-313.6-256-176.4 0-320 143.6-320 320s143.8 320 320.2 320c72 0 138.4-23.8 192-64l-176-176h432z" />
<glyph unicode="&#xe1030;" glyph-name="icon-save" d="M192.2 384c-0.2 0-0.2 0 0 0l-0.2-448h640v447.8c0 0 0 0-0.2 0.2h-639.6zM978.8 749.2l-165.4 165.4c-25 25-74.2 45.4-109.4 45.4h-576c-70.4 0-128-57.6-128-128v-768c0-70.4 57.6-128 128-128v448c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64v-448c70.4 0 128 57.6 128 128v576c0 35.2-20.4 84.4-45.2 109.2zM704 704c0-35.2-28.8-64-64-64h-448c-35.2 0-64 28.8-64 64v192h320v-192h128v192h128v-192z" />
<glyph unicode="&#xe1031;" glyph-name="icon-sine" d="M1022.294 448c-1.746 7.196-3.476 14.452-5.186 21.786-20.036 85.992-53.302 208.976-98 306.538-22.42 48.938-45.298 86.556-69.946 115.006-48.454 55.93-98.176 67.67-131.356 67.67s-82.902-11.74-131.356-67.672c-24.648-28.45-47.528-66.068-69.948-115.006-44.696-97.558-77.962-220.544-98-306.538-21.646-92.898-46.444-175.138-71.71-237.836-16.308-40.46-30.222-66.358-40.6-82.604-10.378 16.246-24.292 42.142-40.6 82.604-23.272 57.75-46.144 132.088-66.524 216.052h-197.362c1.746-7.196 3.476-14.452 5.186-21.786 20.036-85.992 53.302-208.976 98-306.538 22.42-48.938 45.298-86.556 69.946-115.006 48.454-55.932 98.176-67.672 131.356-67.672s82.902 11.74 131.356 67.672c24.648 28.45 47.528 66.068 69.948 115.006 44.696 97.558 77.962 220.544 98 306.538 21.646 92.898 46.444 175.138 71.71 237.836 16.308 40.46 30.222 66.358 40.6 82.604 10.378-16.246 24.292-42.142 40.6-82.604 23.274-57.748 46.146-132.086 66.526-216.050h197.36z" />
<glyph unicode="&#xe1032;" glyph-name="icon-T" d="M0 960v-256h128v64h256v-704h-192v-128h640v128h-192v704h256v-64h128v256z" />
<glyph unicode="&#xe1033;" glyph-name="icon-thumbs-strip" d="M448 578c0-35.2-28.8-64-64-64h-320c-35.2 0-64 28.8-64 64v320c0 35.2 28.8 64 64 64h320c35.2 0 64-28.8 64-64v-320zM1024 578c0-35.2-28.8-64-64-64h-320c-35.2 0-64 28.8-64 64v320c0 35.2 28.8 64 64 64h320c35.2 0 64-28.8 64-64v-320zM448 2c0-35.2-28.8-64-64-64h-320c-35.2 0-64 28.8-64 64v320c0 35.2 28.8 64 64 64h320c35.2 0 64-28.8 64-64v-320zM1024 2c0-35.2-28.8-64-64-64h-320c-35.2 0-64 28.8-64 64v320c0 35.2 28.8 64 64 64h320c35.2 0 64-28.8 64-64v-320z" />
<glyph unicode="&#xe1034;" glyph-name="icon-two-parts-both" d="M896 960h-768c-70.4 0-128-57.6-128-128v-768c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v768c0 70.4-57.6 128-128 128zM128 832h320v-768h-320v768zM896 64h-320v768h320v-768z" />
<glyph unicode="&#xe1035;" glyph-name="icon-two-parts-one-only" d="M896 960h-768c-70.4 0-128-57.6-128-128v-768c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v768c0 70.4-57.6 128-128 128zM896 64h-320v768h320v-768z" />
<glyph unicode="&#xe1036;" glyph-name="icon-x-in-circle" d="M512 960c-282.8 0-512-229.2-512-512s229.2-512 512-512 512 229.2 512 512-229.2 512-512 512zM832 256l-128-128-192 192-192-192-128 128 192 192-192 192 128 128 192-192 192 192 128-128-192-192 192-192z" />
<glyph unicode="&#xe1036;" glyph-name="icon-resync" d="M795.2 795.2c-79.8 65.2-178.8 100.8-283.2 100.8-119.6 0-232.2-46.6-316.8-131.2-69.4-69.4-113.2-157.4-126.6-252.8h130c29.6 145.8 158.8 256 313.4 256 72 0 138.4-23.8 192-64l-176-176h432v432l-164.8-164.8zM512 128c-72 0-138.4 23.8-192 64l176 176h-432v-432l164.8 164.8c79.8-65.2 178.8-100.8 283.2-100.8 119.6 0 232.2 46.6 316.8 131.2 69.4 69.4 113.2 157.4 126.6 252.8h-130c-29.6-145.8-158.8-256-313.4-256z" />
<glyph unicode="&#xe1037;" glyph-name="icon-reset" d="M460.8 499.2l-187.8 187.8c57.2 42.8 128 68.2 204.8 68.2 188.2 0 341.6-153.2 341.6-341.4s-153.2-341.2-341.4-341.2c-165 0-302.8 117.6-334.6 273h-138.4c14.2-101.8 61-195.6 135-269.6 90.2-90.2 210.4-140 338-140s247.6 49.8 338 140 140 210.4 140 338-49.8 247.6-140 338-210.4 140-338 140c-111.4 0-217-38-302-107.6l-176 175.6v-460.8h460.8z" />
<glyph unicode="&#xe1038;" glyph-name="icon-x-in-circle" d="M512 960c-282.8 0-512-229.2-512-512s229.2-512 512-512 512 229.2 512 512-229.2 512-512 512zM832 256l-128-128-192 192-192-192-128 128 192 192-192 192 128 128 192-192 192 192 128-128-192-192 192-192z" />
<glyph unicode="&#xe1039;" glyph-name="icon-brightness" d="M253.414 641.939l-155.172 116.384c-50.233-66.209-85.127-146.713-97.91-234.39l191.586-30.216c8.145 56.552 29.998 106.879 62.068 149.006zM191.98 402.283l-191.919-27.434c13.115-90.459 48.009-170.963 99.174-238.453l154.18 117.665c-31.476 41.347-53.309 91.675-61.231 146.504zM466.283 768.020l-27.434 191.919c-90.459-13.115-170.963-48.009-238.453-99.174l117.665-154.18c41.347 31.476 91.675 53.309 146.504 61.231zM822.323 861.758c-66.209 50.233-146.713 85.127-234.39 97.91l-30.216-191.586c56.552-8.145 106.879-29.998 149.006-62.068zM832.020 493.717l191.919 27.434c-13.115 90.459-48.009 170.963-99.174 238.453l-154.18-117.665c31.476-41.347 53.309-91.675 61.231-146.504zM201.677 34.242c66.209-50.233 146.713-85.127 234.39-97.91l30.216 191.586c-56.552 8.145-106.879 29.998-149.006 62.068zM770.586 254.061l155.131-116.343c50.233 66.209 85.127 146.713 97.91 234.39l-191.586 30.216c-8.125-56.564-29.966-106.906-62.028-149.049zM557.717 127.98l27.434-191.919c90.459 13.115 170.963 48.009 238.453 99.174l-117.665 154.18c-41.347-31.476-91.675-53.309-146.504-61.231zM770.586 448c0-142.813-115.773-258.586-258.586-258.586s-258.586 115.773-258.586 258.586c0 142.813 115.773 258.586 258.586 258.586s258.586-115.773 258.586-258.586z" />
<glyph unicode="&#xe1040;" glyph-name="icon-contrast" d="M512 960c-282.78 0-512-229.24-512-512s229.22-512 512-512 512 229.24 512 512-229.22 512-512 512zM783.52 176.48c-69.111-69.481-164.785-112.481-270.502-112.481-0.358 0-0.716 0-1.074 0.001l0.055 768c212.070-0.010 383.982-171.929 383.982-384 0-106.034-42.977-202.031-112.462-271.52z" />
<glyph unicode="&#xe1100;" glyph-name="icon-activity" d="M576 896h-256l320-320h-290.256c-44.264 76.516-126.99 128-221.744 128h-128v-512h128c94.754 0 177.48 51.484 221.744 128h290.256l-320-320h256l448 448-448 448z" />
<glyph unicode="&#xe1101;" glyph-name="icon-activity-mode" d="M512 960c-214.866 0-398.786-132.372-474.744-320h90.744c56.86 0 107.938-24.724 143.094-64h240.906l-192 192h256l320-320-320-320h-256l192 192h-240.906c-35.156-39.276-86.234-64-143.094-64h-90.744c75.958-187.628 259.878-320 474.744-320 282.77 0 512 229.23 512 512s-229.23 512-512 512z" />
<glyph unicode="&#xe1102;" glyph-name="icon-autoflow-tabular" d="M192 960c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h64v1024h-64zM384 960h256v-1024h-256v1024zM832 960h-64v-704h256v512c0 105.6-86.4 192-192 192z" />

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,91 @@
@include keyframes(rotation) {
100% { @include transform(rotate(360deg)); }
}
@include keyframes(rotation-centered) {
0% { @include transform(translate(-50%, -50%) rotate(0deg)); }
100% { @include transform(translate(-50%, -50%) rotate(360deg)); }
}
@include keyframes(clock-hands) {
0% { @include transform(translate(-50%, -50%) rotate(0deg)); }
100% { @include transform(translate(-50%, -50%) rotate(360deg)); }
}
@include keyframes(clock-hands-sticky) {
0% {
@include transform(translate(-50%, -50%) rotate(0deg));
}
7% {
@include transform(translate(-50%, -50%) rotate(0deg));
}
8% {
@include transform(translate(-50%, -50%) rotate(30deg));
}
15% {
@include transform(translate(-50%, -50%) rotate(30deg));
}
16% {
@include transform(translate(-50%, -50%) rotate(60deg));
}
24% {
@include transform(translate(-50%, -50%) rotate(60deg));
}
25% {
@include transform(translate(-50%, -50%) rotate(90deg));
}
32% {
@include transform(translate(-50%, -50%) rotate(90deg));
}
33% {
@include transform(translate(-50%, -50%) rotate(120deg));
}
40% {
@include transform(translate(-50%, -50%) rotate(120deg));
}
41% {
@include transform(translate(-50%, -50%) rotate(150deg));
}
49% {
@include transform(translate(-50%, -50%) rotate(150deg));
}
50% {
@include transform(translate(-50%, -50%) rotate(180deg));
}
57% {
@include transform(translate(-50%, -50%) rotate(180deg));
}
58% {
@include transform(translate(-50%, -50%) rotate(210deg));
}
65% {
@include transform(translate(-50%, -50%) rotate(210deg));
}
66% {
@include transform(translate(-50%, -50%) rotate(240deg));
}
74% {
@include transform(translate(-50%, -50%) rotate(240deg));
}
75% {
@include transform(translate(-50%, -50%) rotate(270deg));
}
82% {
@include transform(translate(-50%, -50%) rotate(270deg));
}
83% {
@include transform(translate(-50%, -50%) rotate(300deg));
}
90% {
@include transform(translate(-50%, -50%) rotate(300deg));
}
91% {
@include transform(translate(-50%, -50%) rotate(330deg));
}
99% {
@include transform(translate(-50%, -50%) rotate(330deg));
}
100% {
@include transform(translate(-50%, -50%) rotate(360deg));
}
}

View File

@@ -108,6 +108,9 @@
&.grows {
@include flex(1 1 auto);
}
&.contents-align-right {
text-align: right;
}
}
.flex-container {
// Apply to wrapping elements, mct-includes, etc.

View File

@@ -49,7 +49,6 @@ $uePaneMiniTabFontSize: 8px;
$uePaneMiniTabCollapsedW: 18px;
$ueEditLeftPaneW: 75%;
$treeSearchInputBarH: 25px;
$ueTimeControlH: (33px, 18px, 20px);
/*************** Panes */
$ueBrowseLeftPaneTreeMinW: 150px;
$ueBrowseLeftPaneTreeMaxW: 35%;
@@ -79,7 +78,7 @@ $treeContextTriggerW: 20px;
/*************** Tabular */
$tabularHeaderH: 22px;
$tabularTdPadLR: $itemPadLR;
$tabularTdPadTB: 3px;
$tabularTdPadTB: 2px;
/*************** Imagery */
$imageMainControlBarH: 25px;
$imageThumbsD: 120px;
@@ -100,7 +99,7 @@ $plotXBarH: 32px;
$plotLegendH: 20px;
$plotSwatchD: 8px;
// 1: Top, 2: right, 3: bottom, 4: left
$plotDisplayArea: ($plotLegendH + $interiorMargin, 0, $plotXBarH + $interiorMargin, $plotYBarW);
$plotDisplayArea: ($plotLegendH + $interiorMargin, 0, $plotXBarH, $plotYBarW);
/* min plot height is based on user testing to find minimum useful height */
$plotMinH: 95px;
/*************** Bubbles */
@@ -112,6 +111,7 @@ $bubbleMaxW: 300px;
$reqSymbolW: 15px;
$reqSymbolM: $interiorMargin * 2;
$reqSymbolFontSize: 0.75em;
$inputTextP: 3px 5px;
/*************** Wait Spinner Defaults */
$waitSpinnerD: 32px;
$waitSpinnerTreeD: 20px;

View File

@@ -4,4 +4,3 @@
@include s-stale();
}
}

View File

@@ -39,20 +39,20 @@
@include pulse($animName: pulse-subtle, $dur: 500ms, $opacity0: 0.7);
}
@mixin animTo($animName, $propName, $propValStart, $propValEnd, $dur: 500ms, $delay: 0) {
@mixin animTo($animName, $propName, $propValStart, $propValEnd, $dur: 500ms, $delay: 0, $dir: normal, $count: 1) {
@include keyframes($animName) {
from { #{propName}: $propValStart; }
to { #{$propName}: $propValEnd; }
}
@include animToParams($animName, $dur: 500ms, $delay: 0)
@include animToParams($animName, $dur: $dur, $delay: $delay, $dir: $dir, $count: $count)
}
@mixin animToParams($animName, $dur: 500ms, $delay: 0) {
@mixin animToParams($animName, $dur: 500ms, $delay: 0, $dir: normal, $count: 1) {
@include animation-name($animName);
@include animation-duration($dur);
@include animation-delay($delay);
@include animation-fill-mode(both);
@include animation-direction(normal);
@include animation-iteration-count(1);
@include animation-direction($dir);
@include animation-iteration-count($count);
@include animation-timing-function(ease-in-out);
}

View File

@@ -21,18 +21,18 @@
*****************************************************************************/
/************************** FONTS */
@font-face {
/*
/*
* Use https://icomoon.io/app with icomoon-project-openmct-symbols-16px.json
* to generate font files
*/
font-family: 'symbolsfont';
src: url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.eot');
src: url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.eot?#iefix') format('embedded-opentype'),
url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.woff') format('woff'),
url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.ttf') format('truetype'),
url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.svg') format('svg');
font-weight: normal;
font-style: normal;
font-family: 'symbolsfont';
src: url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.eot');
src: url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.eot?#iefix') format('embedded-opentype'),
url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.woff') format('woff'),
url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.ttf') format('truetype'),
url($dirCommonRes + 'fonts/symbols/openmct-symbols-16px.svg') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
@@ -52,53 +52,53 @@
/************************** HTML ENTITIES */
a {
color: $colorA;
cursor: pointer;
text-decoration: none;
&:hover {
color: $colorAHov;
}
color: $colorA;
cursor: pointer;
text-decoration: none;
&:hover {
color: $colorAHov;
}
}
body, html {
-webkit-font-smoothing: subpixel-antialiased;
background-color: $colorBodyBg;
color: $colorBodyFg;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 100%;
font-weight: 200;
height: 100%;
width: 100%;
-webkit-font-smoothing: subpixel-antialiased;
background-color: $colorBodyBg;
color: $colorBodyFg;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 100%;
font-weight: 200;
height: 100%;
width: 100%;
}
em {
font-style: normal;
font-style: normal;
}
input, textarea {
font-family: Helvetica, Arial, sans-serif;
font-family: Helvetica, Arial, sans-serif;
}
input[type="text"],
input[type="search"] {
vertical-align: baseline;
padding: 3px 5px;
vertical-align: baseline;
padding: $inputTextP;
}
h1, h2, h3 {
margin: 0;
margin: 0;
}
h1 {
font-size: 1.7em;
font-weight: normal !important;
line-height: 120%;
margin-bottom: 20px;
margin-top: 0;
font-size: 1.7em;
font-weight: normal !important;
line-height: 120%;
margin-bottom: 20px;
margin-top: 0;
}
p {
margin-bottom: $interiorMarginLg;
margin-bottom: $interiorMarginLg;
}
ol, ul {
@@ -108,30 +108,30 @@ ol, ul {
}
mct-container {
display: block;
display: block;
}
.abs {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
height: auto;
width: auto;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
height: auto;
width: auto;
}
.code {
font-family: "Lucida Console", monospace;
font-size: 0.7em;
line-height: 150%;
white-space: pre;
font-family: "Lucida Console", monospace;
font-size: 0.7em;
line-height: 150%;
white-space: pre;
}
.codehilite {
@extend .code;
background-color: rgba($colorBodyFg, 0.1);
padding: 1em;
@extend .code;
background-color: rgba($colorBodyFg, 0.1);
padding: 1em;
}
.disabled,
@@ -141,12 +141,41 @@ a.disabled {
cursor: default !important;
}
.s-status-missing {
// Labels. Expects .s-status-missing to be applied to mct-representation that contains
// .t-object-label
.t-object-label .t-item-icon:before {
content: $glyph-icon-object-unknown;
}
// Item, grid item. Expects .s-status-missing to be applied to mct-representation that contains .item.grid-item
.item .t-item-icon-glyph:before {
content: $glyph-icon-object-unknown;
}
// Object header. Expects .s-status-missing to be applied to mct-representation.object-header
&.object-header {
.type-icon:before {
content: $glyph-icon-object-unknown;
}
}
// Tree item. Expects .s-status-missing to be applied to .tree-item,
// and mct-representation.search-item
&.tree-item,
&.search-item {
> .rep-object-label .t-item-icon:before {
content: $glyph-icon-object-unknown;
}
}
}
.align-right {
text-align: right;
text-align: right;
}
.centered {
text-align: center;
text-align: center;
}
.ellipsis {
@@ -155,24 +184,42 @@ a.disabled {
.scrolling,
.scroll {
overflow: auto;
overflow: auto;
}
.vscroll {
overflow-y: auto;
overflow-y: auto;
}
.slidable {
cursor: move; // Fallback
cursor: grab;
cursor: -moz-grab;
cursor: -webkit-grab;
&.horz {
cursor: col-resize;
}
&.vert {
cursor: row-resize;
}
}
.no-margin {
margin: 0;
margin: 0;
}
.ds {
box-shadow: rgba(#000, 0.7) 0 4px 10px 2px;
box-shadow: rgba(#000, 0.7) 0 4px 10px 2px;
}
.hide,
.hidden {
display: none !important;
display: none !important;
}
.hide-nice {
opacity: 0;
pointer-events: none;
}
.off {
@@ -186,7 +233,7 @@ a.disabled {
}
.sep {
color: rgba(#fff, 0.2);
color: rgba(#fff, 0.2);
}
.test-stripes {

View File

@@ -40,7 +40,6 @@ $glyph-icon-brackets: '\e929';
$glyph-icon-arrows-out: '\e1000';
$glyph-icon-arrows-right-left: '\e1001';
$glyph-icon-arrows-up-down: '\e1002';
$glyph-icon-box-with-dashed-lines: '';
$glyph-icon-bullet: '\e1004';
$glyph-icon-calendar: '\e1005';
$glyph-icon-chain-links: '\e1006';
@@ -73,7 +72,11 @@ $glyph-icon-T: '\e1032';
$glyph-icon-thumbs-strip: '\e1033';
$glyph-icon-two-parts-both: '\e1034';
$glyph-icon-two-parts-one-only: '\e1035';
$glyph-icon-x-in-circle: '\e1036';
$glyph-icon-resync: '\e1036';
$glyph-icon-x-in-circle: '\e1038';
$glyph-icon-brightness: '\e1039';
$glyph-icon-contrast: '\e1040';
$glyph-icon-reset: '\e1037';
$glyph-icon-activity: '\e1100';
$glyph-icon-activity-mode: '\e1101';
$glyph-icon-autoflow-tabular: '\e1102';
@@ -173,6 +176,10 @@ $glyph-icon-box-with-dashed-lines: '\e1129';
.icon-two-parts-both { @include glyph($glyph-icon-two-parts-both); }
.icon-two-parts-one-only { @include glyph($glyph-icon-two-parts-one-only); }
.icon-x-in-circle { @include glyph($glyph-icon-x-in-circle); }
.icon-brightness { @include glyph($glyph-icon-brightness); }
.icon-contrast { @include glyph($glyph-icon-contrast); }
.icon-reset { @include glyph($glyph-icon-reset); }
.icon-resync { @include glyph($glyph-icon-resync); }
.icon-activity { @include glyph($glyph-icon-activity); }
.icon-activity-mode { @include glyph($glyph-icon-activity-mode); }
.icon-autoflow-tabular { @include glyph($glyph-icon-autoflow-tabular); }
@@ -209,4 +216,4 @@ $glyph-icon-box-with-dashed-lines: '\e1129';
.icon-eye-open-12px { @include glyph($glyph-icon-eye-open,'symbolsfont-12px'); }
.icon-collapse-pane-left-12px { @include glyph($glyph-icon-collapse-pane-left,'symbolsfont-12px'); }
.icon-collapse-pane-right-12px { @include glyph($glyph-icon-collapse-pane-right,'symbolsfont-12px'); }
.icon-folder-12px { @include glyph($glyph-icon-folder,'symbolsfont-12px'); }
.icon-folder-12px { @include glyph($glyph-icon-folder,'symbolsfont-12px'); }

View File

@@ -30,6 +30,7 @@
.ui-symbol {
font-family: 'symbolsfont';
-webkit-font-smoothing: antialiased;
}
.ui-symbol.icon {
@@ -70,10 +71,21 @@
line-height: inherit;
position: relative;
&.l-icon-link {
.t-item-icon-glyph {
&:after {
color: $colorIconLink;
content: $glyph-icon-link;
height: auto; width: auto;
position: absolute;
left: 0; top: 0; right: 0; bottom: 20%;
@include transform-origin(bottom left);
@include transform(scale(0.3));
z-index: 2;
}
/* .t-item-icon-glyph {
&:after {
color: $colorIconLink;
content: $glyph-icon-link;
content: '\e921'; //$glyph-icon-link;
height: auto; width: auto;
position: absolute;
left: 0; top: 0; right: 0; bottom: 20%;
@@ -81,6 +93,6 @@
@include transform(scale(0.3));
z-index: 2;
}
}
}*/
}
}

View File

@@ -20,8 +20,9 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
@import "effects";
@import "global";
@import "glyphs";
@import "animations";
@import "global";
@import "archetypes";
@import "about";
@import "text";
@@ -41,7 +42,6 @@
@import "controls/lists";
@import "controls/menus";
@import "controls/messages";
@import "controls/time-controller";
@import "mobile/controls/menus";
/********************************* FORMS */

View File

@@ -185,21 +185,15 @@
}
@mixin sliderTrack($bg: $scrollbarTrackColorBg) {
//$b: 1px solid lighten($bg, 30%);
border-radius: 2px;
box-sizing: border-box;
@include boxIncised(0.7);
background-color: $bg;
//border-bottom: $b;
//border-right: $b;
}
@mixin controlGrippy($b, $direction: horizontal, $w: 1px, $style: dotted) {
//&:before {
//@include trans-prop-nice("border-color", 25ms);
content: '';
display: block;
//height: auto;
pointer-events: none;
position: absolute;
z-index: 2;
@@ -274,16 +268,6 @@
text-shadow: rgba(black, $sVal) 0 3px 7px;
}
@function pullForward($c, $p: 20%) {
// For dark interfaces, lighter things come forward
@return lighten($c, $p);
}
@function pushBack($c, $p: 20%) {
// For dark interfaces, darker things move back
@return darken($c, $p);
}
@function percentToDecimal($p) {
@return $p / 100%;
}
@@ -304,7 +288,6 @@
border-radius: $controlCr;
box-sizing: border-box;
color: $fg;
//display: inline-block;
}
@mixin btnBase($bg: $colorBtnBg, $bgHov: $colorBtnBgHov, $fg: $colorBtnFg, $fgHov: $colorBtnFgHov, $ic: $colorBtnIcon, $icHov: $colorBtnIconHov) {
@@ -380,14 +363,13 @@
}
}
@mixin webkitProp($name, $val) {
#{$name}: #{$val};
-webkit-#{$name}: #{$val};
}
@mixin webkitVal($name, $val) {
#{$name}: #{$val};
#{$name}: -webkit-#{$val};
@mixin cursorGrab() {
cursor: grab;
cursor: -webkit-grab;
&:active {
cursor: grabbing;
cursor: -webkit-grabbing;
}
}
@mixin verticalCenter {
@@ -409,6 +391,14 @@
white-space: nowrap;
}
@mixin reverseEllipsis() {
direction: rtl;
unicode-bidi:bidi-override;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
@mixin scrollH($showBar: auto) {
overflow-x: $showBar;
overflow-y: hidden;

View File

@@ -104,9 +104,17 @@ body.desktop .mini-tab-icon {
}
}
@mixin btnSetButtonFirst() {
@include border-left-radius($controlCr);
margin-left: 0;
}
@mixin btnSetButtonLast() {
@include border-right-radius($controlCr);
}
.l-btn-set {
// Buttons that have a very tight conceptual grouping - no internal space between them.
// Structure: .btn-set > mct-representation class=first|last > .s-button
font-size: 0; // Remove space between s-button elements due to white space in markup
.s-button {
@@ -114,20 +122,16 @@ body.desktop .mini-tab-icon {
margin-left: 1px;
}
.first {
.s-button,
&.s-button {
@include border-left-radius($controlCr);
margin-left: 0;
}
> .s-button {
// Styles for .s-button as immediate descendants in .l-btn-set
&:first-child { @include btnSetButtonFirst(); }
&:last-child { @include btnSetButtonLast(); }
}
.last {
.s-button,
&.s-button {
@include border-right-radius($controlCr);
}
}
// Must use following due to DOM structure of action buttons,
// which have structure like .l-btn-set > mct-representation class=first|last > .s-button
.first > .s-button { @include btnSetButtonFirst(); }
.last > .s-button { @include btnSetButtonLast(); }
}
.paused {

View File

@@ -122,13 +122,21 @@
// Default position is upper right
$p: $interiorMargin;
position: absolute;
top: $p;
right: $p;
top: $p; right: $p; bottom: auto;
text-align: right;
z-index: 5;
}
.s-local-controls {
@include trans-prop-nice(opacity);
font-size: 0.7rem;
&.s-wrapper-transluc {
// Semi-opaque wrapper to visually distinguish a control
// from the background
background: rgba($colorTransLucBg, 0.7);
box-sizing: border-box;
border-radius: $controlCr;
}
}
/******************************************************** CUSTOM CHECKBOXES */
@@ -296,8 +304,6 @@ input[type="search"] {
.title-label {
color: $colorObjHdrTxt;
@include ellipsize();
@include webkitProp(flex, '0 1 auto');
padding-right: 0.35em; // For context arrow. Done with em's so pad is relative to the scale of the text.
}
.context-available-w {
@@ -308,6 +314,10 @@ input[type="search"] {
font-size: 0.7em;
@include flex(0 0 1);
}
.t-object-alert {
display: none;
}
}
/******************************************************** PROGRESS BAR */
@@ -441,6 +451,63 @@ input[type="search"] {
}
}
@mixin sliderKnob() {
$h: 16px;
cursor: pointer;
width: floor($h/1.75);
height: $h;
margin-top: 1 + floor($h/2) * -1;
@include btnSubtle(pullForward($colorBtnBg, 10%));
//border-radius: 50% !important;
}
@mixin sliderKnobRound() {
$h: 12px;
cursor: pointer;
width: $h;
height: $h;
margin-top: 1 + floor($h/2) * -1;
@include btnSubtle(pullForward($colorBtnBg, 20%));
border-radius: 50% !important;
}
input[type="range"] {
// HTML5 range inputs
-webkit-appearance: none; /* Hides the slider so that custom slider can be made */
background: transparent; /* Otherwise white in Chrome */
&:focus {
outline: none; /* Removes the blue border. */
}
// Thumb
&::-webkit-slider-thumb {
-webkit-appearance: none;
@include sliderKnobRound();
}
&::-moz-range-thumb {
border: none;
@include sliderKnobRound();
}
&::-ms-thumb {
border: none;
@include sliderKnobRound();
}
// Track
&::-webkit-slider-runnable-track {
width: 100%;
height: 3px;
@include sliderTrack();
}
&::-moz-range-track {
width: 100%;
height: 3px;
@include sliderTrack();
}
}
/******************************************************** DATETIME PICKER */
.l-datetime-picker {
$r1H: 15px;
@@ -594,3 +661,4 @@ body.desktop {
background: $scrollbarTrackColorBg;
}
}

View File

@@ -178,7 +178,7 @@
}
.pane {
box-sizing: border-box;
&.left {
&.menu-items {
border-right: 1px solid pullForward($colorMenuBg, 10%);
left: 0;
padding-right: $interiorMargin;
@@ -194,38 +194,53 @@
}
}
}
&.right {
&.menu-item-description {
left: auto;
right: 0;
padding: $interiorMargin * 5;
width: $prw;
.desc-area {
&.icon {
color: $colorCreateMenuLgIcon;
font-size: 8em;
margin-bottom: $interiorMargin * 3;
position: relative;
text-align: center;
}
&.title {
color: $colorCreateMenuText;
font-size: 1.2em;
margin-bottom: $interiorMargin * 2;
}
&.description {
color: pushBack($colorCreateMenuText, 20%);
font-size: 0.8em;
line-height: 1.5em;
}
}
}
}
.menu-item-description {
.desc-area {
&.icon {
$h: 150px;
color: $colorCreateMenuLgIcon;
position: relative;
font-size: 8em;
left: 0;
height: $h;
line-height: $h;
margin-bottom: $interiorMargin * 5;
text-align: center;
}
&.title {
color: $colorCreateMenuText;
font-size: 1.2em;
margin-bottom: 0.5em;
}
&.description {
color: $colorCreateMenuText;
font-size: 0.8em;
line-height: 1.5em;
}
}
}
&.mini {
width: 400px;
height: 300px;
.pane {
&.menu-items {
font-size: 0.8em;
}
&.menu-item-description {
padding: $interiorMargin * 3;
.desc-area {
&.icon {
font-size: 4em;
}
&.title {
font-size: 1em;
}
}
}
}
}
}
.context-menu {
font-size: 0.80rem;
@@ -258,7 +273,12 @@
.btn-bar.right .menu,
.menus-to-left .menu {
z-index: 79;
left: auto;
right: 0;
width: auto;
}
.menus-up .menu {
bottom: $btnStdH; top: auto;
}

View File

@@ -345,3 +345,29 @@ body.desktop .t-message-single {
body.desktop .t-message-list {
.message-contents .l-message { margin-right: $interiorMarginLg; }
}
// Alert elements in views
.s-unsynced {
$c: $colorPausedBg;
border: 1px solid $c;
@include animTo($animName: pulsePaused, $propName: border-color, $propValStart: rgba($c, 0.8), $propValEnd: rgba($c, 0.5), $dur: $animPausedPulseDur, $dir: alternate, $count: infinite);
}
.s-status-timeconductor-unsynced {
// Plot areas
.gl-plot .gl-plot-display-area {
@extend .s-unsynced;
}
// Object headers
.object-header {
.t-object-alert {
display: inline;
&.t-alert-unsynced {
@extend .icon-alert-triangle;
color: $colorPausedBg;
}
}
}
}

View File

@@ -1,266 +0,0 @@
@mixin toiLineHovEffects() {
&:before,
&:after {
background-color: $timeControllerToiLineColorHov;
}
}
.l-time-controller {
$minW: 500px;
$knobHOffset: 0px;
$knobM: ($sliderKnobW + $knobHOffset) * -1;
$rangeValPad: $interiorMargin;
$rangeValOffset: $sliderKnobW + $interiorMargin;
$timeRangeSliderLROffset: 150px + ($sliderKnobW * 2);
$r1H: nth($ueTimeControlH,1); // Not currently used
$r2H: nth($ueTimeControlH,2);
$r3H: nth($ueTimeControlH,3);
min-width: $minW;
font-size: 0.8rem;
.l-time-range-inputs-holder,
.l-time-range-slider-holder,
.l-time-range-ticks-holder
{
box-sizing: border-box;
position: relative;
&:not(:first-child) {
margin-top: $interiorMargin;
}
}
.l-time-range-slider,
.l-time-range-ticks {
@include absPosDefault(0, visible);
left: $timeRangeSliderLROffset; right: $timeRangeSliderLROffset;
}
.l-time-range-inputs-holder {
border-top: 1px solid $colorInteriorBorder;
padding-top: $interiorMargin;
&.l-flex-row,
.l-flex-row {
@include align-items(center);
.flex-elem {
height: auto;
line-height: normal;
}
}
.type-icon {
font-size: 120%;
vertical-align: middle;
}
.l-time-range-input-w,
.l-time-range-inputs-elem {
margin-right: $interiorMargin;
.lbl {
color: $colorPlotLabelFg;
}
.ui-symbol.icon {
font-size: 11px;
}
}
.l-time-range-input-w {
// Wraps a datetime text input field
position: relative;
input[type="text"] {
width: 200px;
&.picker-icon {
padding-right: 20px;
}
}
.icon-calendar {
position: absolute;
right: 5px;
top: 5px;
}
}
}
.l-time-range-slider-holder {
height: $r2H;
.range-holder {
box-shadow: none;
background: none;
border: none;
.range {
.toi-line {
$myC: $timeControllerToiLineColor;
$myW: 8px;
@include transform(translateX(50%));
position: absolute;
top: 0; right: 0; bottom: 0px; left: auto;
width: $myW;
height: auto;
z-index: 2;
&:before {
// Vert line
background-color: $myC;
position: absolute;
content: "";
top: 0; right: auto; bottom: -10px; left: floor($myW/2) - 1;
width: 1px;
}
}
&:hover .toi-line {
@include toiLineHovEffects;
}
}
}
&:not(:active) {
.knob,
.range {
@include transition-property(left, right);
@include transition-duration(500ms);
@include transition-timing-function(ease-in-out);
}
}
}
.l-time-range-ticks-holder {
height: $r3H;
.l-time-range-ticks {
border-top: 1px solid $colorTick;
.tick {
background-color: $colorTick;
border:none;
height: 5px;
width: 1px;
margin-left: -1px;
position: absolute;
&:first-child {
margin-left: 0;
}
.l-time-range-tick-label {
@include webkitProp(transform, translateX(-50%));
color: $colorPlotLabelFg;
display: inline-block;
font-size: 0.7rem;
position: absolute;
top: 5px;
white-space: nowrap;
z-index: 2;
}
}
}
}
.knob {
z-index: 2;
&:before {
$mTB: 2px;
$grippyW: 3px;
$mLR: ($sliderKnobW - $grippyW)/2;
@include bgStripes($c: pullForward($sliderColorKnob, 20%), $a: 1, $bgsize: 4px, $angle: 0deg);
content: '';
display: block;
position: absolute;
top: $mTB; right: $mLR; bottom: $mTB; left: $mLR;
}
.range-value {
@include trans-prop-nice-fade(.25s);
font-size: 0.7rem;
position: absolute;
height: $r2H;
line-height: $r2H;
white-space: nowrap;
z-index: 1;
}
&:hover {
.range-value {
color: $sliderColorKnobHov;
}
}
&.knob-l {
margin-left: $knobM;
.range-value {
text-align: right;
right: $rangeValOffset;
}
}
&.knob-r {
margin-right: $knobM;
.range-value {
left: $rangeValOffset;
}
&:hover + .range-holder .range .toi-line {
@include toiLineHovEffects;
}
}
}
.l-time-domain-selector {
position: absolute;
right: 0px;
top: $interiorMargin;
}
}
.s-time-range-val {
border-radius: $controlCr;
background-color: $colorInputBg;
padding: 1px 1px 0 $interiorMargin;
}
/******************************************************************** MOBILE */
@include phoneandtablet {
.l-time-controller {
min-width: 0;
.l-time-range-slider-holder,
.l-time-range-ticks-holder {
display: none;
}
}
}
@include phone {
.l-time-controller {
.l-time-range-inputs-holder {
&.l-flex-row,
.l-flex-row {
@include align-items(flex-start);
}
.l-time-range-inputs-elem {
&.type-icon {
margin-top: 3px;
}
}
.t-inputs-w {
@include flex-direction(column);
.l-time-range-input-w:not(:first-child) {
&:not(:first-child) {
margin-top: $interiorMargin;
}
margin-right: 0;
}
.l-time-range-inputs-elem {
&.lbl { display: none; }
}
}
}
}
}
@include phonePortrait {
.l-time-controller {
.l-time-range-inputs-holder {
.t-inputs-w {
@include flex(1 1 auto);
padding-top: 25px; // Make room for the ever lovin' Time Domain Selector
.flex-elem {
@include flex(1 1 auto);
width: 100%;
}
input[type="text"] {
width: 100%;
}
}
}
}
.l-time-domain-selector {
right: auto;
left: 20px;
}
}

View File

@@ -1,5 +1,6 @@
.l-image-main-wrapper,
.l-image-thumbs-wrapper {
.l-image-thumbs-wrapper,
.image-main {
@include absPosDefault(0, false);
}
@@ -32,7 +33,7 @@
/*************************************** MAIN IMAGE */
.l-image-main,
.image-main,
.l-image-thumb-item .l-thumb {
background-size: contain;
background-position: center;
@@ -74,7 +75,7 @@
.s-image-main {
border: 1px solid transparent;
&.paused {
border-color: $colorPausedBg;
@extend .s-unsynced;
}
}
@@ -134,6 +135,54 @@
}
}
/*************************************** LOCAL CONTROLS */
.l-local-controls {
max-width: 200px;
width: 35%;
input[type="range"] {
display: block;
width: 100%;
&:not(:first-child) {
margin-top: $interiorMarginLg;
}
&:before {
margin-right: $interiorMarginSm;
}
}
.t-reset-btn-holder {
$bc: $scrollbarTrackColorBg;
&:before,
&:after {
border-right: 1px solid $bc;
content:'';
display: block;
width: 5px;
height: 4px;
}
&:before {
border-top: 1px solid $bc;
margin-bottom: 2px;
}
&:after {
border-bottom: 1px solid $bc;
margin-top: 2px;
}
}
&.s-wrapper-transluc {
left: auto;
padding: $interiorMargin $interiorMarginLg;
}
&.l-flex-row {
align-items: center;
}
}
/*************************************** WHEN IN FRAME */
.frame .t-imagery {
.l-image-main-wrapper {

View File

@@ -19,15 +19,6 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
@include keyframes(rotation) {
100% { @include transform(rotate(360deg)); }
}
@include keyframes(rotation-centered) {
0% { @include transform(translate(-50%, -50%) rotate(0deg)); }
100% { @include transform(translate(-50%, -50%) rotate(360deg)); }
}
@mixin spinner($b: 5px, $c: $colorKey) {
@include transform-origin(center);
@include animation-name(rotation-centered);

View File

@@ -51,13 +51,9 @@ table {
tbody, .tbody {
display: table-row-group;
tr, .tr {
&:hover {
background: rgba($colorTabBodyFg, 0.1);
}
}
}
tr, .tr {
border-top: 1px solid $colorTabBorder;
display: table-row;
&:first-child .td {
border-top: none;
@@ -71,11 +67,12 @@ table {
}
th, .th, td, .td {
display: table-cell;
font-size: 0.7rem;
}
th, .th {
border-left: 1px solid $colorTabHeaderBorder;
color: $colorTabHeaderFg;
padding: $tabularTdPadLR $tabularTdPadLR;
padding: $tabularTdPadTB $tabularTdPadLR;
white-space: nowrap;
vertical-align: middle; // This is crucial to hiding f**king 4px height injected by browser by default
&:first-child {
@@ -99,7 +96,6 @@ table {
}
}
td, .td {
border-bottom: 1px solid $colorTabBorder;
min-width: 20px;
color: $colorTelemFresh;
padding: $tabularTdPadTB $tabularTdPadLR;

View File

@@ -46,18 +46,42 @@
}
}
.gl-plot-wrapper-display-area-and-x-axis {
// Holds the plot area and the X-axis only
position: absolute;
top: nth($plotDisplayArea, 1);
right: nth($plotDisplayArea, 2);
bottom: 0;
left: nth($plotDisplayArea, 4);
.gl-plot-display-area {
//@include test(yellow);
@if $colorPlotBg != none {
background-color: $colorPlotBg;
}
position: absolute;
top: 0;
right: 0;
bottom: nth($plotDisplayArea, 3);
left: 0;
cursor: crosshair;
border: 1px solid $colorPlotAreaBorder;
}
.gl-plot-axis-area.gl-plot-x {
//@include test(green);
top: auto;
right: 0;
bottom: 0;
left: 0;
height: $plotXBarH;
width: auto;
overflow: hidden;
}
}
.gl-plot-axis-area {
//@include test();
position: absolute;
&.gl-plot-x {
top: auto;
right: 0;
bottom: $interiorMargin;
left: $plotYBarW;
height: $plotXBarH;
width: auto;
overflow: hidden;
}
&.gl-plot-y {
top: $plotLegendH + $interiorMargin;
right: auto;
@@ -84,19 +108,6 @@
}
}
.gl-plot-display-area {
@if $colorPlotBg != none {
background-color: $colorPlotBg;
}
position: absolute;
top: nth($plotDisplayArea, 1);
right: nth($plotDisplayArea, 2);
bottom: nth($plotDisplayArea, 3);
left: nth($plotDisplayArea, 4);
cursor: crosshair;
border: 1px solid $colorPlotAreaBorder;
}
.gl-plot-label,
.l-plot-label {
color: $colorPlotLabelFg;
@@ -265,13 +276,9 @@
.gl-plot-tick,
.tick-label {
direction: rtl;
unicode-bidi:bidi-override;
@include reverseEllipsis();
font-size: 0.7rem;
position: absolute;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
&.gl-plot-x-tick-label,
&.tick-label-x {
right: auto;

View File

@@ -128,7 +128,7 @@
line-height: $ueTopBarH;
}
.primary-pane {
.t-object.primary-pane {
// Need to lift up this pane to ensure that 'collapsed' panes don't block user interactions
z-index: 4;
}
@@ -212,6 +212,8 @@ body.desktop .pane .mini-tab-icon.toggle-pane {
.holder-object {
top: $bodyMargin;
bottom: $interiorMargin;
// Clip element that have min-widths
overflow: hidden;
}
.holder-inspector {
top: $bodyMargin;

View File

@@ -23,6 +23,8 @@
<input type="text"
ng-model="textValue"
ng-blur="restoreTextValue(); ngBlur()"
ng-mouseup="ngMouseup()"
ng-disabled="ngDisabled"
ng-class="{
error: textInvalid ||
(structure.validate &&

View File

@@ -37,8 +37,10 @@ define(
* @param {object[]} stylesheets stylesheet extension definitions
* @param $document Angular's jqLite-wrapped document element
* @param {string} activeTheme the theme in use
* @param {string} [assetPath] the directory relative to which
* stylesheets will be found
*/
function StyleSheetLoader(stylesheets, $document, activeTheme) {
function StyleSheetLoader(stylesheets, $document, activeTheme, assetPath) {
var head = $document.find('head'),
document = $document[0];
@@ -47,6 +49,7 @@ define(
// Create a link element, and construct full path
var link = document.createElement('link'),
path = [
assetPath,
stylesheet.bundle.path,
stylesheet.bundle.resources,
stylesheet.stylesheetUrl
@@ -68,6 +71,8 @@ define(
stylesheet.theme === activeTheme;
}
assetPath = assetPath || ".";
// Add all stylesheets from extensions
stylesheets.filter(matchesTheme).forEach(addStyleSheet);
}

View File

@@ -69,7 +69,7 @@ define(
it("adjusts link locations", function () {
expect(mockElement.setAttribute)
.toHaveBeenCalledWith('href', "a/b/c/d.css");
.toHaveBeenCalledWith('href', "./a/b/c/d.css");
});
describe("for themed stylesheets", function () {
@@ -95,12 +95,13 @@ define(
it("includes matching themes", function () {
expect(mockElement.setAttribute)
.toHaveBeenCalledWith('href', "a/b/c/themed.css");
.toHaveBeenCalledWith('href', "./a/b/c/themed.css");
});
it("excludes mismatching themes", function () {
expect(mockElement.setAttribute)
.not.toHaveBeenCalledWith('href', "a/b/c/bad-theme.css");
.not
.toHaveBeenCalledWith('href', "./a/b/c/bad-theme.css");
});
});

View File

@@ -1,9 +1,9 @@
<!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! -->
<span ng-show="notifications.length > 0" class="status block"
<a ng-click="showNotificationsList()" ng-show="notifications.length > 0" class="status block"
ng-class="highest.severity"
ng-controller="NotificationIndicatorController">
<span class="status-indicator icon-bell"></span><span class="label">
<a ng-click="showNotificationsList()">{{notifications.length}}
Notifications</a>
{{notifications.length}} Notifications
</span><span class="count">{{notifications.length}}</span>
</span>
</a>

View File

@@ -61,7 +61,7 @@ define(
* @property {boolean} [unknownProgress] a boolean indicating that the
* progress of the underlying task is unknown. This will result in a
* visually distinct progress bar.
* @property {boolean | number} [autoDismiss] If truthy, dialog will
* @property {boolean} [autoDismiss] If truthy, dialog will
* be automatically minimized or dismissed (depending on severity).
* Additionally, if the provided value is a number, it will be used
* as the delay period before being dismissed.
@@ -109,18 +109,18 @@ define(
* @memberof platform/commonUI/notification
* @constructor
* @param $timeout the Angular $timeout service
* @param DEFAULT_AUTO_DISMISS The period of time that an
* @param defaultAutoDismissTimeout The period of time that an
* auto-dismissed message will be displayed for.
* @param MINIMIZE_TIMEOUT When notifications are minimized, a brief
* @param minimizeAnimationTimeout When notifications are minimized, a brief
* animation is shown. This animation requires some time to execute,
* so a timeout is required before the notification is hidden
*/
function NotificationService($timeout, topic, DEFAULT_AUTO_DISMISS, MINIMIZE_TIMEOUT) {
function NotificationService($timeout, topic, defaultAutoDismissTimeout, minimizeAnimationTimeout) {
this.notifications = [];
this.$timeout = $timeout;
this.highest = { severity: "info" };
this.DEFAULT_AUTO_DISMISS = DEFAULT_AUTO_DISMISS;
this.MINIMIZE_TIMEOUT = MINIMIZE_TIMEOUT;
this.AUTO_DISMISS_TIMEOUT = defaultAutoDismissTimeout;
this.MINIMIZE_ANIMATION_TIMEOUT = minimizeAnimationTimeout;
this.topic = topic;
/*
@@ -162,7 +162,7 @@ define(
// in order to allow the minimize animation to run through.
service.$timeout(function () {
service.setActiveNotification(service.selectNextNotification());
}, service.MINIMIZE_TIMEOUT);
}, service.MINIMIZE_ANIMATION_TIMEOUT);
}
};
@@ -208,11 +208,16 @@ define(
* @private
*/
NotificationService.prototype.dismissOrMinimize = function (notification) {
//For now minimize everything, and have discussion around which
//kind of messages should or should not be in the minimized
//notifications list
notification.minimize();
var model = notification.model;
if (model.severity === "info") {
if (model.autoDismiss === false) {
notification.minimize();
} else {
notification.dismiss();
}
} else {
notification.minimize();
}
};
/**
@@ -226,7 +231,9 @@ define(
/**
* A convenience method for info notifications. Notifications
* created via this method will be auto-dismissed after a default
* wait period
* wait period unless explicitly forbidden by the caller through
* the {autoDismiss} property on the {NotificationModel}, in which
* case the notification will be minimized after the wait.
* @param {NotificationModel | string} message either a string for
* the title of the notification message, or a {@link NotificationModel}
* defining the options notification to display
@@ -235,7 +242,6 @@ define(
*/
NotificationService.prototype.info = function (message) {
var notificationModel = typeof message === "string" ? {title: message} : message;
notificationModel.autoDismiss = notificationModel.autoDismiss || true;
notificationModel.severity = "info";
return this.notify(notificationModel);
};
@@ -306,28 +312,29 @@ define(
activeNotification = self.active.notification,
topic = this.topic();
notificationModel.severity = notificationModel.severity || "info";
notification = {
model: notificationModel,
minimize: function () {
self.minimize(self, notification);
},
dismiss: function () {
self.dismiss(self, notification);
topic.notify();
},
dismissOrMinimize: function () {
self.dismissOrMinimize(notification);
},
onDismiss: function (callback) {
topic.listen(callback);
}
};
notificationModel.severity = notificationModel.severity || "info";
if (notificationModel.autoDismiss === true) {
notificationModel.autoDismiss = this.DEFAULT_AUTO_DISMISS;
}
//Notifications support a 'dismissable' attribute. This is a
// convenience to support adding a 'dismiss' option to the
// notification for the common case of dismissing a
@@ -366,38 +373,39 @@ define(
*/
this.active.timeout = this.$timeout(function () {
activeNotification.dismissOrMinimize();
}, this.DEFAULT_AUTO_DISMISS);
}, this.AUTO_DISMISS_TIMEOUT);
}
return notification;
};
/**
* Used internally by the NotificationService
* @private
*/
NotificationService.prototype.setActiveNotification =
function (notification) {
var timeout;
NotificationService.prototype.setActiveNotification = function (notification) {
var shouldAutoDismiss;
this.active.notification = notification;
this.active.notification = notification;
/*
If autoDismiss has been specified, OR there are other
notifications queued for display, setup a timeout to
dismiss the dialog.
*/
if (notification && (notification.model.autoDismiss ||
this.selectNextNotification())) {
if (!notification) {
delete this.active.timeout;
return;
}
timeout = notification.model.autoDismiss || this.DEFAULT_AUTO_DISMISS;
this.active.timeout = this.$timeout(function () {
notification.dismissOrMinimize();
}, timeout);
} else {
delete this.active.timeout;
}
};
if (notification.model.severity === "info") {
shouldAutoDismiss = true;
} else {
shouldAutoDismiss = notification.model.autoDismiss;
}
if (shouldAutoDismiss || this.selectNextNotification()) {
this.active.timeout = this.$timeout(function () {
notification.dismissOrMinimize();
}, this.AUTO_DISMISS_TIMEOUT);
} else {
delete this.active.timeout;
}
};
/**
* Used internally by the NotificationService

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/NotificationService'],
@@ -29,11 +30,16 @@ define(
mockTimeout,
mockAutoDismiss,
mockMinimizeTimeout,
successModel,
mockTopicFunction,
mockTopicObject,
infoModel,
alertModel,
errorModel;
function elapseTimeout() {
mockTimeout.mostRecentCall.args[0]();
}
beforeEach(function () {
mockTimeout = jasmine.createSpy("$timeout");
mockTopicFunction = jasmine.createSpy("topic");
@@ -41,153 +47,189 @@ define(
mockTopicFunction.andReturn(mockTopicObject);
mockAutoDismiss = mockMinimizeTimeout = 1000;
notificationService = new NotificationService(
mockTimeout, mockTopicFunction, mockAutoDismiss, mockMinimizeTimeout);
successModel = {
title: "Mock Success Notification",
notificationService = new NotificationService(mockTimeout, mockTopicFunction, mockAutoDismiss, mockMinimizeTimeout);
infoModel = {
title: "Mock Info Notification",
severity: "info"
};
alertModel = {
title: "Mock Alert Notification",
severity: "alert"
};
errorModel = {
title: "Mock Error Notification",
severity: "error"
};
});
it("gets a new success notification, making" +
" the notification active", function () {
var activeNotification;
notificationService.notify(successModel);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(successModel);
});
it("notifies listeners on dismissal of notification", function () {
var notification,
dismissListener = jasmine.createSpy("ondismiss");
notification = notificationService.notify(successModel);
var dismissListener = jasmine.createSpy("ondismiss");
var notification = notificationService.notify(infoModel);
notification.onDismiss(dismissListener);
expect(mockTopicObject.listen).toHaveBeenCalled();
notification.dismiss();
expect(mockTopicObject.notify).toHaveBeenCalled();
mockTopicObject.listen.mostRecentCall.args[0]();
expect(dismissListener).toHaveBeenCalled();
});
it("allows specification of an info notification given just a" +
" title, making the notification active", function () {
var activeNotification,
notificationTitle = "Test info notification";
notificationService.info(notificationTitle);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model.title).toBe(notificationTitle);
expect(activeNotification.model.severity).toBe("info");
});
it("gets a new success notification with" +
" numerical auto-dismiss specified. ", function () {
var activeNotification;
successModel.autoDismiss = 1000;
notificationService.notify(successModel);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(successModel);
mockTimeout.mostRecentCall.args[0]();
expect(mockTimeout.calls.length).toBe(2);
mockTimeout.mostRecentCall.args[0]();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification).toBeUndefined();
});
it("gets a new notification with" +
" boolean auto-dismiss specified. ", function () {
var activeNotification;
successModel.autoDismiss = true;
notificationService.notify(successModel);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(successModel);
mockTimeout.mostRecentCall.args[0]();
expect(mockTimeout.calls.length).toBe(2);
mockTimeout.mostRecentCall.args[0]();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification).toBeUndefined();
});
it("allows minimization of notifications", function () {
var notification,
activeNotification;
successModel.autoDismiss = false;
notification = notificationService.notify(successModel);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(successModel);
notification.minimize();
mockTimeout.mostRecentCall.args[0]();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification).toBeUndefined();
expect(notificationService.notifications.length).toBe(1);
});
it("allows dismissal of notifications", function () {
var notification,
activeNotification;
successModel.autoDismiss = false;
notification = notificationService.notify(successModel);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(successModel);
it("dismisses a notification when the notification's dismiss method is used", function () {
var notification = notificationService.info(infoModel);
notification.dismiss();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification).toBeUndefined();
expect(notificationService.notifications.length).toBe(0);
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(0);
});
describe(" gets called with multiple notifications", function () {
it("auto-dismisses the previously active notification, making" +
" the new notification active", function () {
it("minimizes a notification when the notification's minimize method is used", function () {
var notification = notificationService.info(infoModel);
notification.minimize();
elapseTimeout(); // needed for the minimize animation timeout
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
describe("when receiving info notifications", function () {
it("minimizes info notifications if the caller disables auto-dismiss", function () {
infoModel.autoDismiss = false;
var notification = notificationService.info(infoModel);
elapseTimeout();
// 2nd elapse for the minimize animation timeout
elapseTimeout();
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
it("dismisses info notifications if the caller ignores auto-dismiss", function () {
notificationService.info(infoModel);
elapseTimeout();
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(0);
});
it("dismisses info notifications if the caller requests auto-dismiss", function () {
infoModel.autoDismiss = true;
notificationService.info(infoModel);
elapseTimeout();
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(0);
});
});
describe("when receiving alert notifications", function () {
it("minimizes alert notifications if the caller enables auto-dismiss", function () {
alertModel.autoDismiss = true;
var notification = notificationService.alert(alertModel);
elapseTimeout();
elapseTimeout();
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
it("keeps alert notifications active if the caller disables auto-dismiss", function () {
mockTimeout.andCallFake(function (callback, time) {
callback();
});
alertModel.autoDismiss = false;
var notification = notificationService.alert(alertModel);
expect(notificationService.getActiveNotification()).toEqual(notification);
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
it("keeps alert notifications active if the caller ignores auto-dismiss", function () {
mockTimeout.andCallFake(function (callback, time) {
callback();
});
var notification = notificationService.alert(alertModel);
expect(notificationService.getActiveNotification()).toEqual(notification);
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
});
describe("when receiving error notifications", function () {
it("minimizes error notifications if the caller enables auto-dismiss", function () {
errorModel.autoDismiss = true;
var notification = notificationService.error(errorModel);
elapseTimeout();
elapseTimeout();
expect(notificationService.getActiveNotification()).toBeUndefined();
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
it("keeps error notifications active if the caller disables auto-dismiss", function () {
mockTimeout.andCallFake(function (callback, time) {
callback();
});
errorModel.autoDismiss = false;
var notification = notificationService.error(errorModel);
expect(notificationService.getActiveNotification()).toEqual(notification);
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
it("keeps error notifications active if the caller ignores auto-dismiss", function () {
mockTimeout.andCallFake(function (callback, time) {
callback();
});
var notification = notificationService.error(errorModel);
expect(notificationService.getActiveNotification()).toEqual(notification);
expect(notificationService.notifications.length).toEqual(1);
expect(notificationService.notifications[0]).toEqual(notification);
});
});
describe("when called with multiple notifications", function () {
it("auto-dismisses the previously active notification, making the new notification active", function () {
var activeNotification;
infoModel.autoDismiss = false;
//First pre-load with a info message
notificationService.notify(successModel);
activeNotification =
notificationService.getActiveNotification();
notificationService.notify(infoModel);
activeNotification = notificationService.getActiveNotification();
//Initially expect the active notification to be info
expect(activeNotification.model).toBe(successModel);
expect(activeNotification.model).toBe(infoModel);
//Then notify of an error
notificationService.notify(errorModel);
//But it should be auto-dismissed and replaced with the
// error notification
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
//Two timeouts, one is to force minimization after
// displaying the message for a minimum period, the
// second is to allow minimization animation to take place.
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(errorModel);
});
it("auto-minimizes an active error notification", function () {
var activeNotification;
//First pre-load with an error message
notificationService.notify(errorModel);
//Then notify of info
notificationService.notify(successModel);
notificationService.notify(infoModel);
expect(notificationService.notifications.length).toEqual(2);
//Mock the auto-minimize
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
//Two timeouts, one is to force minimization after
// displaying the message for a minimum period, the
// second is to allow minimization animation to take place.
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
//Previous error message should be minimized, not
// dismissed
expect(notificationService.notifications.length).toEqual(2);
activeNotification =
notificationService.getActiveNotification();
expect(activeNotification.model).toBe(successModel);
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(infoModel);
expect(errorModel.minimized).toEqual(true);
});
it("auto-minimizes errors when a number of them arrive in" +
" short succession ", function () {
it("auto-minimizes errors when a number of them arrive in short succession", function () {
var activeNotification,
error2 = {
title: "Second Mock Error Notification",
@@ -205,30 +247,27 @@ define(
notificationService.notify(error3);
expect(notificationService.notifications.length).toEqual(3);
//Mock the auto-minimize
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
//Two timeouts, one is to force minimization after
// displaying the message for a minimum period, the
// second is to allow minimization animation to take place.
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
//Previous error message should be minimized, not
// dismissed
expect(notificationService.notifications.length).toEqual(3);
activeNotification =
notificationService.getActiveNotification();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(error2);
expect(errorModel.minimized).toEqual(true);
//Mock the second auto-minimize
mockTimeout.mostRecentCall.args[0]();
elapseTimeout();
//Two timeouts, one is to force minimization after
// displaying the message for a minimum period, the
// second is to allow minimization animation to take place.
mockTimeout.mostRecentCall.args[0]();
activeNotification =
notificationService.getActiveNotification();
elapseTimeout();
activeNotification = notificationService.getActiveNotification();
expect(activeNotification.model).toBe(error3);
expect(error2.minimized).toEqual(true);
});
});
});

View File

@@ -50,6 +50,7 @@ $sliderKnobW: 15px;
$sliderKnobR: 2px;
$timeControllerToiLineColor: #00c2ff;
$timeControllerToiLineColorHov: #fff;
$colorTransLucBg: #666; // Used as a visual blocking element over variable backgrounds, like imagery
// General Colors
$colorAlt1: #ffc700;
@@ -61,7 +62,7 @@ $colorCreateBtn: $colorKey;
$colorGridLines: rgba(#fff, 0.05);
$colorInvokeMenu: #fff;
$colorObjHdrTxt: $colorBodyFg;
$colorObjHdrIc: pullForward($colorObjHdrTxt, 20%);
$colorObjHdrIc: lighten($colorObjHdrTxt, 20%);
$colorTick: rgba(white, 0.2);
$colorSelectableSelectedPrimary: $colorKey;
$colorSelectableSelectedSecondary: pushBack($colorSelectableSelectedPrimary, 20%);
@@ -116,6 +117,7 @@ $colorProgressBarAmt: $colorKey;
$progressBarHOverlay: 15px;
$progressBarStripeW: 20px;
$shdwStatusIc: rgba(black, 0.4) 0 1px 2px;
$animPausedPulseDur: 500ms;
// Selects
$colorSelectBg: $colorBtnBg;
@@ -156,11 +158,11 @@ $shdwItemText: rgba(black, 0.1) 0 1px 2px;
$colorItemBgSelected: $colorKey;
// Tabular
$colorTabBorder: pullForward($colorBodyBg, 10%);
$colorTabBorder: pullForward($colorBodyBg, 5%);
$colorTabBodyBg: darken($colorBodyBg, 10%);
$colorTabBodyFg: lighten($colorTabBodyBg, 40%);
$colorTabHeaderBg: rgba(white, 0.1); // lighten($colorBodyBg, 10%);
$colorTabHeaderFg: $colorBodyFg; //lighten($colorTabHeaderBg, 40%);
$colorTabHeaderBg: rgba(white, 0.1);
$colorTabHeaderFg: $colorBodyFg;
$colorTabHeaderBorder: $colorBodyBg;
// Plot

View File

@@ -50,6 +50,7 @@ $sliderKnobW: 15px;
$sliderKnobR: 2px;
$timeControllerToiLineColor: $colorBodyFg;
$timeControllerToiLineColorHov: #0052b5;
$colorTransLucBg: #666; // Used as a visual blocking element over variable backgrounds, like imagery
// General Colors
$colorAlt1: #776ba2;
@@ -61,7 +62,7 @@ $colorCreateBtn: $colorKey;
$colorGridLines: rgba(#000, 0.05);
$colorInvokeMenu: #fff;
$colorObjHdrTxt: $colorBodyFg;
$colorObjHdrIc: pushBack($colorObjHdrTxt, 30%);
$colorObjHdrIc: lighten($colorObjHdrTxt, 30%);
$colorTick: rgba(black, 0.2);
$colorSelectableSelectedPrimary: $colorKey;
$colorSelectableSelectedSecondary: pushBack($colorSelectableSelectedPrimary, 20%);
@@ -116,6 +117,7 @@ $colorProgressBarAmt: #0a0;
$progressBarHOverlay: 15px;
$progressBarStripeW: 20px;
$shdwStatusIc: rgba(white, 0.8) 0 0px 5px;
$animPausedPulseDur: 1s;
// Selects
$colorSelectBg: $colorBtnBg;

View File

@@ -24,7 +24,6 @@ define([
"./src/objects/DomainObjectProvider",
"./src/capabilities/CoreCapabilityProvider",
"./src/models/StaticModelProvider",
"./src/models/RootModelProvider",
"./src/models/ModelAggregator",
"./src/models/ModelCacheService",
"./src/models/PersistedModelProvider",
@@ -46,6 +45,7 @@ define([
"./src/capabilities/MutationCapability",
"./src/capabilities/DelegationCapability",
"./src/capabilities/InstantiationCapability",
"./src/runs/TransactingMutationListener",
"./src/services/Now",
"./src/services/Throttle",
"./src/services/Topic",
@@ -56,7 +56,6 @@ define([
DomainObjectProvider,
CoreCapabilityProvider,
StaticModelProvider,
RootModelProvider,
ModelAggregator,
ModelCacheService,
PersistedModelProvider,
@@ -78,6 +77,7 @@ define([
MutationCapability,
DelegationCapability,
InstantiationCapability,
TransactingMutationListener,
Now,
Throttle,
Topic,
@@ -150,16 +150,6 @@ define([
"$log"
]
},
{
"provides": "modelService",
"type": "provider",
"implementation": RootModelProvider,
"depends": [
"roots[]",
"$q",
"$log"
]
},
{
"provides": "modelService",
"type": "aggregator",
@@ -407,14 +397,10 @@ define([
]
}
],
"roots": [
"runs": [
{
"id": "mine",
"model": {
"name": "My Items",
"type": "folder",
"composition": []
}
"implementation": TransactingMutationListener,
"depends": ["topic", "transactionService", "cacheService"]
}
],
"constants": [

View File

@@ -49,8 +49,7 @@ define(
}
/**
* Add a domain object to the composition of the field.
* This mutates but does not persist the modified object.
* Add a domain object to the composition of this domain object.
*
* If no index is given, this is added to the end of the composition.
*

View File

@@ -68,7 +68,13 @@ define(
this.instantiateFn = this.instantiateFn ||
this.$injector.get("instantiate");
return this.instantiateFn(model, id);
var newObject = this.instantiateFn(model, id);
this.contextualizeFn = this.contextualizeFn ||
this.$injector.get("contextualize");
return this.contextualizeFn(newObject, this.domainObject);
};
/**

View File

@@ -113,11 +113,16 @@ define(
domainObject = this.domainObject,
model = domainObject.getModel(),
modified = model.modified,
persisted = model.persisted,
persistenceService = this.persistenceService,
persistenceFn = model.persisted !== undefined ?
persistenceFn = persisted !== undefined ?
this.persistenceService.updateObject :
this.persistenceService.createObject;
if (persisted !== undefined && persisted === modified) {
return this.$q.when(true);
}
// Update persistence timestamp...
domainObject.useCapability("mutation", function (m) {
m.persisted = modified;
@@ -178,6 +183,15 @@ define(
};
/**
* Check if this domain object has been persisted at some
* point.
* @returns {boolean} true if the object has been persisted
*/
PersistenceCapability.prototype.persisted = function () {
return this.domainObject.getModel().persisted !== undefined;
};
/**
* Get the key for this domain object in the given space.
*

View File

@@ -38,75 +38,25 @@ define(
this.modelService = modelService;
}
// Fast-resolving promise
function fastPromise(value) {
return (value || {}).then ? value : {
then: function (callback) {
return fastPromise(callback(value));
}
};
}
CachingModelDecorator.prototype.getModels = function (ids) {
var cacheService = this.cacheService,
neededIds = ids.filter(function notCached(id) {
return !cacheService.has(id);
});
var loadFromCache = ids.filter(function cached(id) {
return this.cacheService.has(id);
}, this),
loadFromService = ids.filter(function notCached(id) {
return !this.cacheService.has(id);
}, this);
// Update the cached instance of a model to a new value.
// We update in-place to ensure there is only ever one instance
// of any given model exposed by the modelService as a whole.
function updateModel(id, model) {
var oldModel = cacheService.get(id);
// Same object instance is a possibility, so don't copy
if (oldModel === model) {
return model;
}
// If we'd previously cached an undefined value, or are now
// seeing undefined, replace the item in the cache entirely.
if (oldModel === undefined || model === undefined) {
cacheService.put(id, model);
return model;
}
// Otherwise, empty out the old model...
Object.keys(oldModel).forEach(function (k) {
delete oldModel[k];
});
// ...and replace it with the contents of the new model.
Object.keys(model).forEach(function (k) {
oldModel[k] = model[k];
});
return oldModel;
if (!loadFromCache.length) {
return this.modelService.getModels(loadFromService);
}
// Store the provided models in our cache
function cacheAll(models) {
Object.keys(models).forEach(function (id) {
var model = cacheService.has(id) ?
updateModel(id, models[id]) : models[id];
cacheService.put(id, model);
});
}
// Expose the cache (for promise chaining)
function giveCache() {
return cacheService.all();
}
// Look up if we have unknown IDs
if (neededIds.length > 0) {
return this.modelService.getModels(neededIds)
.then(cacheAll)
.then(giveCache);
}
// Otherwise, just expose the cache directly
return fastPromise(cacheService.all());
return this.modelService.getModels(loadFromService)
.then(function (modelResults) {
loadFromCache.forEach(function (id) {
modelResults[id] = this.cacheService.get(id);
}, this);
return modelResults;
}.bind(this));
};
return CachingModelDecorator;

View File

@@ -77,5 +77,9 @@ define([], function () {
return this.cache;
};
ModelCacheService.prototype.flush = function () {
this.cache = {};
};
return ModelCacheService;
});

View File

@@ -1,79 +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.
*****************************************************************************/
/**
* Module defining RootModelProvider. Created by vwoeltje on 11/7/14.
*/
define(
['./StaticModelProvider'],
function (StaticModelProvider) {
/**
* Provides the root object (id = "ROOT"), which is the top-level
* domain object shown when the application is started, from which all
* other domain objects are reached.
*
* The root model provider works as the static model provider,
* except that it aggregates roots[] instead of models[], and
* exposes them all as composition of the root object ROOT,
* whose model is also provided by this service.
*
* @memberof platform/core
* @constructor
* @implements {ModelService}
* @param {Array} roots all `roots[]` extensions
* @param $q Angular's $q, for promises
* @param $log Angular's $log, for logging
*/
function RootModelProvider(roots, $q, $log) {
// Pull out identifiers to used as ROOT's
var ids = roots.map(function (root) {
return root.id;
});
// Assign an initial location to root models
roots.forEach(function (root) {
if (!root.model) {
root.model = {};
}
root.model.location = 'ROOT';
});
this.baseProvider = new StaticModelProvider(roots, $q, $log);
this.rootModel = {
name: "The root object",
type: "root",
composition: ids
};
}
RootModelProvider.prototype.getModels = function (ids) {
var rootModel = this.rootModel;
return this.baseProvider.getModels(ids).then(function (models) {
models.ROOT = rootModel;
return models;
});
};
return RootModelProvider;
}
);

View File

@@ -0,0 +1,59 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define([], function () {
/**
* Listens for mutation on domain objects and triggers persistence when
* it occurs.
* @param {Topic} topic the `topic` service; used to listen for mutation
* @memberof platform/core
*/
function TransactingMutationListener(
topic,
transactionService,
cacheService
) {
var mutationTopic = topic('mutation');
mutationTopic.listen(function (domainObject) {
var persistence = domainObject.getCapability('persistence');
var wasActive = transactionService.isActive();
cacheService.put(domainObject.getId(), domainObject.getModel());
if (!wasActive) {
transactionService.startTransaction();
}
transactionService.addToTransaction(
persistence.persist.bind(persistence),
persistence.refresh.bind(persistence)
);
if (!wasActive) {
transactionService.commit();
}
});
}
return TransactingMutationListener;
});

View File

@@ -67,6 +67,7 @@ define(
listener(message);
} catch (e) {
$log.error(ERROR_PREFIX + e.message);
$log.error(e);
}
});
}

View File

@@ -28,6 +28,7 @@ define(
var mockInjector,
mockIdentifierService,
mockInstantiate,
mockContextualize,
mockIdentifier,
mockNow,
mockDomainObject,
@@ -36,6 +37,7 @@ define(
beforeEach(function () {
mockInjector = jasmine.createSpyObj("$injector", ["get"]);
mockInstantiate = jasmine.createSpy("instantiate");
mockContextualize = jasmine.createSpy("contextualize");
mockIdentifierService = jasmine.createSpyObj(
'identifierService',
['parse', 'generate']
@@ -50,8 +52,10 @@ define(
);
mockInjector.get.andCallFake(function (key) {
return key === 'instantiate' ?
mockInstantiate : undefined;
return {
'instantiate': mockInstantiate,
'contextualize': mockContextualize
}[key];
});
mockIdentifierService.parse.andReturn(mockIdentifier);
mockIdentifierService.generate.andReturn("some-id");
@@ -72,7 +76,7 @@ define(
expect(instantiation.invoke).toBe(instantiation.instantiate);
});
it("uses the instantiate service to create domain objects", function () {
it("uses instantiate and contextualize to create domain objects", function () {
var mockDomainObj = jasmine.createSpyObj('domainObject', [
'getId',
'getModel',
@@ -81,6 +85,9 @@ define(
'hasCapability'
]), testModel = { someKey: "some value" };
mockInstantiate.andReturn(mockDomainObj);
mockContextualize.andCallFake(function (x) {
return x;
});
expect(instantiation.instantiate(testModel))
.toBe(mockDomainObj);
expect(mockInstantiate)
@@ -88,6 +95,8 @@ define(
someKey: "some value",
modified: mockNow()
}, jasmine.any(String));
expect(mockContextualize)
.toHaveBeenCalledWith(mockDomainObj, mockDomainObject);
});
});

View File

@@ -27,7 +27,7 @@ define(
],
function (CachingModelDecorator, ModelCacheService) {
describe("The caching model decorator", function () {
xdescribe("The caching model decorator", function () {
var mockModelService,
mockCallback,
testModels,

View File

@@ -1,105 +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.
*****************************************************************************/
/**
* RootModelProviderSpec. Created by vwoeltje on 11/6/14.
*/
define(
["../../src/models/RootModelProvider"],
function (RootModelProvider) {
describe("The root model provider", function () {
var roots = [
{
"id": "a",
"model": {
"name": "Thing A",
"someProperty": "Some Value A"
}
},
{
"id": "b",
"model": {
"name": "Thing B",
"someProperty": "Some Value B"
}
}
],
captured,
mockLog,
mockQ,
provider;
function mockPromise(value) {
return {
then: function (callback) {
return mockPromise(callback(value));
}
};
}
function capture(value) {
captured = value;
}
beforeEach(function () {
mockQ = { when: mockPromise };
mockLog = jasmine.createSpyObj("$log", ["error", "warn", "info", "debug"]);
provider = new RootModelProvider(roots, mockQ, mockLog);
});
it("provides models from extension declarations", function () {
// Verify that we got the promise as the return value
provider.getModels(["a", "b"]).then(capture);
// Verify that the promise has the desired models
expect(captured.a.name).toEqual("Thing A");
expect(captured.a.someProperty).toEqual("Some Value A");
expect(captured.b.name).toEqual("Thing B");
expect(captured.b.someProperty).toEqual("Some Value B");
});
it("provides models with a location", function () {
provider.getModels(["a", "b"]).then(capture);
expect(captured.a.location).toBe('ROOT');
expect(captured.b.location).toBe('ROOT');
});
it("does not provide models which are not in extension declarations", function () {
provider.getModels(["c"]).then(capture);
// Verify that the promise has the desired models
expect(captured.c).toBeUndefined();
});
it("provides a ROOT object with roots in its composition", function () {
provider.getModels(["ROOT"]).then(capture);
expect(captured.ROOT).toBeDefined();
expect(captured.ROOT.composition).toEqual(["a", "b"]);
});
});
}
);

View File

@@ -0,0 +1,120 @@
/*****************************************************************************
* 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/runs/TransactingMutationListener"],
function (TransactingMutationListener) {
xdescribe("TransactingMutationListener", function () {
var mockTopic,
mockMutationTopic,
mockTransactionService,
mockDomainObject,
mockPersistence;
beforeEach(function () {
mockTopic = jasmine.createSpy('topic');
mockMutationTopic =
jasmine.createSpyObj('mutation', ['listen']);
mockTransactionService =
jasmine.createSpyObj('transactionService', [
'isActive',
'startTransaction',
'addToTransaction',
'commit'
]);
mockDomainObject = jasmine.createSpyObj(
'domainObject',
['getId', 'getCapability', 'getModel']
);
mockPersistence = jasmine.createSpyObj(
'persistence',
['persist', 'refresh', 'persisted']
);
mockTopic.andCallFake(function (t) {
return (t === 'mutation') && mockMutationTopic;
});
mockDomainObject.getCapability.andCallFake(function (c) {
return (c === 'persistence') && mockPersistence;
});
mockPersistence.persisted.andReturn(true);
return new TransactingMutationListener(
mockTopic,
mockTransactionService
);
});
it("listens for mutation", function () {
expect(mockMutationTopic.listen)
.toHaveBeenCalledWith(jasmine.any(Function));
});
[false, true].forEach(function (isActive) {
var verb = isActive ? "is" : "isn't";
function onlyWhenInactive(expectation) {
return isActive ? expectation.not : expectation;
}
describe("when a transaction " + verb + " active", function () {
var innerVerb = isActive ? "does" : "doesn't";
beforeEach(function () {
mockTransactionService.isActive.andReturn(isActive);
});
describe("and mutation occurs", function () {
beforeEach(function () {
mockMutationTopic.listen.mostRecentCall
.args[0](mockDomainObject);
});
it(innerVerb + " start a new transaction", function () {
onlyWhenInactive(
expect(mockTransactionService.startTransaction)
).toHaveBeenCalled();
});
it("adds to the active transaction", function () {
expect(mockTransactionService.addToTransaction)
.toHaveBeenCalledWith(
jasmine.any(Function),
jasmine.any(Function)
);
});
it(innerVerb + " immediately commit", function () {
onlyWhenInactive(
expect(mockTransactionService.commit)
).toHaveBeenCalled();
});
});
});
});
});
}
);

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