Compare commits

...

615 Commits

Author SHA1 Message Date
akhenry
8f155b1423 Merge pull request #472 from nasa/nem470
Review and integrate nem470
2016-01-13 09:05:53 -08:00
Charles Hacskaylo
6bdcce033c [Frontend] Fixed z-index of .primary-pane
open #470
Cherry-pick this commit into nem_prototype branch;
2016-01-11 15:17:12 -08:00
Henry
2a74117294 merging markup from prototype 2016-01-11 14:52:45 -08:00
Henry
f8aa123122 [New Edit Mode] Merged styles and markup from prototype 2016-01-11 14:42:49 -08:00
Henry
6d4a20c07a Adding elements pane 2016-01-11 13:33:56 -08:00
Henry
2c4d53883a [New Edit Mode] Added additional tests for Seamless Edit Mode #464 2016-01-11 13:07:56 -08:00
Henry
c71aa43581 [New Edit Mode] “Seamless” Edit Mode #464
* html changes and Edit Action
* Fixed browse controller to correctly navigate to non-editable object
* Added save and cancel actions
2016-01-08 14:25:58 -08:00
akhenry
9cc03123b1 Merge pull request #402 from nasa/open209
[Clocks/Timers] Update code style
2016-01-06 14:07:15 -08:00
Henry
a6ecda9cab Resolved conflict 2016-01-06 14:06:28 -08:00
Henry
b20488e77d Merged conflict 2016-01-06 14:05:40 -08:00
akhenry
05a909f66f Merge pull request #451 from nasa/open116
[Time Conductor] Improve test coverage
2016-01-06 13:26:33 -08:00
Victor Woeltjen
2436c32e6d [Time Conductor] Split test cases
Verify table structure separately from table contents
per code review feedback,
https://github.com/nasa/openmctweb/pull/451/files#r48999214
2016-01-06 13:00:16 -08:00
akhenry
02c984a0bc Merge pull request #69 from nasa/api-redesign
[API] API Redesign Goals and Proposals
2016-01-06 11:21:05 -08:00
akhenry
01772e4020 Merge pull request #452 from nasa/open1400
[Common UI] Test mct-split-pane, mct-splitter
2016-01-06 11:11:27 -08:00
Victor Woeltjen
019e04f9ab Merge pull request #434 from nasa/open433
[Documentation] Code example in bar graph tutorial incorporates text from the following paragraph
2016-01-05 16:46:31 -08:00
Victor Woeltjen
668b508bb8 [API] Add links to related issues 2016-01-05 16:37:24 -08:00
Victor Woeltjen
7d24c5319b [API] Bring in consensus
Bring over tables indicating consensus/decisions about
proposed API changes from
https://github.com/nasa/openmctweb/issues/263
2016-01-05 16:10:57 -08:00
Victor Woeltjen
83bdf7343d [Common UI] Test mct-splitter
WTD-1400
2016-01-05 10:14:25 -08:00
Victor Woeltjen
46e524a3b6 [Common UI] Begin testing mct-splitter
WTD-1400
2016-01-04 14:25:43 -08:00
Victor Woeltjen
22b7bb07aa [Common UI] Add mct-split-pane test cases
...sufficient for full line coverage. WTD-1400
2016-01-04 12:19:33 -08:00
Victor Woeltjen
7a25733be0 [Common UI] Remove obsolete split-pane container
Remove obsolete split-pane container and associated
controller; this behavior is now handled by the
mct-split-pane directive.

Part of updates to tests for the mct-split-pane
directive, WTD-1400
2016-01-04 11:34:24 -08:00
Victor Woeltjen
b9146fbeac [Time Conductor] Test TelemetryHandle.getDatum
Test ability to look up datum object by index (used to
support evaluation of limit state in Fixed Position and
similar single-value views while time conducting.)
2015-12-30 10:23:02 -08:00
Victor Woeltjen
a49deb5ab1 Merge remote-tracking branch 'github/master' into open116
Merge in latest from master into topic branch for
https://github.com/nasa/openmctweb/issues/116

Conflicts:
	platform/features/layout/test/FixedControllerSpec.js
	platform/features/plot/test/PlotControllerSpec.js
2015-12-30 10:15:05 -08:00
Victor Woeltjen
9b63a63efc Merge pull request #379 from nasa/open1337
[Limits] Add test cases for limits
2015-12-30 10:11:27 -08:00
Victor Woeltjen
2358541d91 [Time Conductor] Update RangeColumn spec
Update RangeColumn spec. Changes appear to have been related
to limits (WTD-1337), but making changes in the context of
updating tests for time conductor,
https://github.com/nasa/openmctweb/issues/116
2015-12-30 10:10:23 -08:00
Victor Woeltjen
38b5756d8d [Time Conductor] Verify plot bounds retention
Verify that the domain axis of a plot retains bounds from
the time conductor, instead of doing its default behavior
of fitting to the data.
2015-12-30 10:04:04 -08:00
Victor Woeltjen
c436bcce0a [Time Conductor] Test updated fixed position behavior
Verify interactions from FixedControllers on events
issued by the time conductor.
2015-12-30 09:29:24 -08:00
Victor Woeltjen
8e68914b56 Merge pull request #412 from nasa/open228
[Documentation] Add text to main page #228
2015-12-30 09:05:30 -08:00
Victor Woeltjen
f0a5a836d6 Merge pull request #421 from nasa/open336
Review and integrate open336
2015-12-30 09:04:21 -08:00
Victor Woeltjen
2b0f6dd577 Merge pull request #437 from nasa/open431
Review and integrate open431
2015-12-30 09:02:42 -08:00
Victor Woeltjen
30fec7c2ac [Time Conductor] Test mct-click-elsewhere 2015-12-29 15:37:09 -08:00
Victor Woeltjen
3f4ed46c1c [Time Conductor] More tests for date-time picker
Sufficient for 100% line coverage.
2015-12-29 15:26:18 -08:00
Victor Woeltjen
ba4c66866c [Time Conductor] Add tests for date-time picker 2015-12-29 13:59:06 -08:00
Victor Woeltjen
fcee30c27e [Mobile] Test agentService.isTouch 2015-12-29 12:58:24 -08:00
Victor Woeltjen
560825cc86 [Mobile] Test DeviceMatchers 2015-12-29 12:55:17 -08:00
Victor Woeltjen
2df61998ab [Mobile] Detect touch support 2015-12-29 12:43:46 -08:00
Victor Woeltjen
91b42fc0cc [Mobile] Test DeviceClassifier 2015-12-29 12:41:38 -08:00
Victor Woeltjen
5eac0bc5d9 [Mobile] Include classifier as runs extension
...to ensure that body gets device-related classes applied
when the application starts.
2015-12-29 12:02:03 -08:00
Victor Woeltjen
d397f0f283 [Mobile] Add classes to body
Add classes describing device characteristics to the
body of the current document at start-up. Refactor
device matchers out of the mct-device directive for
reuse and consistency here.

https://github.com/nasa/openmctweb/issues/169
2015-12-29 11:59:41 -08:00
Victor Woeltjen
0aae2c7b2c [API Redesign] Add clarifying comments 2015-12-24 15:50:28 -08:00
Victor Woeltjen
b5d7dbc088 [API Redesign] Add notes about 1.0.0 release
Particularly, closing API-related issues; need for this
mentioned at
https://github.com/nasa/openmctweb/issues/264#issuecomment-165921056
2015-12-24 15:21:14 -08:00
Victor Woeltjen
5921883325 [API Redesign] Add activity diagram 2015-12-24 15:13:44 -08:00
Victor Woeltjen
75d7240476 [API Redesign] Complete text of refactoring plan 2015-12-24 14:07:04 -08:00
Victor Woeltjen
9d71715c43 [API Redesign] Begin planning API Refactoring
https://github.com/nasa/openmctweb/issues/264
2015-12-24 13:54:14 -08:00
Victor Woeltjen
b986a0a38d Address decorability of role validation 2015-12-22 14:33:33 -08:00
Victor Woeltjen
0d2b5160ac Add section on roles 2015-12-22 13:15:00 -08:00
Victor Woeltjen
c99b6df9fc Update description of imperative plugins 2015-12-22 12:34:51 -08:00
Victor Woeltjen
9c4c020f54 [Build] Bump version number
Bump version number, add SNAPSHOT status to start
sprint Bradbury.
2015-12-18 12:36:47 -08:00
Victor Woeltjen
08c4302011 [Build] Bump version number to close release 2015-12-18 12:21:11 -08:00
Victor Woeltjen
5f96861c44 [Duplicate] Handle single-element ID arrays
Avoid type coercion related errors when testing to
see if a value is an ID that needs to be remapped.
2015-12-17 15:10:15 -08:00
Victor Woeltjen
995d71f901 [Duplicate] Add test case
Add test case for single-element string arrays, to
replicate bug around type coercion.

https://github.com/nasa/openmctweb/issues/444
2015-12-17 15:07:16 -08:00
Pete Richards
82e4a53472 Merge remote-tracking branch 'github-open/open-warp1596b' into open-master 2015-12-17 14:20:18 -08:00
Charles Hacskaylo
e7a41061c6 [Frontend] Hiding filter input in autoflow element when in Layout
open #425
(cherry picked from commit 119613e)
2015-12-17 14:11:39 -08:00
Victor Woeltjen
4848a61e21 Merge pull request #439 from nasa/open428
Fixed bug in copying #428
2015-12-17 13:55:55 -08:00
Henry
6302e45c10 Fixed bug in copying #428 2015-12-17 13:47:31 -08:00
Victor Woeltjen
451157b653 Merge pull request #432 from nasa/open426
Review and integrate open426
2015-12-17 13:38:45 -08:00
Charles Hacskaylo
ae89a169d0 [Frontend] s-status-pending sanding and polishing
open #431
Cleanups, comment removal; Inspector location items
with s-status-pending tweaked;
Fixed grid-item background class;
2015-12-17 12:24:57 -08:00
Charles Hacskaylo
941d0d0057 [Frontend] Tree sanding and polishing
open #431
Fixed vertical margins problem in tree and search results;
2015-12-17 10:49:39 -08:00
Charles Hacskaylo
0296cfe3c1 [Frontend] Mobile sanding and polishing
open #431
Fixed hiding of "search by type" in phone only;
Fixed search-input magnify glass z-index value;
Fixed tree search results heights;
2015-12-17 10:21:06 -08:00
Pete Richards
f55168d1ac Merge remote-tracking branch 'github-open/open-warp1596' into open-master 2015-12-17 09:39:38 -08:00
Charles Hacskaylo
3c4fb8c43d [Frontend] Final final sanding on label flex-box conversion
open #431
Tweaks for labels in Inspector;
2015-12-16 17:38:02 -08:00
Charles Hacskaylo
ed7e16d341 [Frontend] More sanding on label flex-box conversion
open #431
Moved object-label classes into their own include;
Fixing object-label in edit Elements pool and
Inspector; mixin refactoring;
2015-12-16 17:32:43 -08:00
Charles Hacskaylo
9dc958b952 [Frontend] Final sanding on label flex-box conversion
open #431
Fixed positioning for l-icon-link when applied to
inspection-location object;
2015-12-16 16:49:16 -08:00
Charles Hacskaylo
ed3ee1099d [Frontend] Final sanding on adding s-status-pending
open #431
Italicized text; Comments cleaned up;
To-do: fix regressed label elements in Inspector;
2015-12-16 16:38:06 -08:00
Charles Hacskaylo
7fb506d4df Merge branch 'open431' of https://github.com/nasa/openmctweb into open431 2015-12-16 16:10:06 -08:00
Charles Hacskaylo
67707678a8 Merge branch 'master' of https://github.com/nasa/openmctweb into open431 2015-12-16 16:08:23 -08:00
Charles Hacskaylo
930b13f9a0 [Frontend] Added s-status-pending spinner to tree-item
open #431
Refinements of tree item sizes and spacing;
Polished spinner-related classes;
Moved l-icon-link icon into -glyph element;
2015-12-16 16:06:31 -08:00
Charles Hacskaylo
b59fc43038 [Frontend] Converting tree items and labels to flex-box
open #431
Mobile fixes complete;
2015-12-16 14:52:19 -08:00
Pete Richards
4579b4fabc [API] Remove orphan paragraph, update spacing 2015-12-16 13:29:42 -08:00
Charles Hacskaylo
9b32461240 [Frontend] Converting tree items and labels to flex-box
open #431
In-progress fixing mobile;
Mostly done, link icon in mobile needs
better positioning;
2015-12-16 13:26:30 -08:00
Pete Richards
7dc067741b [API] Add Proposals and feedback
Add proposals interspersed with narrative.  As with all proposals, there is
room for details to be fleshed out.

https://github.com/nasa/openmctweb/issues/261
2015-12-16 12:58:07 -08:00
Charles Hacskaylo
d1f617a54e [Frontend] Converting tree items and labels to flex-box
open #431
In-progress fixing mobile;
Removed desktop and mobile-specific hide/show;
2015-12-16 11:50:46 -08:00
Victor Woeltjen
c4f99a6cab Merge pull request #435 from nasa/open428
[Copy] Duplication of layouts does not retain position and size of all elements. #428
2015-12-16 11:45:22 -08:00
Henry
83e77303aa [Copy] Duplication of layouts does not retain position and size of all elements. #428 2015-12-16 11:11:20 -08:00
Henry
29a1c7dc5d [Documentation] Code example in bar graph tutorial incorporates text from the following paragraph #433 2015-12-15 21:58:21 -08:00
Charles Hacskaylo
65a1d7495d [Frontend] Converting tree items and labels to flex-box
open #431
In-progress;
TO-DO: need to fix mobile styles!
2015-12-15 18:17:06 -08:00
Charles Hacskaylo
a98ab958c9 [Frontend] Adding s-status-pending classes to tree item labels
open #431
In-progress;
2015-12-15 17:06:47 -08:00
Charles Hacskaylo
6e1cadf338 [Frontend] Fixed splitter and related elements when collapsed
open #426
Adds CSS to turn off pointer-events for the splitter, treeview
and inspect elements when they are in a collapsed state;
2015-12-15 15:47:32 -08:00
Charles Hacskaylo
83a9b984e5 [Frontend] Recompile CSS after integration of open1596
open #425
warp#1596
Recompile CSS after integration of cherry-pick from open1596;
2015-12-14 15:28:48 -08:00
Charles Hacskaylo
978df93ffd [Frontend] Cherry-picking platform CSS mods for autoflow view
warp #1596
open #425
Changes to autoflow styles, particularly in header;
Cleanup in effects.scss; CSS to be re-compiled;
(cherry picked from commit 5848077)
2015-12-14 15:22:08 -08:00
Charles Hacskaylo
33b1c1689c [Frontend] Added classes for no-collapse indicator
open #304
Added classes string and related classes to ClockIndicator;
2015-12-11 15:49:50 -08:00
akhenry
0cfc070f3c Merge pull request #394 from nasa/open332
[Duplicate] Rewrite identifiers in clones
2015-12-11 15:06:34 -08:00
Charles Hacskaylo
21fd16ddf1 [Frontend] Delay added to expanded status indicator collapse
open #336
2015-12-11 15:02:10 -08:00
akhenry
ce94db0a4b Merge pull request #415 from nasa/open228b
[Documentation] Tweak spelling / phrasing
2015-12-11 12:08:12 -08:00
Victor Woeltjen
0d894a9f39 [Documentation] Tweak spelling / phrasing
* Add spaces to 'Open MCT Web' for consistency
* Use term 'platform' instead of 'framework' for consistency
  with the developer guide
* Avoid the term 'capabilities' (could be ambiguous in the context
  of other documentation)
* Use canonical casing for JSDoc and JavaScript
* Simplify phrasing of first sentence
* Change casing of 'Developer Guide' for consistency with
  other bullets

From review of https://github.com/nasa/openmctweb/pull/412
2015-12-11 11:54:23 -08:00
akhenry
5ad150a17e Merge pull request #413 from nasa/open411
[Documentation] Fix type declaration
2015-12-11 11:28:38 -08:00
Henry
b6acdb12ec Removed superfluous function 2015-12-11 11:13:00 -08:00
Henry
604b29096d [Documentation] #228 added inline comment about TOC suppression 2015-12-11 11:13:00 -08:00
Henry
6200ceddf8 [Documentation] Add text to main page #228 2015-12-11 11:12:42 -08:00
Victor Woeltjen
de88bf94d4 [Documentation] Fix type declaration
Rephrase parameter type to something JSDoc can parse.

https://github.com/nasa/openmctweb/issues/411
2015-12-11 10:51:16 -08:00
Victor Woeltjen
8077cdb834 [Clocks/Timers] Make $scope available
...to methods of TimerController
2015-12-09 12:41:29 -08:00
Victor Woeltjen
7871af07c4 [Clocks/Timers] Fix parent constructor invocations 2015-12-09 12:40:21 -08:00
Victor Woeltjen
714ae3b9dc [Clocks/Timers] Update remaining classes
Complete code style changes for Clocks/Timers.
2015-12-09 12:39:01 -08:00
Victor Woeltjen
27fa56d838 [Clocks/Timers] Update code style for controllers 2015-12-09 12:33:11 -08:00
Victor Woeltjen
e30a82432d [Clocks/Timers] Update code style for actions
https://github.com/nasa/openmctweb/issues/209
2015-12-09 12:17:32 -08:00
Victor Woeltjen
19f07aa398 [Duplicate] Add trailing newline 2015-12-08 16:34:36 -08:00
Victor Woeltjen
46f9b31cff [Duplicate] Test rewriting of identifiers 2015-12-08 16:27:46 -08:00
Victor Woeltjen
e32feb29e2 [Duplicate] Rewrite identifiers in clones
Traverse object models of clones and rewrite domain object
identifiers that have changed during duplication.

Addresses https://github.com/nasa/openmctweb/issues/332
2015-12-08 15:45:45 -08:00
Pete Richards
89a93e2966 Merge remote-tracking branch 'github-open/open384' into open-master 2015-12-08 15:18:21 -08:00
Victor Woeltjen
038322e9aa [Layout] Update raw positions on drop
When handling a drop into the layout, store the panel's
new position to the LayoutController's internal table of
raw positions (in addition to writing it to the configuration.)

Avoids https://github.com/nasa/openmctweb/issues/384
2015-12-08 15:08:30 -08:00
Victor Woeltjen
6cef663db5 [Representation] Add ending newline 2015-12-08 13:43:41 -08:00
Victor Woeltjen
b2f5861458 [Representation] Test template prefetcher 2015-12-08 13:29:11 -08:00
Victor Woeltjen
f8809ce67f [Representation] Also prefetch containers 2015-12-08 13:06:24 -08:00
Victor Woeltjen
3c97eb6014 [Representation] Remove obsolete template definition 2015-12-08 12:59:41 -08:00
Victor Woeltjen
3498b0a50a [Representation] Prefetch templates
...to ensure that dialogs et al can be displayed, even
after loss of network connectivity.

https://github.com/nasa/openmctweb/issues/383
2015-12-08 12:59:18 -08:00
Victor Woeltjen
14c5a817a7 [Limits] Test exposure of datum
...which will be used to evaluate limits.
2015-12-07 13:22:40 -08:00
Victor Woeltjen
258c5d95e6 [Limits] Test PlotLimitTracker 2015-12-07 12:58:56 -08:00
Victor Woeltjen
30a8ba5c11 [Limits] Test limit usage in PlotController
WTD-1337
2015-12-07 12:45:40 -08:00
Victor Woeltjen
33c372765f [Limits] Test limit usage from Fixed Position
WTD-1337
2015-12-07 12:33:29 -08:00
akhenry
ed7e0d8b0a Merge pull request #376 from nasa/open169b
Review and integrate open169b
2015-12-04 16:29:32 -08:00
Charles Hacskaylo
f3828ba516 [Frontend] Adjusted desktop breakpoint
open #169
2015-12-04 15:55:32 -08:00
akhenry
2a48c25453 Merge pull request #375 from nasa/open137
Show warning for unsupported browsers
2015-12-04 15:43:23 -08:00
akhenry
096da0cb94 Merge pull request #347 from nasa/open259b
[Time Conductor] Don't update model while typing (v2)
2015-12-04 15:34:03 -08:00
Charles Hacskaylo
ca8a07e1ae Merge remote-tracking branch 'github/open169a' into open169b 2015-12-04 15:33:49 -08:00
Victor Woeltjen
c02f965460 [Time Conductor] Remove unused property
...from structure passed into date-time field. Note in
code review, https://github.com/nasa/openmctweb/pull/347
2015-12-04 15:19:34 -08:00
Victor Woeltjen
5f440bb6de Merge pull request #372 from nasa/open58_notification
[Persistence] Errors in persistence (after creating/modifying objects) should be visible to user #58
2015-12-04 15:15:29 -08:00
Victor Woeltjen
fc729279ec [Common UI] Add spec for unsupported browser warning 2015-12-04 15:11:40 -08:00
akhenry
dd0f9ab74e Merge pull request #349 from nasa/open1573
[Documentation] Document test process
2015-12-04 14:34:59 -08:00
Victor Woeltjen
d2a4a85e04 [Common UI] Test agentService.isBrowser 2015-12-04 14:12:00 -08:00
Victor Woeltjen
37890280ae [Common UI] Only show warning for unsupported browsers 2015-12-04 14:08:42 -08:00
Victor Woeltjen
a6ceae4045 [Common UI] Show warning at startup
Show a warning about unsupported browsers at startup,
https://github.com/nasa/openmctweb/issues/137
2015-12-04 13:53:45 -08:00
akhenry
3447e735dc Merge pull request #362 from nasa/open346
[Entanglement] Add "Set Primary Location" action
2015-12-04 13:48:27 -08:00
Victor Woeltjen
989c937ce1 [Documentation] Fix typo in HTML entity 2015-12-04 13:29:19 -08:00
Victor Woeltjen
e0608ddee0 [Documentation] Simplify Author Checklist
...as discussed in https://github.com/nasa/openmctweb/pull/349
2015-12-04 13:25:20 -08:00
akhenry
b35224061f Merge pull request #374 from nasa/open305
[Edit] Return a promise from editable persistence capability
2015-12-04 12:44:08 -08:00
Victor Woeltjen
b25576aed8 [Documentation] Sketch initial test procedures
Sketch initial test procedures; add explanation on the difference between
sprint and release testing.
2015-12-04 12:20:05 -08:00
Victor Woeltjen
d5f054e328 [Edit] Test return type
...from the edit-mode-wrapped persistence capability.
2015-12-04 11:20:19 -08:00
Henry
eb4959cf49 [persistence] #58 renamed alertService to notificationService 2015-12-04 10:45:49 -08:00
Victor Woeltjen
cce415fc51 Merge pull request #371 from nasa/open338
#338 [Copy] Copying an object with telemetry from the data dictionary results in a number of unknown objects in copied tree
2015-12-04 09:46:24 -08:00
Henry
00f96c314a [persistence] #58 added tests for notification on persistence error 2015-12-03 20:32:03 -08:00
Victor Woeltjen
fefd27162c [Entanglement] Allow cross-space linking
Allow links across spaces; only disallow move or copy.
Addresses WTD-1587
2015-12-03 20:32:03 -08:00
Henry
b388c76e45 [copy] #338 Modified check to set object location, added setLocation flag, Removed unused parameter 2015-12-03 19:00:44 -08:00
akhenry
aaeaf3a096 Merge pull request #370 from nasa/open369
[Performance] Fix usages of $interval
2015-12-03 18:31:17 -08:00
Henry
57efe4e0d1 Removed UUID reference 2015-12-03 17:10:28 -08:00
Victor Woeltjen
dd4dbc9326 [Performance] Update spec for ElasticIndicator
...to reflect changes in  call to reduce digest frequency.
2015-12-03 16:45:30 -08:00
Henry
6aa77ff468 #338 fixed failing test 2015-12-03 16:41:06 -08:00
Henry
f8099550bd [Copy] #338 updated code style in CreationPolicy 2015-12-03 16:22:45 -08:00
Henry
96249e6bcc Removed redundant line in test spec 2015-12-03 15:51:27 -08:00
Henry
6e391098a3 Fixed jslint error 2015-12-03 15:32:26 -08:00
Henry
baec0f9719 #338 added new test case for creation of links when object type is not createable 2015-12-03 15:28:07 -08:00
Henry
6aab9f4e34 Added test for linking 2015-12-03 14:47:42 -08:00
Victor Woeltjen
1bf73935e4 [Performance] Add test case for mct-split-pane 2015-12-03 13:56:57 -08:00
Victor Woeltjen
49e51d0a62 [Performance] Update mct-chart spec 2015-12-03 13:39:37 -08:00
Victor Woeltjen
3e7bc2f37f [Performance] Don't invoke apply from indicator
Don't invoke apply while polling from ElasticSearch
indicator; let the corresponding  request trigger
this.
2015-12-03 13:29:54 -08:00
Victor Woeltjen
0f56fd2561 [Performance] Only invoke apply on size changes
...as detected from mct-chart.
2015-12-03 13:28:32 -08:00
Victor Woeltjen
9f0114eb39 [Performance] Don't invoke apply from MCTSplitPane
Don't invoke apply on every  from MCTSplitPane
(this had been intended behavior, but argument was misplaced.)
2015-12-03 13:27:59 -08:00
Victor Woeltjen
4b82893c36 [Performance] Improve digests/sec indication
Don't let past digest counts bias current rate shown;
https://github.com/nasa/openmctweb/issues/369
2015-12-03 13:27:19 -08:00
Henry
734e979c94 #338 Fixed failing tests after refactor 2015-12-03 12:49:54 -08:00
akhenry
983973843e Merge pull request #363 from nasa/open302
[Representation] Check full path when comparing domain objects
2015-12-03 10:01:35 -08:00
Henry
3b427c31a2 Fixed error with not properly referenced 2015-12-02 19:18:50 -08:00
Henry
cee0ecf0ef Removed use of composition and mutation because they trigger the search indexer too early and it tries to retrieve objects that have not been persisted yet 2015-12-02 19:10:10 -08:00
Henry
8e3c5db3bf #338 fixed incorrect 'allow' function specification in CreationPolicy 2015-12-02 14:14:04 -08:00
Henry
11d8daf3ed #338 Fixed incorrect specification of CreationPolicy in bundle.json 2015-12-02 14:07:08 -08:00
Henry
9953e16415 #338 Copy now using target persistence space 2015-12-02 14:06:22 -08:00
Henry
fe600de0f7 [Copy] #338 added CreationPolicy and appropriate tests, amended CreateActionProvider, and updated existing tests 2015-12-02 11:28:49 -08:00
Victor Woeltjen
386f1f20ff [Representation] Test switching between links
Add test case to verify that representation gets refreshed
when switching among two linked instances of the same
domain object.
2015-12-02 10:49:18 -08:00
Victor Woeltjen
5e07951892 [Representation] Handle missing context
Handle missing context when generating an ID path;
this is missing in the root object.
2015-12-02 10:23:11 -08:00
Victor Woeltjen
2514e44083 [Representation] Check full ID path
...when determining if a representation needs to be
refreshed. Avoids representations becoming stale
when switching or navigating among linked instances
of the same domain object.

https://github.com/nasa/openmctweb/issues/302
2015-12-02 10:21:00 -08:00
Henry
20d9c7158e Added jslint es5 mode 2015-12-01 22:40:50 -08:00
Henry
d8e319ebf8 Fixing jslint errors 2015-12-01 22:36:23 -08:00
Henry
a39cbbd917 Fixing jslint errors 2015-12-01 22:35:28 -08:00
Henry
8df27a1c05 Fixing jslint errors 2015-12-01 22:34:26 -08:00
Henry
26cf9c14f4 [Persistence] Errors in persistence (after creating/modifying objects) should be visible to user #58 2015-12-01 22:03:53 -08:00
Victor Woeltjen
03edd26e17 [Edit] Return promise from editable persistence
https://github.com/nasa/openmctweb/issues/305
2015-12-01 16:45:08 -08:00
Victor Woeltjen
571f6d183a [Entanglement] Expose Set Primary Location 2015-12-01 16:26:19 -08:00
Victor Woeltjen
1292e39c46 [Entanglement] Implement Set Primary Location 2015-12-01 16:20:30 -08:00
Victor Woeltjen
6fe3f82fb1 [Entanglement] Add test for Set Primary Location
https://github.com/nasa/openmctweb/issues/346
2015-12-01 15:59:37 -08:00
Charles Hacskaylo
da8fb99e82 [Frontend] Fixing bad breakpoints for tablet vs. desktop
open #169
2015-11-30 15:57:45 -08:00
Victor Woeltjen
c8d77bc2db [Entanglement] Allow cross-space linking
Allow links across spaces; only disallow move or copy.
Addresses WTD-1587
2015-11-30 15:27:10 -08:00
Victor Woeltjen
b5e52fce75 [Time Conductor] Remove redundant test block 2015-11-27 14:48:48 -08:00
Victor Woeltjen
3afcb52934 [Time Conductor] Use ng-blur from template 2015-11-27 14:35:51 -08:00
Victor Woeltjen
677b0cffec [Time Conductor] Test form isolation
Verify that form inputs are ignored until some explicit trigger
2015-11-27 14:33:35 -08:00
Victor Woeltjen
248bc68f0d [Time Conductor] Test restoration of old values
...and clarify name of the function in scope which does this.
2015-11-27 14:23:30 -08:00
Victor Woeltjen
02050fa3ef [Time Conductor] Document ng-blur on mct-control 2015-11-27 14:02:16 -08:00
Victor Woeltjen
57d23c3696 [Time Conductor] Add missing license header 2015-11-27 12:37:51 -08:00
Victor Woeltjen
8babfc5ca9 [Time Conductor] Propogate blur from text field 2015-11-27 12:37:23 -08:00
Victor Woeltjen
271b5d1a73 [Time Conductor] Test choices via picker
...to ensure that they trigger blur events. Also, test changes
via text entry to ensure that they don't (the template is responsible
for this.)
2015-11-27 12:36:40 -08:00
Victor Woeltjen
7d4e7a0925 [Time Conductor] Allow ng-blur on mct-controls 2015-11-27 12:29:53 -08:00
Victor Woeltjen
92f5d5f190 [Documentation] Replace redundant docs with link 2015-11-27 12:00:25 -08:00
Victor Woeltjen
1731b985fc [Documentation] Fix broken markdown tag 2015-11-27 11:30:55 -08:00
Victor Woeltjen
bd4590ad9d [Documentation] Update terminology
Update terminology in Development Cycle to reflect
descriptions in Test Plan.
2015-11-27 11:22:11 -08:00
Victor Woeltjen
55fc60ec82 [Documentation] Describe long-duration testing 2015-11-27 11:15:13 -08:00
Victor Woeltjen
ab075e9ad8 [Documentation] Complete test plan 2015-11-27 11:08:47 -08:00
Victor Woeltjen
3ac1710d83 [Documentation] Document evaluation criteria
...for per-release and per-sprint testing. WTD-1573
2015-11-27 10:58:16 -08:00
Victor Woeltjen
730878938e [Documentation] Document pre-merge testing 2015-11-27 10:39:25 -08:00
Victor Woeltjen
3fd4304de1 Merge pull request #345 from nasa/open32
[Layout] Layout rebuilds after resize/reposition #32
2015-11-27 09:59:01 -08:00
Henry
db7224486c [Layout] Layout rebuilds after resize/reposition - Fixed potential race condition #32 2015-11-25 19:11:29 -08:00
Henry
424953c894 [Layout] Layout rebuilds after resize/reposition #32
- Refactored layoutPanels member function, and updated tests.
- Changed $scope.$watch to $scope.$watchCollection
2015-11-25 15:32:33 -08:00
Henry
6d0f3c7faa [Layout] Layout rebuilds after resize/reposition #32
Refactored layoutPanels method

Fixed JSLint errors

fixed failing tests
2015-11-25 15:30:33 -08:00
Victor Woeltjen
434a52ded3 [Build] Bump version number
...to begin work for new sprint.
2015-11-25 14:11:53 -08:00
Victor Woeltjen
2ec906e2d4 [Build] Remove snapshot status
Remove snapshot status in preparation to bump version number
at end of sprint Banks.
2015-11-25 14:10:48 -08:00
Victor Woeltjen
405daf36b2 [API] Add proposals about actions 2015-11-25 12:45:22 -08:00
Victor Woeltjen
ffff13205a [Time Conductor] Check for value changes
...on watches triggered from the picker. Only want to
trigger a submit when this actually constitutes a change from
the datetime field's underlying model (to avoid triggering
form submission when datetime picker is initialized.)
2015-11-25 11:21:51 -08:00
Victor Woeltjen
16efd85dfc [Time Conductor] Submit immediately on picker changes 2015-11-25 11:16:31 -08:00
Victor Woeltjen
1ef09ffbdd [Time Conductor] Restore last valid values
Restore last valid values on blur, in a date-time entry field.
2015-11-25 11:12:41 -08:00
Victor Woeltjen
976ecce075 [Time Conductor] Update model on submit/blur 2015-11-25 11:09:11 -08:00
Victor Woeltjen
87a51a9eb3 [Time Conductor] Listen for blur, submit
https://github.com/nasa/openmctweb/issues/259
2015-11-25 11:02:03 -08:00
Henry
c84de00e80 [Layout] Layout rebuilds after resize/reposition #32 2015-11-24 21:51:10 -08:00
Victor Woeltjen
91997ced01 [Documentation] Define test levels 2015-11-24 17:08:59 -08:00
Victor Woeltjen
7a4be9e67e [Documentation] Add test procedure template 2015-11-24 15:56:02 -08:00
Victor Woeltjen
eb942b0bf7 [Documentation] Intermediary commit
Begin adding test plan, procedures. WTD-1573.
2015-11-24 13:08:59 -08:00
Victor Woeltjen
1cf23c7ad6 [Documentation] Rename development cycle
...as it will no longer be the index of the process
category as information about testing is added.
2015-11-24 10:57:52 -08:00
Victor Woeltjen
15ec9df538 Merge pull request #327 from nasa/open208b
[Timelines] Bring over CSS
2015-11-23 10:38:02 -08:00
Victor Woeltjen
d6e2895666 Merge pull request #257 from nasa/open245b
[Persistence] Support multiple persistence spaces
2015-11-21 07:13:54 -08:00
Victor Woeltjen
7974ffdda2 Merge remote-tracking branch 'github/master' into open245b
...in preparation to complete merge nasa/openmctweb#257

Conflicts:
	platform/entanglement/src/actions/CopyAction.js
	platform/entanglement/src/actions/LinkAction.js
	platform/entanglement/src/actions/MoveAction.js
2015-11-21 07:05:51 -08:00
Victor Woeltjen
d5858622ba [Persistence] Fix grammar in JSDoc
...and add some explanation of METHOD_DEFAULTS.
2015-11-21 06:59:12 -08:00
Victor Woeltjen
9656e09066 [Documentation] Clarify identifier syntax
...in plain English, for the humans.

Per code review in nasa/openmctweb#257
2015-11-21 06:52:19 -08:00
Victor Woeltjen
096fee8b6d Merge remote-tracking branch 'github/master' into open208b
Conflicts:
	platform/commonUI/themes/espresso/res/css/theme-espresso.css
	platform/commonUI/themes/snow/res/css/theme-snow.css
2015-11-21 06:42:45 -08:00
Victor Woeltjen
0635e7c38e [Timeline] Disambiguate datetime control
Timeline uses a custom date-time control on creation;
use a distinct key for this to avoid a naming collision
with platform's datetime. Addresses abnormal behavior
identified in nasa/openmctweb#208
2015-11-20 17:26:43 -08:00
Victor Woeltjen
845b1dcd6f Merge pull request #321 from nasa/open169
Review and integrate open169
2015-11-20 17:13:39 -08:00
Victor Woeltjen
2e959e8503 Revert "[Mobile] Deploy via CircleCI"
This reverts commit 49b3d67272.
2015-11-20 17:09:37 -08:00
Victor Woeltjen
e6c9cbf0cd [Persistence] Clarify JSDoc
Per code review feedback, nasa/openmctweb#257
2015-11-20 17:08:39 -08:00
Charles Hacskaylo
fd3059b380 [Frontend] Final cleanups, tweaks; Refactored s-icon-btn
open #208
Unit tested in both themes;
.s-icon-btn refactored slightly to focus on usage
as an icon-only element, removed overlap designations
with .s-btn in markup;
Colors normalized for theming;
Code cleanup;
2015-11-20 16:47:04 -08:00
Charles Hacskaylo
5a7349117a [Frontend] Cleanups to Timeline tabular label elements
open #208
Colors normalized for theming;
2015-11-20 16:27:26 -08:00
Charles Hacskaylo
50134bbc7f [Frontend] Theming and cleanups in Clocks and Timers
open #208
Also converted timer to use flexbox layout;
2015-11-20 16:19:27 -08:00
Charles Hacskaylo
3854df27d8 [Frontend] Styling on Timeline zoom buttons
open #208
Fixed in both themes;
2015-11-20 15:42:08 -08:00
Charles Hacskaylo
fc53dbd8a4 [Frontend] Themes added to Timelines
open #208
Espresso and Snow now supported; bulk of
work done except for minor cleanups, like zoom
buttons; Dragging not working currently in Timelines;
2015-11-20 15:23:08 -08:00
akhenry
fb0ba0cff9 Merge pull request #323 from nasa/open251
Review and integrate open251
2015-11-20 13:30:24 -08:00
akhenry
573e5608fc Merge pull request #319 from nasa/open-status-tracking
[Status] Add status tracking
2015-11-20 13:18:09 -08:00
Victor Woeltjen
37a7c2b1df Merge pull request #309 from nasa/open308
[Workers] Allow web workers to be shared
2015-11-20 11:40:26 -08:00
Victor Woeltjen
38274728f6 [Workers] Update JSDoc
...per review feedback, nasa/openmctweb#309
2015-11-20 11:12:29 -08:00
Victor Woeltjen
49b3d67272 [Mobile] Deploy via CircleCI
...to enable testing of changes for nasa/openmctweb#169.
2015-11-20 11:05:25 -08:00
Victor Woeltjen
400b992ec3 [Status] Revise API
Change method names, add a getter to status capability;
per code review feedback, nasa/openmctweb#319.
2015-11-20 09:46:08 -08:00
Charles Hacskaylo
de59f191b8 [Frontend] Relocating files
open #208
Moving initial files into new positions, based
on Victor's work in #242;
2015-11-20 09:14:07 -08:00
Charles Hacskaylo
3d3b250536 Merge remote-tracking branch 'github/master' into open208 2015-11-20 08:38:19 -08:00
Charles Hacskaylo
32815d8427 [Frontend] Markup and CSS fixes
open #251
Fixed markup and CSS to remove erroneously
applied "select" class;
Modified .select to not use overflow: hidden;
Better positioning for *-options elements;
2015-11-19 18:50:10 -08:00
Charles Hacskaylo
3e25d17702 [Mobile / Frontend] Modified media query device detection approach
open #169
Significant simplification of media query device detection
to focus on width only; tablet max-width and desktop
min-width modified to create gapless ranges;
2015-11-19 15:16:21 -08:00
Victor Woeltjen
b5d1118a3f [Status] Document status capability
...in the developer guide. Includes a table for listing
status names and classes, per code review feedback,
nasa/openmctweb#319.
2015-11-19 15:12:03 -08:00
Victor Woeltjen
5b9e43f8ff [Status] Test platform/status 2015-11-19 14:22:44 -08:00
Victor Woeltjen
3ffa6f70aa [Status] Add empty specs 2015-11-19 13:47:39 -08:00
Victor Woeltjen
0d07c3c289 [Status] Clean up classes when destroyed 2015-11-19 13:44:06 -08:00
Victor Woeltjen
29fdb6d641 [Status] Add JSDoc 2015-11-19 13:43:18 -08:00
Victor Woeltjen
0fa6cbfc18 [API] Propose contextual DI 2015-11-19 13:02:03 -08:00
Victor Woeltjen
39d007470a [Status] Active platform/status bundle 2015-11-18 17:23:31 -08:00
Victor Woeltjen
285c8cbd1e [Status] Add status tracking
Add status tracking for domain objects, and decoration of
representations with status-related classes. Supports WTD-1575
by allowing pending state of taxonomy to be handled by
status tracking and custom CSS, instead of by overriding platform
templates.
2015-11-18 17:22:38 -08:00
Victor Woeltjen
a7f277b0d2 Merge pull request #317 from nasa/open316
[bug] TypeImpl.getInitialmodel should always return a fresh (ie. cloned) model.
2015-11-18 12:21:23 -08:00
Henry
5ced8e655d [bug] #317 Added jsdoc note about performance 2015-11-18 12:14:00 -08:00
akhenry
4de7b7dfb5 Merge pull request #288 from nasa/open218
[Plot] Support domain/range switching
2015-11-18 11:54:13 -08:00
Victor Woeltjen
a9518e9890 [Telemetry] Add missing JSDoc
...for new parameters added to support domain/range switching
in plots, per code review on nasa/openmctweb#288
2015-11-18 10:50:32 -08:00
akhenry
4ed35cddde Merge pull request #272 from nasa/open120
[Actions] Avoid suppression of context menus
2015-11-17 16:27:17 -08:00
Henry
40b21e35fd Fixed jslint error 2015-11-17 15:03:17 -08:00
Henry
3a36389815 Fixed test 2015-11-17 14:45:10 -08:00
Henry
606667eb4d [bug] TypeImpl.getInitialmodel should always return a fresh (ie. cloned) model. #316 2015-11-17 14:30:34 -08:00
Victor Woeltjen
ef5a26dfcc [Documentation] Specify default value
...for shared property of workers.
2015-11-16 16:16:22 -08:00
Victor Woeltjen
8363302caf [Workers] Allow web workers to be shared
Support an additional flag in the  extension category
such that SharedWorkers may be used. nasa/openmctweb#308.
2015-11-16 15:16:44 -08:00
akhenry
2b2ac0b0d9 Merge pull request #299 from nasa/open297
[Time Conductor] Fix date picker toggles
2015-11-12 16:52:35 -08:00
akhenry
f9a7ca85ac Merge pull request #273 from nasa/open231
[Core] Catch errors from listeners in topic
2015-11-12 16:51:50 -08:00
Victor Woeltjen
46b110e12f [Common UI] Add note about TODO item
Add note about temporary work around, per code review
from nasa/openmctweb#299
2015-11-12 16:38:01 -08:00
akhenry
b7eb9491cb Merge pull request #275 from nasa/open271
[Layout] Enforce minimum size on drop
2015-11-12 16:10:50 -08:00
akhenry
a92d13c10f Merge pull request #294 from nasa/open223
[Documentation] Document process
2015-11-12 15:08:03 -08:00
Victor Woeltjen
4ad007f882 [Common UI] Add z-index to popups
Temporary workaround for nasa/openmctweb#298
2015-11-12 14:52:41 -08:00
Victor Woeltjen
9f2303face [Time Conductor] Fix date picker toggle
nasa/openmctweb#297; avoid flag toggled to display date-time
picker becoming lost in a child scope.
2015-11-12 14:49:19 -08:00
Victor Woeltjen
99512f41b9 [Documentation] Handle review feedback
Fix spelling error, add link, per code review nasa/openmctweb#294
2015-11-12 12:23:38 -08:00
Victor Woeltjen
49a5ac833b [Documentation] Use consistent row headers 2015-11-12 09:57:06 -08:00
Victor Woeltjen
646df81874 [Documentation] Add sprint calendars
...and fix quotes copied from original sketch of document.
2015-11-12 09:52:47 -08:00
Victor Woeltjen
c5736cafb1 [Documentation] Add process documentation
Bring over process documentation (except for calendar),
nasa/openmctweb#223.
2015-11-10 17:27:43 -08:00
Victor Woeltjen
93d969ad67 [Plot] Add tests
...to verify that data is requeried when user changes
domain or range selection.
2015-11-10 16:17:43 -08:00
Victor Woeltjen
7dc6f553ac [Plot] Expose alternate domain values correctly
...from example telemetry (sine wave generator), to support
testing of switching among domains within plot.
2015-11-10 16:12:36 -08:00
Victor Woeltjen
b30e72081c [Plot] Update domain format
...on change in user's domain selection.
2015-11-10 16:12:16 -08:00
Victor Woeltjen
d60bf94501 [Plot] Remove unnecessary fallback 2015-11-10 16:03:42 -08:00
Victor Woeltjen
a88fadcb49 [Plot] Allow lookup of alternate ranges 2015-11-10 16:02:18 -08:00
Victor Woeltjen
7264a711a3 Merge pull request #274 from nasa/open250
Review and integrate open250
2015-11-10 15:20:06 -08:00
Victor Woeltjen
ae7a1618e8 [Plot] Listen for domain/range changes
nasa/openmctweb#218
2015-11-10 15:16:47 -08:00
Charles Hacskaylo
d6d95fed19 [Code style] Cleaned out comments
open #250
open #274
scss, html scoured for commented
dead code, leftover TO-DOs and
other unnecessary comments;
2015-11-10 15:12:09 -08:00
Victor Woeltjen
04ce2f985a [Persistence] Add JSDoc
Add JSDoc to classes added/modified to support multiple persistence
spaces, nasa/openmctweb#245.
2015-11-10 14:16:07 -08:00
Victor Woeltjen
a14f30c03c [Persistence] Test PersistenceAggregator 2015-11-10 13:43:22 -08:00
Victor Woeltjen
bd85392b54 [Persistence] Test cross-space policy
Verify that move/copy/link across spaces is disallowed.
2015-11-10 13:29:12 -08:00
Victor Woeltjen
7c427e0b6e [Persistence] Test IdentifierProvider 2015-11-10 13:15:24 -08:00
Victor Woeltjen
6cf8335f31 [Persistence] Test Identifier parsing
...and add empty spec for IdentifierProvider
2015-11-10 13:11:21 -08:00
Victor Woeltjen
647a1403d0 [Persistence] Update developer guide
Replay changes to developer guide regarding identifier syntax
and persistence spaces.
2015-11-10 13:01:32 -08:00
Victor Woeltjen
1d9b8f34e2 Merge remote-tracking branch 'github/master' into open245b
...to resolve merge conflicts for pull request for
nasa/openmctweb#245

Conflicts:
	docs/src/guide/index.md
2015-11-10 12:56:11 -08:00
Victor Woeltjen
adf119007b [Persistence] Test validator
Exercise the validation function provided by move/copy/link
actions when prompting for a location with a dialog.
2015-11-10 12:46:58 -08:00
Victor Woeltjen
7114e9b150 [Persistence] Update move/copy/link specs
...to reflect re-consultation of policyService when the action
context changes due to dialog input.
2015-11-10 12:40:52 -08:00
Victor Woeltjen
76c1f5bfe9 [Persistence] Update spec for instantiate
...to reflect usage of identifierService.
2015-11-10 12:34:54 -08:00
Victor Woeltjen
33f88d30ed [Persistence] Update bundle definition
...to reflect dependency on identifierService to interpret an
object's persistence space based on its identifier.
2015-11-10 12:34:30 -08:00
Victor Woeltjen
ffdcbece56 [Persistence] Update failing spec
...to reflect changes to the persistence capability, utilizing the
identifierService for consistent interpretation of spaces by id.
2015-11-10 12:33:52 -08:00
Victor Woeltjen
44eb723efb [Persistence] Update failing spec
...for instantiation capability, to reflect usage of identifier
parser in determining which space an object should belong to.
2015-11-10 12:26:59 -08:00
Victor Woeltjen
689f80bb23 [Persistence] Use identifierService from persistence
User identifierService from the persistence capability, for
consistent interpretation of spaces associated with domain
object identifiers.
2015-11-10 12:21:53 -08:00
Victor Woeltjen
a2db98d275 [Persistence] Update failing spec
...to reflect changes to PersistedModelProvider
2015-11-10 12:12:11 -08:00
Victor Woeltjen
49b983cd3a [Persistence] Fix cross-space policy
Fix logic in cross-space policy; only disallow when a move, copy
or link would really cross spaces.
2015-11-10 10:57:48 -08:00
Victor Woeltjen
ad60b9225e [Persistence] Clean up instantiation
Fix typo to correctly reuse defined identifiers, remove
unused dependency of instantiation capability.
2015-11-10 10:53:48 -08:00
Victor Woeltjen
0c096db8bd [Persistence] Suppress Move/Copy/Link
Disallow move/copy/link when crossing persistence spaces,
nasa/openmctweb#245
2015-11-10 10:44:21 -08:00
Victor Woeltjen
fdf6148811 [Layout] Enforce minimum size on drop
Addresses nasa/openmctweb#271, ensuring frames in a layout
are not too tiny to use, even if the grid size is small.
2015-11-09 17:58:20 -08:00
Victor Woeltjen
62e7adc0b0 Merge pull request #269 from nasa/open220
[Documentation] Fix broken links and strange characters in Developer Guide
2015-11-09 17:30:57 -08:00
Charles Hacskaylo
72e0304fc0 [Merge] Safety merge-in of latest master
open #250
2015-11-09 17:19:02 -08:00
Charles Hacskaylo
e1110a2bc4 [Frontend] Fixed Create menu in mobile
open #250
open #157
Fixed CSS selector that wasn't properly
targeting the Create menu in a mobile
context;
2015-11-09 17:14:59 -08:00
Henry
7172c45404 [Documentation] #220 Fix broken links and strange characters in Developer Guide 2015-11-09 17:11:18 -08:00
Charles Hacskaylo
d8ced8f635 [Frontend] Hide/show Create button in mobile
open #250
open #157
Create button now hidden by default in mobile via
usage of CSS; can be re-displayed by including
'example/mobile' bundle;
2015-11-09 17:10:57 -08:00
Victor Woeltjen
e3e44f74d6 [Topic] Catch errors from listeners 2015-11-09 16:55:22 -08:00
Victor Woeltjen
acdd9622d2 [Topic] Add test case
...which specifies desired behavior for nasa/openmctweb#231.
2015-11-09 16:51:39 -08:00
Victor Woeltjen
2866574dc0 [Actions] Define applicability
Define applicability of Move/Copy/Link using appliesTo, to avoid
errors being thrown due to lack of context during instantiation.
Addresses immediate cause of nasa/openmctweb#120.
2015-11-09 16:28:04 -08:00
Charles Hacskaylo
cfc9b61e25 [Frontend] Adjusted margin strategy in left pane elements
open #250
Changed flex-elem to use margin-bottom instead of top;
Added margin-top to .search-results element;
2015-11-09 16:21:50 -08:00
Victor Woeltjen
066fd55590 [Actions] Test error handling 2015-11-09 16:18:35 -08:00
Charles Hacskaylo
c0dc30edb7 [Frontend] Fixed padding in search results
open #250
2015-11-09 15:42:49 -08:00
Charles Hacskaylo
2a201df435 [Frontend] Consolidated treeview elements markup
open #250
Removed un-needed markup around treeview
includes and mct-reps; moved CSS class defs into
mct-include and mct-rep for search and tree
respectively;
2015-11-09 15:42:24 -08:00
Victor Woeltjen
07179f7290 [Action] Catch errors
Catch errors during action instantiation, to avoid suppressing
whole context menus on single failures; nasa/openmctweb#120.
2015-11-09 15:42:19 -08:00
Victor Woeltjen
87684e0945 [Persistence] User identifierService from instantiate 2015-11-09 15:25:07 -08:00
Charles Hacskaylo
55d3a27917 [Frontend] Fix to z-indexing for search "types" menu
open #250
2015-11-09 15:22:53 -08:00
Victor Woeltjen
1d13b245f9 [Persistence] Update bundle definition
...after merging latest changes from master branch into
topic branch for nasa/openmctweb#245.
2015-11-09 15:21:41 -08:00
Victor Woeltjen
e31d9decdc Merge remote-tracking branch 'github/master' into open245b
Conflicts:
	docs/src/guide/index.md
	platform/core/src/capabilities/InstantiationCapability.js
2015-11-09 15:17:53 -08:00
Charles Hacskaylo
a5fa11749c [Frontend] Min/max widths on panes adjusted
open #250
Moved new min/max definitions into desktop-only
portion of layout.scss to not affect mobile layout;
2015-11-09 15:14:50 -08:00
Charles Hacskaylo
2b92c1619e [Frontend] Min/max widths on panes adjusted
open #250
Fixed min and max widths for panes to prevent
weird pane expand/collapse behaviors, like
Inspector covering the main view area;
Added min-width to .holder-all element;
2015-11-09 15:10:52 -08:00
Victor Woeltjen
4f001f0b5d [API] Propose declaring plugins as Angular modules 2015-11-09 14:35:51 -08:00
Charles Hacskaylo
fd135a16af [Frontend] Restoring dropped Snow theme constants
open #250
Snow theme constants missing were causing the Snow
theme CSS to not compile - this commit restores those
values;
TO-DO: values defined are a bit out of sync between Espresso
and Snow and need to be realigned;
2015-11-09 14:22:34 -08:00
Henry
aed49d89e3 [Documentation] Fix broken links and strange characters in Developer Guide 2015-11-09 13:46:27 -08:00
Henry
05f8739952 Diffs 2015-11-09 13:46:27 -08:00
Henry
bf39aa1b1d Fixed broken links@ 2015-11-09 13:46:22 -08:00
Charles Hacskaylo
4e79de6156 [Frontend] Apply flex layout to object header elements
open #250
open #260
vista#132
Major refactoring to markup and CSS to apply
flex layout strategy to object headers;
Flex necessary to fix 'overflow: hidden' setting
applied in open90 to object-browse-bar that
was preventing the view switcher menu from
appearing;
Browse, edit, mobile, frames in layouts, etc. all
visually checked in a first go round;
Mobile classes tweaked to fix left and right
margin problems resulting from open90 changes;
z-indexing of Inspector pane and splitters changed
to allow primary pane elements to overflow beneath
when primary pane width is severely constrained;
2015-11-06 17:42:54 -08:00
Henry
78004ebf37 Fixed broken linkes 2015-11-06 17:40:43 -08:00
akhenry
51968954a9 Merge pull request #255 from nasa/open215
[Creation] Add creation capability
2015-11-06 16:00:12 -08:00
Victor Woeltjen
64607b8e56 [Creation] Remove errant comments 2015-11-06 15:47:33 -08:00
Victor Woeltjen
cb432051dc [Creation] Tweak lazy initialization approach 2015-11-06 14:32:47 -08:00
Victor Woeltjen
c184a9ce7c [Creation] Complete rename of capability 2015-11-06 14:31:26 -08:00
Victor Woeltjen
62e2114349 [Creation] Move test cases
Move test cases from instantiation capability over to
instantiate service.
2015-11-06 14:30:39 -08:00
Victor Woeltjen
cca1928b82 [Creation] Use instantiate from objectService
Use instantiate from DomainObjectProvider, to remove redundant
code around DomainObject instantiation.
2015-11-06 14:23:34 -08:00
Victor Woeltjen
81b136eab1 [Creation] Use instantiate service
...from instantiation capability.
2015-11-06 14:15:22 -08:00
Victor Woeltjen
d059116782 [Creation] Rename creation capability
...to instantiation, to distinguish from creation (which
typically includes persistence.)
2015-11-06 14:07:53 -08:00
Victor Woeltjen
bdc99950c6 [Creation] Add instantiate service
...to allow insantiating domain objects completely
externally from any other domain object. Desired by
code review feedback for nasa/openmctweb#255.
2015-11-06 13:56:12 -08:00
Charles Hacskaylo
76e15f2963 Merge remote-tracking branch 'github/master' into open250 2015-11-06 13:32:28 -08:00
Victor Woeltjen
06436bb876 [Creation] Use identifierService
...from CreationCapability.
2015-11-06 13:10:51 -08:00
Victor Woeltjen
d8f3f0f430 [Persistence] Expose IdentifierService 2015-11-06 13:05:27 -08:00
Victor Woeltjen
177c1874b9 [Persistence] Add identifierService 2015-11-06 13:03:54 -08:00
Victor Woeltjen
96a7c12d69 Merge pull request #249 from nasa/open127
[UI] Progress indicator for pending operations (e.g. duplicate)
2015-11-06 10:57:42 -08:00
Henry
148a5eb248 JSLint issue 2015-11-06 10:14:59 -08:00
Henry
31d3ec5d20 Removed usage of function.prototype.bind 2015-11-06 10:06:17 -08:00
Pete Richards
7564384b57 Merge remote-tracking branch 'github-open/open241' into open-master 2015-11-06 09:59:20 -08:00
Pete Richards
639546bf86 Merge remote-tracking branch 'github-open/open229b' into open-master 2015-11-06 09:54:42 -08:00
Pete Richards
932e3cb7b0 Merge remote-tracking branch 'github-open/open244' into open-master 2015-11-06 09:46:51 -08:00
Pete Richards
cbffc221fb Merge remote-tracking branch 'github-open/prod-uisymbols' into open-master 2015-11-06 09:44:21 -08:00
Victor Woeltjen
eef801f1ae [Persistence] Fix read in example
Values are stored in the scratchpad as JSON, so parse them
as JSON before returning them.
2015-11-05 18:00:51 -08:00
Victor Woeltjen
d69cf6c6fe [Persistence] Parse out key
When an identifier is a space-key pair, parse out the key before
persisting.
2015-11-05 17:58:16 -08:00
Victor Woeltjen
0a9c162f26 [Persistence] Fix method delegation
...used by PersistenceAggregator
2015-11-05 17:53:04 -08:00
Victor Woeltjen
942fa46022 [Persistence] Expose aggregator 2015-11-05 17:51:14 -08:00
Victor Woeltjen
74aff1b407 [Persistence] Implement aggregator 2015-11-05 17:48:43 -08:00
Henry
2f658348a8 Fixed JSLint 2015-11-05 17:40:22 -08:00
Victor Woeltjen
dbff9e2125 [Persistence] Add example provider
...to serve as a secondary persistence store.
2015-11-05 17:38:51 -08:00
Henry
793ed7ebe6 [UI] Progress indicator for pending operations - Refactoring for code clarity 2015-11-05 17:32:52 -08:00
Victor Woeltjen
bed1556a3a [Persistence] Begin adding example bundle
Begin adding example bundle illustrating usage of secondary persistence
stores. Scratchpad will 'persist' objects only in memory.
2015-11-05 17:30:27 -08:00
Victor Woeltjen
822b4ae96f [Persistence] Report space by identifier 2015-11-05 17:26:48 -08:00
Victor Woeltjen
99f3b986b6 [Creation] Retain space prefix
Retain space prefix from a parent when creating a new domain object,
if there is a space prefix.
2015-11-05 17:25:39 -08:00
Victor Woeltjen
fd4c1ea747 [Persistence] Retain original id
...after parsing out space and key, to aid in assembling
the result of getModels as an object where IDs are keys.
2015-11-05 17:22:05 -08:00
Victor Woeltjen
944a5a7424 [Persistence] Update JSDoc 2015-11-05 17:16:53 -08:00
Victor Woeltjen
dda2c89a58 [Persistence] Update bunde definition
...to reflect removal of 'additional persistence spaces'; parse
these out of identifiers instead.
2015-11-05 17:13:19 -08:00
Victor Woeltjen
c8cfbf5281 [Persistence] Refactor model loading
...such that ids are only parsed for space/key pairs once.
2015-11-05 17:11:24 -08:00
Victor Woeltjen
9f383ab101 [Persistence] Parse space from id
Parse spaces from domain object identifiers, if these have
been specified.
2015-11-05 17:04:55 -08:00
Charles Hacskaylo
063e97fcb5 [Frontend] Cleanups and enhancements to search
open #250
Fixed margin/spacing problems with results element;
Added transition to results display;
Begin adding # results found / no results messaging;
Moved class .off to _globals.scss;
2015-11-05 17:04:19 -08:00
Victor Woeltjen
7811d50372 [Persistence] Document identifier syntax
Document identifier syntax to account for space-prefixing
for nasa/openmctweb#245.
2015-11-05 16:50:24 -08:00
Henry
e1c6c76612 Refactored some CopyService functions out to CopyTask 2015-11-05 16:39:46 -08:00
Henry
aa2a835cb1 Created CopyTask class 2015-11-05 16:19:01 -08:00
Victor Woeltjen
3741a02d2a [Creation] Test CreationCapability 2015-11-05 16:15:12 -08:00
Victor Woeltjen
f14cad4a39 [Creation] Add JSDoc 2015-11-05 16:05:29 -08:00
Charles Hacskaylo
c0ac3a0f96 [Frontend] Convert main left pane elements to flex layout
open #250
Significant changes to flex classes, markup in
browse.html and search.html to support better
flex layout;
Search results now scrolls properly;
Significant refactoring and cleanups in search and _search.scss;
2015-11-05 15:44:55 -08:00
Victor Woeltjen
09bae63de7 [Creation] Update CreationService spec 2015-11-05 15:36:44 -08:00
Victor Woeltjen
62b9eb5180 [Creation] Simplify creationService
Add the newly-created domain object directly, instead of via
its id.
2015-11-05 15:36:33 -08:00
Victor Woeltjen
3f26be885e [Creation] Move uuid
...into core, since it is used by the Creation capability.
2015-11-05 15:24:57 -08:00
Victor Woeltjen
7ab318d57b [Creation] Fix method invocation 2015-11-05 15:21:47 -08:00
Victor Woeltjen
65a33f8af5 [Creation] Clean up creationService
Remove unused dependency, update JSDoc
2015-11-05 15:15:23 -08:00
Victor Woeltjen
331b4e9259 [Creation] Use creation capability
...from creationService to initially instantiate a domain object
before persisting it.
2015-11-05 15:13:33 -08:00
Victor Woeltjen
474afdf8ef [Creation] Expose creation capability
...adding usage of  to avoid circular dependencies.
2015-11-05 15:08:52 -08:00
Victor Woeltjen
3f4ccd93ab [Creation] Add creation capability
...allowing domain objects to be instantiated in-memory
without persisting them. nasa/openmctweb#215
2015-11-05 15:05:54 -08:00
akhenry
92cf86837b Merge pull request #207 from nasa/open1239
[Plugins] Bring over Timeline, Clocks/Timers
2015-11-05 13:42:32 -08:00
Victor Woeltjen
5274923c49 [Licenses] Add license headers
...to sources for Clocks/Timers and Timelines, as noted in
review nasa/openmctweb#207
2015-11-05 12:45:51 -08:00
akhenry
a356e01b14 Merge pull request #219 from nasa/open213
[Mobile] Don't move DOM nodes
2015-11-05 12:09:22 -08:00
Henry
21a37db15b #127 fixed failing test caused by fix for persistence spaces 2015-11-05 11:50:56 -08:00
akhenry
a20bbd98f5 Merge pull request #224 from nasa/open-docs-css
[Documentation] Add styling
2015-11-05 11:46:57 -08:00
Henry
5b3f780204 [UI] Progress indicator for pending operations (e.g. duplicate) #249- Fixed serious issue with persistence 2015-11-05 11:38:41 -08:00
Henry
43e920d3b6 Reverted to local storage 2015-11-05 10:27:50 -08:00
Charles Hacskaylo
8ca22cc510 [Frontend] Convert main left pane elements to flex layout
open #250
Markup mods in browse.html;
Renamed .holder-create-and-search to
.holder-treeview-elements;
TO-DO: fix search results to scroll properly;
2015-11-05 10:11:59 -08:00
Andrew Henry
3443780ac7 Improved commenting 2015-11-04 22:09:28 -08:00
Andrew Henry
8e85675732 Made changes to error reporting 2015-11-04 22:07:26 -08:00
Andrew Henry
2bdc95eb95 Restored MoveActionSpec.js and LinkActionSpec.js 2015-11-04 21:11:26 -08:00
Andrew Henry
f2efb07d93 Remove UUID path 2015-11-04 21:05:55 -08:00
Andrew Henry
863c3f1720 Fixed jslint issues 2015-11-04 20:48:22 -08:00
Andrew Henry
b73f9fc19e Merged from master 2015-11-04 20:30:49 -08:00
Andrew Henry
10e711f717 Removed commented code 2015-11-04 20:26:24 -08:00
Andrew Henry
529dde57b9 Added test for notification to CopyActionSpec 2015-11-04 20:26:24 -08:00
Henry
7d1a1acc11 Adding tests for Copy Action 2015-11-04 20:26:23 -08:00
Henry
5e1b0f38b7 Migrated to using notifications and fixed tests 2015-11-04 20:26:23 -08:00
Andrew Henry
4e69ca50fb Fixed blocking dialog 2015-11-04 20:26:23 -08:00
Andrew Henry
05481dcab5 reverted AbstractComposeAction 2015-11-04 20:26:23 -08:00
Andrew Henry
fa7131ad5c Refactoring to use promises notifications 2015-11-04 20:26:23 -08:00
Henry
bd1c3cb7da All test cases passing + added test cases for copy 2015-11-04 20:26:23 -08:00
Henry
cbd21212d1 Original tests that are still valid are passing 2015-11-04 20:26:23 -08:00
Henry
5cd458a733 Updating tests 2015-11-04 20:26:23 -08:00
Andrew Henry
2f90a89065 Fixed more failing tests 2015-11-04 20:26:23 -08:00
Henry
4312857fd4 Fixed failing tests 2015-11-04 20:26:22 -08:00
Andrew Henry
6c4c53dde7 Debugging test failures 2015-11-04 20:26:17 -08:00
Charles Hacskaylo
e49b55024f [Frontend] Inspector-related fixes
open #247
Modded styles applied to .object-browse-bar to
use overflow:hidden instead of visible;
2015-11-04 16:00:22 -08:00
Charles Hacskaylo
5f1f54fa91 [Frontend] Inspector-related fixes
open #243
Enlarged size of mini-tab icon when panes are collapsed;
Increased size of edge margin to allow for larger icons;
2015-11-04 15:47:13 -08:00
Charles Hacskaylo
f4325e2bb3 [Frontend] Inspector-related fixes
open #244
Moved older .l-flex class out of layout and
into archetypes, updated definition;
2015-11-04 15:20:42 -08:00
Charles Hacskaylo
e09cf91def [Frontend] Inspector-related fixes
open #244
Fixing scroll issue in Inspector via flex layout;
Added new _archetypes.scss file for .l-flex* and .col styles;
moved .col and associated mixin out of _layout.scss
and into _archetypes;
2015-11-04 15:03:56 -08:00
Charles Hacskaylo
ff1e1251f6 [Frontend] Integrating new Inspect icon from prod-uisymbols
open #244
open #188
2015-11-04 14:29:21 -08:00
Charles Hacskaylo
5697a39ec3 [Production] Changed target icon e615 to eye
open #188
Jay request;
e615 is no-gleam and replaces the crosshair glpyh;
gleam version is e616
2015-11-04 13:55:52 -08:00
Charles Hacskaylo
32fb84a3cd [Merge] Merging in latest master
open #188
2015-11-04 13:52:31 -08:00
Victor Woeltjen
2815d97682 Merge pull request #236 from nasa/open232
Review and integrate open232
2015-11-04 13:15:21 -08:00
Victor Woeltjen
ab01f64cea Merge remote-tracking branch 'github/master' into open236
Resolve CSS conflicts for nasa/openmctweb#236

Conflicts:
	platform/commonUI/general/res/sass/controls/_controls.scss
	platform/commonUI/themes/espresso/res/css/theme-espresso.css
	platform/commonUI/themes/snow/res/css/theme-snow.css
2015-11-04 13:02:17 -08:00
Victor Woeltjen
e5aa2b4f87 [Themes] Update developer guide
Add documentation of the theme property of stylesheets extensions
to the developer guide.
2015-11-04 12:01:09 -08:00
Victor Woeltjen
522ce02302 [Themes] Add missing semicolon
...to satisfy JSLint.
2015-11-04 11:54:19 -08:00
Victor Woeltjen
e32eb11e60 [Themes] Update bundle declarations
Update bundle declarations to provide a THEME constant for
use in filtering out theme-specific CSS additions.
2015-11-04 11:53:10 -08:00
Victor Woeltjen
bda1bf9f9a [Themes] Match themes from stylesheet loader 2015-11-04 11:49:27 -08:00
Victor Woeltjen
226f0932da [Themes] Add test cases
Add test cases to verify that stylesheets are excluded/included
according to theme, when a theme has been specified.

nasa/openmctweb#241
2015-11-04 11:48:49 -08:00
Victor Woeltjen
15f9bc083c Merge pull request #240 from nasa/open233b
[Inspector] Introduce inspector pane
2015-11-04 11:24:27 -08:00
Victor Woeltjen
1c4a4e475b [Inspector] Simplify splitter communication 2015-11-04 10:53:23 -08:00
Victor Woeltjen
f7839b758d Merge remote-tracking branch 'github/master' into open233b
Resolve conflicts on nasa/openmctweb#233

Conflicts:
	platform/commonUI/general/bundle.json
	platform/commonUI/general/res/fonts/symbols/icomoon.io-WTD-symbols-project.json
	platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot
	platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg
	platform/commonUI/general/res/fonts/symbols/wtdsymbols.ttf
	platform/commonUI/general/res/fonts/symbols/wtdsymbols.woff
	platform/commonUI/general/res/sass/_main.scss
	platform/commonUI/general/res/sass/user-environ/_layout.scss
	platform/commonUI/themes/espresso/res/css/theme-espresso.css
	platform/commonUI/themes/espresso/res/sass/_constants.scss
	platform/commonUI/themes/snow/res/css/theme-snow.css
2015-11-04 09:28:19 -08:00
Victor Woeltjen
ac529be55c [Time Conductor] Don't emit view event
Don't emit an event when plot is instantiated; this is no
longer needed, as time conductor broadcasts its bounds
whenever views change.
2015-11-03 17:01:22 -08:00
Victor Woeltjen
99376391a9 Merge remote-tracking branch 'github/master' into open229b
Conflicts:
	platform/features/conductor/src/ConductorRepresenter.js
2015-11-03 16:58:40 -08:00
Charles Hacskaylo
2c7c7b90e6 Fixed JS var placement causing mvn to fail
open #90
open #233
2015-11-03 16:51:15 -08:00
Charles Hacskaylo
903778799f Fixed missing window reference causing test to fail
open #90
open #233
2015-11-03 16:45:11 -08:00
Pete Richards
9523c918fb Merge remote-tracking branch 'github-open/open182' into open-master 2015-11-03 15:52:14 -08:00
Charles Hacskaylo
09be19310b Resolved CSS conflicts
open #90
2015-11-03 15:44:10 -08:00
Pete Richards
b8b9b1f79a Merge remote-tracking branch 'github-open/open227' into open-master 2015-11-03 15:43:08 -08:00
Victor Woeltjen
4300338b9c Merge pull request #186 from nasa/open155
[Notifications] Add notification infrastructure
2015-11-03 15:38:41 -08:00
Charles Hacskaylo
6a42d0c7a1 [Frontend] Put overflow: auto back onto .object-holder
open #232
2015-11-03 15:28:53 -08:00
Victor Woeltjen
c0ed19fd92 Merge remote-tracking branch 'github/master' into open229b
Merge latest into topic branch for nasa/openmctweb#229
in preparation for pull request
2015-11-03 15:27:36 -08:00
Victor Woeltjen
df484c1800 [Time Conductor] Update TelemetryHandler spec 2015-11-03 15:27:08 -08:00
Victor Woeltjen
5940f94644 [Time Conductor] Cancel requests
Don't callback for any telemetry requests from a TelemetryHandle
if the handle has been destroyed.
2015-11-03 15:24:38 -08:00
Charles Hacskaylo
7cd255670e [Frontend] Committing removed files
open #208
2015-11-03 14:59:41 -08:00
Charles Hacskaylo
eabde6b2d0 [Frontend] Integrate Timeline into open; themes
open #208
Copied SASS styles from /warp and created
new platform/features/timeline/themes/espresso;
Styling looks complete, but Timeline itself has
functional issues;
TO-DO: remove styles from /warp/.../sass/ as needed;
2015-11-03 14:58:58 -08:00
Charles Hacskaylo
37f466705a [Frontend] IN-PROGRESS stubbing in files ported from /warp
open #208
Moving files from /warp; stuff will NOT compile
at this point;
2015-11-02 18:22:13 -08:00
Victor Woeltjen
0dccaab9cb [Search] Declare UI components as templates
Declare Search UI components as templates instead of
representations so that they are not removed from the
DOM when no domain object is supplied. Fixes
nasa/openmctweb#234
2015-11-02 14:07:22 -08:00
Charles Hacskaylo
c8848b5788 [Frontend] Tweaked spacing in Inspector header
open #90
2015-11-02 13:39:15 -08:00
Victor Woeltjen
4e8101ba0b [API Redesign] Add note about telemetry metadata 2015-11-02 12:52:31 -08:00
Victor Woeltjen
8d65335786 [Time Conductor] Remove check for domain existence 2015-11-02 12:31:40 -08:00
Victor Woeltjen
2d1faeba8c [Time Conductor] Update FormatService JSDoc 2015-11-02 12:30:18 -08:00
Victor Woeltjen
cecc52f0a9 [Time Conductor] Update formatService usages
...to remove checks for unknown formats.
2015-11-02 12:28:46 -08:00
Victor Woeltjen
a1d765f271 [Time Conductor] Throw errors for unknown formats
Per code review, nasa/openmctweb#204
2015-11-02 12:23:13 -08:00
Charles Hacskaylo
fe12cdefc5 [Frontend] Added icon to Inspector header
open #90
and updated icon;
2015-11-02 11:27:56 -08:00
Charles Hacskaylo
648cdcc86e Updated crosshair symbol for inspect
open #90
(cherry picked from commit 946a6d4)
2015-11-02 11:08:00 -08:00
Charles Hacskaylo
946a6d4a04 Updated crosshair symbol for inspect
open #90
2015-11-02 11:04:38 -08:00
Charles Hacskaylo
f7588d57c2 [Frontend] Added crosshair symbol for inspect
prod-uisymbols
open #90
(cherry picked from commit 91a4138)
2015-11-02 10:31:44 -08:00
Charles Hacskaylo
91a4138334 Added crosshair symbol for inspect
prod-uisymbols
open #90
2015-11-02 10:14:28 -08:00
Charles Hacskaylo
141a54cbd6 [Frontend] Tweaks in Inspector
open #90
Colors, spacing, properties layout mods;
2015-10-30 23:44:15 -07:00
Charles Hacskaylo
64c6ef6cfd [Frontend] Tweaks in Inspector
open #90
Colors, spacing, properties layout mods;
Checked in mobile and snow theme;
2015-10-30 18:31:02 -07:00
Charles Hacskaylo
fe8d9f6717 [Frontend] Mobile and margin tweaks
open #90
Margin off of right scrollbar added for treeview
in desktop only;
Repositioned nav to parent arrow button in
object-browse-bar;
2015-10-30 17:22:41 -07:00
Charles Hacskaylo
c913f173e3 [Frontend] Safety merge of master; minor fixes
open #90
IN-PROGRESS
Merged in latest from github/master;
Fixed margins when in edit mode;
Fixed edit area not utilizing overflow: auto properly;
TO-DO: verify mobile is Ok;
2015-10-30 17:09:04 -07:00
Victor Woeltjen
ae928a138c [Representation] Update compilation approach
Update compilation approach for templateLinker to more
closely resemble ng-include; minimizes likelihood of
subtle behavioral differences (e.g. incorrect size
selection for split pane)
2015-10-30 16:37:47 -07:00
Victor Woeltjen
454a63e1f1 [Representation] Destroy scopes before adding
Destroy representation scope before adding elements back into
the DOM; avoids having a momentary activation of watches and
listeners on those scopes before they are replaced with newly
compiled content for new scopes.
2015-10-30 16:18:01 -07:00
Victor Woeltjen
b487fa4438 [Representation] Update TemplateLinker spec
...to reflect creation of a new scope each time a template
is changed.
2015-10-30 16:01:24 -07:00
Victor Woeltjen
560454e7c2 [Representation] Verify change before representing
An mct-representation may have a refresh triggered either by
a key change or a domain object change; both will typically
happen in the same digest cycle. Track what prior state was
an abort refreshes if nothing will change.
2015-10-30 15:55:56 -07:00
Victor Woeltjen
04594ea536 [Representation] Rebuild scopes on every change
Create new scopes on every changeTemplate request, even if
the same template is being viewed; presume that we want a
new instance of the same template. Avoids scope reuse for
cases such as switching from a plot of one object to a
plot of another object.
2015-10-30 15:32:20 -07:00
Charles Hacskaylo
b5b6546710 [Frontend] Significant change to look and behavior of mini-tabs
open #90
IN-PROGRESS
mini-tab location in markup in browse.html changed;
Single menu icon for collapsed treeview;
Close 'x' boxes instead of arrow icons;
TO-DO: verify mobile is Ok;
2015-10-30 15:25:12 -07:00
Victor Woeltjen
a45dfc3822 [Representation] Don't reuse scopes
Addresses nasa/openmctweb#227
2015-10-30 15:09:35 -07:00
Victor Woeltjen
f7f6b8d612 [Time Conductor] Don't broadcast on telemetry:view
Instead, use delay from throttling initial bounds broadcast to
avoid broadcasting bounds prematurely.
2015-10-30 14:59:32 -07:00
Victor Woeltjen
e4a14b7603 [Time Conductor] Consistently throttle broadcast
Consistently throttle broadcast of bounds to minimize redundant
broadcasts, nasa/openmctweb#229
2015-10-30 14:56:52 -07:00
Victor Woeltjen
5706fa4567 Merge branch 'open182' into open229 2015-10-30 14:54:37 -07:00
Victor Woeltjen
796d6b800a [Time Conductor] Add JSDoc for params 2015-10-30 14:08:11 -07:00
Victor Woeltjen
b12bb55495 [Time Conductor] Update text on format change
...in a date-time field.
2015-10-30 13:57:21 -07:00
Victor Woeltjen
f42498ab60 [Time Conductor] Update specs
...to reflect changes to how unspecified versus unknown formats
are handled.
2015-10-30 13:53:33 -07:00
Victor Woeltjen
7f571415dc [Time Conductor] Change format handling
Use default format when no format is specified, and throw an
error when a specified format is unrecognized, from both
date-time field controller and time range controller.
2015-10-30 13:28:01 -07:00
Victor Woeltjen
4f9a65a5fe [Time Conductor] Use default format
...from TelemetryFormatter, and log when a requested format
is unavailable.
2015-10-30 13:17:53 -07:00
Victor Woeltjen
6db7f056dc [Time Conductor] Warn about unknown formats 2015-10-30 13:11:13 -07:00
Victor Woeltjen
5a1d774b47 [Time Conductor] Rename default domain
To UTC, instead of just Time.
2015-10-30 13:05:37 -07:00
Victor Woeltjen
101e3bb346 [Time Conductor] Remove checks for undefined domain
Per code review, nasa/openmctweb#204
2015-10-30 13:04:29 -07:00
Victor Woeltjen
b6d08726fb [Time Conductor] Remove duplicate format 2015-10-30 09:34:23 -07:00
Charles Hacskaylo
675c5be3da [Frontend] Tweaks to splitter edge shdw
open #90
IN-PROGRESS
2015-10-30 09:22:46 -07:00
Andrew Henry
4eaeea1e14 Fixed bugs in copy 2015-10-29 21:39:50 -07:00
Henry
f44819a7fe Improvements to copy notifications 2015-10-29 17:40:17 -07:00
Charles Hacskaylo
1dbd721b14 [Frontend] Significant mods to main layout strategy
open #90
IN-PROGRESS
To support desired edge-to-edge styling of Inspector pane;
Removed superflous .scss file;
Enhancements to splitter .scss to allow flush edging and
edge shadows;
2015-10-29 17:31:35 -07:00
Henry
05722d9b11 Added error handling 2015-10-29 17:15:20 -07:00
Henry
92a3fa3e4c Added error handling, and refactored CopyAction slightly 2015-10-29 16:40:51 -07:00
Charles Hacskaylo
ddebbf119f [Frontend] Expand/collapse finessing
open #90
2015-10-29 12:58:34 -07:00
Charles Hacskaylo
8c4fdf5c1c [Frontend] Expand/collapse finessing
open #90
Icon positioning; top of treeview splitter moved
back down below to previous position;
2015-10-29 12:55:20 -07:00
Victor Woeltjen
dd83662e0f [Documentation] Add styling 2015-10-29 12:30:13 -07:00
Charles Hacskaylo
1b0ce7166d [Frontend] Bring in new collapse left and right pane symbols
open #90
open #188
(cherry picked from commit 9c90eb5)
2015-10-29 11:31:57 -07:00
Charles Hacskaylo
9c90eb52a4 [Production] Added collapse left and right pane symbols
open #188
2015-10-29 11:30:01 -07:00
Charles Hacskaylo
a0c6ddff5a [Frontend] Removed unused mini-tab-icon class
open #90
2015-10-29 11:22:18 -07:00
Charles Hacskaylo
f51230b3f7 [Frontend] Fixed erroneous classes wrapping Create button;
open #90
2015-10-29 11:21:22 -07:00
Charles Hacskaylo
660e9f0d4f [Frontend] Fixed color of menu-item divider items;
open #90
2015-10-29 10:10:06 -07:00
Charles Hacskaylo
59b24d91bb [Frontend] Tweaks to splitter-related SASS
open #90
New splitterHandleInset function;
Removed padding from Inspector pane;
2015-10-29 10:09:47 -07:00
Charles Hacskaylo
11ca39b94c [Frontend] t-item-icon
open #90
Tweaked bottom position of link indicator;
2015-10-28 21:44:56 -07:00
Charles Hacskaylo
bb0e27ce1f [Frontend] Restored erroneously checked in bundles.json;
open #90
2015-10-28 21:35:43 -07:00
Charles Hacskaylo
56e8cd81e6 [Frontend] Refinements to t-item-icon
open #90
Scale approach to link indicator changed from
font-size to transform: scale;
Now works in tree, item grid and Inspector;
2015-10-28 21:34:01 -07:00
Andrew Henry
e37fa75289 Added basic notifications on copy 2015-10-28 17:16:53 -07:00
Andrew Henry
ee314ab387 Added notifications 2015-10-28 17:05:05 -07:00
Victor Woeltjen
90389ea910 [Time Conductor] Increase test specificity
Explicitly check for boolean values (not just truthy/falsy values)
per feedback from code review, nasa/openmctweb#204.
2015-10-28 09:56:50 -07:00
Victor Woeltjen
d1bc93cd31 [Mobile] Don't move DOM nodes
When including/excluding a DOM element via mct-device,
use replaceWith() instead of parent().append() to preserve
original ordering of DOM elements from template.
nasa/openmctweb#213.
2015-10-28 09:50:48 -07:00
Victor Woeltjen
0541f6edfa [Time Conductor] Add JSDoc to plot
Add JSDoc to scripts/methods added to the Plot plug-in to support
integration of custom formats for timestamps.
2015-10-28 08:47:04 -07:00
Victor Woeltjen
0ad22f6842 [Time Conductor] Add JSDoc to new bundle
Add JSDoc to platform/commonUI/formats, introduced to support
different time formats from the time conductor.
nasa/openmctweb#182.
2015-10-28 08:29:56 -07:00
Charles Hacskaylo
134d853f19 [Frontend] type-icon evolving to universal t-item-icon
open #90
Major work in-progress on switching to .t-item-icon from
.type-icon to get item icons working better, especially
in .inspector-location in Inspector;
Significant mods to label.html;
2015-10-28 00:24:57 -07:00
Victor Woeltjen
00c0019122 [Time Conductor] Add test cases
...to cover FormatProvider.
2015-10-27 17:44:57 -07:00
Victor Woeltjen
e80d094174 [Time Conductor] Add test cases
...to cover UTCTimeFormat.
2015-10-27 17:39:16 -07:00
Victor Woeltjen
60ba80d307 [Time Conductor] Add empty specs
...to platform/commonUI/formats bundle, introduced to support
formatting of non-UTC time domains for time conductor.
2015-10-27 17:34:28 -07:00
Victor Woeltjen
c89aa026b0 [Time Conductor] Add JSDoc for Format interface 2015-10-27 17:31:02 -07:00
Victor Woeltjen
8a3f77d784 [Time Conductor] Simplify bundle name 2015-10-27 17:26:08 -07:00
Victor Woeltjen
15a5c593fa [Time Conductor] Add spec for formatter
Add spec to telemetryFormatter wrapper used by plot to isolate
changes to domain/range formats.
2015-10-27 17:25:08 -07:00
Charles Hacskaylo
fc704b8056 [Frontend] Fixed and finessed mobile expand collapse
open #90
Fixed problem of right pane primary not going all the way left;
Finessed timing of tree pane fade in / fade out;
2015-10-27 17:18:40 -07:00
Charles Hacskaylo
0a19ab4389 Merging in latest github/master
open #90
Squashed commit of the following:

commit a2d06583ca
Merge: 74f289c 5d5425d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 27 14:04:49 2015 -0700

    Merge pull request #216 from nasa/open-vista54a

    Review and integrate open-vista54a into master

commit 5d5425db04
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Tue Oct 27 11:50:16 2015 -0700

    [Frontend] Finessing and verifying CSS

    vista#54
    Verified against fixed position and scrolling views
    using SineWave generator;
    font-size of glyph tweaked;

commit a8856c0612
Author: Charles Hacskaylo <charlesh88@gmail.com>
Date:   Tue Oct 27 11:40:35 2015 -0700

    [Frontend] Platform-specific mods to limits

    vista#54
    Refactor limits into multiple classes, separating
    upr/lwr from red/yellow;
    Modded SineWaveLimitCapability accordingly;
    Normalized upr/lwr glyphs;
    (cherry picked from commit a26d71b)

commit 74f289cb34
Merge: 4ec243c 29bdc9d
Author: akhenry <akhenry@gmail.com>
Date:   Tue Oct 27 10:48:33 2015 -0700

    Merge pull request #206 from nasa/open150b

    [Plot] Ignore empty lines

commit 4ec243c6fb
Merge: 407d988 3d996ac
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Sat Oct 24 07:48:45 2015 -0700

    Merge pull request #212 from nasa/open211

    [RequireJS] Specify path for uuid

commit 407d9881ff
Merge: 6ee622b 21739ff
Author: akhenry <akhenry@gmail.com>
Date:   Fri Oct 23 19:16:51 2015 -0700

    Merge pull request #200 from nasa/open-toc

    [Documentation] Add table of contents

commit 6ee622b3f5
Merge: 099d70b 87e317a
Author: akhenry <akhenry@gmail.com>
Date:   Fri Oct 23 17:04:04 2015 -0700

    Merge pull request #192 from nasa/open153

    [CI] Remove non-existent bundle from procfile

commit 099d70b8d9
Merge: 90828ef 8e2a2ee
Author: akhenry <akhenry@gmail.com>
Date:   Fri Oct 23 17:00:46 2015 -0700

    Merge pull request #175 from nasa/open147

    [Entanglement] Add "Go To Original" action

commit 3d996ac466
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 23 16:32:05 2015 -0700

    [RequireJS] Specify path for uuid

    Specify path for uuid, making it available for any code that would require it,
    without that code needing to know the path to it.

    Fixes https://github.com/nasa/openmctweb/issues/211.

commit 90828ef63d
Merge: bf24ac7 dbebf08
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 23 16:23:29 2015 -0700

    Merge remote-tracking branch 'github-open/open181' into open-master

commit 29bdc9d574
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Oct 23 13:04:06 2015 -0700

    [Plot] Ignore empty lines

    Ignore empty lines (plot lines with no data) when determining
    domain extrema; avoids failure to draw multiple plot lines in
    a telemetry panel, nasa/openmctweb#150.

commit bf24ac7c93
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Fri Oct 23 12:14:46 2015 -0700

    [Search] Update field name

    Update field name in GenericSearchProvider to reflect changes
    from nasa/openmctweb#193. Avoids exceptions on mutation.

    Additionally, add test case exercising relevant code and verifying
    that reindexing is scheduled upon mutation as expected.

commit 59f094763b
Merge: 3080861 496cf85
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Thu Oct 22 16:58:02 2015 -0700

    Merge pull request #193 from nasa/search-performance

    Search performance

commit dbebf08500
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 15:38:58 2015 -0700

    [Time Controller] Add test cases

    ...to verify behavior on text entry of dates.

commit 847c356063
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 15:26:42 2015 -0700

    [Time Controller] Change color when input is invalid

    nasa/openmctweb#181

commit 06bcd28558
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 15:22:00 2015 -0700

    [Time Controller] Keep inputs in sync

    Keep inputs in sync with displayed data in time controller,
    without overwriting user-entered text. nasa/openmctweb#181

commit f88e8ebb51
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 15:08:44 2015 -0700

    [Time Controller] Update model state for text entry

commit 6d2b2fd81e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 14:46:12 2015 -0700

    [Time Controller] Parse user-entered timestamps

    nasa/openmctweb#181.

commit 608800ae63
Merge: 07818b0 fb0ce1e
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 14:40:42 2015 -0700

    Merge remote-tracking branch 'github/master' into open181

    Conflicts:
    	platform/commonUI/general/res/templates/controls/time-controller.html

commit 07818b0a6d
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Wed Oct 21 14:35:18 2015 -0700

    [Time Controller] Show bounds in a text field

    Show bounds in a text field to allow user editing; supports manual
    editing of time controller bounds, nasa/openmctweb#181.

commit 496cf85b7e
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Oct 21 09:46:32 2015 -0700

    [JSDoc] Correct mistake

commit 833f57e284
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Wed Oct 21 07:39:59 2015 -0700

    [Search] Don't block UI between requests

    Timeout subsequent calls to keepIndexing at the end of a
    indexRequest, so that UI operations are not blocked.

commit 9a63e99710
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 16:01:42 2015 -0700

    [Search] Add spec for ElasticSearchProvider

    Add spec coverage for ElasticSearchProvider.  Also remove
    unneeded guards for max number of results, as the aggregator
    will always provide a max number of results.

commit 21739fffd9
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 20 15:52:49 2015 -0700

    [Documentation] Add table of contents

    Add table of contents to generated documents, without
    modifying document sources; nasa/openmctweb#189.

commit 77d81f899b
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 15:31:33 2015 -0700

    [Style] JSLint compliance

commit fe3263fdfe
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 15:27:46 2015 -0700

    [Search] Remove invalid specs

commit ce42429fbd
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 15:14:43 2015 -0700

    [Search] expose constants, add fudge factor

    The SearchAggregator exposes it's constants to add stability to
    tests.

    It also has a fudge factor which increaases the number of results
    it requests from providers to better support pagination when using
    client side filtering.

commit 76151d09a0
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 15:13:37 2015 -0700

    [Search] use service for filters, add spec

    Add a spec for the SearchController, and use the SearchService to
    execute filters by supplying a filterPredicate.

commit ec7e6cc5b4
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 13:55:46 2015 -0700

    [Search] Update spec for Generic Search Worker

commit 1ddce48f7e
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Tue Oct 20 13:12:04 2015 -0700

    [Search] Specs for GenericSearchProvider

    Write specs for GenericSearchProvider and resolve some implementation
    bugs they uncovered.

commit 98b5ff3c77
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 18:14:33 2015 -0700

    [Search] Decrement number of pending requests

commit 14094a48fc
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 17:33:23 2015 -0700

    [Search] Remove old specs in prep for rewrite

    Remove old specs in prep for rewrite.

commit 8e2a2eeba5
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Mon Oct 19 12:08:49 2015 -0700

    [Entanglement] Add license headers

    ...per code review feedback from nasa/openmctweb#175

commit 0f63e4dde9
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 17:06:23 2015 -0700

    [Tests] Rewrite search aggregator specs

commit 12efb47be7
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 16:09:51 2015 -0700

    [Search] Remove timeouts and timestamps

    Remove timeouts and timestamps which were not effectively doing anything.

commit a2fce8e56c
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 16:05:31 2015 -0700

    [Search] Rewrite elasticsearch provider with prototype

    Rewrite the elasticsearch provider to use prototypes and clean up the implementation.

    Now returns a modelResults object to keep it in line with the general search
    provider.

commit 78e5c0143b
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 15:26:46 2015 -0700

    [Search] Overhaul generic search provider

    Rewrite the generic search provider to use prototypes.  Increase performance
    by utilizing the model service instead of the object service, and use a
    simplified method of request queueing.

commit 099591ad2e
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 15:26:04 2015 -0700

    [Search] Aggregator returns objects, providers return models

    Search providers return search results as models for domain objects, as the
    actual number of max results is enforced by the aggregator, and because the
    individual providers store and return the models for their objects already.

    This lowers the amount of resources consumed instantiating domain objects, and
    also allows the individual search providers to implement function-based
    filtering on domain object models, which is beneficial as it allows the search
    filtering in the search controller to be done before paginating of results.

commit b5505f372f
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 12:39:41 2015 -0700

    [Search] Generic Worker Performance Tweaks

    The generic search worker now does indexing work during the index operation,
    ensuring that queries do not have to do extraneous or repeat calculations.

    Change the return format slightly and fixed a bug in the GenericSearchProvider
    which caused more objects than intended to be returned from the provider.

commit 9ad860babd
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 12:34:47 2015 -0700

    [Search] Rewrite search controller, tidy

    Rewrite the search controller, making numerous changes and using prototypical
    style.

    First, the search controller immediately hides previous results when a new
    search is started.  Secondly, the search controller ensures that search results
    displayed match the currently entered query, preventing race conditions.  Finally,
    the search controller uses a poor filtering option that means it may not display
    all results.

commit 87e317a6f5
Author: Pete Richards <peter.l.richards@nasa.gov>
Date:   Fri Oct 16 11:33:42 2015 -0700

    [CI] Remove non-existent bundle from procfile

    Remove the example/localstorage bundle from the procfile.

    Fixes #153.

commit bf41d82a78
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 6 16:50:35 2015 -0700

    [Entanglement] Restore missing specs

    Restore specs which had been omitted from suite.json (but currently
    succeed for the relevant scripts); done in the context of
    nasa/openmctweb#147

commit a4944717a1
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 6 16:47:37 2015 -0700

    [Location] Test getOriginal method

commit 70bbd3cf97
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 6 16:37:37 2015 -0700

    [Entanglement] Add test cases for Go To Original

commit e3afaf0842
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 6 16:22:16 2015 -0700

    [Entanglement] Add Go To Original

    nasa/openmctweb#147

commit 60f2f9fb6c
Author: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date:   Tue Oct 6 16:08:48 2015 -0700

    [Location] Add getOriginal method

    Add a getOriginal method to the location capability, to simplify
    loading of original versions of objects. nasa/openmctweb#147
2015-10-27 17:17:10 -07:00
Victor Woeltjen
9e8152719f [Time Conductor] Add spec
Add spec for DateTimeFieldController, bringing over test cases
removed from TimeRangeController.
2015-10-27 17:12:03 -07:00
Victor Woeltjen
55745d281f [Time Conductor] Update PlotAxis spec
...to reflect ability to change domain selection without
reinstantiation, supporting integration of domain-driven
formatting of X axis values in a plot.
2015-10-27 16:18:13 -07:00
Victor Woeltjen
8ba112498b [Time Conductor] Add test case for formats
Add test case to TimeRangeController to reflect that it responds
to changes in format selection.
2015-10-27 15:57:44 -07:00
Victor Woeltjen
44fc9423df Merge branch 'open-master' into open182
Merge in latest from master branch into topic branch
for nasa/openmctweb#182
2015-10-27 15:54:18 -07:00
Victor Woeltjen
bd8bbc6e8f [Time Conductor] Update PlotController spec
...and add check to updateValues in PlotController, to reflect
changes made to restore support for domain switching.
2015-10-27 15:52:11 -07:00
Victor Woeltjen
2ee53b17db [Time Conductor] Update ConductorTelemetryDecorator spec
...to reflect that TimeConductor exposes whole domain metadata, not
just key.
2015-10-27 15:46:21 -07:00
Victor Woeltjen
60e97eb94a [Time Conductor] Update ConductorRepresenter spec
...to reflect that TimeConductor exposes whole domain metadata, not
just key.
2015-10-27 15:43:31 -07:00
Victor Woeltjen
ce5a650d8c [Time Conductor] Update TimeConductor spec
...to reflect that whole domain metadata, not just key, is exposed.
2015-10-27 15:40:34 -07:00
Victor Woeltjen
5ff2e6b652 [Time Conductor] Simplify passing in of axis type
...in PlotAxis. Also avoids triggering failures of existing tests.
2015-10-27 15:39:20 -07:00
Victor Woeltjen
f30a2dd791 [Time Conductor] Update telemetryFormatter spec 2015-10-27 15:37:08 -07:00
Victor Woeltjen
920c83771d [Time Conductor] Update spec
...for TimeRangeController to reflect separation of date-time
inputs into a separate control.

Additionally, removed unused function.
2015-10-27 14:06:02 -07:00
Victor Woeltjen
cc8a7e513f [Time Conductor] Rename bundle
Rename platform/time to platform/commonUI/formatting; nothing
particularly specific to time about these interfaces, and
removal of non-formatting-related methods makes this essentially
a UI concern.
2015-10-27 13:11:04 -07:00
Victor Woeltjen
9dce3a04cc [Time Conductor] Remove obsolete code
Remove code related to handling text input from TimeRangeController;
moved into DateTimeFieldController.
2015-10-27 13:07:58 -07:00
Victor Woeltjen
18cdaf1b53 [Time Conductor] Fix extension definition
For date time field controller; refer to correct implementation.
2015-10-27 13:03:04 -07:00
Victor Woeltjen
e5d4376f06 [Time Conductor] Use date time field
...from template for time controller.
2015-10-27 13:01:27 -07:00
Victor Woeltjen
6784c6567b [Time Conductor] Add date-time field
Add mct-control which includes both the date-time picker and
its corresponding text entry area, per code review feedback
from nasa/openmctweb#204.
2015-10-27 13:00:42 -07:00
Victor Woeltjen
71618ce4b9 [Time Conductor] Hide date-picker for non-UTC formats 2015-10-27 12:40:14 -07:00
Victor Woeltjen
e5ebbdaf7f [Time Conductor] Use domain formats in scrolling list 2015-10-27 12:37:53 -07:00
Victor Woeltjen
6b805183b0 [Time Conductor] Parse negative values
...in example telemetry
2015-10-27 12:35:15 -07:00
Victor Woeltjen
9723c65016 [Time Conductor] Retain domain selection in plot
Avoid various cases where domain selection is temporarily
overwritten due to transient plot state (e.g. because no
telemetry metadata is yet available due to asynchronous
retrieval of delegates.)
2015-10-27 12:09:54 -07:00
Victor Woeltjen
7bd0e279b0 Merge remote-tracking branch 'github/master' into open182
Merge latest from master branch into topic branch for
nasa/openmctweb#182
2015-10-27 11:49:36 -07:00
Victor Woeltjen
caee1f520f [Time Conductor] Remove unused watches from plot 2015-10-27 11:46:41 -07:00
Victor Woeltjen
b375ede217 [Time Conductor] Recognize domain changes in plot 2015-10-27 11:39:23 -07:00
Victor Woeltjen
0bd1d53d25 [Time Conductor] Update plot to support different formats
...for telemetry domain values.
2015-10-27 11:22:19 -07:00
Victor Woeltjen
3fe386fcd6 [Time Conductor] Use formatService from telemetryFormatter 2015-10-27 11:21:44 -07:00
Victor Woeltjen
82b321b3f9 [Time Conductor] Update displayed text when format changes 2015-10-27 10:28:32 -07:00
Victor Woeltjen
3bdaae292e [Time Conductor] Parse deltas relative to generation start 2015-10-27 10:27:29 -07:00
Victor Woeltjen
b627de45ba [Time Conductor] Fix bundle definition
...such that the delta domain exposes its format, and its format
is exposed correctly under the formats extension category.
Supports testing of time conductor support for alternative
time formatting.
2015-10-27 10:01:32 -07:00
Victor Woeltjen
2056f3aed0 [Time Conductor] Update property name
Renamed system to format per code review feedback,
nasa/openmctweb#204
2015-10-27 10:00:35 -07:00
Victor Woeltjen
b928b7d3f2 [Time Conductor] Fix time calculation in example telemetry 2015-10-27 09:54:09 -07:00
Victor Woeltjen
df6cd8f403 [Time Conductor] Expose domain options
...for example telemetry, to test domain selection.
2015-10-27 09:50:59 -07:00
Victor Woeltjen
c6b7121cf0 [Time Conductor] Expose getFormat correctly
...as an instance method of FormatProvider
2015-10-27 09:45:17 -07:00
Victor Woeltjen
86c61f7543 [Time Conductor] Fix extension definition
...for FormatProvider. Depends should be an array.
2015-10-27 09:41:32 -07:00
Victor Woeltjen
741fc57442 [Time Conductor] Add alternate domain
Begin adding a more timelike alternately-formatted domain
to sine waves; the 'delta' can be expressed as UTC timestamps
but will be formatted for display as a time relative to
when sine wave generation began.
2015-10-27 09:39:48 -07:00
Charles Hacskaylo
daed6a5b06 Frontend] Tweaked sizes of mini-tabs and pane collapsed edge margin
open #90
2015-10-26 15:01:32 -07:00
Charles Hacskaylo
498f854bef Frontend] Treeview expand/collapse anim timing tweaks
open #90
2015-10-26 14:54:09 -07:00
Charles Hacskaylo
77a1a90905 Frontend] Normalizing styles for items and l-icon-link
open #90
2015-10-26 14:48:50 -07:00
Charles Hacskaylo
f655346f46 Frontend] More refining of collapsing treeview
open #90
Treeview and Inspector should be hidden by default
when opening in a new tab;
2015-10-26 12:19:37 -07:00
Victor Woeltjen
20cb2ff239 [Clocks/Timers] Bring in latest
Merge in latest from master branch to support review of
changes, nasa/openmctweb#207
2015-10-26 10:42:41 -07:00
Charles Hacskaylo
7d42292184 Frontend] More refining of collapsing treeview
open #90
Treeview and search now transition properly when user collapses
left pane while searching;
2015-10-26 10:35:41 -07:00
Victor Woeltjen
ed9a5b0890 [Time Conductor] Roll back changes to example telemetry
In particular, remove the timeService implementation; this is made
obsolete by a switch to a simpler format-based approach.
2015-10-26 10:06:58 -07:00
Victor Woeltjen
aa23d358cc [Time Conductor] Use formatService instead of timeService 2015-10-26 10:03:49 -07:00
Charles Hacskaylo
fd582d45d2 Frontend] More refining of collapsing treeview
open #90
Create and Search controls now properly change
to mini-tabs when treeview is collapsed;
Mods to .create-btn to use :before for symbol instead of span;
 TO-DO: why does mct-device alter the order of items in the rendered
 markup?
2015-10-26 10:01:52 -07:00
Victor Woeltjen
0f34d38451 [Time Conductor] Remove obsolete formatting classes 2015-10-26 09:57:14 -07:00
Victor Woeltjen
f8ee244475 [Time Conductor] Expose FormatProvider 2015-10-26 09:56:37 -07:00
Victor Woeltjen
322d1c8389 [Time Conductor] Add formatProvider
...to handle lookup of extensions of category 'formats'
2015-10-26 09:54:57 -07:00
Victor Woeltjen
c45bf45475 [Time Conductor] Remove non-format-like methods
...from UTCTimeSystem, and rename to UTCTimeFormat. Per code
review feedback from nasa/openmctweb#182.
2015-10-26 09:48:54 -07:00
Charles Hacskaylo
8ee4fc9b71 [Frontend] Fixed spacing of panes and mini-tabs
open #90
Splitter spacing now being handled in CSS, so
modded calcs in MCTSplitPane to not add space;
CSS calcs adjusted; comments removed;
2015-10-24 18:43:13 -07:00
Charles Hacskaylo
99c977ce9d [Frontend] Fixed mini-tab positioning algorithm
open #90
2015-10-24 17:48:59 -07:00
Charles Hacskaylo
85809ae1e1 [Frontend] Fixed mini-tab positioning algorithm
open #90
2015-10-24 17:01:52 -07:00
Charles Hacskaylo
94649b12fd [Frontend] Splitter re-styling
open #90
Significant redo of splitter styling;
2015-10-23 20:06:38 -07:00
Charles Hacskaylo
aa3cf70b22 [Frontend] Expand/collapse styling
open #90
Significant styling on new mini-tabs;
Main layout margins adjusted;
2015-10-23 18:24:55 -07:00
Victor Woeltjen
8acf01ebdf [Tests] Declare deps for moment-duration-format
...in karma test runners.
2015-10-23 16:03:57 -07:00
Victor Woeltjen
ddb567aeb5 [Clocks/Timers] Declare dependency of moment-duration-format
...to ensure that moment is loaded first, such that
the plugin can correctly install itself.
nasa/openmctweb#204
2015-10-23 15:46:47 -07:00
Charles Hacskaylo
17b3378655 [Frontend] Expand/collapse styling
open #90
Modding mini-tab look, just started;
2015-10-23 15:36:52 -07:00
Charles Hacskaylo
efd209826d [Frontend] Inspector styling, in progress
open #90
Significant styling in object-inspector.html;
2015-10-23 15:14:07 -07:00
Victor Woeltjen
a43c8f2ce8 [Timeline] Disable timelines due to missing styles
WTD-1239.
2015-10-23 14:14:24 -07:00
Victor Woeltjen
fffe07e7e6 [Timeline] Remove namespacing from specs 2015-10-23 14:06:55 -07:00
Victor Woeltjen
26db524f0e [Timelines] Rename bundle 2015-10-23 13:57:15 -07:00
Victor Woeltjen
4fcef33c58 [Timelines] De-namespace timeline's DateTimeController 2015-10-23 13:56:34 -07:00
Victor Woeltjen
dc9369c0f1 [Timelines] Remove namespacing from controllers
WTD-1239
2015-10-23 13:54:19 -07:00
Victor Woeltjen
c5b786e5e0 [Timeline] De-namespace capabilities
WTD-1239.
2015-10-23 13:52:48 -07:00
Victor Woeltjen
3e0534c4c3 [Timeline] Update namespacing in templates
WTD-1239
2015-10-23 13:49:46 -07:00
Victor Woeltjen
19ad4c8174 [Timelines] Change namespacing for directives
WTD-1239
2015-10-23 13:48:07 -07:00
Victor Woeltjen
8159c365b5 [Timeline] Remove namespacing from README
WTD-1239
2015-10-23 13:45:54 -07:00
Victor Woeltjen
307047d3ac [Clocks/Timers] Remove namespacing from specs
WTD-1239
2015-10-23 13:44:39 -07:00
Victor Woeltjen
83f135e48c Merge remote-tracking branch 'github/master' into open1239 2015-10-23 13:39:09 -07:00
Charles Hacskaylo
a7ea4c3c6e [Frontend] Inspector styling, in progress
open #90
2015-10-23 12:35:55 -07:00
Charles Hacskaylo
1d3870d07f [Frontend] Manual integration of Inspector
open #90
open #73
Adding missed new files;
2015-10-23 11:42:06 -07:00
Charles Hacskaylo
2452b25fd4 [Frontend] Manual integration of Inspector
open #90
open #73
In-progress manual integrated Sarah Hale's work on ObjectInspector;
2015-10-23 11:37:02 -07:00
Charles Hacskaylo
0c4d422e2d [Frontend] Manual re-do of collapse/expand panes
open #90
Refactored templates to move all split-pane elements into browse.html;
2015-10-23 11:13:51 -07:00
Charles Hacskaylo
a283a2a0d3 [Frontend] Manual re-do of collapse/expand panes
open #90
Animation, styles, hide-show added panes and splitters;
Finessed spacing;
trans-prop* mixins normalized and added delay arg;
2015-10-23 10:52:28 -07:00
Charles Hacskaylo
827e1af581 [Frontend] Manual re-do of collapse/expand panes
open #90
Added code to MCTSplitter and MCTSplitPane to allow
toggling of CSS class 'resizing' on pane elements when
the user is actively using the splitter;
Added resize transition animation to split pane elements
when user not actively resizing;
2015-10-23 09:18:59 -07:00
Charles Hacskaylo
57f11a9767 [Frontend] Manual re-do of collapse/expand panes
open #90
Refined positioning of .mini-tab elements when
panes are collapsed;
2015-10-22 19:26:59 -07:00
Charles Hacskaylo
3687cc5edd [Frontend] Manual re-do of collapse/expand panes
open #90
Fixed broken mobile styles;
Removed commented out scss;
2015-10-22 18:45:47 -07:00
Charles Hacskaylo
bf17b77e82 Merge remote-tracking branch 'github/prod-uisymbols' into open90 2015-10-22 18:28:55 -07:00
Charles Hacskaylo
536d5616d4 [Frontend] Manual re-do of collapse/expand panes
open #90
Major work on new .mini-tab elements, used
as controls to expand/collapse panes;
Cleaned up splitter hover behavior;
Changed mixin controlGrippy to not be tied
to :before;
2015-10-22 18:28:25 -07:00
Victor Woeltjen
111b3bac09 [Time Conductor] Remove dateService
Replaced by timeService
2015-10-22 16:27:21 -07:00
Victor Woeltjen
67cf8d8cee [Time Conductor] Support index domain from sine wave 2015-10-22 16:24:55 -07:00
Victor Woeltjen
b4dd95490c [Time Conductor] Don't treat defaults as invalid 2015-10-22 16:07:21 -07:00
Victor Woeltjen
16e4c32709 [Time Conductor] Remove now dependency, fix domain switch
Remove dependency on now (current time can be retrieved via
timeService); fix domain-switching behavior such that changes
to time systems are reflected in changes to default bounds.
2015-10-22 16:05:09 -07:00
Victor Woeltjen
a154c9c870 [Time Conductor] Use timeService from control 2015-10-22 15:51:12 -07:00
Victor Woeltjen
1e71df5ce9 [Time Conductor] Implement timeService in sinewave telemetry
Switch from initial dateService interface to more practical
timeService interface.
2015-10-22 15:27:40 -07:00
Victor Woeltjen
5e9f38dadd [Time Conductor] Add dependency to UTCTimeProvider 2015-10-22 15:20:54 -07:00
Victor Woeltjen
552435b009 [Time Conductor] Add bundle for time handling 2015-10-22 15:20:12 -07:00
Charles Hacskaylo
4f27104663 [Frontend] Manual re-do of collapse/expand panes
open #90
Implementing PaneController;
Added inspection pane and toggle button in
browse-object.html;
2015-10-22 14:26:22 -07:00
Charles Hacskaylo
b98c1cdfe8 [Frontend] Manual re-do of collapse/expand panes
open #90
Renamed BrowseTreeController to PaneController;
Ensuring mobile functionality parity;
2015-10-22 13:34:16 -07:00
Victor Woeltjen
4ff03b081d [Time Conductor] Suppress date picker for non-UTC time systems 2015-10-22 13:08:37 -07:00
Victor Woeltjen
e8d7093eb5 [Time Conductor] Use time systems from time conductor 2015-10-22 13:07:04 -07:00
Victor Woeltjen
9bc4327c59 [Time Conductor] Add non-time-like domain
Add a non-time-like domain to sine wave generator telemetry,
to support integration of custom domain formatting into
time conductor.
2015-10-22 12:51:18 -07:00
Victor Woeltjen
c0fda5b572 [Time Conductor] Add JSDoc
Add typedefs relevant to the date aggregator; in particular,
document properties used to determine how to format timestamps
associated with a telemetry point.
2015-10-22 12:41:46 -07:00
Victor Woeltjen
950578f09b [Time Conductor] Hide datetime pickers for non-UTC domains 2015-10-22 12:20:15 -07:00
Victor Woeltjen
117470068a [Time Conductor] Use dateService from TimeRangeController 2015-10-22 12:17:08 -07:00
Victor Woeltjen
0d47b7c47d [Time Conductor] Expose dateService in bundle definition 2015-10-22 12:10:12 -07:00
Victor Woeltjen
c882b2d4c3 [Time Conductor] Implement date provider
Implement UTCDateProvider sufficient to pass spec.
2015-10-22 12:08:34 -07:00
Victor Woeltjen
794231143e [Time Conductor] Add spec for UTCDateProvider
Add test cases for UTCDateProvider, which will provide default
date/time formatting/parsing.
2015-10-22 11:55:38 -07:00
Victor Woeltjen
6b42d3bf4b [Time Conductor] Test DateAggregator 2015-10-22 11:54:46 -07:00
Victor Woeltjen
1c5101eca6 [Time Conductor] Add DateAggregator
Add DateAggregator, to allow composite services to expose
different ways of parsing/formatting dates.
nasa/openmctweb#182.
2015-10-22 11:30:57 -07:00
Charles Hacskaylo
be79c104fb [Frontend] Added new glyph
prod-uisymbols
Added e612 Save icon;
2015-10-20 12:36:11 -07:00
Henry
6d08c81b3b First iteration of duplication complete 2015-10-20 12:18:30 -07:00
Andrew Henry
89e763b515 Incremental commit of Duplication 2015-10-20 09:25:31 -07:00
Henry
2a1388772a Incremental commit of duplication 2015-10-19 17:32:43 -07:00
Andrew Henry
fa3821b50f Update of CopyService with new copy algorithm (incomplete) 2015-10-18 20:58:17 -07:00
Charles Hacskaylo
821a1a485c [Production] Updated symbols font to v25
open #188
Added icon-dataset e611;
2015-10-14 16:45:55 -07:00
Victor Woeltjen
61a272b257 [API Redesign] Add note about Web Workers
Add note about RequireJS as a dependency injector
facilitating use from web workers, as noted in
comments to nasa/openmctweb#141
2015-09-30 13:59:53 -07:00
Victor Woeltjen
b4c0de84d8 Intermediary commit; considering imperative plugins 2015-09-16 16:32:48 -07:00
Victor Woeltjen
8ce8080253 [Timelines] Begin removing namespacing
Begin de-namespacing timelines/activities for inclusion
in open source. WTD-1239
2015-09-15 08:34:15 -07:00
Victor Woeltjen
96f72b3765 [Clocks] Add license, change keys
Un-namespace keys in clock plugin, and add licensing
info for moment-duration-format. WTD-1239
2015-09-14 16:52:56 -07:00
Victor Woeltjen
c932e953bc [Plugins] Bring over timeline, clock plugins
WTD-1239
2015-09-14 16:45:41 -07:00
Victor Woeltjen
c91e914c22 [API Redesign] Add proposal to improve fault tolerance
Related to #79
2015-09-11 12:26:45 -07:00
Victor Woeltjen
c2971fd485 [API] Propose telemetry API revisions 2015-09-04 09:30:09 -07:00
Victor Woeltjen
7d94e20c8f [API] Add proposals for capability changes
WTD-1237
2015-09-01 09:36:04 -07:00
Victor Woeltjen
8f8dd6c11f [API] Propose nomenclature change
WTD-1237
2015-08-27 16:01:47 -07:00
Victor Woeltjen
553e226a5d [API] Add proposal for removing delegation 2015-08-20 14:34:59 -07:00
Victor Woeltjen
dfacf08e45 [API] Propose registering instances
WTD-1237
2015-08-19 13:44:34 -07:00
Victor Woeltjen
e7fa0e9f21 [API] Add proposal w.r.t. third-party APIs
WTD-1237
2015-08-19 13:26:58 -07:00
Victor Woeltjen
ccfafb6f89 [API] Add more proposals
WTD-1237
2015-08-19 13:07:54 -07:00
Victor Woeltjen
097794d94f [API] Smaller redesign notes 2015-08-18 17:55:15 -07:00
Victor Woeltjen
cd51c359eb [API] Add notes on bundles to API redesign 2015-08-18 16:37:58 -07:00
Victor Woeltjen
2adf84b082 [API] Add proposal for wrapping Angular services 2015-08-18 16:14:14 -07:00
Victor Woeltjen
4c00d5d58f [API] Propose view changes 2015-08-18 15:45:36 -07:00
Victor Woeltjen
844d608fb9 [API] Begin proposing changes 2015-08-18 14:02:30 -07:00
Victor Woeltjen
d46eea64e4 Merge remote-tracking branch 'github/api-redesign' into api-redesign
Conflicts:
	docs/src/design/proposals/APIRedesign.md
2015-08-17 09:56:46 -07:00
Victor Woeltjen
4d4fe7f626 [API] Incorporate newer feedback 2015-08-17 09:49:34 -07:00
Victor Woeltjen
12760b63b9 [API] Add additional feedback 2015-08-17 09:38:30 -07:00
Victor Woeltjen
8fae298fde [API] Fix heading depth 2015-08-14 12:32:51 -07:00
Victor Woeltjen
7ddaa4614b [API] Fix markdown formatting 2015-08-14 12:23:11 -07:00
Victor Woeltjen
f1bc15bf4f [API] Begin adding notes for API redesign 2015-08-14 12:18:53 -07:00
411 changed files with 35475 additions and 7817 deletions

2
.gitignore vendored
View File

@@ -28,3 +28,5 @@ node_modules
# Protractor logs
protractor/logs
# npm-debug log
npm-debug.log

View File

@@ -291,7 +291,7 @@ checklist.)
1. Changes address original issue?
2. Unit tests included and/or updated with changes?
3. Command line build passes?
4. Expect to pass code review?
4. Changes have been smoke-tested?
### Reviewer Checklist

View File

@@ -345,6 +345,41 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
---
### moment-duration-format
#### Info
* Link: https://github.com/jsmreese/moment-duration-format
* Version: 1.3.0
* Authors: John Madhavan-Reese
* Description: Duration parsing/formatting
#### License
Copyright 2014 John Madhavan-Reese
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.
---
### Json.NET
#### Info

View File

@@ -6,6 +6,7 @@
"platform/commonUI/browse",
"platform/commonUI/edit",
"platform/commonUI/dialog",
"platform/commonUI/formats",
"platform/commonUI/general",
"platform/commonUI/inspect",
"platform/commonUI/mobile",
@@ -14,19 +15,23 @@
"platform/containment",
"platform/execution",
"platform/telemetry",
"platform/features/clock",
"platform/features/events",
"platform/features/imagery",
"platform/features/layout",
"platform/features/pages",
"platform/features/plot",
"platform/features/scrolling",
"platform/features/events",
"platform/features/timeline",
"platform/forms",
"platform/identity",
"platform/persistence/aggregator",
"platform/persistence/local",
"platform/persistence/queue",
"platform/policy",
"platform/entanglement",
"platform/search",
"platform/status",
"example/imagery",
"example/eventGenerator",

9
docs/footer.html Normal file
View File

@@ -0,0 +1,9 @@
<hr>
<cite>
This document is styled using
<a href="https://github.com/jasonm23/markdown-css-themes">
https://github.com/jasonm23/markdown-css-themes
</a>.
</cite>
</body>
</html>

View File

@@ -20,7 +20,7 @@
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global require,process,GLOBAL*/
/*global require,process,__dirname,GLOBAL*/
/*jslint nomen: false */
@@ -47,6 +47,8 @@ GLOBAL.window = GLOBAL.window || GLOBAL; // nomnoml expects window to be define
nomnoml = require('nomnoml'),
toc = require("markdown-toc"),
Canvas = require('canvas'),
header = fs.readFileSync(path.resolve(__dirname, 'header.html')),
footer = fs.readFileSync(path.resolve(__dirname, 'footer.html')),
options = require("minimist")(process.argv.slice(2));
// Convert from nomnoml source to a target PNG file.
@@ -104,7 +106,7 @@ GLOBAL.window = GLOBAL.window || GLOBAL; // nomnoml expects window to be define
}
// Convert from Github-flavored Markdown to HTML
function gfmifier() {
function gfmifier(renderTOC) {
var transform = new stream.Transform({ objectMode: true }),
markdown = "";
transform._transform = function (chunk, encoding, done) {
@@ -112,12 +114,14 @@ GLOBAL.window = GLOBAL.window || GLOBAL; // nomnoml expects window to be define
done();
};
transform._flush = function (done) {
// Prepend table of contents
markdown =
[ TOC_HEAD, toc(markdown).content, "", markdown ].join("\n");
this.push("<html><body>\n");
if (renderTOC){
// Prepend table of contents
markdown =
[ TOC_HEAD, toc(markdown).content, "", markdown ].join("\n");
}
this.push(header);
this.push(marked(markdown));
this.push("\n</body></html>\n");
this.push(footer);
done();
};
return transform;
@@ -166,13 +170,16 @@ GLOBAL.window = GLOBAL.window || GLOBAL; // nomnoml expects window to be define
var destination = file.replace(options['in'], options.out)
.replace(/md$/, "html"),
destPath = path.dirname(destination),
prefix = path.basename(destination).replace(/\.html$/, "");
prefix = path.basename(destination).replace(/\.html$/, ""),
//Determine whether TOC should be rendered for this file based
//on regex provided as command line option
renderTOC = file.match(options['suppress-toc'] || "") === null;
mkdirp(destPath, function (err) {
fs.createReadStream(file, { encoding: 'utf8' })
.pipe(split())
.pipe(nomnomlifier(destPath, prefix))
.pipe(gfmifier())
.pipe(gfmifier(renderTOC))
.pipe(fs.createWriteStream(destination, {
encoding: 'utf8'
}));
@@ -186,12 +193,12 @@ GLOBAL.window = GLOBAL.window || GLOBAL; // nomnoml expects window to be define
var destination = file.replace(options['in'], options.out),
destPath = path.dirname(destination),
streamOptions = {};
if (file.match(/png$/)){
if (file.match(/png$/)) {
streamOptions.encoding = null;
} else {
streamOptions.encoding = 'utf8';
}
mkdirp(destPath, function (err) {
fs.createReadStream(file, streamOptions)
.pipe(fs.createWriteStream(destination, streamOptions));

7
docs/header.html Normal file
View File

@@ -0,0 +1,7 @@
<html>
<head>
<link rel="stylesheet"
href="http://jasonm23.github.io/markdown-css-themes/avenir-white.css">
</head>
<body>

View File

@@ -58,13 +58,13 @@ of the software.
These layers are:
* [_Framework_](Framework.md): The framework layer is responsible for
* [_Framework_](framework.md): The framework layer is responsible for
managing the interactions between application components. It has no
application-specific knowledge; at this layer, we have only
established an abstraction by which different software components
may communicate and/or interact.
* [_Platform_](Platform.md): The platform layer defines the general look, feel, and
behavior of Open MCT Web. This includes user-facing components like
* [_Platform_](platform.md): The platform layer defines the general look,
feel, and behavior of Open MCT Web. This includes user-facing components like
Browse mode and Edit mode, as well as underlying elements of the
information model and the general service infrastructure.
* _Application_: The application layer defines specific features of

3
docs/src/design/index.md Normal file
View File

@@ -0,0 +1,3 @@
Design proposals:
* [API Redesign](proposals/APIRedesign.md)

View File

@@ -0,0 +1,338 @@
# API Refactoring
This document summarizes a path toward implementing API changes
from the [API Redesign](../proposals/APIRedesign.md) for Open MCT Web
v1.0.0.
# Goals
These plans are intended to minimize:
* Waste; avoid allocating effort to temporary changes.
* Downtime; avoid making changes in large increments that blocks
delivery of new features for substantial periods of time.
* Risk; ensure that changes can be validated quickly, avoid putting
large effort into changes that have not been validated.
# Plan
```nomnoml
#comment: This diagram is in nomnoml syntax and should be rendered.
#comment: See https://github.com/nasa/openmctweb/issues/264#issuecomment-167166471
[<start> Start]->[<state> Imperative bundle registration]
[<state> Imperative bundle registration]->[<state> Build and packaging]
[<state> Imperative bundle registration]->[<state> Refactor API]
[<state> Build and packaging |
[<start> Start]->[<state> Incorporate a build step]
[<state> Incorporate a build step |
[<start> Start]->[<state> Choose package manager]
[<start> Start]->[<state> Choose build system]
[<state> Choose build system]<->[<state> Choose package manager]
[<state> Choose package manager]->[<state> Implement]
[<state> Choose build system]->[<state> Implement]
[<state> Implement]->[<end> End]
]->[<state> Separate repositories]
[<state> Separate repositories]->[<end> End]
]->[<state> Release candidacy]
[<start> Start]->[<state> Design registration API]
[<state> Design registration API |
[<start> Start]->[<state> Decide on role of Angular]
[<state> Decide on role of Angular]->[<state> Design API]
[<state> Design API]->[<choice> Passes review?]
[<choice> Passes review?] no ->[<state> Design API]
[<choice> Passes review?]-> yes [<end> End]
]->[<state> Refactor API]
[<state> Refactor API |
[<start> Start]->[<state> Imperative extension registration]
[<state> Imperative extension registration]->[<state> Refactor individual extensions]
[<state> Refactor individual extensions |
[<start> Start]->[<state> Prioritize]
[<state> Prioritize]->[<choice> Sufficient value added?]
[<choice> Sufficient value added?] no ->[<end> End]
[<choice> Sufficient value added?] yes ->[<state> Design]
[<state> Design]->[<choice> Passes review?]
[<choice> Passes review?] no ->[<state> Design]
[<choice> Passes review?]-> yes [<state> Implement]
[<state> Implement]->[<end> End]
]->[<state> Remove legacy bundle support]
[<state> Remove legacy bundle support]->[<end> End]
]->[<state> Release candidacy]
[<state> Release candidacy |
[<start> Start]->[<state> Verify |
[<start> Start]->[<choice> API well-documented?]
[<start> Start]->[<choice> API well-tested?]
[<choice> API well-documented?]-> no [<state> Write documentation]
[<choice> API well-documented?] yes ->[<end> End]
[<state> Write documentation]->[<choice> API well-documented?]
[<choice> API well-tested?]-> no [<state> Write test cases]
[<choice> API well-tested?]-> yes [<end> End]
[<state> Write test cases]->[<choice> API well-tested?]
]
[<start> Start]->[<state> Validate |
[<start> Start]->[<choice> Passes review?]
[<start> Start]->[<state> Use internally]
[<state> Use internally]->[<choice> Proves useful?]
[<choice> Passes review?]-> no [<state> Address feedback]
[<state> Address feedback]->[<choice> Passes review?]
[<choice> Passes review?] yes -> [<end> End]
[<choice> Proves useful?] yes -> [<end> End]
[<choice> Proves useful?] no -> [<state> Fix problems]
[<state> Fix problems]->[<state> Use internally]
]
[<state> Validate]->[<end> End]
[<state> Verify]->[<end> End]
]->[<state> Release]
[<state> Release]->[<end> End]
```
## Step 1. Imperative bundle registration
Register whole bundles imperatively, using their current format.
For example, in each bundle add a `bundle.js` file:
```js
define([
'mctRegistry',
'json!bundle.json'
], function (mctRegistry, bundle) {
mctRegistry.install(bundle, "path/to/bundle");
});
```
Where `mctRegistry.install` is placeholder API that wires into the
existing bundle registration mechanisms. The main point of entry
would need to be adapted to clearly depend on these bundles
(in the require sense of a dependency), and the framework layer
would need to implement and integrate with this transitional
API.
Benefits:
* Achieves an API Redesign goal with minimal immediate effort.
* Conversion to an imperative syntax may be trivially automated.
* Minimal change; reuse existing bundle definitions, primarily.
* Allows early validation of switch to imperative; unforeseen
consequences of the change may be detected at this point.
* Allows implementation effort to progress in parallel with decisions
about API changes, including fundamental ones such as the role of
Angular. May act in some sense as a prototype to inform those
decisions.
* Creates a location (framework layer) where subsequent changes to
the manner in which extensions are registered may be centralized.
When there is a one-to-one correspondence between the existing
form of an extension and its post-refactor form, adapters can be
written here to defer the task of making changes ubiquitously
throughout bundles, allowing for earlier validation and
verification of those changes, and avoiding ubiquitous changes
which might require us to go dark. (Mitigates
["greenfield paradox"](http://stepaheadsoftware.blogspot.com/2012/09/greenfield-or-refactor-legacy-code-base.html);
want to add value with new API but don't want to discard value
of tested/proven legacy codebase.)
Detriments:
* Requires transitional API to be implemented/supported; this is
waste. May mitigate this by time-bounding the effort put into
this step to ensure that waste is minimal.
Note that API changes at this point do not meaningfully reflect
the desired 1.0.0 API, so no API reviews are necessary.
## Step 2. Incorporate a build step
After the previous step is completed, there should be a
straightforward dependency graph among AMD modules, and an
imperative (albeit transitional) API allowing for other plugins
to register themselves. This should allow for a build step to
be included in a straightforward fashion.
Some goals for this build step:
* Compile (and, preferably, optimize/minify) Open MCT Web
sources into a single `.js` file.
* It is desirable to do the same for HTML sources, but
may wish to defer this until a subsequent refactoring
step if appropriate.
* Provide non-code assets in a format that can be reused by
derivative projects in a straightforward fashion.
Should also consider which dependency/packaging manager should
be used by dependent projects to obtain Open MCT Web. Approaches
include:
1. Plain `npm`. Dependents then declare their dependency with
`npm` and utilize built sources and assets in a documented
fashion. (Note that there are
[documented challenges](http://blog.npmjs.org/post/101775448305/npm-and-front-end-packaging)
in using `npm` in this fashion.)
2. Build with `npm`, but recommend dependents install using
`bower`, as this is intended for front-end development. This may
require checking in built products, however, which
we wish to avoid (this could be solved by maintaining
a separate repository for built products.)
In all cases, there is a related question of which build system
to use for asset generation/management and compilation/minification/etc.
1. [`webpack`](https://webpack.github.io/)
is well-suited in principle, as it is specifically
designed for modules with non-JS dependencies. However,
there may be limitations and/or undesired behavior here
(for instance, CSS dependencies get in-lined as style tags,
removing our ability to control ordering) so it may
2. `gulp` or `grunt`. Commonplace, but both still require
non-trivial coding and/or configuration in order to produce
appropriate build artifacts.
3. [Just `npm`](http://blog.keithcirkel.co.uk/how-to-use-npm-as-a-build-tool/).
Reduces the amount of tooling being used, but may introduce
some complexity (e.g. custom scripts) to the build process,
and may reduce portability.
## Step 3. Separate repositories
Refactor existing applications built on Open MCT Web such that they
are no longer forks, but instead separate projects with a dependency
on the built artifacts from Step 2.
Note that this is achievable already using `bower` (see `warp-bower`
branch at http://developer.nasa.gov/mct/warp for an example.)
However, changes involved in switching to an imperative API and
introducing a build process may change (and should simplify) the
approach used to utilize Open MCT Web as a dependency, so these
changes should be introduced first.
## Step 4. Design registration API
Design the registration API that will replace declarative extension
categories and extensions (including Angular built-ins and composite
services.)
This may occur in parallel with implementation steps.
It will be necessary
to have a decision about the role of Angular at this point; are extensions
registered via provider configuration (Angular), or directly in some
exposed registry?
Success criteria here should be based on peer review. Scope of peer
review should be based on perceived risk/uncertainty surrounding
proposed changes, to avoid waste; may wish to limit this review to
the internal team. (The extent to which external
feedback is available is limited, but there is an inherent timeliness
to external review; need to balance this.)
Benefits:
* Solves the "general case" early, allowing for early validation.
Note that in specific cases, it may be desirable to refactor some
current "extension category" in a manner that will not appear as
registries, _or_ to locate these in different
namespaces, _or_ to remove/replace certain categories entirely.
This work is deferred intentionally to allow for a solution of the
general case.
## Step 5. Imperative extension registration
Register individual extensions imperatively, implementing API changes
from the previous step. At this stage, _usage_ of the API may be confined
to a transitional adapter in the framework layer; bundles may continue
to utilize the transitional API for registering extensions in the
legacy format.
An important, ongoing sub-task here will be to discover and define dependencies
among bundles. Composite services and extension categories are presently
"implicit"; after the API redesign, these will become "explicit", insofar
as some specific component will be responsible for creating any registries.
As such, "bundles" which _use_ specific registries will need to have an
enforceable dependency (e.g. require) upon those "bundles" which
_declare_ those registries.
## Step 6. Refactor individual extensions
Refactor individual extension categories and/or services that have
been identified as needing changes. This includes, but is not
necessarily limited to:
* Views/Representations/Templates (refactored into "components.")
* Capabilities (refactored into "roles", potentially.)
* Telemetry (from `TelemetrySeries` to `TelemetryService`.)
Changes should be made one category at a time (either serially
or separately in parallel) and should involve a tight cycle of:
1. Prioritization/reprioritization; highest-value API improvements
should be done first.
2. Design.
3. Review. Refactoring individual extensions will require significant
effort (likely the most significant effort in the process) so changes
should be validated early to minimize risk/waste.
4. Implementation. These changes will not have a one-to-one relationship
with existing extensions, so changes cannot be centralized; usages
will need to be updated across all "bundles" instead of centralized
in a legacy adapter. If changes are of sufficient complexity, some
planning should be done to spread out the changes incrementally.
By necessity, these changes may break functionality in applications
built using Open MCT Web. On a case-by-case basis, should consider
providing temporary "legacy support" to allow downstream updates
to occur as a separate task; the relevant trade here is between
waste/effort required to maintain legacy support, versus the
downtime which may be introduced by making these changes simultaneously
across several repositories.
## Step 7. Remove legacy bundle support
Update bundles to remove any usages of legacy support for bundles
(including that used by dependent projects.) Then, remove legacy
support from Open MCT Web.
## Step 8. Release candidacy
Once API changes are complete, Open MCT Web should enter a release
candidacy cycle. Important things to look at here:
* Are changes really complete?
* Are they sufficiently documented?
* Are they sufficiently tested?
* Are changes really sufficient?
* Do reviewers think they are usable?
* Does the development team find them useful in practice? This
will require calendar time to ascertain; should allocate time
for this, particularly in alignment with the sprint/release
cycle.
* Has learning curve been measurably decreased? Comparing a to-do
list tutorial to [other examples(http://todomvc.com/) could
provide an empirical basis to this. How much code is required?
How much explanation is required? How many dependencies must
be installed before initial setup?
* Does the API offer sufficient power to implement the extensions we
anticipate?
* Any open API-related issues which should block a 1.0.0 release?
Any problems identified during release candidacy will require
subsequent design changes and planning.
## Step 9. Release
Once API changes have been verified and validated, proceed
with release, including:
* Tagging as version 1.0.0 (at an appropriate time in the
sprint/release cycle.)
* Close any open issues which have been resolved (or made obsolete)
by API changes.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,251 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [Reducing interface depth (the bundle.json version)](#reducing-interface-depth-the-bundlejson-version)
- [Imperitive component registries](#imperitive-component-registries)
- [Get rid of "extension category" concept.](#get-rid-of-extension-category-concept)
- [Reduce number and depth of extension points](#reduce-number-and-depth-of-extension-points)
- [Composite services should not be the default](#composite-services-should-not-be-the-default)
- [Get rid of views, representations, and templates.](#get-rid-of-views-representations-and-templates)
- [Reducing interface depth (The angular discussion)](#reducing-interface-depth-the-angular-discussion)
- [More angular: for all services](#more-angular-for-all-services)
- [Less angular: only for views](#less-angular-only-for-views)
- [Standard packaging and build system](#standard-packaging-and-build-system)
- [Use systemjs for module loading](#use-systemjs-for-module-loading)
- [Use gulp or grunt for standard tooling](#use-gulp-or-grunt-for-standard-tooling)
- [Package openmctweb as single versioned file.](#package-openmctweb-as-single-versioned-file)
- [Misc Improvements](#misc-improvements)
- [Refresh on navigation](#refresh-on-navigation)
- [Move persistence adapter to promise rejection.](#move-persistence-adapter-to-promise-rejection)
- [Remove bulk requests from providers](#remove-bulk-requests-from-providers)
- [Notes on current API proposals:](#notes-on-current-api-proposals)
- [[1] Footnote: The angular debacle](#1-footnote-the-angular-debacle)
- ["Do or do not, there is no try"](#do-or-do-not-there-is-no-try)
- [A lack of commitment](#a-lack-of-commitment)
- [Commitment is good!](#commitment-is-good)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
# Reducing interface depth (the bundle.json version)
## Imperitive component registries
Transition component registries to javascript, get rid of bundle.json and bundles.json. Prescribe a method for application configuration, but allow flexibility in how application configuration is defined.
Register components in an imperitive fashion, see angularApp.factory, angularApp.controller, etc. Alternatively, implement our own application object with new registries and it's own form of registering objects.
## Get rid of "extension category" concept.
The concept of an "extension category" is itself an extraneous concept-- an extra layer of interface depth, an extra thing to learn before you can say "hello world". Extension points should be clearly supported and documented with whatever interfaces make sense. Developers who wish to add something that is conceptually equivalent to an extension category can do so directly, in the manner that suites their needs, without us forcing a common method on them.
## Reduce number and depth of extension points
Clearly specify supported extension points (e.g. persistence, model providers, telemetry providers, routes, time systems), but don't claim that the system has a clear and perfect repeatable solution for unknown extension types. New extension categories can be implemented in whatever way makes sense, without prescribing "the one and only system for managing extensions".
The underlying problem here is we are predicting needs for extension points where none exist-- if we try and design the extension system before we know how it is used, we design the wrong thing and have to rewrite it later.
## Composite services should not be the default
Understanding composite services, and describing services as composite services can confuse developers. Aggregators are implemented once and forgotten, while decorators tend to be hacky, brittle solutions that are generally needed to avoid circular imports. While composite services are a useful construct, it reduces interface depth to implement them as registries + typed providers.
You can write a provider (provides "thing x" for "inputs y") with a simple interface. A provider has two or more methods:
* a method which takes "inputs y" and returns True if it knows how to provide "thing x", false otherwise.
* one or more methods which provide "thing x" for objects of "inputs y".
Actually checking whether a provider can respond to a request before asking it to do work allows for faster failure and clearer errors when no providers match the request.
## Get rid of views, representations, and templates.
Templates are an implementation detail that should be handled by module loaders. Views and representations become "components," and a new concept, "routes", is used to exposing specific views to end users.
`components` - building blocks for views, have clear inputs and outputs, and can be coupled to other components when it makes sense. (e.g. parent-child components such as menu and menu item), but should have ZERO knowledge of our data models or telemetry apis. They should define data models that enable them to do their job well while still being easy to test.
`routes` - a view type for a given domain object, e.g. a plot, table, display layout, etc. Can be described as "whatever shows in the main screen when you are viewing an object." Handle loading of data from a domain object and passing that data to the view components. Routes should support editing as it makes sense in their own context.
To facilitate testing:
* routes should be testable without having to test the actual view.
* components should be independently testable with zero knowledge of our data models or telemetry APIs.
Component code should be organized side by side, such as:
```
app
|- components
|- productDetail
| |- productDetail.js
| |- productDetail.css
| |- productDetail.html
| |- productDetailSpec.js
|- productList
|- checkout
|- wishlist
```
Components are not always reusable, and we shouldn't be overly concerned with making them so. If components are heavily reused, they should either be moved to a platform feature (e.g. notifications, indicators), or broken off as an external dependency (e.g. publish mct-plot as mct-plot.js).
# Reducing interface depth (The angular discussion)
Two options here: use more angular, use less angular. Wrapping angular methods does not reduce interface depth and must be avoided.
The primary issue with angular is duplications of concerns-- both angular and the openmctweb platform implement the same tools side by side and it can be hard to comprehend-- it increases interface depth. For other concerns, see footnotes[1].
Wrapping angular methods for non-view related code is confusing to developers because of the random constraints angular places on these items-- developers ultimately have to understand both angular DI and our framework. For example, it's not possible to name the topic service "topicService" because angular expects Services to be implemented by Providers, which is different than our expectation.
To reduce interface depth, we can replace our own provider and registry patterns with angular patterns, or we can only utilize angular view logic, and only use our own DI patterns.
## More angular: for all services
Increasing our commitment to angular would mean using more of the angular factorys, services, etc, and less of our home grown tools. We'd implement our services and extension points as angular providers, and make them configurable via app.config.
As an example, registering a specific type of model provider in angular would look like:
```javascript
mct.provider('model', modelProvider() { /* implementation */});
mct.config(['modelProvider', function (modelProvider) {
modelProvider.providers.push(RootModelProvider);
}]);
```
## Less angular: only for views
If we wish to use less angular, I would recommend discontinuing use of all angular components that are not view related-- services, factories, $http, etc, and implementing them in our own paradigm. Otherwise, we end up with layered interfaces-- one of the goals we would like to avoid.
# Standard packaging and build system
Standardize the packaging and build system, and completely separate the core platform from deployments. Prescribe a starting point for deployments, but allow flexibility.
## Use systemjs for module loading
Allow developers to use whatever module loading system they'd like to use, while still supporting all standard cases. We should also use this system for loading assets (css, scss, html templates), which makes it easier to implement a single file deployment using standard build tooling.
## Use gulp or grunt for standard tooling
Using gulp or grunt as a task runner would bring us in line with standard web developer workflows and help standardize rendering, deployment, and packaging. Additional tools can be added to the workflow at low cost, simplifying the set up of developer environments.
Gulp and grunt provide useful developer tooling such as live reload, automatic scss/less/etc compiliation, and ease of extensibility for standard production build processes. They're key in decoupling code.
## Package openmctweb as single versioned file.
Deployments should depend on a specific version of openmctweb, but otherwise be allowed to have their own deployment and development toolsets.
Customizations and deployments of openmctweb should not use the same build tooling as the core platform; instead they should be free to use their own build tools as they wish. (We would provide a template for an application, based on our experience with warp-for-rp and vista)
Installation and utilization of openmctweb should be as simple as downloading the js file, including it in your own html page, and then initializing an app and running it. If a developer would prefer, they could use bower or npm to handle installation.
Then, if we're using imperative methods for extending the application we can use the following for basic customization:
```html
<script src="//localhost/openmctweb.js"></script>
<script>
// can configure from object
var myApp = new OpenMCTWeb({
persitence: {
providers: [
{
type: 'elastic',
uri: 'http://someElasticHost/'
} // ...
]
}
});
// alternative configurations
myApp.persistence.addProvider(MyPersistenceAdapter);
myApp.model.addProvider(someProviderObject);
// Removing via method
myApp.persistence.removeProvider('some method for removing functionality');
// directly mutating providers
myApp.persistence.providers = [ThisProviderStandsAlone];
//
myApp.run();
</script>
```
This packaging reduces the complexity of managing multiple deployed versions, and also allows us to provide users with incredibly simple tutorials-- they can use whatever tooling they like. For instance, a hello world tutorial may take the option of "exposing a new object in the tree".
```javascript
var myApp = new OpenMCTWeb();
myApp.roots.addRoot({
id: 'myRoot',
name: 'Hello World!',
});
myApp.routes.setDefault('myRoot');
myApp.run();
```
# Misc Improvements
## Refresh on navigation
In cases where navigation events change the entire screen, we should be using routes and location changes to navigate between objects. We should be using href for all navigation events.
At the same time, navigating should refresh state of every visible object. A properly configured persistence store will handle caching with standard cache headers and 304 not modified responses, which will provide good performance of object reloads, while helping us ensure that objects are always in sync between clients.
View state (say, the expanded tree nodes) should not be tied to caching of data-- it should be something we intentionally persist and restore with each navigation. Data (such as object definitions) should be reloaded from server as necessary to restore state.
## Move persistence adapter to promise rejection.
Simple: reject on fail, resolve on success.
## Remove bulk requests from providers
Aggregators can request multiple things at once, but individual providers should only have to implement handling at the level of a single request. Each provider can implement it's own internal batching, but it should support making requests at a finer level of detail.
Excessive wrapping of code with $q.all causes additional digest cycles and decreased performance.
For example, instead of every telemetry provider responding to a given telemetry request, aggregators should route each request to the first provider that can fulfill that request.
# Notes on current API proposals:
* [RequireJS for Dependency Injection](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#requirejs-as-dependency-injector): requires other topics to be discussed first.
* [Arbitrary HTML Views](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#arbitrary-html-views): think there is a place for it, requires other topics to be discussed first.
* [Wrap Angular Services](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#wrap-angular-services): No, this is bad.
* [Bundle definitions in Javascript](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#bundle-declarations-in-javascript): Points to a solution, but ultimately requires more discussion.
* [pass around a dependency injector](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#pass-around-a-dependency-injector): No.
* [remove partial constructors](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#remove-partial-constructors): Yes, this should be superseded by another proposal though. The entire concept was a messy solution to dependency injection issues caused by declarative syntax.
* [Rename views to applications](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#rename-views-to-applications): Points to a problem that needs to be solved but I think the name is bad.
* [Provide classes for extensions](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#provide-classes-for-extensions): Yes, in specific places
* [Normalize naming conventions](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#normalize-naming-conventions): Yes.
* [Expose no third-party APIs](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#expose-no-third-party-apis): Completely disagree, points to a real problem with poor angular integration.
* [Register Extensions as Instances instead of Constructors](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#register-extensions-as-instances-instead-of-constructors): Superseded by the fact that we should not hope to implement a generic construct.
* [Remove capability delegation](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#remove-capability-delegation): Yes.
* [Nomenclature Change](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#nomenclature-change): Yes, hope to discuss the implications of this more clearly in other proposals.
* [Capabilities as mixins](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#capabilities-as-mixins): Yes.
* [Remove appliesTo methods](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#remove-applies-to-methods): No-- I think some level of this is necessary. I think a more holistic approach to policy is needed. it's a rather complicated system.
* [Revise telemetry API](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#revise-telemetry-api): If we can rough out and agree to the specifics, then Yes. Needs discussion.
* [Allow composite services to fail gracefully](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#allow-composite-services-to-fail-gracefully): No. As mentioned above, I think composite services themselves should be eliminated for a more purpose bound tool.
* [Plugins as angular modules](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#plugins-as-angular-modules): Should we decide to embrace Angular completely, I would support this. Otherwise, no.
* [Contextual Injection](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#contextual-injection): No, don't see a need.
* [Add New Abstractions for Actions](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#add-new-abstractions-for-actions): Worth a discussion.
* [Add gesture handlers](https://github.com/nasa/openmctweb/blob/api-redesign/docs/src/design/proposals/APIRedesign.md#add-gesture-handlers): Yes if we can agree on details. We need a platform implementation that is easy to use, but we should not reinvent the wheel.
# [1] Footnote: The angular debacle
## "Do or do not, there is no try"
A commonly voiced concern of embracing angular is the possibility of becoming dependent on a third party framework. This concern is itself detrimental-- if we're afraid of becoming dependent on a third party framework, then we will do a bad job of using the framework, and inevitably will want to stop using it.
If we're using a framework, we need to use it fully, or not use it at all.
## A lack of commitment
A number of the concerns we heard from developers and interns can be attributed to the tenuous relationship between the OpenMCTWeb platform and angular. We claimed to be angular, but we weren't really angular. Instead, we are caught between our incomplete framework paradigm and the angular paradigm. In many cases we reinvented the wheel or worked around functionality that angular provides, and ended up in a more confusing state.
## Commitment is good!
We could just be an application that is built with angular.
An application that is modular and extensible not because it reinvents tools for providing modularity and extensibility, but because it reuses existing tools for modularity and extensibility.
There are benefits to buying into the angular paradigm: shift documentation burden to external project, engage a larger talent pool available both as voluntary open source contributors and as experienced developers for hire, and gain access to an ecosystem of tools that we can use to increase the speed of development.
There are negatives too: Angular is a monolith, it has performance concerns, and an unclear future. If we can't live with it, we should look at alternatives.

View File

@@ -0,0 +1,164 @@
# Imperative Plugins
This is a design proposal for handling
[bundle declarations in JavaScript](
APIRedesign.md#bundle-declarations-in-javascript).
## Developer Use Cases
Developers will want to use bundles/plugins to (in rough order
of occurrence):
1. Add new extension instances.
2. Use existing services
3. Add new service implementations.
4. Decorate service implementations.
5. Decorate extension instances.
6. Add new types of services.
7. Add new extension categories.
Notably, bullets 4 and 5 above are currently handled implicitly,
which has been cited as a source of confusion.
## Interfaces
Two base classes may be used to satisfy these use cases:
* The `CompositeServiceFactory` provides composite service instances.
Decorators may be added; the approach used for compositing may be
modified; and individual services may be registered to support compositing.
* The `ExtensionRegistry` allows for the simpler case where what is desired
is an array of all instances of some kind of thing within the system.
Note that additional developer use cases may be supported by using the
more general-purpose `Registry`
```nomnoml
[Factory.<T, V>
|
- factoryFn : function (V) : T
|
+ decorate(decoratorFn : function (T, V) : T, options? : RegistrationOptions)
]-:>[function (V) : T]
[RegistrationOptions |
+ priority : number or string
]
[Registry.<T, V>
|
- compositorFn : function (Array.<T>) : V
|
+ register(item : T, options? : RegistrationOptions)
+ composite(compositorFn : function (Array.<T>) : V, options? : RegistrationOptions)
]-:>[Factory.<V, Void>]
[Factory.<V, Void>]-:>[Factory.<T, V>]
[ExtensionRegistry.<T>]-:>[Registry.<T, Array.<T>>]
[Registry.<T, Array.<T>>]-:>[Registry.<T, V>]
[CompositeServiceFactory.<T>]-:>[Registry.<T, T>]
[Registry.<T, T>]-:>[Registry.<T, V>]
```
## Examples
### 1. Add new extension instances.
```js
// Instance-style registration
mct.types.register(new mct.Type({
key: "timeline",
name: "Timeline",
description: "A container for activities ordered in time."
});
// Factory-style registration
mct.actions.register(function (domainObject) {
return new RemoveAction(domainObject);
}, { priority: 200 });
```
### 2. Use existing services
```js
mct.actions.register(function (domainObject) {
var dialogService = mct.ui.dialogServiceFactory();
return new PropertiesAction(dialogService, domainObject);
});
```
### 3. Add new service implementations
```js
// Instance-style registration
mct.persistenceServiceFactory.register(new LocalPersistenceService());
// Factory-style registration
mct.persistenceServiceFactory.register(function () {
var $http = angular.injector(['ng']).get('$http');
return new LocalPersistenceService($http);
});
```
### 4. Decorate service implementations
```js
mct.modelServiceFactory.decorate(function (modelService) {
return new CachingModelDecorator(modelService);
}, { priority: 100 });
```
### 5. Decorate extension instances
```js
mct.capabilities.decorate(function (capabilities) {
return capabilities.map(decorateIfApplicable);
});
```
This use case is not well-supported by these API changes. The most
common case for decoration is capabilities, which are under reconsideration;
should consider handling decoration of capabilities in a different way.
### 6. Add new types of services
```js
myModule.myServiceFactory = new mct.CompositeServiceFactory();
// In cases where a custom composition strategy is desired
myModule.myServiceFactory.composite(function (services) {
return new MyServiceCompositor(services);
});
```
### 7. Add new extension categories.
```js
myModule.hamburgers = new mct.ExtensionRegistry();
```
## Evaluation
### Benefits
* Encourages separation of registration from declaration (individual
components are decoupled from the manner in which they are added
to the architecture.)
* Minimizes "magic." Dependencies are acquired, managed, and exposed
using plain-old-JavaScript without any dependency injector present
to obfuscate what is happening.
* Offers comparable expressive power to existing APIs; can still
extend the behavior of platform components in a variety of ways.
* Does not force or limit formalisms to use;
### Detriments
* Does not encourage separation of dependency acquisition from
declaration; that is, it would be quite natural using this API
to acquire references to services during the constructor call
to an extension or service. But, passing these in as constructor
arguments is preferred (to separate implementation from architecture.)
* Adds (negligible?) boilerplate relative to declarative syntax.
* Relies on factories, increasing number of interfaces to be concerned
with.

View File

@@ -0,0 +1,138 @@
# Roles
Roles are presented as an alternative formulation to capabilities
(dynamic behavior associated with individual domain objects.)
Specific goals here:
* Dependencies of individual scripts should be clear.
* Domain objects should be able to selectively exhibit a wide
variety of behaviors.
## Developer Use Cases
1. Checking for the existence of behavior.
2. Using behavior.
3. Augmenting existing behaviors.
4. Overriding existing behaviors.
5. Adding new behaviors.
## Overview of Proposed Solution
Remove `getCapability` from domain objects; add roles as external
services which can be applied to domain objects.
## Interfaces
```nomnoml
[Factory.<T, V>
|
- factoryFn : function (V) : T
|
+ decorate(decoratorFn : function (T, V) : T, options? : RegistrationOptions)
]-:>[function (V) : T]
[RegistrationOptions |
+ priority : number or string
]<:-[RoleOptions |
+ validate : function (DomainObject) : boolean
]
[Role.<T> |
+ validate(domainObject : DomainObject) : boolean
+ decorate(decoratorFn : function (T, V) : T, options? : RoleOptions)
]-:>[Factory.<T, DomainObject>]
[Factory.<T, DomainObject>]-:>[Factory.<T, V>]
```
## Examples
### 1. Checking for the existence of behavior
```js
function PlotViewPolicy(telemetryRole) {
this.telemetryRole = telemetryRole;
}
PlotViewPolicy.prototype.allow = function (view, domainObject) {
return this.telemetryRole.validate(domainObject);
};
```
### 2. Using behavior
```js
PropertiesAction.prototype.perform = function () {
var mutation = this.mutationRole(this.domainObject);
return this.showDialog.then(function (newModel) {
return mutation.mutate(function () {
return newModel;
});
});
};
```
### 3. Augmenting existing behaviors
```js
// Non-Angular style
mct.roles.persistenceRole.decorate(function (persistence) {
return new DecoratedPersistence(persistence);
});
// Angular style
myModule.decorate('persistenceRole', ['$delegate', function ($delegate) {
return new DecoratedPersistence(persistence);
}]);
```
### 4. Overriding existing behaviors
```js
// Non-Angular style
mct.roles.persistenceRole.decorate(function (persistence, domainObject) {
return domainObject.getModel().type === 'someType' ?
new DifferentPersistence(domainObject) :
persistence;
}, {
validate: function (domainObject, next) {
return domainObject.getModel().type === 'someType' || next();
}
});
```
### 5. Adding new behaviors
```js
function FooRole() {
mct.Role.apply(this, [function (domainObject) {
return new Foo(domainObject);
}]);
}
FooRole.prototype = Object.create(mct.Role.prototype);
FooRole.prototype.validate = function (domainObject) {
return domainObject.getModel().type === 'some-type';
};
//
myModule.roles.fooRole = new FooRole();
```
## Evaluation
### Benefits
* Simplifies/standardizes augmentation or replacement of behavior associated
with specific domain objects.
* Minimizes number of abstractions; roles are just factories.
* Clarifies dependencies; roles used must be declared/acquired in the
same manner as services.
### Detriments
* Externalizes functionality which is conceptually associated with a
domain object.
* Relies on factories, increasing number of interfaces to be concerned
with.

View File

@@ -129,7 +129,7 @@ The framework's role in the application is to manage connections between
bundles. All application-specific behavior is provided by individual bundles, or
as the result of their collaboration.
The framework is described in more detail in the [Framework Overview](../architecture/Framework.md#Overview) of the
The framework is described in more detail in the [Framework Overview](../architecture/framework.md#overview) of the
architecture guide.
### Tiers
@@ -186,7 +186,8 @@ as well as the framework layer's role in mediating between these components.
Once the framework layer has wired these software components together, however,
the application's logical architecture emerges.
An overview of the logical architecture of the platform is given in the [Platform Architecture](../architecture/Platform.md#PlatformArchitecture)
An overview of the logical architecture of the platform is given in the
[Platform Architecture](../architecture/platform.md#platform-architecture)
section of the Platform guide
### Web Services
@@ -233,7 +234,7 @@ The application is composed of bundles. Plug-ins are bundles.
non-persistent state associated with a domain object.
* __category__: A machine-readable identifier for a group that something may
belong to.
* __composition __: In the context of a domain object, this refers to the set of
* __composition__: In the context of a domain object, this refers to the set of
other domain objects that compose or are contained by that object. A domain
object's composition is the set of domain objects that should appear immediately
beneath it in a tree hierarchy. A domain object's composition is described in
@@ -244,10 +245,10 @@ identifiers asynchronously.
readable description of a thing; usually a single sentence or short paragraph.
(Most often used in the context of extensions, domain object models, or other
similar application-specific objects.)
* __domain object __: A meaningful object to the user; a distinct thing in the
* __domain object__: A meaningful object to the user; a distinct thing in the
work support by Open MCT Web. Anything that appears in the left-hand tree is a
domain object.
* __extension __: An extension is a unit of functionality exposed to the platform
* __extension__: An extension is a unit of functionality exposed to the platform
in a declarative fashion by a bundle. The term 'extension category' is used to
distinguish types of extensions from specific extension instances.
* __id__: A string which uniquely identifies a domain object.
@@ -609,8 +610,8 @@ path relative to the bundle's resource directory (`res` by default.)
### Composite Services
Composite services are described in the [relevant section](../architecture/Framework.md#Composite-Services)
of the framework guide.
Composite services are described in the [Composite Services](../architecture/framework.md#composite-services)
section of the framework guide.
A component should include the following properties in its extension definition:
@@ -676,6 +677,40 @@ If the provided capability has no invoke method, the return value here functions
as `getCapability` including returning `undefined` if the capability is not
exposed.
### Identifier Syntax
For most purposes, a domain object identifier can be treated as a purely
symbolic string; these are typically generated by Open MCT Web and plug-ins
should rarely be concerned with its internal structure.
A domain object identifier has one or two parts, separated by a colon.
* If two parts are present, the part before the colon refers to the space
in which the domain object resides. This may be a persistence space or
a purely symbolic space recognized by a specific model provider. The
part after the colon is the key to use when looking up the domain object
model within that space.
* If only one part is present, the domain object has no space specified,
and may presume to reside in the application-configured default space
defined by the `PERSISTENCE_SPACE` constant.
* Both the key and the space identifier may consist of any combination
of alphanumeric characters, underscores, dashes, and periods.
Some examples:
* A domain object with the identifier `foo:xyz` would have its model
loaded using key `xyz` from persistence space `foo`.
* A domain object with the identifier `bar` would have its model loaded
using key `bar` from the space identified by the `PERSISTENCE_SPACE`
constant.
```bnf
<identifier> ::= <space> ":" <key> | <key>
<space> ::= <id char>+
<key> ::= <id char>+
<id char> ::= <letter> | <digit> | "-" | "." | "_"
```
## Domain Object Actions
An `Action` is behavior that can be performed upon/using a `DomainObject`. An
@@ -724,8 +759,8 @@ interpretations for specific sources.
### Telemetry Responses
When returned from the `telemetryService` (see [Services](#Services) section),
telemetry series data will be packaged in a `source -> key -> TelemetrySeries`
When returned from the `telemetryService` (see [Telemetry Services](#telemetry-service)
section), telemetry series data will be packaged in a `source -> key -> TelemetrySeries`
fashion. That is, telemetry is passed in an object containing key-value pairs.
Keys identify telemetry sources; values are objects containing additional
key-value pairs. In this object, keys identify individual telemetry series (and
@@ -906,6 +941,12 @@ look at field (see below) to determine which field in the model should be
modified.
* `ngRequired`: True if input is required.
* `ngPattern`: The pattern to match against (for text entry)
* `ngBlur`: A function that may be invoked to evaluate the expression
associated with the `ng-blur` attribute associated with the control.
* This should be called when the control has lost focus; for controls
which simply wrap or augment `input` elements, this should be fired
on `blur` events associated with those elements, while more complex
custom controls may fire this at the end of more specific interactions.
* `options`: The options for this control, as passed from the `options` property
of an individual row definition.
* `field`: Name of the field in `ngModel` which will hold the value for this
@@ -1042,7 +1083,7 @@ Angular templates which need to interact with information (e.g. the domain
object being represented) provided by the platform. This information is passed
in through the template's scope, such that simple representations may be created
by providing only templates. (More complex representations will need controllers
which are referenced from templates. See [https://docs.angularjs.org/guide/controller ]()
which are referenced from templates. See https://docs.angularjs.org/guide/controller
for more information on controllers in Angular.)
A representation's scope will contain:
@@ -1074,7 +1115,7 @@ representing domain objects in general. For example, support for the _gestures_
extension category is added by a _representer_.
A representer needs only provide an implementation. When an `mct-representation`
is linked (see [https://docs.angularjs.org/guide/directive ]() or when the
is linked (see https://docs.angularjs.org/guide/directive ) or when the
domain object being represented changes, a new _representer_ of each declared
type is instantiated. The constructor arguments for a _representer_ are the same
as the arguments to the link function in an Angular directive: `scope` the
@@ -1106,6 +1147,8 @@ property:
* `stylesheetUrl`: Path and filename, including extension, for the stylesheet to
include. This path is relative to the bundle's resources folder (by default,
`res`)
* `theme`: Optional; if present, this stylesheet will only be included if this
value matches the `THEME` constant.
To control the order of CSS files, use priority (see the section on Extension
Definitions above.)
@@ -1155,7 +1198,7 @@ capability.
(as should appear in the _Create_ or the _Edit Properties_ dialog.) Each
property is described by an object containing the following properties:
* `control`: The key of the control (see `mct-control` and the `controls`
[extension category](#Controls)) to use for editing this property.
[extension category](#controls-category)) to use for editing this property.
* `property`: A string which will be used as the name of the property in the
domain object's model that the value for this property should be stored
under. If this value should be stored in an object nested within the domain
@@ -1178,7 +1221,7 @@ the list of version information in the About dialog.
dialog.
To control the ordering of line items within the About dialog, use `priority`.
(See section on [Extension Definitions](#ExtensionDefinitions) above.)
(See section on [Extensions](#extensions) above.)
This extension category does not have implementations.
@@ -1200,7 +1243,7 @@ applicable for domain objects which have the capabilities identified by these
strings.
* `delegation`: Optional boolean, intended to be used in conjunction with
`needs`; if present, allow required capabilities to be satisfied by means of
capability delegation. (See [Delegation](#Delegation))
capability delegation. (See [Delegation](#delegation-capability))
* `toolbar`: Optional; a definition for the toolbar which may appear in a
toolbar when using this view in Edit mode. This should be specified as a
structure for mct-toolbar , with additional properties available for each item in
@@ -1231,8 +1274,8 @@ A view's selection state is, conceptually, a set of JavaScript objects. The
presence of methods/properties on these objects determine which toolbar controls
are visible, and what state they manage and/or behavior they invoke.
This set may contain up to two different objects: The _view proxy _, which is
used to make changes to the view as a whole, and the _ selected object _, which is
This set may contain up to two different objects: The _view proxy_, which is
used to make changes to the view as a whole, and the _selected object_, which is
used to represent some state within the view. (Future versions of Open MCT Web
may support multiple selected objects.)
@@ -1251,6 +1294,22 @@ object, or the current view proxy.
* `all()`: Get an array of all objects in the selection state. Will include
either or both of the view proxy and selected object.
## Workers Category
The `workers` extension category allows scripts to be run as web workers
using the `workerService`.
An extension of this category has no implementation. The following properties
are supported:
* `key`: A symbolic string used to identify this worker.
* `workerUrl`: The path, relative to this bundle's `src` folder, where
this worker's source code resides.
* `shared`: Optional; a boolean flag which, if true, indicates that this
worker should be instantiated as a
[`SharedWorker`](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker/SharedWorker).
Default value is `false`.
# Directives
Open MCT Web defines several Angular directives that are intended for use both
@@ -1561,7 +1620,8 @@ extension mechanism is insufficient to achieve a desired result.
### Action Service
The [Action Service](../architecture/platform#action-service) (`actionService`)
The [Action Service](../architecture/platform.md#action-service)
(`actionService`)
provides `Action` instances which are applicable in specific contexts. See Core
API for additional notes on the interface for actions. The `actionService` has
the following interface:
@@ -1571,7 +1631,8 @@ in the specified action context.
### Capability Service
The [Capability Service](../architecture/platform#capability-service) (`capabilityService`)
The [Capability Service](../architecture/platform.md#capability-service)
(`capabilityService`)
provides constructors for capabilities which will be exposed for a given domain
object.
@@ -1691,7 +1752,7 @@ allowed within the application. It has the following interface:
* `allow(category, candidate, context, [callback])`: Check if this decision
should be allowed. Returns a boolean. Its arguments are interpreted as:
* `category`: A string identifying which kind of decision is being made. See
the [section on Categories](#PolicyCategories) for categories supported by
the [section on Categories](#policy-categories) for categories supported by
the platform; plugins may define and utilize policies of additional
categories, as well.
* `candidate`: An object representing the thing which shall or shall not be
@@ -1717,7 +1778,7 @@ When acquiring telemetry for display, it is recommended that the
`telemetryHandler` service be used instead of this service. The
`telemetryHandler` has additional support for subscribing to and requesting
telemetry data associated with domain objects or groups of domain objects. See
the [Other Services](#Other-Services) section for more information.
the [Other Services](#other-services) section for more information.
The `telemetryService` has the following interface:
@@ -1844,6 +1905,14 @@ the TelemetrySeries itself, in that order.
* `getSeries(domainObject)`: Get the latest `TelemetrySeries` (as resulted from
a previous `request(...)` call) available for this domain object.
### Worker Service
The `workerService` may be used to run web workers defined via the
`workers` extension category. It has the following method:
* `run(key)`: Run the worker identified by the provided `key`. Returns
a `Worker` (or `SharedWorker`, if the specified worker is defined
as a shared worker); if the `key` is unknown, returns `undefined`.
# Models
Domain object models in Open MCT Web are JavaScript objects describing the
@@ -2051,6 +2120,31 @@ objects which has a `relationships` property in their model, whose value is an
object containing key-value pairs, where keys are strings identifying
relationship types, and values are arrays of domain object identifiers.
## Status Capability
The `status` capability provides a way to flag domain objects as possessing
certain states, represented as simple strings. These states, in turn, are
reflected on `mct-representation` elements as classes (prefixed with
`s-status-`.) The `status` capability has the following interface:
* `get()`: Returns an array of all status strings that currently apply
to this object.
* `set(status, state)`: Adds or removes a status flag to this domain object.
The `status` argument is the string to set; `state` is a boolean
indicating whether this status should be included (true) or removed (false).
* `listen(callback)`: Listen for changes in status. The provided `callback`
will be invoked with an array of all current status strings whenever status
changes.
Plug-ins may add and/or recognize arbitrary status flags. Flags defined
and/or supported by the platform are:
Status | CSS Class | Meaning
-----------|--------------------|-----------------------------------
`editing` | `s-status-editing` | Domain object is being edited.
`pending` | `s-status-pending` | Domain object is partially loaded.
## Telemetry Capability
The telemetry capability provides a means for accessing telemetry data
@@ -2152,7 +2246,7 @@ development. A few utilities are included to support development processes.
## Command-line Build
Open MCT Web includes a script for building via command line using Maven 3.0.4
[https://maven.apache.org/]().
https://maven.apache.org/ .
Invoking mvn clean install will:
@@ -2169,7 +2263,7 @@ download build dependencies.
## Test Suite
Open MCT Web uses Jasmine [http://jasmine.github.io/]() for automated testing.
Open MCT Web uses Jasmine http://jasmine.github.io/ for automated testing.
The file `test.html` included at the top level of the source repository, can be
run from the browser to perform tests for all active bundles, as defined in
`bundle.json`.
@@ -2260,30 +2354,30 @@ Examples of deployment strategies (and the conditions under which they make the
most sense) include:
* If the external services that Open MCT Web will utilize are all running on
Apache Tomcat [https://tomcat.apache.org/](), then it makes sense to run Open
[Apache Tomcat](https://tomcat.apache.org/), then it makes sense to run Open
MCT Web from the same Tomcat instance as a separate web application. The
`.war` artifact produced by the command line build facilitates this deployment
option. (See [https://tomcat.apache.org/tomcat-8.0-doc/deployer-howto.html() for
option. (See https://tomcat.apache.org/tomcat-8.0-doc/deployer-howto.html for
general information on deploying in Tomcat.)
* If a variety of external services will be running from a variety of
hosts/ports, then it may make sense to use a web server that supports proxying,
such as the Apache HTTP Server [http://httpd.apache.org/](). In this
such as the [Apache HTTP Server](http://httpd.apache.org/). In this
configuration, the HTTP server would be configured to proxy (or reverse proxy)
requests at specific paths to the various external services, while providing
Open MCT Web as flat files from a different path.
* If a single server component is being developed to handle all server-side
needs of an Open MCT Web instance, it can make sense to serve Open MCT Web (as
flat files) from the same component using an embedded HTTP server such as Nancy
[http://nancyfx.org/]().
flat files) from the same component using an embedded HTTP server such as
[Nancy](http://nancyfx.org/).
* If no external services are needed (or if the 'external services' will just
be generating flat files to read) it makes sense to utilize a lightweight flat
file HTTP server such as Lighttpd [http://www.lighttpd.net/](). In this
file HTTP server such as [Lighttpd](http://www.lighttpd.net/). In this
configuration, Open MCT Web sources/resources would be placed at one path, while
the files generated by the external service are placed at another path.
* If all external services support CORS, it may make sense to have an HTTP
server that is solely responsible for making Open MCT Web sources/resources
available, and to have Open MCT Web contact these external services directly.
Again, lightweight HTTP servers such as Lighttpd [http://www.lighttpd.net/]()
Again, lightweight HTTP servers such as [Lighttpd](http://www.lighttpd.net/)
are useful in this circumstance. The downside of this option is that additional
configuration effort is required, both to enable CORS on the external services,
and to ensure that Open MCT Web can correctly locate these services.
@@ -2323,7 +2417,17 @@ default paths to reach external services are all correct.
### Configuration Constants
The following constants have global significance:
* `PERSISTENCE_SPACE`: The space in which domain objects should be persisted
(or read from) when not otherwise specified. Typically this will not need
to be overridden by other bundles, but persistence adapters may wish to
consume this constant in order to provide persistence for that space.
The following configuration constants are recognized by Open MCT Web bundles:
* Common UI elements - `platform/commonUI/general`
* `THEME`: A string identifying the current theme symbolically. Individual
stylesheets (the `stylesheets` extension category) may specify an optional
`theme` property which will be matched against this before inclusion.
* CouchDB adapter - `platform/persistence/couch`
* `COUCHDB_PATH`: URL or path to the CouchDB database to be used for domain
object persistence. Should not include a trailing slash.

35
docs/src/index.md Normal file
View File

@@ -0,0 +1,35 @@
# Open MCT Web Documentation
## Overview
Documentation is provided to support the use and development of
Open MCT Web. It's recommended that before doing
any development with Open MCT Web you take some time to familiarize yourself
with the documentation below.
Open MCT Web 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
extend the platform are provided in the following documentation.
## Sections
* The [Architecture Overview](architecture/) describes the concepts used
throughout Open MCT Web, 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
Open MCT Web software development cycle.

161
docs/src/process/cycle.md Normal file
View File

@@ -0,0 +1,161 @@
# Development Cycle
Development of Open MCT Web occurs on an iterative cycle of
sprints and releases.
* A _sprint_ is three weeks in duration, and represents a
set of improvements that can be completed and tested by the
development team. Software at the end of the sprint is
"semi-stable"; it will have undergone reduced testing and may carry
defects or usability issues of lower severity, particularly if
there are workarounds.
* A _release_ occurs every four sprints. Releases are stable, and
will have undergone full acceptance testing to ensure that the
software behaves correctly and usably.
## Roles
The sprint process assumes the presence of a __project manager.__
The project manager is responsible for
making tactical decisions about what development work will be
performed, and for coordinating with stakeholders to arrive at
higher-level strategic decisions about desired functionality
and characteristics of the software, major external milestones,
and so forth.
In the absence of a dedicated project manager, this role may be rotated
among members of the development team on a per-sprint basis.
Responsibilities of the project manager including:
* Maintaining (with agreement of stakeholders) a "road map" of work
planned for future releases/sprints; this should be higher-level,
usually expressed as "themes",
with just enough specificity to gauge feasibility of plans,
relate work back to milestones, and identify longer-term
dependencies.
* Determining (with assistance from the rest of the team) which
issues to work on in a given sprint and how they shall be
assigned.
* Pre-planning subsequent sprints to ensure that all members of the
team always have a clear direction.
* Scheduling and/or ensuring adherence to
[process points](#process-points).
* Responding to changes within the sprint (shifting priorities,
new issues) and re-allocating work for the sprint as needed.
## Sprint Calendar
Certain [process points](#process-points) are regularly scheduled in
the sprint cycle.
### Sprints by Release
Allocation of work among sprints should be planned relative to release
goals and milestones. As a general guideline, higher-risk work (large
new features which may carry new defects, major refactoring, design
changes with uncertain effects on usability) should be allocated to
earlier sprints, allowing for time in later sprints to ensure stability.
| Sprint | Focus |
|:------:|:--------------------------------------------------------|
| __1__ | Prototyping, design, experimentation. |
| __2__ | New features, refinements, enhancements. |
| __3__ | Feature completion, low-risk enhancements, bug fixing. |
| __4__ | Stability & quality assurance. |
### Sprints 1-3
The first three sprints of a release are primarily centered around
development work, with regular acceptance testing in the third
week. During this third week, the top priority should be passing
acceptance testing (e.g. by resolving any blockers found); any
resources not needed for this effort should be used to begin work
for the subsequent sprint.
| Week | Mon | Tue | Wed | Thu | Fri |
|:-----:|:-------------------------:|:------:|:---:|:----------------------------:|:-----------:|
| __1__ | Sprint plan | Tag-up | | | |
| __2__ | | Tag-up | | | Code freeze |
| __3__ | Per-sprint testing | Triage | | _Per-sprint testing*_ | Ship |
&ast; If necessary.
### Sprint 4
The software must be stable at the end of the fourth sprint; because of
this, the fourth sprint is scheduled differently, with a heightened
emphasis on testing.
| Week | Mon | Tue | Wed | Thu | Fri |
|-------:|:-------------------------:|:------:|:---:|:----------------------------:|:-----------:|
| __1__ | Sprint plan | Tag-up | | | Code freeze |
| __2__ | Per-release testing | Triage | | | |
| __3__ | _Per-release testing*_ | Triage | | _Per-release testing*_ | Ship |
&ast; If necessary.
## Process Points
* __Sprint plan.__ Project manager allocates issues based on
theme(s) for sprint, then reviews with team. Each team member
should have roughly two weeks of work allocated (to allow time
in the third week for testing of work completed.)
* Project manager should also sketch out subsequent sprint so
that team may begin work for that sprint during the
third week, since testing and blocker resolution is unlikely
to require all available resources.
* __Tag-up.__ Check in and status update among development team.
May amend plan for sprint as-needed.
* __Code freeze.__ Any new work from this sprint
(features, bug fixes, enhancements) must be integrated by the
end of the second week of the sprint. After code freeze
(and until the end of the sprint) the only changes that should be
merged into the master branch should directly address issues
needed to pass acceptance testing.
* [__Per-release Testing.__](testing/plan.md#per-release-testing)
Structured testing with predefined
success criteria. No release should ship without passing
acceptance tests. Time is allocated in each sprint for subsequent
rounds of acceptance testing if issues are identified during a
prior round. Specific details of acceptance testing need to be
agreed-upon with relevant stakeholders and delivery recipients,
and should be flexible enough to allow changes to plans
(e.g. deferring delivery of some feature in order to ensure
stability of other features.) Baseline testing includes:
* [__Testathon.__](testing/plan.md#user-testing)
Multi-user testing, involving as many users as
is feasible, plus development team. Open-ended; should verify
completed work from this sprint, test exploratorily for
regressions, et cetera.
* [__Long-Duration Test.__](testing/plan.md#long-duration-testing) A
test to verify that the software remains
stable after running for longer durations. May include some
combination of automated testing and user verification (e.g.
checking to verify that software remains subjectively
responsive at conclusion of test.)
* [__Unit Testing.__](testing/plan.md#unit-testing)
Automated testing integrated into the
build. (These tests are verified to pass more often than once
per sprint, as they run before any merge to master, but still
play an important role in per-release testing.)
* [__Per-sprint Testing.__](testing/plan.md#per-sprint-testing)
Subset of Pre-release Testing
which should be performed before shipping at the end of any
sprint. Time is allocated for a second round of
Pre-release Testing if the first round is not passed.
* __Triage.__ Team reviews issues from acceptance testing and uses
success criteria to determine whether or not they should block
release, then formulates a plan to address these issues before
the next round of acceptance testing. Focus here should be on
ensuring software passes that testing in order to ship on time;
may prefer to disable malfunctioning components and fix them
in a subsequent sprint, for example.
* __Ship.__ Tag a code snapshot that has passed acceptance
testing and deploy that version. (Only true if acceptance
testing has passed by this point; if acceptance testing has not
been passed, will need to make ad hoc decisions with stakeholders,
e.g. "extend the sprint" or "defer shipment until end of next
sprint.")

13
docs/src/process/index.md Normal file
View File

@@ -0,0 +1,13 @@
# Development Process
The process used to develop Open MCT Web is described in the following
documents:
* [Development Cycle](cycle.md): Describes how and when specific
process points are repeated during development.
* Testing is described in two documents:
* The [Test Plan](testing/plan.md) summarizes the approaches used
to test Open MCT Web.
* The [Test Procedures](testing/procedures.md) document what
specific tests are performed to verify correctness, and how
they should be carried out.

View File

@@ -0,0 +1,127 @@
# Test Plan
## Test Levels
Testing for Open MCT Web includes:
* _Smoke testing_: Brief, informal testing to verify that no major issues
or regressions are present in the software, or in specific features of
the software.
* _Unit testing_: Automated verification of the performance of individual
software components.
* _User testing_: Testing with a representative user base to verify
that application behaves usably and as specified.
* _Long-duration testing_: Testing which takes place over a long period
of time to detect issues which are not readily noticeable during
shorter test periods.
### Smoke Testing
Manual, non-rigorous testing of the software and/or specific features
of interest. Verifies that the software runs and that basic functionality
is present.
### Unit Testing
Unit tests are automated tests which exercise individual software
components. Tests are subject to code review along with the actual
implementation, to ensure that tests are applicable and useful.
Unit tests should meet
[test standards](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#test-standards)
as described in the contributing guide.
### User Testing
User testing is performed at scheduled times involving target users
of the software or reasonable representatives, along with members of
the development team exercising known use cases. Users test the
software directly; the software should be configured as similarly to
its planned production configuration as is feasible without introducing
other risks (e.g. damage to data in a production instance.)
User testing will focus on the following activities:
* Verifying issues resolved since the last test session.
* Checking for regressions in areas related to recent changes.
* Using major or important features of the software,
as determined by the user.
* General "trying to break things."
During user testing, users will
[report issues](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
as they are encountered.
Desired outcomes of user testing are:
* Identified software defects.
* Areas for usability improvement.
* Feature requests (particularly missed requirements.)
* Recorded issue verification.
### Long-duration Testing
Long-duration testing occurs over a twenty-four hour period. The
software is run in one or more stressing cases representative of expected
usage. After twenty-four hours, the software is evaluated for:
* Performance metrics: Have memory usage or CPU utilization increased
during this time period in unexpected or undesirable ways?
* Subjective usability: Does the software behave in the same way it did
at the start of the test? Is it as responsive?
Any defects or unexpected behavior identified during testing should be
[reported as issues](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
and reviewed for severity.
## Test Performance
Tests are performed at various levels of frequency.
* _Per-merge_: Performed before any new changes are integrated into
the software.
* _Per-sprint_: Performed at the end of every [sprint](../cycle.md).
* _Per-release_: Performed at the end of every [release](../cycle.md).
### Per-merge Testing
Before changes are merged, the author of the changes must perform:
* _Smoke testing_ (both generally, and for areas which interact with
the new changes.)
* _Unit testing_ (as part of the automated build step.)
Changes are not merged until the author has affirmed that both
forms of testing have been performed successfully; this is documented
by the [Author Checklist](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#author-checklist).
### Per-sprint Testing
Before a sprint is closed, the development team must additionally
perform:
* A relevant subset of [_user testing_](procedures.md#user-test-procedures)
identified by the acting [project manager](../cycle.md#roles).
* [_Long-duration testing_](procedures.md#long-duration-testng)
(specifically, for 24 hours.)
Issues are reported as a product of both forms of testing.
A sprint is not closed until both categories have been performed on
the latest snapshot of the software, _and_ no issues labelled as
["blocker"](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
remain open.
### Per-release Testing
As [per-sprint testing](#per-sprint-testing), except that _user testing_
should cover all test cases, with less focus on changes from the specific
sprint or release.
Per-release testing should also include any acceptance testing steps
agreed upon with recipients of the software.
A release is not closed until both categories have been performed on
the latest snapshot of the software, _and_ no issues labelled as
["blocker" or "critical"](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
remain open.

View File

@@ -0,0 +1,169 @@
# Test Procedures
## Introduction
This document is intended to be used:
* By testers, to verify that Open MCT Web behaves as specified.
* By the development team, to document new test cases and to provide
guidance on how to author these.
## Writing Procedures
### Template
Procedures for individual tests should use the following template,
adapted from [https://swehb.nasa.gov/display/7150/SWE-114]().
Property | Value
---------------|---------------------------------------------------------------
Test ID |
Relevant reqs. |
Prerequisites |
Test input |
Instructions |
Expectation |
Eval. criteria |
For multi-line descriptions, use an asterisk or similar indicator to refer
to a longer-form description below.
#### Example Procedure - Edit a Layout
Property | Value
---------------|---------------------------------------------------------------
Test ID | MCT-TEST-000X - Edit a layout
Relevant reqs. | MCT-EDIT-000Y
Prerequisites | Create a layout, as in MCT-TEST-000Z
Test input | Domain object database XYZ
Instructions | See below &ast;
Expectation | Change to editing context &dagger;
Eval. criteria | Visual inspection
&ast; Follow the following steps:
1. Verify that the created layout is currently navigated-to,
as in MCT-TEST-00ZZ.
2. Click the Edit button, identified by a pencil icon and the text "Edit"
displayed on hover.
&dagger; Right-hand viewing area should be surrounded by a dashed
blue border when a domain object is being edited.
### Guidelines
Test procedures should be written assuming minimal prior knowledge of the
application: Non-standard terms should only be used when they are documented
in [the glossary](#glossary), and shorthands used for user actions should
be accompanied by useful references to test procedures describing those
actions (when available) or descriptions in user documentation.
Test cases should be narrow in scope; if a list of steps is excessively
long (or must be written vaguely to be kept short) it should be broken
down into multiple tests which reference one another.
All requirements satisfied by Open MCT Web should be verifiable using
one or more test procedures.
## Glossary
This section will contain terms used in test procedures. This may link to
a common glossary, to avoid replication of content.
## Procedures
This section will contain specific test procedures. Presently, procedures
are placeholders describing general patterns for setting up and conducting
testing.
### User Testing Setup
These procedures describes a general pattern for setting up for user
testing. Specific deployments should customize this pattern with
relevant data and any additional steps necessary.
Property | Value
---------------|---------------------------------------------------------------
Test ID | MCT-TEST-SETUP0 - User Testing Setup
Relevant reqs. | TBD
Prerequisites | Build of relevant components
Test input | Exemplary database; exemplary telemetry data set
Instructions | See below
Expectation | Able to load application in a web browser (Google Chrome)
Eval. criteria | Visual inspection
Instructions:
1. Start telemetry server.
2. Start ElasticSearch.
3. Restore database snapshot to ElasticSearch.
4. Start telemetry playback.
5. Start HTTP server for client sources.
### User Test Procedures
Specific user test cases have not yet been authored. In their absence,
user testing is conducted by:
* Reviewing the text of issues from the issue tracker to understand the
desired behavior, and exercising this behavior in the running application.
(For instance, by following steps to reproduce from the original issue.)
* Issues which appear to be resolved should be marked as such with comments
on the original issue (e.g. "verified during user testing MM/DD/YYYY".)
* Issues which appear not to have been resolved should be reopened with an
explanation of what unexpected behavior has been observed.
* In cases where an issue appears resolved as-worded but other related
undesirable behavior is observed during testing, a new issue should be
opened, and linked to from a comment in the original issues.
* General usage of new features and/or existing features which have undergone
recent changes. Defects or problems with usability should be documented
by filing issues in the issue tracker.
* Open-ended testing to discover defects, identify usability issues, and
generate feature requests.
### Long-Duration Testing
The purpose of long-duration testing is to identify performance issues
and/or other defects which are sensitive to the amount of time the
application is kept running. (Memory leaks, for instance.)
Property | Value
---------------|---------------------------------------------------------------
Test ID | MCT-TEST-LDT0 - Long-duration Testing
Relevant reqs. | TBD
Prerequisites | MCT-TEST-SETUP0
Test input | (As for test setup.)
Instructions | See "Instructions" below &ast;
Expectation | See "Expectations" below &dagger;
Eval. criteria | Visual inspection
&ast; Instructions:
1. Start `top` or a similar tool to measure CPU usage and memory utilization.
2. Open several user-created displays (as many as would be realistically
opened during actual usage in a stressing case) in some combination of
separate tabs and windows (approximately as many tabs-per-window as
total windows.)
3. Ensure that playback data is set to run continuously for at least 24 hours
(e.g. on a loop.)
4. Record CPU usage and memory utilization.
5. In at least one tab, try some general user interface gestures and make
notes about the subjective experience of using the application. (Particularly,
the degree of responsiveness.)
6. Leave client displays open for 24 hours.
7. Record CPU usage and memory utilization again.
8. Make additional notes about the subjective experience of using the
application (again, particularly responsiveness.)
9. Check logs for any unexpected warnings or errors.
&dagger; Expectations:
* At the end of the test, CPU usage and memory usage should both be similar
to their levels at the start of the test.
* At the end of the test, subjective usage of the application should not
be observably different from the way it was at the start of the test.
(In particular, responsiveness should not decrease.)
* Logs should not contain any unexpected warnings or errors ("expected"
warnings or errors are those that have been documented and prioritized
as known issues, or those that are explained by transient conditions
external to the software, such as network outages.)

File diff suppressed because it is too large Load Diff

View File

@@ -16,6 +16,23 @@
"implementation": "SinewaveLimitCapability.js"
}
],
"formats": [
{
"key": "example.delta",
"implementation": "SinewaveDeltaFormat.js"
}
],
"constants": [
{
"key": "TIME_CONDUCTOR_DOMAINS",
"value": [
{ "key": "time", "name": "Time" },
{ "key": "yesterday", "name": "Yesterday" },
{ "key": "delta", "name": "Delta", "format": "example.delta" }
],
"priority": -1
}
],
"types": [
{
"key": "generator",
@@ -38,6 +55,11 @@
{
"key": "yesterday",
"name": "Yesterday"
},
{
"key": "delta",
"name": "Delta",
"format": "example.delta"
}
],
"ranges": [

View File

@@ -19,17 +19,8 @@
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/* Classes to be used for lists of properties and values */
/*global define,Promise*/
.properties {
.s-row {
border-top: 1px solid $colorInteriorBorder;
font-size: 0.8em;
&:first-child {
border: none;
}
.s-value {
color: #fff;
}
}
}
define({
START_TIME: Date.now() - 24 * 60 * 60 * 1000 // Now minus a day.
});

View File

@@ -0,0 +1,68 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise*/
define(
['./SinewaveConstants', 'moment'],
function (SinewaveConstants, moment) {
"use strict";
var START_TIME = SinewaveConstants.START_TIME,
FORMAT_REGEX = /^-?\d+:\d+:\d+$/,
SECOND = 1000,
MINUTE = SECOND * 60,
HOUR = MINUTE * 60;
function SinewaveDeltaFormat() {
}
function twoDigit(v) {
return v >= 10 ? String(v) : ('0' + v);
}
SinewaveDeltaFormat.prototype.format = function (value) {
var delta = Math.abs(value - START_TIME),
negative = value < START_TIME,
seconds = Math.floor(delta / SECOND) % 60,
minutes = Math.floor(delta / MINUTE) % 60,
hours = Math.floor(delta / HOUR);
return (negative ? "-" : "") +
[ hours, minutes, seconds ].map(twoDigit).join(":");
};
SinewaveDeltaFormat.prototype.validate = function (text) {
return FORMAT_REGEX.test(text);
};
SinewaveDeltaFormat.prototype.parse = function (text) {
var negative = text[0] === "-",
parts = text.replace("-", "").split(":");
return [ HOUR, MINUTE, SECOND ].map(function (sz, i) {
return parseInt(parts[i], 10) * sz;
}).reduce(function (a, b) {
return a + b;
}, 0) * (negative ? -1 : 1) + START_TIME;
};
return SinewaveDeltaFormat;
}
);

View File

@@ -25,12 +25,12 @@
* Module defining SinewaveTelemetry. Created by vwoeltje on 11/12/14.
*/
define(
[],
function () {
['./SinewaveConstants'],
function (SinewaveConstants) {
"use strict";
var ONE_DAY = 60 * 60 * 24,
firstObservedTime = Math.floor(Date.now() / 1000) - ONE_DAY;
firstObservedTime = Math.floor(SinewaveConstants.START_TIME / 1000);
/**
*
@@ -58,8 +58,11 @@ define(
};
generatorData.getDomainValue = function (i, domain) {
// delta uses the same numeric values as the default domain,
// so it's not checked for here, just formatted for display
// differently.
return (i + offset) * 1000 + firstTime * 1000 -
(domain === 'yesterday' ? ONE_DAY : 0);
(domain === 'yesterday' ? (ONE_DAY * 1000) : 0);
};
generatorData.getRangeValue = function (i, range) {

View File

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

26
example/mobile/res/config.rb Executable file
View File

@@ -0,0 +1,26 @@
# Require any additional compass plugins here.
# require "compass-growl"
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "js"
# You can select your preferred output style here (can be overridden via the command line):
# :expanded, :compressed, :nested
output_style = :nested
# To enable relative paths to assets via compass helper functions. Uncomment:
relative_assets = true
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass vfn_platform/static/sass scss && rm -rf sass && mv scss sass

View File

@@ -0,0 +1,103 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/*****************************************************************************
* 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.
*****************************************************************************/
/************************** FEATURES */
/************************** VERY INFLUENTIAL GLOBAL DIMENSIONS */
/************************** RATIOS */
/************************** LAYOUT */
/************************** CONTROLS */
/************************** PATHS */
/************************** TIMINGS */
/************************** LIMITS */
/*****************************************************************************
* 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.
*****************************************************************************/
/************************** MOBILE REPRESENTATION ITEMS DIMENSIONS */
/************************** MOBILE TREE MENU DIMENSIONS */
/************************** WINDOW DIMENSIONS FOR RWD */
/************************** MEDIA QUERIES: WINDOW CHECKS FOR SPECIFIC ORIENTATIONS FOR EACH DEVICE */
/************************** MEDIA QUERIES: WINDOWS FOR SPECIFIC ORIENTATIONS FOR EACH DEVICE */
/************************** DEVICE PARAMETERS FOR MENUS/REPRESENTATIONS */
/*****************************************************************************
* 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.
*****************************************************************************/
/* REQUIRES mobile/_constants */
@media screen and (orientation: portrait) and (max-width: 514px) and (max-height: 740px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (max-height: 514px) and (max-width: 740px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (max-height: 514px) and (max-width: 740px) and (max-device-width: 1024px) and (max-device-height: 799px), screen and (orientation: portrait) and (min-width: 515px) and (max-width: 799px) and (min-height: 741px) and (max-height: 1024px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (min-height: 515px) and (max-height: 799px) and (min-width: 741px) and (max-width: 1024px) and (max-device-width: 799px) and (max-device-height: 1024px), screen and (orientation: landscape) and (min-height: 515px) and (max-height: 799px) and (min-width: 741px) and (max-width: 1024px) and (max-device-width: 1024px) and (max-device-height: 799px) {
/* line 28, ../sass/mobile-example.scss */
.create-btn-holder {
display: block !important; } }

View File

@@ -0,0 +1,31 @@
/*****************************************************************************
* 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.
*****************************************************************************/
@import "../../../../platform/commonUI/general/res/sass/constants";
@import "../../../../platform/commonUI/general/res/sass/mobile/constants";
@import "../../../../platform/commonUI/general/res/sass/mobile/mixins";
@include phoneandtablet {
// Show the Create button
.create-btn-holder {
display: block !important;
}
}

View File

@@ -39,8 +39,11 @@ define(
start = Date.now();
function update() {
var secs = (Date.now() - start) / 1000;
var now = Date.now(),
secs = (now - start) / 1000;
displayed = Math.round(digests / secs);
start = now;
digests = 0;
}
function increment() {

View File

@@ -0,0 +1,2 @@
Example of using multiple persistence stores by exposing a root
object with a different space prefix.

View File

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

View File

@@ -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.
*****************************************************************************/
/*global define,window*/
define(
[],
function () {
'use strict';
/**
* The ScratchPersistenceProvider keeps JSON documents in memory
* and provides a persistence interface, but changes are lost on reload.
* @memberof example/scratchpad
* @constructor
* @implements {PersistenceService}
* @param q Angular's $q, for promises
*/
function ScratchPersistenceProvider($q) {
this.$q = $q;
this.table = {};
}
ScratchPersistenceProvider.prototype.listSpaces = function () {
return this.$q.when(['scratch']);
};
ScratchPersistenceProvider.prototype.listObjects = function (space) {
return this.$q.when(
space === 'scratch' ? Object.keys(this.table) : []
);
};
ScratchPersistenceProvider.prototype.createObject = function (space, key, value) {
if (space === 'scratch') {
this.table[key] = JSON.stringify(value);
}
return this.$q.when(space === 'scratch');
};
ScratchPersistenceProvider.prototype.readObject = function (space, key) {
return this.$q.when(
(space === 'scratch' && this.table[key]) ?
JSON.parse(this.table[key]) : undefined
);
};
ScratchPersistenceProvider.prototype.deleteObject = function (space, key, value) {
if (space === 'scratch') {
delete this.table[key];
}
return this.$q.when(space === 'scratch');
};
ScratchPersistenceProvider.prototype.updateObject =
ScratchPersistenceProvider.prototype.createObject;
return ScratchPersistenceProvider;
}
);

View File

@@ -34,7 +34,6 @@ module.exports = function(config) {
// List of files / patterns to load in the browser.
// By default, files are also included in a script tag.
files: [
'**/moment*',
{pattern: 'example/**/*.js', included: false},
{pattern: 'platform/**/*.js', included: false},
{pattern: 'warp/**/*.js', included: false},

View File

@@ -31,7 +31,7 @@
"jshint": "jshint platform example || exit 0",
"watch": "karma start",
"jsdoc": "jsdoc -c jsdoc.json -r -d target/docs/api",
"otherdoc": "node docs/gendocs.js --in docs/src --out target/docs",
"otherdoc": "node docs/gendocs.js --in docs/src --out target/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'",
"docs": "npm run jsdoc ; npm run otherdoc"
},
"repository": {

View File

@@ -1,9 +1,4 @@
{
"configuration": {
"paths": {
"uuid": "uuid"
}
},
"extensions": {
"routes": [
{
@@ -31,10 +26,10 @@
]
},
{
"key": "BrowseTreeController",
"implementation": "BrowseTreeController.js",
"key": "PaneController",
"implementation": "PaneController.js",
"priority": "preferred",
"depends": [ "$scope", "agentService" ]
"depends": [ "$scope", "agentService","$window" ]
},
{
"key": "BrowseObjectController",
@@ -107,6 +102,12 @@
"implementation": "navigation/NavigationService.js"
}
],
"policies": [
{
"implementation": "creation/CreationPolicy.js",
"category": "creation"
}
],
"actions": [
{
"key": "navigate",
@@ -159,7 +160,7 @@
"provides": "creationService",
"type": "provider",
"implementation": "creation/CreationService.js",
"depends": [ "persistenceService", "now", "$q", "$log" ]
"depends": [ "$q", "$log" ]
}
],
"runs": [
@@ -178,16 +179,6 @@
"copyright": "Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)",
"license": "license-mit",
"link": "https://github.com/sindresorhus/screenfull.js/blob/gh-pages/license"
},
{
"name": "Math.uuid.js",
"version": "1.4",
"description": "Unique identifer generation (code adapted.)",
"author": "Robert Kieffer",
"website": "https://github.com/broofa/node-uuid",
"copyright": "Copyright (c) 2010 Robert Kieffer",
"license": "license-mit",
"link": "http://opensource.org/licenses/MIT"
}
]
}

View File

@@ -19,16 +19,18 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<span ng-controller="BrowseObjectController">
<div class="object-browse-bar bar l-flex">
<div class="items-select left">
<div ng-controller="BrowseObjectController" class="abs l-flex-col">
<div class="holder flex-elem l-flex-row object-browse-bar ">
<div class="items-select left flex-elem l-flex-row grows">
<mct-representation key="'back-arrow'"
mct-object="domainObject"
class="l-back"></mct-representation>
<mct-representation key="'object-header'" mct-object="domainObject">
class="flex-elem l-back"></mct-representation>
<mct-representation key="'object-header'"
mct-object="domainObject"
class="l-flex-row flex-elem grows object-header">
</mct-representation>
</div>
<div class="btn-bar right">
<div class="btn-bar right l-flex-row flex-elem flex-justify-end flex-fixed">
<mct-representation key="'switcher'"
mct-object="domainObject"
ng-model="representation">
@@ -41,9 +43,26 @@
</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-inner">
<!-- Toolbar and Save/Cancel buttons -->
<div class="l-edit-controls flex-elem l-flex-row flex-align-end">
<mct-toolbar name="mctToolbar"
structure="toolbar.structure"
ng-model="toolbar.state"
class="flex-elem grows">
</mct-toolbar>
<mct-representation key="'edit-action-buttons'"
mct-object="domainObject"
class='flex-elem conclude-editing'>
</mct-representation>
<mct-representation key="representation.selected.key"
mct-object="representation.selected.key && domainObject"
class="abs object-holder">
</mct-representation>
</span>
</div>
<mct-representation key="representation.selected.key"
mct-object="representation.selected.key && domainObject"
class="abs flex-elem grows object-holder-main scroll"
toolbar="toolbar">
</mct-representation>
</div><!--/ l-object-wrapper-inner -->
</div>
</div>

View File

@@ -20,47 +20,68 @@
at runtime from the About dialog for additional information.
-->
<div class="abs holder-all browse-mode" ng-controller="BrowseController">
<div class="abs holder-all" ng-controller="BrowseController">
<mct-include key="'topbar-browse'"></mct-include>
<div class="holder browse-area s-browse-area abs browse-wrapper"
ng-controller="BrowseTreeController as tree"
ng-class="tree.visible() ? 'browse-showtree' : 'browse-hidetree'">
<mct-split-pane class='contents abs' anchor='left'>
<div class="abs holder holder-main browse-area s-browse-area browse-wrapper"
ng-controller="PaneController as modelPaneTree"
ng-class="modelPaneTree.visible() ? 'pane-tree-showing' : 'pane-tree-hidden'">
<mct-split-pane class='abs contents'
anchor='left'>
<div class='split-pane-component treeview pane left'>
<div class="holder abs l-mobile">
<div class="abs holder l-flex-col holder-treeview-elements">
<mct-representation key="'create-button'"
mct-object="navigatedObject"
mct-device="desktop">
class="holder flex-elem create-btn-holder">
</mct-representation>
<mct-include key="'search'"
ng-model="treeModel"
class="holder l-flex-col flex-elem search-holder"
ng-class="{ active: treeModel.search, grows: treeModel.search }">
</mct-include>
<mct-representation key="'tree'"
mct-object="domainObject"
parameters="tree"
ng-model="treeModel"
class="holder flex-elem grows vscroll tree-holder"
ng-hide="treeModel.search">
</mct-representation>
<div class='holder search-holder abs'
ng-class="{active: treeModel.search}">
<mct-representation key="'search'"
mct-object="domainObject"
ng-model="treeModel">
</mct-representation>
</div>
<div class='tree-holder abs mobile-tree-holder'
ng-hide="treeModel.search">
<mct-representation key="'tree'"
mct-object="domainObject"
parameters="tree"
ng-model="treeModel">
</mct-representation>
</div>
</div>
</div>
<mct-splitter class="mobile-hide"></mct-splitter>
<mct-splitter class="splitter-treeview mobile-hide"></mct-splitter>
<div class='split-pane-component items pane right-repr'>
<div class='holder abs l-mobile' id='content-area'>
<mct-representation mct-object="navigatedObject"
key="'browse-object'">
</mct-representation>
<div class='split-pane-component items pane primary-pane right'>
<a class="mini-tab-icon anchor-left toggle-pane toggle-tree"
title="{{ modelPaneTree.visible()? 'Hide' : 'Show' }} this pane"
ng-click="modelPaneTree.toggle()"
ng-class="{ collapsed : !modelPaneTree.visible() }"></a>
<div class='holder holder-object-and-inspector abs' id='content-area'
ng-controller="PaneController as modelPaneInspect"
ng-class="modelPaneInspect.visible() ? 'pane-inspect-showing' : 'pane-inspect-hidden'">
<mct-split-pane class='l-object-and-inspector contents abs' anchor='right'>
<div class='split-pane-component t-object pane primary-pane left'>
<mct-representation mct-object="navigatedObject"
key="'browse-object'"
class="abs holder holder-object">
</mct-representation>
</div>
<mct-splitter class="splitter-inspect mobile-hide flush-right edge-shdw"></mct-splitter>
<div class="split-pane-component t-inspect pane right mobile-hide">
<mct-representation key="'object-inspector'"
mct-object="navigatedObject"
ng-model="treeModel">
</mct-representation>
<a class="mini-tab-icon anchor-right mobile-hide toggle-pane toggle-inspect"
title="{{ modelPaneInspect.visible()? 'Hide' : 'Show' }} the Inspection pane"
ng-click="modelPaneInspect.toggle()"
ng-class="{ collapsed : !modelPaneInspect.visible() }"></a>
</div>
</mct-split-pane>
</div>
<div class="key-properties ui-symbol icon mobile-menu-icon desktop-hide"
mct-device="mobile"
ng-click="tree.toggle()">m</div>
</div>
</mct-split-pane>
</div>

View File

@@ -19,12 +19,12 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<div class='object-header object-header-mobile'>
<span class='type-icon ui-symbol'>{{type.getGlyph()}}</span>
<!--span class='type-name mobile-important-hide'>{{type.getName()}}</span-->
<span class="l-elem-wrapper l-flex">
<span ng-if="parameters.mode" class='action'>{{parameters.mode}}</span>
<span class='title-label'>{{model.name}}</span>
<mct-representation key="'menu-arrow'" mct-object='domainObject'></mct-representation>
</span>
</div>
<span class='type-icon ui-symbol flex-elem'>{{type.getGlyph()}}</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>
<mct-representation
key="'menu-arrow'"
mct-object='domainObject'
class="flex-elem"></mct-representation>
</span>

View File

@@ -19,13 +19,12 @@
this source code distribution or the Licensing information page available
at runtime from the About dialog for additional information.
-->
<div class="menu-element wrapper" ng-controller="ClickAwayController as createController">
<span ng-controller="ClickAwayController as createController">
<div class="s-menu-btn major create-btn" ng-click="createController.toggle()">
<span class="ui-symbol icon type-icon">&#x2b;</span>
<span class="title-label">Create</span>
</div>
<div class="menu super-menu" ng-show="createController.isActive()">
<mct-representation mct-object="domainObject" key="'create-menu'">
</mct-representation>
</div>
</div>
</span>

View File

@@ -26,14 +26,8 @@
<div class='ui-symbol profile' title='Shared'>&#x4f;</div>
<mct-representation class="desktop-hide" key="'info-button'" mct-object="domainObject"></mct-representation>
</div>
<div class='item-main abs'>
<div class='ui-symbol icon lg item-type'>
{{type.getGlyph()}}
<span
class="ui-symbol l-icon-link" title="This object is a link"
ng-show="location.isLink()"
></span>
</div>
<div class='item-main abs lg'>
<span class="t-item-icon" ng-class="{ 'l-icon-link':location.isLink() }">{{type.getGlyph()}}</span>
<div class='ui-symbol abs item-open'>}</div>
</div>
<div class='bottom-bar bar abs'>

View File

@@ -71,10 +71,14 @@ define(
// Callback for updating the in-scope reference to the object
// that is currently navigated-to.
function setNavigation(domainObject) {
//If the domain object has editor capability, retrieve the
// original uneditable domain object
var nonEditableObject = domainObject.hasCapability("editor") ? domainObject.getCapability("editor").getDomainObject() : domainObject;
$scope.navigatedObject = domainObject;
$scope.treeModel.selectedObject = domainObject;
$scope.treeModel.selectedObject = nonEditableObject;
navigationService.setNavigation(domainObject);
updateRoute(domainObject);
updateRoute(nonEditableObject);
}
function navigateTo(domainObject) {
@@ -153,7 +157,6 @@ define(
$scope.$on("$destroy", function () {
navigationService.removeListener(setNavigation);
});
}
return BrowseController;

View File

@@ -33,10 +33,12 @@ define(
* @constructor
* @memberof platform/commonUI/browse
*/
function BrowseTreeController($scope, agentService) {
function PaneController($scope, agentService, $window) {
var self = this;
this.agentService = agentService;
this.state = true;
// Fast and cheap: if this has been opened in a new window, hide panes by default
this.state = !$window.opener;
/**
* Callback to invoke when any selection occurs in the tree.
@@ -44,7 +46,7 @@ define(
* to the tree representation.
*
* @property {Function} callback
* @memberof platform/commonUI/browse.BrowseTreeController#
* @memberof platform/commonUI/browse.PaneController#
*/
this.callback = function () {
// Note that, since this is a callback to pass, this is not
@@ -59,20 +61,20 @@ define(
}
/**
* Toggle the visibility of the tree.
* Toggle the visibility of the pane.
*/
BrowseTreeController.prototype.toggle = function () {
PaneController.prototype.toggle = function () {
this.state = !this.state;
};
/**
* Get the desired visibility state of the tree.
* Get the desired visibility state of the pane.
* @returns {boolean} true when visible
*/
BrowseTreeController.prototype.visible = function () {
PaneController.prototype.visible = function () {
return this.state;
};
return BrowseTreeController;
return PaneController;
}
);

View File

@@ -69,7 +69,7 @@ define(
// Introduce one create action per type
return this.typeService.listTypes().filter(function (type) {
return type.hasFeature("creation");
return self.policyService.allow("creation", type);
}).map(function (type) {
return new CreateAction(
type,

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define(
[],
function () {
"use strict";
/**
* A policy for determining whether objects of a given type can be
* created.
* @constructor
* @implements {Policy}
* @memberof platform/commonUI/browse
*/
function CreationPolicy() {
}
CreationPolicy.prototype.allow = function (type) {
return type.hasFeature("creation");
};
return CreationPolicy;
}
);

View File

@@ -25,8 +25,8 @@
* Module defining CreateService. Created by vwoeltje on 11/10/14.
*/
define(
["uuid"],
function (uuid) {
[],
function () {
"use strict";
var NON_PERSISTENT_WARNING =
@@ -42,11 +42,9 @@ define(
* @memberof platform/commonUI/browse
* @constructor
*/
function CreationService(persistenceService, now, $q, $log) {
this.persistenceService = persistenceService;
function CreationService($q, $log) {
this.$q = $q;
this.$log = $log;
this.now = now;
}
/**
@@ -70,26 +68,17 @@ define(
*/
CreationService.prototype.createObject = function (model, parent) {
var persistence = parent.getCapability("persistence"),
newObject = parent.useCapability("instantiation", model),
newObjectPersistence = newObject.getCapability("persistence"),
self = this;
// Persist the new domain object's model; it will be fully
// constituted as a domain object when loaded back, as all
// domain object models are.
function doPersist(space, id, model) {
return self.persistenceService.createObject(
space,
id,
model
).then(function () { return id; });
}
// Add the newly-created object's id to the parent's
// composition, so that it will subsequently appear
// as a child contained by that parent.
function addToComposition(id, parent, parentPersistence) {
function addToComposition() {
var compositionCapability = parent.getCapability('composition'),
addResult = compositionCapability &&
compositionCapability.add(id);
compositionCapability.add(newObject);
return self.$q.when(addResult).then(function (result) {
if (!result) {
@@ -97,7 +86,7 @@ define(
return undefined;
}
return parentPersistence.persist().then(function () {
return persistence.persist().then(function () {
return result;
});
});
@@ -105,21 +94,13 @@ define(
// We need the parent's persistence capability to determine
// what space to create the new object's model in.
if (!persistence) {
if (!persistence || !newObjectPersistence) {
self.$log.warn(NON_PERSISTENT_WARNING);
return self.$q.reject(new Error(NON_PERSISTENT_WARNING));
}
// We create a new domain object in three sequential steps:
// 1. Get a new UUID for the object
// 2. Create a model with that ID in the persistence space
// 3. Add that ID to
return self.$q.when(uuid()).then(function (id) {
model.persisted = self.now();
return doPersist(persistence.getSpace(), id, model);
}).then(function (id) {
return addToComposition(id, parent, persistence);
});
// Persist the new object, then add it to composition.
return newObjectPersistence.persist().then(addToComposition);
};

View File

@@ -50,6 +50,7 @@ define(
}
beforeEach(function () {
mockScope = jasmine.createSpyObj(
"$scope",
[ "$on", "$watch" ]
@@ -82,11 +83,11 @@ define(
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[ "getId", "getCapability", "getModel", "useCapability" ]
[ "getId", "hasCapability", "getCapability", "getModel", "useCapability" ]
);
mockNextObject = jasmine.createSpyObj(
"nextObject",
[ "getId", "getCapability", "getModel", "useCapability" ]
[ "getId", "hasCapability", "getCapability", "getModel", "useCapability" ]
);
mockObjectService.getObjects.andReturn(mockPromise({
@@ -98,9 +99,13 @@ define(
mockDomainObject.useCapability.andReturn(mockPromise([
mockNextObject
]));
mockNextObject.useCapability.andReturn(undefined);
mockNextObject.getId.andReturn("next");
mockNextObject.hasCapability.andReturn(false);
mockDomainObject.getId.andReturn("mine");
mockDomainObject.hasCapability.andReturn(false);
controller = new BrowseController(
mockScope,

View File

@@ -22,22 +22,24 @@
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
define(
["../src/BrowseTreeController"],
function (BrowseTreeController) {
["../src/PaneController"],
function (PaneController) {
'use strict';
describe("The BrowseTreeController", function () {
describe("The PaneController", function () {
var mockScope,
mockAgentService,
mockDomainObjects,
mockWindow,
controller;
// We want to reinstantiate for each test case
// because device state can influence constructor-time behavior
function instantiateController() {
return new BrowseTreeController(
return new PaneController(
mockScope,
mockAgentService
mockAgentService,
mockWindow
);
}
@@ -58,6 +60,7 @@ define(
"agentService",
[ "isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape" ]
);
mockWindow = jasmine.createSpyObj("$window", ["open"]);
});
it("is initially visible", function () {

View File

@@ -33,6 +33,9 @@ define(
var mockTypeService,
mockDialogService,
mockCreationService,
mockPolicyService,
mockCreationPolicy,
mockPolicyMap = {},
mockTypes,
provider;
@@ -67,14 +70,32 @@ define(
"creationService",
[ "createObject" ]
);
mockPolicyService = jasmine.createSpyObj(
"policyService",
[ "allow" ]
);
mockTypes = [ "A", "B", "C" ].map(createMockType);
mockTypes.forEach(function(type){
mockPolicyMap[type.getName()] = true;
});
mockCreationPolicy = function(type){
return mockPolicyMap[type.getName()];
};
mockPolicyService.allow.andCallFake(function(category, type){
return category === "creation" && mockCreationPolicy(type) ? true : false;
});
mockTypeService.listTypes.andReturn(mockTypes);
provider = new CreateActionProvider(
mockTypeService,
mockDialogService,
mockCreationService
mockCreationService,
mockPolicyService
);
});
@@ -94,15 +115,15 @@ define(
it("does not expose non-creatable types", function () {
// One of the types won't have the creation feature...
mockTypes[1].hasFeature.andReturn(false);
mockPolicyMap[mockTypes[0].getName()] = false;
// ...so it should have been filtered out.
expect(provider.getActions({
key: "create",
domainObject: {}
}).length).toEqual(2);
// Make sure it was creation which was used to check
expect(mockTypes[1].hasFeature)
.toHaveBeenCalledWith("creation");
expect(mockPolicyService.allow)
.toHaveBeenCalledWith("creation", mockTypes[0]);
});
});
}

View File

@@ -0,0 +1,53 @@
/*****************************************************************************
* 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,describe,it,expect,beforeEach,jasmine*/
define(
["../../src/creation/CreationPolicy"],
function (CreationPolicy) {
"use strict";
describe("The creation policy", function () {
var mockType,
policy;
beforeEach(function () {
mockType = jasmine.createSpyObj(
'type',
['hasFeature']
);
policy = new CreationPolicy();
});
it("allows creation of types with the creation feature", function () {
mockType.hasFeature.andReturn(true);
expect(policy.allow(mockType)).toBeTruthy();
});
it("disallows creation of types without the creation feature", function () {
mockType.hasFeature.andReturn(false);
expect(policy.allow(mockType)).toBeFalsy();
});
});
}
);

View File

@@ -30,9 +30,7 @@ define(
"use strict";
describe("The creation service", function () {
var mockPersistenceService,
mockNow,
mockQ,
var mockQ,
mockLog,
mockParentObject,
mockNewObject,
@@ -40,7 +38,9 @@ define(
mockPersistenceCapability,
mockCompositionCapability,
mockContextCapability,
mockCreationCapability,
mockCapabilities,
mockNewPersistenceCapability,
creationService;
function mockPromise(value) {
@@ -60,11 +60,6 @@ define(
}
beforeEach(function () {
mockPersistenceService = jasmine.createSpyObj(
"persistenceService",
[ "createObject" ]
);
mockNow = jasmine.createSpy('now');
mockQ = { when: mockPromise, reject: mockReject };
mockLog = jasmine.createSpyObj(
"$log",
@@ -76,7 +71,7 @@ define(
);
mockNewObject = jasmine.createSpyObj(
"newObject",
[ "getId" ]
[ "getId", "getCapability", "useCapability" ]
);
mockMutationCapability = jasmine.createSpyObj(
"mutation",
@@ -94,19 +89,22 @@ define(
"context",
["getPath"]
);
mockCreationCapability = jasmine.createSpyObj(
"creation",
["instantiate", "invoke"]
);
mockCapabilities = {
mutation: mockMutationCapability,
persistence: mockPersistenceCapability,
composition: mockCompositionCapability,
context: mockContextCapability
context: mockContextCapability,
instantiation: mockCreationCapability
};
mockPersistenceService.createObject.andReturn(
mockPromise(true)
mockNewPersistenceCapability = jasmine.createSpyObj(
"new-persistence",
[ "persist", "getSpace" ]
);
mockNow.andReturn(12321);
mockParentObject.getCapability.andCallFake(function (key) {
return mockCapabilities[key];
});
@@ -115,9 +113,16 @@ define(
});
mockParentObject.getId.andReturn('parentId');
mockPersistenceCapability.persist.andReturn(
mockPromise(true)
);
mockNewObject.getId.andReturn('newId');
mockNewObject.getCapability.andCallFake(function (c) {
return c === 'persistence' ?
mockNewPersistenceCapability : undefined;
});
mockPersistenceCapability.persist
.andReturn(mockPromise(true));
mockNewPersistenceCapability.persist
.andReturn(mockPromise(true));
mockMutationCapability.invoke.andReturn(mockPromise(true));
mockPersistenceCapability.getSpace.andReturn("testSpace");
@@ -125,10 +130,12 @@ define(
mockPromise([mockNewObject])
);
mockCompositionCapability.add.andReturn(mockPromise(true));
mockCreationCapability.instantiate.andReturn(mockNewObject);
mockCreationCapability.invoke.andCallFake(function (model) {
return mockCreationCapability.instantiate(model);
});
creationService = new CreationService(
mockPersistenceService,
mockNow,
mockQ,
mockLog
);
@@ -137,21 +144,18 @@ define(
it("allows new objects to be created", function () {
var model = { someKey: "some value" };
creationService.createObject(model, mockParentObject);
expect(mockPersistenceService.createObject).toHaveBeenCalledWith(
"testSpace",
jasmine.any(String), // the object id; generated UUID
model
);
expect(mockCreationCapability.instantiate)
.toHaveBeenCalledWith(model);
});
it("adds new id's to the parent's composition", function () {
it("adds new objects to the parent's composition", function () {
var model = { someKey: "some value" },
parentModel = { composition: ["notAnyUUID"] };
creationService.createObject(model, mockParentObject);
// Verify that a new ID was added
expect(mockCompositionCapability.add)
.toHaveBeenCalledWith(jasmine.any(String));
.toHaveBeenCalledWith(mockNewObject);
});
it("provides the newly-created object", function () {
@@ -207,11 +211,6 @@ define(
expect(mockLog.error).toHaveBeenCalled();
});
it("attaches a 'persisted' timestamp", function () {
var model = { someKey: "some value" };
creationService.createObject(model, mockParentObject);
expect(model.persisted).toEqual(mockNow());
});
});
}

View File

@@ -1,13 +1,14 @@
[
"BrowseController",
"BrowseObjectController",
"BrowseTreeController",
"PaneController",
"MenuArrowController",
"creation/CreateAction",
"creation/CreateActionProvider",
"creation/CreateMenuController",
"creation/CreateWizard",
"creation/CreationService",
"creation/CreationPolicy",
"creation/LocatorController",
"navigation/NavigateAction",
"navigation/NavigationService",

View File

@@ -181,7 +181,7 @@ define(
* @typedef DialogOption
* @property {string} label a label to be displayed as the button
* text for this action
* @property {function} action a function to be called when the
* @property {function} callback a function to be called when the
* button is clicked
*/

View File

@@ -38,7 +38,7 @@
{
"key": "edit",
"implementation": "actions/EditAction.js",
"depends": [ "$location", "navigationService", "$log" ],
"depends": [ "$q", "navigationService", "$log" ],
"description": "Edit this object.",
"category": "view-control",
"glyph": "p"
@@ -67,7 +67,7 @@
"implementation": "actions/SaveAction.js",
"name": "Save",
"description": "Save changes made to these objects.",
"depends": [ "$location", "urlService" ],
"depends": [ "navigationService" ],
"priority": "mandatory"
},
{
@@ -76,7 +76,7 @@
"implementation": "actions/CancelAction.js",
"name": "Cancel",
"description": "Discard changes made to these objects.",
"depends": [ "$location", "urlService" ]
"depends": ["navigationService" ]
}
],
"policies": [

View File

@@ -21,10 +21,11 @@
-->
<span ng-controller="EditActionController">
<span ng-repeat="currentAction in editActions">
<a class='s-btn'
<a class='s-btn t-{{currentAction.getMetadata().key}}'
title='{{currentAction.getMetadata().name}}'
ng-click="currentAction.perform()"
ng-class="{ major: $index === 0, subtle: $index !== 0 }">
{{currentAction.getMetadata().name}}
ng-class="{ major: $index === 0 }">
<span class="title-label">{{currentAction.getMetadata().name}}</span>
</a>
</span>
</span>

View File

@@ -24,7 +24,9 @@
<ul class="tree">
<li ng-repeat="containedObject in composition">
<span class="tree-item">
<mct-representation key="'label'" mct-object="containedObject">
<mct-representation key="'label'"
mct-object="containedObject"
class="rep-object-label">
</mct-representation>
</span>
</li>

View File

@@ -22,7 +22,8 @@
<div class='top-bar edit abs'>
<mct-representation key="'object-header'"
mct-object="domainObject"
parameters="{ mode: 'Edit' }">
parameters="{ mode: 'Edit' }"
class="l-flex-row flex-elem grows object-header">
</mct-representation>
<div class='buttons-main btn-bar buttons abs'>
<mct-representation key="'switcher'"

View File

@@ -33,10 +33,9 @@ define(
* @memberof platform/commonUI/edit
* @implements {Action}
*/
function CancelAction($location, urlService, context) {
function CancelAction(navigationService, context) {
this.domainObject = context.domainObject;
this.$location = $location;
this.urlService = urlService;
this.navigationService = navigationService;
}
/**
@@ -47,8 +46,7 @@ define(
*/
CancelAction.prototype.perform = function () {
var domainObject = this.domainObject,
$location = this.$location,
urlService = this.urlService;
navigationService = this.navigationService;
// Look up the object's "editor.completion" capability;
// this is introduced by EditableDomainObject which is
@@ -64,13 +62,9 @@ define(
return editor.cancel();
}
// Discard the current root view (which will be the editing
// UI, which will have been pushed atop the Browise UI.)
function returnToBrowse() {
$location.path($location.path(urlService.urlForLocation(
"browse",
domainObject
)));
//Return navigation state to the non-editable version of the object.
function returnToBrowse(nonEditableDomainObject) {
navigationService.setNavigation(nonEditableDomainObject);
}
return doCancel(getEditorCapability())
@@ -86,7 +80,7 @@ define(
CancelAction.appliesTo = function (context) {
var domainObject = (context || {}).domainObject;
return domainObject !== undefined &&
domainObject.hasCapability("editor");
domainObject.getCapability('status').get('editing');
};
return CancelAction;

View File

@@ -25,8 +25,8 @@
* Module defining EditAction. Created by vwoeltje on 11/14/14.
*/
define(
[],
function () {
['../objects/EditableDomainObject'],
function (EditableDomainObject) {
"use strict";
// A no-op action to return in the event that the action cannot
@@ -46,7 +46,7 @@ define(
* @constructor
* @implements {Action}
*/
function EditAction($location, navigationService, $log, context) {
function EditAction($q, navigationService, $log, context) {
var domainObject = (context || {}).domainObject;
// We cannot enter Edit mode if we have no domain object to
@@ -63,16 +63,20 @@ define(
}
this.domainObject = domainObject;
this.$location = $location;
this.navigationService = navigationService;
this.$q = $q;
}
EditAction.prototype.createEditableObject = function(domainObject) {
return new EditableDomainObject(domainObject, this.$q);
};
/**
* Enter edit mode.
*/
EditAction.prototype.perform = function () {
this.navigationService.setNavigation(this.domainObject);
this.$location.path("/edit");
this.domainObject.getCapability('status').set('editing', true);
this.navigationService.setNavigation(this.createEditableObject(this.domainObject));
};
/**
@@ -85,8 +89,11 @@ define(
var domainObject = (context || {}).domainObject,
type = domainObject && domainObject.getCapability('type');
// Only allow creatable types to be edited
return type && type.hasFeature('creation');
// Only allow creatable types to be edited, and objects that are
// not already being edited
return type
&& type.hasFeature('creation')
&& !domainObject.getCapability('status').get('editing');
};
return EditAction;

View File

@@ -34,10 +34,9 @@ define(
* @implements {Action}
* @memberof platform/commonUI/edit
*/
function SaveAction($location, urlService, context) {
function SaveAction(navigationService, context) {
this.domainObject = (context || {}).domainObject;
this.$location = $location;
this.urlService = urlService;
this.navigationService = navigationService;
}
/**
@@ -49,8 +48,7 @@ define(
*/
SaveAction.prototype.perform = function () {
var domainObject = this.domainObject,
$location = this.$location,
urlService = this.urlService;
navigationService = this.navigationService;
// Invoke any save behavior introduced by the editor capability;
// this is introduced by EditableDomainObject which is
@@ -62,11 +60,8 @@ define(
// Discard the current root view (which will be the editing
// UI, which will have been pushed atop the Browise UI.)
function returnToBrowse() {
return $location.path(urlService.urlForLocation(
"browse",
domainObject
));
function returnToBrowse(nonEditableDomainObject) {
navigationService.setNavigation(nonEditableDomainObject);
}
return doSave().then(returnToBrowse);
@@ -81,7 +76,7 @@ define(
SaveAction.appliesTo = function (context) {
var domainObject = (context || {}).domainObject;
return domainObject !== undefined &&
domainObject.hasCapability("editor");
domainObject.getCapability("status").get("editing");
};
return SaveAction;

View File

@@ -50,7 +50,7 @@ define(
// Simply trigger refresh of in-view objects; do not
// write anything to database.
persistence.persist = function () {
cache.markDirty(editableObject);
return cache.markDirty(editableObject);
};
// Delegate refresh to the original object; this avoids refreshing

View File

@@ -95,9 +95,16 @@ define(
return domainObject.getCapability('persistence').persist();
}
return nonrecursive ?
resolvePromise(doMutate()).then(doPersist) :
resolvePromise(cache.saveAll());
function saveChanges() {
return nonrecursive ?
resolvePromise(doMutate()).then(doPersist) :
resolvePromise(cache.saveAll());
}
return saveChanges().then(function(){
domainObject.getCapability('status').set('editing', false);
return domainObject;
});
};
/**
@@ -109,7 +116,8 @@ define(
* @memberof platform/commonUI/edit.EditorCapability#
*/
EditorCapability.prototype.cancel = function () {
return resolvePromise(undefined);
this.domainObject.getCapability('status').set('editing', false);
return resolvePromise(this.domainObject);
};
/**
@@ -121,6 +129,10 @@ define(
return this.cache.dirty();
};
EditorCapability.prototype.getDomainObject = function () {
return this.domainObject;
};
return EditorCapability;
}
);

View File

@@ -111,6 +111,7 @@ define(
*/
EditableDomainObjectCache.prototype.markDirty = function (domainObject) {
this.dirtyObjects[domainObject.getId()] = domainObject;
return this.$q.when(true);
};
/**

View File

@@ -47,6 +47,7 @@ define(
*/
function EditRepresenter($q, $log, scope) {
var self = this;
this.scope = scope;
// Mutate and persist a new version of a domain object's model.
function doPersist(model) {
@@ -100,6 +101,7 @@ define(
this.key = (representation || {}).key;
// Track the represented object
this.domainObject = representedObject;
this.scope.editMode = representedObject.hasCapability("status") && representedObject.getCapability("status").get("editing");
// Ensure existing watches are released
this.destroy();
};

View File

@@ -27,10 +27,11 @@ define(
"use strict";
describe("The Cancel action", function () {
var mockLocation,
mockDomainObject,
var mockDomainObject,
mockCapabilities,
mockEditorCapability,
mockUrlService,
mockStatusCapability,
mockNavigationService,
actionContext,
action;
@@ -43,45 +44,50 @@ define(
}
beforeEach(function () {
mockLocation = jasmine.createSpyObj(
"$location",
[ "path" ]
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[ "getCapability", "hasCapability" ]
[ "getCapability" ]
);
mockEditorCapability = jasmine.createSpyObj(
"editor",
[ "save", "cancel" ]
);
mockUrlService = jasmine.createSpyObj(
"urlService",
["urlForLocation"]
mockStatusCapability = jasmine.createSpyObj(
"status",
[ "get"]
);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
["setNavigation"]
);
mockCapabilities = {
"editor": mockEditorCapability,
"status": mockStatusCapability
};
actionContext = {
domainObject: mockDomainObject
};
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.getCapability.andReturn(mockEditorCapability);
mockEditorCapability.cancel.andReturn(mockPromise(true));
mockDomainObject.getCapability.andCallFake(function(capability){
return mockCapabilities[capability];
});
action = new CancelAction(mockLocation, mockUrlService, actionContext);
mockEditorCapability.cancel.andReturn(mockPromise(mockDomainObject));
mockStatusCapability.get.andReturn(true);
action = new CancelAction( mockNavigationService, actionContext);
});
it("only applies to domain object with an editor capability", function () {
it("only applies to domain object that is being edited", function () {
expect(CancelAction.appliesTo(actionContext)).toBeTruthy();
expect(mockDomainObject.hasCapability).toHaveBeenCalledWith("editor");
mockDomainObject.hasCapability.andReturn(false);
mockDomainObject.getCapability.andReturn(undefined);
mockStatusCapability.get.andReturn(false);
expect(CancelAction.appliesTo(actionContext)).toBeFalsy();
});
it("invokes the editor capability's save functionality when performed", function () {
it("invokes the editor capability's cancel functionality when" +
" performed", function () {
// Verify precondition
expect(mockEditorCapability.cancel).not.toHaveBeenCalled();
action.perform();
@@ -95,8 +101,8 @@ define(
it("returns to browse when performed", function () {
action.perform();
expect(mockLocation.path).toHaveBeenCalledWith(
mockUrlService.urlForLocation("browse", mockDomainObject)
expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(
mockDomainObject
);
});
});

View File

@@ -19,27 +19,41 @@
* 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*/
/*global define,describe,it,expect,beforeEach,jasmine,spyOn*/
define(
["../../src/actions/EditAction"],
[
"../../src/actions/EditAction"
],
function (EditAction) {
"use strict";
describe("The Edit action", function () {
var mockLocation,
mockNavigationService,
var mockNavigationService,
mockLog,
mockDomainObject,
mockStatusCapability,
mockType,
actionContext,
mockCapabilities,
mockQ,
action;
function mockPromise(value) {
return {
then: function (callback) {
return mockPromise(callback(value));
}
};
}
beforeEach(function () {
mockLocation = jasmine.createSpyObj(
"$location",
[ "path" ]
mockStatusCapability = jasmine.createSpyObj(
"statusCapability",
[ "get", "set" ]
);
mockNavigationService = jasmine.createSpyObj(
"navigationService",
[ "setNavigation", "getNavigation" ]
@@ -50,20 +64,41 @@ define(
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[ "getId", "getModel", "getCapability" ]
[ "getId", "getModel", "getCapability", "hasCapability" ]
);
mockType = jasmine.createSpyObj(
"type",
[ "hasFeature" ]
);
mockDomainObject.getCapability.andReturn(mockType);
mockQ = jasmine.createSpyObj(
"q",
[ "when", "all" ]
);
mockQ.when.andReturn(function(value){
return mockPromise(value);
});
mockQ.all.andReturn(mockPromise(undefined));
mockDomainObject.getCapability.andCallFake(function(capability){
return mockCapabilities[capability];
});
mockDomainObject.getModel.andReturn({});
mockDomainObject.getId.andReturn("testId");
mockStatusCapability.get.andReturn(false);
mockType.hasFeature.andReturn(true);
mockCapabilities = {
"status": mockStatusCapability,
"type": mockType
};
actionContext = { domainObject: mockDomainObject };
action = new EditAction(
mockLocation,
mockQ,
mockNavigationService,
mockLog,
actionContext
@@ -77,15 +112,30 @@ define(
expect(mockType.hasFeature).toHaveBeenCalledWith('creation');
});
it("changes URL path to edit mode when performed", function () {
it("is only applicable when domain object is not in edit mode", function () {
// Indicates whether object is in edit mode
mockStatusCapability.get.andReturn(false);
expect(EditAction.appliesTo(actionContext)).toBeTruthy();
mockStatusCapability.get.andReturn(true);
expect(EditAction.appliesTo(actionContext)).toBeFalsy();
});
it("navigates to editable domain object", function () {
spyOn(action, 'createEditableObject');
action.perform();
expect(mockLocation.path).toHaveBeenCalledWith("/edit");
expect(mockNavigationService.setNavigation).toHaveBeenCalled();
expect(action.createEditableObject).toHaveBeenCalled();
});
it("ensures that the edited object is navigated-to", function () {
var navigatedObject;
action.perform();
expect(mockNavigationService.setNavigation)
.toHaveBeenCalledWith(mockDomainObject);
navigatedObject = mockNavigationService.setNavigation.mostRecentCall.args[0];
expect(navigatedObject.getId())
.toEqual(mockDomainObject.getId());
expect(navigatedObject).not.toBe(mockDomainObject);
});
it("logs a warning if constructed when inapplicable", function () {
@@ -94,7 +144,7 @@ define(
// Should not have hit an exception...
new EditAction(
mockLocation,
mockQ,
mockNavigationService,
mockLog,
{}
@@ -104,8 +154,6 @@ define(
expect(mockLog.warn).toHaveBeenCalled();
// And should not have had other interactions
expect(mockLocation.path)
.not.toHaveBeenCalled();
expect(mockNavigationService.setNavigation)
.not.toHaveBeenCalled();
});

View File

@@ -27,10 +27,11 @@ define(
"use strict";
describe("The Save action", function () {
var mockLocation,
mockDomainObject,
var mockDomainObject,
mockNavigationService,
mockStatusCapability,
mockEditorCapability,
mockUrlService,
mockCapabilities,
actionContext,
action;
@@ -43,10 +44,6 @@ define(
}
beforeEach(function () {
mockLocation = jasmine.createSpyObj(
"$location",
[ "path" ]
);
mockDomainObject = jasmine.createSpyObj(
"domainObject",
[ "getCapability", "hasCapability" ]
@@ -55,30 +52,39 @@ define(
"editor",
[ "save", "cancel" ]
);
mockUrlService = jasmine.createSpyObj(
"urlService",
["urlForLocation"]
mockStatusCapability = jasmine.createSpyObj(
"statusCapability",
["get"]
);
mockNavigationService = jasmine.createSpyObj(
"mockNavigationService",
[ "setNavigation"]
);
mockCapabilities = {
"editor": mockEditorCapability,
"status": mockStatusCapability
};
actionContext = {
domainObject: mockDomainObject
};
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.getCapability.andReturn(mockEditorCapability);
mockEditorCapability.save.andReturn(mockPromise(true));
mockDomainObject.getCapability.andCallFake(function(capability){
return mockCapabilities[capability];
});
action = new SaveAction(mockLocation, mockUrlService, actionContext);
mockEditorCapability.save.andReturn(mockPromise(mockDomainObject));
mockStatusCapability.get.andReturn(true);
action = new SaveAction(mockNavigationService, actionContext);
});
it("only applies to domain object with an editor capability", function () {
it("only applies to domain object that is being edited", function () {
expect(SaveAction.appliesTo(actionContext)).toBeTruthy();
expect(mockDomainObject.hasCapability).toHaveBeenCalledWith("editor");
mockDomainObject.hasCapability.andReturn(false);
mockDomainObject.getCapability.andReturn(undefined);
mockStatusCapability.get.andReturn(false);
expect(SaveAction.appliesTo(actionContext)).toBeFalsy();
});
@@ -96,8 +102,8 @@ define(
it("returns to browse when performed", function () {
action.perform();
expect(mockLocation.path).toHaveBeenCalledWith(
mockUrlService.urlForLocation("browse", mockDomainObject)
expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(
mockDomainObject
);
});
});

View File

@@ -31,6 +31,7 @@ define(
mockEditableObject,
mockDomainObject,
mockCache,
mockPromise,
capability;
beforeEach(function () {
@@ -50,7 +51,9 @@ define(
"cache",
[ "markDirty" ]
);
mockPromise = jasmine.createSpyObj("promise", ["then"]);
mockCache.markDirty.andReturn(mockPromise);
mockDomainObject.getCapability.andReturn(mockPersistence);
capability = new EditablePersistenceCapability(
@@ -84,6 +87,10 @@ define(
expect(mockPersistence.refresh).toHaveBeenCalled();
});
it("returns a promise from persist", function () {
expect(capability.persist().then).toEqual(jasmine.any(Function));
});
});
}
);

View File

@@ -28,6 +28,8 @@ define(
describe("The editor capability", function () {
var mockPersistence,
mockStatusCapability,
mockCapabilities,
mockEditableObject,
mockDomainObject,
mockCache,
@@ -40,6 +42,14 @@ define(
"persistence",
[ "persist" ]
);
mockStatusCapability = jasmine.createSpyObj(
"status",
[ "set" ]
);
mockCapabilities = {
"persistence":mockPersistence,
"status": mockStatusCapability
};
mockEditableObject = {
getModel: function () { return model; }
};
@@ -53,7 +63,9 @@ define(
);
mockCallback = jasmine.createSpy("callback");
mockDomainObject.getCapability.andReturn(mockPersistence);
mockDomainObject.getCapability.andCallFake(function(capability){
return mockCapabilities[capability];
});
model = { someKey: "some value", x: 42 };
@@ -96,6 +108,19 @@ define(
});
});
it("resets the editing status on successful save", function () {
capability.save().then(mockCallback);
// Wait for promise to resolve
waitsFor(function () {
return mockCallback.calls.length > 0;
}, 250);
runs(function () {
expect(mockStatusCapability.set).toHaveBeenCalledWith('editing', false);
});
});
it("has no interactions on cancel", function () {
capability.cancel().then(mockCallback);
@@ -111,6 +136,19 @@ define(
});
});
it("resets editing status on cancel", function () {
capability.cancel().then(mockCallback);
// Wait for promise to resolve
waitsFor(function () {
return mockCallback.calls.length > 0;
}, 250);
runs(function () {
expect(mockStatusCapability.set).toHaveBeenCalledWith('editing', false);
});
});
});
}

View File

@@ -32,7 +32,9 @@ define(
mockScope,
testRepresentation,
mockDomainObject,
mockStatusCapability,
mockPersistence,
mockCapabilities,
representer;
function mockPromise(value) {
@@ -57,11 +59,21 @@ define(
]);
mockPersistence =
jasmine.createSpyObj("persistence", ["persist"]);
mockStatusCapability = jasmine.createSpyObj("domainObject", [
"get"]);
mockCapabilities = {
"persistence": mockPersistence,
"status": mockStatusCapability
};
mockDomainObject.getModel.andReturn({});
mockDomainObject.hasCapability.andReturn(true);
mockDomainObject.useCapability.andReturn(true);
mockDomainObject.getCapability.andReturn(mockPersistence);
mockStatusCapability.get.andReturn(true);
mockDomainObject.getCapability.andCallFake(function(capability){
return mockCapabilities[capability];
});
representer = new EditRepresenter(mockQ, mockLog, mockScope);
representer.represent(testRepresentation, mockDomainObject);
@@ -98,6 +110,14 @@ define(
});
});
it("sets an 'editMode' flag on scope if the object is editable", function() {
expect(mockScope.editMode).toBe(true);
mockStatusCapability.get.andReturn(false);
representer.represent(testRepresentation, mockDomainObject);
expect(mockScope.editMode).toBeFalsy();
});
});
}

View File

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

View File

@@ -0,0 +1,114 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define([
], function (
) {
"use strict";
/**
* An object used to convert between numeric values and text values,
* typically used to display these values to the user and to convert
* user input to a numeric format, particularly for time formats.
* @interface {Format}
*/
/**
* Parse text (typically user input) to a numeric value.
* Behavior is undefined when the text cannot be parsed;
* `validate` should be called first if the text may be invalid.
* @method parse
* @memberof Format#
* @param {string} text the text to parse
* @returns {number} the parsed numeric value
*/
/**
* Determine whether or not some text (typically user input) can
* be parsed to a numeric value by this format.
* @method validate
* @memberof Format#
* @param {string} text the text to parse
* @returns {boolean} true if the text can be parsed
*/
/**
* Convert a numeric value to a text value for display using
* this format.
* @method format
* @memberof Format#
* @param {number} value the numeric value to format
* @returns {string} the text representation of the value
*/
/**
* Provides access to `Format` objects which can be used to
* convert values between human-readable text and numeric
* representations.
* @interface FormatService
*/
/**
* Look up a format by its symbolic identifier.
* @method getFormat
* @memberof FormatService#
* @param {string} key the identifier for this format
* @returns {Format} the format
* @throws {Error} errors when the requested format is unrecognized
*/
/**
* Provides formats from the `formats` extension category.
* @constructor
* @implements {FormatService}
* @memberof platform/commonUI/formats
* @param {Array.<function(new : Format)>} format constructors,
* from the `formats` extension category.
*/
function FormatProvider(formats) {
var formatMap = {};
function addToMap(Format) {
var key = Format.key;
if (key && !formatMap[key]) {
formatMap[key] = new Format();
}
}
formats.forEach(addToMap);
this.formatMap = formatMap;
}
FormatProvider.prototype.getFormat = function (key) {
var format = this.formatMap[key];
if (!format) {
throw new Error("FormatProvider: No format found for " + key);
}
return format;
};
return FormatProvider;
});

View File

@@ -0,0 +1,63 @@
/*****************************************************************************
* 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([
'moment'
], function (
moment
) {
"use strict";
var DATE_FORMAT = "YYYY-MM-DD HH:mm:ss",
DATE_FORMATS = [
DATE_FORMAT,
"YYYY-MM-DD HH:mm",
"YYYY-MM-DD"
];
/**
* Formatter for UTC timestamps. Interprets numeric values as
* milliseconds since the start of 1970.
*
* @implements {Format}
* @constructor
* @memberof platform/commonUI/formats
*/
function UTCTimeFormat() {
}
UTCTimeFormat.prototype.format = function (value) {
return moment.utc(value).format(DATE_FORMAT);
};
UTCTimeFormat.prototype.parse = function (text) {
return moment.utc(text, DATE_FORMATS).valueOf();
};
UTCTimeFormat.prototype.validate = function (text) {
return moment.utc(text, DATE_FORMATS).isValid();
};
return UTCTimeFormat;
});

View File

@@ -0,0 +1,68 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
define(
['../src/FormatProvider'],
function (FormatProvider) {
'use strict';
var KEYS = [ 'a', 'b', 'c' ];
describe("The FormatProvider", function () {
var mockFormats,
mockLog,
mockFormatInstances,
provider;
beforeEach(function () {
mockFormatInstances = KEYS.map(function (k) {
return jasmine.createSpyObj(
'format-' + k,
[ 'parse', 'validate', 'format' ]
);
});
// Return constructors
mockFormats = KEYS.map(function (k, i) {
function MockFormat() { return mockFormatInstances[i]; }
MockFormat.key = k;
return MockFormat;
});
provider = new FormatProvider(mockFormats);
});
it("looks up formats by key", function () {
KEYS.forEach(function (k, i) {
expect(provider.getFormat(k))
.toEqual(mockFormatInstances[i]);
});
});
it("throws an error about unknown formats", function () {
expect(function () {
provider.getFormat('some-unknown-format');
}).toThrow();
});
});
}
);

View File

@@ -0,0 +1,56 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
define(
['../src/UTCTimeFormat', 'moment'],
function (UTCTimeFormat, moment) {
'use strict';
describe("The UTCTimeFormat", function () {
var format;
beforeEach(function () {
format = new UTCTimeFormat();
});
it("formats UTC timestamps", function () {
var timestamp = 12345670000,
formatted = format.format(timestamp);
expect(formatted).toEqual(jasmine.any(String));
expect(moment.utc(formatted).valueOf()).toEqual(timestamp);
});
it("validates time inputs", function () {
expect(format.validate("1977-05-25 11:21:22")).toBe(true);
expect(format.validate("garbage text")).toBe(false);
});
it("parses valid input", function () {
var text = "1977-05-25 11:21:22",
parsed = format.parse(text);
expect(parsed).toEqual(jasmine.any(Number));
expect(parsed).toEqual(moment.utc(text).valueOf());
});
});
}
);

View File

@@ -0,0 +1,4 @@
[
"FormatProvider",
"UTCTimeFormat"
]

View File

@@ -18,7 +18,11 @@
"runs": [
{
"implementation": "StyleSheetLoader.js",
"depends": [ "stylesheets[]", "$document" ]
"depends": [ "stylesheets[]", "$document", "THEME" ]
},
{
"implementation": "UnsupportedBrowserWarning.js",
"depends": [ "notificationService", "agentService" ]
}
],
"stylesheets": [
@@ -61,13 +65,18 @@
{
"key": "TimeRangeController",
"implementation": "controllers/TimeRangeController.js",
"depends": [ "$scope", "now" ]
"depends": [ "$scope", "formatService", "DEFAULT_TIME_FORMAT", "now" ]
},
{
"key": "DateTimePickerController",
"implementation": "controllers/DateTimePickerController.js",
"depends": [ "$scope", "now" ]
},
{
"key": "DateTimeFieldController",
"implementation": "controllers/DateTimeFieldController.js",
"depends": [ "$scope", "formatService", "DEFAULT_TIME_FORMAT" ]
},
{
"key": "TreeNodeController",
"implementation": "controllers/TreeNodeController.js",
@@ -107,15 +116,16 @@
"implementation": "controllers/GetterSetterController.js",
"depends": [ "$scope" ]
},
{
"key": "SplitPaneController",
"implementation": "controllers/SplitPaneController.js"
},
{
"key": "SelectorController",
"implementation": "controllers/SelectorController.js",
"depends": [ "objectService", "$scope" ]
},
{
"key": "ObjectInspectorController",
"implementation": "controllers/ObjectInspectorController.js",
"depends": [ "$scope", "objectService" ]
},
{
"key": "BannerController",
"implementation": "controllers/BannerController.js",
@@ -184,6 +194,11 @@
{
"key": "MCT_SCROLL_Y_ATTRIBUTE",
"value": "mctScrollY"
},
{
"key": "THEME",
"value": "unspecified",
"priority": "fallback"
}
],
"containers": [
@@ -210,10 +225,6 @@
"templateUrl": "templates/subtree.html",
"uses": [ "composition" ]
},
{
"key": "test",
"templateUrl": "templates/test.html"
},
{
"key": "tree-node",
"templateUrl": "templates/tree-node.html",
@@ -245,6 +256,10 @@
"key": "switcher",
"templateUrl": "templates/controls/switcher.html",
"uses": [ "view" ]
},
{
"key": "object-inspector",
"templateUrl": "templates/object-inspector.html"
}
],
"controls": [
@@ -255,6 +270,10 @@
{
"key": "datetime-picker",
"templateUrl": "templates/controls/datetime-picker.html"
},
{
"key": "datetime-field",
"templateUrl": "templates/controls/datetime-field.html"
}
],
"licenses": [

View File

@@ -1,19 +1,67 @@
{
"metadata": {
"name": "WTD Symbols v2.3",
"lastOpened": 1444267493342,
"created": 1444266013303
"name": "WTD Symbols",
"lastOpened": 1446670352108,
"created": 1446670349721
},
"iconSets": [
{
"selection": [
{
"order": 116,
"id": 93,
"prevSize": 32,
"code": 58902,
"name": "icon-eye-open-no-gleam",
"tempChar": ""
},
{
"order": 115,
"id": 92,
"prevSize": 32,
"code": 58901,
"name": "icon-eye-open",
"tempChar": ""
},
{
"order": 110,
"id": 91,
"prevSize": 32,
"code": 58899,
"name": "icon-collapse-pane-left",
"tempChar": ""
},
{
"order": 111,
"id": 90,
"prevSize": 32,
"code": 58900,
"name": "icon-collapse-pane-right",
"tempChar": ""
},
{
"order": 109,
"id": 89,
"prevSize": 32,
"code": 58898,
"name": "icon-save",
"tempChar": ""
},
{
"order": 108,
"id": 88,
"prevSize": 32,
"code": 58897,
"name": "icon-dataset",
"tempChar": ""
},
{
"order": 90,
"id": 87,
"prevSize": 32,
"code": 58896,
"name": "icon-bell",
"tempChar": ""
"tempChar": ""
},
{
"order": 91,
@@ -21,7 +69,7 @@
"prevSize": 32,
"code": 58889,
"name": "icon-hourglass",
"tempChar": ""
"tempChar": ""
},
{
"order": 92,
@@ -34,7 +82,7 @@
58890
],
"name": "icon-info-v15",
"tempChar": ""
"tempChar": ""
},
{
"order": 93,
@@ -42,7 +90,7 @@
"prevSize": 32,
"code": 58887,
"name": "icon-x-in-circle",
"tempChar": ""
"tempChar": ""
},
{
"order": 94,
@@ -50,7 +98,7 @@
"prevSize": 32,
"code": 58881,
"name": "icon-datatable",
"tempChar": ""
"tempChar": ""
},
{
"order": 95,
@@ -58,7 +106,7 @@
"prevSize": 32,
"code": 58882,
"name": "icon-tabular-scrolling",
"tempChar": ""
"tempChar": ""
},
{
"order": 96,
@@ -66,7 +114,7 @@
"prevSize": 32,
"code": 58884,
"name": "icon-tabular",
"tempChar": ""
"tempChar": ""
},
{
"order": 97,
@@ -74,7 +122,7 @@
"prevSize": 32,
"code": 58885,
"name": "icon-calendar",
"tempChar": ""
"tempChar": ""
},
{
"order": 98,
@@ -82,7 +130,7 @@
"prevSize": 32,
"code": 58886,
"name": "icon-paint-bucket",
"tempChar": ""
"tempChar": ""
},
{
"order": 99,
@@ -90,7 +138,7 @@
"prevSize": 32,
"code": 123,
"name": "icon-pointer-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 100,
@@ -98,7 +146,7 @@
"prevSize": 32,
"code": 125,
"name": "icon-pointer-right",
"tempChar": ""
"tempChar": ""
},
{
"order": 101,
@@ -106,7 +154,7 @@
"prevSize": 32,
"code": 80,
"name": "icon-person",
"tempChar": ""
"tempChar": ""
},
{
"order": 102,
@@ -114,7 +162,7 @@
"prevSize": 32,
"code": 232,
"name": "icon-chain-links",
"tempChar": ""
"tempChar": ""
},
{
"order": 103,
@@ -122,7 +170,7 @@
"prevSize": 32,
"code": 115,
"name": "icon-database-in-brackets",
"tempChar": ""
"tempChar": ""
},
{
"order": 104,
@@ -130,7 +178,7 @@
"prevSize": 32,
"code": 114,
"name": "icon-refresh",
"tempChar": ""
"tempChar": ""
},
{
"order": 105,
@@ -138,7 +186,7 @@
"prevSize": 32,
"code": 108,
"name": "icon-lock",
"tempChar": ""
"tempChar": ""
},
{
"order": 106,
@@ -146,7 +194,7 @@
"prevSize": 32,
"code": 51,
"name": "icon-box-with-dashed-lines",
"tempChar": ""
"tempChar": ""
},
{
"order": 10,
@@ -154,7 +202,7 @@
"prevSize": 32,
"code": 58880,
"name": "icon-box-with-arrow-cursor",
"tempChar": ""
"tempChar": ""
},
{
"order": 11,
@@ -162,7 +210,7 @@
"prevSize": 32,
"code": 65,
"name": "icon-activity-mode",
"tempChar": ""
"tempChar": ""
},
{
"order": 12,
@@ -170,7 +218,7 @@
"prevSize": 32,
"code": 97,
"name": "icon-activity",
"tempChar": ""
"tempChar": ""
},
{
"order": 87,
@@ -178,7 +226,7 @@
"prevSize": 32,
"code": 33,
"name": "icon-alert-rect",
"tempChar": ""
"tempChar": ""
},
{
"order": 14,
@@ -186,7 +234,7 @@
"prevSize": 32,
"code": 58883,
"name": "icon-alert-triangle",
"tempChar": ""
"tempChar": ""
},
{
"order": 15,
@@ -194,7 +242,7 @@
"prevSize": 32,
"code": 238,
"name": "icon-arrow-double-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 16,
@@ -202,7 +250,7 @@
"prevSize": 32,
"code": 235,
"name": "icon-arrow-double-up",
"tempChar": ""
"tempChar": ""
},
{
"order": 2,
@@ -210,7 +258,7 @@
"prevSize": 32,
"code": 118,
"name": "icon-arrow-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 19,
@@ -218,7 +266,7 @@
"prevSize": 32,
"code": 60,
"name": "icon-arrow-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 20,
@@ -226,7 +274,7 @@
"prevSize": 32,
"code": 62,
"name": "icon-arrow-right",
"tempChar": ""
"tempChar": ""
},
{
"order": 21,
@@ -234,7 +282,7 @@
"prevSize": 32,
"code": 236,
"name": "icon-arrow-tall-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 22,
@@ -242,7 +290,7 @@
"prevSize": 32,
"code": 237,
"name": "icon-arrow-tall-up",
"tempChar": ""
"tempChar": ""
},
{
"order": 23,
@@ -250,7 +298,7 @@
"prevSize": 32,
"code": 94,
"name": "icon-arrow-up",
"tempChar": ""
"tempChar": ""
},
{
"order": 24,
@@ -258,7 +306,7 @@
"prevSize": 32,
"code": 73,
"name": "icon-arrows-out",
"tempChar": ""
"tempChar": ""
},
{
"order": 25,
@@ -266,7 +314,7 @@
"prevSize": 32,
"code": 58893,
"name": "icon-arrows-right-left",
"tempChar": ""
"tempChar": ""
},
{
"order": 33,
@@ -274,7 +322,7 @@
"prevSize": 32,
"code": 53,
"name": "icon-arrows-up-down",
"tempChar": ""
"tempChar": ""
},
{
"order": 26,
@@ -282,7 +330,7 @@
"prevSize": 32,
"code": 42,
"name": "icon-asterisk",
"tempChar": ""
"tempChar": ""
},
{
"order": 27,
@@ -290,7 +338,7 @@
"prevSize": 32,
"code": 72,
"name": "icon-autoflow-tabular",
"tempChar": ""
"tempChar": ""
},
{
"order": 28,
@@ -298,7 +346,7 @@
"prevSize": 32,
"code": 224,
"name": "icon-box",
"tempChar": ""
"tempChar": ""
},
{
"order": 29,
@@ -306,7 +354,7 @@
"prevSize": 32,
"code": 50,
"name": "icon-check",
"tempChar": ""
"tempChar": ""
},
{
"order": 30,
@@ -314,7 +362,7 @@
"prevSize": 32,
"code": 67,
"name": "icon-clock",
"tempChar": ""
"tempChar": ""
},
{
"order": 31,
@@ -322,7 +370,7 @@
"prevSize": 32,
"code": 46,
"name": "icon-connectivity",
"tempChar": ""
"tempChar": ""
},
{
"order": 32,
@@ -330,7 +378,7 @@
"prevSize": 32,
"code": 100,
"name": "icon-database-query",
"tempChar": ""
"tempChar": ""
},
{
"order": 17,
@@ -338,7 +386,7 @@
"prevSize": 32,
"code": 68,
"name": "icon-database",
"tempChar": ""
"tempChar": ""
},
{
"order": 35,
@@ -346,7 +394,7 @@
"prevSize": 32,
"code": 81,
"name": "icon-dictionary",
"tempChar": ""
"tempChar": ""
},
{
"order": 36,
@@ -354,7 +402,7 @@
"prevSize": 32,
"code": 242,
"name": "icon-duplicate",
"tempChar": ""
"tempChar": ""
},
{
"order": 37,
@@ -362,7 +410,7 @@
"prevSize": 32,
"code": 102,
"name": "icon-folder-new",
"tempChar": ""
"tempChar": ""
},
{
"order": 38,
@@ -370,7 +418,7 @@
"prevSize": 32,
"code": 70,
"name": "icon-folder",
"tempChar": ""
"tempChar": ""
},
{
"order": 39,
@@ -378,7 +426,7 @@
"prevSize": 32,
"code": 95,
"name": "icon-fullscreen-collapse",
"tempChar": ""
"tempChar": ""
},
{
"order": 40,
@@ -386,7 +434,7 @@
"prevSize": 32,
"code": 122,
"name": "icon-fullscreen-expand",
"tempChar": ""
"tempChar": ""
},
{
"order": 41,
@@ -394,7 +442,7 @@
"prevSize": 32,
"code": 71,
"name": "icon-gear",
"tempChar": ""
"tempChar": ""
},
{
"order": 49,
@@ -402,7 +450,7 @@
"prevSize": 32,
"code": 227,
"name": "icon-image",
"tempChar": ""
"tempChar": ""
},
{
"order": 42,
@@ -410,7 +458,7 @@
"prevSize": 32,
"code": 225,
"name": "icon-layers",
"tempChar": ""
"tempChar": ""
},
{
"order": 43,
@@ -418,7 +466,7 @@
"prevSize": 32,
"code": 76,
"name": "icon-layout",
"tempChar": ""
"tempChar": ""
},
{
"order": 44,
@@ -426,7 +474,7 @@
"prevSize": 32,
"code": 226,
"name": "icon-line-horz",
"tempChar": ""
"tempChar": ""
},
{
"order": 75,
@@ -434,7 +482,7 @@
"prevSize": 32,
"code": 244,
"name": "icon-link",
"tempChar": ""
"tempChar": ""
},
{
"order": 46,
@@ -442,7 +490,7 @@
"prevSize": 32,
"code": 88,
"name": "icon-magnify-in",
"tempChar": ""
"tempChar": ""
},
{
"order": 47,
@@ -450,7 +498,7 @@
"prevSize": 32,
"code": 89,
"name": "icon-magnify-out",
"tempChar": ""
"tempChar": ""
},
{
"order": 48,
@@ -458,7 +506,7 @@
"prevSize": 32,
"code": 77,
"name": "icon-magnify",
"tempChar": ""
"tempChar": ""
},
{
"order": 34,
@@ -466,7 +514,7 @@
"prevSize": 32,
"code": 109,
"name": "icon-menu",
"tempChar": ""
"tempChar": ""
},
{
"order": 50,
@@ -474,7 +522,7 @@
"prevSize": 32,
"code": 243,
"name": "icon-move",
"tempChar": ""
"tempChar": ""
},
{
"order": 51,
@@ -482,7 +530,7 @@
"prevSize": 32,
"code": 121,
"name": "icon-new-window",
"tempChar": ""
"tempChar": ""
},
{
"order": 52,
@@ -490,7 +538,7 @@
"prevSize": 32,
"code": 111,
"name": "icon-object",
"tempChar": ""
"tempChar": ""
},
{
"order": 73,
@@ -498,7 +546,7 @@
"prevSize": 32,
"code": 63,
"name": "icon-object-unknown",
"tempChar": ""
"tempChar": ""
},
{
"order": 53,
@@ -506,7 +554,7 @@
"prevSize": 32,
"code": 86,
"name": "icon-packet",
"tempChar": ""
"tempChar": ""
},
{
"order": 54,
@@ -514,7 +562,7 @@
"prevSize": 32,
"code": 234,
"name": "icon-page",
"tempChar": ""
"tempChar": ""
},
{
"order": 55,
@@ -522,7 +570,7 @@
"prevSize": 32,
"code": 241,
"name": "icon-pause",
"tempChar": ""
"tempChar": ""
},
{
"order": 56,
@@ -530,7 +578,7 @@
"prevSize": 32,
"code": 112,
"name": "icon-pencil",
"tempChar": ""
"tempChar": ""
},
{
"order": 65,
@@ -538,7 +586,7 @@
"prevSize": 32,
"code": 79,
"name": "icon-people",
"tempChar": ""
"tempChar": ""
},
{
"order": 57,
@@ -546,7 +594,7 @@
"prevSize": 32,
"code": 239,
"name": "icon-play",
"tempChar": ""
"tempChar": ""
},
{
"order": 58,
@@ -554,7 +602,7 @@
"prevSize": 32,
"code": 233,
"name": "icon-plot-resource",
"tempChar": ""
"tempChar": ""
},
{
"order": 59,
@@ -562,7 +610,7 @@
"prevSize": 32,
"code": 43,
"name": "icon-plus",
"tempChar": ""
"tempChar": ""
},
{
"order": 60,
@@ -570,7 +618,7 @@
"prevSize": 32,
"code": 45,
"name": "icon-minus",
"tempChar": ""
"tempChar": ""
},
{
"order": 61,
@@ -578,7 +626,7 @@
"prevSize": 32,
"code": 54,
"name": "icon-sine",
"tempChar": ""
"tempChar": ""
},
{
"order": 62,
@@ -586,7 +634,7 @@
"prevSize": 32,
"code": 228,
"name": "icon-T",
"tempChar": ""
"tempChar": ""
},
{
"order": 63,
@@ -594,7 +642,7 @@
"prevSize": 32,
"code": 116,
"name": "icon-telemetry-panel",
"tempChar": ""
"tempChar": ""
},
{
"order": 64,
@@ -602,7 +650,7 @@
"prevSize": 32,
"code": 84,
"name": "icon-telemetry",
"tempChar": ""
"tempChar": ""
},
{
"order": 18,
@@ -610,7 +658,7 @@
"prevSize": 32,
"code": 246,
"name": "icon-thumbs-strip",
"tempChar": ""
"tempChar": ""
},
{
"order": 67,
@@ -618,7 +666,7 @@
"prevSize": 32,
"code": 83,
"name": "icon-timeline",
"tempChar": ""
"tempChar": ""
},
{
"order": 68,
@@ -626,7 +674,7 @@
"prevSize": 32,
"code": 245,
"name": "icon-timer",
"tempChar": ""
"tempChar": ""
},
{
"order": 69,
@@ -634,7 +682,7 @@
"prevSize": 32,
"code": 90,
"name": "icon-trash",
"tempChar": ""
"tempChar": ""
},
{
"order": 70,
@@ -642,7 +690,7 @@
"prevSize": 32,
"code": 229,
"name": "icon-two-parts-both",
"tempChar": ""
"tempChar": ""
},
{
"order": 71,
@@ -650,7 +698,7 @@
"prevSize": 32,
"code": 231,
"name": "icon-two-parts-one-only",
"tempChar": ""
"tempChar": ""
},
{
"order": 72,
@@ -658,7 +706,7 @@
"prevSize": 32,
"code": 120,
"name": "icon-x-heavy",
"tempChar": ""
"tempChar": ""
},
{
"order": 66,
@@ -666,7 +714,7 @@
"prevSize": 32,
"code": 58946,
"name": "icon-x",
"tempChar": ""
"tempChar": ""
}
],
"id": 2,
@@ -681,6 +729,152 @@
"height": 1024,
"prevSize": 32,
"icons": [
{
"id": 93,
"paths": [
"M512 64c-261 0-480.6 195.4-512 448 31.4 252.6 251 448 512 448s480.6-195.4 512-448c-31.4-252.6-251-448-512-448zM768.2 734.6c-71.4 62.8-162.8 97.4-257.6 97.4s-186.2-34.6-257.6-97.4c-66.6-58.6-110.6-137.2-125-222.6 0 0 0-0.2 0-0.2 76.8-154 220.8-257.6 384-257.6s307.2 103.8 384 257.6c0 0 0 0.2 0 0.2-14.4 85.4-61.2 164-127.8 222.6z",
"M512 288c-123.8 0-224 100.2-224 224s100.2 224 224 224 224-100.2 224-224-100.2-224-224-224zM576 544c-53 0-96-43-96-96s43-96 96-96 96 43 96 96c0 53-43 96-96 96z"
],
"attrs": [
{
"fill": "rgb(6, 161, 75)"
},
{
"fill": "rgb(6, 161, 75)"
}
],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-eye-open-no-gleam"
],
"colorPermutations": {
"125525525516161751": [
1,
1
]
}
},
{
"id": 92,
"paths": [
"M512 64c-261 0-480.6 195.4-512 448 31.4 252.6 251 448 512 448s480.6-195.4 512-448c-31.4-252.6-251-448-512-448zM768.2 734.6c-71.4 62.8-162.8 97.4-257.6 97.4s-186.2-34.6-257.6-97.4c-66.6-58.6-110.6-137.2-125-222.6 0 0 0-0.2 0-0.2 76.8-154 220.8-257.6 384-257.6s307.2 103.8 384 257.6c0 0 0 0.2 0 0.2-14.4 85.4-61.2 164-127.8 222.6z",
"M512 288c-123.8 0-224 100.2-224 224s100.2 224 224 224 224-100.2 224-224-100.2-224-224-224z"
],
"attrs": [
{
"fill": "rgb(6, 161, 75)"
},
{
"fill": "rgb(6, 161, 75)"
}
],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-crosshair"
],
"colorPermutations": {
"125525525516161751": [
1,
1
]
}
},
{
"id": 91,
"paths": [
"M256 0h-256v1024h256c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192z",
"M512 320l512 320v-640z"
],
"attrs": [
{
"fill": "rgb(0, 0, 0)"
},
{
"fill": "rgb(0, 0, 0)"
}
],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-collapse-pane-left"
],
"colorPermutations": {
"125525525516161751": [
0,
0
]
}
},
{
"id": 90,
"paths": [
"M768 0h256v1024h-256c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192z",
"M512 320l-512 320v-640z"
],
"attrs": [
{
"fill": "rgb(0, 0, 0)"
},
{
"fill": "rgb(0, 0, 0)"
}
],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-collapse-pane-right"
],
"colorPermutations": {
"125525525516161751": [
0,
0
]
}
},
{
"id": 89,
"paths": [
"M192.2 576c-0.2 0-0.2 0 0 0l-0.2 448h640v-447.8c0 0 0 0-0.2-0.2h-639.6z",
"M978.8 210.8l-165.4-165.4c-25-25-74.2-45.4-109.4-45.4h-576c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128v-448c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v448c70.4 0 128-57.6 128-128v-576c0-35.2-20.4-84.4-45.2-109.2zM704 256c0 35.2-28.8 64-64 64h-448c-35.2 0-64-28.8-64-64v-192h320v192h128v-192h128v192z"
],
"attrs": [
{
"fill": "rgb(0, 0, 0)"
},
{
"fill": "rgb(0, 0, 0)"
}
],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-save-v2"
],
"colorPermutations": {
"125525525516161751": [
0,
0
]
}
},
{
"id": 88,
"paths": [
"M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z",
"M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128zM320 896h-128v-320h128v320zM576 896h-128v-320h128v320zM832 896h-128v-320h128v320z"
],
"attrs": [],
"isMulticolor": false,
"grid": 0,
"tags": [
"icon-dataset"
],
"colorPermutations": {
"125525525516161751": []
}
},
{
"id": 87,
"paths": [

View File

@@ -88,5 +88,11 @@
<glyph unicode="&#xe609;" glyph-name="icon-hourglass" d="M1024 960h-1024c0-282.8 229.2-512 512-512s512 229.2 512 512zM512 576c-102.6 0-199 40-271.6 112.4-41.2 41.2-72 90.2-90.8 143.6h724.6c-18.8-53.4-49.6-102.4-90.8-143.6-72.4-72.4-168.8-112.4-271.4-112.4zM512 448c-282.8 0-512-229.2-512-512h1024c0 282.8-229.2 512-512 512z" />
<glyph unicode="&#xe60d;" glyph-name="icon-arrows-right-left" d="M1024 448l-448-512v1024zM448 960l-448-512 448-512z" />
<glyph unicode="&#xe610;" glyph-name="icon-bell" d="M512-64c106 0 192 86 192 192h-384c0-106 86-192 192-192zM896 512v64c0 212-172 384-384 384s-384-172-384-384v-64c0-70.6-57.4-128-128-128v-128h1024v128c-70.6 0-128 57.4-128 128z" />
<glyph unicode="&#xe611;" glyph-name="icon-dataset" d="M896 768h-320c-16.4 16.4-96.8 96.8-109.2 109.2l-37.4 37.4c-25 25-74.2 45.4-109.4 45.4h-256c-35.2 0-64-28.8-64-64v-384c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v128c0 70.4-57.6 128-128 128zM896 512h-768c-70.4 0-128-57.6-128-128v-320c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v320c0 70.4-57.6 128-128 128zM320 64h-128v320h128v-320zM576 64h-128v320h128v-320zM832 64h-128v320h128v-320z" />
<glyph unicode="&#xe612;" glyph-name="icon-save" d="M192.2 384c-0.2 0-0.2 0 0 0l-0.2-448h640v447.8c0 0 0 0-0.2 0.2h-639.6zM978.8 749.2l-165.4 165.4c-25 25-74.2 45.4-109.4 45.4h-576c-70.4 0-128-57.6-128-128v-768c0-70.4 57.6-128 128-128v448c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64v-448c70.4 0 128 57.6 128 128v576c0 35.2-20.4 84.4-45.2 109.2zM704 704c0-35.2-28.8-64-64-64h-448c-35.2 0-64 28.8-64 64v192h320v-192h128v192h128v-192z" />
<glyph unicode="&#xe613;" glyph-name="icon-collapse-pane-left" d="M256 960h-256v-1024h256c105.6 0 192 86.4 192 192v640c0 105.6-86.4 192-192 192zM512 640l512-320v640z" />
<glyph unicode="&#xe614;" glyph-name="icon-collapse-pane-right" d="M768 960h256v-1024h-256c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192zM512 640l-512-320v640z" />
<glyph unicode="&#xe615;" glyph-name="icon-eye-open" d="M512 896c-261 0-480.6-195.4-512-448 31.4-252.6 251-448 512-448s480.6 195.4 512 448c-31.4 252.6-251 448-512 448zM768.2 225.4c-71.4-62.8-162.8-97.4-257.6-97.4s-186.2 34.6-257.6 97.4c-66.6 58.6-110.6 137.2-125 222.6 0 0 0 0.2 0 0.2 76.8 154 220.8 257.6 384 257.6s307.2-103.8 384-257.6c0 0 0-0.2 0-0.2-14.4-85.4-61.2-164-127.8-222.6zM512 672c-123.8 0-224-100.2-224-224s100.2-224 224-224 224 100.2 224 224-100.2 224-224 224z" />
<glyph unicode="&#xe616;" glyph-name="icon-eye-open-no-gleam" d="M512 896c-261 0-480.6-195.4-512-448 31.4-252.6 251-448 512-448s480.6 195.4 512 448c-31.4 252.6-251 448-512 448zM768.2 225.4c-71.4-62.8-162.8-97.4-257.6-97.4s-186.2 34.6-257.6 97.4c-66.6 58.6-110.6 137.2-125 222.6 0 0 0 0.2 0 0.2 76.8 154 220.8 257.6 384 257.6s307.2-103.8 384-257.6c0 0 0-0.2 0-0.2-14.4-85.4-61.2-164-127.8-222.6zM512 672c-123.8 0-224-100.2-224-224s100.2-224 224-224 224 100.2 224 224-100.2 224-224 224zM576 416c-53 0-96 43-96 96s43 96 96 96 96-43 96-96c0-53-43-96-96-96z" />
<glyph unicode="&#xe642;" glyph-name="icon-x" d="M384 448l-365.332-365.332c-24.89-24.89-24.89-65.62 0-90.51l37.49-37.49c24.89-24.89 65.62-24.89 90.51 0 0 0 365.332 365.332 365.332 365.332l365.332-365.332c24.89-24.89 65.62-24.89 90.51 0l37.49 37.49c24.89 24.89 24.89 65.62 0 90.51l-365.332 365.332c0 0 365.332 365.332 365.332 365.332 24.89 24.89 24.89 65.62 0 90.51l-37.49 37.49c-24.89 24.89-65.62 24.89-90.51 0 0 0-365.332-365.332-365.332-365.332l-365.332 365.332c-24.89 24.89-65.62 24.89-90.51 0l-37.49-37.49c-24.89-24.89-24.89-65.62 0-90.51 0 0 365.332-365.332 365.332-365.332z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,147 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/********************************************* COLUMN LAYOUTS STYLES */
@mixin cols($totalCols, $span) {
$cw: 100% / $totalCols;
min-width: (500px / $totalCols) * $span;
@if ($totalCols != $span) {
width: ($cw * $span) - $ueColMargin;
} @else {
width: $cw;
}
}
.cols {
@include clearfix;
.col {
@include box-sizing(border-box);
@include clearfix;
float: left;
margin-left: $ueColMargin;
padding-left: $interiorMargin;
position: relative;
&:first-child {
margin-left: 0;
padding-left: 0;
}
}
&.cols-2 {
$nc: 2;
.col-1 {
@include cols($nc, 1);
}
}
&.cols-2-ff {
// 2 columns, first column is fixed, second is fluid
.col-100px {
width: 100px;
}
}
&.cols-6 {
$nc: 6;
.col-1 {
@include cols($nc, 1);
}
}
&.cols-16 {
$nc: 16;
.col-1 {
@include cols($nc, 1);
}
.col-2 {
@include cols($nc, 2);
}
.col-7 {
@include cols($nc, 7);
}
}
&.cols-32 {
$nc: 32;
.col-2 {
@include cols($nc, 2);
}
.col-15 {
@include cols($nc, 15);
}
}
.l-row {
@include clearfix;
padding: $interiorMargin 0;
}
}
/********************************************* FLEX STYLES */
.l-flex-row,
.l-flex-col {
@include display-flex;
@include flex-wrap(nowrap);
.flex-elem {
min-height: 0; // Needed to allow element to shrink within parent
position: relative;
&:not(.grows) {
@include flex(0 0 auto);
&.flex-can-shrink {
@include flex(0 1 auto);
}
}
&.grows {
@include flex(1 1 auto);
}
}
.flex-container {
// Apply to wrapping elements, mct-includes, etc.
@include display-flex;
@include flex-wrap(nowrap);
@include flex(1 1 auto);
min-height:0;
}
}
.l-flex-row {
@include flex-direction(row);
&.flex-elem { @include flex(1 1 auto); }
.flex-elem {
height: inherit;
line-height: inherit;
min-width: 0;
}
.flex-container { @include flex-direction(row); }
}
.l-flex-col {
@include flex-direction(column);
.flex-elem {
min-height: 0;
&.holder:not(:last-child) { margin-bottom: $interiorMarginLg; }
}
.flex-container { @include flex-direction(column); }
}
.flex-fixed {
@include flex(0 0 auto);
}
.flex-justify-end {
@include justify-content(flex-end);
}

View File

@@ -35,24 +35,23 @@
}
}
.l-autoflow-header {
bottom: auto;
height: $headerH;
line-height: $headerH;
min-width: $colW;
span {
vertical-align: middle;
}
min-width: $colW;
.t-last-update {
overflow: hidden;
}
.s-btn.change-column-width {
@include trans-prop-nice-fade(500ms);
opacity: 0;
}
.l-filter {
margin-left: $interiorMargin;
display: block;
margin-right: $interiorMargin;
input.t-filter-input {
width: 100px;
width: 150px;
}
}
}
@@ -127,4 +126,12 @@
}
}
}
}
.frame {
&.child-frame.panel {
.autoflow .l-autoflow-header .l-filter {
display: none;
}
}
}

View File

@@ -35,17 +35,29 @@ $ltGamma: 20%;
$btnFontSizeToH: 0.45;
/************************** LAYOUT */
$ueTopBarH: 24px; // Change when breadcrumb is enabled
$ueTopBarH: 24px;
$ueTopBarEditH: 30px;
$ueTopBarBtnH: 35px;
$ueFooterH: 25px;
$ueColMargin: 1.5%;
$ueAppLogoW: 105px;
$ueEditToolBarH: 25px;
$ueBrowseLeftPaneW: 25%;
$ueCollapsedPaneEdgeM: 22px;
$uePaneMiniTabH: $ueTopBarH;
$uePaneMiniTabW: 9px;
$uePaneMiniTabCollapsedW: 11px;
$ueEditLeftPaneW: 75%;
$treeSearchInputBarH: 25px;
$ueTimeControlH: (33px, 20px, 20px);
// Panes
$ueBrowseLeftPaneTreeMinW: 150px;
$ueBrowseLeftPaneTreeMaxW: 35%;
$ueBrowseLeftPaneTreeW: 25%;
$ueBrowseRightPaneInspectMinW: 200px;
$ueBrowseRightPaneInspectMaxW: 35%;
$ueBrowseRightPaneInspectW: 20%;
$ueDesktopMinW: 600px;
// Overlay
$ovrTopBarH: 45px;
$ovrFooterH: 24px;
@@ -57,8 +69,9 @@ $ueBrowseGridItemBottomBarH: 30px;
$itemPadLR: 5px;
// Tree
$treeVCW: 10px;
$treeTypeIconH: 16px;
$treeTypeIconW: 20px;
$treeTypeIconH: 1.4em; // was 16px
$treeTypeIconHPx: 16px;
$treeTypeIconW: 18px;
$treeContextTriggerW: 20px;
// Tabular
$tabularHeaderH: 22px; //18px

View File

@@ -31,10 +31,6 @@ a.disabled {
border-bottom: 1px solid rgba(#fff, 0.3);
}
.outline {
@include boxOutline();
}
.test-stripes {
@include bgDiagonalStripes();
}
@@ -51,14 +47,11 @@ a.disabled {
@include animation-name(pulse, 0.2);
}
@include keyframes(pulse) {
0% { opacity: 0.5; }
100% { opacity: 1; }
}
@mixin pulse($dur: 500ms, $iteration: infinite) {
//@include customKeyframes(pulse, 0.2);
@mixin pulse($dur: 500ms, $iteration: infinite, $opacity0: 0.5, $opacity100: 1) {
@include keyframes(pulse) {
0% { opacity: $opacity0; }
100% { opacity: $opacity100; }
}
@include animation-name(pulse);
@include animation-duration($dur);
@include animation-direction(alternate);
@@ -66,6 +59,19 @@ a.disabled {
@include animation-timing-function(ease-in-out);
}
@mixin pulseBorder($c: red, $dur: 500ms, $iteration: infinite, $delay: 0s, $opacity0: 0, $opacity100: 1) {
@include keyframes(pulseBorder) {
0% { border-color: rgba($c, $opacity0); }
100% { border-color: rgba($c, $opacity100); }
}
@include animation-name(pulseBorder);
@include animation-duration($dur);
@include animation-direction(alternate);
@include animation-iteration-count($iteration);
@include animation-timing-function(ease);
@include animation-delay($delay);
}
.pulse {
@include pulse(750ms);
}

View File

@@ -34,10 +34,6 @@
font-style: normal;
}
.ui-symbol {
font-family: 'symbolsfont';
}
/************************** HTML ENTITIES */
a {
color: $colorA;
@@ -55,7 +51,7 @@ body, html {
color: $colorBodyFg;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 100%;
//font-weight: 500;
font-weight: 200;
height: 100%;
width: 100%;
overflow: hidden;
@@ -125,7 +121,12 @@ mct-container {
text-align: center;
}
.scrolling {
.ellipsis {
@include ellipsize();
}
.scrolling,
.scroll {
overflow: auto;
}
@@ -146,6 +147,16 @@ mct-container {
display: none !important;
}
.off {
visibility: hidden;
opacity: 0;
height: 0;
margin: 0;
padding: 0;
border: 0;
margin: 0 !important;
}
.sep {
color: rgba(#fff, 0.2);
}

View File

@@ -29,11 +29,14 @@
}
.ui-symbol {
font-family: 'symbolsfont';
&.type-icon {
color: $colorObjHdrIc;
}
&.icon {
color: $colorKey;
//position: relative;
font-size: inherit;
&.alert {
color: $colorAlert;
&:hover {
@@ -69,18 +72,35 @@
position: absolute;
}
//.tree-item .type-icon {
// font-size: 16px; // 16px is crisp size
//}
.l-icon-link:before {
content: "\f4";
}
.l-icon-alert {
display: none !important; // Remove this when alerts are enabled
display: none !important;
&:before {
color: $colorAlert;
content: "!";
}
}
.t-item-icon {
// Used in grid-item.html, tree-item, inspector location, more?
@extend .ui-symbol;
@extend .icon;
line-height: normal; // This is Ok for the symbolsfont
position: relative;
.t-item-icon-glyph {
position: absolute;
}
&.l-icon-link {
.t-item-icon-glyph {
&:before {
color: $colorIconLink;
content: "\f4";
height: auto; width: auto;
position: absolute;
left: 0; top: 0; right: 0; bottom: 10%;
@include transform-origin(bottom, left);
@include transform(scale(0.3));
z-index: 2;
}
}
}
}

View File

@@ -0,0 +1,164 @@
/*****************************************************************************
* 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.
*****************************************************************************/
/* Styles for the Inspector pane */
.l-inspect,
.l-inspect table tr td {
font-size: 0.75rem;
}
.l-inspect {
@extend .abs;
background: $colorInspectorBg;
color: $colorInspectorFg;
line-height: 140%;
.flex-elem.holder:not(:last-child) { margin-bottom: $interiorMargin; }
.pane-header {
color: pushBack($colorInspectorFg, 20%);
font-size: 0.8rem;
&:before {
color: pushBack($colorInspectorFg, 10%);
content:'\e615'; // e615 Crosshair symbol
display: inline;
font-family: symbolsfont;
margin-right: $interiorMargin;
vertical-align: bottom;
}
}
.split-layout {
.split-pane-component.pane {
&.bottom {
height: 30%;
min-height: 20%;
max-height: 80%;
}
}
}
ul {
@include box-sizing(border-box);
padding-right: $interiorMargin;
}
ul li,
em {
display: block;
position: relative;
}
ul li {
margin-bottom: $interiorMarginLg;
}
em {
@include border-radius($basicCr);
background-color: $colorInspectorSectionHeaderBg;
color: $colorInspectorSectionHeaderFg;
margin-bottom: $interiorMargin;
padding: $formTBPad $formLRPad;
text-transform: uppercase;
}
.inspector-properties {
&:not(.first) {
border-top: 1px solid $colorInspectorSectionHeaderBg;
}
padding: $interiorMarginSm 0;
.label {
color: $colorInspectorPropName;
text-transform: uppercase;
}
.value {
color: $colorInspectorPropVal;
word-break: break-all;
}
}
.inspector-location {
.location-item {
$h: 1.2em;
@include box-sizing(border-box);
cursor: pointer;
display: inline-block;
line-height: $h;
position: relative;
padding: 2px 4px;
.t-object-label {
.t-item-icon {
height: $h;
width: 0.7rem;
}
}
&:hover {
background: $colorItemTreeHoverBg;
color: $colorItemTreeHoverFg;
.icon {
color: $colorItemTreeIconHover;
}
}
}
&:not(.last) .t-object-label .t-title-label:after {
color: pushBack($colorInspectorFg, 15%);
content: '\3e';
display: inline-block;
font-family: symbolsfont;
font-size: 8px;
font-style: normal !important;
line-height: inherit;
margin-left: $interiorMarginSm;
width: 4px;
}
}
.holder-elements {
.current-elements {
position: relative;
.tree-item {
.t-object-label {
// Elements pool is a flat list, so don't indent items.
font-size: 0.75rem;
left: 0;
}
}
}
}
}
.l-inspect {
.splitter-inspect-panel,
.split-pane-component.pane.bottom {
@include trans-prop-nice(opacity, 250ms); // Not working as desired currently; entire inspector seems to be destroyed and recreated when switching into and out of edit mode.
opacity: 0;
pointer-events: none;
}
}
.s-status-editing .l-inspect {
.location-item { pointer-events: none; }
.splitter-inspect-panel,
.split-pane-component.pane.bottom {
opacity: 1;
pointer-events: inherit;
}
}

View File

@@ -21,6 +21,7 @@
*****************************************************************************/
@import "effects";
@import "global";
@import "archetypes";
@import "about";
@import "text";
@import "icons";
@@ -29,7 +30,7 @@
@import "helpers/bubbles";
@import "helpers/splitter";
@import "helpers/wait-spinner";
@import "properties";
@import "inspector";
/********************************* CONTROLS */
@import "controls/breadcrumb";
@@ -59,6 +60,7 @@
@import "overlay/overlay";
@import "mobile/overlay/overlay";
@import "tree/tree";
@import "object-label";
@import "mobile/tree";
@import "user-environ/frame";
@import "user-environ/top-bar";
@@ -69,7 +71,6 @@
@import "lists/tabular";
@import "plots/plots-main";
@import "iframe";
@import "hide-non-functional";
@import "views";
@import "items/item";
@import "mobile/item";

View File

@@ -41,36 +41,47 @@
width: $d;
}
@mixin trans-prop-nice($props, $t: 500ms) {
@if $t == 0 {
@mixin trans-prop-nice($props, $dur: 500ms, $delay: 0) {
// Multiple $props must be in parans like this: (left, right)
@if $dur == 0 {
@include transition-property(none);
} @else {
@include transition-property($props);
@include transition-duration($t);
@include transition-duration($dur);
@include transition-timing-function(ease-in-out);
@include transition-delay($delay);
}
}
@mixin trans-prop-nice-fade($t: 0.5s) {
@if $t == 0 {
@mixin trans-prop-nice-fade($dur: 500ms, $delay: 0) {
@if $dur == 0 {
@include transition-property(none);
} @else {
@include transition-property(visibility, opacity, background-color, border-color);
@include transition-duration($t);
@include transition-property(opacity, background-color, border-color, color);
@include transition-duration($dur);
@include transition-timing-function(ease-in-out);
@include transition-delay($delay);
}
}
@mixin trans-prop-nice-resize-h($t: 0.5s) {
@include transition-property(height, bottom, top);
@mixin trans-prop-nice-resize($t: 0.5s, $tf: ease-in-out) {
@include transition-property(height, width, top, right, bottom, left, opacity);
@include transition-duration($t);
@include transition-timing-function(ease-in-out);
@include transition-timing-function($tf);
}
@mixin trans-prop-nice-resize-w($t: 0.5s) {
@include transition-property(width, left, right);
@include transition-duration($t);
@mixin trans-prop-nice-resize-h($dur: 500ms, $delay: 0) {
@include transition-property(height, bottom, top);
@include transition-duration($dur);
@include transition-timing-function(ease-in-out);
@include transition-delay($delay);
}
@mixin trans-prop-nice-resize-w($dur: 500ms, $delay: 0) {
@include transition-property(width, left, right);
@include transition-duration($dur);
@include transition-timing-function(ease-in-out);
@include transition-delay($delay);
}
@mixin triangle-right($size, $color) {
@@ -173,31 +184,28 @@
}
@mixin controlGrippy($b, $direction: horizontal, $w: 1px, $style: dotted) {
&:before {
@include trans-prop-nice("border-color", 0.75s);
content: '';
display: block;
height: auto;
pointer-events: none;
position: absolute;
z-index: 2;
//&:before {
//@include trans-prop-nice("border-color", 25ms);
content: '';
display: block;
//height: auto;
pointer-events: none;
position: absolute;
z-index: 2;
@if $direction == "horizontal" {
border-top: $w $style darken($b, 15%);
top: 2px;
left: 5px;
right: 5px;
@if $direction == "horizontal" {
border-top: $w $style darken($b, 15%);
top: 2px;
left: 5px;
right: 5px;
height: 1px;
} @else if $direction == "vertical" {
border-left: $w $style darken($b, 15%);
left: 2px;
bottom: 5px;
top: 5px;
}
}
&:not(.disabled):hover:before {
@include trans-prop-nice("border-color", 25ms);
border-color: $colorGrippyInteriorHover;
} @else if $direction == "vertical" {
border-left: $w $style darken($b, 15%);
left: 2px;
bottom: 5px;
top: 5px;
width: 1px;
}
}
@@ -273,6 +281,12 @@
@return percentage($d);
}
@function splitterHandleInset($splitterD: 21px, $splitterHandleD: 1px) {
// Space to either side of the handle
@return ($splitterD - $splitterHandleD) * 0.5;
}
/*********************************************** CONTROLS, FORM ELEMENTS */
@mixin containerBase($bg: $colorBodyBg, $fg: $colorBodyFg) {
@@ -292,7 +306,7 @@
@include desktop {
@if $bgHov != none {
&:not(.disabled):hover {
background: $bgHov;
@include background-image($bgHov);
>.icon {
color: lighten($ic, $ltGamma);
}
@@ -301,11 +315,11 @@
}
}
@mixin input-base($bg: $colorBodyBg, $fg: $colorBodyFg) {
@mixin input-base($bg: $colorInputBg, $fg: $colorInputFg, $shdw: rgba(black, 0.6) 0 1px 3px) {
@include appearance(none);
@include border-radius($controlCr);
@include box-sizing(border-box);
@include box-shadow(inset rgba(black, 0.4) 0 1px 3px);
@include box-shadow(inset $shdw);
background: $bg;
border: none;
color: $fg;
@@ -315,7 +329,7 @@
}
}
@mixin nice-input($bg: $colorBodyBg, $fg: $colorBodyFg) {
@mixin nice-input($bg: $colorInputBg, $fg: $colorInputFg) {
@include input-base($bg, $fg);
padding: 0 $interiorMarginSm;
}
@@ -364,10 +378,7 @@
/* This doesn't work on an element inside an element with absolute positioning that has height: auto */
//position: relative;
top: 50%;
@include webkitProp(transform, translateY(-50%));
//-webkit-transform: translateY(-50%);
//-ms-transform: translateY(-50%);
//transform: translateY(-50%);
@include transform(translateY(-50%));
}
@mixin verticalCenterBlock($holderH, $itemH) {

View File

@@ -0,0 +1,69 @@
/*****************************************************************************
* 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.
*****************************************************************************/
// mct-representation surrounding an object-label key="'label'"
.rep-object-label {
@include flex-direction(row);
@include flex(1 1 auto);
height: inherit;
line-height: inherit;
min-width: 0;
}
.t-object-label {
.t-item-icon {
margin-right: $interiorMargin;
}
}
mct-representation {
&.s-status-pending {
.t-object-label {
.t-item-icon {
&:before {
$spinBW: 4px;
$spinD: 0;
@include spinner($spinBW);
content: "";
display: block;
position: absolute;
left: 50%;
top: 50%;
padding: 30%;
width: $spinD;
height: $spinD;
}
.t-item-icon-glyph {
display: none;
}
}
.t-title-label {
font-style: italic;
opacity: 0.6;
}
}
}
}
.selected mct-representation.s-status-pending .t-object-label .t-item-icon:before {
border-color: rgba($colorItemTreeSelectedFg, 0.25);
border-top-color: rgba($colorItemTreeSelectedFg, 1.0);
}

View File

@@ -22,15 +22,20 @@
$baseRatio: 1.5;
$pad: $interiorMargin * $baseRatio;
.s-btn {
@include box-sizing(border-box);
.s-btn,
.s-icon-btn {
@include user-select(none);
cursor: pointer;
text-decoration: none;
height: $btnStdH;
line-height: $btnStdH;
}
.s-btn {
@include box-sizing(border-box);
padding: 0 $pad;
font-size: 0.7rem;
vertical-align: top;
.icon {
font-size: 0.8rem;
@@ -66,6 +71,18 @@ $pad: $interiorMargin * $baseRatio;
&.pause-play {
}
&.t-save:before {
content:'\e612';
font-family: symbolsfont;
margin-right: $interiorMarginSm;
}
&.t-cancel {
.title-label { display: none; }
&:before {
content:'\78';
font-family: symbolsfont;
}
}
&.pause-play {
.icon:before {
@@ -89,6 +106,157 @@ $pad: $interiorMargin * $baseRatio;
}
}
.s-icon-btn {
@extend .ui-symbol;
// Color and styling additionally in _controls.scss
}
.mini-tab {
// Meant to be used as pane hide/show control elements in concert with mct-splitter
//@extend .ui-symbol;
@include desktop {
//@include test(green);
$iconH: $uePaneMiniTabH;
$iconW: $uePaneMiniTabW;
$iconInnerLR: 0;
$arwD: 9px;
$arwOffsetX: 0px;
$arwAnimOffsetX: 2px + $iconInnerLR;
$cBg: pullForward($colorBodyBg, 15%);
$cFg: $cBg;
@include border-radius($basicCr);
//@include boxShdw($shdwBtns);
@include box-sizing(border-box);
@include trans-prop-nice((color, background-color), 100ms);
color: $cFg;
cursor: pointer;
font-family: symbolsfont;
font-size: $arwD;
display: block;
position: absolute;
line-height: $iconH;
height: $iconH; width: $iconW;
text-align: center;
&:hover {
//background-color: $cBg;
color: $colorKey; //pullForward($cFg, $ltGamma);
}
&.collapsed {
// State when the pane this element controls has been collapsed
@include btnSubtle($colorBtnBg, $colorKey, $colorBtnFg, $colorBtnIcon);
&:before { opacity: 0; }
&:after { opacity: 1; }
&:hover {
&:before { opacity: 1; }
&:after { opacity: 0; }
}
}
&:before,
&:after {
//@include test();
@include trans-prop-nice((left, right, opacity), 250ms);
display: block;
height: 100%;
position: absolute;
}
&:before {
// Always the arrow icon
//@include test(green);
//font-size: $arwD;
width: $arwD;
}
&:after {
// Always icon; content is set in _layout.scss
width: 100%;
text-align: center;
opacity: 0;
}
&.anchor-left {
// |<
text-align: right;
&:before {
content:'\3c'; // Collapse left icon e613
right: $iconInnerLR;
}
//&:hover:before { right: $arwAnimOffsetX; }
&.collapsed {
@include border-left-radius(0);
text-align: left;
&:before {
content:'\3e';
left: $iconInnerLR;
}
&:hover:before { left: $arwAnimOffsetX; }
}
}
&.anchor-right {
// >|
text-align: left;
&:before {
content:'\3e'; // Collapse right icon e614
left: $iconInnerLR;
}
//&:hover:before { left: $arwAnimOffsetX; }
&.collapsed {
@include border-right-radius(0);
&:before {
text-align: right;
content:'\3c';
right: $iconInnerLR;
}
&:hover:before { right: $arwAnimOffsetX; }
}
}
}
}
.mini-tab-icon {
// Meant to be used as pane hide/show control elements in concert with mct-splitter
//@extend .ui-symbol;
@include desktop {
$d: $uePaneMiniTabW;
//@include trans-prop-nice(transform, 150ms);
color: pullForward($colorBodyBg, 15%);
cursor: pointer;
display: block;
font-family: symbolsfont;
font-size: $d;
position: absolute;
height: $d; width: $d;
line-height: $d;
overflow: hidden;
word-break: break-all;
&.collapsed {
$d: $uePaneMiniTabCollapsedW;
width: $d; font-size: $d;
}
&:before,
&:after {
position: absolute;
display: inherit;
}
&:before {
content: '\78'; // X icon
}
&:hover {
color: $colorKey;
//@include transform(scale(1.2));
}
}
}
.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-btn

View File

@@ -21,246 +21,232 @@
*****************************************************************************/
.accordion {
$accordionHeadH: 18px;
margin-top: $interiorMargin;
&:first-child {
margin-top: 0;
}
.accordion-head {
$op: 0.2;
@include border-radius($basicCr * 0.75);
@include box-sizing("border-box");
background: rgba($colorBodyFg, $op);
cursor: pointer;
font-size: 0.75em;
line-height: $accordionHeadH;
margin-bottom: $interiorMargin;
padding: 0 $interiorMargin;
position: absolute;
top: 0;
right: 0;
bottom: auto;
left: 0;
width: auto;
height: $accordionHeadH;
text-transform: uppercase;
&:hover {
background: rgba($colorBodyFg, $op * 2);
}
&:after {
content: "^";
display: block;
font-family: 'symbolsfont';
font-size: 0.9em;
position: absolute;
right: $interiorMargin;
text-transform: none;
top: 0;
}
&:not(.expanded):after {
content: "v";
}
}
.accordion-contents {
position: absolute;
top: $accordionHeadH + $interiorMargin;
right: 0;
bottom: 0;
left: 0;
overflow-y: auto;
overflow-x: hidden;
}
$accordionHeadH: 18px;
margin-top: $interiorMargin;
&:first-child {
margin-top: 0;
}
.accordion-head {
$op: 0.2;
@include border-radius($basicCr * 0.75);
@include box-sizing("border-box");
background: rgba($colorBodyFg, $op);
cursor: pointer;
font-size: 0.75em;
line-height: $accordionHeadH;
margin-bottom: $interiorMargin;
padding: 0 $interiorMargin;
position: absolute;
top: 0;
right: 0;
bottom: auto;
left: 0;
width: auto;
height: $accordionHeadH;
text-transform: uppercase;
&:hover {
background: rgba($colorBodyFg, $op * 2);
}
&:after {
content: "^";
display: block;
font-family: 'symbolsfont';
font-size: 0.9em;
position: absolute;
right: $interiorMargin;
text-transform: none;
top: 0;
}
&:not(.expanded):after {
content: "v";
}
}
.accordion-contents {
position: absolute;
top: $accordionHeadH + $interiorMargin;
right: 0;
bottom: 0;
left: 0;
overflow-y: auto;
overflow-x: hidden;
}
}
.l-composite-control {
vertical-align: middle;
&.l-checkbox {
.composite-control-label {
line-height: 18px;
}
}
vertical-align: middle;
&.l-checkbox {
.composite-control-label {
line-height: 18px;
}
}
}
.l-control-group {
// Buttons that have a conceptual grouping - internal space between, and a divider between groups.
// @include test();
@include box-sizing(border-box);
border-left: 1px solid $colorInteriorBorder;
display: inline-block;
padding: 0 $interiorMargin;
position: relative;
&:first-child {
border-left: none;
padding-left: 0;
}
// Buttons that have a conceptual grouping - internal space between, and a divider between groups.
// @include test();
@include box-sizing(border-box);
border-left: 1px solid $colorInteriorBorder;
display: inline-block;
padding: 0 $interiorMargin;
position: relative;
&:first-child {
border-left: none;
padding-left: 0;
}
}
.l-local-controls {
// Control shown when hovering over an object, like plots and imagery
// Default position is upper right
$p: $interiorMargin;
position: absolute;
top: $p;
right: $p;
z-index: 5;
// Control shown when hovering over an object, like plots and imagery
// Default position is upper right
$p: $interiorMargin;
position: absolute;
top: $p;
right: $p;
z-index: 5;
}
.s-local-controls {
font-size: 0.7rem;
font-size: 0.7rem;
}
label.checkbox.custom {
$bg: pullForward($colorBodyBg, 10%);
$d: $formRowCtrlsH;
cursor: pointer;
display: inline-block;
line-height: $d;
margin-right: $interiorMargin * 4;
padding-left: $d + $interiorMargin;
position: relative;
vertical-align: middle; // was top
em {
color: $colorBodyFg;
display: inline-block;
height: $d;
min-width: $d;
&:before {
@include border-radius($basicCr * .75);
background: $bg;
//border-bottom: 1px solid lighten($bg, 10%);
@include box-shadow(inset rgba(black, 0.4) 0 1px 2px);
box-sizing: border-box;
content: " ";
font-family: 'symbolsfont';
font-size: 0.8em;
display: inline-block;
margin-right: $interiorMargin;
height: $d;
width: $d;
left: 0;
top: 0;
position: absolute;
text-align: center;
}
}
&.no-text {
overflow: hidden;
margin-right: 0;
padding-left: 0;
height: $d;
width: $d;
em {
overflow: hidden;
}
}
input {
display: none;
&:checked ~ em:before {
background: $colorCheck;
color: lighten($colorCheck, 50%);
content: "2";
}
}
$bg: pullForward($colorBodyBg, 10%);
$d: $formRowCtrlsH;
cursor: pointer;
display: inline-block;
line-height: $d;
margin-right: $interiorMargin * 4;
padding-left: $d + $interiorMargin;
position: relative;
vertical-align: middle; // was top
em {
color: $colorBodyFg;
display: inline-block;
height: $d;
min-width: $d;
&:before {
@include border-radius($basicCr * .75);
background: $bg;
@include box-shadow(inset rgba(black, 0.4) 0 1px 2px);
box-sizing: border-box;
content: " ";
font-family: 'symbolsfont';
font-size: 0.8em;
display: inline-block;
margin-right: $interiorMargin;
height: $d;
width: $d;
left: 0;
top: 0;
position: absolute;
text-align: center;
}
}
&.no-text {
overflow: hidden;
margin-right: 0;
padding-left: 0;
height: $d;
width: $d;
em {
overflow: hidden;
}
}
input {
display: none;
&:checked ~ em:before {
background: $colorCheck;
color: lighten($colorCheck, 50%);
content: "2";
}
}
}
.input-labeled {
margin-left: $interiorMargin;
label {
display: inline-block;
margin-right: $interiorMarginSm;
}
&.inline {
display: inline-block;
}
&:first-child {
margin-left: 0;
}
margin-left: $interiorMargin;
label {
display: inline-block;
margin-right: $interiorMarginSm;
}
&.inline {
display: inline-block;
}
&:first-child {
margin-left: 0;
}
}
.s-menu-btn label.checkbox.custom {
margin-left: 5px;
margin-left: 5px;
}
.item .checkbox {
&.checked label {
@include box-shadow(none);
border-bottom: none;
}
&.checked label {
@include box-shadow(none);
border-bottom: none;
}
}
.context-available {
$c: $colorKey;
color: $c;
&:hover {
color: lighten($c, 10%);
}
.context-available,
.s-icon-btn {
$c: $colorKey;
color: $c;
&:hover {
color: lighten($c, 10%);
}
}
.view-switcher {
@include trans-prop-nice-fade($controlFadeMs);
@include trans-prop-nice-fade($controlFadeMs);
}
/******************************************************** OBJECT-HEADER */
.object-header {
//@include test();
font-size: 1em;
font-size: 1em;
//> .title-label,
//> .type-icon,
//> .context-available {
// //@include tmpBorder(#6666ff);
// //vertical-align: middle;
//}
> .type-icon {
color: $colorObjHdrIc;
font-size: 120%;
float: left;
margin-right: $interiorMargin;
}
> .type-icon {
color: $colorObjHdrIc;
font-size: 120%;
float: left;
margin-right: $interiorMargin;
}
.l-elem-wrapper {
mct-representation {
// Holds the context-available item
// Must have min-width to make flex work properly
// in Safari
min-width: 0.7em;
}
}
.l-elem-wrapper {
//@include test(#66f, 0.2);
@include webkitProp(justify-content, flex-start);
mct-representation {
// Holds the context-available item
// Must have min-width to make flex work properly
// in Safari
min-width: 0.7em;
}
}
.action {
margin-right: $interiorMargin;
}
.action {
margin-right: $interiorMargin;
}
.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.
}
.title-label {
//@include test(green, 0.9);
color: $colorObjHdrTxt;
@include ellipsize();
//color: pushBack($colorBodyFg, 40%);
@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.
//position: relative;
}
.context-available {
font-size: 0.7em;
@include webkitProp(flex, '0 0 1');
}
.context-available {
font-size: 0.7em;
@include webkitProp(flex, '0 0 1');
//margin-right: $interiorMargin;
}
@include desktop {
.context-available {
@include trans-prop-nice(opacity, 0.25s);
opacity: 0;
}
&:hover {
.context-available {
opacity: 1;
}
}
}
@include desktop {
.context-available {
@include trans-prop-nice(opacity, 0.25s);
opacity: 0;
}
&:hover {
.context-available {
opacity: 1;
}
}
}
}
/******************************************************** PROGRESS BAR */
@@ -280,20 +266,20 @@ label.checkbox.custom {
.l-progress-bar {
// Assume will be determinate by default
display: inline-block;
overflow: hidden;
position: relative;
display: inline-block;
overflow: hidden;
position: relative;
.progress-amt-holder {
.progress-amt-holder {
@include absPosDefault(1px);
}
.progress-amt,
.progress-amt:before,
.progress-amt:after {
@include absPosDefault();
@include absPosDefault();
display: block;
content: '';
}
}
.progress-amt {
right: auto; // Allow inline width to control }
@@ -310,11 +296,10 @@ label.checkbox.custom {
@include border-radius($basicCr);
@include boxIncised(0.3, 4px);
background: $colorProgressBarOuter;
//border:1px solid $colorProgressBarOuter;
.progress-amt {
@include border-radius($basicCr);
@include boxShdw();
@include border-radius($basicCr - 1);
.progress-amt {
@include border-radius($basicCr);
@include boxShdw();
@include border-radius($basicCr - 1);
@include trans-prop-nice(width);
&:before {
background-color: $colorProgressBarAmt;
@@ -325,7 +310,7 @@ label.checkbox.custom {
transparent 5%, rgba(#fff,0.25) 30%, transparent 100%
));
}
}
}
&:not(.indeterminate) {
.progress-amt:before {
@@ -348,187 +333,177 @@ label.checkbox.custom {
/******************************************************** SLIDERS */
.slider {
$knobH: 100%; //14px;
.slot {
// @include border-radius($basicCr * .75);
//@include sliderTrack();
width: auto;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.knob {
//@include btnSubtle();
//@include controlGrippy(rgba(black, 0.3), vertical, 1px, solid);
@include trans-prop-nice-fade(.25s);
background-color: $sliderColorKnob;
&:hover {
background-color: $sliderColorKnobHov;
}
position: absolute;
height: $knobH;
width: $sliderKnobW;
top: 0;
auto: 0;
bottom: auto;
left: auto;
}
.knob-l {
@include border-left-radius($sliderKnobW);
cursor: w-resize;
}
.knob-r {
@include border-right-radius($sliderKnobW);
cursor: e-resize;
}
.range {
@include trans-prop-nice-fade(.25s);
background-color: $sliderColorRange;
cursor: ew-resize;
position: absolute;
top: 0; //$tbOffset;
right: auto;
bottom: 0;
left: auto;
height: auto;
width: auto;
&:hover {
background-color: $sliderColorRangeHov;
}
}
$knobH: 100%; //14px;
.slot {
width: auto;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.knob {
@include trans-prop-nice-fade(.25s);
background-color: $sliderColorKnob;
&:hover {
background-color: $sliderColorKnobHov;
}
position: absolute;
height: $knobH;
width: $sliderKnobW;
top: 0;
auto: 0;
bottom: auto;
left: auto;
}
.knob-l {
@include border-left-radius($sliderKnobW);
cursor: w-resize;
}
.knob-r {
@include border-right-radius($sliderKnobW);
cursor: e-resize;
}
.range {
@include trans-prop-nice-fade(.25s);
background-color: $sliderColorRange;
cursor: ew-resize;
position: absolute;
top: 0; //$tbOffset;
right: auto;
bottom: 0;
left: auto;
height: auto;
width: auto;
&:hover {
background-color: $sliderColorRangeHov;
}
}
}
/******************************************************** DATETIME PICKER */
.l-datetime-picker {
$r1H: 15px;
@include user-select(none);
font-size: 0.8rem;
padding: $interiorMarginLg !important;
width: 230px;
.l-month-year-pager {
$pagerW: 20px;
//@include test();
//font-size: 0.8rem;
height: $r1H;
margin-bottom: $interiorMargin;
position: relative;
.pager,
.val {
//@include test(red);
@extend .abs;
}
.pager {
width: $pagerW;
@extend .ui-symbol;
&.prev {
right: auto;
&:before {
content: "\3c";
}
}
&.next {
left: auto;
text-align: right;
&:before {
content: "\3e";
}
}
}
.val {
text-align: center;
left: $pagerW + $interiorMargin;
right: $pagerW + $interiorMargin;
}
}
.l-calendar,
.l-time-selects {
border-top: 1px solid $colorInteriorBorder
}
.l-time-selects {
line-height: $formInputH;
}
$r1H: 15px;
@include user-select(none);
font-size: 0.8rem;
padding: $interiorMarginLg !important;
width: 230px;
.l-month-year-pager {
$pagerW: 20px;
height: $r1H;
margin-bottom: $interiorMargin;
position: relative;
.pager,
.val {
@extend .abs;
}
.pager {
width: $pagerW;
@extend .ui-symbol;
&.prev {
right: auto;
&:before {
content: "\3c";
}
}
&.next {
left: auto;
text-align: right;
&:before {
content: "\3e";
}
}
}
.val {
text-align: center;
left: $pagerW + $interiorMargin;
right: $pagerW + $interiorMargin;
}
}
.l-calendar,
.l-time-selects {
border-top: 1px solid $colorInteriorBorder
}
.l-time-selects {
line-height: $formInputH;
}
}
/******************************************************** CALENDAR */
.l-calendar {
$colorMuted: pushBack($colorMenuFg, 30%);
ul.l-cal-row {
@include display-flex;
@include flex-flow(row nowrap);
margin-top: 1px;
&:first-child {
margin-top: 0;
}
li {
@include flex(1 0);
//@include test();
margin-left: 1px;
padding: $interiorMargin;
text-align: center;
&:first-child {
margin-left: 0;
}
}
&.l-header li {
color: $colorMuted;
}
&.l-body li {
@include trans-prop-nice(background-color, .25s);
cursor: pointer;
&.in-month {
background-color: $colorCalCellInMonthBg;
}
.sub {
color: $colorMuted;
font-size: 0.8em;
}
&.selected {
background: $colorCalCellSelectedBg;
color: $colorCalCellSelectedFg;
.sub {
color: inherit;
}
}
&:hover {
background-color: $colorCalCellHovBg;
color: $colorCalCellHovFg;
.sub {
color: inherit;
}
}
}
}
$colorMuted: pushBack($colorMenuFg, 30%);
ul.l-cal-row {
@include display-flex;
@include flex-flow(row nowrap);
margin-top: 1px;
&:first-child {
margin-top: 0;
}
li {
@include flex(1 0);
margin-left: 1px;
padding: $interiorMargin;
text-align: center;
&:first-child {
margin-left: 0;
}
}
&.l-header li {
color: $colorMuted;
}
&.l-body li {
@include trans-prop-nice(background-color, .25s);
cursor: pointer;
&.in-month {
background-color: $colorCalCellInMonthBg;
}
.sub {
color: $colorMuted;
font-size: 0.8em;
}
&.selected {
background: $colorCalCellSelectedBg;
color: $colorCalCellSelectedFg;
.sub {
color: inherit;
}
}
&:hover {
background-color: $colorCalCellHovBg;
color: $colorCalCellHovFg;
.sub {
color: inherit;
}
}
}
}
}
/******************************************************** BROWSER ELEMENTS */
@include desktop {
::-webkit-scrollbar {
@include border-radius(2px);
@include box-sizing(border-box);
@include box-shadow(inset $scrollbarTrackShdw);
background-color: $scrollbarTrackColorBg;
height: $scrollbarTrackSize;
width: $scrollbarTrackSize;
}
::-webkit-scrollbar {
@include border-radius(2px);
@include box-sizing(border-box);
@include box-shadow(inset $scrollbarTrackShdw);
background-color: $scrollbarTrackColorBg;
height: $scrollbarTrackSize;
width: $scrollbarTrackSize;
}
::-webkit-scrollbar-thumb {
$bg: $scrollbarThumbColor;
$hc: $scrollbarThumbColorHov;
$gr: 5%;
@include background-image(linear-gradient(lighten($bg, $gr), $bg 20px));
@include border-radius(2px);
@include box-sizing(border-box);
//@include boxShdwSubtle();
//border-top: 1px solid lighten($bg, 20%);
&:hover {
@include background-image(linear-gradient(lighten($hc, $gr), $hc 20px));
}
}
::-webkit-scrollbar-thumb {
$bg: $scrollbarThumbColor;
$hc: $scrollbarThumbColorHov;
$gr: 5%;
@include background-image(linear-gradient(lighten($bg, $gr), $bg 20px));
@include border-radius(2px);
@include box-sizing(border-box);
&:hover {
@include background-image(linear-gradient(lighten($hc, $gr), $hc 20px));
}
}
::-webkit-scrollbar-corner {
background: $scrollbarTrackColorBg;
}
}
::-webkit-scrollbar-corner {
background: $scrollbarTrackColorBg;
}
}

View File

@@ -32,7 +32,7 @@
.l-tree-item-flat-list {
// For lists of tree-items that are flat. Remove margin, etc. normally needed for the expansion arrow.
.tree-item {
.label {
.t-object-label {
left: $interiorMargin !important;
}
}

View File

@@ -43,6 +43,11 @@
}
&.create-btn {
&:before {
content:'\2b';
display: inline;
font-family: symbolsfont;
}
.title-label {
font-size: 1rem;
}
@@ -83,7 +88,7 @@
@include menuUlReset();
li {
@include box-sizing(border-box);
border-top: 1px solid lighten($colorMenuBg, 20%);
border-top: 1px solid pullForward($colorMenuBg, 10%);
color: pullForward($colorMenuBg, 60%);
line-height: $menuLineH;
padding: $interiorMarginSm $interiorMargin * 2 $interiorMarginSm ($interiorMargin * 2) + $treeTypeIconW;

View File

@@ -37,6 +37,8 @@
}
.status.block {
$transDelay: 1.5s;
$transSpeed: .25s;
color: $colorStatusDefault;
cursor: default;
display: inline-block;
@@ -44,13 +46,47 @@
.status-indicator,
.label,
.count {
//@include test(#00ff00);
display: inline-block;
vertical-align: top;
}
&.no-icon {
.status-indicator {
display: none;
}
}
&.float-right {
float: right;
}
&.subtle {
opacity: 0.5;
}
.status-indicator {
margin-right: $interiorMarginSm;
}
&:not(.no-collapse) {
.label {
// Max-width silliness is necessary for width transition
@include trans-prop-nice(max-width, $transSpeed, $transDelay);
overflow: hidden;
max-width: 0px;
}
&:hover {
.label {
@include trans-prop-nice(max-width, $transSpeed, 0s);
max-width: 450px;
width: auto;
}
.count {
@include trans-prop-nice(max-width, $transSpeed, 0s);
opacity: 0;
}
}
}
&.ok .status-indicator,
&.info .status-indicator {
color: $colorStatusInfo;
@@ -63,26 +99,11 @@
&.error .status-indicator {
color: $colorStatusError;
}
.label {
// Max-width silliness is necessary for width transition
@include trans-prop-nice(max-width, .25s);
overflow: hidden;
max-width: 0px;
}
.count {
@include trans-prop-nice(opacity, .25s);
@include trans-prop-nice(opacity, $transSpeed, $transDelay);
font-weight: bold;
opacity: 1;
}
&:hover {
.label {
max-width: 450px;
width: auto;
}
.count {
opacity: 0;
}
}
}
/* Styles for messages and message banners */

View File

@@ -6,10 +6,6 @@
}
}
.l-time-controller-visible {
}
mct-include.l-time-controller {
$minW: 500px;
$knobHOffset: 0px;
@@ -22,10 +18,10 @@ mct-include.l-time-controller {
$r2H: nth($ueTimeControlH,2);
$r3H: nth($ueTimeControlH,3);
@include absPosDefault();
//@include absPosDefault();
//@include test();
display: block;
top: auto;
//top: auto;
height: $r1H + $r2H + $r3H + ($interiorMargin * 2);
min-width: $minW;
font-size: 0.8rem;

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