Compare commits

...

172 Commits

Author SHA1 Message Date
Victor Woeltjen
afdf6e7067 [Selection] Allow toggling of legacy inspector
...to verify that this approach to switching inspector
contents works as expected.
2016-10-18 14:46:20 -07:00
Victor Woeltjen
f8be42f82d [Selection] Begin adding InspectorAdapterController 2016-10-18 14:38:34 -07:00
Victor Woeltjen
1ccc0780c8 [Selection] Display legacy inspector 2016-10-18 14:32:46 -07:00
Victor Woeltjen
830d042cea [Selection] Override object inspector
...to allow for selection inspection, which implements #1126
2016-10-18 14:10:40 -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
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
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
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
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
5b0fa90e39 Merge pull request #1220 from nasa/hasta-la-vista-jspdf
[export] remove pdf export
2016-09-30 17:01:23 -07:00
Pete Richards
ae6f6565fa [export] remove pdf export
Remove pdf export with extreme prejudice due to issues with build process.

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

Fixes https://github.com/nasa/openmct/issues/1214
2016-09-30 12:49:02 -07:00
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
Pete Richards
7439d949c4 Merge pull request #1209 from nasa/jspdf-1208b
[Build] Fix jsPDF dependency
2016-09-28 09:30:50 -07:00
Victor Woeltjen
e1276e464d [Build] Restore version identifier 2016-09-27 16:49:09 -07:00
Victor Woeltjen
d248dfe346 [Build] Remove SNAPSHOT status
...to tag a build which addresses release blocker #1208
2016-09-27 16:48:38 -07:00
Victor Woeltjen
91b63f78eb [Build] Depend on non-minified jsPDF
Fixes #1208 (for some reason)
2016-09-27 16:47:42 -07:00
Victor Woeltjen
754d7b3cd7 [Build] Restore SNAPSHOT status
... for a patch build related to #1208
2016-09-27 16:47:35 -07:00
Victor Woeltjen
7d950d067c Merge pull request #1194 from hudsonfoo/open1184
[Frontend] Add notes property to all item types
2016-09-27 15:28:49 -07:00
Alex M
a34e89d56a [Edit] Bind action to .perform() inside mct-button 2016-09-27 21:19:25 +03:00
Alex M
4b51e604a7 [Edit] Switch other edit actions to mct-control 2016-09-24 20:43:35 +03:00
Andrew Henry
e3e7bd27e9 Merge pull request #1203 from nasa/open1202
[Frontend] Removed Export buttons from objects when in a Layout
2016-09-23 10:20:47 -07:00
Andrew Henry
f6ed0e8ab6 Merge pull request #1178 from hudsonfoo/open1168
[Frontend] Delay visibility of progress bar
2016-09-23 10:10:09 -07:00
Henry
c179d9e759 Merge branch 'BogdanAlexandru-mct588comm' 2016-09-22 17:45:41 -07:00
Henry
98f387b605 [Edit Mode] Renamed function from EditAction.cancel() to EditAction.finish() 2016-09-22 17:34:53 -07:00
Henry
275dda820b Merge branch 'mct588comm' of https://github.com/BogdanAlexandru/openmct into BogdanAlexandru-mct588comm 2016-09-22 17:33:42 -07:00
Victor Woeltjen
43c32c2c7b Merge pull request #1201 from nasa/open1080
[Edit Mode] Fixed issue with save dialog not being displayed for new objects after mutation
2016-09-22 16:23:49 -07:00
Victor Woeltjen
3f5388c2e8 [Build] Restore SNAPSHOT status
...and bump version number to open sprint Rajaniemi,
https://github.com/nasa/openmct/milestone/18
2016-09-22 16:20:18 -07:00
Henry
7a94efccbf [Edit Mode] Fixed spelling mistake, moved variable declaration 2016-09-22 11:04:04 -07:00
Charles Hacskaylo
3c72eea9ef [Frontend] Removed export buttons from objects when in layout
Fixes #1202
CSS modded
2016-09-22 10:41:14 -07:00
Henry
3548cde9c4 [Edit Mode] Fixed issue with save dialog not being displayed for new objects after mutation. Fixes 1080 2016-09-21 16:12:09 -07: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
Alex M
0c27a5f361 [Edit] Remove CreationService dep from SaveAs 2016-09-19 23:52:30 +03:00
Alex M
abfabc85b5 [Edit] Fix edit-action-buttons indent 2016-09-19 20:41:50 +03:00
Alex M
e08704e6d3 [Edit] Make checkstyle happy 2016-09-19 20:39:54 +03:00
Alex M
f60fc2ebad [Edit] EditorCapability.finish returns domainObj 2016-09-19 20:33:12 +03:00
Alex M
b50278e92f [Edit] Remove mocked unused UrlService 2016-09-19 20:22:46 +03:00
David Hudson
d913798d5b [Timeline] Add battery starting state-of-charge
Issue #1185
2016-09-18 22:52:41 +09:00
David Hudson
56267095cb [Forms] Add style for small textareas
Issue #1184. This allows for a generically sized text area in forms. I am
anticipating some potential feedback on this given the approach and the sizing
I chose may or may not be ideal for your requirements.
2016-09-18 01:47:07 +09:00
David Hudson
f9ce27def3 [Frontend] Add attributes for storing notes
Issue #1184
2016-09-18 01:27:12 +09:00
David Hudson
127a7a62c1 Merge branch 'master' of github.com:nasa/openmct into open1184 2016-09-18 01:25:05 +09:00
David Hudson
4429e847e8 [Properties] Add notes field to all item types
Issue #1184
2016-09-18 01:18:26 +09:00
David Hudson
56e321f6d9 [Forms] Add textarea template
Issue #1184
2016-09-18 01:18:02 +09:00
David Hudson
e135ed26f0 [Frontend] Shorten overlay fade duration
Issue #1168
2016-09-17 16:36:55 +09:00
David Hudson
48b25fe842 [Formatting] Remove double negative logic
Issue #1168
2016-09-17 16:32:26 +09:00
David Hudson
85e57286ae Merge branch 'master' of github.com:nasa/openmct into open1168 2016-09-17 16:30:42 +09:00
Alex M
5ef6617062 [Edit] Rename action to Save and Finish Editing 2016-09-17 01:05:46 +03:00
Alex M
ae89dcd62d [Edit] Make single save button use mct-control 2016-09-17 00:39:49 +03:00
Alex M
2a2e9ef99d [Edit] Make linter happy 2016-09-16 03:24:00 +03:00
Alex M
1446b16e77 [Edit] Using spy objects as save action mocks 2016-09-16 03:15:10 +03:00
Alex M
f03003b366 [Edit] Fix CreateActionSpec 2016-09-15 23:18:53 +03:00
Alex M
d3db26499c [Edit] CreateAction needs to perform("save-as") 2016-09-15 23:14:12 +03:00
Alex M
d1f67fd8b9 [Edit] Introduce dropdown Save menu
And fix style issues in SaveAsActionSpec
2016-09-15 22:40:02 +03:00
Alex M
31ee92b711 [Edit] Remove editor.cancel from SaveActionSpec 2016-09-15 20:39:02 +03:00
Alex M
1ea7fa3084 [Edit] SaveAsAction tests cover save and finish 2016-09-15 20:28:29 +03:00
Alex M
d8dc3c8445 Merge branch 'master' into mct588comm 2016-09-14 19:50:19 +03:00
David Hudson
ea1855fc26 Merge branch 'master' of github.com:nasa/openmct into open1168 2016-09-14 17:00:06 +09:00
Alex M
0be84a4e51 [Edit] CreateAction closes editor after save 2016-09-13 23:59:28 +03:00
Alex M
d87ed1414e [Edit] Update EditorCapability comments 2016-09-13 22:36:27 +03:00
Alex M
4382745012 [Edit] Final two actions now use finish() 2016-09-13 22:35:11 +03:00
Alex M
79b16ddda6 [Edit] SaveAs now calls finish() 2016-09-13 21:24:20 +03:00
David Hudson
6c9bd0b510 Merge branch 'master' of github.com:nasa/openmct into open1168 2016-09-13 16:39:31 +09:00
David Hudson
2740b6f957 [Frontend] Add optional delay parameter to dialog service
Issue #1168
2016-09-13 16:36:25 +09:00
David Hudson
ea35395d7e Merge branch 'master' of github.com:nasa/openmct into open1168 2016-09-13 02:47:16 +09:00
David Hudson
24cb72e5b5 [Frontend] Delay visibility of progress bar
Resolves #1168
2016-09-12 15:28:04 +09:00
Alex M
3dee082141 [Edit] Add reason for redundant mocks 2016-09-03 19:02:05 +03:00
Alex M
7d52d348b2 [Edit] Fix style issues 2016-09-03 18:33:27 +03:00
Alex M
ded52b8d19 [Edit] Rename cancel() to finish() 2016-09-03 17:55:05 +03:00
Alex M
ab4ce0caba [Edit] Introduced SaveAndStopEditingAction
It replaces SaveAction in the bundle.
2016-09-03 17:55:04 +03:00
Alex M
90c13a3959 [Edit] EditorCapability continues edit on save 2016-09-03 17:55:04 +03:00
Alex M
9847c40e34 [Edit] SaveAction not navigating anymore 2016-09-03 17:55:04 +03: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
209 changed files with 10615 additions and 1063 deletions

285
API.md Normal file
View File

@@ -0,0 +1,285 @@
# 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', new openmct.Type({
label: "My Type",
description: "This is a type that I added!"
});
```
### 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({
identifier: { key: "my-key", namespace: "my-namespace" }
name: "My Root-level Object",
type: "my-type"
});
```
You can also remove this root-level object via its identifier:
```
openmct.objects.removeRoot({ key: "my-key", namespace: "my-namespace" });
```
### 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,7 +19,10 @@
"comma-separated-values": "^3.6.4",
"FileSaver.js": "^0.0.2",
"zepto": "^1.1.6",
"html2canvas": "^0.4.1",
"jspdf": "^1.2.61"
"eventemitter3": "^1.2.0",
"lodash": "3.10.1",
"almond": "~0.3.2",
"d3": "~4.1.0",
"html2canvas": "^0.4.1"
}
}

View File

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

View File

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

@@ -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-v2/conductor/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-v2/conductor/src/timeSystems/TimeSystem',
'../../../platform/features/conductor-v2/conductor/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

@@ -36,7 +36,7 @@ define([
legacyRegistry
) {
"use strict";
legacyRegistry.register("example/notifications", {
legacyRegistry.register("example/msl-adapter", {
"name" : "Mars Science Laboratory Data Adapter",
"extensions" : {
"types": [

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,6 +125,8 @@ gulp.task('lint', function () {
});
gulp.task('checkstyle', function () {
var jscs = require('gulp-jscs');
return gulp.src(paths.scripts)
.pipe(jscs())
.pipe(jscs.reporter())
@@ -129,18 +134,20 @@ gulp.task('checkstyle', function () {
});
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 () {
@@ -148,9 +155,9 @@ gulp.task('serve', function () {
var app = require('./app.js');
});
gulp.task('develop', ['serve', 'stylesheets', 'watch']);
gulp.task('develop', ['serve', 'install', 'watch']);
gulp.task('install', [ 'static', 'scripts' ]);
gulp.task('install', [ 'assets', 'scripts' ]);
gulp.task('verify', [ 'lint', 'test', 'checkstyle' ]);

View File

@@ -28,12 +28,15 @@
<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'
].forEach(
openmct.legacyRegistry.enable.bind(openmct.legacyRegistry)
);
openmct.start();
});
</script>
<link rel="stylesheet" href="platform/commonUI/general/res/css/startup-base.css">
@@ -47,7 +50,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,16 +27,18 @@ requirejs.config({
"angular": "bower_components/angular/angular.min",
"angular-route": "bower_components/angular-route/angular-route.min",
"csv": "bower_components/comma-separated-values/csv.min",
"EventEmitter": "bower_components/eventemitter3/index",
"es6-promise": "bower_components/es6-promise/es6-promise.min",
"html2canvas": "bower_components/html2canvas/build/html2canvas.min",
"jsPDF": "bower_components/jspdf/dist/jspdf.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"
"zepto": "bower_components/zepto/zepto.min",
"lodash": "bower_components/lodash/lodash",
"d3": "bower_components/d3/d3.min"
},
"shim": {
"angular": {
@@ -45,12 +47,12 @@ requirejs.config({
"angular-route": {
"deps": ["angular"]
},
"EventEmitter": {
"exports": "EventEmitter"
},
"html2canvas": {
"exports": "html2canvas"
},
"jsPDF": {
"exports": "jsPDF"
},
"moment-duration-format": {
"deps": ["moment"]
},
@@ -59,54 +61,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.11.3",
"version": "0.12.0-SNAPSHOT",
"description": "The Open MCT core platform",
"dependencies": {
"express": "^4.13.1",
@@ -48,8 +48,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
) {
@@ -142,7 +144,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

@@ -48,20 +48,35 @@ define(
*/
NavigateAction.prototype.perform = function () {
var self = this,
navigationAllowed = true;
navigateTo = this.domainObject,
currentObject = self.navigationService.getNavigation();
function allow() {
self.policyService.allow("navigation", self.navigationService.getNavigation(), self.domainObject, function (message) {
var navigationAllowed = true;
self.policyService.allow("navigation", currentObject, navigateTo, function (message) {
navigationAllowed = self.$window.confirm(message + "\r\n\r\n" +
" Are you sure you want to continue?");
});
return navigationAllowed;
}
// Set navigation, and wrap like a promise
return this.$q.when(
allow() && this.navigationService.setNavigation(this.domainObject)
);
function cancelIfEditing() {
var editing = currentObject.hasCapability('editor') &&
currentObject.getCapability('editor').isEditContextRoot();
return self.$q.when(editing && currentObject.getCapability("editor").finish());
}
function navigate() {
return self.navigationService.setNavigation(navigateTo);
}
if (allow()) {
return cancelIfEditing().then(navigate);
} else {
return this.$q.when(false);
}
};
/**

View File

@@ -32,7 +32,9 @@ define(
mockQ,
mockDomainObject,
mockPolicyService,
mockNavigatedObject,
mockWindow,
capabilities,
action;
function mockPromise(value) {
@@ -44,6 +46,29 @@ define(
}
beforeEach(function () {
capabilities = {};
mockQ = { when: mockPromise };
mockNavigatedObject = jasmine.createSpyObj(
"domainObject",
[
"getId",
"getModel",
"hasCapability",
"getCapability"
]
);
capabilities.editor = jasmine.createSpyObj("editorCapability", [
"isEditContextRoot",
"finish"
]);
mockNavigatedObject.getCapability.andCallFake(function (capability) {
return capabilities[capability];
});
mockNavigatedObject.hasCapability.andReturn(false);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[
@@ -51,11 +76,14 @@ define(
"getNavigation"
]
);
mockNavigationService.getNavigation.andReturn({});
mockQ = { when: mockPromise };
mockNavigationService.getNavigation.andReturn(mockNavigatedObject);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
["getId", "getModel", "getCapability"]
[
"getId",
"getModel"
]
);
mockPolicyService = jasmine.createSpyObj("policyService",
@@ -112,6 +140,21 @@ define(
});
});
describe("in edit mode", function () {
beforeEach(function () {
mockNavigatedObject.hasCapability.andCallFake(function (capability) {
return capability === "editor";
});
capabilities.editor.isEditContextRoot.andReturn(true);
});
it("finishes editing if in edit mode", function () {
action.perform();
expect(capabilities.editor.finish)
.toHaveBeenCalled();
});
});
it("is only applicable when a domain object is in context", function () {
expect(NavigateAction.appliesTo({})).toBeFalsy();
expect(NavigateAction.appliesTo({

View File

@@ -19,7 +19,7 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<div class="abs overlay">
<div class="abs overlay" ng-class="{'delayEntry100ms' : ngModel.delay}">
<div class="abs blocker"></div>
<div class="abs holder">
<a ng-click="ngModel.cancel()"

View File

@@ -200,6 +200,9 @@ define(
* shown above a progress bar to indicate what's happening.
* @property {number} progress a percentage value (1-100)
* indicating the completion of the blocking task
* @property {boolean} delay adds a brief delay before loading
* the dialog. Useful for removing the dialog flicker when the
* conditions for displaying the dialog change rapidly.
* @property {string} progressText the message to show below a
* progress bar to indicate progress. For example, this might be
* used to indicate time remaining, or items still to process.

View File

@@ -31,6 +31,7 @@ define([
"./src/actions/PropertiesAction",
"./src/actions/RemoveAction",
"./src/actions/SaveAction",
"./src/actions/SaveAndStopEditingAction",
"./src/actions/SaveAsAction",
"./src/actions/CancelAction",
"./src/policies/EditActionPolicy",
@@ -70,6 +71,7 @@ define([
PropertiesAction,
RemoveAction,
SaveAction,
SaveAndStopEditingAction,
SaveAsAction,
CancelAction,
EditActionPolicy,
@@ -198,25 +200,34 @@ define([
"name": "Remove",
"description": "Remove this object from its containing object.",
"depends": [
"$q",
"navigationService"
]
},
{
"key": "save",
"category": "conclude-editing",
"implementation": SaveAction,
"name": "Save",
"key": "save-and-stop-editing",
"category": "save",
"implementation": SaveAndStopEditingAction,
"name": "Save and Finish Editing",
"cssclass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService"
],
"priority": "mandatory"
]
},
{
"key": "save",
"category": "conclude-editing",
"category": "save",
"implementation": SaveAction,
"name": "Save and Continue Editing",
"cssclass": "icon-save labeled",
"description": "Save changes made to these objects.",
"depends": [
"dialogService"
]
},
{
"key": "save-as",
"category": "save",
"implementation": SaveAsAction,
"name": "Save As...",
"cssclass": "icon-save labeled",
@@ -225,7 +236,6 @@ define([
"$injector",
"policyService",
"dialogService",
"creationService",
"copyService"
],
"priority": "mandatory"
@@ -234,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": []

View File

@@ -20,12 +20,34 @@
at runtime from the About dialog for additional information.
-->
<span ng-controller="EditActionController">
<span ng-repeat="currentAction in editActions">
<a class='s-button {{currentAction.getMetadata().cssclass}}'
title='{{currentAction.getMetadata().name}}'
ng-click="currentAction.perform()"
ng-class="{ major: $index === 0 }">
<span class="title-label">{{currentAction.getMetadata().name}}</span>
</a>
<!-- If there's a single save action show a button, otherwise show a dropdown with all save actions. -->
<span ng-if="saveActions.length === 1">
<mct-control key="'button'"
structure="{
text: saveActions[0].getMetadata().name,
click: actionPerformer(saveActions[0]),
cssclass: 'major ' + saveActions[0].getMetadata().cssclass
}">
</mct-control>
</span>
<span ng-if="saveActions.length > 1">
<mct-control key="'menu-button'"
structure="{
options: saveActionsAsMenuOptions,
click: saveActionMenuClickHandler,
cssclass: 'btn-bar right icon-save no-label major'
}">
</mct-control>
</span>
<span ng-repeat="currentAction in otherEditActions">
<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

@@ -62,7 +62,7 @@ define(
}
function cancel(allowed) {
return allowed && domainObject.getCapability("editor").cancel();
return allowed && domainObject.getCapability("editor").finish();
}
//Do navigation first in order to trigger unsaved changes dialog

View File

@@ -69,18 +69,13 @@ define(
* Enter edit mode.
*/
EditAction.prototype.perform = function () {
var self = this;
function cancelEditing() {
self.domainObject.getCapability('editor').cancel();
self.navigationService.removeListener(cancelEditing);
}
//If this is not the currently navigated object, then navigate
// to it.
if (this.navigationService.getNavigation() !== this.domainObject) {
this.navigationService.setNavigation(this.domainObject);
}
this.navigationService.addListener(cancelEditing);
this.domainObject.useCapability("editor");
};

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

@@ -25,9 +25,8 @@ define(
function (SaveInProgressDialog) {
/**
* The "Save" action; the action triggered by clicking Save from
* Edit Mode. Exits the editing user interface and invokes object
* capabilities to persist the changes that have been made.
* The "Save" action; it invokes object capabilities to persist
* the changes that have been made.
* @constructor
* @implements {Action}
* @memberof platform/commonUI/edit
@@ -41,7 +40,7 @@ define(
}
/**
* Save changes and conclude editing.
* Save changes.
*
* @returns {Promise} a promise that will be fulfilled when
* cancellation has completed
@@ -51,40 +50,22 @@ define(
var domainObject = this.domainObject,
dialog = new SaveInProgressDialog(this.dialogService);
function resolveWith(object) {
return function () {
return object;
};
}
// Invoke any save behavior introduced by the editor capability;
// this is introduced by EditableDomainObject which is
// used to insulate underlying objects from changes made
// during editing.
function doSave() {
return domainObject.getCapability("editor").save()
.then(resolveWith(domainObject));
return domainObject.getCapability("editor").save();
}
// Discard the current root view (which will be the editing
// UI, which will have been pushed atop the Browse UI.)
function returnToBrowse(object) {
if (object) {
object.getCapability("action").perform("navigate");
}
return object;
}
function hideBlockingDialog(object) {
function hideBlockingDialog() {
dialog.hide();
return object;
}
dialog.show();
return doSave()
.then(hideBlockingDialog)
.then(returnToBrowse)
.catch(hideBlockingDialog);
};

View File

@@ -0,0 +1,73 @@
/*****************************************************************************
* 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(
["./SaveAction"],
function (SaveAction) {
/**
* The "Save and Stop Editing" action performs a [Save action]{@link SaveAction}
* on the object under edit followed by exiting the edit user interface.
* @constructor
* @implements {Action}
* @memberof platform/commonUI/edit
*/
function SaveAndStopEditingAction(
dialogService,
context
) {
this.context = context;
this.domainObject = (context || {}).domainObject;
this.dialogService = dialogService;
}
/**
* Trigger a save operation and exit edit mode.
*
* @returns {Promise} a promise that will be fulfilled when
* cancellation has completed
* @memberof platform/commonUI/edit.SaveAndStopEditingAction#
*/
SaveAndStopEditingAction.prototype.perform = function () {
var domainObject = this.domainObject,
saveAction = new SaveAction(this.dialogService, this.context);
function closeEditor() {
return domainObject.getCapability("editor").finish();
}
return saveAction.perform()
.then(closeEditor)
.catch(closeEditor);
};
/**
* Check if this action is applicable in a given context.
* This will ensure that a domain object is present in the context,
* and that this domain object is in Edit mode.
* @returns true if applicable
*/
SaveAndStopEditingAction.appliesTo = SaveAction.appliesTo;
return SaveAndStopEditingAction;
}
);

View File

@@ -42,7 +42,6 @@ define([
$injector,
policyService,
dialogService,
creationService,
copyService,
context
) {
@@ -52,7 +51,6 @@ define([
};
this.policyService = policyService;
this.dialogService = dialogService;
this.creationService = creationService;
this.copyService = copyService;
}
@@ -166,11 +164,16 @@ define([
.then(resolveWith(object));
}
function commitEditingAfterClone(clonedObject) {
function saveAfterClone(clonedObject) {
return domainObject.getCapability("editor").save()
.then(resolveWith(clonedObject));
}
function finishEditing(clonedObject) {
return domainObject.getCapability("editor").finish()
.then(resolveWith(clonedObject));
}
function onFailure() {
hideBlockingDialog();
return false;
@@ -182,7 +185,8 @@ define([
.then(getParent)
.then(cloneIntoParent)
.then(undirtyOriginals)
.then(commitEditingAfterClone)
.then(saveAfterClone)
.then(finishEditing)
.then(hideBlockingDialog)
.catch(onFailure);
};

View File

@@ -9,7 +9,8 @@ define([], function () {
title: "Saving...",
hint: "Do not navigate away from this page or close this browser tab while this message is displayed.",
unknownProgress: true,
severity: "info"
severity: "info",
delay: true
});
};

View File

@@ -28,8 +28,8 @@ define(
* A capability that implements an editing 'session' for a domain
* object. An editing session is initiated via a call to .edit().
* Once initiated, any persist operations will be queued pending a
* subsequent call to [.save()](@link #save) or [.cancel()](@link
* #cancel).
* subsequent call to [.save()](@link #save) or [.finish()](@link
* #finish).
* @param transactionService
* @param domainObject
* @constructor
@@ -45,7 +45,7 @@ define(
/**
* Initiate an editing session. This will start a transaction during
* which any persist operations will be deferred until either save()
* or cancel() are called.
* or finish() are called.
*/
EditorCapability.prototype.edit = function () {
this.transactionService.startTransaction();
@@ -81,25 +81,25 @@ define(
};
/**
* Save any changes from this editing session. This will flush all
* pending persists and end the current transaction
* Save any unsaved changes from this editing session. This will
* end the current transaction and continue with a new one.
* @returns {*}
*/
EditorCapability.prototype.save = function () {
var domainObject = this.domainObject;
return this.transactionService.commit().then(function () {
domainObject.getCapability('status').set('editing', false);
var transactionService = this.transactionService;
return transactionService.commit().then(function () {
transactionService.startTransaction();
});
};
EditorCapability.prototype.invoke = EditorCapability.prototype.edit;
/**
* Cancel the current editing session. This will discard any pending
* Finish the current editing session. This will discard any pending
* persist operations
* @returns {*}
*/
EditorCapability.prototype.cancel = function () {
EditorCapability.prototype.finish = function () {
var domainObject = this.domainObject;
return this.transactionService.cancel().then(function () {
domainObject.getCapability("status").set("editing", false);

View File

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

View File

@@ -27,7 +27,8 @@ define(
[],
function () {
var ACTION_CONTEXT = { category: 'conclude-editing' };
var SAVE_ACTION_CONTEXT = { category: 'save' };
var OTHERS_ACTION_CONTEXT = { category: 'conclude-editing' };
/**
* Controller which supplies action instances for Save/Cancel.
@@ -35,12 +36,37 @@ define(
* @constructor
*/
function EditActionController($scope) {
// Maintain all "conclude-editing" actions in the present
// context.
function actionToMenuOption(action) {
return {
key: action,
name: action.getMetadata().name,
cssclass: action.getMetadata().cssclass
};
}
// Maintain all "conclude-editing" and "save" actions in the
// present context.
function updateActions() {
$scope.editActions = $scope.action ?
$scope.action.getActions(ACTION_CONTEXT) :
$scope.saveActions = $scope.action ?
$scope.action.getActions(SAVE_ACTION_CONTEXT) :
[];
$scope.saveActionsAsMenuOptions = $scope.saveActions.map(actionToMenuOption);
$scope.saveActionMenuClickHandler = function (clickedAction) {
clickedAction.perform();
};
$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

@@ -67,12 +67,17 @@ define(
editAction,
editorCapability;
function closeEditor() {
return editorCapability.finish();
}
function onSave() {
return editorCapability.save();
return editorCapability.save()
.then(closeEditor);
}
function onCancel() {
return editorCapability.cancel();
return closeEditor();
}
newModel.type = this.type.getKey();
@@ -85,9 +90,9 @@ define(
if (editAction) {
return editAction.perform();
} else if (editorCapability) {
//otherwise, use the save action
//otherwise, use the save as action
editorCapability.edit();
return newObject.getCapability("action").perform("save").then(onSave, onCancel);
return newObject.getCapability("action").perform("save-as").then(onSave, onCancel);
}
};

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
@@ -37,10 +37,7 @@ define(
function TransactionService($q, $log) {
this.$q = $q;
this.$log = $log;
this.transaction = false;
this.onCommits = [];
this.onCancels = [];
this.transactions = [];
}
/**
@@ -50,18 +47,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,24 +69,20 @@ 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];
};
/**
@@ -100,24 +93,8 @@ define(
* 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.");
}
}
return this.$q.all(promises).then(function () {
self.transaction = false;
self.onCommits = [];
self.onCancels = [];
});
var transaction = this.transactions.pop();
return transaction ? transaction.commit() : Promise.reject();
};
/**
@@ -129,28 +106,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 committing 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

@@ -63,7 +63,7 @@ define(
capabilities.editor = jasmine.createSpyObj(
"editor",
["save", "cancel", "isEditContextRoot"]
["save", "finish", "isEditContextRoot"]
);
capabilities.action = jasmine.createSpyObj(
"actionCapability",
@@ -105,7 +105,7 @@ define(
return !!capabilities[name];
});
capabilities.editor.cancel.andReturn(mockPromise(true));
capabilities.editor.finish.andReturn(mockPromise(true));
action = new CancelAction(actionContext);
@@ -130,8 +130,8 @@ define(
capabilities.action.perform.andReturn(mockPromise(true));
action.perform();
// Should have called cancel
expect(capabilities.editor.cancel).toHaveBeenCalled();
// Should have called finish
expect(capabilities.editor.finish).toHaveBeenCalled();
// Definitely shouldn't call save!
expect(capabilities.editor.save).not.toHaveBeenCalled();

View File

@@ -58,7 +58,7 @@ define(
);
mockEditor = jasmine.createSpyObj(
"editorCapability",
["edit", "isEditContextRoot", "cancel"]
["edit", "isEditContextRoot"]
);
capabilities = {
@@ -98,13 +98,6 @@ define(
expect(EditAction.appliesTo(actionContext)).toBe(false);
});
it ("cancels editing when user navigates away", function () {
action.perform();
expect(mockNavigationService.addListener).toHaveBeenCalled();
mockNavigationService.addListener.mostRecentCall.args[0]();
expect(mockEditor.cancel).toHaveBeenCalled();
});
it ("invokes the Edit capability on the object", function () {
action.perform();
expect(mockDomainObject.useCapability).toHaveBeenCalledWith("editor");

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

@@ -56,7 +56,7 @@ define(
);
mockEditorCapability = jasmine.createSpyObj(
"editor",
["save", "cancel", "isEditContextRoot"]
["save", "isEditContextRoot"]
);
mockActionCapability = jasmine.createSpyObj(
"actionCapability",
@@ -105,12 +105,6 @@ define(
expect(mockEditorCapability.save).toHaveBeenCalled();
});
it("navigates to the object after saving",
function () {
action.perform();
expect(mockActionCapability.perform).toHaveBeenCalledWith("navigate");
});
describe("a blocking dialog", function () {
var mockDialogHandle;

View File

@@ -0,0 +1,123 @@
/*****************************************************************************
* 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/actions/SaveAndStopEditingAction"],
function (SaveAndStopEditingAction) {
describe("The Save and Stop Editing action", function () {
// Some mocks appear unused because the
// underlying SaveAction that this action
// depends on is not mocked, so we mock some
// of SaveAction's own dependencies to make
// it run.
var mockDomainObject,
mockEditorCapability,
actionContext,
dialogService,
mockActionCapability,
capabilities = {},
action;
function mockPromise(value) {
return {
then: function (callback) {
return mockPromise(callback(value));
},
catch: function (callback) {
return mockPromise(callback(value));
}
};
}
beforeEach(function () {
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[
"getCapability",
"hasCapability",
"getModel",
"getOriginalObject"
]
);
mockEditorCapability = jasmine.createSpyObj(
"editor",
["save", "finish", "isEditContextRoot"]
);
mockActionCapability = jasmine.createSpyObj(
"actionCapability",
["perform"]
);
capabilities.editor = mockEditorCapability;
capabilities.action = mockActionCapability;
actionContext = {
domainObject: mockDomainObject
};
dialogService = jasmine.createSpyObj(
"dialogService",
["showBlockingMessage"]
);
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.getCapability.andCallFake(function (capability) {
return capabilities[capability];
});
mockDomainObject.getModel.andReturn({ persisted: 0 });
mockEditorCapability.save.andReturn(mockPromise(true));
mockEditorCapability.isEditContextRoot.andReturn(true);
action = new SaveAndStopEditingAction(dialogService, actionContext);
});
it("only applies to domain object with an editor capability", function () {
expect(SaveAndStopEditingAction.appliesTo(actionContext)).toBe(true);
expect(mockDomainObject.hasCapability).toHaveBeenCalledWith("editor");
mockDomainObject.hasCapability.andReturn(false);
mockDomainObject.getCapability.andReturn(undefined);
expect(SaveAndStopEditingAction.appliesTo(actionContext)).toBe(false);
});
it("only applies to domain object that has already been persisted", function () {
mockDomainObject.getModel.andReturn({ persisted: undefined });
expect(SaveAndStopEditingAction.appliesTo(actionContext)).toBe(false);
});
it("does not close the editor before completing the save", function () {
mockEditorCapability.save.andReturn(new Promise(function () {
}));
action.perform();
expect(mockEditorCapability.save).toHaveBeenCalled();
expect(mockEditorCapability.finish).not.toHaveBeenCalled();
});
it("closes the editor after saving", function () {
action.perform();
expect(mockEditorCapability.save).toHaveBeenCalled();
expect(mockEditorCapability.finish).toHaveBeenCalled();
});
});
}
);

View File

@@ -19,7 +19,7 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global describe,it,expect,beforeEach,jasmine*/
/*global describe,it,expect,beforeEach,jasmine,runs,waitsFor,spyOn*/
define(
["../../src/actions/SaveAsAction"],
@@ -33,7 +33,6 @@ define(
mockDialogService,
mockCopyService,
mockParent,
mockUrlService,
actionContext,
capabilities = {},
action;
@@ -78,10 +77,10 @@ define(
mockEditorCapability = jasmine.createSpyObj(
"editor",
["save", "cancel", "isEditContextRoot"]
["save", "finish", "isEditContextRoot"]
);
mockEditorCapability.cancel.andReturn(mockPromise(undefined));
mockEditorCapability.save.andReturn(mockPromise(true));
mockEditorCapability.finish.andReturn(mockPromise(true));
mockEditorCapability.isEditContextRoot.andReturn(true);
capabilities.editor = mockEditorCapability;
@@ -113,16 +112,11 @@ define(
]
);
mockUrlService = jasmine.createSpyObj(
"urlService",
["urlForLocation"]
);
actionContext = {
domainObject: mockDomainObject
};
action = new SaveAsAction(undefined, undefined, mockDialogService, undefined, mockCopyService, actionContext);
action = new SaveAsAction(undefined, undefined, mockDialogService, mockCopyService, actionContext);
spyOn(action, "getObjectService");
action.getObjectService.andReturn(mockObjectService);
@@ -156,6 +150,28 @@ define(
expect(SaveAsAction.appliesTo(actionContext)).toBe(false);
});
it("uses the editor capability to save the object", function () {
mockEditorCapability.save.andReturn(new Promise(function () {}));
runs(function () {
action.perform();
});
waitsFor(function () {
return mockEditorCapability.save.calls.length > 0;
}, "perform() should call EditorCapability.save");
runs(function () {
expect(mockEditorCapability.finish).not.toHaveBeenCalled();
});
});
it("uses the editor capability to finish editing the object", function () {
runs(function () {
action.perform();
});
waitsFor(function () {
return mockEditorCapability.finish.calls.length > 0;
}, "perform() should call EditorCapability.finish");
});
it("returns to browse after save", function () {
spyOn(action, "save");
action.save.andReturn(mockPromise(mockDomainObject));

View File

@@ -134,15 +134,15 @@ define(
it("commits the transaction", function () {
expect(mockTransactionService.commit).toHaveBeenCalled();
});
it("resets the edit state", function () {
expect(mockStatusCapability.set).toHaveBeenCalledWith('editing', false);
it("begins a new transaction", function () {
expect(mockTransactionService.startTransaction).toHaveBeenCalled();
});
});
describe("cancel", function () {
describe("finish", function () {
beforeEach(function () {
capability.edit();
capability.cancel();
capability.finish();
});
it("cancels the transaction", function () {
expect(mockTransactionService.cancel).toHaveBeenCalled();
@@ -158,7 +158,7 @@ define(
beforeEach(function () {
mockDomainObject.getModel.andReturn(model);
capability.edit();
capability.cancel();
capability.finish();
});
it("returns true if the object has been modified since it" +
" was last persisted", function () {

View File

@@ -19,22 +19,51 @@
* 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/controllers/EditActionController"],
function (EditActionController) {
describe("The Edit Action controller", function () {
var mockSaveActionMetadata = {
name: "mocked-save-action",
cssclass: "mocked-save-action-css"
};
function fakeGetActions(actionContext) {
if (actionContext.category === "save") {
var mockedSaveActions = [
jasmine.createSpyObj("mockSaveAction", ["getMetadata", "perform"]),
jasmine.createSpyObj("mockSaveAction", ["getMetadata", "perform"])
];
mockedSaveActions.forEach(function (action) {
action.getMetadata.andReturn(mockSaveActionMetadata);
});
return mockedSaveActions;
} else if (actionContext.category === "conclude-editing") {
return ["a", "b", "c"];
} else {
throw "EditActionController uses a context that's not covered by tests.";
}
}
var mockScope,
mockActions,
controller;
beforeEach(function () {
mockActions = jasmine.createSpyObj("action", ["getActions"]);
mockActions.getActions.andCallFake(fakeGetActions);
mockScope = jasmine.createSpyObj("$scope", ["$watch"]);
mockScope.action = mockActions;
controller = new EditActionController(mockScope);
});
function makeControllerUpdateActions() {
mockScope.$watch.mostRecentCall.args[1]();
}
it("watches scope that may change applicable actions", function () {
// The action capability
expect(mockScope.$watch).toHaveBeenCalledWith(
@@ -43,16 +72,34 @@ define(
);
});
it("populates the scope with grouped and ungrouped actions", function () {
mockScope.action = mockActions;
it("populates the scope with 'save' actions", function () {
makeControllerUpdateActions();
expect(mockScope.saveActions.length).toEqual(2);
});
mockActions.getActions.andReturn(["a", "b", "c"]);
it("converts 'save' actions to their menu counterparts", function () {
makeControllerUpdateActions();
var menuOptions = mockScope.saveActionsAsMenuOptions;
// Call the watch
mockScope.$watch.mostRecentCall.args[1]();
expect(menuOptions.length).toEqual(2);
expect(menuOptions[0].key).toEqual(mockScope.saveActions[0]);
expect(menuOptions[1].key).toEqual(mockScope.saveActions[1]);
menuOptions.forEach(function (option) {
expect(option.name).toEqual(mockSaveActionMetadata.name);
expect(option.cssclass).toEqual(mockSaveActionMetadata.cssclass);
});
});
// Should have grouped and ungrouped actions in scope now
expect(mockScope.editActions.length).toEqual(3);
it("uses a click handler to perform the clicked action", function () {
makeControllerUpdateActions();
var sampleSaveAction = mockScope.saveActions[0];
mockScope.saveActionMenuClickHandler(sampleSaveAction);
expect(sampleSaveAction.perform).toHaveBeenCalled();
});
it("populates the scope with other editing actions", function () {
makeControllerUpdateActions();
expect(mockScope.otherEditActions).toEqual(["a", "b", "c"]);
});
});
}

View File

@@ -103,7 +103,7 @@ define(
[
"edit",
"save",
"cancel"
"finish"
]
);
@@ -142,6 +142,7 @@ define(
});
describe("the perform function", function () {
var promise = jasmine.createSpyObj("promise", ["then"]);
beforeEach(function () {
capabilities.action.getActions.andReturn([mockEditAction]);
});
@@ -156,19 +157,20 @@ define(
expect(mockEditAction.perform).toHaveBeenCalled();
});
it("uses the save action if object does not have an edit action" +
it("uses the save-as action if object does not have an edit action" +
" available", function () {
capabilities.action.getActions.andReturn([]);
capabilities.action.perform.andReturn(mockPromise(undefined));
capabilities.editor.save.andReturn(promise);
action.perform();
expect(capabilities.action.perform).toHaveBeenCalledWith("save");
expect(capabilities.action.perform).toHaveBeenCalledWith("save-as");
});
describe("uses to editor capability", function () {
var promise = jasmine.createSpyObj("promise", ["then"]);
beforeEach(function () {
capabilities.action.getActions.andReturn([]);
capabilities.action.perform.andReturn(promise);
capabilities.editor.save.andReturn(promise);
});
it("to save the edit if user saves dialog", function () {
@@ -178,10 +180,10 @@ define(
expect(capabilities.editor.save).toHaveBeenCalled();
});
it("to cancel the edit if user cancels dialog", function () {
it("to finish the edit if user cancels dialog", function () {
action.perform();
promise.then.mostRecentCall.args[1]();
expect(capabilities.editor.cancel).toHaveBeenCalled();
expect(capabilities.editor.finish).toHaveBeenCalled();
});
});
});

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,64 @@ 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];
}
/**
*
* @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,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([
"./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");
});
});
});

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": [
@@ -490,7 +498,7 @@ define([
]
},
{
"key": "object-inspector",
"key": "legacy-object-inspector",
"template": objectInspectorTemplate
}
],

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%;
@@ -62,6 +61,9 @@ $ueDesktopMinW: 600px;
$ovrTopBarH: 45px;
$ovrFooterH: 24px;
$overlayMargin: 25px;
/*************** Progress Overlay */
$durEntryMs: 50ms;
$delayEntryMs: 100ms;
/*************** Items */
$ueBrowseGridItemLg: 200px;
$ueBrowseGridItemTopBarH: 20px;
@@ -109,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

@@ -82,7 +82,7 @@ input, textarea {
input[type="text"],
input[type="search"] {
vertical-align: baseline;
padding: 3px 5px;
padding: $inputTextP;
}
h1, h2, h3 {

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

@@ -22,6 +22,7 @@
@import "effects";
@import "global";
@import "glyphs";
@import "animations";
@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) {

View File

@@ -31,23 +31,10 @@
.has-control-bar {
$btnExportH: $btnFrameH;
.l-control-bar {
@include trans-prop-nice(opacity, $dur: 50ms);
opacity: 0;
display: none;
}
.l-view-section {
@include trans-prop-nice(top, $dur: 150ms, $delay: 50ms);
top: 0;
}
&:hover {
.l-control-bar {
@include trans-prop-nice(opacity, 150ms, 100ms);
opacity: 1;
}
.l-view-section {
@include trans-prop-nice(top, $dur: 150ms);
top: $btnExportH + $interiorMargin;
}
}
}
}

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

@@ -216,6 +216,7 @@ input[type="search"] {
.l-input-lg input[type="text"] { width: 100% !important; }
.l-input-med input[type="text"] { width: 200px !important; }
.l-input-sm input[type="text"] { width: 50px !important; }
.l-textarea-sm textarea { position: relative; height: 50px; }
.l-numeric input[type="text"] { text-align: right; }
.input-labeled {
@@ -295,8 +296,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 {
@@ -307,6 +306,10 @@ input[type="search"] {
font-size: 0.7em;
@include flex(0 0 1);
}
.t-object-alert {
display: none;
}
}
/******************************************************** PROGRESS BAR */
@@ -440,6 +443,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, 10%));
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;

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;
@@ -262,3 +277,7 @@
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

@@ -74,7 +74,7 @@
.s-image-main {
border: 1px solid transparent;
&.paused {
border-color: $colorPausedBg;
@extend .s-unsynced;
}
}

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

@@ -19,8 +19,17 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
.overlay {
font-size: 90%;
&.delayEntry100ms {
@include keyframes(fadeInFromNone) {
0% { display: none; opacity: 0; }
100% { display: block; opacity: 1; }
}
@include animation-delay($delayEntryMs);
@include animation(fadeInFromNone $durEntryMs ease-in);
}
.blocker {
background: $colorOvrBlocker;
z-index: 100;

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

@@ -116,6 +116,7 @@ $colorProgressBarAmt: $colorKey;
$progressBarHOverlay: 15px;
$progressBarStripeW: 20px;
$shdwStatusIc: rgba(black, 0.4) 0 1px 2px;
$animPausedPulseDur: 500ms;
// Selects
$colorSelectBg: $colorBtnBg;

View File

@@ -116,6 +116,7 @@ $colorProgressBarAmt: #0a0;
$progressBarHOverlay: 15px;
$progressBarStripeW: 20px;
$shdwStatusIc: rgba(white, 0.8) 0 0px 5px;
$animPausedPulseDur: 1s;
// Selects
$colorSelectBg: $colorBtnBg;

View File

@@ -46,6 +46,7 @@ define([
"./src/capabilities/MutationCapability",
"./src/capabilities/DelegationCapability",
"./src/capabilities/InstantiationCapability",
"./src/runs/TransactingMutationListener",
"./src/services/Now",
"./src/services/Throttle",
"./src/services/Topic",
@@ -78,6 +79,7 @@ define([
MutationCapability,
DelegationCapability,
InstantiationCapability,
TransactingMutationListener,
Now,
Throttle,
Topic,
@@ -252,6 +254,14 @@ define([
"pattern": "\\S+",
"required": true,
"cssclass": "l-input-lg"
},
{
"name": "Notes",
"key": "notes",
"property": "notes",
"control": "textarea",
"required": false,
"cssclass": "l-textarea-sm"
}
]
},
@@ -409,6 +419,12 @@ define([
}
}
],
"runs": [
{
"implementation": TransactingMutationListener,
"depends": ["topic", "transactionService"]
}
],
"constants": [
{
"key": "PERSISTENCE_SPACE",

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

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

@@ -0,0 +1,54 @@
/*****************************************************************************
* 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) {
var mutationTopic = topic('mutation');
mutationTopic.listen(function (domainObject) {
var persistence = domainObject.getCapability('persistence');
var wasActive = transactionService.isActive();
if (persistence.persisted()) {
if (!wasActive) {
transactionService.startTransaction();
}
transactionService.addToTransaction(
persistence.persist.bind(persistence),
persistence.refresh.bind(persistence)
);
if (!wasActive) {
transactionService.commit();
}
}
});
}
return TransactingMutationListener;
});

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) {
describe("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();
});
});
});
});
});
}
);

View File

@@ -76,17 +76,12 @@ define(
* completes.
*/
LocationCapability.prototype.setPrimaryLocation = function (location) {
var capability = this;
return this.domainObject.useCapability(
'mutation',
function (model) {
model.location = location;
}
).then(function () {
return capability.domainObject
.getCapability('persistence')
.persist();
});
);
};
/**

View File

@@ -63,14 +63,7 @@ define(
);
}
return parentObject.getCapability('composition').add(object)
.then(function (objectInNewContext) {
return parentObject.getCapability('persistence')
.persist()
.then(function () {
return objectInNewContext;
});
});
return parentObject.getCapability('composition').add(object);
};
return LinkService;

View File

@@ -33,7 +33,6 @@ define(
describe("instantiated with domain object", function () {
var locationCapability,
persistencePromise,
mutationPromise,
mockQ,
mockInjector,
@@ -49,10 +48,6 @@ define(
return domainObjectFactory({id: 'root'});
}
},
persistence: jasmine.createSpyObj(
'persistenceCapability',
['persist']
),
mutation: jasmine.createSpyObj(
'mutationCapability',
['invoke']
@@ -65,11 +60,6 @@ define(
mockObjectService =
jasmine.createSpyObj("objectService", ["getObjects"]);
persistencePromise = new ControlledPromise();
domainObject.capabilities.persistence.persist.andReturn(
persistencePromise
);
mutationPromise = new ControlledPromise();
domainObject.capabilities.mutation.invoke.andCallFake(
function (mutator) {
@@ -103,22 +93,17 @@ define(
expect(locationCapability.isOriginal()).toBe(false);
});
it("can persist location", function () {
var persistResult = locationCapability
it("can mutate location", function () {
var result = locationCapability
.setPrimaryLocation('root'),
whenComplete = jasmine.createSpy('whenComplete');
persistResult.then(whenComplete);
result.then(whenComplete);
expect(domainObject.model.location).not.toBeDefined();
mutationPromise.resolve();
expect(domainObject.model.location).toBe('root');
expect(whenComplete).not.toHaveBeenCalled();
expect(domainObject.capabilities.persistence.persist)
.toHaveBeenCalled();
persistencePromise.resolve();
expect(whenComplete).toHaveBeenCalled();
});

View File

@@ -139,20 +139,12 @@ define(
parentModel,
parentObject,
compositionPromise,
persistencePromise,
addPromise,
compositionCapability,
persistenceCapability;
compositionCapability;
beforeEach(function () {
compositionPromise = new ControlledPromise();
persistencePromise = new ControlledPromise();
addPromise = new ControlledPromise();
persistenceCapability = jasmine.createSpyObj(
'persistenceCapability',
['persist']
);
persistenceCapability.persist.andReturn(persistencePromise);
compositionCapability = jasmine.createSpyObj(
'compositionCapability',
['invoke', 'add']
@@ -172,7 +164,6 @@ define(
return new ControlledPromise();
}
},
persistence: persistenceCapability,
composition: compositionCapability
}
});
@@ -197,15 +188,6 @@ define(
.toHaveBeenCalledWith(object);
});
it("persists parent", function () {
linkService.perform(object, parentObject);
expect(addPromise.then).toHaveBeenCalled();
addPromise.resolve(linkedObject);
expect(parentObject.getCapability)
.toHaveBeenCalledWith('persistence');
expect(persistenceCapability.persist).toHaveBeenCalled();
});
it("returns object representing new link", function () {
var returnPromise, whenComplete;
returnPromise = linkService.perform(object, parentObject);
@@ -213,7 +195,6 @@ define(
returnPromise.then(whenComplete);
addPromise.resolve(linkedObject);
persistencePromise.resolve();
compositionPromise.resolve([linkedObject]);
expect(whenComplete).toHaveBeenCalledWith(linkedObject);
});

View File

@@ -42,11 +42,19 @@ define(
function addWorker(worker) {
var key = worker.key;
if (!workerUrls[key]) {
workerUrls[key] = [
worker.bundle.path,
worker.bundle.sources,
worker.scriptUrl
].join("/");
if (worker.scriptUrl) {
workerUrls[key] = [
worker.bundle.path,
worker.bundle.sources,
worker.scriptUrl
].join("/");
} else if (worker.scriptText) {
var blob = new Blob(
[worker.scriptText],
{type: 'application/javascript'}
);
workerUrls[key] = URL.createObjectURL(blob);
}
sharedWorkers[key] = worker.shared;
}
}

View File

@@ -49,17 +49,11 @@ define(
var domainObject = this.domainObject,
now = this.now;
function doPersist() {
var persistence = domainObject.getCapability('persistence');
return persistence && persistence.persist();
}
function setTimestamp(model) {
model.timestamp = now();
}
return domainObject.useCapability('mutation', setTimestamp)
.then(doPersist);
return domainObject.useCapability('mutation', setTimestamp);
};
return AbstractStartTimerAction;

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