Compare commits
	
		
			49 Commits
		
	
	
		
			mutation-o
			...
			open933-fr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | a10ded25b4 | ||
|   | da7c636724 | ||
|   | b392633bc6 | ||
|   | ff1678435e | ||
|   | 2124fe01e1 | ||
|   | e6d8944547 | ||
|   | ea1defac28 | ||
|   | 2a19394334 | ||
|   | f641edbce7 | ||
|   | 15a608a861 | ||
|   | 334ca64551 | ||
|   | 0af49efe06 | ||
|   | 4087b9cdde | ||
|   | 43a804eef4 | ||
|   | b3a4f52fe2 | ||
|   | 671e3016d4 | ||
|   | 379828315f | ||
|   | 8c5538ec4d | ||
|   | 2f9fbfef7f | ||
|   | 2baca659ca | ||
|   | 8b694ef337 | ||
|   | e193e3dfba | ||
|   | 8214c8e895 | ||
|   | 33b2225d10 | ||
|   | 14463d39a8 | ||
|   | fcfda50e73 | ||
|   | 06af84c161 | ||
|   | 5238aa2731 | ||
|   | fd29473664 | ||
|   | 97f3fd516b | ||
|   | 088416905d | ||
|   | 2056d87453 | ||
|   | 64ce8a2b2a | ||
|   | 585da38a16 | ||
|   | bf0e85a94c | ||
|   | 84b7a9dc2f | ||
|   | 11caa8396a | ||
|   | 0017b77439 | ||
|   | 7b7b21d748 | ||
|   | 788483ec13 | ||
|   | 7b19f91ce6 | ||
|   | 5cc81ba12a | ||
|   | 0a0bc55f5f | ||
|   | 4e7b69c4df | ||
|   | cf83040c4b | ||
|   | 32f7bc86af | ||
|   | e230b92946 | ||
|   | 58ed500ecf | ||
|   | bca5eb0fdb | 
| @@ -18,6 +18,8 @@ | ||||
|     "node-uuid": "^1.4.7", | ||||
|     "comma-separated-values": "^3.6.4", | ||||
|     "FileSaver.js": "^0.0.2", | ||||
|     "zepto": "^1.1.6" | ||||
|     "zepto": "^1.1.6", | ||||
|     "eventemitter3": "^1.2.0", | ||||
|     "d3": "~4.1.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										13
									
								
								main.js
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								main.js
									
									
									
									
									
								
							| @@ -28,13 +28,15 @@ requirejs.config({ | ||||
|         "angular-route": "bower_components/angular-route/angular-route.min", | ||||
|         "csv": "bower_components/comma-separated-values/csv.min", | ||||
|         "es6-promise": "bower_components/es6-promise/promise.min", | ||||
|         "EventEmitter": "bower_components/eventemitter3/index", | ||||
|         "moment": "bower_components/moment/moment", | ||||
|         "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", | ||||
|         "saveAs": "bower_components/FileSaver.js/FileSaver.min", | ||||
|         "screenfull": "bower_components/screenfull/dist/screenfull.min", | ||||
|         "text": "bower_components/text/text", | ||||
|         "uuid": "bower_components/node-uuid/uuid", | ||||
|         "zepto": "bower_components/zepto/zepto.min" | ||||
|         "zepto": "bower_components/zepto/zepto.min", | ||||
|         "d3": "bower_components/d3/d3.min" | ||||
|     }, | ||||
|     "shim": { | ||||
|         "angular": { | ||||
| @@ -43,6 +45,9 @@ requirejs.config({ | ||||
|         "angular-route": { | ||||
|             "deps": ["angular"] | ||||
|         }, | ||||
|         "EventEmitter": { | ||||
|             "exports": "EventEmitter" | ||||
|         }, | ||||
|         "moment-duration-format": { | ||||
|             "deps": ["moment"] | ||||
|         }, | ||||
| @@ -51,6 +56,9 @@ requirejs.config({ | ||||
|         }, | ||||
|         "zepto": { | ||||
|             "exports": "Zepto" | ||||
|         }, | ||||
|         "d3": { | ||||
|             "exports": "d3" | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -82,6 +90,9 @@ define([ | ||||
|     './platform/features/pages/bundle', | ||||
|     './platform/features/plot/bundle', | ||||
|     './platform/features/timeline/bundle', | ||||
|     //'./platform/features/conductor/bundle', | ||||
|     './platform/features/conductor-v2/bundle', | ||||
|     './platform/features/conductor-v2-compatibility/bundle', | ||||
|     './platform/features/table/bundle', | ||||
|     './platform/forms/bundle', | ||||
|     './platform/identity/bundle', | ||||
|   | ||||
| @@ -43,7 +43,7 @@ | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div class="holder l-flex-col flex-elem grows l-object-wrapper"> | ||||
|     <div class="holder l-flex-col flex-elem grows l-object-wrapper l-controls-visible l-time-controller-visible"> | ||||
|         <div class="holder l-flex-col flex-elem grows l-object-wrapper-inner"> | ||||
|             <!-- Toolbar and Save/Cancel buttons --> | ||||
|             <div class="l-edit-controls flex-elem l-flex-row flex-align-end"> | ||||
| @@ -59,4 +59,9 @@ | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|     </div> | ||||
|     <!-- put time conductor in here? --> | ||||
|     <mct-representation mct-object="domainObject" | ||||
|                         key="'time-conductor'" | ||||
|                         class="abs holder flex-elem flex-fixed l-flex-row l-time-conductor-holder"> | ||||
|     </mct-representation> | ||||
| </div> | ||||
|   | ||||
| @@ -36,14 +36,14 @@ | ||||
|  | ||||
|         </ul> | ||||
|     </div> | ||||
|     <div class="pane right menu-item-description"> | ||||
|         <div class="desc-area ui-symbol icon type-icon"> | ||||
|     <div class="pane right menu-item-description l-flex-col"> | ||||
|         <div class="desc-area flex-elem holder ui-symbol icon type-icon"> | ||||
|             {{representation.activeMetadata.glyph}} | ||||
|         </div> | ||||
|         <div class="desc-area title"> | ||||
|         <div class="desc-area flex-elem holder title"> | ||||
|             {{representation.activeMetadata.name}} | ||||
|         </div> | ||||
|         <div class="desc-area description"> | ||||
|         <div class="desc-area flex-elem holder description"> | ||||
|             {{representation.activeMetadata.description}} | ||||
|         </div> | ||||
|     </div> | ||||
|   | ||||
| @@ -23,10 +23,12 @@ | ||||
| define([ | ||||
|     "./src/FormatProvider", | ||||
|     "./src/UTCTimeFormat", | ||||
|     "./src/DurationFormat", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     FormatProvider, | ||||
|     UTCTimeFormat, | ||||
|     DurationFormat, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|  | ||||
| @@ -48,6 +50,10 @@ define([ | ||||
|                 { | ||||
|                     "key": "utc", | ||||
|                     "implementation": UTCTimeFormat | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "duration", | ||||
|                     "implementation": DurationFormat | ||||
|                 } | ||||
|             ], | ||||
|             "constants": [ | ||||
|   | ||||
							
								
								
									
										60
									
								
								platform/commonUI/formats/src/DurationFormat.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								platform/commonUI/formats/src/DurationFormat.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     'moment' | ||||
| ], function ( | ||||
|     moment | ||||
| ) { | ||||
|  | ||||
|     var DATE_FORMAT = "HH:mm:ss", | ||||
|         DATE_FORMATS = [ | ||||
|             DATE_FORMAT | ||||
|         ]; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Formatter for UTC timestamps. Interprets numeric values as | ||||
|      * milliseconds since the start of 1970. Displays only the utc time. Can | ||||
|      * be used, with care, for specifying time intervals. | ||||
|      * | ||||
|      * @implements {Format} | ||||
|      * @constructor | ||||
|      * @memberof platform/commonUI/formats | ||||
|      */ | ||||
|     function DurationFormat() { | ||||
|     } | ||||
|  | ||||
|     DurationFormat.prototype.format = function (value) { | ||||
|         return moment.utc(value).format(DATE_FORMAT); | ||||
|     }; | ||||
|  | ||||
|     DurationFormat.prototype.parse = function (text) { | ||||
|         return moment.duration(text).asMilliseconds(); | ||||
|     }; | ||||
|  | ||||
|     DurationFormat.prototype.validate = function (text) { | ||||
|         return moment.utc(text, DATE_FORMATS).isValid(); | ||||
|     }; | ||||
|  | ||||
|     return DurationFormat; | ||||
| }); | ||||
										
											Binary file not shown.
										
									
								
							| @@ -101,5 +101,6 @@ | ||||
| <glyph unicode="" glyph-name="icon-tabular-lad" d="M896 960h-768c-70.606-0.215-127.785-57.394-128-127.979v-768.021c0.215-70.606 57.394-127.785 127.979-128h768.021c70.606 0.215 127.785 57.394 128 127.979v768.021c-0.215 70.606-57.394 127.785-127.979 128zM64 704h256v-192h-256v192zM64 448h256v-192h-256v192zM128 0c-35.26 0.214-63.786 28.74-64 63.98v128.020h256v-192h-192zM384 0v192h256v-192h-256zM960 64c-0.214-35.26-28.74-63.786-63.98-64h-192.020v192h256v-128zM960 448v-192h-576v192h64v64h-64v192h576v-192h-64v-64h64zM782.32 412.62l-110.32 55.16v172.22c0 17.673-14.327 32-32 32s-32-14.327-32-32v-211.78l145.68-72.84c4.172-2.133 9.1-3.383 14.32-3.383 17.675 0 32.003 14.328 32.003 32.003 0 12.454-7.114 23.247-17.501 28.536z" /> | ||||
| <glyph unicode="" glyph-name="icon-tabular-lad-set" d="M128 192v576c-70.606-0.215-127.785-57.394-128-127.979v-576.021c0.215-70.606 57.394-127.785 127.979-128h576.021c70.606 0.215 127.785 57.394 128 127.979l-576 0.021c-70.606 0.215-127.785 57.394-128 127.979zM896 960h-576c-70.606-0.215-127.785-57.394-128-127.979v-576.021c0.215-70.606 57.394-127.785 127.979-128h576.021c70.606 0.215 127.785 57.394 128 127.979v576.021c-0.215 70.606-57.394 127.785-127.979 128zM256 768h192v-128h-192v128zM256 576h192v-192h-192v192zM320 192c-35.26 0.214-63.786 28.74-64 63.98v64.020h192v-128h-128zM512 192v128h192v-128h-192zM960 256c-0.214-35.26-28.74-63.786-63.98-64h-128.020v128h192v-64zM960 384h-448v384h448v-384zM832 480c0.002 0 0.005 0 0.007 0 17.673 0 32 14.327 32 32 0 14.055-9.062 25.994-21.662 30.293l-74.345 24.767v104.94c0 17.673-14.327 32-32 32s-32-14.327-32-32v-151.060l117.88-39.3c3.018-1.040 6.495-1.64 10.113-1.64 0.003 0 0.005 0 0.008 0z" /> | ||||
| <glyph unicode="" glyph-name="icon-download" d="M832 384v-255.66l-0.34-0.34-639.66 0.34v255.66h-192v-256c0-105.6 86.4-192 192-192h640c105.6 0 192 86.4 192 192v256h-192zM512 320l448 448h-256v192h-384v-192h-256l448-448z" /> | ||||
| <glyph unicode="" glyph-name="icon-brackets" d="M832 960h-192v-192h191.66l0.34-0.34v-639.32l-0.34-0.34h-191.66v-192h192c105.6 0 192 86.4 192 192v640c0 105.6-86.4 192-192 192zM384 128h-191.66l-0.34 0.34v639.32l0.34 0.34h191.66v192h-192c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h192v192z" /> | ||||
| <glyph unicode="" 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: 35 KiB After Width: | Height: | Size: 35 KiB | 
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										91
									
								
								platform/commonUI/general/res/sass/_animations.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								platform/commonUI/general/res/sass/_animations.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| @include keyframes(rotation) { | ||||
|     100% { @include transform(rotate(360deg)); } | ||||
| } | ||||
|  | ||||
| @include keyframes(rotation-centered) { | ||||
|     0%   { @include transform(translate(-50%, -50%) rotate(0deg)); } | ||||
|     100% { @include transform(translate(-50%, -50%) rotate(360deg)); } | ||||
| } | ||||
|  | ||||
| @include keyframes(clock-hands) { | ||||
|     0% { @include transform(translate(-50%, -50%) rotate(0deg)); } | ||||
|     100% { @include transform(translate(-50%, -50%) rotate(360deg));  } | ||||
| } | ||||
|  | ||||
| @include keyframes(clock-hands-sticky) { | ||||
|     0% { | ||||
|         @include transform(translate(-50%, -50%) rotate(0deg)); | ||||
|     } | ||||
|     7% { | ||||
|         @include transform(translate(-50%, -50%) rotate(0deg)); | ||||
|     } | ||||
|     8% { | ||||
|         @include transform(translate(-50%, -50%) rotate(30deg)); | ||||
|     } | ||||
|     15% { | ||||
|         @include transform(translate(-50%, -50%) rotate(30deg)); | ||||
|     } | ||||
|     16% { | ||||
|         @include transform(translate(-50%, -50%) rotate(60deg)); | ||||
|     } | ||||
|     24% { | ||||
|         @include transform(translate(-50%, -50%) rotate(60deg)); | ||||
|     } | ||||
|     25% { | ||||
|         @include transform(translate(-50%, -50%) rotate(90deg)); | ||||
|     } | ||||
|     32% { | ||||
|         @include transform(translate(-50%, -50%) rotate(90deg)); | ||||
|     } | ||||
|     33% { | ||||
|         @include transform(translate(-50%, -50%) rotate(120deg)); | ||||
|     } | ||||
|     40% { | ||||
|         @include transform(translate(-50%, -50%) rotate(120deg)); | ||||
|     } | ||||
|     41% { | ||||
|         @include transform(translate(-50%, -50%) rotate(150deg)); | ||||
|     } | ||||
|     49% { | ||||
|         @include transform(translate(-50%, -50%) rotate(150deg)); | ||||
|     } | ||||
|     50% { | ||||
|         @include transform(translate(-50%, -50%) rotate(180deg)); | ||||
|     } | ||||
|     57% { | ||||
|         @include transform(translate(-50%, -50%) rotate(180deg)); | ||||
|     } | ||||
|     58% { | ||||
|         @include transform(translate(-50%, -50%) rotate(210deg)); | ||||
|     } | ||||
|     65% { | ||||
|         @include transform(translate(-50%, -50%) rotate(210deg)); | ||||
|     } | ||||
|     66% { | ||||
|         @include transform(translate(-50%, -50%) rotate(240deg)); | ||||
|     } | ||||
|     74% { | ||||
|         @include transform(translate(-50%, -50%) rotate(240deg)); | ||||
|     } | ||||
|     75% { | ||||
|         @include transform(translate(-50%, -50%) rotate(270deg)); | ||||
|     } | ||||
|     82% { | ||||
|         @include transform(translate(-50%, -50%) rotate(270deg)); | ||||
|     } | ||||
|     83% { | ||||
|         @include transform(translate(-50%, -50%) rotate(300deg)); | ||||
|     } | ||||
|     90% { | ||||
|         @include transform(translate(-50%, -50%) rotate(300deg)); | ||||
|     } | ||||
|     91% { | ||||
|         @include transform(translate(-50%, -50%) rotate(330deg)); | ||||
|     } | ||||
|     99% { | ||||
|         @include transform(translate(-50%, -50%) rotate(330deg)); | ||||
|     } | ||||
|     100% { | ||||
|         @include transform(translate(-50%, -50%) rotate(360deg)); | ||||
|     } | ||||
| } | ||||
| @@ -108,6 +108,9 @@ | ||||
|         &.grows { | ||||
|             @include flex(1 1 auto); | ||||
|         } | ||||
|         &.contents-align-right { | ||||
|             text-align: right; | ||||
|         } | ||||
|     } | ||||
|     .flex-container { | ||||
|         // Apply to wrapping elements, mct-includes, etc. | ||||
| @@ -121,17 +124,18 @@ | ||||
| .l-flex-row { | ||||
|     @include flex-direction(row); | ||||
|     &.flex-elem { @include flex(1 1 auto); } | ||||
|     .flex-elem { | ||||
|     > .flex-elem { | ||||
|         height: inherit; | ||||
|         line-height: inherit; | ||||
|         min-width: 0; | ||||
|         &.holder:not(:last-child) { margin-right: $interiorMargin; } | ||||
|     } | ||||
|     .flex-container { @include flex-direction(row); } | ||||
| } | ||||
|  | ||||
| .l-flex-col { | ||||
|     @include flex-direction(column); | ||||
|     .flex-elem { | ||||
|     > .flex-elem { | ||||
|         min-height: 0; | ||||
|         &.holder:not(:last-child) { margin-bottom: $interiorMarginLg; } | ||||
|     } | ||||
|   | ||||
| @@ -48,7 +48,6 @@ $uePaneMiniTabW: 10px; | ||||
| $uePaneMiniTabCollapsedW: 11px; | ||||
| $ueEditLeftPaneW: 75%; | ||||
| $treeSearchInputBarH: 25px; | ||||
| $ueTimeControlH: (33px, 18px, 20px); | ||||
| /*************** Panes */ | ||||
| $ueBrowseLeftPaneTreeMinW: 150px; | ||||
| $ueBrowseLeftPaneTreeMaxW: 35%; | ||||
| @@ -108,6 +107,7 @@ $bubbleMaxW: 300px; | ||||
| $reqSymbolW: 15px; | ||||
| $reqSymbolM: $interiorMargin * 2; | ||||
| $reqSymbolFontSize: 0.7em; | ||||
| $inputTextP: 3px 5px; | ||||
| /*************** Wait Spinner Defaults */ | ||||
| $waitSpinnerD: 32px; | ||||
| $waitSpinnerTreeD: 20px; | ||||
|   | ||||
| @@ -66,7 +66,7 @@ input, textarea { | ||||
| input[type="text"], | ||||
| input[type="search"] { | ||||
| 	vertical-align: baseline; | ||||
| 	padding: 3px 5px; | ||||
| 	padding: $inputTextP; | ||||
| } | ||||
|  | ||||
| h1, h2, h3 { | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
|  | ||||
| .ui-symbol { | ||||
|     font-family: 'symbolsfont'; | ||||
|     -webkit-font-smoothing: antialiased; | ||||
| 	&.type-icon { | ||||
| 		color: $colorObjHdrIc; | ||||
| 	} | ||||
| @@ -66,8 +67,7 @@ | ||||
| } | ||||
|  | ||||
| .menu .type-icon, | ||||
| .tree-item .type-icon, | ||||
| .super-menu.menu .type-icon { | ||||
| .tree-item .type-icon { | ||||
| 	position: absolute; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
| @import "effects"; | ||||
| @import "global"; | ||||
| @import "animations"; | ||||
| @import "archetypes"; | ||||
| @import "about"; | ||||
| @import "text"; | ||||
| @@ -40,7 +41,6 @@ | ||||
| @import "controls/lists"; | ||||
| @import "controls/menus"; | ||||
| @import "controls/messages"; | ||||
| @import "controls/time-controller"; | ||||
| @import "mobile/controls/menus"; | ||||
|  | ||||
| /********************************* FORMS */ | ||||
|   | ||||
| @@ -185,21 +185,15 @@ | ||||
| } | ||||
|  | ||||
| @mixin sliderTrack($bg: $scrollbarTrackColorBg) { | ||||
|     //$b: 1px solid lighten($bg, 30%); | ||||
|     border-radius: 2px; | ||||
|     box-sizing: border-box; | ||||
|     @include boxIncised(0.7); | ||||
|     background-color: $bg; | ||||
|     //border-bottom: $b; | ||||
|     //border-right: $b; | ||||
| } | ||||
|  | ||||
| @mixin controlGrippy($b, $direction: horizontal, $w: 1px, $style: dotted) { | ||||
|     //&:before { | ||||
|     //@include trans-prop-nice("border-color", 25ms); | ||||
|     content: ''; | ||||
|     display: block; | ||||
|     //height: auto; | ||||
|     pointer-events: none; | ||||
|     position: absolute; | ||||
|     z-index: 2; | ||||
| @@ -305,7 +299,6 @@ | ||||
| 	border-radius: $controlCr; | ||||
| 	box-sizing: border-box; | ||||
| 	color: $fg; | ||||
| 	display: inline-block; | ||||
| } | ||||
|  | ||||
| @mixin btnBase($bg: $colorBodyBg, $bgHovColor: none, $fg: $colorBodyFg, $ic: $colorBtnIcon) { | ||||
|   | ||||
| @@ -33,6 +33,7 @@ $pad: $interiorMargin * $baseRatio; | ||||
|  | ||||
| .s-btn { | ||||
|     box-sizing: border-box; | ||||
|     display: inline-block; | ||||
|     padding: 0 $pad; | ||||
|     font-size: 0.7rem; | ||||
|     vertical-align: top; | ||||
|   | ||||
| @@ -420,6 +420,63 @@ input[type="search"] { | ||||
|     } | ||||
| } | ||||
|  | ||||
| @mixin sliderKnob() { | ||||
|     $h: 16px; | ||||
|     cursor: pointer; | ||||
|     width: floor($h/1.75); | ||||
|     height: $h; | ||||
|     margin-top: 1 + floor($h/2) * -1; | ||||
|     @include btnSubtle(pullForward($colorBtnBg, 10%)); | ||||
|     //border-radius: 50% !important; | ||||
| } | ||||
|  | ||||
| @mixin sliderKnobRound() { | ||||
|     $h: 12px; | ||||
|     cursor: pointer; | ||||
|     width: $h; | ||||
|     height: $h; | ||||
|     margin-top: 1 + floor($h/2) * -1; | ||||
|     @include btnSubtle(pullForward($colorBtnBg, 10%)); | ||||
|     border-radius: 50% !important; | ||||
| } | ||||
|  | ||||
| input[type="range"] { | ||||
|     // HTML5 range inputs | ||||
|  | ||||
|     -webkit-appearance: none; /* Hides the slider so that custom slider can be made */ | ||||
|     background: transparent; /* Otherwise white in Chrome */ | ||||
|     &:focus { | ||||
|         outline: none; /* Removes the blue border. */ | ||||
|     } | ||||
|  | ||||
|     // Thumb | ||||
|     &::-webkit-slider-thumb { | ||||
|         -webkit-appearance: none; | ||||
|         @include sliderKnobRound(); | ||||
|     } | ||||
|     &::-moz-range-thumb { | ||||
|         border: none; | ||||
|         @include sliderKnobRound(); | ||||
|     } | ||||
|     &::-ms-thumb { | ||||
|         border: none; | ||||
|         @include sliderKnobRound(); | ||||
|     } | ||||
|  | ||||
|     // Track | ||||
|     &::-webkit-slider-runnable-track { | ||||
|         width: 100%; | ||||
|         height: 3px; | ||||
|         @include sliderTrack(); | ||||
|     } | ||||
|  | ||||
|     &::-moz-range-track { | ||||
|         width: 100%; | ||||
|         height: 3px; | ||||
|         @include sliderTrack(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /******************************************************** DATETIME PICKER */ | ||||
| .l-datetime-picker { | ||||
|     $r1H: 15px; | ||||
|   | ||||
| @@ -167,7 +167,7 @@ | ||||
| 	} | ||||
| 	.pane { | ||||
| 		box-sizing: border-box; | ||||
| 		&.left { | ||||
| 		&.menu-items { | ||||
| 			border-right: 1px solid pullForward($colorMenuBg, 10%); | ||||
| 			left: 0; | ||||
| 			padding-right: $interiorMargin; | ||||
| @@ -183,38 +183,53 @@ | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		&.right { | ||||
| 		&.menu-item-description { | ||||
| 			left: auto; | ||||
| 			right: 0; | ||||
| 			padding: $interiorMargin * 5; | ||||
| 			width: $prw; | ||||
|             .desc-area { | ||||
|                 &.icon { | ||||
|                     color: $colorCreateMenuLgIcon; | ||||
|                     font-size: 8em; | ||||
|                     margin-bottom: $interiorMargin * 3; | ||||
|                     position: relative; | ||||
|                     text-align: center; | ||||
|                 } | ||||
|                 &.title { | ||||
|                     color: $colorCreateMenuText; | ||||
|                     font-size: 1.2em; | ||||
|                     margin-bottom: $interiorMargin * 2; | ||||
|                 } | ||||
|                 &.description { | ||||
|                     color: pushBack($colorCreateMenuText, 20%); | ||||
|                     font-size: 0.8em; | ||||
|                     line-height: 1.5em; | ||||
|                 } | ||||
|             } | ||||
| 		} | ||||
| 	} | ||||
| 	.menu-item-description { | ||||
| 		.desc-area { | ||||
| 			&.icon { | ||||
| 				$h: 150px; | ||||
| 				color: $colorCreateMenuLgIcon; | ||||
| 				position: relative; | ||||
| 				font-size: 8em; | ||||
| 				left: 0; | ||||
| 				height: $h; | ||||
| 				line-height: $h; | ||||
| 				margin-bottom: $interiorMargin * 5; | ||||
| 				text-align: center; | ||||
| 			} | ||||
| 			&.title { | ||||
| 				color: $colorCreateMenuText; | ||||
| 				font-size: 1.2em; | ||||
| 				margin-bottom: 0.5em; | ||||
| 			} | ||||
| 			&.description { | ||||
| 				color: $colorCreateMenuText; | ||||
| 				font-size: 0.8em; | ||||
| 				line-height: 1.5em; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|     &.mini { | ||||
|         width: 400px; | ||||
|         height: 300px; | ||||
|         .pane { | ||||
|             &.menu-items { | ||||
|                 font-size: 0.8em; | ||||
|             } | ||||
|             &.menu-item-description { | ||||
|                 padding: $interiorMargin * 3; | ||||
|                 .desc-area { | ||||
|                     &.icon { | ||||
|                         font-size: 4em; | ||||
|                     } | ||||
|                     &.title { | ||||
|                         font-size: 1em; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| .context-menu { | ||||
| 	font-size: 0.80rem; | ||||
| @@ -251,3 +266,7 @@ | ||||
| 	right: 0; | ||||
| 	width: auto; | ||||
| } | ||||
|  | ||||
| .menus-up .menu { | ||||
|     bottom: $btnStdH; top: auto; | ||||
| } | ||||
|   | ||||
| @@ -1,266 +0,0 @@ | ||||
| @mixin toiLineHovEffects() { | ||||
| 	&:before, | ||||
| 	&:after { | ||||
| 		background-color: $timeControllerToiLineColorHov; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| .l-time-controller { | ||||
| 	$minW: 500px; | ||||
| 	$knobHOffset: 0px; | ||||
| 	$knobM: ($sliderKnobW + $knobHOffset) * -1; | ||||
| 	$rangeValPad: $interiorMargin; | ||||
| 	$rangeValOffset: $sliderKnobW + $interiorMargin; | ||||
| 	$timeRangeSliderLROffset: 150px + ($sliderKnobW * 2); | ||||
| 	$r1H: nth($ueTimeControlH,1); // Not currently used | ||||
| 	$r2H: nth($ueTimeControlH,2); | ||||
| 	$r3H: nth($ueTimeControlH,3); | ||||
|  | ||||
|     min-width: $minW; | ||||
|     font-size: 0.8rem; | ||||
|  | ||||
| 	.l-time-range-inputs-holder, | ||||
| 	.l-time-range-slider-holder, | ||||
| 	.l-time-range-ticks-holder | ||||
| 	{ | ||||
| 		box-sizing: border-box; | ||||
|         position: relative; | ||||
|         &:not(:first-child) { | ||||
|             margin-top: $interiorMargin; | ||||
|         } | ||||
| 	} | ||||
| 	.l-time-range-slider, | ||||
| 	.l-time-range-ticks { | ||||
| 		@include absPosDefault(0, visible); | ||||
| 		left: $timeRangeSliderLROffset; right: $timeRangeSliderLROffset; | ||||
| 	} | ||||
|  | ||||
| 	.l-time-range-inputs-holder { | ||||
| 		border-top: 1px solid $colorInteriorBorder; | ||||
|         padding-top: $interiorMargin; | ||||
|         &.l-flex-row, | ||||
|         .l-flex-row { | ||||
|             @include align-items(center); | ||||
|             .flex-elem { | ||||
|                 height: auto; | ||||
|                 line-height: normal; | ||||
|             } | ||||
|         } | ||||
| 		.type-icon { | ||||
| 			font-size: 120%; | ||||
| 			vertical-align: middle; | ||||
| 		} | ||||
| 		.l-time-range-input-w, | ||||
| 		.l-time-range-inputs-elem { | ||||
| 			margin-right: $interiorMargin; | ||||
| 			.lbl { | ||||
| 				color: $colorPlotLabelFg; | ||||
| 			} | ||||
| 			.ui-symbol.icon { | ||||
| 				font-size: 11px; | ||||
| 			} | ||||
| 		} | ||||
|         .l-time-range-input-w { | ||||
|             // Wraps a datetime text input field | ||||
|             position: relative; | ||||
|             input[type="text"] { | ||||
|                 width: 200px; | ||||
|                 &.picker-icon { | ||||
|                     padding-right: 20px; | ||||
|                 } | ||||
|             } | ||||
|             .icon-calendar { | ||||
|                 position: absolute; | ||||
|                 right: 5px; | ||||
|                 top: 5px; | ||||
|             } | ||||
|         } | ||||
| 	} | ||||
|  | ||||
| 	.l-time-range-slider-holder { | ||||
| 		height: $r2H; | ||||
| 		.range-holder { | ||||
| 			box-shadow: none; | ||||
| 			background: none; | ||||
| 			border: none; | ||||
| 			.range { | ||||
| 				.toi-line { | ||||
| 					$myC: $timeControllerToiLineColor; | ||||
| 					$myW: 8px; | ||||
| 					@include transform(translateX(50%)); | ||||
| 					position: absolute; | ||||
| 					top: 0; right: 0; bottom: 0px; left: auto; | ||||
| 					width: $myW; | ||||
| 					height: auto; | ||||
| 					z-index: 2; | ||||
| 					&:before { | ||||
| 						// Vert line | ||||
|                         background-color: $myC; | ||||
|                         position: absolute; | ||||
|                         content: ""; | ||||
| 						top: 0; right: auto; bottom: -10px; left: floor($myW/2) - 1; | ||||
| 						width: 1px; | ||||
| 					} | ||||
| 				} | ||||
| 				&:hover .toi-line { | ||||
| 					@include toiLineHovEffects; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		&:not(:active) { | ||||
| 			.knob, | ||||
| 			.range { | ||||
| 				@include transition-property(left, right); | ||||
| 				@include transition-duration(500ms); | ||||
| 				@include transition-timing-function(ease-in-out); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	.l-time-range-ticks-holder { | ||||
| 		height: $r3H; | ||||
| 		.l-time-range-ticks { | ||||
| 			border-top: 1px solid $colorTick; | ||||
| 			.tick { | ||||
| 				background-color: $colorTick; | ||||
| 				border:none; | ||||
| 				height: 5px; | ||||
| 				width: 1px; | ||||
| 				margin-left: -1px; | ||||
| 				position: absolute; | ||||
| 				&:first-child { | ||||
| 					margin-left: 0; | ||||
| 				} | ||||
| 				.l-time-range-tick-label { | ||||
| 					@include webkitProp(transform, translateX(-50%)); | ||||
| 					color: $colorPlotLabelFg; | ||||
| 					display: inline-block; | ||||
| 					font-size: 0.7rem; | ||||
| 					position: absolute; | ||||
| 					top: 5px; | ||||
| 					white-space: nowrap; | ||||
| 					z-index: 2; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	.knob { | ||||
| 		z-index: 2; | ||||
|         &:before { | ||||
|             $mTB: 2px; | ||||
|             $grippyW: 3px; | ||||
|             $mLR: ($sliderKnobW - $grippyW)/2; | ||||
|             @include bgStripes($c: pullForward($sliderColorKnob, 20%), $a: 1, $bgsize: 4px, $angle: 0deg); | ||||
|             content: ''; | ||||
|             display: block; | ||||
|             position: absolute; | ||||
|             top: $mTB; right: $mLR; bottom: $mTB; left: $mLR; | ||||
|         } | ||||
| 		.range-value { | ||||
| 			@include trans-prop-nice-fade(.25s); | ||||
|             font-size: 0.7rem; | ||||
| 			position: absolute; | ||||
| 			height: $r2H; | ||||
| 			line-height: $r2H; | ||||
|             white-space: nowrap; | ||||
|             z-index: 1; | ||||
| 		} | ||||
| 		&:hover { | ||||
|             .range-value { | ||||
|                 color: $sliderColorKnobHov; | ||||
|             } | ||||
| 		} | ||||
| 		&.knob-l { | ||||
| 			margin-left: $knobM; | ||||
| 			.range-value { | ||||
| 				text-align: right; | ||||
| 				right: $rangeValOffset; | ||||
| 			} | ||||
| 		} | ||||
| 		&.knob-r { | ||||
| 			margin-right: $knobM; | ||||
| 			.range-value { | ||||
| 				left: $rangeValOffset; | ||||
| 			} | ||||
| 			&:hover + .range-holder .range .toi-line { | ||||
| 				@include toiLineHovEffects; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	.l-time-domain-selector { | ||||
| 		position: absolute; | ||||
| 		right: 0px; | ||||
| 		top: $interiorMargin; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| .s-time-range-val { | ||||
| 	border-radius: $controlCr; | ||||
| 	background-color: $colorInputBg; | ||||
| 	padding: 1px 1px 0 $interiorMargin; | ||||
| } | ||||
|  | ||||
| /******************************************************************** MOBILE */ | ||||
|  | ||||
| @include phoneandtablet { | ||||
|     .l-time-controller { | ||||
|         min-width: 0; | ||||
|         .l-time-range-slider-holder, | ||||
|         .l-time-range-ticks-holder { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @include phone { | ||||
|     .l-time-controller { | ||||
|         .l-time-range-inputs-holder { | ||||
|             &.l-flex-row, | ||||
|             .l-flex-row { | ||||
|                 @include align-items(flex-start); | ||||
|             } | ||||
|             .l-time-range-inputs-elem { | ||||
|                 &.type-icon { | ||||
|                     margin-top: 3px; | ||||
|                 } | ||||
|             } | ||||
|             .t-inputs-w { | ||||
|                 @include flex-direction(column); | ||||
|                 .l-time-range-input-w:not(:first-child) { | ||||
|                     &:not(:first-child) { | ||||
|                         margin-top: $interiorMargin; | ||||
|                     } | ||||
|                     margin-right: 0; | ||||
|                 } | ||||
|                 .l-time-range-inputs-elem { | ||||
|                     &.lbl { display: none; } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @include phonePortrait { | ||||
|     .l-time-controller { | ||||
|         .l-time-range-inputs-holder { | ||||
|             .t-inputs-w { | ||||
|                 @include flex(1 1 auto); | ||||
|                 padding-top: 25px; // Make room for the ever lovin' Time Domain Selector | ||||
|                 .flex-elem { | ||||
|                     @include flex(1 1 auto); | ||||
|                     width: 100%; | ||||
|                 } | ||||
|                 input[type="text"] { | ||||
|                     width: 100%; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     .l-time-domain-selector { | ||||
|         right: auto; | ||||
|         left: 20px; | ||||
|     } | ||||
| } | ||||
| @@ -19,15 +19,6 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| @include keyframes(rotation) { | ||||
|     100% { @include transform(rotate(360deg)); } | ||||
| } | ||||
|  | ||||
| @include keyframes(rotation-centered) { | ||||
|     0%   { @include transform(translate(-50%, -50%) rotate(0deg)); } | ||||
|     100% { @include transform(translate(-50%, -50%) rotate(360deg)); } | ||||
| } | ||||
|  | ||||
| @mixin  spinner($b: 5px, $c: $colorKey) { | ||||
|     @include transform-origin(center); | ||||
|     @include animation-name(rotation-centered); | ||||
|   | ||||
| @@ -129,6 +129,8 @@ | ||||
|     } | ||||
|  | ||||
|     .primary-pane { | ||||
|         // Clip element that have min-widths | ||||
|         overflow: hidden; | ||||
|         // Need to lift up this pane to ensure that 'collapsed' panes don't block user interactions | ||||
|         z-index: 4; | ||||
|     } | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
|     <input type="text" | ||||
|            ng-model="textValue" | ||||
|            ng-blur="restoreTextValue(); ngBlur()" | ||||
|            ng-mouseup="ngMouseup()" | ||||
|            ng-class="{ | ||||
|                         error: textInvalid || | ||||
|                             (structure.validate && | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
|     <form class="l-time-range-inputs-holder l-flex-row flex-elem" | ||||
|           ng-submit="trCtrl.updateBoundsFromForm()"> | ||||
|         <span class="l-time-range-inputs-elem ui-symbol type-icon flex-elem">C</span> | ||||
|         <span class="l-time-range-inputs-elem t-inputs-w l-flex-row flex-elem"> | ||||
|         <span class="l-time-range-inputs-elem l-flex-row flex-elem"> | ||||
|             <span class="l-time-range-input-w flex-elem"> | ||||
|                 <mct-control key="'datetime-field'" | ||||
|                              structure="{ | ||||
|   | ||||
| @@ -52,7 +52,7 @@ $colorGridLines: rgba(#fff, 0.05); | ||||
| $colorInvokeMenu: #fff; | ||||
| $colorObjHdrTxt: $colorBodyFg; | ||||
| $colorObjHdrIc: pullForward($colorObjHdrTxt, 20%); | ||||
| $colorTick: rgba(white, 0.2); | ||||
| $colorTick: pullForward($colorBodyBg, 20%); | ||||
|  | ||||
| // Menu colors | ||||
| $colorMenuBg: pullForward($colorBodyBg, 23%); | ||||
| @@ -207,4 +207,10 @@ $colorAboutLink: #84b3ff; | ||||
|  | ||||
| // Loading | ||||
| $colorLoadingFg: $colorAlt1; | ||||
| $colorLoadingBg: rgba($colorBodyFg, 0.2); | ||||
| $colorLoadingBg: rgba($colorBodyFg, 0.2); | ||||
|  | ||||
| // Time Conductor | ||||
| $colorTimeCondKeyBg: #4e70dc; | ||||
| $colorTimeCondKeyFg: #fff; | ||||
| $colorTimeCondDataVisBg: pullForward($colorBodyBg, 10%); | ||||
| $colorTimeCondDataVisRtBg: pushBack($colorTimeCondKeyBg, 10%); | ||||
| @@ -52,7 +52,7 @@ $colorGridLines: rgba(#000, 0.05); | ||||
| $colorInvokeMenu: #fff; | ||||
| $colorObjHdrTxt: $colorBodyFg; | ||||
| $colorObjHdrIc: pushBack($colorObjHdrTxt, 30%); | ||||
| $colorTick: rgba(black, 0.2); | ||||
| $colorTick: pullForward($colorBodyBg, 30%); | ||||
|  | ||||
| // Menu colors | ||||
| $colorMenuBg: pushBack($colorBodyBg, 10%); | ||||
| @@ -185,6 +185,7 @@ $scrollbarThumbColorOverlayHov: $scrollbarThumbColorHov; | ||||
| // Splitter | ||||
| $splitterD: 16px; // splitterD and $splitterHandleD should both be odd, or even | ||||
| $splitterHandleD: 2px; | ||||
| $splitterDSm: 16px; // Smaller splitter, used inside elements like a Timeline view | ||||
| $colorSplitterBg: pullForward($colorBodyBg, 10%); | ||||
| $splitterShdw: none; | ||||
| $splitterEndCr: none; | ||||
| @@ -207,3 +208,9 @@ $colorAboutLink: #84b3ff; | ||||
| // Loading | ||||
| $colorLoadingFg: $colorAlt1; | ||||
| $colorLoadingBg: rgba($colorLoadingFg, 0.1); | ||||
|  | ||||
| // Time Conductor | ||||
| $colorTimeCondKeyBg: #6178dc; | ||||
| $colorTimeCondKeyFg: #fff; | ||||
| $colorTimeCondDataVisBg: pullForward($colorBodyBg, 10%); | ||||
| $colorTimeCondDataVisRtBg: pushBack($colorTimeCondKeyBg, 30%); | ||||
|   | ||||
							
								
								
									
										55
									
								
								platform/features/conductor-v2-compatibility/bundle.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								platform/features/conductor-v2-compatibility/bundle.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     "./src/ConductorTelemetryDecorator", | ||||
|     "./src/ConductorRepresenter", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     ConductorTelemetryDecorator, | ||||
|     ConductorRepresenter, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|  | ||||
|     legacyRegistry.register("platform/features/conductor-v2-compatibility", { | ||||
|         "extensions": { | ||||
|             "representers": [ | ||||
|                 { | ||||
|                     "implementation": ConductorRepresenter, | ||||
|                     "depends": [ | ||||
|                         "timeConductor" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "components": [ | ||||
|                 { | ||||
|                     "type": "decorator", | ||||
|                     "provides": "telemetryService", | ||||
|                     "implementation": ConductorTelemetryDecorator, | ||||
|                     "depends": [ | ||||
|                         "timeConductor" | ||||
|                     ] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -0,0 +1,75 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|  | ||||
|         function ConductorRepresenter( | ||||
|             conductor, | ||||
|             scope, | ||||
|             element | ||||
|         ) { | ||||
|             this.conductor = conductor; | ||||
|             this.scope = scope; | ||||
|             this.element = element; | ||||
|  | ||||
|             this.boundsListener = this.boundsListener.bind(this); | ||||
|             this.timeSystemListener = this.timeSystemListener.bind(this); | ||||
|         } | ||||
|  | ||||
|         ConductorRepresenter.prototype.boundsListener = function (bounds) { | ||||
|             this.scope.$broadcast('telemetry:display:bounds', { | ||||
|                 start: bounds.start, | ||||
|                 end: bounds.end, | ||||
|                 domain: this.conductor.timeSystem().metadata.key | ||||
|             }, this.conductor.follow()); | ||||
|         }; | ||||
|  | ||||
|         ConductorRepresenter.prototype.timeSystemListener = function (timeSystem) { | ||||
|             var bounds = this.conductor.bounds(); | ||||
|             this.scope.$broadcast('telemetry:display:bounds', { | ||||
|                 start: bounds.start, | ||||
|                 end: bounds.end, | ||||
|                 domain: timeSystem.metadata.key | ||||
|             }); | ||||
|         }; | ||||
|  | ||||
|         // Handle a specific representation of a specific domain object | ||||
|         ConductorRepresenter.prototype.represent = function represent(representation) { | ||||
|             if (representation.key === 'browse-object') { | ||||
|                 this.destroy(); | ||||
|  | ||||
|                 this.conductor.on("bounds", this.boundsListener); | ||||
|                 this.conductor.on("timeSystem", this.timeSystemListener); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         ConductorRepresenter.prototype.destroy = function destroy() { | ||||
|             this.conductor.off("bounds", this.boundsListener); | ||||
|             this.conductor.off("timeSystem", this.timeSystemListener); | ||||
|         }; | ||||
|  | ||||
|         return ConductorRepresenter; | ||||
|     } | ||||
| ); | ||||
|  | ||||
| @@ -0,0 +1,71 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     function () { | ||||
|  | ||||
|         /** | ||||
|          * Decorates the `telemetryService` such that requests are | ||||
|          * mediated by the time conductor. This is a modified version of the | ||||
|          * decorator used in the old TimeConductor that integrates with the | ||||
|          * new TimeConductor API. | ||||
|          * | ||||
|          * @constructor | ||||
|          * @memberof platform/features/conductor | ||||
|          * @implements {TelemetryService} | ||||
|          * @param {platform/features/conductor.TimeConductor} conductor | ||||
|          *        the service which exposes the global time conductor | ||||
|          * @param {TelemetryService} telemetryService the decorated service | ||||
|          */ | ||||
|         function ConductorTelemetryDecorator(conductor, telemetryService) { | ||||
|             this.conductor = conductor; | ||||
|             this.telemetryService = telemetryService; | ||||
|         } | ||||
|  | ||||
|         ConductorTelemetryDecorator.prototype.amendRequests = function (requests) { | ||||
|             var bounds = this.conductor.bounds(), | ||||
|                 timeSystem = this.conductor.timeSystem(); | ||||
|  | ||||
|             function amendRequest(request) { | ||||
|                 request = request || {}; | ||||
|                 request.start = bounds.start; | ||||
|                 request.end = bounds.end; | ||||
|                 request.domain = timeSystem.metadata.key; | ||||
|                 return request; | ||||
|             } | ||||
|  | ||||
|             return (requests || []).map(amendRequest); | ||||
|         }; | ||||
|  | ||||
|         ConductorTelemetryDecorator.prototype.requestTelemetry = function (requests) { | ||||
|             return this.telemetryService | ||||
|                 .requestTelemetry(this.amendRequests(requests)); | ||||
|         }; | ||||
|  | ||||
|         ConductorTelemetryDecorator.prototype.subscribe = function (callback, requests) { | ||||
|             return this.telemetryService | ||||
|                 .subscribe(callback, requests); | ||||
|         }; | ||||
|  | ||||
|         return ConductorTelemetryDecorator; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										98
									
								
								platform/features/conductor-v2/bundle.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								platform/features/conductor-v2/bundle.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     "./src/TimeConductor", | ||||
|     "./src/ui/TimeConductorController", | ||||
|     "./src/ui/MCTConductorAxis", | ||||
|     "./src/timeSystems/UTCTimeSystem", | ||||
|     "text!./res/templates/time-conductor.html", | ||||
|     "text!./res/templates/mode-selector/mode-selector.html", | ||||
|     "text!./res/templates/mode-selector/mode-menu.html", | ||||
|     'legacyRegistry' | ||||
| ], function ( | ||||
|     TimeConductor, | ||||
|     TimeConductorController, | ||||
|     MCTConductorAxis, | ||||
|     UTCTimeSystem, | ||||
|     timeConductorTemplate, | ||||
|     modeSelectorTemplate, | ||||
|     modeMenuTemplate, | ||||
|     legacyRegistry | ||||
| ) { | ||||
|  | ||||
|     legacyRegistry.register("platform/features/conductor-v2", { | ||||
|         "extensions": { | ||||
|             "services": [ | ||||
|                 { | ||||
|                     "key": "timeConductor", | ||||
|                     "implementation": TimeConductor | ||||
|                 } | ||||
|             ], | ||||
|             "controllers": [ | ||||
|                 { | ||||
|                     "key": "TimeConductorController", | ||||
|                     "implementation": TimeConductorController, | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "timeConductor", | ||||
|                         "timeSystems[]" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "directives": [ | ||||
|                 { | ||||
|                     "key": "mctConductorAxis", | ||||
|                     "implementation": MCTConductorAxis, | ||||
|                     "depends": [ | ||||
|                         "timeConductor" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "stylesheets": [ | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/time-conductor.css" | ||||
|                 } | ||||
|             ], | ||||
|             "representations": [ | ||||
|                 { | ||||
|                     "key": "time-conductor", | ||||
|                     "template": timeConductorTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "mode-selector", | ||||
|                     "template": modeSelectorTemplate | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "mode-menu", | ||||
|                     "template": modeMenuTemplate | ||||
|                 } | ||||
|             ], | ||||
|             "timeSystems": [ | ||||
|                 { | ||||
|                     "implementation": UTCTimeSystem, | ||||
|                     "depends": ["$timeout"] | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
							
								
								
									
										3
									
								
								platform/features/conductor-v2/res/sass/_constants.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								platform/features/conductor-v2/res/sass/_constants.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| $ueTimeConductorH: (25px, 15px, 20px); | ||||
| $timeCondInputTimeSysDefW: 165px; // Default width for datetime value inputs | ||||
| $timeCondInputDeltaDefW: 60px; // Default width for delta value inputs, typically 00:00:00 | ||||
							
								
								
									
										444
									
								
								platform/features/conductor-v2/res/sass/time-conductor.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										444
									
								
								platform/features/conductor-v2/res/sass/time-conductor.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,444 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 "bourbon"; | ||||
| @import "../../../../commonUI/general/res/sass/constants"; | ||||
| @import "../../../../commonUI/general/res/sass/mixins"; | ||||
| @import "../../../../commonUI/general/res/sass/mobile/constants"; | ||||
| @import "../../../../commonUI/general/res/sass/mobile/mixins"; | ||||
| @import "../../../../commonUI/themes/espresso/res/sass/constants"; | ||||
| @import "../../../../commonUI/themes/espresso/res/sass/mixins"; | ||||
| @import "../../../../commonUI/general/res/sass/icons"; | ||||
| @import "constants"; | ||||
|  | ||||
| @mixin toiLineHovEffects() { | ||||
|     &:before, | ||||
|     &:after { | ||||
|         background-color: $timeControllerToiLineColorHov; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .l-time-conductor-holder { | ||||
|     $minW: 500px; | ||||
|     border-top: 1px solid $colorInteriorBorder; | ||||
|     min-width: $minW; | ||||
|     padding-top: $interiorMargin; | ||||
| } | ||||
|  | ||||
| .time-conductor-icon { | ||||
|     $c: $colorObjHdrIc; | ||||
|     $d: 18px; | ||||
|     height: $d !important; | ||||
|     width: $d; | ||||
|     position: relative; | ||||
|  | ||||
|     &:before { | ||||
|         @extend .ui-symbol; | ||||
|         color: $c; | ||||
|         content: '\e624'; | ||||
|         font-size: $d; | ||||
|         line-height: normal; | ||||
|         display: block; | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|         z-index: 1; | ||||
|     } | ||||
|  | ||||
|     // Clock hands | ||||
|     div[class*="hand"] { | ||||
|         $handW: 2px; | ||||
|         $handH: $d * 0.4; //8px; | ||||
|         @include transform(translate(-50%, -50%)); | ||||
|         @include animation-iteration-count(infinite); | ||||
|         @include animation-timing-function(linear); | ||||
|         position: absolute; | ||||
|         height: $handW; | ||||
|         width: $handW; | ||||
|         left: 50%; | ||||
|         top: 50%; | ||||
|         z-index: 2; | ||||
|         &:before { | ||||
|             background-color: $c; | ||||
|             content: ''; | ||||
|             display: block; | ||||
|             position: absolute; | ||||
|             width: 100%; | ||||
|             bottom: -1px; | ||||
|         } | ||||
|         &.hand-little { | ||||
|             z-index: 2; | ||||
|             @include animation-duration(12s); | ||||
|             &:before { | ||||
|                 //background: red; | ||||
|                 height: ceil($handH * 0.7); | ||||
|             } | ||||
|         } | ||||
|         &.hand-big { | ||||
|             z-index: 1; | ||||
|             @include animation-duration(1s); | ||||
|             &:before { | ||||
|                 height: $handH; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .l-time-conductor { | ||||
|     $knobHOffset: 0px; | ||||
|     $rangeValPad: $interiorMargin; | ||||
|     $rangeValOffset: $sliderKnobW + $interiorMargin; | ||||
|     $r1H: nth($ueTimeConductorH, 1); | ||||
|     $r2H: nth($ueTimeConductorH, 2); | ||||
|     $r3H: nth($ueTimeConductorH, 3); | ||||
|  | ||||
|     // Glyphs Todo: replace with refactored CSS approach when that is merged into master | ||||
|     $glyphIconFixed: '\e604'; | ||||
|     $glyphIconRealtime: '\43'; | ||||
|     $glyphIconLatest: '\44'; | ||||
|  | ||||
|     position: relative; | ||||
|  | ||||
|     > .l-row-elem { | ||||
|         // First order row elements | ||||
|         box-sizing: border-box; | ||||
|         width: 100%; | ||||
|         position: relative; | ||||
|     } | ||||
|  | ||||
|     .mode-selector .s-menu-btn, | ||||
|     .time-delta { | ||||
|         &:before { | ||||
|             @extend .ui-symbol; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .time-delta { | ||||
|         &:before { | ||||
|             color: $colorTimeCondKeyBg; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .l-time-conductor-inputs-holder, | ||||
|     .l-time-conductor-inputs-and-ticks, | ||||
|     .l-time-conductor-zoom-w { | ||||
|         font-size: 0.8rem; | ||||
|     } | ||||
|  | ||||
|     .l-time-conductor-inputs-holder { | ||||
|         $ticksBlockerFadeW: 50px; | ||||
|         $iconCalendarW: 16px; | ||||
|         $wBgColor: $colorBodyBg; | ||||
|  | ||||
|         height: $r1H; | ||||
|         position: absolute; | ||||
|         top: 0; | ||||
|         right: 0; | ||||
|         bottom: 0; | ||||
|         left: 0; | ||||
|         z-index: 1; | ||||
|         .l-time-range-w { | ||||
|             // Wraps a datetime text input field | ||||
|             height: 100%; | ||||
|             position: absolute; | ||||
|             .title { | ||||
|                 display: inline-block; | ||||
|                 margin-right: $interiorMarginSm; | ||||
|             } | ||||
|             &.start-w { | ||||
|                 @include background-image(linear-gradient(270deg, transparent, $wBgColor $ticksBlockerFadeW)); | ||||
|                 padding-right: $ticksBlockerFadeW; | ||||
|                 .title:before { | ||||
|                     content: 'Start'; | ||||
|                 } | ||||
|             } | ||||
|             &.end-w { | ||||
|                 @include background-image(linear-gradient(90deg, transparent, $wBgColor $ticksBlockerFadeW)); | ||||
|                 padding-left: $ticksBlockerFadeW; | ||||
|                 right: 0; | ||||
|                 .title:before { | ||||
|                     content: 'End'; | ||||
|                 } | ||||
|             } | ||||
|             input[type="text"] { | ||||
|                 @include trans-prop-nice(padding, 250ms); | ||||
|             } | ||||
|             .time-range-input input[type="text"] { | ||||
|                 width: $timeCondInputTimeSysDefW; | ||||
|             } | ||||
|             .hrs-min-input input[type="text"] { | ||||
|                 width: $timeCondInputDeltaDefW; | ||||
|             } | ||||
|             .icon-calendar { | ||||
|                 margin-top: 4px; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .l-time-conductor-inputs-and-ticks { | ||||
|         $c: $colorTick; | ||||
|         height: $r1H; | ||||
|         mct-conductor-axis { | ||||
|             display: block; | ||||
|             position: relative; | ||||
|             width: 100%; | ||||
|         } | ||||
|         .l-axis-holder { | ||||
|             height: $r1H; | ||||
|             position: relative; | ||||
|             width: 100%; | ||||
|             svg { | ||||
|                 text-rendering: geometricPrecision; | ||||
|                 width: 100%; | ||||
|                 height: 100%; | ||||
|                 > g { | ||||
|                     font-size: 0.9em; | ||||
|                 } | ||||
|                 path { | ||||
|                     // Line beneath ticks | ||||
|                     display: none; | ||||
|                 } | ||||
|                 line { | ||||
|                     // Tick marks | ||||
|                     stroke: $c; | ||||
|                 } | ||||
|                 text { | ||||
|                     // Tick labels | ||||
|                     fill: $c; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     .l-data-visualization { | ||||
|         background: $colorTimeCondDataVisBg; | ||||
|         height: $r2H; | ||||
|     } | ||||
|  | ||||
|     .l-time-conductor-controls { | ||||
|         align-items: center; | ||||
|         margin-top: $interiorMargin; | ||||
|         .l-time-conductor-zoom-w { | ||||
|             @include justify-content(flex-end); | ||||
|             .time-conductor-zoom { | ||||
|                 height: $r3H; | ||||
|                 min-width: 100px; | ||||
|                 width: 20%; | ||||
|             } | ||||
|             .time-conductor-zoom-current-range { | ||||
|                 color: $colorTick; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Real-time, latest modes | ||||
|     &.realtime-mode, | ||||
|     &.latest-mode { | ||||
|         .time-conductor-icon { | ||||
|             &:before { color: $colorTimeCondKeyBg; } | ||||
|             div[class*="hand"] { | ||||
|                 @include animation-name(clock-hands); | ||||
|                 &:before { | ||||
|                     background: $colorTimeCondKeyBg; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         .l-time-conductor-inputs-holder { | ||||
|             .l-time-range-input-w { | ||||
|                 input[type="text"]:not(.error) { | ||||
|                     background: transparent; | ||||
|                     box-shadow: none; | ||||
|                     border-radius: 0; | ||||
|                     padding-left: 0; | ||||
|                     padding-right: 0; | ||||
|                     &:hover, | ||||
|                     &:focus { | ||||
|                         @include nice-input(); | ||||
|                         padding: $inputTextP; | ||||
|                     } | ||||
|                 } | ||||
|                 .icon-calendar { | ||||
|                     display: none; | ||||
|                 } | ||||
|                 &.start-date { | ||||
|                     display: none; | ||||
|                 } | ||||
|                 &.end-date { | ||||
|                     pointer-events: none; | ||||
|                     input[type="text"] { | ||||
|                         color: pullForward($colorTimeCondKeyBg, 5%); | ||||
|                         margin-right: $interiorMargin; | ||||
|                         tab-index: -1; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         .l-data-visualization { | ||||
|             background: $colorTimeCondDataVisRtBg !important | ||||
|         } | ||||
|  | ||||
|         .mode-selector .s-menu-btn { | ||||
|             @include btnSubtle($colorTimeCondKeyBg, pullForward($colorTimeCondKeyBg, $ltGamma), $colorTimeCondKeyFg); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Fixed mode | ||||
|     &.fixed-mode { | ||||
|         $i: $glyphIconFixed; | ||||
|         .time-conductor-icon div[class*="hand"] { | ||||
|             &.hand-little { | ||||
|                 @include transform(rotate(120deg)); | ||||
|             } | ||||
|         } | ||||
|         .mode-selector .s-menu-btn:before { | ||||
|             content: $i; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Realtime mode | ||||
|     &.realtime-mode { | ||||
|         $i: $glyphIconRealtime; | ||||
|         .time-conductor-icon div[class*="hand"] { | ||||
|             @include animation-name(clock-hands); | ||||
|         } | ||||
|         .time-delta:before { | ||||
|             content: $i; | ||||
|         } | ||||
|         .l-time-conductor-inputs-holder .l-time-range-w.end-w .title:before { | ||||
|             content: 'Now'; | ||||
|         } | ||||
|         .mode-selector .s-menu-btn:before { | ||||
|             content: $i; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // LAD mode | ||||
|     &.latest-mode { | ||||
|         $i: $glyphIconLatest; | ||||
|         .time-conductor-icon div[class*="hand"] { | ||||
|             @include animation-name(clock-hands-sticky); | ||||
|             &.hand-big { | ||||
|                 @include animation-duration(5s); | ||||
|             } | ||||
|             &.hand-little { | ||||
|                 @include animation-duration(60s); | ||||
|             } | ||||
|         } | ||||
|         .time-delta:before { | ||||
|             content: $i; | ||||
|         } | ||||
|         .l-time-conductor-inputs-holder .l-time-range-w.end-w .title:before { | ||||
|             content: 'LAD'; | ||||
|         } | ||||
|         .mode-selector .s-menu-btn:before { | ||||
|             content: $i; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /******************************************************************** MOBILE */ | ||||
|  | ||||
| @include phoneandtablet { | ||||
|     .l-time-conductor-holder { min-width: 0 !important; } | ||||
|     .super-menu.mini { | ||||
|         width: 200px; | ||||
|         height: 100px; | ||||
|         .pane.menu-item-description { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @include phone { | ||||
|     .l-time-conductor { | ||||
|         min-width: 0; | ||||
|         .l-time-conductor-inputs-and-ticks { | ||||
|             .l-time-conductor-inputs-holder { | ||||
|                 .l-time-range-w { | ||||
|                     background-image: none !important; | ||||
|                 } | ||||
|             } | ||||
|             mct-conductor-axis { | ||||
|                 display: none; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @include phonePortrait { | ||||
|     .l-time-conductor { | ||||
|         .l-data-visualization, | ||||
|         .l-time-conductor-zoom-w, | ||||
|         .time-delta { | ||||
|             display: none; | ||||
|         } | ||||
|  | ||||
|         .l-time-conductor-inputs-and-ticks { | ||||
|             height: auto !important; | ||||
|             .l-time-conductor-inputs-holder { | ||||
|                 position: relative; | ||||
|                 height: auto !important; | ||||
|  | ||||
|                 .l-time-range-w { | ||||
|                     background-image: none !important; | ||||
|                     display: block; | ||||
|                     height: auto !important; | ||||
|                     padding: 0 !important; | ||||
|                     position: relative; | ||||
|                     text-align: left; | ||||
|                     &:not(:first-child) { | ||||
|                         margin-top: $interiorMargin; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Fixed mode | ||||
|         &.fixed-mode { | ||||
|             .l-time-conductor-inputs-and-ticks { | ||||
|                 .l-time-range-w { | ||||
|                     .title { | ||||
|                         width: 30px; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Real-time, latest modes | ||||
|         &.realtime-mode, | ||||
|         &.latest-mode { | ||||
|             .l-time-conductor-inputs-and-ticks { | ||||
|                 .l-time-range-w { | ||||
|                     &.start-w { | ||||
|                         display: none; | ||||
|                     } | ||||
|                     &.end-w { | ||||
|                         margin-top: 0; | ||||
|                         .end-date input[type="text"] { | ||||
|                             margin: 0; | ||||
|                             text-align: left; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| <!-- | ||||
|  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. | ||||
| --> | ||||
| <div class="contents"> | ||||
|     <div class="pane left menu-items"> | ||||
|         <ul> | ||||
|             <li ng-repeat="option in ngModel.options" | ||||
|                 ng-click="ngModel.selected=option"> | ||||
|                 <a | ||||
|                    ng-mouseover="representation.activeMetadata = option.metadata" | ||||
|                    ng-mouseleave="representation.activeMetadata = undefined"> | ||||
|                     <span class="ui-symbol icon type-icon"> | ||||
|                         {{option.metadata.glyph}} | ||||
|                     </span> | ||||
|                     {{option.metadata.name}} | ||||
|                 </a> | ||||
|             </li> | ||||
|         </ul> | ||||
|     </div> | ||||
|     <div class="pane right menu-item-description"> | ||||
|         <div class="desc-area ui-symbol icon type-icon"> | ||||
|             {{representation.activeMetadata.glyph}} | ||||
|         </div> | ||||
|         <div class="desc-area title"> | ||||
|             {{representation.activeMetadata.name}} | ||||
|         </div> | ||||
|         <div class="desc-area description"> | ||||
|             {{representation.activeMetadata.description}} | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| @@ -0,0 +1,34 @@ | ||||
| <!-- | ||||
|  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. | ||||
| --> | ||||
| <span ng-controller="ClickAwayController as modeController"> | ||||
|     <div class="s-menu-btn" | ||||
|          ng-click="modeController.toggle()"> | ||||
| 		<span class="title-label">{{ngModel.selected.metadata.label}}</span> | ||||
|     </div> | ||||
|     <div class="menu super-menu mini mode-selector-menu" | ||||
|          ng-show="modeController.isActive()"> | ||||
|         <mct-representation mct-object="domainObject" | ||||
|                             key="'mode-menu'" | ||||
|                             ng-model="ngModel"> | ||||
|         </mct-representation> | ||||
|     </div> | ||||
| </span> | ||||
							
								
								
									
										110
									
								
								platform/features/conductor-v2/res/templates/time-conductor.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								platform/features/conductor-v2/res/templates/time-conductor.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| <!-- Parent holder for time conductor. follow-mode | fixed-mode --> | ||||
| <div ng-controller="TimeConductorController as tcController" | ||||
|     class="holder grows flex-elem l-flex-row l-time-conductor {{modeModel.selected.metadata.key}}-mode {{timeSystemModel.selected.metadata.key}}-time-system"> | ||||
|  | ||||
|     <div class="flex-elem holder time-conductor-icon"> | ||||
|         <div class="hand-little"></div> | ||||
|         <div class="hand-big"></div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="flex-elem holder grows l-flex-col l-time-conductor-inner"> | ||||
|         <!-- Holds inputs and ticks --> | ||||
|         <div class="l-time-conductor-inputs-and-ticks l-row-elem flex-elem no-margin"> | ||||
|             <form class="l-time-conductor-inputs-holder" | ||||
|                   ng-submit="tcController.updateBoundsFromForm(formModel)"> | ||||
|                 <span class="l-time-range-w start-w"> | ||||
|                     <span class="l-time-range-input-w start-date"> | ||||
|                         <span class="title"></span> | ||||
|                         <mct-control key="'datetime-field'" | ||||
|                                      structure="{ | ||||
|                                          format: timeSystemModel.format, | ||||
|                                          validate: tcController.validation.validateStart | ||||
|                                      }" | ||||
|                                      ng-model="formModel" | ||||
|                                      ng-mouseup="changing['start'] = true" | ||||
|                                      ng-blur="changing['start'] = false; tcController.updateBoundsFromForm(formModel)" | ||||
|                                      field="'start'" | ||||
|                                      class="time-range-input"> | ||||
|                         </mct-control> | ||||
|                     </span> | ||||
|                         <span class="l-time-range-input-w time-delta start-delta" | ||||
|                           ng-class="{'hide':(modeModel.selected.metadata.key === 'fixed')}"> | ||||
|                             - | ||||
|                         <mct-control key="'datetime-field'" | ||||
|                                      structure="{ | ||||
|                                         format: 'duration', | ||||
|                                         validate: tcController.validation.validateStartDelta | ||||
|                                      }" | ||||
|                                      ng-model="formModel" | ||||
|                                      ng-blur="tcController.updateDeltasFromForm(formModel)" | ||||
|                                      field="'startDelta'" | ||||
|                                      class="hrs-min-input"> | ||||
|                         </mct-control> | ||||
|                     </span> | ||||
|                 </span> | ||||
|                 <span class="l-time-range-w end-w"> | ||||
|                     <span class="l-time-range-input-w end-date" | ||||
|                           ng-controller="ToggleController as t2"> | ||||
|                         <span class="title"></span> | ||||
|                         <mct-control key="'datetime-field'" | ||||
|                                      structure="{ | ||||
|                                          format: timeSystemModel.format, | ||||
|                                          validate: tcController.validation.validateEnd | ||||
|                                      }" | ||||
|                                      ng-model="formModel" | ||||
|                                      ng-mouseup="changing['end'] = true" | ||||
|                                      ng-blur="changing['end'] = false; tcController.updateBoundsFromForm(formModel)" | ||||
|                                      field="'end'" | ||||
|                                      class="time-range-input"> | ||||
|                         </mct-control> | ||||
|                     </span> | ||||
|                     <span class="l-time-range-input-w time-delta end-delta" | ||||
|                           ng-class="{'hide':(modeModel.selected.metadata.key === 'fixed')}"> | ||||
|                             + | ||||
|                         <mct-control key="'datetime-field'" | ||||
|                                      structure="{ | ||||
|                                         format: 'duration', | ||||
|                                         validate: tcController.validation.validateEndDelta | ||||
|                                      }" | ||||
|                                      ng-model="formModel" | ||||
|                                      ng-blur="tcController.updateDeltasFromForm(formModel)" | ||||
|                                      field="'endDelta'" | ||||
|                                      class="hrs-min-input"> | ||||
|                         </mct-control> | ||||
|                     </span> | ||||
|                 </span> | ||||
|  | ||||
|                 <input type="submit" class="hidden"> | ||||
|             </form> | ||||
|             <mct-conductor-axis></mct-conductor-axis> | ||||
|         </div> | ||||
|  | ||||
|         <!-- Holds data availability, time of interest --> | ||||
|         <div class="l-data-visualization l-row-elem flex-elem"></div> | ||||
|  | ||||
|         <!-- Holds time system and session selectors, and zoom control --> | ||||
|         <div class="l-time-conductor-controls l-row-elem l-flex-row flex-elem"> | ||||
|             <mct-representation | ||||
|                 key="'mode-selector'" | ||||
|                 mct-object="domainObject" | ||||
|                 ng-model="modeModel" | ||||
|                 class="holder flex-elem menus-up mode-selector"> | ||||
|             </mct-representation> | ||||
|             <mct-control | ||||
|                     key="'menu-button'" | ||||
|                     class="holder flex-elem menus-up time-system" | ||||
|                     structure="{ | ||||
|                         text: timeSystemModel.selected.metadata.name, | ||||
|                         click: tcController.selectTimeSystem, | ||||
|                         options: timeSystemModel.options | ||||
|                     }"> | ||||
|             </mct-control> | ||||
|             <!-- Zoom control --> | ||||
|             <div class="l-time-conductor-zoom-w grows flex-elem l-flex-row"> | ||||
|                 <span class="time-conductor-zoom-current-range flex-elem flex-fixed holder">Mars Minutes</span> | ||||
|                 <input class="time-conductor-zoom flex-elem" type="range" /> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|     </div> | ||||
| </div> | ||||
							
								
								
									
										185
									
								
								platform/features/conductor-v2/src/TimeConductor.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								platform/features/conductor-v2/src/TimeConductor.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define(['EventEmitter'], function (EventEmitter) { | ||||
|  | ||||
|     /** | ||||
|      * The public API for setting and querying time conductor state. The | ||||
|      * time conductor is the means by which the temporal bounds of a view | ||||
|      * are controlled. Time-sensitive views will typically respond to | ||||
|      * changes to bounds or other properties of the time conductor and | ||||
|      * update the data displayed based on the time conductor state. | ||||
|      * | ||||
|      * The TimeConductor extends the EventEmitter class. A number of events are | ||||
|      * fired when properties of the time conductor change, which are | ||||
|      * documented below. | ||||
|      * @constructor | ||||
|      */ | ||||
|     function TimeConductor() { | ||||
|         EventEmitter.call(this); | ||||
|  | ||||
|         //The Time System | ||||
|         this.system = undefined; | ||||
|         //The Time Of Interest | ||||
|         this.toi = undefined; | ||||
|  | ||||
|         this.boundsVal = { | ||||
|             start: undefined, | ||||
|             end: undefined | ||||
|         }; | ||||
|  | ||||
|         //Default to fixed mode | ||||
|         this.followMode = false; | ||||
|     } | ||||
|  | ||||
|     TimeConductor.prototype = Object.create(EventEmitter.prototype); | ||||
|  | ||||
|     /** | ||||
|      * Validate the given bounds. This can be used for pre-validation of | ||||
|      * bounds, for example by views validating user inputs. | ||||
|      * @param bounds The start and end time of the conductor. | ||||
|      * @returns {string | true} A validation error, or true if valid | ||||
|      */ | ||||
|     TimeConductor.prototype.validateBounds = function (bounds) { | ||||
|         if ((bounds.start === undefined) || | ||||
|             (bounds.end === undefined) || | ||||
|             isNaN(bounds.start) || | ||||
|             isNaN(bounds.end) | ||||
|         ) { | ||||
|             return "Start and end must be specified as integer values"; | ||||
|         } else if (bounds.start > bounds.end) { | ||||
|             return "Specified start date exceeds end bound"; | ||||
|         } | ||||
|         return true; | ||||
|     }; | ||||
|  | ||||
|     function throwOnError(validationResult) { | ||||
|         if (validationResult !== true) { | ||||
|             throw new Error(validationResult); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get or set the follow mode of the time conductor. In follow mode the | ||||
|      * time conductor ticks, regularly updating the bounds from a timing | ||||
|      * source appropriate to the selected time system and mode of the time | ||||
|      * conductor. | ||||
|      * @fires TimeConductor#follow | ||||
|      * @param {boolean} followMode | ||||
|      * @returns {boolean} | ||||
|      */ | ||||
|     TimeConductor.prototype.follow = function (followMode) { | ||||
|         if (arguments.length > 0) { | ||||
|             this.followMode = followMode; | ||||
|             /** | ||||
|              * @event TimeConductor#follow The TimeConductor has toggled | ||||
|              * into or out of follow mode. | ||||
|              * @property {boolean} followMode true if follow mode is | ||||
|              * enabled, otherwise false. | ||||
|              */ | ||||
|             this.emit('follow', this.followMode); | ||||
|         } | ||||
|         return this.followMode; | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * @typedef {Object} TimeConductorBounds | ||||
|      * @property {number} start The start time displayed by the time conductor in ms since epoch. Epoch determined by current time system | ||||
|      * @property {number} end The end time displayed by the time conductor in ms since epoch. | ||||
|      */ | ||||
|     /** | ||||
|      * Get or set the start and end time of the time conductor. Basic validation | ||||
|      * of bounds is performed. | ||||
|      * | ||||
|      * @param {TimeConductorBounds} newBounds | ||||
|      * @throws {Error} Validation error | ||||
|      * @fires TimeConductor#bounds | ||||
|      * @returns {TimeConductorBounds} | ||||
|      */ | ||||
|     TimeConductor.prototype.bounds = function (newBounds) { | ||||
|         if (arguments.length > 0) { | ||||
|             throwOnError(this.validateBounds(newBounds)); | ||||
|             //Create a copy to avoid direct mutation of conductor bounds | ||||
|             this.boundsVal = JSON.parse(JSON.stringify(newBounds)); | ||||
|             /** | ||||
|              * @event TimeConductor#bounds The start time, end time, or | ||||
|              * both have been updated | ||||
|              * @property {TimeConductorBounds} bounds | ||||
|              */ | ||||
|             this.emit('bounds', this.boundsVal); | ||||
|         } | ||||
|         //Return a copy to prevent direct mutation of time conductor bounds. | ||||
|         return JSON.parse(JSON.stringify(this.boundsVal)); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Get or set the time system of the TimeConductor. Time systems determine | ||||
|      * units, epoch, and other aspects of time representation. When changing | ||||
|      * the time system in use, new valid bounds must also be provided. | ||||
|      * @param {TimeSystem} newTimeSystem | ||||
|      * @param {TimeConductorBounds} bounds | ||||
|      * @fires TimeConductor#timeSystem | ||||
|      * @returns {TimeSystem} The currently applied time system | ||||
|      */ | ||||
|     TimeConductor.prototype.timeSystem = function (newTimeSystem, bounds) { | ||||
|         if (arguments.length >= 2) { | ||||
|             this.system = newTimeSystem; | ||||
|             /** | ||||
|              * @event TimeConductor#timeSystem The time system used by the time | ||||
|              * conductor has changed. A change in Time System will always be | ||||
|              * followed by a bounds event specifying new query bounds | ||||
|              * @property {TimeSystem} The value of the currently applied | ||||
|              * Time System | ||||
|              * */ | ||||
|             this.emit('timeSystem', this.system); | ||||
|             // Do something with bounds here. Try and convert between | ||||
|             // time systems? Or just set defaults when time system changes? | ||||
|             // eg. | ||||
|             this.bounds(bounds); | ||||
|         } else if (arguments.length === 1) { | ||||
|             throw new Error('Must set bounds when changing time system'); | ||||
|         } | ||||
|         return this.system; | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Get or set the Time of Interest. The Time of Interest is the temporal | ||||
|      * focus of the current view. It can be manipulated by the user from the | ||||
|      * time conductor or from other views. | ||||
|      * @fires TimeConductor#timeOfInterest | ||||
|      * @param newTOI | ||||
|      * @returns {number} the current time of interest | ||||
|      */ | ||||
|     TimeConductor.prototype.timeOfInterest = function (newTOI) { | ||||
|         if (arguments.length > 0) { | ||||
|             this.toi = newTOI; | ||||
|             /** | ||||
|              * @event TimeConductor#timeOfInterest The Time of Interest has moved. | ||||
|              * @property {number} Current time of interest | ||||
|              */ | ||||
|             this.emit('timeOfInterest', this.toi); | ||||
|         } | ||||
|         return this.toi; | ||||
|     }; | ||||
|  | ||||
|     return TimeConductor; | ||||
| }); | ||||
							
								
								
									
										110
									
								
								platform/features/conductor-v2/src/TimeConductorSpec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								platform/features/conductor-v2/src/TimeConductorSpec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define(['./TimeConductor'], function (TimeConductor) { | ||||
|     describe("The Time Conductor", function () { | ||||
|         var tc, | ||||
|             timeSystem, | ||||
|             bounds, | ||||
|             eventListener, | ||||
|             toi, | ||||
|             follow; | ||||
|  | ||||
|         beforeEach(function () { | ||||
|             tc = new TimeConductor(); | ||||
|             timeSystem = {}; | ||||
|             bounds = {start: 0, end: 0}; | ||||
|             eventListener = jasmine.createSpy("eventListener"); | ||||
|             toi = 111; | ||||
|             follow = true; | ||||
|         }); | ||||
|  | ||||
|         it("Supports setting and querying of time of interest and and follow mode", function () { | ||||
|             expect(tc.timeOfInterest()).not.toBe(toi); | ||||
|             tc.timeOfInterest(toi); | ||||
|             expect(tc.timeOfInterest()).toBe(toi); | ||||
|  | ||||
|             expect(tc.follow()).not.toBe(follow); | ||||
|             tc.follow(follow); | ||||
|             expect(tc.follow()).toBe(follow); | ||||
|         }); | ||||
|  | ||||
|         it("Allows setting of valid bounds", function () { | ||||
|             bounds = {start: 0, end: 1}; | ||||
|             expect(tc.bounds()).not.toBe(bounds); | ||||
|             expect(tc.bounds.bind(tc, bounds)).not.toThrow(); | ||||
|             expect(tc.bounds()).toBe(bounds); | ||||
|         }); | ||||
|  | ||||
|         it("Disallows setting of invalid bounds", function () { | ||||
|             bounds = {start: 1, end: 0}; | ||||
|             expect(tc.bounds()).not.toBe(bounds); | ||||
|             expect(tc.bounds.bind(tc, bounds)).toThrow(); | ||||
|             expect(tc.bounds()).not.toBe(bounds); | ||||
|  | ||||
|             bounds = {start: 1}; | ||||
|             expect(tc.bounds()).not.toBe(bounds); | ||||
|             expect(tc.bounds.bind(tc, bounds)).toThrow(); | ||||
|             expect(tc.bounds()).not.toBe(bounds); | ||||
|         }); | ||||
|  | ||||
|         it("Allows setting of time system with bounds", function () { | ||||
|             expect(tc.timeSystem()).not.toBe(timeSystem); | ||||
|             expect(tc.timeSystem.bind(tc, timeSystem, bounds)).not.toThrow(); | ||||
|             expect(tc.timeSystem()).toBe(timeSystem); | ||||
|         }); | ||||
|  | ||||
|         it("Disallows setting of time system without bounds", function () { | ||||
|             expect(tc.timeSystem()).not.toBe(timeSystem); | ||||
|             expect(tc.timeSystem.bind(tc, timeSystem)).toThrow(); | ||||
|             expect(tc.timeSystem()).not.toBe(timeSystem); | ||||
|         }); | ||||
|  | ||||
|         it("Emits an event when time system changes", function () { | ||||
|             expect(eventListener).not.toHaveBeenCalled(); | ||||
|             tc.on("timeSystem", eventListener); | ||||
|             tc.timeSystem(timeSystem, bounds); | ||||
|             expect(eventListener).toHaveBeenCalledWith(timeSystem); | ||||
|         }); | ||||
|  | ||||
|         it("Emits an event when time of interest changes", function () { | ||||
|             expect(eventListener).not.toHaveBeenCalled(); | ||||
|             tc.on("timeOfInterest", eventListener); | ||||
|             tc.timeOfInterest(toi); | ||||
|             expect(eventListener).toHaveBeenCalledWith(toi); | ||||
|         }); | ||||
|  | ||||
|         it("Emits an event when bounds change", function () { | ||||
|             expect(eventListener).not.toHaveBeenCalled(); | ||||
|             tc.on("bounds", eventListener); | ||||
|             tc.bounds(bounds); | ||||
|             expect(eventListener).toHaveBeenCalledWith(bounds); | ||||
|         }); | ||||
|  | ||||
|         it("Emits an event when follow mode changes", function () { | ||||
|             expect(eventListener).not.toHaveBeenCalled(); | ||||
|             tc.on("follow", eventListener); | ||||
|             tc.follow(follow); | ||||
|             expect(eventListener).toHaveBeenCalledWith(follow); | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
							
								
								
									
										92
									
								
								platform/features/conductor-v2/src/timeSystems/LocalClock.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								platform/features/conductor-v2/src/timeSystems/LocalClock.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define(['./TickSource'], function (TickSource) { | ||||
|     /** | ||||
|      * @implements TickSource | ||||
|      * @constructor | ||||
|      */ | ||||
|     function LocalClock ($timeout, period) { | ||||
|         TickSource.call(this); | ||||
|  | ||||
|         this.metadata = { | ||||
|             key: 'real-time', | ||||
|             glyph: '\u0043', | ||||
|             label: 'Real-time', | ||||
|             name: 'Real-time Mode', | ||||
|             description: 'Monitor real-time streaming data as it comes in. The Time Conductor and displays will automatically advance themselves based on a UTC clock.' | ||||
|         }; | ||||
|  | ||||
|         this.period = period; | ||||
|         this.$timeout = $timeout; | ||||
|         this.timeoutHandle = undefined; | ||||
|     } | ||||
|  | ||||
|     LocalClock.prototype = Object.create(TickSource.prototype); | ||||
|  | ||||
|     LocalClock.prototype.start = function () { | ||||
|         this.timeoutHandle = this.$timeout(this.tick.bind(this), this.period); | ||||
|     }; | ||||
|  | ||||
|     LocalClock.prototype.stop = function () { | ||||
|         if (this.timeoutHandle) { | ||||
|             this.$timeout.cancel(this.timeoutHandle); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     LocalClock.prototype.tick = function () { | ||||
|         var now = Date.now(); | ||||
|         this.listeners.forEach(function (listener){ | ||||
|             listener(now); | ||||
|         }); | ||||
|         this.timeoutHandle = this.$timeout(this.tick.bind(this), this.period); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Register a listener for the local clock. When it ticks, the local | ||||
|      * clock will provide the current local system time | ||||
|      * | ||||
|      * @param listener | ||||
|      * @returns {function} a function for deregistering the provided listener | ||||
|      */ | ||||
|     LocalClock.prototype.listen = function (listener) { | ||||
|         var listeners = this.listeners; | ||||
|         listeners.push(listener); | ||||
|  | ||||
|         if (listeners.length === 1){ | ||||
|             this.start(); | ||||
|         } | ||||
|  | ||||
|         return function () { | ||||
|             listeners.splice(listeners.indexOf(listener)); | ||||
|             if (listeners.length === 0) { | ||||
|                 this.stop(); | ||||
|             } | ||||
|         }.bind(this); | ||||
|     }; | ||||
|  | ||||
|     LocalClock.prototype.type = function () { | ||||
|         return 'clock'; | ||||
|     }; | ||||
|  | ||||
|     return LocalClock; | ||||
| }); | ||||
							
								
								
									
										54
									
								
								platform/features/conductor-v2/src/timeSystems/TickSource.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								platform/features/conductor-v2/src/timeSystems/TickSource.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([], function () { | ||||
|     /** | ||||
|      * A tick source is a timing of timing signals. Usage is simple, a | ||||
|      * listener registers a callback which is invoked when this source 'ticks'. | ||||
|      * | ||||
|      * @interface | ||||
|      * @constructor | ||||
|      */ | ||||
|     function TickSource () { | ||||
|         this.listeners = []; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param callback Function to be called when this tick source ticks. | ||||
|      * @returns an 'unlisten' function that will remove the callback from | ||||
|      * the registered listeners | ||||
|      */ | ||||
|     TickSource.prototype.listen = function (callback) { | ||||
|         throw new Error('Not implemented'); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * What does this source tick on? A clock, or data availability. | ||||
|      * Information is required to support time conductor modes. | ||||
|      * @returns {string} type One of 'clock' or 'data' | ||||
|      */ | ||||
|     TickSource.prototype.type = function () { | ||||
|         throw new Error('Not implemented'); | ||||
|     } | ||||
|  | ||||
|     return TickSource; | ||||
| }); | ||||
							
								
								
									
										59
									
								
								platform/features/conductor-v2/src/timeSystems/TimeSystem.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								platform/features/conductor-v2/src/timeSystems/TimeSystem.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([], function () { | ||||
|     /** | ||||
|      * @interface | ||||
|      * @constructor | ||||
|      */ | ||||
|     function TimeSystem () { | ||||
|         /** | ||||
|          * @typedef TimeSystemMetadata | ||||
|          * @property {string} key | ||||
|          * @property {string} name | ||||
|          * @property {string} description | ||||
|          * | ||||
|          * @type {TimeSystemMetadata} | ||||
|          */ | ||||
|         this.metadata = undefined; | ||||
|         this._tickSources = []; | ||||
|     } | ||||
|  | ||||
|     TimeSystem.prototype.formats = function () { | ||||
|         throw new Error('Not implemented'); | ||||
|     }; | ||||
|  | ||||
|     TimeSystem.prototype.tickSources = function () { | ||||
|         throw new Error('Not implemented'); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @returns {TimeSystemDefault[]} At least one set of default values for | ||||
|      * this time system. | ||||
|      */ | ||||
|     TimeSystem.prototype.defaults = function () { | ||||
|         throw new Error('Not implemented'); | ||||
|     }; | ||||
|  | ||||
|     return TimeSystem; | ||||
| }); | ||||
| @@ -0,0 +1,78 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define([ | ||||
|     './TimeSystem', | ||||
|     './LocalClock' | ||||
| ], function (TimeSystem, LocalClock, UTCTimeFormat) { | ||||
|     var FIFTEEN_MINUTES = 15 * 60 * 1000, | ||||
|         DEFAULT_PERIOD = 1000; | ||||
|  | ||||
|     /** | ||||
|      * This time system supports UTC dates and provides a ticking clock source. | ||||
|      * @implements TimeSystem | ||||
|      * @constructor | ||||
|      */ | ||||
|     function UTCTimeSystem ($timeout) { | ||||
|         TimeSystem.call(this); | ||||
|  | ||||
|         /** | ||||
|          * Some metadata, which will be used to identify the time system in | ||||
|          * the UI | ||||
|          * @type {{key: string, name: string, glyph: string}} | ||||
|          */ | ||||
|         this.metadata = { | ||||
|             'key': 'utc', | ||||
|             'name': 'UTC', | ||||
|             'glyph': '\u0043' | ||||
|         }; | ||||
|  | ||||
|         //Time formats are defined as extensions. Include the key | ||||
|         // for the corresponding time format here | ||||
|         this._formats = ['utc']; | ||||
|         this._tickSources = [new LocalClock($timeout, DEFAULT_PERIOD)]; | ||||
|     } | ||||
|  | ||||
|     UTCTimeSystem.prototype = Object.create(TimeSystem.prototype); | ||||
|  | ||||
|     UTCTimeSystem.prototype.formats = function () { | ||||
|         return this._formats; | ||||
|     }; | ||||
|  | ||||
|     UTCTimeSystem.prototype.tickSources = function () { | ||||
|         return this._tickSources; | ||||
|     }; | ||||
|  | ||||
|     UTCTimeSystem.prototype.defaults = function () { | ||||
|         var now = Math.ceil(Date.now() / 1000) * 1000; | ||||
|         return [ | ||||
|             { | ||||
|                 key: 'utc-default', | ||||
|                 name: 'UTC time system defaults', | ||||
|                 deltas: {start: FIFTEEN_MINUTES, end: 0}, | ||||
|                 bounds: {start: now - FIFTEEN_MINUTES, end: now} | ||||
|             } | ||||
|         ]; | ||||
|     }; | ||||
|  | ||||
|     return UTCTimeSystem; | ||||
| }); | ||||
							
								
								
									
										89
									
								
								platform/features/conductor-v2/src/ui/MctConductorAxis.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								platform/features/conductor-v2/src/ui/MctConductorAxis.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [ | ||||
|         "zepto", | ||||
|         "d3" | ||||
|     ], | ||||
|     function ($, d3) { | ||||
|  | ||||
|         /** | ||||
|          * The mct-conductor-axis renders a horizontal axis with regular | ||||
|          * labelled 'ticks'. It requires 'start' and 'end' integer values to | ||||
|          * be specified as attributes. | ||||
|          */ | ||||
|         function MCTConductorAxis(conductor) { | ||||
|  | ||||
|             function link(scope, element, attrs, ngModelController) { | ||||
|                 var target = element[0].firstChild, | ||||
|                     height = target.offsetHeight, | ||||
|                     padding = 1; | ||||
|  | ||||
|                 var vis = d3.select(target) | ||||
|                             .append('svg:svg') | ||||
|                             .attr('width', '100%') | ||||
|                             .attr('height', height); | ||||
|                 var xScale = d3.scaleUtc(); | ||||
|                 var xAxis = d3.axisTop(); | ||||
|                 // draw x axis with labels and move to the bottom of the chart area | ||||
|                 var axisElement = vis.append("g") | ||||
|                     .attr("transform", "translate(0," + (height - padding) + ")"); | ||||
|  | ||||
|                 function setScale(start, end) { | ||||
|                     var width = target.offsetWidth; | ||||
|                     xScale.domain([new Date(start), new Date(end)]) | ||||
|                         .range([padding, width - padding * 2]); | ||||
|                     xAxis.scale(xScale); | ||||
|                     axisElement.call(xAxis); | ||||
|                 } | ||||
|  | ||||
|                 scope.resize = function () { | ||||
|                     setScale(conductor.bounds().start, conductor.bounds().end); | ||||
|                 }; | ||||
|  | ||||
|                 //On conductor bounds changes, redraw ticks | ||||
|                 conductor.on('bounds', function (bounds) { | ||||
|                     setScale(bounds.start, bounds.end); | ||||
|                 }); | ||||
|  | ||||
|                 //Set initial scale. | ||||
|                 setScale(conductor.bounds().start, conductor.bounds().end); | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|                 // Only show at the element level | ||||
|                 restrict: "E", | ||||
|  | ||||
|                 template: "<div class=\"l-axis-holder\" mct-resize=\"resize()\"></div>", | ||||
|  | ||||
|                 // ngOptions is terminal, so we need to be higher priority | ||||
|                 priority: 1000, | ||||
|  | ||||
|                 // Link function | ||||
|                 link: link | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         return MCTConductorAxis; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										223
									
								
								platform/features/conductor-v2/src/ui/TimeConductorController.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								platform/features/conductor-v2/src/ui/TimeConductorController.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [ | ||||
|         './modes/FixedMode', | ||||
|         './modes/RealtimeMode', | ||||
|         './modes/LADMode', | ||||
|         './TimeConductorValidation' | ||||
|     ], | ||||
|     function (FixedMode, RealtimeMode, LADMode, TimeConductorValidation) { | ||||
|  | ||||
|         function TimeConductorController($scope, conductor, timeSystems) { | ||||
|  | ||||
|             var self = this; | ||||
|  | ||||
|             //Bind all class functions to 'this' | ||||
|             Object.keys(TimeConductorController.prototype).filter(function (key) { | ||||
|                 return typeof TimeConductorController.prototype[key] === 'function'; | ||||
|             }).forEach(function (key) { | ||||
|                 self[key] = self[key].bind(self); | ||||
|             }); | ||||
|  | ||||
|             this.conductor = conductor; | ||||
|             // Construct the provided time system definitions | ||||
|             this.timeSystems = timeSystems.map(function (timeSystemConstructor){ | ||||
|                 return timeSystemConstructor(); | ||||
|             }); | ||||
|             // Populate a list of modes supported by the time conductor | ||||
|             this.modes = [ | ||||
|                 new FixedMode(this.conductor, this.timeSystems), | ||||
|                 new RealtimeMode(this.conductor, this.timeSystems), | ||||
|                 new LADMode(this.conductor, this.timeSystems) | ||||
|             ]; | ||||
|  | ||||
|             this.validation = new TimeConductorValidation(conductor); | ||||
|             this.$scope = $scope; | ||||
|             this.initializeScope($scope); | ||||
|  | ||||
|             conductor.on('bounds', this.setBounds); | ||||
|             conductor.on('follow', function (follow){ | ||||
|                 $scope.followMode = follow; | ||||
|             }); | ||||
|  | ||||
|             //Set the time conductor mode to the first one in the list, | ||||
|             // effectively initializing the time conductor | ||||
|             this.setMode(this.modes[0]); | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          */ | ||||
|         TimeConductorController.prototype.initializeScope = function ($scope) { | ||||
|             $scope.timeSystemModel = { | ||||
|                 selected: undefined, | ||||
|                 format: undefined, | ||||
|                 options: [] | ||||
|             }; | ||||
|             $scope.modeModel = { | ||||
|                 selected: undefined, | ||||
|                 options: this.modes | ||||
|             }; | ||||
|             $scope.formModel = { | ||||
|                 start: 0, | ||||
|                 end: 0 | ||||
|             }; | ||||
|             $scope.changing = { | ||||
|                 'start': false, | ||||
|                 'end': false | ||||
|             }; | ||||
|  | ||||
|             $scope.$watch('modeModel.selected', this.setMode); | ||||
|             $scope.$watch('timeSystem', this.setTimeSystem); | ||||
|  | ||||
|             $scope.$on('$destroy', function() { | ||||
|                 var mode = $scope.modeModel.selected; | ||||
|                 if (mode && mode.destroy) { | ||||
|                     mode.destroy(); | ||||
|                 } | ||||
|             }); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Called when the bounds change in the time conductor. Synchronizes | ||||
|          * the bounds values in the time conductor with those in the form | ||||
|          * @param bounds | ||||
|          */ | ||||
|         TimeConductorController.prototype.setBounds = function (bounds) { | ||||
|             if (!this.$scope.changing['start']) { | ||||
|                 this.$scope.formModel.start = bounds.start; | ||||
|             } | ||||
|             if (!this.$scope.changing['end']) { | ||||
|                 this.$scope.formModel.end = bounds.end; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Called when form values are changed. Synchronizes the form with | ||||
|          * the time conductor | ||||
|          * @param formModel | ||||
|          */ | ||||
|         TimeConductorController.prototype.updateBoundsFromForm = function (formModel) { | ||||
|             var newBounds = {start: formModel.start, end: formModel.end}; | ||||
|  | ||||
|             if (this.conductor.validateBounds(newBounds) === true) { | ||||
|                 this.conductor.bounds(newBounds); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Called when the delta values in the form change. Validates and | ||||
|          * sets the new deltas on the Mode. | ||||
|          * @param formModel | ||||
|          * @see TimeConductorMode | ||||
|          */ | ||||
|         TimeConductorController.prototype.updateDeltasFromForm = function (formModel) { | ||||
|             var mode = this.$scope.modeModel.selected, | ||||
|                 deltas = mode.deltas(); | ||||
|  | ||||
|             if (deltas !== undefined && this.validation.validateDeltas(formModel)) { | ||||
|                 //Sychronize deltas between form and mode | ||||
|                 mode.deltas({start: formModel.startDelta, end: formModel.endDelta}); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Change the selected Time Conductor mode. This will call destroy | ||||
|          * and initialization functions on the relevant modes, setting | ||||
|          * default values for bound and deltas in the form. | ||||
|          * @param newMode | ||||
|          * @param oldMode | ||||
|          */ | ||||
|         TimeConductorController.prototype.setMode = function (newMode, oldMode) { | ||||
|             if (newMode !== oldMode) { | ||||
|                 if (oldMode && oldMode.destroy) { | ||||
|                     oldMode.destroy(); | ||||
|                 } | ||||
|                 newMode.initialize(); | ||||
|  | ||||
|                 var timeSystem = newMode.selectedTimeSystem(); | ||||
|  | ||||
|                 this.$scope.modeModel.selected = newMode; | ||||
|  | ||||
|                 //Synchronize scope with time system on mode | ||||
|                 this.$scope.timeSystemModel.options = newMode.timeSystems().map(function (timeSystem) { | ||||
|                     return timeSystem.metadata; | ||||
|                 }); | ||||
|                 this.$scope.timeSystemModel.selected = timeSystem; | ||||
|                 //Use default format | ||||
|                 this.$scope.timeSystemModel.format = timeSystem.formats()[0]; | ||||
|                 this.setDefaultsFromTimeSystem(newMode.selectedTimeSystem()); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          */ | ||||
|         TimeConductorController.prototype.setDefaultsFromTimeSystem = function (timeSystem) { | ||||
|             var defaults = timeSystem.defaults()[0]; | ||||
|             var deltas = defaults.deltas; | ||||
|  | ||||
|             /* | ||||
|              * If the selected mode defines deltas, set them in the form | ||||
|              */ | ||||
|             if (deltas !== undefined) { | ||||
|                 this.$scope.formModel.startDelta = deltas.start; | ||||
|                 this.$scope.formModel.endDelta = deltas.end; | ||||
|             } else { | ||||
|                 this.$scope.formModel.startDelta = 0; | ||||
|                 this.$scope.formModel.endDelta = 0; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Allows time system to be changed by key. This supports selection | ||||
|          * from the menu. Resolves a TimeSystem object and then invokes | ||||
|          * TimeConductorController#setTimeSystem | ||||
|          * @param key | ||||
|          * @see TimeConductorController#setTimeSystem | ||||
|          */ | ||||
|         TimeConductorController.prototype.selectTimeSystem = function(key){ | ||||
|             var selected = this.timeSystems.find(function (timeSystem){ | ||||
|                 return timeSystem.metadata.key === key; | ||||
|             }); | ||||
|             this.setTimeSystem(selected); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Sets the selected time system. Will populate form with the default | ||||
|          * bounds and deltas defined in the selected time system. | ||||
|          * @param newTimeSystem | ||||
|          */ | ||||
|         TimeConductorController.prototype.setTimeSystem = function (newTimeSystem) { | ||||
|             if (newTimeSystem && newTimeSystem !== this.$scope.timeSystemModel.selected) { | ||||
|                 this.$scope.timeSystemModel.selected = newTimeSystem; | ||||
|                 var mode = this.$scope.modeModel.selected; | ||||
|                 mode.selectedTimeSystem(newTimeSystem); | ||||
|                 this.setDefaultsFromTimeSystem(newTimeSystem); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         return TimeConductorController; | ||||
|     } | ||||
| ); | ||||
| @@ -0,0 +1,79 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|  | ||||
|         /** | ||||
|          * Form validation for the TimeConductorController. | ||||
|          * @param conductor | ||||
|          * @constructor | ||||
|          */ | ||||
|         function TimeConductorValidation(conductor) { | ||||
|             var self = this; | ||||
|             this.conductor = conductor | ||||
|  | ||||
|             /* | ||||
|              * Bind all class functions to 'this' | ||||
|              */ | ||||
|             Object.keys(TimeConductorValidation.prototype).filter(function (key) { | ||||
|                 return typeof TimeConductorValidation.prototype[key] === 'function'; | ||||
|             }).forEach(function (key) { | ||||
|                 self[key] = self[key].bind(self); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         TimeConductorValidation.prototype.validateStart = function (start) { | ||||
|             var bounds = this.conductor.bounds(); | ||||
|             return this.conductor.validateBounds({start: start, end: bounds.end}) === true; | ||||
|         }; | ||||
|  | ||||
|         TimeConductorValidation.prototype.validateEnd = function (end) { | ||||
|             var bounds = this.conductor.bounds(); | ||||
|             return this.conductor.validateBounds({start: bounds.start, end: end}) === true; | ||||
|         }; | ||||
|  | ||||
|         TimeConductorValidation.prototype.validateStartDelta = function (startDelta) { | ||||
|             return startDelta > 0; | ||||
|         }; | ||||
|  | ||||
|         TimeConductorValidation.prototype.validateEndDelta = function (endDelta) { | ||||
|             return endDelta >= 0; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Validates the delta values in the form model. Deltas are offsets | ||||
|          * from a fixed point in time, and are used in follow modes as the | ||||
|          * primary determinant of conductor bounds. | ||||
|          * @param formModel | ||||
|          * @returns {*} | ||||
|          */ | ||||
|         TimeConductorValidation.prototype.validateDeltas = function (formModel) { | ||||
|             // Validate that start Delta is some non-zero value, and that end | ||||
|             // delta is zero or positive (ie. 'now' or some time in the future). | ||||
|             return this.validateStartDelta(formModel.startDelta) && this.validateEndDelta(formModel.endDelta); | ||||
|         }; | ||||
|  | ||||
|         return TimeConductorValidation; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										78
									
								
								platform/features/conductor-v2/src/ui/modes/FixedMode.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								platform/features/conductor-v2/src/ui/modes/FixedMode.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ['./TimeConductorMode'], | ||||
|     function (TimeConductorMode) { | ||||
|  | ||||
|         /** | ||||
|          * Handles time conductor behavior when it is in 'fixed' mode. In | ||||
|          * fixed mode, the time conductor is bound by two dates and does not | ||||
|          * progress. | ||||
|          * @param conductor | ||||
|          * @param timeSystems | ||||
|          * @constructor | ||||
|          */ | ||||
|         function FixedMode(conductor, timeSystems) { | ||||
|             var metadata = { | ||||
|                 key: 'fixed', | ||||
|                 glyph: '\ue604', | ||||
|                 label: 'Fixed', | ||||
|                 name: 'Fixed Timespan Mode', | ||||
|                 description: 'Query and explore data that falls between two fixed datetimes.' | ||||
|             }; | ||||
|  | ||||
|             TimeConductorMode.call(this, metadata, conductor, timeSystems); | ||||
|         } | ||||
|  | ||||
|         FixedMode.prototype = Object.create(TimeConductorMode.prototype); | ||||
|  | ||||
|         FixedMode.prototype.initialize = function () { | ||||
|             TimeConductorMode.prototype.initialize.apply(this); | ||||
|             this.conductor.follow(false); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Defines behavior to occur when selected time system changes. In | ||||
|          * this case, sets default bounds on the time conductor. | ||||
|          * @param timeSystem | ||||
|          * @returns {*} | ||||
|          */ | ||||
|         FixedMode.prototype.selectedTimeSystem = function (timeSystem){ | ||||
|             TimeConductorMode.prototype.selectedTimeSystem.apply(this, arguments); | ||||
|  | ||||
|             if (timeSystem) { | ||||
|                 var defaults = timeSystem.defaults()[0]; | ||||
|  | ||||
|                 var bounds = { | ||||
|                     start: defaults.bounds.start, | ||||
|                     end: defaults.bounds.end | ||||
|                 }; | ||||
|  | ||||
|                 this.conductor.timeSystem(timeSystem, bounds); | ||||
|             } | ||||
|             return this._selectedTimeSystem; | ||||
|         }; | ||||
|  | ||||
|         return FixedMode; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										147
									
								
								platform/features/conductor-v2/src/ui/modes/FollowMode.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								platform/features/conductor-v2/src/ui/modes/FollowMode.js
									
									
									
									
									
										Normal 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. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ['./TimeConductorMode'], | ||||
|     function (TimeConductorMode) { | ||||
|  | ||||
|         /** | ||||
|          * A parent class for Realtime and LAD modes, which both advance the | ||||
|          * time conductor bounds over time. The event that advances the time | ||||
|          * conductor is abstracted to a TickSource. Unlike FixedMode, the | ||||
|          * two 'follow' modes define 'deltas' which are offsets from a fixed | ||||
|          * end point. Thus, in follow mode, the end time of the conductor is | ||||
|          * the mode relevant, with both offsets defined relative to it. | ||||
|          * @constructor | ||||
|          */ | ||||
|         function FollowMode(metadata, conductor, timeSystems) { | ||||
|             TimeConductorMode.call(this, metadata, conductor, timeSystems); | ||||
|  | ||||
|             this._deltas = undefined; | ||||
|         } | ||||
|  | ||||
|         FollowMode.prototype = Object.create(TimeConductorMode.prototype); | ||||
|  | ||||
|         FollowMode.prototype.initialize = function () { | ||||
|             TimeConductorMode.prototype.initialize.apply(this); | ||||
|             this.conductor.follow(true); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          * @param time | ||||
|          */ | ||||
|         FollowMode.prototype.tick = function (time) { | ||||
|             var deltas = this.deltas(); | ||||
|             this.conductor.bounds({ | ||||
|                 start: time - deltas.start, | ||||
|                 end: time + deltas.end | ||||
|             }); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          * @param tickSource | ||||
|          */ | ||||
|         FollowMode.prototype.listenToTickSource = function () { | ||||
|             if (this._selectedTimeSystem && | ||||
|                 this._timeSystems[0]) { | ||||
|  | ||||
|                 var tickSource = this._timeSystems[0].tickSources()[0]; | ||||
|                 if (tickSource) { | ||||
|                     this.tickSourceUnlisten = tickSource.listen(this.tick.bind(this)); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * On time system change, default the bounds values in the time | ||||
|          * conductor, using the deltas associated with this mode. | ||||
|          * @param timeSystem | ||||
|          * @returns {TimeSystem} | ||||
|          */ | ||||
|         FollowMode.prototype.selectedTimeSystem = function (timeSystem) { | ||||
|             TimeConductorMode.prototype.selectedTimeSystem.apply(this, arguments); | ||||
|  | ||||
|             if (timeSystem) { | ||||
|                 var defaults = timeSystem.defaults()[0]; | ||||
|  | ||||
|                 if (arguments.length > 0) { | ||||
|                     var bounds = { | ||||
|                         start: defaults.bounds.start, | ||||
|                         end: defaults.bounds.end | ||||
|                     }; | ||||
|  | ||||
|                     if (defaults.deltas) { | ||||
|                         bounds.start = bounds.end - defaults.deltas.start; | ||||
|                         bounds.end = bounds.end + defaults.deltas.end; | ||||
|                         this._deltas = JSON.parse(JSON.stringify(defaults.deltas)); | ||||
|                     } | ||||
|  | ||||
|                     this.conductor.timeSystem(timeSystem, bounds); | ||||
|  | ||||
|                     this.listenToTickSource(); | ||||
|                 } | ||||
|             } | ||||
|             return this._selectedTimeSystem; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Get or set the current value for the deltas used by this time system. | ||||
|          * On change, the new deltas will be used to calculate and set the | ||||
|          * bounds on the time conductor. | ||||
|          * @param deltas | ||||
|          * @returns {TimeSystemDeltas} | ||||
|          */ | ||||
|         FollowMode.prototype.deltas = function (deltas) { | ||||
|             if (arguments.length !== 0) { | ||||
|                 var oldEnd = this.conductor.bounds().end; | ||||
|  | ||||
|                 if (this._deltas && this._deltas.end){ | ||||
|                     //Calculate the previous 'true' end value (without delta) | ||||
|                     oldEnd = oldEnd - this._deltas.end; | ||||
|                 } | ||||
|  | ||||
|                 this._deltas = deltas; | ||||
|  | ||||
|                 var newBounds = { | ||||
|                     start: oldEnd - this._deltas.start, | ||||
|                     end: oldEnd + this._deltas.end | ||||
|                 }; | ||||
|  | ||||
|                 this.conductor.bounds(newBounds); | ||||
|             } | ||||
|             return this._deltas; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Stop listening to tick sources | ||||
|          */ | ||||
|         FollowMode.prototype.destroy = function () { | ||||
|             if (this.tickSourceUnlisten) { | ||||
|                 this.tickSourceUnlisten(); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         return FollowMode; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										56
									
								
								platform/features/conductor-v2/src/ui/modes/LADMode.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								platform/features/conductor-v2/src/ui/modes/LADMode.js
									
									
									
									
									
										Normal 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. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ['./FollowMode'], | ||||
|     function (FollowMode) { | ||||
|  | ||||
|         /** | ||||
|          * Supports the 'Latest Available Data' mode of the time conductor. | ||||
|          * This is a special case of FollowMode that advances on 'data' type | ||||
|          * tick sources. | ||||
|          * @param conductor | ||||
|          * @param timeSystems | ||||
|          * @constructor | ||||
|          */ | ||||
|         function LADMode(conductor, timeSystems) { | ||||
|             var metadata = { | ||||
|                 key: 'latest', | ||||
|                 glyph: '\u0044', | ||||
|                 label: 'LAD', | ||||
|                 name: 'LAD Mode', | ||||
|                 description: 'Latest Available Data mode monitors real-time streaming data as it comes in. The Time Conductor and displays will only advance when data becomes available.' | ||||
|             }; | ||||
|             var filteredTimeSystems = timeSystems.filter(function (timeSystem){ | ||||
|                 return timeSystem.tickSources().some(function (tickSource){ | ||||
|                     return tickSource.type() === 'data'; | ||||
|                 }); | ||||
|             }); | ||||
|  | ||||
|             FollowMode.call(this, metadata, conductor, filteredTimeSystems); | ||||
|         } | ||||
|  | ||||
|         LADMode.prototype = Object.create(FollowMode.prototype); | ||||
|  | ||||
|         return LADMode; | ||||
|     } | ||||
| ); | ||||
							
								
								
									
										55
									
								
								platform/features/conductor-v2/src/ui/modes/RealtimeMode.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								platform/features/conductor-v2/src/ui/modes/RealtimeMode.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ['./FollowMode'], | ||||
|     function (FollowMode) { | ||||
|  | ||||
|         /** | ||||
|          * Class representing the 'realtime' mode of the time conductor. | ||||
|          * This is a special case of FollowMode that only supports 'clock' | ||||
|          * type tick sources. | ||||
|          * @param conductor | ||||
|          * @param timeSystems | ||||
|          * @constructor | ||||
|          */ | ||||
|         function RealtimeMode(conductor, timeSystems) { | ||||
|             var metadata = { | ||||
|                 key: 'realtime', | ||||
|                 glyph: '\u0043', | ||||
|                 label: 'Real-time', | ||||
|                 name: 'Real-time Mode', | ||||
|                 description: 'Monitor real-time streaming data as it comes in. The Time Conductor and displays will automatically advance themselves based on a UTC clock.' | ||||
|             }; | ||||
|             var filteredTimeSystems = timeSystems.filter(function (timeSystem){ | ||||
|                 return timeSystem.tickSources().some(function (tickSource){ | ||||
|                     return tickSource.type() === 'clock'; | ||||
|                 }); | ||||
|             }); | ||||
|             FollowMode.call(this, metadata, conductor, filteredTimeSystems); | ||||
|         } | ||||
|  | ||||
|         RealtimeMode.prototype = Object.create(FollowMode.prototype); | ||||
|  | ||||
|         return RealtimeMode; | ||||
|     } | ||||
| ); | ||||
| @@ -0,0 +1,82 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT Web, Copyright (c) 2014-2015, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT Web is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT Web includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|  | ||||
|         /** | ||||
|          * Supports mode-specific time conductor behavior. This class | ||||
|          * defines a parent with default behavior that specific modes are | ||||
|          * expected to override. | ||||
|          * | ||||
|          * @interface | ||||
|          * @constructor | ||||
|          * @param {TimeConductorMetadata} metadata | ||||
|          */ | ||||
|         function TimeConductorMode(metadata, conductor, timeSystems) { | ||||
|             this.metadata = metadata; | ||||
|  | ||||
|             this.conductor = conductor; | ||||
|             this._timeSystems = timeSystems; | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Function is called when mode becomes active (ie. is selected) | ||||
|          */ | ||||
|         TimeConductorMode.prototype.initialize = function () { | ||||
|             this.selectedTimeSystem(this._timeSystems[0]); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Return the time systems supported by this mode. Modes are | ||||
|          * expected to determine which time systems they will support by | ||||
|          * filtering a provided list of all time systems. | ||||
|          * | ||||
|          * @returns {TimeSystem[]} The time systems supported by this mode | ||||
|          */ | ||||
|         TimeConductorMode.prototype.timeSystems = function () { | ||||
|             return this._timeSystems; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Get or set the currently selected time system | ||||
|          * @param timeSystem | ||||
|          * @returns {TimeSystem} the currently selected time system | ||||
|          */ | ||||
|         TimeConductorMode.prototype.selectedTimeSystem = function (timeSystem) { | ||||
|             if (arguments.length > 0) { | ||||
|                 if (this._timeSystems.indexOf(timeSystem) === -1){ | ||||
|                     throw new Error("Unsupported time system"); | ||||
|                 } else { | ||||
|                     this._selectedTimeSystem = timeSystem; | ||||
|                 } | ||||
|             } | ||||
|             return this._selectedTimeSystem; | ||||
|         }; | ||||
|  | ||||
|         TimeConductorMode.prototype.destroy = function () { | ||||
|         }; | ||||
|  | ||||
|         return TimeConductorMode; | ||||
|     } | ||||
| ); | ||||
| @@ -47,6 +47,11 @@ define([ | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "stylesheets": [ | ||||
|                 { | ||||
|                     "stylesheetUrl": "css/time-conductor.css" | ||||
|                 } | ||||
|             ], | ||||
|             "components": [ | ||||
|                 { | ||||
|                     "type": "decorator", | ||||
|   | ||||
							
								
								
									
										300
									
								
								platform/features/conductor/res/sass/time-conductor.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										300
									
								
								platform/features/conductor/res/sass/time-conductor.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,300 @@ | ||||
| /***************************************************************************** | ||||
|  * 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 "bourbon"; | ||||
|  | ||||
| @import "../../../../commonUI/general/res/sass/constants"; | ||||
| @import "../../../../commonUI/general/res/sass/mixins"; | ||||
| @import "../../../../commonUI/general/res/sass/mobile/constants"; | ||||
| @import "../../../../commonUI/general/res/sass/mobile/mixins"; | ||||
| @import "../../../../commonUI/themes/espresso/res/sass/constants"; | ||||
| @import "../../../../commonUI/themes/espresso/res/sass/mixins"; | ||||
|  | ||||
| $ueTimeConductorH: (33px, 18px, 20px); | ||||
|  | ||||
| @mixin toiLineHovEffects() { | ||||
|     &:before, | ||||
|     &:after { | ||||
|         background-color: $timeControllerToiLineColorHov; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .l-time-controller { | ||||
|     $minW: 500px; | ||||
|     $knobHOffset: 0px; | ||||
|     $knobM: ($sliderKnobW + $knobHOffset) * -1; | ||||
|     $rangeValPad: $interiorMargin; | ||||
|     $rangeValOffset: $sliderKnobW + $interiorMargin; | ||||
|     $timeRangeSliderLROffset: 150px + ($sliderKnobW * 2); | ||||
|     $r1H: nth($ueTimeConductorH,1); | ||||
|     $r2H: nth($ueTimeConductorH,2); | ||||
|     $r3H: nth($ueTimeConductorH,3); | ||||
|  | ||||
|     min-width: $minW; | ||||
|     font-size: 0.8rem; | ||||
|  | ||||
|     .l-time-range-inputs-holder, | ||||
|     .l-time-range-slider-holder, | ||||
|     .l-time-range-ticks-holder | ||||
|     { | ||||
|         box-sizing: border-box; | ||||
|         position: relative; | ||||
|         &:not(:first-child) { | ||||
|             margin-top: $interiorMargin; | ||||
|         } | ||||
|     } | ||||
|     .l-time-range-slider, | ||||
|     .l-time-range-ticks { | ||||
|         @include absPosDefault(0, visible); | ||||
|         left: $timeRangeSliderLROffset; right: $timeRangeSliderLROffset; | ||||
|     } | ||||
|  | ||||
|     .l-time-range-inputs-holder { | ||||
|         border-top: 1px solid $colorInteriorBorder; | ||||
|         padding-top: $interiorMargin; | ||||
|         &.l-flex-row, | ||||
|         .l-flex-row { | ||||
|             @include align-items(center); | ||||
|             .flex-elem { | ||||
|                 height: auto; | ||||
|                 line-height: normal; | ||||
|             } | ||||
|         } | ||||
|         .type-icon { | ||||
|             font-size: 120%; | ||||
|             vertical-align: middle; | ||||
|         } | ||||
|         .l-time-range-input-w, | ||||
|         .l-time-range-inputs-elem { | ||||
|             margin-right: $interiorMargin; | ||||
|             .lbl { | ||||
|                 color: $colorPlotLabelFg; | ||||
|             } | ||||
|             .ui-symbol.icon { | ||||
|                 font-size: 11px; | ||||
|             } | ||||
|         } | ||||
|         .l-time-range-input-w { | ||||
|             // Wraps a datetime text input field | ||||
|             position: relative; | ||||
|             input[type="text"] { | ||||
|                 width: 200px; | ||||
|                 &.picker-icon { | ||||
|                     padding-right: 20px; | ||||
|                 } | ||||
|             } | ||||
|             .icon-calendar { | ||||
|                 position: absolute; | ||||
|                 right: 5px; | ||||
|                 top: 5px; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .l-time-range-slider-holder { | ||||
|         height: $r2H; | ||||
|         .range-holder { | ||||
|             box-shadow: none; | ||||
|             background: none; | ||||
|             border: none; | ||||
|             .range { | ||||
|                 .toi-line { | ||||
|                     $myC: $timeControllerToiLineColor; | ||||
|                     $myW: 8px; | ||||
|                     @include transform(translateX(50%)); | ||||
|                     position: absolute; | ||||
|                     top: 0; right: 0; bottom: 0px; left: auto; | ||||
|                     width: $myW; | ||||
|                     height: auto; | ||||
|                     z-index: 2; | ||||
|                     &:before { | ||||
|                         // Vert line | ||||
|                         background-color: $myC; | ||||
|                         position: absolute; | ||||
|                         content: ""; | ||||
|                         top: 0; right: auto; bottom: -10px; left: floor($myW/2) - 1; | ||||
|                         width: 1px; | ||||
|                     } | ||||
|                 } | ||||
|                 &:hover .toi-line { | ||||
|                     @include toiLineHovEffects; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         &:not(:active) { | ||||
|             .knob, | ||||
|             .range { | ||||
|                 @include transition-property(left, right); | ||||
|                 @include transition-duration(500ms); | ||||
|                 @include transition-timing-function(ease-in-out); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .l-time-range-ticks-holder { | ||||
|         height: $r3H; | ||||
|         .l-time-range-ticks { | ||||
|             border-top: 1px solid $colorTick; | ||||
|             .tick { | ||||
|                 background-color: $colorTick; | ||||
|                 border:none; | ||||
|                 height: 5px; | ||||
|                 width: 1px; | ||||
|                 margin-left: -1px; | ||||
|                 position: absolute; | ||||
|                 &:first-child { | ||||
|                     margin-left: 0; | ||||
|                 } | ||||
|                 .l-time-range-tick-label { | ||||
|                     @include webkitProp(transform, translateX(-50%)); | ||||
|                     color: $colorPlotLabelFg; | ||||
|                     display: inline-block; | ||||
|                     font-size: 0.7rem; | ||||
|                     position: absolute; | ||||
|                     top: 5px; | ||||
|                     white-space: nowrap; | ||||
|                     z-index: 2; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .knob { | ||||
|         z-index: 2; | ||||
|         &:before { | ||||
|             $mTB: 2px; | ||||
|             $grippyW: 3px; | ||||
|             $mLR: ($sliderKnobW - $grippyW)/2; | ||||
|             @include bgStripes($c: pullForward($sliderColorKnob, 20%), $a: 1, $bgsize: 4px, $angle: 0deg); | ||||
|             content: ''; | ||||
|             display: block; | ||||
|             position: absolute; | ||||
|             top: $mTB; right: $mLR; bottom: $mTB; left: $mLR; | ||||
|         } | ||||
|         .range-value { | ||||
|             @include trans-prop-nice-fade(.25s); | ||||
|             font-size: 0.7rem; | ||||
|             position: absolute; | ||||
|             height: $r2H; | ||||
|             line-height: $r2H; | ||||
|             white-space: nowrap; | ||||
|             z-index: 1; | ||||
|         } | ||||
|         &:hover { | ||||
|             .range-value { | ||||
|                 color: $sliderColorKnobHov; | ||||
|             } | ||||
|         } | ||||
|         &.knob-l { | ||||
|             margin-left: $knobM; | ||||
|             .range-value { | ||||
|                 text-align: right; | ||||
|                 right: $rangeValOffset; | ||||
|             } | ||||
|         } | ||||
|         &.knob-r { | ||||
|             margin-right: $knobM; | ||||
|             .range-value { | ||||
|                 left: $rangeValOffset; | ||||
|             } | ||||
|             &:hover + .range-holder .range .toi-line { | ||||
|                 @include toiLineHovEffects; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .l-time-domain-selector { | ||||
|         position: absolute; | ||||
|         right: 0px; | ||||
|         top: $interiorMargin; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .s-time-range-val { | ||||
|     border-radius: $controlCr; | ||||
|     background-color: $colorInputBg; | ||||
|     padding: 1px 1px 0 $interiorMargin; | ||||
| } | ||||
|  | ||||
| /******************************************************************** MOBILE */ | ||||
|  | ||||
| @include phoneandtablet { | ||||
|     .l-time-controller { | ||||
|         min-width: 0; | ||||
|         .l-time-range-slider-holder, | ||||
|         .l-time-range-ticks-holder { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @include phone { | ||||
|     .l-time-controller { | ||||
|         .l-time-range-inputs-holder { | ||||
|             &.l-flex-row, | ||||
|             .l-flex-row { | ||||
|                 @include align-items(flex-start); | ||||
|             } | ||||
|             .l-time-range-inputs-elem { | ||||
|                 &.type-icon { | ||||
|                     margin-top: 3px; | ||||
|                 } | ||||
|             } | ||||
|             .t-inputs-w, | ||||
|             .l-time-range-inputs-elem { | ||||
|                 @include flex-direction(column); | ||||
|                 .l-time-range-input-w:not(:first-child) { | ||||
|                     &:not(:first-child) { | ||||
|                         margin-top: $interiorMargin; | ||||
|                     } | ||||
|                     margin-right: 0; | ||||
|                 } | ||||
|                 .l-time-range-inputs-elem { | ||||
|                     &.lbl { display: none; } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @include phonePortrait { | ||||
|     .l-time-controller { | ||||
|         .l-time-range-inputs-holder { | ||||
|             .t-inputs-w, | ||||
|             .l-time-range-inputs-elem { | ||||
|                 @include flex(1 1 auto); | ||||
|                 padding-top: 25px; // Make room for the ever lovin' Time Domain Selector | ||||
|                 .flex-elem { | ||||
|                     @include flex(1 1 auto); | ||||
|                     width: 100%; | ||||
|                 } | ||||
|                 input[type="text"] { | ||||
|                     width: 100%; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     .l-time-domain-selector { | ||||
|         right: auto; | ||||
|         left: 20px; | ||||
|     } | ||||
| } | ||||
| @@ -227,13 +227,18 @@ define( | ||||
|             } | ||||
|  | ||||
|             // Respond to a display bounds change (requery for data) | ||||
|             function changeDisplayBounds(event, bounds) { | ||||
|                 var domainAxis = $scope.axes[0]; | ||||
|             function changeDisplayBounds(event, bounds, follow) { | ||||
|                 //'hack' for follow mode | ||||
|                 if (follow === true){ | ||||
|                     setBasePanZoom(bounds); | ||||
|                 } else { | ||||
|                     var domainAxis = $scope.axes[0]; | ||||
|  | ||||
|                 domainAxis.chooseOption(bounds.domain); | ||||
|                 updateDomainFormat(); | ||||
|                 setBasePanZoom(bounds); | ||||
|                 requery(); | ||||
|                     domainAxis.chooseOption(bounds.domain); | ||||
|                     updateDomainFormat(); | ||||
|                     setBasePanZoom(bounds); | ||||
|                     requery(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             this.modeOptions = new PlotModeOptions([], subPlotFactory); | ||||
|   | ||||
| @@ -63,6 +63,28 @@ define( | ||||
|             this.$scope.loading = false; | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          */ | ||||
|         HistoricalTableController.prototype.registerChangeListeners = function () { | ||||
|             TableController.prototype.registerChangeListeners.call(this); | ||||
|             //Change of bounds in time conductor | ||||
|             this.changeListeners.push(this.$scope.$on('telemetry:display:bounds', | ||||
|                     this.boundsChange.bind(this)) | ||||
|             ); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * @private | ||||
|          */ | ||||
|         HistoricalTableController.prototype.boundsChange = function (event, bounds, follow) { | ||||
|             // If in follow mode, don't bother re-subscribing, data will be | ||||
|             // received from existing subscription. | ||||
|             if (follow!==true) { | ||||
|                 this.subscribe(); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Processes an array of objects, formatting the telemetry available | ||||
|          * for them and setting it on scope when done | ||||
|   | ||||
| @@ -96,11 +96,6 @@ define( | ||||
|                     } | ||||
|                 }) | ||||
|             ); | ||||
|  | ||||
|             //Change of bounds in time conductor | ||||
|             this.changeListeners.push(this.$scope.$on('telemetry:display:bounds', | ||||
|                 this.subscribe.bind(this)) | ||||
|             ); | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -71,6 +71,9 @@ define( | ||||
|                     // Allow controls to trigger blur-like events | ||||
|                     ngBlur: "&", | ||||
|  | ||||
|                     // Allow controls to trigger blur-like events | ||||
|                     ngMouseup: "&", | ||||
|  | ||||
|                     // The state of the form value itself | ||||
|                     ngModel: "=", | ||||
|  | ||||
|   | ||||
| @@ -48,13 +48,14 @@ requirejs.config({ | ||||
|         "angular-route": "bower_components/angular-route/angular-route.min", | ||||
|         "csv": "bower_components/comma-separated-values/csv.min", | ||||
|         "es6-promise": "bower_components/es6-promise/promise.min", | ||||
|         "EventEmitter": "bower_components/eventemitter3/index", | ||||
|         "moment": "bower_components/moment/moment", | ||||
|         "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", | ||||
|         "saveAs": "bower_components/FileSaver.js/FileSaver.min", | ||||
|         "screenfull": "bower_components/screenfull/dist/screenfull.min", | ||||
|         "text": "bower_components/text/text", | ||||
|         "uuid": "bower_components/node-uuid/uuid", | ||||
|         "zepto": "bower_components/zepto/zepto.min" | ||||
|         "zepto": "bower_components/zepto/zepto.min", | ||||
|     }, | ||||
|  | ||||
|     "shim": { | ||||
| @@ -64,6 +65,9 @@ requirejs.config({ | ||||
|         "angular-route": { | ||||
|             "deps": [ "angular" ] | ||||
|         }, | ||||
|         "EventEmitter": { | ||||
|             "exports": "EventEmitter" | ||||
|         }, | ||||
|         "moment-duration-format": { | ||||
|             "deps": [ "moment" ] | ||||
|         }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user