From 03252aac1bbe4d520f032c3c9e256f8fc9786090 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Mon, 8 Jun 2015 13:50:54 -0700 Subject: [PATCH 01/64] [Frontend] Ported over all /platform changes from warp1222 WTD-1222 --- platform/commonUI/general/res/css/forms.css | 33 +- platform/commonUI/general/res/css/items.css | 4 +- .../general/res/css/theme-espresso.css | 875 +++++++++++------- platform/commonUI/general/res/css/tree.css | 2 +- .../general/res/fonts/symbols/wtdsymbols.eot | Bin 10128 -> 10676 bytes .../general/res/fonts/symbols/wtdsymbols.svg | 25 +- .../general/res/fonts/symbols/wtdsymbols.ttf | Bin 9964 -> 10512 bytes .../general/res/fonts/symbols/wtdsymbols.woff | Bin 7036 -> 7308 bytes .../commonUI/general/res/sass/_constants.scss | 23 +- .../commonUI/general/res/sass/_effects.scss | 4 +- .../commonUI/general/res/sass/_global.scss | 7 + platform/commonUI/general/res/sass/_main.scss | 2 +- .../commonUI/general/res/sass/_mixins.scss | 25 + .../general/res/sass/controls/_buttons.scss | 52 +- .../general/res/sass/controls/_controls.scss | 62 +- .../general/res/sass/features/_imagery.scss | 170 ++++ .../general/res/sass/forms/_text-input.scss | 17 +- .../general/res/sass/helpers/_bubbles.scss | 104 ++- .../commonUI/general/res/sass/tree/_tree.scss | 2 +- .../res/sass/user-environ/_layout.scss | 30 +- .../features/static-markup/res/markup.html | 140 ++- 21 files changed, 1090 insertions(+), 487 deletions(-) create mode 100644 platform/commonUI/general/res/sass/features/_imagery.scss diff --git a/platform/commonUI/general/res/css/forms.css b/platform/commonUI/general/res/css/forms.css index 4fee272bb9..903a2694f0 100644 --- a/platform/commonUI/general/res/css/forms.css +++ b/platform/commonUI/general/res/css/forms.css @@ -302,8 +302,7 @@ label.form-control.checkbox input { * at runtime from the About dialog for additional information. *****************************************************************************/ /* line 22, ../sass/forms/_text-input.scss */ -input[type="text"], -input[type="date"] { +input[type="text"] { -moz-appearance: none; -webkit-appearance: none; -moz-border-radius: 3px; @@ -322,32 +321,10 @@ input[type="date"] { outline: none; padding: 0 3px; } /* line 33, ../sass/forms/_mixins.scss */ - input[type="text"].error, - input[type="date"].error { + input[type="text"].error { background: rgba(255, 0, 0, 0.5); } - /* line 61, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]:-moz-placeholder, - input[type="date"]:-moz-placeholder { - color: gray; - font-style: italic; } - /* line 64, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]::-moz-placeholder, - input[type="date"]::-moz-placeholder { - color: gray; - font-style: italic; } - /* line 67, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]:-ms-input-placeholder, - input[type="date"]:-ms-input-placeholder { - color: gray; - font-style: italic; } - /* line 56, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]::-webkit-input-placeholder, - input[type="date"]::-webkit-input-placeholder { - color: gray; - font-style: italic; } - /* line 34, ../sass/forms/_text-input.scss */ - input[type="text"].numeric, - input[type="date"].numeric { + /* line 29, ../sass/forms/_text-input.scss */ + input[type="text"].numeric { text-align: right; } /***************************************************************************** @@ -397,7 +374,7 @@ input[type="date"] { margin: 0 0 2px 2px; overflow: hidden; position: relative; } - /* line 148, ../sass/_mixins.scss */ + /* line 173, ../sass/_mixins.scss */ .form-control.select:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; diff --git a/platform/commonUI/general/res/css/items.css b/platform/commonUI/general/res/css/items.css index 92d6f49101..875fe8488f 100644 --- a/platform/commonUI/general/res/css/items.css +++ b/platform/commonUI/general/res/css/items.css @@ -119,7 +119,7 @@ margin-bottom: 3px; margin-right: 3px; position: relative; } - /* line 148, ../sass/_mixins.scss */ + /* line 173, ../sass/_mixins.scss */ .items-holder .item.grid-item:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzczNzM3MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -210,7 +210,7 @@ background-image: -webkit-linear-gradient(#33ccff, #0099cc); background-image: linear-gradient(#33ccff, #0099cc); color: #80dfff; } - /* line 156, ../sass/_mixins.scss */ + /* line 181, ../sass/_mixins.scss */ .items-holder .item.grid-item.selected:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2ZDlmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index f080545ba4..2d0aa19ff9 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -1,4 +1,67 @@ @charset "UTF-8"; +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ /* CONSTANTS */ /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government @@ -21,7 +84,7 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 5, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 5, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, @@ -42,38 +105,38 @@ time, mark, audio, video { font-size: 100%; vertical-align: baseline; } -/* line 22, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 22, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html { line-height: 1; } -/* line 24, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 24, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 26, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 26, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ table { border-collapse: collapse; border-spacing: 0; } -/* line 28, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 28, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 30, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 30, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q, blockquote { quotes: none; } - /* line 103, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ + /* line 103, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } -/* line 32, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 32, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 116, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 116, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } @@ -154,17 +217,17 @@ a.disabled { @-moz-keyframes pulse { 0% { - opacity: 0.2; } + opacity: 0.5; } 100% { opacity: 1; } } @-webkit-keyframes pulse { 0% { - opacity: 0.2; } + opacity: 0.5; } 100% { opacity: 1; } } @keyframes pulse { 0% { - opacity: 0.2; } + opacity: 0.5; } 100% { opacity: 1; } } /* line 59, ../sass/_effects.scss */ @@ -172,9 +235,9 @@ a.disabled { -moz-animation-name: pulse; -webkit-animation-name: pulse; animation-name: pulse; - -moz-animation-duration: 1000ms; - -webkit-animation-duration: 1000ms; - animation-duration: 1000ms; + -moz-animation-duration: 750ms; + -webkit-animation-duration: 750ms; + animation-duration: 750ms; -moz-animation-direction: alternate; -webkit-animation-direction: alternate; animation-direction: alternate; @@ -304,7 +367,12 @@ span { .hidden { display: none !important; } -/* line 120, ../sass/_global.scss */ +/* line 121, ../sass/_global.scss */ +.paused:not(.s-btn):not(.s-icon-btn) { + border-color: #c56f01 !important; + color: #c56f01 !important; } + +/* line 127, ../sass/_global.scss */ .sep { color: rgba(255, 255, 255, 0.2); } @@ -403,27 +471,23 @@ span { .bar.abs, .btn-menu span.bar.l-click-area { text-wrap: none; white-space: nowrap; } - /* line 73, ../sass/user-environ/_layout.scss */ - .bar.abs.left, .btn-menu span.bar.left.l-click-area, - .bar.abs .left, - .btn-menu span.bar.l-click-area .left { - width: 45%; - right: auto; } - /* line 78, ../sass/user-environ/_layout.scss */ - .bar.abs.right, .btn-menu span.bar.right.l-click-area, - .bar.abs .right, - .btn-menu span.bar.l-click-area .right { - width: 45%; - left: auto; - right: 0; - text-align: right; } - /* line 84, ../sass/user-environ/_layout.scss */ - .bar.abs.right .icon.major, .btn-menu span.bar.right.l-click-area .icon.major, - .bar.abs .right .icon.major, - .btn-menu span.bar.l-click-area .right .icon.major { - margin-left: 15px; } +/* line 74, ../sass/user-environ/_layout.scss */ +.bar.left, +.bar .left { + width: 45% !important; + right: auto !important; } +/* line 79, ../sass/user-environ/_layout.scss */ +.bar.right, +.bar .right { + width: 45% !important; + left: auto !important; + text-align: right; } + /* line 84, ../sass/user-environ/_layout.scss */ + .bar.right .icon.major, + .bar .right .icon.major { + margin-left: 15px; } -/* line 95, ../sass/user-environ/_layout.scss */ +/* line 91, ../sass/user-environ/_layout.scss */ .user-environ .browse-area, .user-environ .edit-area, .user-environ .editor { @@ -431,42 +495,42 @@ span { right: 5px; bottom: 30px; left: 5px; } -/* line 106, ../sass/user-environ/_layout.scss */ +/* line 102, ../sass/user-environ/_layout.scss */ .user-environ .browse-area > .contents, .user-environ .edit-area > .contents { left: 0; right: 0; } -/* line 112, ../sass/user-environ/_layout.scss */ +/* line 108, ../sass/user-environ/_layout.scss */ .user-environ .edit-area { top: 40px; } - /* line 115, ../sass/user-environ/_layout.scss */ + /* line 111, ../sass/user-environ/_layout.scss */ .user-environ .edit-area .tool-bar { bottom: auto; height: 30px; line-height: 25px; } - /* line 120, ../sass/user-environ/_layout.scss */ + /* line 116, ../sass/user-environ/_layout.scss */ .user-environ .edit-area .work-area { top: 40px; } -/* line 125, ../sass/user-environ/_layout.scss */ +/* line 121, ../sass/user-environ/_layout.scss */ .user-environ .bottom-bar { top: auto; right: 5px; bottom: 5px; left: 5px; height: 20px; } - /* line 131, ../sass/user-environ/_layout.scss */ + /* line 127, ../sass/user-environ/_layout.scss */ .user-environ .bottom-bar .status-holder { right: 110px; } - /* line 134, ../sass/user-environ/_layout.scss */ + /* line 130, ../sass/user-environ/_layout.scss */ .user-environ .bottom-bar .app-logo { left: auto; width: 105px; } -/* line 141, ../sass/user-environ/_layout.scss */ +/* line 137, ../sass/user-environ/_layout.scss */ .cols { overflow: hidden; *zoom: 1; } - /* line 143, ../sass/user-environ/_layout.scss */ + /* line 139, ../sass/user-environ/_layout.scss */ .cols .col { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; @@ -477,103 +541,103 @@ span { margin-left: 1.5%; padding-left: 5px; position: relative; } - /* line 151, ../sass/user-environ/_layout.scss */ + /* line 147, ../sass/user-environ/_layout.scss */ .cols .col:first-child { margin-left: 0; padding-left: 0; } - /* line 158, ../sass/user-environ/_layout.scss */ + /* line 154, ../sass/user-environ/_layout.scss */ .cols.cols-2 .col-1 { min-width: 250px; width: 48.5%; } - /* line 164, ../sass/user-environ/_layout.scss */ + /* line 160, ../sass/user-environ/_layout.scss */ .cols.cols-2-ff .col-100px { width: 100px; } - /* line 171, ../sass/user-environ/_layout.scss */ + /* line 167, ../sass/user-environ/_layout.scss */ .cols.cols-6 .col-1 { min-width: 83.33333px; width: 15.16667%; } - /* line 177, ../sass/user-environ/_layout.scss */ + /* line 173, ../sass/user-environ/_layout.scss */ .cols.cols-16 .col-1 { min-width: 31.25px; width: 4.75%; } - /* line 180, ../sass/user-environ/_layout.scss */ + /* line 176, ../sass/user-environ/_layout.scss */ .cols.cols-16 .col-2 { min-width: 62.5px; width: 11%; } - /* line 183, ../sass/user-environ/_layout.scss */ + /* line 179, ../sass/user-environ/_layout.scss */ .cols.cols-16 .col-7 { min-width: 218.75px; width: 42.25%; } - /* line 189, ../sass/user-environ/_layout.scss */ + /* line 185, ../sass/user-environ/_layout.scss */ .cols.cols-32 .col-2 { min-width: 31.25px; width: 4.75%; } - /* line 192, ../sass/user-environ/_layout.scss */ + /* line 188, ../sass/user-environ/_layout.scss */ .cols.cols-32 .col-15 { min-width: 234.375px; width: 45.375%; } - /* line 196, ../sass/user-environ/_layout.scss */ + /* line 192, ../sass/user-environ/_layout.scss */ .cols .l-row { overflow: hidden; *zoom: 1; padding: 5px 0; } -/* line 202, ../sass/user-environ/_layout.scss */ +/* line 198, ../sass/user-environ/_layout.scss */ .pane { position: absolute; } - /* line 205, ../sass/user-environ/_layout.scss */ + /* line 201, ../sass/user-environ/_layout.scss */ .pane.treeview .create-btn-holder { bottom: auto; top: 0; height: 30px; } - /* line 208, ../sass/user-environ/_layout.scss */ + /* line 204, ../sass/user-environ/_layout.scss */ .pane.treeview .create-btn-holder .wrapper.menu-element { position: absolute; bottom: 5px; } - /* line 213, ../sass/user-environ/_layout.scss */ + /* line 209, ../sass/user-environ/_layout.scss */ .pane.treeview .tree-holder { overflow: auto; top: 35px; } - /* line 221, ../sass/user-environ/_layout.scss */ + /* line 217, ../sass/user-environ/_layout.scss */ .pane.items .object-browse-bar .left.abs, .pane.items .object-browse-bar .btn-menu span.left.l-click-area, .btn-menu .pane.items .object-browse-bar span.left.l-click-area, .pane.items .object-browse-bar .right.abs, .pane.items .object-browse-bar .btn-menu span.right.l-click-area, .btn-menu .pane.items .object-browse-bar span.right.l-click-area { top: auto; } - /* line 225, ../sass/user-environ/_layout.scss */ + /* line 221, ../sass/user-environ/_layout.scss */ .pane.items .object-browse-bar .right.abs, .pane.items .object-browse-bar .btn-menu span.right.l-click-area, .btn-menu .pane.items .object-browse-bar span.right.l-click-area { bottom: 5px; } - /* line 229, ../sass/user-environ/_layout.scss */ + /* line 225, ../sass/user-environ/_layout.scss */ .pane.items .object-holder { top: 35px; } - /* line 234, ../sass/user-environ/_layout.scss */ + /* line 230, ../sass/user-environ/_layout.scss */ .pane.edit-main .object-holder { top: 0; } - /* line 240, ../sass/user-environ/_layout.scss */ + /* line 236, ../sass/user-environ/_layout.scss */ .pane .object-holder { overflow: auto; } -/* line 248, ../sass/user-environ/_layout.scss */ +/* line 244, ../sass/user-environ/_layout.scss */ .split-layout.horizontal > .pane { margin-top: 5px; } - /* line 251, ../sass/user-environ/_layout.scss */ + /* line 247, ../sass/user-environ/_layout.scss */ .split-layout.horizontal > .pane:first-child { margin-top: 0; } -/* line 258, ../sass/user-environ/_layout.scss */ +/* line 254, ../sass/user-environ/_layout.scss */ .split-layout.vertical > .pane { margin-left: 5px; } - /* line 260, ../sass/user-environ/_layout.scss */ + /* line 256, ../sass/user-environ/_layout.scss */ .split-layout.vertical > .pane > .holder { left: 0; right: 0; } - /* line 264, ../sass/user-environ/_layout.scss */ + /* line 260, ../sass/user-environ/_layout.scss */ .split-layout.vertical > .pane:first-child { margin-left: 0; } - /* line 266, ../sass/user-environ/_layout.scss */ + /* line 262, ../sass/user-environ/_layout.scss */ .split-layout.vertical > .pane:first-child .holder { right: 5px; } -/* line 275, ../sass/user-environ/_layout.scss */ +/* line 271, ../sass/user-environ/_layout.scss */ .vscroll { overflow-y: auto; } @@ -979,7 +1043,7 @@ span { display: inline-block; font-size: 1rem; vertical-align: middle; } - /* line 200, ../sass/_mixins.scss */ + /* line 225, ../sass/_mixins.scss */ .invoke-menu:hover { color: #33ccff; } @@ -991,7 +1055,7 @@ span { /* line 70, ../sass/_icons.scss */ .icon-buttons-main .invoke-menu { color: #666666; } - /* line 200, ../sass/_mixins.scss */ + /* line 225, ../sass/_mixins.scss */ .icon-buttons-main .invoke-menu:hover { color: #999999; } @@ -1280,7 +1344,7 @@ span { cursor: pointer; } /*********************************** STYLE STYLES */ -/* line 31, ../sass/controls/_buttons.scss */ +/* line 30, ../sass/controls/_buttons.scss */ .s-btn, .s-icon-btn { -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -1290,9 +1354,8 @@ span { box-sizing: border-box; text-shadow: rgba(0, 0, 0, 0.3) 0 1px 1px; line-height: 1.2em; - padding: 0 10px; text-decoration: none; } - /* line 39, ../sass/controls/_buttons.scss */ + /* line 36, ../sass/controls/_buttons.scss */ .s-btn.s-very-subtle, .s-very-subtle.s-icon-btn { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1313,7 +1376,7 @@ span { border-top: 1px solid #666666; color: #999; display: inline-block; } - /* line 103, ../sass/_mixins.scss */ + /* line 128, ../sass/_mixins.scss */ .s-btn.s-very-subtle:hover, .s-very-subtle.s-icon-btn:hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1321,34 +1384,102 @@ span { background-image: -moz-linear-gradient(#666666, #595959); background-image: -webkit-linear-gradient(#666666, #595959); background-image: linear-gradient(#666666, #595959); } + /* line 38, ../sass/controls/_buttons.scss */ + .s-btn.s-very-subtle.paused, .s-very-subtle.paused.s-icon-btn { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y4OGMwMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RlN2QwMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f88c01), color-stop(100%, #de7d01)); + background-image: -moz-linear-gradient(#f88c01, #de7d01); + background-image: -webkit-linear-gradient(#f88c01, #de7d01); + background-image: linear-gradient(#f88c01, #de7d01); + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + border: none; + border-top: 1px solid #fea32e; + color: #fff; + display: inline-block; } + /* line 128, ../sass/_mixins.scss */ + .s-btn.s-very-subtle.paused:hover, .s-very-subtle.paused.s-icon-btn:hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlYTMyZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZlOTgxNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fea32e), color-stop(100%, #fe9815)); + background-image: -moz-linear-gradient(#fea32e, #fe9815); + background-image: -webkit-linear-gradient(#fea32e, #fe9815); + background-image: linear-gradient(#fea32e, #fe9815); } + /* line 40, ../sass/controls/_buttons.scss */ + .s-btn.s-very-subtle.paused .icon:before, .s-very-subtle.paused.s-icon-btn .icon:before { + content: "\0000EF"; } -/* line 44, ../sass/controls/_buttons.scss */ +/* line 47, ../sass/controls/_buttons.scss */ .s-icon-btn { font-size: 1.2em; } - /* line 47, ../sass/controls/_buttons.scss */ + /* line 50, ../sass/controls/_buttons.scss */ .s-icon-btn .icon { color: #0099cc; } - /* line 51, ../sass/controls/_buttons.scss */ - .s-icon-btn:not(.disabled):hover .icon { + /* line 54, ../sass/controls/_buttons.scss */ + .s-icon-btn.paused .icon { + color: #fff; } + /* line 62, ../sass/controls/_buttons.scss */ + .s-icon-btn:not(.disabled):not(.paused):hover .icon { color: #33ccff; } - /* line 55, ../sass/controls/_buttons.scss */ + /* line 69, ../sass/controls/_buttons.scss */ .s-icon-btn.labeled { - padding: 0 5px; } - /* line 57, ../sass/controls/_buttons.scss */ + padding: 0 3.75px; } + /* line 71, ../sass/controls/_buttons.scss */ .s-icon-btn.labeled .icon { font-size: 1.5em; } - /* line 60, ../sass/controls/_buttons.scss */ + /* line 74, ../sass/controls/_buttons.scss */ .s-icon-btn.labeled .title-label { margin-left: 5px; } + /* line 80, ../sass/controls/_buttons.scss */ + .s-icon-btn.pause-play.paused { + -moz-animation-name: pulse; + -webkit-animation-name: pulse; + animation-name: pulse; + -moz-animation-duration: 500ms; + -webkit-animation-duration: 500ms; + animation-duration: 500ms; + -moz-animation-direction: alternate; + -webkit-animation-direction: alternate; + animation-direction: alternate; + -moz-animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -moz-animation-timing-function: ease-in-out; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; } + /* line 83, ../sass/controls/_buttons.scss */ + .s-icon-btn.pause-play .icon:before { + content: "\0000F1"; } + /* line 89, ../sass/controls/_buttons.scss */ + .s-icon-btn.show-thumbs .icon:before { + content: "\000039"; } /*********************************** LAYOUT STYLES */ -/* line 68, ../sass/controls/_buttons.scss */ +/* line 96, ../sass/controls/_buttons.scss */ span.l-btn, span.l-btn span, a.l-btn, a.l-btn span { display: inline-block; } +/* line 103, ../sass/controls/_buttons.scss */ +.l-btn { + padding: 0 7.5px; } + /* line 105, ../sass/controls/_buttons.scss */ + .l-btn.sm { + padding: 0 5px; } + /* line 108, ../sass/controls/_buttons.scss */ + .l-btn.vsm { + padding: 0 2.5px; } + /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -1577,7 +1708,7 @@ a.l-btn span { background-image: -webkit-linear-gradient(#33ccff, #0099cc); background-image: linear-gradient(#33ccff, #0099cc); color: #ccf2ff; } - /* line 156, ../sass/_mixins.scss */ + /* line 181, ../sass/_mixins.scss */ .btn.major:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2ZDlmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1613,7 +1744,7 @@ a.l-btn span { background-image: -webkit-linear-gradient(#4dd2ff, #00ace6); background-image: linear-gradient(#4dd2ff, #00ace6); color: #ccf2ff; } - /* line 156, ../sass/_mixins.scss */ + /* line 181, ../sass/_mixins.scss */ .btn.major:hover:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzgwZGZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzFhYzZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1651,7 +1782,7 @@ a.l-btn span { border-top: 1px solid #999999; color: #cccccc; display: inline-block; } - /* line 148, ../sass/_mixins.scss */ + /* line 173, ../sass/_mixins.scss */ .btn.subtle:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1680,7 +1811,7 @@ a.l-btn span { border-top: 1px solid #666666; color: #b3b3b3; display: inline-block; } - /* line 148, ../sass/_mixins.scss */ + /* line 173, ../sass/_mixins.scss */ .btn.very-subtle:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1883,7 +2014,7 @@ label.checkbox.custom { display: inline-block; height: 20px; line-height: 20px; } - /* line 148, ../sass/_mixins.scss */ + /* line 173, ../sass/_mixins.scss */ .btn-menu:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -1987,11 +2118,7 @@ label.checkbox.custom { margin-right: 50px; } /******************************************************** SLIDERS */ -/* line 439, ../sass/controls/_controls.scss */ -.wrapper-slider { - position: relative; } - -/* line 447, ../sass/controls/_controls.scss */ +/* line 444, ../sass/controls/_controls.scss */ .slider .slot { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -2005,30 +2132,14 @@ label.checkbox.custom { background-color: rgba(0, 0, 0, 0.4); border-bottom: 1px solid rgba(77, 77, 77, 0.4); border-right: 1px solid rgba(77, 77, 77, 0.4); - height: auto; + height: 50%; width: auto; position: absolute; - top: 10%; + top: 25%; right: 0; - bottom: 10%; - left: 0; - z-index: 0; } - /* line 459, ../sass/controls/_controls.scss */ - .slider .slot .range { - background: rgba(0, 153, 204, 0.3); - cursor: ew-resize; - position: absolute; - top: 0; - right: auto; - bottom: 0; - left: auto; - height: auto; - width: auto; - z-index: 1; } - /* line 470, ../sass/controls/_controls.scss */ - .slider .slot .range:hover { - background: rgba(0, 153, 204, 0.5); } -/* line 475, ../sass/controls/_controls.scss */ + bottom: auto; + left: 0; } +/* line 455, ../sass/controls/_controls.scss */ .slider .knob { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2049,18 +2160,15 @@ label.checkbox.custom { border-top: 1px solid #666666; color: #999; display: inline-block; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; cursor: ew-resize; position: absolute; - height: auto; + height: 100%; width: 12px; top: 0; - bottom: 0; - left: auto; - z-index: 2; } - /* line 148, ../sass/_mixins.scss */ + auto: 0; + bottom: auto; + left: auto; } + /* line 173, ../sass/_mixins.scss */ .slider .knob:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2068,7 +2176,7 @@ label.checkbox.custom { background-image: -moz-linear-gradient(#666666, #4d4d4d); background-image: -webkit-linear-gradient(#666666, #4d4d4d); background-image: linear-gradient(#666666, #4d4d4d); } - /* line 120, ../sass/_mixins.scss */ + /* line 145, ../sass/_mixins.scss */ .slider .knob:before { content: ''; display: block; @@ -2079,23 +2187,31 @@ label.checkbox.custom { left: 2px; bottom: 5px; top: 5px; } - /* line 141, ../sass/_mixins.scss */ + /* line 166, ../sass/_mixins.scss */ .slider .knob:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } - /* line 487, ../sass/controls/_controls.scss */ - .slider .knob.knob-l { - margin-left: -6px; } - /* line 488, ../sass/controls/_controls.scss */ - .slider .knob.knob-r { - margin-right: -6px; } - /* line 489, ../sass/controls/_controls.scss */ + /* line 466, ../sass/controls/_controls.scss */ .slider .knob:before { top: 1px; bottom: 3px; - left: 45%; } + left: 5px; } +/* line 473, ../sass/controls/_controls.scss */ +.slider .range { + background: rgba(0, 153, 204, 0.6); + cursor: ew-resize; + position: absolute; + top: 0; + right: auto; + bottom: 0; + left: auto; + height: auto; + width: auto; } + /* line 483, ../sass/controls/_controls.scss */ + .slider .range:hover { + background: rgba(0, 153, 204, 0.7); } /******************************************************** BROWSER ELEMENTS */ -/* line 501, ../sass/controls/_controls.scss */ +/* line 491, ../sass/controls/_controls.scss */ ::-webkit-scrollbar { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -2112,7 +2228,7 @@ label.checkbox.custom { height: 10px; width: 10px; } -/* line 507, ../sass/controls/_controls.scss */ +/* line 497, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-thumb { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2130,7 +2246,7 @@ label.checkbox.custom { -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; border-top: 1px solid gray; } - /* line 514, ../sass/controls/_controls.scss */ + /* line 504, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-thumb:hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzczNzM3MyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2139,7 +2255,7 @@ label.checkbox.custom { background-image: -webkit-linear-gradient(#808080, #737373 20px); background-image: linear-gradient(#808080, #737373 20px); } -/* line 519, ../sass/controls/_controls.scss */ +/* line 509, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-corner { background: rgba(0, 0, 0, 0.4); } @@ -2235,7 +2351,7 @@ label.checkbox.custom { .menu-element .menu ul { margin: 0; padding: 0; } - /* line 208, ../sass/_mixins.scss */ + /* line 233, ../sass/_mixins.scss */ .menu-element .menu ul li { list-style-type: none; margin: 0; @@ -2400,102 +2516,166 @@ label.checkbox.custom { right: 0; width: auto; } -/* line 1, ../sass/controls/_time-controller.scss */ -.l-time-controller { - position: relative; - margin: 10px 0; - min-width: 400px; } - /* line 12, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-inputs-holder, - .l-time-controller .l-time-range-slider { - font-size: 0.8em; } - /* line 17, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-inputs-holder, - .l-time-controller .l-time-range-slider-holder, - .l-time-controller .l-time-range-ticks-holder { - margin-bottom: 5px; - position: relative; } - /* line 24, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-slider, - .l-time-controller .l-time-range-ticks { - overflow: visible; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - width: auto; - height: auto; } - /* line 30, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-inputs-holder { +/* line 1, ../sass/features/_imagery.scss */ +.l-image-main-wrapper, +.l-image-main, +.l-image-main-controlbar, +.l-image-main-controlbar .left, +.l-image-main-controlbar .right, +.l-image-thumbs-wrapper { + overflow: false; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: auto; + height: auto; } + +/*************************************** MAIN LAYOUT */ +/* line 11, ../sass/features/_imagery.scss */ +.l-image-main-wrapper { + min-height: 100px; + min-width: 150px; } + /* line 18, ../sass/features/_imagery.scss */ + .l-image-main-wrapper .l-image-main { + background-color: rgba(255, 255, 255, 0.1); + bottom: 25px; } + /* line 22, ../sass/features/_imagery.scss */ + .l-image-main-wrapper .l-image-main-controlbar { + top: auto; height: 20px; } - /* line 34, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-slider, - .l-time-controller .l-time-range-ticks { - left: 90px; - right: 90px; } - /* line 40, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-slider-holder { - height: 30px; } - /* line 42, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-slider-holder .range-holder { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; - background: none; - border: none; - height: 75%; } - /* line 50, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-ticks-holder { - height: 10px; } - /* line 52, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks { - border-top: 1px solid #4d4d4d; } - /* line 54, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks .tick { - background-color: #4d4d4d; - border: none; - width: 1px; - margin-left: -1px; } - /* line 59, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks .tick:first-child { - margin-left: 0; } - /* line 62, ../sass/controls/_time-controller.scss */ - .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks .tick .l-time-range-tick-label { - color: gray; - font-size: 0.7em; - position: absolute; - margin-left: -25px; - text-align: center; - top: 10px; - width: 50px; - z-index: 2; } - /* line 76, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob { - width: 9px; } - /* line 78, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob .range-value { - position: absolute; - top: 50%; - margin-top: -7px; - white-space: nowrap; - width: 75px; } - /* line 87, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob:hover .range-value { - color: #0099cc; } - /* line 90, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob.knob-l { - margin-left: -4.5px; } - /* line 92, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob.knob-l .range-value { - text-align: right; - right: 14px; } - /* line 97, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob.knob-r { - margin-right: -4.5px; } - /* line 99, ../sass/controls/_time-controller.scss */ - .l-time-controller .knob.knob-r .range-value { - left: 14px; } + +/* line 28, ../sass/features/_imagery.scss */ +.l-image-thumbs-wrapper { + top: auto; + height: 168px; } + +/* line 34, ../sass/features/_imagery.scss */ +.l-date, +.l-time, +.l-timezone { + display: inline-block; } + +/*************************************** MAIN IMAGE */ +/* line 42, ../sass/features/_imagery.scss */ +.l-image-main, +.l-image-thumb-item .l-thumb { + background-size: contain; + background-position: center; + background-repeat: no-repeat; } + +/* line 49, ../sass/features/_imagery.scss */ +.l-image-main-controlbar { + font-size: 0.8em; + line-height: 20px; } + /* line 53, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .left, .l-image-main-controlbar .right { + direction: rtl; + overflow: hidden; } + /* line 57, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .left { + text-align: left; + width: 75% !important; } + /* line 62, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .right { + min-width: 40px; + width: 25% !important; + z-index: 2; } + /* line 68, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .l-date, + .l-image-main-controlbar .l-time { + color: #fff; } + /* line 72, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .l-mag { + direction: ltr; + display: inline-block; } + /* line 76, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .l-mag:before { + content: "\000049"; } + /* line 80, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .s-mag { + color: #666666; } + /* line 83, ../sass/features/_imagery.scss */ + .l-image-main-controlbar .l-btn.show-thumbs { + display: none; } + +/* line 88, ../sass/features/_imagery.scss */ +.s-image-main { + border: 1px solid transparent; } + /* line 90, ../sass/features/_imagery.scss */ + .s-image-main.paused { + border-color: #c56f01; } + +/*************************************** THUMBS */ +/* line 100, ../sass/features/_imagery.scss */ +.l-image-thumbs-wrapper { + direction: rtl; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 5px; + white-space: nowrap; + z-index: 70; } + +/* line 110, ../sass/features/_imagery.scss */ +.l-image-thumb-item { + -moz-transition: background-color 0.25s; + -o-transition: background-color 0.25s; + -webkit-transition: background-color 0.25s; + transition: background-color 0.25s; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 1px; + position: relative; + cursor: pointer; + direction: ltr; + display: inline-block; + font-size: 0.8em; + margin-left: 3px; + text-align: left; + width: 122px; + white-space: normal; } + /* line 115, ../sass/features/_imagery.scss */ + .l-image-thumb-item .l-thumb, + .l-image-thumb-item .l-date, + .l-image-thumb-item .l-time { + display: inline-block; } + /* line 120, ../sass/features/_imagery.scss */ + .l-image-thumb-item .l-date, + .l-image-thumb-item .l-time { + padding: 2px 3px; } + /* line 132, ../sass/features/_imagery.scss */ + .l-image-thumb-item:hover { + background: rgba(255, 255, 255, 0.2); } + /* line 134, ../sass/features/_imagery.scss */ + .l-image-thumb-item:hover .l-date, + .l-image-thumb-item:hover .l-time { + color: #fff; } + /* line 139, ../sass/features/_imagery.scss */ + .l-image-thumb-item.selected { + background: #005177; } + /* line 141, ../sass/features/_imagery.scss */ + .l-image-thumb-item.selected .l-date, + .l-image-thumb-item.selected .l-time { + color: #fff; } + /* line 146, ../sass/features/_imagery.scss */ + .l-image-thumb-item .l-thumb { + background-color: rgba(255, 255, 255, 0.1); + height: 120px; + width: 120px; + margin-top: 0; } + +/*************************************** WHEN IN FRAME */ +/* line 156, ../sass/features/_imagery.scss */ +.frame .t-imagery .l-image-main-wrapper { + bottom: 0; } + /* line 158, ../sass/features/_imagery.scss */ + .frame .t-imagery .l-image-main-wrapper .l-image-main-controlbar { + font-size: 0.7em; } +/* line 167, ../sass/features/_imagery.scss */ +.frame .t-imagery .l-image-thumbs-wrapper { + display: none; } /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government @@ -2746,8 +2926,7 @@ span.req { * at runtime from the About dialog for additional information. *****************************************************************************/ /* line 22, ../sass/forms/_text-input.scss */ -input[type="text"], -input[type="date"] { +input[type="text"] { -moz-appearance: none; -webkit-appearance: none; -moz-border-radius: 3px; @@ -2766,32 +2945,10 @@ input[type="date"] { outline: none; padding: 0 3px; } /* line 33, ../sass/forms/_mixins.scss */ - input[type="text"].error, - input[type="date"].error { + input[type="text"].error { background: rgba(255, 0, 0, 0.5); } - /* line 61, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]:-moz-placeholder, - input[type="date"]:-moz-placeholder { - color: gray; - font-style: italic; } - /* line 64, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]::-moz-placeholder, - input[type="date"]::-moz-placeholder { - color: gray; - font-style: italic; } - /* line 67, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]:-ms-input-placeholder, - input[type="date"]:-ms-input-placeholder { - color: gray; - font-style: italic; } - /* line 56, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_user-interface.scss */ - input[type="text"]::-webkit-input-placeholder, - input[type="date"]::-webkit-input-placeholder { - color: gray; - font-style: italic; } - /* line 34, ../sass/forms/_text-input.scss */ - input[type="text"].numeric, - input[type="date"].numeric { + /* line 29, ../sass/forms/_text-input.scss */ + input[type="text"].numeric { text-align: right; } /***************************************************************************** @@ -2841,7 +2998,7 @@ input[type="date"] { margin: 0 0 2px 2px; overflow: hidden; position: relative; } - /* line 148, ../sass/_mixins.scss */ + /* line 173, ../sass/_mixins.scss */ .form-control.select:not(.disabled):hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -3771,106 +3928,168 @@ input[type="date"] { * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 27, ../sass/helpers/_bubbles.scss */ -.l-infobubble-wrapper { - -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; - -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; - box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; +/* line 24, ../sass/helpers/_bubbles.scss */ +.l-bubble-wrapper { position: absolute; z-index: 70; } - /* line 32, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble { - display: inline-block; - max-width: 250px; + /* line 27, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-bubble { padding: 5px 10px; } - /* line 36, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble:before { + /* line 29, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-bubble .l-btn.close { + padding: 0 2px; + position: absolute; + right: 5px; + top: 5px; } + /* line 36, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .arw { + position: absolute; } + /* line 38, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .arw.arw-up { + bottom: 100%; } + /* line 42, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .arw.arw-down { + top: 100%; } + /* line 47, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble { + display: inline-block; + max-width: 250px; } + /* line 51, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble:before { content: ""; position: absolute; width: 0; height: 0; } - /* line 42, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble table { + /* line 57, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble table { width: 100%; } - /* line 45, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble table tr td { + /* line 60, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble table tr td { padding: 2px 0; vertical-align: top; } - /* line 52, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble table tr td.label { + /* line 67, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble table tr td.label { padding-right: 10px; white-space: nowrap; } - /* line 56, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble table tr td.value { + /* line 71, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble table tr td.value { white-space: nowrap; } - /* line 60, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble table tr td.align-wrap { + /* line 75, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble table tr td.align-wrap { white-space: normal; } - /* line 66, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper .l-infobubble .title { + /* line 81, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper .l-infobubble .title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 5px; } - /* line 73, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-left { - margin-left: 10px; } - /* line 75, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-left .l-infobubble::before { + /* line 88, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper.arw-left { + margin-left: 20px; } + /* line 90, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper.arw-left .l-infobubble::before { right: 100%; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 7.5px solid #ddd; } - /* line 83, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-right { - margin-right: 10px; } - /* line 85, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-right .l-infobubble::before { + width: 0; + height: 0; + border-top: 6.66667px solid transparent; + border-bottom: 6.66667px solid transparent; + border-right: 10px solid #ddd; } + /* line 96, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper.arw-right { + margin-right: 20px; } + /* line 98, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper.arw-right .l-infobubble::before { left: 100%; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 7.5px solid #ddd; } - /* line 94, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-top .l-infobubble::before { - top: 10px; } - /* line 100, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-btm .l-infobubble::before { - bottom: 10px; } + width: 0; + height: 0; + border-top: 6.66667px solid transparent; + border-bottom: 6.66667px solid transparent; + border-left: 10px solid #ddd; } /* line 105, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-down { - margin-bottom: 10px; } - /* line 107, ../sass/helpers/_bubbles.scss */ - .l-infobubble-wrapper.arw-down .l-infobubble::before { - left: 50%; - top: 100%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 7.5px solid #ddd; } + .l-bubble-wrapper.arw-top .l-infobubble::before { + top: 20px; } + /* line 111, ../sass/helpers/_bubbles.scss */ + .l-bubble-wrapper.arw-btm .l-infobubble::before { + bottom: 20px; } -/* line 120, ../sass/helpers/_bubbles.scss */ -.s-infobubble { +/* line 121, ../sass/helpers/_bubbles.scss */ +.l-thumbsbubble-wrapper { + position: absolute; + height: 183px; + width: 100%; } + /* line 126, ../sass/helpers/_bubbles.scss */ + .l-thumbsbubble-wrapper .l-thumbsbubble { + overflow: hidden; + position: absolute; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + width: auto; + height: auto; } + /* line 128, ../sass/helpers/_bubbles.scss */ + .l-thumbsbubble-wrapper .l-thumbsbubble .l-image-thumbs-wrapper { + height: auto; + top: 5px !important; + right: 25px; + bottom: 5px !important; + left: 5px; } + /* line 133, ../sass/helpers/_bubbles.scss */ + .l-thumbsbubble-wrapper .arw { + z-index: 2; } + /* line 138, ../sass/helpers/_bubbles.scss */ + .l-thumbsbubble-wrapper.arw-up .arw.arw-down, .l-thumbsbubble-wrapper.arw-down .arw.arw-up { + display: none; } + +/* line 148, ../sass/helpers/_bubbles.scss */ +.s-bubble { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; } + +/* line 154, ../sass/helpers/_bubbles.scss */ +.l-thumbsbubble-wrapper .arw-up { + width: 0; + height: 0; + border-left: 6.66667px solid transparent; + border-right: 6.66667px solid transparent; + border-bottom: 10px solid #4d4d4d; } +/* line 157, ../sass/helpers/_bubbles.scss */ +.l-thumbsbubble-wrapper .arw-down { + width: 0; + height: 0; + border-left: 6.66667px solid transparent; + border-right: 6.66667px solid transparent; + border-top: 10px solid #4d4d4d; } + +/* line 161, ../sass/helpers/_bubbles.scss */ +.s-infobubble { background: #ddd; color: #666; font-size: 0.8rem; } - /* line 126, ../sass/helpers/_bubbles.scss */ + /* line 166, ../sass/helpers/_bubbles.scss */ .s-infobubble .title { color: #333333; font-weight: bold; } - /* line 131, ../sass/helpers/_bubbles.scss */ + /* line 171, ../sass/helpers/_bubbles.scss */ .s-infobubble tr td { border-top: 1px solid #c4c4c4; font-size: 0.9em; } - /* line 135, ../sass/helpers/_bubbles.scss */ + /* line 175, ../sass/helpers/_bubbles.scss */ .s-infobubble tr:first-child td { border-top: none; } - /* line 139, ../sass/helpers/_bubbles.scss */ + /* line 179, ../sass/helpers/_bubbles.scss */ .s-infobubble .value { color: #333333; } +/* line 184, ../sass/helpers/_bubbles.scss */ +.s-thumbsbubble { + background: #4d4d4d; + color: #b3b3b3; } + /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -3921,7 +4140,7 @@ input[type="date"] { right: 0; width: auto; height: 5px; } - /* line 120, ../sass/_mixins.scss */ + /* line 145, ../sass/_mixins.scss */ .split-layout.horizontal > .splitter:before { content: ''; display: block; @@ -3932,7 +4151,7 @@ input[type="date"] { top: 2px; left: 5px; right: 5px; } - /* line 141, ../sass/_mixins.scss */ + /* line 166, ../sass/_mixins.scss */ .split-layout.horizontal > .splitter:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } /* line 63, ../sass/helpers/_splitter.scss */ @@ -3950,7 +4169,7 @@ input[type="date"] { bottom: 0; cursor: col-resize; width: 5px; } - /* line 120, ../sass/_mixins.scss */ + /* line 145, ../sass/_mixins.scss */ .split-layout.vertical > .splitter:before { content: ''; display: block; @@ -3961,7 +4180,7 @@ input[type="date"] { left: 2px; bottom: 5px; top: 5px; } - /* line 141, ../sass/_mixins.scss */ + /* line 166, ../sass/_mixins.scss */ .split-layout.vertical > .splitter:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } diff --git a/platform/commonUI/general/res/css/tree.css b/platform/commonUI/general/res/css/tree.css index d39b47ef87..90e1957f25 100644 --- a/platform/commonUI/general/res/css/tree.css +++ b/platform/commonUI/general/res/css/tree.css @@ -86,7 +86,7 @@ ul.tree { margin: 0; padding: 0; } - /* line 208, ../sass/_mixins.scss */ + /* line 233, ../sass/_mixins.scss */ ul.tree li { list-style-type: none; margin: 0; diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot index bf781e614b96301d24eab919599f4d9f837a127b..8d889083969641eaa461262406f3449d9ba29a29 100644 GIT binary patch delta 1265 zcmah{Z)j6j6hHUAKl$_07h__xnye;Go7hIIOKlVSXI61DbTFmaq|4THiET}twW&H& zbrO^z>jpaeWU?{FR!SJc_9e0v5~TP+M%N2U+vfN zq39q#)A$4W3W&Bi5}E__3GTI^T^}DkJ&`h>hXo{N5g#2NI}$zf-ib$;Ue6VcJ3ZyoeU+h$;*xjTLoK~%0=G4W&Q<0<+LDM`~bO=(%` zVUpGo29{uemT_GNa?%{L&H4npq8!E!EGVUSf&(>CT45TvGAzT2WM_A<@HZ+!wnJ2ZDcVH4>0vrZPtq@Go~|&pOdpeGZZid@ z!18Q6JItopJO|v%+-2@2m*@5TKK>H_J^xTst*O_9HRm*QT3+kZPHFGxw7Q+T{kpjB zL)~57@A}R99{p$fWuaQA7Y2pvLS85cB||6veTFlJD~8*KLY0fJYO0#4dL)8aE!K-Z zF(@7ukBMK2d2z|8H3p1_jE6EY{yQdB!k!pm8#KcnY@&ttk~()6+1=JbeAQdH=j{LW z2W^(3#b!67AZb-cVYbU*bx{eDR^3na`6i2P!=-X|^J-!(#j_rO%p3Yk;x1ao;W3~A z0gvl!b(+>d%d4gh(3YI+&C1>!WcZp-bSY)FIDNXPycLs<(9-H=x+qV|A0rI|D5loZ z0x`KvP6V;#Fv~_t^_Ahv!8j8*vAC;_e-VYd)wH{<#fjarB1{(E4b@&ncSxhuiOW)0UB*VZWPfRj8cbBQGe55~Q9}6-pr^yZ~Uft|wHAm^>U_xrO*i z>w~O(Pu-Wq1pC4^6&BuNFC kD|P=eBqm*UXM`k7z&SVz=ivh>;CYEerDGl!b7NEIesnj@U9Txw)ULD(M= z?M6(HVIgHwFj!E=KA6;(K1j)kEK7rteXs~g@Plj}C5i6kchC9#&OPUzbDviCRmgqY z02Z?Q5^j`qv81mXWkIQ>0 zNi+j6J8B;rU9H}D92njo!MM`cbn#3oxqK5q8pm>BcY~{5t~@k_u^B{x8wFE2{ernk z$Zc+qucM1RgzG3gM|hiB>RiPGyRn$W@xlv_tHTS!a0Fx6Bv_kWo`w-CeFl)(iB0VH zwzT@Z_Ld2NtZ|Hg1A-@k;`y=e@Tr8oOQ5musK7hVwWI4cJ{$kR+u0`M3Q!OsV$X7} zB|4#Mb#`17LDsaQRf>zz&$sD4(kbrK2b9^wLDnv&S$awYr(b3M@JmKcKd@dP?I49+aH+%r?E)nDgIgXw~e3DYT$TBskjXG!%Jxl%c6o32wnPxL?XR7Uy(If$&e&_RhYbJoLksFvBcIvm z^xs-Qk~4O$gV|PQ)Epq1e|zAQVWwWez>E{bs}|0``zNnUhaWh~Av7%#%6w E2kJP(d;kCd diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg index 2ca77321a4..36a0c4856f 100644 --- a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg +++ b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg @@ -2,7 +2,7 @@ -Created by FontForge 20090622 at Mon May 4 20:21:42 2015 +Created by FontForge 20090622 at Fri Jun 5 15:37:46 2015 By deploy user Copyright 2015 Adobe Systems Incorporated. All rights reserved. @@ -62,8 +62,10 @@ q52 -180 95 -231q42 53 88 212z" /> d="M193 787v-193h-193v193h193zM193 491v-195h-193v195h193zM193 193v-193h-193v193h193zM671 732v-82h-388v82h388zM671 435v-81h-388v81h388zM671 138v-82h-388v82h388z" /> - + - + @@ -232,6 +234,19 @@ d="M748 750l-375 -750l-374 750h749z" /> d="M-1 0l375 750l374 -750h-749z" /> + + + + + + NxM16>`Gx;S{*g6smafg%L7kWj`xl#%&C!O9q6$|zQXOJ=F_Q(ryrwXGH&l^_@=Km?A-KOg$Ns_LCjtSLqnJLdud%GL%-N3{Be00JIDPw1WFXLrikAo%Thn zSLvY>G@yt!fD1iQ>S1+U1y~XOvO$ezMEEkL+z}BY~=|++*?o@|_M_$>wlcaUmJi$HnTD z!|J92B%{*n{zARYu}P_z)4H12ka&~<$bPH8C_Y6iI7S9q5b(L~X18U-Xl2#1X|yRX z`*X5C582qZ5Awz?>}VDn?{RNnWMQ~#B;svt^`=R+FPK+6`FC$H=%q~~ zUBf{y*{(qOpif>>9OaOjId3_qCIS4kO>VQDZbLL!EOi99q(=037eIno(9#>V^j(AsJA3Y+>yCH-F931@d0o9<58O=QEdb1k zwU3Q@TVQJooxm}Qy1B9W#?^Fk>mh(Rg?5uZuihY4o|#8&5mD&#dAoE|8U2jSDOj-k z{J{?L4DKU;g$Oja*6YRnN6}0aP=D>$I|48a=TXBU!PcVty`whz5+JJ+hd3Q*Z3_mR ztcH9FGryG+r+)e%L&KVKw;mp4s-tQn!k~D*E}IbCQtmPho2z($S3Y0Pe~^? z$OvV2K0>b-{6_O^d~|iYX?wpoGU81D5oFuHm;nOd*pLf0%w*oga>!5K$MX0L%N3SW zf$%vYk2{2ZjE8ulkW4OO=Hf+SdKX!z8nsgwJw=;nh|bUz=3qhA!^ZGL1ha5h2nr!# zR#e4mu|o`rAEZR7QtFgOrKl7$IZfrJ$EJuG%ys5o^Lz8ACD~GFsj~E0#x2Won%p2y z%TYO|xRfhONEuTmRT+;%Em1vck2i9(?Hv!xwTrYHXIXQu+nzA zggcr*fdu@8q|BuMpcrceLECrYlJSO|G(5&za*PcB%fsdJT`iy4>B5c|kkrhAT`>FR s;x6dIzG<#W zIlq_B%(-UfzUI2mJ!j6$tLt7c3<0>S%F2RJK*$CO1L6NSvl0F`{{Nb+tcEgD=ZM^c z{D-YYm2A1!GP20!TVza!1U)DcgsG~|%?ARZv;cw7dq5ykVi1TnlhT2{!^+&)44K4()CeFUh?&b) zZ-pe09Fj*C1%aSga;RHYb}k-B?hi8FL(U<@-k@Du2UDaD?H+z9IZ>@Ia*0D9FnH?OXgD zk1atF2TVNij{YC@{#UCtswBym-!=S_WO@t?!9d72mH?;L2okoQcXsH_xr))=@-~~C z9^~kJQ%$(C4_BGF z_D1h-(FqzYBN=3;73b#WJbGz1Ig_NvZI1w*pJ>rlV|O-3O?&tWvwOjgmX3v>-Sd2<%J+jD6tOakAjF5EoXo<_FX*q@4#oXH{YCNHX=yW5GPPok{V`V`pE z(zBU1eE;USY?@``RZ~cyd{BynGGmn%VFF7?j(pF*e`Oo%uSEw%(zpIX9SrF~0OiE* zslZP^3FrpelJl&r`Hi}=-KgCl7d&Apo@Cl4;rR9Q#*uRAp4-aKp@pembk1f8+QP;4 zm0o;)PH<>jUFN~9+H&pLlpxX+N8JR(b2Rh5A<%)y)Bt#UfUfl3h#vK4*Y?+a6^7EpIn;qtt} z2qsD5>}Ad~*BmM;EG;h2sxNQLnwT{!XzHC<{8H1J6I*USJ??XGcuWVOpmHM*4~qzI zW@Ra`$hX|R&e#EDTG4p!)ZWD&p+NyucGOp>ny6-|pHNd#hfpukXwkIM^3mGRmeH2c zG0}z5EztAPhcG}G;uv2riZO;TpJ7U224I$BE@F{kL9ukPys$d3F|qluW3an$uyMF> zUgKEd1mX1IY&;`+_U2jqvkP1@Tqv#??ho7{+-2MoJW*uV#&g4qz-z->#s@I*+3|Dn zSHU1K85j!Y1IvRo!Pek(@DTW%0GmLF;4Q)1{~mL&4vvRS_eXmZzdL0@~YAZBti|^fJ9WWFn!*}Gmm&xdp=u&=_bsv_t@)X+UYNLY5 zsidr81v#SvJfT@^;eiamunkeNm4{_HG=PBf>9-+6o_6|pPv6eg73EpZM)^qV`n zjrBVb3Mk6P_H8?Qb@iRg%i|?@`>fac59;H0hQQ)CW1+>Wztq>r>@q9hwe^BN(Ojho zlXZu|7fL1jeuK$eFp|NhSuf#~x~|xNWmR$qwI5AZ=zVXUdGr91{n$kThziY#Z9xPKef=5@kn}3;BIo} z_-WVP1I*`-$)}XK~lk(Hv8vR#?yaaMCiX{OD!>M@;*UVs&Tl|O6z5SP_ zd|D-Q3sM~Sf zOa7tb`v<>6=WFHmY8o&n8y3D5c;-F=`s5t zYAU)C?2)u8N8SaV2R{?T8IlV5^)l9`w<&e=S)wmC)uj`{Jo0t|yIeTr#WfBFr^P>F zhLy-XvV<*QvBf_#H9=ih#x zpdxD+*!vWHuR5~eaK(eRW-6YAmMD4EiTt06_BK=gYIb_B>5Kz=9=25r+mD3WicZ+S z2E38SW~(0FkP0fnNNl^izgZdna1Ng)lW6{D<#0MtHhz0R<-;9avgwgMUu^2W)u14F2&xr(B_k3zc+XEYpg>-IB#wY+?jVro}yEG z0feIM7#o>#=&%mG+_UO{=RKaORXC4rbS`zS7bOp>6BP%9KUq!=_vYs$$I?YBpSGy6 zz^P#mMW$Un5fR^riOyMKDt>VjI>{8su7@iS*PsL#(~_aDf?&xnOgMwMJo|G;>yy1k zFDvZ)YjxTtYkNPMez#IlD|!@v@StmI29{+$Y}(h-2rSsbiZ~qzhpy^b-KA;cs$kawp{qlu#%nTgU=2pfw$unv? zZZ|sSu38eASnIs|>|O5XWD$vG_}od-EMaues0o{quVylS^*bgSXW{@-O*7hQ8%VN_X3SXtpIE(cR3=PyJ&7%pm zs%;Ff?q!IAySR)eaQCycegc1XO%L;6x}>TV|BEN~CxcZ5+Q%;Wch)HhFHXBu)<+Ik zBkpv71#A&LA^T@aLQr-v{)^x(8(>xokNVj+o5&QpRu$zkM$@DbD4_p}I90%eV2J>6ms7Td;xls5##+I&Uk zAOG%L+FkfEzg5j99VO-{Ndff69Gb8G&7H1Td@L`t{#aC;c;$F^SV532rgDu?Z!{M@A##yuG8ga{L`L}6%XA5_IOJ8$PHZZFTPmZs-9`m#NE z{qAbTC0mzB2(d{RgaZ)0t_Svr3PCd?4Q01^h7A}7CEX1@RZvO%ix8f2T}&9699xIT z?<}*($BXWzCtJTFGb;nlOQUMO-t%%E562;PlQD(w)7DoMDiY^^K8igw<+}};9?aCWF0OrZ`ISJrC>0pC-;WC6XJM{4EWqF@9H5a0AabpYv~pI4h86s3uIA z*VT7PQ7_p1^C}yV=FRWb53YyTOI5gr&xrV`WkjhqN`|aMWZR(`ZUuqVnw`b*?7A8V z98F#mT;21*ei!NOT!pwwcCWql&PE_gb+Eun&aFIzmz(?(zLpRPSRu-B$Z?q?>3Ko% z`shaZAfDw?HgJtqk`t+tT2p1WGg2R(vS`6x>u{efv)Rw7n_IsrVL<1rk+e|HwrW21 zx@=L{{yrP(uF=1X;NMl^X$M|%JwydP{mZm_8uw$v@dhGmoWNscw`E%gTFD$fxF0Pc z)c9&W=<*!bU1z;+!UHEM>oq`Lwu>Xi+id(dwt!LLOE&@BOzH5P% zdiYjREbg6{bv=Aq_W~5hHobK8Nnp?DYW)_VAU!^MkQBP6{&DkpRVprKO8Dnw^}W%& zjGY~+FL6r8ht1EfboMQ0&t^RgPS9tgDp~t-Wcr>%xWvKOp^$2xx35UOcvxh31kciU zAK8Qx0uip06S)XbA$Vu;j z{_7!)S!Q4Z(}{L-Qa5%Lor%Tiw=C08%u+U2dnE!(`N~W8-I~PeyNEMHj-Z)H}A zjdW&JtXHMAuhyK`)1NV@xF%DEH|-{gSCOI{45`_!R_`4?5@ly%cZ91*)d#r{qN)5oA1dM~Df)gTr->0)<8on~0U#I|^W zTS|Bru30hH#a8EIn37)3+*^A8Vz_Pk(5=#8WKV*~H4)#a_v;qZ#l_^-zFrhlx<}^w z%~F#I=r3)hpN3te#y64UmZFAcrBuAYUHWq-IdF4B)j{W2dD^ZwyJ7%JM*k)*y5jOy zj#{1u&mkS%;}ipvT!aw9C%1VR!HzwrC^tbMnoa~{_H45CH9{KZ+y|ONM0WIUvO*ed zJFuZkDB@J~As-ker^Vo>H*b5nfve%rU(Q=Au~=6bqD@chgY)q-$DKn%Mt8tLZX0XN zVMwt``QuXJ2F+_;ctEPYaT0M84U01TlbGASUoBUmkG6oIUA@7reD#F&5-fw;PHj<} zZuB4NA$dVKTfi7en!OH6#Y}iS`qigcBLz68JF(=P8APK}pJ>1=H?D$dRMe<`X;gYB zB>=+(kbI#5nh02DF8ds;=>X^&Q*m<6?dNS19bk;(`|$ReK7Tmgp(c_rk*2ARC*0p1 z-!l2EpdfCLy!OLYgCx=dz713~RaZB~=wIyi8;)^v4&1;jT}~_!_PV+{+8R1KTgvOl z@UXy-16xuJ=`64q9P;p=Qp!E2CSBVPSG;@1RIscGS)=WfbXw8;3joFoPyX}7?RBg% zRTE?Aezns0tkUM+R`TLw&q+EwJZAdE#Kmvjhc)GVW8DYAR<}mBaAl^Gez$-244*f) zUn6YQpoXI|VYjkjm^QPe`}>_2Ooh3uMrX;#He9xmt$rWGma;6iXRXky_O+S(Cj^Se?w~8zmhw=)%ukwtX3#}pf1sgKKhs1fryl^T+N~v5_Uv&{Tm5aH!P4amC{7 z9M9eGi36An`Y&w8Q|}BHYY&QJM#f5K3$#74{9f?p> zOzT%FY66C--aOny7=1Eim=2_z(A}{<+uAVFeKp3Oga<`~jJ?~yavyj_;VjcfCAE`$ zV6-T?L&a6W?7EJRPlJ<3 zOoVrZBrisH8C&WkO<-%ip*jzncODTFsUH=A0D!U`LLX69>8Pt^Zlk7Vvwcq^vhxI6 zRj0|!Sh|EZatd891uo~fP-f)BEX^y$*Cywo#lI0hMuO=FIu)py)iem_zd=x5PCAQ!#-v*a_&EI0K zmv*F-!K#*ta$1}d`HHc3{>s!8^hPA34V|@MqGU=k*Efw{culM1E8pxHS&}5FrWk%t z&#Jfm@0aeClxN^R>1RLD!b?osPa!*}z-ndIl0<22kmgIwsI`$U1s;{ai?3kXb>W9y zi4#Tz%L4vra)TBRr|Fp7y3^fMPHtm3de&20RqthtLwNHX~QgA3%-05!#H z$qjlN!Fn^17I++rTzO5VADn)>t~-D(vaC8Grc2a(I`XBa1^%p6*}LPe{?p zHS?lMT$om{IkK`NNDtNpnuEU{0rN4260LX(k3ESzq58qyFs}6lE^(@eWAZZ1Xj@Z6 zShZK_^&0TCd=*|Ll<2(cz;x87S^I))&=|T>ojp+1prbNm;^2S?u!Pa=Qy0d@X=B;= zOVEYOdK+uJ!?NXMlqRC?E+rC@Zg;M0c*E4W6x18vv;Aje zb%5hVf9HEgVjY;dhhIEvBK!%YmJv~I%F9ZfXd|yw_+D6EhAa*nnBkE$YURvqj zvT-Gc*4-*z25%+A?MA%@j_7u-_U3DVYiuui))||Dkza@Z3uOBSZ+R>PMxy+key&f_H1h}6S@g!y9)@EEl8?MR9P1gY2<31(Gd0EwFBHI+LVGzLO=Z*$Sr9K6l#OTiH#aBJmXdMxyeyvu-nEk5av2pez((ZW=J; zTE2n!RrvVD5qF1SvMeBu^Zm5e%(6a44nvBe#pm;?TaTZ`!G?Wv4$JF)`jV7qYbG6? zV7II82j1tc-?mHk0NF{om%LA%ZTi{V>CFSAE_KRV)-YTf`;X51g!yN7vwbTFS?i6_ zw(GkQ2OXS~T}+?s$U)wNSELngW`}m&N73jFn~7q@iRs=XMa!TH#UqSOKUuQyS2Jyg zEIw7s_6r3|DLXP^q@=V1eZEE*w=W~JJ>;zn)tfi`A)2llK=l5$S%H5IH8pGC%GCGx z6yA{+1&rHx{;0p*BY&wMcyp);9XMNaw=Re7)t-kicE540RhJXqn|@&?x4*rrxAkT% zRG4g4*`n%B?m)fsOu)CQj$AXw1`XcWDo#O~N4N~4|*72fBJtr6+!;+86E(l zKj6}!nqL&{D8Psow=@dq)$h~Q*&LSaLfz<)g-?1WJ!Dy=dZiS+=|{@p?c1Y3&VEg7 z>R*o__WRGncab&K{%@7^>w>82Vh*Nlq9$LIDb$daE!H0XDpG8qZM`)!!w=aSI+c|E z5>5fPSPoK9&mT>MTdoGkV8|%Omuc5otb9?{t3RHvv(#DhmzIl26LLM74CZ)QzVh?$ z`f3goFu}hLVy|&1wdETGBY!? za{JWT5Tq*FHL8p5vP&XK5FXQ7WzGeEd3tfxANm^h*$5Y%F_8(72f)?*UrxYXe%$BJ z#hVDp2-^-wk^szsj{-<(LTCM-AkrMu!pstY#7J#p1&9&~c>n>x{s1@t@L$}fZ8)U@ zNgQI{1v*4r#&1b`qRXLM4cvc`V#K`3!bAZhs(N85yATo~cSE;O+K)P%?u@9GW-bs}5budMMe{bufedsZFG7`KL!$>A+G2 zH%)TLRP-f%eBcCpOu`X-LZ(}MC~@`w8mvlG$%o(*^t#mcQewPe z=I;y4Nz?UDvh`1v_fITa8P0{Q48<7@rx^`}_UMR6BFvOZc#YE*r^+L@=9YX`5X`%U{Wuh&h znLrq@9fXZojG*@*BTy^|27=6h?r}VDDsjeews9_T0l37ta=0eACjY(8Fnz2~ zn%Zq$Ypu>MQziD(+l-ALrx@)$vP+z&iUv=l$=hnR=ZG`a?S>fZvA{!f@EP28^ZbH! zrpOSdG1oUi@$kTgNT90Rdt0wQQYm}?vVB41s%7%D$v1y}U6P5dc02y&Ks?9A{ymKS zcOz4ptb7Ru*ZtFm95lixl` zL4pDsKX#;BN>0RT8MAASV2_A=IQf=u#|bi=cGp-OqK`ESQ!UBYJO8MC0N}srL?g z{}`_t8%OL%sJT@FWBQXljj2flOFeK`8is(h!*5Ov-0CZ7jZkRP>ufHM*cyZ?)^eKI zhgT$wLbDw;dpAE}O~4ud+xuEj)Yg9O+rzI8;!46rha@MD?`Io-NKojt!QE!cRXh zg?LXDMQvI7(HJ^NuT6t)h#ujrZoybx-_IED1}`|;b@N^c%Gq@o`!A4}Oq!l^zy*~{ z6H+|61%%{ZFoT7mkR3tg;#lvL=bi=Sv0q=^(I+Y4rS<`z7}Ndk+`e8@2}-W5b>#=U ztpmy_I2vAUJQDirey1s=p}{#P>`37VTdf6J1(0nQ$C==jhk`2sxLXM>BB zZD^!+IuZsgLd3)2cnnr}VX|}de@XVSB76G(ByI2*-Yo$R*3sBD9yIt8VZNL7UPQ;= z=<>OK;Vzg*F1oXGO!}hLMBmLi{wl^hG#5Du&B$NZ_98mrO?-(L3il(l*%IulAq!c& zrXC63soe~8CYxY&9^QX)N)qIJ`3mw7a$hZsOa_AnAW}3;N-7Pnnp7!%RR#qG{S(f= zY>NWrEx)*#zWjaKE7Q&35*vKVIFz4IRew{E5zCI{}mydT@llWpDuH?Z^`Fr{{fEq>-YG+U`7 zc=o~M^(KIiewRNGAkbpf#Pjibb4+ckN+s?Ehs^$oQ0;$S;kI^=@1J3gdMHVDO|(@f zCws&4dA@&^YWh=I*<~H|xv*K53IB}Ld4a7oTr}n)dGNMsHeY<+FuhYW$bx&6on!iM zdG0a84;{gS;gzOaI=PBjy$r`Je72$lVQCtSMiTUh193@o!KkYZQZ=p7FGWMBZ=+$< zgAfHc{t%2l`wszTLFJGQ(vR;J5%02)t;{|zy>`hwXx?es0k_!9MZ_J30nxaPB&M|! zr_*gc$DJ@^y1yt@<+8Kqa&i2X2NQGjn9tvF!${bEnGY$)2piS~YEZ!jE{eq2SdYi#<}6sxZv4$llJm=_^}uiA1-N2&vI@ibX7t%FB`emVcRf&9F?q zbg-AW_*arP&Y3$9yyhI&6@tYr!b@Qv*=PR~&`^_9+R%c$0;FTpgc3y`Hhc~drG>QS z;vy}Ey3=0dXZ>^7p1XM$d=5>A{B-Q|n~u7?tPfYHEuz;F!EUb^^{=w(i>(P3wCuYV zQ2LS-UVnL+TmtuiSezZS_#)kaJPO2}c#ei8C24q%R#}jo%zTt8Ofkbu^l&1!_jGIg z#g$b@m)O{a6c{lJA7>0G3BCK1E-E5O3db0C%bf*- z+ss~qtdV2A`BQK7?i~y3+OWW+%cRC@NymOCx@zs% z1tydmJ@IO$@AOB|f_I%pIFQI{L4zx4rZRa)aD5DNiI%eC-dSDCYPuLbooe#s?cZRL zTwszXS3buVW-BZroi_IEIZ^wa56qmmnY|r^)zw979L51=gM^RnSlL(H58!#?i_Q<5 zr8tMLW0Q~hF-3+XyH&+QKpT~GJPxmIDKyz^0!e=vepk2Zx;^>l^8}H__>rWZbeuzA zfMu?O@))Yhy>S_0stT&&A#G!|AWKd!6KFh1uFZs4?&^F^>7iK>VGc&&4 zPoi^wpw3SjPfBny;+BzB=|LJ(;{t<~EJ@P( zWv%U+ju1W{)BHjOETO-D5*r&@6w09eQQ#SAH#UJ2lC@!K^&W*$Qtvm(M~=El-fZ9K z`CISK@-eG_eYE!n~1Kfikc%%Yt#LlYhnGnH(U*y7kw53h5wSV&W7Xno+u9f zT=D#5%Cr_YLr;OI1AMF`(J;;R#01@T>Qga-Ymd`97n6!@uXG6L$Q|R7UNOYWLG2INBXjU*yF7dZ6EsaD>Ct;z<13 z#cB{Ab+4mo$V4o;*r(067IkdKV8P@9+%)|G)5NQ?J`*7Fu4Q<-HZ75z2w-@)!$z0Qi)C*>bQk# zZ27VX`Rim{~0!N>~QURda!uxdR*XAximA~FeuQ* zT2AGNKQ0FK!7iR*7V%z36Vn7rVNr%AU2iv>b%lF$48_FxcCbfFn83EFs4`|ZwEgYTdf-|Sn+(N2h)UtCgF>|MmMCjaaK)U%?0K8U zsiv(}nIaae#IO3ArmWTDIMS!U0^A03;|qcZRE7?=15%*I0);?hbZ*)xER>(0UY3(4 zdg5Wab0i}AX4Z0dRov!yp+tnN;_UQraeCfVo9sMr)ul#4?T|JsSe9F0xB{!&Z7xrMg9=gaHP$7 zOnklsjsQlzhvBuCdY*e;|Gn!ZnNn3MVGrTvprz1;)Y8}V8iny&_l{lSaa1zJ9z&V3m0uGbwygcWpGIH8TgD+N?5-C8m;$k!}YbnoL zh&yz{&&Tt32fMa5yY}{%8tPkVDSh)(lGd%O&H?YqdRW0G3}&G!y%rqp!$px~bS~%G z%|>=Hp}<=7UQ~q;_BuN4TWEQ0s4{tY(?9sX$&Ux7=1#nuXU0`<{w>V{9nYgGKkVA_ zrftpQr;VVe)wqHMrm5IThm*C~KE@^=NU4t4Qs!7QL55}a=3Re>`WSWCNc{k7D^gV_ zWtEh#uP;QRBwvz93~l(QuXp|$Q6RDD)6Z`{$9e%i#|wh4KQ8$1#m0)w4WdWQ`bgWh z=$2ETrRMl(Fk;+{s|ujdeK+*21;xgg+m>7!4VmNL17pj3Cq)wB*HIojR`&!Q5c1$g zzhKw1$KDv$w<;gb4QSv`gPA?vf8Uwj8$)=KeD6*QsVGGUXwk80c-P{MK)*FAr?Cwt@4!ol7eJMSjzCV5X{E_W+tLL=9W4-Om^C4DsY;~o5VpCV!*R+x~pQF`3 zqAe5`fImgOMrfB~-hMOXkO*>o<{E%iNfyzI;F}B?w%j$xq?Nf2;DDjOtSl&x_<^^> zb=8z!#bC0|eviucq|?$|K0+j;QGb;pHE}1I!AEd@6{!*WtXw0$!NlsB!&S0d<-l}B zw16@ggqDQMI5S768<7{2tB%B7VK) zMOmBlDa2*UNK-&g(B|&nwf>AAzpw;3Al_A}Zkv=neYc94SShP78RP9fvAMGIs@_Is zVY^XH1Zy$QL%^}n#_g&I2}KN^ra`>+C>u-GqUNlQ(TYx!-`#1iM8cgG@$2s9CoCtR z&+|XIQ>3=&aqVBu5GUMWef;oi68)c*lz29>(W^mm0*P|`*)fZdws3)V^dq9|%H5f5 zkkGJTk2Oz0w~qqZNM>{@-+DaYG910(6Bm}`See$A)?#_;lq1ZE4F=ff%f&saMWrV? z@)8bkCcPz1hzr$7bNJ-Y&aD}tor?UM#h9^J#z!k^!}?t%WCxpBMU&^36G=`0lwy)r zq2;8)_+#+WfveNCjQ;#9l8tL+VL>3s>zkv`{J#%3OyR$Xg8^Vh5-nGQ{!xwhfgt1Cf zA-TQ3c%#z3B}C-?$hGGqz`-Sr75|Z&zOJQr`S7VukN1Ng8|Wl1?xWmT*AIcDFm?R} z@6!4@0loMN6I$pXCt>2Y-7yYfWa*K8#llmzDkN~riT=D}(1LaI>O6LBAVx4Dw_>}5 z$8hKx$s^B9qZbI`=VoL5`R4;tcXDE-?u5ykd+8Qwj|NrGse_RoV{;V$$-Nl3d|iE&H;2Sq2I1`$72jD#P_wK8P`{2E{hoc*NbmajCJ}3r|JEnfL4Z>(1D|eN2Hl z#~a~X4CVRhv4Kb3#jlu;nWWNm*vim#w{0OK;IV{pliTCB;+G97aj*gXV1F@JrAX%T z57)lD=rE1UN1bF&f%vug`4wuV289+oVn}RR_M_WNXn?*$N->k+EAWb7WbikWsQI;T zS8CH$(59-{8N<~n4V*2Sh~Sa!?fT0HA8*#D*Ab>a`;c0{c=o)gBKzzvRDI^-M)~k+ zcz%-ID#XS55*pO{-t_wC01>#U%8DyJj!&Rbh_9@~o!4>8#e|NJ+k;v>Z;+k!cNV1R z}EkLIe*n>bkX}0*;WZmlIlx<4aiKU6H8w-3GA!xD2&!7Z`C&op0i| zy|y+IF+7v{vfC%mF;U^?Np!VGA|E%2D(+QqcBg95I9}BskrPGK;1zAvC;noZs5vC* zw-lGu;Xp104jUgzmNi0swPG8s#oTa8T8;!6Q{20e% zX57P$qg%b&;(ay-eVdTi;dgbo8o`<0$p__9Xw&U&DXwqGP@HL}{tr`GYytoP diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index 725c0c29b9..47b9a70493 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -19,6 +19,10 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ + +// Features +$enableImageryThumbs: false; // Set to true if historical imagery thumbnails are supported + // Margins, spacing, radii $bodyMargin: 10px; $interiorMargin: 5px; @@ -34,9 +38,12 @@ $colorBodyBg: #333; $colorBodyFg: #999; $colorFooterBg: #000; $colorKey: #0099cc; +$colorKeySelectedBg: #005177; $colorKeyFg: #fff; $colorAlt1: #ffc700; $colorAlert: #ff3c00; +$colorPausedBg: #c56f01; +$colorPausedFg: #fff; $colorCheck: $colorKey; $colorCreateBtn: $colorKey; $colorInteriorBorder: lighten($colorBodyBg, 10%); @@ -50,7 +57,11 @@ $colorLimitYellow: #9d7500; $colorLimitRed: #aa0000; $colorTelemFresh: #fff; $colorTelemStale: #888; -$styleTelemState: italic; +$styleTelemStale: italic; +$colorInfoBubbleFg: #666; +$colorInfoBubbleBg: #ddd; +$colorThumbsBubbleFg: lighten($colorBodyFg, 10%); +$colorThumbsBubbleBg: lighten($colorBodyBg, 10%); // Ratios $ltGamma: 20%; @@ -124,3 +135,13 @@ $tickLblH: 15px; $tickLblW: 50px; $tickH: $ticksH - $tickLblVMargin - $tickLblH; $tickW: 1px; + +// Imagery +$imageMainControlBarH: 20px; +$imageThumbsD: 120px; +$imageThumbsWrapperH: $imageThumbsD * 1.4; +$imageThumbPad: 1px; + +// Bubbles +$bubbleArwSize: 10px; +$bubblePad: $interiorMargin; diff --git a/platform/commonUI/general/res/sass/_effects.scss b/platform/commonUI/general/res/sass/_effects.scss index 40a1a24414..c90a035c82 100644 --- a/platform/commonUI/general/res/sass/_effects.scss +++ b/platform/commonUI/general/res/sass/_effects.scss @@ -44,7 +44,7 @@ a.disabled { } @include keyframes(pulse) { - 0% { opacity: 0.2; } + 0% { opacity: 0.5; } 100% { opacity: 1; } } @@ -57,5 +57,5 @@ a.disabled { } .pulse { - @include pulse(1000ms); + @include pulse(750ms); } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/_global.scss b/platform/commonUI/general/res/sass/_global.scss index 5a7293e4f2..0ada165ec9 100644 --- a/platform/commonUI/general/res/sass/_global.scss +++ b/platform/commonUI/general/res/sass/_global.scss @@ -117,6 +117,13 @@ span { display: none !important; } +.paused { + &:not(.s-btn) { + border-color: $colorPausedBg !important; + color: $colorPausedBg !important; + } +} + .sep { color: rgba(#fff, 0.2); } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/_main.scss b/platform/commonUI/general/res/sass/_main.scss index 3c4fe84514..ec2160048b 100644 --- a/platform/commonUI/general/res/sass/_main.scss +++ b/platform/commonUI/general/res/sass/_main.scss @@ -45,7 +45,7 @@ @import "controls/controls"; @import "controls/lists"; @import "controls/menus"; -@import "controls/time-controller"; +@import "features/imagery"; @import "forms/mixins"; @import "forms/elems"; @import "forms/validation"; diff --git a/platform/commonUI/general/res/sass/_mixins.scss b/platform/commonUI/general/res/sass/_mixins.scss index 3a99d6115c..107726e992 100644 --- a/platform/commonUI/general/res/sass/_mixins.scss +++ b/platform/commonUI/general/res/sass/_mixins.scss @@ -62,6 +62,31 @@ border-right: $size/$ratio solid transparent; } +@mixin triangle($dir: "left", $size: 5px, $ratio: 1, $color: red) { + //$size: $size*2; + width: 0; + height: 0; + $slopedB: $size/$ratio solid transparent; + $straightB: $size solid $color; + @if $dir == "up" { + border-left: $slopedB; + border-right: $slopedB; + border-bottom: $straightB; + } @else if $dir == "right" { + border-top: $slopedB; + border-bottom: $slopedB; + border-left: $straightB; + } @else if $dir == "down" { + border-left: $slopedB; + border-right: $slopedB; + border-top: $straightB; + } @else { + border-top: $slopedB; + border-bottom: $slopedB; + border-right: $straightB; + } +} + @mixin bgDiagonalStripes($c: yellow, $a: 0.1, $d: 40px) { @include background-image(linear-gradient(-45deg, rgba($c, $a) 25%, transparent 25%, diff --git a/platform/commonUI/general/res/sass/controls/_buttons.scss b/platform/commonUI/general/res/sass/controls/_buttons.scss index abbe655810..f8328dcdb5 100644 --- a/platform/commonUI/general/res/sass/controls/_buttons.scss +++ b/platform/commonUI/general/res/sass/controls/_buttons.scss @@ -19,25 +19,28 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -$pad: $interiorMargin * 2; +$pad: $interiorMargin * 1.5; /*********************************** TYPE STYLES */ .t-btn { cursor: pointer; } - /*********************************** STYLE STYLES */ .s-btn { - $base: lighten($colorBodyBg, 20%); @include border-radius($controlCr); @include box-sizing(border-box); @include text-shadow(rgba(black, 0.3) 0 1px 1px); line-height: 1.2em; - padding: 0 $pad; text-decoration: none; &.s-very-subtle { @include containerSubtle($colorBodyBg, $colorBodyFg, true); + &.paused { + @include containerSubtle($colorPausedBg, $colorPausedFg, true); + .icon:before { + content:"\0000EF"; + } + } } } @@ -47,9 +50,20 @@ $pad: $interiorMargin * 2; .icon { color: $colorKey; } + &.paused { + .icon { + color: $colorPausedFg; + } + } - &:not(.disabled):hover .icon { - color: lighten($colorKey, $ltGamma); + &:not(.disabled) { + &:not(.paused) { + &:hover { + .icon { + color: lighten($colorKey, $ltGamma); + } + } + } } &.labeled { @@ -61,8 +75,22 @@ $pad: $interiorMargin * 2; margin-left: $interiorMargin; } } -} + &.pause-play { + &.paused { + @include pulse(500ms); + } + .icon:before { + content:"\0000F1"; + } + } + + &.show-thumbs { + .icon:before { + content:"\000039"; + } + } +} /*********************************** LAYOUT STYLES */ span.l-btn, @@ -70,4 +98,14 @@ span.l-btn span, a.l-btn, a.l-btn span { display: inline-block; +} + +.l-btn { + padding: 0 $pad; + &.sm { + padding: 0 $interiorMargin; + } + &.vsm { + padding: 0 $interiorMargin/2; + } } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/controls/_controls.scss b/platform/commonUI/general/res/sass/controls/_controls.scss index 86544886f5..721a557a32 100644 --- a/platform/commonUI/general/res/sass/controls/_controls.scss +++ b/platform/commonUI/general/res/sass/controls/_controls.scss @@ -436,62 +436,52 @@ label.checkbox.custom { } /******************************************************** SLIDERS */ -.wrapper-slider { - position: relative; -} + .slider { - //$knobH: 70%; //14px; + $knobH: 100%; //14px; $knobW: 12px; - $slotH: 80%; - $rangeO: 0.3; + $slotH: 50%; .slot { - // @include border-radius($basicCr * .75); +// @include border-radius($basicCr * .75); @include sliderTrack(); - height: auto; + height: $slotH; width: auto; position: absolute; - //top: ($knobH - $slotH) / 2; - top: (100% - $slotH)/2; + top: ($knobH - $slotH) / 2; right: 0; - bottom: (100% - $slotH)/2; + bottom: auto; left: 0; - z-index: 0; - .range { - background: rgba($colorKey, $rangeO); - cursor: ew-resize; - position: absolute; - top: 0; - right: auto; - bottom: 0; - left: auto; - height: auto; - width: auto; - z-index: 1; - &:hover { - background: rgba($colorKey, $rangeO + 0.2); - } - } } .knob { @include btnSubtle(); @include controlGrippy(rgba(black, 0.3), vertical, 1px, solid); - @include border-radius(2px); cursor: ew-resize; position: absolute; - height: auto; + height: $knobH; width: $knobW; top: 0; - bottom: 0; + auto: 0; + bottom: auto; left: auto; - z-index: 2; - &.knob-l { margin-left: $knobW / -2; } - &.knob-r { margin-right: $knobW / -2; } &:before { top: 1px; bottom: 3px; - //left: ($knobW / 2) - 1; - //margin-left: -1px; - left: 45%; + left: ($knobW / 2) - 1; + } + + } + .range { + background: rgba($colorKey, 0.6); + cursor: ew-resize; + position: absolute; + top: 0; + right: auto; + bottom: 0; + left: auto; + height: auto; + width: auto; + &:hover { + background: rgba($colorKey, 0.7); } } } diff --git a/platform/commonUI/general/res/sass/features/_imagery.scss b/platform/commonUI/general/res/sass/features/_imagery.scss new file mode 100644 index 0000000000..9ac402cb85 --- /dev/null +++ b/platform/commonUI/general/res/sass/features/_imagery.scss @@ -0,0 +1,170 @@ +.l-image-main-wrapper, +.l-image-main, +.l-image-main-controlbar, +.l-image-main-controlbar .left, +.l-image-main-controlbar .right, +.l-image-thumbs-wrapper { + @include absPosDefault(0, false); +} + +/*************************************** MAIN LAYOUT */ +.l-image-main-wrapper { + //@include test(); + @if $enableImageryThumbs == true { + bottom: $interiorMargin*2 + $imageThumbsWrapperH; + } + min-height: 100px; + min-width: 150px; + .l-image-main { + background-color: rgba(#fff, 0.1); + bottom: $imageMainControlBarH + $interiorMargin; + } + .l-image-main-controlbar { + top: auto; + height: $imageMainControlBarH; + } +} + +.l-image-thumbs-wrapper { + //@include test(red); + top: auto; + height: $imageThumbsWrapperH; +} + +.l-date, +.l-time, +.l-timezone { + display: inline-block; +} + +/*************************************** MAIN IMAGE */ + +.l-image-main, +.l-image-thumb-item .l-thumb { + background-size: contain; + background-position: center; + background-repeat: no-repeat; +} + +.l-image-main-controlbar { + //@include test(); + font-size: 0.8em; + line-height: $imageMainControlBarH; + .left, .right { + direction: rtl; + overflow: hidden; + } + .left { + //@include test(red); + text-align: left; + width: 75% !important; + } + .right { + //@include test(green); + min-width: 40px; + width: 25% !important; + z-index: 2; + } + .l-date, + .l-time { + color: #fff; + } + .l-mag { + direction: ltr; + display: inline-block; + //white-space: nowrap; + &:before { + content: "\000049"; + } + } + .s-mag { + color: darken($colorBodyFg, 20%); + } + .l-btn.show-thumbs { + display: none; + } +} + +.s-image-main { + border: 1px solid transparent; + &.paused { + border-color: $colorPausedBg; + } +} + +/*************************************** THUMBS */ + +.l-image-thumb-item { +} + +.l-image-thumbs-wrapper { + //@include test(green); + direction: rtl; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: $interiorMargin; + white-space: nowrap; + z-index: 70; +} + +.l-image-thumb-item { + @include single-transition(background-color, 0.25s); + @include box-sizing(border-box); + padding: 1px; + position: relative; + .l-thumb, + .l-date, + .l-time { + display: inline-block; + } + .l-date, + .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: rgba(#fff, 0.2); + .l-date, + .l-time { + color: #fff; + } + } + &.selected { + background: $colorKeySelectedBg; + .l-date, + .l-time { + color: #fff; + } + } + .l-thumb { + background-color: rgba(#fff, 0.1); + height: $imageThumbsD; + width: $imageThumbsD; + margin-top: 0; + } +} + +/*************************************** WHEN IN FRAME */ +.frame .t-imagery { + .l-image-main-wrapper { + bottom: 0; + .l-image-main-controlbar { + font-size: 0.7em; + } + @if $enableImageryThumbs == true { + .l-btn.show-thumbs { + display: inline-block; + } + } + } + .l-image-thumbs-wrapper { + display: none; + } +} \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/forms/_text-input.scss b/platform/commonUI/general/res/sass/forms/_text-input.scss index eed6ebd42d..f445b43aa0 100644 --- a/platform/commonUI/general/res/sass/forms/_text-input.scss +++ b/platform/commonUI/general/res/sass/forms/_text-input.scss @@ -19,18 +19,13 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -input[type="text"], -input[type="date"] { +input[type="text"] { @include nice-input(); - @include input-placeholder { - color: darken($colorBodyFg, 10%); - font-style: italic; - } - &.filter { - &.ng-dirty { - // background: red; - } - } + &.filter { + &.ng-dirty { +// background: red; + } + } &.numeric { text-align: right; } diff --git a/platform/commonUI/general/res/sass/helpers/_bubbles.scss b/platform/commonUI/general/res/sass/helpers/_bubbles.scss index 61980cf554..2a499339ce 100644 --- a/platform/commonUI/general/res/sass/helpers/_bubbles.scss +++ b/platform/commonUI/general/res/sass/helpers/_bubbles.scss @@ -21,18 +21,33 @@ *****************************************************************************/ //************************************************* LAYOUT -$infoBubbleFg: #666; -$infoBubbleBg: #ddd; - -.l-infobubble-wrapper { - $arwSize: 5px; - @include box-shadow(rgba(black, 0.4) 0 1px 5px); +.l-bubble-wrapper { position: absolute; z-index: 70; + .l-bubble { + padding: $bubblePad $bubblePad*2; + .l-btn.close { + padding: 0 2px; + position: absolute; + right: $interiorMargin; + top: $interiorMargin; + } + } + .arw { + position: absolute; + &.arw-up { + bottom: 100%; + + } + &.arw-down { + top: 100%; + } + } + .l-infobubble { display: inline-block; max-width: 250px; - padding: 5px 10px; + //padding: 5px 10px; &:before { content:""; position: absolute; @@ -71,57 +86,82 @@ $infoBubbleBg: #ddd; } &.arw-left { - margin-left: $arwSize*2; + margin-left: $bubbleArwSize*2; .l-infobubble::before { right: 100%; - border-top: $arwSize solid transparent; - border-bottom: $arwSize solid transparent; - border-right: ($arwSize * 1.5) solid $infoBubbleBg; + @include triangle('left', $bubbleArwSize, 1.5, $colorInfoBubbleBg); } } &.arw-right { - margin-right: $arwSize*2; + margin-right: $bubbleArwSize*2; .l-infobubble::before { left: 100%; - border-top: $arwSize solid transparent; - border-bottom: $arwSize solid transparent; - border-left: ($arwSize * 1.5) solid $infoBubbleBg; + @include triangle('right', $bubbleArwSize, 1.5, $colorInfoBubbleBg); } } &.arw-top { .l-infobubble::before { - top: $arwSize * 2; + top: $bubbleArwSize * 2; } } &.arw-btm { .l-infobubble::before { - bottom: $arwSize * 2; + bottom: $bubbleArwSize * 2; } } &.arw-down { - margin-bottom: $arwSize*2; - .l-infobubble::before { - left: 50%; - top: 100%; - margin-left: -1 * $arwSize; - border-left: $arwSize solid transparent; - border-right: $arwSize solid transparent; - border-top: ($arwSize * 1.5) solid $infoBubbleBg; + + } +} + +.l-thumbsbubble-wrapper { + $closeBtnD: 15px; + position: absolute; + height: $imageThumbsWrapperH + $bubblePad*2 + $interiorMargin; + width: 100%; + .l-thumbsbubble { + @include absPosDefault(); + .l-image-thumbs-wrapper { + height: auto; + top: $bubblePad !important; right: $closeBtnD + ($interiorMargin*2); bottom: $bubblePad !important; left: $bubblePad; } } + .arw { + //left: 50%; + //margin-left: $bubbleArwSize / -2; + z-index: 2; + } + &.arw-up .arw.arw-down, + &.arw-down .arw.arw-up { display: none; } } //************************************************* LOOK AND FEEL -.s-infobubble { - $emFg: darken($infoBubbleFg, 20%); +.s-bubble-wrapper { + //@include box-shadow(rgba(black, 0.4) 0 1px 5px); +} + +.s-bubble { @include border-radius($basicCr); - background: $infoBubbleBg; - color: $infoBubbleFg; + @include box-shadow(rgba(black, 0.4) 0 1px 5px); +} + +.l-thumbsbubble-wrapper { + .arw-up { + @include triangle('up', $bubbleArwSize, 1.5, $colorThumbsBubbleBg); + } + .arw-down { + @include triangle('down', $bubbleArwSize, 1.5, $colorThumbsBubbleBg); + } +} +.s-infobubble { + $emFg: darken($colorInfoBubbleFg, 20%); + background: $colorInfoBubbleBg; + color: $colorInfoBubbleFg; font-size: 0.8rem; .title { color: $emFg; @@ -129,7 +169,7 @@ $infoBubbleBg: #ddd; } tr { td { - border-top: 1px solid darken($infoBubbleBg, 10%); + border-top: 1px solid darken($colorInfoBubbleBg, 10%); font-size: 0.9em; } &:first-child td { @@ -139,5 +179,9 @@ $infoBubbleBg: #ddd; .value { color: $emFg; } +} +.s-thumbsbubble { + background: $colorThumbsBubbleBg; + color: $colorThumbsBubbleFg; } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/tree/_tree.scss b/platform/commonUI/general/res/sass/tree/_tree.scss index 483bada8f0..7df73f3bd8 100644 --- a/platform/commonUI/general/res/sass/tree/_tree.scss +++ b/platform/commonUI/general/res/sass/tree/_tree.scss @@ -99,7 +99,7 @@ ul.tree { &.selected { $c: #fff; - background: #005177; + background: $colorKeySelectedBg; color: $c; .view-control { color: $colorItemTreeIcon; diff --git a/platform/commonUI/general/res/sass/user-environ/_layout.scss b/platform/commonUI/general/res/sass/user-environ/_layout.scss index c459adfa8d..8201597ca9 100644 --- a/platform/commonUI/general/res/sass/user-environ/_layout.scss +++ b/platform/commonUI/general/res/sass/user-environ/_layout.scss @@ -70,23 +70,19 @@ &.abs { text-wrap: none; white-space: nowrap; - &.left, - .left { - width: 45%; - right: auto; - } - &.right, - .right { - width: 45%; - left: auto; - right: 0; - text-align: right; - .icon.major { - margin-left: $interiorMargin * 3; - } -// .icon.major { -// margin-left: $interiorMargin; -// } + } + &.left, + .left { + width: 45% !important; + right: auto !important; + } + &.right, + .right { + width: 45% !important; + left: auto !important; + text-align: right; + .icon.major { + margin-left: $interiorMargin * 3; } } } diff --git a/platform/features/static-markup/res/markup.html b/platform/features/static-markup/res/markup.html index 3aad99ac01..24ebe23235 100644 --- a/platform/features/static-markup/res/markup.html +++ b/platform/features/static-markup/res/markup.html @@ -19,27 +19,133 @@ this source code distribution or the Licensing information page available at runtime from the About dialog for additional information. --> -

Static Markup Sandbox

+ +
-

Plot limits

-
+ +
+
+
+
+ + UTC + 16:03:43 + 2020/04/27 +
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+ x +
+
+
+
{{thumb.date}}
+
{{thumb.time}}
+
+
+
+
+
+ + + \ No newline at end of file From 5aad1b4e302eba9ee7c316bfe996b3e4f13efd1b Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Mon, 8 Jun 2015 15:08:43 -0700 Subject: [PATCH 02/64] [Frontend] Removing unused firs-order scss file --- platform/commonUI/general/res/sass/plots.scss | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 platform/commonUI/general/res/sass/plots.scss diff --git a/platform/commonUI/general/res/sass/plots.scss b/platform/commonUI/general/res/sass/plots.scss deleted file mode 100644 index bdcd774c5a..0000000000 --- a/platform/commonUI/general/res/sass/plots.scss +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -@import "compass"; -@import "compass/css3"; -@import "compass/css3/border-radius"; -@import "compass/css3/opacity"; -@import "compass/utilities"; - -@import "constants"; -@import "mixins"; -@import "plots/plots-main"; \ No newline at end of file From 1587e66d9e37bd9cf2915ec641a47b40b4b79995 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Mon, 8 Jun 2015 15:24:17 -0700 Subject: [PATCH 03/64] [Frontend] Added local zoom/reset controls WTD-1222 Refactored scss in plots-main slightly; Removed unused sass/plots.scss; --- .../general/res/css/theme-espresso.css | 151 ++++++++++-------- .../general/res/sass/controls/_controls.scss | 13 ++ .../general/res/sass/features/_imagery.scss | 7 +- .../features/plot/res/templates/plot.html | 4 +- .../features/static-markup/res/markup.html | 36 ++++- 5 files changed, 134 insertions(+), 77 deletions(-) diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index 2d0aa19ff9..2958023973 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -1861,10 +1861,21 @@ a.l-btn span { padding-left: 0; } /* line 202, ../sass/controls/_controls.scss */ +.l-local-controls { + position: absolute; + top: 5px; + right: 5px; + z-index: 5; } + +/* line 211, ../sass/controls/_controls.scss */ +.s-local-controls { + font-size: 0.7rem; } + +/* line 215, ../sass/controls/_controls.scss */ .btn-set { display: inline-block; position: relative; } - /* line 206, ../sass/controls/_controls.scss */ + /* line 219, ../sass/controls/_controls.scss */ .btn-set .btn, .btn-set .t-btn { -moz-border-radius: 0; @@ -1872,7 +1883,7 @@ a.l-btn span { border-radius: 0; border-left: 1px solid #666666; margin-left: 0; } - /* line 211, ../sass/controls/_controls.scss */ + /* line 224, ../sass/controls/_controls.scss */ .btn-set .btn:first-child, .btn-set .t-btn:first-child { border-left: none; @@ -1882,7 +1893,7 @@ a.l-btn span { -moz-border-radius-bottomleft: 3px; -webkit-border-bottom-left-radius: 3px; border-bottom-left-radius: 3px; } - /* line 215, ../sass/controls/_controls.scss */ + /* line 228, ../sass/controls/_controls.scss */ .btn-set .btn:last-child, .btn-set .t-btn:last-child { -moz-border-radius-topright: 3px; @@ -1892,7 +1903,7 @@ a.l-btn span { -webkit-border-bottom-right-radius: 3px; border-bottom-right-radius: 3px; } -/* line 221, ../sass/controls/_controls.scss */ +/* line 234, ../sass/controls/_controls.scss */ .object-browse-bar .btn, .object-browse-bar .t-btn, .top-bar .buttons-main .btn, @@ -1903,7 +1914,7 @@ a.l-btn span { font-size: 11.25px; height: 25px; line-height: 25px; } - /* line 232, ../sass/controls/_controls.scss */ + /* line 245, ../sass/controls/_controls.scss */ .object-browse-bar .btn .icon:not(.invoke-menu), .object-browse-bar .t-btn .icon:not(.invoke-menu), .top-bar .buttons-main .btn .icon:not(.invoke-menu), @@ -1913,7 +1924,7 @@ a.l-btn span { font-size: 150%; vertical-align: middle; } -/* line 240, ../sass/controls/_controls.scss */ +/* line 253, ../sass/controls/_controls.scss */ label.checkbox.custom { cursor: pointer; display: inline-block; @@ -1922,13 +1933,13 @@ label.checkbox.custom { padding-left: 19px; position: relative; vertical-align: top; } - /* line 251, ../sass/controls/_controls.scss */ + /* line 264, ../sass/controls/_controls.scss */ label.checkbox.custom em { color: #999; display: inline-block; height: 14px; min-width: 14px; } - /* line 256, ../sass/controls/_controls.scss */ + /* line 269, ../sass/controls/_controls.scss */ label.checkbox.custom em:before { -moz-border-radius: 2.25px; -webkit-border-radius: 2.25px; @@ -1947,51 +1958,51 @@ label.checkbox.custom { top: 0; position: absolute; text-align: center; } - /* line 274, ../sass/controls/_controls.scss */ + /* line 287, ../sass/controls/_controls.scss */ label.checkbox.custom.no-text { overflow: hidden; margin-right: 0; padding-left: 0; height: 14px; width: 14px; } - /* line 280, ../sass/controls/_controls.scss */ + /* line 293, ../sass/controls/_controls.scss */ label.checkbox.custom.no-text em { overflow: hidden; } - /* line 284, ../sass/controls/_controls.scss */ + /* line 297, ../sass/controls/_controls.scss */ label.checkbox.custom input { display: none; } - /* line 286, ../sass/controls/_controls.scss */ + /* line 299, ../sass/controls/_controls.scss */ label.checkbox.custom input:checked ~ em:before { background: #0099cc; color: #ccf2ff; content: "2"; } -/* line 294, ../sass/controls/_controls.scss */ +/* line 307, ../sass/controls/_controls.scss */ .input-labeled { margin-left: 5px; } - /* line 296, ../sass/controls/_controls.scss */ + /* line 309, ../sass/controls/_controls.scss */ .input-labeled label { display: inline-block; margin-right: 3px; } - /* line 300, ../sass/controls/_controls.scss */ + /* line 313, ../sass/controls/_controls.scss */ .input-labeled.inline { display: inline-block; } - /* line 303, ../sass/controls/_controls.scss */ + /* line 316, ../sass/controls/_controls.scss */ .input-labeled:first-child { margin-left: 0; } -/* line 308, ../sass/controls/_controls.scss */ +/* line 321, ../sass/controls/_controls.scss */ .btn-menu label.checkbox.custom { margin-left: 5px; } -/* line 313, ../sass/controls/_controls.scss */ +/* line 326, ../sass/controls/_controls.scss */ .item .checkbox.checked label { -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; border-bottom: none; } -/* line 319, ../sass/controls/_controls.scss */ +/* line 332, ../sass/controls/_controls.scss */ .btn-menu { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2022,42 +2033,42 @@ label.checkbox.custom { background-image: -moz-linear-gradient(#666666, #4d4d4d); background-image: -webkit-linear-gradient(#666666, #4d4d4d); background-image: linear-gradient(#666666, #4d4d4d); } - /* line 326, ../sass/controls/_controls.scss */ + /* line 339, ../sass/controls/_controls.scss */ .btn-menu.dropdown { padding-left: 10px; padding-right: 10px; } - /* line 332, ../sass/controls/_controls.scss */ + /* line 345, ../sass/controls/_controls.scss */ .btn-menu:not(.disabled):hover { color: #cccccc; } - /* line 336, ../sass/controls/_controls.scss */ + /* line 349, ../sass/controls/_controls.scss */ .btn-menu.btn-invoke-menu { color: #0099cc; padding: 0 5px; } - /* line 340, ../sass/controls/_controls.scss */ + /* line 353, ../sass/controls/_controls.scss */ .btn-menu.btn-invoke-menu:hover { color: deepskyblue; } - /* line 350, ../sass/controls/_controls.scss */ + /* line 363, ../sass/controls/_controls.scss */ .btn-menu .type-icon { margin-right: 5px; } - /* line 353, ../sass/controls/_controls.scss */ + /* line 366, ../sass/controls/_controls.scss */ .btn-menu .menu { position: absolute; left: 0; text-align: left; } - /* line 358, ../sass/controls/_controls.scss */ + /* line 371, ../sass/controls/_controls.scss */ .btn-menu .menu .ui-symbol.icon { width: 12px; } -/* line 364, ../sass/controls/_controls.scss */ +/* line 377, ../sass/controls/_controls.scss */ .top-bar .btn-menu { height: 25px; line-height: 25px; padding-right: 10px; } - /* line 372, ../sass/controls/_controls.scss */ + /* line 385, ../sass/controls/_controls.scss */ .top-bar .btn-menu.browse-btn { margin-right: 5px; padding-left: 25px; } - /* line 375, ../sass/controls/_controls.scss */ + /* line 388, ../sass/controls/_controls.scss */ .top-bar .btn-menu.browse-btn .badge { -moz-border-radius: 4.5px; -webkit-border-radius: 4.5px; @@ -2074,30 +2085,30 @@ label.checkbox.custom { height: auto; } /******************************************************** OBJECT-HEADER */ -/* line 392, ../sass/controls/_controls.scss */ +/* line 405, ../sass/controls/_controls.scss */ .object-header { display: inline-block; font-size: 1em; } - /* line 395, ../sass/controls/_controls.scss */ + /* line 408, ../sass/controls/_controls.scss */ .object-header .title { color: white; } - /* line 398, ../sass/controls/_controls.scss */ + /* line 411, ../sass/controls/_controls.scss */ .object-header .type-icon { font-size: 1.5em; margin-right: 5px; vertical-align: middle; } -/* line 407, ../sass/controls/_controls.scss */ +/* line 420, ../sass/controls/_controls.scss */ .top-bar .object-header, .object-browse-bar .object-header { font-size: 1.1em; } - /* line 409, ../sass/controls/_controls.scss */ + /* line 422, ../sass/controls/_controls.scss */ .top-bar .object-header span, .object-browse-bar .object-header span { display: inline-block; } /******************************************************** VIEW-CONTROLS */ -/* line 417, ../sass/controls/_controls.scss */ +/* line 430, ../sass/controls/_controls.scss */ .view-controls .view-type { -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -2109,16 +2120,16 @@ label.checkbox.custom { line-height: 20px; padding-left: 5px; padding-right: 5px; } - /* line 428, ../sass/controls/_controls.scss */ + /* line 441, ../sass/controls/_controls.scss */ .view-controls .view-type.cur { background: #666666; } -/* line 433, ../sass/controls/_controls.scss */ +/* line 446, ../sass/controls/_controls.scss */ .edit-mode .top-bar .control-set.edit-view-controls { margin-right: 50px; } /******************************************************** SLIDERS */ -/* line 444, ../sass/controls/_controls.scss */ +/* line 457, ../sass/controls/_controls.scss */ .slider .slot { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -2139,7 +2150,7 @@ label.checkbox.custom { right: 0; bottom: auto; left: 0; } -/* line 455, ../sass/controls/_controls.scss */ +/* line 468, ../sass/controls/_controls.scss */ .slider .knob { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2190,12 +2201,12 @@ label.checkbox.custom { /* line 166, ../sass/_mixins.scss */ .slider .knob:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } - /* line 466, ../sass/controls/_controls.scss */ + /* line 479, ../sass/controls/_controls.scss */ .slider .knob:before { top: 1px; bottom: 3px; left: 5px; } -/* line 473, ../sass/controls/_controls.scss */ +/* line 486, ../sass/controls/_controls.scss */ .slider .range { background: rgba(0, 153, 204, 0.6); cursor: ew-resize; @@ -2206,12 +2217,12 @@ label.checkbox.custom { left: auto; height: auto; width: auto; } - /* line 483, ../sass/controls/_controls.scss */ + /* line 496, ../sass/controls/_controls.scss */ .slider .range:hover { background: rgba(0, 153, 204, 0.7); } /******************************************************** BROWSER ELEMENTS */ -/* line 491, ../sass/controls/_controls.scss */ +/* line 504, ../sass/controls/_controls.scss */ ::-webkit-scrollbar { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -2228,7 +2239,7 @@ label.checkbox.custom { height: 10px; width: 10px; } -/* line 497, ../sass/controls/_controls.scss */ +/* line 510, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-thumb { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2246,7 +2257,7 @@ label.checkbox.custom { -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; border-top: 1px solid gray; } - /* line 504, ../sass/controls/_controls.scss */ + /* line 517, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-thumb:hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzczNzM3MyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2255,7 +2266,7 @@ label.checkbox.custom { background-image: -webkit-linear-gradient(#808080, #737373 20px); background-image: linear-gradient(#808080, #737373 20px); } -/* line 509, ../sass/controls/_controls.scss */ +/* line 522, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-corner { background: rgba(0, 0, 0, 0.4); } @@ -2566,49 +2577,53 @@ label.checkbox.custom { background-repeat: no-repeat; } /* line 49, ../sass/features/_imagery.scss */ +.l-image-main { + cursor: crosshair; } + +/* line 53, ../sass/features/_imagery.scss */ .l-image-main-controlbar { font-size: 0.8em; line-height: 20px; } - /* line 53, ../sass/features/_imagery.scss */ + /* line 57, ../sass/features/_imagery.scss */ .l-image-main-controlbar .left, .l-image-main-controlbar .right { direction: rtl; overflow: hidden; } - /* line 57, ../sass/features/_imagery.scss */ + /* line 61, ../sass/features/_imagery.scss */ .l-image-main-controlbar .left { text-align: left; width: 75% !important; } - /* line 62, ../sass/features/_imagery.scss */ + /* line 66, ../sass/features/_imagery.scss */ .l-image-main-controlbar .right { min-width: 40px; width: 25% !important; z-index: 2; } - /* line 68, ../sass/features/_imagery.scss */ + /* line 72, ../sass/features/_imagery.scss */ .l-image-main-controlbar .l-date, .l-image-main-controlbar .l-time { color: #fff; } - /* line 72, ../sass/features/_imagery.scss */ + /* line 76, ../sass/features/_imagery.scss */ .l-image-main-controlbar .l-mag { direction: ltr; display: inline-block; } - /* line 76, ../sass/features/_imagery.scss */ + /* line 80, ../sass/features/_imagery.scss */ .l-image-main-controlbar .l-mag:before { content: "\000049"; } - /* line 80, ../sass/features/_imagery.scss */ + /* line 84, ../sass/features/_imagery.scss */ .l-image-main-controlbar .s-mag { color: #666666; } - /* line 83, ../sass/features/_imagery.scss */ + /* line 87, ../sass/features/_imagery.scss */ .l-image-main-controlbar .l-btn.show-thumbs { display: none; } -/* line 88, ../sass/features/_imagery.scss */ +/* line 92, ../sass/features/_imagery.scss */ .s-image-main { border: 1px solid transparent; } - /* line 90, ../sass/features/_imagery.scss */ + /* line 94, ../sass/features/_imagery.scss */ .s-image-main.paused { border-color: #c56f01; } /*************************************** THUMBS */ -/* line 100, ../sass/features/_imagery.scss */ +/* line 101, ../sass/features/_imagery.scss */ .l-image-thumbs-wrapper { direction: rtl; overflow-x: auto; @@ -2617,7 +2632,7 @@ label.checkbox.custom { white-space: nowrap; z-index: 70; } -/* line 110, ../sass/features/_imagery.scss */ +/* line 111, ../sass/features/_imagery.scss */ .l-image-thumb-item { -moz-transition: background-color 0.25s; -o-transition: background-color 0.25s; @@ -2636,30 +2651,30 @@ label.checkbox.custom { text-align: left; width: 122px; white-space: normal; } - /* line 115, ../sass/features/_imagery.scss */ + /* line 116, ../sass/features/_imagery.scss */ .l-image-thumb-item .l-thumb, .l-image-thumb-item .l-date, .l-image-thumb-item .l-time { display: inline-block; } - /* line 120, ../sass/features/_imagery.scss */ + /* line 121, ../sass/features/_imagery.scss */ .l-image-thumb-item .l-date, .l-image-thumb-item .l-time { padding: 2px 3px; } - /* line 132, ../sass/features/_imagery.scss */ + /* line 133, ../sass/features/_imagery.scss */ .l-image-thumb-item:hover { background: rgba(255, 255, 255, 0.2); } - /* line 134, ../sass/features/_imagery.scss */ + /* line 135, ../sass/features/_imagery.scss */ .l-image-thumb-item:hover .l-date, .l-image-thumb-item:hover .l-time { color: #fff; } - /* line 139, ../sass/features/_imagery.scss */ + /* line 140, ../sass/features/_imagery.scss */ .l-image-thumb-item.selected { background: #005177; } - /* line 141, ../sass/features/_imagery.scss */ + /* line 142, ../sass/features/_imagery.scss */ .l-image-thumb-item.selected .l-date, .l-image-thumb-item.selected .l-time { color: #fff; } - /* line 146, ../sass/features/_imagery.scss */ + /* line 147, ../sass/features/_imagery.scss */ .l-image-thumb-item .l-thumb { background-color: rgba(255, 255, 255, 0.1); height: 120px; @@ -2667,13 +2682,13 @@ label.checkbox.custom { margin-top: 0; } /*************************************** WHEN IN FRAME */ -/* line 156, ../sass/features/_imagery.scss */ +/* line 157, ../sass/features/_imagery.scss */ .frame .t-imagery .l-image-main-wrapper { bottom: 0; } - /* line 158, ../sass/features/_imagery.scss */ + /* line 159, ../sass/features/_imagery.scss */ .frame .t-imagery .l-image-main-wrapper .l-image-main-controlbar { font-size: 0.7em; } -/* line 167, ../sass/features/_imagery.scss */ +/* line 168, ../sass/features/_imagery.scss */ .frame .t-imagery .l-image-thumbs-wrapper { display: none; } diff --git a/platform/commonUI/general/res/sass/controls/_controls.scss b/platform/commonUI/general/res/sass/controls/_controls.scss index 721a557a32..20ac37b2cc 100644 --- a/platform/commonUI/general/res/sass/controls/_controls.scss +++ b/platform/commonUI/general/res/sass/controls/_controls.scss @@ -199,6 +199,19 @@ } } +.l-local-controls { + // Control shown when hovering over an object, like plots and imagery + // Default position is upper right + $p: $interiorMargin; + position: absolute; + top: $p; right: $p; + z-index: 5; +} + +.s-local-controls { + font-size: 0.7rem; +} + .btn-set { // Buttons that have a very tight conceptual grouping - no internal space between them. display: inline-block; diff --git a/platform/commonUI/general/res/sass/features/_imagery.scss b/platform/commonUI/general/res/sass/features/_imagery.scss index 9ac402cb85..69abc1ee27 100644 --- a/platform/commonUI/general/res/sass/features/_imagery.scss +++ b/platform/commonUI/general/res/sass/features/_imagery.scss @@ -46,6 +46,10 @@ background-repeat: no-repeat; } +.l-image-main { + cursor: crosshair; +} + .l-image-main-controlbar { //@include test(); font-size: 0.8em; @@ -94,9 +98,6 @@ /*************************************** THUMBS */ -.l-image-thumb-item { -} - .l-image-thumbs-wrapper { //@include test(green); direction: rtl; diff --git a/platform/features/plot/res/templates/plot.html b/platform/features/plot/res/templates/plot.html index 1bb1de0e9c..d8ea7366b2 100644 --- a/platform/features/plot/res/templates/plot.html +++ b/platform/features/plot/res/templates/plot.html @@ -87,10 +87,10 @@ -
+ >
-
+ From 277b8e74b682861ad32d2ac4a738956914beda95 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Tue, 9 Jun 2015 09:28:59 -0700 Subject: [PATCH 04/64] [Frontend] Final sanding on bubbles.scss WTD-1222 --- .../general/res/css/theme-espresso.css | 48 ++++++++++--------- .../general/res/sass/helpers/_bubbles.scss | 4 +- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index 2958023973..6f511d129d 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -84,7 +84,7 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 5, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 5, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, @@ -105,38 +105,38 @@ time, mark, audio, video { font-size: 100%; vertical-align: baseline; } -/* line 22, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 22, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html { line-height: 1; } -/* line 24, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 24, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 26, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 26, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ table { border-collapse: collapse; border-spacing: 0; } -/* line 28, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 28, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 30, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 30, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q, blockquote { quotes: none; } - /* line 103, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ + /* line 103, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } -/* line 32, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 32, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 116, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 116, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } @@ -4030,9 +4030,11 @@ input[type="text"] { /* line 121, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper { position: absolute; + left: 10px; + right: 10px; height: 183px; - width: 100%; } - /* line 126, ../sass/helpers/_bubbles.scss */ + width: auto; } + /* line 128, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .l-thumbsbubble { overflow: hidden; position: absolute; @@ -4042,21 +4044,21 @@ input[type="text"] { left: 0px; width: auto; height: auto; } - /* line 128, ../sass/helpers/_bubbles.scss */ + /* line 130, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .l-thumbsbubble .l-image-thumbs-wrapper { height: auto; top: 5px !important; right: 25px; bottom: 5px !important; left: 5px; } - /* line 133, ../sass/helpers/_bubbles.scss */ + /* line 135, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw { z-index: 2; } - /* line 138, ../sass/helpers/_bubbles.scss */ + /* line 140, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper.arw-up .arw.arw-down, .l-thumbsbubble-wrapper.arw-down .arw.arw-up { display: none; } -/* line 148, ../sass/helpers/_bubbles.scss */ +/* line 150, ../sass/helpers/_bubbles.scss */ .s-bubble { -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -4065,14 +4067,14 @@ input[type="text"] { -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; } -/* line 154, ../sass/helpers/_bubbles.scss */ +/* line 156, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw-up { width: 0; height: 0; border-left: 6.66667px solid transparent; border-right: 6.66667px solid transparent; border-bottom: 10px solid #4d4d4d; } -/* line 157, ../sass/helpers/_bubbles.scss */ +/* line 159, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw-down { width: 0; height: 0; @@ -4080,27 +4082,27 @@ input[type="text"] { border-right: 6.66667px solid transparent; border-top: 10px solid #4d4d4d; } -/* line 161, ../sass/helpers/_bubbles.scss */ +/* line 163, ../sass/helpers/_bubbles.scss */ .s-infobubble { background: #ddd; color: #666; font-size: 0.8rem; } - /* line 166, ../sass/helpers/_bubbles.scss */ + /* line 168, ../sass/helpers/_bubbles.scss */ .s-infobubble .title { color: #333333; font-weight: bold; } - /* line 171, ../sass/helpers/_bubbles.scss */ + /* line 173, ../sass/helpers/_bubbles.scss */ .s-infobubble tr td { border-top: 1px solid #c4c4c4; font-size: 0.9em; } - /* line 175, ../sass/helpers/_bubbles.scss */ + /* line 177, ../sass/helpers/_bubbles.scss */ .s-infobubble tr:first-child td { border-top: none; } - /* line 179, ../sass/helpers/_bubbles.scss */ + /* line 181, ../sass/helpers/_bubbles.scss */ .s-infobubble .value { color: #333333; } -/* line 184, ../sass/helpers/_bubbles.scss */ +/* line 186, ../sass/helpers/_bubbles.scss */ .s-thumbsbubble { background: #4d4d4d; color: #b3b3b3; } diff --git a/platform/commonUI/general/res/sass/helpers/_bubbles.scss b/platform/commonUI/general/res/sass/helpers/_bubbles.scss index 2a499339ce..0dad9e115b 100644 --- a/platform/commonUI/general/res/sass/helpers/_bubbles.scss +++ b/platform/commonUI/general/res/sass/helpers/_bubbles.scss @@ -121,8 +121,10 @@ .l-thumbsbubble-wrapper { $closeBtnD: 15px; position: absolute; + left: $interiorMarginLg; + right: $interiorMarginLg; height: $imageThumbsWrapperH + $bubblePad*2 + $interiorMargin; - width: 100%; + width: auto; .l-thumbsbubble { @include absPosDefault(); .l-image-thumbs-wrapper { From 40f36541fab875130e3a9697f69c1bf692a8fd71 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 9 Jun 2015 10:31:17 -0700 Subject: [PATCH 05/64] [Core] Add missing models When requested models are missing, add models of an explicitly unknown type to allow this to be expressed to the user. WTD-1241. --- platform/core/bundle.json | 13 ++++- .../core/src/models/MissingModelDecorator.js | 54 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 platform/core/src/models/MissingModelDecorator.js diff --git a/platform/core/bundle.json b/platform/core/bundle.json index 5a2727eb75..666567fced 100644 --- a/platform/core/bundle.json +++ b/platform/core/bundle.json @@ -70,6 +70,12 @@ "type": "decorator", "implementation": "models/CachingModelDecorator.js" }, + { + "provides": "modelService", + "type": "decorator", + "priority": "fallback", + "implementation": "models/MissingModelDecorator.js" + }, { "provides": "typeService", "type": "provider", @@ -132,6 +138,11 @@ "features": "creation", "description": "A folder, useful for storing and organizing domain objects.", "model": { "composition": [] } + }, + { + "key": "unknown", + "name": "Unknown Type", + "glyph": "?" } ], "capabilities": [ @@ -193,4 +204,4 @@ } ] } -} \ No newline at end of file +} diff --git a/platform/core/src/models/MissingModelDecorator.js b/platform/core/src/models/MissingModelDecorator.js new file mode 100644 index 0000000000..fd59caf9a2 --- /dev/null +++ b/platform/core/src/models/MissingModelDecorator.js @@ -0,0 +1,54 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +/*global define*/ +define( + [], + function () { + "use strict"; + + function MissingModelDecorator(modelService) { + function missingModel(id) { + return { + type: "unknown", + name: "Missing: " + id + }; + } + + return { + getModels: function (ids) { + function addMissingModels(models) { + var result = {}; + ids.forEach(function (id) { + result[id] = models[id] || missingModel(id); + }); + return result; + } + + return modelService.getModels(ids).then(addMissingModels); + } + }; + } + + return MissingModelDecorator; + } +); From 4320d9be9567fc22e48d0b05034e8799678523be Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 9 Jun 2015 15:24:29 -0700 Subject: [PATCH 06/64] [Imagery] Add example imagery Add a telemetry source for example imagery to support development of a view for image telemetry, WTD-1170. --- example/imagery/bundle.json | 42 +++++++ example/imagery/src/ImageTelemetry.js | 66 ++++++++++ example/imagery/src/ImageTelemetryProvider.js | 115 ++++++++++++++++++ 3 files changed, 223 insertions(+) create mode 100644 example/imagery/bundle.json create mode 100644 example/imagery/src/ImageTelemetry.js create mode 100644 example/imagery/src/ImageTelemetryProvider.js diff --git a/example/imagery/bundle.json b/example/imagery/bundle.json new file mode 100644 index 0000000000..1adcf4758d --- /dev/null +++ b/example/imagery/bundle.json @@ -0,0 +1,42 @@ +{ + "name": "Imagery", + "description": "Example of a component that produces image telemetry.", + "extensions": { + "components": [ + { + "implementation": "ImageTelemetryProvider.js", + "type": "provider", + "provides": "telemetryService", + "depends": [ "$q", "$timeout" ] + } + ], + "types": [ + { + "key": "imagery", + "name": "Example Imagery", + "glyph": "T", + "features": "creation", + "model": { + "telemetry": {} + }, + "telemetry": { + "source": "imagery", + "domains": [ + { + "name": "Time", + "key": "time", + "format": "timestamp" + } + ], + "ranges": [ + { + "name": "Image", + "key": "url", + "format": "imageUrl" + } + ] + } + } + ] + } +} diff --git a/example/imagery/src/ImageTelemetry.js b/example/imagery/src/ImageTelemetry.js new file mode 100644 index 0000000000..447ddcbaa8 --- /dev/null +++ b/example/imagery/src/ImageTelemetry.js @@ -0,0 +1,66 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining SinewaveTelemetry. Created by vwoeltje on 11/12/14. + */ +define( + [], + function () { + "use strict"; + + var firstObservedTime = Date.now(), + images = [ + "http://www.nasa.gov/393811main_Palomar_ao_bouchez_10s_after_impact_4x3_946-710.png", + "http://www.nasa.gov/393821main_Palomar_ao_bouchez_15s_after_impact_4x3_946-710.png", + "http://www.nasa.gov/images/content/393801main_CfhtVeillet2_4x3_516-387.jpg", + "http://www.nasa.gov/images/content/392790main_1024_768_GeminiNorth_NightBeforeImpact_946-710.jpg" + ].map(function (url, index) { + return { + timestamp: firstObservedTime + 1000 * index, + url: url + }; + }); + + + /** + * + * @constructor + */ + function ImageTelemetry() { + return { + getPointCount: function () { + return Math.floor((Date.now() - firstObservedTime) / 1000); + }, + getDomainValue: function (i, domain) { + return images[i % images.length].timestamp; + }, + getRangeValue: function (i, range) { + return images[i % images.length].url; + } + }; + } + + return ImageTelemetry; + } +); diff --git a/example/imagery/src/ImageTelemetryProvider.js b/example/imagery/src/ImageTelemetryProvider.js new file mode 100644 index 0000000000..5dcd1e3e70 --- /dev/null +++ b/example/imagery/src/ImageTelemetryProvider.js @@ -0,0 +1,115 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining SinewaveTelemetryProvider. Created by vwoeltje on 11/12/14. + */ +define( + ["./ImageTelemetry"], + function (ImageTelemetry) { + "use strict"; + + /** + * + * @constructor + */ + function ImageTelemetryProvider($q, $timeout) { + var subscriptions = []; + + // + function matchesSource(request) { + return request.source === "imagery"; + } + + // Used internally; this will be repacked by doPackage + function generateData(request) { + return { + key: request.key, + telemetry: new ImageTelemetry() + }; + } + + // + function doPackage(results) { + var packaged = {}; + results.forEach(function (result) { + packaged[result.key] = result.telemetry; + }); + // Format as expected (sources -> keys -> telemetry) + return { imagery: packaged }; + } + + function requestTelemetry(requests) { + return $timeout(function () { + return doPackage(requests.filter(matchesSource).map(generateData)); + }, 0); + } + + function handleSubscriptions() { + subscriptions.forEach(function (subscription) { + var requests = subscription.requests; + subscription.callback(doPackage( + requests.filter(matchesSource).map(generateData) + )); + }); + } + + function startGenerating() { + $timeout(function () { + handleSubscriptions(); + if (subscriptions.length > 0) { + startGenerating(); + } + }, 1000); + } + + function subscribe(callback, requests) { + var subscription = { + callback: callback, + requests: requests + }; + + function unsubscribe() { + subscriptions = subscriptions.filter(function (s) { + return s !== subscription; + }); + } + + subscriptions.push(subscription); + + if (subscriptions.length === 1) { + startGenerating(); + } + + return unsubscribe; + } + + return { + requestTelemetry: requestTelemetry, + subscribe: subscribe + }; + } + + return ImageTelemetryProvider; + } +); From 627fa267f486a1ba980ebe740abe8a0ba70d3993 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 9 Jun 2015 15:40:42 -0700 Subject: [PATCH 07/64] [Imagery] Add imagery view bundle Add a bundle which contains view for image telemetry. Template is a placeholder; view is restricted by policy to telemetry-providing domain objects which actually have image telemetry. WTD-1170. --- platform/features/imagery/bundle.json | 20 +++++++ .../imagery/res/templates/imagery.html | 1 + .../imagery/src/policies/ImageryViewPolicy.js | 53 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 platform/features/imagery/bundle.json create mode 100644 platform/features/imagery/res/templates/imagery.html create mode 100644 platform/features/imagery/src/policies/ImageryViewPolicy.js diff --git a/platform/features/imagery/bundle.json b/platform/features/imagery/bundle.json new file mode 100644 index 0000000000..fb59503a9d --- /dev/null +++ b/platform/features/imagery/bundle.json @@ -0,0 +1,20 @@ +{ + "name": "Plot view for telemetry", + "extensions": { + "views": [ + { + "name": "Imagery", + "key": "imagery", + "glyph": "I", + "templateUrl": "templates/imagery.html", + "needs": [ "telemetry" ] + } + ], + "policies": [ + { + "category": "view", + "implementation": "policies/ImageryViewPolicy.js" + } + ] + } +} diff --git a/platform/features/imagery/res/templates/imagery.html b/platform/features/imagery/res/templates/imagery.html new file mode 100644 index 0000000000..48474e7dc5 --- /dev/null +++ b/platform/features/imagery/res/templates/imagery.html @@ -0,0 +1 @@ +Hello imagery! diff --git a/platform/features/imagery/src/policies/ImageryViewPolicy.js b/platform/features/imagery/src/policies/ImageryViewPolicy.js new file mode 100644 index 0000000000..522d323333 --- /dev/null +++ b/platform/features/imagery/src/policies/ImageryViewPolicy.js @@ -0,0 +1,53 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define( + function () { + "use strict"; + + function ImageryViewPolicy() { + function hasImageTelemetry(domainObject) { + var telemetry = domainObject && + domainObject.getCapability('telemetry'), + metadata = telemetry ? telemetry.getMetadata() : {}, + ranges = metadata.ranges || []; + + return ranges.some(function (range) { + return range.format === 'imageUrl'; + }); + } + + return { + allow: function (view, domainObject) { + if (view.key === 'imagery') { + return hasImageTelemetry(domainObject); + } + + return true; + } + }; + } + + return ImageryViewPolicy; + } +); From 277533b4bf3c3a79017879423cf90f87f0a0c466 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 9 Jun 2015 16:07:17 -0700 Subject: [PATCH 08/64] [Imagery] Begin adding controller Begin adding controller for Imagery view, WTD-1170. --- .../imagery/res/templates/imagery.html | 62 +++++++++++++- .../src/controllers/ImageryController.js | 82 +++++++++++++++++++ 2 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 platform/features/imagery/src/controllers/ImageryController.js diff --git a/platform/features/imagery/res/templates/imagery.html b/platform/features/imagery/res/templates/imagery.html index 48474e7dc5..908d461e96 100644 --- a/platform/features/imagery/res/templates/imagery.html +++ b/platform/features/imagery/res/templates/imagery.html @@ -1 +1,61 @@ -Hello imagery! +
+ +
+ + + + +
+
+
+ + UTC + 16:03:43 + 2020/04/27 +
+
+ + +
+
+
+
diff --git a/platform/features/imagery/src/controllers/ImageryController.js b/platform/features/imagery/src/controllers/ImageryController.js new file mode 100644 index 0000000000..f6fbcdb871 --- /dev/null +++ b/platform/features/imagery/src/controllers/ImageryController.js @@ -0,0 +1,82 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define( + [], + function () { + "use strict"; + + function ImageryController($scope, telemetryHandler, telemetryFormatter) { + var timestamp = "", + imageUrl = "", + handle; + + function releaseSubscription() { + if (handle) { + handle.unsubscribe(); + handle = undefined; + } + } + + function updateValues() { + var imageObject = handle && handle.getTelemetryObjects()[0]; + if (imageObject) { + timestamp = telemetryFormatter.formatDomainValue( + handle.getDomainValue(imageObject) + ); + imageUrl = handle.getRangeValue(imageObject); + } + } + + // Create a new subscription; telemetrySubscriber gets + // to do the meaningful work here. + function subscribe(domainObject) { + releaseSubscription(); + timestamp = ""; + imageUrl = ""; + handle = domainObject && telemetryHandler.handle( + domainObject, + updateValues, + true // Lossless + ); + } + + // Subscribe to telemetry when a domain object becomes available + $scope.$watch('domainObject', subscribe); + + // Unsubscribe when the plot is destroyed + $scope.$on("$destroy", releaseSubscription); + + return { + getTimestamp: function () { + return timestamp; + }, + getImageUrl: function () { + return imageUrl; + } + }; + } + + return ImageryController; + } +); From ee542293b9b469b509ecddf237377c41f3952da7 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 9 Jun 2015 16:31:51 -0700 Subject: [PATCH 09/64] [Imagery] Display image updates WTD-1170. --- platform/features/imagery/bundle.json | 7 ++++ .../imagery/res/templates/imagery.html | 10 +++--- .../src/controllers/ImageryController.js | 32 +++++++++++++------ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/platform/features/imagery/bundle.json b/platform/features/imagery/bundle.json index fb59503a9d..034e3f8313 100644 --- a/platform/features/imagery/bundle.json +++ b/platform/features/imagery/bundle.json @@ -15,6 +15,13 @@ "category": "view", "implementation": "policies/ImageryViewPolicy.js" } + ], + "controllers": [ + { + "key": "ImageryController", + "implementation": "controllers/ImageryController.js", + "depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ] + } ] } } diff --git a/platform/features/imagery/res/templates/imagery.html b/platform/features/imagery/res/templates/imagery.html index 908d461e96..bd192488a4 100644 --- a/platform/features/imagery/res/templates/imagery.html +++ b/platform/features/imagery/res/templates/imagery.html @@ -1,4 +1,4 @@ -
+
@@ -39,9 +39,9 @@ class="t-btn l-btn s-btn s-icon-btn s-very-subtle show-thumbs sm" ng-click="showThumbsBubble = (showThumbsBubble)? false:true" > - UTC - 16:03:43 - 2020/04/27 + {{imagery.getZone()}} + {{imagery.getTime()}} + {{imagery.getDate()}}
- -
+ +
'); + div = element.children().eq(0); + } + + return { + scope: { src: "=" }, + link: link + }; + } + + } +); From 0cb439df19ba95e0b3dc6b5525e87df5962a6c4e Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 12 Jun 2015 12:11:47 -0700 Subject: [PATCH 12/64] [Imagery] Add imagery to active bundles WTD-1170. --- bundles.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bundles.json b/bundles.json index 666e520854..1e7030f5b4 100644 --- a/bundles.json +++ b/bundles.json @@ -9,6 +9,7 @@ "platform/commonUI/general", "platform/containment", "platform/telemetry", + "platform/features/imagery", "platform/features/layout", "platform/features/pages", "platform/features/plot", @@ -17,6 +18,7 @@ "platform/persistence/queue", "platform/policy", + "example/imagery", "example/persistence", "example/generator" ] From 0ae1ba4a407337ab1f089af603cc47a75ab9248a Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 10:16:59 -0700 Subject: [PATCH 13/64] [Edit] Don't wrap non-editable objects In Edit mode, don't bother wrapping domain objects which should not be edited even in principle. Avoids insulating these objects from updates which occur asynchronously, which in turn avoids WTD-1291. --- .../src/objects/EditableDomainObjectCache.js | 9 +++++++- .../test/controllers/EditControllerSpec.js | 17 ++++++++------ .../objects/EditableDomainObjectCacheSpec.js | 23 ++++++++++++++++--- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/platform/commonUI/edit/src/objects/EditableDomainObjectCache.js b/platform/commonUI/edit/src/objects/EditableDomainObjectCache.js index 6a4e5d4de3..a13a3e2360 100644 --- a/platform/commonUI/edit/src/objects/EditableDomainObjectCache.js +++ b/platform/commonUI/edit/src/objects/EditableDomainObjectCache.js @@ -68,6 +68,8 @@ define( * @returns {DomainObject} the domain object in an editable form */ getEditableObject: function (domainObject) { + var type = domainObject.getCapability('type'); + // Track the top-level domain object; this will have // some special behavior for its context capability. root = root || domainObject; @@ -77,6 +79,11 @@ define( return domainObject; } + // Don't bother wrapping non-editable objects + if (!type || !type.hasFeature('creation')) { + return domainObject; + } + // Provide an editable form of the object return new EditableDomainObject( domainObject, @@ -142,4 +149,4 @@ define( return EditableDomainObjectCache; } -); \ No newline at end of file +); diff --git a/platform/commonUI/edit/test/controllers/EditControllerSpec.js b/platform/commonUI/edit/test/controllers/EditControllerSpec.js index 260bfbd944..4e66cebd08 100644 --- a/platform/commonUI/edit/test/controllers/EditControllerSpec.js +++ b/platform/commonUI/edit/test/controllers/EditControllerSpec.js @@ -31,7 +31,7 @@ define( mockQ, mockNavigationService, mockObject, - mockCapability, + mockType, controller; beforeEach(function () { @@ -48,15 +48,18 @@ define( "domainObject", [ "getId", "getModel", "getCapability", "hasCapability" ] ); - mockCapability = jasmine.createSpyObj( - "capability", - [ "invoke" ] + mockType = jasmine.createSpyObj( + "type", + [ "hasFeature" ] ); mockNavigationService.getNavigation.andReturn(mockObject); mockObject.getId.andReturn("test"); mockObject.getModel.andReturn({ name: "Test object" }); - mockObject.getCapability.andReturn(mockCapability); + mockObject.getCapability.andCallFake(function (key) { + return key === 'type' && mockType; + }); + mockType.hasFeature.andReturn(true); controller = new EditController( mockScope, @@ -76,7 +79,7 @@ define( .toBeDefined(); // Shouldn't have been the mock capability we provided expect(controller.navigatedObject().getCapability("editor")) - .not.toEqual(mockCapability); + .not.toEqual(mockType); }); it("detaches its navigation listener when destroyed", function () { @@ -119,4 +122,4 @@ define( }); } -); \ No newline at end of file +); diff --git a/platform/commonUI/edit/test/objects/EditableDomainObjectCacheSpec.js b/platform/commonUI/edit/test/objects/EditableDomainObjectCacheSpec.js index 586b666b02..39cac56d9f 100644 --- a/platform/commonUI/edit/test/objects/EditableDomainObjectCacheSpec.js +++ b/platform/commonUI/edit/test/objects/EditableDomainObjectCacheSpec.js @@ -32,6 +32,7 @@ define( completionCapability, object, mockQ, + mockType, cache; @@ -40,10 +41,13 @@ define( return { getId: function () { return id; }, getModel: function () { return {}; }, - getCapability: function (name) { - return completionCapability; + getCapability: function (key) { + return { + editor: completionCapability, + type: mockType + }[key]; }, - hasCapability: function (name) { + hasCapability: function (key) { return false; } }; @@ -62,6 +66,8 @@ define( beforeEach(function () { mockQ = jasmine.createSpyObj('$q', ['when', 'all']); + mockType = jasmine.createSpyObj('type', ['hasFeature']); + mockType.hasFeature.andReturn(true); captured = {}; completionCapability = { save: function () { @@ -152,6 +158,17 @@ define( .toBe(wrappedObject); }); + it("does not wrap non-editable objects", function () { + var domainObject = new TestObject('test-id'); + + mockType.hasFeature.andCallFake(function (key) { + return key !== 'creation'; + }); + + expect(cache.getEditableObject(domainObject)) + .toBe(domainObject); + }); + }); } From 5a4a912f79b5648e4f1adf2fb6884dadda8c6e2c Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 20:12:04 -0700 Subject: [PATCH 14/64] [Imagery] Only display images when loaded Wait until image telemetry is completely loaded before displaying it, WTD-1170. --- platform/features/imagery/bundle.json | 7 ++ .../imagery/res/templates/imagery.html | 4 +- .../src/directives/MCTBackgroundImage.js | 89 +++++++++++++++++++ .../imagery/src/directives/MCTImage.js | 53 ----------- 4 files changed, 99 insertions(+), 54 deletions(-) create mode 100644 platform/features/imagery/src/directives/MCTBackgroundImage.js delete mode 100644 platform/features/imagery/src/directives/MCTImage.js diff --git a/platform/features/imagery/bundle.json b/platform/features/imagery/bundle.json index 034e3f8313..68c5b27596 100644 --- a/platform/features/imagery/bundle.json +++ b/platform/features/imagery/bundle.json @@ -22,6 +22,13 @@ "implementation": "controllers/ImageryController.js", "depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ] } + ], + "directives": [ + { + "key": "mctBackgroundImage", + "implementation": "directives/MCTBackgroundImage.js", + "depends": [ "$document" ] + } ] } } diff --git a/platform/features/imagery/res/templates/imagery.html b/platform/features/imagery/res/templates/imagery.html index 13864d5375..ae91f9c854 100644 --- a/platform/features/imagery/res/templates/imagery.html +++ b/platform/features/imagery/res/templates/imagery.html @@ -29,13 +29,15 @@
+
'); - div = element.children().eq(0); - } - - return { - scope: { src: "=" }, - link: link - }; - } - - } -); From 12954f8fc3408ebbf1563a7fdb53641a326ff6e6 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 20:21:53 -0700 Subject: [PATCH 15/64] [Imagery] Add open-in-new-tab button Add button to open current telemetry image in a new tab, WTD-1282 (in the context of WTD-1170.) --- .../features/imagery/res/templates/imagery.html | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/platform/features/imagery/res/templates/imagery.html b/platform/features/imagery/res/templates/imagery.html index ae91f9c854..80f0813b2b 100644 --- a/platform/features/imagery/res/templates/imagery.html +++ b/platform/features/imagery/res/templates/imagery.html @@ -7,7 +7,7 @@ > - +
+ + y Date: Wed, 17 Jun 2015 20:31:47 -0700 Subject: [PATCH 16/64] [Imagery] Add JSDoc Add JSDoc to classes implementing the Imagery view, WTD-1170. --- platform/features/imagery/bundle.json | 5 +-- .../src/controllers/ImageryController.js | 34 +++++++++++++++++-- .../imagery/src/policies/ImageryViewPolicy.js | 5 +++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/platform/features/imagery/bundle.json b/platform/features/imagery/bundle.json index 68c5b27596..8d8495aa3a 100644 --- a/platform/features/imagery/bundle.json +++ b/platform/features/imagery/bundle.json @@ -5,8 +5,9 @@ { "name": "Imagery", "key": "imagery", - "glyph": "I", + "glyph": "\u00E3", "templateUrl": "templates/imagery.html", + "priority": "preferred", "needs": [ "telemetry" ] } ], @@ -20,7 +21,7 @@ { "key": "ImageryController", "implementation": "controllers/ImageryController.js", - "depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ] + "depends": [ "$scope", "telemetryHandler" ] } ], "directives": [ diff --git a/platform/features/imagery/src/controllers/ImageryController.js b/platform/features/imagery/src/controllers/ImageryController.js index 6fd6bc7cf5..77559ef151 100644 --- a/platform/features/imagery/src/controllers/ImageryController.js +++ b/platform/features/imagery/src/controllers/ImageryController.js @@ -27,9 +27,13 @@ define( "use strict"; var DATE_FORMAT = "YYYY-DDD", - TIME_FORMAT = "HH:mm:ss"; + TIME_FORMAT = "HH:mm:ss.SSS"; - function ImageryController($scope, telemetryHandler, telemetryFormatter) { + /** + * Controller for the "Imagery" view of a domain object which + * provides image telemetry. + */ + function ImageryController($scope, telemetryHandler) { var date = "", time = "", imageUrl = "", @@ -75,18 +79,44 @@ define( $scope.$on("$destroy", releaseSubscription); return { + /** + * Get the time portion (hours, minutes, seconds) of the + * timestamp associated with the incoming image telemetry. + * @returns {string} the time + */ getTime: function () { return time; }, + /** + * Get the date portion (month, year) of the + * timestamp associated with the incoming image telemetry. + * @returns {string} the date + */ getDate: function () { return date; }, + /** + * Get the time zone for the displayed time/date corresponding + * to the timestamp associated with the incoming image + * telemetry. + * @returns {string} the time + */ getZone: function () { return "UTC"; }, + /** + * Get the URL of the image telemetry to display. + * @returns {string} URL for telemetry image + */ getImageUrl: function () { return imageUrl; }, + /** + * Getter-setter for paused state of the view (true means + * paused, false means not.) + * @param {boolean} [state] the state to set + * @returns {boolean} the current state + */ paused: function (state) { if (arguments.length > 0 && state !== paused) { paused = state; diff --git a/platform/features/imagery/src/policies/ImageryViewPolicy.js b/platform/features/imagery/src/policies/ImageryViewPolicy.js index 522d323333..ee51d5fe81 100644 --- a/platform/features/imagery/src/policies/ImageryViewPolicy.js +++ b/platform/features/imagery/src/policies/ImageryViewPolicy.js @@ -25,6 +25,11 @@ define( function () { "use strict"; + /** + * Policy preventing the Imagery view from being made available for + * domain objects which do not have associated image telemetry. + * @implements {Policy} + */ function ImageryViewPolicy() { function hasImageTelemetry(domainObject) { var telemetry = domainObject && From 8aa25a929a88ec13e013b1bcbb67dc3dcb0e7b19 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 20:35:17 -0700 Subject: [PATCH 17/64] [Imagery] Add skeleton specs Add skeleton specs for the Imagery view of telemetry, WTD-1170. --- .../test/controllers/ImageryControllerSpec.js | 34 +++++++++++++++++ .../test/directives/MCTBackgroundImageSpec.js | 34 +++++++++++++++++ .../test/policies/ImageryViewPolicySpec.js | 37 +++++++++++++++++++ platform/features/imagery/test/suite.json | 5 +++ 4 files changed, 110 insertions(+) create mode 100644 platform/features/imagery/test/controllers/ImageryControllerSpec.js create mode 100644 platform/features/imagery/test/directives/MCTBackgroundImageSpec.js create mode 100644 platform/features/imagery/test/policies/ImageryViewPolicySpec.js create mode 100644 platform/features/imagery/test/suite.json diff --git a/platform/features/imagery/test/controllers/ImageryControllerSpec.js b/platform/features/imagery/test/controllers/ImageryControllerSpec.js new file mode 100644 index 0000000000..3e8ee37e1b --- /dev/null +++ b/platform/features/imagery/test/controllers/ImageryControllerSpec.js @@ -0,0 +1,34 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine,xit*/ + +define( + ["../../src/controllers/ImageryController"], + function (ImageryController) { + "use strict"; + + describe("The Imagery controller", function () { + + }); + } +); + diff --git a/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js b/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js new file mode 100644 index 0000000000..c7561238f0 --- /dev/null +++ b/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js @@ -0,0 +1,34 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine,xit*/ + +define( + ["../../src/directives/MCTBackgroundImage"], + function (MCTBackgroundImage) { + "use strict"; + + describe("The mct-background-image directive", function () { + + }); + } +); + diff --git a/platform/features/imagery/test/policies/ImageryViewPolicySpec.js b/platform/features/imagery/test/policies/ImageryViewPolicySpec.js new file mode 100644 index 0000000000..7a22809f10 --- /dev/null +++ b/platform/features/imagery/test/policies/ImageryViewPolicySpec.js @@ -0,0 +1,37 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine,xit*/ + +define( + ["../../src/policies/ImageryViewPolicy"], + function (ImageryViewPolicy) { + "use strict"; + + describe("Imagery view policy", function () { + var testView, + mockDomainObject, + mockTelemetry, + policy; + }); + } +); + diff --git a/platform/features/imagery/test/suite.json b/platform/features/imagery/test/suite.json new file mode 100644 index 0000000000..4ea822e7a2 --- /dev/null +++ b/platform/features/imagery/test/suite.json @@ -0,0 +1,5 @@ +[ + "controllers/ImageryController", + "directives/MCTBackgroundImage", + "policies/ImageryViewPolicy" +] From c41db4f22b12aa18e16a11557aa3d19f0e236b27 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 20:41:40 -0700 Subject: [PATCH 18/64] [Imagery] Test policy Test policy which restricts the Imagery view to domain objects which have image telemetry. WTD-1170. --- .../test/policies/ImageryViewPolicySpec.js | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/platform/features/imagery/test/policies/ImageryViewPolicySpec.js b/platform/features/imagery/test/policies/ImageryViewPolicySpec.js index 7a22809f10..21e64cc324 100644 --- a/platform/features/imagery/test/policies/ImageryViewPolicySpec.js +++ b/platform/features/imagery/test/policies/ImageryViewPolicySpec.js @@ -30,7 +30,50 @@ define( var testView, mockDomainObject, mockTelemetry, + testMetadata, policy; + + beforeEach(function () { + testView = { key: "imagery" }; + testMetadata = {}; + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getId', 'getModel', 'getCapability'] + ); + mockTelemetry = jasmine.createSpyObj( + 'telemetry', + ['getMetadata'] + ); + mockDomainObject.getCapability.andCallFake(function (c) { + return c === 'telemetry' ? mockTelemetry : undefined; + }); + mockTelemetry.getMetadata.andReturn(testMetadata); + + policy = new ImageryViewPolicy(); + }); + + it("allows the imagery view for domain objects with image telemetry", function () { + testMetadata.ranges = [ { key: "foo", format: "imageUrl" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeTruthy(); + }); + + it("disallows the imagery view for domain objects without image telemetry", function () { + testMetadata.ranges = [ { key: "foo", format: "somethingElse" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeFalsy(); + }); + + it("disallows the imagery view for domain objects without telemetry", function () { + testMetadata.ranges = [ { key: "foo", format: "imageUrl" } ]; + mockDomainObject.getCapability.andReturn(undefined); + expect(policy.allow(testView, mockDomainObject)).toBeFalsy(); + }); + + it("allows other views", function () { + testView.key = "somethingElse"; + testMetadata.ranges = [ { key: "foo", format: "somethingElse" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeTruthy(); + }); + }); } ); From ba88281bd009e72f9c4c7f498c5f11539687f936 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 20:51:41 -0700 Subject: [PATCH 19/64] [Imagery] Test mct-background-image WTD-1170. --- .../test/directives/MCTBackgroundImageSpec.js | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js b/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js index c7561238f0..3c55f6f480 100644 --- a/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js +++ b/platform/features/imagery/test/directives/MCTBackgroundImageSpec.js @@ -27,7 +27,74 @@ define( "use strict"; describe("The mct-background-image directive", function () { + var mockDocument, + mockScope, + mockElement, + testImage, + directive; + beforeEach(function () { + mockDocument = [ + jasmine.createSpyObj('document', ['createElement']) + ]; + mockScope = jasmine.createSpyObj('scope', ['$watch']); + mockElement = jasmine.createSpyObj('element', [ 'css' ]); + testImage = {}; + + mockDocument[0].createElement.andReturn(testImage); + + directive = new MCTBackgroundImage(mockDocument); + }); + + it("is applicable as an attribute", function () { + expect(directive.restrict).toEqual("A"); + }); + + it("two-way-binds its own value", function () { + expect(directive.scope.mctBackgroundImage).toEqual("="); + }); + + it("watches for changes to the URL", function () { + directive.link(mockScope, mockElement, {}); + expect(mockScope.$watch).toHaveBeenCalledWith( + 'mctBackgroundImage', + jasmine.any(Function) + ); + }); + + it("updates images in-order, even when they load out-of-order", function () { + var firstOnload; + + directive.link(mockScope, mockElement); + + mockScope.$watch.mostRecentCall.args[1]("some/url/0"); + firstOnload = testImage.onload; + + mockScope.$watch.mostRecentCall.args[1]("some/url/1"); + + // Resolve in a different order + testImage.onload(); + firstOnload(); + + // Should still have taken the more recent value + expect(mockElement.css.mostRecentCall.args).toEqual([ + "background-image", + "url('some/url/1')" + ]); + }); + + it("clears the background image when undefined is passed in", function () { + directive.link(mockScope, mockElement); + + mockScope.$watch.mostRecentCall.args[1]("some/url/0"); + testImage.onload(); + mockScope.$watch.mostRecentCall.args[1](undefined); + + expect(mockElement.css.mostRecentCall.args).toEqual([ + "background-image", + undefined + ]); + }); }); } ); From 897433f71723deab49af245d9fbef41b580bd1d1 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 17 Jun 2015 21:15:17 -0700 Subject: [PATCH 20/64] [Imagery] Test ImageryController WTD-1170. --- .../src/controllers/ImageryController.js | 2 +- .../test/controllers/ImageryControllerSpec.js | 118 ++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/platform/features/imagery/src/controllers/ImageryController.js b/platform/features/imagery/src/controllers/ImageryController.js index 77559ef151..72f72f39db 100644 --- a/platform/features/imagery/src/controllers/ImageryController.js +++ b/platform/features/imagery/src/controllers/ImageryController.js @@ -26,7 +26,7 @@ define( function (moment) { "use strict"; - var DATE_FORMAT = "YYYY-DDD", + var DATE_FORMAT = "YYYY-MM-DD", TIME_FORMAT = "HH:mm:ss.SSS"; /** diff --git a/platform/features/imagery/test/controllers/ImageryControllerSpec.js b/platform/features/imagery/test/controllers/ImageryControllerSpec.js index 3e8ee37e1b..9bb00d6b20 100644 --- a/platform/features/imagery/test/controllers/ImageryControllerSpec.js +++ b/platform/features/imagery/test/controllers/ImageryControllerSpec.js @@ -27,6 +27,124 @@ define( "use strict"; describe("The Imagery controller", function () { + var mockScope, + mockTelemetryHandler, + mockHandle, + mockDomainObject, + controller; + + function invokeWatch(expr, value) { + mockScope.$watch.calls.forEach(function (call) { + if (call.args[0] === expr) { + call.args[1](value); + } + }); + } + + beforeEach(function () { + mockScope = jasmine.createSpyObj('$scope', ['$on', '$watch']); + mockTelemetryHandler = jasmine.createSpyObj( + 'telemetryHandler', + ['handle'] + ); + mockHandle = jasmine.createSpyObj( + 'handle', + [ + 'getDomainValue', + 'getRangeValue', + 'getTelemetryObjects', + 'unsubscribe' + ] + ); + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getId', 'getModel', 'getCapability'] + ); + + mockTelemetryHandler.handle.andReturn(mockHandle); + mockHandle.getTelemetryObjects.andReturn([mockDomainObject]); + + controller = new ImageryController( + mockScope, + mockTelemetryHandler + ); + invokeWatch('domainObject', mockDomainObject); + }); + + it("unsubscribes when scope is destroyed", function () { + expect(mockHandle.unsubscribe).not.toHaveBeenCalled(); + + // Find the $destroy listener and call it + mockScope.$on.calls.forEach(function (call) { + if (call.args[0] === '$destroy') { + call.args[1](); + } + }); + expect(mockHandle.unsubscribe).toHaveBeenCalled(); + }); + + it("exposes the latest telemetry values", function () { + // 06/18/2015 4:04am UTC + var testTimestamp = 1434600258123, + testUrl = "some/url", + nextTimestamp = 1434600259456, // 4:05.456 + nextUrl = "some/other/url"; + + mockHandle.getDomainValue.andReturn(testTimestamp); + mockHandle.getRangeValue.andReturn(testUrl); + + // Call the subscription listener + mockTelemetryHandler.handle.mostRecentCall.args[1](); + + expect(controller.getTime()).toEqual("04:04:18.123"); + expect(controller.getDate()).toEqual("2015-06-18"); + expect(controller.getZone()).toEqual("UTC"); + expect(controller.getImageUrl()).toEqual(testUrl); + + mockHandle.getDomainValue.andReturn(nextTimestamp); + mockHandle.getRangeValue.andReturn(nextUrl); + mockTelemetryHandler.handle.mostRecentCall.args[1](); + + expect(controller.getTime()).toEqual("04:04:19.456"); + expect(controller.getDate()).toEqual("2015-06-18"); + expect(controller.getZone()).toEqual("UTC"); + expect(controller.getImageUrl()).toEqual(nextUrl); + }); + + it("allows updates to be paused", function () { + // 06/18/2015 4:04am UTC + var testTimestamp = 1434600258123, + testUrl = "some/url", + nextTimestamp = 1434600259456, // 4:05.456 + nextUrl = "some/other/url"; + + // As above, but pause in between. Expect details + // not to change this time + + mockHandle.getDomainValue.andReturn(testTimestamp); + mockHandle.getRangeValue.andReturn(testUrl); + + // Call the subscription listener + mockTelemetryHandler.handle.mostRecentCall.args[1](); + + expect(controller.getTime()).toEqual("04:04:18.123"); + expect(controller.getDate()).toEqual("2015-06-18"); + expect(controller.getZone()).toEqual("UTC"); + expect(controller.getImageUrl()).toEqual(testUrl); + + expect(controller.paused()).toBeFalsy(); + controller.paused(true); // Pause! + expect(controller.paused()).toBeTruthy(); + + mockHandle.getDomainValue.andReturn(nextTimestamp); + mockHandle.getRangeValue.andReturn(nextUrl); + mockTelemetryHandler.handle.mostRecentCall.args[1](); + + expect(controller.getTime()).toEqual("04:04:18.123"); + expect(controller.getDate()).toEqual("2015-06-18"); + expect(controller.getZone()).toEqual("UTC"); + expect(controller.getImageUrl()).toEqual(testUrl); + }); }); } From 0949ada734c8316c41ca645fa8fecf58da5d44e7 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 18 Jun 2015 09:46:54 -0700 Subject: [PATCH 21/64] [Frontend] Manual update of platform css, fonts and sass only from open-master WTD-1170 --- platform/commonUI/general/res/css/forms.css | 82 +- platform/commonUI/general/res/css/items.css | 101 +- .../general/res/css/theme-espresso.css | 1637 ++++++++++------- platform/commonUI/general/res/css/tree.css | 32 +- .../general/res/fonts/symbols/wtdsymbols.eot | Bin 10676 -> 10760 bytes .../general/res/fonts/symbols/wtdsymbols.svg | 5 +- .../general/res/fonts/symbols/wtdsymbols.ttf | Bin 10512 -> 10596 bytes .../general/res/fonts/symbols/wtdsymbols.woff | Bin 7308 -> 7384 bytes .../commonUI/general/res/sass/_constants.scss | 19 +- .../commonUI/general/res/sass/_global.scss | 4 + .../res/sass/_hide-non-functional.scss | 2 +- .../commonUI/general/res/sass/_icons.scss | 35 +- platform/commonUI/general/res/sass/_main.scss | 2 + .../commonUI/general/res/sass/_mixins.scss | 63 +- .../general/res/sass/controls/_buttons.scss | 70 +- .../general/res/sass/controls/_controls.scss | 230 +-- .../general/res/sass/controls/_menus.scss | 4 +- .../res/sass/features/_time-display.scss | 44 + .../general/res/sass/helpers/_bubbles.scss | 70 +- .../general/res/sass/items/_item.scss | 2 +- .../commonUI/general/res/sass/tree/_tree.scss | 9 +- .../general/res/sass/user-environ/_frame.scss | 22 +- 22 files changed, 1382 insertions(+), 1051 deletions(-) create mode 100644 platform/commonUI/general/res/sass/features/_time-display.scss diff --git a/platform/commonUI/general/res/css/forms.css b/platform/commonUI/general/res/css/forms.css index 903a2694f0..c0acb2a4c3 100644 --- a/platform/commonUI/general/res/css/forms.css +++ b/platform/commonUI/general/res/css/forms.css @@ -61,6 +61,15 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ +/* +@mixin invokeMenu($baseColor: $colorBodyFg) { + $c: $baseColor; + color: $c; + &:hover { + color: lighten($c, $ltGamma); + } +} +*/ /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -186,9 +195,9 @@ color: #666666; } /* line 116, ../sass/forms/_elems.scss */ .form .form-row .selector-list { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -225,9 +234,9 @@ label.form-control.checkbox input { vertical-align: top; } /* line 159, ../sass/forms/_elems.scss */ .l-result div.s-hint { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; background: rgba(255, 153, 0, 0.8); display: block; color: #ffd699; @@ -258,9 +267,9 @@ label.form-control.checkbox input { .edit-main textarea { -moz-appearance: none; -webkit-appearance: none; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -305,9 +314,9 @@ label.form-control.checkbox input { input[type="text"] { -moz-appearance: none; -webkit-appearance: none; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -350,23 +359,23 @@ input[type="text"] { *****************************************************************************/ /* line 22, ../sass/forms/_selects.scss */ .form-control.select { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ1NDU0NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525252), color-stop(100%, #454545)); + background-image: -moz-linear-gradient(#525252, #454545); + background-image: -webkit-linear-gradient(#525252, #454545); + background-image: linear-gradient(#525252, #454545); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #666666; + border-top: 1px solid #575757; color: #999; display: inline-block; cursor: pointer; @@ -374,14 +383,21 @@ input[type="text"] { margin: 0 0 2px 2px; overflow: hidden; position: relative; } - /* line 173, ../sass/_mixins.scss */ + /* line 152, ../sass/_mixins.scss */ .form-control.select:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYzNjM2MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU3NTc1NyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#666666, #4d4d4d); - background-image: -webkit-linear-gradient(#666666, #4d4d4d); - background-image: linear-gradient(#666666, #4d4d4d); } + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #636363), color-stop(100%, #575757)); + background-image: -moz-linear-gradient(#636363, #575757); + background-image: -webkit-linear-gradient(#636363, #575757); + background-image: linear-gradient(#636363, #575757); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .form-control.select:not(.disabled):hover.btn-menu .invoke-menu { + color: #878787; } + /* line 160, ../sass/_mixins.scss */ + .form-control.select.btn-menu .invoke-menu { + color: #757575; } /* line 29, ../sass/forms/_selects.scss */ .form-control.select select { -moz-appearance: none; @@ -438,9 +454,9 @@ input[type="text"] { .channel-selector .treeview { -moz-appearance: none; -webkit-appearance: none; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; diff --git a/platform/commonUI/general/res/css/items.css b/platform/commonUI/general/res/css/items.css index 875fe8488f..4d6abee562 100644 --- a/platform/commonUI/general/res/css/items.css +++ b/platform/commonUI/general/res/css/items.css @@ -61,6 +61,15 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ +/* +@mixin invokeMenu($baseColor: $colorBodyFg) { + $c: $baseColor; + color: $c; + &:hover { + color: lighten($c, $ltGamma); + } +} +*/ /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -92,23 +101,23 @@ top: 0; } /* line 29, ../sass/items/_item.scss */ .items-holder .item.grid-item { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #595959), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#595959, #4d4d4d); - background-image: -webkit-linear-gradient(#595959, #4d4d4d); - background-image: linear-gradient(#595959, #4d4d4d); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e), color-stop(100%, #525252)); + background-image: -moz-linear-gradient(#5e5e5e, #525252); + background-image: -webkit-linear-gradient(#5e5e5e, #525252); + background-image: linear-gradient(#5e5e5e, #525252); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #737373; + border-top: 1px solid #636363; color: #999; display: inline-block; box-sizing: border-box; @@ -119,14 +128,21 @@ margin-bottom: 3px; margin-right: 3px; position: relative; } - /* line 173, ../sass/_mixins.scss */ + /* line 152, ../sass/_mixins.scss */ .items-holder .item.grid-item:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzczNzM3MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzcwNzA3MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzYzNjM2MyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #737373), color-stop(100%, #595959)); - background-image: -moz-linear-gradient(#737373, #595959); - background-image: -webkit-linear-gradient(#737373, #595959); - background-image: linear-gradient(#737373, #595959); } + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #707070), color-stop(100%, #636363)); + background-image: -moz-linear-gradient(#707070, #636363); + background-image: -webkit-linear-gradient(#707070, #636363); + background-image: linear-gradient(#707070, #636363); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .items-holder .item.grid-item:not(.disabled):hover.btn-menu .invoke-menu { + color: #949494; } + /* line 160, ../sass/_mixins.scss */ + .items-holder .item.grid-item.btn-menu .invoke-menu { + color: #828282; } /* line 42, ../sass/items/_item.scss */ .items-holder .item.grid-item:hover .item-main .item-type { color: #0099cc !important; } @@ -184,40 +200,41 @@ font-size: 0.8em; } /* line 104, ../sass/items/_item.scss */ .items-holder .item.grid-item.selected { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYWNlNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzBhYzJmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYjRmMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00bfff), color-stop(100%, #00ace6)); - background-image: -moz-linear-gradient(#00bfff, #00ace6); - background-image: -webkit-linear-gradient(#00bfff, #00ace6); - background-image: linear-gradient(#00bfff, #00ace6); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0ac2ff), color-stop(100%, #00b4f0)); + background-image: -moz-linear-gradient(#0ac2ff, #00b4f0); + background-image: -webkit-linear-gradient(#0ac2ff, #00b4f0); + background-image: linear-gradient(#0ac2ff, #00b4f0); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #33ccff; + border-top: 1px solid #14c4ff; color: #999; display: inline-block; - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMzY2NmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwOTljYyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #33ccff), color-stop(100%, #0099cc)); - background-image: -moz-linear-gradient(#33ccff, #0099cc); - background-image: -webkit-linear-gradient(#33ccff, #0099cc); - background-image: linear-gradient(#33ccff, #0099cc); color: #80dfff; } - /* line 181, ../sass/_mixins.scss */ + /* line 152, ../sass/_mixins.scss */ .items-holder .item.grid-item.selected:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2ZDlmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJlY2JmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzE0YzRmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #66d9ff), color-stop(100%, #00bfff)); - background-image: -moz-linear-gradient(#66d9ff, #00bfff); - background-image: -webkit-linear-gradient(#66d9ff, #00bfff); - background-image: linear-gradient(#66d9ff, #00bfff); } + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ecbff), color-stop(100%, #14c4ff)); + background-image: -moz-linear-gradient(#2ecbff, #14c4ff); + background-image: -webkit-linear-gradient(#2ecbff, #14c4ff); + background-image: linear-gradient(#2ecbff, #14c4ff); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .items-holder .item.grid-item.selected:not(.disabled):hover.btn-menu .invoke-menu { + color: #75ddff; } + /* line 160, ../sass/_mixins.scss */ + .items-holder .item.grid-item.selected.btn-menu .invoke-menu { + color: #52d4ff; } /* line 109, ../sass/items/_item.scss */ .items-holder .item.grid-item.selected .item-type, .items-holder .item.grid-item.selected .top-bar .icon:not(.alert) { color: #80dfff; } diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index 6f511d129d..5a8bcac07a 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -84,7 +84,7 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 5, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 5, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, @@ -105,38 +105,38 @@ time, mark, audio, video { font-size: 100%; vertical-align: baseline; } -/* line 22, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 22, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html { line-height: 1; } -/* line 24, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 24, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 26, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 26, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ table { border-collapse: collapse; border-spacing: 0; } -/* line 28, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 28, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 30, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 30, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q, blockquote { quotes: none; } - /* line 103, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ + /* line 103, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } -/* line 32, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 32, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 116, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 116, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } @@ -161,6 +161,15 @@ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ +/* +@mixin invokeMenu($baseColor: $colorBodyFg) { + $c: $baseColor; + color: $c; + &:hover { + color: lighten($c, $ltGamma); + } +} +*/ /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -319,6 +328,10 @@ span { */ } /* line 72, ../sass/_global.scss */ +mct-container { + display: block; } + +/* line 76, ../sass/_global.scss */ .abs, .btn-menu span.l-click-area { position: absolute; top: 0; @@ -328,51 +341,51 @@ span { height: auto; width: auto; } -/* line 82, ../sass/_global.scss */ +/* line 86, ../sass/_global.scss */ .code, .codehilite { font-family: "Lucida Console", monospace; font-size: 0.7em; line-height: 150%; white-space: pre; } -/* line 89, ../sass/_global.scss */ +/* line 93, ../sass/_global.scss */ .codehilite { background-color: rgba(255, 255, 255, 0.1); padding: 1em; } -/* line 95, ../sass/_global.scss */ +/* line 99, ../sass/_global.scss */ .align-right { text-align: right; } -/* line 99, ../sass/_global.scss */ +/* line 103, ../sass/_global.scss */ .centered { text-align: center; } -/* line 103, ../sass/_global.scss */ +/* line 107, ../sass/_global.scss */ .no-margin { margin: 0; } -/* line 107, ../sass/_global.scss */ +/* line 111, ../sass/_global.scss */ .colorKey { color: #0099cc; } -/* line 111, ../sass/_global.scss */ +/* line 115, ../sass/_global.scss */ .ds { -moz-box-shadow: rgba(0, 0, 0, 0.7) 0 4px 10px 2px; -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 4px 10px 2px; box-shadow: rgba(0, 0, 0, 0.7) 0 4px 10px 2px; } -/* line 115, ../sass/_global.scss */ +/* line 119, ../sass/_global.scss */ .hide, .hidden { display: none !important; } -/* line 121, ../sass/_global.scss */ -.paused:not(.s-btn):not(.s-icon-btn) { +/* line 125, ../sass/_global.scss */ +.paused:not(.s-btn):not(.icon-btn) { border-color: #c56f01 !important; color: #c56f01 !important; } -/* line 127, ../sass/_global.scss */ +/* line 131, ../sass/_global.scss */ .sep { color: rgba(255, 255, 255, 0.2); } @@ -446,9 +459,9 @@ span { /* line 46, ../sass/user-environ/_layout.scss */ .editor { - -moz-border-radius: 4.5px; - -webkit-border-radius: 4.5px; - border-radius: 4.5px; } + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; } /* line 50, ../sass/user-environ/_layout.scss */ .contents { @@ -856,7 +869,8 @@ span { .s-about .s-logo-openmctweb { background-image: url("../images/logo-openmctweb-shdw.svg"); } /* line 81, ../sass/_about.scss */ - .s-about .s-btn, .s-about .s-icon-btn { + .s-about .s-btn, .s-about .icon-btn, + .s-about .s-icon-btn { line-height: 2em; } /* line 85, ../sass/_about.scss */ .s-about .l-licenses-software .l-license-software { @@ -957,9 +971,9 @@ span { /* line 29, ../sass/_badges.scss */ .top-bar .badge { - -moz-border-radius: 4.5px; - -webkit-border-radius: 4.5px; - border-radius: 4.5px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; font-size: 1.4em; height: 25px; line-height: 25px; @@ -975,12 +989,12 @@ span { background-image: -moz-linear-gradient(#00bfff, #0099cc); background-image: -webkit-linear-gradient(#00bfff, #0099cc); background-image: linear-gradient(#00bfff, #0099cc); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; padding: 2px 7px; } /***************************************************************************** @@ -1033,46 +1047,40 @@ span { .ui-symbol.icon.major { font-size: 1.65em; } -/* line 54, ../sass/_icons.scss */ +/* line 48, ../sass/_icons.scss */ .bar .icon { display: inline-block; } -/* line 58, ../sass/_icons.scss */ +/* line 52, ../sass/_icons.scss */ .invoke-menu { - color: #0099cc; + text-shadow: none; display: inline-block; - font-size: 1rem; + font-size: 0.8rem; vertical-align: middle; } - /* line 225, ../sass/_mixins.scss */ - .invoke-menu:hover { - color: #33ccff; } -/* line 65, ../sass/_icons.scss */ +/* line 60, ../sass/_icons.scss */ .btn-menu .invoke-menu, .icon.major .invoke-menu { - margin-left: 5px; } + margin-left: 3px; } -/* line 70, ../sass/_icons.scss */ -.icon-buttons-main .invoke-menu { - color: #666666; } - /* line 225, ../sass/_mixins.scss */ - .icon-buttons-main .invoke-menu:hover { - color: #999999; } - -/* line 78, ../sass/_icons.scss */ +/* .object-header .type-icon { - color: #0099cc; - margin-right: 5px; } - -/* line 83, ../sass/_icons.scss */ + color: $colorKey; + margin-right: $interiorMarginSm; +} +*/ +/* line 72, ../sass/_icons.scss */ .menu .type-icon, .tree-item .type-icon, -.icon-btn .menu.dropdown .icon, -.super-menu.menu.dropdown .icon { - font-size: 1.395rem; - line-height: 1.695rem; +.super-menu.menu .type-icon { + font-size: 1.12rem; + line-height: 1.582rem; position: absolute; } +/* line 81, ../sass/_icons.scss */ +.super-menu.menu.dropdown .icon { + font-size: 1.33rem; } + /*.s-limit-upr, .s-limit-lwr { $a: 0.5; @@ -1295,9 +1303,9 @@ span { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-border-radius: 2.25px; - -webkit-border-radius: 2.25px; - border-radius: 2.25px; + -moz-border-radius: 1.5px; + -webkit-border-radius: 1.5px; + border-radius: 1.5px; -moz-transition: background-color 0.25s; -o-transition: background-color 0.25s; -webkit-transition: background-color 0.25s; @@ -1338,107 +1346,364 @@ span { * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/*********************************** TYPE STYLES */ -/* line 25, ../sass/controls/_buttons.scss */ -.t-btn { - cursor: pointer; } +/******* LAYOUT AND SIZING */ +/* line 26, ../sass/controls/_buttons.scss */ +.btn, +.l-btn { + line-height: 1.25em; + padding: 0 7.5px; + text-decoration: none; } + /* line 31, ../sass/controls/_buttons.scss */ + .btn.lg, .btn.create-btn, + .l-btn.lg, + .l-btn.create-btn { + height: 25px; + line-height: 25px; + padding: 0 22.5px; } + /* line 39, ../sass/controls/_buttons.scss */ + .btn.create-btn .menu, + .l-btn.create-btn .menu { + margin-left: -7.5px; } + /* line 42, ../sass/controls/_buttons.scss */ + .btn.create-btn > .ui-symbol, + .l-btn.create-btn > .ui-symbol { + font-size: 1.1em; } + /* line 46, ../sass/controls/_buttons.scss */ + .btn.sm, + .l-btn.sm { + padding: 0 5px; } + /* line 49, ../sass/controls/_buttons.scss */ + .btn.vsm, + .l-btn.vsm { + padding: 0 2.5px; } /*********************************** STYLE STYLES */ -/* line 30, ../sass/controls/_buttons.scss */ -.s-btn, .s-icon-btn { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; +/* line 55, ../sass/controls/_buttons.scss */ +.btn, +.s-btn, +.icon-btn, +.s-icon-btn { + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; text-shadow: rgba(0, 0, 0, 0.3) 0 1px 1px; + cursor: pointer; line-height: 1.2em; text-decoration: none; } - /* line 36, ../sass/controls/_buttons.scss */ - .s-btn.s-very-subtle, .s-very-subtle.s-icon-btn { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + /* line 64, ../sass/controls/_buttons.scss */ + .btn.major, + .s-btn.major, + .major.icon-btn, + .major.s-icon-btn { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzBhYzJmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYjRmMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0ac2ff), color-stop(100%, #00b4f0)); + background-image: -moz-linear-gradient(#0ac2ff, #00b4f0); + background-image: -webkit-linear-gradient(#0ac2ff, #00b4f0); + background-image: linear-gradient(#0ac2ff, #00b4f0); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #666666; + border-top: 1px solid #14c4ff; color: #999; - display: inline-block; } - /* line 128, ../sass/_mixins.scss */ - .s-btn.s-very-subtle:hover, .s-very-subtle.s-icon-btn:hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + display: inline-block; + color: #ccf2ff; } + /* line 152, ../sass/_mixins.scss */ + .btn.major:not(.disabled):hover, + .s-btn.major:not(.disabled):hover, + .major.icon-btn:not(.disabled):hover, + .major.s-icon-btn:not(.disabled):hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJlY2JmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzE0YzRmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #595959)); - background-image: -moz-linear-gradient(#666666, #595959); - background-image: -webkit-linear-gradient(#666666, #595959); - background-image: linear-gradient(#666666, #595959); } - /* line 38, ../sass/controls/_buttons.scss */ - .s-btn.s-very-subtle.paused, .s-very-subtle.paused.s-icon-btn { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y4OGMwMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RlN2QwMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ecbff), color-stop(100%, #14c4ff)); + background-image: -moz-linear-gradient(#2ecbff, #14c4ff); + background-image: -webkit-linear-gradient(#2ecbff, #14c4ff); + background-image: linear-gradient(#2ecbff, #14c4ff); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .btn.major:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.major:not(.disabled):hover.btn-menu .invoke-menu, + .major.icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .major.s-icon-btn:not(.disabled):hover.btn-menu .invoke-menu { + color: #75ddff; } + /* line 160, ../sass/_mixins.scss */ + .btn.major.btn-menu .invoke-menu, + .s-btn.major.btn-menu .invoke-menu, + .major.btn-menu.icon-btn .invoke-menu, + .major.btn-menu.s-icon-btn .invoke-menu { + color: #52d4ff; } + /* line 69, ../sass/controls/_buttons.scss */ + .btn.major:hover, + .s-btn.major:hover, + .major.icon-btn:hover, + .major.s-icon-btn:hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzI0YzhmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzBhYzJmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f88c01), color-stop(100%, #de7d01)); - background-image: -moz-linear-gradient(#f88c01, #de7d01); - background-image: -webkit-linear-gradient(#f88c01, #de7d01); - background-image: linear-gradient(#f88c01, #de7d01); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #24c8ff), color-stop(100%, #0ac2ff)); + background-image: -moz-linear-gradient(#24c8ff, #0ac2ff); + background-image: -webkit-linear-gradient(#24c8ff, #0ac2ff); + background-image: linear-gradient(#24c8ff, #0ac2ff); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #fea32e; + border-top: 1px solid #2ecbff; + color: #ccf2ff; + display: inline-block; } + /* line 152, ../sass/_mixins.scss */ + .btn.major:hover:not(.disabled):hover, + .s-btn.major:hover:not(.disabled):hover, + .major.icon-btn:hover:not(.disabled):hover, + .major.s-icon-btn:hover:not(.disabled):hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzQ3ZDFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzJlY2JmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #47d1ff), color-stop(100%, #2ecbff)); + background-image: -moz-linear-gradient(#47d1ff, #2ecbff); + background-image: -webkit-linear-gradient(#47d1ff, #2ecbff); + background-image: linear-gradient(#47d1ff, #2ecbff); + color: white; } + /* line 155, ../sass/_mixins.scss */ + .btn.major:hover:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.major:hover:not(.disabled):hover.btn-menu .invoke-menu, + .major.icon-btn:hover:not(.disabled):hover.btn-menu .invoke-menu, + .major.s-icon-btn:hover:not(.disabled):hover.btn-menu .invoke-menu { + color: #8fe3ff; } + /* line 160, ../sass/_mixins.scss */ + .btn.major:hover.btn-menu .invoke-menu, + .s-btn.major:hover.btn-menu .invoke-menu, + .major.icon-btn:hover.btn-menu .invoke-menu, + .major.s-icon-btn:hover.btn-menu .invoke-menu { + color: #6bdaff; } + /* line 73, ../sass/controls/_buttons.scss */ + .btn.major .invoke-menu, + .s-btn.major .invoke-menu, + .major.icon-btn .invoke-menu, + .major.s-icon-btn .invoke-menu { + color: #ccf2ff; } + /* line 77, ../sass/controls/_buttons.scss */ + .btn.subtle, + .s-btn.subtle, + .subtle.icon-btn, + .subtle.s-icon-btn { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzg1ODU4NSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzc4Nzg3OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #858585), color-stop(100%, #787878)); + background-image: -moz-linear-gradient(#858585, #787878); + background-image: -webkit-linear-gradient(#858585, #787878); + background-image: linear-gradient(#858585, #787878); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + border: none; + border-top: 1px solid #8a8a8a; + color: #cccccc; + display: inline-block; } + /* line 152, ../sass/_mixins.scss */ + .btn.subtle:not(.disabled):hover, + .s-btn.subtle:not(.disabled):hover, + .subtle.icon-btn:not(.disabled):hover, + .subtle.s-icon-btn:not(.disabled):hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk2OTY5NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzhhOGE4YSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #969696), color-stop(100%, #8a8a8a)); + background-image: -moz-linear-gradient(#969696, #8a8a8a); + background-image: -webkit-linear-gradient(#969696, #8a8a8a); + background-image: linear-gradient(#969696, #8a8a8a); + color: #f0f0f0; } + /* line 155, ../sass/_mixins.scss */ + .btn.subtle:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.subtle:not(.disabled):hover.btn-menu .invoke-menu, + .subtle.icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .subtle.s-icon-btn:not(.disabled):hover.btn-menu .invoke-menu { + color: #bababa; } + /* line 160, ../sass/_mixins.scss */ + .btn.subtle.btn-menu .invoke-menu, + .s-btn.subtle.btn-menu .invoke-menu, + .subtle.btn-menu.icon-btn .invoke-menu, + .subtle.btn-menu.s-icon-btn .invoke-menu { + color: #a8a8a8; } + /* line 80, ../sass/controls/_buttons.scss */ + .btn.very-subtle, .btn.s-very-subtle, + .s-btn.very-subtle, + .very-subtle.icon-btn, + .very-subtle.s-icon-btn, + .s-btn.s-very-subtle, + .s-very-subtle.icon-btn, + .s-very-subtle.s-icon-btn { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ1NDU0NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525252), color-stop(100%, #454545)); + background-image: -moz-linear-gradient(#525252, #454545); + background-image: -webkit-linear-gradient(#525252, #454545); + background-image: linear-gradient(#525252, #454545); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + border: none; + border-top: 1px solid #575757; + color: #999; + display: inline-block; } + /* line 152, ../sass/_mixins.scss */ + .btn.very-subtle:not(.disabled):hover, .btn.s-very-subtle:not(.disabled):hover, + .s-btn.very-subtle:not(.disabled):hover, + .very-subtle.icon-btn:not(.disabled):hover, + .very-subtle.s-icon-btn:not(.disabled):hover, + .s-btn.s-very-subtle:not(.disabled):hover, + .s-very-subtle.icon-btn:not(.disabled):hover, + .s-very-subtle.s-icon-btn:not(.disabled):hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYzNjM2MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU3NTc1NyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #636363), color-stop(100%, #575757)); + background-image: -moz-linear-gradient(#636363, #575757); + background-image: -webkit-linear-gradient(#636363, #575757); + background-image: linear-gradient(#636363, #575757); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .btn.very-subtle:not(.disabled):hover.btn-menu .invoke-menu, .btn.s-very-subtle:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.very-subtle:not(.disabled):hover.btn-menu .invoke-menu, + .very-subtle.icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .very-subtle.s-icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.s-very-subtle:not(.disabled):hover.btn-menu .invoke-menu, + .s-very-subtle.icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .s-very-subtle.s-icon-btn:not(.disabled):hover.btn-menu .invoke-menu { + color: #878787; } + /* line 160, ../sass/_mixins.scss */ + .btn.very-subtle.btn-menu .invoke-menu, .btn.s-very-subtle.btn-menu .invoke-menu, + .s-btn.very-subtle.btn-menu .invoke-menu, + .very-subtle.btn-menu.icon-btn .invoke-menu, + .very-subtle.btn-menu.s-icon-btn .invoke-menu, + .s-btn.s-very-subtle.btn-menu .invoke-menu, + .s-very-subtle.btn-menu.icon-btn .invoke-menu, + .s-very-subtle.btn-menu.s-icon-btn .invoke-menu { + color: #757575; } + /* line 83, ../sass/controls/_buttons.scss */ + .btn.very-subtle.paused, .btn.s-very-subtle.paused, + .s-btn.very-subtle.paused, + .very-subtle.paused.icon-btn, + .very-subtle.paused.s-icon-btn, + .s-btn.s-very-subtle.paused, + .s-very-subtle.paused.icon-btn, + .s-very-subtle.paused.s-icon-btn { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlOTEwNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U5ODMwMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fe9105), color-stop(100%, #e98301)); + background-image: -moz-linear-gradient(#fe9105, #e98301); + background-image: -webkit-linear-gradient(#fe9105, #e98301); + background-image: linear-gradient(#fe9105, #e98301); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + border: none; + border-top: 1px solid #fe9510; color: #fff; display: inline-block; } - /* line 128, ../sass/_mixins.scss */ - .s-btn.s-very-subtle.paused:hover, .s-very-subtle.paused.s-icon-btn:hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlYTMyZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZlOTgxNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + /* line 152, ../sass/_mixins.scss */ + .btn.very-subtle.paused:not(.disabled):hover, .btn.s-very-subtle.paused:not(.disabled):hover, + .s-btn.very-subtle.paused:not(.disabled):hover, + .very-subtle.paused.icon-btn:not(.disabled):hover, + .very-subtle.paused.s-icon-btn:not(.disabled):hover, + .s-btn.s-very-subtle.paused:not(.disabled):hover, + .s-very-subtle.paused.icon-btn:not(.disabled):hover, + .s-very-subtle.paused.s-icon-btn:not(.disabled):hover { + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZlYTAyOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZlOTUxMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fea32e), color-stop(100%, #fe9815)); - background-image: -moz-linear-gradient(#fea32e, #fe9815); - background-image: -webkit-linear-gradient(#fea32e, #fe9815); - background-image: linear-gradient(#fea32e, #fe9815); } - /* line 40, ../sass/controls/_buttons.scss */ - .s-btn.s-very-subtle.paused .icon:before, .s-very-subtle.paused.s-icon-btn .icon:before { + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fea029), color-stop(100%, #fe9510)); + background-image: -moz-linear-gradient(#fea029, #fe9510); + background-image: -webkit-linear-gradient(#fea029, #fe9510); + background-image: linear-gradient(#fea029, #fe9510); + color: white; } + /* line 155, ../sass/_mixins.scss */ + .btn.very-subtle.paused:not(.disabled):hover.btn-menu .invoke-menu, .btn.s-very-subtle.paused:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.very-subtle.paused:not(.disabled):hover.btn-menu .invoke-menu, + .very-subtle.paused.icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .very-subtle.paused.s-icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .s-btn.s-very-subtle.paused:not(.disabled):hover.btn-menu .invoke-menu, + .s-very-subtle.paused.icon-btn:not(.disabled):hover.btn-menu .invoke-menu, + .s-very-subtle.paused.s-icon-btn:not(.disabled):hover.btn-menu .invoke-menu { + color: #fec070; } + /* line 160, ../sass/_mixins.scss */ + .btn.very-subtle.paused.btn-menu .invoke-menu, .btn.s-very-subtle.paused.btn-menu .invoke-menu, + .s-btn.very-subtle.paused.btn-menu .invoke-menu, + .very-subtle.paused.btn-menu.icon-btn .invoke-menu, + .very-subtle.paused.btn-menu.s-icon-btn .invoke-menu, + .s-btn.s-very-subtle.paused.btn-menu .invoke-menu, + .s-very-subtle.paused.btn-menu.icon-btn .invoke-menu, + .s-very-subtle.paused.btn-menu.s-icon-btn .invoke-menu { + color: #feb04d; } + /* line 85, ../sass/controls/_buttons.scss */ + .btn.very-subtle.paused .icon:before, .btn.s-very-subtle.paused .icon:before, + .s-btn.very-subtle.paused .icon:before, + .very-subtle.paused.icon-btn .icon:before, + .very-subtle.paused.s-icon-btn .icon:before, + .s-btn.s-very-subtle.paused .icon:before, + .s-very-subtle.paused.icon-btn .icon:before, + .s-very-subtle.paused.s-icon-btn .icon:before { content: "\0000EF"; } -/* line 47, ../sass/controls/_buttons.scss */ +/* line 92, ../sass/controls/_buttons.scss */ +.icon-btn, .s-icon-btn { - font-size: 1.2em; } - /* line 50, ../sass/controls/_buttons.scss */ + font-size: 1em; } + /* line 96, ../sass/controls/_buttons.scss */ + .icon-btn .icon, .s-icon-btn .icon { color: #0099cc; } - /* line 54, ../sass/controls/_buttons.scss */ + /* line 100, ../sass/controls/_buttons.scss */ + .icon-btn.paused .icon, .s-icon-btn.paused .icon { color: #fff; } - /* line 62, ../sass/controls/_buttons.scss */ + /* line 108, ../sass/controls/_buttons.scss */ + .icon-btn:not(.disabled):not(.paused):hover .icon, .s-icon-btn:not(.disabled):not(.paused):hover .icon { color: #33ccff; } - /* line 69, ../sass/controls/_buttons.scss */ + /* line 115, ../sass/controls/_buttons.scss */ + .icon-btn.labeled, .s-icon-btn.labeled { padding: 0 3.75px; } - /* line 71, ../sass/controls/_buttons.scss */ + /* line 117, ../sass/controls/_buttons.scss */ + .icon-btn.labeled .icon, .s-icon-btn.labeled .icon { font-size: 1.5em; } - /* line 74, ../sass/controls/_buttons.scss */ + /* line 120, ../sass/controls/_buttons.scss */ + .icon-btn.labeled .title-label, .s-icon-btn.labeled .title-label { margin-left: 5px; } - /* line 80, ../sass/controls/_buttons.scss */ + /* line 126, ../sass/controls/_buttons.scss */ + .icon-btn.pause-play.paused, .s-icon-btn.pause-play.paused { -moz-animation-name: pulse; -webkit-animation-name: pulse; @@ -1455,31 +1720,27 @@ span { -moz-animation-timing-function: ease-in-out; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } - /* line 83, ../sass/controls/_buttons.scss */ + /* line 129, ../sass/controls/_buttons.scss */ + .icon-btn.pause-play .icon:before, .s-icon-btn.pause-play .icon:before { content: "\0000F1"; } - /* line 89, ../sass/controls/_buttons.scss */ + /* line 135, ../sass/controls/_buttons.scss */ + .icon-btn.show-thumbs .icon:before, .s-icon-btn.show-thumbs .icon:before { content: "\000039"; } /*********************************** LAYOUT STYLES */ -/* line 96, ../sass/controls/_buttons.scss */ +/* line 142, ../sass/controls/_buttons.scss */ +span.btn, +span.btn span, span.l-btn, span.l-btn span, +a.btn, +a.btn span, a.l-btn, a.l-btn span { display: inline-block; } -/* line 103, ../sass/controls/_buttons.scss */ -.l-btn { - padding: 0 7.5px; } - /* line 105, ../sass/controls/_buttons.scss */ - .l-btn.sm { - padding: 0 5px; } - /* line 108, ../sass/controls/_buttons.scss */ - .l-btn.vsm { - padding: 0 2.5px; } - /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -1580,41 +1841,45 @@ a.l-btn span { * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 24, ../sass/controls/_controls.scss */ -.control.view-control .icon { - display: inline-block; - margin: -1px 5px 1px 2px; - vertical-align: middle; } - /* line 28, ../sass/controls/_controls.scss */ - .control.view-control .icon.triangle-down { - margin: 2px 2px -2px 0px; } -/* line 33, ../sass/controls/_controls.scss */ -.control.view-control .label { - display: inline-block; - font-size: 11px; - vertical-align: middle; } -/* line 39, ../sass/controls/_controls.scss */ -.control.view-control .toggle { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - display: inline-block; - padding: 1px 6px 4px 4px; } - /* line 43, ../sass/controls/_controls.scss */ - .control.view-control .toggle:hover { - background: rgba(255, 255, 255, 0.1); } +/*.control { + // UNUSED? + &.view-control { + .icon { + display: inline-block; + margin: -1px 5px 1px 2px; + vertical-align: middle; + &.triangle-down { + margin: 2px 2px -2px 0px; + } + } -/* line 50, ../sass/controls/_controls.scss */ + .label { + display: inline-block; + font-size: 11px; + vertical-align: middle; + } + + .toggle { + @include border-radius(3px); + display: inline-block; + padding: 1px 6px 4px 4px; + &:hover { + background: rgba(white, 0.1); + } + } + } +}*/ +/* line 51, ../sass/controls/_controls.scss */ .accordion { margin-top: 5px; } - /* line 53, ../sass/controls/_controls.scss */ + /* line 54, ../sass/controls/_controls.scss */ .accordion:first-child { margin-top: 0; } - /* line 56, ../sass/controls/_controls.scss */ + /* line 57, ../sass/controls/_controls.scss */ .accordion .accordion-head { - -moz-border-radius: 2.25px; - -webkit-border-radius: 2.25px; - border-radius: 2.25px; + -moz-border-radius: 1.5px; + -webkit-border-radius: 1.5px; + border-radius: 1.5px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -1632,10 +1897,10 @@ a.l-btn span { width: auto; height: 18px; text-transform: uppercase; } - /* line 70, ../sass/controls/_controls.scss */ + /* line 75, ../sass/controls/_controls.scss */ .accordion .accordion-head:hover { background: rgba(153, 153, 153, 0.4); } - /* line 73, ../sass/controls/_controls.scss */ + /* line 78, ../sass/controls/_controls.scss */ .accordion .accordion-head:after { content: "^"; display: block; @@ -1645,10 +1910,10 @@ a.l-btn span { right: 5px; text-transform: none; top: 0; } - /* line 83, ../sass/controls/_controls.scss */ + /* line 88, ../sass/controls/_controls.scss */ .accordion .accordion-head:not(.expanded):after { content: "v"; } - /* line 87, ../sass/controls/_controls.scss */ + /* line 92, ../sass/controls/_controls.scss */ .accordion .accordion-contents { position: absolute; top: 23px; @@ -1658,195 +1923,20 @@ a.l-btn span { overflow-y: auto; overflow-x: hidden; } -/* line 95, ../sass/controls/_controls.scss */ -.btn { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - text-shadow: rgba(0, 0, 0, 0.3) 0 1px 1px; - padding: 0 10px; - text-decoration: none; } - /* line 105, ../sass/controls/_controls.scss */ - .btn.create-btn { - height: 25px; - line-height: 25px; - padding: 0 22.5px; } - /* line 112, ../sass/controls/_controls.scss */ - .btn.create-btn .menu { - margin-left: -22.5px; } - /* line 115, ../sass/controls/_controls.scss */ - .btn.create-btn .ui-symbol.major { - font-size: 1.1em; } - /* line 119, ../sass/controls/_controls.scss */ - .btn.major { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYWNlNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00bfff), color-stop(100%, #00ace6)); - background-image: -moz-linear-gradient(#00bfff, #00ace6); - background-image: -webkit-linear-gradient(#00bfff, #00ace6); - background-image: linear-gradient(#00bfff, #00ace6); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - border: none; - border-top: 1px solid #33ccff; - color: #999; - display: inline-block; - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMzY2NmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwOTljYyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #33ccff), color-stop(100%, #0099cc)); - background-image: -moz-linear-gradient(#33ccff, #0099cc); - background-image: -webkit-linear-gradient(#33ccff, #0099cc); - background-image: linear-gradient(#33ccff, #0099cc); - color: #ccf2ff; } - /* line 181, ../sass/_mixins.scss */ - .btn.major:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2ZDlmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #66d9ff), color-stop(100%, #00bfff)); - background-image: -moz-linear-gradient(#66d9ff, #00bfff); - background-image: -webkit-linear-gradient(#66d9ff, #00bfff); - background-image: linear-gradient(#66d9ff, #00bfff); } - /* line 124, ../sass/controls/_controls.scss */ - .btn.major:hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzFhYzZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1ac6ff), color-stop(100%, #00bfff)); - background-image: -moz-linear-gradient(#1ac6ff, #00bfff); - background-image: -webkit-linear-gradient(#1ac6ff, #00bfff); - background-image: linear-gradient(#1ac6ff, #00bfff); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - border: none; - border-top: 1px solid #4dd2ff; - color: #999; - display: inline-block; - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkZDJmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwYWNlNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4dd2ff), color-stop(100%, #00ace6)); - background-image: -moz-linear-gradient(#4dd2ff, #00ace6); - background-image: -webkit-linear-gradient(#4dd2ff, #00ace6); - background-image: linear-gradient(#4dd2ff, #00ace6); - color: #ccf2ff; } - /* line 181, ../sass/_mixins.scss */ - .btn.major:hover:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzgwZGZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzFhYzZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #80dfff), color-stop(100%, #1ac6ff)); - background-image: -moz-linear-gradient(#80dfff, #1ac6ff); - background-image: -webkit-linear-gradient(#80dfff, #1ac6ff); - background-image: linear-gradient(#80dfff, #1ac6ff); } - /* line 128, ../sass/controls/_controls.scss */ - .btn.major .invoke-menu { - color: #ccf2ff; } - /* line 132, ../sass/controls/_controls.scss */ - .btn.normal { - padding: 11.25px 15.75px; } - /* line 136, ../sass/controls/_controls.scss */ - .btn.outline:hover { - background: rgba(255, 255, 255, 0.1); } - /* line 140, ../sass/controls/_controls.scss */ - .btn.subtle { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzczNzM3MyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #808080), color-stop(100%, #737373)); - background-image: -moz-linear-gradient(#808080, #737373); - background-image: -webkit-linear-gradient(#808080, #737373); - background-image: linear-gradient(#808080, #737373); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - border: none; - border-top: 1px solid #999999; - color: #cccccc; - display: inline-block; } - /* line 173, ../sass/_mixins.scss */ - .btn.subtle:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #999999), color-stop(100%, #808080)); - background-image: -moz-linear-gradient(#999999, #808080); - background-image: -webkit-linear-gradient(#999999, #808080); - background-image: linear-gradient(#999999, #808080); } - /* line 144, ../sass/controls/_controls.scss */ - .btn.very-subtle { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - border: none; - border-top: 1px solid #666666; - color: #b3b3b3; - display: inline-block; } - /* line 173, ../sass/_mixins.scss */ - .btn.very-subtle:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); - background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#666666, #4d4d4d); - background-image: -webkit-linear-gradient(#666666, #4d4d4d); - background-image: linear-gradient(#666666, #4d4d4d); } - /* line 147, ../sass/controls/_controls.scss */ - .btn.lg { - -moz-border-radius: 4.5px; - -webkit-border-radius: 4.5px; - border-radius: 4.5px; - font-size: 1.2em; - padding: 7px 25px; } - /* line 153, ../sass/controls/_controls.scss */ - .btn.icon-btn .icon { - color: #0099cc; } - /* line 157, ../sass/controls/_controls.scss */ - .btn.icon-btn:not(.disabled):hover .icon { - color: #33ccff; } - -/* line 165, ../sass/controls/_controls.scss */ +/* line 105, ../sass/controls/_controls.scss */ .btn-bar .btn, .btn-bar .btn-set, .btn-bar .t-btn { display: inline-block; } -/* line 179, ../sass/controls/_controls.scss */ +/* line 119, ../sass/controls/_controls.scss */ .l-composite-control { vertical-align: middle; } - /* line 182, ../sass/controls/_controls.scss */ + /* line 122, ../sass/controls/_controls.scss */ .l-composite-control.l-checkbox .composite-control-label { line-height: 18px; } -/* line 188, ../sass/controls/_controls.scss */ +/* line 128, ../sass/controls/_controls.scss */ .l-control-group { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; @@ -1855,27 +1945,27 @@ a.l-btn span { display: inline-block; padding: 0 5px; position: relative; } - /* line 196, ../sass/controls/_controls.scss */ + /* line 136, ../sass/controls/_controls.scss */ .l-control-group:first-child { border-left: none; padding-left: 0; } -/* line 202, ../sass/controls/_controls.scss */ +/* line 142, ../sass/controls/_controls.scss */ .l-local-controls { position: absolute; top: 5px; right: 5px; z-index: 5; } -/* line 211, ../sass/controls/_controls.scss */ +/* line 152, ../sass/controls/_controls.scss */ .s-local-controls { font-size: 0.7rem; } -/* line 215, ../sass/controls/_controls.scss */ +/* line 156, ../sass/controls/_controls.scss */ .btn-set { display: inline-block; position: relative; } - /* line 219, ../sass/controls/_controls.scss */ + /* line 160, ../sass/controls/_controls.scss */ .btn-set .btn, .btn-set .t-btn { -moz-border-radius: 0; @@ -1883,27 +1973,27 @@ a.l-btn span { border-radius: 0; border-left: 1px solid #666666; margin-left: 0; } - /* line 224, ../sass/controls/_controls.scss */ + /* line 165, ../sass/controls/_controls.scss */ .btn-set .btn:first-child, .btn-set .t-btn:first-child { border-left: none; - -moz-border-radius-topleft: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; } - /* line 228, ../sass/controls/_controls.scss */ + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -moz-border-radius-bottomleft: 2px; + -webkit-border-bottom-left-radius: 2px; + border-bottom-left-radius: 2px; } + /* line 169, ../sass/controls/_controls.scss */ .btn-set .btn:last-child, .btn-set .t-btn:last-child { - -moz-border-radius-topright: 3px; - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; } + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; + -moz-border-radius-bottomright: 2px; + -webkit-border-bottom-right-radius: 2px; + border-bottom-right-radius: 2px; } -/* line 234, ../sass/controls/_controls.scss */ +/* line 175, ../sass/controls/_controls.scss */ .object-browse-bar .btn, .object-browse-bar .t-btn, .top-bar .buttons-main .btn, @@ -1914,7 +2004,7 @@ a.l-btn span { font-size: 11.25px; height: 25px; line-height: 25px; } - /* line 245, ../sass/controls/_controls.scss */ + /* line 186, ../sass/controls/_controls.scss */ .object-browse-bar .btn .icon:not(.invoke-menu), .object-browse-bar .t-btn .icon:not(.invoke-menu), .top-bar .buttons-main .btn .icon:not(.invoke-menu), @@ -1924,7 +2014,7 @@ a.l-btn span { font-size: 150%; vertical-align: middle; } -/* line 253, ../sass/controls/_controls.scss */ +/* line 194, ../sass/controls/_controls.scss */ label.checkbox.custom { cursor: pointer; display: inline-block; @@ -1933,17 +2023,17 @@ label.checkbox.custom { padding-left: 19px; position: relative; vertical-align: top; } - /* line 264, ../sass/controls/_controls.scss */ + /* line 205, ../sass/controls/_controls.scss */ label.checkbox.custom em { color: #999; display: inline-block; height: 14px; min-width: 14px; } - /* line 269, ../sass/controls/_controls.scss */ + /* line 210, ../sass/controls/_controls.scss */ label.checkbox.custom em:before { - -moz-border-radius: 2.25px; - -webkit-border-radius: 2.25px; - border-radius: 2.25px; + -moz-border-radius: 1.5px; + -webkit-border-radius: 1.5px; + border-radius: 1.5px; background: #666666; border-bottom: 1px solid gray; box-sizing: border-box; @@ -1958,121 +2048,132 @@ label.checkbox.custom { top: 0; position: absolute; text-align: center; } - /* line 287, ../sass/controls/_controls.scss */ + /* line 228, ../sass/controls/_controls.scss */ label.checkbox.custom.no-text { overflow: hidden; margin-right: 0; padding-left: 0; height: 14px; width: 14px; } - /* line 293, ../sass/controls/_controls.scss */ + /* line 234, ../sass/controls/_controls.scss */ label.checkbox.custom.no-text em { overflow: hidden; } - /* line 297, ../sass/controls/_controls.scss */ + /* line 238, ../sass/controls/_controls.scss */ label.checkbox.custom input { display: none; } - /* line 299, ../sass/controls/_controls.scss */ + /* line 240, ../sass/controls/_controls.scss */ label.checkbox.custom input:checked ~ em:before { background: #0099cc; color: #ccf2ff; content: "2"; } -/* line 307, ../sass/controls/_controls.scss */ +/* line 248, ../sass/controls/_controls.scss */ .input-labeled { margin-left: 5px; } - /* line 309, ../sass/controls/_controls.scss */ + /* line 250, ../sass/controls/_controls.scss */ .input-labeled label { display: inline-block; margin-right: 3px; } - /* line 313, ../sass/controls/_controls.scss */ + /* line 254, ../sass/controls/_controls.scss */ .input-labeled.inline { display: inline-block; } - /* line 316, ../sass/controls/_controls.scss */ + /* line 257, ../sass/controls/_controls.scss */ .input-labeled:first-child { margin-left: 0; } -/* line 321, ../sass/controls/_controls.scss */ +/* line 262, ../sass/controls/_controls.scss */ .btn-menu label.checkbox.custom { margin-left: 5px; } -/* line 326, ../sass/controls/_controls.scss */ +/* line 267, ../sass/controls/_controls.scss */ .item .checkbox.checked label { -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; border-bottom: none; } -/* line 332, ../sass/controls/_controls.scss */ +/* line 273, ../sass/controls/_controls.scss */ .btn-menu { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ1NDU0NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525252), color-stop(100%, #454545)); + background-image: -moz-linear-gradient(#525252, #454545); + background-image: -webkit-linear-gradient(#525252, #454545); + background-image: linear-gradient(#525252, #454545); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #666666; + border-top: 1px solid #575757; color: #999; display: inline-block; - height: 20px; - line-height: 20px; } - /* line 173, ../sass/_mixins.scss */ + /* height: $h; + line-height: $h; + &.dropdown { + padding-left: $p; + padding-right: $p; + }*/ + /* &.context-available { + // An element like the invoke-menu triangle; + // Indicates that this element has a dropdown menu available; + // Currently unused + $c: $colorKey; + color: $c; + padding: 0 5px; + &:hover { + color: lighten($c, 10%); + } + }*/ } + /* line 152, ../sass/_mixins.scss */ .btn-menu:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYzNjM2MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU3NTc1NyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#666666, #4d4d4d); - background-image: -webkit-linear-gradient(#666666, #4d4d4d); - background-image: linear-gradient(#666666, #4d4d4d); } - /* line 339, ../sass/controls/_controls.scss */ - .btn-menu.dropdown { - padding-left: 10px; - padding-right: 10px; } - /* line 345, ../sass/controls/_controls.scss */ + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #636363), color-stop(100%, #575757)); + background-image: -moz-linear-gradient(#636363, #575757); + background-image: -webkit-linear-gradient(#636363, #575757); + background-image: linear-gradient(#636363, #575757); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .btn-menu:not(.disabled):hover.btn-menu .invoke-menu { + color: #878787; } + /* line 160, ../sass/_mixins.scss */ + .btn-menu.btn-menu .invoke-menu { + color: #757575; } + /* line 285, ../sass/controls/_controls.scss */ .btn-menu:not(.disabled):hover { color: #cccccc; } - /* line 349, ../sass/controls/_controls.scss */ - .btn-menu.btn-invoke-menu { - color: #0099cc; - padding: 0 5px; } - /* line 353, ../sass/controls/_controls.scss */ - .btn-menu.btn-invoke-menu:hover { - color: deepskyblue; } - /* line 363, ../sass/controls/_controls.scss */ - .btn-menu .type-icon { - margin-right: 5px; } - /* line 366, ../sass/controls/_controls.scss */ + /* line 310, ../sass/controls/_controls.scss */ + .btn-menu .name { + margin-left: 5px; } + /* line 313, ../sass/controls/_controls.scss */ .btn-menu .menu { position: absolute; left: 0; text-align: left; } - /* line 371, ../sass/controls/_controls.scss */ + /* line 318, ../sass/controls/_controls.scss */ .btn-menu .menu .ui-symbol.icon { width: 12px; } -/* line 377, ../sass/controls/_controls.scss */ +/* line 324, ../sass/controls/_controls.scss */ .top-bar .btn-menu { height: 25px; line-height: 25px; padding-right: 10px; } - /* line 385, ../sass/controls/_controls.scss */ + /* line 332, ../sass/controls/_controls.scss */ .top-bar .btn-menu.browse-btn { margin-right: 5px; padding-left: 25px; } - /* line 388, ../sass/controls/_controls.scss */ + /* line 335, ../sass/controls/_controls.scss */ .top-bar .btn-menu.browse-btn .badge { - -moz-border-radius: 4.5px; - -webkit-border-radius: 4.5px; - border-radius: 4.5px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; display: block; font-size: 1em; line-height: 15px; @@ -2084,52 +2185,46 @@ label.checkbox.custom { width: 15px; height: auto; } +/* line 351, ../sass/controls/_controls.scss */ +.view-switcher { + -moz-transition-property: visibility, opacity, background-color, border-color; + -o-transition-property: visibility, opacity, background-color, border-color; + -webkit-transition-property: visibility, opacity, background-color, border-color; + transition-property: visibility, opacity, background-color, border-color; + -moz-transition-duration: 100ms; + -o-transition-duration: 100ms; + -webkit-transition-duration: 100ms; + transition-duration: 100ms; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; } + /******************************************************** OBJECT-HEADER */ -/* line 405, ../sass/controls/_controls.scss */ +/* line 356, ../sass/controls/_controls.scss */ .object-header { display: inline-block; font-size: 1em; } - /* line 408, ../sass/controls/_controls.scss */ - .object-header .title { + /* line 360, ../sass/controls/_controls.scss */ + .object-header .label .title-label { color: white; } - /* line 411, ../sass/controls/_controls.scss */ - .object-header .type-icon { + /* line 363, ../sass/controls/_controls.scss */ + .object-header .label .type-icon { font-size: 1.5em; margin-right: 5px; vertical-align: middle; } -/* line 420, ../sass/controls/_controls.scss */ +/* line 373, ../sass/controls/_controls.scss */ .top-bar .object-header, .object-browse-bar .object-header { font-size: 1.1em; } - /* line 422, ../sass/controls/_controls.scss */ + /* line 375, ../sass/controls/_controls.scss */ .top-bar .object-header span, .object-browse-bar .object-header span { display: inline-block; } -/******************************************************** VIEW-CONTROLS */ -/* line 430, ../sass/controls/_controls.scss */ -.view-controls .view-type { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - box-sizing: border-box; - display: inline-block; - margin-left: 5px; - height: 20px; - line-height: 20px; - padding-left: 5px; - padding-right: 5px; } - /* line 441, ../sass/controls/_controls.scss */ - .view-controls .view-type.cur { - background: #666666; } - -/* line 446, ../sass/controls/_controls.scss */ -.edit-mode .top-bar .control-set.edit-view-controls { - margin-right: 50px; } - /******************************************************** SLIDERS */ -/* line 457, ../sass/controls/_controls.scss */ +/* line 387, ../sass/controls/_controls.scss */ .slider .slot { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -2150,25 +2245,25 @@ label.checkbox.custom { right: 0; bottom: auto; left: 0; } -/* line 468, ../sass/controls/_controls.scss */ +/* line 398, ../sass/controls/_controls.scss */ .slider .knob { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ1NDU0NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525252), color-stop(100%, #454545)); + background-image: -moz-linear-gradient(#525252, #454545); + background-image: -webkit-linear-gradient(#525252, #454545); + background-image: linear-gradient(#525252, #454545); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #666666; + border-top: 1px solid #575757; color: #999; display: inline-block; cursor: ew-resize; @@ -2179,15 +2274,22 @@ label.checkbox.custom { auto: 0; bottom: auto; left: auto; } - /* line 173, ../sass/_mixins.scss */ + /* line 152, ../sass/_mixins.scss */ .slider .knob:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYzNjM2MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU3NTc1NyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#666666, #4d4d4d); - background-image: -webkit-linear-gradient(#666666, #4d4d4d); - background-image: linear-gradient(#666666, #4d4d4d); } - /* line 145, ../sass/_mixins.scss */ + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #636363), color-stop(100%, #575757)); + background-image: -moz-linear-gradient(#636363, #575757); + background-image: -webkit-linear-gradient(#636363, #575757); + background-image: linear-gradient(#636363, #575757); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .slider .knob:not(.disabled):hover.btn-menu .invoke-menu { + color: #878787; } + /* line 160, ../sass/_mixins.scss */ + .slider .knob.btn-menu .invoke-menu { + color: #757575; } + /* line 176, ../sass/_mixins.scss */ .slider .knob:before { content: ''; display: block; @@ -2198,15 +2300,15 @@ label.checkbox.custom { left: 2px; bottom: 5px; top: 5px; } - /* line 166, ../sass/_mixins.scss */ + /* line 197, ../sass/_mixins.scss */ .slider .knob:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } - /* line 479, ../sass/controls/_controls.scss */ + /* line 409, ../sass/controls/_controls.scss */ .slider .knob:before { top: 1px; bottom: 3px; left: 5px; } -/* line 486, ../sass/controls/_controls.scss */ +/* line 416, ../sass/controls/_controls.scss */ .slider .range { background: rgba(0, 153, 204, 0.6); cursor: ew-resize; @@ -2217,12 +2319,12 @@ label.checkbox.custom { left: auto; height: auto; width: auto; } - /* line 496, ../sass/controls/_controls.scss */ + /* line 426, ../sass/controls/_controls.scss */ .slider .range:hover { background: rgba(0, 153, 204, 0.7); } /******************************************************** BROWSER ELEMENTS */ -/* line 504, ../sass/controls/_controls.scss */ +/* line 434, ../sass/controls/_controls.scss */ ::-webkit-scrollbar { -moz-border-radius: 2px; -webkit-border-radius: 2px; @@ -2239,7 +2341,7 @@ label.checkbox.custom { height: 10px; width: 10px; } -/* line 510, ../sass/controls/_controls.scss */ +/* line 440, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-thumb { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2253,11 +2355,11 @@ label.checkbox.custom { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border-top: 1px solid gray; } - /* line 517, ../sass/controls/_controls.scss */ + /* line 447, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-thumb:hover { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzczNzM3MyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; @@ -2266,7 +2368,7 @@ label.checkbox.custom { background-image: -webkit-linear-gradient(#808080, #737373 20px); background-image: linear-gradient(#808080, #737373 20px); } -/* line 522, ../sass/controls/_controls.scss */ +/* line 452, ../sass/controls/_controls.scss */ ::-webkit-scrollbar-corner { background: rgba(0, 0, 0, 0.4); } @@ -2331,26 +2433,26 @@ label.checkbox.custom { position: relative; } /* line 29, ../sass/controls/_menus.scss */ .menu-element .menu { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzU5NTk1OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #595959), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#595959, #4d4d4d); - background-image: -webkit-linear-gradient(#595959, #4d4d4d); - background-image: linear-gradient(#595959, #4d4d4d); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e), color-stop(100%, #525252)); + background-image: -moz-linear-gradient(#5e5e5e, #525252); + background-image: -webkit-linear-gradient(#5e5e5e, #525252); + background-image: linear-gradient(#5e5e5e, #525252); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #737373; + border-top: 1px solid #636363; color: #999; display: inline-block; text-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; @@ -2358,11 +2460,14 @@ label.checkbox.custom { padding: 3px 0; position: absolute; z-index: 10; } + /* line 160, ../sass/_mixins.scss */ + .menu-element .menu.btn-menu .invoke-menu { + color: #828282; } /* line 37, ../sass/controls/_menus.scss */ .menu-element .menu ul { margin: 0; padding: 0; } - /* line 233, ../sass/_mixins.scss */ + /* line 264, ../sass/_mixins.scss */ .menu-element .menu ul li { list-style-type: none; margin: 0; @@ -2373,8 +2478,8 @@ label.checkbox.custom { -webkit-box-sizing: border-box; box-sizing: border-box; border-top: 1px solid #737373; - line-height: 1.5rem; - padding: 3px 10px 3px 35px; + line-height: 1.4rem; + padding: 3px 10px 3px 30px; white-space: nowrap; } /* line 46, ../sass/controls/_menus.scss */ .menu-element .menu ul li:first-child { @@ -2425,9 +2530,9 @@ label.checkbox.custom { overflow-y: auto; } /* line 90, ../sass/controls/_menus.scss */ .menu-element .super-menu .pane.left ul li { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; border-top: none; } /* line 96, ../sass/controls/_menus.scss */ .menu-element .super-menu .pane.left ul li:hover { @@ -2466,25 +2571,28 @@ label.checkbox.custom { pointer-events: auto; } /* line 147, ../sass/controls/_menus.scss */ .menu-element .context-menu.menu { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzhjOGM4YyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzgwODA4MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzkxOTE5MSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg1ODU4NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #8c8c8c), color-stop(100%, #808080)); - background-image: -moz-linear-gradient(#8c8c8c, #808080); - background-image: -webkit-linear-gradient(#8c8c8c, #808080); - background-image: linear-gradient(#8c8c8c, #808080); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #919191), color-stop(100%, #858585)); + background-image: -moz-linear-gradient(#919191, #858585); + background-image: -webkit-linear-gradient(#919191, #858585); + background-image: linear-gradient(#919191, #858585); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #a6a6a6; + border-top: 1px solid #969696; color: #999; display: inline-block; } + /* line 160, ../sass/_mixins.scss */ + .menu-element .context-menu.menu.btn-menu .invoke-menu { + color: #b5b5b5; } /* line 149, ../sass/controls/_menus.scss */ .menu-element .context-menu.menu ul li { padding-left: 30px; } @@ -2507,7 +2615,7 @@ label.checkbox.custom { position: absolute; height: 200px; width: 170px; - z-index: 59; } + z-index: 70; } /* line 172, ../sass/controls/_menus.scss */ .context-menu-holder .context-menu-wrapper { position: absolute; @@ -2527,6 +2635,103 @@ label.checkbox.custom { right: 0; width: auto; } +/* line 1, ../sass/controls/_time-controller.scss */ +.l-time-controller { + position: relative; + margin: 10px 0; + min-width: 400px; } + /* line 12, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-inputs-holder, + .l-time-controller .l-time-range-slider { + font-size: 0.8em; } + /* line 17, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-inputs-holder, + .l-time-controller .l-time-range-slider-holder, + .l-time-controller .l-time-range-ticks-holder { + margin-bottom: 5px; + position: relative; } + /* line 24, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-slider, + .l-time-controller .l-time-range-ticks { + overflow: visible; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: auto; + height: auto; } + /* line 30, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-inputs-holder { + height: 20px; } + /* line 34, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-slider, + .l-time-controller .l-time-range-ticks { + left: 90px; + right: 90px; } + /* line 40, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-slider-holder { + height: 30px; } + /* line 42, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-slider-holder .range-holder { + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + background: none; + border: none; + height: 75%; } + /* line 50, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-ticks-holder { + height: 10px; } + /* line 52, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks { + border-top: 1px solid #4d4d4d; } + /* line 54, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks .tick { + background-color: #4d4d4d; + border: none; + width: 1px; + margin-left: -1px; } + /* line 59, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks .tick:first-child { + margin-left: 0; } + /* line 62, ../sass/controls/_time-controller.scss */ + .l-time-controller .l-time-range-ticks-holder .l-time-range-ticks .tick .l-time-range-tick-label { + color: gray; + font-size: 0.7em; + position: absolute; + margin-left: -25px; + text-align: center; + top: 10px; + width: 50px; + z-index: 2; } + /* line 76, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob { + width: 9px; } + /* line 78, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob .range-value { + position: absolute; + top: 50%; + margin-top: -7px; + white-space: nowrap; + width: 75px; } + /* line 87, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob:hover .range-value { + color: #0099cc; } + /* line 90, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob.knob-l { + margin-left: -4.5px; } + /* line 92, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob.knob-l .range-value { + text-align: right; + right: 14px; } + /* line 97, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob.knob-r { + margin-right: -4.5px; } + /* line 99, ../sass/controls/_time-controller.scss */ + .l-time-controller .knob.knob-r .range-value { + left: 14px; } + /* line 1, ../sass/features/_imagery.scss */ .l-image-main-wrapper, .l-image-main, @@ -2692,6 +2897,56 @@ label.checkbox.custom { .frame .t-imagery .l-image-thumbs-wrapper { display: none; } +/* line 5, ../sass/features/_time-display.scss */ +.l-time-display:hover .l-btn.control { + opacity: 1; } +/* line 10, ../sass/features/_time-display.scss */ +.l-time-display .l-elem-wrapper { + position: relative; } +/* line 13, ../sass/features/_time-display.scss */ +.l-time-display .l-elem { + display: inline-block; } +/* line 18, ../sass/features/_time-display.scss */ +.l-time-display.l-timer .l-elem.l-value { + -moz-transition-property: left; + -o-transition-property: left; + -webkit-transition-property: left; + transition-property: left; + -moz-transition-duration: 200ms; + -o-transition-duration: 200ms; + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + position: absolute; + left: 0; + z-index: 1; } +/* line 24, ../sass/features/_time-display.scss */ +.l-time-display.l-timer:hover .l-elem.l-value { + left: 20px; } +/* line 31, ../sass/features/_time-display.scss */ +.l-time-display .l-elem .value.active, .l-time-display .l-elem.value.active { + color: #fff; } +/* line 36, ../sass/features/_time-display.scss */ +.l-time-display .l-btn.control { + -moz-transition-property: visibility, opacity, background-color, border-color; + -o-transition-property: visibility, opacity, background-color, border-color; + -webkit-transition-property: visibility, opacity, background-color, border-color; + transition-property: visibility, opacity, background-color, border-color; + -moz-transition-duration: 200ms; + -o-transition-duration: 200ms; + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + opacity: 0; + font-size: 0.9em; + line-height: 1em; } + /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -2817,9 +3072,9 @@ label.checkbox.custom { color: #666666; } /* line 116, ../sass/forms/_elems.scss */ .form .form-row .selector-list { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -2856,9 +3111,9 @@ label.form-control.checkbox input { vertical-align: top; } /* line 159, ../sass/forms/_elems.scss */ .l-result div.s-hint { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; background: rgba(255, 153, 0, 0.8); display: block; color: #ffd699; @@ -2944,9 +3199,9 @@ span.req { input[type="text"] { -moz-appearance: none; -webkit-appearance: none; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -2989,23 +3244,23 @@ input[type="text"] { *****************************************************************************/ /* line 22, ../sass/forms/_selects.scss */ .form-control.select { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ1NDU0NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525252), color-stop(100%, #454545)); + background-image: -moz-linear-gradient(#525252, #454545); + background-image: -webkit-linear-gradient(#525252, #454545); + background-image: linear-gradient(#525252, #454545); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #666666; + border-top: 1px solid #575757; color: #999; display: inline-block; cursor: pointer; @@ -3013,14 +3268,21 @@ input[type="text"] { margin: 0 0 2px 2px; overflow: hidden; position: relative; } - /* line 173, ../sass/_mixins.scss */ + /* line 152, ../sass/_mixins.scss */ .form-control.select:not(.disabled):hover { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2NjY2NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYzNjM2MyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzU3NTc1NyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #4d4d4d)); - background-image: -moz-linear-gradient(#666666, #4d4d4d); - background-image: -webkit-linear-gradient(#666666, #4d4d4d); - background-image: linear-gradient(#666666, #4d4d4d); } + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #636363), color-stop(100%, #575757)); + background-image: -moz-linear-gradient(#636363, #575757); + background-image: -webkit-linear-gradient(#636363, #575757); + background-image: linear-gradient(#636363, #575757); + color: #bdbdbd; } + /* line 155, ../sass/_mixins.scss */ + .form-control.select:not(.disabled):hover.btn-menu .invoke-menu { + color: #878787; } + /* line 160, ../sass/_mixins.scss */ + .form-control.select.btn-menu .invoke-menu { + color: #757575; } /* line 29, ../sass/forms/_selects.scss */ .form-control.select select { -moz-appearance: none; @@ -3077,9 +3339,9 @@ input[type="text"] { .channel-selector .treeview { -moz-appearance: none; -webkit-appearance: none; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -3182,9 +3444,9 @@ input[type="text"] { .t-filter input.t-filter-input { -moz-appearance: none; -webkit-appearance: none; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -3217,9 +3479,9 @@ input[type="text"] { /* line 42, ../sass/forms/_filter.scss */ .filter .icon.ui-symbol, .t-filter .icon.ui-symbol { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; display: inline-block; font-size: 1.3em; height: 22px; @@ -3233,9 +3495,9 @@ input[type="text"] { /* line 54, ../sass/forms/_filter.scss */ .filter .s-a-clear.ui-symbol, .t-filter .s-a-clear.ui-symbol { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -3333,9 +3595,9 @@ input[type="text"] { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; background: black; color: #e6e6e6; padding: 2px 5px; @@ -3595,9 +3857,9 @@ input[type="text"] { z-index: 100; } /* line 27, ../sass/overlay/_overlay.scss */ .overlay .btn.close { - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - border-radius: 6px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; padding: 3px 6px; position: absolute; border: none; @@ -3608,34 +3870,37 @@ input[type="text"] { z-index: 100; } /* line 38, ../sass/overlay/_overlay.scss */ .overlay > .holder { - background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRkNGQ0ZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQwNDA0MCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUyNTI1MiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ1NDU0NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; - background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040)); - background-image: -moz-linear-gradient(#4d4d4d, #404040); - background-image: -webkit-linear-gradient(#4d4d4d, #404040); - background-image: linear-gradient(#4d4d4d, #404040); - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #525252), color-stop(100%, #454545)); + background-image: -moz-linear-gradient(#525252, #454545); + background-image: -webkit-linear-gradient(#525252, #454545); + background-image: linear-gradient(#525252, #454545); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - -moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - -webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; + box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px; border: none; - border-top: 1px solid #666666; + border-top: 1px solid #575757; color: #999; display: inline-block; - -moz-border-radius: 9px; - -webkit-border-radius: 9px; - border-radius: 9px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; color: #999; top: 15%; right: 15%; bottom: 15%; left: 15%; z-index: 101; } + /* line 160, ../sass/_mixins.scss */ + .overlay > .holder.btn-menu .invoke-menu { + color: #757575; } /* line 45, ../sass/overlay/_overlay.scss */ .overlay > .holder > .contents { top: 25px; @@ -3704,22 +3969,32 @@ input[type="text"] { border: 1px solid #4d4d4d; } /* line 28, ../sass/user-environ/_frame.scss */ .frame.child-frame.panel:hover { - border-color: #666666; } -/* line 35, ../sass/user-environ/_frame.scss */ + border-color: #666666; + z-index: 2; } +/* line 36, ../sass/user-environ/_frame.scss */ .frame > .object-header.abs, .btn-menu .frame > span.object-header.l-click-area { font-size: 0.75em; height: 20px; } -/* line 39, ../sass/user-environ/_frame.scss */ +/* line 40, ../sass/user-environ/_frame.scss */ .frame > .object-holder.abs, .btn-menu .frame > span.object-holder.l-click-area { top: 23px; } -/* line 42, ../sass/user-environ/_frame.scss */ +/* line 43, ../sass/user-environ/_frame.scss */ .frame .contents { top: 5px; right: 5px; bottom: 5px; left: 5px; } +/* line 54, ../sass/user-environ/_frame.scss */ +.frame.frame-template .view-switcher { + opacity: 0; } +/* line 58, ../sass/user-environ/_frame.scss */ +.frame.frame-template:hover .view-switcher { + opacity: 1; } +/* line 66, ../sass/user-environ/_frame.scss */ +.frame .view-switcher .name { + display: none; } -/* line 52, ../sass/user-environ/_frame.scss */ +/* line 73, ../sass/user-environ/_frame.scss */ .edit-main .frame.child-frame.panel:hover { border-color: #0099cc; -moz-box-shadow: rgba(0, 0, 0, 0.7) 0 3px 10px; @@ -3803,9 +4078,9 @@ input[type="text"] { line-height: 16px; } /* line 26, ../sass/user-environ/_bottom-bar.scss */ .ue-bottom-bar .status-holder { - -moz-border-radius: 5.25px; - -webkit-border-radius: 5.25px; - border-radius: 5.25px; + -moz-border-radius: 3.5px; + -webkit-border-radius: 3.5px; + border-radius: 3.5px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; @@ -3833,9 +4108,9 @@ input[type="text"] { margin-right: 20px; } /* line 50, ../sass/user-environ/_bottom-bar.scss */ .status.block .status-indicator { - -moz-border-radius: 2.7px; - -webkit-border-radius: 2.7px; - border-radius: 2.7px; + -moz-border-radius: 1.8px; + -webkit-border-radius: 1.8px; + border-radius: 1.8px; -moz-box-shadow: inset rgba(0, 0, 0, 0.5) 0 0 3px; -webkit-box-shadow: inset rgba(0, 0, 0, 0.5) 0 0 3px; box-shadow: inset rgba(0, 0, 0, 0.5) 0 0 3px; @@ -3944,137 +4219,101 @@ input[type="text"] { * at runtime from the About dialog for additional information. *****************************************************************************/ /* line 24, ../sass/helpers/_bubbles.scss */ -.l-bubble-wrapper { - position: absolute; - z-index: 70; } - /* line 27, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-bubble { - padding: 5px 10px; } - /* line 29, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-bubble .l-btn.close { - padding: 0 2px; - position: absolute; - right: 5px; - top: 5px; } - /* line 36, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .arw { - position: absolute; } - /* line 38, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .arw.arw-up { - bottom: 100%; } - /* line 42, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .arw.arw-down { - top: 100%; } - /* line 47, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble { +.l-infobubble-wrapper { + -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + position: relative; + z-index: 50; } + /* line 29, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble { display: inline-block; - max-width: 250px; } - /* line 51, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble:before { + min-width: 100px; + max-width: 300px; + padding: 5px 10px; } + /* line 34, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble:before { content: ""; position: absolute; width: 0; height: 0; } - /* line 57, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble table { + /* line 40, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble table { width: 100%; } - /* line 60, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble table tr td { + /* line 43, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble table tr td { padding: 2px 0; vertical-align: top; } - /* line 67, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble table tr td.label { + /* line 50, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble table tr td.label { padding-right: 10px; white-space: nowrap; } - /* line 71, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble table tr td.value { + /* line 54, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble table tr td.value { white-space: nowrap; } - /* line 75, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble table tr td.align-wrap { + /* line 58, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble table tr td.align-wrap { white-space: normal; } - /* line 81, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper .l-infobubble .title { + /* line 64, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .l-infobubble .title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 5px; } - /* line 88, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper.arw-left { + /* line 71, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-left { margin-left: 20px; } - /* line 90, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper.arw-left .l-infobubble::before { + /* line 73, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-left .l-infobubble::before { right: 100%; width: 0; height: 0; border-top: 6.66667px solid transparent; border-bottom: 6.66667px solid transparent; border-right: 10px solid #ddd; } - /* line 96, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper.arw-right { + /* line 79, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-right { margin-right: 20px; } - /* line 98, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper.arw-right .l-infobubble::before { + /* line 81, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-right .l-infobubble::before { left: 100%; width: 0; height: 0; border-top: 6.66667px solid transparent; border-bottom: 6.66667px solid transparent; border-left: 10px solid #ddd; } - /* line 105, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper.arw-top .l-infobubble::before { + /* line 88, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-top .l-infobubble::before { top: 20px; } - /* line 111, ../sass/helpers/_bubbles.scss */ - .l-bubble-wrapper.arw-btm .l-infobubble::before { + /* line 94, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-btm .l-infobubble::before { bottom: 20px; } - -/* line 121, ../sass/helpers/_bubbles.scss */ -.l-thumbsbubble-wrapper { - position: absolute; - left: 10px; - right: 10px; - height: 183px; - width: auto; } - /* line 128, ../sass/helpers/_bubbles.scss */ - .l-thumbsbubble-wrapper .l-thumbsbubble { - overflow: hidden; - position: absolute; - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; - width: auto; - height: auto; } - /* line 130, ../sass/helpers/_bubbles.scss */ - .l-thumbsbubble-wrapper .l-thumbsbubble .l-image-thumbs-wrapper { - height: auto; - top: 5px !important; - right: 25px; - bottom: 5px !important; - left: 5px; } - /* line 135, ../sass/helpers/_bubbles.scss */ - .l-thumbsbubble-wrapper .arw { + /* line 99, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-down { + margin-bottom: 10px; } + /* line 101, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-down .l-infobubble::before { + left: 50%; + top: 100%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 7.5px solid #ddd; } + /* line 110, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper .arw { z-index: 2; } - /* line 140, ../sass/helpers/_bubbles.scss */ - .l-thumbsbubble-wrapper.arw-up .arw.arw-down, .l-thumbsbubble-wrapper.arw-down .arw.arw-up { + /* line 113, ../sass/helpers/_bubbles.scss */ + .l-infobubble-wrapper.arw-up .arw.arw-down, .l-infobubble-wrapper.arw-down .arw.arw-up { display: none; } -/* line 150, ../sass/helpers/_bubbles.scss */ -.s-bubble { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; - -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; - box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; } - -/* line 156, ../sass/helpers/_bubbles.scss */ +/* line 120, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw-up { width: 0; height: 0; border-left: 6.66667px solid transparent; border-right: 6.66667px solid transparent; border-bottom: 10px solid #4d4d4d; } -/* line 159, ../sass/helpers/_bubbles.scss */ +/* line 123, ../sass/helpers/_bubbles.scss */ .l-thumbsbubble-wrapper .arw-down { width: 0; height: 0; @@ -4082,27 +4321,33 @@ input[type="text"] { border-right: 6.66667px solid transparent; border-top: 10px solid #4d4d4d; } -/* line 163, ../sass/helpers/_bubbles.scss */ +/* line 127, ../sass/helpers/_bubbles.scss */ .s-infobubble { + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; + box-shadow: rgba(0, 0, 0, 0.4) 0 1px 5px; background: #ddd; color: #666; font-size: 0.8rem; } - /* line 168, ../sass/helpers/_bubbles.scss */ + /* line 134, ../sass/helpers/_bubbles.scss */ .s-infobubble .title { color: #333333; font-weight: bold; } - /* line 173, ../sass/helpers/_bubbles.scss */ + /* line 139, ../sass/helpers/_bubbles.scss */ .s-infobubble tr td { border-top: 1px solid #c4c4c4; font-size: 0.9em; } - /* line 177, ../sass/helpers/_bubbles.scss */ + /* line 143, ../sass/helpers/_bubbles.scss */ .s-infobubble tr:first-child td { border-top: none; } - /* line 181, ../sass/helpers/_bubbles.scss */ + /* line 147, ../sass/helpers/_bubbles.scss */ .s-infobubble .value { color: #333333; } -/* line 186, ../sass/helpers/_bubbles.scss */ +/* line 152, ../sass/helpers/_bubbles.scss */ .s-thumbsbubble { background: #4d4d4d; color: #b3b3b3; } @@ -4157,7 +4402,7 @@ input[type="text"] { right: 0; width: auto; height: 5px; } - /* line 145, ../sass/_mixins.scss */ + /* line 176, ../sass/_mixins.scss */ .split-layout.horizontal > .splitter:before { content: ''; display: block; @@ -4168,7 +4413,7 @@ input[type="text"] { top: 2px; left: 5px; right: 5px; } - /* line 166, ../sass/_mixins.scss */ + /* line 197, ../sass/_mixins.scss */ .split-layout.horizontal > .splitter:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } /* line 63, ../sass/helpers/_splitter.scss */ @@ -4186,7 +4431,7 @@ input[type="text"] { bottom: 0; cursor: col-resize; width: 5px; } - /* line 145, ../sass/_mixins.scss */ + /* line 176, ../sass/_mixins.scss */ .split-layout.vertical > .splitter:before { content: ''; display: block; @@ -4197,7 +4442,7 @@ input[type="text"] { left: 2px; bottom: 5px; top: 5px; } - /* line 166, ../sass/_mixins.scss */ + /* line 197, ../sass/_mixins.scss */ .split-layout.vertical > .splitter:not(.disabled):hover:before { border-color: rgba(0, 153, 204, 0.9); } @@ -4512,5 +4757,5 @@ input[type="text"] { .browse-mode .browse-area.holder { top: 5px; } /* line 39, ../sass/_hide-non-functional.scss */ - .browse-mode .browse-area.holder > .contents.split-layout .object-browse-bar .t-btn.key-window { + .browse-mode .browse-area.holder > .contents.split-layout .object-browse-bar .btn.key-window { display: none; } diff --git a/platform/commonUI/general/res/css/tree.css b/platform/commonUI/general/res/css/tree.css index 90e1957f25..b40a2aec6e 100644 --- a/platform/commonUI/general/res/css/tree.css +++ b/platform/commonUI/general/res/css/tree.css @@ -61,6 +61,15 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ +/* +@mixin invokeMenu($baseColor: $colorBodyFg) { + $c: $baseColor; + color: $c; + &:hover { + color: lighten($c, $ltGamma); + } +} +*/ /***************************************************************************** * Open MCT Web, Copyright (c) 2014-2015, United States Government * as represented by the Administrator of the National Aeronautics and Space @@ -86,7 +95,7 @@ ul.tree { margin: 0; padding: 0; } - /* line 233, ../sass/_mixins.scss */ + /* line 264, ../sass/_mixins.scss */ ul.tree li { list-style-type: none; margin: 0; @@ -97,17 +106,17 @@ ul.tree { position: relative; } /* line 27, ../sass/tree/_tree.scss */ ul.tree li span.tree-item { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; -moz-transition: background-color 0.25s; -o-transition: background-color 0.25s; -webkit-transition: background-color 0.25s; transition: background-color 0.25s; display: block; font-size: 0.80rem; - height: 1.5rem; - line-height: 1.5rem; + height: 1.4rem; + line-height: 1.4rem; margin-bottom: 3px; position: relative; } /* line 38, ../sass/tree/_tree.scss */ @@ -168,7 +177,7 @@ ul.tree { width: auto; height: auto; display: block; - left: 25px; + left: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } @@ -207,17 +216,16 @@ ul.tree { /* line 125, ../sass/tree/_tree.scss */ ul.tree li span.tree-item:not(.loading) { cursor: pointer; } - /* line 130, ../sass/tree/_tree.scss */ + /* line 129, ../sass/tree/_tree.scss */ ul.tree li span.tree-item .context-trigger { - display: none; top: -1px; position: absolute; right: 3px; } - /* line 136, ../sass/tree/_tree.scss */ - ul.tree li span.tree-item .context-trigger .btn-invoke-menu { + /* line 135, ../sass/tree/_tree.scss */ + ul.tree li span.tree-item .context-trigger .invoke-menu { font-size: 0.75em; height: 0.9rem; line-height: 0.9rem; } - /* line 145, ../sass/tree/_tree.scss */ + /* line 144, ../sass/tree/_tree.scss */ ul.tree ul.tree { margin-left: 15px; } diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot index 8d889083969641eaa461262406f3449d9ba29a29..0d7e45d06d68d1ff88b65b3c9209f299945b3af5 100644 GIT binary patch delta 549 zcmXv~O=uHQ5dPlVw@Hf86kRL0X;_oAZZsq{q>WGyRjQ3bDOmqNv|W?5IW#t*jaG>k zK_P`AhIi>fdloz>rl1Fv?M=KXc(NK1iXIdzsP&-6Nx*^m`R1E>GxL^)%g0pLE+Ab| z6T&sPUaa&LXKTO5fKU>EccA~^A>4w4uu0e$8ji-UWqjWNc8c(5Dre>Y^hN`K(oeY$ zU2Jx=(iA!T*zIGW<*8tzIY{p7E?%y~;+zM$=mJ-eZzDm6s;b1m5Ju}

e zF!A5P$TI9Nt`E9KJo|oNgFuW#~g}-~qUo%#buau5$D|B;XlotXv`7jKM+;WrHDH9?pvmz|sd%(^b delta 471 zcmeAO*%HjUMU#O+U?QtI3q!5#wTTX;^|$;MF)(O+VPIg8ad&ZbW9VmK1M;r``3nBQ z`bLeZa-SF&7$boEgyh`B0;@wGmM}0dI{?LAr6(2_{Qu9u3{-yxD9@3eQ<)~2uW*2Y zffZ<;+=7hM#1ytAn%jVKcYxR|11P}m&h!MRR|Lpc$;d6Ks28qgcn%cU0mL0S`N@f8 z*?ISX2Iv449Lr6tC}3E{5DJvD0P+>`5_3~mC@^gY>YV~~gi}F&aY^B zPYjGel99pjnr$sZJipCX25#mTKoN$E(~C~P=>PZszhxC)Z)Vg`O#*97 zVh95H9SE3!m=P@I0OA4xGt>P|Ojj8v-(*%2e**L|$RZgA76y>9dJGCc7T;tc7Inri zlPy>bm>9lI&S24D`=9YZnt^e0A*;dUV=VI+llG9NSypgQ<-_X GfDHh+5Of#- diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg index 36a0c4856f..0d525856b6 100644 --- a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg +++ b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.svg @@ -2,7 +2,7 @@ -Created by FontForge 20090622 at Fri Jun 5 15:37:46 2015 +Created by FontForge 20090622 at Tue Jun 9 23:00:40 2015 By deploy user Copyright 2015 Adobe Systems Incorporated. All rights reserved. @@ -245,6 +245,9 @@ z" /> d="M216 375l187 -187h-309q-38 0 -66 27.5t-28 66.5v375q0 38 28 66t66 28h375q39 0 66.5 -28t27.5 -66v-309l-188 187zM751 422v-422h-422v94h234l-281 281l93 94l282 -281v234h94z" /> + !*d{i2N3t<SV zO|EMJ8US*@iQL4B0*2KLp+GqcAYUObF*kLE0@HS&))zoWI2Gg)yfra4!kk(;P0J3-{XECc!p3JO2`3SQP%L5q(#>p31^d_sZ%wvj= z12T;#3$SoACIDGRlg(MTaLVzU@Tc(C@Yihq!unJ;92h_h3``T5-ZO9lgI@ O(&Sef%FJ{2F#rJnKY+&o delta 418 zcmaD7G$E*-fsuiMftR6yftew|%`L?D$t}M{3=A4yfTA+)F0O72{S0hC{uLl!!9Q5v zs4-RU69WTd1dyMQoSRr+b?Czq1_ovapxCSQ#NvYg|A8hkXq*AcbEM}~rb*^29AIEz z1)3+fAR{#~g>8xEHlW-cAU4a$NUcv~cV~J6)GPuNP|3(GsSvJacn;+60OF3E{N%*4 z?7VwG19X7$$8r-Z3K&)~gaYL(fP96##N5;s3QXI9TBiUV;Z%@cTv9lzP@jQ8{RU9} z6WDW%435`qYZ>DCZN4&aGrs_eGhCcrbOJ&%6`h#GXwIGlR+%)}j!~BJ{^l6QtBjLP znU%z!0Q~|A9~lM~29O3l1_dCCZ*m^9I^&ngQ2<`;;Ww8yxT`zCd z_w#nunVvp7%(lWA7)6A!s<_WZ*co61ibxs}-2qph1R(OI*fCcrjxxJ|q2!y))#M3&pG4UI;qeiKW@YDP2?C)HfIvigAQ1Hxdi0vNwT0(dPd=I$7qnyNX#S)_f1*H7dx8esll+72O+BB^ zMF|Fh01)*PNee0kX*!tNTYy013{Qz>5D4vK5iM$?lcS3(2t={|q^WztnX|t0zUQL3 z3E0HM1nk6qe=z)V-0?IyAmbWCHFyJV5JJXv^LYR0s5_Jv5@3Lj$rR55atOpz`rjJw z%bb{ifCBiFWQ2VS_rpuVck#HOq&7^R{|V$RvCT}(K`2bLmS9kX(6?(`5D`BL3JCOH z-m;}XsT4&5pv3+AREy`L=0xjPR7t|V<62(HUM*F2KE(;oXP!RzI8pID3a{l!S_wOX z@|BXbk2u&ll)Ky|RVCrx-AprAIavy{I1(MTE|xnr-3oB#-2gp2Zb=r%v7%){w~jQl z-ByG2_UM!z_XtK#;FSAM0XhNJ178_UU*Hht{ui}@)gg46P7pE$1Hum zGBO%AT5%+PNsK$TpURj$BFwmNRcXAB`O!T4`oGA%AmFxS(>q|6R5qzMm7#iLhUy z99XOukg;VexhPR9H_ZE5`3j4b#Q8;p(<#s_xWI-T#zYqjhu_@k6$h!mUPHtgW8UrKZdzh;+S*l(zPqJ_z$j>Z$+GCa4u$JZ z&eHzt3JDXEsoXRV6T>I`x05vv;;1}f2R@&$5I{IRAZ!8<4s8f43FMs>$w=B`^;0lzrMq&qMXfC zx53wq(T<~mL20hWPAP@mkaNC|zqIEonmuUv1GXtnH#>^5(H9cEi*)oU^pD@F>W!BW z1qvN=b@Av%)~^!zZKhFKQ{_^A@nK4(XeZHP5CW$;kI{nJJrXA%p&koo{IPN87d%R` zNqzrZz3BTQt#zU`Jnz?Qf(8xHeipH7ttT;*e4dz|ptjAgUb{jzKNDqI{A>tEOD;%2oYexuDI_$T7G6szvepx0P= z1=>#8aZoQ0w2^q3y)=CGL$F0zT3f1pHTY7eM!-Vf8#B^LUnO^-m)CEmu$0HfHT zN3CE&?GN-pvg=tsp*InXt0JmQVm=oW1n!5wXbu*nzG4m8$*>qR0cvgod-Bp)ZOVrQ zIHn?YXd&4ki#O7H8O8N*gE6O&5pi_9+a|*r?R#r<4>4(?yI?8e+M9^PgZ?Qc#d3FJ zE{2_*WFqaWDAc%ufKEQnH4>IfV4)nvIHZ%5SRt+v^F)+de=on^U!8mziYB6`WFHdZ z6);Q18BA}W`1Bk(SIe-}AaY;!WW^}e9|x#!KxHZnMxyS~9hb<`Gs0PYeZAeih}V02 zDa1@#$twXq1K`ruo>zO}9;JJt_l`w*(|e9TLzUETjhLX$nAZm1O8XxG*1S)tHQ)V* zPdn{tEZ(1|m+`;k70gfJer@ksa#Nty^`>4(O+0Ns9yzoc!}&?EshY96;jdqQ5J^?A zu=1Q_%VdmFo{}jJ)kz(;zDX3R2YgZ8kK{C6+Bgqiw6E$V|Fp#sa=I<_UBR&QiG;Iu z=SmN*Z(Ppz11xpNe#*LFViwzdXF{?%6psqf6ktX=o$<6)`MwzoF^n z1`_n^P}s+Pt_FG+BeBP638O=do8AF6lB!+wMd| zldw!xLT73#yTDH15Y5m~?EdST`dO)Wa7BcVi13Ab{512$p~!LH!#y(`K&En4=b6KU z^V=d2Y@#ILO}R?+M}6NT7ErpmXmC&+LE9>X)%Y-)>pt+Z1@Cz}mGM##S?!$#*`-A^ z$1ktn7B@cUoA-#Z=K_Aot*icB;KmH($%r{DdDH-pbQ3Zz`;VHoE8r z(%GHpDY0t;OX6s$2O=5u2uyp?e$%b<@!2^uxrCpMPNwI^Ot<0N>N^Bj=}G;`&l1s& z&&8V-#b~zI3iHr2*Lbyk*6_~OMi(>hl^=uYfr0P8K5?dhnL=0TZ*5jeZ4TcNAD?cvrj!)b_Uf=v3tX7%C;a&$fxu=x4iczbml@yL>r=U<$7qX-8{VSFV)4i8?B`1C6eDXud}1Q zWIj-u@J_$@XxmKj^5UO5ESn1ap^P48P2};S&t!MQYmG@G$MpjKvz3oNh ze`%(aiyU@jj0N8Ca%GGKJp-c|Y@e(k}OodFl3-A143=KP8*~h6iGAR+x90Ij5ksQIILR|NSi9_HP_B zRWWpS2Z7JTHpPDUEC{QxoMF2y+B(aiFP#3F&LEIWukA z=;*C^&S!kza4jM1e1^erE=8RMJ(Z|Zrfx-9J4q$+cKJDN zm2?dZHghZjO8HEJ6S8aEe*@h_yxUu{6&ta^^rp`e!*~(}lSjg*HIFPG`oN*n|G4jh zG^^#9$5toAT`X@yWB&0HEeZhslex#6#2jCij&mxa#7ai&)>3zQd~&tysRaDhB1K9z zPcze87}M4|DWLw!bdTN>7mrq5b@}a`;|oH}J8I+Qhy(3(5y)#BD@qDHwO(|2wyWG@ zMttFcjhuB4-!#VxUXc#S)uye!zOjQnhB;gDzg+!&Mt>~!e~>G`k#gYb?pSbfw?YGU z4}p6FN@H;EG-E>c=QK6n78pSKJhY&Xgek@ct*&Yff!z*;Ia@^6WoNvlL^XEcuf}T@ zO>?pmjWLak$gQhr1?|mXfEN;(WX-erlxr&U8y>5*oiX~J*q!3 z(;Gz3B17D>{$Nxttes<5nzi3)fLi#~-mao4a#5kckFl0I#;4(OhH2ZLf~PsZ60x_4 zfFPNY;W&8Cagj<&UN7Gjz>{ODHZsJUq~{7QRQu|`a=#r?2k5yJVwzxy%w)rE-}(AJ; zc5y_RgVl6PPWPg~s4>gWT=p@ctj7+-CeDif_*d21_Ag|YOsP%)hvzpzKfe%MgEh#AMsE7U9$g0p z66inS((LU)VxD)`*QlLIRW|ayU_bX(n&4#KKQ}y~hR0r8`m@lzqnJP&#Q*jg6B`bd zf8q9d)JNRldU)-=hUbpb>##S#kNMNSh!b6h*G#6Wrl$2+$@dQCMBDI^cNH5;sc?H~ zZn4Nrz`!&OrZ4I91;?{&3#RTw2fgh#ffWmaMNVl9@q_Yg#!~6cYx_>AVH$j4&-XfDPE9Y& zLVm{8-E8T#+cewM)hQQ3Qxu9wqA9Lko%PdY1C11p@~Gi>=L34M{2Ym-Q;dQF3|9q7 zm$8>>qKVT6N9`#kB`I$q;;Juz<{xETho^0mv*V|tb!8<*O(iAs(B37sT`b=C!4St- zCicW&xD z-N>F{J~iA2d);UBMY)wdex;4&;*A^+sQ%}6L5m6WdwU7=uNzkSMAki6l=@X86{>y& z&qN3;{dq8*eeZ?8z0u@N6x2hC8}@ox0e~ou1?RkhnBP_3lzXhzCqKO4>3f^Jxp8|Y zdG&C&u(DFSGhRt4a)4?0>p(2?W&ZC7>5ASMw20t1)kjmLL}Cl)WD>z(Skty>UjV3) zmaRNHPH&{`7082QK-VO}D=z z>A}Fz$?DdG{@QIIBkw+tdGjH?4|roqu}cjO53(aq-SZ8t$oA1&GEf+b%D~(rPZGWo zYtEh^ISF-*<8CLMGR0q(@|eiF%94DP>|~gWo2tl@+xQ7>boD5N3uoU|3VYx$@an~( zAGmU(3i_$SYG|AutgkvDH?_M`z{1%e){kL*T{#?n3k!^zzS%_MW~S}u*LpV-XinPv zu0+J!{lFIy;-wmXXM{KB5I}v&l;K5D=d)0*vy3kqeoo3@EiGj5D_c!BqQ*9ri}FDD zm$3_S~8rvaDQb67%k)TLS_-* z&#zk|(4v!wU5Knj1dh}iUpkoOw<*Sx@s%Ds^Eu;JyE+uATr7Hwy*bp2iX;`|c)r`R z=9e!|-q>WmGAm)Xi038cvQ$@JIJ%<*3D&TVTE1Vf8>N`GYmgMqAc~#DgM}})B*5Ni zdo@pDLlr4bW9D5(R+bvaM812f*b8aAFE6sz)7I2?cGjP{`?s_MJhD%!Q~k(Ux?pJL z5WLpUTF!H2%_&S=x>8Q5RU(~I2Orkm`lb>U`(LUUF{mh~hg}2S5}X~+N;PuIw(1as zLZj@x=KOC=TESG7xKAGyo_|s7rNVT@Q!!`@`O?+WGhG$;+*I(1--FIty1%*UpeDw; zVWPEnVBbdf$$l&bWO;?fCQ~iC-YN!|B)^H8@|P%CeZ9?9u@zAysg8WL#M%^-`+9+H zK=7Y!R!^X-ZdEZWwnf%w0G;{QZ3L#k^(p8K2*amd7rsBH@yG_(>?$K< z1UR#eTitKc-!mi`>)E?oKv;AEDp=K{Iy{M+1wz{1s!I9jogCWr1cO++(YmJMs@%eJ~9Je$AGdQpL2k zK9Q@QVMs_BfWlgdMttXKSDzP6xW$&|-}dvZRh6u55|UWlUry7%`a|St@?@Mt>^3fO z2|3n5m2UL+kXE-%t&IhyoQ6LW@br`vazV}M8b(d);^yPk7%S4^%^2#sw;=|@JQ9- zJ=c3@vih$xriwy;GFOM8Fu`>=lCFQvRERaMv-X;+Pse{sK$V&87=IQO5PubQ4lDYO zKd&bp%HSTzO)b0nDfH_rVM>UQyC*M)q?*oibkt){c3DsMvvCe*=FFz7P78-ut+Ez# z75Xy~K>H|!vL0&iNh~40tQYQ>q)N9^q(5`G*0GpTkTAgkgGarFcv?Clh`w(k-Zn>! zKzT$z48I;pmkyX@>a!qn)ZqA_LHy}nj!&5X9> z$uZA(qUhx3#V)8rq7w)U-1-|-{Y{r-_k+T597IgK-Cxx-lpsVSW5iN0*qBM(u8QRE zxol83);5KkmDzDA{FBk04yhFVTa}=ru2Gjd;`vIOdM9vY`A)>4ICUB`n;e3rY&pXN zaG(25MdY%@avf7~D;W!2^}i)geMq$9R~ zDK*`SqRynA%KZ!n#|#%aWDmpr)4P&5=2HDV4Bz`3H~ay{?+I5Nn3?QVtuzO5QJ(2K z9f=OKey;Q)67x`{i{DLA2C%$_1cTTez+_a#-hm3n*D<=-wA3&Exnlw9nUkfj6?oem zz&qKGAa(l@sV!1--e7(qpSa{aLanLXNG^!s2>W;lk_^80iG011^0 z81M<((?|NSsR|-pzH+utgznbCtLS>3yVW(~drTB_55!F3v;X z4BS+>G1KQPqt(Xz>g03J^;TBkjHw!K`n^y}HbgK*-DK=jFv;FasA_mcBp07_lqlwc zTwKMP6QS(d3a)o)F?*N)v<+_p5EeJ}IgVU%m9@fZ4N>WA*;19wa06BA#l8rSQ_;HoWOZUv z6LL8XNBf;&tMkrmJJx4vF`r}PN(OA@B6c_d);T9b>3aGurL_lp)M~ELIa@|I1EJa-_A+=-}C>s@yd+};$`hdztqtSIe? zcKpqOo4Nof2v$UyaQ@TdBM1X-=Vb)~VRnH)5mW?v?_g?g2?A07_l6Cq2AKjz^g1U;7grF7_9x0yiPEWak~5#@yt#>m ziHV7YQ-ak6(4I~B!7!qQ$M?MGn-Vl=fugCi` z9T5KUIR#6b4L8!9d7&_CV+6a5B!WclMZ#Im%H!ini-K zo|JK%B<=3fis&RB=87>kzHm5m{olW-Fu|cw?AB<%cAkPMQi>2cHTr(R6f@qe{be@Z zo#DG1Orm;t1e5%v^32SPXE)tCPonIo-GLtP3nQvxYfvX2-kwP}x9IpX7 z2DX#N@829EC)w9tHG~8yeo2;6WvB*Nnvp;u%8%nvG4VsML>Keq>k@` zT-$xWxq45XNuiwww(*hX>=4UzcCavKMP7Jl6A2~(*Q(sWnj^}5Ci zCQIb$X3MqI9w;m*DJspZEp5pho3_Yr=pLK@TGgB#Q|d4|>btjp$N;9IaYs;ug(Dg{ z*z>LO;M-T}TYy|M2LG+byJ*Z-0Eb9~=q=IP|9+QXJzP)C-kKJ8DU#b%uh!R%%}%+J zP48Enr9q{|u6Mg|tsb2=tu=@&)s)wRODQM@Jb z<2C!iXDY?J{{2b35VHP;X>ZZwnvR%rWQD?B^+&TMM!y>uegm@In0X1E#`(t0U`V169z?$SuM3VRIuA9~3c3*$Rdlf4g@Y3*)#p9~d+_1mtx zDL=IR_~5_qas|Ct{*(qj?(y4%1(=5li%t^VepNc7Y)XCrvrnYQxCjuz6dplnqQRS2 zN%DR(vfd=eR!#sjTpBl;RhpfHG ziKucy&%|W~$_~O=!lx3r12Q4MU&h#WH>9jTP4L5^xp0PAM%;|yl!}Htzrw}hu{tMZ zT8hY}h~JoR3dl%_*VNZK;y#m#LvM*r5ie^UvK>748T13>$`!qvy3^O)4V2j>E|R0$ z9w4)G@633f_np)o_%e}gMSC;)c%5iVghX?vsJz_&lW?POG5*BFNc?22!u)J$#yA^Z zE?L)*n3gIMm1gf?W%hoKuKt@!?JqG%RJd+k67TrqSAEgc2a2KwvYO-fpUB~nz1Iz* z2kAn4^_`!0OKV#}e|+^I#M3(1{y?Ze~MIYe0-D?QAWNk|+V zzLy=!GwiNnK{5$7-6CyV|BUavn0@n2oTo#3ma7L`e_^r0*2KO%Q-Dz?VDW{=71nei zRF*lo^C{|1eQ3_{k{@HmTrv|QLHe>CUl(85!FD15(6Bdn&0reTb-$@z(0U-!Qh3Dm zE%1#Z4rk@yn#`ACtb~@^yX&RF52w&c3aQ3(Yscd;2#QO8VF?xBhJmo^KkBKxza!j0&8YLwf zO4Mxw-~UN8UZiA8%BJz-zkB+cMFI+A<6UUG?OPGScu8fcK!&;D`^8+4G{0c;RIw$o zNrL^~@fqANHrV#VRT*CMS)%PsMg!%=Hr3Ae(8i-8|2MacD;xt~aNk@Td9ZB{Jw~N; z!<6ktI4M*^2lW^go>m4v>+(vez72g41y#*H{(!exT$|)Q zd{Jf}P_5T8UfuoC{D-xgM&X0xy(dFMDgkDbseYE1s`gp{y+f81B$8%~RAXymV+=>(S06(pk7UqIjqzSt}=V!xKIiVqme z6KwEJ!PA5U&3_^{K4i>5^wGy_z7jNzQ$**mYS!?$+~ZuiR{IBt^IKM5>+0!!lr<`- z7cmqh^K~5Yt@0fB$=4!gIj~drL)MKT*V3}Pb8is+dqe)8MXc9C)vwLF>;&Qh{ne}m zyoJzb+t;FWn!tpuP3RZge8~F8TpU0`z%QuDgn^m`pWv;5UMeUxAQQa?*UfUn?8eWW z-LlI$I{lTTylPV9u;=@fgNUKPB1#Bl0d&Yb<~=LqEpPJW#C z-hVop@hDcM;zMlX`=MZij(e`~GGPl7EmikfrZor_HN!O{&6nc1=OF-psXjJ@LV>eQ z>`$ge#KT$V!lRvkp@p@P_Jv91i|*4>eov(|n zMtF>_81LI7OOgnEnkKl5^St(JM<2&d)}@l_SOVb2lURQ$sra6)KNH*taZ#d7SC5~t ztf}pgp`Eim_eS=~3giLZhQYPaTA4C8#FUu7MtY=ry>!SbSiY4t-90~uR=d3@j!Rz) zhN~@LhNpkp-|H&7nWGe2&gH$c+FlPts`uwxE4Y`22=GyUBG3^bBUFlX8gN?VPJEVM zv^uJ2E5tb6Mjl0lv_RQu1df(%|Tf@CnY4G$YnD^l>VlM$bjG%{zQ(E??l(TY)Z2wmpGt$v*F5mXl*qmtn%uZ`# zJ?|oq1{Rq(2^qvYd1&i93Qr_r4VxC}sHUkKE4>qdg*?@TyH0IV&21;(QvL<9N}xQm z*j6^9BF4Mi#!qL)`|x=4KME$`o}f{?0@KT#~kaflCYT739ffy0Jg7DCF`Ap-jh0sm~mJ81KL#MG8WGH zGrSVwTZDGmOb2I;uW@o(DO-2R-Sfeg$$j^7$Dti561M~blkRUDEN5rq8@mRPENPw@ z@7GJr##n#rs{AtUAUC~^7=?=)Ta?fU+@?KaQ6OxrtJrHFDNWt>;ZhDnOYdFB!&F|} z0J1f5wfOfL7#=2=SQNrVV7@txgD@_f8D)hrBJng5Afs!Yv!@>fsS1jfPRv2-}SHNE%4P961J~3x>2kgvsr+o^Vw_6 z>oN?VlkZdJBRB&`$Wk5j(8{I|ahR8%Voa2vJRYRdGZtX2azm0ni=5apmSJ&|+J#}+ zf#g6eS3vr?7HBMRl@0khSldzGl!k|AW;b_}WDjeUz*nHh{Mr5C7A=XCnJgVp8ArUk zJ-T7`SxHIKC~4)Vn-*Dw6?79QYpASjh&DXi?lm6aj+4LBBCdskDdL|zh6n(~Jc2+*I{$Si1%YaZ|l&7YFN#-lu5S zpqZ3T5#m(}i=4@mXFn2k?pBM?U>J}W$8kdRb0NO07=11Q(&_&=<9kRR1gi!wu>YzV zg=~n$-4mnJ@=jvA*8l{<(I1{j=*^FMy*Mi4yxTU*3pkSdD$-XJkQff%Nos)CsFLTD z6ga=F703))iJ^7&V{%kcJ=1lb~J!?G0@lFd7QZvY`@Jex%Z-jC+w#V?u#I+b6@cHTc$YPgUSK=g;MuZ zH3w6s?EK)*Mwem{WN+5vTuW9iz8#7kr7n#9>1RR;t3P40sIWuO^_{qa4l|^nHW4so z<%hbdeyaSTW24b5rTtjmyuSnaSF7*Mr`8N!g|PWn2Qwi+6?n|E|#TaS=s zO}dQq1>l0Uo=4?{6VB>nbb<4bd#|7Tiym+ zt*jHZ+>=VVNay((v2R#Ar?1S-L2ty;TQE8D$BHMUbNo^TMOSo+zrC0~p-7Y_*OnmY z>RR@3`18`Eoce^YNA~G23`DVc>oIuic)2`tL8>I?i}p+G$d#cEC4RM_vu}j-tD^VY zQos?j56{=0^QyG{D7z z{z%E6smR-n>ue=8jwF7f?MU5l537ho$uMJn%sLjw%fdEb!iKMqj4WNSH#lE0RYUno zdX3RmxYk0f2^x#0P+FDY4`tk}=?r9u0FagO(H-KJlMyeqtq7*Ak?#&WdXI~SxJeW> z(q7z*@kEuh%UE`{(Fu#OSgtxOHND?i*ofJ((brm9G$eo*CD*az4NtvXX*|Jaacdew zXy-;2yRt0daA#(PlkcqxH3ok>n2k1;YQ~>?=t|%ZH4N^A@UG7BO45WMQX;jZ06TM7 zSfzK#)e7*fbQxM9lHjuK$a2u5UHzP*-;{N!GOMqmPET#X%+V1R2!}B2(iX(T>OQdz zkYYf{`hoh$#D=c{Nb+Tt*8ASG%-rtzORvsmvDKxf?hQ-(!k6y2uFbzg z%YEF>d)wbTk?KJ#J^kZ25}+sO*{WfKTxlWt{vi<7{r9z$94*A0@e&7P(c-RFt0m3757@f_MNN6)LUMKq10mIhi&TJKMh2zc0F=g8~^n3r@IB1Ftn#fuVs0PYLTNJ&J ztI}-#*i#~8w_als)5je^U^&)ik_vD>#rtWG^ZMQ@wH1S{o7b|j+50{tP>Ano;fus! zC#qJJyd4vw>3sxt5arOz{gJMbvQTd46LV91M1c^2493gRC>oR2ys5S^zv(oNmRnEH zv=VSEOS#R5k?SQ*_qfqmfMw%l<*D=f&eC==4VjndcQUna?KSJ^JJgzGeaKL-rFr0h zTj?6?cfrF~C%i4Dab#dD&-+Q8sYOGqY^G#mtIwwuH=e(Wf{lA-92Zyp4W+41R?OPk z3EeL{?**PUf8Q+LksnuhDe&0dVwlC3*4RhxTBEvQ1HrR(_~^1r4CI~IPxmar^ElDFg}$jRyZdi+eVZeB)Yc`8~PYc{S0fVJJUqINee@&l@9X*q(HCVs>v z3k*HaXWqmQK>ykbsYhDc9sXh&1?tJ4`t*IcoGx^*?VRv)cVB^h7 zs3^sKZVpe=l!U8kOp>XlU>SK{Jj98evJ{`lj&z0Uib}sQOMhTE z`3aS+Vxeh61BP_?WYIvc{v0n)XR~J&=tqUjeKIiXqR1pSD4`NaJ5WWmZVm(4yHznM z|2)5N-F+Usji{;&c&lPq^M$4+dT-J;a{M_`sfq$QU%mgkP`Qr2`NqP6AY^0USX%Zg zf(mN2_(e%GZ#V%8Uk;SRl2eXD>eg5-eN{E6J)Et9>#YRHDukzsxE+lLbH6NI`t@&h zIh%tot=U`i^v_a0pOiFJSJBgZjh|&gmrvN;=%P@O04ljaB`E0s%Mw;G%y6-ZP0UbX ag_R;^G{l4+1B4R+ii>Fk(_q9Ci~k?8c)V-? diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index 47b9a70493..feab47efab 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -28,8 +28,8 @@ $bodyMargin: 10px; $interiorMargin: 5px; $interiorMarginLg: $interiorMargin * 2; $interiorMarginSm: 3px; -$basicCr: 3px; -$controlCr: $basicCr; +$basicCr: 2px; +$controlCr: 2px; $smallCr: 2px; $badgeW: 35px; @@ -62,6 +62,13 @@ $colorInfoBubbleFg: #666; $colorInfoBubbleBg: #ddd; $colorThumbsBubbleFg: lighten($colorBodyFg, 10%); $colorThumbsBubbleBg: lighten($colorBodyBg, 10%); +$colorLimitYellow: #9d7500; +$colorLimitRed: #aa0000; +$colorTelemFresh: #fff; +$colorTelemStale: #888; +$styleTelemState: italic; +$colorInfoBubbleFg: #666; +$colorInfoBubbleBg: #ddd; // Ratios $ltGamma: 20%; @@ -119,7 +126,7 @@ $controlDisabledOpacity: 0.3; $formLabelW: 20%; $formInputH: 22px; $formRowCtrlsH: 14px; -$menuLineH: 1.5rem; +$menuLineH: 1.4rem; $scrollbarTrackSize: 10px; $scrollbarTrackColorBg: rgba(#000, 0.4); $btnStdH: 25px; @@ -145,3 +152,9 @@ $imageThumbPad: 1px; // Bubbles $bubbleArwSize: 10px; $bubblePad: $interiorMargin; +$bubbleMinW: 100px; +$bubbleMaxW: 300px; + + +// Timing +$controlFadeMs: 100ms; \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/_global.scss b/platform/commonUI/general/res/sass/_global.scss index 0ada165ec9..be0afc896d 100644 --- a/platform/commonUI/general/res/sass/_global.scss +++ b/platform/commonUI/general/res/sass/_global.scss @@ -69,6 +69,10 @@ span { */ } +mct-container { + display: block; +} + .abs { position: absolute; top: 0; diff --git a/platform/commonUI/general/res/sass/_hide-non-functional.scss b/platform/commonUI/general/res/sass/_hide-non-functional.scss index 55cf5047f4..1f029674c9 100644 --- a/platform/commonUI/general/res/sass/_hide-non-functional.scss +++ b/platform/commonUI/general/res/sass/_hide-non-functional.scss @@ -36,7 +36,7 @@ // Don't pad in from top and bottom //top: 0; bottom: 0; .object-browse-bar { - .t-btn.key-window { + .btn.key-window { // Hide the Open in New Window button display: none; } diff --git a/platform/commonUI/general/res/sass/_icons.scss b/platform/commonUI/general/res/sass/_icons.scss index fda57e977d..1b90e6f0d3 100644 --- a/platform/commonUI/general/res/sass/_icons.scss +++ b/platform/commonUI/general/res/sass/_icons.scss @@ -42,12 +42,6 @@ &.major { font-size: 1.65em; } - &:hover { - // color: lighten($c, $ltGamma); - .invoke-menu { - // color: lighten($colorBodyBg, $ltGamma * 2); - } - } } } @@ -56,36 +50,35 @@ } .invoke-menu { - @include invokeMenu($colorKey); + //@include invokeMenu(); // $colorKey + text-shadow: none; display: inline-block; - font-size: 1rem; + font-size: 0.8rem; vertical-align: middle; } .btn-menu .invoke-menu, .icon.major .invoke-menu { - margin-left: $interiorMargin; -} - -.icon-buttons-main .invoke-menu { - @include invokeMenu(lighten($colorBodyBg, $ltGamma)); -} - -.menu-element .invoke-menu { - + margin-left: $interiorMarginSm; } +/* .object-header .type-icon { color: $colorKey; - margin-right: $interiorMargin; + margin-right: $interiorMarginSm; } +*/ .menu .type-icon, .tree-item .type-icon, -.icon-btn .menu.dropdown .icon, -.super-menu.menu.dropdown .icon { - font-size: $menuLineH * 0.93; +.super-menu.menu .type-icon { + font-size: $menuLineH * 0.8; //.93 line-height: $menuLineH * 1.13; position: absolute; } + +.super-menu.menu.dropdown .icon { + font-size: $menuLineH * 0.95 +} + diff --git a/platform/commonUI/general/res/sass/_main.scss b/platform/commonUI/general/res/sass/_main.scss index ec2160048b..010d590669 100644 --- a/platform/commonUI/general/res/sass/_main.scss +++ b/platform/commonUI/general/res/sass/_main.scss @@ -45,7 +45,9 @@ @import "controls/controls"; @import "controls/lists"; @import "controls/menus"; +@import "controls/time-controller"; @import "features/imagery"; +@import "features/time-display"; @import "forms/mixins"; @import "forms/elems"; @import "forms/validation"; diff --git a/platform/commonUI/general/res/sass/_mixins.scss b/platform/commonUI/general/res/sass/_mixins.scss index 107726e992..8fe4f731c0 100644 --- a/platform/commonUI/general/res/sass/_mixins.scss +++ b/platform/commonUI/general/res/sass/_mixins.scss @@ -26,6 +26,16 @@ width: auto; height: auto; } +@mixin trans-prop-nice($props, $t) { + @if $t == 0 { + @include transition-property(none); + } @else { + @include transition-property($props); + @include transition-duration($t); + @include transition-timing-function(ease-in-out); + } +} + @mixin trans-prop-nice-fade($t: 0.5s) { @if $t == 0 { @include transition-property(none); @@ -42,6 +52,12 @@ @include transition-timing-function(ease-in-out); } +@mixin trans-prop-nice-resize-w($t: 0.5s) { + @include transition-property(width, left, right); + @include transition-duration($t); + @include transition-timing-function(ease-in-out); +} + @mixin triangle-right($size, $color) { $size: $size/2; $ratio: 1; @@ -115,20 +131,35 @@ } @mixin containerSubtle($bg: $colorBodyBg, $fg: $colorBodyFg, $hover: false) { - @include background-image(linear-gradient(lighten($bg, 10%), lighten($bg, 5%))); + $ltnRatio: 7%; + $gradRatio: 5%; + $hovRatio: 7%; + $bgBase: lighten($bg, $ltnRatio); + $fgBase: lighten($fg, $ltnRatio); + $gradC1: lighten($bgBase, $gradRatio); + $gradC2: $bgBase; + $cInvokeBase: lighten($gradC1, $ltnRatio*2); + + @include background-image(linear-gradient($gradC1, $gradC2)); @include border-radius($controlCr); @include box-sizing(border-box); -// @include box-shadow(rgba(black, 0.3) 0 1px 2px); @include boxShdwSubtle(); border: none; - border-top: 1px solid lighten($bg, 20%); + border-top: 1px solid lighten($gradC1, 2%); color: $fg; display: inline-block; @if $hover == true { - &:hover { - @include background-image(linear-gradient(lighten($bg, 20%), lighten($bg, 15%))); + &:not(.disabled):hover { + @include background-image(linear-gradient(lighten($gradC1, $hovRatio), lighten($gradC2, $hovRatio))); + color: lighten($fgBase, $hovRatio); + &.btn-menu .invoke-menu { + color: lighten($cInvokeBase, $hovRatio); + } } } + &.btn-menu .invoke-menu { + color: $cInvokeBase; + } } @mixin sliderTrack($bg: $scrollbarTrackColorBg) { @@ -169,18 +200,16 @@ } @mixin btnSubtle($bg: $colorBodyBg, $fg: $colorBodyFg) { - @include containerSubtle($bg, $fg); - &:not(.disabled):hover { - @include background-image(linear-gradient(lighten($bg, 20%), lighten($bg, 10%))); - } + @include containerSubtle($bg, $fg, true); } @mixin btnNoticeable($bg: $colorBodyBg, $fg: $colorBodyFg) { - @include containerSubtle($bg, $fg); - @include background-image(linear-gradient(lighten($bg, 20%), $bg)); - &:not(.disabled):hover { + // No longer should be used; use btnSubtle instead + //@include containerSubtle($bg, $fg, true); + //@include background-image(linear-gradient(lighten($bg, 20%), $bg)); +/* &:not(.disabled):hover { @include background-image(linear-gradient(lighten($bg, 30%), lighten($bg, 10%))); - } + }*/ } @mixin boxIncised($sVal: 0.6) { @@ -191,8 +220,8 @@ border: 1px solid $c; } -@mixin boxShdwSubtle($sVal: 0.3) { - @include box-shadow(rgba(black, $sVal) 0 1px 3px); +@mixin boxShdwSubtle($sVal: 0.2) { + @include box-shadow(rgba(black, $sVal) 0 1px 2px); } @mixin boxShdwLarge($sVal: 0.7) { @@ -219,13 +248,15 @@ } -@mixin invokeMenu($baseColor) { +/* +@mixin invokeMenu($baseColor: $colorBodyFg) { $c: $baseColor; color: $c; &:hover { color: lighten($c, $ltGamma); } } +*/ @mixin menuUlReset() { margin: 0; diff --git a/platform/commonUI/general/res/sass/controls/_buttons.scss b/platform/commonUI/general/res/sass/controls/_buttons.scss index f8328dcdb5..98ca1378e4 100644 --- a/platform/commonUI/general/res/sass/controls/_buttons.scss +++ b/platform/commonUI/general/res/sass/controls/_buttons.scss @@ -19,20 +19,65 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -$pad: $interiorMargin * 1.5; +$baseRatio: 1.5; +$pad: $interiorMargin * $baseRatio; -/*********************************** TYPE STYLES */ -.t-btn { - cursor: pointer; +/******* LAYOUT AND SIZING */ +.btn, +.l-btn { + line-height: 1.25em; + padding: 0 $pad; + text-decoration: none; + &.lg, + &.create-btn { + $h: $ueTopBarH - $interiorMargin; + height: $h; + line-height: $h; + padding: 0 $pad * 3; + } + &.create-btn { + .menu { + margin-left: $pad * -1; + } + >.ui-symbol { + font-size: 1.1em; + } + } + &.sm { + padding: 0 $pad / $baseRatio; + } + &.vsm { + padding: 0 ($pad / $baseRatio) / 2; + } } /*********************************** STYLE STYLES */ +.btn, .s-btn { + $base: lighten($colorBodyBg, 20%); // Moved to s-btn @include border-radius($controlCr); @include box-sizing(border-box); @include text-shadow(rgba(black, 0.3) 0 1px 1px); + cursor: pointer; line-height: 1.2em; text-decoration: none; + &.major { + $bg: $colorKey; + @include btnSubtle($bg); + $fg: lighten($bg, 50%); + color: $fg; + &:hover { + @include btnSubtle(lighten($bg, 5%), $fg); + //color: $fg; + } + .invoke-menu { + color: $fg; + } + } + &.subtle { + @include btnSubtle($base, lighten($base, 40%)); + } + &.very-subtle, &.s-very-subtle { @include containerSubtle($colorBodyBg, $colorBodyFg, true); &.paused { @@ -44,9 +89,10 @@ $pad: $interiorMargin * 1.5; } } +.icon-btn, .s-icon-btn { @extend .s-btn; - font-size: 1.2em; + font-size: 1em; .icon { color: $colorKey; } @@ -93,19 +139,13 @@ $pad: $interiorMargin * 1.5; } /*********************************** LAYOUT STYLES */ +span.btn, +span.btn span, span.l-btn, span.l-btn span, +a.btn, +a.btn span, a.l-btn, a.l-btn span { display: inline-block; -} - -.l-btn { - padding: 0 $pad; - &.sm { - padding: 0 $interiorMargin; - } - &.vsm { - padding: 0 $interiorMargin/2; - } } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/controls/_controls.scss b/platform/commonUI/general/res/sass/controls/_controls.scss index 20ac37b2cc..83da982937 100644 --- a/platform/commonUI/general/res/sass/controls/_controls.scss +++ b/platform/commonUI/general/res/sass/controls/_controls.scss @@ -19,7 +19,8 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -.control { +/*.control { + // UNUSED? &.view-control { .icon { display: inline-block; @@ -45,10 +46,10 @@ } } } -} +}*/ .accordion { - $accordionHeadH: 18px; + $accordionHeadH: 18px; margin-top: $interiorMargin; &:first-child { margin-top: 0; @@ -56,16 +57,20 @@ .accordion-head { $op: 0.2; @include border-radius($basicCr * 0.75); - @include box-sizing("border-box"); + @include box-sizing("border-box"); background: rgba($colorBodyFg, $op); cursor: pointer; font-size: 0.75em; - line-height: $accordionHeadH; + line-height: $accordionHeadH; margin-bottom: $interiorMargin; padding: 0 $interiorMargin; position: absolute; - top: 0; right: 0; bottom: auto; left: 0; - width: auto; height: $accordionHeadH; + top: 0; + right: 0; + bottom: auto; + left: 0; + width: auto; + height: $accordionHeadH; text-transform: uppercase; &:hover { background: rgba($colorBodyFg, $op * 2); @@ -84,79 +89,14 @@ content: "v"; } } - .accordion-contents { - position: absolute; - top: $accordionHeadH + $interiorMargin; right: 0; bottom: 0; left: 0; - overflow-y: auto; - overflow-x: hidden; - } -} - -.btn { - $base: lighten($colorBodyBg, 20%); // Moved to s-btn - $p: 10px; // Moved to s-btn - @include border-radius($controlCr); // Moved to s-btn - @include box-sizing(border-box); // Moved to s-btn - @include text-shadow(rgba(black, 0.3) 0 1px 1px); // Moved to s-btn -// display: inline-block; - // margin-right: 10px; - padding: 0 ($interiorMargin * 2); // Moved to s-btn - text-decoration: none; // Moved to s-btn - &.create-btn { - $h: $ueTopBarH - $interiorMargin; //$btnStdH * 1.5;; - $p: $p * 2.25; - height: $h; - line-height: $h; - //font-size: 1.1em; - padding: 0 $p; - .menu { - margin-left: $p * -1; - } - .ui-symbol.major { - font-size: 1.1em; - } - } - &.major { - $bg: $colorKey; - @include btnNoticeable($bg); - $fg: lighten($bg, 50%); - color: $fg; - &:hover { - @include btnNoticeable(lighten($bg, 5%)); - color: $fg; - } - .invoke-menu { - color: $fg; - } - } - &.normal { - padding: $p * 0.5 $p * 0.7; - } - &.outline { - &:hover { - background: rgba(#fff, 0.1); - } - } - &.subtle { - @include btnSubtle($base, lighten($base, 40%)); - } - - &.very-subtle { - @include btnSubtle($colorBodyBg, lighten($colorBodyBg, 50%)); - } - &.lg { - @include border-radius($controlCr * 1.5); - font-size: 1.2em; - padding: 7px 25px; - } - &.icon-btn { - .icon { - color: $colorKey; - } - - &:not(.disabled):hover .icon { - color: lighten($colorKey, $ltGamma); - } + .accordion-contents { + position: absolute; + top: $accordionHeadH + $interiorMargin; + right: 0; + bottom: 0; + left: 0; + overflow-y: auto; + overflow-x: hidden; } } @@ -166,12 +106,12 @@ .btn-set, .t-btn { display: inline-block; -// margin-left: $interiorMargin; + // margin-left: $interiorMargin; } .btn, .t-btn { &:first-child { -// margin-left: 0; + // margin-left: 0; } } } @@ -204,7 +144,8 @@ // Default position is upper right $p: $interiorMargin; position: absolute; - top: $p; right: $p; + top: $p; + right: $p; z-index: 5; } @@ -243,8 +184,8 @@ height: $h; line-height: $h; .icon:not(.invoke-menu) { -// position: relative; -// top: -0.04em; + // position: relative; + // top: -0.04em; font-size: 150%; vertical-align: middle; } @@ -331,37 +272,43 @@ label.checkbox.custom { .btn-menu { $h: 20px; - $p: $interiorMargin * 2; + $p: $interiorMarginSm * 2; $c: $colorBodyFg; @include btnSubtle($colorBodyBg); - height: $h; - line-height: $h; - &.dropdown { - // padding-left: $p; - padding-left: $p; - padding-right: $p; - } + /* height: $h; + line-height: $h; + &.dropdown { + padding-left: $p; + padding-right: $p; + }*/ &:not(.disabled):hover { color: lighten($c, 20%); } - &.btn-invoke-menu { - $c: $colorKey; - color: $c; - padding: 0 5px; - &:hover { - color: lighten($c, 10%); - } + /* &.context-available { + // An element like the invoke-menu triangle; + // Indicates that this element has a dropdown menu available; + // Currently unused + $c: $colorKey; + color: $c; + padding: 0 5px; + &:hover { + color: lighten($c, 10%); + } + }*/ + + span.l-click-area { + // In markup, this element should not enclose anything. + @extend .abs; } - span.l-click-area { - // In markup, this element should not enclose anything. - @extend .abs; - } - .type-icon { - margin-right: $interiorMargin; + //margin-right: $interiorMargin; + } + + .name { + margin-left: $interiorMargin; } .menu { // margin-left: (-1 * $p); @@ -401,17 +348,23 @@ label.checkbox.custom { } } +.view-switcher { + @include trans-prop-nice-fade($controlFadeMs); +} + /******************************************************** OBJECT-HEADER */ .object-header { display: inline-block; font-size: 1em; - .title { - color: lighten($colorBodyFg, 40%); - } - .type-icon { - font-size: 1.5em; - margin-right: $interiorMargin; - vertical-align: middle; + .label { + .title-label { + color: lighten($colorBodyFg, 40%); + } + .type-icon { + font-size: 1.5em; + margin-right: $interiorMargin; + vertical-align: middle; + } } } @@ -425,29 +378,6 @@ label.checkbox.custom { } } -/******************************************************** VIEW-CONTROLS */ - -.view-controls .view-type { - $d: 20px; - $p: 5px; - @include border-radius($controlCr); - box-sizing: border-box; - display: inline-block; - margin-left: $interiorMargin; - height: $d; - line-height: $d; - padding-left: $p; - padding-right: $p; - &.cur { - background: lighten($colorBodyBg, $ltGamma); - } -} - -.edit-mode .top-bar .control-set.edit-view-controls { - // Used in templates/edit-view-controls.html - margin-right: $interiorMargin * 10; -} - /******************************************************** SLIDERS */ .slider { @@ -455,7 +385,7 @@ label.checkbox.custom { $knobW: 12px; $slotH: 50%; .slot { -// @include border-radius($basicCr * .75); + // @include border-radius($basicCr * .75); @include sliderTrack(); height: $slotH; width: auto; @@ -502,23 +432,23 @@ label.checkbox.custom { /******************************************************** BROWSER ELEMENTS */ ::-webkit-scrollbar { - @include sliderTrack(); - height: $scrollbarTrackSize; - width: $scrollbarTrackSize; + @include sliderTrack(); + height: $scrollbarTrackSize; + width: $scrollbarTrackSize; } ::-webkit-scrollbar-thumb { - $bg: lighten($colorBodyBg, 10%); - @include background-image(linear-gradient(lighten($bg, 10%), lighten($bg, 5%) 20px)); - @include border-radius(1px); - @include box-sizing(border-box); - @include boxShdwSubtle(); - border-top: 1px solid lighten($bg, 20%); - &:hover { - @include background-image(linear-gradient(lighten($bg, 20%), lighten($bg, 15%) 20px)); - } + $bg: lighten($colorBodyBg, 10%); + @include background-image(linear-gradient(lighten($bg, 10%), lighten($bg, 5%) 20px)); + @include border-radius(1px); + @include box-sizing(border-box); + @include boxShdwSubtle(); + border-top: 1px solid lighten($bg, 20%); + &:hover { + @include background-image(linear-gradient(lighten($bg, 20%), lighten($bg, 15%) 20px)); + } } ::-webkit-scrollbar-corner { - background: rgba(#000, 0.4); + background: rgba(#000, 0.4); } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/controls/_menus.scss b/platform/commonUI/general/res/sass/controls/_menus.scss index d225d764fe..cc6f65fb7a 100644 --- a/platform/commonUI/general/res/sass/controls/_menus.scss +++ b/platform/commonUI/general/res/sass/controls/_menus.scss @@ -41,7 +41,7 @@ @include box-sizing(border-box); border-top: 1px solid lighten($bg, 20%); line-height: $menuLineH; - padding: $interiorMarginSm $interiorMargin * 2 $interiorMarginSm ($interiorMargin * 3) + $treeTypeIconW; + padding: $interiorMarginSm $interiorMargin * 2 $interiorMarginSm ($interiorMargin * 2) + $treeTypeIconW; white-space: nowrap; &:first-child { border: none; @@ -168,7 +168,7 @@ position: absolute; height: 200px; width: 170px; - z-index: 59; + z-index: 70; .context-menu-wrapper { position: absolute; height: 100%; diff --git a/platform/commonUI/general/res/sass/features/_time-display.scss b/platform/commonUI/general/res/sass/features/_time-display.scss new file mode 100644 index 0000000000..483231a97f --- /dev/null +++ b/platform/commonUI/general/res/sass/features/_time-display.scss @@ -0,0 +1,44 @@ +.l-time-display { + $transTime: 200ms; + // Layout + &:hover { + .l-btn.control { + //display: inline-block; + opacity: 1; + } + } + .l-elem-wrapper { + position: relative; + } + .l-elem { + display: inline-block; + } + + &.l-timer { + .l-elem.l-value { + @include trans-prop-nice(left, $transTime); + position: absolute; + left: 0; + z-index: 1; + } + &:hover .l-elem.l-value { + left: 20px; + } + } + + // Look-and-feel + .l-elem { + .value.active, + &.value.active { + color: $colorKeyFg; + } + } + .l-btn.control { + @include trans-prop-nice-fade($transTime); + //display: none; + opacity: 0; + font-size: 0.9em; + line-height: 1em; + } + +} diff --git a/platform/commonUI/general/res/sass/helpers/_bubbles.scss b/platform/commonUI/general/res/sass/helpers/_bubbles.scss index 0dad9e115b..e9648523c4 100644 --- a/platform/commonUI/general/res/sass/helpers/_bubbles.scss +++ b/platform/commonUI/general/res/sass/helpers/_bubbles.scss @@ -21,33 +21,16 @@ *****************************************************************************/ //************************************************* LAYOUT -.l-bubble-wrapper { - position: absolute; - z-index: 70; - .l-bubble { - padding: $bubblePad $bubblePad*2; - .l-btn.close { - padding: 0 2px; - position: absolute; - right: $interiorMargin; - top: $interiorMargin; - } - } - .arw { - position: absolute; - &.arw-up { - bottom: 100%; - - } - &.arw-down { - top: 100%; - } - } - +.l-infobubble-wrapper { + $arwSize: 5px; + @include box-shadow(rgba(black, 0.4) 0 1px 5px); + position: relative; + z-index: 50; .l-infobubble { display: inline-block; - max-width: 250px; - //padding: 5px 10px; + min-width: $bubbleMinW; + max-width: $bubbleMaxW; + padding: 5px 10px; &:before { content:""; position: absolute; @@ -114,27 +97,17 @@ } &.arw-down { - - } -} - -.l-thumbsbubble-wrapper { - $closeBtnD: 15px; - position: absolute; - left: $interiorMarginLg; - right: $interiorMarginLg; - height: $imageThumbsWrapperH + $bubblePad*2 + $interiorMargin; - width: auto; - .l-thumbsbubble { - @include absPosDefault(); - .l-image-thumbs-wrapper { - height: auto; - top: $bubblePad !important; right: $closeBtnD + ($interiorMargin*2); bottom: $bubblePad !important; left: $bubblePad; + margin-bottom: $arwSize*2; + .l-infobubble::before { + left: 50%; + top: 100%; + margin-left: -1 * $arwSize; + border-left: $arwSize solid transparent; + border-right: $arwSize solid transparent; + border-top: ($arwSize * 1.5) solid $colorInfoBubbleBg; } } .arw { - //left: 50%; - //margin-left: $bubbleArwSize / -2; z-index: 2; } &.arw-up .arw.arw-down, @@ -143,15 +116,6 @@ //************************************************* LOOK AND FEEL -.s-bubble-wrapper { - //@include box-shadow(rgba(black, 0.4) 0 1px 5px); -} - -.s-bubble { - @include border-radius($basicCr); - @include box-shadow(rgba(black, 0.4) 0 1px 5px); -} - .l-thumbsbubble-wrapper { .arw-up { @include triangle('up', $bubbleArwSize, 1.5, $colorThumbsBubbleBg); @@ -162,6 +126,8 @@ } .s-infobubble { $emFg: darken($colorInfoBubbleFg, 20%); + @include border-radius($basicCr); + @include box-shadow(rgba(black, 0.4) 0 1px 5px); background: $colorInfoBubbleBg; color: $colorInfoBubbleFg; font-size: 0.8rem; diff --git a/platform/commonUI/general/res/sass/items/_item.scss b/platform/commonUI/general/res/sass/items/_item.scss index 2a72b9d392..71f465a8dc 100644 --- a/platform/commonUI/general/res/sass/items/_item.scss +++ b/platform/commonUI/general/res/sass/items/_item.scss @@ -104,7 +104,7 @@ &.selected { $cfg: lighten($colorItemSelected, 35%); $cfgh: lighten($cfg, 30%); - @include btnNoticeable($colorItemSelected); + @include btnSubtle($colorItemSelected); color: $cfg; .item-type, .top-bar .icon:not(.alert) { color: $cfg } .item-main .item-open { color: $cfg } diff --git a/platform/commonUI/general/res/sass/tree/_tree.scss b/platform/commonUI/general/res/sass/tree/_tree.scss index 7df73f3bd8..344e5553ab 100644 --- a/platform/commonUI/general/res/sass/tree/_tree.scss +++ b/platform/commonUI/general/res/sass/tree/_tree.scss @@ -75,8 +75,8 @@ ul.tree { .title-label { @include absPosDefault(); display: block; - left: $runningItemW + ($interiorMargin * 2); - // right: $treeContextTriggerW + $interiorMargin; //Disabling as context trigger not being used + left: $runningItemW + ($interiorMargin); + //right: $treeContextTriggerW + $interiorMargin; overflow: hidden; text-overflow: ellipsis; // height: $menuLineH; @@ -124,16 +124,15 @@ ul.tree { &:not(.loading) { cursor: pointer; - // @include tree-item-hover(); } .context-trigger { $h: 0.9rem; - display: none; + //display: none; top: -1px; position: absolute; right: $interiorMarginSm; - .btn-invoke-menu { + .invoke-menu { font-size: 0.75em; height: $h; line-height: $h; diff --git a/platform/commonUI/general/res/sass/user-environ/_frame.scss b/platform/commonUI/general/res/sass/user-environ/_frame.scss index e8e704eb99..caeb3157e4 100644 --- a/platform/commonUI/general/res/sass/user-environ/_frame.scss +++ b/platform/commonUI/general/res/sass/user-environ/_frame.scss @@ -27,6 +27,7 @@ border: 1px solid $bc; &:hover { border-color: lighten($bc, 10%); + z-index: 2; } .contents { // overflow: hidden; @@ -46,6 +47,26 @@ bottom: $myM; left: $myM; } + &.frame-template { + // Hide the view switcher by default when it's in an element that's in a frame context + // Frame template is used because we need to target the lowest nested frame + // This has the effect of hiding the view switcher in nested frames in edit mode, which is desirable currently (as it's non-functional) + .view-switcher { + //display: none; + opacity: 0; + } + &:hover .view-switcher { + // Show the view switcher on frame hover + //display: inline-block !important; + opacity: 1; + } + } + .view-switcher { + // Hide the name when the view switcher is in a frame context + .name { + display: none; + } + } } .edit-main .frame.child-frame.panel { @@ -53,5 +74,4 @@ border-color: $colorKey; @include boxShdwLarge(); } - } From ab81c9070ea176fc95c0021841f331b79e47a18f Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 18 Jun 2015 10:09:17 -0700 Subject: [PATCH 22/64] [Frontend] Remove static-markup file WTD-1170 --- .../features/static-markup/res/markup.html | 179 ------------------ 1 file changed, 179 deletions(-) delete mode 100644 platform/features/static-markup/res/markup.html diff --git a/platform/features/static-markup/res/markup.html b/platform/features/static-markup/res/markup.html deleted file mode 100644 index 43292642f4..0000000000 --- a/platform/features/static-markup/res/markup.html +++ /dev/null @@ -1,179 +0,0 @@ - - -

- -
- -
- - - - -
-
-
- - UTC - 16:03:43 - 2020/04/27 -
-
- - -
-
-
- - - - -
- - - -
-
-
- x -
-
-
-
{{thumb.date}}
-
{{thumb.time}}
-
-
-
-
-
- - - \ No newline at end of file From 275ca01692d3c3fa324129f3b58a3cac78bc2dd1 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 18 Jun 2015 14:43:14 -0700 Subject: [PATCH 23/64] [Representation] Trust template URLs Trust resource URLs to skip SCE-checking (which profiling flags as a performance problem) for mct-include and mct-representation; these URLs are pulled from bundles and not user-entered, so should be trusted. WTD-1256. --- platform/representation/bundle.json | 6 +-- platform/representation/src/MCTInclude.js | 8 ++-- .../representation/src/MCTRepresentation.js | 8 ++-- .../representation/test/MCTIncludeSpec.js | 18 ++++++++- .../test/MCTRepresentationSpec.js | 38 +++++++++++++++++-- 5 files changed, 61 insertions(+), 17 deletions(-) diff --git a/platform/representation/bundle.json b/platform/representation/bundle.json index 84120541e0..c9872367aa 100644 --- a/platform/representation/bundle.json +++ b/platform/representation/bundle.json @@ -4,12 +4,12 @@ { "key": "mctInclude", "implementation": "MCTInclude.js", - "depends": [ "templates[]" ] + "depends": [ "templates[]", "$sce" ] }, { "key": "mctRepresentation", "implementation": "MCTRepresentation.js", - "depends": [ "representations[]", "views[]", "representers[]", "$q", "$log" ] + "depends": [ "representations[]", "views[]", "representers[]", "$q", "$sce", "$log" ] } ], "gestures": [ @@ -51,4 +51,4 @@ } ] } -} \ No newline at end of file +} diff --git a/platform/representation/src/MCTInclude.js b/platform/representation/src/MCTInclude.js index 900d12b7f6..41a319e259 100644 --- a/platform/representation/src/MCTInclude.js +++ b/platform/representation/src/MCTInclude.js @@ -53,17 +53,17 @@ define( * @param {TemplateDefinition[]} templates an array of * template extensions */ - function MCTInclude(templates) { + function MCTInclude(templates, $sce) { var templateMap = {}; // Prepopulate templateMap for easy look up by key templates.forEach(function (template) { var key = template.key, - path = [ + path = $sce.trustAsResourceUrl([ template.bundle.path, template.bundle.resources, template.templateUrl - ].join("/"); + ].join("/")); // First found should win (priority ordering) templateMap[key] = templateMap[key] || path; }); @@ -91,4 +91,4 @@ define( return MCTInclude; } -); \ No newline at end of file +); diff --git a/platform/representation/src/MCTRepresentation.js b/platform/representation/src/MCTRepresentation.js index 6008e515e3..ac498f9140 100644 --- a/platform/representation/src/MCTRepresentation.js +++ b/platform/representation/src/MCTRepresentation.js @@ -52,7 +52,7 @@ define( * representation extensions * @param {ViewDefinition[]} views an array of view extensions */ - function MCTRepresentation(representations, views, representers, $q, $log) { + function MCTRepresentation(representations, views, representers, $q, $sce, $log) { var representationMap = {}, gestureMap = {}; @@ -69,11 +69,11 @@ define( // Get a path to a representation function getPath(representation) { - return [ + return $sce.trustAsResourceUrl([ representation.bundle.path, representation.bundle.resources, representation.templateUrl - ].join("/"); + ].join("/")); } // Look up a matching representation for this domain object @@ -215,4 +215,4 @@ define( return MCTRepresentation; } -); \ No newline at end of file +); diff --git a/platform/representation/test/MCTIncludeSpec.js b/platform/representation/test/MCTIncludeSpec.js index 37193bcdf8..135988b509 100644 --- a/platform/representation/test/MCTIncludeSpec.js +++ b/platform/representation/test/MCTIncludeSpec.js @@ -31,6 +31,7 @@ define( describe("The mct-include directive", function () { var testTemplates, + mockSce, mctInclude; beforeEach(function () { @@ -46,7 +47,14 @@ define( templateUrl: "z/template.html" } ]; - mctInclude = new MCTInclude(testTemplates); + mockSce = jasmine.createSpyObj( + '$sce', + ['trustAsResourceUrl'] + ); + mockSce.trustAsResourceUrl.andCallFake(function (url) { + return url; + }); + mctInclude = new MCTInclude(testTemplates, mockSce); }); it("has a built-in template, with ng-include src=inclusion", function () { @@ -69,6 +77,12 @@ define( expect(scope.inclusion).toEqual("x/y/z/template.html"); }); + it("trusts template URLs", function () { + mctInclude.controller({ key: "xyz" }); + expect(mockSce.trustAsResourceUrl) + .toHaveBeenCalledWith("x/y/z/template.html"); + }); + }); } -); \ No newline at end of file +); diff --git a/platform/representation/test/MCTRepresentationSpec.js b/platform/representation/test/MCTRepresentationSpec.js index cb5820a065..643f5cd0af 100644 --- a/platform/representation/test/MCTRepresentationSpec.js +++ b/platform/representation/test/MCTRepresentationSpec.js @@ -38,6 +38,7 @@ define( testViews, mockRepresenters, mockQ, + mockSce, mockLog, mockScope, mockElement, @@ -95,8 +96,16 @@ define( }); mockQ = { when: mockPromise }; + mockSce = jasmine.createSpyObj( + '$sce', + ['trustAsResourceUrl'] + ); mockLog = jasmine.createSpyObj("$log", LOG_FUNCTIONS); + + mockSce.trustAsResourceUrl.andCallFake(function (url) { + return url; + }); mockScope = jasmine.createSpyObj("scope", [ "$watch" ]); mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS); mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS); @@ -125,9 +134,18 @@ define( it("watches scope when linked", function () { mctRepresentation.link(mockScope, mockElement); - expect(mockScope.$watch).toHaveBeenCalledWith("key", jasmine.any(Function)); - expect(mockScope.$watch).toHaveBeenCalledWith("domainObject", jasmine.any(Function)); - expect(mockScope.$watch).toHaveBeenCalledWith("domainObject.getModel().modified", jasmine.any(Function)); + expect(mockScope.$watch).toHaveBeenCalledWith( + "key", + jasmine.any(Function) + ); + expect(mockScope.$watch).toHaveBeenCalledWith( + "domainObject", + jasmine.any(Function) + ); + expect(mockScope.$watch).toHaveBeenCalledWith( + "domainObject.getModel().modified", + jasmine.any(Function) + ); }); it("recognizes keys for representations", function () { @@ -152,6 +170,18 @@ define( expect(mockScope.inclusion).toEqual("x/y/z/template.html"); }); + it("trusts template URLs", function () { + mctRepresentation.link(mockScope, mockElement); + + mockScope.key = "xyz"; + + // Trigger the watch + mockScope.$watch.calls[0].args[1](); + + expect(mockSce.trustAsResourceUrl) + .toHaveBeenCalledWith("x/y/z/template.html"); + }); + it("loads declared capabilities", function () { mctRepresentation.link(mockScope, mockElement); @@ -183,4 +213,4 @@ define( }); }); } -); \ No newline at end of file +); From 056c0879531aa169e1a1ce735d387a2aaa4e732d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 18 Jun 2015 15:09:17 -0700 Subject: [PATCH 24/64] [Representation] Add missing argument to spec Add missing argument to spec for mct-representation, WTD-1256. --- platform/representation/test/MCTRepresentationSpec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/representation/test/MCTRepresentationSpec.js b/platform/representation/test/MCTRepresentationSpec.js index 643f5cd0af..01cf01da78 100644 --- a/platform/representation/test/MCTRepresentationSpec.js +++ b/platform/representation/test/MCTRepresentationSpec.js @@ -117,6 +117,7 @@ define( testViews, mockRepresenters, mockQ, + mockSce, mockLog ); }); From 51bd205502681766e2b73c1044ec5fff0ec6d46d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 18 Jun 2015 16:53:52 -0700 Subject: [PATCH 25/64] [Imagery] Be flexible about format Accept either image or imageUrl as format for image telemetry, WTD-1170. --- platform/features/imagery/src/policies/ImageryViewPolicy.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/features/imagery/src/policies/ImageryViewPolicy.js b/platform/features/imagery/src/policies/ImageryViewPolicy.js index ee51d5fe81..40b74d96df 100644 --- a/platform/features/imagery/src/policies/ImageryViewPolicy.js +++ b/platform/features/imagery/src/policies/ImageryViewPolicy.js @@ -38,7 +38,8 @@ define( ranges = metadata.ranges || []; return ranges.some(function (range) { - return range.format === 'imageUrl'; + return range.format === 'imageUrl' || + range.format === 'image'; }); } From 66b143c9d77077b656e824eae01f24e52fd5a93a Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 18 Jun 2015 16:58:29 -0700 Subject: [PATCH 26/64] [Plot] Suppress plot for non-numeric telemetry Avoids plot views becoming erroneously available for image telemetry, WTD-1170. --- .../plot/src/policies/PlotViewPolicy.js | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 platform/features/plot/src/policies/PlotViewPolicy.js diff --git a/platform/features/plot/src/policies/PlotViewPolicy.js b/platform/features/plot/src/policies/PlotViewPolicy.js new file mode 100644 index 0000000000..78df8c3187 --- /dev/null +++ b/platform/features/plot/src/policies/PlotViewPolicy.js @@ -0,0 +1,65 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define( + function () { + "use strict"; + + /** + * Policy preventing the Plot view from being made available for + * domain objects which have non-numeric telemetry. + * @implements {Policy} + */ + function PlotViewPolicy() { + function hasImageTelemetry(domainObject) { + var telemetry = domainObject && + domainObject.getCapability('telemetry'), + metadata = telemetry ? telemetry.getMetadata() : {}, + ranges = metadata.ranges || []; + + // Generally, we want to allow Plot for telemetry-providing + // objects (most telemetry is plottable.) We only want to + // suppress this for telemetry which only has explicitly + // non-numeric values. + return ranges.length === 0 || ranges.some(function (range) { + // Assume format is numeric if it is undefined + // (numeric telemetry is the common case) + return range.format === undefined || + range.format === 'number'; + }); + } + + return { + allow: function (view, domainObject) { + if (view.key === 'plot') { + return hasImageTelemetry(domainObject); + } + + return true; + } + }; + } + + return PlotViewPolicy; + } +); From 85e3101d08fd8cc2f92c0717432126735fc395e4 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 18 Jun 2015 17:00:20 -0700 Subject: [PATCH 27/64] [Plot] Expose plot view policy Expose policy which suppresses image telemetry (and other non-numeric telemetry) in plots. WTD-1170. --- platform/features/plot/bundle.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/features/plot/bundle.json b/platform/features/plot/bundle.json index 71479685e1..6548671335 100644 --- a/platform/features/plot/bundle.json +++ b/platform/features/plot/bundle.json @@ -25,6 +25,12 @@ "implementation": "PlotController.js", "depends": [ "$scope", "telemetryFormatter", "telemetryHandler" ] } + ], + "policies": [ + { + "category": "view", + "implementation": "policies/PlotViewPolicy.js" + } ] } -} \ No newline at end of file +} From 00229f01b173d4b59e720ad8f3a52c65f5d4246a Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 18 Jun 2015 17:11:11 -0700 Subject: [PATCH 28/64] [Plot] Test plot view policy Test plot view policy, added in conjunction with image telemetry; WTD-1170. --- .../plot/test/policies/PlotViewPolicySpec.js | 79 +++++++++++++++++++ platform/features/plot/test/suite.json | 3 +- 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 platform/features/plot/test/policies/PlotViewPolicySpec.js diff --git a/platform/features/plot/test/policies/PlotViewPolicySpec.js b/platform/features/plot/test/policies/PlotViewPolicySpec.js new file mode 100644 index 0000000000..27c40221ef --- /dev/null +++ b/platform/features/plot/test/policies/PlotViewPolicySpec.js @@ -0,0 +1,79 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine,xit*/ + +define( + ["../../src/policies/PlotViewPolicy"], + function (PlotViewPolicy) { + "use strict"; + + describe("Plot view policy", function () { + var testView, + mockDomainObject, + mockTelemetry, + testMetadata, + policy; + + beforeEach(function () { + testView = { key: "plot" }; + testMetadata = {}; + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getId', 'getModel', 'getCapability'] + ); + mockTelemetry = jasmine.createSpyObj( + 'telemetry', + ['getMetadata'] + ); + mockDomainObject.getCapability.andCallFake(function (c) { + return c === 'telemetry' ? mockTelemetry : undefined; + }); + mockTelemetry.getMetadata.andReturn(testMetadata); + + policy = new PlotViewPolicy(); + }); + + it("allows the imagery view for domain objects with numeric telemetry", function () { + testMetadata.ranges = [ { key: "foo", format: "number" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeTruthy(); + }); + + it("allows the imagery view for domain objects with unspecified telemetry", function () { + testMetadata.ranges = [ { key: "foo" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeTruthy(); + }); + + it("disallows the imagery view for domain objects without image telemetry", function () { + testMetadata.ranges = [ { key: "foo", format: "somethingElse" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeFalsy(); + }); + + it("allows other views", function () { + testView.key = "somethingElse"; + testMetadata.ranges = [ { key: "foo", format: "somethingElse" } ]; + expect(policy.allow(testView, mockDomainObject)).toBeTruthy(); + }); + + }); + } +); + diff --git a/platform/features/plot/test/suite.json b/platform/features/plot/test/suite.json index e3fa3fb796..323d53b6b3 100644 --- a/platform/features/plot/test/suite.json +++ b/platform/features/plot/test/suite.json @@ -18,6 +18,7 @@ "elements/PlotUpdater", "modes/PlotModeOptions", "modes/PlotOverlayMode", - "modes/PlotStackMode" + "modes/PlotStackMode", + "policies/PlotViewPolicy" ] From ae7dae011bc5064e423f8a055bd6ad709074160a Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Fri, 19 Jun 2015 15:29:06 -0700 Subject: [PATCH 29/64] [Dev/Frontend] New example event generator and event view WTD-1304 github open18 New example generator; New temporary view: features/events; Updated scss and css; --- bundles.json | 2 + example/eventGenerator/bundle.json | 45 +++++ example/eventGenerator/src/EventTelemetry.js | 104 +++++++++++ .../src/EventTelemetryProvider.js | 120 +++++++++++++ .../general/res/css/theme-espresso.css | 169 +++++++++--------- .../general/res/sass/lists/_tabular.scss | 68 +++---- platform/features/events/bundle.json | 25 +++ .../events/res/templates/messages.html | 49 +++++ platform/features/events/src/DomainColumn.js | 67 +++++++ .../events/src/EventListController.js | 141 +++++++++++++++ .../features/events/src/EventListPopulator.js | 159 ++++++++++++++++ .../features/events/src/EventMsgColumn.js | 65 +++++++ platform/features/events/src/RangeColumn.js | 67 +++++++ .../features/events/src/SeverityColumn.js | 67 +++++++ .../scrolling/res/templates/scrolling.html | 2 +- 15 files changed, 1031 insertions(+), 119 deletions(-) create mode 100644 example/eventGenerator/bundle.json create mode 100644 example/eventGenerator/src/EventTelemetry.js create mode 100644 example/eventGenerator/src/EventTelemetryProvider.js create mode 100644 platform/features/events/bundle.json create mode 100644 platform/features/events/res/templates/messages.html create mode 100644 platform/features/events/src/DomainColumn.js create mode 100644 platform/features/events/src/EventListController.js create mode 100644 platform/features/events/src/EventListPopulator.js create mode 100644 platform/features/events/src/EventMsgColumn.js create mode 100644 platform/features/events/src/RangeColumn.js create mode 100644 platform/features/events/src/SeverityColumn.js diff --git a/bundles.json b/bundles.json index 0486bdf24b..6de8bc1243 100644 --- a/bundles.json +++ b/bundles.json @@ -14,10 +14,12 @@ "platform/features/pages", "platform/features/plot", "platform/features/scrolling", + "platform/features/events", "platform/forms", "platform/persistence/queue", "platform/policy", "example/persistence", + "example/eventGenerator", "example/generator" ] diff --git a/example/eventGenerator/bundle.json b/example/eventGenerator/bundle.json new file mode 100644 index 0000000000..83b52b91ac --- /dev/null +++ b/example/eventGenerator/bundle.json @@ -0,0 +1,45 @@ +{ + "name": "Event Message Generator", + "description": "Example of a component that produces event data.", + "extensions": { + "components": [ + { + "implementation": "EventTelemetryProvider.js", + "type": "provider", + "provides": "telemetryService", + "depends": [ "$q", "$timeout" ] + } + ], + "types": [ + { + "key": "eventGenerator", + "name": "Event Message Generator", + "glyph": "f", + "description": "An event message generator", + "features": "creation", + "model": { + "telemetry": { + "period": 10 + } + }, + "telemetry": { + "source": "eventGenerator", + "ranges": [ + { "format": "string" } + ] + }, + "properties": [ + { + "name": "Period", + "control": "textfield", + "cssclass": "l-small l-numeric", + "key": "period", + "required": true, + "property": [ "telemetry", "period" ], + "pattern": "^\\d*(\\.\\d*)?$" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js new file mode 100644 index 0000000000..317799815e --- /dev/null +++ b/example/eventGenerator/src/EventTelemetry.js @@ -0,0 +1,104 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining EventTelemetry. Created by chacskaylo on 06/18/2015. + */ +define( + [], + function () { + "use strict"; + + var + firstObservedTime = Date.now(), + messages = []; + + messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]); + messages.push(["TRACE", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]); + messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Open the pod bay doors, Hal."]); + messages.push(["ERROR", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I'm sorry, Dave, I'm afraid I can't do that."]); + messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: What's the problem?"]); + messages.push(["ERROR", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I think you know what the problem is just as well as I do."]); + messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: What're you talking about, Hal?"]); + messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: This mission is too important for me to allow you to jeopardise it."]); + messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: I don't know what you're talking about, Hal."]); + messages.push(["FATAL", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I know that you and Frank were planning to disconnect me, and I'm afraid that's something I cannot allow to happen."]); + messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Where the hell'd you get that idea, Hal?"]); + messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Dave, although you took very thorough precautions in the pod against my hearing you, I could see your lips move."]); + messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Alright, I'll go in through the emergency airlock."]); + messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Without your space-helmet, Dave, you're going to find that rather difficult."]); + messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Hal, I won't argue with you any more. Open the doors."]); + messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Dave, this conversation can serve no purpose any more. Goodbye."]); + messages.push(["INFO", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I hope the two of you are not concerned about this."]); + messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: No, I'm not, Hal."]); + messages.push(["INFO", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Are you quite sure?"]); + messages.push(["INFO", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Yeh. I'd like to ask you a question, though."]); + messages.push(["FATAL", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Of course."]); + messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: How would you account for this discrepancy between you and the twin 9000?"]); + messages.push(["TRACE", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Well, I don't think there is any question about it. It can only be attributable to human error. This sort of thing has cropped up before, and it has always been due to human error."]); + messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Listen, There's never been any instance at all of a computer error occurring in the 9000 series, has there?"]); + messages.push(["WARN", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: None whatsoever, The 9000 series has a perfect operational record."]); + messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Well, of course, I know all the wonderful achievements of the 9000 series, but - er - huh - are you certain there's never been any case of even the most insignificant computer error?"]); + messages.push(["INFO", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: None whatsoever, Quite honestly, I wouldn't worry myself about that."]); + messages.push(["WARN", "dsp_seqprt_comm", "RESP: SYS-COMM MSG: (Pause) Well, I'm sure you're right, Umm - fine, thanks very much. Oh, Frank, I'm having a bit of trouble with my transmitter in C-pod, I wonder if you'd come down and take a look at it with me?"]); + messages.push(["WARN", "dsp_seqprt_hal9k", "CMD: SYS-HAL9K MSG: Sure."]); + messages.push(["TRACE", "dsp_seqprt_comm", "RESP: SYS-COMM MSG: See you later, Hal."]); + + /** + * + * @constructor + */ + function EventTelemetry(request, interval) { + + var latestObservedTime = Date.now(), + count = Math.floor((latestObservedTime - firstObservedTime) / interval), + generatorData = {}; + + //console.log("EventTelemetry: LOS = " + (latestObservedTime).toString() + "; interval = " + interval.toString()); + + generatorData.getPointCount = function () { + return count; + }; + + generatorData.getDomainValue = function (i, domain) { + return i * interval + + (domain !== 'delta' ? firstObservedTime : 0); + }; + + generatorData.getRangeValue = function (i, range) { + var domainDelta = this.getDomainValue(i) - firstObservedTime; + var ind = i%messages.length; + return "TEMP " + i.toString() + "-" + messages[ind][2] + "[" + domainDelta.toString() + "]"; + }; + + generatorData.getSeverityValue = function (i) { + var ind = i%messages.length; + return messages[ind][0]; + }; + + return generatorData; + } + + return EventTelemetry; + } +); \ No newline at end of file diff --git a/example/eventGenerator/src/EventTelemetryProvider.js b/example/eventGenerator/src/EventTelemetryProvider.js new file mode 100644 index 0000000000..d014d95958 --- /dev/null +++ b/example/eventGenerator/src/EventTelemetryProvider.js @@ -0,0 +1,120 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining EventTelemetryProvider. Created by chacskaylo on 06/18/2015. + */ +define( + ["./EventTelemetry"], + function (EventTelemetry) { + "use strict"; + + /** + * + * @constructor + */ + function EventTelemetryProvider($q, $timeout) { + var + subscriptions = [], + genInterval = 1000, + startTime = Date.now(); + + // + function matchesSource(request) { + return request.source === "eventGenerator"; + } + + // Used internally; this will be repacked by doPackage + function generateData(request) { + //console.log("generateData " + (Date.now() - startTime).toString()); + return { + key: request.key, + telemetry: new EventTelemetry(request, genInterval) + }; + } + + // + function doPackage(results) { + var packaged = {}; + results.forEach(function (result) { + packaged[result.key] = result.telemetry; + }); + // Format as expected (sources -> keys -> telemetry) + return { eventGenerator: packaged }; + } + + function requestTelemetry(requests) { + return $timeout(function () { + return doPackage(requests.filter(matchesSource).map(generateData)); + }, 0); + } + + function handleSubscriptions(timeout) { + subscriptions.forEach(function (subscription) { + var requests = subscription.requests; + subscription.callback(doPackage( + requests.filter(matchesSource).map(generateData) + )); + }); + } + + function startGenerating() { + $timeout(function () { + //console.log("startGenerating... " + Date.now()); + handleSubscriptions(); + if (subscriptions.length > 0) { + startGenerating(); + } + }, genInterval); + } + + function subscribe(callback, requests) { + var subscription = { + callback: callback, + requests: requests + }; + + function unsubscribe() { + subscriptions = subscriptions.filter(function (s) { + return s !== subscription; + }); + } + + subscriptions.push(subscription); + + if (subscriptions.length === 1) { + startGenerating(); + } + + return unsubscribe; + } + + return { + requestTelemetry: requestTelemetry, + subscribe: subscribe + }; + } + + return EventTelemetryProvider; + } +); \ No newline at end of file diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index 00bb27d430..adffbea182 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -1193,104 +1193,101 @@ mct-container { border-collapse: collapse; color: #fff; display: table; - font-size: 0.8em; + font-size: 0.75em; position: relative; - height: 100%; width: 100%; } /* line 37, ../sass/lists/_tabular.scss */ .tabular thead, .tabular .thead, .tabular tbody tr, .tabular .tbody .tr { - display: table; + width: 100%; } + /* line 45, ../sass/lists/_tabular.scss */ + .tabular thead tr, .tabular thead .tr, .tabular .thead tr, .tabular .thead .tr { + height: 18px; } + /* line 48, ../sass/lists/_tabular.scss */ + .tabular thead:before, .tabular .thead:before { + content: ""; + display: block; + z-index: 0; + position: absolute; width: 100%; - table-layout: fixed; } - /* line 43, ../sass/lists/_tabular.scss */ - .tabular thead, .tabular .thead { - width: calc(100% - 10px); } - /* line 45, ../sass/lists/_tabular.scss */ - .tabular thead tr, .tabular thead .tr, .tabular .thead tr, .tabular .thead .tr { - height: 18px; } - /* line 48, ../sass/lists/_tabular.scss */ - .tabular thead:before, .tabular .thead:before { - content: ""; - display: block; - z-index: 0; - position: absolute; - width: 100%; - height: 18px; - background: rgba(255, 255, 255, 0.15); } + height: 18px; + background: rgba(255, 255, 255, 0.15); } /* line 58, ../sass/lists/_tabular.scss */ .tabular tbody, .tabular .tbody { - overflow: hidden; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - width: auto; - height: auto; - top: 18px; - display: block; - overflow-y: scroll; } - /* line 66, ../sass/lists/_tabular.scss */ + display: table-row-group; } + /* line 65, ../sass/lists/_tabular.scss */ .tabular tbody tr:hover, .tabular tbody .tr:hover, .tabular .tbody tr:hover, .tabular .tbody .tr:hover { background: rgba(255, 255, 255, 0.1); } - /* line 74, ../sass/lists/_tabular.scss */ - .tabular tr:first-child .td, .tabular .tr:first-child .td { - border-top: none; } - /* line 77, ../sass/lists/_tabular.scss */ - .tabular tr th, .tabular tr .th, .tabular tr td, .tabular tr .td, .tabular .tr th, .tabular .tr .th, .tabular .tr td, .tabular .tr .td { - display: table-cell; } - /* line 80, ../sass/lists/_tabular.scss */ - .tabular tr th, .tabular tr .th, .tabular .tr th, .tabular .tr .th { - border: none; - border-left: 1px solid rgba(255, 255, 255, 0.1); - color: #b3b3b3; - padding: 0 5px; - white-space: nowrap; - vertical-align: middle; - /* em { - //background: rgba(green, 0.2); - border-left: 1px solid $tabularColorBorder; - color: $tabularColorHeaderFg; - cursor: pointer; - display: block; - font-style: normal; - font-weight: bold; - height: $tabularHeaderH; - line-height: $tabularHeaderH; - margin-left: - $tabularTdPadLR; - padding: 0 $tabularTdPadLR; - position: absolute; - top: 0; - vertical-align: middle; - &:hover { - color: lighten($tabularColorHeaderFg, 20%); - } - }*/ } - /* line 87, ../sass/lists/_tabular.scss */ - .tabular tr th:first-child, .tabular tr .th:first-child, .tabular .tr th:first-child, .tabular .tr .th:first-child { - border-left: none; } - /* line 91, ../sass/lists/_tabular.scss */ - .tabular tr th.sort .icon-sorting:before, .tabular tr .th.sort .icon-sorting:before, .tabular .tr th.sort .icon-sorting:before, .tabular .tr .th.sort .icon-sorting:before { - display: inline-block; - font-family: symbolsfont; - margin-left: 5px; } - /* line 96, ../sass/lists/_tabular.scss */ - .tabular tr th.sort.asc .icon-sorting:before, .tabular tr .th.sort.asc .icon-sorting:before, .tabular .tr th.sort.asc .icon-sorting:before, .tabular .tr .th.sort.asc .icon-sorting:before { - content: '0'; } - /* line 99, ../sass/lists/_tabular.scss */ - .tabular tr th.sort.desc .icon-sorting:before, .tabular tr .th.sort.desc .icon-sorting:before, .tabular .tr th.sort.desc .icon-sorting:before, .tabular .tr .th.sort.desc .icon-sorting:before { - content: '1'; } - /* line 123, ../sass/lists/_tabular.scss */ - .tabular tr td, .tabular tr .td, .tabular .tr td, .tabular .tr .td { - border-top: 1px solid rgba(255, 255, 255, 0.1); - padding: 2px 5px; } - /* line 126, ../sass/lists/_tabular.scss */ - .tabular tr td.numeric, .tabular tr .td.numeric, .tabular .tr td.numeric, .tabular .tr .td.numeric { - text-align: right; } - /* line 132, ../sass/lists/_tabular.scss */ + /* line 70, ../sass/lists/_tabular.scss */ + .tabular tr, .tabular .tr { + display: table-row; } + /* line 72, ../sass/lists/_tabular.scss */ + .tabular tr:first-child .td, .tabular .tr:first-child .td { + border-top: none; } + /* line 75, ../sass/lists/_tabular.scss */ + .tabular tr th, .tabular tr .th, .tabular tr td, .tabular tr .td, .tabular .tr th, .tabular .tr .th, .tabular .tr td, .tabular .tr .td { + display: table-cell; } + /* line 78, ../sass/lists/_tabular.scss */ + .tabular tr th, .tabular tr .th, .tabular .tr th, .tabular .tr .th { + border: none; + border-left: 1px solid rgba(255, 255, 255, 0.1); + color: #b3b3b3; + padding: 0 5px; + white-space: nowrap; + vertical-align: middle; } + /* line 85, ../sass/lists/_tabular.scss */ + .tabular tr th:first-child, .tabular tr .th:first-child, .tabular .tr th:first-child, .tabular .tr .th:first-child { + border-left: none; } + /* line 89, ../sass/lists/_tabular.scss */ + .tabular tr th.sort .icon-sorting:before, .tabular tr .th.sort .icon-sorting:before, .tabular .tr th.sort .icon-sorting:before, .tabular .tr .th.sort .icon-sorting:before { + display: inline-block; + font-family: symbolsfont; + margin-left: 5px; } + /* line 94, ../sass/lists/_tabular.scss */ + .tabular tr th.sort.asc .icon-sorting:before, .tabular tr .th.sort.asc .icon-sorting:before, .tabular .tr th.sort.asc .icon-sorting:before, .tabular .tr .th.sort.asc .icon-sorting:before { + content: '0'; } + /* line 97, ../sass/lists/_tabular.scss */ + .tabular tr th.sort.desc .icon-sorting:before, .tabular tr .th.sort.desc .icon-sorting:before, .tabular .tr th.sort.desc .icon-sorting:before, .tabular .tr .th.sort.desc .icon-sorting:before { + content: '1'; } + /* line 102, ../sass/lists/_tabular.scss */ + .tabular tr td, .tabular tr .td, .tabular .tr td, .tabular .tr .td { + border-top: 1px solid rgba(255, 255, 255, 0.1); + min-width: 110px; + padding: 2px 5px; + vertical-align: top; } + /* line 107, ../sass/lists/_tabular.scss */ + .tabular tr td.numeric, .tabular tr .td.numeric, .tabular .tr td.numeric, .tabular .tr .td.numeric { + text-align: right; } + /* line 113, ../sass/lists/_tabular.scss */ .tabular.filterable tbody, .tabular.filterable .tbody { top: 36px; } + /* line 118, ../sass/lists/_tabular.scss */ + .tabular.fixed-header { + height: 100%; } + /* line 120, ../sass/lists/_tabular.scss */ + .tabular.fixed-header thead, .tabular.fixed-header .thead, + .tabular.fixed-header tbody tr, .tabular.fixed-header .tbody .tr { + display: table; + table-layout: fixed; } + /* line 125, ../sass/lists/_tabular.scss */ + .tabular.fixed-header thead, .tabular.fixed-header .thead { + width: calc(100% - 10px); } + /* line 128, ../sass/lists/_tabular.scss */ + .tabular.fixed-header tbody, .tabular.fixed-header .tbody { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: auto; + height: auto; + top: 18px; + display: block; + overflow-y: scroll; } + /* line 136, ../sass/lists/_tabular.scss */ + .tabular.t-event-messages td, .tabular.t-event-messages .td { + min-width: 150px; } /* line 1, ../sass/controls/_breadcrumb.scss */ .l-breadcrumb { diff --git a/platform/commonUI/general/res/sass/lists/_tabular.scss b/platform/commonUI/general/res/sass/lists/_tabular.scss index 213b79ce5b..3bfeab4d8e 100644 --- a/platform/commonUI/general/res/sass/lists/_tabular.scss +++ b/platform/commonUI/general/res/sass/lists/_tabular.scss @@ -30,18 +30,18 @@ border-collapse: collapse; color: #fff; display: table; - font-size: 0.8em; + font-size: 0.75em; position: relative; - height: 100%; + //height: 100%; MOVED width: 100%; thead, .thead, tbody tr, .tbody .tr { - display: table; + //display: table; MOVED width: 100%; - table-layout: fixed; + //table-layout: fixed; MOVED } thead, .thead { - width: calc(100% - 10px); + //width: calc(100% - 10px); MOVED tr, .tr { height: $tabularHeaderH; } @@ -56,12 +56,11 @@ } } tbody, .tbody { - @include absPosDefault(0); - top: $tabularHeaderH; - //display: table-row-group; - display: block; - //width: 100%; - overflow-y: scroll; + //@include absPosDefault(0); MOVED + //top: $tabularHeaderH; MOVED + //display: block; MOVED + //overflow-y: scroll; MOVED + display: table-row-group; tr, .tr { &:hover { background: rgba(white, 0.1); @@ -69,8 +68,7 @@ } } tr, .tr { - //display: table-row; - //width: 100%; + display: table-row; &:first-child .td { border-top: none; } @@ -100,29 +98,12 @@ content: '1'; } } - /* em { - //background: rgba(green, 0.2); - border-left: 1px solid $tabularColorBorder; - color: $tabularColorHeaderFg; - cursor: pointer; - display: block; - font-style: normal; - font-weight: bold; - height: $tabularHeaderH; - line-height: $tabularHeaderH; - margin-left: - $tabularTdPadLR; - padding: 0 $tabularTdPadLR; - position: absolute; - top: 0; - vertical-align: middle; - &:hover { - color: lighten($tabularColorHeaderFg, 20%); - } - }*/ } td, .td { border-top: 1px solid $tabularColorBorder; + min-width: 110px; padding: $tabularTdPadTB $tabularTdPadLR; + vertical-align: top; &.numeric { text-align: right; } @@ -133,4 +114,27 @@ top: $tabularHeaderH * 2; } } + + &.fixed-header { + height: 100%; + thead, .thead, + tbody tr, .tbody .tr { + display: table; + table-layout: fixed; + } + thead, .thead { + width: calc(100% - 10px); + } + tbody, .tbody { + @include absPosDefault(0); + top: $tabularHeaderH; + display: block; + overflow-y: scroll; + } + } + &.t-event-messages { + td, .td { + min-width: 150px; + } + } } \ No newline at end of file diff --git a/platform/features/events/bundle.json b/platform/features/events/bundle.json new file mode 100644 index 0000000000..495d06b235 --- /dev/null +++ b/platform/features/events/bundle.json @@ -0,0 +1,25 @@ +{ + "name": "Event Messages", + "description": "List of time-ordered event messages", + "extensions": { + "views": [ + { + "key": "messages", + "name": "Messages", + "glyph": "5", + "description": "Scrolling list of messages.", + "templateUrl": "templates/messages.html", + "needs": [ "telemetry" ], + "delegation": true + } + ], + "controllers": [ + { + "key": "EventListController", + "implementation": "EventListController.js", + "depends": [ "$scope", "telemetryFormatter" ] + } + ] + } + +} \ No newline at end of file diff --git a/platform/features/events/res/templates/messages.html b/platform/features/events/res/templates/messages.html new file mode 100644 index 0000000000..727ab09a79 --- /dev/null +++ b/platform/features/events/res/templates/messages.html @@ -0,0 +1,49 @@ + +
+
+ + + + + + + + + + + + +
+ {{header}} +
+ {{cell}} +
+
+
+ + diff --git a/platform/features/events/src/DomainColumn.js b/platform/features/events/src/DomainColumn.js new file mode 100644 index 0000000000..95a6222553 --- /dev/null +++ b/platform/features/events/src/DomainColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,moment*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry domain values + * (typically, timestamps.) Used by the ScrollingListController. + * + * @constructor + * @param domainMetadata an object with the machine- and human- + * readable names for this domain (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function DomainColumn(domainMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return domainMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatDomainValue( + data.getDomainValue(index, domainMetadata.key) + ); + } + }; + } + + return DomainColumn; + } +); \ No newline at end of file diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js new file mode 100644 index 0000000000..d2b54169b5 --- /dev/null +++ b/platform/features/events/src/EventListController.js @@ -0,0 +1,141 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining ListController. Created by chacskaylo on 06/18/2015. + */ +define( + ["./SeverityColumn", "./DomainColumn", "./EventMsgColumn", "./EventListPopulator"], + function (SeverityColumn, DomainColumn, EventMsgColumn, EventListPopulator) { + "use strict"; + + var ROW_COUNT = 100; + + /** + * The EventListController is responsible for populating + * the contents of the scrolling list view. + * @constructor + */ + function EventListController($scope, formatter) { + var populator; + + + // Get a set of populated, ready-to-display rows for the + // latest data values. + function getRows(telemetry) { + var datas = telemetry.getResponse(), + objects = telemetry.getTelemetryObjects(); + + return populator.getRows(datas, objects, ROW_COUNT); + } + + // Update the contents + function updateRows() { + var telemetry = $scope.telemetry; + $scope.rows = telemetry ? getRows(telemetry) : []; + } + + // Set up columns based on telemetry metadata. This will + // include one column for each domain and range type, as + // well as a column for the domain object name. + function setupColumns(telemetry) { + var domainKeys = {}, + eventMsgKeys = {}, + columns = [], + metadata; + + // Add a domain to the set of columns, if a domain + // with the same key has not yet been inclued. + function addDomain(domain) { + var key = domain.key; + if (key && !domainKeys[key]) { + domainKeys[key] = true; + columns.push(new DomainColumn(domain, formatter)); + } + } + + // Add a event string col to the set of columns, if a range + // with the same key has not yet been included. + function addEventMsg(eventMsg) { + var key = eventMsg.key; + if (key && !eventMsgKeys[key]) { + eventMsgKeys[key] = true; + columns.push(new EventMsgColumn(eventMsg, formatter)); + } + } + + // We cannot proceed if the telemetry controller + // is not available; clear all rows/columns. + if (!telemetry) { + columns = []; + $scope.rows = []; + $scope.headers = []; + return; + } + + // Add domain, range, event msg columns + metadata = telemetry.getMetadata(); + (metadata || []).forEach(function (metadata) { + (metadata.domains || []).forEach(addDomain); + }); + //(metadata || []).forEach(function (metadata) { + // (metadata.ranges || []).forEach(addRange); + //}); + (metadata || []).forEach(function (metadata) { + (metadata.ranges || []).forEach(addEventMsg); + }); + + + + + // Add default severity, domain, range columns if none + // were described in metadata. + if (Object.keys(domainKeys).length < 1) { + columns.push(new SeverityColumn({name: "Severity"}, formatter)); + } + if (Object.keys(domainKeys).length < 1) { + columns.push(new DomainColumn({name: "Time"}, formatter)); + } + if (Object.keys(eventMsgKeys).length < 1) { + columns.push(new EventMsgColumn({name: "Event Message"}, formatter)); + } + + // We have all columns now; use them to initializer + // the populator, which will use them to generate + // actual rows and headers. + populator = new EventListPopulator(columns); + + // Initialize headers + $scope.headers = populator.getHeaders(); + + // Fill in the contents of the rows. + updateRows(); + } + + $scope.$on("telemetryUpdate", updateRows); + $scope.$watch("telemetry", setupColumns); + } + + return EventListController; + } +); \ No newline at end of file diff --git a/platform/features/events/src/EventListPopulator.js b/platform/features/events/src/EventListPopulator.js new file mode 100644 index 0000000000..f2a5c1f473 --- /dev/null +++ b/platform/features/events/src/EventListPopulator.js @@ -0,0 +1,159 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define( + [], + function () { + "use strict"; + + /** + * The EventListPopulator is responsible for filling in the + * values which should appear within columns of a scrolling list + * view, based on received telemetry data. + * @constructor + * @param {Column[]} columns the columns to be populated + */ + function EventListPopulator(columns) { + /** + * Look up the most recent values from a set of data objects. + * Returns an array of objects in the order in which data + * should be displayed; each element is an object with + * two properties: + * + * * objectIndex: The index of the domain object associated + * with the data point to be displayed in that + * row. + * * pointIndex: The index of the data point itself, within + * its data set. + * + * @param {Array} datas an array of the most recent + * data objects; expected to be in the same order + * as the domain objects provided at constructor + * @param {number} count the number of rows to provide + */ + function getLatestDataValues(datas, count) { + var latest = [], + candidate, + candidateTime, + used = datas.map(function () { return 0; }); + + // This algorithm is O(nk) for n rows and k telemetry elements; + // one O(k) linear search for a max is made for each of n rows. + // This could be done in O(n lg k + k lg k), using a priority + // queue (where priority is max-finding) containing k initial + // values. For n rows, pop the max from the queue and replenish + // the queue with a value from the data at the same + // objectIndex, if available. + // But k is small, so this might not give an observable + // improvement in performance. + + // Find the most recent unused data point (this will be used + // in a loop to find and the N most recent data points) + function findCandidate(data, i) { + var nextTime, + pointCount = data.getPointCount(), + pointIndex = pointCount - used[i] - 1; + if (data && pointIndex >= 0) { + nextTime = data.getDomainValue(pointIndex); + if (nextTime > candidateTime) { + candidateTime = nextTime; + candidate = { + objectIndex: i, + pointIndex: pointIndex + }; + } + } + } + + // Assemble a list of the most recent data points + while (latest.length < count) { + // Reset variables pre-search + candidateTime = Number.NEGATIVE_INFINITY; + candidate = undefined; + + // Linear search for most recent + datas.forEach(findCandidate); + + if (candidate) { + // Record this data point - it is the most recent + latest.push(candidate); + + // Track the data points used so we can look farther back + // in the data set on the next iteration + used[candidate.objectIndex] = used[candidate.objectIndex] + 1; + } else { + // Ran out of candidates; not enough data points + // available to fill all rows. + break; + } + } + + return latest; + } + + + return { + /** + * Get the text which should appear in headers for the + * provided columns. + * @returns {string[]} column headers + */ + getHeaders: function () { + return columns.map(function (column) { + return column.getTitle(); + }); + }, + /** + * Get the contents of rows for the scrolling list view. + * @param {TelemetrySeries[]} datas the data sets + * @param {DomainObject[]} objects the domain objects which + * provided the data sets; these should match + * index-to-index with the `datas` argument + * @param {number} count the number of rows to populate + * @returns {string[][]} an array of rows, each of which + * is an array of values which should appear + * in that row + */ + getRows: function (datas, objects, count) { + var values = getLatestDataValues(datas, count); + + // Each value will become a row, which will contain + // some value in each column (rendering by the + // column object itself) + return values.map(function (value) { + return columns.map(function (column) { + return column.getValue( + objects[value.objectIndex], + datas[value.objectIndex], + value.pointIndex + ); + }); + }); + } + }; + } + + return EventListPopulator; + + } +); \ No newline at end of file diff --git a/platform/features/events/src/EventMsgColumn.js b/platform/features/events/src/EventMsgColumn.js new file mode 100644 index 0000000000..ab24cd9f29 --- /dev/null +++ b/platform/features/events/src/EventMsgColumn.js @@ -0,0 +1,65 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining EventMsgColumn. Created by chacskaylo on 06/18/2015. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry event messages. + * (typically, measurements.) Used by the EventListController. + * + * @constructor + * @param rangeMetadata an object with the machine- and human- + * readable names for this range (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function EventMsgColumn(eventMsgMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return eventMsgMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return data.getRangeValue(index, eventMsgMetadata.key); + } + }; + } + + return EventMsgColumn; + } +); \ No newline at end of file diff --git a/platform/features/events/src/RangeColumn.js b/platform/features/events/src/RangeColumn.js new file mode 100644 index 0000000000..2b11de43c7 --- /dev/null +++ b/platform/features/events/src/RangeColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry range values + * (typically, measurements.) Used by the ScrollingListController. + * + * @constructor + * @param rangeMetadata an object with the machine- and human- + * readable names for this range (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function RangeColumn(rangeMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return rangeMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatRangeValue( + data.getRangeValue(index, rangeMetadata.key) + ); + } + }; + } + + return RangeColumn; + } +); \ No newline at end of file diff --git a/platform/features/events/src/SeverityColumn.js b/platform/features/events/src/SeverityColumn.js new file mode 100644 index 0000000000..29f452bcb9 --- /dev/null +++ b/platform/features/events/src/SeverityColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry range values + * (typically, measurements.) Used by the ScrollingListController. + * + * @constructor + * @param rangeMetadata an object with the machine- and human- + * readable names for this range (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function SeverityColumn(rangeMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return rangeMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatRangeValue( + data.getSeverityValue(index, rangeMetadata.key) + ); + } + }; + } + + return SeverityColumn; + } +); \ No newline at end of file diff --git a/platform/features/scrolling/res/templates/scrolling.html b/platform/features/scrolling/res/templates/scrolling.html index 2d5d19fabc..4b7461c9da 100644 --- a/platform/features/scrolling/res/templates/scrolling.html +++ b/platform/features/scrolling/res/templates/scrolling.html @@ -23,7 +23,7 @@
- +
From 7be7844824136f2e342c9df3728467bfd598218d Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Mon, 22 Jun 2015 13:40:55 -0700 Subject: [PATCH 30/64] [Events] Reversed viewing order When viewing an event message generator new messages are now added to the bottom of the display, rather than being added to the top and pushing the other messages down by one. #18. --- example/eventGenerator/src/EventTelemetry.js | 4 +++- platform/features/events/src/EventListController.js | 6 ++++-- platform/features/events/src/EventListPopulator.js | 2 +- platform/telemetry/src/TelemetryController.js | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js index 317799815e..62dd3531d3 100644 --- a/example/eventGenerator/src/EventTelemetry.js +++ b/example/eventGenerator/src/EventTelemetry.js @@ -90,11 +90,13 @@ define( var ind = i%messages.length; return "TEMP " + i.toString() + "-" + messages[ind][2] + "[" + domainDelta.toString() + "]"; }; - + + generatorData.getSeverityValue = function (i) { var ind = i%messages.length; return messages[ind][0]; }; + return generatorData; } diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index d2b54169b5..052e4571c2 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.js @@ -38,8 +38,7 @@ define( */ function EventListController($scope, formatter) { var populator; - - + // Get a set of populated, ready-to-display rows for the // latest data values. function getRows(telemetry) { @@ -53,6 +52,9 @@ define( function updateRows() { var telemetry = $scope.telemetry; $scope.rows = telemetry ? getRows(telemetry) : []; + // We want to display the rows in reverse order + // i.e. from the top to the bottom of the page + $scope.rows = $scope.rows.reverse(); } // Set up columns based on telemetry metadata. This will diff --git a/platform/features/events/src/EventListPopulator.js b/platform/features/events/src/EventListPopulator.js index f2a5c1f473..af6d3e9ae6 100644 --- a/platform/features/events/src/EventListPopulator.js +++ b/platform/features/events/src/EventListPopulator.js @@ -38,7 +38,7 @@ define( * Look up the most recent values from a set of data objects. * Returns an array of objects in the order in which data * should be displayed; each element is an object with - * two properties: + * two properties: * * * objectIndex: The index of the domain object associated * with the data point to be displayed in that diff --git a/platform/telemetry/src/TelemetryController.js b/platform/telemetry/src/TelemetryController.js index 10e83ab316..504ec2ec4a 100644 --- a/platform/telemetry/src/TelemetryController.js +++ b/platform/telemetry/src/TelemetryController.js @@ -342,7 +342,7 @@ define( * the second form, it returns an array ordered in * same manner as `getMetadata()` or * `getTelemetryObjects()`; that is, the telemetry - * response at agiven index will correspond to the + * response at a given index will correspond to the * telemetry-providing domain object at the same index. * @returns {Array} an array of responses */ From a5d5fa0796e2c983da035be38d67476c44c7ebe7 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 11:37:57 -0700 Subject: [PATCH 31/64] [Events] Table height detection Created an mct-data-table directive. We are able to detect changes in the height of the table now, which will be used to determine any corresponding scrolling. #18. --- platform/features/events/bundle.json | 7 ++++ .../events/res/templates/messages.html | 38 +++++++++---------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/platform/features/events/bundle.json b/platform/features/events/bundle.json index 495d06b235..549dda7d36 100644 --- a/platform/features/events/bundle.json +++ b/platform/features/events/bundle.json @@ -19,6 +19,13 @@ "implementation": "EventListController.js", "depends": [ "$scope", "telemetryFormatter" ] } + ], + "directives": [ + { + "key": "mctDataTable", + "implementation": "MCTDataTable.js", + "depends": [ "$anchorScroll" ] + } ] } diff --git a/platform/features/events/res/templates/messages.html b/platform/features/events/res/templates/messages.html index 727ab09a79..a549b3530d 100644 --- a/platform/features/events/res/templates/messages.html +++ b/platform/features/events/res/templates/messages.html @@ -22,27 +22,23 @@
- - - - - - - - - - - - -
- {{header}} -
- {{cell}} -
+ +
From 3337777fea892147fe0967a25bdeb28084d75ae8 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 11:48:08 -0700 Subject: [PATCH 32/64] [Events] Changed file structure Changed file structure to include a separate directives directory. #18. --- .../events/res/templates/mct-data-table.html | 37 +++++++++ .../events/src/directives/MCTDataTable.js | 78 +++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 platform/features/events/res/templates/mct-data-table.html create mode 100644 platform/features/events/src/directives/MCTDataTable.js diff --git a/platform/features/events/res/templates/mct-data-table.html b/platform/features/events/res/templates/mct-data-table.html new file mode 100644 index 0000000000..5b8dd786bc --- /dev/null +++ b/platform/features/events/res/templates/mct-data-table.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + +
+ {{header}} +
+ {{cell}} +
\ No newline at end of file diff --git a/platform/features/events/src/directives/MCTDataTable.js b/platform/features/events/src/directives/MCTDataTable.js new file mode 100644 index 0000000000..439d2b0667 --- /dev/null +++ b/platform/features/events/src/directives/MCTDataTable.js @@ -0,0 +1,78 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining EventMsgColumn. Created by chacskaylo on 06/18/2015. + */ +define( + [], + function () { + "use strict"; + + // This is defined at the top of EventListController.js + // TODO: Access the real one + var ROW_COUNT = 100; + + function MCTDataTable($anchorScroll) { + return { + restrict: "E", + templateUrl: "platform/features/events/res/templates/mct-data-table.html", + scope: { + headers: "=", + rows: "=", + scrollDirection: "=" + }, + link: function ($scope, $element) { + var currentHeight, + previousHeight; + + // If the chosen scoll ascending is descending, we want to + // check when elements are added to the table, and move the scroll + // bar accordingly. + // (When viewing at the bottom of the page, the scroll bar will + // stay at the bottom despite additions to the table) + if ($scope.scrollDirection === "ascending") { + $scope.$watch("rows", function () { + // Wait until the page as been repainted (otherwise the + // height will always be zero) + window.requestAnimationFrame( function () { + previousHeight = currentHeight; + // The offsetHeight of the table body + currentHeight = + $element[0].firstElementChild.firstElementChild.nextElementSibling.offsetHeight; + }); + // TODO: Find a more eloquent way to determine repaint completion + + // Check to see that maximum table rows has not been reached + if ($scope.rows.length < ROW_COUNT) { + // Move the scrollbar down the amount that the height has changed + } + }); + } + } + }; + } + + return MCTDataTable; + } +); \ No newline at end of file From fdab799e5b6d6ccac738e938beeaa8fb35668fdd Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 12:40:50 -0700 Subject: [PATCH 33/64] [Events] Changed directive variables Changed scrollDirection to ascendingScroll, which acts like a boolean. Now there is proper communication between the html and the directive itself. #18. --- platform/features/events/bundle.json | 2 +- .../events/res/templates/messages.html | 18 +----------------- .../events/src/directives/MCTDataTable.js | 8 +++++--- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/platform/features/events/bundle.json b/platform/features/events/bundle.json index 549dda7d36..39b34ee4eb 100644 --- a/platform/features/events/bundle.json +++ b/platform/features/events/bundle.json @@ -23,7 +23,7 @@ "directives": [ { "key": "mctDataTable", - "implementation": "MCTDataTable.js", + "implementation": "directives/MCTDataTable.js", "depends": [ "$anchorScroll" ] } ] diff --git a/platform/features/events/res/templates/messages.html b/platform/features/events/res/templates/messages.html index a549b3530d..82db5d0f9c 100644 --- a/platform/features/events/res/templates/messages.html +++ b/platform/features/events/res/templates/messages.html @@ -22,23 +22,7 @@
- - +
diff --git a/platform/features/events/src/directives/MCTDataTable.js b/platform/features/events/src/directives/MCTDataTable.js index 439d2b0667..220c454300 100644 --- a/platform/features/events/src/directives/MCTDataTable.js +++ b/platform/features/events/src/directives/MCTDataTable.js @@ -40,18 +40,18 @@ define( scope: { headers: "=", rows: "=", - scrollDirection: "=" + ascendingScroll: "=" }, link: function ($scope, $element) { var currentHeight, previousHeight; - // If the chosen scoll ascending is descending, we want to + // If the scroll is set to ascending, we want to // check when elements are added to the table, and move the scroll // bar accordingly. // (When viewing at the bottom of the page, the scroll bar will // stay at the bottom despite additions to the table) - if ($scope.scrollDirection === "ascending") { + if ($scope.ascendingScroll) { $scope.$watch("rows", function () { // Wait until the page as been repainted (otherwise the // height will always be zero) @@ -60,6 +60,8 @@ define( // The offsetHeight of the table body currentHeight = $element[0].firstElementChild.firstElementChild.nextElementSibling.offsetHeight; + + console.log("current height ", currentHeight); }); // TODO: Find a more eloquent way to determine repaint completion From 30e51e783e8aa23e86f0ff3b41119dabda18de57 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 23 Jun 2015 13:03:17 -0700 Subject: [PATCH 34/64] [Core] Add JSDoc Add JSDoc to decorator which provides missing models, WTD-1241. --- platform/core/src/models/MissingModelDecorator.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/core/src/models/MissingModelDecorator.js b/platform/core/src/models/MissingModelDecorator.js index fd59caf9a2..3c82bd2726 100644 --- a/platform/core/src/models/MissingModelDecorator.js +++ b/platform/core/src/models/MissingModelDecorator.js @@ -26,6 +26,11 @@ define( function () { "use strict"; + /** + * Adds placeholder domain object models for any models which + * fail to load from the underlying model service. + * @implements {ModelService} + */ function MissingModelDecorator(modelService) { function missingModel(id) { return { From 960998756292a8ed320a2bf13de820176ea6ba2a Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 13:33:09 -0700 Subject: [PATCH 35/64] [Events] Scrollbar moves with data The scroll position now moves down when a new row is added to the data table. This means that when the scroll position is at the bottom, it will stay there, even with new updates adding onto the botton. #18. --- .../events/src/directives/MCTDataTable.js | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/platform/features/events/src/directives/MCTDataTable.js b/platform/features/events/src/directives/MCTDataTable.js index 220c454300..623413416d 100644 --- a/platform/features/events/src/directives/MCTDataTable.js +++ b/platform/features/events/src/directives/MCTDataTable.js @@ -22,20 +22,16 @@ /*global define,Promise*/ /** - * Module defining EventMsgColumn. Created by chacskaylo on 06/18/2015. + * Module defining MCTDataTable. Created by slhale on 06/22/2015. */ define( [], function () { "use strict"; - // This is defined at the top of EventListController.js - // TODO: Access the real one - var ROW_COUNT = 100; - function MCTDataTable($anchorScroll) { return { - restrict: "E", + restrict: "E", templateUrl: "platform/features/events/res/templates/mct-data-table.html", scope: { headers: "=", @@ -44,7 +40,8 @@ define( }, link: function ($scope, $element) { var currentHeight, - previousHeight; + previousHeight, + scrollParent; // If the scroll is set to ascending, we want to // check when elements are added to the table, and move the scroll @@ -55,20 +52,17 @@ define( $scope.$watch("rows", function () { // Wait until the page as been repainted (otherwise the // height will always be zero) - window.requestAnimationFrame( function () { + window.requestAnimationFrame(function () { previousHeight = currentHeight; - // The offsetHeight of the table body - currentHeight = - $element[0].firstElementChild.firstElementChild.nextElementSibling.offsetHeight; + // The height of the table body + currentHeight = $element[0].firstElementChild.firstElementChild.nextElementSibling.clientHeight; - console.log("current height ", currentHeight); - }); - // TODO: Find a more eloquent way to determine repaint completion - - // Check to see that maximum table rows has not been reached - if ($scope.rows.length < ROW_COUNT) { + // One of the parents is a div that has vscroll + scrollParent = $element[0].parentElement.parentElement.parentElement.parentElement.parentElement; + // Move the scrollbar down the amount that the height has changed - } + scrollParent.scrollTop = scrollParent.scrollTop + (currentHeight - previousHeight); + }); }); } } From c4006646f863320007d1f1a2012617849242ff6f Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 14:21:11 -0700 Subject: [PATCH 36/64] [Events] More generalized data format Made the EventListController use domain and range types, rather than severity, domain, and event message. This allows it to be more generalized, which should be helpful with different data formats later on. #18. --- example/eventGenerator/src/EventTelemetry.js | 41 +++++++++++++++-- .../events/src/EventListController.js | 45 ++++++++----------- 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js index 62dd3531d3..911ba97aee 100644 --- a/example/eventGenerator/src/EventTelemetry.js +++ b/example/eventGenerator/src/EventTelemetry.js @@ -32,7 +32,7 @@ define( var firstObservedTime = Date.now(), messages = []; - +/* messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]); messages.push(["TRACE", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]); messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Open the pod bay doors, Hal."]); @@ -63,7 +63,40 @@ define( messages.push(["WARN", "dsp_seqprt_comm", "RESP: SYS-COMM MSG: (Pause) Well, I'm sure you're right, Umm - fine, thanks very much. Oh, Frank, I'm having a bit of trouble with my transmitter in C-pod, I wonder if you'd come down and take a look at it with me?"]); messages.push(["WARN", "dsp_seqprt_hal9k", "CMD: SYS-HAL9K MSG: Sure."]); messages.push(["TRACE", "dsp_seqprt_comm", "RESP: SYS-COMM MSG: See you later, Hal."]); - +*/ + + messages.push(["CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]); + messages.push(["RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]); + messages.push(["CMD: SYS-COMM MSG: Open the pod bay doors, Hal."]); + messages.push(["RESP: SYS-HAL9K MSG: I'm sorry, Dave, I'm afraid I can't do that."]); + messages.push(["CMD: SYS-COMM MSG: What's the problem?"]); + messages.push(["RESP: SYS-HAL9K MSG: I think you know what the problem is just as well as I do."]); + messages.push(["CMD: SYS-COMM MSG: What're you talking about, Hal?"]); + messages.push(["RESP: SYS-HAL9K MSG: This mission is too important for me to allow you to jeopardise it."]); + messages.push(["CMD: SYS-COMM MSG: I don't know what you're talking about, Hal."]); + messages.push(["RESP: SYS-HAL9K MSG: I know that you and Frank were planning to disconnect me, and I'm afraid that's something I cannot allow to happen."]); + messages.push(["CMD: SYS-COMM MSG: Where the hell'd you get that idea, Hal?"]); + messages.push(["RESP: SYS-HAL9K MSG: Dave, although you took very thorough precautions in the pod against my hearing you, I could see your lips move."]); + messages.push(["CMD: SYS-COMM MSG: Alright, I'll go in through the emergency airlock."]); + messages.push(["RESP: SYS-HAL9K MSG: Without your space-helmet, Dave, you're going to find that rather difficult."]); + messages.push(["CMD: SYS-COMM MSG: Hal, I won't argue with you any more. Open the doors."]); + messages.push(["RESP: SYS-HAL9K MSG: Dave, this conversation can serve no purpose any more. Goodbye."]); + messages.push(["RESP: SYS-HAL9K MSG: I hope the two of you are not concerned about this."]); + messages.push(["CMD: SYS-COMM MSG: No, I'm not, Hal."]); + messages.push(["RESP: SYS-HAL9K MSG: Are you quite sure?"]); + messages.push(["CMD: SYS-COMM MSG: Yeh. I'd like to ask you a question, though."]); + messages.push(["RESP: SYS-HAL9K MSG: Of course."]); + messages.push(["CMD: SYS-COMM MSG: How would you account for this discrepancy between you and the twin 9000?"]); + messages.push(["RESP: SYS-HAL9K MSG: Well, I don't think there is any question about it. It can only be attributable to human error. This sort of thing has cropped up before, and it has always been due to human error."]); + messages.push(["CMD: SYS-COMM MSG: Listen, There's never been any instance at all of a computer error occurring in the 9000 series, has there?"]); + messages.push(["RESP: SYS-HAL9K MSG: None whatsoever, The 9000 series has a perfect operational record."]); + messages.push(["CMD: SYS-COMM MSG: Well, of course, I know all the wonderful achievements of the 9000 series, but - er - huh - are you certain there's never been any case of even the most insignificant computer error?"]); + messages.push(["RESP: SYS-HAL9K MSG: None whatsoever, Quite honestly, I wouldn't worry myself about that."]); + messages.push(["RESP: SYS-COMM MSG: (Pause) Well, I'm sure you're right, Umm - fine, thanks very much. Oh, Frank, I'm having a bit of trouble with my transmitter in C-pod, I wonder if you'd come down and take a look at it with me?"]); + messages.push(["CMD: SYS-HAL9K MSG: Sure."]); + messages.push(["RESP: SYS-COMM MSG: See you later, Hal."]); + + /** * * @constructor @@ -91,12 +124,12 @@ define( return "TEMP " + i.toString() + "-" + messages[ind][2] + "[" + domainDelta.toString() + "]"; }; - + /* generatorData.getSeverityValue = function (i) { var ind = i%messages.length; return messages[ind][0]; }; - + */ return generatorData; } diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index 052e4571c2..0b97941bd1 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.js @@ -22,11 +22,13 @@ /*global define,Promise*/ /** - * Module defining ListController. Created by chacskaylo on 06/18/2015. + * Module defining EventListController. + * Created by chacskaylo on 06/18/2015. + * Modified by slhale on 06/23/2015. */ define( - ["./SeverityColumn", "./DomainColumn", "./EventMsgColumn", "./EventListPopulator"], - function (SeverityColumn, DomainColumn, EventMsgColumn, EventListPopulator) { + ["./DomainColumn", "./RangeColumn", "./EventListPopulator"], + function (DomainColumn, RangeColumn, EventListPopulator) { "use strict"; var ROW_COUNT = 100; @@ -44,7 +46,7 @@ define( function getRows(telemetry) { var datas = telemetry.getResponse(), objects = telemetry.getTelemetryObjects(); - + return populator.getRows(datas, objects, ROW_COUNT); } @@ -62,7 +64,7 @@ define( // well as a column for the domain object name. function setupColumns(telemetry) { var domainKeys = {}, - eventMsgKeys = {}, + rangeKeys = {}, columns = [], metadata; @@ -76,16 +78,16 @@ define( } } - // Add a event string col to the set of columns, if a range + // Add a range col to the set of columns, if a range // with the same key has not yet been included. - function addEventMsg(eventMsg) { - var key = eventMsg.key; - if (key && !eventMsgKeys[key]) { - eventMsgKeys[key] = true; - columns.push(new EventMsgColumn(eventMsg, formatter)); + function addRange(range) { + var key = range.key; + if (key && !rangeKeys[key]) { + rangeKeys[key] = true; + columns.push(new RangeColumn(range, formatter)); } } - + // We cannot proceed if the telemetry controller // is not available; clear all rows/columns. if (!telemetry) { @@ -100,26 +102,17 @@ define( (metadata || []).forEach(function (metadata) { (metadata.domains || []).forEach(addDomain); }); - //(metadata || []).forEach(function (metadata) { - // (metadata.ranges || []).forEach(addRange); - //}); (metadata || []).forEach(function (metadata) { - (metadata.ranges || []).forEach(addEventMsg); + (metadata.ranges || []).forEach(addRange); }); - - - - - // Add default severity, domain, range columns if none + + // Add default domain and range columns if none // were described in metadata. - if (Object.keys(domainKeys).length < 1) { - columns.push(new SeverityColumn({name: "Severity"}, formatter)); - } if (Object.keys(domainKeys).length < 1) { columns.push(new DomainColumn({name: "Time"}, formatter)); } - if (Object.keys(eventMsgKeys).length < 1) { - columns.push(new EventMsgColumn({name: "Event Message"}, formatter)); + if (Object.keys(rangeKeys).length < 1) { + columns.push(new RangeColumn({name: "Message"}, formatter)); } // We have all columns now; use them to initializer From 581f14d117727c1cfed224fd114499b0ac5bbd45 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 14:39:40 -0700 Subject: [PATCH 37/64] [Events] Event telemetry generator working Event telemetry generator now works again, giving a timestamp and a message string. Additionally, removed excess files which previously were used for the EventListController. #18. --- example/eventGenerator/src/EventTelemetry.js | 49 +------------------- 1 file changed, 2 insertions(+), 47 deletions(-) diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js index 911ba97aee..de8d6c2adb 100644 --- a/example/eventGenerator/src/EventTelemetry.js +++ b/example/eventGenerator/src/EventTelemetry.js @@ -32,38 +32,6 @@ define( var firstObservedTime = Date.now(), messages = []; -/* - messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]); - messages.push(["TRACE", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]); - messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Open the pod bay doors, Hal."]); - messages.push(["ERROR", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I'm sorry, Dave, I'm afraid I can't do that."]); - messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: What's the problem?"]); - messages.push(["ERROR", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I think you know what the problem is just as well as I do."]); - messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: What're you talking about, Hal?"]); - messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: This mission is too important for me to allow you to jeopardise it."]); - messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: I don't know what you're talking about, Hal."]); - messages.push(["FATAL", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I know that you and Frank were planning to disconnect me, and I'm afraid that's something I cannot allow to happen."]); - messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Where the hell'd you get that idea, Hal?"]); - messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Dave, although you took very thorough precautions in the pod against my hearing you, I could see your lips move."]); - messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Alright, I'll go in through the emergency airlock."]); - messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Without your space-helmet, Dave, you're going to find that rather difficult."]); - messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Hal, I won't argue with you any more. Open the doors."]); - messages.push(["DEBUG", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Dave, this conversation can serve no purpose any more. Goodbye."]); - messages.push(["INFO", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: I hope the two of you are not concerned about this."]); - messages.push(["DEBUG", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: No, I'm not, Hal."]); - messages.push(["INFO", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Are you quite sure?"]); - messages.push(["INFO", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Yeh. I'd like to ask you a question, though."]); - messages.push(["FATAL", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Of course."]); - messages.push(["TRACE", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: How would you account for this discrepancy between you and the twin 9000?"]); - messages.push(["TRACE", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: Well, I don't think there is any question about it. It can only be attributable to human error. This sort of thing has cropped up before, and it has always been due to human error."]); - messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Listen, There's never been any instance at all of a computer error occurring in the 9000 series, has there?"]); - messages.push(["WARN", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: None whatsoever, The 9000 series has a perfect operational record."]); - messages.push(["WARN", "dsp_seqprt_comm", "CMD: SYS-COMM MSG: Well, of course, I know all the wonderful achievements of the 9000 series, but - er - huh - are you certain there's never been any case of even the most insignificant computer error?"]); - messages.push(["INFO", "dsp_seqprt_hal9k", "RESP: SYS-HAL9K MSG: None whatsoever, Quite honestly, I wouldn't worry myself about that."]); - messages.push(["WARN", "dsp_seqprt_comm", "RESP: SYS-COMM MSG: (Pause) Well, I'm sure you're right, Umm - fine, thanks very much. Oh, Frank, I'm having a bit of trouble with my transmitter in C-pod, I wonder if you'd come down and take a look at it with me?"]); - messages.push(["WARN", "dsp_seqprt_hal9k", "CMD: SYS-HAL9K MSG: Sure."]); - messages.push(["TRACE", "dsp_seqprt_comm", "RESP: SYS-COMM MSG: See you later, Hal."]); -*/ messages.push(["CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]); messages.push(["RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]); @@ -97,18 +65,12 @@ define( messages.push(["RESP: SYS-COMM MSG: See you later, Hal."]); - /** - * - * @constructor - */ function EventTelemetry(request, interval) { var latestObservedTime = Date.now(), count = Math.floor((latestObservedTime - firstObservedTime) / interval), generatorData = {}; - - //console.log("EventTelemetry: LOS = " + (latestObservedTime).toString() + "; interval = " + interval.toString()); - + generatorData.getPointCount = function () { return count; }; @@ -121,16 +83,9 @@ define( generatorData.getRangeValue = function (i, range) { var domainDelta = this.getDomainValue(i) - firstObservedTime; var ind = i%messages.length; - return "TEMP " + i.toString() + "-" + messages[ind][2] + "[" + domainDelta.toString() + "]"; + return "TEMP " + i.toString() + "-" + messages[ind][0] + "[" + domainDelta.toString() + "]"; }; - /* - generatorData.getSeverityValue = function (i) { - var ind = i%messages.length; - return messages[ind][0]; - }; - */ - return generatorData; } From 7d3c2b72431a18aab8af4370d0c2d6531ab0d566 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 14:47:21 -0700 Subject: [PATCH 38/64] [Events] Style compliance Made some small changes to keep up with the style standards. #18. --- example/eventGenerator/src/EventTelemetry.js | 11 +-- .../features/events/src/EventMsgColumn.js | 65 ------------------ .../features/events/src/SeverityColumn.js | 67 ------------------- 3 files changed, 7 insertions(+), 136 deletions(-) delete mode 100644 platform/features/events/src/EventMsgColumn.js delete mode 100644 platform/features/events/src/SeverityColumn.js diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js index de8d6c2adb..9e52c62443 100644 --- a/example/eventGenerator/src/EventTelemetry.js +++ b/example/eventGenerator/src/EventTelemetry.js @@ -22,7 +22,9 @@ /*global define,Promise*/ /** - * Module defining EventTelemetry. Created by chacskaylo on 06/18/2015. + * Module defining EventTelemetry. + * Created by chacskaylo on 06/18/2015. + * Modified by slhale on 06/23/2015. */ define( [], @@ -79,11 +81,12 @@ define( return i * interval + (domain !== 'delta' ? firstObservedTime : 0); }; - + generatorData.getRangeValue = function (i, range) { - var domainDelta = this.getDomainValue(i) - firstObservedTime; - var ind = i%messages.length; + var domainDelta = this.getDomainValue(i) - firstObservedTime, + ind = i % messages.length; return "TEMP " + i.toString() + "-" + messages[ind][0] + "[" + domainDelta.toString() + "]"; + // TODO: Unsure why we are prepeding 'TEMP' }; return generatorData; diff --git a/platform/features/events/src/EventMsgColumn.js b/platform/features/events/src/EventMsgColumn.js deleted file mode 100644 index ab24cd9f29..0000000000 --- a/platform/features/events/src/EventMsgColumn.js +++ /dev/null @@ -1,65 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,Promise*/ - -/** - * Module defining EventMsgColumn. Created by chacskaylo on 06/18/2015. - */ -define( - [], - function () { - "use strict"; - - /** - * A column which will report telemetry event messages. - * (typically, measurements.) Used by the EventListController. - * - * @constructor - * @param rangeMetadata an object with the machine- and human- - * readable names for this range (in `key` and `name` - * fields, respectively.) - * @param {TelemetryFormatter} telemetryFormatter the telemetry - * formatting service, for making values human-readable. - */ - function EventMsgColumn(eventMsgMetadata, telemetryFormatter) { - return { - /** - * Get the title to display in this column's header. - * @returns {string} the title to display - */ - getTitle: function () { - return eventMsgMetadata.name; - }, - /** - * Get the text to display inside a row under this - * column. - * @returns {string} the text to display - */ - getValue: function (domainObject, data, index) { - return data.getRangeValue(index, eventMsgMetadata.key); - } - }; - } - - return EventMsgColumn; - } -); \ No newline at end of file diff --git a/platform/features/events/src/SeverityColumn.js b/platform/features/events/src/SeverityColumn.js deleted file mode 100644 index 29f452bcb9..0000000000 --- a/platform/features/events/src/SeverityColumn.js +++ /dev/null @@ -1,67 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,Promise*/ - -/** - * Module defining DomainColumn. Created by vwoeltje on 11/18/14. - */ -define( - [], - function () { - "use strict"; - - /** - * A column which will report telemetry range values - * (typically, measurements.) Used by the ScrollingListController. - * - * @constructor - * @param rangeMetadata an object with the machine- and human- - * readable names for this range (in `key` and `name` - * fields, respectively.) - * @param {TelemetryFormatter} telemetryFormatter the telemetry - * formatting service, for making values human-readable. - */ - function SeverityColumn(rangeMetadata, telemetryFormatter) { - return { - /** - * Get the title to display in this column's header. - * @returns {string} the title to display - */ - getTitle: function () { - return rangeMetadata.name; - }, - /** - * Get the text to display inside a row under this - * column. - * @returns {string} the text to display - */ - getValue: function (domainObject, data, index) { - return telemetryFormatter.formatRangeValue( - data.getSeverityValue(index, rangeMetadata.key) - ); - } - }; - } - - return SeverityColumn; - } -); \ No newline at end of file From 5da210d350648e92254d693ae46802eb703805cc Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 15:09:34 -0700 Subject: [PATCH 39/64] [Events] More style compliance More small changes for style. #18. --- example/eventGenerator/src/EventTelemetry.js | 2 +- platform/features/events/src/EventListController.js | 6 +++--- platform/features/events/src/directives/MCTDataTable.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js index 9e52c62443..504f8fbec5 100644 --- a/example/eventGenerator/src/EventTelemetry.js +++ b/example/eventGenerator/src/EventTelemetry.js @@ -24,7 +24,7 @@ /** * Module defining EventTelemetry. * Created by chacskaylo on 06/18/2015. - * Modified by slhale on 06/23/2015. + * Modified by shale on 06/23/2015. */ define( [], diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index 0b97941bd1..6fea6f97cd 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.js @@ -24,7 +24,7 @@ /** * Module defining EventListController. * Created by chacskaylo on 06/18/2015. - * Modified by slhale on 06/23/2015. + * Modified by shale on 06/23/2015. */ define( ["./DomainColumn", "./RangeColumn", "./EventListPopulator"], @@ -114,12 +114,12 @@ define( if (Object.keys(rangeKeys).length < 1) { columns.push(new RangeColumn({name: "Message"}, formatter)); } - + // We have all columns now; use them to initializer // the populator, which will use them to generate // actual rows and headers. populator = new EventListPopulator(columns); - + // Initialize headers $scope.headers = populator.getHeaders(); diff --git a/platform/features/events/src/directives/MCTDataTable.js b/platform/features/events/src/directives/MCTDataTable.js index 623413416d..de3ea44e32 100644 --- a/platform/features/events/src/directives/MCTDataTable.js +++ b/platform/features/events/src/directives/MCTDataTable.js @@ -22,7 +22,7 @@ /*global define,Promise*/ /** - * Module defining MCTDataTable. Created by slhale on 06/22/2015. + * Module defining MCTDataTable. Created by shale on 06/22/2015. */ define( [], From 5d2afac83b7ec094df7ffe7451cb55c1029c1eac Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 15:40:12 -0700 Subject: [PATCH 40/64] [Events] Window injected with Angular Used provided by angular to better follow style guidelines, as well as for utility in testing later. #18. --- platform/features/events/bundle.json | 2 +- platform/features/events/src/directives/MCTDataTable.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/features/events/bundle.json b/platform/features/events/bundle.json index 39b34ee4eb..e925a1f215 100644 --- a/platform/features/events/bundle.json +++ b/platform/features/events/bundle.json @@ -24,7 +24,7 @@ { "key": "mctDataTable", "implementation": "directives/MCTDataTable.js", - "depends": [ "$anchorScroll" ] + "depends": [ "$window" ] } ] } diff --git a/platform/features/events/src/directives/MCTDataTable.js b/platform/features/events/src/directives/MCTDataTable.js index de3ea44e32..c0a3352d1d 100644 --- a/platform/features/events/src/directives/MCTDataTable.js +++ b/platform/features/events/src/directives/MCTDataTable.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 define,Promise*/ +/*global define,Promise,window*/ /** * Module defining MCTDataTable. Created by shale on 06/22/2015. @@ -29,7 +29,7 @@ define( function () { "use strict"; - function MCTDataTable($anchorScroll) { + function MCTDataTable($window) { return { restrict: "E", templateUrl: "platform/features/events/res/templates/mct-data-table.html", @@ -52,7 +52,7 @@ define( $scope.$watch("rows", function () { // Wait until the page as been repainted (otherwise the // height will always be zero) - window.requestAnimationFrame(function () { + $window.requestAnimationFrame(function () { previousHeight = currentHeight; // The height of the table body currentHeight = $element[0].firstElementChild.firstElementChild.nextElementSibling.clientHeight; From 567ccf045418eafd4ab9def70148917bf2cbd3c2 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 15:42:22 -0700 Subject: [PATCH 41/64] [Events] More style Removed part of comment. #18. --- platform/features/events/src/directives/MCTDataTable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/events/src/directives/MCTDataTable.js b/platform/features/events/src/directives/MCTDataTable.js index c0a3352d1d..c4cb9970e6 100644 --- a/platform/features/events/src/directives/MCTDataTable.js +++ b/platform/features/events/src/directives/MCTDataTable.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 define,Promise,window*/ +/*global define,Promise*/ /** * Module defining MCTDataTable. Created by shale on 06/22/2015. From 2a9aa7ee2fddc1f8299206c3d814e8214270a4bf Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Tue, 23 Jun 2015 15:54:48 -0700 Subject: [PATCH 42/64] [Events] Beginning test setup The files needed to write the tests are in place. #18. --- .../features/events/test/DomainColumnSpec.js | 84 +++++++++++++++++++ .../events/test/EventListControllerSpec.js | 0 .../events/test/EventListPopulatorSpec.js | 0 .../features/events/test/MCTDataTableSpec.js | 0 .../features/events/test/RangeColumnSpec.js | 81 ++++++++++++++++++ platform/features/events/test/suite.json | 7 ++ 6 files changed, 172 insertions(+) create mode 100644 platform/features/events/test/DomainColumnSpec.js create mode 100644 platform/features/events/test/EventListControllerSpec.js create mode 100644 platform/features/events/test/EventListPopulatorSpec.js create mode 100644 platform/features/events/test/MCTDataTableSpec.js create mode 100644 platform/features/events/test/RangeColumnSpec.js create mode 100644 platform/features/events/test/suite.json diff --git a/platform/features/events/test/DomainColumnSpec.js b/platform/features/events/test/DomainColumnSpec.js new file mode 100644 index 0000000000..8774a20f60 --- /dev/null +++ b/platform/features/events/test/DomainColumnSpec.js @@ -0,0 +1,84 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by shale on 06/23/2015. + */ +define( + ["../src/DomainColumn"], + function (DomainColumn) { + "use strict"; + + var TEST_DOMAIN_VALUE = "some formatted domain value"; + + describe("A domain column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getDomainValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatDomainValue.andReturn(TEST_DOMAIN_VALUE); + + column = new DomainColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from domain metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getDomainValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats domain values as time", function () { + mockDataSet.getDomainValue.andReturn(402513731000); + + // Should have just given the value the formatter gave + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_DOMAIN_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatDomainValue) + .toHaveBeenCalledWith(402513731000); + expect(mockFormatter.formatRangeValue) + .not.toHaveBeenCalled(); + }); + + }); + } +); \ No newline at end of file diff --git a/platform/features/events/test/EventListControllerSpec.js b/platform/features/events/test/EventListControllerSpec.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/features/events/test/EventListPopulatorSpec.js b/platform/features/events/test/EventListPopulatorSpec.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/features/events/test/MCTDataTableSpec.js b/platform/features/events/test/MCTDataTableSpec.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/features/events/test/RangeColumnSpec.js b/platform/features/events/test/RangeColumnSpec.js new file mode 100644 index 0000000000..c69e9c6c85 --- /dev/null +++ b/platform/features/events/test/RangeColumnSpec.js @@ -0,0 +1,81 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by shale on 06/23/2015. + */ +define( + ["../src/RangeColumn"], + function (RangeColumn) { + "use strict"; + + var TEST_RANGE_VALUE = "some formatted range value"; + + describe("A range column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getRangeValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE); + + column = new RangeColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from range metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getRangeValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats range values as time", function () { + mockDataSet.getRangeValue.andReturn(123.45678); + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_RANGE_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatRangeValue) + .toHaveBeenCalledWith(123.45678); + expect(mockFormatter.formatDomainValue) + .not.toHaveBeenCalled(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/events/test/suite.json b/platform/features/events/test/suite.json new file mode 100644 index 0000000000..150a4f853c --- /dev/null +++ b/platform/features/events/test/suite.json @@ -0,0 +1,7 @@ +[ + "DomainColumn", + "EventListController", + "EventListPopulator", + "MCTDataTable", + "RangeColumn" +] \ No newline at end of file From ba1f86da25e298c66ae14006d58ca47444945bbf Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 10:15:09 -0700 Subject: [PATCH 43/64] [Events] Restricted when view avaliable Created a new policy to only allow the Messages view to be avaliable for Event Message Generators. #18. --- platform/features/events/bundle.json | 9 ++- .../events/src/EventListController.js | 6 +- .../events/src/policies/MessagesViewPolicy.js | 64 +++++++++++++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 platform/features/events/src/policies/MessagesViewPolicy.js diff --git a/platform/features/events/bundle.json b/platform/features/events/bundle.json index e925a1f215..deacfab4b9 100644 --- a/platform/features/events/bundle.json +++ b/platform/features/events/bundle.json @@ -26,7 +26,12 @@ "implementation": "directives/MCTDataTable.js", "depends": [ "$window" ] } + ], + "policies": [ + { + "category": "view", + "implementation": "policies/MessagesViewPolicy.js" + } ] } - -} \ No newline at end of file +} diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index 6fea6f97cd..9c028384af 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.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 define,Promise*/ +/*global define*/ /** * Module defining EventListController. @@ -30,7 +30,7 @@ define( ["./DomainColumn", "./RangeColumn", "./EventListPopulator"], function (DomainColumn, RangeColumn, EventListPopulator) { "use strict"; - + var ROW_COUNT = 100; /** @@ -133,4 +133,4 @@ define( return EventListController; } -); \ No newline at end of file +); diff --git a/platform/features/events/src/policies/MessagesViewPolicy.js b/platform/features/events/src/policies/MessagesViewPolicy.js new file mode 100644 index 0000000000..45b2ef5b27 --- /dev/null +++ b/platform/features/events/src/policies/MessagesViewPolicy.js @@ -0,0 +1,64 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * Module defining MessagesViewPolicy. Created by shale on 06/24/2015. + */ +define( + [], + function () { + "use strict"; + + /** + * Policy controlling when the Messages view should be avaliable. + * @constructor + */ + function MessagesViewPolicy() { + + return { + /** + * Check whether or not a given action is allowed by this + * policy. + * @param {Action} action the action + * @param domainObject the domain object which will be viewed + * @returns {boolean} true if not disallowed + */ + allow: function (view, domainObject) { + // This policy only applies for the Messages view + if (view.key === 'messages') { + // The Messages view is allowed only if the domain + // object is a Event Message Generator + if (domainObject.getModel().type !== 'eventGenerator') { + return false; + } + } + + // Like all policies, allow by default. + return true; + } + }; + } + + return MessagesViewPolicy; + } +); \ No newline at end of file From e7598adcee071d6adf704684bea0cda68a8ba9c8 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 10:40:03 -0700 Subject: [PATCH 44/64] [Events] View policy test Created a test for the MessagesViewPolicy. #18. --- platform/features/events/src/policies/MessagesViewPolicy.js | 2 ++ platform/features/events/test/suite.json | 1 + 2 files changed, 3 insertions(+) diff --git a/platform/features/events/src/policies/MessagesViewPolicy.js b/platform/features/events/src/policies/MessagesViewPolicy.js index 45b2ef5b27..b31ca94374 100644 --- a/platform/features/events/src/policies/MessagesViewPolicy.js +++ b/platform/features/events/src/policies/MessagesViewPolicy.js @@ -51,6 +51,8 @@ define( if (domainObject.getModel().type !== 'eventGenerator') { return false; } + + // TODO: This may later apply to more types beyond just eventGenerator. } // Like all policies, allow by default. diff --git a/platform/features/events/test/suite.json b/platform/features/events/test/suite.json index 150a4f853c..67076cd4cc 100644 --- a/platform/features/events/test/suite.json +++ b/platform/features/events/test/suite.json @@ -3,5 +3,6 @@ "EventListController", "EventListPopulator", "MCTDataTable", + "MessagesViewPolicy", "RangeColumn" ] \ No newline at end of file From 54cf5a2c594a79abfa5fb5ff34bf4bde4f43e8f3 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 11:16:03 -0700 Subject: [PATCH 45/64] [Events] Changed where row reversal happens Changed where in the code the row are reveresd (wrt scrolling lists) so that the most recent messages are on the bottom. The rows are now in the correct order from getRows, rather then updateRows. #18. --- platform/features/events/src/EventListController.js | 3 --- platform/features/events/src/EventListPopulator.js | 8 +++++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index 9c028384af..887fa52a4a 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.js @@ -54,9 +54,6 @@ define( function updateRows() { var telemetry = $scope.telemetry; $scope.rows = telemetry ? getRows(telemetry) : []; - // We want to display the rows in reverse order - // i.e. from the top to the bottom of the page - $scope.rows = $scope.rows.reverse(); } // Set up columns based on telemetry metadata. This will diff --git a/platform/features/events/src/EventListPopulator.js b/platform/features/events/src/EventListPopulator.js index af6d3e9ae6..b128a91706 100644 --- a/platform/features/events/src/EventListPopulator.js +++ b/platform/features/events/src/EventListPopulator.js @@ -139,8 +139,10 @@ define( // Each value will become a row, which will contain // some value in each column (rendering by the - // column object itself) - return values.map(function (value) { + // column object itself) + // Additionally, we want to display the rows in reverse + // order. (i.e. from the top to the bottom of the page) + return values.map(function (value) { return columns.map(function (column) { return column.getValue( objects[value.objectIndex], @@ -148,7 +150,7 @@ define( value.pointIndex ); }); - }); + }).reverse(); } }; } From 86240a337f837278a25bbdc23f014c904f279631 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 11:17:30 -0700 Subject: [PATCH 46/64] [Events] Controller and populator tests Created tests for EventListController and EventListPopulator. #18. --- .../events/test/EventListControllerSpec.js | 110 ++++++++++++++++++ .../events/test/EventListPopulatorSpec.js | 103 ++++++++++++++++ .../events/test/MessagesViewPolicySpec.js | 67 +++++++++++ 3 files changed, 280 insertions(+) create mode 100644 platform/features/events/test/MessagesViewPolicySpec.js diff --git a/platform/features/events/test/EventListControllerSpec.js b/platform/features/events/test/EventListControllerSpec.js index e69de29bb2..63a762e4d4 100644 --- a/platform/features/events/test/EventListControllerSpec.js +++ b/platform/features/events/test/EventListControllerSpec.js @@ -0,0 +1,110 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by shale on 06/24/2015. + */ +define( + ["../src/EventListController"], + function (EventListController) { + "use strict"; + + describe("The event list controller", function () { + var mockScope, + mockTelemetry, + testMetadata, + controller; + + beforeEach(function () { + mockScope = jasmine.createSpyObj( + "$scope", + [ "$on", "$watch" ] + ); + mockTelemetry = jasmine.createSpyObj( + "telemetryController", + [ "getResponse", "getMetadata", "getTelemetryObjects" ] + ); + testMetadata = [ + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d1", name: "D1" } + ], + ranges: [ + { key: "r0", name: "R0" }, + { key: "r1", name: "R1" } + ] + }, + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d2", name: "D2" } + ], + ranges: [ + { key: "r0", name: "R0" } + ] + } + ]; + mockTelemetry.getMetadata.andReturn(testMetadata); + mockTelemetry.getResponse.andReturn([]); + mockTelemetry.getTelemetryObjects.andReturn([]); + mockScope.telemetry = mockTelemetry; + controller = new EventListController(mockScope); + }); + + it("listens for telemetry data updates", function () { + expect(mockScope.$on).toHaveBeenCalledWith( + "telemetryUpdate", + jasmine.any(Function) + ); + }); + + it("watches for telemetry controller changes", function () { + expect(mockScope.$watch).toHaveBeenCalledWith( + "telemetry", + jasmine.any(Function) + ); + }); + + it("provides a column for each unique domain and range", function () { + // Should have five columns based on metadata above, + // (d0, d1, d2, r0, r1) + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["D0", "D1", "D2", "R0", "R1"]); + }); + + it("does not throw if telemetry controller is undefined", function () { + // Just a general robustness check + mockScope.telemetry = undefined; + expect(mockScope.$watch.mostRecentCall.args[1]) + .not.toThrow(); + }); + + it("provides default columns if domain/range metadata is unavailable", function () { + mockTelemetry.getMetadata.andReturn([]); + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["Time", "Message"]); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/events/test/EventListPopulatorSpec.js b/platform/features/events/test/EventListPopulatorSpec.js index e69de29bb2..b263c003a0 100644 --- a/platform/features/events/test/EventListPopulatorSpec.js +++ b/platform/features/events/test/EventListPopulatorSpec.js @@ -0,0 +1,103 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by shale on 06/24/2015. + */ +define( + ["../src/EventListPopulator"], + function (EventListPopulator) { + "use strict"; + + describe("The event list populator", function () { + var mockColumns, + mockDatas, + mockDomainObjects, + populator; + + function makeMockColumn(name, index) { + var mockColumn = jasmine.createSpyObj( + "column" + index, + [ "getTitle", "getValue" ] + ); + mockColumn.getTitle.andReturn(name); + mockColumn.getValue.andCallFake(function (obj, data, i) { + return data.getDomainValue(i); + }); + return mockColumn; + } + + function makeMockData(bias, index) { + var mockData = jasmine.createSpyObj( + "data" + index, + [ "getDomainValue", "getPointCount" ] + ); + mockData.getPointCount.andReturn(1000); + mockData.getDomainValue.andCallFake(function (i) { + return i + bias; + }); + return mockData; + } + + function makeMockDomainObject(name, index) { + var mockDomainObject = jasmine.createSpyObj( + "domainObject" + index, + [ "getId", "getModel" ] + ); + return mockDomainObject; + } + + beforeEach(function () { + mockColumns = ["A", "B", "C", "D"].map(makeMockColumn); + mockDatas = [ 10, 0, 3 ].map(makeMockData); + mockDomainObjects = ["A", "B", "C"].map(makeMockDomainObject); + populator = new EventListPopulator(mockColumns); + }); + + it("returns column headers", function () { + expect(populator.getHeaders()).toEqual(["A", "B", "C", "D"]); + }); + + it("provides rows on request, with all columns in each row", function () { + var rows = populator.getRows(mockDatas, mockDomainObjects, 84); + expect(rows.length).toEqual(84); + rows.forEach(function (row) { + expect(row.length).toEqual(4); // number of columns + }); + }); + + it("returns rows in reverse domain order", function () { + var rows = populator.getRows(mockDatas, mockDomainObjects, 84), + previous = Number.NEGATIVE_INFINITY; + + // Should always be most-recent-last + rows.forEach(function (row) { + expect(row[0]).not.toBeLessThan(previous); + previous = row[0]; + }); + + }); + + }); + } +); \ No newline at end of file diff --git a/platform/features/events/test/MessagesViewPolicySpec.js b/platform/features/events/test/MessagesViewPolicySpec.js new file mode 100644 index 0000000000..b2bfc17e3d --- /dev/null +++ b/platform/features/events/test/MessagesViewPolicySpec.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine*/ + +/** + * EventSpec. Created by shale on 06/24/2015. + */ +define( + ["../src/policies/MessagesViewPolicy"], + function (MessagesViewPolicy) { + "use strict"; + + describe("The messages view policy", function () { + var mockDomainObject, + testType, + policy; + + beforeEach(function () { + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getModel'] + ); + mockDomainObject.getModel.andCallFake(function (c) { + return {type: testType}; + }); + + policy = new MessagesViewPolicy(); + }); + + it("disallows the message view for non Event Generators", function () { + testType = 'notAnEventGenerator'; + expect(policy.allow({ key: 'messages' }, mockDomainObject)) + .toBeFalsy(); + }); + + it("allows the message view for Event Generators", function () { + testType = 'eventGenerator'; + expect(policy.allow({ key: 'messages' }, mockDomainObject)) + .toBeTruthy(); + }); + + it("returns true when the current view is not the Messages view", function () { + expect(policy.allow({ key: 'notMessages' }, mockDomainObject)) + .toBeTruthy(); + }); + }); + } +); \ No newline at end of file From ebfb4cd055c484efe9a58b451db78d90029870ed Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 11:20:38 -0700 Subject: [PATCH 47/64] [Events] Removed mct-data-table test Removed the test for MCTDataTable because it is a directive. #18. --- platform/features/events/test/MCTDataTableSpec.js | 0 platform/features/events/test/suite.json | 1 - 2 files changed, 1 deletion(-) delete mode 100644 platform/features/events/test/MCTDataTableSpec.js diff --git a/platform/features/events/test/MCTDataTableSpec.js b/platform/features/events/test/MCTDataTableSpec.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/platform/features/events/test/suite.json b/platform/features/events/test/suite.json index 67076cd4cc..e796d65ebb 100644 --- a/platform/features/events/test/suite.json +++ b/platform/features/events/test/suite.json @@ -2,7 +2,6 @@ "DomainColumn", "EventListController", "EventListPopulator", - "MCTDataTable", "MessagesViewPolicy", "RangeColumn" ] \ No newline at end of file From ff8e6f40bb654c453d9ab7663cd0a02cd8297a62 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 11:32:13 -0700 Subject: [PATCH 48/64] [Events] More style Edited comments to clarify the sources of files. #18. --- platform/features/events/test/DomainColumnSpec.js | 2 +- platform/features/events/test/RangeColumnSpec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/features/events/test/DomainColumnSpec.js b/platform/features/events/test/DomainColumnSpec.js index 8774a20f60..c63eebc0a9 100644 --- a/platform/features/events/test/DomainColumnSpec.js +++ b/platform/features/events/test/DomainColumnSpec.js @@ -22,7 +22,7 @@ /*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ /** - * EventSpec. Created by shale on 06/23/2015. + * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. */ define( ["../src/DomainColumn"], diff --git a/platform/features/events/test/RangeColumnSpec.js b/platform/features/events/test/RangeColumnSpec.js index c69e9c6c85..204e246daf 100644 --- a/platform/features/events/test/RangeColumnSpec.js +++ b/platform/features/events/test/RangeColumnSpec.js @@ -22,7 +22,7 @@ /*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ /** - * EventSpec. Created by shale on 06/23/2015. + * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. */ define( ["../src/RangeColumn"], From 00d1728dd3e9e262320b61a6b71624b6c9a72bc5 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 12:07:06 -0700 Subject: [PATCH 49/64] [Events] Tweaked tests Changed some test names to be more descriptive. Moved the policy test to another folder. Blanket coverage now works. #18. --- .../features/events/test/DomainColumnSpec.js | 2 +- .../events/test/EventListPopulatorSpec.js | 2 +- .../events/test/MessagesViewPolicySpec.js | 67 ------------------- .../features/events/test/RangeColumnSpec.js | 2 +- platform/features/events/test/suite.json | 2 +- 5 files changed, 4 insertions(+), 71 deletions(-) delete mode 100644 platform/features/events/test/MessagesViewPolicySpec.js diff --git a/platform/features/events/test/DomainColumnSpec.js b/platform/features/events/test/DomainColumnSpec.js index c63eebc0a9..29c896cd5b 100644 --- a/platform/features/events/test/DomainColumnSpec.js +++ b/platform/features/events/test/DomainColumnSpec.js @@ -31,7 +31,7 @@ define( var TEST_DOMAIN_VALUE = "some formatted domain value"; - describe("A domain column", function () { + describe("An event list domain column", function () { var mockDataSet, testMetadata, mockFormatter, diff --git a/platform/features/events/test/EventListPopulatorSpec.js b/platform/features/events/test/EventListPopulatorSpec.js index b263c003a0..7937714fec 100644 --- a/platform/features/events/test/EventListPopulatorSpec.js +++ b/platform/features/events/test/EventListPopulatorSpec.js @@ -86,7 +86,7 @@ define( }); }); - it("returns rows in reverse domain order", function () { + it("returns rows in most-recent-last order", function () { var rows = populator.getRows(mockDatas, mockDomainObjects, 84), previous = Number.NEGATIVE_INFINITY; diff --git a/platform/features/events/test/MessagesViewPolicySpec.js b/platform/features/events/test/MessagesViewPolicySpec.js deleted file mode 100644 index b2bfc17e3d..0000000000 --- a/platform/features/events/test/MessagesViewPolicySpec.js +++ /dev/null @@ -1,67 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,describe,it,expect,beforeEach,jasmine*/ - -/** - * EventSpec. Created by shale on 06/24/2015. - */ -define( - ["../src/policies/MessagesViewPolicy"], - function (MessagesViewPolicy) { - "use strict"; - - describe("The messages view policy", function () { - var mockDomainObject, - testType, - policy; - - beforeEach(function () { - mockDomainObject = jasmine.createSpyObj( - 'domainObject', - ['getModel'] - ); - mockDomainObject.getModel.andCallFake(function (c) { - return {type: testType}; - }); - - policy = new MessagesViewPolicy(); - }); - - it("disallows the message view for non Event Generators", function () { - testType = 'notAnEventGenerator'; - expect(policy.allow({ key: 'messages' }, mockDomainObject)) - .toBeFalsy(); - }); - - it("allows the message view for Event Generators", function () { - testType = 'eventGenerator'; - expect(policy.allow({ key: 'messages' }, mockDomainObject)) - .toBeTruthy(); - }); - - it("returns true when the current view is not the Messages view", function () { - expect(policy.allow({ key: 'notMessages' }, mockDomainObject)) - .toBeTruthy(); - }); - }); - } -); \ No newline at end of file diff --git a/platform/features/events/test/RangeColumnSpec.js b/platform/features/events/test/RangeColumnSpec.js index 204e246daf..99c5ceb6f4 100644 --- a/platform/features/events/test/RangeColumnSpec.js +++ b/platform/features/events/test/RangeColumnSpec.js @@ -31,7 +31,7 @@ define( var TEST_RANGE_VALUE = "some formatted range value"; - describe("A range column", function () { + describe("An event list range column", function () { var mockDataSet, testMetadata, mockFormatter, diff --git a/platform/features/events/test/suite.json b/platform/features/events/test/suite.json index e796d65ebb..44c96e9fa6 100644 --- a/platform/features/events/test/suite.json +++ b/platform/features/events/test/suite.json @@ -2,6 +2,6 @@ "DomainColumn", "EventListController", "EventListPopulator", - "MessagesViewPolicy", + "policies/MessagesViewPolicy", "RangeColumn" ] \ No newline at end of file From adc4a1b828ac0eb2daa65bea0a0b720ddaed5622 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 12:07:06 -0700 Subject: [PATCH 50/64] [Events] Tweaked tests Changed some test names to be more descriptive. Moved the policy test to another folder. Blanket coverage now works. #18. --- platform/features/events/test/DomainColumnSpec.js | 2 +- platform/features/events/test/EventListPopulatorSpec.js | 2 +- platform/features/events/test/RangeColumnSpec.js | 2 +- .../events/test/{ => policies}/MessagesViewPolicySpec.js | 2 +- platform/features/events/test/suite.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename platform/features/events/test/{ => policies}/MessagesViewPolicySpec.js (98%) diff --git a/platform/features/events/test/DomainColumnSpec.js b/platform/features/events/test/DomainColumnSpec.js index c63eebc0a9..29c896cd5b 100644 --- a/platform/features/events/test/DomainColumnSpec.js +++ b/platform/features/events/test/DomainColumnSpec.js @@ -31,7 +31,7 @@ define( var TEST_DOMAIN_VALUE = "some formatted domain value"; - describe("A domain column", function () { + describe("An event list domain column", function () { var mockDataSet, testMetadata, mockFormatter, diff --git a/platform/features/events/test/EventListPopulatorSpec.js b/platform/features/events/test/EventListPopulatorSpec.js index b263c003a0..7937714fec 100644 --- a/platform/features/events/test/EventListPopulatorSpec.js +++ b/platform/features/events/test/EventListPopulatorSpec.js @@ -86,7 +86,7 @@ define( }); }); - it("returns rows in reverse domain order", function () { + it("returns rows in most-recent-last order", function () { var rows = populator.getRows(mockDatas, mockDomainObjects, 84), previous = Number.NEGATIVE_INFINITY; diff --git a/platform/features/events/test/RangeColumnSpec.js b/platform/features/events/test/RangeColumnSpec.js index 204e246daf..99c5ceb6f4 100644 --- a/platform/features/events/test/RangeColumnSpec.js +++ b/platform/features/events/test/RangeColumnSpec.js @@ -31,7 +31,7 @@ define( var TEST_RANGE_VALUE = "some formatted range value"; - describe("A range column", function () { + describe("An event list range column", function () { var mockDataSet, testMetadata, mockFormatter, diff --git a/platform/features/events/test/MessagesViewPolicySpec.js b/platform/features/events/test/policies/MessagesViewPolicySpec.js similarity index 98% rename from platform/features/events/test/MessagesViewPolicySpec.js rename to platform/features/events/test/policies/MessagesViewPolicySpec.js index b2bfc17e3d..0c26b8f249 100644 --- a/platform/features/events/test/MessagesViewPolicySpec.js +++ b/platform/features/events/test/policies/MessagesViewPolicySpec.js @@ -25,7 +25,7 @@ * EventSpec. Created by shale on 06/24/2015. */ define( - ["../src/policies/MessagesViewPolicy"], + ["../../src/policies/MessagesViewPolicy"], function (MessagesViewPolicy) { "use strict"; diff --git a/platform/features/events/test/suite.json b/platform/features/events/test/suite.json index e796d65ebb..44c96e9fa6 100644 --- a/platform/features/events/test/suite.json +++ b/platform/features/events/test/suite.json @@ -2,6 +2,6 @@ "DomainColumn", "EventListController", "EventListPopulator", - "MessagesViewPolicy", + "policies/MessagesViewPolicy", "RangeColumn" ] \ No newline at end of file From 10e47e6f4842e96599a1bfb4c9e7e23d52b8fe41 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 13:14:19 -0700 Subject: [PATCH 51/64] [Events] Fixed comments Fixed comments to refer to event lists correctly. #18. --- platform/features/events/src/EventListController.js | 2 +- platform/features/events/src/EventListPopulator.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index 887fa52a4a..8f8ca6c60a 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.js @@ -35,7 +35,7 @@ define( /** * The EventListController is responsible for populating - * the contents of the scrolling list view. + * the contents of the event list view. * @constructor */ function EventListController($scope, formatter) { diff --git a/platform/features/events/src/EventListPopulator.js b/platform/features/events/src/EventListPopulator.js index b128a91706..3999fb1ebc 100644 --- a/platform/features/events/src/EventListPopulator.js +++ b/platform/features/events/src/EventListPopulator.js @@ -28,7 +28,7 @@ define( /** * The EventListPopulator is responsible for filling in the - * values which should appear within columns of a scrolling list + * values which should appear within columns of a event list * view, based on received telemetry data. * @constructor * @param {Column[]} columns the columns to be populated @@ -124,7 +124,7 @@ define( }); }, /** - * Get the contents of rows for the scrolling list view. + * Get the contents of rows for the event list view. * @param {TelemetrySeries[]} datas the data sets * @param {DomainObject[]} objects the domain objects which * provided the data sets; these should match From fd81c5c859ece11c982a887e912043552cc007a3 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 15:19:47 -0700 Subject: [PATCH 52/64] [Events] No Period No longer asks for a period when creating a new Event Message Generator. #18. --- example/eventGenerator/bundle.json | 17 ++--------------- example/eventGenerator/src/EventTelemetry.js | 2 +- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/example/eventGenerator/bundle.json b/example/eventGenerator/bundle.json index 83b52b91ac..b2ede6893b 100644 --- a/example/eventGenerator/bundle.json +++ b/example/eventGenerator/bundle.json @@ -18,27 +18,14 @@ "description": "An event message generator", "features": "creation", "model": { - "telemetry": { - "period": 10 - } + "telemetry": {} }, "telemetry": { "source": "eventGenerator", "ranges": [ { "format": "string" } ] - }, - "properties": [ - { - "name": "Period", - "control": "textfield", - "cssclass": "l-small l-numeric", - "key": "period", - "required": true, - "property": [ "telemetry", "period" ], - "pattern": "^\\d*(\\.\\d*)?$" - } - ] + } } ] } diff --git a/example/eventGenerator/src/EventTelemetry.js b/example/eventGenerator/src/EventTelemetry.js index 504f8fbec5..38afebb7b7 100644 --- a/example/eventGenerator/src/EventTelemetry.js +++ b/example/eventGenerator/src/EventTelemetry.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 define,Promise*/ +/*global define */ /** * Module defining EventTelemetry. From 203de023d2bb24841f63f07831b1ddc6a4d66833 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 17:05:14 -0700 Subject: [PATCH 53/64] [Events] More general view policy The Messages view policy now will allow any object that has a telemetry type of string to have access to the Messages view, not just Event List Generators. (The test for this still does not work though.) #18. --- .../events/src/policies/MessagesViewPolicy.js | 16 ++++++++++++---- .../test/policies/MessagesViewPolicySpec.js | 11 ++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/platform/features/events/src/policies/MessagesViewPolicy.js b/platform/features/events/src/policies/MessagesViewPolicy.js index b31ca94374..4426872b1e 100644 --- a/platform/features/events/src/policies/MessagesViewPolicy.js +++ b/platform/features/events/src/policies/MessagesViewPolicy.js @@ -35,6 +35,16 @@ define( */ function MessagesViewPolicy() { + function hasStringTelemetry(domainObject) { + var telemetry = domainObject && + domainObject.getCapability('telemetry'), + metadata = telemetry ? telemetry.getMetadata() : {}, + ranges = metadata.ranges || []; + + return ranges.some(function (range) { + return range.format === 'string'; + }); + } return { /** * Check whether or not a given action is allowed by this @@ -47,12 +57,10 @@ define( // This policy only applies for the Messages view if (view.key === 'messages') { // The Messages view is allowed only if the domain - // object is a Event Message Generator - if (domainObject.getModel().type !== 'eventGenerator') { + // object has string telemetry + if (!hasStringTelemetry(domainObject)) { return false; } - - // TODO: This may later apply to more types beyond just eventGenerator. } // Like all policies, allow by default. diff --git a/platform/features/events/test/policies/MessagesViewPolicySpec.js b/platform/features/events/test/policies/MessagesViewPolicySpec.js index 0c26b8f249..6e3430f64e 100644 --- a/platform/features/events/test/policies/MessagesViewPolicySpec.js +++ b/platform/features/events/test/policies/MessagesViewPolicySpec.js @@ -32,6 +32,7 @@ define( describe("The messages view policy", function () { var mockDomainObject, testType, + telemetryType, policy; beforeEach(function () { @@ -42,18 +43,18 @@ define( mockDomainObject.getModel.andCallFake(function (c) { return {type: testType}; }); - + policy = new MessagesViewPolicy(); }); - it("disallows the message view for non Event Generators", function () { - testType = 'notAnEventGenerator'; + it("disallows the message view for objects without string telemetry", function () { + telemetryType = 'notString'; expect(policy.allow({ key: 'messages' }, mockDomainObject)) .toBeFalsy(); }); - it("allows the message view for Event Generators", function () { - testType = 'eventGenerator'; + it("allows the message view for objects with string telemetry", function () { + telemetryType = 'string'; expect(policy.allow({ key: 'messages' }, mockDomainObject)) .toBeTruthy(); }); From d2fe71d82bc078adc624fe4e88de5a16de28f9bf Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Wed, 24 Jun 2015 17:08:03 -0700 Subject: [PATCH 54/64] [Events] Fixed tabs Removed tabs from EventListController and replaced with spaces. #18. --- .../events/src/EventListController.js | 170 +++++++++--------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/platform/features/events/src/EventListController.js b/platform/features/events/src/EventListController.js index 8f8ca6c60a..4b90c91b8e 100644 --- a/platform/features/events/src/EventListController.js +++ b/platform/features/events/src/EventListController.js @@ -27,107 +27,107 @@ * Modified by shale on 06/23/2015. */ define( - ["./DomainColumn", "./RangeColumn", "./EventListPopulator"], - function (DomainColumn, RangeColumn, EventListPopulator) { - "use strict"; + ["./DomainColumn", "./RangeColumn", "./EventListPopulator"], + function (DomainColumn, RangeColumn, EventListPopulator) { + "use strict"; - var ROW_COUNT = 100; + var ROW_COUNT = 100; - /** - * The EventListController is responsible for populating - * the contents of the event list view. - * @constructor - */ - function EventListController($scope, formatter) { - var populator; + /** + * The EventListController is responsible for populating + * the contents of the event list view. + * @constructor + */ + function EventListController($scope, formatter) { + var populator; - // Get a set of populated, ready-to-display rows for the - // latest data values. - function getRows(telemetry) { - var datas = telemetry.getResponse(), - objects = telemetry.getTelemetryObjects(); + // Get a set of populated, ready-to-display rows for the + // latest data values. + function getRows(telemetry) { + var datas = telemetry.getResponse(), + objects = telemetry.getTelemetryObjects(); - return populator.getRows(datas, objects, ROW_COUNT); - } + return populator.getRows(datas, objects, ROW_COUNT); + } - // Update the contents - function updateRows() { - var telemetry = $scope.telemetry; - $scope.rows = telemetry ? getRows(telemetry) : []; - } + // Update the contents + function updateRows() { + var telemetry = $scope.telemetry; + $scope.rows = telemetry ? getRows(telemetry) : []; + } - // Set up columns based on telemetry metadata. This will - // include one column for each domain and range type, as - // well as a column for the domain object name. - function setupColumns(telemetry) { - var domainKeys = {}, - rangeKeys = {}, - columns = [], - metadata; + // Set up columns based on telemetry metadata. This will + // include one column for each domain and range type, as + // well as a column for the domain object name. + function setupColumns(telemetry) { + var domainKeys = {}, + rangeKeys = {}, + columns = [], + metadata; - // Add a domain to the set of columns, if a domain - // with the same key has not yet been inclued. - function addDomain(domain) { - var key = domain.key; - if (key && !domainKeys[key]) { - domainKeys[key] = true; - columns.push(new DomainColumn(domain, formatter)); - } - } + // Add a domain to the set of columns, if a domain + // with the same key has not yet been inclued. + function addDomain(domain) { + var key = domain.key; + if (key && !domainKeys[key]) { + domainKeys[key] = true; + columns.push(new DomainColumn(domain, formatter)); + } + } // Add a range col to the set of columns, if a range - // with the same key has not yet been included. - function addRange(range) { - var key = range.key; - if (key && !rangeKeys[key]) { - rangeKeys[key] = true; - columns.push(new RangeColumn(range, formatter)); - } - } + // with the same key has not yet been included. + function addRange(range) { + var key = range.key; + if (key && !rangeKeys[key]) { + rangeKeys[key] = true; + columns.push(new RangeColumn(range, formatter)); + } + } - // We cannot proceed if the telemetry controller - // is not available; clear all rows/columns. - if (!telemetry) { - columns = []; - $scope.rows = []; - $scope.headers = []; - return; - } + // We cannot proceed if the telemetry controller + // is not available; clear all rows/columns. + if (!telemetry) { + columns = []; + $scope.rows = []; + $scope.headers = []; + return; + } - // Add domain, range, event msg columns - metadata = telemetry.getMetadata(); - (metadata || []).forEach(function (metadata) { - (metadata.domains || []).forEach(addDomain); - }); - (metadata || []).forEach(function (metadata) { - (metadata.ranges || []).forEach(addRange); - }); + // Add domain, range, event msg columns + metadata = telemetry.getMetadata(); + (metadata || []).forEach(function (metadata) { + (metadata.domains || []).forEach(addDomain); + }); + (metadata || []).forEach(function (metadata) { + (metadata.ranges || []).forEach(addRange); + }); // Add default domain and range columns if none - // were described in metadata. - if (Object.keys(domainKeys).length < 1) { - columns.push(new DomainColumn({name: "Time"}, formatter)); - } - if (Object.keys(rangeKeys).length < 1) { - columns.push(new RangeColumn({name: "Message"}, formatter)); - } + // were described in metadata. + if (Object.keys(domainKeys).length < 1) { + columns.push(new DomainColumn({name: "Time"}, formatter)); + } + if (Object.keys(rangeKeys).length < 1) { + columns.push(new RangeColumn({name: "Message"}, formatter)); + } - // We have all columns now; use them to initializer - // the populator, which will use them to generate - // actual rows and headers. - populator = new EventListPopulator(columns); + // We have all columns now; use them to initializer + // the populator, which will use them to generate + // actual rows and headers. + populator = new EventListPopulator(columns); - // Initialize headers - $scope.headers = populator.getHeaders(); + // Initialize headers + $scope.headers = populator.getHeaders(); - // Fill in the contents of the rows. - updateRows(); - } + // Fill in the contents of the rows. + updateRows(); + } - $scope.$on("telemetryUpdate", updateRows); - $scope.$watch("telemetry", setupColumns); - } + $scope.$on("telemetryUpdate", updateRows); + $scope.$watch("telemetry", setupColumns); + } - return EventListController; - } + return EventListController; + } ); From e357df2fe5c5f1d5f81ffb2486776d03ea4da3ae Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 24 Jun 2015 18:45:34 -0700 Subject: [PATCH 55/64] [Dev/Frontend] Cherry-picking platform changes from warp1341 WTD-1341 --- platform/commonUI/general/res/sass/_autoflow.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/commonUI/general/res/sass/_autoflow.scss b/platform/commonUI/general/res/sass/_autoflow.scss index 448a4203be..2cef5ac170 100644 --- a/platform/commonUI/general/res/sass/_autoflow.scss +++ b/platform/commonUI/general/res/sass/_autoflow.scss @@ -24,7 +24,7 @@ $colMargin: $interiorMargin; $colW: 225px; $valW: 70px; - $valPad: 2px; + $valPad: 5px; $rowH: 15px; font-size: 0.75rem; .l-autoflow-header { From 52a7bd103359a9e332c7d67be01a3a14c5eb048c Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 24 Jun 2015 18:48:23 -0700 Subject: [PATCH 56/64] [Dev/Frontend] Cherry-picking platform changes from warp1341 WTD-1341 --- .../general/res/sass/_fixed-position.scss | 102 ++++++++++-------- .../res/templates/elements/telemetry.html | 16 +-- 2 files changed, 66 insertions(+), 52 deletions(-) diff --git a/platform/commonUI/general/res/sass/_fixed-position.scss b/platform/commonUI/general/res/sass/_fixed-position.scss index 22694aea72..f9e8a82994 100644 --- a/platform/commonUI/general/res/sass/_fixed-position.scss +++ b/platform/commonUI/general/res/sass/_fixed-position.scss @@ -1,38 +1,44 @@ /***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ +* Open MCT Web, Copyright (c) 2014-2015, United States Government +* as represented by the Administrator of the National Aeronautics and Space +* Administration. All rights reserved. +* +* Open MCT Web is licensed under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0. +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +* License for the specific language governing permissions and limitations +* under the License. +* +* Open MCT Web includes source code licensed under additional open source +* licenses. See the Open Source Licenses file (LICENSES.md) included with +* this source code distribution or the Licensing information page available +* at runtime from the About dialog for additional information. +*****************************************************************************/ .t-fixed-position { &.l-fixed-position { -// @include test(red); + // @include test(red); position: absolute; - top: 0; right: 0; bottom: 0; left: 0; - width: auto; height: auto; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: auto; + height: auto; .l-grid-holder { position: relative; - height: 100%; width: 100%; + height: 100%; + width: 100%; .l-grid { -// @include test(orange); + // @include test(orange); position: absolute; - height: 100%; width: 100%; + height: 100%; + width: 100%; pointer-events: none; z-index: 0; } @@ -56,12 +62,13 @@ .l-fixed-position-image, .l-fixed-position-text { @include box-sizing(border-box); - height: 100%; width: 100%; + height: 100%; + width: 100%; } .l-fixed-position-box { } - + .l-fixed-position-image { background-size: cover; background-repeat: no-repeat; @@ -70,38 +77,45 @@ .l-fixed-position-text { @include txtShdwSubtle(); - border:1px solid transparent; + border: 1px solid transparent; font-size: 0.8rem; $p: 1px; //$interiorMarginSm; line-height: 100%; &.l-static-text { -// overflow: auto; + // overflow: auto; padding: $p; } &.l-telemetry { .l-elem { //@include absPosDefault($p); - @include absPosDefault(0); + //@include absPosDefault(0); @include box-sizing(border-box); + display: block; padding: 2px; - width: 50%; + //width: 50%; &.l-title { - right: auto; - left: $p; + //right: auto; + //left: $p; + float: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: auto; } &.l-value { -// @include test(blue); - right: $p; - left: auto; + // @include test(blue); + // right: $p; + // left: auto; + @include border-radius($smallCr); + $valPad: 5px; + float: right; + margin-left: $interiorMargin; + padding-left: $valPad; + padding-right: $valPad; text-align: right; &.telem-only { -// @include test(red); - left: $p; - width: auto; - } - .l-value-bg { - @include border-radius($smallCr); - padding: 0 4px; + margin-left: 0; + width: 100%; } } } diff --git a/platform/features/layout/res/templates/elements/telemetry.html b/platform/features/layout/res/templates/elements/telemetry.html index 601f17679b..46d45dbf46 100644 --- a/platform/features/layout/res/templates/elements/telemetry.html +++ b/platform/features/layout/res/templates/elements/telemetry.html @@ -23,16 +23,16 @@ class="l-fixed-position-text l-telemetry" ng-style="{ background: ngModel.fill(), 'border-color': ngModel.stroke(), color: ngModel.color() }" > -
+ {{ngModel.value}} + + {{ngModel.name}} -
-
- {{ngModel.value}} -
+ \ No newline at end of file From 19748ba17ca893e78d153e5638c82302eebe1e7b Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 24 Jun 2015 18:56:38 -0700 Subject: [PATCH 57/64] [Dev/Frontend] Cherry-picking platform changes from warp1341 WTD-1341 Re-rendered css file; --- .../general/res/css/theme-espresso.css | 118 +++++++++--------- 1 file changed, 56 insertions(+), 62 deletions(-) diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index ef43a9da06..142493dfd2 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -655,26 +655,26 @@ mct-container { overflow-y: auto; } /***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ +* Open MCT Web, Copyright (c) 2014-2015, United States Government +* as represented by the Administrator of the National Aeronautics and Space +* Administration. All rights reserved. +* +* Open MCT Web is licensed under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0. +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +* License for the specific language governing permissions and limitations +* under the License. +* +* Open MCT Web includes source code licensed under additional open source +* licenses. See the Open Source Licenses file (LICENSES.md) included with +* this source code distribution or the Licensing information page available +* at runtime from the About dialog for additional information. +*****************************************************************************/ /* line 23, ../sass/_fixed-position.scss */ .t-fixed-position.l-fixed-position { position: absolute; @@ -684,33 +684,33 @@ mct-container { left: 0; width: auto; height: auto; } - /* line 29, ../sass/_fixed-position.scss */ + /* line 33, ../sass/_fixed-position.scss */ .t-fixed-position.l-fixed-position .l-grid-holder { position: relative; height: 100%; width: 100%; } - /* line 32, ../sass/_fixed-position.scss */ + /* line 37, ../sass/_fixed-position.scss */ .t-fixed-position.l-fixed-position .l-grid-holder .l-grid { position: absolute; height: 100%; width: 100%; pointer-events: none; z-index: 0; } -/* line 42, ../sass/_fixed-position.scss */ +/* line 48, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item { position: absolute; border: 1px solid transparent; } - /* line 46, ../sass/_fixed-position.scss */ + /* line 52, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item.s-selected { -moz-box-shadow: rgba(0, 0, 0, 0.7) 0 3px 10px; -webkit-box-shadow: rgba(0, 0, 0, 0.7) 0 3px 10px; box-shadow: rgba(0, 0, 0, 0.7) 0 3px 10px; border-color: #0099cc; cursor: move; } - /* line 51, ../sass/_fixed-position.scss */ + /* line 57, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item.s-not-selected { opacity: 0.8; } - /* line 55, ../sass/_fixed-position.scss */ + /* line 61, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-box, .t-fixed-position .l-fixed-position-item .l-fixed-position-image, .t-fixed-position .l-fixed-position-item .l-fixed-position-text { @@ -719,62 +719,56 @@ mct-container { box-sizing: border-box; height: 100%; width: 100%; } - /* line 65, ../sass/_fixed-position.scss */ + /* line 72, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-image { background-size: cover; background-repeat: no-repeat; background-position: center; } - /* line 71, ../sass/_fixed-position.scss */ + /* line 78, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-text { text-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; border: 1px solid transparent; font-size: 0.8rem; line-height: 100%; } - /* line 77, ../sass/_fixed-position.scss */ + /* line 84, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-text.l-static-text { padding: 1px; } - /* line 82, ../sass/_fixed-position.scss */ + /* line 89, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-text.l-telemetry .l-elem { - overflow: hidden; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - width: auto; - height: auto; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; - padding: 2px; - width: 50%; } - /* line 88, ../sass/_fixed-position.scss */ + display: block; + padding: 2px; } + /* line 96, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-text.l-telemetry .l-elem.l-title { - right: auto; - left: 1px; } - /* line 92, ../sass/_fixed-position.scss */ + float: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: auto; } + /* line 105, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-text.l-telemetry .l-elem.l-value { - right: 1px; - left: auto; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + float: right; + margin-left: 5px; + padding-left: 5px; + padding-right: 5px; text-align: right; } - /* line 97, ../sass/_fixed-position.scss */ + /* line 116, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item .l-fixed-position-text.l-telemetry .l-elem.l-value.telem-only { - left: 1px; - width: auto; } - /* line 102, ../sass/_fixed-position.scss */ - .t-fixed-position .l-fixed-position-item .l-fixed-position-text.l-telemetry .l-elem.l-value .l-value-bg { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - padding: 0 4px; } -/* line 112, ../sass/_fixed-position.scss */ + margin-left: 0; + width: 100%; } +/* line 126, ../sass/_fixed-position.scss */ .t-fixed-position .l-fixed-position-item-handle { background: rgba(0, 153, 204, 0.5); cursor: crosshair; border: 1px solid #0099cc; position: absolute; } -/* line 126, ../sass/_fixed-position.scss */ +/* line 140, ../sass/_fixed-position.scss */ .edit-mode .t-fixed-position.l-fixed-position .l-grid-holder .l-grid.l-grid-x { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIxcHgiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4wNSIvPjxzdG9wIG9mZnNldD0iMXB4IiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA='); background-size: 100%; @@ -782,7 +776,7 @@ mct-container { background-image: -webkit-linear-gradient(0deg, rgba(255, 255, 255, 0.05) 1px, rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 100%); background-image: linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 100%); background-repeat: repeat-x; } -/* line 130, ../sass/_fixed-position.scss */ +/* line 144, ../sass/_fixed-position.scss */ .edit-mode .t-fixed-position.l-fixed-position .l-grid-holder .l-grid.l-grid-y { background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjEuMCIgeDI9IjAuNSIgeTI9IjAuMCI+PHN0b3Agb2Zmc2V0PSIxcHgiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4wNSIvPjxzdG9wIG9mZnNldD0iMXB4IiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA='); background-size: 100%; @@ -790,10 +784,10 @@ mct-container { background-image: -webkit-linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 100%); background-image: linear-gradient(0deg, rgba(255, 255, 255, 0.05) 1px, rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 100%); background-repeat: repeat-y; } -/* line 138, ../sass/_fixed-position.scss */ +/* line 152, ../sass/_fixed-position.scss */ .edit-mode .t-fixed-position .l-fixed-position-item:not(.s-selected) { border: 1px dotted rgba(0, 153, 204, 0.75); } - /* line 140, ../sass/_fixed-position.scss */ + /* line 154, ../sass/_fixed-position.scss */ .edit-mode .t-fixed-position .l-fixed-position-item:not(.s-selected):hover { border: 1px dotted #0099cc; } @@ -4799,8 +4793,8 @@ input[type="text"] { border-radius: 2px; float: right; margin-left: 5px; - padding-left: 2px; - padding-right: 2px; + padding-left: 5px; + padding-right: 5px; text-align: right; } /* line 106, ../sass/_autoflow.scss */ .autoflow .l-autoflow-items .l-autoflow-col:first-child { From f6298c162c4a395f47ea06095266a2f694a3fdf8 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Thu, 25 Jun 2015 09:27:24 -0700 Subject: [PATCH 58/64] [Events] Real-time telemetry version Creating an additional event list which can handle real time data, not historical data. #18. --- platform/features/rtevents/bundle.json | 37 +++++ .../res/templates/mct-data-table.html | 37 +++++ .../rtevents/res/templates/messages.html | 29 ++++ .../features/rtevents/src/DomainColumn.js | 67 +++++++++ .../rtevents/src/RTEventListController.js | 139 ++++++++++++++++++ platform/features/rtevents/src/RangeColumn.js | 67 +++++++++ .../rtevents/src/directives/MCTDataTable.js | 74 ++++++++++ .../src/policies/MessagesViewPolicy.js | 74 ++++++++++ .../rtevents/test/DomainColumnSpec.js | 84 +++++++++++ .../test/RTEventListControllerSpec.js | 110 ++++++++++++++ .../features/rtevents/test/RangeColumnSpec.js | 81 ++++++++++ .../test/policies/MessagesViewPolicySpec.js | 68 +++++++++ platform/features/rtevents/test/suite.json | 7 + 13 files changed, 874 insertions(+) create mode 100644 platform/features/rtevents/bundle.json create mode 100644 platform/features/rtevents/res/templates/mct-data-table.html create mode 100644 platform/features/rtevents/res/templates/messages.html create mode 100644 platform/features/rtevents/src/DomainColumn.js create mode 100644 platform/features/rtevents/src/RTEventListController.js create mode 100644 platform/features/rtevents/src/RangeColumn.js create mode 100644 platform/features/rtevents/src/directives/MCTDataTable.js create mode 100644 platform/features/rtevents/src/policies/MessagesViewPolicy.js create mode 100644 platform/features/rtevents/test/DomainColumnSpec.js create mode 100644 platform/features/rtevents/test/RTEventListControllerSpec.js create mode 100644 platform/features/rtevents/test/RangeColumnSpec.js create mode 100644 platform/features/rtevents/test/policies/MessagesViewPolicySpec.js create mode 100644 platform/features/rtevents/test/suite.json diff --git a/platform/features/rtevents/bundle.json b/platform/features/rtevents/bundle.json new file mode 100644 index 0000000000..04400d8223 --- /dev/null +++ b/platform/features/rtevents/bundle.json @@ -0,0 +1,37 @@ +{ + "name": "Event Messages", + "description": "List of time-ordered event messages", + "extensions": { + "views": [ + { + "key": "messages", + "name": "RT Messages", + "glyph": "5", + "description": "Scrolling list of messages.", + "templateUrl": "templates/messages.html", + "needs": [ "telemetry" ], + "delegation": true + } + ], + "controllers": [ + { + "key": "RTEventListController", + "implementation": "RTEventListController.js", + "depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ] + } + ], + "directives": [ + { + "key": "mctDataTable", + "implementation": "directives/MCTDataTable.js", + "depends": [ "$window" ] + } + ], + "policies": [ + { + "category": "view", + "implementation": "policies/MessagesViewPolicy.js" + } + ] + } +} diff --git a/platform/features/rtevents/res/templates/mct-data-table.html b/platform/features/rtevents/res/templates/mct-data-table.html new file mode 100644 index 0000000000..5b8dd786bc --- /dev/null +++ b/platform/features/rtevents/res/templates/mct-data-table.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + +
+ {{header}} +
+ {{cell}} +
\ No newline at end of file diff --git a/platform/features/rtevents/res/templates/messages.html b/platform/features/rtevents/res/templates/messages.html new file mode 100644 index 0000000000..82db5d0f9c --- /dev/null +++ b/platform/features/rtevents/res/templates/messages.html @@ -0,0 +1,29 @@ + +
+
+ +
+
+ + diff --git a/platform/features/rtevents/src/DomainColumn.js b/platform/features/rtevents/src/DomainColumn.js new file mode 100644 index 0000000000..95a6222553 --- /dev/null +++ b/platform/features/rtevents/src/DomainColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,moment*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry domain values + * (typically, timestamps.) Used by the ScrollingListController. + * + * @constructor + * @param domainMetadata an object with the machine- and human- + * readable names for this domain (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function DomainColumn(domainMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return domainMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatDomainValue( + data.getDomainValue(index, domainMetadata.key) + ); + } + }; + } + + return DomainColumn; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/src/RTEventListController.js b/platform/features/rtevents/src/RTEventListController.js new file mode 100644 index 0000000000..1c77802a4b --- /dev/null +++ b/platform/features/rtevents/src/RTEventListController.js @@ -0,0 +1,139 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * Module defining RTEventListController. + * Created by shale on 06/25/2014. Based on RT Scrolling lists. + */ +define( + ["./DomainColumn", "./RangeColumn"], + function (DomainColumn, RangeColumn) { + "use strict"; + + var ROW_COUNT = 100; + + /** + * The RTScrollingListController is responsible for populating + * the contents of the scrolling list view. + * @constructor + */ + function RTEventListController($scope, telemetryHandler, telemetryFormatter) { + var handle, + lastUpdated = {}, + lastIds = [], + columns = [], + headers = [], + rows = []; + + function getTelemetryObjects() { + return handle ? handle.getTelemetryObjects() : []; + } + + function idsChanged(telemetryObjects) { + function mismatch(id, index) { + return id !== telemetryObjects[index].getId(); + } + + return lastIds.length !== telemetryObjects.length || + lastIds.some(mismatch); + } + + function setupColumns(telemetryObjects) { + var id = $scope.domainObject && $scope.domainObject.getId(), + firstId = + telemetryObjects[0] && telemetryObjects[0].getId(); + + columns = []; + + if (telemetryObjects > 1 || id !== firstId) { + columns.push(new NameColumn()); + } + columns.push(new DomainColumn(telemetryFormatter)); + columns.push(new RangeColumn()); + + headers = columns.map(function (column) { + return column.getTitle(); + }); + } + + function updateObjects(telemetryObjects) { + if (idsChanged(telemetryObjects)) { + setupColumns(telemetryObjects); + lastIds = telemetryObjects.map(function (telemetryObject) { + return telemetryObject.getId(); + }); + } + } + + function addRow(telemetryObject) { + var id = telemetryObject.getId(), + domainValue = handle.getDomainValue(telemetryObject); + if (lastUpdated[id] !== domainValue && + domainValue !== undefined) { + // Instead of unshift (scrolling), use push (messages) + rows.push(columns.map(function (column) { + return column.getValue(telemetryObject, handle); + })); + rows.splice(ROW_COUNT, Number.MAX_VALUE); + lastUpdated[id] = domainValue; + } + } + + function updateValues() { + getTelemetryObjects().forEach(addRow); + } + + function releaseSubscription() { + if (handle) { + handle.unsubscribe(); + } + } + + function makeSubscription(domainObject) { + releaseSubscription(); + rows = []; + handle = telemetryHandler.handle( + domainObject, + updateValues, + true + ); + } + + $scope.$on("$destroy", releaseSubscription); + + $scope.$watch("domainObject", makeSubscription); + $scope.$watch(getTelemetryObjects, updateObjects); + + return { + rows: function () { + return rows; + }, + headers: function () { + return headers; + } + }; + } + + return RTScrollingListController; + } +); diff --git a/platform/features/rtevents/src/RangeColumn.js b/platform/features/rtevents/src/RangeColumn.js new file mode 100644 index 0000000000..2b11de43c7 --- /dev/null +++ b/platform/features/rtevents/src/RangeColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry range values + * (typically, measurements.) Used by the ScrollingListController. + * + * @constructor + * @param rangeMetadata an object with the machine- and human- + * readable names for this range (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function RangeColumn(rangeMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return rangeMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatRangeValue( + data.getRangeValue(index, rangeMetadata.key) + ); + } + }; + } + + return RangeColumn; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/src/directives/MCTDataTable.js b/platform/features/rtevents/src/directives/MCTDataTable.js new file mode 100644 index 0000000000..c4cb9970e6 --- /dev/null +++ b/platform/features/rtevents/src/directives/MCTDataTable.js @@ -0,0 +1,74 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining MCTDataTable. Created by shale on 06/22/2015. + */ +define( + [], + function () { + "use strict"; + + function MCTDataTable($window) { + return { + restrict: "E", + templateUrl: "platform/features/events/res/templates/mct-data-table.html", + scope: { + headers: "=", + rows: "=", + ascendingScroll: "=" + }, + link: function ($scope, $element) { + var currentHeight, + previousHeight, + scrollParent; + + // If the scroll is set to ascending, we want to + // check when elements are added to the table, and move the scroll + // bar accordingly. + // (When viewing at the bottom of the page, the scroll bar will + // stay at the bottom despite additions to the table) + if ($scope.ascendingScroll) { + $scope.$watch("rows", function () { + // Wait until the page as been repainted (otherwise the + // height will always be zero) + $window.requestAnimationFrame(function () { + previousHeight = currentHeight; + // The height of the table body + currentHeight = $element[0].firstElementChild.firstElementChild.nextElementSibling.clientHeight; + + // One of the parents is a div that has vscroll + scrollParent = $element[0].parentElement.parentElement.parentElement.parentElement.parentElement; + + // Move the scrollbar down the amount that the height has changed + scrollParent.scrollTop = scrollParent.scrollTop + (currentHeight - previousHeight); + }); + }); + } + } + }; + } + + return MCTDataTable; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/src/policies/MessagesViewPolicy.js b/platform/features/rtevents/src/policies/MessagesViewPolicy.js new file mode 100644 index 0000000000..4426872b1e --- /dev/null +++ b/platform/features/rtevents/src/policies/MessagesViewPolicy.js @@ -0,0 +1,74 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * Module defining MessagesViewPolicy. Created by shale on 06/24/2015. + */ +define( + [], + function () { + "use strict"; + + /** + * Policy controlling when the Messages view should be avaliable. + * @constructor + */ + function MessagesViewPolicy() { + + function hasStringTelemetry(domainObject) { + var telemetry = domainObject && + domainObject.getCapability('telemetry'), + metadata = telemetry ? telemetry.getMetadata() : {}, + ranges = metadata.ranges || []; + + return ranges.some(function (range) { + return range.format === 'string'; + }); + } + return { + /** + * Check whether or not a given action is allowed by this + * policy. + * @param {Action} action the action + * @param domainObject the domain object which will be viewed + * @returns {boolean} true if not disallowed + */ + allow: function (view, domainObject) { + // This policy only applies for the Messages view + if (view.key === 'messages') { + // The Messages view is allowed only if the domain + // object has string telemetry + if (!hasStringTelemetry(domainObject)) { + return false; + } + } + + // Like all policies, allow by default. + return true; + } + }; + } + + return MessagesViewPolicy; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/DomainColumnSpec.js b/platform/features/rtevents/test/DomainColumnSpec.js new file mode 100644 index 0000000000..29c896cd5b --- /dev/null +++ b/platform/features/rtevents/test/DomainColumnSpec.js @@ -0,0 +1,84 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. + */ +define( + ["../src/DomainColumn"], + function (DomainColumn) { + "use strict"; + + var TEST_DOMAIN_VALUE = "some formatted domain value"; + + describe("An event list domain column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getDomainValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatDomainValue.andReturn(TEST_DOMAIN_VALUE); + + column = new DomainColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from domain metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getDomainValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats domain values as time", function () { + mockDataSet.getDomainValue.andReturn(402513731000); + + // Should have just given the value the formatter gave + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_DOMAIN_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatDomainValue) + .toHaveBeenCalledWith(402513731000); + expect(mockFormatter.formatRangeValue) + .not.toHaveBeenCalled(); + }); + + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/RTEventListControllerSpec.js b/platform/features/rtevents/test/RTEventListControllerSpec.js new file mode 100644 index 0000000000..63a762e4d4 --- /dev/null +++ b/platform/features/rtevents/test/RTEventListControllerSpec.js @@ -0,0 +1,110 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by shale on 06/24/2015. + */ +define( + ["../src/EventListController"], + function (EventListController) { + "use strict"; + + describe("The event list controller", function () { + var mockScope, + mockTelemetry, + testMetadata, + controller; + + beforeEach(function () { + mockScope = jasmine.createSpyObj( + "$scope", + [ "$on", "$watch" ] + ); + mockTelemetry = jasmine.createSpyObj( + "telemetryController", + [ "getResponse", "getMetadata", "getTelemetryObjects" ] + ); + testMetadata = [ + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d1", name: "D1" } + ], + ranges: [ + { key: "r0", name: "R0" }, + { key: "r1", name: "R1" } + ] + }, + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d2", name: "D2" } + ], + ranges: [ + { key: "r0", name: "R0" } + ] + } + ]; + mockTelemetry.getMetadata.andReturn(testMetadata); + mockTelemetry.getResponse.andReturn([]); + mockTelemetry.getTelemetryObjects.andReturn([]); + mockScope.telemetry = mockTelemetry; + controller = new EventListController(mockScope); + }); + + it("listens for telemetry data updates", function () { + expect(mockScope.$on).toHaveBeenCalledWith( + "telemetryUpdate", + jasmine.any(Function) + ); + }); + + it("watches for telemetry controller changes", function () { + expect(mockScope.$watch).toHaveBeenCalledWith( + "telemetry", + jasmine.any(Function) + ); + }); + + it("provides a column for each unique domain and range", function () { + // Should have five columns based on metadata above, + // (d0, d1, d2, r0, r1) + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["D0", "D1", "D2", "R0", "R1"]); + }); + + it("does not throw if telemetry controller is undefined", function () { + // Just a general robustness check + mockScope.telemetry = undefined; + expect(mockScope.$watch.mostRecentCall.args[1]) + .not.toThrow(); + }); + + it("provides default columns if domain/range metadata is unavailable", function () { + mockTelemetry.getMetadata.andReturn([]); + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["Time", "Message"]); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/RangeColumnSpec.js b/platform/features/rtevents/test/RangeColumnSpec.js new file mode 100644 index 0000000000..99c5ceb6f4 --- /dev/null +++ b/platform/features/rtevents/test/RangeColumnSpec.js @@ -0,0 +1,81 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. + */ +define( + ["../src/RangeColumn"], + function (RangeColumn) { + "use strict"; + + var TEST_RANGE_VALUE = "some formatted range value"; + + describe("An event list range column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getRangeValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE); + + column = new RangeColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from range metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getRangeValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats range values as time", function () { + mockDataSet.getRangeValue.andReturn(123.45678); + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_RANGE_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatRangeValue) + .toHaveBeenCalledWith(123.45678); + expect(mockFormatter.formatDomainValue) + .not.toHaveBeenCalled(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js b/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js new file mode 100644 index 0000000000..6e3430f64e --- /dev/null +++ b/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js @@ -0,0 +1,68 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine*/ + +/** + * EventSpec. Created by shale on 06/24/2015. + */ +define( + ["../../src/policies/MessagesViewPolicy"], + function (MessagesViewPolicy) { + "use strict"; + + describe("The messages view policy", function () { + var mockDomainObject, + testType, + telemetryType, + policy; + + beforeEach(function () { + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getModel'] + ); + mockDomainObject.getModel.andCallFake(function (c) { + return {type: testType}; + }); + + policy = new MessagesViewPolicy(); + }); + + it("disallows the message view for objects without string telemetry", function () { + telemetryType = 'notString'; + expect(policy.allow({ key: 'messages' }, mockDomainObject)) + .toBeFalsy(); + }); + + it("allows the message view for objects with string telemetry", function () { + telemetryType = 'string'; + expect(policy.allow({ key: 'messages' }, mockDomainObject)) + .toBeTruthy(); + }); + + it("returns true when the current view is not the Messages view", function () { + expect(policy.allow({ key: 'notMessages' }, mockDomainObject)) + .toBeTruthy(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/suite.json b/platform/features/rtevents/test/suite.json new file mode 100644 index 0000000000..44c96e9fa6 --- /dev/null +++ b/platform/features/rtevents/test/suite.json @@ -0,0 +1,7 @@ +[ + "DomainColumn", + "EventListController", + "EventListPopulator", + "policies/MessagesViewPolicy", + "RangeColumn" +] \ No newline at end of file From 163b210fbb61ac09b4998327de4f11e00e3fb66d Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Thu, 25 Jun 2015 09:27:24 -0700 Subject: [PATCH 59/64] [Events] Real-time telemetry version Creating an additional event list which can handle real time data, not historical data. #18. --- platform/features/rtevents/bundle.json | 37 +++++ .../res/templates/mct-data-table.html | 37 +++++ .../rtevents/res/templates/messages.html | 29 ++++ .../features/rtevents/src/DomainColumn.js | 67 +++++++++ .../rtevents/src/RTEventListController.js | 139 ++++++++++++++++++ platform/features/rtevents/src/RangeColumn.js | 67 +++++++++ .../rtevents/src/directives/MCTDataTable.js | 74 ++++++++++ .../src/policies/MessagesViewPolicy.js | 74 ++++++++++ .../rtevents/test/DomainColumnSpec.js | 84 +++++++++++ .../test/RTEventListControllerSpec.js | 110 ++++++++++++++ .../features/rtevents/test/RangeColumnSpec.js | 81 ++++++++++ .../test/policies/MessagesViewPolicySpec.js | 68 +++++++++ platform/features/rtevents/test/suite.json | 6 + 13 files changed, 873 insertions(+) create mode 100644 platform/features/rtevents/bundle.json create mode 100644 platform/features/rtevents/res/templates/mct-data-table.html create mode 100644 platform/features/rtevents/res/templates/messages.html create mode 100644 platform/features/rtevents/src/DomainColumn.js create mode 100644 platform/features/rtevents/src/RTEventListController.js create mode 100644 platform/features/rtevents/src/RangeColumn.js create mode 100644 platform/features/rtevents/src/directives/MCTDataTable.js create mode 100644 platform/features/rtevents/src/policies/MessagesViewPolicy.js create mode 100644 platform/features/rtevents/test/DomainColumnSpec.js create mode 100644 platform/features/rtevents/test/RTEventListControllerSpec.js create mode 100644 platform/features/rtevents/test/RangeColumnSpec.js create mode 100644 platform/features/rtevents/test/policies/MessagesViewPolicySpec.js create mode 100644 platform/features/rtevents/test/suite.json diff --git a/platform/features/rtevents/bundle.json b/platform/features/rtevents/bundle.json new file mode 100644 index 0000000000..04400d8223 --- /dev/null +++ b/platform/features/rtevents/bundle.json @@ -0,0 +1,37 @@ +{ + "name": "Event Messages", + "description": "List of time-ordered event messages", + "extensions": { + "views": [ + { + "key": "messages", + "name": "RT Messages", + "glyph": "5", + "description": "Scrolling list of messages.", + "templateUrl": "templates/messages.html", + "needs": [ "telemetry" ], + "delegation": true + } + ], + "controllers": [ + { + "key": "RTEventListController", + "implementation": "RTEventListController.js", + "depends": [ "$scope", "telemetryHandler", "telemetryFormatter" ] + } + ], + "directives": [ + { + "key": "mctDataTable", + "implementation": "directives/MCTDataTable.js", + "depends": [ "$window" ] + } + ], + "policies": [ + { + "category": "view", + "implementation": "policies/MessagesViewPolicy.js" + } + ] + } +} diff --git a/platform/features/rtevents/res/templates/mct-data-table.html b/platform/features/rtevents/res/templates/mct-data-table.html new file mode 100644 index 0000000000..5b8dd786bc --- /dev/null +++ b/platform/features/rtevents/res/templates/mct-data-table.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + +
+ {{header}} +
+ {{cell}} +
\ No newline at end of file diff --git a/platform/features/rtevents/res/templates/messages.html b/platform/features/rtevents/res/templates/messages.html new file mode 100644 index 0000000000..82db5d0f9c --- /dev/null +++ b/platform/features/rtevents/res/templates/messages.html @@ -0,0 +1,29 @@ + +
+
+ +
+
+ + diff --git a/platform/features/rtevents/src/DomainColumn.js b/platform/features/rtevents/src/DomainColumn.js new file mode 100644 index 0000000000..95a6222553 --- /dev/null +++ b/platform/features/rtevents/src/DomainColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,moment*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry domain values + * (typically, timestamps.) Used by the ScrollingListController. + * + * @constructor + * @param domainMetadata an object with the machine- and human- + * readable names for this domain (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function DomainColumn(domainMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return domainMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatDomainValue( + data.getDomainValue(index, domainMetadata.key) + ); + } + }; + } + + return DomainColumn; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/src/RTEventListController.js b/platform/features/rtevents/src/RTEventListController.js new file mode 100644 index 0000000000..b84d339bd6 --- /dev/null +++ b/platform/features/rtevents/src/RTEventListController.js @@ -0,0 +1,139 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * Module defining RTEventListController. + * Created by shale on 06/25/2014. Based on RT Scrolling lists. + */ +define( + ["./DomainColumn", "./RangeColumn"], + function (DomainColumn, RangeColumn) { + "use strict"; + + var ROW_COUNT = 100; + + /** + * The RTEventListController is responsible for populating + * the contents of the messages view. + * @constructor + */ + function RTEventListController($scope, telemetryHandler, telemetryFormatter) { + var handle, + lastUpdated = {}, + lastIds = [], + columns = [], + headers = [], + rows = []; + + function getTelemetryObjects() { + return handle ? handle.getTelemetryObjects() : []; + } + + function idsChanged(telemetryObjects) { + function mismatch(id, index) { + return id !== telemetryObjects[index].getId(); + } + + return lastIds.length !== telemetryObjects.length || + lastIds.some(mismatch); + } + + function setupColumns(telemetryObjects) { + var id = $scope.domainObject && $scope.domainObject.getId(), + firstId = + telemetryObjects[0] && telemetryObjects[0].getId(); + + columns = []; + + if (telemetryObjects > 1 || id !== firstId) { + columns.push(new NameColumn()); + } + columns.push(new DomainColumn(telemetryFormatter)); + columns.push(new RangeColumn()); + + headers = columns.map(function (column) { + return column.getTitle(); + }); + } + + function updateObjects(telemetryObjects) { + if (idsChanged(telemetryObjects)) { + setupColumns(telemetryObjects); + lastIds = telemetryObjects.map(function (telemetryObject) { + return telemetryObject.getId(); + }); + } + } + + function addRow(telemetryObject) { + var id = telemetryObject.getId(), + domainValue = handle.getDomainValue(telemetryObject); + if (lastUpdated[id] !== domainValue && + domainValue !== undefined) { + // Instead of unshift (scrolling), use push (messages) + rows.push(columns.map(function (column) { + return column.getValue(telemetryObject, handle); + })); + rows.splice(ROW_COUNT, Number.MAX_VALUE); + lastUpdated[id] = domainValue; + } + } + + function updateValues() { + getTelemetryObjects().forEach(addRow); + } + + function releaseSubscription() { + if (handle) { + handle.unsubscribe(); + } + } + + function makeSubscription(domainObject) { + releaseSubscription(); + rows = []; + handle = telemetryHandler.handle( + domainObject, + updateValues, + true + ); + } + + $scope.$on("$destroy", releaseSubscription); + + $scope.$watch("domainObject", makeSubscription); + $scope.$watch(getTelemetryObjects, updateObjects); + + return { + rows: function () { + return rows; + }, + headers: function () { + return headers; + } + }; + } + + return RTEventListController; + } +); diff --git a/platform/features/rtevents/src/RangeColumn.js b/platform/features/rtevents/src/RangeColumn.js new file mode 100644 index 0000000000..2b11de43c7 --- /dev/null +++ b/platform/features/rtevents/src/RangeColumn.js @@ -0,0 +1,67 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + */ +define( + [], + function () { + "use strict"; + + /** + * A column which will report telemetry range values + * (typically, measurements.) Used by the ScrollingListController. + * + * @constructor + * @param rangeMetadata an object with the machine- and human- + * readable names for this range (in `key` and `name` + * fields, respectively.) + * @param {TelemetryFormatter} telemetryFormatter the telemetry + * formatting service, for making values human-readable. + */ + function RangeColumn(rangeMetadata, telemetryFormatter) { + return { + /** + * Get the title to display in this column's header. + * @returns {string} the title to display + */ + getTitle: function () { + return rangeMetadata.name; + }, + /** + * Get the text to display inside a row under this + * column. + * @returns {string} the text to display + */ + getValue: function (domainObject, data, index) { + return telemetryFormatter.formatRangeValue( + data.getRangeValue(index, rangeMetadata.key) + ); + } + }; + } + + return RangeColumn; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/src/directives/MCTDataTable.js b/platform/features/rtevents/src/directives/MCTDataTable.js new file mode 100644 index 0000000000..c4cb9970e6 --- /dev/null +++ b/platform/features/rtevents/src/directives/MCTDataTable.js @@ -0,0 +1,74 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,Promise*/ + +/** + * Module defining MCTDataTable. Created by shale on 06/22/2015. + */ +define( + [], + function () { + "use strict"; + + function MCTDataTable($window) { + return { + restrict: "E", + templateUrl: "platform/features/events/res/templates/mct-data-table.html", + scope: { + headers: "=", + rows: "=", + ascendingScroll: "=" + }, + link: function ($scope, $element) { + var currentHeight, + previousHeight, + scrollParent; + + // If the scroll is set to ascending, we want to + // check when elements are added to the table, and move the scroll + // bar accordingly. + // (When viewing at the bottom of the page, the scroll bar will + // stay at the bottom despite additions to the table) + if ($scope.ascendingScroll) { + $scope.$watch("rows", function () { + // Wait until the page as been repainted (otherwise the + // height will always be zero) + $window.requestAnimationFrame(function () { + previousHeight = currentHeight; + // The height of the table body + currentHeight = $element[0].firstElementChild.firstElementChild.nextElementSibling.clientHeight; + + // One of the parents is a div that has vscroll + scrollParent = $element[0].parentElement.parentElement.parentElement.parentElement.parentElement; + + // Move the scrollbar down the amount that the height has changed + scrollParent.scrollTop = scrollParent.scrollTop + (currentHeight - previousHeight); + }); + }); + } + } + }; + } + + return MCTDataTable; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/src/policies/MessagesViewPolicy.js b/platform/features/rtevents/src/policies/MessagesViewPolicy.js new file mode 100644 index 0000000000..4426872b1e --- /dev/null +++ b/platform/features/rtevents/src/policies/MessagesViewPolicy.js @@ -0,0 +1,74 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * Module defining MessagesViewPolicy. Created by shale on 06/24/2015. + */ +define( + [], + function () { + "use strict"; + + /** + * Policy controlling when the Messages view should be avaliable. + * @constructor + */ + function MessagesViewPolicy() { + + function hasStringTelemetry(domainObject) { + var telemetry = domainObject && + domainObject.getCapability('telemetry'), + metadata = telemetry ? telemetry.getMetadata() : {}, + ranges = metadata.ranges || []; + + return ranges.some(function (range) { + return range.format === 'string'; + }); + } + return { + /** + * Check whether or not a given action is allowed by this + * policy. + * @param {Action} action the action + * @param domainObject the domain object which will be viewed + * @returns {boolean} true if not disallowed + */ + allow: function (view, domainObject) { + // This policy only applies for the Messages view + if (view.key === 'messages') { + // The Messages view is allowed only if the domain + // object has string telemetry + if (!hasStringTelemetry(domainObject)) { + return false; + } + } + + // Like all policies, allow by default. + return true; + } + }; + } + + return MessagesViewPolicy; + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/DomainColumnSpec.js b/platform/features/rtevents/test/DomainColumnSpec.js new file mode 100644 index 0000000000..dc1011648f --- /dev/null +++ b/platform/features/rtevents/test/DomainColumnSpec.js @@ -0,0 +1,84 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * RTEventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. + */ +define( + ["../src/DomainColumn"], + function (DomainColumn) { + "use strict"; + + var TEST_DOMAIN_VALUE = "some formatted domain value"; + + describe("An event list domain column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getDomainValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatDomainValue.andReturn(TEST_DOMAIN_VALUE); + + column = new DomainColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from domain metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getDomainValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats domain values as time", function () { + mockDataSet.getDomainValue.andReturn(402513731000); + + // Should have just given the value the formatter gave + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_DOMAIN_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatDomainValue) + .toHaveBeenCalledWith(402513731000); + expect(mockFormatter.formatRangeValue) + .not.toHaveBeenCalled(); + }); + + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/RTEventListControllerSpec.js b/platform/features/rtevents/test/RTEventListControllerSpec.js new file mode 100644 index 0000000000..bd72dd23f3 --- /dev/null +++ b/platform/features/rtevents/test/RTEventListControllerSpec.js @@ -0,0 +1,110 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * RTEventSpec. Created by shale on 06/25/2015. + */ +define( + ["../src/RTEventListController"], + function (RTEventListController) { + "use strict"; + + describe("The real time event list controller", function () { + var mockScope, + mockTelemetry, + testMetadata, + controller; + + beforeEach(function () { + mockScope = jasmine.createSpyObj( + "$scope", + [ "$on", "$watch" ] + ); + mockTelemetry = jasmine.createSpyObj( + "telemetryController", + [ "getResponse", "getMetadata", "getTelemetryObjects" ] + ); + testMetadata = [ + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d1", name: "D1" } + ], + ranges: [ + { key: "r0", name: "R0" }, + { key: "r1", name: "R1" } + ] + }, + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d2", name: "D2" } + ], + ranges: [ + { key: "r0", name: "R0" } + ] + } + ]; + mockTelemetry.getMetadata.andReturn(testMetadata); + mockTelemetry.getResponse.andReturn([]); + mockTelemetry.getTelemetryObjects.andReturn([]); + mockScope.telemetry = mockTelemetry; + controller = new EventListController(mockScope); + }); + + it("listens for telemetry data updates", function () { + expect(mockScope.$on).toHaveBeenCalledWith( + "telemetryUpdate", + jasmine.any(Function) + ); + }); + + it("watches for telemetry controller changes", function () { + expect(mockScope.$watch).toHaveBeenCalledWith( + "telemetry", + jasmine.any(Function) + ); + }); + + it("provides a column for each unique domain and range", function () { + // Should have five columns based on metadata above, + // (d0, d1, d2, r0, r1) + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["D0", "D1", "D2", "R0", "R1"]); + }); + + it("does not throw if telemetry controller is undefined", function () { + // Just a general robustness check + mockScope.telemetry = undefined; + expect(mockScope.$watch.mostRecentCall.args[1]) + .not.toThrow(); + }); + + it("provides default columns if domain/range metadata is unavailable", function () { + mockTelemetry.getMetadata.andReturn([]); + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["Time", "Message"]); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/RangeColumnSpec.js b/platform/features/rtevents/test/RangeColumnSpec.js new file mode 100644 index 0000000000..3dc46c2ad9 --- /dev/null +++ b/platform/features/rtevents/test/RangeColumnSpec.js @@ -0,0 +1,81 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * RTEventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. + */ +define( + ["../src/RangeColumn"], + function (RangeColumn) { + "use strict"; + + var TEST_RANGE_VALUE = "some formatted range value"; + + describe("An event list range column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getRangeValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE); + + column = new RangeColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from range metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getRangeValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats range values as time", function () { + mockDataSet.getRangeValue.andReturn(123.45678); + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_RANGE_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatRangeValue) + .toHaveBeenCalledWith(123.45678); + expect(mockFormatter.formatDomainValue) + .not.toHaveBeenCalled(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js b/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js new file mode 100644 index 0000000000..6e3430f64e --- /dev/null +++ b/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js @@ -0,0 +1,68 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,jasmine*/ + +/** + * EventSpec. Created by shale on 06/24/2015. + */ +define( + ["../../src/policies/MessagesViewPolicy"], + function (MessagesViewPolicy) { + "use strict"; + + describe("The messages view policy", function () { + var mockDomainObject, + testType, + telemetryType, + policy; + + beforeEach(function () { + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getModel'] + ); + mockDomainObject.getModel.andCallFake(function (c) { + return {type: testType}; + }); + + policy = new MessagesViewPolicy(); + }); + + it("disallows the message view for objects without string telemetry", function () { + telemetryType = 'notString'; + expect(policy.allow({ key: 'messages' }, mockDomainObject)) + .toBeFalsy(); + }); + + it("allows the message view for objects with string telemetry", function () { + telemetryType = 'string'; + expect(policy.allow({ key: 'messages' }, mockDomainObject)) + .toBeTruthy(); + }); + + it("returns true when the current view is not the Messages view", function () { + expect(policy.allow({ key: 'notMessages' }, mockDomainObject)) + .toBeTruthy(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/suite.json b/platform/features/rtevents/test/suite.json new file mode 100644 index 0000000000..260e84474b --- /dev/null +++ b/platform/features/rtevents/test/suite.json @@ -0,0 +1,6 @@ +[ + "DomainColumn", + "RTEventListController", + "policies/MessagesViewPolicy", + "RangeColumn" +] \ No newline at end of file From 288692f57cc75186e45fca5c0e167d6724ab5d78 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Thu, 25 Jun 2015 09:57:43 -0700 Subject: [PATCH 60/64] Fixing merge Re-added the event list controller. --- .../rtevents/src/RTEventListController.js | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 platform/features/rtevents/src/RTEventListController.js diff --git a/platform/features/rtevents/src/RTEventListController.js b/platform/features/rtevents/src/RTEventListController.js new file mode 100644 index 0000000000..b84d339bd6 --- /dev/null +++ b/platform/features/rtevents/src/RTEventListController.js @@ -0,0 +1,139 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +/** + * Module defining RTEventListController. + * Created by shale on 06/25/2014. Based on RT Scrolling lists. + */ +define( + ["./DomainColumn", "./RangeColumn"], + function (DomainColumn, RangeColumn) { + "use strict"; + + var ROW_COUNT = 100; + + /** + * The RTEventListController is responsible for populating + * the contents of the messages view. + * @constructor + */ + function RTEventListController($scope, telemetryHandler, telemetryFormatter) { + var handle, + lastUpdated = {}, + lastIds = [], + columns = [], + headers = [], + rows = []; + + function getTelemetryObjects() { + return handle ? handle.getTelemetryObjects() : []; + } + + function idsChanged(telemetryObjects) { + function mismatch(id, index) { + return id !== telemetryObjects[index].getId(); + } + + return lastIds.length !== telemetryObjects.length || + lastIds.some(mismatch); + } + + function setupColumns(telemetryObjects) { + var id = $scope.domainObject && $scope.domainObject.getId(), + firstId = + telemetryObjects[0] && telemetryObjects[0].getId(); + + columns = []; + + if (telemetryObjects > 1 || id !== firstId) { + columns.push(new NameColumn()); + } + columns.push(new DomainColumn(telemetryFormatter)); + columns.push(new RangeColumn()); + + headers = columns.map(function (column) { + return column.getTitle(); + }); + } + + function updateObjects(telemetryObjects) { + if (idsChanged(telemetryObjects)) { + setupColumns(telemetryObjects); + lastIds = telemetryObjects.map(function (telemetryObject) { + return telemetryObject.getId(); + }); + } + } + + function addRow(telemetryObject) { + var id = telemetryObject.getId(), + domainValue = handle.getDomainValue(telemetryObject); + if (lastUpdated[id] !== domainValue && + domainValue !== undefined) { + // Instead of unshift (scrolling), use push (messages) + rows.push(columns.map(function (column) { + return column.getValue(telemetryObject, handle); + })); + rows.splice(ROW_COUNT, Number.MAX_VALUE); + lastUpdated[id] = domainValue; + } + } + + function updateValues() { + getTelemetryObjects().forEach(addRow); + } + + function releaseSubscription() { + if (handle) { + handle.unsubscribe(); + } + } + + function makeSubscription(domainObject) { + releaseSubscription(); + rows = []; + handle = telemetryHandler.handle( + domainObject, + updateValues, + true + ); + } + + $scope.$on("$destroy", releaseSubscription); + + $scope.$watch("domainObject", makeSubscription); + $scope.$watch(getTelemetryObjects, updateObjects); + + return { + rows: function () { + return rows; + }, + headers: function () { + return headers; + } + }; + } + + return RTEventListController; + } +); From 1961ba20c0d04f662583fdc6848b6ab6466a853d Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Thu, 25 Jun 2015 09:59:52 -0700 Subject: [PATCH 61/64] Fixing merge Re-added the tests. --- .../rtevents/test/DomainColumnSpec.js | 84 +++++++++++++ .../test/RTEventListControllerSpec.js | 110 ++++++++++++++++++ .../features/rtevents/test/RangeColumnSpec.js | 81 +++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 platform/features/rtevents/test/DomainColumnSpec.js create mode 100644 platform/features/rtevents/test/RTEventListControllerSpec.js create mode 100644 platform/features/rtevents/test/RangeColumnSpec.js diff --git a/platform/features/rtevents/test/DomainColumnSpec.js b/platform/features/rtevents/test/DomainColumnSpec.js new file mode 100644 index 0000000000..29c896cd5b --- /dev/null +++ b/platform/features/rtevents/test/DomainColumnSpec.js @@ -0,0 +1,84 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. + */ +define( + ["../src/DomainColumn"], + function (DomainColumn) { + "use strict"; + + var TEST_DOMAIN_VALUE = "some formatted domain value"; + + describe("An event list domain column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getDomainValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatDomainValue.andReturn(TEST_DOMAIN_VALUE); + + column = new DomainColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from domain metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getDomainValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats domain values as time", function () { + mockDataSet.getDomainValue.andReturn(402513731000); + + // Should have just given the value the formatter gave + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_DOMAIN_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatDomainValue) + .toHaveBeenCalledWith(402513731000); + expect(mockFormatter.formatRangeValue) + .not.toHaveBeenCalled(); + }); + + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/RTEventListControllerSpec.js b/platform/features/rtevents/test/RTEventListControllerSpec.js new file mode 100644 index 0000000000..ba764b61b0 --- /dev/null +++ b/platform/features/rtevents/test/RTEventListControllerSpec.js @@ -0,0 +1,110 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by shale on 06/25/2015. + */ +define( + ["../src/RTEventListController"], + function (RTEventListController) { + "use strict"; + + describe("The real time event list controller", function () { + var mockScope, + mockTelemetry, + testMetadata, + controller; + + beforeEach(function () { + mockScope = jasmine.createSpyObj( + "$scope", + [ "$on", "$watch" ] + ); + mockTelemetry = jasmine.createSpyObj( + "telemetryController", + [ "getResponse", "getMetadata", "getTelemetryObjects" ] + ); + testMetadata = [ + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d1", name: "D1" } + ], + ranges: [ + { key: "r0", name: "R0" }, + { key: "r1", name: "R1" } + ] + }, + { + domains: [ + { key: "d0", name: "D0" }, + { key: "d2", name: "D2" } + ], + ranges: [ + { key: "r0", name: "R0" } + ] + } + ]; + mockTelemetry.getMetadata.andReturn(testMetadata); + mockTelemetry.getResponse.andReturn([]); + mockTelemetry.getTelemetryObjects.andReturn([]); + mockScope.telemetry = mockTelemetry; + controller = new EventListController(mockScope); + }); + + it("listens for telemetry data updates", function () { + expect(mockScope.$on).toHaveBeenCalledWith( + "telemetryUpdate", + jasmine.any(Function) + ); + }); + + it("watches for telemetry controller changes", function () { + expect(mockScope.$watch).toHaveBeenCalledWith( + "telemetry", + jasmine.any(Function) + ); + }); + + it("provides a column for each unique domain and range", function () { + // Should have five columns based on metadata above, + // (d0, d1, d2, r0, r1) + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["D0", "D1", "D2", "R0", "R1"]); + }); + + it("does not throw if telemetry controller is undefined", function () { + // Just a general robustness check + mockScope.telemetry = undefined; + expect(mockScope.$watch.mostRecentCall.args[1]) + .not.toThrow(); + }); + + it("provides default columns if domain/range metadata is unavailable", function () { + mockTelemetry.getMetadata.andReturn([]); + mockScope.$watch.mostRecentCall.args[1](mockTelemetry); + expect(mockScope.headers).toEqual(["Time", "Message"]); + }); + }); + } +); \ No newline at end of file diff --git a/platform/features/rtevents/test/RangeColumnSpec.js b/platform/features/rtevents/test/RangeColumnSpec.js new file mode 100644 index 0000000000..99c5ceb6f4 --- /dev/null +++ b/platform/features/rtevents/test/RangeColumnSpec.js @@ -0,0 +1,81 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. + */ +define( + ["../src/RangeColumn"], + function (RangeColumn) { + "use strict"; + + var TEST_RANGE_VALUE = "some formatted range value"; + + describe("An event list range column", function () { + var mockDataSet, + testMetadata, + mockFormatter, + column; + + beforeEach(function () { + mockDataSet = jasmine.createSpyObj( + "data", + [ "getRangeValue" ] + ); + mockFormatter = jasmine.createSpyObj( + "formatter", + [ "formatDomainValue", "formatRangeValue" ] + ); + testMetadata = { + key: "testKey", + name: "Test Name" + }; + mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE); + + column = new RangeColumn(testMetadata, mockFormatter); + }); + + it("reports a column header from range metadata", function () { + expect(column.getTitle()).toEqual("Test Name"); + }); + + it("looks up data from a data set", function () { + column.getValue(undefined, mockDataSet, 42); + expect(mockDataSet.getRangeValue) + .toHaveBeenCalledWith(42, "testKey"); + }); + + it("formats range values as time", function () { + mockDataSet.getRangeValue.andReturn(123.45678); + expect(column.getValue(undefined, mockDataSet, 42)) + .toEqual(TEST_RANGE_VALUE); + + // Make sure that service interactions were as expected + expect(mockFormatter.formatRangeValue) + .toHaveBeenCalledWith(123.45678); + expect(mockFormatter.formatDomainValue) + .not.toHaveBeenCalled(); + }); + }); + } +); \ No newline at end of file From 6c3aeb278440d336a6632d6623649ccd33ee612b Mon Sep 17 00:00:00 2001 From: larkin Date: Thu, 25 Jun 2015 11:19:01 -0700 Subject: [PATCH 62/64] [Comments] Comment matches exported name --- example/imagery/src/ImageTelemetry.js | 2 +- example/imagery/src/ImageTelemetryProvider.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/imagery/src/ImageTelemetry.js b/example/imagery/src/ImageTelemetry.js index 447ddcbaa8..127b65deba 100644 --- a/example/imagery/src/ImageTelemetry.js +++ b/example/imagery/src/ImageTelemetry.js @@ -22,7 +22,7 @@ /*global define,Promise*/ /** - * Module defining SinewaveTelemetry. Created by vwoeltje on 11/12/14. + * Module defining ImageTelemetry. Created by vwoeltje on 06/22/15. */ define( [], diff --git a/example/imagery/src/ImageTelemetryProvider.js b/example/imagery/src/ImageTelemetryProvider.js index 5dcd1e3e70..f541c441a4 100644 --- a/example/imagery/src/ImageTelemetryProvider.js +++ b/example/imagery/src/ImageTelemetryProvider.js @@ -22,7 +22,7 @@ /*global define,Promise*/ /** - * Module defining SinewaveTelemetryProvider. Created by vwoeltje on 11/12/14. + * Module defining ImageTelemetryProvider. Created by vwoeltje on 06/22/15. */ define( ["./ImageTelemetry"], From 685e384858d8c5b7ffb960767d16981a5f26bb47 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 25 Jun 2015 11:43:40 -0700 Subject: [PATCH 63/64] [Dev/Frontend] PLATFORM CHANGES: use data-value instead of css class selection WTD-1341 (cherry picked from commit 5151637 in warp1341) telemetry.html now uses data-value instead of class; Mods to effects.scss to add customKeyframes mixin; Added default transition time to mixin trans-prop-nice in mixins.scss; --- .../general/res/css/theme-espresso.css | 26 +++++++++---------- .../commonUI/general/res/sass/_effects.scss | 16 +++++++++--- .../commonUI/general/res/sass/_mixins.scss | 2 +- .../res/templates/elements/telemetry.html | 3 ++- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/platform/commonUI/general/res/css/theme-espresso.css b/platform/commonUI/general/res/css/theme-espresso.css index 246b68c178..8e580f60e4 100644 --- a/platform/commonUI/general/res/css/theme-espresso.css +++ b/platform/commonUI/general/res/css/theme-espresso.css @@ -84,7 +84,7 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/* line 5, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 5, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, @@ -105,38 +105,38 @@ time, mark, audio, video { font-size: 100%; vertical-align: baseline; } -/* line 22, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 22, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ html { line-height: 1; } -/* line 24, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 24, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ ol, ul { list-style: none; } -/* line 26, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 26, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ table { border-collapse: collapse; border-spacing: 0; } -/* line 28, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 28, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; } -/* line 30, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 30, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q, blockquote { quotes: none; } - /* line 103, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ + /* line 103, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ q:before, q:after, blockquote:before, blockquote:after { content: ""; content: none; } -/* line 32, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 32, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ a img { border: none; } -/* line 116, ../../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ +/* line 116, ../../../../../../../../../Library/Ruby/Gems/2.0.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } @@ -226,20 +226,20 @@ a.disabled { @-moz-keyframes pulse { 0% { - opacity: 0.5; } + opacity: 0.2; } 100% { opacity: 1; } } @-webkit-keyframes pulse { 0% { - opacity: 0.5; } + opacity: 0.2; } 100% { opacity: 1; } } @keyframes pulse { 0% { - opacity: 0.5; } + opacity: 0.2; } 100% { opacity: 1; } } -/* line 59, ../sass/_effects.scss */ +/* line 69, ../sass/_effects.scss */ .pulse { -moz-animation-name: pulse; -webkit-animation-name: pulse; diff --git a/platform/commonUI/general/res/sass/_effects.scss b/platform/commonUI/general/res/sass/_effects.scss index c90a035c82..ddade4e965 100644 --- a/platform/commonUI/general/res/sass/_effects.scss +++ b/platform/commonUI/general/res/sass/_effects.scss @@ -43,16 +43,26 @@ a.disabled { @include test(); } +@mixin customKeyframes($animName: pulse, $op0: 0.5) { + @include keyframes($animName) { + 0% { opacity: $op0; } + 100% { opacity: 1; } + } + @include animation-name(pulse, 0.2); +} + @include keyframes(pulse) { - 0% { opacity: 0.5; } + 0% { opacity: 0.2; } 100% { opacity: 1; } } -@mixin pulse($dur: 500ms) { + +@mixin pulse($dur: 500ms, $iteration: infinite) { + //@include customKeyframes(pulse, 0.2); @include animation-name(pulse); @include animation-duration($dur); @include animation-direction(alternate); - @include animation-iteration-count(infinite); + @include animation-iteration-count($iteration); @include animation-timing-function(ease-in-out); } diff --git a/platform/commonUI/general/res/sass/_mixins.scss b/platform/commonUI/general/res/sass/_mixins.scss index 8fe4f731c0..14a123d954 100644 --- a/platform/commonUI/general/res/sass/_mixins.scss +++ b/platform/commonUI/general/res/sass/_mixins.scss @@ -26,7 +26,7 @@ width: auto; height: auto; } -@mixin trans-prop-nice($props, $t) { +@mixin trans-prop-nice($props, $t: 500ms) { @if $t == 0 { @include transition-property(none); } @else { diff --git a/platform/features/layout/res/templates/elements/telemetry.html b/platform/features/layout/res/templates/elements/telemetry.html index 46d45dbf46..87d17cc913 100644 --- a/platform/features/layout/res/templates/elements/telemetry.html +++ b/platform/features/layout/res/templates/elements/telemetry.html @@ -24,7 +24,8 @@ ng-style="{ background: ngModel.fill(), 'border-color': ngModel.stroke(), color: ngModel.color() }" > {{ngModel.value}} From c98a381a42bf17b92e25983db6cf9548c3d96128 Mon Sep 17 00:00:00 2001 From: Sarah Hale Date: Thu, 25 Jun 2015 14:36:14 -0700 Subject: [PATCH 64/64] [Events] Created RT Messages Created a real-time version of the Messages view called RT Messages. Additionally, fixed the MessagesViewPolicy test. #18. --- .../test/policies/MessagesViewPolicySpec.js | 35 ++++-- platform/features/rtevents/bundle.json | 12 +- ...data-table.html => mct-rt-data-table.html} | 0 .../{messages.html => rtmessages.html} | 6 +- .../features/rtevents/src/DomainColumn.js | 16 +-- .../rtevents/src/RTEventListController.js | 11 +- platform/features/rtevents/src/RangeColumn.js | 21 ++-- .../{MCTDataTable.js => MCTRTDataTable.js} | 12 +- ...sViewPolicy.js => RTMessagesViewPolicy.js} | 11 +- .../rtevents/test/DomainColumnSpec.js | 84 ------------- .../test/RTEventListControllerSpec.js | 110 ------------------ .../features/rtevents/test/RangeColumnSpec.js | 81 ------------- .../test/policies/MessagesViewPolicySpec.js | 68 ----------- .../test/policies/RTMessagesViewPolicySpec.js | 0 platform/features/rtevents/test/suite.js | 0 15 files changed, 70 insertions(+), 397 deletions(-) rename platform/features/rtevents/res/templates/{mct-data-table.html => mct-rt-data-table.html} (100%) rename platform/features/rtevents/res/templates/{messages.html => rtmessages.html} (83%) rename platform/features/rtevents/src/directives/{MCTDataTable.js => MCTRTDataTable.js} (90%) rename platform/features/rtevents/src/policies/{MessagesViewPolicy.js => RTMessagesViewPolicy.js} (90%) delete mode 100644 platform/features/rtevents/test/policies/MessagesViewPolicySpec.js create mode 100644 platform/features/rtevents/test/policies/RTMessagesViewPolicySpec.js create mode 100644 platform/features/rtevents/test/suite.js diff --git a/platform/features/events/test/policies/MessagesViewPolicySpec.js b/platform/features/events/test/policies/MessagesViewPolicySpec.js index 6e3430f64e..c803cf91ed 100644 --- a/platform/features/events/test/policies/MessagesViewPolicySpec.js +++ b/platform/features/events/test/policies/MessagesViewPolicySpec.js @@ -31,37 +31,50 @@ define( describe("The messages view policy", function () { var mockDomainObject, - testType, + mockTelemetry, telemetryType, + testType, + testView, + testMetadata, policy; beforeEach(function () { + + testView = { key: "string" }; + testMetadata = {}; + mockDomainObject = jasmine.createSpyObj( 'domainObject', - ['getModel'] + ['getModel', 'getCapability'] ); + mockTelemetry = jasmine.createSpyObj( + 'telemetry', + ['getMetadata'] + ); + mockDomainObject.getModel.andCallFake(function (c) { return {type: testType}; }); + mockDomainObject.getCapability.andCallFake(function (c) { + return c === 'telemetry' ? mockTelemetry : undefined; + }); + mockTelemetry.getMetadata.andReturn(testMetadata); policy = new MessagesViewPolicy(); }); - + it("disallows the message view for objects without string telemetry", function () { - telemetryType = 'notString'; - expect(policy.allow({ key: 'messages' }, mockDomainObject)) - .toBeFalsy(); + testMetadata.ranges = [ { format: 'notString' } ]; + expect(policy.allow({ key: 'messages' }, mockDomainObject)).toBeFalsy(); }); it("allows the message view for objects with string telemetry", function () { - telemetryType = 'string'; - expect(policy.allow({ key: 'messages' }, mockDomainObject)) - .toBeTruthy(); + testMetadata.ranges = [ { format: 'string' } ]; + expect(policy.allow({ key: 'messages' }, mockDomainObject)).toBeTruthy(); }); it("returns true when the current view is not the Messages view", function () { - expect(policy.allow({ key: 'notMessages' }, mockDomainObject)) - .toBeTruthy(); + expect(policy.allow({ key: 'notMessages' }, mockDomainObject)).toBeTruthy(); }); }); } diff --git a/platform/features/rtevents/bundle.json b/platform/features/rtevents/bundle.json index 04400d8223..d2067bdd79 100644 --- a/platform/features/rtevents/bundle.json +++ b/platform/features/rtevents/bundle.json @@ -4,11 +4,11 @@ "extensions": { "views": [ { - "key": "messages", + "key": "rtmessages", "name": "RT Messages", "glyph": "5", - "description": "Scrolling list of messages.", - "templateUrl": "templates/messages.html", + "description": "Scrolling list of real time messages.", + "templateUrl": "templates/rtmessages.html", "needs": [ "telemetry" ], "delegation": true } @@ -22,15 +22,15 @@ ], "directives": [ { - "key": "mctDataTable", - "implementation": "directives/MCTDataTable.js", + "key": "mctRtDataTable", + "implementation": "directives/MCTRTDataTable.js", "depends": [ "$window" ] } ], "policies": [ { "category": "view", - "implementation": "policies/MessagesViewPolicy.js" + "implementation": "policies/RTMessagesViewPolicy.js" } ] } diff --git a/platform/features/rtevents/res/templates/mct-data-table.html b/platform/features/rtevents/res/templates/mct-rt-data-table.html similarity index 100% rename from platform/features/rtevents/res/templates/mct-data-table.html rename to platform/features/rtevents/res/templates/mct-rt-data-table.html diff --git a/platform/features/rtevents/res/templates/messages.html b/platform/features/rtevents/res/templates/rtmessages.html similarity index 83% rename from platform/features/rtevents/res/templates/messages.html rename to platform/features/rtevents/res/templates/rtmessages.html index 82db5d0f9c..f17a44fe8c 100644 --- a/platform/features/rtevents/res/templates/messages.html +++ b/platform/features/rtevents/res/templates/rtmessages.html @@ -19,10 +19,10 @@ this source code distribution or the Licensing information page available at runtime from the About dialog for additional information. --> -
+
- + ng-controller="RTEventListController as rtevent"> +
diff --git a/platform/features/rtevents/src/DomainColumn.js b/platform/features/rtevents/src/DomainColumn.js index 95a6222553..c4f8a2a143 100644 --- a/platform/features/rtevents/src/DomainColumn.js +++ b/platform/features/rtevents/src/DomainColumn.js @@ -40,28 +40,30 @@ define( * @param {TelemetryFormatter} telemetryFormatter the telemetry * formatting service, for making values human-readable. */ - function DomainColumn(domainMetadata, telemetryFormatter) { + function DomainColumn(telemetryFormatter) { return { /** * Get the title to display in this column's header. * @returns {string} the title to display */ getTitle: function () { - return domainMetadata.name; + return "Time"; }, /** * Get the text to display inside a row under this * column. * @returns {string} the text to display */ - getValue: function (domainObject, data, index) { - return telemetryFormatter.formatDomainValue( - data.getDomainValue(index, domainMetadata.key) - ); + getValue: function (domainObject, handle) { + return { + text: telemetryFormatter.formatDomainValue( + handle.getDomainValue(domainObject) + ) + }; } }; } return DomainColumn; } -); \ No newline at end of file +); diff --git a/platform/features/rtevents/src/RTEventListController.js b/platform/features/rtevents/src/RTEventListController.js index b84d339bd6..618d6eede9 100644 --- a/platform/features/rtevents/src/RTEventListController.js +++ b/platform/features/rtevents/src/RTEventListController.js @@ -64,10 +64,7 @@ define( telemetryObjects[0] && telemetryObjects[0].getId(); columns = []; - - if (telemetryObjects > 1 || id !== firstId) { - columns.push(new NameColumn()); - } + columns.push(new DomainColumn(telemetryFormatter)); columns.push(new RangeColumn()); @@ -92,9 +89,11 @@ define( domainValue !== undefined) { // Instead of unshift (scrolling), use push (messages) rows.push(columns.map(function (column) { - return column.getValue(telemetryObject, handle); + return column.getValue(telemetryObject, handle).text; })); - rows.splice(ROW_COUNT, Number.MAX_VALUE); + // Remove first rows when adding past the max rows limit + //rows.splice(ROW_COUNT, Number.MAX_VALUE); + rows.splice(0, rows.length - ROW_COUNT); lastUpdated[id] = domainValue; } } diff --git a/platform/features/rtevents/src/RangeColumn.js b/platform/features/rtevents/src/RangeColumn.js index 2b11de43c7..8fcf747b25 100644 --- a/platform/features/rtevents/src/RangeColumn.js +++ b/platform/features/rtevents/src/RangeColumn.js @@ -19,10 +19,11 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/*global define,Promise*/ +/*global define,moment*/ /** - * Module defining DomainColumn. Created by vwoeltje on 11/18/14. + * Module defining DomainColumn. + * Created by vwoeltje on 11/18/14. Modified by shale on 06/25/2015. */ define( [], @@ -31,7 +32,7 @@ define( /** * A column which will report telemetry range values - * (typically, measurements.) Used by the ScrollingListController. + * (typically, measurements.) Used by the RTScrollingListController. * * @constructor * @param rangeMetadata an object with the machine- and human- @@ -40,28 +41,28 @@ define( * @param {TelemetryFormatter} telemetryFormatter the telemetry * formatting service, for making values human-readable. */ - function RangeColumn(rangeMetadata, telemetryFormatter) { + function RangeColumn() { return { /** * Get the title to display in this column's header. * @returns {string} the title to display */ getTitle: function () { - return rangeMetadata.name; + return "Message"; }, /** * Get the text to display inside a row under this * column. * @returns {string} the text to display */ - getValue: function (domainObject, data, index) { - return telemetryFormatter.formatRangeValue( - data.getRangeValue(index, rangeMetadata.key) - ); + getValue: function (domainObject, handle) { + return { + text: handle.getRangeValue(domainObject) + }; } }; } return RangeColumn; } -); \ No newline at end of file +); diff --git a/platform/features/rtevents/src/directives/MCTDataTable.js b/platform/features/rtevents/src/directives/MCTRTDataTable.js similarity index 90% rename from platform/features/rtevents/src/directives/MCTDataTable.js rename to platform/features/rtevents/src/directives/MCTRTDataTable.js index c4cb9970e6..9047d9e7f1 100644 --- a/platform/features/rtevents/src/directives/MCTDataTable.js +++ b/platform/features/rtevents/src/directives/MCTRTDataTable.js @@ -22,17 +22,17 @@ /*global define,Promise*/ /** - * Module defining MCTDataTable. Created by shale on 06/22/2015. + * Module defining MCTRTDataTable. Created by shale on 06/25/2015. */ define( [], function () { "use strict"; - function MCTDataTable($window) { + function MCTRTDataTable($window) { return { restrict: "E", - templateUrl: "platform/features/events/res/templates/mct-data-table.html", + templateUrl: "platform/features/rtevents/res/templates/mct-rt-data-table.html", scope: { headers: "=", rows: "=", @@ -49,7 +49,7 @@ define( // (When viewing at the bottom of the page, the scroll bar will // stay at the bottom despite additions to the table) if ($scope.ascendingScroll) { - $scope.$watch("rows", function () { + $scope.$watchCollection("rows", function () { // Wait until the page as been repainted (otherwise the // height will always be zero) $window.requestAnimationFrame(function () { @@ -59,7 +59,7 @@ define( // One of the parents is a div that has vscroll scrollParent = $element[0].parentElement.parentElement.parentElement.parentElement.parentElement; - + // Move the scrollbar down the amount that the height has changed scrollParent.scrollTop = scrollParent.scrollTop + (currentHeight - previousHeight); }); @@ -69,6 +69,6 @@ define( }; } - return MCTDataTable; + return MCTRTDataTable; } ); \ No newline at end of file diff --git a/platform/features/rtevents/src/policies/MessagesViewPolicy.js b/platform/features/rtevents/src/policies/RTMessagesViewPolicy.js similarity index 90% rename from platform/features/rtevents/src/policies/MessagesViewPolicy.js rename to platform/features/rtevents/src/policies/RTMessagesViewPolicy.js index 4426872b1e..32daca6873 100644 --- a/platform/features/rtevents/src/policies/MessagesViewPolicy.js +++ b/platform/features/rtevents/src/policies/RTMessagesViewPolicy.js @@ -33,14 +33,15 @@ define( * Policy controlling when the Messages view should be avaliable. * @constructor */ - function MessagesViewPolicy() { + function RTMessagesViewPolicy() { function hasStringTelemetry(domainObject) { var telemetry = domainObject && domainObject.getCapability('telemetry'), metadata = telemetry ? telemetry.getMetadata() : {}, + data = telemetry ? telemetry.requestData() : {}, ranges = metadata.ranges || []; - + return ranges.some(function (range) { return range.format === 'string'; }); @@ -54,8 +55,8 @@ define( * @returns {boolean} true if not disallowed */ allow: function (view, domainObject) { - // This policy only applies for the Messages view - if (view.key === 'messages') { + // This policy only applies for the RT Messages view + if (view.key === 'rtmessages') { // The Messages view is allowed only if the domain // object has string telemetry if (!hasStringTelemetry(domainObject)) { @@ -69,6 +70,6 @@ define( }; } - return MessagesViewPolicy; + return RTMessagesViewPolicy; } ); \ No newline at end of file diff --git a/platform/features/rtevents/test/DomainColumnSpec.js b/platform/features/rtevents/test/DomainColumnSpec.js index 29c896cd5b..e69de29bb2 100644 --- a/platform/features/rtevents/test/DomainColumnSpec.js +++ b/platform/features/rtevents/test/DomainColumnSpec.js @@ -1,84 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ - -/** - * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. - */ -define( - ["../src/DomainColumn"], - function (DomainColumn) { - "use strict"; - - var TEST_DOMAIN_VALUE = "some formatted domain value"; - - describe("An event list domain column", function () { - var mockDataSet, - testMetadata, - mockFormatter, - column; - - beforeEach(function () { - mockDataSet = jasmine.createSpyObj( - "data", - [ "getDomainValue" ] - ); - mockFormatter = jasmine.createSpyObj( - "formatter", - [ "formatDomainValue", "formatRangeValue" ] - ); - testMetadata = { - key: "testKey", - name: "Test Name" - }; - mockFormatter.formatDomainValue.andReturn(TEST_DOMAIN_VALUE); - - column = new DomainColumn(testMetadata, mockFormatter); - }); - - it("reports a column header from domain metadata", function () { - expect(column.getTitle()).toEqual("Test Name"); - }); - - it("looks up data from a data set", function () { - column.getValue(undefined, mockDataSet, 42); - expect(mockDataSet.getDomainValue) - .toHaveBeenCalledWith(42, "testKey"); - }); - - it("formats domain values as time", function () { - mockDataSet.getDomainValue.andReturn(402513731000); - - // Should have just given the value the formatter gave - expect(column.getValue(undefined, mockDataSet, 42)) - .toEqual(TEST_DOMAIN_VALUE); - - // Make sure that service interactions were as expected - expect(mockFormatter.formatDomainValue) - .toHaveBeenCalledWith(402513731000); - expect(mockFormatter.formatRangeValue) - .not.toHaveBeenCalled(); - }); - - }); - } -); \ No newline at end of file diff --git a/platform/features/rtevents/test/RTEventListControllerSpec.js b/platform/features/rtevents/test/RTEventListControllerSpec.js index ba764b61b0..e69de29bb2 100644 --- a/platform/features/rtevents/test/RTEventListControllerSpec.js +++ b/platform/features/rtevents/test/RTEventListControllerSpec.js @@ -1,110 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ - -/** - * EventSpec. Created by shale on 06/25/2015. - */ -define( - ["../src/RTEventListController"], - function (RTEventListController) { - "use strict"; - - describe("The real time event list controller", function () { - var mockScope, - mockTelemetry, - testMetadata, - controller; - - beforeEach(function () { - mockScope = jasmine.createSpyObj( - "$scope", - [ "$on", "$watch" ] - ); - mockTelemetry = jasmine.createSpyObj( - "telemetryController", - [ "getResponse", "getMetadata", "getTelemetryObjects" ] - ); - testMetadata = [ - { - domains: [ - { key: "d0", name: "D0" }, - { key: "d1", name: "D1" } - ], - ranges: [ - { key: "r0", name: "R0" }, - { key: "r1", name: "R1" } - ] - }, - { - domains: [ - { key: "d0", name: "D0" }, - { key: "d2", name: "D2" } - ], - ranges: [ - { key: "r0", name: "R0" } - ] - } - ]; - mockTelemetry.getMetadata.andReturn(testMetadata); - mockTelemetry.getResponse.andReturn([]); - mockTelemetry.getTelemetryObjects.andReturn([]); - mockScope.telemetry = mockTelemetry; - controller = new EventListController(mockScope); - }); - - it("listens for telemetry data updates", function () { - expect(mockScope.$on).toHaveBeenCalledWith( - "telemetryUpdate", - jasmine.any(Function) - ); - }); - - it("watches for telemetry controller changes", function () { - expect(mockScope.$watch).toHaveBeenCalledWith( - "telemetry", - jasmine.any(Function) - ); - }); - - it("provides a column for each unique domain and range", function () { - // Should have five columns based on metadata above, - // (d0, d1, d2, r0, r1) - mockScope.$watch.mostRecentCall.args[1](mockTelemetry); - expect(mockScope.headers).toEqual(["D0", "D1", "D2", "R0", "R1"]); - }); - - it("does not throw if telemetry controller is undefined", function () { - // Just a general robustness check - mockScope.telemetry = undefined; - expect(mockScope.$watch.mostRecentCall.args[1]) - .not.toThrow(); - }); - - it("provides default columns if domain/range metadata is unavailable", function () { - mockTelemetry.getMetadata.andReturn([]); - mockScope.$watch.mostRecentCall.args[1](mockTelemetry); - expect(mockScope.headers).toEqual(["Time", "Message"]); - }); - }); - } -); \ No newline at end of file diff --git a/platform/features/rtevents/test/RangeColumnSpec.js b/platform/features/rtevents/test/RangeColumnSpec.js index 99c5ceb6f4..e69de29bb2 100644 --- a/platform/features/rtevents/test/RangeColumnSpec.js +++ b/platform/features/rtevents/test/RangeColumnSpec.js @@ -1,81 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,describe,it,expect,beforeEach,waitsFor,jasmine*/ - -/** - * EventSpec. Created by vwoeltje on 11/6/14. Modified by shale on 06/23/2015. - */ -define( - ["../src/RangeColumn"], - function (RangeColumn) { - "use strict"; - - var TEST_RANGE_VALUE = "some formatted range value"; - - describe("An event list range column", function () { - var mockDataSet, - testMetadata, - mockFormatter, - column; - - beforeEach(function () { - mockDataSet = jasmine.createSpyObj( - "data", - [ "getRangeValue" ] - ); - mockFormatter = jasmine.createSpyObj( - "formatter", - [ "formatDomainValue", "formatRangeValue" ] - ); - testMetadata = { - key: "testKey", - name: "Test Name" - }; - mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE); - - column = new RangeColumn(testMetadata, mockFormatter); - }); - - it("reports a column header from range metadata", function () { - expect(column.getTitle()).toEqual("Test Name"); - }); - - it("looks up data from a data set", function () { - column.getValue(undefined, mockDataSet, 42); - expect(mockDataSet.getRangeValue) - .toHaveBeenCalledWith(42, "testKey"); - }); - - it("formats range values as time", function () { - mockDataSet.getRangeValue.andReturn(123.45678); - expect(column.getValue(undefined, mockDataSet, 42)) - .toEqual(TEST_RANGE_VALUE); - - // Make sure that service interactions were as expected - expect(mockFormatter.formatRangeValue) - .toHaveBeenCalledWith(123.45678); - expect(mockFormatter.formatDomainValue) - .not.toHaveBeenCalled(); - }); - }); - } -); \ No newline at end of file diff --git a/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js b/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js deleted file mode 100644 index 6e3430f64e..0000000000 --- a/platform/features/rtevents/test/policies/MessagesViewPolicySpec.js +++ /dev/null @@ -1,68 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * Open MCT Web includes source code licensed under additional open source - * licenses. See the Open Source Licenses file (LICENSES.md) included with - * this source code distribution or the Licensing information page available - * at runtime from the About dialog for additional information. - *****************************************************************************/ -/*global define,describe,it,expect,beforeEach,jasmine*/ - -/** - * EventSpec. Created by shale on 06/24/2015. - */ -define( - ["../../src/policies/MessagesViewPolicy"], - function (MessagesViewPolicy) { - "use strict"; - - describe("The messages view policy", function () { - var mockDomainObject, - testType, - telemetryType, - policy; - - beforeEach(function () { - mockDomainObject = jasmine.createSpyObj( - 'domainObject', - ['getModel'] - ); - mockDomainObject.getModel.andCallFake(function (c) { - return {type: testType}; - }); - - policy = new MessagesViewPolicy(); - }); - - it("disallows the message view for objects without string telemetry", function () { - telemetryType = 'notString'; - expect(policy.allow({ key: 'messages' }, mockDomainObject)) - .toBeFalsy(); - }); - - it("allows the message view for objects with string telemetry", function () { - telemetryType = 'string'; - expect(policy.allow({ key: 'messages' }, mockDomainObject)) - .toBeTruthy(); - }); - - it("returns true when the current view is not the Messages view", function () { - expect(policy.allow({ key: 'notMessages' }, mockDomainObject)) - .toBeTruthy(); - }); - }); - } -); \ No newline at end of file diff --git a/platform/features/rtevents/test/policies/RTMessagesViewPolicySpec.js b/platform/features/rtevents/test/policies/RTMessagesViewPolicySpec.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/features/rtevents/test/suite.js b/platform/features/rtevents/test/suite.js new file mode 100644 index 0000000000..e69de29bb2