Compare commits
	
		
			154 Commits
		
	
	
		
			combine-hi
			...
			style-guid
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | e21906d1fd | ||
|   | f2193495ec | ||
|   | dd05f29210 | ||
|   | c1b2db848a | ||
|   | 5d19294c11 | ||
|   | 9b8d5f3f9c | ||
|   | d03f323a9b | ||
|   | 54a453e5a0 | ||
|   | 14894cf197 | ||
|   | 0c6786198a | ||
|   | 6d077b775d | ||
|   | 144437a06e | ||
|   | 557cd91b21 | ||
|   | 39d3e92094 | ||
|   | 7529a86d01 | ||
|   | d34e36831c | ||
|   | aa8fa9168a | ||
|   | 3f1b7e0a87 | ||
|   | 5ec3b98d1c | ||
|   | 1ad5094b72 | ||
|   | b54ee2257e | ||
|   | fcef4274e5 | ||
|   | 744a5340d3 | ||
|   | d140051054 | ||
|   | 8da74f2665 | ||
|   | 2390278b97 | ||
|   | 8a66731271 | ||
|   | 0a9ea48355 | ||
|   | 01d93306f3 | ||
|   | 0588f9190a | ||
|   | 1378b57567 | ||
|   | 9e12886c66 | ||
|   | 2d352ac574 | ||
|   | 284dec4903 | ||
|   | 5a0656c700 | ||
|   | 425655bae0 | ||
|   | 50b4d5cb28 | ||
|   | bc62d7d5ae | ||
|   | c0dcf4495e | ||
|   | a51b9bc63f | ||
|   | ff003c3dab | ||
|   | de7c4d2ce3 | ||
|   | 4b07930305 | ||
|   | 5a49ac16b1 | ||
|   | 91b150c064 | ||
|   | 9506d309b0 | ||
|   | c9bd60f50e | ||
|   | cf15ff5c07 | ||
|   | 6bbdfcdfbe | ||
|   | 06e93ff520 | ||
|   | 550e7a15e6 | ||
|   | 71c54cd541 | ||
|   | e81b8e53dc | ||
|   | 84e6928f54 | ||
|   | ba688fe62c | ||
|   | c533e10352 | ||
|   | 04f47b3db6 | ||
|   | 717fa5edf4 | ||
|   | 14f5f048fb | ||
|   | 72929500d3 | ||
|   | 471adde923 | ||
|   | 6c5d5f3d00 | ||
|   | 2262fef29b | ||
|   | bda30f1475 | ||
|   | bfec434369 | ||
|   | 14df350994 | ||
|   | 80582f5e8d | ||
|   | 7442768ced | ||
|   | 77c7bdfdec | ||
|   | 07d9769966 | ||
|   | 385b6177b2 | ||
|   | 7f68d26433 | ||
|   | d7b44f8d09 | ||
|   | c4cd36e15b | ||
|   | 618a6e7e8d | ||
|   | 63a8c91f71 | ||
|   | e59020fec7 | ||
|   | a2e424203a | ||
|   | 16853644cb | ||
|   | 2272766c57 | ||
|   | 1d9cdea2d4 | ||
|   | 715219c44d | ||
|   | 00dc2875bf | ||
|   | 8703f363b8 | ||
|   | 26210eaa50 | ||
|   | a4a1cb5e05 | ||
|   | 9570f2f7a1 | ||
|   | eb4ded39b3 | ||
|   | 7deb3cd025 | ||
|   | 06779e6cd9 | ||
|   | 7f43c0bf1a | ||
|   | bfa3bbcdc7 | ||
|   | 2baf3f8bb0 | ||
|   | 10ac13ac5c | ||
|   | 138cb199bb | ||
|   | 374c363a78 | ||
|   | e9cb5cd639 | ||
|   | bc7d92ee0d | ||
|   | 78f49784a0 | ||
|   | 8754c438cc | ||
|   | 1419c75503 | ||
|   | ca8cad0a74 | ||
|   | a3a55d3b48 | ||
|   | e66f818996 | ||
|   | ae5ef33487 | ||
|   | 59c5430579 | ||
|   | 6d52f094d9 | ||
|   | 740db8da75 | ||
|   | 68abc15ed5 | ||
|   | bb47feb517 | ||
|   | 469820fb0f | ||
|   | 92dd99b26c | ||
|   | 9fe1923189 | ||
|   | 42ddb38629 | ||
|   | fe60d7abbc | ||
|   | 54b975f242 | ||
|   | 7f75e089e8 | ||
|   | 8e8c66280f | ||
|   | d3d874e209 | ||
|   | ce561e1598 | ||
|   | 7290601a37 | ||
|   | ea5a85ffd1 | ||
|   | eb196ea521 | ||
|   | b6a8078634 | ||
|   | e53b34ed60 | ||
|   | 13ffa3e3c4 | ||
|   | 0e3b629d90 | ||
|   | 23216e5aee | ||
|   | 5b366e91c1 | ||
|   | aa336dfd57 | ||
|   | 556296096d | ||
|   | e4aaa860a3 | ||
|   | 2079a74ab2 | ||
|   | 4b86439b8a | ||
|   | a4d8e8ff90 | ||
|   | 3674808a13 | ||
|   | 10c0c29f64 | ||
|   | fa1a942184 | ||
|   | e205bf1fa4 | ||
|   | cecd708dd1 | ||
|   | aa36417590 | ||
|   | e6c78f6d8b | ||
|   | 747afa6200 | ||
|   | 019cdde1c6 | ||
|   | c7e26a231a | ||
|   | f3b519d47b | ||
|   | c472ab044b | ||
|   | 008f1387ed | ||
|   | 6ed76708ec | ||
|   | c2ff81bad1 | ||
|   | a6c3d98ddd | ||
|   | 603e990755 | ||
|   | e45a686c5a | ||
|   | 1c33157fb8 | 
| @@ -21,5 +21,6 @@ | ||||
|     "shadow": "outer", | ||||
|     "strict": "implied", | ||||
|     "undef": true, | ||||
|     "unused": "vars" | ||||
|     "unused": "vars", | ||||
|     "latedef": "nofunc" | ||||
| } | ||||
|   | ||||
							
								
								
									
										17
									
								
								API.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								API.md
									
									
									
									
									
								
							| @@ -505,7 +505,7 @@ MCT, it will be pre-configured to use the UTC time system, which is installed an | ||||
|  | ||||
| The time bounds of an Open MCT application are defined as numbers, and a Time  | ||||
| System gives meaning and context to these numbers so that they can be correctly  | ||||
| interpreted. Time Systems are javscript objects that provide some information  | ||||
| interpreted. Time Systems are JavaScript objects that provide some information  | ||||
| about the current time reference frame. An example of defining and registering  | ||||
| a new time system is given below: | ||||
|  | ||||
| @@ -879,6 +879,21 @@ openmct.install(openmct.plugins.CouchDB('http://localhost:9200')) | ||||
| * `openmct.plugins.Espresso` and `openmct.plugins.Snow` are two different | ||||
|   themes (dark and light) available for Open MCT. Note that at least one | ||||
|   of these themes must be installed for Open MCT to appear correctly. | ||||
| * `openmct.plugins.URLIndicatorPlugin` adds an indicator which shows the | ||||
| availability of a URL with the following options:  | ||||
|   - `url` : URL to indicate the status of | ||||
|   - `cssClass`: Icon to show in the status bar, defaults to `icon-database`, [list of all icons](https://nasa.github.io/openmct/style-guide/#/browse/styleguide:home?view=items) | ||||
|   - `interval`: Interval between checking the connection, defaults to `10000` | ||||
|   - `label` Name showing up as text in the status bar, defaults to url | ||||
| ```javascript | ||||
| openmct.install(openmct.plugins.URLIndicatorPlugin({ | ||||
|   url: 'http://google.com', | ||||
|   cssClass: 'check', | ||||
|   interval: 10000, | ||||
|   label: 'Google' | ||||
|  }) | ||||
| ); | ||||
| ``` | ||||
| * `openmct.plugins.LocalStorage` provides persistence of user-created | ||||
|   objects in browser-local storage. This is particularly useful in | ||||
|   development environments. | ||||
|   | ||||
| @@ -88,7 +88,7 @@ and [`gulp`](http://gulpjs.com/). | ||||
|  | ||||
| To build Open MCT for deployment: | ||||
|  | ||||
| `npm run prepublish` | ||||
| `npm run prepare` | ||||
|  | ||||
| This will compile and minify JavaScript sources, as well as copy over assets. | ||||
| The contents of the `dist` folder will contain a runnable Open MCT | ||||
|   | ||||
| @@ -17,7 +17,7 @@ | ||||
|     "screenfull": "^3.0.0", | ||||
|     "node-uuid": "^1.4.7", | ||||
|     "comma-separated-values": "^3.6.4", | ||||
|     "FileSaver.js": "^0.0.2", | ||||
|     "file-saver": "^1.3.3", | ||||
|     "zepto": "^1.1.6", | ||||
|     "eventemitter3": "^1.2.0", | ||||
|     "lodash": "3.10.1", | ||||
|   | ||||
							
								
								
									
										16
									
								
								circle.yml
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								circle.yml
									
									
									
									
									
								
							| @@ -1,15 +1,17 @@ | ||||
| machine: | ||||
|   node: | ||||
|     version: 4.7.0 | ||||
|  | ||||
| dependencies: | ||||
|   pre: | ||||
|     - npm install -g npm@latest | ||||
|  | ||||
| deployment: | ||||
|   production: | ||||
|     branch: master | ||||
|     commands: | ||||
|         - npm install canvas nomnoml | ||||
|         - ./build-docs.sh | ||||
|         - git fetch --unshallow | ||||
|         - git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master | ||||
|   openmct-demo: | ||||
|     branch: live_demo | ||||
|     heroku: | ||||
|       appname: openmct-demo | ||||
|   openmctweb-staging-deux: | ||||
|     branch: mobile | ||||
|     heroku: | ||||
| @@ -22,4 +24,4 @@ test: | ||||
| general: | ||||
|   branches: | ||||
|     ignore: | ||||
|       - gh-pages | ||||
|       - gh-pages | ||||
| @@ -2283,7 +2283,7 @@ To install build dependencies (only needs to be run once): | ||||
|  | ||||
| To build: | ||||
|  | ||||
| `npm run prepublish` | ||||
| `npm run prepare` | ||||
|  | ||||
| This will compile and minify JavaScript sources, as well as copy over assets. | ||||
| The contents of the `dist` folder will contain a runnable Open MCT | ||||
|   | ||||
| @@ -59,7 +59,7 @@ define([ | ||||
|             if (domainObject.telemetry && domainObject.telemetry.hasOwnProperty(prop)) { | ||||
|                 workerRequest[prop] = domainObject.telemetry[prop]; | ||||
|             } | ||||
|             if (request.hasOwnProperty(prop)) { | ||||
|             if (request && request.hasOwnProperty(prop)) { | ||||
|                 workerRequest[prop] = request[prop]; | ||||
|             } | ||||
|             if (!workerRequest[prop]) { | ||||
| @@ -78,8 +78,8 @@ define([ | ||||
|         return this.workerInterface.request(workerRequest); | ||||
|     }; | ||||
|  | ||||
|     GeneratorProvider.prototype.subscribe = function (domainObject, callback, request) { | ||||
|         var workerRequest = this.makeWorkerRequest(domainObject, request); | ||||
|     GeneratorProvider.prototype.subscribe = function (domainObject, callback) { | ||||
|         var workerRequest = this.makeWorkerRequest(domainObject, {}); | ||||
|         return this.workerInterface.subscribe(workerRequest, callback); | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -44,9 +44,7 @@ define([ | ||||
|         message = message.data; | ||||
|         var callback = this.callbacks[message.id]; | ||||
|         if (callback) { | ||||
|             if (callback(message)) { | ||||
|                 delete this.callbacks[message.id]; | ||||
|             } | ||||
|             callback(message); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| @@ -72,6 +70,7 @@ define([ | ||||
|             deferred.resolve = resolve; | ||||
|             deferred.reject = reject; | ||||
|         }); | ||||
|         var messageId; | ||||
|  | ||||
|         function callback(message) { | ||||
|             if (message.error) { | ||||
| @@ -79,33 +78,27 @@ define([ | ||||
|             } else { | ||||
|                 deferred.resolve(message.data); | ||||
|             } | ||||
|             return true; | ||||
|             delete this.callbacks[messageId]; | ||||
|         } | ||||
|  | ||||
|         this.dispatch('request', request, callback); | ||||
|         messageId = this.dispatch('request', request, callback.bind(this)); | ||||
|  | ||||
|         return promise; | ||||
|     }; | ||||
|  | ||||
|     WorkerInterface.prototype.subscribe = function (request, cb) { | ||||
|         var isCancelled = false; | ||||
|  | ||||
|         var callback = function (message) { | ||||
|             if (isCancelled) { | ||||
|                 return true; | ||||
|             } | ||||
|         function callback(message) { | ||||
|             cb(message.data); | ||||
|         }; | ||||
|  | ||||
|         var messageId = this.dispatch('subscribe', request, callback) | ||||
|         var messageId = this.dispatch('subscribe', request, callback); | ||||
|  | ||||
|         return function () { | ||||
|             isCancelled = true; | ||||
|             this.dispatch('unsubscribe', { | ||||
|                 id: messageId | ||||
|             }); | ||||
|             delete this.callbacks[messageId]; | ||||
|         }.bind(this); | ||||
|  | ||||
|     }; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| <span class="status block" ng-controller="DialogLaunchController"> | ||||
| <span class="l-indicator s-indicator icon-box-with-arrow" ng-controller="DialogLaunchController"> | ||||
|     <!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! --> | ||||
|     <span class="status-indicator icon-box-with-arrow"></span><span class="label"> | ||||
|     <span class="label"> | ||||
|         <a ng-click="launchProgress(true)">Known</a> | | ||||
|         <a ng-click="launchProgress(false)">Unknown</a> | | ||||
|         <a ng-click="launchError()">Error</a> | | ||||
|         <a ng-click="launchInfo()">Info</a> | ||||
|     </span><span class="count"></span> | ||||
|     </span> | ||||
| </span> | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| <span class="status block" ng-controller="NotificationLaunchController"> | ||||
| <span class="l-indicator s-indicator icon-bell" ng-controller="NotificationLaunchController"> | ||||
|     <!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! --> | ||||
|     <span class="status-indicator icon-bell"></span><span class="label"> | ||||
|     <span class="label"> | ||||
|         <a ng-click="newInfo()">Success</a> | | ||||
|         <a ng-click="newError()">Error</a> | | ||||
|         <a ng-click="newAlert()">Alert</a> | | ||||
|         <a ng-click="newProgress()">Progress</a> | ||||
|     </span><span class="count"></span> | ||||
|     </span> | ||||
| </span> | ||||
|   | ||||
| @@ -16,6 +16,7 @@ define([ | ||||
|                 { "key": "styleguide.intro", "name": "Introduction", "cssClass": "icon-page", "description": "Introduction and overview to the style guide" }, | ||||
|                 { "key": "styleguide.standards", "name": "Standards", "cssClass": "icon-page", "description": "" }, | ||||
|                 { "key": "styleguide.colors", "name": "Colors", "cssClass": "icon-page", "description": "" }, | ||||
|                 { "key": "styleguide.status", "name": "status", "cssClass": "icon-page", "description": "Limits, telemetry paused, etc." }, | ||||
|                 { "key": "styleguide.glyphs", "name": "Glyphs", "cssClass": "icon-page", "description": "Glyphs overview" }, | ||||
|                 { "key": "styleguide.controls", "name": "Controls", "cssClass": "icon-page", "description": "Buttons, selects, HTML controls" }, | ||||
|                 { "key": "styleguide.input", "name": "Text Inputs", "cssClass": "icon-page", "description": "Various text inputs" }, | ||||
| @@ -25,6 +26,7 @@ define([ | ||||
|                 { "key": "styleguide.intro", "type": "styleguide.intro", "templateUrl": "templates/intro.html", "editable": false }, | ||||
|                 { "key": "styleguide.standards", "type": "styleguide.standards", "templateUrl": "templates/standards.html", "editable": false }, | ||||
|                 { "key": "styleguide.colors", "type": "styleguide.colors", "templateUrl": "templates/colors.html", "editable": false }, | ||||
|                 { "key": "styleguide.status", "type": "styleguide.status", "templateUrl": "templates/status.html", "editable": false }, | ||||
|                 { "key": "styleguide.glyphs", "type": "styleguide.glyphs", "templateUrl": "templates/glyphs.html", "editable": false }, | ||||
|                 { "key": "styleguide.controls", "type": "styleguide.controls", "templateUrl": "templates/controls.html", "editable": false }, | ||||
|                 { "key": "styleguide.input", "type": "styleguide.input", "templateUrl": "templates/input.html", "editable": false }, | ||||
| @@ -47,6 +49,7 @@ define([ | ||||
|                             "intro", | ||||
|                             "standards", | ||||
|                             "colors", | ||||
|                             "status", | ||||
|                             "glyphs", | ||||
|                             "styleguide:ui-elements" | ||||
|                         ] | ||||
|   | ||||
| @@ -28,8 +28,8 @@ | ||||
|         color: $colorKey; | ||||
|     } | ||||
|  | ||||
|     h1, h2 { | ||||
|         color: pullForward($colorBodyFg, 20%); | ||||
|     h1, h2, strong, b { | ||||
|         color: pullForward($colorBodyFg, 50%); | ||||
|     } | ||||
|  | ||||
|     h2 { | ||||
| @@ -45,6 +45,10 @@ | ||||
|         text-transform: uppercase; | ||||
|     } | ||||
|  | ||||
|     strong, b { | ||||
|         font-weight: normal; | ||||
|     } | ||||
|  | ||||
|     .w-markup { | ||||
|         //Wrap markup example "pre" element | ||||
|         background-color: $colorCode; | ||||
| @@ -54,6 +58,12 @@ | ||||
|         position: relative; | ||||
|     } | ||||
|  | ||||
|     .w-mct-example { | ||||
|         div { | ||||
|             margin-bottom: $interiorMarginLg; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     code, | ||||
|     pre { | ||||
|         font-size: 0.8rem; | ||||
|   | ||||
| @@ -127,7 +127,8 @@ | ||||
| { 'meaning': 'Timer object', 'cssClass': 'icon-timer', 'cssContent': 'e1127', 'htmlEntity': '&#xe1127' }, | ||||
| { 'meaning': 'Data Topic', 'cssClass': 'icon-topic', 'cssContent': 'e1128', 'htmlEntity': '&#xe1128' }, | ||||
| { 'meaning': 'Fixed Position object', 'cssClass': 'icon-box-with-dashed-lines', 'cssContent': 'e1129', 'htmlEntity': '&#xe1129' }, | ||||
| { 'meaning': 'Summary Widget', 'cssClass': 'icon-summary-widget', 'cssContent': 'e1130', 'htmlEntity': '&#xe1130' } | ||||
| { 'meaning': 'Summary Widget', 'cssClass': 'icon-summary-widget', 'cssContent': 'e1130', 'htmlEntity': '&#xe1130' }, | ||||
| { 'meaning': 'Notebook object', 'cssClass': 'icon-notebook', 'cssContent': 'e1131', 'htmlEntity': '&#xe1131' } | ||||
| ]; | ||||
| "></div> | ||||
|  | ||||
|   | ||||
| @@ -4,5 +4,5 @@ | ||||
|         <pre></pre> | ||||
|     </span> | ||||
|     <h3>Example</h3> | ||||
|     <div></div> | ||||
|     <div class="w-mct-example"></div> | ||||
| </div> | ||||
|   | ||||
| @@ -121,7 +121,7 @@ | ||||
|         <h2>Palettes</h2> | ||||
|         <div class="cols cols1-1"> | ||||
|             <div class="col"> | ||||
|                 <p>Use a palette to provide color choices. Similar to context menus and dropdowns, palettes should be dismissed when a choice is made within them, or if the user clicks outside one.</p> | ||||
|                 <p>Use a palette to provide color choices. Similar to context menus and dropdowns, palettes should be dismissed when a choice is made within them, or if the user clicks outside one. Selected palette choices should utilize the <code>selected</code> CSS class to visualize indicate that state.</p> | ||||
|                 <p>Note that while this example uses static markup for illustrative purposes, don't do this - use a front-end framework with repeaters to build the color choices.</p> | ||||
|             </div> | ||||
|             <mct-example><div style="height: 220px" title="Ignore me, I'm just here to provide space for this example."> | ||||
| @@ -129,9 +129,9 @@ | ||||
| <div class="s-button s-menu-button menu-element t-color-palette icon-paint-bucket" ng-controller="ClickAwayController as toggle"> | ||||
|     <span class="l-click-area" ng-click="toggle.toggle()"></span> | ||||
|     <span class="color-swatch" style="background: rgb(255, 0, 0);"></span> | ||||
|     <div class="menu l-color-palette" ng-show="toggle.isActive()"> | ||||
|     <div class="menu l-palette l-color-palette" ng-show="toggle.isActive()"> | ||||
|         <div class="l-palette-row l-option-row"> | ||||
|             <div class="l-palette-item s-palette-item " ng-click="ngModel[field] = 'transparent'"></div> | ||||
|             <div class="l-palette-item s-palette-item no-selection"></div> | ||||
|             <span class="l-palette-item-label">None</span> | ||||
|         </div> | ||||
|         <div class="l-palette-row"> | ||||
| @@ -147,7 +147,7 @@ | ||||
|             <div class="l-palette-item s-palette-item" style="background: rgb(255, 255, 255);"></div> | ||||
|         </div> | ||||
|         <div class="l-palette-row"> | ||||
|             <div class="l-palette-item s-palette-item" style="background: rgb(136, 32, 32);"></div> | ||||
|             <div class="l-palette-item s-palette-item selected" style="background: rgb(255, 0, 0);"></div> | ||||
|             <div class="l-palette-item s-palette-item" style="background: rgb(224, 64, 64);"></div> | ||||
|             <div class="l-palette-item s-palette-item" style="background: rgb(240, 160, 72);"></div> | ||||
|             <div class="l-palette-item s-palette-item" style="background: rgb(255, 248, 96);"></div> | ||||
|   | ||||
							
								
								
									
										180
									
								
								example/styleguide/res/templates/status.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								example/styleguide/res/templates/status.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | ||||
| <!-- | ||||
|  Open MCT, Copyright (c) 2014-2016, United States Government | ||||
|  as represented by the Administrator of the National Aeronautics and Space | ||||
|  Administration. All rights reserved. | ||||
|  | ||||
|  Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  "License"); you may not use this file except in compliance with the License. | ||||
|  You may obtain a copy of the License at | ||||
|  http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  | ||||
|  Unless required by applicable law or agreed to in writing, software | ||||
|  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  License for the specific language governing permissions and limitations | ||||
|  under the License. | ||||
|  | ||||
|  Open MCT includes source code licensed under additional open source | ||||
|  licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <style> | ||||
|     .w-mct-example div[class*="s-limit"], | ||||
|     .w-mct-example div[class*="s-status"], | ||||
|     .w-mct-example div[class*="s-unsynced"], | ||||
|     .w-mct-example span[class*="s-limit"] { | ||||
|         border-radius: 4px; | ||||
|         padding: 3px 7px; | ||||
|     } | ||||
|     .w-mct-example table { | ||||
|         width: 100%; | ||||
|     } | ||||
| </style> | ||||
| <div class="l-style-guide s-text"> | ||||
|     <p class="doc-title">Open MCT Style Guide</p> | ||||
|     <h1>Status Indication</h1> | ||||
|  | ||||
|     <div class="l-section"> | ||||
|         <h2>Overview</h2> | ||||
|         <p>Many elements in Open MCT need to articulate a dynamic status; Open MCT provides the following styles and conventions to handle this:</p> | ||||
|         <ul> | ||||
|             <li><strong>Limits</strong>: when telemetry values exceed minimum or maximum values, they can be violating limits. Limit styles include both color and iconography; color is used to indicate severity while icons are used to indicate direction, upper or lower.</li> | ||||
|             <li><strong>Status</strong>: Open MCT also provides a number or built-in Status styles allowing telemetry or other displayed information to be visually classified by type. Common uses for these classes are to visually denote event records.</li> | ||||
|             <li><strong>Synchronization</strong>: When the system is displaying real-time data, it is very important that displays clearly indicate when they are not doing so, such as when a plot if frozen while panning or zooming. Open MCT provides a style for this.</li> | ||||
|         </ul> | ||||
|     </div> | ||||
|  | ||||
|     <div class="l-section"> | ||||
|         <h2>Limits</h2> | ||||
|         <div class="cols cols1-1"> | ||||
|             <div class="col"> | ||||
|                 <p>Limit CSS classes can be applied to any block or inline element. Open MCT limit classes set color and optionally an icon, but don't effect other properties. Yellow and red limit classes can be used as is, or allow the application of any custom icon available in Open MCT's glyphs library. "Level" limit classes - upper and lower - always use an icon in addition to a color; Open MCT doesn't support level limits without color.</p> | ||||
|                 <ul> | ||||
|                     <li>Color only</li> | ||||
|                     <ul> | ||||
|                         <li><code>s-limit-yellow</code>: A yellow limit.</li> | ||||
|                         <li><code>s-limit-red</code>: A red limit.</li> | ||||
|                     </ul> | ||||
|                     <li>Color and icon</li> | ||||
|                     <ul> | ||||
|                         <li><code>s-limit-yellow-icon</code>: A yellow limit with icon.</li> | ||||
|                         <li><code>s-limit-red-icon</code>: A red limit with icon.</li> | ||||
|                     </ul> | ||||
|                     <li>Upper and lower limit indicators. Must be used with a color limit class to be visible.</li> | ||||
|                     <ul> | ||||
|                         <li><code>s-limit-upr</code>: Upper limit. | ||||
|                         </li> | ||||
|                         <li><code>s-limit-lwr</code>: Lower limit. | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </ul> | ||||
|             </div> | ||||
| <mct-example><div class="s-limit-yellow">Yellow limit</div> | ||||
| <div class="s-limit-red">Red limit</div> | ||||
| <div class="s-limit-yellow-icon">Yellow limit with icon</div> | ||||
| <div class="s-limit-red-icon">Red limit with icon</div> | ||||
| <div class="s-limit-yellow s-limit-lwr">Lower yellow limit</div> | ||||
| <div class="s-limit-red s-limit-upr">Upper red limit</div> | ||||
| <div class="s-limit-red icon-bell">Red Limit with a custom icon</div> | ||||
| <div>Some text with an <span class="s-limit-yellow-icon">inline element</span> showing a yellow limit.</div> | ||||
|  | ||||
| <!-- Limits applied in a table --> | ||||
| <table> | ||||
|     <tr class='header'><td>Name</td><td>Value 1</td><td>Value 2</td></tr> | ||||
|     <tr><td>ENG_PWR 4991</td><td>7.023</td><td class="s-limit-yellow s-limit-upr">70.23</td></tr> | ||||
|     <tr><td>ENG_PWR 4992</td><td>49.784</td><td class="s-limit-red s-limit-lwr">-121.22</td></tr> | ||||
|     <tr><td>ENG_PWR 4993</td><td class="s-limit-yellow icon-bell">0.451</td><td>1.007</td></tr> | ||||
| </table> | ||||
| </mct-example> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="l-section"> | ||||
|         <h2>Status</h2> | ||||
|         <div class="cols cols1-1"> | ||||
|             <div class="col"> | ||||
|                 <p>Classes here can be applied to elements as needed.</p> | ||||
|                 <ul> | ||||
|                     <li>Color only</li> | ||||
|                     <ul> | ||||
|                         <li><code>s-status-warning-hi</code></li> | ||||
|                         <li><code>s-status-warning-lo</code></li> | ||||
|                         <li><code>s-status-diagnostic</code></li> | ||||
|                         <li><code>s-status-info</code></li> | ||||
|                         <li><code>s-status-ok</code></li> | ||||
|                     </ul> | ||||
|                     <li>Color and icon</li> | ||||
|                     <ul> | ||||
|                         <li><code>s-status-warning-hi-icon</code></li> | ||||
|                         <li><code>s-status-warning-lo-icon</code></li> | ||||
|                         <li><code>s-status-diagnostic-icon</code></li> | ||||
|                         <li><code>s-status-info-icon</code></li> | ||||
|                         <li><code>s-status-ok-icon</code></li> | ||||
|                     </ul> | ||||
|                 </ul> | ||||
|             </div> | ||||
| <mct-example><div class="s-status-warning-hi">WARNING HI</div> | ||||
| <div class="s-status-warning-lo">WARNING LOW</div> | ||||
| <div class="s-status-diagnostic">DIAGNOSTIC</div> | ||||
| <div class="s-status-info">INFO</div> | ||||
| <div class="s-status-ok">OK</div> | ||||
| <div class="s-status-warning-hi-icon">WARNING HI with icon</div> | ||||
| <div class="s-status-warning-lo-icon">WARNING LOW with icon</div> | ||||
| <div class="s-status-diagnostic-icon">DIAGNOSTIC with icon</div> | ||||
| <div class="s-status-info-icon">INFO with icon</div> | ||||
| <div class="s-status-ok-icon">OK with icon</div> | ||||
| <div class="s-status-warning-hi icon-gear">WARNING HI with custom icon</div> | ||||
| </mct-example> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="l-section"> | ||||
|         <h2>Status Bar Indicators</h2> | ||||
|         <div class="cols cols1-1"> | ||||
|             <div class="col"> | ||||
|                 <p>Indicators content goes here.</p> | ||||
|             </div> | ||||
| <mct-example><div class="status-holder s-status-bar"> | ||||
| <span class="status-block-holder"> | ||||
|     <span class="l-indicator s-indicator"> | ||||
|         <span class="status-indicator icon-bell"></span> | ||||
|         <span class="label">Collapsible Indicator</span> | ||||
|     </span> | ||||
| </span> | ||||
| <span class="status-block-holder no-collapse caution"> | ||||
|     <span class="l-indicator s-indicator"> | ||||
|         <span class="status-indicator icon-bell"></span> | ||||
|         <span class="label">No collapse</span> | ||||
|     </span> | ||||
| </span> | ||||
| </div> | ||||
| <div class="status-holder s-status-bar"> | ||||
| <span class="status-block-holder"> | ||||
|     <span class="l-indicator s-indicator"> | ||||
|         <span class="status-indicator icon-bell"></span> | ||||
|         <span class="label">Collapsible Indicator</span> | ||||
|     </span> | ||||
| </span> | ||||
|     <span class="status-block-holder"> | ||||
|     <span class="status block s-status-info icon-info"> | ||||
|         <span class="label">No collapse</span> | ||||
|     </span> | ||||
| </span> | ||||
| </div> | ||||
| </mct-example> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|  | ||||
|     <div class="l-section"> | ||||
|         <h2>Synchronization</h2> | ||||
|         <div class="cols cols1-1"> | ||||
|             <div class="col"> | ||||
|                 <p>When the system is operating in real-time streaming mode, it is important for views that display real-time data to clearly articulate when they are not, such as when a user zooms or pans a plot view, freezing that view. In that case, the CSS class <code>s-unsynced</code> should be applied to that view.</p> | ||||
|             </div> | ||||
| <mct-example><div class="s-unsynced">This element is unsynced</div> | ||||
| </mct-example> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| @@ -34,6 +34,7 @@ define( | ||||
|             pages['standards'] = { name: "Standards", type: "styleguide.standards", location: "styleguide:home" }; | ||||
|             pages['colors'] = { name: "Colors", type: "styleguide.colors", location: "styleguide:home" }; | ||||
|             pages['glyphs'] = { name: "Glyphs", type: "styleguide.glyphs", location: "styleguide:home" }; | ||||
|             pages['status'] = { name: "Status Indication", type: "styleguide.status", location: "styleguide:home" }; | ||||
|             pages['controls'] = { name: "Controls", type: "styleguide.controls", location: "styleguide:ui-elements" }; | ||||
|             pages['input'] = { name: "Text Inputs", type: "styleguide.input", location: "styleguide:ui-elements" }; | ||||
|             pages['menus'] = { name: "Menus", type: "styleguide.menus", location: "styleguide:ui-elements" }; | ||||
|   | ||||
							
								
								
									
										32
									
								
								gulpfile.js
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								gulpfile.js
									
									
									
									
									
								
							| @@ -22,6 +22,8 @@ | ||||
|  | ||||
| /*global require,__dirname*/ | ||||
|  | ||||
| require("v8-compile-cache"); | ||||
|  | ||||
| var gulp = require('gulp'), | ||||
|     sourcemaps = require('gulp-sourcemaps'), | ||||
|     path = require('path'), | ||||
| @@ -46,9 +48,22 @@ var gulp = require('gulp'), | ||||
|             name: 'bower_components/almond/almond.js', | ||||
|             include: paths.main.replace('.js', ''), | ||||
|             wrap: { | ||||
|                 startFile: "src/start.frag", | ||||
|                 start: (function () { | ||||
|                     var buildVariables = { | ||||
|                         version: project.version, | ||||
|                         timestamp: moment.utc(Date.now()).format(), | ||||
|                         revision: fs.existsSync('.git') ? git.long() : 'Unknown', | ||||
|                         branch: fs.existsSync('.git') ? git.branch() : 'Unknown' | ||||
|                     }; | ||||
|                     return fs.readFileSync("src/start.frag", 'utf-8') | ||||
|                         .replace(/@@(\w+)/g, function (match, key) { | ||||
|                             return buildVariables[key]; | ||||
|                         });; | ||||
|                 }()), | ||||
|                 endFile: "src/end.frag" | ||||
|             }, | ||||
|             optimize: 'uglify2', | ||||
|             uglify2: { output: { comments: /@preserve/ } }, | ||||
|             mainConfigFile: paths.main, | ||||
|             wrapShim: true | ||||
|         }, | ||||
| @@ -58,14 +73,6 @@ var gulp = require('gulp'), | ||||
|         }, | ||||
|         sass: { | ||||
|             sourceComments: true | ||||
|         }, | ||||
|         replace: { | ||||
|             variables: { | ||||
|                 version: project.version, | ||||
|                 timestamp: moment.utc(Date.now()).format(), | ||||
|                 revision: fs.existsSync('.git') ? git.long() : 'Unknown', | ||||
|                 branch: fs.existsSync('.git') ? git.branch() : 'Unknown' | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| @@ -76,16 +83,11 @@ if (process.env.NODE_ENV === 'development') { | ||||
|  | ||||
| gulp.task('scripts', function () { | ||||
|     var requirejsOptimize = require('gulp-requirejs-optimize'); | ||||
|     var replace = require('gulp-replace-task'); | ||||
|     var header = require('gulp-header'); | ||||
|     var comment = fs.readFileSync('src/about.frag'); | ||||
|  | ||||
|     return gulp.src(paths.main) | ||||
|         .pipe(sourcemaps.init()) | ||||
|         .pipe(requirejsOptimize(options.requirejsOptimize)) | ||||
|         .pipe(sourcemaps.write('.')) | ||||
|         .pipe(replace(options.replace)) | ||||
|         .pipe(header(comment, options.replace.variables)) | ||||
|         .pipe(gulp.dest(paths.dist)); | ||||
| }); | ||||
|  | ||||
| @@ -177,4 +179,4 @@ gulp.task('install', [ 'assets', 'scripts' ]); | ||||
|  | ||||
| gulp.task('verify', [ 'lint', 'test', 'checkstyle' ]); | ||||
|  | ||||
| gulp.task('build', [ 'verify', 'install' ]); | ||||
| gulp.task('build', [ 'verify', 'install' ]); | ||||
							
								
								
									
										10
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								index.html
									
									
									
									
									
								
							| @@ -25,8 +25,7 @@ | ||||
|     <meta charset="utf-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> | ||||
|     <title></title> | ||||
|     <script src="bower_components/requirejs/require.js"> | ||||
|     </script> | ||||
|     <script src="bower_components/requirejs/require.js"> </script> | ||||
|     <script> | ||||
|         var THIRTY_MINUTES = 30 * 60 * 1000; | ||||
|  | ||||
| @@ -43,13 +42,17 @@ | ||||
|             openmct.install(openmct.plugins.Generator()); | ||||
|             openmct.install(openmct.plugins.ExampleImagery()); | ||||
|             openmct.install(openmct.plugins.UTCTimeSystem()); | ||||
|             openmct.install(openmct.plugins.ImportExport()); | ||||
|             openmct.install(openmct.plugins.AutoflowView({ | ||||
|                 type: "telemetry.panel" | ||||
|             })); | ||||
|             openmct.install(openmct.plugins.Conductor({ | ||||
|                 menuOptions: [ | ||||
|                     { | ||||
|                         name: "Fixed", | ||||
|                         timeSystem: 'utc', | ||||
|                         bounds: { | ||||
|                             start: Date.now() - 30 * 60 * 1000, | ||||
|                             start: Date.now() - THIRTY_MINUTES, | ||||
|                             end: Date.now() | ||||
|                         } | ||||
|                     }, | ||||
| @@ -64,6 +67,7 @@ | ||||
|                     } | ||||
|                 ] | ||||
|             })); | ||||
|             openmct.install(openmct.plugins.SummaryWidget()); | ||||
|             openmct.time.clock('local', {start: -THIRTY_MINUTES, end: 0}); | ||||
|             openmct.time.timeSystem('utc'); | ||||
|             openmct.start(); | ||||
|   | ||||
| @@ -36,6 +36,7 @@ module.exports = function(config) { | ||||
|         files: [ | ||||
|             {pattern: 'bower_components/**/*.js', included: false}, | ||||
|             {pattern: 'node_modules/d3-*/**/*.js', included: false}, | ||||
|             {pattern: 'node_modules/vue/**/*.js', included: false}, | ||||
|             {pattern: 'src/**/*.js', included: false}, | ||||
|             {pattern: 'example/**/*.html', included: false}, | ||||
|             {pattern: 'example/**/*.js', included: false}, | ||||
|   | ||||
							
								
								
									
										17
									
								
								openmct.js
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								openmct.js
									
									
									
									
									
								
							| @@ -19,7 +19,7 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*global requirejs*/ | ||||
| /*global requirejs,BUILD_CONSTANTS*/ | ||||
|  | ||||
| requirejs.config({ | ||||
|     "paths": { | ||||
| @@ -33,10 +33,11 @@ requirejs.config({ | ||||
|         "moment": "bower_components/moment/moment", | ||||
|         "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", | ||||
|         "moment-timezone": "bower_components/moment-timezone/builds/moment-timezone-with-data", | ||||
|         "saveAs": "bower_components/FileSaver.js/FileSaver.min", | ||||
|         "saveAs": "bower_components/file-saver/FileSaver.min", | ||||
|         "screenfull": "bower_components/screenfull/dist/screenfull.min", | ||||
|         "text": "bower_components/text/text", | ||||
|         "uuid": "bower_components/node-uuid/uuid", | ||||
|         "vue": "node_modules/vue/dist/vue.min", | ||||
|         "zepto": "bower_components/zepto/zepto.min", | ||||
|         "lodash": "bower_components/lodash/lodash", | ||||
|         "d3-selection": "node_modules/d3-selection/build/d3-selection.min", | ||||
| @@ -66,6 +67,9 @@ requirejs.config({ | ||||
|         "moment-duration-format": { | ||||
|             "deps": ["moment"] | ||||
|         }, | ||||
|         "saveAs": { | ||||
|             "exports": "saveAs" | ||||
|         }, | ||||
|         "screenfull": { | ||||
|             "exports": "screenfull" | ||||
|         }, | ||||
| @@ -91,12 +95,17 @@ requirejs.config({ | ||||
| define([ | ||||
|     './platform/framework/src/Main', | ||||
|     './src/defaultRegistry', | ||||
|     './src/MCT' | ||||
| ], function (Main, defaultRegistry, MCT) { | ||||
|     './src/MCT', | ||||
|     './src/plugins/buildInfo/plugin' | ||||
| ], function (Main, defaultRegistry, MCT, buildInfo) { | ||||
|     var openmct = new MCT(); | ||||
|  | ||||
|     openmct.legacyRegistry = defaultRegistry; | ||||
|  | ||||
|     if (typeof BUILD_CONSTANTS !== 'undefined') { | ||||
|         openmct.install(buildInfo(BUILD_CONSTANTS)); | ||||
|     } | ||||
|  | ||||
|     openmct.on('start', function () { | ||||
|         return new Main().run(defaultRegistry); | ||||
|     }); | ||||
|   | ||||
							
								
								
									
										12
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								package.json
									
									
									
									
									
								
							| @@ -15,19 +15,18 @@ | ||||
|     "d3-time-format": "^2.0.3", | ||||
|     "express": "^4.13.1", | ||||
|     "minimist": "^1.1.1", | ||||
|     "request": "^2.69.0" | ||||
|     "request": "^2.69.0", | ||||
|     "vue": "^2.5.6" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "bower": "^1.7.7", | ||||
|     "git-rev-sync": "^1.4.0", | ||||
|     "glob": ">= 3.0.0", | ||||
|     "gulp": "^3.9.0", | ||||
|     "gulp-header": "^1.8.8", | ||||
|     "gulp": "^3.9.1", | ||||
|     "gulp-jscs": "^3.0.2", | ||||
|     "gulp-jshint": "^2.0.0", | ||||
|     "gulp-jshint-html-reporter": "^0.1.3", | ||||
|     "gulp-rename": "^1.2.2", | ||||
|     "gulp-replace-task": "^0.11.0", | ||||
|     "gulp-requirejs-optimize": "^0.3.1", | ||||
|     "gulp-sass": "^2.2.0", | ||||
|     "gulp-sourcemaps": "^1.6.0", | ||||
| @@ -51,7 +50,8 @@ | ||||
|     "moment": "^2.11.1", | ||||
|     "node-bourbon": "^4.2.3", | ||||
|     "requirejs": "2.1.x", | ||||
|     "split": "^1.0.0" | ||||
|     "split": "^1.0.0", | ||||
|     "v8-compile-cache": "^1.1.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "start": "node app.js", | ||||
| @@ -61,7 +61,7 @@ | ||||
|     "jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api", | ||||
|     "otherdoc": "node docs/gendocs.js --in docs/src --out dist/docs --suppress-toc 'docs/src/index.md|docs/src/process/index.md'", | ||||
|     "docs": "npm run jsdoc ; npm run otherdoc", | ||||
|     "prepublish": "node ./node_modules/bower/bin/bower install && node ./node_modules/gulp/bin/gulp.js install" | ||||
|     "prepare": "node ./node_modules/bower/bin/bower install && node ./node_modules/gulp/bin/gulp.js install" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|   | ||||
| @@ -26,6 +26,7 @@ define([ | ||||
|     "./src/InspectorPaneController", | ||||
|     "./src/BrowseObjectController", | ||||
|     "./src/MenuArrowController", | ||||
|     "./src/ObjectHeaderController", | ||||
|     "./src/navigation/NavigationService", | ||||
|     "./src/navigation/NavigateAction", | ||||
|     "./src/navigation/OrphanNavigationHandler", | ||||
| @@ -36,6 +37,7 @@ define([ | ||||
|     "text!./res/templates/browse-object.html", | ||||
|     "text!./res/templates/items/grid-item.html", | ||||
|     "text!./res/templates/browse/object-header.html", | ||||
|     "text!./res/templates/browse/object-header-frame.html", | ||||
|     "text!./res/templates/menu-arrow.html", | ||||
|     "text!./res/templates/back-arrow.html", | ||||
|     "text!./res/templates/items/items.html", | ||||
| @@ -48,6 +50,7 @@ define([ | ||||
|     InspectorPaneController, | ||||
|     BrowseObjectController, | ||||
|     MenuArrowController, | ||||
|     ObjectHeaderController, | ||||
|     NavigationService, | ||||
|     NavigateAction, | ||||
|     OrphanNavigationHandler, | ||||
| @@ -58,6 +61,7 @@ define([ | ||||
|     browseObjectTemplate, | ||||
|     gridItemTemplate, | ||||
|     objectHeaderTemplate, | ||||
|     objectHeaderFrameTemplate, | ||||
|     menuArrowTemplate, | ||||
|     backArrowTemplate, | ||||
|     itemsTemplate, | ||||
| @@ -107,7 +111,9 @@ define([ | ||||
|                     "depends": [ | ||||
|                         "$scope", | ||||
|                         "agentService", | ||||
|                         "$window" | ||||
|                         "$window", | ||||
|                         "$location", | ||||
|                         "$attrs" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
| @@ -134,7 +140,16 @@ define([ | ||||
|                         "$scope", | ||||
|                         "agentService", | ||||
|                         "$window", | ||||
|                         "navigationService" | ||||
|                         "navigationService", | ||||
|                         "$location", | ||||
|                         "$attrs" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "ObjectHeaderController", | ||||
|                     "implementation": ObjectHeaderController, | ||||
|                     "depends": [ | ||||
|                         "$scope" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
| @@ -169,6 +184,13 @@ define([ | ||||
|                         "type" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "object-header-frame", | ||||
|                     "template": objectHeaderFrameTemplate, | ||||
|                     "uses": [ | ||||
|                         "type" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "menu-arrow", | ||||
|                     "template": menuArrowTemplate, | ||||
|   | ||||
| @@ -57,7 +57,12 @@ | ||||
|             </div> | ||||
|             <mct-representation key="representation.selected.key" | ||||
|                                 mct-object="representation.selected.key && domainObject" | ||||
|                                 class="abs flex-elem grows object-holder-main scroll"> | ||||
|                                 class="abs flex-elem grows object-holder-main scroll" | ||||
|                                 mct-selectable="{ | ||||
|                                     item: domainObject.useCapability('adapter'), | ||||
|                                     oldItem: domainObject | ||||
|                                 }" | ||||
|                                 mct-init-select> | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|     </div> | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
|     <mct-include key="'topbar-browse'"></mct-include> | ||||
|     <div class="abs holder holder-main browse-area s-browse-area browse-wrapper" | ||||
|          ng-controller="PaneController as modelPaneTree" | ||||
|          ng-class="modelPaneTree.visible() ? 'pane-tree-showing' : 'pane-tree-hidden'"> | ||||
|          ng-class="modelPaneTree.visible() ? 'pane-tree-showing' : 'pane-tree-hidden'" hide-parameter="hideTree"> | ||||
|         <mct-split-pane class='abs contents' | ||||
|                         anchor='left' alias="leftSide"> | ||||
|             <div class='split-pane-component treeview pane left'> | ||||
| @@ -58,7 +58,8 @@ | ||||
|  | ||||
|                 <div class='holder holder-object-and-inspector abs' id='content-area' | ||||
|                      ng-controller="InspectorPaneController as modelPaneInspect" | ||||
|                      ng-class="modelPaneInspect.visible() ? 'pane-inspect-showing' : 'pane-inspect-hidden'"> | ||||
|                      ng-class="modelPaneInspect.visible() ? 'pane-inspect-showing' : 'pane-inspect-hidden'"  | ||||
|                      hide-parameter="hideInspector"> | ||||
|  | ||||
|                     <mct-split-pane class='l-object-and-inspector contents abs' anchor='right' alias="rightSide"> | ||||
|                         <div class='split-pane-component t-object pane primary-pane left'> | ||||
|   | ||||
| @@ -19,12 +19,21 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div ng-controller="InspectorController"> | ||||
|     <div ng-repeat="region in regions"> | ||||
| <div ng-controller="InspectorController as controller"> | ||||
|         <mct-representation | ||||
|                 key="region.content.key" | ||||
|                 mct-object="domainObject" | ||||
|                 key="'object-properties'" | ||||
|                 mct-object="controller.selectedItem()" | ||||
|                 ng-model="ngModel"> | ||||
|         </mct-representation> | ||||
|     </div> | ||||
|  | ||||
|         <div ng-if="!controller.hasProviderView()"> | ||||
|             <mct-representation | ||||
|                     key="inspectorKey" | ||||
|                     mct-object="controller.selectedItem()" | ||||
|                     ng-model="ngModel"> | ||||
|             </mct-representation> | ||||
|         </div> | ||||
|  | ||||
|         <div class='inspector-provider-view'> | ||||
|         </div> | ||||
| </div> | ||||
|   | ||||
| @@ -0,0 +1,31 @@ | ||||
| <!-- | ||||
|  Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  as represented by the Administrator of the National Aeronautics and Space | ||||
|  Administration. All rights reserved. | ||||
|  | ||||
|  Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  "License"); you may not use this file except in compliance with the License. | ||||
|  You may obtain a copy of the License at | ||||
|  http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  | ||||
|  Unless required by applicable law or agreed to in writing, software | ||||
|  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  License for the specific language governing permissions and limitations | ||||
|  under the License. | ||||
|  | ||||
|  Open MCT includes source code licensed under additional open source | ||||
|  licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <span class='type-icon flex-elem {{type.getCssClass()}}'></span> | ||||
| <span class="l-elem-wrapper l-flex-row flex-elem grows" ng-controller="ObjectHeaderController as controller"> | ||||
|     <span ng-if="parameters.mode" class='action flex-elem'>{{parameters.mode}}</span> | ||||
|     <span class='title-label flex-elem holder flex-can-shrink s-input-inline'>{{model.name}}</span> | ||||
|     <span class='t-object-alert t-alert-unsynced flex-elem holder' title='This object is not currently displaying real-time data'></span> | ||||
|     <mct-representation | ||||
|         key="'menu-arrow'" | ||||
|         mct-object='domainObject' | ||||
|         class="flex-elem context-available-w"></mct-representation> | ||||
| </span> | ||||
| @@ -20,16 +20,16 @@ | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <span class='type-icon flex-elem {{type.getCssClass()}}'></span> | ||||
| <span class="l-elem-wrapper l-flex-row flex-elem grows"> | ||||
| <span class="l-elem-wrapper l-flex-row flex-elem grows" ng-controller="ObjectHeaderController as controller"> | ||||
|     <span ng-if="parameters.mode" class='action flex-elem'>{{parameters.mode}}</span> | ||||
|     <span class='title-label flex-elem holder flex-can-shrink'>{{model.name}}</span> | ||||
|     <span ng-attr-contenteditable="{{ controller.editable ? true : undefined }}" | ||||
| 		class='title-label flex-elem holder flex-can-shrink s-input-inline' | ||||
| 		ng-click="controller.edit()" | ||||
| 		ng-blur="controller.updateName($event)" | ||||
| 		ng-keypress="controller.updateName($event)">{{model.name}}</span> | ||||
|     <span class='t-object-alert t-alert-unsynced flex-elem holder' title='This object is not currently displaying real-time data'></span> | ||||
|     <mct-representation | ||||
|         key="'menu-arrow'" | ||||
|         mct-object='domainObject' | ||||
|         class="flex-elem context-available-w"></mct-representation> | ||||
| </span> | ||||
| <a class="s-button icon-expand t-btn-view-large" | ||||
|    title="View large" | ||||
|    mct-trigger-modal> | ||||
| </a> | ||||
| </span> | ||||
| @@ -38,8 +38,6 @@ | ||||
|                   ng-class="{ last:($index + 1) === contextualParents.length }"> | ||||
|                 <mct-representation key="'label'" | ||||
|                                     mct-object="parent" | ||||
|                                     ng-model="ngModel" | ||||
|                                     ng-click="ngModel.selectedObject = parent" | ||||
|                                     class="location-item"> | ||||
|                 </mct-representation> | ||||
|             </span> | ||||
| @@ -51,8 +49,6 @@ | ||||
|                   ng-class="{ last:($index + 1) === primaryParents.length }"> | ||||
|                 <mct-representation key="'label'" | ||||
|                                     mct-object="parent" | ||||
|                                     ng-model="ngModel" | ||||
|                                     ng-click="ngModel.selectedObject = parent" | ||||
|                                     class="location-item"> | ||||
|                 </mct-representation> | ||||
|             </span> | ||||
|   | ||||
| @@ -35,9 +35,8 @@ define( | ||||
|          * @param navigationService | ||||
|          * @constructor | ||||
|          */ | ||||
|         function InspectorPaneController($scope, agentService, $window, navigationService) { | ||||
|             PaneController.call(this, $scope, agentService, $window); | ||||
|  | ||||
|         function InspectorPaneController($scope, agentService, $window, navigationService, $location, $attrs) { | ||||
|             PaneController.call(this, $scope, agentService, $window, $location, $attrs); | ||||
|             var statusListener, | ||||
|                 self = this; | ||||
|  | ||||
|   | ||||
							
								
								
									
										92
									
								
								platform/commonUI/browse/src/ObjectHeaderController.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								platform/commonUI/browse/src/ObjectHeaderController.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|  | ||||
|         /** | ||||
|          * Controller to provide the ability to inline edit an object name. | ||||
|          * | ||||
|          * @constructor | ||||
|          * @memberof platform/commonUI/browse | ||||
|          */ | ||||
|         function ObjectHeaderController($scope) { | ||||
|             this.$scope = $scope; | ||||
|             this.domainObject = $scope.domainObject; | ||||
|             this.editable = this.allowEdit(); | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Updates the object name on blur and enter keypress events. | ||||
|          * | ||||
|          * @param event the mouse event | ||||
|          */ | ||||
|         ObjectHeaderController.prototype.updateName = function (event) { | ||||
|             if (!event || !event.currentTarget) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (event.type === 'blur') { | ||||
|                 this.updateModel(event); | ||||
|             } else if (event.which === 13) { | ||||
|                 this.updateModel(event); | ||||
|                 event.currentTarget.blur(); | ||||
|                 window.getSelection().removeAllRanges(); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Updates the model. | ||||
|          * | ||||
|          * @param event the mouse event | ||||
|          * @param private | ||||
|          */ | ||||
|         ObjectHeaderController.prototype.updateModel = function (event) { | ||||
|             var name = event.currentTarget.textContent.replace(/\n/g, ' '); | ||||
|  | ||||
|             if (name.length === 0) { | ||||
|                 name = "Unnamed " + this.domainObject.getCapability("type").typeDef.name; | ||||
|                 event.currentTarget.textContent = name; | ||||
|             } | ||||
|  | ||||
|             if (name !== this.domainObject.getModel().name) { | ||||
|                 this.domainObject.getCapability('mutation').mutate(function (model) { | ||||
|                     model.name = name; | ||||
|                 }); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|          * Checks if the domain object is editable. | ||||
|          * | ||||
|          * @private | ||||
|          * @return true if object is editable | ||||
|          */ | ||||
|         ObjectHeaderController.prototype.allowEdit = function () { | ||||
|             var type = this.domainObject && this.domainObject.getCapability('type'); | ||||
|             return !!(type && type.hasFeature('creation')); | ||||
|         }; | ||||
|  | ||||
|         return ObjectHeaderController; | ||||
|     } | ||||
| ); | ||||
| @@ -31,12 +31,17 @@ define( | ||||
|          * @constructor | ||||
|          * @memberof platform/commonUI/browse | ||||
|          */ | ||||
|         function PaneController($scope, agentService, $window) { | ||||
|         function PaneController($scope, agentService, $window, $location, $attrs) { | ||||
|             var self = this; | ||||
|             this.agentService = agentService; | ||||
|             var hideParameterPresent = $location.search().hasOwnProperty($attrs.hideParameter); | ||||
|  | ||||
|             // Fast and cheap: if this has been opened in a new window, hide panes by default | ||||
|             this.state = !$window.opener; | ||||
|             if ($attrs.hideParameter && hideParameterPresent) { | ||||
|                 this.state = false; | ||||
|                 $location.search($attrs.hideParameter, undefined); | ||||
|             } else { | ||||
|                 this.state = true; | ||||
|             } | ||||
|  | ||||
|             /** | ||||
|              * Callback to invoke when any selection occurs in the tree. | ||||
| @@ -70,7 +75,7 @@ define( | ||||
|          * @returns {boolean} true when visible | ||||
|          */ | ||||
|         PaneController.prototype.visible = function () { | ||||
|             return this.state; | ||||
|             return !!this.state; | ||||
|         }; | ||||
|  | ||||
|         return PaneController; | ||||
|   | ||||
| @@ -38,6 +38,7 @@ define( | ||||
|  | ||||
|             this.urlService = urlService; | ||||
|             this.open = function () { | ||||
|                 arguments[0] += "&hideTree=true&hideInspector=true"; | ||||
|                 $window.open.apply($window, arguments); | ||||
|             }; | ||||
|  | ||||
|   | ||||
| @@ -33,7 +33,9 @@ define( | ||||
|                 mockNavigationService, | ||||
|                 mockNavigationUnlistener, | ||||
|                 mockStatusUnlistener, | ||||
|                 controller; | ||||
|                 controller, | ||||
|                 mockLocation, | ||||
|                 mockAttrs; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockScope = jasmine.createSpyObj("$scope", ["$on"]); | ||||
| @@ -71,7 +73,12 @@ define( | ||||
|                 mockDomainObject.hasCapability.andReturn(true); | ||||
|                 mockDomainObject.getCapability.andReturn(mockStatusCapability); | ||||
|  | ||||
|                 controller = new InspectorPaneController(mockScope, mockAgentService, mockWindow, mockNavigationService); | ||||
|                 mockLocation = jasmine.createSpyObj('location', ['search']); | ||||
|                 mockLocation.search.andReturn({}); | ||||
|  | ||||
|                 mockAttrs = {}; | ||||
|  | ||||
|                 controller = new InspectorPaneController(mockScope, mockAgentService, mockWindow, mockNavigationService, mockLocation, mockAttrs); | ||||
|             }); | ||||
|  | ||||
|             it("listens for changes to navigation and attaches a status" + | ||||
|   | ||||
							
								
								
									
										137
									
								
								platform/commonUI/browse/test/ObjectHeaderControllerSpec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								platform/commonUI/browse/test/ObjectHeaderControllerSpec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     ["../src/ObjectHeaderController"], | ||||
|     function (ObjectHeaderController) { | ||||
|  | ||||
|         describe("The object header controller", function () { | ||||
|             var mockScope, | ||||
|                 mockDomainObject, | ||||
|                 mockCapabilities, | ||||
|                 mockMutationCapability, | ||||
|                 mockTypeCapability, | ||||
|                 mockEvent, | ||||
|                 mockCurrentTarget, | ||||
|                 model, | ||||
|                 controller; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockMutationCapability = jasmine.createSpyObj("mutation", ["mutate"]); | ||||
|                 mockTypeCapability = jasmine.createSpyObj("type", ["typeDef", "hasFeature"]); | ||||
|                 mockTypeCapability.typeDef = { name: ""}; | ||||
|                 mockTypeCapability.hasFeature.andCallFake(function (feature) { | ||||
|                     return feature === 'creation'; | ||||
|                 }); | ||||
|  | ||||
|                 mockCapabilities = { | ||||
|                     mutation: mockMutationCapability, | ||||
|                     type: mockTypeCapability | ||||
|                 }; | ||||
|  | ||||
|                 model = { | ||||
|                     name: "Test name" | ||||
|                 }; | ||||
|                 mockDomainObject = jasmine.createSpyObj("domainObject", ["getCapability", "getModel"]); | ||||
|                 mockDomainObject.getModel.andReturn(model); | ||||
|                 mockDomainObject.getCapability.andCallFake(function (key) { | ||||
|                     return mockCapabilities[key]; | ||||
|                 }); | ||||
|  | ||||
|                 mockScope = { | ||||
|                     domainObject: mockDomainObject | ||||
|                 }; | ||||
|  | ||||
|                 mockCurrentTarget = jasmine.createSpyObj("currentTarget", ["blur", "textContent"]); | ||||
|                 mockCurrentTarget.blur.andReturn(mockCurrentTarget); | ||||
|  | ||||
|                 mockEvent = { | ||||
|                     which: {}, | ||||
|                     type: {}, | ||||
|                     currentTarget: mockCurrentTarget | ||||
|                 }; | ||||
|  | ||||
|                 controller = new ObjectHeaderController(mockScope); | ||||
|             }); | ||||
|  | ||||
|             it("updates the model with new name on blur", function () { | ||||
|                 mockEvent.type = "blur"; | ||||
|                 mockCurrentTarget.textContent = "New name"; | ||||
|                 controller.updateName(mockEvent); | ||||
|  | ||||
|                 expect(mockMutationCapability.mutate).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("updates the model with a default for blank names", function () { | ||||
|                 mockEvent.type = "blur"; | ||||
|                 mockCurrentTarget.textContent = ""; | ||||
|                 controller.updateName(mockEvent); | ||||
|  | ||||
|                 expect(mockCurrentTarget.textContent.length).not.toEqual(0); | ||||
|                 expect(mockMutationCapability.mutate).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("does not update the model if the same name", function () { | ||||
|                 mockEvent.type = "blur"; | ||||
|                 mockCurrentTarget.textContent = mockDomainObject.getModel().name; | ||||
|                 controller.updateName(mockEvent); | ||||
|  | ||||
|                 expect(mockMutationCapability.mutate).not.toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("updates the model on enter keypress event only", function () { | ||||
|                 mockCurrentTarget.textContent = "New name"; | ||||
|                 controller.updateName(mockEvent); | ||||
|  | ||||
|                 expect(mockMutationCapability.mutate).not.toHaveBeenCalled(); | ||||
|  | ||||
|                 mockEvent.which = 13; | ||||
|                 controller.updateName(mockEvent); | ||||
|  | ||||
|                 expect(mockMutationCapability.mutate).toHaveBeenCalledWith(jasmine.any(Function)); | ||||
|  | ||||
|                 mockMutationCapability.mutate.mostRecentCall.args[0](model); | ||||
|  | ||||
|                 expect(mockDomainObject.getModel().name).toBe("New name"); | ||||
|             }); | ||||
|  | ||||
|             it("blurs the field on enter key press", function () { | ||||
|                 mockCurrentTarget.textContent = "New name"; | ||||
|                 mockEvent.which = 13; | ||||
|                 controller.updateName(mockEvent); | ||||
|  | ||||
|                 expect(mockEvent.currentTarget.blur).toHaveBeenCalled(); | ||||
|             }); | ||||
|  | ||||
|             it("allows editting name when object is creatable", function () { | ||||
|                 expect(controller.allowEdit()).toBe(true); | ||||
|             }); | ||||
|  | ||||
|             it("disallows editting name when object is non-creatable", function () { | ||||
|                 mockTypeCapability.hasFeature.andReturn(false); | ||||
|  | ||||
|                 expect(controller.allowEdit()).toBe(false); | ||||
|  | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
| @@ -29,7 +29,9 @@ define( | ||||
|                 mockAgentService, | ||||
|                 mockDomainObjects, | ||||
|                 mockWindow, | ||||
|                 controller; | ||||
|                 controller, | ||||
|                 mockLocation, | ||||
|                 mockAttrs; | ||||
|  | ||||
|             // We want to reinstantiate for each test case | ||||
|             // because device state can influence constructor-time behavior | ||||
| @@ -37,7 +39,9 @@ define( | ||||
|                 return new PaneController( | ||||
|                     mockScope, | ||||
|                     mockAgentService, | ||||
|                     mockWindow | ||||
|                     mockWindow, | ||||
|                     mockLocation, | ||||
|                     mockAttrs | ||||
|                 ); | ||||
|             } | ||||
|  | ||||
| @@ -59,6 +63,11 @@ define( | ||||
|                     ["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"] | ||||
|                 ); | ||||
|                 mockWindow = jasmine.createSpyObj("$window", ["open"]); | ||||
|  | ||||
|                 mockLocation = jasmine.createSpyObj('location', ['search']); | ||||
|                 mockLocation.search.andReturn({}); | ||||
|  | ||||
|                 mockAttrs = {}; | ||||
|             }); | ||||
|  | ||||
|             it("is initially visible", function () { | ||||
| @@ -86,6 +95,24 @@ define( | ||||
|                 // Tree should have collapsed | ||||
|                 expect(controller.visible()).toBeFalsy(); | ||||
|             }); | ||||
|  | ||||
|             describe("specifying hideParameter", function () { | ||||
|                 beforeEach(function () { | ||||
|                     mockAttrs = {hideParameter: 'hideTree'}; | ||||
|                 }); | ||||
|  | ||||
|                 it("sets pane state to false when in location.search", function () { | ||||
|                     mockLocation.search.andReturn({'hideTree': true}); | ||||
|                     expect(instantiateController().visible()).toBe(false); | ||||
|                     expect(mockLocation.search).toHaveBeenCalledWith('hideTree', undefined); | ||||
|                 }); | ||||
|  | ||||
|                 it("sets state to true when not found in location.search", function () { | ||||
|                     mockLocation.search.andReturn({}); | ||||
|                     expect(instantiateController().visible()).toBe(true); | ||||
|                     expect(mockLocation.search).not.toHaveBeenCalledWith('hideTree', undefined); | ||||
|                 }); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| ); | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div class="abs top-bar"> | ||||
|     <div class="title">{{ngModel.title}}</div> | ||||
|     <div class="dialog-title">{{ngModel.title}}</div> | ||||
|     <div class="hint">All fields marked <span class="req icon-asterisk"></span> are required.</div> | ||||
| </div> | ||||
| <div class='abs editor'> | ||||
|   | ||||
| @@ -1,11 +1,10 @@ | ||||
| <div class="l-message" | ||||
|      ng-class="'message-severity-' + ngModel.severity"> | ||||
|     <div class="ui-symbol type-icon message-type"></div> | ||||
|     <div class="message-contents"> | ||||
|     <div class="w-message-contents"> | ||||
|         <div class="top-bar"> | ||||
|             <div class="title">{{ngModel.title}}</div> | ||||
|             <div class="hint" ng-hide="ngModel.hint === undefined">{{ngModel.hint}}</div> | ||||
|         </div> | ||||
|         <div class="hint" ng-hide="ngModel.hint === undefined">{{ngModel.hint}}</div> | ||||
|         <div class="message-body"> | ||||
|             <div class="message-action"> | ||||
|                 {{ngModel.actionText}} | ||||
| @@ -25,8 +24,6 @@ | ||||
|                ng-click="ngModel.primaryOption.callback()"> | ||||
|                 {{ngModel.primaryOption.label}} | ||||
|             </a> | ||||
|  | ||||
|         </div> | ||||
|  | ||||
|     </div> | ||||
| </div> | ||||
|   | ||||
| @@ -1,17 +1,17 @@ | ||||
| <mct-container key="overlay" class="t-message-list"> | ||||
|     <div class="message-contents"> | ||||
|         <div class="abs top-bar"> | ||||
|             <div class="title">{{ngModel.dialog.title}}</div> | ||||
| <mct-container key="overlay"> | ||||
|     <div class="t-message-list"> | ||||
|         <div class="top-bar"> | ||||
|             <div class="dialog-title">{{ngModel.dialog.title}}</div> | ||||
|             <div class="hint">Displaying {{ngModel.dialog.messages.length}} message<span ng-show="ngModel.dialog.messages.length > 1 || | ||||
|                                                                                                   ngModel.dialog.messages.length == 0">s</span> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="abs message-body"> | ||||
|         <div class="w-messages"> | ||||
|             <mct-include | ||||
|                     ng-repeat="msg in ngModel.dialog.messages | orderBy: '-'" | ||||
|                     key="'message'" ng-model="msg.model"></mct-include> | ||||
|                 ng-repeat="msg in ngModel.dialog.messages | orderBy: '-'" | ||||
|                 key="'message'" ng-model="msg.model"></mct-include> | ||||
|         </div> | ||||
|         <div class="abs bottom-bar"> | ||||
|         <div class="bottom-bar"> | ||||
|             <a ng-repeat="dialogAction in ngModel.dialog.actions" | ||||
|                class="s-button major" | ||||
|                ng-click="dialogAction.action()"> | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
| --> | ||||
| <mct-container key="overlay"> | ||||
|     <div class="abs top-bar"> | ||||
|         <div class="title">{{ngModel.dialog.title}}</div> | ||||
|         <div class="dialog-title">{{ngModel.dialog.title}}</div> | ||||
|         <div class="hint">{{ngModel.dialog.hint}}</div> | ||||
|     </div> | ||||
|     <div class='abs editor'> | ||||
|   | ||||
| @@ -121,7 +121,8 @@ define([ | ||||
|                     "key": "ElementsController", | ||||
|                     "implementation": ElementsController, | ||||
|                     "depends": [ | ||||
|                         "$scope" | ||||
|                         "$scope", | ||||
|                         "openmct" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
| @@ -299,9 +300,6 @@ define([ | ||||
|                 { | ||||
|                     "key": "edit-elements", | ||||
|                     "template": elementsTemplate, | ||||
|                     "uses": [ | ||||
|                         "composition" | ||||
|                     ], | ||||
|                     "gestures": [ | ||||
|                         "drop" | ||||
|                     ] | ||||
| @@ -385,7 +383,10 @@ define([ | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "implementation": EditToolbarRepresenter | ||||
|                     "implementation": EditToolbarRepresenter, | ||||
|                     "depends": [ | ||||
|                         "openmct" | ||||
|                     ] | ||||
|                 } | ||||
|             ], | ||||
|             "constants": [ | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
|     <div class="s-menu-button major create-button" ng-click="createController.toggle()"> | ||||
| 		<span class="title-label">Create</span> | ||||
|     </div> | ||||
|     <div class="menu super-menu" ng-show="createController.isActive()"> | ||||
|     <div class="menu super-menu l-create-menu" ng-show="createController.isActive()"> | ||||
|         <mct-representation mct-object="domainObject" key="'create-menu'"> | ||||
|         </mct-representation> | ||||
|     </div> | ||||
|   | ||||
| @@ -19,8 +19,8 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div class="contents" ng-controller="CreateMenuController"> | ||||
|     <div class="pane left menu-items"> | ||||
| <div class="w-menu" ng-controller="CreateMenuController"> | ||||
|     <div class="col menu-items"> | ||||
|         <ul> | ||||
|             <li ng-repeat="createAction in createActions" ng-click="createAction.perform()"> | ||||
|                 <a ng-mouseover="representation.activeMetadata = createAction.getMetadata()" | ||||
| @@ -31,13 +31,15 @@ | ||||
|             </li> | ||||
|         </ul> | ||||
|     </div> | ||||
|     <div class="pane right menu-item-description"> | ||||
|     <div class="col menu-item-description"> | ||||
|         <div class="desc-area icon {{ representation.activeMetadata.cssClass }}"></div> | ||||
|         <div class="desc-area title"> | ||||
|             {{representation.activeMetadata.name}} | ||||
|         </div> | ||||
|         <div class="desc-area description"> | ||||
|             {{representation.activeMetadata.description}} | ||||
|         <div class="w-title-desc"> | ||||
|             <div class="desc-area title"> | ||||
|                 {{representation.activeMetadata.name}} | ||||
|             </div> | ||||
|             <div class="desc-area description"> | ||||
|                 {{representation.activeMetadata.description}} | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
|   | ||||
| @@ -61,7 +61,12 @@ | ||||
|             <mct-representation key="representation.selected.key" | ||||
|                                 mct-object="representation.selected.key && domainObject" | ||||
|                                 class="abs flex-elem grows object-holder-main scroll" | ||||
|                                 toolbar="toolbar"> | ||||
|                                 toolbar="toolbar" | ||||
|                                 mct-selectable="{ | ||||
|                                     item: domainObject.useCapability('adapter'), | ||||
|                                     oldItem: domainObject | ||||
|                                 }" | ||||
|                                 mct-init-select> | ||||
|             </mct-representation> | ||||
|         </div><!--/ l-object-wrapper-inner --> | ||||
|     </div> | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|                  ng-model="filterBy"> | ||||
|     </mct-include> | ||||
|     <div class="flex-elem grows vscroll"> | ||||
|         <ul class="tree"> | ||||
|         <ul class="tree" ng-if="composition.length > 0"> | ||||
|             <li ng-repeat="containedObject in composition | filter:searchElements"> | ||||
|                 <span class="tree-item"> | ||||
|                     <mct-representation | ||||
| @@ -36,5 +36,6 @@ | ||||
|                 </span> | ||||
|             </li> | ||||
|         </ul> | ||||
|         <div ng-if="composition.length === 0">No contained elements</div>     | ||||
|     </div> | ||||
| </div> | ||||
|   | ||||
| @@ -101,10 +101,15 @@ define( | ||||
|          */ | ||||
|         EditorCapability.prototype.finish = function () { | ||||
|             var domainObject = this.domainObject; | ||||
|             return this.transactionService.cancel().then(function () { | ||||
|                 domainObject.getCapability("status").set("editing", false); | ||||
|                 return domainObject; | ||||
|             }); | ||||
|  | ||||
|             if (this.transactionService.isActive()) { | ||||
|                 return this.transactionService.cancel().then(function () { | ||||
|                     domainObject.getCapability("status").set("editing", false); | ||||
|                     return domainObject; | ||||
|                 }); | ||||
|             } else { | ||||
|                 return Promise.resolve(domainObject); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -28,16 +28,6 @@ define( | ||||
|     [], | ||||
|     function () { | ||||
|  | ||||
|         function isDirty(domainObject) { | ||||
|             var navigatedObject = domainObject, | ||||
|                 editorCapability = navigatedObject && | ||||
|                     navigatedObject.getCapability("editor"); | ||||
|  | ||||
|             return editorCapability && | ||||
|                 editorCapability.isEditContextRoot() && | ||||
|                 editorCapability.dirty(); | ||||
|         } | ||||
|  | ||||
|         function cancelEditing(domainObject) { | ||||
|             var navigatedObject = domainObject, | ||||
|                 editorCapability = navigatedObject && | ||||
| @@ -59,10 +49,7 @@ define( | ||||
|  | ||||
|             var removeCheck = navigationService | ||||
|                 .checkBeforeNavigation(function () { | ||||
|                     if (isDirty(domainObject)) { | ||||
|                         return "Continuing will cause the loss of any unsaved changes."; | ||||
|                     } | ||||
|                     return false; | ||||
|                     return "Continuing will cause the loss of any unsaved changes."; | ||||
|                 }); | ||||
|  | ||||
|             $scope.$on('$destroy', function () { | ||||
|   | ||||
| @@ -29,7 +29,11 @@ define( | ||||
|          * | ||||
|          * @constructor | ||||
|          */ | ||||
|         function ElementsController($scope) { | ||||
|         function ElementsController($scope, openmct) { | ||||
|             this.scope = $scope; | ||||
|             this.scope.composition = []; | ||||
|             var self = this; | ||||
|  | ||||
|             function filterBy(text) { | ||||
|                 if (typeof text === 'undefined') { | ||||
|                     return $scope.searchText; | ||||
| @@ -47,10 +51,45 @@ define( | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             function setSelection(selection) { | ||||
|                 self.scope.selection = selection; | ||||
|                 self.refreshComposition(selection); | ||||
|             } | ||||
|  | ||||
|             $scope.filterBy = filterBy; | ||||
|             $scope.searchElements = searchElements; | ||||
|  | ||||
|             openmct.selection.on('change', setSelection); | ||||
|             setSelection(openmct.selection.get()); | ||||
|  | ||||
|             $scope.$on("$destroy", function () { | ||||
|                 openmct.selection.off("change", setSelection); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|          * Gets the composition for the selected object and populates the scope with it. | ||||
|          * | ||||
|          * @param selection the selection object | ||||
|          * @private | ||||
|          */ | ||||
|         ElementsController.prototype.refreshComposition = function (selection) { | ||||
|             if (!selection[0]) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             var selected = selection[0].context.oldItem; | ||||
|             var selectedObjectComposition = selected && selected.useCapability('composition'); | ||||
|  | ||||
|             if (selectedObjectComposition) { | ||||
|                 selectedObjectComposition.then(function (composition) { | ||||
|                     this.scope.composition = composition; | ||||
|                 }.bind(this)); | ||||
|             } else { | ||||
|                 this.scope.composition = []; | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         return ElementsController; | ||||
|     } | ||||
| ); | ||||
|   | ||||
| @@ -38,7 +38,7 @@ define( | ||||
|          * @constructor | ||||
|          * @implements {Representer} | ||||
|          */ | ||||
|         function EditToolbarRepresenter(scope, element, attrs) { | ||||
|         function EditToolbarRepresenter(openmct, scope, element, attrs) { | ||||
|             var self = this; | ||||
|  | ||||
|             // Mark changes as ready to persist | ||||
| @@ -109,6 +109,7 @@ define( | ||||
|             this.updateSelection = updateSelection; | ||||
|             this.toolbar = undefined; | ||||
|             this.toolbarObject = {}; | ||||
|             this.openmct = openmct; | ||||
|  | ||||
|             // If this representation exposes a toolbar, set up watches | ||||
|             // to synchronize with it. | ||||
| @@ -146,7 +147,7 @@ define( | ||||
|             // Expose the toolbar object to the parent scope | ||||
|             initialize(definition); | ||||
|             // Create a selection scope | ||||
|             this.setSelection(new EditToolbarSelection()); | ||||
|             this.setSelection(new EditToolbarSelection(this.openmct)); | ||||
|             // Initialize toolbar to an empty selection | ||||
|             this.updateSelection([]); | ||||
|         }; | ||||
|   | ||||
| @@ -38,10 +38,24 @@ define( | ||||
|          * @memberof platform/commonUI/edit | ||||
|          * @constructor | ||||
|          */ | ||||
|         function EditToolbarSelection() { | ||||
|         function EditToolbarSelection(openmct) { | ||||
|             this.selection = [{}]; | ||||
|             this.selecting = false; | ||||
|             this.selectedObj = undefined; | ||||
|  | ||||
|             openmct.selection.on('change', function (selection) { | ||||
|                 var selected = selection[0]; | ||||
|  | ||||
|                 if (selected && selected.context.toolbar) { | ||||
|                     this.select(selected.context.toolbar); | ||||
|                 } else { | ||||
|                     this.deselect(); | ||||
|                 } | ||||
|  | ||||
|                 if (selected && selected.context.viewProxy) { | ||||
|                     this.proxy(selected.context.viewProxy); | ||||
|                 } | ||||
|             }.bind(this)); | ||||
|         } | ||||
|  | ||||
|         /** | ||||
|   | ||||
| @@ -62,6 +62,7 @@ define( | ||||
|                 ); | ||||
|                 mockTransactionService.commit.andReturn(fastPromise()); | ||||
|                 mockTransactionService.cancel.andReturn(fastPromise()); | ||||
|                 mockTransactionService.isActive = jasmine.createSpy('isActive'); | ||||
|  | ||||
|                 mockStatusCapability = jasmine.createSpyObj( | ||||
|                     "statusCapability", | ||||
| @@ -141,6 +142,7 @@ define( | ||||
|  | ||||
|             describe("finish", function () { | ||||
|                 beforeEach(function () { | ||||
|                     mockTransactionService.isActive.andReturn(true); | ||||
|                     capability.edit(); | ||||
|                     capability.finish(); | ||||
|                 }); | ||||
| @@ -152,6 +154,23 @@ define( | ||||
|                 }); | ||||
|             }); | ||||
|  | ||||
|             describe("finish", function () { | ||||
|                 beforeEach(function () { | ||||
|                     mockTransactionService.isActive.andReturn(false); | ||||
|                     capability.edit(); | ||||
|                 }); | ||||
|  | ||||
|                 it("does not cancel transaction when transaction is not active", function () { | ||||
|                     capability.finish(); | ||||
|                     expect(mockTransactionService.cancel).not.toHaveBeenCalled(); | ||||
|                 }); | ||||
|  | ||||
|                 it("returns a promise", function () { | ||||
|                     expect(capability.finish() instanceof Promise).toBe(true); | ||||
|                 }); | ||||
|  | ||||
|             }); | ||||
|  | ||||
|             describe("dirty", function () { | ||||
|                 var model = {}; | ||||
|  | ||||
|   | ||||
| @@ -104,10 +104,10 @@ define( | ||||
|                 mockEditorCapability.isEditContextRoot.andReturn(false); | ||||
|                 mockEditorCapability.dirty.andReturn(false); | ||||
|  | ||||
|                 expect(checkFn()).toBe(false); | ||||
|                 expect(checkFn()).toBe("Continuing will cause the loss of any unsaved changes."); | ||||
|  | ||||
|                 mockEditorCapability.isEditContextRoot.andReturn(true); | ||||
|                 expect(checkFn()).toBe(false); | ||||
|                 expect(checkFn()).toBe("Continuing will cause the loss of any unsaved changes."); | ||||
|  | ||||
|                 mockEditorCapability.dirty.andReturn(true); | ||||
|                 expect(checkFn()) | ||||
|   | ||||
| @@ -27,11 +27,23 @@ define( | ||||
|  | ||||
|         describe("The Elements Pane controller", function () { | ||||
|             var mockScope, | ||||
|                 mockOpenMCT, | ||||
|                 mockSelection, | ||||
|                 controller; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockScope = jasmine.createSpy("$scope"); | ||||
|                 controller = new ElementsController(mockScope); | ||||
|                 mockScope = jasmine.createSpyObj("$scope", ['$on']); | ||||
|                 mockSelection = jasmine.createSpyObj("selection", [ | ||||
|                     'on', | ||||
|                     'off', | ||||
|                     'get' | ||||
|                 ]); | ||||
|                 mockSelection.get.andReturn([]); | ||||
|                 mockOpenMCT = { | ||||
|                     selection: mockSelection | ||||
|                 }; | ||||
|  | ||||
|                 controller = new ElementsController(mockScope, mockOpenMCT); | ||||
|             }); | ||||
|  | ||||
|             function getModel(model) { | ||||
|   | ||||
| @@ -29,7 +29,9 @@ define( | ||||
|                 mockElement, | ||||
|                 testAttrs, | ||||
|                 mockUnwatch, | ||||
|                 representer; | ||||
|                 representer, | ||||
|                 mockOpenMCT, | ||||
|                 mockSelection; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 mockScope = jasmine.createSpyObj( | ||||
| @@ -46,7 +48,18 @@ define( | ||||
|  | ||||
|                 mockScope.$parent.$watchCollection.andReturn(mockUnwatch); | ||||
|  | ||||
|                 mockSelection = jasmine.createSpyObj("selection", [ | ||||
|                     'on', | ||||
|                     'off', | ||||
|                     'get' | ||||
|                 ]); | ||||
|                 mockSelection.get.andReturn([]); | ||||
|                 mockOpenMCT = { | ||||
|                     selection: mockSelection | ||||
|                 }; | ||||
|  | ||||
|                 representer = new EditToolbarRepresenter( | ||||
|                     mockOpenMCT, | ||||
|                     mockScope, | ||||
|                     mockElement, | ||||
|                     testAttrs | ||||
|   | ||||
| @@ -28,13 +28,25 @@ define( | ||||
|             var testProxy, | ||||
|                 testElement, | ||||
|                 otherElement, | ||||
|                 selection; | ||||
|                 selection, | ||||
|                 mockSelection, | ||||
|                 mockOpenMCT; | ||||
|  | ||||
|             beforeEach(function () { | ||||
|                 testProxy = { someKey: "some value" }; | ||||
|                 testElement = { someOtherKey: "some other value" }; | ||||
|                 otherElement = { yetAnotherKey: 42 }; | ||||
|                 selection = new EditToolbarSelection(); | ||||
|                 mockSelection = jasmine.createSpyObj("selection", [ | ||||
|                     // 'select', | ||||
|                     'on', | ||||
|                     'off', | ||||
|                     'get' | ||||
|                 ]); | ||||
|                 mockSelection.get.andReturn([]); | ||||
|                 mockOpenMCT = { | ||||
|                     selection: mockSelection | ||||
|                 }; | ||||
|                 selection = new EditToolbarSelection(mockOpenMCT); | ||||
|                 selection.proxy(testProxy); | ||||
|             }); | ||||
|  | ||||
|   | ||||
| @@ -121,6 +121,9 @@ define([ | ||||
|     }; | ||||
|  | ||||
|     UTCTimeFormat.prototype.parse = function (text) { | ||||
|         if (typeof text === 'number') { | ||||
|             return text; | ||||
|         } | ||||
|         return moment.utc(text, DATE_FORMATS).valueOf(); | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -41,6 +41,7 @@ define([ | ||||
|     "./src/controllers/BannerController", | ||||
|     "./src/directives/MCTContainer", | ||||
|     "./src/directives/MCTDrag", | ||||
|     "./src/directives/MCTSelectable", | ||||
|     "./src/directives/MCTClickElsewhere", | ||||
|     "./src/directives/MCTResize", | ||||
|     "./src/directives/MCTPopup", | ||||
| @@ -90,6 +91,7 @@ define([ | ||||
|     BannerController, | ||||
|     MCTContainer, | ||||
|     MCTDrag, | ||||
|     MCTSelectable, | ||||
|     MCTClickElsewhere, | ||||
|     MCTResize, | ||||
|     MCTPopup, | ||||
| @@ -328,6 +330,13 @@ define([ | ||||
|                         "$document" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "mctSelectable", | ||||
|                     "implementation": MCTSelectable, | ||||
|                     "depends": [ | ||||
|                         "openmct" | ||||
|                     ] | ||||
|                 }, | ||||
|                 { | ||||
|                     "key": "mctClickElsewhere", | ||||
|                     "implementation": MCTClickElsewhere, | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   "metadata": { | ||||
|     "name": "openmct-symbols-16px", | ||||
|     "lastOpened": 0, | ||||
|     "created": 1502487054429 | ||||
|     "created": 1506973656040 | ||||
|   }, | ||||
|   "iconSets": [ | ||||
|     { | ||||
| @@ -636,13 +636,29 @@ | ||||
|           "code": 921670, | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 138, | ||||
|           "id": 115, | ||||
|           "name": "icon-import", | ||||
|           "prevSize": 24, | ||||
|           "code": 921671, | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 136, | ||||
|           "id": 116, | ||||
|           "name": "icon-export", | ||||
|           "prevSize": 24, | ||||
|           "code": 921672, | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 37, | ||||
|           "prevSize": 24, | ||||
|           "name": "icon-activity", | ||||
|           "id": 32, | ||||
|           "code": 921856, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 36, | ||||
| @@ -650,7 +666,7 @@ | ||||
|           "name": "icon-activity-mode", | ||||
|           "id": 31, | ||||
|           "code": 921857, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 52, | ||||
| @@ -658,7 +674,7 @@ | ||||
|           "name": "icon-autoflow-tabular", | ||||
|           "id": 47, | ||||
|           "code": 921858, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 55, | ||||
| @@ -666,7 +682,7 @@ | ||||
|           "name": "icon-clock", | ||||
|           "id": 50, | ||||
|           "code": 921859, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 58, | ||||
| @@ -674,7 +690,7 @@ | ||||
|           "name": "icon-database", | ||||
|           "id": 53, | ||||
|           "code": 921860, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 57, | ||||
| @@ -682,7 +698,7 @@ | ||||
|           "name": "icon-database-query", | ||||
|           "id": 52, | ||||
|           "code": 921861, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 17, | ||||
| @@ -690,7 +706,7 @@ | ||||
|           "name": "icon-dataset", | ||||
|           "id": 12, | ||||
|           "code": 921862, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 22, | ||||
| @@ -698,7 +714,7 @@ | ||||
|           "name": "icon-datatable", | ||||
|           "id": 17, | ||||
|           "code": 921863, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 59, | ||||
| @@ -706,7 +722,7 @@ | ||||
|           "name": "icon-dictionary", | ||||
|           "id": 54, | ||||
|           "code": 921864, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 62, | ||||
| @@ -714,7 +730,7 @@ | ||||
|           "name": "icon-folder", | ||||
|           "id": 57, | ||||
|           "code": 921865, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 66, | ||||
| @@ -722,7 +738,7 @@ | ||||
|           "name": "icon-image", | ||||
|           "id": 61, | ||||
|           "code": 921872, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 68, | ||||
| @@ -730,7 +746,7 @@ | ||||
|           "name": "icon-layout", | ||||
|           "id": 63, | ||||
|           "code": 921873, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 77, | ||||
| @@ -738,7 +754,7 @@ | ||||
|           "name": "icon-object", | ||||
|           "id": 72, | ||||
|           "code": 921874, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 78, | ||||
| @@ -746,7 +762,7 @@ | ||||
|           "name": "icon-object-unknown", | ||||
|           "id": 73, | ||||
|           "code": 921875, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 79, | ||||
| @@ -754,7 +770,7 @@ | ||||
|           "name": "icon-packet", | ||||
|           "id": 74, | ||||
|           "code": 921876, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 80, | ||||
| @@ -762,7 +778,7 @@ | ||||
|           "name": "icon-page", | ||||
|           "id": 75, | ||||
|           "code": 921877, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 135, | ||||
| @@ -770,7 +786,7 @@ | ||||
|           "name": "icon-plot-overlay", | ||||
|           "prevSize": 24, | ||||
|           "code": 921878, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 113, | ||||
| @@ -778,7 +794,7 @@ | ||||
|           "name": "icon-plot-stacked", | ||||
|           "prevSize": 24, | ||||
|           "code": 921879, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 10, | ||||
| @@ -786,7 +802,7 @@ | ||||
|           "name": "icon-session", | ||||
|           "id": 5, | ||||
|           "code": 921880, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 24, | ||||
| @@ -794,7 +810,7 @@ | ||||
|           "name": "icon-tabular", | ||||
|           "id": 19, | ||||
|           "code": 921881, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 7, | ||||
| @@ -802,7 +818,7 @@ | ||||
|           "name": "icon-tabular-lad", | ||||
|           "id": 2, | ||||
|           "code": 921888, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 6, | ||||
| @@ -810,7 +826,7 @@ | ||||
|           "name": "icon-tabular-lad-set", | ||||
|           "id": 1, | ||||
|           "code": 921889, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 8, | ||||
| @@ -818,7 +834,7 @@ | ||||
|           "name": "icon-tabular-realtime", | ||||
|           "id": 3, | ||||
|           "code": 921890, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 23, | ||||
| @@ -826,7 +842,7 @@ | ||||
|           "name": "icon-tabular-scrolling", | ||||
|           "id": 18, | ||||
|           "code": 921891, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 112, | ||||
| @@ -834,7 +850,7 @@ | ||||
|           "name": "icon-telemetry", | ||||
|           "id": 86, | ||||
|           "code": 921892, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 90, | ||||
| @@ -842,7 +858,7 @@ | ||||
|           "name": "icon-telemetry-panel", | ||||
|           "id": 85, | ||||
|           "code": 921893, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 93, | ||||
| @@ -850,7 +866,7 @@ | ||||
|           "name": "icon-timeline", | ||||
|           "id": 88, | ||||
|           "code": 921894, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 116, | ||||
| @@ -858,7 +874,7 @@ | ||||
|           "name": "icon-timer-v1.5", | ||||
|           "prevSize": 24, | ||||
|           "code": 921895, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 11, | ||||
| @@ -866,7 +882,7 @@ | ||||
|           "name": "icon-topic", | ||||
|           "id": 6, | ||||
|           "code": 921896, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 115, | ||||
| @@ -874,7 +890,7 @@ | ||||
|           "name": "icon-box-with-dashed-lines", | ||||
|           "id": 29, | ||||
|           "code": 921897, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 126, | ||||
| @@ -882,7 +898,15 @@ | ||||
|           "name": "icon-summary-widget", | ||||
|           "prevSize": 24, | ||||
|           "code": 921904, | ||||
|           "tempChar": "" | ||||
|           "tempChar": "" | ||||
|         }, | ||||
|         { | ||||
|           "order": 139, | ||||
|           "id": 117, | ||||
|           "name": "icon-notebook", | ||||
|           "prevSize": 24, | ||||
|           "code": 921905, | ||||
|           "tempChar": "" | ||||
|         } | ||||
|       ], | ||||
|       "metadata": { | ||||
| @@ -2683,6 +2707,52 @@ | ||||
|             ] | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           "id": 115, | ||||
|           "paths": [ | ||||
|             "M832 192.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-319.6v192h320c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192h-320v192h319.6c0.2 0 0.4 0.2 0.4 0.4z", | ||||
|             "M192 704v192l384-384-384-384v192h-192v384z" | ||||
|           ], | ||||
|           "attrs": [ | ||||
|             {}, | ||||
|             {} | ||||
|           ], | ||||
|           "grid": 16, | ||||
|           "tags": [ | ||||
|             "icon-import" | ||||
|           ], | ||||
|           "isMulticolor": false, | ||||
|           "isMulticolor2": false, | ||||
|           "colorPermutations": { | ||||
|             "1161751207457516161751": [ | ||||
|               {}, | ||||
|               {} | ||||
|             ] | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           "id": 116, | ||||
|           "paths": [ | ||||
|             "M192 831.66v-639.32l0.34-0.34h319.66v-192h-320c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h320v-192h-319.66z", | ||||
|             "M1024 512l-384-384v192h-192v384h192v192l384-384z" | ||||
|           ], | ||||
|           "attrs": [ | ||||
|             {}, | ||||
|             {} | ||||
|           ], | ||||
|           "isMulticolor": false, | ||||
|           "isMulticolor2": false, | ||||
|           "grid": 16, | ||||
|           "tags": [ | ||||
|             "icon-export" | ||||
|           ], | ||||
|           "colorPermutations": { | ||||
|             "1161751207457516161751": [ | ||||
|               {}, | ||||
|               {} | ||||
|             ] | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           "paths": [ | ||||
|             "M576 64h-256l320 320h-290.256c-44.264-76.516-126.99-128-221.744-128h-128v512h128c94.754 0 177.48-51.484 221.744-128h290.256l-320 320h256l448-448-448-448z" | ||||
| @@ -3462,6 +3532,29 @@ | ||||
|               {} | ||||
|             ] | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           "id": 117, | ||||
|           "paths": [ | ||||
|             "M896 110.8c0-79.8-55.4-127.4-123-105.4l-773 250.6h896v-145.2z", | ||||
|             "M896 320h-896v576c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-448c0-70.4-57.6-128-128-128zM832 832h-384v-320h384v320z" | ||||
|           ], | ||||
|           "attrs": [ | ||||
|             {}, | ||||
|             {} | ||||
|           ], | ||||
|           "isMulticolor": false, | ||||
|           "isMulticolor2": false, | ||||
|           "grid": 16, | ||||
|           "tags": [ | ||||
|             "icon-notebook" | ||||
|           ], | ||||
|           "colorPermutations": { | ||||
|             "1161751207457516161751": [ | ||||
|               {}, | ||||
|               {} | ||||
|             ] | ||||
|           } | ||||
|         } | ||||
|       ], | ||||
|       "colorThemes": [ | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| @@ -85,6 +85,8 @@ | ||||
| <glyph unicode="󡁄" glyph-name="icon-grid-snap-no" d="M768 384h192v-64h-192v64zM256 384h192v-64h-192v64zM0 384h192v-64h-192v64zM640 448h-64v-64h-64v-64h64v-64h64v64h64v64h-64zM576 704h64v-192h-64v192zM576 960h64v-192h-64v192zM576 192h64v-192h-64v192z" /> | ||||
| <glyph unicode="󡁅" glyph-name="icon-frame-show" d="M0 896v-896h1024v896h-1024zM896 128h-768v640h768v-640zM192 704h384v-128h-384v128z" /> | ||||
| <glyph unicode="󡁆" glyph-name="icon-frame-hide" d="M128 770h420l104 128h-652v-802.4l128 157.4zM896 130h-420l-104-128h652v802.4l-128-157.4zM832 962l-832-1024h192l832 1024zM392 578l104 128h-304v-128z" /> | ||||
| <glyph unicode="󡁇" glyph-name="icon-import" d="M832 767.6v-639.4c0-0.2-0.2-0.2-0.4-0.4h-319.6v-192h320c105.6 0 192 86.4 192 192v640.2c0 105.6-86.4 192-192 192h-320v-192h319.6c0.2 0 0.4-0.2 0.4-0.4zM192 256v-192l384 384-384 384v-192h-192v-384z" /> | ||||
| <glyph unicode="󡁈" glyph-name="icon-export" d="M192 128.34v639.32l0.34 0.34h319.66v192h-320c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h320v192h-319.66zM1024 448l-384 384v-192h-192v-384h192v-192l384 384z" /> | ||||
| <glyph unicode="󡄀" glyph-name="icon-activity" d="M576 896h-256l320-320h-290.256c-44.264 76.516-126.99 128-221.744 128h-128v-512h128c94.754 0 177.48 51.484 221.744 128h290.256l-320-320h256l448 448-448 448z" /> | ||||
| <glyph unicode="󡄁" glyph-name="icon-activity-mode" d="M512 960c-214.866 0-398.786-132.372-474.744-320h90.744c56.86 0 107.938-24.724 143.094-64h240.906l-192 192h256l320-320-320-320h-256l192 192h-240.906c-35.156-39.276-86.234-64-143.094-64h-90.744c75.958-187.628 259.878-320 474.744-320 282.77 0 512 229.23 512 512s-229.23 512-512 512z" /> | ||||
| <glyph unicode="󡄂" glyph-name="icon-autoflow-tabular" d="M192 960c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h64v1024h-64zM384 960h256v-1024h-256v1024zM832 960h-64v-704h256v512c0 105.6-86.4 192-192 192z" /> | ||||
| @@ -116,4 +118,5 @@ | ||||
| <glyph unicode="󡄨" glyph-name="icon-topic" d="M454.36 483.36l86.3 86.3c9.088 8.965 21.577 14.502 35.36 14.502s26.272-5.537 35.366-14.507l86.294-86.294c19.328-19.358 42.832-34.541 69.047-44.082l1.313 171.722-57.64 57.64c-34.407 34.33-81.9 55.558-134.35 55.558s-99.943-21.228-134.354-55.562l-86.296-86.297c-9.088-8.965-21.577-14.502-35.36-14.502s-26.272 5.537-35.366 14.507l-28.674 28.654v-172.14c19.045-7.022 41.040-11.084 63.984-11.084 52.463 0 99.966 21.239 134.379 55.587zM505.64 412.64l-86.3-86.3c-9.088-8.965-21.577-14.502-35.36-14.502s-26.272 5.537-35.366 14.507l-86.294 86.294c-2 2-4.2 4-6.36 6v-197.36c33.664-30.72 78.65-49.537 128.031-49.537 52.44 0 99.923 21.22 134.333 55.541l86.296 86.296c9.088 8.965 21.577 14.502 35.36 14.502s26.272-5.537 35.366-14.507l86.294-86.294c2-2 4.2-4 6.36-6v197.36c-33.664 30.72-78.65 49.537-128.031 49.537-52.44 0-99.923-21.22-134.333-55.541zM832 960h-128v-192h127.66l0.34-0.34v-639.32l-0.34-0.34h-127.66v-192h128c105.6 0 192 86.4 192 192v640c0 105.6-86.4 192-192 192zM320 128h-127.66l-0.34 0.34v639.32l0.34 0.34h127.66v192h-128c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192h128v192z" /> | ||||
| <glyph unicode="󡄩" glyph-name="icon-box-with-dashed-lines" d="M0 576h128v-256h-128v256zM128 831.78l0.22 0.22h191.78v128h-192c-70.606-0.215-127.785-57.394-128-127.979v-192.021h128v191.78zM128 64.22v191.78h-128v-192c0.215-70.606 57.394-127.785 127.979-128h192.021v128h-191.78zM384 960h256v-128h-256v128zM896 64.22l-0.22-0.22h-191.78v-128h192c70.606 0.215 127.785 57.394 128 127.979v192.021h-128v-191.78zM896 960h-192v-128h191.78l0.22-0.22v-191.78h128v192c-0.215 70.606-57.394 127.785-127.979 128zM896 576h128v-256h-128v256zM384 64h256v-128h-256v128zM256 704h512v-512h-512v512z" /> | ||||
| <glyph unicode="󡄰" glyph-name="icon-summary-widget" d="M896 960h-768c-70.4 0-128-57.6-128-128v-768c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v768c0 70.4-57.6 128-128 128zM847.8 349.6l-82.6-143.2-189.6 131.6 19.2-230h-165.4l19.2 230-189.6-131.6-82.6 143.2 208.6 98.4-208.8 98.4 82.6 143.2 189.6-131.6-19.2 230h165.4l-19.2-230 189.6 131.6 82.6-143.2-208.6-98.4 208.8-98.4z" /> | ||||
| <glyph unicode="󡄱" glyph-name="icon-notebook" d="M896 849.2c0 79.8-55.4 127.4-123 105.4l-773-250.6h896v145.2zM896 640h-896v-576c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v448c0 70.4-57.6 128-128 128zM832 128h-384v320h384v-320z" /> | ||||
| </font></defs></svg> | ||||
| Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 44 KiB | 
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /********************************************* COLUMN LAYOUTS STYLES */ | ||||
| /*@mixin cols($totalCols, $span) { | ||||
| @mixin cols($totalCols, $span) { | ||||
|     $cw: 100% / $totalCols; | ||||
|     min-width: (500px / $totalCols) * $span; | ||||
|     @if ($totalCols != $span) { | ||||
| @@ -89,7 +89,7 @@ | ||||
|         @include clearfix; | ||||
|         padding: $interiorMargin 0; | ||||
|     } | ||||
| }*/ | ||||
| } | ||||
|  | ||||
| /********************************************* FLEX STYLES */ | ||||
| .l-flex-row, | ||||
| @@ -137,6 +137,11 @@ | ||||
|         min-height: 0; | ||||
|         &.holder:not(:last-child) { margin-bottom: $interiorMarginLg; } | ||||
|     } | ||||
|     &.l-flex-accordion .flex-accordion-holder { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         //overflow: hidden !important; | ||||
|     } | ||||
|     .flex-container { @include flex-direction(column); } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /************************** FEATURES */ | ||||
| $enableImageryThumbs: false; // Set to true if historical imagery thumbnails are supported | ||||
| $enableImageryThumbs: true; // Set to true if historical imagery thumbnails are supported | ||||
|  | ||||
| /************************** VERY INFLUENTIAL GLOBAL DIMENSIONS */ | ||||
| $bodyMargin: 10px; | ||||
| @@ -82,7 +82,7 @@ $tabularTdPadTB: 2px; | ||||
| /*************** Imagery */ | ||||
| $imageMainControlBarH: 25px; | ||||
| $imageThumbsD: 120px; | ||||
| $imageThumbsWrapperH: $imageThumbsD * 1.4; | ||||
| $imageThumbsWrapperH: 155px; | ||||
| $imageThumbPad: 1px; | ||||
| /*************** Ticks */ | ||||
| $ticksH: 25px; | ||||
| @@ -111,7 +111,9 @@ $bubbleMaxW: 300px; | ||||
| $reqSymbolW: 15px; | ||||
| $reqSymbolM: $interiorMargin * 2; | ||||
| $reqSymbolFontSize: 0.75em; | ||||
| $inputTextP: 3px 5px; | ||||
| $inputTextPTopBtm: 3px; | ||||
| $inputTextPLeftRight: 5px; | ||||
| $inputTextP: $inputTextPTopBtm $inputTextPLeftRight; | ||||
| /*************** Wait Spinner Defaults */ | ||||
| $waitSpinnerD: 32px; | ||||
| $waitSpinnerTreeD: 20px; | ||||
|   | ||||
| @@ -21,32 +21,12 @@ | ||||
| *****************************************************************************/ | ||||
| .t-fixed-position { | ||||
| 	&.l-fixed-position { | ||||
| 		position: absolute; | ||||
| 		top: 0; | ||||
| 		right: 0; | ||||
| 		bottom: 0; | ||||
| 		left: 0; | ||||
| 		width: auto; | ||||
| 		height: auto; | ||||
|  | ||||
| 		.l-grid-holder { | ||||
| 			position: relative; | ||||
| 			height: 100%; | ||||
| 			width: 100%; | ||||
| 			.l-grid { | ||||
| 				position: absolute; | ||||
| 				height: 100%; | ||||
| 				width: 100%; | ||||
| 				pointer-events: none; | ||||
| 				z-index: 0; | ||||
| 			} | ||||
| 		} | ||||
| 		@extend .abs; | ||||
| 	} | ||||
|  | ||||
| 	.l-fixed-position-item { | ||||
|         border-width: 1px; | ||||
| 		position: absolute; | ||||
| 		border: 1px solid transparent; | ||||
|  | ||||
| 		&.s-not-selected { | ||||
| 			opacity: 0.8; | ||||
| 		} | ||||
| @@ -73,6 +53,7 @@ | ||||
| 			font-size: 0.8rem; | ||||
| 			$p: 1px; | ||||
| 			line-height: 100%; | ||||
|             overflow: hidden; | ||||
| 			&.l-static-text { | ||||
| 				padding: $p; | ||||
| 			} | ||||
| @@ -105,37 +86,8 @@ | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	.l-fixed-position-item-handle { | ||||
| 		$brd: 1px solid $colorKey; | ||||
| 		background: rgba($colorKey, 0.5); | ||||
| 		cursor: crosshair; | ||||
| 		border: $brd; | ||||
| 		position: absolute; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| .edit-mode .t-fixed-position { | ||||
| 	&.l-fixed-position { | ||||
| 		.l-grid-holder { | ||||
| 			.l-grid { | ||||
| 				&.l-grid-x { | ||||
| 					@include bgTicks($colorGridLines, 'x'); | ||||
| 				} | ||||
|  | ||||
| 				&.l-grid-y { | ||||
| 					@include bgTicks($colorGridLines, 'y'); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	.l-fixed-position-item { | ||||
| 		&:not(.s-selected) { | ||||
| 			border: 1px dotted rgba($colorKey, 0.75); | ||||
| 			&:hover { | ||||
| 				border: 1px dotted rgba($colorKey, 1.0); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| .s-status-editing { | ||||
|     .l-fixed-position-item-handle.edit-corner { display: block; } | ||||
| } | ||||
|   | ||||
| @@ -180,6 +180,20 @@ a.disabled { | ||||
|     @include ellipsize(); | ||||
| } | ||||
|  | ||||
| .no-selection { | ||||
|     // aka selection = "None". Used in palettes and their menu buttons. | ||||
|     $c: red; $s: 48%; $e: 52%; | ||||
|     @include background-image(linear-gradient(-45deg, | ||||
|         transparent $s - 5%, | ||||
|         $c $s, | ||||
|         $c $e, | ||||
|         transparent $e + 5% | ||||
|     )); | ||||
|     background-repeat: no-repeat; | ||||
|     background-size: contain; | ||||
| } | ||||
|  | ||||
|  | ||||
| .scrolling, | ||||
| .scroll { | ||||
|     overflow: auto; | ||||
|   | ||||
| @@ -1,3 +1,24 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| @mixin glyphBefore($unicode, $family: 'symbolsfont') { | ||||
|     &:before { | ||||
|         content: $unicode; | ||||
| @@ -92,6 +113,8 @@ $glyph-icon-grid-snap-to: '\e1043'; | ||||
| $glyph-icon-grid-snap-no: '\e1044'; | ||||
| $glyph-icon-frame-show: '\e1045'; | ||||
| $glyph-icon-frame-hide: '\e1046'; | ||||
| $glyph-icon-import: '\e1047'; | ||||
| $glyph-icon-export: '\e1048'; | ||||
| $glyph-icon-activity: '\e1100'; | ||||
| $glyph-icon-activity-mode: '\e1101'; | ||||
| $glyph-icon-autoflow-tabular: '\e1102'; | ||||
| @@ -123,6 +146,7 @@ $glyph-icon-timer: '\e1127'; | ||||
| $glyph-icon-topic: '\e1128'; | ||||
| $glyph-icon-box-with-dashed-lines: '\e1129'; | ||||
| $glyph-icon-summary-widget: '\e1130'; | ||||
| $glyph-icon-notebook: '\e1131'; | ||||
|  | ||||
| /************************** 16 PX CLASSES */ | ||||
|  | ||||
| @@ -204,6 +228,8 @@ $glyph-icon-summary-widget: '\e1130'; | ||||
| .icon-grid-snap-no {  @include glyphBefore($glyph-icon-grid-snap-no); } | ||||
| .icon-frame-show {  @include glyphBefore($glyph-icon-frame-show); } | ||||
| .icon-frame-hide {  @include glyphBefore($glyph-icon-frame-hide); } | ||||
| .icon-import {  @include glyphBefore($glyph-icon-import); } | ||||
| .icon-export {  @include glyphBefore($glyph-icon-export); } | ||||
| .icon-activity {  @include glyphBefore($glyph-icon-activity); } | ||||
| .icon-activity-mode {  @include glyphBefore($glyph-icon-activity-mode); } | ||||
| .icon-autoflow-tabular {  @include glyphBefore($glyph-icon-autoflow-tabular); } | ||||
| @@ -235,6 +261,7 @@ $glyph-icon-summary-widget: '\e1130'; | ||||
| .icon-topic {  @include glyphBefore($glyph-icon-topic); } | ||||
| .icon-box-with-dashed-lines {  @include glyphBefore($glyph-icon-box-with-dashed-lines); } | ||||
| .icon-summary-widget {  @include glyphBefore($glyph-icon-summary-widget); } | ||||
| .icon-notebook {  @include glyphBefore($glyph-icon-notebook); } | ||||
|  | ||||
| /************************** 12 PX CLASSES */ | ||||
| .icon-crosshair-12px {  @include glyphBefore($glyph-icon-crosshair,'symbolsfont-12px'); } | ||||
|   | ||||
| @@ -26,5 +26,6 @@ | ||||
|         display: block; | ||||
|         height: 100%; | ||||
|         width: 100%; | ||||
|         border: none; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,39 +0,0 @@ | ||||
| @mixin limitGlyph($iconColor, $glyph: $glyph-icon-alert-triangle) { | ||||
|     &:before { | ||||
|         color: $iconColor; | ||||
|         content: $glyph; | ||||
|         font-family: symbolsfont; | ||||
|         font-size: 0.8em; | ||||
|         display: inline; | ||||
|         margin-right: $interiorMarginSm; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .s-limit-red { background: $colorLimitRedBg !important; } | ||||
| .s-limit-yellow { background: $colorLimitYellowBg !important; } | ||||
|  | ||||
| // Handle limit when applied to a tr | ||||
| tr[class*="s-limit"] { | ||||
|     &.s-limit-red td:first-child { | ||||
|         @include limitGlyph($colorLimitRedIc); | ||||
|     } | ||||
|     &.s-limit-yellow td:first-child { | ||||
|         @include limitGlyph($colorLimitYellowIc); | ||||
|     } | ||||
|     &.s-limit-upr td:first-child:before { content: $glyph-icon-arrow-double-up; } | ||||
|     &.s-limit-lwr td:first-child:before { content: $glyph-icon-arrow-double-down; } | ||||
| } | ||||
|  | ||||
| // Handle limit when applied directly to a non-tr element | ||||
| // Assume this is applied to the element that displays the limit value | ||||
| :not(tr)[class*="s-limit"] { | ||||
|     &.s-limit-red { | ||||
|         @include limitGlyph($colorLimitRedIc); | ||||
|     } | ||||
|     &.s-limit-yellow { | ||||
|         @include limitGlyph($colorLimitYellowIc); | ||||
|     } | ||||
|     &.s-limit-upr:before { content: $glyph-icon-arrow-double-up; } | ||||
|     &.s-limit-lwr:before { content: $glyph-icon-arrow-double-down; } | ||||
| } | ||||
| @@ -27,7 +27,7 @@ | ||||
| @import "about"; | ||||
| @import "text"; | ||||
| @import "icons"; | ||||
| @import "limits"; | ||||
| @import "status"; | ||||
| @import "data-status"; | ||||
| @import "helpers/bubbles"; | ||||
| @import "helpers/splitter"; | ||||
| @@ -37,11 +37,12 @@ | ||||
| /********************************* CONTROLS */ | ||||
| @import "controls/breadcrumb"; | ||||
| @import "controls/buttons"; | ||||
| @import "controls/color-palette"; | ||||
| @import "controls/palette"; | ||||
| @import "controls/controls"; | ||||
| @import "controls/lists"; | ||||
| @import "controls/menus"; | ||||
| @import "controls/messages"; | ||||
| @import "controls/indicators"; | ||||
| @import "mobile/controls/menus"; | ||||
|  | ||||
| /********************************* FORMS */ | ||||
| @@ -80,3 +81,4 @@ | ||||
| @import "autoflow"; | ||||
| @import "features/imagery"; | ||||
| @import "features/time-display"; | ||||
| @import "widgets"; | ||||
|   | ||||
| @@ -316,23 +316,28 @@ | ||||
|     text-shadow: $shdwItemText; | ||||
| } | ||||
|  | ||||
| @mixin input-base($bg: $colorInputBg, $fg: $colorInputFg, $shdw: rgba(black, 0.6) 0 1px 3px) { | ||||
| @mixin input-base() { | ||||
| 	@include appearance(none); | ||||
| 	border-radius: $controlCr; | ||||
| 	box-sizing: border-box; | ||||
| 	box-shadow: inset $shdw; | ||||
| 	background: $bg; | ||||
| 	border: none; | ||||
| 	color: $fg; | ||||
| 	outline: none; | ||||
|     &:focus { outline: 0; } | ||||
| 	&.error { | ||||
| 		background-color: $colorFormFieldErrorBg; | ||||
|         color: $colorFormFieldErrorFg; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @mixin nice-input($bg: $colorInputBg, $fg: $colorInputFg) { | ||||
| 	@include input-base($bg, $fg); | ||||
| @mixin s-input($bg: $colorInputBg, $fg: $colorInputFg, $shdw: rgba(black, 0.6) 0 1px 3px) { | ||||
|     @include input-base(); | ||||
|     background: $bg; | ||||
|     box-shadow: inset $shdw; | ||||
|     color: $fg; | ||||
| } | ||||
|  | ||||
| @mixin nice-input($bg: $colorInputBg, $fg: $colorInputFg, $shdw: rgba(black, 0.6) 0 1px 3px) { | ||||
|     @include s-input($bg, $fg, $shdw); | ||||
|     border: none; | ||||
|     outline: none; | ||||
| } | ||||
|  | ||||
| @mixin contextArrow() { | ||||
| @@ -344,7 +349,7 @@ | ||||
| } | ||||
|  | ||||
| @mixin nice-textarea($bg: $colorBodyBg, $fg: $colorBodyFg) { | ||||
|     @include input-base($bg, $fg); | ||||
|     @include nice-input($bg, $fg); | ||||
|     padding: $interiorMargin; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										107
									
								
								platform/commonUI/general/res/sass/_status.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								platform/commonUI/general/res/sass/_status.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| /*************************************************** MIXINS */ | ||||
| @mixin elementStatusColors($c) { | ||||
|     // Sets bg and icon colors for elements | ||||
|     background: rgba($c, 0.4) !important; | ||||
|     &:before { color: $c !important; } | ||||
| } | ||||
|  | ||||
| @mixin indicatorStatusColors($c) { | ||||
|     &:before, .count { color: $c; } | ||||
| } | ||||
|  | ||||
| /*************************************************** GENERAL */ | ||||
| .s-limit-yellow, | ||||
| .s-limit-red, | ||||
| .s-limit-yellow-icon, | ||||
| .s-limit-red-icon, | ||||
| .s-status-warning-lo, | ||||
| .s-status-warning-hi, | ||||
| .s-status-diagnostic, | ||||
| .s-status-command, | ||||
| .s-status-info, | ||||
| .s-status-ok, | ||||
| .s-status-warning-lo-icon, | ||||
| .s-status-warning-hi-icon, | ||||
| .s-status-diagnostic-icon, | ||||
| .s-status-command-icon, | ||||
| .s-status-info-icon, | ||||
| .s-status-ok-icon { | ||||
|     @include trans-prop-nice($props: background, $dur: 500ms); | ||||
|     &:before { | ||||
|         content:''; | ||||
|         font-family: symbolsfont; | ||||
|         font-size: 0.8em; | ||||
|         margin-right: $interiorMarginSm; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /*************************************************** LIMITS */ | ||||
| .s-limit-yellow, .s-limit-yellow-icon { | ||||
|     @include elementStatusColors($colorWarningLo); | ||||
| } | ||||
|  | ||||
| .s-limit-red, .s-limit-red-icon { | ||||
|     @include elementStatusColors($colorWarningHi); | ||||
| } | ||||
|  | ||||
| .s-limit-upr:before { content: $glyph-icon-arrow-double-up; } | ||||
| .s-limit-lwr:before { content: $glyph-icon-arrow-double-down; } | ||||
| .s-limit-yellow-icon:before, | ||||
| .s-limit-red-icon:before { content: $glyph-icon-alert-triangle; } | ||||
|  | ||||
| /*************************************************** STATUS */ | ||||
| .s-status-warning-hi, .s-status-warning-hi-icon {  @include elementStatusColors($colorWarningHi); } | ||||
| .s-status-warning-lo, .s-status-warning-lo-icon {  @include elementStatusColors($colorWarningLo); } | ||||
| .s-status-diagnostic, .s-status-diagnostic-icon {  @include elementStatusColors($colorDiagnostic); } | ||||
| .s-status-info, .s-status-info-icon {  @include elementStatusColors($colorInfo); } | ||||
| .s-status-ok, .s-status-ok-icon {  @include elementStatusColors($colorOk); } | ||||
|  | ||||
| .s-status-warning-hi-icon:before { content: $glyph-icon-alert-triangle; } | ||||
| .s-status-warning-lo-icon:before { content: $glyph-icon-alert-rect; } | ||||
| .s-status-diagnostic-icon:before { content: $glyph-icon-eye-open; } | ||||
| .s-status-info-icon:before { content: $glyph-icon-info; } | ||||
| .s-status-ok-icon:before { content: $glyph-icon-check; } | ||||
|  | ||||
| /*************************************************** INDICATORS */ | ||||
| .s-indicator-status-info { | ||||
|     @include indicatorStatusColors($colorInfo); | ||||
| } | ||||
| .s-indicator-status-ok { | ||||
|     @include indicatorStatusColors($colorOk); | ||||
| } | ||||
| .s-indicator-status-caution, .s-indicator-status-warning, .s-indicator-status-alert { | ||||
|     @include indicatorStatusColors($colorStatusAlert); | ||||
| } | ||||
| .s-indicator-status-error, .s-indicator-status-err { | ||||
|     @include indicatorStatusColors($colorStatusError); | ||||
| } | ||||
| .s-indicator-status-available { | ||||
|     @include indicatorStatusColors($colorStatusAvailable); | ||||
| } | ||||
| .s-indicator-status-subdued { | ||||
|     opacity: 0.7; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										306
									
								
								platform/commonUI/general/res/sass/_widgets.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								platform/commonUI/general/res/sass/_widgets.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /************************************************************* WIDGET OBJECT */ | ||||
| .l-summary-widget { | ||||
|     // Widget layout classes here | ||||
|     @include ellipsize(); | ||||
|     display: inline-block; | ||||
|     text-align: center; | ||||
|     .widget-label:before { | ||||
|         // Widget icon | ||||
|         font-size: 0.9em; | ||||
|         margin-right: $interiorMarginSm; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .s-summary-widget { | ||||
|     // Widget style classes here | ||||
|     @include boxShdw($shdwBtns); | ||||
|     border-radius: $basicCr; | ||||
|     border-style: solid; | ||||
|     border-width: 1px; | ||||
|     box-sizing: border-box; | ||||
|     cursor: default; | ||||
|     font-size: 0.8rem; | ||||
|     padding: $interiorMarginLg $interiorMarginLg * 2; | ||||
|     &[href] { | ||||
|         cursor: pointer; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .widget-edit-holder { | ||||
|     // Hide edit area when in browse mode | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| .widget-rule-header { | ||||
|     @extend .l-flex-row; | ||||
|     @include align-items(center); | ||||
|     margin-bottom: $interiorMargin; | ||||
|     > .flex-elem { | ||||
|         &:not(:first-child) { | ||||
|             margin-left: $interiorMargin; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .widget-rules-wrapper, | ||||
| .widget-rule-content, | ||||
| .w-widget-test-data-content { | ||||
|     @include trans-prop-nice($props: (height, min-height, opacity), $dur: 250ms); | ||||
|     min-height: 0; | ||||
|     height: 0; | ||||
|     opacity: 0; | ||||
|     overflow: hidden; | ||||
|     pointer-events: none; | ||||
| } | ||||
|  | ||||
| .widget-rules-wrapper { | ||||
|     flex: 1 1 auto !important; | ||||
| } | ||||
|  | ||||
| .widget-rule-content.expanded { | ||||
|     overflow: visible !important; | ||||
|     min-height: 50px; | ||||
|     height: auto; | ||||
|     opacity: 1; | ||||
|     pointer-events: inherit; | ||||
| } | ||||
|  | ||||
| .w-widget-test-data-content { | ||||
|     .l-enable { | ||||
|         padding: $interiorMargin 0; | ||||
|     } | ||||
|  | ||||
|     .w-widget-test-data-items { | ||||
|         max-height: 20vh; | ||||
|         overflow-y: scroll !important; | ||||
|         padding-right: $interiorMargin; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .l-widget-thumb-wrapper, | ||||
| .l-compact-form label { | ||||
|     $ruleLabelW: 40%; | ||||
|     $ruleLabelMaxW: 150px; | ||||
|     @include display(flex); | ||||
|     max-width: $ruleLabelMaxW; | ||||
|     width: $ruleLabelW; | ||||
| } | ||||
|  | ||||
| .t-message-widget-no-data { | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| /********************************************************** EDITING A WIDGET */ | ||||
| .s-status-editing > mct-view > .w-summary-widget { | ||||
|     // Classes for editor layout while editing a widget | ||||
|     // This selector is ugly and brittle, but needed to prevent interface from showing when widget is in a layout | ||||
|     // being edited. | ||||
|     @include absPosDefault(); | ||||
|     @extend .l-flex-col; | ||||
|  | ||||
|     > .l-summary-widget { | ||||
|         // Main view of the summary widget | ||||
|         // Give some airspace and center the widget in the area | ||||
|         margin: 30px auto; | ||||
|     } | ||||
|  | ||||
|     .widget-edit-holder { | ||||
|         display: flex; // Overrides `display: none` during Browse mode | ||||
|         .flex-accordion-holder { | ||||
|             // Needed because otherwise accordion elements "creep" when contents expand and contract | ||||
|             display: block !important; | ||||
|         } | ||||
|         &.expanded-widget-test-data { | ||||
|             .w-widget-test-data-content { | ||||
|                 min-height: 50px; | ||||
|                 height: auto; | ||||
|                 opacity: 1; | ||||
|                 pointer-events: inherit; | ||||
|             } | ||||
|             &:not(.expanded-widget-rules) { | ||||
|                 // Test data is expanded and rules are collapsed | ||||
|                 // Make text data take up all the vertical space | ||||
|                 .flex-accordion-holder { display: flex; } | ||||
|                 .widget-test-data { | ||||
|                     flex-grow: 999999; | ||||
|                 } | ||||
|                 .w-widget-test-data-items { | ||||
|                     max-height: inherit; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         &.expanded-widget-rules { | ||||
|             .widget-rules-wrapper { | ||||
|                 min-height: 50px; | ||||
|                 height: auto; | ||||
|                 opacity: 1; | ||||
|                 pointer-events: inherit; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &.s-status-no-data { | ||||
|         .widget-edit-holder { | ||||
|             opacity: 0.3; | ||||
|             pointer-events: none; | ||||
|         } | ||||
|         .t-message-widget-no-data { | ||||
|             display: flex; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     .l-compact-form { | ||||
|         // Overrides on .l-compact-form | ||||
|         ul { | ||||
|             &:last-child { margin: 0; } | ||||
|             li { | ||||
|                 @include align-items(flex-start); | ||||
|                 @include flex-wrap(nowrap); | ||||
|                 line-height: 230%; // Provide enough space when controls wrap | ||||
|                 padding: 2px 0; | ||||
|                 &:not(.widget-rule-header) { | ||||
|                     &:not(.connects-to-previous) { | ||||
|                         border-top: 1px solid $colorFormLines; | ||||
|                     } | ||||
|                 } | ||||
|                 &.connects-to-previous { | ||||
|                     padding: $interiorMargin 0; | ||||
|                 } | ||||
|  | ||||
|                 > label { | ||||
|                     display: block; // Needed to align text to right | ||||
|                     text-align: right; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         &.s-widget-test-data-item { | ||||
|             // Single line of ul li label span, etc. | ||||
|             ul { | ||||
|                 li { | ||||
|                     border: none !important; | ||||
|                     > label { | ||||
|                         display: inline-block; | ||||
|                         width: auto; | ||||
|                         text-align: left; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .widget-edit-holder { | ||||
|     font-size: 0.8rem; | ||||
| } | ||||
|  | ||||
| .widget-rules-wrapper { | ||||
|     // Wrapper area that holds n rules | ||||
|     box-sizing: border-box; | ||||
|     overflow-y: scroll; | ||||
|     padding-right: $interiorMargin; | ||||
| } | ||||
|  | ||||
| .l-widget-rule, | ||||
| .l-widget-test-data-item { | ||||
|     box-sizing: border-box; | ||||
|     margin-bottom: $interiorMarginSm; | ||||
|     padding: $interiorMargin $interiorMarginLg; | ||||
| } | ||||
|  | ||||
| .l-widget-thumb-wrapper { | ||||
|     @extend .l-flex-row; | ||||
|     @include align-items(center); | ||||
|     > span { display: block; } | ||||
|     .grippy-holder, | ||||
|     .view-control { | ||||
|         margin-right: $interiorMargin; | ||||
|         width: 1em; | ||||
|         height: 1em; | ||||
|     } | ||||
|  | ||||
|     .widget-thumb { | ||||
|         @include flex(1 1 auto); | ||||
|         width: 100%; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .rule-title { | ||||
|     @include flex(0 1 auto); | ||||
|     color: pullForward($colorBodyFg, 50%); | ||||
| } | ||||
|  | ||||
| .rule-description { | ||||
|     @include flex(1 1 auto); | ||||
|     @include ellipsize(); | ||||
|     color: pushBack($colorBodyFg, 20%); | ||||
| } | ||||
|  | ||||
| .s-widget-rule, | ||||
| .s-widget-test-data-item { | ||||
|     background-color: rgba($colorBodyFg, 0.1); | ||||
|     border-radius: $basicCr; | ||||
| } | ||||
|  | ||||
| .widget-thumb { | ||||
|     @include ellipsize(); | ||||
|     @extend .s-summary-widget; | ||||
|     @extend .l-summary-widget; | ||||
|     padding: $interiorMarginSm $interiorMargin; | ||||
| } | ||||
|  | ||||
| // Hide and show elements in the rule-header on hover | ||||
| .l-widget-rule, | ||||
| .l-widget-test-data-item { | ||||
|     .grippy, | ||||
|     .l-rule-action-buttons-wrapper, | ||||
|     .l-condition-action-buttons-wrapper, | ||||
|     .l-widget-test-data-item-action-buttons-wrapper { | ||||
|         @include trans-prop-nice($props: opacity, $dur: 500ms); | ||||
|         opacity: 0; | ||||
|     } | ||||
|     &:hover { | ||||
|         .grippy, | ||||
|         .l-rule-action-buttons-wrapper, | ||||
|         .l-widget-test-data-item-action-buttons-wrapper { | ||||
|             @include trans-prop-nice($props: opacity, $dur: 0); | ||||
|             opacity: 1; | ||||
|         } | ||||
|     } | ||||
|     .l-rule-action-buttons-wrapper { | ||||
|           .t-delete { | ||||
|             margin-left: 10px; | ||||
|           } | ||||
|     } | ||||
|     .t-condition { | ||||
|         &:hover { | ||||
|             .l-condition-action-buttons-wrapper { | ||||
|                 @include trans-prop-nice($props: opacity, $dur: 0); | ||||
|                 opacity: 1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -33,7 +33,6 @@ $pad: $interiorMargin * $baseRatio; | ||||
|     height: $btnStdH; | ||||
|     line-height: $btnStdH; | ||||
|     padding: 0 $pad; | ||||
|     vertical-align: top; | ||||
|  | ||||
|     &.labeled:before { | ||||
|         // Icon when it's included | ||||
|   | ||||
| @@ -72,11 +72,13 @@ | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Hyperlink objects | ||||
| .s-hyperlink { | ||||
|     // Hyperlink objects | ||||
|     .label { | ||||
|         font-size: 0.8rem !important; | ||||
|     } | ||||
|     &:not(.s-button) { | ||||
|         color: $colorKey; | ||||
|         font-size: 0.8rem; | ||||
|         &:hover { color: $colorKeyHov; } | ||||
|     } | ||||
| } | ||||
| @@ -232,12 +234,16 @@ textarea { | ||||
| } | ||||
|  | ||||
| /******************************************************** INPUTS */ | ||||
| %input-base { | ||||
|     @include input-base(); | ||||
| } | ||||
|  | ||||
| input[type="text"], | ||||
| input[type="search"], | ||||
| input[type="number"] { | ||||
|     @include nice-input(); | ||||
|     vertical-align: baseline; | ||||
|     padding: $inputTextP; | ||||
|     padding: $inputTextPTopBtm $inputTextPLeftRight; | ||||
|     &.numeric { | ||||
|         text-align: right; | ||||
|     } | ||||
| @@ -255,7 +261,7 @@ input[type="number"] { | ||||
| input[type="text"].lg {  width: 100% !important; } | ||||
| .l-input-med input[type="text"], | ||||
| input[type="text"].med { width: 200px !important; } | ||||
| input[type="text"].sm {  width: 50px !important; } | ||||
| input[type="text"].sm, input[type="number"].sm {  width: 50px !important; } | ||||
| .l-numeric input[type="text"], | ||||
| input[type="text"].numeric { text-align: right; } | ||||
|  | ||||
| @@ -281,21 +287,44 @@ textarea.lg { position: relative; height: 300px; } | ||||
|     } | ||||
| } | ||||
|  | ||||
| *[contenteditable].s-input-inline, | ||||
| input[type="text"].s-input-inline, | ||||
| .s-input-inline input[type="text"] { | ||||
|     // A text input or contenteditable element that indicates edit affordance on hover and looks like an input on focus | ||||
|     @extend %input-base; | ||||
|     @include trans-prop-nice((padding, box-shadow), 250ms); | ||||
|     background: none; | ||||
|     box-shadow: none; | ||||
|     border: 1px solid transparent; | ||||
|     min-width: 20px; | ||||
|     padding-left: 0; | ||||
|     padding-right: 0; | ||||
|     &:hover, | ||||
|     &:focus { | ||||
|         padding-left: $inputTextPLeftRight; | ||||
|         padding-right: $inputTextPLeftRight; | ||||
|     } | ||||
|     &:hover { | ||||
|         border-color: rgba($colorBodyFg, 0.2); | ||||
|     } | ||||
|     &:focus { | ||||
|         @include s-input(); | ||||
|         border-color: transparent; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /******************************************************** SELECTS */ | ||||
| .select { | ||||
|     @include btnSubtle($bg: $colorSelectBg); | ||||
|     @extend .icon-arrow-down; // Context arrow | ||||
|     @if $shdwBtns != none { | ||||
|         margin: 0 0 2px 0; // Needed to avoid dropshadow from being clipped by parent containers | ||||
|     } | ||||
|     display: inline-block; | ||||
|     padding: 0 $interiorMargin; | ||||
|     overflow: hidden; | ||||
|     position: relative; | ||||
|     line-height: $formInputH; | ||||
|     select { | ||||
|         @include appearance(none); | ||||
|         box-sizing: border-box; | ||||
|         &:focus { outline: 0; } | ||||
|         background: none; | ||||
|         color: $colorSelectFg; | ||||
|         cursor: pointer; | ||||
| @@ -307,12 +336,13 @@ textarea.lg { position: relative; height: 300px; } | ||||
|         } | ||||
|     } | ||||
|     &:before { | ||||
|         //@include contextArrow(); | ||||
|         pointer-events: none; | ||||
|         color: rgba($colorSelectFg, percentToDecimal($contrastInvokeMenuPercent)); | ||||
|         @include transform(translateY(-50%)); | ||||
|         color: rgba($colorInvokeMenu, percentToDecimal($contrastInvokeMenuPercent)); | ||||
|         display: block; | ||||
|         pointer-events: none; | ||||
|         position: absolute; | ||||
|         right: $interiorMargin; top: 0; | ||||
|         right: $interiorMargin; | ||||
|         top: 50%; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -364,8 +394,7 @@ textarea.lg { position: relative; height: 300px; } | ||||
|     .l-elem-wrapper { | ||||
|         mct-representation { | ||||
|             // Holds the context-available item | ||||
|             // Must have min-width to make flex work properly | ||||
|             // in Safari | ||||
|             // Must have min-width to make flex work properly in Safari | ||||
|             min-width: 0.7em; | ||||
|         } | ||||
|     } | ||||
| @@ -531,7 +560,6 @@ textarea.lg { position: relative; height: 300px; } | ||||
|     height: $h; | ||||
|     margin-top: 1 + floor($h/2) * -1; | ||||
|     @include btnSubtle(pullForward($colorBtnBg, 10%)); | ||||
|     //border-radius: 50% !important; | ||||
| } | ||||
|  | ||||
| @mixin sliderKnobRound() { | ||||
| @@ -546,7 +574,6 @@ textarea.lg { position: relative; height: 300px; } | ||||
|  | ||||
| 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 { | ||||
| @@ -709,6 +736,25 @@ textarea { | ||||
|     @include trans-prop-nice-fade($controlFadeMs); | ||||
| } | ||||
|  | ||||
| .view-control { | ||||
|     @extend .icon-arrow-right; | ||||
|     cursor: pointer; | ||||
|     font-size: 0.75em; | ||||
|     &:before { | ||||
|         position: absolute; | ||||
|         @include trans-prop-nice(transform, 100ms); | ||||
|         @include transform-origin(center); | ||||
|     } | ||||
|     &.expanded:before { | ||||
|         @include transform(rotate(90deg)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| .grippy { | ||||
|     @extend .icon-grippy; | ||||
|     cursor: move; | ||||
| } | ||||
|  | ||||
| /******************************************************** BROWSER ELEMENTS */ | ||||
| body.desktop { | ||||
|     ::-webkit-scrollbar { | ||||
| @@ -726,11 +772,15 @@ body.desktop { | ||||
|     } | ||||
|  | ||||
|     .overlay ::-webkit-scrollbar-thumb { | ||||
|         $lr: 15%; | ||||
|         background: $scrollbarThumbColorOverlay; | ||||
|         &:hover { background: $scrollbarThumbColorOverlayHov; } | ||||
|     } | ||||
|  | ||||
|     .menu ::-webkit-scrollbar-thumb { | ||||
|         background: $scrollbarThumbColorMenu; | ||||
|         &:hover { background: $scrollbarThumbColorMenuHov; } | ||||
|     } | ||||
|  | ||||
|     ::-webkit-scrollbar-corner { | ||||
|         background: $scrollbarTrackColorBg; | ||||
|     } | ||||
|   | ||||
							
								
								
									
										99
									
								
								platform/commonUI/general/res/sass/controls/_indicators.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								platform/commonUI/general/res/sass/controls/_indicators.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /* Indicators are generally only displayed in the ue-bottom-bar element of the main interface */ | ||||
|  | ||||
| .l-indicator { | ||||
|     $transDelayHover: 1.5s; | ||||
|     $transDelayWhileExpanded: 2.5s; | ||||
|     $transSpeed: .25s; | ||||
|     display: inline-block; | ||||
|     margin-right: $interiorMarginSm; | ||||
|  | ||||
|     &:before { | ||||
|         // Icon | ||||
|         display: inline-block; | ||||
|         opacity: 0.85; | ||||
|     } | ||||
|  | ||||
|     .label, | ||||
|     .count { | ||||
|         display: inline-block; | ||||
|         vertical-align: top; | ||||
|     } | ||||
|  | ||||
|     &.float-right { | ||||
|         float: right; | ||||
|     } | ||||
|  | ||||
|     &.no-icon { | ||||
|         &:before { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &:not(.no-collapse) { | ||||
|         .label { | ||||
|             // Max-width silliness is necessary for width transition | ||||
|             @include trans-prop-nice((max-width, margin-right), $transSpeed, $transDelayWhileExpanded); | ||||
|             overflow: hidden; | ||||
|             margin-right: 0; | ||||
|             max-width: 0px; | ||||
|             white-space: nowrap; | ||||
|         } | ||||
|         &:hover { | ||||
|             &:before { | ||||
|                 opacity: 1; | ||||
|             } | ||||
|  | ||||
|             .label { | ||||
|                 @include trans-prop-nice((max-width, margin-right), 0s); | ||||
|                 margin-right: $interiorMargin; | ||||
|                 max-width: 600px; | ||||
|                 width: auto; | ||||
|             } | ||||
|  | ||||
|             .count { | ||||
|                 @include trans-prop-nice(max-width, 0s); | ||||
|                 opacity: 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .count { | ||||
|         @include trans-prop-nice(opacity, $transSpeed, $transDelayWhileExpanded); | ||||
|         font-weight: bold; | ||||
|         opacity: 1; | ||||
|     } | ||||
|  | ||||
|     .s-button { | ||||
|         background: $colorStatusBtnBg; | ||||
|         padding: 0 $interiorMargin; | ||||
|         height: auto; | ||||
|         line-height: inherit; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .s-indicator { | ||||
|     color: $colorStatusDefault; | ||||
|  | ||||
| } | ||||
| @@ -21,92 +21,91 @@ | ||||
|  *****************************************************************************/ | ||||
| /******************************************************** MENU BUTTONS */ | ||||
| .s-menu-button { | ||||
| 	// Formerly .btn-menu | ||||
| 	@extend .s-button; | ||||
| 	span.l-click-area { | ||||
| 		// In markup, this element should not enclose anything. | ||||
| 		@extend .abs; | ||||
| 	} | ||||
|     // Formerly .btn-menu | ||||
|     @extend .s-button; | ||||
|     span.l-click-area { | ||||
|         // In markup, this element should not enclose anything. | ||||
|         @extend .abs; | ||||
|     } | ||||
|  | ||||
| 	.icon { | ||||
| 		font-size: 16px; //120%; | ||||
| 	} | ||||
|     .icon { | ||||
|         font-size: 16px; | ||||
|     } | ||||
|  | ||||
| 	.title-label { | ||||
| 		margin-left: $interiorMarginSm; | ||||
| 	} | ||||
|     .title-label { | ||||
|         margin-left: $interiorMarginSm; | ||||
|     } | ||||
|  | ||||
|     .icon-swatch, | ||||
|     .color-swatch { | ||||
|         // Used in color menu buttons in toolbar | ||||
|         $d: 10px; | ||||
|         display: inline-block; | ||||
|         border: 1px solid rgba($colorBtnFg, 0.2); | ||||
|         height: $d; width: $d; | ||||
|         line-height: $d; | ||||
|         vertical-align: middle; | ||||
|         margin-left: $interiorMarginSm; | ||||
|         margin-top: -2px; | ||||
|         &:not(.no-selection) { | ||||
|             border-color: transparent; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	&:after { | ||||
| 		// Adds the downward facing 'context available / invoke menu' arrow element | ||||
| 		@include contextArrow(); | ||||
| 		color: rgba($colorInvokeMenu, percentToDecimal($contrastInvokeMenuPercent)); | ||||
| 	} | ||||
|     &:after { | ||||
|         // Adds the downward facing 'context available / invoke menu' arrow element | ||||
|         @include contextArrow(); | ||||
|         color: rgba($colorInvokeMenu, percentToDecimal($contrastInvokeMenuPercent)); | ||||
|     } | ||||
|  | ||||
| 	&.create-button { | ||||
|     &.create-button { | ||||
|         @extend .icon-plus; | ||||
| 		.title-label { | ||||
| 			font-size: 1rem; | ||||
| 		} | ||||
| 	} | ||||
|         .title-label { | ||||
|             font-size: 1rem; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	.menu { | ||||
| 		left: 0; | ||||
| 		text-align: left; | ||||
| 	} | ||||
|     .menu { | ||||
|         left: 0; | ||||
|         text-align: left; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /******************************************************** MENUS THEMSELVES */ | ||||
| .menu-element { | ||||
| 	cursor: pointer; | ||||
| 	position: relative; | ||||
| } | ||||
|  | ||||
| .s-menu { | ||||
| 	border-radius: $basicCr; | ||||
| 	@include containerSubtle($colorMenuBg, $colorMenuFg); | ||||
| 	@include boxShdw($shdwMenu); | ||||
| 	@include txtShdw($shdwMenuText); | ||||
| 	padding: $interiorMarginSm 0; | ||||
|     cursor: pointer; | ||||
|     position: relative; | ||||
| } | ||||
|  | ||||
| .menu { | ||||
|     // TODO: reduce size of icons | ||||
| 	@extend .s-menu; | ||||
| 	display: block; | ||||
| 	position: absolute; | ||||
| 	z-index: 10; | ||||
| 	ul { | ||||
| 		@include menuUlReset(); | ||||
| 		li { | ||||
| 			box-sizing: border-box; | ||||
| 			border-top: 1px solid pullForward($colorMenuBg, 10%); | ||||
|     border-radius: $basicCr; | ||||
|     @include containerSubtle($colorMenuBg, $colorMenuFg); | ||||
|     @include boxShdw($shdwMenu); | ||||
|     @include txtShdw($shdwMenuText); | ||||
|     padding: $interiorMarginSm 0; | ||||
|     display: block; | ||||
|     position: absolute; | ||||
|     z-index: 10; | ||||
|     ul { | ||||
|         @include menuUlReset(); | ||||
|         li { | ||||
|             box-sizing: border-box; | ||||
|             border-top: 1px solid pullForward($colorMenuBg, 10%); | ||||
|             color: $colorMenuFg; | ||||
| 			//color: pullForward($colorMenuBg, 60%); | ||||
| 			line-height: $menuLineH; | ||||
| 			padding: $interiorMarginSm $interiorMargin * 2 $interiorMarginSm ($interiorMargin * 2) + $treeTypeIconW; | ||||
| 			position: relative; | ||||
| 			white-space: nowrap; | ||||
| 			&:first-child { | ||||
| 				border: none; | ||||
| 			} | ||||
| 			&:hover { | ||||
| 				background: $colorMenuHovBg; | ||||
| 				color: $colorMenuHovFg; | ||||
|             line-height: $menuLineH; | ||||
|             padding: $interiorMarginSm $interiorMargin * 2 $interiorMarginSm ($interiorMargin * 2) + $treeTypeIconW; | ||||
|             position: relative; | ||||
|             white-space: nowrap; | ||||
|             &:first-child { | ||||
|                 border: none; | ||||
|             } | ||||
|             &:hover { | ||||
|                 background: $colorMenuHovBg; | ||||
|                 color: $colorMenuHovFg; | ||||
|                 &:before { | ||||
|                     color: $colorMenuHovIc; | ||||
|                 } | ||||
| 			} | ||||
|             } | ||||
|             &:before { | ||||
|                 @extend .ui-symbol; | ||||
|                 @extend .type-icon; | ||||
| @@ -114,8 +113,8 @@ | ||||
|                 display: inline-block; | ||||
|                 left: $interiorMargin * 2; | ||||
|             } | ||||
| 		} | ||||
| 	} | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .menu, | ||||
| @@ -123,94 +122,97 @@ | ||||
| .context-menu, | ||||
| .super-menu, | ||||
| .s-menu-button .menu { | ||||
| 	pointer-events: auto; | ||||
| 	ul li { | ||||
| 		a.menu-item-a { | ||||
|     pointer-events: auto; | ||||
|     ul li { | ||||
|         a.menu-item-a { | ||||
|             color: $colorMenuFg; | ||||
|             display: block; | ||||
| 		} | ||||
|         } | ||||
|         &:before, | ||||
|         a.menu-item-a:before { | ||||
|             color: $colorMenuIc; | ||||
|             left: $interiorMargin; | ||||
|         } | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| .checkbox-menu { | ||||
| 	// Used in search dropdown in tree | ||||
| 	@extend .context-menu; | ||||
| 	ul li { | ||||
| 		padding-left: 50px; | ||||
| 		.checkbox { | ||||
| 			$d: 0.7rem; | ||||
| 			position: absolute; | ||||
| 			left: $interiorMargin; | ||||
| 			top: ($menuLineH - $d) / 1.5; | ||||
| 			em { | ||||
| 				height: $d; | ||||
| 				width: $d; | ||||
| 				&:before { | ||||
| 					font-size: 7px !important; | ||||
| 					height: $d; | ||||
| 					width: $d; | ||||
| 					line-height: $d; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		&:before { | ||||
|     // Used in search dropdown in tree | ||||
|     @extend .context-menu; | ||||
|     ul li { | ||||
|         padding-left: 50px; | ||||
|         .checkbox { | ||||
|             $d: 0.7rem; | ||||
|             position: absolute; | ||||
|             left: $interiorMargin; | ||||
|             top: ($menuLineH - $d) / 1.5; | ||||
|             em { | ||||
|                 height: $d; | ||||
|                 width: $d; | ||||
|                 &:before { | ||||
|                     font-size: 7px !important; | ||||
|                     height: $d; | ||||
|                     width: $d; | ||||
|                     line-height: $d; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         &:before { | ||||
|             // Type icon | ||||
| 			left: 25px; | ||||
| 		} | ||||
| 	} | ||||
|             left: 25px; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .super-menu, | ||||
| .super-menu > mct-representation, | ||||
| .super-menu > .contents { | ||||
|     box-sizing: border-box; | ||||
|     display: block; | ||||
|     position: relative; | ||||
| } | ||||
|  | ||||
| .super-menu { | ||||
| 	$w: 500px; | ||||
| 	$h: $w - 20; | ||||
| 	$plw: 50%; | ||||
| 	$prw: 50%; | ||||
| 	display: block; | ||||
| 	width: $w; | ||||
| 	height: $h; | ||||
| 	.contents { | ||||
| 		@include absPosDefault($interiorMargin); | ||||
| 	} | ||||
| 	.pane { | ||||
| 		box-sizing: border-box; | ||||
| 		&.menu-items { | ||||
| 			border-right: 1px solid pullForward($colorMenuBg, 10%); | ||||
| 			left: 0; | ||||
| 			padding-right: $interiorMargin; | ||||
| 			right: auto; | ||||
| 			width: $plw; | ||||
| 			overflow-x: hidden; | ||||
| 			overflow-y: auto; | ||||
| 			ul { | ||||
| 				li { | ||||
| 					border-radius: $controlCr; | ||||
| 					padding-left: 30px; | ||||
| 					border-top: none; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		&.menu-item-description { | ||||
| 			left: auto; | ||||
| 			right: 0; | ||||
| 			padding: $interiorMargin * 5; | ||||
| 			width: $prw; | ||||
|     $plw: 50%; | ||||
|     $prw: 100% - $plw; | ||||
|     position: absolute; | ||||
|     .w-menu { | ||||
|         align-items: stretch; | ||||
|         display: flex; | ||||
|         flex-direction: row; | ||||
|         margin: $interiorMarginLg; | ||||
|     } | ||||
|     .col { | ||||
|         box-sizing: border-box; | ||||
|         flex: 1 1 auto; | ||||
|         overflow-x: hidden; | ||||
|         &.menu-items { | ||||
|             border-right: 1px solid pullForward($colorMenuBg, 10%); | ||||
|             overflow-y: auto; | ||||
|             padding-right: $interiorMargin; | ||||
|             width: $plw; | ||||
|             ul { | ||||
|                 li { | ||||
|                     border-radius: $controlCr; | ||||
|                     padding-left: 30px; | ||||
|                     border-top: none; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         &.menu-item-description { | ||||
|             $p: $interiorMargin * 3; | ||||
|             overflow-y: hidden; | ||||
|             padding: $p $p 0 $p; | ||||
|             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%); | ||||
| @@ -218,67 +220,104 @@ | ||||
|                     line-height: 1.5em; | ||||
|                 } | ||||
|             } | ||||
| 		} | ||||
| 	} | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .w-title-desc { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         overflow: hidden; // Height set in specific menu instances | ||||
|     } | ||||
|  | ||||
|     // Specific menu instances | ||||
|     &.l-create-menu { | ||||
|         width: 500px; | ||||
|         .col { | ||||
|             max-height: 70vh; | ||||
|         } | ||||
|         .w-title-desc { | ||||
|             height: 190px; | ||||
|         } | ||||
|         .desc-area { | ||||
|             &.icon { | ||||
|                 font-size: 8em; | ||||
|                 height: 135px; | ||||
|                 margin-bottom: $interiorMargin * 3; | ||||
|             } | ||||
|             &.title { | ||||
|                 font-size: 1.2em; | ||||
|                 margin-bottom: $interiorMargin * 2; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &.mini { | ||||
|         width: 400px; | ||||
|         height: 300px; | ||||
|         .pane { | ||||
|         .col { | ||||
|             max-height: 50vh; | ||||
|             &.menu-items { | ||||
|                 font-size: 0.8em; | ||||
|             } | ||||
|             &.menu-item-description { | ||||
|                 padding: $interiorMargin * 3; | ||||
|                 .desc-area { | ||||
|                     &.icon { | ||||
|                         font-size: 4em; | ||||
|                     } | ||||
|                     &.title { | ||||
|                         font-size: 1em; | ||||
|                     } | ||||
|                 } | ||||
|                 $p: $interiorMargin * 2; | ||||
|                 padding: $p $p 0 $p; | ||||
|             } | ||||
|         } | ||||
|         .w-title-desc { | ||||
|             height: 180px; | ||||
|         } | ||||
|         .desc-area { | ||||
|             &.icon { | ||||
|                 font-size: 4em; | ||||
|                 height: 70px; | ||||
|                 margin-bottom: $interiorMargin * 3; | ||||
|             } | ||||
|             &.title { | ||||
|                 font-size: 1em; | ||||
|                 margin-bottom: $interiorMargin * 2; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .context-menu { | ||||
| 	font-size: 0.80rem; | ||||
|     font-size: 0.80rem; | ||||
| } | ||||
|  | ||||
| .context-menu-holder, | ||||
| .menu-holder { | ||||
| 	position: absolute; | ||||
| 	z-index: 120; | ||||
| 	.context-menu-wrapper { | ||||
| 		position: absolute; | ||||
| 		height: 100%; | ||||
| 		width: 100%; | ||||
| 	} | ||||
| 	&.go-left .context-menu, | ||||
| 	&.go-left .menu { | ||||
| 		right: 0; | ||||
| 	} | ||||
| 	&.go-up .context-menu, | ||||
| 	&.go-up .menu { | ||||
| 		bottom: 0; | ||||
| 	} | ||||
|     position: absolute; | ||||
|     z-index: 120; | ||||
|     .context-menu-wrapper { | ||||
|         position: absolute; | ||||
|         height: 100%; | ||||
|         width: 100%; | ||||
|     } | ||||
|     &.go-left .context-menu, | ||||
|     &.go-left .menu { | ||||
|         right: 0; | ||||
|     } | ||||
|     &.go-up .context-menu, | ||||
|     &.go-up .menu { | ||||
|         bottom: 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .context-menu-holder { | ||||
| 	pointer-events: none; | ||||
| 	height: 200px; | ||||
| 	width: 170px; | ||||
|     pointer-events: none; | ||||
|     height: 200px; | ||||
|     width: 170px; | ||||
| } | ||||
|  | ||||
| .btn-bar.right .menu, | ||||
| .menus-to-left .menu { | ||||
|     z-index: 79; | ||||
| 	left: auto; | ||||
| 	right: 0; | ||||
| 	width: auto; | ||||
|     left: auto; | ||||
|     right: 0; | ||||
|     width: auto; | ||||
| } | ||||
|  | ||||
| .menus-up .menu { | ||||
|     bottom: $btnStdH; top: auto; | ||||
|     bottom: $btnStdH; | ||||
|     top: auto; | ||||
| } | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /******************************************************************* STATUS BLOCK ELEMS */ | ||||
| @mixin statusBannerColors($bg, $fg: $colorStatusFg) { | ||||
| 	$bgPb: 30%; | ||||
| 	$bgPbD: 10%; | ||||
| @@ -36,107 +36,7 @@ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Status coloring | ||||
| .ok, .info { | ||||
|     .status-indicator { | ||||
|         color: $colorStatusInfo; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .alert, .caution, .warning { | ||||
|     .status-indicator, .count { | ||||
|         color: $colorStatusAlert; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .error, .err { | ||||
|     .status-indicator, .count { | ||||
|         color: $colorStatusError; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .available { | ||||
|     .status-indicator, .count { | ||||
|         color: $colorStatusAvailable; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .subdued { | ||||
|     .status-indicator { | ||||
|         color: pullForward($colorStatusBarBg, 40%); | ||||
|     } | ||||
| } | ||||
|  | ||||
| .status-block-holder { | ||||
|     // Applied to mct-include element | ||||
|     // Contains status.block elements | ||||
|     $transDelay: 1.5s; | ||||
|     $transSpeed: .25s; | ||||
|     display: inline-block; | ||||
|     &.clickable { cursor: pointer; } | ||||
|     &:not(.clickable) { cursor: default; } | ||||
|     &.no-icon .status.block { | ||||
|         .status-indicator { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
|     &.float-right { | ||||
|         float: right; | ||||
|     } | ||||
|     &:not(.no-collapse) .status.block { | ||||
|         .label { | ||||
|             // Max-width silliness is necessary for width transition | ||||
|             @include trans-prop-nice(max-width, $transSpeed, $transDelay); | ||||
|             overflow: hidden; | ||||
|             max-width: 0px; | ||||
|         } | ||||
|         &:hover { | ||||
|             .label { | ||||
|                 @include trans-prop-nice(max-width, $transSpeed, 0s); | ||||
|                 max-width: 600px; | ||||
|                 width: auto; | ||||
|             } | ||||
|             .count { | ||||
|                 @include trans-prop-nice(max-width, $transSpeed, 0s); | ||||
|                 opacity: 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .status.block { | ||||
|     $transDelay: 1.5s; | ||||
|     $transSpeed: .25s; | ||||
| 	color: $colorStatusDefault; | ||||
| 	display: inline-block; | ||||
| 	margin-right: $interiorMargin; | ||||
| 	.status-indicator, | ||||
| 	.label, | ||||
| 	.count { | ||||
| 		display: inline-block; | ||||
| 		vertical-align: top; | ||||
| 	} | ||||
|  | ||||
| 	.status-indicator { | ||||
| 		margin-right: $interiorMarginSm; | ||||
| 	} | ||||
|  | ||||
| 	.count { | ||||
| 		@include trans-prop-nice(opacity, $transSpeed, $transDelay); | ||||
| 		font-weight: bold; | ||||
| 		opacity: 1; | ||||
| 	} | ||||
|     .s-button { | ||||
|         background: $colorStatusBtnBg; | ||||
|         padding: 0 $interiorMargin; | ||||
|         height: auto; | ||||
|         line-height: inherit; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Styles for messages and message banners */ | ||||
| /******************************************************************* MESSAGE BANNERS */ | ||||
| .message { | ||||
| 	&.block { | ||||
| 		border-radius: $basicCr; | ||||
| @@ -192,7 +92,6 @@ | ||||
| 		padding: 0 $interiorMargin; | ||||
| 	} | ||||
|     .close { | ||||
| 		//@include test(red, 0.7); | ||||
| 		cursor: pointer; | ||||
|         font-size: 7px; | ||||
| 		width: 8px; | ||||
| @@ -224,144 +123,159 @@ | ||||
| 	} | ||||
| 	&.ok, | ||||
|     &.info { | ||||
| 		@include statusBannerColors($colorStatusInfo); | ||||
| 		@include statusBannerColors($colorInfo); | ||||
| 	} | ||||
| 	&.caution, | ||||
|     &.warning, | ||||
|     &.alert { | ||||
| 		@include statusBannerColors($colorStatusAlert); | ||||
| 		@include statusBannerColors($colorWarningLo); | ||||
| 	} | ||||
|     &.error { | ||||
|         @include statusBannerColors($colorStatusError); | ||||
|         @include statusBannerColors($colorWarningHi); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @mixin messageBlock($iconW: 32px) { | ||||
|     .type-icon.message-type { | ||||
| /******************************************************************* MESSAGES */ | ||||
|  | ||||
| /* Contexts: | ||||
|     In .t-message-list | ||||
|     In .overlay as a singleton | ||||
|     Inline in the view area | ||||
|  */ | ||||
|  | ||||
| // Archetypal message | ||||
| .l-message { | ||||
|     $iconW: 32px; | ||||
|     @include display(flex); | ||||
|     @include flex-direction(row); | ||||
|     @include align-items(stretch); | ||||
|     padding: $interiorMarginLg; | ||||
|  | ||||
|     &:before { | ||||
|         // Icon | ||||
|         @include flex(0 1 auto); | ||||
|         @include txtShdw($shdwStatusIc); | ||||
|         @extend .icon-bell; | ||||
|         color: $colorStatusDefault; | ||||
|         font-size: $iconW; | ||||
|         padding: 1px; | ||||
|         width: $iconW + 2; | ||||
|         margin-right: $interiorMarginLg; | ||||
|     } | ||||
|  | ||||
|     .message-severity-info .type-icon.message-type { | ||||
|     &.message-severity-info:before { | ||||
|         @extend .icon-info; | ||||
|         color: $colorStatusInfo; | ||||
|         color: $colorInfo; | ||||
|     } | ||||
|     .message-severity-alert .type-icon.message-type { | ||||
|         @extend .icon-bell; | ||||
|         color: $colorStatusAlert; | ||||
|  | ||||
|     &.message-severity-alert:before { | ||||
|         color: $colorWarningLo; | ||||
|     } | ||||
|     .message-severity-error .type-icon.message-type { | ||||
|  | ||||
|     &.message-severity-error:before { | ||||
|         @extend .icon-alert-rect; | ||||
|         color: $colorStatusError; | ||||
|         color: $colorWarningHi; | ||||
|     } | ||||
| } | ||||
| /* Paths: | ||||
|     t-dialog | t-dialog-sm > t-message-single | t-message-list > overlay > holder > contents > l-message > | ||||
|         message-type > (icon) | ||||
|         message-contents > | ||||
|         top-bar > | ||||
|             title | ||||
|             hint | ||||
|         editor > | ||||
|             (if displaying list of messages) | ||||
|             ul > li > l-message > | ||||
|                 ... same as above | ||||
|         bottom-bar | ||||
| */ | ||||
|  | ||||
| .l-message { | ||||
|  | ||||
| .w-message-contents { | ||||
|     @include flex(1 1 auto); | ||||
|     @include display(flex); | ||||
|     @include flex-direction(row); | ||||
|     @include align-items(stretch); | ||||
|     .type-icon.message-type { | ||||
|         @include flex(0 1 auto); | ||||
|         position: relative; | ||||
|     } | ||||
|     .message-contents { | ||||
|         @include flex(1 1 auto); | ||||
|         margin-left: $overlayMargin; | ||||
|         position: relative; | ||||
|     @include flex-direction(column); | ||||
|  | ||||
|         .top-bar, | ||||
|     > div, | ||||
|     > span { | ||||
|         //@include test(red); | ||||
|         margin-bottom: $interiorMargin; | ||||
|     } | ||||
|  | ||||
|     .message-body { | ||||
|         @include flex(1 1 100%); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Singleton in an overlay dialog | ||||
| .t-message-single .l-message, | ||||
| .t-message-single.l-message { | ||||
|         $iconW: 80px; | ||||
|         @include absPosDefault(); | ||||
|         padding: 0; | ||||
|         &:before { | ||||
|             font-size: $iconW; | ||||
|             width: $iconW + 2; | ||||
|         } | ||||
|         .title { | ||||
|             font-size: 1.2em; | ||||
|         } | ||||
| } | ||||
|  | ||||
| // Singleton inline in a view | ||||
| .t-message-inline .l-message, | ||||
| .t-message-inline.l-message { | ||||
|     border-radius: $controlCr; | ||||
|     &.message-severity-info { background-color: rgba($colorInfo, 0.3); } | ||||
|     &.message-severity-alert { background-color: rgba($colorWarningLo, 0.3); } | ||||
|     &.message-severity-error { background-color: rgba($colorWarningHi, 0.3); } | ||||
|  | ||||
|     .w-message-contents.l-message-body-only { | ||||
|         .message-body { | ||||
|             margin-bottom: $interiorMarginLg * 2; | ||||
|             margin-top: $interiorMargin; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // In a list | ||||
| .t-message-list { | ||||
|     @include absPosDefault(); | ||||
|     @include display(flex); | ||||
|     @include flex-direction(column); | ||||
|  | ||||
| // Message as singleton | ||||
| .t-message-single { | ||||
|     @include messageBlock(80px); | ||||
| } | ||||
|  | ||||
| body.desktop .t-message-single { | ||||
|     .l-message, | ||||
|     .bottom-bar { | ||||
|         @include absPosDefault(); | ||||
|     > div, | ||||
|     > span { | ||||
|         margin-bottom: $interiorMargin; | ||||
|     } | ||||
|  | ||||
|     .bottom-bar { | ||||
|         top: auto; | ||||
|         height: $ovrFooterH; | ||||
|     .w-messages { | ||||
|         @include flex(1 1 100%); | ||||
|         overflow-y: auto; | ||||
|         padding-right: $interiorMargin; | ||||
|     } | ||||
|     // Each message | ||||
|     .l-message { | ||||
|         border-radius: $controlCr; | ||||
|         background: rgba($colorOvrFg, 0.1); | ||||
|         margin-bottom: $interiorMargin; | ||||
|         .hint, | ||||
|         .bottom-bar { | ||||
|             text-align: left; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @include phonePortrait { | ||||
|     .t-message-single { | ||||
|         .l-message { | ||||
|             @include flex-direction(column); | ||||
|             .message-contents { margin-left: 0; } | ||||
|         } | ||||
|         .type-icon.message-type { | ||||
|     .t-message-single .l-message, | ||||
|     .t-message-single.l-message { | ||||
|         @include flex-direction(column); | ||||
|         &:before { | ||||
|             margin-right: 0; | ||||
|             margin-bottom: $interiorMarginLg; | ||||
|             width: 100%; | ||||
|             text-align: center; | ||||
|             width: 100%; | ||||
|         } | ||||
|  | ||||
|         .bottom-bar { | ||||
|             text-align: center !important; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Messages in list | ||||
| .t-message-list { | ||||
|     @include messageBlock(32px); | ||||
|  | ||||
|     .message-contents { | ||||
|         .l-message { | ||||
|             border-radius: $controlCr; | ||||
|             background: rgba($colorOvrFg, 0.1); | ||||
|             margin-bottom: $interiorMargin; | ||||
|             padding: $interiorMarginLg; | ||||
|  | ||||
|             .message-contents, | ||||
|             .bottom-bar { | ||||
|                 position: relative; | ||||
|             } | ||||
|  | ||||
|             .message-contents { | ||||
|                 font-size: 0.9em; | ||||
|                 margin-left: $interiorMarginLg; | ||||
|                 .message-action { color: pushBack($colorOvrFg, 20%); } | ||||
|                 .bottom-bar { text-align: left; } | ||||
|             } | ||||
|  | ||||
|             .top-bar, | ||||
|             .message-body { | ||||
|                 margin-bottom: $interiorMarginLg; | ||||
|             text-align: center; | ||||
|             .s-button { | ||||
|                 display: block; | ||||
|                 width: 100%; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| body.desktop .t-message-list { | ||||
|     .message-contents .l-message { margin-right: $interiorMarginLg; } | ||||
|     .w-message-contents { padding-right: $interiorMargin; } | ||||
| } | ||||
|  | ||||
| // Alert elements in views | ||||
|   | ||||
| @@ -19,11 +19,10 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| .l-color-palette { | ||||
| .l-palette { | ||||
| 	$d: 16px; | ||||
| 	$colorsPerRow: 10; | ||||
| 	$m: 1; | ||||
| 	$colorSelectedColor: #fff; | ||||
| 
 | ||||
| 	box-sizing: border-box; | ||||
| 	padding: $interiorMargin !important; | ||||
| @@ -33,46 +32,41 @@ | ||||
| 		line-height: $d; | ||||
| 		width: ($d * $colorsPerRow) + ($m * $colorsPerRow); | ||||
| 
 | ||||
|         &.l-option-row { | ||||
|             margin-bottom: $interiorMargin; | ||||
|             .s-palette-item { | ||||
|                 border-color: $colorPaletteFg; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| 		.l-palette-item { | ||||
| 			box-sizing: border-box; | ||||
| 			@include txtShdwSubtle(0.8); | ||||
| 			@include trans-prop-nice-fade(0.25s); | ||||
| 			border: 1px solid transparent; | ||||
| 			color: $colorSelectedColor; | ||||
| 			display: block; | ||||
| 			float: left; | ||||
| 			height: $d; width: $d; | ||||
| 			line-height: $d * 0.9; | ||||
| 			margin: 0 ($m * 1px) ($m * 1px) 0; | ||||
|             position: relative; | ||||
| 			text-align: center; | ||||
|             &:before { | ||||
|                 // Check mark for selected items | ||||
|                 font-size: 0.8em; | ||||
|             } | ||||
| 		} | ||||
| 
 | ||||
| 		.s-palette-item { | ||||
|             border: 1px solid transparent; | ||||
|             color: $colorPaletteFg; | ||||
|             text-shadow: $shdwPaletteFg; | ||||
|             @include trans-prop-nice-fade(0.25s); | ||||
| 			&:hover { | ||||
| 				@include trans-prop-nice-fade(0); | ||||
| 				border-color: $colorSelectedColor !important; | ||||
| 				border-color: $colorPaletteSelected !important; | ||||
| 			} | ||||
|             &.selected { | ||||
|                 border-color: $colorPaletteSelected; | ||||
|                 box-shadow: $shdwPaletteSelected; //Needed to see selection rect on light colored swatches | ||||
|             } | ||||
| 		} | ||||
| 
 | ||||
| 		.l-palette-item-label { | ||||
| 			margin-left: $interiorMargin; | ||||
| 		} | ||||
| 
 | ||||
| 		&.l-option-row { | ||||
| 			margin-bottom: $interiorMargin; | ||||
| 			.s-palette-item { | ||||
| 				border-color: $colorBodyFg; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| } | ||||
| @@ -19,12 +19,24 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| .s-status-editing .l-object-wrapper, | ||||
| .edit-main { | ||||
|     // .s-status-editing .l-object-wrapper is relevant to New Edit Mode; | ||||
|     // .edit-main is legacy for old edit mode. | ||||
|     $handleD: 15px; | ||||
|     $cr: 5px; | ||||
| .t-edit-handle-holder { display: none; } | ||||
|  | ||||
| .l-grid-holder { | ||||
|     display: none; | ||||
|     position: relative; | ||||
|     height: 100%; | ||||
|     width: 100%; | ||||
|     .l-grid { | ||||
|         @extend .abs; | ||||
|         pointer-events: none; | ||||
|         z-index: 0; | ||||
|         &.l-grid-y { background-position: 0 1px; } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .s-status-editing { | ||||
|     $handleD: 5px; | ||||
|     .t-edit-handle-holder { display: block; } | ||||
|     .edit-corner, | ||||
|     .edit-handle { | ||||
|         position: absolute; | ||||
| @@ -32,81 +44,68 @@ | ||||
|     } | ||||
|  | ||||
|     .edit-corner { | ||||
|         background: rgba($colorSelectableSelectedPrimary, 0.5); | ||||
|         cursor: crosshair; | ||||
|         display: none; // Hide by default | ||||
|         border: 1px solid $colorSelectableSelectedPrimary; | ||||
|         width: $handleD; | ||||
|         height: $handleD; | ||||
|         $o: (-1 * $handleD) + 1px; | ||||
|         &:hover { | ||||
|             z-index: 11; | ||||
|         } | ||||
|         &.edit-resize-nw { | ||||
|             border-bottom-right-radius: $cr; | ||||
|             cursor: nw-resize; | ||||
|             top: 0; left: 0; | ||||
|         } | ||||
|         &.edit-resize-ne { | ||||
|             border-bottom-left-radius: $cr; | ||||
|             cursor: ne-resize; | ||||
|             top: 0; right: 0; | ||||
|         } | ||||
|         &.edit-resize-se { | ||||
|             border-top-left-radius: $cr; | ||||
|             cursor: se-resize; | ||||
|             bottom: 0; right: 0; | ||||
|         } | ||||
|         &.edit-resize-sw { | ||||
|             border-top-right-radius: $cr; | ||||
|             cursor: sw-resize; | ||||
|             bottom: 0; left: 0; | ||||
|         } | ||||
|  | ||||
|         &.edit-resize-nw { top: $o; left: $o; } | ||||
|         &.edit-resize-ne { top: $o; right: $o; } | ||||
|         &.edit-resize-se { bottom: $o; right: $o; } | ||||
|         &.edit-resize-sw { bottom: $o; left: $o; } | ||||
|     } | ||||
|  | ||||
|     .edit-handle { | ||||
|         top: $handleD; right: $handleD; bottom: $handleD; left: $handleD; | ||||
|         &.edit-move { | ||||
|             $m: 0; //$handleD; | ||||
|             cursor: move; | ||||
|             left: $m; | ||||
|             right: $m; | ||||
|             top: $m; | ||||
|             bottom: $m; | ||||
|             z-index: 1; | ||||
|  | ||||
|         } | ||||
|         &.edit-resize-n { | ||||
|             top: 0px; bottom: auto; | ||||
|             height: $handleD; | ||||
|             cursor: n-resize; | ||||
|         } | ||||
|         &.edit-resize-e { | ||||
|             right: 0px; left: auto; | ||||
|             width: $handleD; | ||||
|             cursor: e-resize; | ||||
|         } | ||||
|         &.edit-resize-s { | ||||
|             bottom: 0px; top: auto; | ||||
|             height: $handleD; | ||||
|             cursor: s-resize; | ||||
|         } | ||||
|         &.edit-resize-w { | ||||
|             left: 0px; right: auto; | ||||
|             width: $handleD; | ||||
|             cursor: w-resize; | ||||
|         } | ||||
|     .edit-handle.edit-move { | ||||
|         // main move box for the whole frame element | ||||
|         $m: 0; | ||||
|         left: $m; | ||||
|         right: $m; | ||||
|         top: $m; | ||||
|         bottom: $m; | ||||
|         z-index: 1; | ||||
|     } | ||||
|  | ||||
|     .frame.child-frame.panel { | ||||
|         &:hover { | ||||
|             @include boxShdwLarge(); | ||||
|             border-color: $colorSelectableSelectedPrimary; | ||||
|             .view-switcher { | ||||
|                 opacity: 1; | ||||
|             } | ||||
|             .edit-corner { | ||||
|                 background-color: rgba($colorKey, 0.8); | ||||
|                 &:hover { | ||||
|                     background-color: rgba($colorKey, 1); | ||||
|                 } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Editing Grids | ||||
|     .l-grid-holder { | ||||
|         .l-grid { | ||||
|             &.l-grid-x { @include bgTicks($colorGridLines, 'x'); } | ||||
|             &.l-grid-y { @include bgTicks($colorGridLines, 'y'); } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Display grid when selected or selection parent. | ||||
|     .s-selected .l-grid-holder, | ||||
|     .s-selected-parent .l-grid-holder { | ||||
|         display: block; | ||||
|     } | ||||
|  | ||||
|     // Display in nested frames... | ||||
|     .t-frame-outer { | ||||
|         // ...when drilled in or selection parent... | ||||
|         &.s-drilled-in, &.s-selected-parent { | ||||
|             .l-grid-holder { | ||||
|                 display: block; | ||||
|             } | ||||
|             .t-frame-outer:not(.s-drilled-in) .l-grid-holder { | ||||
|                 display: none; | ||||
|             } | ||||
|         } | ||||
|         // ...but hide otherwise. | ||||
|         .l-grid-holder { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -9,7 +9,6 @@ | ||||
| 	@if $enableImageryThumbs == true { | ||||
| 		bottom: $interiorMargin*2 +  $imageThumbsWrapperH; | ||||
| 	} | ||||
| 	min-height: 100px; | ||||
| 	min-width: 150px; | ||||
| 	.l-image-main { | ||||
| 		background-color: $colorPlotBg; | ||||
| @@ -22,7 +21,9 @@ | ||||
|  | ||||
| .l-image-thumbs-wrapper { | ||||
| 	top: auto; | ||||
| 	height: $imageThumbsWrapperH; | ||||
| 	min-height: $imageThumbsWrapperH; | ||||
| 	max-height: 60%; | ||||
| 	box-sizing: border-box; | ||||
| } | ||||
|  | ||||
| .l-date, | ||||
| @@ -43,14 +44,16 @@ | ||||
| .l-image-main-controlbar { | ||||
| 	font-size: 0.8em; | ||||
| 	line-height: inherit; | ||||
| 	.left, .right { | ||||
| 	.l-datetime-w, .l-controls-w { | ||||
| 		direction: rtl; | ||||
| 		overflow: hidden; | ||||
| 	} | ||||
| 	.left { | ||||
| 	.l-datetime-w { | ||||
|         @include ellipsize(); | ||||
|         margin-right: $interiorMarginSm; | ||||
| 		text-align: left; | ||||
| 	} | ||||
| 	.right { | ||||
| 	.l-controls-w { | ||||
| 		z-index: 2; | ||||
| 	} | ||||
| 	.l-date, | ||||
| @@ -82,9 +85,8 @@ | ||||
| /*************************************** THUMBS */ | ||||
|  | ||||
| .l-image-thumbs-wrapper { | ||||
| 	//@include test(green); | ||||
| 	overflow-x: auto; | ||||
| 	overflow-y: hidden; | ||||
| 	overflow-x: hidden; | ||||
| 	overflow-y: auto; | ||||
| 	padding-bottom: $interiorMargin; | ||||
| 	white-space: nowrap; | ||||
| } | ||||
| @@ -92,8 +94,17 @@ | ||||
| .l-image-thumb-item { | ||||
| 	@include transition(background-color, 0.25s); | ||||
| 	box-sizing: border-box; | ||||
|     cursor: pointer; | ||||
|     direction: ltr; | ||||
|     display: inline-block; | ||||
|     float: left; | ||||
|     font-size: 0.8em; | ||||
| 	padding: 1px; | ||||
| 	position: relative; | ||||
|     margin-left: $interiorMarginSm; | ||||
|     position: relative; | ||||
|     text-align: left; | ||||
|     width: $imageThumbsD + $imageThumbPad*2; | ||||
|     white-space: normal; | ||||
| 	.l-thumb, | ||||
| 	.l-date, | ||||
| 	.l-time { | ||||
| @@ -103,14 +114,7 @@ | ||||
| 	.l-time { | ||||
| 		padding: 2px 3px; | ||||
| 	} | ||||
| 	cursor: pointer; | ||||
| 	direction: ltr; | ||||
| 	display: inline-block; | ||||
| 	font-size: 0.8em; | ||||
| 	margin-left: $interiorMarginSm; | ||||
| 	text-align: left; | ||||
| 	width: $imageThumbsD + $imageThumbPad*2; | ||||
| 	white-space: normal; | ||||
|  | ||||
| 	&:hover { | ||||
| 		background: $colorThumbHoverBg; | ||||
| 		.l-date, | ||||
| @@ -136,6 +140,7 @@ | ||||
| /*************************************** LOCAL CONTROLS */ | ||||
| .l-local-controls { | ||||
|     max-width: 200px; | ||||
|     min-width: 100px; | ||||
|     width: 35%; | ||||
|     input[type="range"] { | ||||
|         display: block; | ||||
| @@ -184,7 +189,8 @@ | ||||
| /*************************************** WHEN IN FRAME */ | ||||
| .frame .t-imagery { | ||||
| 	.l-image-main-wrapper { | ||||
| 		bottom: 0; | ||||
| 		bottom: 0 !important; | ||||
|         height: 100% !important; | ||||
| 		.l-image-main-controlbar { | ||||
| 			font-size: 0.7em; | ||||
| 		} | ||||
| @@ -194,7 +200,8 @@ | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	.l-image-thumbs-wrapper { | ||||
| 	.l-image-thumbs-wrapper, | ||||
|     mct-splitter { | ||||
| 		display: none; | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,19 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| .section-header { | ||||
|     border-radius: $basicCr; | ||||
|     background: $colorFormSectionHeader; | ||||
|     color: lighten($colorBodyFg, 20%); | ||||
|     font-size: inherit; | ||||
|     margin: $interiorMargin 0; | ||||
|     padding: $formTBPad $formLRPad; | ||||
|     text-transform: uppercase; | ||||
|     .view-control { | ||||
|         display: inline-block; | ||||
|         margin-right: $interiorMargin; | ||||
|         width: 1em; | ||||
|         height: 1em; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .form { | ||||
| @@ -41,15 +53,6 @@ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .section-header { | ||||
|         border-radius: $basicCr; | ||||
|         background: $colorFormSectionHeader; | ||||
|         $c: lighten($colorBodyFg, 20%); | ||||
|         color: $c; | ||||
|         font-size: 0.8em; | ||||
|         padding: $formTBPad $formLRPad; | ||||
|     } | ||||
|  | ||||
| 	.form-row { | ||||
| 		$m: $interiorMargin; | ||||
| 		box-sizing: border-box; | ||||
| @@ -57,9 +60,6 @@ | ||||
|         margin-bottom: $interiorMarginLg * 2; | ||||
| 		padding: $formTBPad 0; | ||||
| 		position: relative; | ||||
|         //&ng-form { | ||||
|         //    display: block; | ||||
|         //} | ||||
|  | ||||
| 		&.first { | ||||
| 			border-top: none; | ||||
| @@ -171,3 +171,106 @@ | ||||
| 		padding: $interiorMargin; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /**************************************************************************** COMPACT FORM */ | ||||
| // ul > li > label, control | ||||
| // Make a new UL for each form section | ||||
| // Allow control-first, controls-below | ||||
| // TO-DO: migrate work in branch ch-plot-styling that users .inspector-config to use classes below instead | ||||
|  | ||||
| .l-compact-form .tree ul li, | ||||
| .l-compact-form ul li { | ||||
|     padding: 2px 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| .l-compact-form { | ||||
|     $labelW: 40%; | ||||
|     $minW: $labelW; | ||||
|     ul { | ||||
|         margin-bottom: $interiorMarginLg; | ||||
|         li { | ||||
|             @include display(flex); | ||||
|             @include flex-wrap(wrap); | ||||
|             @include align-items(center); | ||||
|             label, | ||||
|             .control { | ||||
|                 @include display(flex); | ||||
|             } | ||||
|             label { | ||||
|                 line-height: inherit; | ||||
|                 width: $labelW; | ||||
|             } | ||||
|             .controls { | ||||
|                 @include flex-grow(1); | ||||
|                 margin-left: $interiorMargin; | ||||
|                 input[type="text"], | ||||
|                 input[type="search"], | ||||
|                 input[type="number"], | ||||
|                 .select { | ||||
|                     height: $btnStdH; | ||||
|                     line-height: $btnStdH; | ||||
|                     vertical-align: middle; | ||||
|                 } | ||||
|  | ||||
|                 .e-control { | ||||
|                     // Individual form controls | ||||
|                     &:not(:first-child) { | ||||
|                         margin-left: $interiorMarginSm; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             &.connects-to-previous { | ||||
|                 padding-top: 0; | ||||
|             } | ||||
|  | ||||
|             &.section-header { | ||||
|                 margin-top: $interiorMarginLg; | ||||
|                 border-top: 1px solid $colorFormLines; | ||||
|             } | ||||
|  | ||||
|             &.controls-first { | ||||
|                 .control { | ||||
|                     @include flex-grow(0); | ||||
|                     margin-right: $interiorMargin; | ||||
|                     min-width: 0; | ||||
|                     order: 1; | ||||
|                     width: auto; | ||||
|                 } | ||||
|                 label { | ||||
|                     @include flex-grow(1); | ||||
|                     order: 2; | ||||
|                     width: auto; | ||||
|                 } | ||||
|             } | ||||
|             &.controls-under { | ||||
|                 display: block; | ||||
|                 .control, label { | ||||
|                     display: block; | ||||
|                     width: auto; | ||||
|                 } | ||||
|  | ||||
|                 ul li { | ||||
|                     border-top: none !important; | ||||
|                     padding: 0; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .form-error { | ||||
|         // Block element that visually flags an error and contains a message | ||||
|         background-color: $colorFormFieldErrorBg; | ||||
|         color: $colorFormFieldErrorFg; | ||||
|         border-radius: $basicCr; | ||||
|         display: block; | ||||
|         padding: 1px 6px; | ||||
|         &:before { | ||||
|             content: $glyph-icon-alert-triangle; | ||||
|             display: inline; | ||||
|             font-family: symbolsfont; | ||||
|             margin-right: $interiorMarginSm; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -129,9 +129,6 @@ | ||||
| } | ||||
|  | ||||
| .s-filter { | ||||
|     input[type="search"] { | ||||
|         @include input-base(); | ||||
|     } | ||||
|     .clear-icon, | ||||
|     .menu-icon, | ||||
|     &:before { | ||||
|   | ||||
| @@ -79,6 +79,7 @@ | ||||
|  | ||||
|     // Dialog boxes, size constrained and centered in desktop/tablet | ||||
|     &.l-dialog { | ||||
|         font-size: 0.8rem; | ||||
|         .s-button { | ||||
|             &:not(.major) { | ||||
|                 @include btnSubtle($bg: $colorOvrBtnBg, $bgHov: pullForward($colorOvrBtnBg, 10%), $fg: $colorOvrBtnFg, $fgHov: $colorOvrBtnFg, $ic: $colorOvrBtnFg, $icHov: $colorOvrBtnFg); | ||||
| @@ -125,9 +126,9 @@ | ||||
|             @include containerSubtle($colorOvrBg, $colorOvrFg); | ||||
|         } | ||||
|  | ||||
|         .title { | ||||
|         .dialog-title { | ||||
|             @include ellipsize(); | ||||
|             font-size: 1.2em; | ||||
|             font-size: 1.5em; | ||||
|             line-height: 120%; | ||||
|             margin-bottom: $interiorMargin; | ||||
|         } | ||||
| @@ -156,6 +157,8 @@ | ||||
|             left: 0; | ||||
|             right: 0; | ||||
|             overflow: auto; | ||||
|             padding-right: $interiorMargin; | ||||
|             padding-bottom: $interiorMargin; | ||||
|             .field.l-input-med { | ||||
|                 input[type='text'] { | ||||
|                     width: 100%; | ||||
| @@ -193,6 +196,7 @@ | ||||
|  | ||||
|             @include animToParams(overlayIn, $dur: $durLargeViewExpand, $delay: 0); | ||||
|             background: $colorBodyBg; | ||||
|             z-index: 101; | ||||
|  | ||||
|             .abs.inner-holder { | ||||
|                 opacity: 0; | ||||
| @@ -203,10 +207,19 @@ | ||||
|                 @include animToParams(contentsIn, $dur: 50ms, $delay: $durLargeViewExpand * 1.25); | ||||
|             } | ||||
|  | ||||
|             // Hide View Large button | ||||
|             .t-btn-view-large { | ||||
|                 display: none; | ||||
|             } | ||||
|             z-index: 101; | ||||
|  | ||||
|             // But show View Large button when it's nested inside a Layout | ||||
|             .t-frame-inner .t-frame-inner .t-btn-view-large { display: block; } | ||||
|         } | ||||
|     } | ||||
|     // When multiple Large Views are visible, hide the blocker for all but the first | ||||
|     & + .l-large-view { | ||||
|         .blocker { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -52,21 +52,13 @@ ul.tree { | ||||
|  | ||||
|     .view-control { | ||||
|         color: $colorItemTreeVC; | ||||
|         font-size: 0.75em; | ||||
|         margin-right: $interiorMargin; | ||||
|         height: 100%; | ||||
|         line-height: inherit; | ||||
|         width: $treeVCW; | ||||
|         &:before { display: none; } | ||||
|         &.has-children { | ||||
|             &:before { | ||||
|                 position: absolute; | ||||
|                 @include trans-prop-nice(transform, 100ms); | ||||
|                 content: "\e904"; | ||||
|                 @include transform-origin(center); | ||||
|             } | ||||
|             &.expanded:before { | ||||
|                 @include transform(rotate(90deg)); | ||||
|             } | ||||
|             &:before { display: block; } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -23,28 +23,42 @@ | ||||
|     $ohH: $btnFrameH; | ||||
|     $bc: $colorInteriorBorder; | ||||
|     &.child-frame.panel { | ||||
|         background: $colorBodyBg; | ||||
|         border: 1px solid $bc; | ||||
|         z-index: 0; // Needed to prevent child-frame controls from showing through when another child-frame is above | ||||
|         &:hover { | ||||
|             border-color: lighten($bc, 10%); | ||||
|         &:not(.no-frame) { | ||||
|             background: $colorBodyBg; | ||||
|             border-color: $bc; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     .object-browse-bar { | ||||
|         font-size: 0.75em; | ||||
|         height: $ohH; | ||||
|         line-height: $ohH; | ||||
|         .right { | ||||
|             @include trans-prop-nice-fade($controlFadeMs); | ||||
|             padding-left: $interiorMargin; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &.t-object-type-timer, | ||||
|     &.t-object-type-clock, | ||||
|     &.t-object-type-hyperlink, | ||||
|     &.t-object-type-summary-widget { | ||||
|         // Hide the right side buttons for objects where they don't make sense | ||||
|         // Note that this will hide the view Switcher button if applied | ||||
|         // to an object that has it. | ||||
|         .object-browse-bar .right { display: none; } | ||||
|     } | ||||
|  | ||||
|     > .object-holder.abs { | ||||
|         top: $ohH + $interiorMargin; | ||||
|     } | ||||
|     .contents { | ||||
|         $myM: $interiorMargin; | ||||
|         top: $myM; | ||||
|         right: $myM; | ||||
|         bottom: $myM; | ||||
|         left: $myM; | ||||
|         $m: $interiorMargin; | ||||
|         top: $m; | ||||
|         right: $m; | ||||
|         bottom: $m; | ||||
|         left: $m; | ||||
|     } | ||||
|     &.frame-template { | ||||
|         .s-button, | ||||
| @@ -67,39 +81,65 @@ | ||||
|         } | ||||
|     } | ||||
|     .view-switcher { | ||||
|         margin-left: $interiorMargin; // Kick other top bar elements away when I'm present. | ||||
|         margin-right: $interiorMargin; // Kick other top bar elements away when I'm present. | ||||
|         // Hide the name when the view switcher is in a frame context | ||||
|         .title-label { | ||||
|             display: none; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &.no-frame { | ||||
|         background: transparent !important; | ||||
|         border: none !important; | ||||
|         border-color: transparent; | ||||
|         .object-browse-bar .right { | ||||
|             $m: 0; | ||||
|             background: rgba(black, 0.3); | ||||
|             border-radius: $basicCr; | ||||
|             padding: $interiorMarginSm; | ||||
|             position: absolute; | ||||
|             top: $m; right: $m; | ||||
|             z-index: 2; | ||||
|         } | ||||
|         &.t-frame-outer > .t-rep-frame { | ||||
|             &.contents { | ||||
|                 $m: 2px; | ||||
|                 $m: 0px; | ||||
|                 top: $m; | ||||
|                 right: $m; | ||||
|                 bottom: $m; | ||||
|                 left: $m; | ||||
|             } | ||||
|             > .t-frame-inner { | ||||
|                 > .object-browse-bar { | ||||
|                 > .object-browse-bar .left { | ||||
|                     display: none; | ||||
|                 } | ||||
|                 > .object-holder.abs { | ||||
|                     overflow: hidden; | ||||
|                     top: 0 !important; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &.t-frame-outer .s-input-inline { | ||||
|         // Prevent inline inputs from being edited when nested in a Layout | ||||
|         pointer-events: none !important; | ||||
|     } | ||||
|  | ||||
|     /********************************************************** OBJECT TYPES */ | ||||
|     .t-object-type-hyperlink { | ||||
|         .s-hyperlink.s-button { | ||||
|             // When a hyperlink is a button in a frame, make it expand to fill out to the object-holder | ||||
|     .t-object-type-hyperlink, | ||||
|     .t-object-type-summary-widget { | ||||
|         .object-holder { | ||||
|             overflow: hidden; | ||||
|         } | ||||
|         .w-summary-widget, | ||||
|         .l-summary-widget, | ||||
|         .l-hyperlink.s-button { | ||||
|             // Some object types expand to the full size of the object-holder. | ||||
|             @extend .abs; | ||||
|         } | ||||
|  | ||||
|         .l-summary-widget, | ||||
|         .l-hyperlink.s-button { | ||||
|             .label { | ||||
|                 @include ellipsize(); | ||||
|                 @include transform(translateY(-50%)); | ||||
| @@ -117,8 +157,7 @@ | ||||
| body.desktop .frame { | ||||
|     // Hide local controls initially and show it them on hover when they're in an element that's in a frame context | ||||
|     // Frame template is used because we need to target the lowest nested frame | ||||
|     .view-switcher, | ||||
|     .t-btn-view-large { | ||||
|     .object-browse-bar .btn-bar { | ||||
|         opacity: 0; | ||||
|         pointer-events: none; | ||||
|     } | ||||
| @@ -126,8 +165,7 @@ body.desktop .frame { | ||||
|     // Target the first descendant so that we only show the elements in the outermost container. | ||||
|     // Handles the case where we have layouts in layouts. | ||||
|     &:hover > .object-browse-bar { | ||||
|         .view-switcher, | ||||
|         .t-btn-view-large { | ||||
|         .btn-bar { | ||||
|             opacity: 1; | ||||
|             pointer-events: inherit; | ||||
|         } | ||||
|   | ||||
| @@ -81,16 +81,11 @@ | ||||
|         @include absPosDefault(0);// New status bar design | ||||
|         top: auto; | ||||
|         height: $ueFooterH; | ||||
|         line-height: $ueFooterH - ($interiorMargin * 2); | ||||
|         background: $colorStatusBarBg; | ||||
|         color: lighten($colorBodyBg, 30%); | ||||
|         font-size: .7rem; | ||||
|         .status-holder { | ||||
|         .indicator-holder { | ||||
|             box-sizing: border-box; | ||||
|             @include absPosDefault($interiorMargin); | ||||
|             @include ellipsize(); | ||||
|             right: 120px; | ||||
|             text-transform: uppercase; | ||||
|             z-index: 1; | ||||
|         } | ||||
|         .app-logo { | ||||
| @@ -105,6 +100,14 @@ | ||||
|     } | ||||
| } | ||||
|  | ||||
| .s-status-bar { | ||||
|     background: $colorStatusBarBg; | ||||
|     color: lighten($colorBodyBg, 30%); | ||||
|     font-size: .7rem; | ||||
|     line-height: $ueFooterH - ($interiorMargin * 2); | ||||
|     text-transform: uppercase; | ||||
| } | ||||
|  | ||||
| .edit-mode { | ||||
|     // Old edit mode | ||||
|     .split-layout { | ||||
| @@ -240,7 +243,9 @@ body.desktop .pane .mini-tab-icon.toggle-pane { | ||||
| .top-bar .buttons-main .s-button, | ||||
| .top-bar .s-menu-button, | ||||
| .tool-bar .s-button, | ||||
| .tool-bar .s-menu-button { | ||||
| .tool-bar .s-menu-button, | ||||
| .tool-bar .select, | ||||
| .tool-bar .input-labeled { | ||||
|     $h: $btnToolbarH; | ||||
|     height: $h; | ||||
|     line-height: $h; | ||||
|   | ||||
| @@ -19,21 +19,53 @@ | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| .s-selectable { | ||||
| .s-hover-border { | ||||
|     border: 1px solid transparent; | ||||
|  | ||||
|     &.s-hover { | ||||
|         // Styles when hovering over a selectable object | ||||
|         border-color: $colorSelectableHov !important; | ||||
|     } | ||||
|  | ||||
|     &.s-selected { | ||||
|         // Styles for a selected object. Also used by legacy Fixed Position/Panel objects. | ||||
|         border-color: $colorSelectableSelectedPrimary !important; | ||||
|     } | ||||
|  | ||||
|     &.s-moveable { | ||||
|         @include boxShdwLarge(); | ||||
|         cursor: move; | ||||
|     &:hover { | ||||
|         border-color: rgba($colorSelectableSelectedPrimary, 0.5) !important; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .s-status-editing { | ||||
|     // Limit to editing mode | ||||
|     $o: 0.5; | ||||
|     $oHover: 0.8; | ||||
|     $bc: $colorSelectableSelectedPrimary; | ||||
|     .s-hover-border { | ||||
|         // Show a border by default so user can see object bounds and empty objects | ||||
|         border-color: rgba($bc, $o) !important; | ||||
|         border-style: dotted !important; | ||||
|  | ||||
|         &:hover { | ||||
|             border-color: rgba($bc, $oHover) !important; | ||||
|         } | ||||
|  | ||||
|         &.t-object-type-layout { | ||||
|             border-style: dashed !important; | ||||
|         } | ||||
|     } | ||||
|     .s-selected { | ||||
|         &.s-moveable { | ||||
|             &:not(.s-drilled-in) { | ||||
|                 cursor: move; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| .s-selected > .s-hover-border, | ||||
| .s-selected.s-hover-border { | ||||
|     // Styles for a selected object. Also used by legacy Fixed Position/Panel objects. | ||||
|     border-color: $colorSelectableSelectedPrimary !important; | ||||
|     @include boxShdwLarge(); | ||||
|     // Show edit-corners if you got 'em | ||||
|     .edit-corner { | ||||
|         display: block; | ||||
|         &:hover { | ||||
|             background-color: rgba($colorKey, 1); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -20,6 +20,7 @@ | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
| .tool-bar { | ||||
|     font-size: 0.7rem; | ||||
|     &.btn-bar { | ||||
|         white-space: nowrap; | ||||
|     } | ||||
| @@ -30,9 +31,7 @@ | ||||
|     input[type="search"], | ||||
|     input[type="number"] { | ||||
| 		box-sizing: border-box; | ||||
| 		font-size: .8em; | ||||
| 		height: $btnToolbarH; | ||||
| 		margin-bottom: 1px; | ||||
| 		position: relative; | ||||
| 		&.sm { | ||||
| 			width: $btnToolbarH; | ||||
|   | ||||
| @@ -19,13 +19,11 @@ | ||||
|  this source code distribution or the Licensing information page available | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <div class='abs bottom-bar ue-bottom-bar mobile-disable-select' ng-controller="BottomBarController as bar"> | ||||
|     <div id='status' class='status-holder'> | ||||
| <div class='abs bottom-bar ue-bottom-bar s-status-bar mobile-disable-select' ng-controller="BottomBarController as bar"> | ||||
|     <div id='status' class='indicator-holder'> | ||||
|         <mct-include ng-repeat="indicator in bar.getIndicators()" | ||||
|                      ng-model="indicator.ngModel" | ||||
|                      key="indicator.template" | ||||
|                      class="status-block-holder" | ||||
|                      ng-class='indicator.ngModel.getGlyphClass()'> | ||||
|                      key="indicator.template"> | ||||
|         </mct-include> | ||||
|     </div> | ||||
|     <mct-include key="'message-banner'"></mct-include> | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <span ng-controller="DateTimeFieldController"> | ||||
|     <input type="text" | ||||
|     <input type="text" autocorrect="off" spellcheck="false" | ||||
|            ng-model="textValue" | ||||
|            ng-blur="restoreTextValue(); ngBlur()" | ||||
|            ng-mouseup="ngMouseup()" | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <!-- look at action-button for example --> | ||||
| <span class="t-filter l-filter s-filter" | ||||
| <span class="t-filter l-filter" | ||||
|       ng-controller="GetterSetterController"> | ||||
| 	<input type="search" | ||||
|            class="t-filter-input" | ||||
|   | ||||
| @@ -20,14 +20,13 @@ | ||||
|  at runtime from the About dialog for additional information. | ||||
| --> | ||||
| <!-- DO NOT ADD SPACES BETWEEN THE SPANS - IT ADDS WHITE SPACE!! --> | ||||
| <div class='status block' | ||||
| <div class='l-indicator s-indicator s-indicator-status-{{ngModel.getGlyphClass()}}' | ||||
| 	 title="{{ngModel.getDescription()}}" | ||||
| 	 ng-click='ngModel.configure()' | ||||
| 	 ng-show="ngModel.getText().length > 0"> | ||||
| 	<span class="status-indicator {{ngModel.getCssClass()}}"></span><span class="label" | ||||
| 		  ng-class='ngModel.getTextClass()'> | ||||
| 	 ng-show="ngModel.getText().length > 0" | ||||
|      ng-class="ngModel.getCssClass()"> | ||||
| 	<span class="label" ng-class='ngModel.getTextClass()'> | ||||
| 		{{ngModel.getText()}} | ||||
|         <a class="s-button icon-gear" ng-if="ngModel.configure"></a> | ||||
| 	</span><span class="count"> | ||||
| 	</span> | ||||
| </div> | ||||
|   | ||||
| @@ -40,7 +40,7 @@ define( | ||||
|  | ||||
|             // Gets an array of the contextual parents/ancestors of the selected object | ||||
|             function getContextualPath() { | ||||
|                 var currentObj = $scope.ngModel.selectedObject, | ||||
|                 var currentObj = $scope.domainObject, | ||||
|                     currentParent, | ||||
|                     parents = []; | ||||
|  | ||||
| @@ -68,7 +68,7 @@ define( | ||||
|  | ||||
|                 // If this the the initial call of this recursive function | ||||
|                 if (!current) { | ||||
|                     current = $scope.ngModel.selectedObject; | ||||
|                     current = $scope.domainObject; | ||||
|                     $scope.primaryParents = []; | ||||
|                 } | ||||
|  | ||||
| @@ -87,16 +87,16 @@ define( | ||||
|  | ||||
|             // Gets the metadata for the selected object | ||||
|             function getMetadata() { | ||||
|                 $scope.metadata = $scope.ngModel.selectedObject && | ||||
|                     $scope.ngModel.selectedObject.hasCapability('metadata') && | ||||
|                     $scope.ngModel.selectedObject.useCapability('metadata'); | ||||
|                 $scope.metadata = $scope.domainObject && | ||||
|                     $scope.domainObject.hasCapability('metadata') && | ||||
|                     $scope.domainObject.useCapability('metadata'); | ||||
|             } | ||||
|  | ||||
|             // Set scope variables when the selected object changes | ||||
|             $scope.$watch('ngModel.selectedObject', function () { | ||||
|                 $scope.isLink = $scope.ngModel.selectedObject && | ||||
|                     $scope.ngModel.selectedObject.hasCapability('location') && | ||||
|                     $scope.ngModel.selectedObject.getCapability('location').isLink(); | ||||
|             $scope.$watch('domainObject', function () { | ||||
|                 $scope.isLink = $scope.domainObject && | ||||
|                     $scope.domainObject.hasCapability('location') && | ||||
|                     $scope.domainObject.getCapability('location').isLink(); | ||||
|  | ||||
|                 if ($scope.isLink) { | ||||
|                     getPrimaryPath(); | ||||
| @@ -108,8 +108,11 @@ define( | ||||
|  | ||||
|                 getMetadata(); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|             var mutation = $scope.domainObject.getCapability('mutation'); | ||||
|             var unlisten = mutation.listen(getMetadata); | ||||
|             $scope.$on('$destroy', unlisten); | ||||
|         } | ||||
|         return ObjectInspectorController; | ||||
|     } | ||||
| ); | ||||
|   | ||||
							
								
								
									
										60
									
								
								platform/commonUI/general/src/directives/MCTSelectable.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								platform/commonUI/general/src/directives/MCTSelectable.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /***************************************************************************** | ||||
|  * Open MCT, Copyright (c) 2014-2017, United States Government | ||||
|  * as represented by the Administrator of the National Aeronautics and Space | ||||
|  * Administration. All rights reserved. | ||||
|  * | ||||
|  * Open MCT is licensed under the Apache License, Version 2.0 (the | ||||
|  * "License"); you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * http://www.apache.org/licenses/LICENSE-2.0. | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
|  * License for the specific language governing permissions and limitations | ||||
|  * under the License. | ||||
|  * | ||||
|  * Open MCT includes source code licensed under additional open source | ||||
|  * licenses. See the Open Source Licenses file (LICENSES.md) included with | ||||
|  * this source code distribution or the Licensing information page available | ||||
|  * at runtime from the About dialog for additional information. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| define( | ||||
|     [], | ||||
|     function () { | ||||
|  | ||||
|         /** | ||||
|          * The mct-selectable directive allows selection functionality | ||||
|          * (click) to be attached to specific elements. | ||||
|          * | ||||
|          * @memberof platform/commonUI/general | ||||
|          * @constructor | ||||
|          */ | ||||
|         function MCTSelectable(openmct) { | ||||
|  | ||||
|             // Link; install event handlers. | ||||
|             function link(scope, element, attrs) { | ||||
|                 var removeSelectable = openmct.selection.selectable( | ||||
|                     element[0], | ||||
|                     scope.$eval(attrs.mctSelectable), | ||||
|                     attrs.hasOwnProperty('mctInitSelect') && scope.$eval(attrs.mctInitSelect) !== false | ||||
|                 ); | ||||
|  | ||||
|                 scope.$on("$destroy", function () { | ||||
|                     removeSelectable(); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             return { | ||||
|                 // mct-selectable only makes sense as an attribute | ||||
|                 restrict: "A", | ||||
|                 // Link function, to install event handlers | ||||
|                 link: link | ||||
|             }; | ||||
|  | ||||
|         } | ||||
|  | ||||
|         return MCTSelectable; | ||||
|     } | ||||
| ); | ||||
| @@ -117,6 +117,8 @@ define( | ||||
|  | ||||
|                 // Apply styles to child elements | ||||
|                 function updateChildren(children) { | ||||
|                     position = userWidthPreference || position; | ||||
|  | ||||
|                     // Pick out correct elements to update, flowing from | ||||
|                     // selected anchor edge. | ||||
|                     var first = children.eq(anchor.reversed ? 2 : 0), | ||||
| @@ -126,7 +128,7 @@ define( | ||||
|  | ||||
|                     splitterSize = getSize(splitter[0]); | ||||
|                     first.css(anchor.edge, "0px"); | ||||
|                     first.css(anchor.dimension, (userWidthPreference || position) + 'px'); | ||||
|                     first.css(anchor.dimension, position + 'px'); | ||||
|  | ||||
|                     // Get actual size (to obey min-width etc.) | ||||
|                     firstSize = getSize(first[0]); | ||||
| @@ -135,8 +137,8 @@ define( | ||||
|                     splitter.css(anchor.opposite, "auto"); | ||||
|  | ||||
|                     last.css(anchor.edge, firstSize + splitterSize + 'px'); | ||||
|                     last.css(anchor.opposite, "0px"); | ||||
|                     position = firstSize + splitterSize; | ||||
|                     last.css(anchor.opposite, '0px'); | ||||
|                     position = firstSize; | ||||
|                 } | ||||
|  | ||||
|                 // Update positioning of contained elements | ||||
| @@ -173,17 +175,19 @@ define( | ||||
|                             positionParsed.assign($scope, position); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     return position; | ||||
|                 } | ||||
|  | ||||
|                 function setUserWidthPreference(value) { | ||||
|                     userWidthPreference = value - splitterSize; | ||||
|                     if (alias) { | ||||
|                         userWidthPreference = value; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 function persistToLocalStorage(value) { | ||||
|                     if (alias) { | ||||
|                         userWidthPreference = value - splitterSize; | ||||
|                         $window.localStorage.setItem(alias, userWidthPreference); | ||||
|                         $window.localStorage.setItem(alias, value); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
| @@ -225,13 +229,13 @@ define( | ||||
|                     anchor: function () { | ||||
|                         return anchor; | ||||
|                     }, | ||||
|                     position: function (value) { | ||||
|                         if (arguments.length > 0) { | ||||
|                             setUserWidthPreference(value); | ||||
|                             return getSetPosition(value); | ||||
|                         } else { | ||||
|                     position: function (newPosition) { | ||||
|                         if (arguments.length === 0) { | ||||
|                             return getSetPosition(); | ||||
|                         } | ||||
|  | ||||
|                         setUserWidthPreference(newPosition); | ||||
|                         return getSetPosition(newPosition); | ||||
|                     }, | ||||
|                     startResizing: function () { | ||||
|                         toggleClass('resizing'); | ||||
|   | ||||
| @@ -57,7 +57,10 @@ define( | ||||
|  | ||||
|                         // Update the position of this splitter | ||||
|                         newPosition =  initialPosition + pixelDelta; | ||||
|                         mctSplitPane.position(newPosition); | ||||
|  | ||||
|                         if (initialPosition !== newPosition) { | ||||
|                             mctSplitPane.position(newPosition); | ||||
|                         } | ||||
|                     }, | ||||
|                     // Grab the event when the user is done moving | ||||
|                     // the splitter and pass it on | ||||
|   | ||||
| @@ -39,10 +39,8 @@ define( | ||||
|             beforeEach(function () { | ||||
|                 mockScope = jasmine.createSpyObj( | ||||
|                     "$scope", | ||||
|                     ["$watch"] | ||||
|                     ["$watch", "$on"] | ||||
|                 ); | ||||
|                 mockScope.ngModel = {}; | ||||
|                 mockScope.ngModel.selectedObject = 'mock selected object'; | ||||
|  | ||||
|                 mockObjectService = jasmine.createSpyObj( | ||||
|                     "objectService", | ||||
| @@ -69,22 +67,27 @@ define( | ||||
|                     "location capability", | ||||
|                     ["isLink"] | ||||
|                 ); | ||||
|  | ||||
|                 mockDomainObject.getCapability.andCallFake(function (param) { | ||||
|                     if (param === 'location') { | ||||
|                         return mockLocationCapability; | ||||
|                     } else if (param === 'context') { | ||||
|                         return mockContextCapability; | ||||
|                     } else if (param === 'mutation') { | ||||
|                         return { | ||||
|                             listen: function () { | ||||
|                                 return true; | ||||
|                             } | ||||
|                         }; | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|                 mockScope.domainObject = mockDomainObject; | ||||
|                 controller = new ObjectInspectorController(mockScope, mockObjectService); | ||||
|  | ||||
|                 // Change the selected object to trigger the watch call | ||||
|                 mockScope.ngModel.selectedObject = mockDomainObject; | ||||
|             }); | ||||
|  | ||||
|             it("watches for changes to the selected object", function () { | ||||
|                 expect(mockScope.$watch).toHaveBeenCalledWith('ngModel.selectedObject', jasmine.any(Function)); | ||||
|                 expect(mockScope.$watch).toHaveBeenCalledWith('domainObject', jasmine.any(Function)); | ||||
|             }); | ||||
|  | ||||
|             it("looks for contextual parent objects", function () { | ||||
|   | ||||
| @@ -140,7 +140,7 @@ define( | ||||
|  | ||||
|                 it("exposes its splitter's initial position", function () { | ||||
|                     expect(controller.position()).toEqual( | ||||
|                         mockFirstPane[0].offsetWidth + mockSplitter[0].offsetWidth | ||||
|                         mockFirstPane[0].offsetWidth | ||||
|                     ); | ||||
|                 }); | ||||
|  | ||||
| @@ -168,7 +168,7 @@ define( | ||||
|                     controller.position(testValue); | ||||
|                     expect(mockFirstPane.css).toHaveBeenCalledWith( | ||||
|                         'width', | ||||
|                         (testValue - mockSplitter[0].offsetWidth) + 'px' | ||||
|                         (testValue) + 'px' | ||||
|                     ); | ||||
|                 }); | ||||
|  | ||||
| @@ -200,11 +200,11 @@ define( | ||||
|                     mockFirstPane[0].offsetWidth += 100; | ||||
|                     // Should not reflect the change yet | ||||
|                     expect(controller.position()).not.toEqual( | ||||
|                         mockFirstPane[0].offsetWidth + mockSplitter[0].offsetWidth | ||||
|                         mockFirstPane[0].offsetWidth | ||||
|                     ); | ||||
|                     mockInterval.mostRecentCall.args[0](); | ||||
|                     expect(controller.position()).toEqual( | ||||
|                         mockFirstPane[0].offsetWidth + mockSplitter[0].offsetWidth | ||||
|                         mockFirstPane[0].offsetWidth | ||||
|                     ); | ||||
|                 }); | ||||
|  | ||||
| @@ -216,7 +216,7 @@ define( | ||||
|  | ||||
|                 it("saves user preference to localStorage when user is done resizing", function () { | ||||
|                     controller.endResizing(100); | ||||
|                     expect(Number(mockWindow.localStorage.getItem('mctSplitPane-rightSide'))).toEqual(100 - mockSplitter[0].offsetWidth); | ||||
|                     expect(Number(mockWindow.localStorage.getItem('mctSplitPane-rightSide'))).toEqual(100); | ||||
|                 }); | ||||
|  | ||||
|             }); | ||||
|   | ||||
| @@ -65,6 +65,10 @@ define( | ||||
|             options = Object.create(OPTIONS); | ||||
|             options.marginX = -bubbleSpaceLR; | ||||
|  | ||||
|             // prevent bubble from appearing right under pointer, | ||||
|             // which causes hover callback to be called multiple times | ||||
|             options.offsetX = 1; | ||||
|  | ||||
|             // On a phone, bubble takes up more screen real estate, | ||||
|             // so position it differently (toward the bottom) | ||||
|             if (this.agentService.isPhone()) { | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user