From 546cde56a8f410d0178ede21e6cc25a85280d4c3 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 15 Apr 2016 08:32:34 -0700 Subject: [PATCH 001/167] [Timeline] Expose internal resource utilization ...to allow this to be exported for CSV, #751 --- .../timeline/src/capabilities/UtilizationCapability.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/platform/features/timeline/src/capabilities/UtilizationCapability.js b/platform/features/timeline/src/capabilities/UtilizationCapability.js index 140f527c0d..33a7e4f793 100644 --- a/platform/features/timeline/src/capabilities/UtilizationCapability.js +++ b/platform/features/timeline/src/capabilities/UtilizationCapability.js @@ -195,6 +195,13 @@ define( * @returns {Promise.} a promise for resource identifiers */ resources: promiseResourceKeys, + /** + * Get the resource utilization associated with this object + * directly, not including any resource utilization associated + * with contained objects. + * @returns {Promise.} + */ + internal: promiseInternalUtilization, /** * Get the resource utilization associated with this * object. Results are not sorted. This requires looking From f683ca44a220359989c1c1841a3b7f66d7280fbb Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 15 Apr 2016 08:45:42 -0700 Subject: [PATCH 002/167] [Timeline] Read resource utilizations during CSV export --- .../src/actions/TimelineColumnizer.js | 19 +++++- .../timeline/src/actions/UtilizationColumn.js | 58 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 platform/features/timeline/src/actions/UtilizationColumn.js diff --git a/platform/features/timeline/src/actions/TimelineColumnizer.js b/platform/features/timeline/src/actions/TimelineColumnizer.js index 3069bd8b96..02d3ad6b69 100644 --- a/platform/features/timeline/src/actions/TimelineColumnizer.js +++ b/platform/features/timeline/src/actions/TimelineColumnizer.js @@ -68,11 +68,12 @@ define([ * @constructor * @memberof {platform/features/timeline} */ - function TimelineColumnizer(domainObjects) { + function TimelineColumnizer(domainObjects, resourceMap) { var maxComposition = 0, maxRelationships = 0, columnNames = {}, columns = [], + costKeys = [], foundTimespan = false, i; @@ -84,6 +85,14 @@ define([ } } + function addCostProperties(costCapability) { + costCapability.resources().forEach(function (key) { + if (costKeys.indexOf(key) === -1) { + costKeys.push(key); + } + }); + } + columns.push(new IdColumn()); domainObjects.forEach(function (domainObject) { @@ -105,6 +114,10 @@ define([ foundTimespan = true; } + if (domainObject.hasCapability('cost')) { + addCostProperties(domainObject.getCapability('cost')); + } + if (metadataProperties) { metadataProperties.forEach(addMetadataProperty); } @@ -115,6 +128,10 @@ define([ columns.push(new TimespanColumn(false)); } + costKeys.forEach(function (key) { + columns.push(new UtilizationColumn(resourceMap[key])); + }); + for (i = 0; i < maxComposition; i += 1) { columns.push(new CompositionColumn(i)); } diff --git a/platform/features/timeline/src/actions/UtilizationColumn.js b/platform/features/timeline/src/actions/UtilizationColumn.js new file mode 100644 index 0000000000..f2c8a56544 --- /dev/null +++ b/platform/features/timeline/src/actions/UtilizationColumn.js @@ -0,0 +1,58 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2009-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define([], function () { + "use strict"; + + /** + * A column showing utilization costs associated with activities. + * @constructor + * @param {string} key the key for the particular cost + * @implements {platform/features/timeline.TimelineCSVColumn} + */ + function UtilizationColumn(resource) { + this.resource = resource; + } + + UtilizationColumn.prototype.name = function () { + return this.resource.name; + }; + + UtilizationColumn.prototype.value = function (domainObject) { + var resource = this.resource; + + function getUtilizationValue(utilizations) { + utilizations = utilizations.filter(function (utilization) { + return key === resource.key; + }); + return utilizations.length === 1 ? utilizations[0].value : ""; + } + + return !domainObject.hasCapability('utilization') ? + "" : + domainObject.getCapability('utilization').internal() + .then(getUtilizationValue); + }; + + return UtilizationColumn; +}); From f16a107105415cb470a9ba3a10515483e3d1655d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 15 Apr 2016 08:51:22 -0700 Subject: [PATCH 003/167] [Timeline] Inject resources into CSV action --- platform/features/timeline/bundle.js | 6 +++++- .../timeline/src/actions/ExportTimelineAsCSVAction.js | 11 +++++++++-- .../timeline/src/actions/ExportTimelineAsCSVTask.js | 6 ++++-- .../timeline/src/actions/TimelineColumnizer.js | 11 +++-------- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index 8e2a40ed7d..27420fd032 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -93,7 +93,11 @@ define([ "name": "Export Timeline as CSV", "category": "contextual", "implementation": ExportTimelineAsCSVAction, - "depends": [ "exportService", "notificationService" ] + "depends": [ + "exportService", + "notificationService", + "resources[]" + ] } ], "constants": [ diff --git a/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js b/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js index 387c0839a0..e50b9369db 100644 --- a/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js +++ b/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js @@ -29,14 +29,21 @@ define(["./ExportTimelineAsCSVTask"], function (ExportTimelineAsCSVTask) { * * @param exportService the service used to perform the CSV export * @param notificationService the service used to show notifications + * @param {Array} resources an array of `resources` extensions * @param context the Action's context * @implements {Action} * @constructor * @memberof {platform/features/timeline} */ - function ExportTimelineAsCSVAction(exportService, notificationService, context) { + function ExportTimelineAsCSVAction( + exportService, + notificationService, + resources, + context + ) { this.task = new ExportTimelineAsCSVTask( exportService, + resources, context.domainObject ); this.notificationService = notificationService; @@ -67,4 +74,4 @@ define(["./ExportTimelineAsCSVTask"], function (ExportTimelineAsCSVTask) { }; return ExportTimelineAsCSVAction; -}); \ No newline at end of file +}); diff --git a/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js b/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js index 253db5c8b9..5979347d3c 100644 --- a/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js +++ b/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js @@ -37,11 +37,13 @@ define([ * @constructor * @memberof {platform/features/timeline} * @param exportService the service used to export as CSV + * @param resources the `resources` extension category * @param {DomainObject} domainObject the timeline being exported */ - function ExportTimelineAsCSVTask(exportService, domainObject) { + function ExportTimelineAsCSVTask(exportService, resources, domainObject) { this.domainObject = domainObject; this.exportService = exportService; + this.resources = resources; } /** @@ -54,7 +56,7 @@ define([ var exportService = this.exportService; function doExport(objects) { - var exporter = new TimelineColumnizer(objects), + var exporter = new TimelineColumnizer(objects, this.resources), options = { headers: exporter.headers() }; return exporter.rows().then(function (rows) { return exportService.exportCSV(rows, options); diff --git a/platform/features/timeline/src/actions/TimelineColumnizer.js b/platform/features/timeline/src/actions/TimelineColumnizer.js index 02d3ad6b69..035496edc6 100644 --- a/platform/features/timeline/src/actions/TimelineColumnizer.js +++ b/platform/features/timeline/src/actions/TimelineColumnizer.js @@ -68,12 +68,11 @@ define([ * @constructor * @memberof {platform/features/timeline} */ - function TimelineColumnizer(domainObjects, resourceMap) { + function TimelineColumnizer(domainObjects, resources) { var maxComposition = 0, maxRelationships = 0, columnNames = {}, columns = [], - costKeys = [], foundTimespan = false, i; @@ -114,10 +113,6 @@ define([ foundTimespan = true; } - if (domainObject.hasCapability('cost')) { - addCostProperties(domainObject.getCapability('cost')); - } - if (metadataProperties) { metadataProperties.forEach(addMetadataProperty); } @@ -128,8 +123,8 @@ define([ columns.push(new TimespanColumn(false)); } - costKeys.forEach(function (key) { - columns.push(new UtilizationColumn(resourceMap[key])); + resources.forEach(function (resource) { + columns.push(new UtilizationColumn(resource)); }); for (i = 0; i < maxComposition; i += 1) { From bcd5f1ee248b9d2ea5b49af84dad2d2e8667f3ea Mon Sep 17 00:00:00 2001 From: pacozaa Date: Mon, 9 May 2016 03:05:21 +0700 Subject: [PATCH 004/167] add shortcut for see the app quickly --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index dc18671dd3..c21888dbc8 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,10 @@ installed and then run the following commands: Documentation will be generated in `target/docs`. +### Run the app + +Please see [tutorial](https://github.com/nasa/openmct/blob/master/docs/src/tutorials/index.md) + # Glossary Certain terms are used throughout Open MCT with consistent meanings From cae85f3e30c32c79ca19c5e7ebb3750e09962a3f Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Mon, 9 May 2016 10:16:54 -0700 Subject: [PATCH 005/167] [Frontend] Mods to slider .range-value elems open #889 - Text smaller, line breaks; - Height adjustments - Increased with of slider area; --- .../commonUI/general/res/sass/_constants.scss | 2 +- .../general/res/sass/controls/_controls.scss | 4 +-- .../res/sass/controls/_time-controller.scss | 27 +++++++++++-------- .../themes/espresso/res/sass/_constants.scss | 3 ++- .../themes/snow/res/sass/_constants.scss | 3 ++- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index 659025960f..59fe5ed65c 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -48,7 +48,7 @@ $uePaneMiniTabW: 10px; $uePaneMiniTabCollapsedW: 11px; $ueEditLeftPaneW: 75%; $treeSearchInputBarH: 25px; -$ueTimeControlH: (33px, 20px, 20px); +$ueTimeControlH: (33px, 23px, 15px); // Panes $ueBrowseLeftPaneTreeMinW: 150px; $ueBrowseLeftPaneTreeMaxW: 35%; diff --git a/platform/commonUI/general/res/sass/controls/_controls.scss b/platform/commonUI/general/res/sass/controls/_controls.scss index a2bb0b73bb..7177e87abe 100644 --- a/platform/commonUI/general/res/sass/controls/_controls.scss +++ b/platform/commonUI/general/res/sass/controls/_controls.scss @@ -404,11 +404,11 @@ body.desktop .object-header { left: auto; } .knob-l { - @include border-left-radius($sliderKnobW); + @include border-left-radius($sliderKnobR); cursor: w-resize; } .knob-r { - @include border-right-radius($sliderKnobW); + @include border-right-radius($sliderKnobR); cursor: e-resize; } .range { diff --git a/platform/commonUI/general/res/sass/controls/_time-controller.scss b/platform/commonUI/general/res/sass/controls/_time-controller.scss index f6201d60cf..b9d7e26b0e 100644 --- a/platform/commonUI/general/res/sass/controls/_time-controller.scss +++ b/platform/commonUI/general/res/sass/controls/_time-controller.scss @@ -11,7 +11,7 @@ $knobM: ($sliderKnobW + $knobHOffset) * -1; $rangeValPad: $interiorMargin; $rangeValOffset: $sliderKnobW; - $timeRangeSliderLROffset: 130px + $sliderKnobW + $rangeValOffset; + $timeRangeSliderLROffset: 80px + ($sliderKnobW * 2); $r1H: nth($ueTimeControlH,1); $r2H: nth($ueTimeControlH,2); $r3H: nth($ueTimeControlH,3); @@ -76,22 +76,23 @@ &:before, &:after { background-color: $myC; - content: ""; + //content: ""; position: absolute; } &:before { // Vert line + content: ""; top: 0; right: auto; bottom: -10px; left: floor($myW/2) - 1; - width: 2px; + width: 1px; } - &:after { +/* &:after { // Circle element border-radius: $myW; @include transform(translateY(-50%)); top: 50%; right: 0; bottom: auto; left: 0; width: auto; height: $myW; - } + }*/ } &:hover .toi-line { @include toiLineHovEffects; @@ -126,9 +127,9 @@ @include webkitProp(transform, translateX(-50%)); color: $colorPlotLabelFg; display: inline-block; - font-size: 0.9em; + font-size: 0.7rem; position: absolute; - top: 8px; + top: 5px; white-space: nowrap; z-index: 2; } @@ -140,14 +141,18 @@ z-index: 2; .range-value { @include trans-prop-nice-fade(.25s); + //background: rgba(red, 0.4); + font-size: 0.7rem; padding: 0 $rangeValOffset; position: absolute; height: $r2H; - line-height: $r2H; - white-space: nowrap; + line-height: $r2H/2; + z-index: 1; } - &:hover .range-value { - color: $sliderColorKnobHov; + &:hover { + .range-value { + color: $sliderColorKnobHov; + } } &.knob-l { margin-left: $knobM; diff --git a/platform/commonUI/themes/espresso/res/sass/_constants.scss b/platform/commonUI/themes/espresso/res/sass/_constants.scss index 729a813a12..a17f8040c0 100644 --- a/platform/commonUI/themes/espresso/res/sass/_constants.scss +++ b/platform/commonUI/themes/espresso/res/sass/_constants.scss @@ -36,7 +36,8 @@ $sliderColorKnob: rgba($sliderColorBase, 0.6); $sliderColorKnobHov: $sliderColorBase; $sliderColorRangeValHovBg: rgba($sliderColorBase, 0.1); $sliderColorRangeValHovFg: $colorKeyFg; -$sliderKnobW: nth($ueTimeControlH,2)/2; +$sliderKnobW: 5px; //nth($ueTimeControlH,2)/2; +$sliderKnobR: 2px; $timeControllerToiLineColor: #00c2ff; $timeControllerToiLineColorHov: #fff; diff --git a/platform/commonUI/themes/snow/res/sass/_constants.scss b/platform/commonUI/themes/snow/res/sass/_constants.scss index 0d8430a7ec..fbb6cc8d87 100644 --- a/platform/commonUI/themes/snow/res/sass/_constants.scss +++ b/platform/commonUI/themes/snow/res/sass/_constants.scss @@ -36,7 +36,8 @@ $sliderColorKnob: rgba($sliderColorBase, 0.5); $sliderColorKnobHov: rgba($sliderColorBase, 0.7); $sliderColorRangeValHovBg: $sliderColorRange; //rgba($sliderColorBase, 0.1); $sliderColorRangeValHovFg: $colorBodyFg; -$sliderKnobW: nth($ueTimeControlH,2)/2; +$sliderKnobW: 5px; //nth($ueTimeControlH,2)/2; +$sliderKnobR: 2px; $timeControllerToiLineColor: $colorBodyFg; $timeControllerToiLineColorHov: #0052b5; From 2e8604e18d7995528c9ab288b968326e9f8e828f Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Mon, 9 May 2016 10:38:18 -0700 Subject: [PATCH 006/167] [Frontend] Layout and positioning fixes for TC controls open #889 --- .../general/res/sass/controls/_time-controller.scss | 12 +++++++++--- .../res/templates/controls/time-controller.html | 10 +++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/platform/commonUI/general/res/sass/controls/_time-controller.scss b/platform/commonUI/general/res/sass/controls/_time-controller.scss index b9d7e26b0e..e8051b058f 100644 --- a/platform/commonUI/general/res/sass/controls/_time-controller.scss +++ b/platform/commonUI/general/res/sass/controls/_time-controller.scss @@ -38,8 +38,15 @@ .l-time-range-inputs-holder { height: $r1H; bottom: $r2H + $r3H + ($interiorMarginSm * 2); - padding-top: $interiorMargin; + //padding-top: $interiorMargin; border-top: 1px solid $colorInteriorBorder; + &.l-flex-row { + @include align-items(center); + .flex-elem { + height: auto; + line-height: normal; + } + } .type-icon { font-size: 120%; vertical-align: middle; @@ -141,7 +148,6 @@ z-index: 2; .range-value { @include trans-prop-nice-fade(.25s); - //background: rgba(red, 0.4); font-size: 0.7rem; padding: 0 $rangeValOffset; position: absolute; @@ -175,7 +181,7 @@ .l-time-domain-selector { position: absolute; right: 0px; - bottom: 46px; + bottom: 43px; } } diff --git a/platform/commonUI/general/res/templates/controls/time-controller.html b/platform/commonUI/general/res/templates/controls/time-controller.html index 281447e251..91fe8099ee 100644 --- a/platform/commonUI/general/res/templates/controls/time-controller.html +++ b/platform/commonUI/general/res/templates/controls/time-controller.html @@ -20,10 +20,10 @@ at runtime from the About dialog for additional information. -->
-
- C - + C + to + to - + - + - - diff --git a/platform/commonUI/general/res/templates/controls/time-controller.html b/platform/commonUI/general/res/templates/controls/time-controller.html index 91fe8099ee..2d617c951f 100644 --- a/platform/commonUI/general/res/templates/controls/time-controller.html +++ b/platform/commonUI/general/res/templates/controls/time-controller.html @@ -23,7 +23,7 @@ C - + to - + -   + diff --git a/platform/commonUI/themes/espresso/res/sass/_constants.scss b/platform/commonUI/themes/espresso/res/sass/_constants.scss index a17f8040c0..d1390c91a7 100644 --- a/platform/commonUI/themes/espresso/res/sass/_constants.scss +++ b/platform/commonUI/themes/espresso/res/sass/_constants.scss @@ -70,8 +70,10 @@ $colorCreateMenuText: $colorMenuFg; $colorCheck: $colorKey; $colorFormRequired: $colorAlt1; $colorFormValid: #33cc33; -$colorFormError: #cc0000; +$colorFormError: #990000; $colorFormInvalid: #ff3300; +$colorFormFieldErrorBg: $colorFormError; +$colorFormFieldErrorFg: rgba(#fff, 0.6); $colorFormLines: rgba(#fff, 0.1); $colorFormSectionHeader: rgba(#fff, 0.1); $colorInputBg: rgba(#000, 0.1); diff --git a/platform/commonUI/themes/snow/res/sass/_constants.scss b/platform/commonUI/themes/snow/res/sass/_constants.scss index fbb6cc8d87..bbd3a475be 100644 --- a/platform/commonUI/themes/snow/res/sass/_constants.scss +++ b/platform/commonUI/themes/snow/res/sass/_constants.scss @@ -36,7 +36,7 @@ $sliderColorKnob: rgba($sliderColorBase, 0.5); $sliderColorKnobHov: rgba($sliderColorBase, 0.7); $sliderColorRangeValHovBg: $sliderColorRange; //rgba($sliderColorBase, 0.1); $sliderColorRangeValHovFg: $colorBodyFg; -$sliderKnobW: 5px; //nth($ueTimeControlH,2)/2; +$sliderKnobW: 10px; $sliderKnobR: 2px; $timeControllerToiLineColor: $colorBodyFg; $timeControllerToiLineColorHov: #0052b5; @@ -70,8 +70,10 @@ $colorCreateMenuText: $colorBodyFg; $colorCheck: $colorKey; $colorFormRequired: $colorKey; $colorFormValid: #33cc33; -$colorFormError: #cc0000; +$colorFormError: #990000; $colorFormInvalid: #ff2200; +$colorFormFieldErrorBg: $colorFormError; +$colorFormFieldErrorFg: rgba(#fff, 0.6); $colorFormLines: rgba(#000, 0.1); $colorFormSectionHeader: rgba(#000, 0.05); $colorInputBg: $colorGenBg; From cf295105d4395e267d0668d5c23d5f46cc463eb0 Mon Sep 17 00:00:00 2001 From: Even Stensberg Date: Tue, 10 May 2016 21:06:04 +0200 Subject: [PATCH 008/167] [Functionality] Log app instance to the console Added logging statement, so the user knows when the app is up and running. --- app.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 8e7bb15ec2..1a4336cbb2 100644 --- a/app.js +++ b/app.js @@ -75,6 +75,9 @@ // Expose everything else as static files app.use(express['static'](options.directory)); - // Finally, open the HTTP server - app.listen(options.port); -}()); \ No newline at end of file + // Finally, open the HTTP server and log the instance to the console + app.listen(options.port, function() { + console.log('Open MCT application running at localhost:' + options.port) + }); + + }()); From 24e391edf70b3f6663977eb43d8cccb850f76de6 Mon Sep 17 00:00:00 2001 From: Even Stensberg Date: Tue, 10 May 2016 21:44:10 +0200 Subject: [PATCH 009/167] [Branding] Added Apache license to README.md Added Apache license --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dc18671dd3..610db8afef 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Open MCT +# Open MCT [![license](https://img.shields.io/badge/Apache%202.0-license-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) Open MCT is a web-based platform for mission operations user interface software. From 056475948183e29e5d88db02236fae5258f36dce Mon Sep 17 00:00:00 2001 From: Even Stensberg Date: Tue, 10 May 2016 21:48:24 +0200 Subject: [PATCH 010/167] Swapped order of license Swaped license order with name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 610db8afef..f55b1d855b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Open MCT [![license](https://img.shields.io/badge/Apache%202.0-license-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) +# Open MCT [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) Open MCT is a web-based platform for mission operations user interface software. From b4faf8991d823ec27eb65b3daa798ba6a5c22069 Mon Sep 17 00:00:00 2001 From: Even Stensberg Date: Tue, 10 May 2016 22:02:19 +0200 Subject: [PATCH 011/167] Indentation Fixes --- app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 1a4336cbb2..14db70d8cd 100644 --- a/app.js +++ b/app.js @@ -76,8 +76,8 @@ app.use(express['static'](options.directory)); // Finally, open the HTTP server and log the instance to the console - app.listen(options.port, function() { - console.log('Open MCT application running at localhost:' + options.port) - }); + app.listen(options.port, function() { + console.log('Open MCT application running at localhost:' + options.port) + }); }()); From d32ef4bc3d8417d3eef2fe4ecff8640742b30bb9 Mon Sep 17 00:00:00 2001 From: Even Stensberg Date: Tue, 10 May 2016 22:03:07 +0200 Subject: [PATCH 012/167] Last indentation fix --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 14db70d8cd..3315ff9f62 100644 --- a/app.js +++ b/app.js @@ -77,7 +77,7 @@ // Finally, open the HTTP server and log the instance to the console app.listen(options.port, function() { - console.log('Open MCT application running at localhost:' + options.port) + console.log('Open MCT application running at localhost:' + options.port) }); }()); From 8788523c25019255e14b3fe8ddd42264214fe359 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Tue, 10 May 2016 14:28:23 -0700 Subject: [PATCH 013/167] [Frontend] Tweaks to slider knobs open #889 - Knob size increased; - Knob grippies added; --- platform/commonUI/general/res/sass/_mixins.scss | 11 +++++++++++ .../general/res/sass/controls/_time-controller.scss | 12 ++++++++++++ .../themes/espresso/res/sass/_constants.scss | 4 ++-- .../commonUI/themes/snow/res/sass/_constants.scss | 6 +++--- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/platform/commonUI/general/res/sass/_mixins.scss b/platform/commonUI/general/res/sass/_mixins.scss index 663edb9762..d7fa694100 100644 --- a/platform/commonUI/general/res/sass/_mixins.scss +++ b/platform/commonUI/general/res/sass/_mixins.scss @@ -139,6 +139,17 @@ background-size: $d $d; } +@mixin bgStripes($c: yellow, $a: 0.1, $bgsize: 5px, $angle: 90deg) { + @include background-image(linear-gradient($angle, + rgba($c, $a) 25%, transparent 25%, + transparent 50%, rgba($c, $a) 50%, + rgba($c, $a) 75%, transparent 75%, + transparent 100% + )); + background-repeat: repeat; + background-size: $bgsize $bgsize; +} + @mixin bgVertStripes($c: yellow, $a: 0.1, $d: 40px) { @include background-image(linear-gradient(-90deg, rgba($c, $a) 0%, rgba($c, $a) 50%, diff --git a/platform/commonUI/general/res/sass/controls/_time-controller.scss b/platform/commonUI/general/res/sass/controls/_time-controller.scss index 88f79bdb1c..c8a52bdce3 100644 --- a/platform/commonUI/general/res/sass/controls/_time-controller.scss +++ b/platform/commonUI/general/res/sass/controls/_time-controller.scss @@ -147,6 +147,16 @@ .knob { z-index: 2; + &:before { + $mTB: 2px; + $grippyW: 3px; + $mLR: ($sliderKnobW - $grippyW)/2; + @include bgStripes($c: pullForward($sliderColorKnob, 20%), $a: 1, $bgsize: 4px, $angle: 0deg); + content: ''; + display: block; + position: absolute; + top: $mTB; right: $mLR; bottom: $mTB; left: $mLR; + } .range-value { @include trans-prop-nice-fade(.25s); font-size: 0.7rem; @@ -193,6 +203,8 @@ padding: 1px 1px 0 $interiorMargin; } +/******************************************************************** MOBILE */ + @include phoneandtablet { .l-time-controller, .l-time-range-inputs-holder { min-width: 0px; diff --git a/platform/commonUI/themes/espresso/res/sass/_constants.scss b/platform/commonUI/themes/espresso/res/sass/_constants.scss index d1390c91a7..c6fd55e8ca 100644 --- a/platform/commonUI/themes/espresso/res/sass/_constants.scss +++ b/platform/commonUI/themes/espresso/res/sass/_constants.scss @@ -32,11 +32,11 @@ $sliderColorBase: $colorKey; $sliderColorRangeHolder: rgba(black, 0.1); $sliderColorRange: rgba($sliderColorBase, 0.3); $sliderColorRangeHov: rgba($sliderColorBase, 0.5); -$sliderColorKnob: rgba($sliderColorBase, 0.6); +$sliderColorKnob: pushBack($sliderColorBase, 15%); $sliderColorKnobHov: $sliderColorBase; $sliderColorRangeValHovBg: rgba($sliderColorBase, 0.1); $sliderColorRangeValHovFg: $colorKeyFg; -$sliderKnobW: 5px; //nth($ueTimeControlH,2)/2; +$sliderKnobW: 15px; $sliderKnobR: 2px; $timeControllerToiLineColor: #00c2ff; $timeControllerToiLineColorHov: #fff; diff --git a/platform/commonUI/themes/snow/res/sass/_constants.scss b/platform/commonUI/themes/snow/res/sass/_constants.scss index bbd3a475be..f85b5c328f 100644 --- a/platform/commonUI/themes/snow/res/sass/_constants.scss +++ b/platform/commonUI/themes/snow/res/sass/_constants.scss @@ -32,11 +32,11 @@ $sliderColorBase: $colorKey; $sliderColorRangeHolder: rgba(black, 0.07); $sliderColorRange: rgba($sliderColorBase, 0.2); $sliderColorRangeHov: rgba($sliderColorBase, 0.4); -$sliderColorKnob: rgba($sliderColorBase, 0.5); +$sliderColorKnob: pushBack($sliderColorBase, 20%); $sliderColorKnobHov: rgba($sliderColorBase, 0.7); -$sliderColorRangeValHovBg: $sliderColorRange; //rgba($sliderColorBase, 0.1); +$sliderColorRangeValHovBg: $sliderColorRange; $sliderColorRangeValHovFg: $colorBodyFg; -$sliderKnobW: 10px; +$sliderKnobW: 15px; $sliderKnobR: 2px; $timeControllerToiLineColor: $colorBodyFg; $timeControllerToiLineColorHov: #0052b5; From 7ade873365ac842a67c5873d5cdde9dc183610fd Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Tue, 10 May 2016 15:12:50 -0700 Subject: [PATCH 014/167] [Frontend] Flex; Tweaks to slider knobs open #889 - Converted TC elements to use flex layout instead of abs pos; - Knob size increased; - Knob grippies added; --- .../commonUI/general/res/sass/_constants.scss | 2 +- .../res/sass/controls/_time-controller.scss | 16 ++++++++-------- .../general/res/sass/user-environ/_layout.scss | 8 ++++---- .../res/templates/controls/time-controller.html | 8 ++++---- .../themes/espresso/res/sass/_constants.scss | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index a7abd1ac8b..c36a6cb00a 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -48,7 +48,7 @@ $uePaneMiniTabW: 10px; $uePaneMiniTabCollapsedW: 11px; $ueEditLeftPaneW: 75%; $treeSearchInputBarH: 25px; -$ueTimeControlH: (33px, 15px, 15px); +$ueTimeControlH: (33px, 18px, 20px); // Panes $ueBrowseLeftPaneTreeMinW: 150px; $ueBrowseLeftPaneTreeMaxW: 35%; diff --git a/platform/commonUI/general/res/sass/controls/_time-controller.scss b/platform/commonUI/general/res/sass/controls/_time-controller.scss index c8a52bdce3..bf6568508c 100644 --- a/platform/commonUI/general/res/sass/controls/_time-controller.scss +++ b/platform/commonUI/general/res/sass/controls/_time-controller.scss @@ -12,23 +12,23 @@ $rangeValPad: $interiorMargin; $rangeValOffset: $sliderKnobW + $interiorMargin; $timeRangeSliderLROffset: 150px + ($sliderKnobW * 2); - $r1H: nth($ueTimeControlH,1); + $r1H: nth($ueTimeControlH,1); // Not currently used $r2H: nth($ueTimeControlH,2); $r3H: nth($ueTimeControlH,3); - display: block; - height: $r1H + $r2H + $r3H + ($interiorMargin * 2); min-width: $minW; font-size: 0.8rem; - .l-time-range-inputs-holder, .l-time-range-slider-holder, .l-time-range-ticks-holder { - @include absPosDefault(0, visible); box-sizing: border-box; - top: auto; + position: relative; + //top: auto; + &:not(:first-child) { + margin-top: $interiorMargin; + } } .l-time-range-slider, .l-time-range-ticks { @@ -37,8 +37,8 @@ } .l-time-range-inputs-holder { - height: $r1H; bottom: $r2H + $r3H + ($interiorMarginSm * 2); border-top: 1px solid $colorInteriorBorder; + padding-top: $interiorMargin; &.l-flex-row { @include align-items(center); .flex-elem { @@ -78,7 +78,7 @@ } .l-time-range-slider-holder { - height: $r2H; bottom: $r3H + ($interiorMarginSm * 1); + height: $r2H; .range-holder { box-shadow: none; background: none; diff --git a/platform/commonUI/general/res/sass/user-environ/_layout.scss b/platform/commonUI/general/res/sass/user-environ/_layout.scss index 99d8fb9d14..9e8e9aaae1 100644 --- a/platform/commonUI/general/res/sass/user-environ/_layout.scss +++ b/platform/commonUI/general/res/sass/user-environ/_layout.scss @@ -194,7 +194,7 @@ body.desktop .pane .mini-tab-icon.toggle-pane { .holder.holder-treeview-elements { top: $bodyMargin; right: 0; - bottom: $bodyMargin; + bottom: $interiorMargin; left: $bodyMargin; .create-btn-holder { &.s-status-editing { @@ -215,17 +215,17 @@ body.desktop .pane .mini-tab-icon.toggle-pane { left: 0; .holder-object { top: $bodyMargin; - bottom: $bodyMargin; + bottom: $interiorMargin; } .holder-inspector { top: $bodyMargin; - bottom: $bodyMargin; + bottom: $interiorMargin; left: $bodyMargin; right: $bodyMargin; } .holder-elements { top: 0; - bottom: $bodyMargin; + bottom: $interiorMargin; left: $bodyMargin; right: $bodyMargin; } diff --git a/platform/commonUI/general/res/templates/controls/time-controller.html b/platform/commonUI/general/res/templates/controls/time-controller.html index 2d617c951f..3ac4542644 100644 --- a/platform/commonUI/general/res/templates/controls/time-controller.html +++ b/platform/commonUI/general/res/templates/controls/time-controller.html @@ -19,8 +19,8 @@ this source code distribution or the Licensing information page available at runtime from the About dialog for additional information. --> -
- + C @@ -54,7 +54,7 @@ -
+
@@ -85,7 +85,7 @@
-
+
Date: Wed, 11 May 2016 00:14:52 +0200 Subject: [PATCH 015/167] Removed indents Removed unnecessary indentations --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 3315ff9f62..ba72a2f089 100644 --- a/app.js +++ b/app.js @@ -80,4 +80,4 @@ console.log('Open MCT application running at localhost:' + options.port) }); - }()); +}()); From 677b65d124326f41fe80e63a0e8f5523bfec1c93 Mon Sep 17 00:00:00 2001 From: Even Stensberg Date: Wed, 11 May 2016 00:39:16 +0200 Subject: [PATCH 016/167] Optional indent removed removed whitespace --- app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app.js b/app.js index ba72a2f089..3c976a735a 100644 --- a/app.js +++ b/app.js @@ -79,5 +79,4 @@ app.listen(options.port, function() { console.log('Open MCT application running at localhost:' + options.port) }); - }()); From 2829b8d495407f9e4d6321c2e543d41527c4adea Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Tue, 10 May 2016 19:52:11 -0700 Subject: [PATCH 017/167] [Frontend] Time Conductor mobile open #889 - Major refactoring of mobile approach, leveraging flex-box layout change; --- .../res/sass/controls/_time-controller.scss | 221 +++++------------- .../templates/controls/time-controller.html | 55 ++--- 2 files changed, 83 insertions(+), 193 deletions(-) diff --git a/platform/commonUI/general/res/sass/controls/_time-controller.scss b/platform/commonUI/general/res/sass/controls/_time-controller.scss index bf6568508c..ba2cf5b3ee 100644 --- a/platform/commonUI/general/res/sass/controls/_time-controller.scss +++ b/platform/commonUI/general/res/sass/controls/_time-controller.scss @@ -25,7 +25,6 @@ { box-sizing: border-box; position: relative; - //top: auto; &:not(:first-child) { margin-top: $interiorMargin; } @@ -39,7 +38,8 @@ .l-time-range-inputs-holder { border-top: 1px solid $colorInteriorBorder; padding-top: $interiorMargin; - &.l-flex-row { + &.l-flex-row, + .l-flex-row { @include align-items(center); .flex-elem { height: auto; @@ -192,7 +192,7 @@ .l-time-domain-selector { position: absolute; right: 0px; - bottom: $r2H + $r3H + $interiorMargin; + top: $interiorMargin; } } @@ -206,172 +206,61 @@ /******************************************************************** MOBILE */ @include phoneandtablet { - .l-time-controller, .l-time-range-inputs-holder { - min-width: 0px; - } - - .l-time-controller { - - .l-time-domain-selector { - select { - height: 25px; - margin-bottom: 0px; - } - } - - .l-time-range-slider-holder, .l-time-range-ticks-holder { - display: none; - } - - .time-range-start, .time-range-end, { - width: 100%; - } - - .l-time-range-inputs-holder { - .l-time-range-input { - display: block; - .s-btn { - padding-right: 18px; - white-space: nowrap; - input { - width: 100%; - } - } - } - .l-time-range-inputs-elem { - - } - } - } + .l-time-controller { + min-width: 0; + .l-time-range-slider-holder, + .l-time-range-ticks-holder { + display: none; + } + } } @include phone { - .l-time-controller { - height: 48px; - - .l-time-range-inputs-holder { - bottom: 24px; - } - - .l-time-domain-selector { - width: 33%; - bottom: -9px; - } - - .l-time-range-inputs-holder { - .l-time-range-input { - margin-bottom: 5px; - .s-btn { - width: 66%; - } - } - .l-time-range-inputs-elem { - &.ui-symbol { - display: none; - } - - &.lbl { - width: 33%; - right: 0px; - top: 5px; - display: block; - height: 25px; - margin: 0; - line-height: 25px; - position: absolute; - } - } - } - } + .l-time-controller { + .l-time-range-inputs-holder { + &.l-flex-row, + .l-flex-row { + @include align-items(flex-start); + } + .l-time-range-inputs-elem { + &.type-icon { + margin-top: 3px; + } + } + .t-inputs-w { + @include flex-direction(column); + .l-time-range-input-w:not(:first-child) { + &:not(:first-child) { + margin-top: $interiorMargin; + } + margin-right: 0; + } + .l-time-range-inputs-elem { + &.lbl { display: none; } + } + } + } + } } -@include tablet { - .l-time-controller { - height: 17px; - - .l-time-range-inputs-holder { - bottom: -7px; - left: -5px; - } - - .l-time-domain-selector { - width: 23%; - right: -4px; - bottom: -10px; - } - - .l-time-range-inputs-holder { - .l-time-range-input { - float: left; - .s-btn { - width: 100%; - padding-left: 4px; - } - } - } - } -} - -@include tabletLandscape { - .l-time-controller { - height: 17px; - - .l-time-range-inputs-holder { - bottom: -7px; - } - - .l-time-domain-selector { - width: 23%; - right: auto; - bottom: -10px; - left: 391px; - } - - .l-time-range-inputs-holder { - .l-time-range-inputs-elem { - &.ui-symbol, &.lbl { - display: block; - float: left; - line-height: 25px; - } - } - } - } - - .pane-tree-hidden .l-time-controller { - .l-time-domain-selector { - left: 667px; - } - .l-time-range-inputs-holder { - padding-left: 277px; - } - } -} -@include tabletPortrait { - .l-time-controller { - height: 17px; - - .l-time-range-inputs-holder { - bottom: -7px; - left: -5px; - } - - .l-time-domain-selector { - width: 23%; - right: -4px; - bottom: -10px; - } - - .l-time-range-inputs-holder { - .l-time-range-input { - width: 38%; - float: left; - } - .l-time-range-inputs-elem { - &.ui-symbol, &.lbl { - display: none; - } - } - } - } +@include phonePortrait { + .l-time-controller { + .l-time-range-inputs-holder { + .t-inputs-w { + @include flex(1 1 auto); + padding-top: 25px; // Make room for the ever lovin' Time Domain Selector + .flex-elem { + @include flex(1 1 auto); + width: 100%; + } + input[type="text"] { + width: 100%; + } + } + } + } + .l-time-domain-selector { + right: auto; + left: 20px; + } } diff --git a/platform/commonUI/general/res/templates/controls/time-controller.html b/platform/commonUI/general/res/templates/controls/time-controller.html index 3ac4542644..cd36236358 100644 --- a/platform/commonUI/general/res/templates/controls/time-controller.html +++ b/platform/commonUI/general/res/templates/controls/time-controller.html @@ -23,34 +23,35 @@
C - - - + + + + + + + to + + + + + - - to - - - - - - From 73c2c01def9b063ca444bf2b1be42a2d7386fede Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 11 May 2016 11:32:39 -0700 Subject: [PATCH 018/167] [Frontend] Layout and styling of Time Conductor open #889 open #298 Fixes for mobile; Moved popup z-index def into sass; Datetime picker compressed for better fit in mobile phone; Removed hours selector from datetime picker to enable better fit in mobile; --- .../commonUI/general/res/sass/_archetypes.scss | 5 +++++ .../general/res/sass/controls/_controls.scss | 14 +++++++++++++- .../res/templates/controls/datetime-field.html | 3 +-- .../commonUI/general/src/directives/MCTPopup.js | 5 +---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/platform/commonUI/general/res/sass/_archetypes.scss b/platform/commonUI/general/res/sass/_archetypes.scss index 84045c2520..4abad717ea 100644 --- a/platform/commonUI/general/res/sass/_archetypes.scss +++ b/platform/commonUI/general/res/sass/_archetypes.scss @@ -145,3 +145,8 @@ .flex-justify-end { @include justify-content(flex-end); } + +/********************************************* POPUPS */ +.t-popup { + z-index: 75; +} diff --git a/platform/commonUI/general/res/sass/controls/_controls.scss b/platform/commonUI/general/res/sass/controls/_controls.scss index 6374efaaa0..51f35b505e 100644 --- a/platform/commonUI/general/res/sass/controls/_controls.scss +++ b/platform/commonUI/general/res/sass/controls/_controls.scss @@ -434,7 +434,6 @@ body.desktop .object-header { @include user-select(none); font-size: 0.8rem; padding: $interiorMarginLg !important; - width: 230px; .l-month-year-pager { $pagerW: 20px; height: $r1H; @@ -526,6 +525,19 @@ body.desktop .object-header { } } +@include phone { + .l-datetime-picker { + padding: $interiorMargin !important; + } + .l-calendar { + ul.l-cal-row { + li { + padding: 2px $interiorMargin; + } + } + } +} + /******************************************************** TEXTAREA */ textarea { @include nice-textarea($colorInputBg, $colorInputFg); diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index e890843754..47551fa25b 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -37,8 +37,7 @@
+ field="'value'">
diff --git a/platform/commonUI/general/src/directives/MCTPopup.js b/platform/commonUI/general/src/directives/MCTPopup.js index e96c1c0327..f1c6ca79d6 100644 --- a/platform/commonUI/general/src/directives/MCTPopup.js +++ b/platform/commonUI/general/src/directives/MCTPopup.js @@ -49,10 +49,7 @@ define( position = [ rect.left, rect.top ], popup = popupService.display(div, position); - // TODO: Handle in CSS; - // https://github.com/nasa/openmctweb/issues/298 - div.css('z-index', 75); - + div.addClass('t-popup'); transclude(function (clone) { div.append(clone); }); From 3d891073dab9b1f109c105294a7d51274b658952 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 11 May 2016 14:25:23 -0700 Subject: [PATCH 019/167] [Popup] Add method to jqlite mocks ...to resolve build failure preventing merge, https://github.com/nasa/openmct/pull/922#issuecomment-218588876 --- .../commonUI/general/test/directives/MCTPopupSpec.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/general/test/directives/MCTPopupSpec.js b/platform/commonUI/general/test/directives/MCTPopupSpec.js index bfe6b469cb..9893e85b30 100644 --- a/platform/commonUI/general/test/directives/MCTPopupSpec.js +++ b/platform/commonUI/general/test/directives/MCTPopupSpec.js @@ -24,7 +24,15 @@ define( ["../../src/directives/MCTPopup"], function (MCTPopup) { - var JQLITE_METHODS = [ "on", "off", "find", "parent", "css", "append" ]; + var JQLITE_METHODS = [ + "on", + "off", + "find", + "parent", + "css", + "addClass", + "append" + ]; describe("The mct-popup directive", function () { var mockCompile, From 70a13a75d5fde20d5b459c72e8b066f3c655da76 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 17 May 2016 13:22:15 -0700 Subject: [PATCH 020/167] Updating tutorials --- docs/src/tutorials/index.md | 655 ++++++++++++++++++++++++------------ 1 file changed, 434 insertions(+), 221 deletions(-) diff --git a/docs/src/tutorials/index.md b/docs/src/tutorials/index.md index 2ebc32b957..7a7f74a166 100644 --- a/docs/src/tutorials/index.md +++ b/docs/src/tutorials/index.md @@ -62,74 +62,19 @@ At this point, it will also be useful to branch off of Open MCT v0.6.2 git branch open-v0.6.2 git checkout -### Configuring Persistence -In its default configuration, Open MCT will try to use ElasticSearch -(expected to be deployed at /elastic on the same HTTP server running Open MCT -Web) to persist user-created domain objects. We don't need that for these -tutorials, so we will replace the ElasticSearch plugin with the example -persistence plugin. This doesn't actually persist, so anything we create within -Open MCT will be lost on reload, but that's fine for purposes of these -tutorials. +### Building Open MCT +Once downloaded, Open MCT can be built with the following command: -To change this configuration, edit bundles.json (at the top level of the Open -MCT Web repository) and replace platform/persistence/elastic with -example/persistence. + npm install -#### Bundle Before -```diff -[ - "platform/framework", - "platform/core", - "platform/representation", - "platform/commonUI/about", - "platform/commonUI/browse", - "platform/commonUI/edit", - "platform/commonUI/dialog", - "platform/commonUI/general", - "platform/containment", - "platform/telemetry", - "platform/features/layout", - "platform/features/pages", - "platform/features/plot", - "platform/features/scrolling", - "platform/forms", - "platform/persistence/queue", -- "platform/persistence/elastic", - "platform/policy", +This will install various dependencies, build CSS from Sass files, run tests, +and lint the source code. - "example/generator" -] -``` -__bundles.json__ +It's not necessary to do this after every code change, unless you are making +changes to stylesheets, or you are running the minified version of the app +(under `dist`). -#### Bundle After -```diff -[ - "platform/framework", - "platform/core", - "platform/representation", - "platform/commonUI/about", - "platform/commonUI/browse", - "platform/commonUI/edit", - "platform/commonUI/dialog", - "platform/commonUI/general", - "platform/containment", - "platform/telemetry", - "platform/features/layout", - "platform/features/pages", - "platform/features/plot", - "platform/features/scrolling", - "platform/forms", - "platform/persistence/queue", - "platform/policy", - -+ "example/persistence", - "example/generator" -] -``` -__bundles.json__ - ### Run a Web Server The next step is to run a web server so that you can view the Open MCT @@ -140,7 +85,7 @@ should not be used in a production environment To run the tutorial web server - node app.js + npm start ### Viewing in Browser @@ -176,7 +121,7 @@ they need to do. This is modelled after the to-do lists at http://todomvc.com/. The first step to adding a new feature to Open MCT is to create the plugin which will expose that feature. A plugin in Open MCT is represented by what is called a bundle; a bundle, in turn, is a directory which contains a file -bundle.json, which in turn describes where other relevant sources & resources +bundle.js, which in turn describes where other relevant sources & resources will be. The syntax of this file is described in more detail in the Open MCT Developer Guide. @@ -185,74 +130,203 @@ to this plugin as tutorials/todo as well.) We will start with an "empty bundle", one which exposes no extensions - which looks like: ```diff -{ - "name": "To-do Plugin", - "description": "Allows creating and editing to-do lists.", - "extensions": { - } -} +define([ + 'legacyRegistry' +], function ( + legacyRegistry +) { + legacyRegistry.register("tutorials/todo", { + "name": "To-do Plugin", + "description": "Allows creating and editing to-do lists.", + "extensions": + { + } + }); +}); + ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ -We will also include this in our list of active bundles. +With the new bundle defined, it is now necessary to register the bundle with +the application. The details of how a new bundle is defined are in the +process of changing. The Open MCT codebase has started to shift from a +declarative registration style toward an imperative registration style. +The tutorials will be updated with the new bundle registration mechanism once it +has been finalized. #### Before ```diff -[ - "platform/framework", - "platform/core", - "platform/representation", - "platform/commonUI/about", - "platform/commonUI/browse", - "platform/commonUI/edit", - "platform/commonUI/dialog", - "platform/commonUI/general", - "platform/containment", - "platform/telemetry", - "platform/features/layout", - "platform/features/pages", - "platform/features/plot", - "platform/features/scrolling", - "platform/forms", - "platform/persistence/queue", - "platform/policy", +requirejs.config({ + "paths": { + "legacyRegistry": "src/legacyRegistry", + "angular": "bower_components/angular/angular.min", + "angular-route": "bower_components/angular-route/angular-route.min", + "csv": "bower_components/comma-separated-values/csv.min", + "es6-promise": "bower_components/es6-promise/promise.min", + "moment": "bower_components/moment/moment", + "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", + "saveAs": "bower_components/FileSaver.js/FileSaver.min", + "screenfull": "bower_components/screenfull/dist/screenfull.min", + "text": "bower_components/text/text", + "uuid": "bower_components/node-uuid/uuid", + "zepto": "bower_components/zepto/zepto.min" + }, + "shim": { + "angular": { + "exports": "angular" + }, + "angular-route": { + "deps": [ "angular" ] + }, + "moment-duration-format": { + "deps": [ "moment" ] + }, + "screenfull": { + "exports": "screenfull" + }, + "zepto": { + "exports": "Zepto" + } + } +}); - "example/persistence", - "example/generator" -] +define([ + './platform/framework/src/Main', + 'legacyRegistry', + + './platform/framework/bundle', + './platform/core/bundle', + './platform/representation/bundle', + './platform/commonUI/about/bundle', + './platform/commonUI/browse/bundle', + './platform/commonUI/edit/bundle', + './platform/commonUI/dialog/bundle', + './platform/commonUI/formats/bundle', + './platform/commonUI/general/bundle', + './platform/commonUI/inspect/bundle', + './platform/commonUI/mobile/bundle', + './platform/commonUI/themes/espresso/bundle', + './platform/commonUI/notification/bundle', + './platform/containment/bundle', + './platform/execution/bundle', + './platform/exporters/bundle', + './platform/telemetry/bundle', + './platform/features/clock/bundle', + './platform/features/imagery/bundle', + './platform/features/layout/bundle', + './platform/features/pages/bundle', + './platform/features/plot/bundle', + './platform/features/timeline/bundle', + './platform/features/table/bundle', + './platform/forms/bundle', + './platform/identity/bundle', + './platform/persistence/aggregator/bundle', + './platform/persistence/local/bundle', + './platform/persistence/queue/bundle', + './platform/policy/bundle', + './platform/entanglement/bundle', + './platform/search/bundle', + './platform/status/bundle', + './platform/commonUI/regions/bundle' +], function (Main, legacyRegistry) { + return { + legacyRegistry: legacyRegistry, + run: function () { + return new Main().run(legacyRegistry); + } + }; +}); ``` -__bundles.json__ +__main.js__ #### After ```diff -[ - "platform/framework", - "platform/core", - "platform/representation", - "platform/commonUI/about", - "platform/commonUI/browse", - "platform/commonUI/edit", - "platform/commonUI/dialog", - "platform/commonUI/general", - "platform/containment", - "platform/telemetry", - "platform/features/layout", - "platform/features/pages", - "platform/features/plot", - "platform/features/scrolling", - "platform/forms", - "platform/persistence/queue", - "platform/policy", +requirejs.config({ + "paths": { + "legacyRegistry": "src/legacyRegistry", + "angular": "bower_components/angular/angular.min", + "angular-route": "bower_components/angular-route/angular-route.min", + "csv": "bower_components/comma-separated-values/csv.min", + "es6-promise": "bower_components/es6-promise/promise.min", + "moment": "bower_components/moment/moment", + "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", + "saveAs": "bower_components/FileSaver.js/FileSaver.min", + "screenfull": "bower_components/screenfull/dist/screenfull.min", + "text": "bower_components/text/text", + "uuid": "bower_components/node-uuid/uuid", + "zepto": "bower_components/zepto/zepto.min" + }, + "shim": { + "angular": { + "exports": "angular" + }, + "angular-route": { + "deps": [ "angular" ] + }, + "moment-duration-format": { + "deps": [ "moment" ] + }, + "screenfull": { + "exports": "screenfull" + }, + "zepto": { + "exports": "Zepto" + } + } +}); - "example/persistence", - "example/generator", +define([ + './platform/framework/src/Main', + 'legacyRegistry', -+ "tutorials/todo" -] + './platform/framework/bundle', + './platform/core/bundle', + './platform/representation/bundle', + './platform/commonUI/about/bundle', + './platform/commonUI/browse/bundle', + './platform/commonUI/edit/bundle', + './platform/commonUI/dialog/bundle', + './platform/commonUI/formats/bundle', + './platform/commonUI/general/bundle', + './platform/commonUI/inspect/bundle', + './platform/commonUI/mobile/bundle', + './platform/commonUI/themes/espresso/bundle', + './platform/commonUI/notification/bundle', + './platform/containment/bundle', + './platform/execution/bundle', + './platform/exporters/bundle', + './platform/telemetry/bundle', + './platform/features/clock/bundle', + './platform/features/imagery/bundle', + './platform/features/layout/bundle', + './platform/features/pages/bundle', + './platform/features/plot/bundle', + './platform/features/timeline/bundle', + './platform/features/table/bundle', + './platform/forms/bundle', + './platform/identity/bundle', + './platform/persistence/aggregator/bundle', + './platform/persistence/local/bundle', + './platform/persistence/queue/bundle', + './platform/policy/bundle', + './platform/entanglement/bundle', + './platform/search/bundle', + './platform/status/bundle', + './platform/commonUI/regions/bundle', + ++ './tutorials/todo/bundle' +], function (Main, legacyRegistry) { + return { + legacyRegistry: legacyRegistry, + run: function () { + return new Main().run(legacyRegistry); + } + }; +}); ``` -__bundles.json__ +__main.js__ At this point, we can reload Open MCT. We haven't introduced any new functionality, so we don't see anything different, but if we run with logging @@ -275,11 +349,17 @@ In the case of our to-do list feature, the to-do list itself is the thing we'll want users to be able to create and edit. So, we will add that as a new type in our bundle definition: ```diff -{ - "name": "To-do Plugin", - "description": "Allows creating and editing to-do lists.", - "extensions": { -+ "types": [ +define([ + 'legacyRegistry' +], function ( + legacyRegistry +) { + legacyRegistry.register("tutorials/todo", { + "name": "To-do Plugin", + "description": "Allows creating and editing to-do lists.", + "extensions": + { ++ "types": [ + { + "key": "example.todo", + "name": "To-Do List", @@ -287,11 +367,12 @@ our bundle definition: + "description": "A list of things that need to be done.", + "features": ["creation"] + } - ] - } -} + } + }); +}); + ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ What have we done here? We've stated that this bundle includes extensions of the category _types_, which is used to describe domain object types. Then, we've @@ -366,7 +447,12 @@ To expose this view in Open MCT, we need to declare it in our bundle definition: ```diff -{ +define([ + 'legacyRegistry' +], function ( + legacyRegistry +) { + legacyRegistry.register("tutorials/todo", { "name": "To-do Plugin", "description": "Allows creating and editing to-do lists.", "extensions": { @@ -389,9 +475,10 @@ definition: + } + ] } -} + }); +}); ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ Here, we've added another extension, this time belonging to category `views`. It contains the following properties: @@ -416,7 +503,12 @@ will specify an initial state for To-do List domain object models in the definition of that type. ```diff -{ +define([ + 'legacyRegistry' +], function ( + legacyRegistry +) { + legacyRegistry.register("tutorials/todo", { "name": "To-do Plugin", "description": "Allows creating and editing to-do lists.", "extensions": { @@ -445,9 +537,10 @@ definition of that type. } ] } -} + }); +}); ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ Now, when To-do List objects are created in Open MCT, they will initially have the state described by that model property. @@ -580,7 +673,14 @@ If we were to try to run at this point, we'd run into problems because the it in our bundle definition, as an extension of category `controllers`: ```diff -{ +define([ + 'legacyRegistry', + './controllers/TodoController' +], function ( + legacyRegistry, + TodoController +) { + legacyRegistry.register("tutorials/todo", { "name": "To-do Plugin", "description": "Allows creating and editing to-do lists.", "extensions": { @@ -611,14 +711,15 @@ it in our bundle definition, as an extension of category `controllers`: + "controllers": [ + { + "key": "TodoController", -+ "implementation": "controllers/TodoController.js", ++ "implementation": TodoController, + "depends": [ "$scope" ] + } + ] } -} + }); +}); ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ In this extension definition we have: @@ -665,7 +766,14 @@ view. The contents of this tool bar are defined declaratively in a view's extension definition. ```diff -{ +define([ + 'legacyRegistry', + './controllers/TodoController' +], function ( + legacyRegistry, + TodoController +) { + legacyRegistry.register("tutorials/todo", { "name": "To-do Plugin", "description": "Allows creating and editing to-do lists.", "extensions": { @@ -719,14 +827,15 @@ extension definition. "controllers": [ { "key": "TodoController", - "implementation": "controllers/TodoController.js", + "implementation": TodoController, "depends": [ "$scope" ] } ] } -} + }); +}); ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ What we've stated here is that the To-Do List's view will have a toolbar which contains two sections (which will be visually separated by a divider), each of @@ -884,7 +993,14 @@ __tutorials/todo/res/templates/todo.html__ Finally, the `TodoController` uses the `dialogService` now, so we need to declare that dependency in its extension definition: ```diff -{ +define([ + 'legacyRegistry', + './controllers/TodoController' +], function ( + legacyRegistry, + TodoController +) { + legacyRegistry.register("tutorials/todo", { "name": "To-do Plugin", "description": "Allows creating and editing to-do lists.", "extensions": { @@ -938,14 +1054,15 @@ declare that dependency in its extension definition: "controllers": [ { "key": "TodoController", - "implementation": "controllers/TodoController.js", + "implementation": TodoController, + "depends": [ "$scope", "dialogService" ] } ] } -} + }); +}); ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ If we now reload Open MCT, we'll be able to see the new functionality we've added. If we Create a new To-Do List, navigate to it, and click the button with @@ -1140,7 +1257,14 @@ To include this CSS file in our running instance of Open MCT, we need to declare it in our bundle definition, this time as an extension of category `stylesheets`: ```diff -{ +define([ + 'legacyRegistry', + './controllers/TodoController' +], function ( + legacyRegistry, + TodoController +) { + legacyRegistry.register("tutorials/todo", { "name": "To-do Plugin", "description": "Allows creating and editing to-do lists.", "extensions": { @@ -1191,7 +1315,7 @@ declare it in our bundle definition, this time as an extension of category "controllers": [ { "key": "TodoController", - "implementation": "controllers/TodoController.js", + "implementation": TodoController, "depends": [ "$scope", "dialogService" ] } ], @@ -1201,9 +1325,10 @@ declare it in our bundle definition, this time as an extension of category + } + ] } -} + }); +}); ``` -__tutorials/todo/bundle.json__ +__tutorials/todo/bundle.js__ Note that we've also removed our placeholder tasks from the `model` of the To-Do List's type above; now To-Do Lists will start off empty. @@ -1270,7 +1395,12 @@ well. We'll be creating this plugin in `tutorials/bargraph`, so our initial bundle definition looks like: ```diff -{ +define([ + 'legacyRegistry' +], function ( + legacyRegistry +) { + legacyRegistry.register("tutorials/bargraph", { "name": "Bar Graph", "description": "Provides the Bar Graph view of telemetry elements.", "extensions": { @@ -1290,10 +1420,11 @@ bundle definition looks like: } ] } -} + }); +}); ``` -__tutorials/bargraph/bundle.json__ +__tutorials/bargraph/bundle.js__ The view definition should look familiar after the To-Do List tutorial, with some additions: @@ -1435,7 +1566,7 @@ The corresponding CSS file which styles and positions these elements: ``` __tutorials/bargraph/res/css/bargraph.css__ -This is already enough that, if we add `"tutorials/bargraph"` to `bundles.json`, +This is already enough that, if we add `"tutorials/bargraph"` to `main.js`, we should be able to run Open MCT and see our Bar Graph as an available view for domain objects which provide telemetry (such as the example _Sine Wave Generator_) as well as for _Telemetry Panel_ objects: @@ -1563,7 +1694,14 @@ depends declaration includes both `$scope` as well as the `telemetryHandler` service we made use of. ```diff -{ +define([ + 'legacyRegistry', + './controllers/BarGraphController' +], function ( + legacyRegistry, + BarGraphController +) { + legacyRegistry.register("tutorials/bargraph", { "name": "Bar Graph", "description": "Provides the Bar Graph view of telemetry elements.", "extensions": { @@ -1585,14 +1723,15 @@ service we made use of. + "controllers": [ + { + "key": "BarGraphController", -+ "implementation": "controllers/BarGraphController.js", ++ "implementation": BarGraphController, + "depends": [ "$scope", "telemetryHandler" ] + } + ] } -} + }); +}); ``` -__tutorials/bargraph/bundle.json__ +__tutorials/bargraph/bundle.js__ When we reload Open MCT, we are now able to see that our bar graph view correctly labels one bar per telemetry-providing domain object, as shown for @@ -1721,7 +1860,14 @@ when we return to our view later, those changes will be persisted. First, let's add a tool bar for changing these three values in Edit mode: ```diff -{ +define([ + 'legacyRegistry', + './controllers/BarGraphController' +], function ( + legacyRegistry, + BarGraphController +) { + legacyRegistry.register("tutorials/bargraph", { "name": "Bar Graph", "description": "Provides the Bar Graph view of telemetry elements.", "extensions": { @@ -1772,14 +1918,15 @@ First, let's add a tool bar for changing these three values in Edit mode: "controllers": [ { "key": "BarGraphController", - "implementation": "controllers/BarGraphController.js", + "implementation": BarGraphController, "depends": [ "$scope", "telemetryHandler" ] } ] } -} + }); +}); ``` -__tutorials/bargraph/bundle.json__ +__tutorials/bargraph/bundle.js__ As we saw in to To-Do List plugin, a tool bar needs either a selected object or a view proxy to work from. We will add this to our controller, and additionally @@ -2192,7 +2339,12 @@ add a top-level object which will serve as a container; in the next step, we will populate this with the contents of the telemetry dictionary (which we will retrieve from the server.) - { +define([ + 'legacyRegistry' +], function ( + legacyRegistry +) { + legacyRegistry.register("tutorials/telemetry", { "name": "Example Telemetry Adapter", "extensions": { "types": [ @@ -2214,8 +2366,9 @@ will retrieve from the server.) } ] } - } -__tutorials/telemetry/bundle.json__ + }); +}); +__tutorials/telemetry/bundle.js__ Here, we've created our initial telemetry plugin. This exposes a new domain object type (the "Spacecraft", which will be represented by the contents of the @@ -2226,55 +2379,91 @@ preferred so that this shows up near the top, instead of below My Items. If we include this in our set of active bundles: ```diff -[ - "platform/framework", - "platform/core", - "platform/representation", - "platform/commonUI/about", - "platform/commonUI/browse", - "platform/commonUI/edit", - "platform/commonUI/dialog", - "platform/commonUI/general", - "platform/containment", - "platform/telemetry", - "platform/features/layout", - "platform/features/pages", - "platform/features/plot", - "platform/features/scrolling", - "platform/forms", - "platform/persistence/queue", - "platform/policy", +requirejs.config({ + "paths": { + "legacyRegistry": "src/legacyRegistry", + "angular": "bower_components/angular/angular.min", + "angular-route": "bower_components/angular-route/angular-route.min", + "csv": "bower_components/comma-separated-values/csv.min", + "es6-promise": "bower_components/es6-promise/promise.min", + "moment": "bower_components/moment/moment", + "moment-duration-format": "bower_components/moment-duration-format/lib/moment-duration-format", + "saveAs": "bower_components/FileSaver.js/FileSaver.min", + "screenfull": "bower_components/screenfull/dist/screenfull.min", + "text": "bower_components/text/text", + "uuid": "bower_components/node-uuid/uuid", + "zepto": "bower_components/zepto/zepto.min" + }, + "shim": { + "angular": { + "exports": "angular" + }, + "angular-route": { + "deps": [ "angular" ] + }, + "moment-duration-format": { + "deps": [ "moment" ] + }, + "screenfull": { + "exports": "screenfull" + }, + "zepto": { + "exports": "Zepto" + } + } +}); - "example/persistence", - "example/generator" -] -[ - "platform/framework", - "platform/core", - "platform/representation", - "platform/commonUI/about", - "platform/commonUI/browse", - "platform/commonUI/edit", - "platform/commonUI/dialog", - "platform/commonUI/general", - "platform/containment", - "platform/telemetry", - "platform/features/layout", - "platform/features/pages", - "platform/features/plot", - "platform/features/scrolling", - "platform/forms", - "platform/persistence/queue", - "platform/policy", +define([ + './platform/framework/src/Main', + 'legacyRegistry', - "example/persistence", - "example/generator", - -+ "tutorials/telemetry" -] + './platform/framework/bundle', + './platform/core/bundle', + './platform/representation/bundle', + './platform/commonUI/about/bundle', + './platform/commonUI/browse/bundle', + './platform/commonUI/edit/bundle', + './platform/commonUI/dialog/bundle', + './platform/commonUI/formats/bundle', + './platform/commonUI/general/bundle', + './platform/commonUI/inspect/bundle', + './platform/commonUI/mobile/bundle', + './platform/commonUI/themes/espresso/bundle', + './platform/commonUI/notification/bundle', + './platform/containment/bundle', + './platform/execution/bundle', + './platform/exporters/bundle', + './platform/telemetry/bundle', + './platform/features/clock/bundle', + './platform/features/imagery/bundle', + './platform/features/layout/bundle', + './platform/features/pages/bundle', + './platform/features/plot/bundle', + './platform/features/timeline/bundle', + './platform/features/table/bundle', + './platform/forms/bundle', + './platform/identity/bundle', + './platform/persistence/aggregator/bundle', + './platform/persistence/local/bundle', + './platform/persistence/queue/bundle', + './platform/policy/bundle', + './platform/entanglement/bundle', + './platform/search/bundle', + './platform/status/bundle', + './platform/commonUI/regions/bundle', + ++ './tutorials/telemetry/bundle' +], function (Main, legacyRegistry) { + return { + legacyRegistry: legacyRegistry, + run: function () { + return new Main().run(legacyRegistry); + } + }; +}); ``` -__bundles.json__ +__main.js__ ...we will be able to reload Open MCT and see that it is present: @@ -2534,12 +2723,23 @@ name to match what was in the dictionary, and set its `composition` to an array of domain object identifiers for all subsystems contained in the dictionary (using the same identifier prefix as before.) -Finally, we wire in these changes by modifying our plugin's `bundle.json` to +Finally, we wire in these changes by modifying our plugin's `bundle.js` to provide metadata about how these pieces interact (both with each other, and with the platform): ```diff -{ +define([ + 'legacyRegistry', + './ExampleTelemetryServerAdapter', + './ExampleTelemetryInitializer', + './ExampleTelemetryModelProvider' +], function ( + legacyRegistry, + ExampleTelemetryServerAdapter, + ExampleTelemetryInitializer, + ExampleTelemetryModelProvider +) { + legacyRegistry.register("tutorials/telemetry", { "name": "Example Telemetry Adapter", "extensions": { "types": [ @@ -2584,7 +2784,7 @@ with the platform): + "services": [ + { + "key": "example.adapter", -+ "implementation": "ExampleTelemetryServerAdapter.js", ++ "implementation": ExampleTelemetryServerAdapter, + "depends": [ "$q", "EXAMPLE_WS_URL" ] + } + ], @@ -2597,7 +2797,7 @@ with the platform): + ], + "runs": [ + { -+ "implementation": "ExampleTelemetryInitializer.js", ++ "implementation": ExampleTelemetryInitializer, + "depends": [ "example.adapter", "objectService" ] + } + ], @@ -2605,14 +2805,15 @@ with the platform): + { + "provides": "modelService", + "type": "provider", -+ "implementation": "ExampleTelemetryModelProvider.js", ++ "implementation": ExampleTelemetryModelProvider, + "depends": [ "example.adapter", "$q" ] + } + ] - } -} + } + }); +}); ``` -__tutorials/telemetry/bundle.json__ +__tutorials/telemetry/bundle.js__ A summary of what we've added here: @@ -2843,7 +3044,18 @@ it with the interface expected by the platform (the methods shown.) Finally, we expose this `telemetryService` provider declaratively: ```diff -{ +define([ + 'legacyRegistry', + './ExampleTelemetryServerAdapter', + './ExampleTelemetryInitializer', + './ExampleTelemetryModelProvider' +], function ( + legacyRegistry, + ExampleTelemetryServerAdapter, + ExampleTelemetryInitializer, + ExampleTelemetryModelProvider +) { + legacyRegistry.register("tutorials/telemetry", { "name": "Example Telemetry Adapter", "extensions": { "types": [ @@ -2919,10 +3131,11 @@ Finally, we expose this `telemetryService` provider declaratively: + "depends": [ "example.adapter", "$q" ] + } ] - } -} + } + }); +}); ``` -__tutorials/telemetry/bundle.json__ +__tutorials/telemetry/bundle.js__ Now, if we navigate to one of our numeric measurements, we should see a plot of its historical telemetry: From 5eff4e45c9c585b881ae33f43ad0f8890ac3724f Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 17 May 2016 17:24:32 -0700 Subject: [PATCH 021/167] [Tutorials] #907 Updated tutorials to use new bundle registration mechanism --- docs/src/tutorials/index.md | 73 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/docs/src/tutorials/index.md b/docs/src/tutorials/index.md index 7a7f74a166..84c571bec8 100644 --- a/docs/src/tutorials/index.md +++ b/docs/src/tutorials/index.md @@ -363,11 +363,11 @@ define([ + { + "key": "example.todo", + "name": "To-Do List", -+ "glyph": "j", ++ "glyph": "2", + "description": "A list of things that need to be done.", + "features": ["creation"] + } - } ++ ]} }); }); @@ -460,7 +460,7 @@ define([ { "key": "example.todo", "name": "To-Do List", - "glyph": "j", + "glyph": "2", "description": "A list of things that need to be done.", "features": ["creation"] } @@ -469,9 +469,10 @@ define([ + { + "key": "example.todo", + "type": "example.todo", -+ "glyph": "j", ++ "glyph": "2", + "name": "List", -+ "templateUrl": "templates/todo.html" ++ "templateUrl": "templates/todo.html", ++ "editable": true + } + ] } @@ -516,7 +517,7 @@ define([ { "key": "example.todo", "name": "To-Do List", - "glyph": "j", + "glyph": "2", "description": "A list of things that need to be done.", "features": ["creation"], + "model": { @@ -531,9 +532,10 @@ define([ { "key": "example.todo", "type": "example.todo", - "glyph": "j", + "glyph": "2", "name": "List", - "templateUrl": "templates/todo.html" + "templateUrl": "templates/todo.html", + "editable": true } ] } @@ -675,7 +677,7 @@ it in our bundle definition, as an extension of category `controllers`: ```diff define([ 'legacyRegistry', - './controllers/TodoController' + './src/controllers/TodoController' ], function ( legacyRegistry, TodoController @@ -688,7 +690,7 @@ define([ { "key": "example.todo", "name": "To-Do List", - "glyph": "j", + "glyph": "2", "description": "A list of things that need to be done.", "features": ["creation"], "model": { @@ -703,9 +705,10 @@ define([ { "key": "example.todo", "type": "example.todo", - "glyph": "j", + "glyph": "2", "name": "List", - "templateUrl": "templates/todo.html" + "templateUrl": "templates/todo.html", + "editable": true } ], + "controllers": [ @@ -768,7 +771,7 @@ extension definition. ```diff define([ 'legacyRegistry', - './controllers/TodoController' + './src/controllers/TodoController' ], function ( legacyRegistry, TodoController @@ -781,7 +784,7 @@ define([ { "key": "example.todo", "name": "To-Do List", - "glyph": "j", + "glyph": "2", "description": "A list of things that need to be done.", "features": ["creation"], "model": { @@ -796,9 +799,10 @@ define([ { "key": "example.todo", "type": "example.todo", - "glyph": "j", + "glyph": "2", "name": "List", "templateUrl": "templates/todo.html", + "editable": true, + "toolbar": { + "sections": [ + { @@ -995,7 +999,7 @@ declare that dependency in its extension definition: ```diff define([ 'legacyRegistry', - './controllers/TodoController' + './src/controllers/TodoController' ], function ( legacyRegistry, TodoController @@ -1008,7 +1012,7 @@ define([ { "key": "example.todo", "name": "To-Do List", - "glyph": "j", + "glyph": "2", "description": "A list of things that need to be done.", "features": ["creation"], "model": { @@ -1023,9 +1027,10 @@ define([ { "key": "example.todo", "type": "example.todo", - "glyph": "j", + "glyph": "2", "name": "List", "templateUrl": "templates/todo.html", + "editable": true, "toolbar": { "sections": [ { @@ -1259,7 +1264,7 @@ declare it in our bundle definition, this time as an extension of category ```diff define([ 'legacyRegistry', - './controllers/TodoController' + './src/controllers/TodoController' ], function ( legacyRegistry, TodoController @@ -1272,7 +1277,7 @@ define([ { "key": "example.todo", "name": "To-Do List", - "glyph": "j", + "glyph": "2", "description": "A list of things that need to be done.", "features": ["creation"], "model": { @@ -1284,9 +1289,10 @@ define([ { "key": "example.todo", "type": "example.todo", - "glyph": "j", + "glyph": "2", "name": "List", "templateUrl": "templates/todo.html", + "editable": true, "toolbar": { "sections": [ { @@ -1334,6 +1340,7 @@ Note that we've also removed our placeholder tasks from the `model` of the To-Do List's type above; now To-Do Lists will start off empty. Finally, let's utilize these changes from our view's template: + ```diff +
+
@@ -1641,7 +1648,7 @@ telemetry objects in view, as well as the width for each bar. We will also utilize this from our template: ```diff -
++
+
+
Date: Thu, 12 May 2016 19:12:00 -0700 Subject: [PATCH 022/167] [New Edit Mode] #633 Removed Editing workflow concerns from FixedController, LayoutController --- .../commonUI/edit/src/representers/EditRepresenter.js | 6 ------ platform/features/layout/bundle.js | 3 --- platform/features/layout/src/FixedController.js | 6 ++---- platform/features/layout/src/LayoutController.js | 8 ++------ 4 files changed, 4 insertions(+), 19 deletions(-) diff --git a/platform/commonUI/edit/src/representers/EditRepresenter.js b/platform/commonUI/edit/src/representers/EditRepresenter.js index a5d4af9b14..ffe7f24d11 100644 --- a/platform/commonUI/edit/src/representers/EditRepresenter.js +++ b/platform/commonUI/edit/src/representers/EditRepresenter.js @@ -91,14 +91,8 @@ define( } } - function setEditable(editableDomainObject) { - self.domainObject = editableDomainObject; - scope.model = editableDomainObject.getModel(); - } - // Place the "commit" method in the scope scope.commit = commit; - scope.setEditable = setEditable; // Clean up when the scope is destroyed scope.$on("$destroy", function () { diff --git a/platform/features/layout/bundle.js b/platform/features/layout/bundle.js index fa98fb94b2..21a0f8f263 100644 --- a/platform/features/layout/bundle.js +++ b/platform/features/layout/bundle.js @@ -71,9 +71,6 @@ define([ "uses": [ "composition" ], - "gestures": [ - "drop" - ], "toolbar": { "sections": [ { diff --git a/platform/features/layout/src/FixedController.js b/platform/features/layout/src/FixedController.js index b154f5f161..c8b5aebb2e 100644 --- a/platform/features/layout/src/FixedController.js +++ b/platform/features/layout/src/FixedController.js @@ -271,15 +271,13 @@ define( } // Position a panel after a drop event - function handleDrop(e, id, position, editableDomainObject) { + function handleDrop(e, id, position) { // Don't handle this event if it has already been handled // color is set to "" to let the CSS theme determine the default color if (e.defaultPrevented) { return; } - if (editableDomainObject) { - $scope.setEditable(editableDomainObject); - } + e.preventDefault(); // Store the position of this element. addElement({ diff --git a/platform/features/layout/src/LayoutController.js b/platform/features/layout/src/LayoutController.js index 496ee9d1a6..6d60738fc3 100644 --- a/platform/features/layout/src/LayoutController.js +++ b/platform/features/layout/src/LayoutController.js @@ -60,15 +60,11 @@ define( } // Position a panel after a drop event - //An editableDomainObject is provided, as the drop may have - // triggered a transition to edit mode. - function handleDrop(e, id, position, editableDomainObject) { + function handleDrop(e, id, position) { if (e.defaultPrevented) { return; } - if (editableDomainObject) { - $scope.setEditable(editableDomainObject); - } + // Ensure that configuration field is populated $scope.configuration = $scope.configuration || {}; // Make sure there is a "panels" field in the From fd9d766913f06cda4c9d5b0508f3c958d8a3edbf Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 20 May 2016 15:15:18 -0700 Subject: [PATCH 023/167] Defer resolution of scope in DropGesture --- platform/representation/src/gestures/DropGesture.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/representation/src/gestures/DropGesture.js b/platform/representation/src/gestures/DropGesture.js index 4c9d872f55..7f94dad223 100644 --- a/platform/representation/src/gestures/DropGesture.js +++ b/platform/representation/src/gestures/DropGesture.js @@ -40,12 +40,13 @@ define( */ function DropGesture(dndService, $q, element, domainObject) { var actionCapability = domainObject.getCapability('action'), - scope = element.scope && element.scope(), action; // Action for the drop, when it occurs function broadcastDrop(id, event) { // Find the relevant scope... - var rect; + var rect, + scope = element.scope && element.scope(); + if (scope && scope.$broadcast) { // Get the representation's bounds, to convert // drop position From 6e7f4df5e37da939b30e12afa97be9e98d02f5b7 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 20 May 2016 16:13:51 -0700 Subject: [PATCH 024/167] [Mobile] Remove usage of element.scope() Usage is unnecessary and is sensitive to initialization ordering of representations, resulting in #948. --- platform/commonUI/inspect/src/gestures/InfoButtonGesture.js | 6 ------ .../commonUI/inspect/test/gestures/InfoButtonGestureSpec.js | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/platform/commonUI/inspect/src/gestures/InfoButtonGesture.js b/platform/commonUI/inspect/src/gestures/InfoButtonGesture.js index 81a3fd9e84..045202aa7a 100644 --- a/platform/commonUI/inspect/src/gestures/InfoButtonGesture.js +++ b/platform/commonUI/inspect/src/gestures/InfoButtonGesture.js @@ -38,7 +38,6 @@ define( function InfoGestureButton($document, agentService, infoService, element, domainObject) { var dismissBubble, touchPosition, - scopeOff, body = $document.find('body'); function trackPosition(event) { @@ -94,10 +93,6 @@ define( element.on('click', showBubble); } - // Also make sure we dismiss bubble if representation is destroyed - // before the mouse actually leaves it - scopeOff = element.scope().$on('$destroy', hideBubble); - return { /** * Detach any event handlers associated with this gesture. @@ -109,7 +104,6 @@ define( hideBubble(); // ...and detach listeners element.off('click', showBubble); - scopeOff(); } }; } diff --git a/platform/commonUI/inspect/test/gestures/InfoButtonGestureSpec.js b/platform/commonUI/inspect/test/gestures/InfoButtonGestureSpec.js index 781bfd3769..5be65650cb 100644 --- a/platform/commonUI/inspect/test/gestures/InfoButtonGestureSpec.js +++ b/platform/commonUI/inspect/test/gestures/InfoButtonGestureSpec.js @@ -137,6 +137,11 @@ define( ); }); + // https://github.com/nasa/openmct/issues/948 + it("does not try to access scope", function () { + expect(mockElement.scope).not.toHaveBeenCalled(); + }); + }); } ); From 6c1412784b99e21a35d412c28e1914496648cbf1 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 20 May 2016 17:08:23 -0700 Subject: [PATCH 025/167] [Example] REMS heirarchy appear as links --- example/msl/src/RemsTelemetryModelProvider.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/example/msl/src/RemsTelemetryModelProvider.js b/example/msl/src/RemsTelemetryModelProvider.js index cf45b22d4e..c3f6f45374 100644 --- a/example/msl/src/RemsTelemetryModelProvider.js +++ b/example/msl/src/RemsTelemetryModelProvider.js @@ -45,11 +45,12 @@ define( function buildTaxonomy(dictionary){ var models = {}; - function addMeasurement(measurement){ + function addMeasurement(measurement, parent){ var format = FORMAT_MAPPINGS[measurement.type]; models[makeId(measurement)] = { type: "msl.measurement", name: measurement.name, + location: parent, telemetry: { key: measurement.identifier, ranges: [{ @@ -62,17 +63,24 @@ define( }; } - function addInstrument(subsystem) { - var measurements = (subsystem.measurements || []); - models[makeId(subsystem)] = { + function addInstrument(subsystem, spacecraftId) { + var measurements = (subsystem.measurements || []), + instrumentId = makeId(subsystem); + + models[instrumentId] = { type: "msl.instrument", name: subsystem.name, + location: spacecraftId, composition: measurements.map(makeId) }; - measurements.forEach(addMeasurement); + measurements.forEach(function(measurement) { + addMeasurement(measurement, instrumentId); + }); } - (dictionary.instruments || []).forEach(addInstrument); + (dictionary.instruments || []).forEach(function(instrument) { + addInstrument(instrument, "msl:curiosity"); + }); return models; } From 1ced47fc2c55f14b2fd338095b34c4dd10df9900 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 19 May 2016 16:26:30 -0700 Subject: [PATCH 026/167] [Navigation] Prevent navigation to orphan objects This is particularly useful when a persistence failure has caused a created object not to be added to its parent container. #765 --- platform/commonUI/browse/bundle.js | 10 + .../src/navigation/OrphanNavigationHandler.js | 75 ++++++++ .../navigation/OrphanNavigationHandlerSpec.js | 180 ++++++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 platform/commonUI/browse/src/navigation/OrphanNavigationHandler.js create mode 100644 platform/commonUI/browse/test/navigation/OrphanNavigationHandlerSpec.js diff --git a/platform/commonUI/browse/bundle.js b/platform/commonUI/browse/bundle.js index 73b3f44de7..b7cf2dca71 100644 --- a/platform/commonUI/browse/bundle.js +++ b/platform/commonUI/browse/bundle.js @@ -30,6 +30,7 @@ define([ "./src/navigation/NavigationService", "./src/creation/CreationPolicy", "./src/navigation/NavigateAction", + "./src/navigation/OrphanNavigationHandler", "./src/windowing/NewTabAction", "./src/windowing/FullscreenAction", "./src/creation/CreateActionProvider", @@ -59,6 +60,7 @@ define([ NavigationService, CreationPolicy, NavigateAction, + OrphanNavigationHandler, NewTabAction, FullscreenAction, CreateActionProvider, @@ -346,6 +348,14 @@ define([ "$rootScope", "$document" ] + }, + { + "implementation": OrphanNavigationHandler, + "depends": [ + "throttle", + "topic", + "navigationService" + ] } ], "licenses": [ diff --git a/platform/commonUI/browse/src/navigation/OrphanNavigationHandler.js b/platform/commonUI/browse/src/navigation/OrphanNavigationHandler.js new file mode 100644 index 0000000000..00b3182e42 --- /dev/null +++ b/platform/commonUI/browse/src/navigation/OrphanNavigationHandler.js @@ -0,0 +1,75 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define([], function () { + + /** + * Navigates away from orphan objects whenever they are detected. + * + * An orphan object is an object whose apparent parent does not + * actually contain it. This may occur in certain circumstances, such + * as when persistence succeeds for a newly-created object but fails + * for its parent. + * + * @param throttle the `throttle` service + * @param topic the `topic` service + * @param navigationService the `navigationService` + * @constructor + */ + function OrphanNavigationHandler(throttle, topic, navigationService) { + var throttledCheckNavigation; + + function getParent(domainObject) { + var context = domainObject.getCapability('context'); + return context.getParent(); + } + + function isOrphan(domainObject) { + var parent = getParent(domainObject), + composition = parent.getModel().composition, + id = domainObject.getId(); + return !composition || (composition.indexOf(id) === -1); + } + + function navigateToParent(domainObject) { + var parent = getParent(domainObject); + return parent.getCapability('action').perform('navigate'); + } + + function checkNavigation() { + var navigatedObject = navigationService.getNavigation(); + if (navigatedObject.hasCapability('context') && + isOrphan(navigatedObject)) { + if (!navigatedObject.getCapability('editor').isEditContextRoot()) { + navigateToParent(navigatedObject); + } + } + } + + throttledCheckNavigation = throttle(checkNavigation); + + navigationService.addListener(throttledCheckNavigation); + topic('mutation').listen(throttledCheckNavigation); + } + + return OrphanNavigationHandler; +}); diff --git a/platform/commonUI/browse/test/navigation/OrphanNavigationHandlerSpec.js b/platform/commonUI/browse/test/navigation/OrphanNavigationHandlerSpec.js new file mode 100644 index 0000000000..4f71feedbd --- /dev/null +++ b/platform/commonUI/browse/test/navigation/OrphanNavigationHandlerSpec.js @@ -0,0 +1,180 @@ +/***************************************************************************** +* Open MCT Web, Copyright (c) 2014-2015, United States Government +* as represented by the Administrator of the National Aeronautics and Space +* Administration. All rights reserved. +* +* Open MCT Web is licensed under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0. +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +* License for the specific language governing permissions and limitations +* under the License. +* +* Open MCT Web includes source code licensed under additional open source +* licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available +* at runtime from the About dialog for additional information. +*****************************************************************************/ + +define([ + '../../src/navigation/OrphanNavigationHandler' +], function (OrphanNavigationHandler) { + describe("OrphanNavigationHandler", function () { + var mockTopic, + mockThrottle, + mockMutationTopic, + mockNavigationService, + mockDomainObject, + mockParentObject, + mockContext, + mockActionCapability, + mockEditor, + testParentModel, + testId, + mockThrottledFns; + + beforeEach(function () { + testId = 'some-identifier'; + + mockThrottledFns = []; + testParentModel = {}; + + mockTopic = jasmine.createSpy('topic'); + mockThrottle = jasmine.createSpy('throttle'); + mockNavigationService = jasmine.createSpyObj('navigationService', [ + 'getNavigation', + 'addListener' + ]); + mockMutationTopic = jasmine.createSpyObj('mutationTopic', [ + 'listen' + ]); + mockDomainObject = jasmine.createSpyObj('domainObject', [ + 'getId', + 'getCapability', + 'getModel', + 'hasCapability' + ]); + mockParentObject = jasmine.createSpyObj('domainObject', [ + 'getId', + 'getCapability', + 'getModel', + 'hasCapability' + ]); + mockContext = jasmine.createSpyObj('context', ['getParent']); + mockActionCapability = jasmine.createSpyObj('action', ['perform']); + mockEditor = jasmine.createSpyObj('editor', ['isEditContextRoot']); + + mockThrottle.andCallFake(function (fn) { + var mockThrottledFn = + jasmine.createSpy('throttled-' + mockThrottledFns.length); + mockThrottledFn.andCallFake(fn); + mockThrottledFns.push(mockThrottledFn); + return mockThrottledFn; + }); + mockTopic.andCallFake(function (k) { + return k === 'mutation' && mockMutationTopic; + }); + mockDomainObject.getId.andReturn(testId); + mockDomainObject.getCapability.andCallFake(function (c) { + return { + context: mockContext, + editor: mockEditor + }[c]; + }); + mockDomainObject.hasCapability.andCallFake(function (c) { + return !!mockDomainObject.getCapability(c); + }); + mockParentObject.getModel.andReturn(testParentModel); + mockParentObject.getCapability.andCallFake(function (c) { + return { + action: mockActionCapability + }[c]; + }); + mockContext.getParent.andReturn(mockParentObject); + mockNavigationService.getNavigation.andReturn(mockDomainObject); + mockEditor.isEditContextRoot.andReturn(false); + + return new OrphanNavigationHandler( + mockThrottle, + mockTopic, + mockNavigationService + ); + }); + + + it("listens for mutation with a throttled function", function () { + expect(mockMutationTopic.listen) + .toHaveBeenCalledWith(jasmine.any(Function)); + expect(mockThrottledFns.indexOf( + mockMutationTopic.listen.mostRecentCall.args[0] + )).not.toEqual(-1); + }); + + it("listens for navigation changes with a throttled function", function () { + expect(mockNavigationService.addListener) + .toHaveBeenCalledWith(jasmine.any(Function)); + expect(mockThrottledFns.indexOf( + mockNavigationService.addListener.mostRecentCall.args[0] + )).not.toEqual(-1); + }); + + [false, true].forEach(function (isOrphan) { + var prefix = isOrphan ? "" : "non-"; + describe("for " + prefix + "orphan objects", function () { + beforeEach(function () { + testParentModel.composition = isOrphan ? [] : [testId]; + }); + + [false, true].forEach(function (isEditRoot) { + var caseName = isEditRoot ? + "that are being edited" : "that are not being edited"; + + function itNavigatesAsExpected() { + if (isOrphan && !isEditRoot) { + it("navigates to the parent", function () { + expect(mockActionCapability.perform) + .toHaveBeenCalledWith('navigate'); + }); + } else { + it("does nothing", function () { + expect(mockActionCapability.perform) + .not.toHaveBeenCalled(); + }); + } + } + + describe(caseName, function () { + beforeEach(function () { + mockEditor.isEditContextRoot.andReturn(isEditRoot); + }); + + describe("when navigation changes", function () { + beforeEach(function () { + mockNavigationService.addListener.mostRecentCall + .args[0](mockDomainObject); + }); + + itNavigatesAsExpected(); + }); + + describe("when mutation occurs", function () { + beforeEach(function () { + mockMutationTopic.listen.mostRecentCall + .args[0](mockParentObject); + }); + + itNavigatesAsExpected(); + }); + + }); + }); + }); + }); + + }); +}); + From 1c007ea2561ce1047ecc88e113e641d0c86f84d0 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 23 May 2016 14:55:04 -0700 Subject: [PATCH 027/167] [Code Style] Remove trailing whitespace ...to fix build after changes for #142. --- platform/representation/src/gestures/DropGesture.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/representation/src/gestures/DropGesture.js b/platform/representation/src/gestures/DropGesture.js index 7f94dad223..966618d88c 100644 --- a/platform/representation/src/gestures/DropGesture.js +++ b/platform/representation/src/gestures/DropGesture.js @@ -46,7 +46,7 @@ define( // Find the relevant scope... var rect, scope = element.scope && element.scope(); - + if (scope && scope.$broadcast) { // Get the representation's bounds, to convert // drop position From ab64b682c3ccc5d69e7aa27ba6f81c506ba4c876 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 23 May 2016 14:58:23 -0700 Subject: [PATCH 028/167] [Code Style] Run checkstyle on CircleCI Run the full gulp verify task for testing on CircleCI, to handle unit tests as well as code style checks and linting (and other verification steps that may be added in the future.) --- circle.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/circle.yml b/circle.yml index 7caa57740d..3b245f7941 100644 --- a/circle.yml +++ b/circle.yml @@ -15,8 +15,8 @@ deployment: heroku: appname: openmctweb-staging-deux test: - post: - - gulp lint + override: + - gulp verify general: branches: From eff46b076c296ce3346121551dd19aeb51ed7f20 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 May 2016 15:03:20 -0700 Subject: [PATCH 029/167] [New Edit Mode] #628 Removed duplicate logic from Create Action --- .../browse/src/creation/CreateAction.js | 30 +++++++++++-------- .../commonUI/edit/src/actions/EditAction.js | 6 ++++ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/platform/commonUI/browse/src/creation/CreateAction.js b/platform/commonUI/browse/src/creation/CreateAction.js index c5097e166d..2e04a0b07e 100644 --- a/platform/commonUI/browse/src/creation/CreateAction.js +++ b/platform/commonUI/browse/src/creation/CreateAction.js @@ -83,25 +83,29 @@ define( CreateAction.prototype.perform = function () { var newModel = this.type.getInitialModel(), parentObject = this.navigationService.getNavigation(), - editorCapability, - newObject; + newObject, + editAction, + editorCapability; + + function onSave() { + return editorCapability.save(); + } + + function onCancel() { + return editorCapability.cancel(); + } newModel.type = this.type.getKey(); newModel.location = parentObject.getId(); newObject = parentObject.useCapability('instantiation', newModel); + editorCapability = newObject.hasCapability('editor') && newObject.getCapability("editor"); - editorCapability = newObject.getCapability("editor"); - - if (countEditableViews(newObject) > 0 && newObject.hasCapability('composition')) { - this.navigationService.setNavigation(newObject); - return newObject.getCapability("action").perform("edit"); - } else { + editAction = newObject.getCapability("action").getActions("edit")[0]; + if (editAction) { + return editAction.perform("edit"); + } else if (editorCapability) { editorCapability.edit(); - return newObject.useCapability("action").perform("save").then(function () { - return editorCapability.save(); - }, function () { - return editorCapability.cancel(); - }); + return newObject.useCapability("action").perform("save").then(onSave, onCancel); } }; diff --git a/platform/commonUI/edit/src/actions/EditAction.js b/platform/commonUI/edit/src/actions/EditAction.js index b2aae8fa1b..9e5c90d897 100644 --- a/platform/commonUI/edit/src/actions/EditAction.js +++ b/platform/commonUI/edit/src/actions/EditAction.js @@ -74,6 +74,12 @@ define( self.domainObject.getCapability('editor').cancel(); self.navigationService.removeListener(cancelEditing); } + //If this is not the currently navigated object, then navigate + // to it. + if (this.navigationService.getNavigation() !== this.domainObject) { + this.navigationService.setNavigation(this.domainObject); + } + this.navigationService.addListener(cancelEditing); this.domainObject.useCapability("editor"); }; From 9a8bcc055002729a791656529781c5f413f8cc5f Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 23 May 2016 15:10:05 -0700 Subject: [PATCH 030/167] [Code Style] Specify lint, codestyle in CircleCI config ...to work around unexpected failure running test suite via gulp verify, https://circleci.com/gh/nasa/openmct/1981 --- circle.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/circle.yml b/circle.yml index 3b245f7941..b075c1f5fe 100644 --- a/circle.yml +++ b/circle.yml @@ -15,8 +15,9 @@ deployment: heroku: appname: openmctweb-staging-deux test: - override: - - gulp verify + post: + - gulp lint + - gulp checkstyle general: branches: From f35947361ca0a5c1d69a4a645d007167559d7604 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 23 May 2016 15:32:48 -0700 Subject: [PATCH 031/167] [Timeline] Remain centered during zoom #936 --- platform/features/timeline/res/templates/timeline.html | 4 ++-- .../timeline/src/controllers/TimelineZoomController.js | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/features/timeline/res/templates/timeline.html b/platform/features/timeline/res/templates/timeline.html index 41a1c67a87..fc2e779a36 100644 --- a/platform/features/timeline/res/templates/timeline.html +++ b/platform/features/timeline/res/templates/timeline.html @@ -104,14 +104,14 @@
X Y diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 4c8acd0061..4208a7465c 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -80,11 +80,13 @@ define( * @returns {number} current zoom level (as the size of a * major tick mark, in pixels) */ - zoom: function (amount) { + zoom: function (amount, bounds) { // Update the zoom level if called with an argument if (arguments.length > 0 && !isNaN(amount)) { + var center = this.toMillis(bounds.x + bounds.width / 2); setZoomLevel(zoomIndex + amount); storeZoom(zoomIndex); + bounds.x = this.toPixels(center) - bounds.width / 2; } return zoomLevels[zoomIndex]; }, From 0818a7cda089d6a7aeb18ca7a011b99cf5ac4bf3 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 23 May 2016 15:36:26 -0700 Subject: [PATCH 032/167] [Timeline] Increase maximum zoom level #936 --- platform/features/timeline/bundle.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index a6c0931f4e..eb66456ce4 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -127,7 +127,16 @@ define([ 14400000, 28800000, 43200000, - 86400000 + 86400000, + 86400000 * 2, + 86400000 * 5, + 86400000 * 10, + 86400000 * 20, + 86400000 * 30, + 86400000 * 60, + 86400000 * 120, + 86400000 * 240, + 86400000 * 365 ], "width": 200 } From 9a5209f7c2d3d03ca9f268e7dad28c2642dca64e Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 23 May 2016 16:06:10 -0700 Subject: [PATCH 033/167] [Timeline] Add zoom-to-fit button --- .../timeline/res/templates/timeline.html | 7 +++ .../src/controllers/TimelineZoomController.js | 46 ++++++++++++++++--- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/platform/features/timeline/res/templates/timeline.html b/platform/features/timeline/res/templates/timeline.html index fc2e779a36..8dc145b7f0 100644 --- a/platform/features/timeline/res/templates/timeline.html +++ b/platform/features/timeline/res/templates/timeline.html @@ -103,6 +103,13 @@
+ + I + + 0 && !isNaN(amount)) { var center = this.toMillis(bounds.x + bounds.width / 2); @@ -90,22 +120,24 @@ define( } return zoomLevels[zoomIndex]; }, + fit: function () { + if ($scope.domainObject) { + initializeZoom($scope.domainObject); + storeZoom(); + } + }, /** * Get the width, in pixels, of a specific time duration at * the current zoom level. * @returns {number} the number of pixels */ - toPixels: function (millis) { - return tickWidth * millis / zoomLevels[zoomIndex]; - }, + toPixels: toPixels, /** * Get the time duration, in milliseconds, occupied by the * width (specified in pixels) at the current zoom level. * @returns {number} the number of pixels */ - toMillis: function (pixels) { - return (pixels / tickWidth) * zoomLevels[zoomIndex]; - }, + toMillis: toMillis, /** * Get or set the current displayed duration. If used as a * setter, this will typically be rounded up to ensure extra From 96af931c0b8a9aaa89085c935c3aecbcdd8f4304 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 May 2016 16:48:31 -0700 Subject: [PATCH 034/167] Modified EditActionPolicy to prevent editing of table views unless object is a table type --- platform/commonUI/edit/src/policies/EditActionPolicy.js | 5 ++++- platform/features/table/bundle.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/platform/commonUI/edit/src/policies/EditActionPolicy.js b/platform/commonUI/edit/src/policies/EditActionPolicy.js index f0c2910c11..cc40c32d9f 100644 --- a/platform/commonUI/edit/src/policies/EditActionPolicy.js +++ b/platform/commonUI/edit/src/policies/EditActionPolicy.js @@ -56,7 +56,10 @@ define( // A view is editable unless explicitly flagged as not (views || []).forEach(function (view) { if (view.editable === true || - (view.key === 'plot' && type.getKey() === 'telemetry.panel')) { + (view.key === 'plot' && type.getKey() === 'telemetry.panel') || + (view.key === 'table' && type.getKey() === 'table') || + (view.key === 'rt-table' && type.getKey() === 'rttable') + ) { count++; } }); diff --git a/platform/features/table/bundle.js b/platform/features/table/bundle.js index ee907bc963..cdcb6603d9 100644 --- a/platform/features/table/bundle.js +++ b/platform/features/table/bundle.js @@ -133,7 +133,7 @@ define([ "telemetry" ], "delegation": true, - "editable": true + "editable": false }, { "name": "Real-time Table", @@ -144,7 +144,7 @@ define([ "telemetry" ], "delegation": true, - "editable": true + "editable": false } ], "directives": [ From f0ab817e87ce3f66941a637fdd19721804b13ab4 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 24 May 2016 10:23:48 -0700 Subject: [PATCH 035/167] Added tests, and fixed failing ones --- platform/commonUI/browse/bundle.js | 2 - .../browse/src/creation/CreateAction.js | 32 +---- .../src/creation/CreateActionProvider.js | 8 +- .../test/creation/CreateActionProviderSpec.js | 13 -- .../browse/test/creation/CreateActionSpec.js | 128 +++++++++++++----- 5 files changed, 103 insertions(+), 80 deletions(-) diff --git a/platform/commonUI/browse/bundle.js b/platform/commonUI/browse/bundle.js index 73b3f44de7..8a694c57a7 100644 --- a/platform/commonUI/browse/bundle.js +++ b/platform/commonUI/browse/bundle.js @@ -309,9 +309,7 @@ define([ "type": "provider", "implementation": CreateActionProvider, "depends": [ - "$q", "typeService", - "navigationService", "policyService" ] }, diff --git a/platform/commonUI/browse/src/creation/CreateAction.js b/platform/commonUI/browse/src/creation/CreateAction.js index 2e04a0b07e..6ea0d513a5 100644 --- a/platform/commonUI/browse/src/creation/CreateAction.js +++ b/platform/commonUI/browse/src/creation/CreateAction.js @@ -43,11 +43,8 @@ define( * override this) * @param {ActionContext} context the context in which the * action is being performed - * @param {NavigationService} navigationService the navigation service, - * which handles changes in navigation. It allows the object - * being browsed/edited to be set. */ - function CreateAction(type, parent, context, $q, navigationService) { + function CreateAction(type, parent, context) { this.metadata = { key: 'create', glyph: type.getGlyph(), @@ -56,24 +53,8 @@ define( description: type.getDescription(), context: context }; - this.type = type; this.parent = parent; - this.navigationService = navigationService; - this.$q = $q; - } - - // Get a count of views which are not flagged as non-editable. - function countEditableViews(domainObject) { - var views = domainObject && domainObject.useCapability('view'), - count = 0; - - // A view is editable unless explicitly flagged as not - (views || []).forEach(function (view) { - count += (view.editable !== false) ? 1 : 0; - }); - - return count; } /** @@ -82,7 +63,6 @@ define( */ CreateAction.prototype.perform = function () { var newModel = this.type.getInitialModel(), - parentObject = this.navigationService.getNavigation(), newObject, editAction, editorCapability; @@ -96,16 +76,18 @@ define( } newModel.type = this.type.getKey(); - newModel.location = parentObject.getId(); - newObject = parentObject.useCapability('instantiation', newModel); + newModel.location = this.parent.getId(); + newObject = this.parent.useCapability('instantiation', newModel); editorCapability = newObject.hasCapability('editor') && newObject.getCapability("editor"); editAction = newObject.getCapability("action").getActions("edit")[0]; + //If an edit action is available, perform it if (editAction) { - return editAction.perform("edit"); + return editAction.perform(); } else if (editorCapability) { + //otherwise, use the save action editorCapability.edit(); - return newObject.useCapability("action").perform("save").then(onSave, onCancel); + return newObject.getCapability("action").perform("save").then(onSave, onCancel); } }; diff --git a/platform/commonUI/browse/src/creation/CreateActionProvider.js b/platform/commonUI/browse/src/creation/CreateActionProvider.js index 82f57343da..5039149104 100644 --- a/platform/commonUI/browse/src/creation/CreateActionProvider.js +++ b/platform/commonUI/browse/src/creation/CreateActionProvider.js @@ -44,10 +44,8 @@ define( * introduced in this bundle), responsible for handling actual * object creation. */ - function CreateActionProvider($q, typeService, navigationService, policyService) { + function CreateActionProvider(typeService, policyService) { this.typeService = typeService; - this.navigationService = navigationService; - this.$q = $q; this.policyService = policyService; } @@ -72,9 +70,7 @@ define( return new CreateAction( type, destination, - context, - self.$q, - self.navigationService + context ); }); }; diff --git a/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js b/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js index fbfc4a1140..d8aefe17fa 100644 --- a/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js +++ b/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js @@ -29,13 +29,10 @@ define( describe("The create action provider", function () { var mockTypeService, - mockDialogService, - mockNavigationService, mockPolicyService, mockCreationPolicy, mockPolicyMap = {}, mockTypes, - mockQ, provider; function createMockType(name) { @@ -61,14 +58,6 @@ define( "typeService", ["listTypes"] ); - mockDialogService = jasmine.createSpyObj( - "dialogService", - ["getUserInput"] - ); - mockNavigationService = jasmine.createSpyObj( - "navigationService", - ["setNavigation"] - ); mockPolicyService = jasmine.createSpyObj( "policyService", ["allow"] @@ -91,9 +80,7 @@ define( mockTypeService.listTypes.andReturn(mockTypes); provider = new CreateActionProvider( - mockQ, mockTypeService, - mockNavigationService, mockPolicyService ); }); diff --git a/platform/commonUI/browse/test/creation/CreateActionSpec.js b/platform/commonUI/browse/test/creation/CreateActionSpec.js index 5fa89512e0..b37339fa40 100644 --- a/platform/commonUI/browse/test/creation/CreateActionSpec.js +++ b/platform/commonUI/browse/test/creation/CreateActionSpec.js @@ -31,8 +31,10 @@ define( var mockType, mockParent, mockContext, - mockDialogService, - mockCreationService, + mockDomainObject, + capabilities = {}, + mockEditAction, + mockSaveAction, action; function mockPromise(value) { @@ -60,20 +62,61 @@ define( [ "getId", "getModel", - "getCapability" + "getCapability", + "useCapability" ] ); + mockDomainObject = jasmine.createSpyObj( + "domainObject", + [ + "getId", + "getModel", + "getCapability", + "hasCapability", + "useCapability" + ] + ); + mockDomainObject.hasCapability.andCallFake(function (name) { + return !!capabilities[name]; + }); + mockDomainObject.getCapability.andCallFake(function (name) { + return capabilities[name]; + }); + mockSaveAction = jasmine.createSpyObj( + "saveAction", + [ + "perform" + ] + ); + + capabilities.action = jasmine.createSpyObj( + "actionCapability", + [ + "getActions", + "perform" + ] + ); + + capabilities.editor = jasmine.createSpyObj( + "editorCapability", + [ + "edit", + "save", + "cancel" + ] + ); + + mockEditAction = jasmine.createSpyObj( + "editAction", + [ + "perform" + ] + ); + mockContext = { domainObject: mockParent }; - mockDialogService = jasmine.createSpyObj( - "dialogService", - ["getUserInput"] - ); - mockCreationService = jasmine.createSpyObj( - "creationService", - ["createObject"] - ); + mockParent.useCapability.andReturn(mockDomainObject); mockType.getKey.andReturn("test"); mockType.getGlyph.andReturn("T"); @@ -82,14 +125,10 @@ define( mockType.getProperties.andReturn([]); mockType.getInitialModel.andReturn({}); - mockDialogService.getUserInput.andReturn(mockPromise({})); - action = new CreateAction( mockType, mockParent, - mockContext, - mockDialogService, - mockCreationService + mockContext ); }); @@ -101,28 +140,49 @@ define( expect(metadata.glyph).toEqual("T"); }); - //TODO: Disabled for NEM Beta - xit("invokes the creation service when performed", function () { - action.perform(); - expect(mockCreationService.createObject).toHaveBeenCalledWith( - { type: "test" }, - mockParent - ); - }); - - //TODO: Disabled for NEM Beta - xit("does not create an object if the user cancels", function () { - mockDialogService.getUserInput.andReturn({ - then: function (callback, fail) { - fail(); - } + describe("the perform function", function () { + beforeEach(function () { + capabilities.action.getActions.andReturn([mockEditAction]); }); - action.perform(); + it("uses the instantiation capability when performed", function () { + action.perform(); + expect(mockParent.useCapability).toHaveBeenCalledWith("instantiation", jasmine.any(Object)); + }); - expect(mockCreationService.createObject) - .not.toHaveBeenCalled(); + it("uses the edit action if available", function () { + action.perform(); + expect(mockEditAction.perform).toHaveBeenCalled(); + }); + it("uses the save action if object does not have an edit action" + + " available", function () { + capabilities.action.getActions.andReturn([]); + capabilities.action.perform.andReturn(mockPromise(undefined)); + action.perform(); + expect(capabilities.action.perform).toHaveBeenCalledWith("save"); + }); + + describe("uses to editor capability", function () { + var promise = jasmine.createSpyObj("promise", ["then"]); + beforeEach(function () { + capabilities.action.getActions.andReturn([]); + capabilities.action.perform.andReturn(promise); + }); + + it("to save the edit if user saves dialog", function () { + action.perform(); + expect(promise.then).toHaveBeenCalled(); + promise.then.mostRecentCall.args[0](); + expect(capabilities.editor.save).toHaveBeenCalled(); + }); + + it("to cancel the edit if user cancels dialog", function () { + action.perform(); + promise.then.mostRecentCall.args[1](); + expect(capabilities.editor.cancel).toHaveBeenCalled(); + }); + }); }); }); From 85432af187408be0acfea560f46e4619864bf451 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 11:53:27 -0700 Subject: [PATCH 036/167] [Timeline] Don't store zoom configuration https://github.com/nasa/openmct/issues/936#issuecomment-221343620 --- .../src/controllers/TimelineZoomController.js | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 884904e7ba..0ba5abbb28 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -62,19 +62,6 @@ define( } } - // Persist current zoom level - function storeZoom() { - var isEditMode = $scope.commit && - $scope.domainObject && - $scope.domainObject.hasCapability('editor') && - $scope.domainObject.getCapability('editor').inEditContext(); - if (isEditMode) { - $scope.configuration = $scope.configuration || {}; - $scope.configuration.zoomLevel = zoomIndex; - $scope.commit(); - } - } - function initializeZoomFromTimespan(timespan) { var duration = timespan.getDuration(); zoomIndex = 0; @@ -96,7 +83,6 @@ define( bounds = scroll; }); $scope.$watch("domainObject", initializeZoom); - $scope.$watch("configuration.zoomLevel", setZoomLevel); return { /** @@ -115,15 +101,17 @@ define( if (arguments.length > 0 && !isNaN(amount)) { var center = this.toMillis(bounds.x + bounds.width / 2); setZoomLevel(zoomIndex + amount); - storeZoom(zoomIndex); bounds.x = this.toPixels(center) - bounds.width / 2; } return zoomLevels[zoomIndex]; }, + /** + * Set the zoom level to fit the bounds of the timeline + * being viewed. + */ fit: function () { if ($scope.domainObject) { initializeZoom($scope.domainObject); - storeZoom(); } }, /** From 757da1dff45aae24bbea5f733311e572e6d5f3fb Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 11:54:49 -0700 Subject: [PATCH 037/167] [Timeline] Remove obsolete test cases --- .../controllers/TimelineZoomControllerSpec.js | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index 1365fca7d6..35b5bad8b4 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -74,34 +74,6 @@ define( expect(controller.zoom()).toEqual(3500); }); - it("does not normally persist zoom changes", function () { - controller.zoom(1); - expect(mockScope.commit).not.toHaveBeenCalled(); - }); - - it("persists zoom changes in Edit mode", function () { - mockScope.domainObject = jasmine.createSpyObj( - 'domainObject', - ['hasCapability', 'getCapability'] - ); - mockScope.domainObject.hasCapability.andCallFake(function (c) { - return c === 'editor'; - }); - mockScope.domainObject.getCapability.andCallFake(function (c) { - if (c === 'editor') { - return { - inEditContext: function () { - return true; - } - }; - } - }); - controller.zoom(1); - expect(mockScope.commit).toHaveBeenCalled(); - expect(mockScope.configuration.zoomLevel) - .toEqual(jasmine.any(Number)); - }); - }); } From eb5566f0417f7bc139329610e5791bbc88a18bb4 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 12:33:19 -0700 Subject: [PATCH 038/167] [Timeline] Add tests for timeline zoom changes --- .../src/controllers/TimelineZoomController.js | 2 +- .../controllers/TimelineZoomControllerSpec.js | 63 +++++++++++++++++-- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 0ba5abbb28..1c21cbfe8c 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -66,7 +66,7 @@ define( var duration = timespan.getDuration(); zoomIndex = 0; while (toMillis(bounds.width) < duration && - zoomIndex < zoomLevels.length) { + zoomIndex < zoomLevels.length - 1) { zoomIndex += 1; } bounds.x = toPixels(timespan.getStart()); diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index 35b5bad8b4..b5f8e32f6f 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -32,11 +32,7 @@ define( beforeEach(function () { testConfiguration = { - levels: [ - 1000, - 2000, - 3500 - ], + levels: [ 1000, 2000, 3500 ], width: 12321 }; mockScope = jasmine.createSpyObj("$scope", ['$watch']); @@ -74,6 +70,63 @@ define( expect(controller.zoom()).toEqual(3500); }); + it("observes scroll bounds", function () { + expect(mockScope.$watch) + .toHaveBeenCalledWith("scroll", jasmine.any(Function)); + }); + + describe("when watches have fired", function () { + var mockDomainObject, + mockPromise, + mockTimespan, + testStart, + testEnd; + + beforeEach(function () { + testStart = 3000; + testEnd = 5500; + + mockDomainObject = jasmine.createSpyObj('domainObject', [ + 'getId', + 'getModel', + 'getCapability', + 'useCapability' + ]); + mockPromise = jasmine.createSpyObj('promise', ['then']); + mockTimespan = jasmine.createSpyObj('timespan', [ + 'getStart', + 'getEnd', + 'getDuration' + ]); + + mockDomainObject.useCapability.andCallFake(function (c) { + return c === 'timespan' && mockPromise; + }); + mockPromise.then.andCallFake(function (callback) { + callback(mockTimespan); + }); + mockTimespan.getStart.andReturn(testStart); + mockTimespan.getEnd.andReturn(testEnd); + mockTimespan.getDuration.andReturn(testEnd - testStart); + + mockScope.scroll = { x: 0, width: 20000 }; + mockScope.domainObject = mockDomainObject; + + mockScope.$watch.calls.forEach(function (call) { + call.args[1](mockScope[call.args[0]]); + }); + }); + + it("zooms to fit the timeline", function () { + var x1 = mockScope.scroll.x, + x2 = mockScope.scroll.x + mockScope.scroll.width; + expect(Math.round(controller.toMillis(x1))) + .toEqual(testStart); + expect(Math.round(controller.toMillis(x2))) + .toBeGreaterThan(testEnd); + }); + }); + }); } From 16d20eabd2d61c8af245b7a219781cf9182e930d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 12:33:47 -0700 Subject: [PATCH 039/167] [Timeline] Simplify method --- .../src/controllers/TimelineZoomController.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 1c21cbfe8c..7bd64eb408 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -72,9 +72,9 @@ define( bounds.x = toPixels(timespan.getStart()); } - function initializeZoom(domainObject) { - if (domainObject) { - domainObject.useCapability('timespan') + function initializeZoom() { + if ($scope.domainObject) { + $scope.domainObject.useCapability('timespan') .then(initializeZoomFromTimespan); } } @@ -109,11 +109,7 @@ define( * Set the zoom level to fit the bounds of the timeline * being viewed. */ - fit: function () { - if ($scope.domainObject) { - initializeZoom($scope.domainObject); - } - }, + fit: initializeZoom, /** * Get the width, in pixels, of a specific time duration at * the current zoom level. From 362248a02e1114c09f1188c839375251f755bd4c Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 12:37:10 -0700 Subject: [PATCH 040/167] [Timeline] Run gulp fixstyle --- .../timeline/test/controllers/TimelineZoomControllerSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index b5f8e32f6f..47e79fefa8 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -32,7 +32,7 @@ define( beforeEach(function () { testConfiguration = { - levels: [ 1000, 2000, 3500 ], + levels: [1000, 2000, 3500], width: 12321 }; mockScope = jasmine.createSpyObj("$scope", ['$watch']); From 379557093870d2ef35505167b495de69033cb62d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 12:45:25 -0700 Subject: [PATCH 041/167] [Timeline] Rename shadowing variable --- .../timeline/src/controllers/TimelineZoomController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 7bd64eb408..d94a05d291 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -63,9 +63,9 @@ define( } function initializeZoomFromTimespan(timespan) { - var duration = timespan.getDuration(); + var timelineDuration = timespan.getDuration(); zoomIndex = 0; - while (toMillis(bounds.width) < duration && + while (toMillis(bounds.width) < timelineDuration && zoomIndex < zoomLevels.length - 1) { zoomIndex += 1; } From 00534f8af7349ccab364bd5659cd8d5b276a2b3b Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 24 May 2016 13:02:30 -0700 Subject: [PATCH 042/167] [Timeline] Account for tick size Account for tick size in duration reported by TimelineZoomController, to avoid tick marks being cut off prematurely due to changes for #936 --- platform/features/timeline/res/templates/timeline.html | 2 +- .../timeline/src/controllers/TimelineZoomController.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/res/templates/timeline.html b/platform/features/timeline/res/templates/timeline.html index 8dc145b7f0..6e74a8c7b2 100644 --- a/platform/features/timeline/res/templates/timeline.html +++ b/platform/features/timeline/res/templates/timeline.html @@ -128,7 +128,7 @@
Date: Wed, 25 May 2016 10:11:34 -0700 Subject: [PATCH 044/167] [Test] Add spy method for addClass Add spy method, fix a merge conflict that was improperly resolved in https://github.com/nasa/openmct/pull/922 --- .../commonUI/general/test/directives/MCTPopupSpec.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/general/test/directives/MCTPopupSpec.js b/platform/commonUI/general/test/directives/MCTPopupSpec.js index 372dd4b042..fa26b6f6f7 100644 --- a/platform/commonUI/general/test/directives/MCTPopupSpec.js +++ b/platform/commonUI/general/test/directives/MCTPopupSpec.js @@ -24,7 +24,15 @@ define( ["../../src/directives/MCTPopup"], function (MCTPopup) { - var JQLITE_METHODS = ["on", "off", "find", "parent", "css", "append"]; + var JQLITE_METHODS = [ + "on", + "off", + "find", + "parent", + "css", + "addClass", + "append" + ]; describe("The mct-popup directive", function () { var mockCompile, From ed519d89d70568f608eb41f12d3de2097921673d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 10:35:29 -0700 Subject: [PATCH 045/167] [Timeline] Log errors during CSV export #751 --- platform/features/timeline/bundle.js | 1 + .../timeline/src/actions/ExportTimelineAsCSVAction.js | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index e44b27c589..4663a37fae 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -92,6 +92,7 @@ define([ "category": "contextual", "implementation": ExportTimelineAsCSVAction, "depends": [ + "$log", "exportService", "notificationService", "resources[]" diff --git a/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js b/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js index 57ac17c8a0..5b0e007e23 100644 --- a/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js +++ b/platform/features/timeline/src/actions/ExportTimelineAsCSVAction.js @@ -34,11 +34,13 @@ define(["./ExportTimelineAsCSVTask"], function (ExportTimelineAsCSVTask) { * @memberof {platform/features/timeline} */ function ExportTimelineAsCSVAction( + $log, exportService, notificationService, resources, context ) { + this.$log = $log; this.task = new ExportTimelineAsCSVTask( exportService, resources, @@ -52,13 +54,15 @@ define(["./ExportTimelineAsCSVTask"], function (ExportTimelineAsCSVTask) { notification = notificationService.notify({ title: "Exporting CSV", unknownProgress: true - }); + }), + $log = this.$log; return this.task.run() .then(function () { notification.dismiss(); }) - .catch(function () { + .catch(function (err) { + $log.warn(err); notification.dismiss(); notificationService.error("Error exporting CSV"); }); From 81624291061c43b13326b0da6156e2588be90482 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 10:37:01 -0700 Subject: [PATCH 046/167] [Timeline] Pass in resources extensions --- .../features/timeline/src/actions/ExportTimelineAsCSVTask.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js b/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js index 1e9be7d97a..d026edff3a 100644 --- a/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js +++ b/platform/features/timeline/src/actions/ExportTimelineAsCSVTask.js @@ -52,9 +52,10 @@ define([ */ ExportTimelineAsCSVTask.prototype.run = function () { var exportService = this.exportService; + var resources = this.resources; function doExport(objects) { - var exporter = new TimelineColumnizer(objects, this.resources), + var exporter = new TimelineColumnizer(objects, resources), options = { headers: exporter.headers() }; return exporter.rows().then(function (rows) { return exportService.exportCSV(rows, options); From 0cc2ba75958c8824858136c2f3078e70b453cc19 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 10:38:00 -0700 Subject: [PATCH 047/167] [Timeline] Import UtilizationColumn --- .../features/timeline/src/actions/TimelineColumnizer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/src/actions/TimelineColumnizer.js b/platform/features/timeline/src/actions/TimelineColumnizer.js index 5468add401..bfbd5e34c2 100644 --- a/platform/features/timeline/src/actions/TimelineColumnizer.js +++ b/platform/features/timeline/src/actions/TimelineColumnizer.js @@ -25,13 +25,15 @@ define([ "./ModeColumn", "./CompositionColumn", "./MetadataColumn", - "./TimespanColumn" + "./TimespanColumn", + "./UtilizationColumn" ], function ( IdColumn, ModeColumn, CompositionColumn, MetadataColumn, - TimespanColumn + TimespanColumn, + UtilizationColumn ) { /** From bb4f1ce7cd87781198705362c0a4c1ed3dcb6fd9 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 10:52:25 -0700 Subject: [PATCH 048/167] [Timeline] Include utilization columns --- platform/features/timeline/bundle.js | 3 ++- .../timeline/src/actions/UtilizationColumn.js | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index 4663a37fae..b8754f4916 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -557,7 +557,8 @@ define([ { "key": "comms", "name": "Comms", - "units": "Kbps" + "units": "Kbps", + "foo": "Kb" }, { "key": "battery", diff --git a/platform/features/timeline/src/actions/UtilizationColumn.js b/platform/features/timeline/src/actions/UtilizationColumn.js index f2c8a56544..e9e88a5896 100644 --- a/platform/features/timeline/src/actions/UtilizationColumn.js +++ b/platform/features/timeline/src/actions/UtilizationColumn.js @@ -41,11 +41,23 @@ define([], function () { UtilizationColumn.prototype.value = function (domainObject) { var resource = this.resource; + function getCost(utilization) { + var seconds = (utilization.end - utilization.start) / 1000; + return seconds * utilization.value; + } + function getUtilizationValue(utilizations) { utilizations = utilizations.filter(function (utilization) { - return key === resource.key; + return utilization.key === resource.key; }); - return utilizations.length === 1 ? utilizations[0].value : ""; + + if (utilizations.length === 0) { + return ""; + } + + return utilizations.map(getCost).reduce(function (a, b) { + return a + b; + }, 0); } return !domainObject.hasCapability('utilization') ? From ed69a65f9b1c7c36947a4f6ba7a0127cae2e84c2 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 11:03:32 -0700 Subject: [PATCH 049/167] [Representation] Restore ordering in mct-representation Revert "[Timeline] Change ordering in mct-representation" This reverts commit 20ecf168f238b9a4b2341508650f4b573bfd4f0b. These changes introduced a regression due to ordering expected by time conductor, #957 --- platform/representation/src/MCTRepresentation.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/representation/src/MCTRepresentation.js b/platform/representation/src/MCTRepresentation.js index 953ed7cf5a..331139b793 100644 --- a/platform/representation/src/MCTRepresentation.js +++ b/platform/representation/src/MCTRepresentation.js @@ -177,6 +177,10 @@ define( // representation to store local variables into. $scope.representation = {}; + // Change templates (passing in undefined to clear + // if we don't have enough info to show a template.) + changeTemplate(canRepresent ? representation : undefined); + // Any existing representers are no longer valid; release them. destroyRepresenters(); @@ -222,10 +226,6 @@ define( // next change object/key pair changes toClear = uses.concat(['model']); } - - // Change templates (passing in undefined to clear - // if we don't have enough info to show a template.) - changeTemplate(canRepresent ? representation : undefined); } // Update the representation when the key changes (e.g. if a From 70b593e28a4b3657cabf86a6d005f51d2d419817 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 11:21:20 -0700 Subject: [PATCH 050/167] [Timeline] Watch for configuration object ...to address #908 in a manner which does not cause #957 --- .../src/controllers/TimelineController.js | 2 ++ .../swimlane/TimelineSwimlanePopulator.js | 21 ++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineController.js b/platform/features/timeline/src/controllers/TimelineController.js index 796807c76a..64900b586c 100644 --- a/platform/features/timeline/src/controllers/TimelineController.js +++ b/platform/features/timeline/src/controllers/TimelineController.js @@ -97,6 +97,8 @@ define( } } + $scope.$watch("configuration", swimlanePopulator.configure); + // Recalculate swimlane state on changes $scope.$watch("domainObject", swimlanePopulator.populate); diff --git a/platform/features/timeline/src/controllers/swimlane/TimelineSwimlanePopulator.js b/platform/features/timeline/src/controllers/swimlane/TimelineSwimlanePopulator.js index ccc6148997..74c28b46b8 100644 --- a/platform/features/timeline/src/controllers/swimlane/TimelineSwimlanePopulator.js +++ b/platform/features/timeline/src/controllers/swimlane/TimelineSwimlanePopulator.js @@ -43,8 +43,7 @@ define( var swimlanes = [], start = Number.POSITIVE_INFINITY, end = Number.NEGATIVE_INFINITY, - colors = (configuration.colors || {}), - assigner = new TimelineColorAssigner(colors), + assigner, lastDomainObject; // Track extremes of start/end times @@ -152,8 +151,15 @@ define( recalculateSwimlanes(lastDomainObject); } + function initialize() { + var colors = (configuration.colors || {}); + assigner = new TimelineColorAssigner(colors); + configuration.colors = colors; + recalculateSwimlanes(lastDomainObject); + } + // Ensure colors are exposed in configuration - configuration.colors = colors; + initialize(); return { /** @@ -188,6 +194,15 @@ define( */ end: function () { return end; + }, + /** + * Pass a new configuration object (to retrieve and store + * swimlane configuration) + * @param newConfig + */ + configure: function (newConfig) { + configuration = newConfig; + initialize(); } }; } From 0a75a5be1f1f086f572fcc4e970e784afa7dea10 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 11:27:16 -0700 Subject: [PATCH 051/167] [Timeline] Add minimal test case --- .../timeline/test/controllers/TimelineControllerSpec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/platform/features/timeline/test/controllers/TimelineControllerSpec.js b/platform/features/timeline/test/controllers/TimelineControllerSpec.js index 9e777b0d8e..2b78829c3a 100644 --- a/platform/features/timeline/test/controllers/TimelineControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineControllerSpec.js @@ -141,6 +141,13 @@ define( expect(mockScope.scroll.y).toEqual(0); }); + it("watches for a configuration object", function () { + expect(mockScope.$watch).toHaveBeenCalledWith( + "configuration", + jasmine.any(Function) + ); + }); + it("repopulates when modifications are made", function () { var fnWatchCall, strWatchCall; From 952f95aa4c9b19fe0a081ab9e073a2087c3a3221 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 11:33:51 -0700 Subject: [PATCH 052/167] [Timeline] Update failing specs --- .../controllers/TimelineControllerSpec.js | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/platform/features/timeline/test/controllers/TimelineControllerSpec.js b/platform/features/timeline/test/controllers/TimelineControllerSpec.js index 2b78829c3a..aa88866ebc 100644 --- a/platform/features/timeline/test/controllers/TimelineControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineControllerSpec.js @@ -68,6 +68,14 @@ define( }; } + function fireWatch(expr, value) { + mockScope.$watch.calls.forEach(function (call) { + if (call.args[0] === expr) { + call.args[1](value); + } + }); + } + beforeEach(function () { var mockA, mockB, mockUtilization, mockPromise, mockGraph, testCapabilities; @@ -149,8 +157,7 @@ define( }); it("repopulates when modifications are made", function () { - var fnWatchCall, - strWatchCall; + var fnWatchCall; // Find the $watch that was given a function mockScope.$watch.calls.forEach(function (call) { @@ -158,16 +165,11 @@ define( // white-box: we know the first call is // the one we're looking for fnWatchCall = fnWatchCall || call; - } else if (typeof call.args[0] === 'string') { - strWatchCall = strWatchCall || call; } }); // Make sure string watch was for domainObject - expect(strWatchCall.args[0]).toEqual('domainObject'); - // Initially populate - strWatchCall.args[1](mockDomainObject); - + fireWatch('domainObject', mockDomainObject); // There should be to swimlanes expect(controller.swimlanes().length).toEqual(2); @@ -189,23 +191,23 @@ define( // order of $watch calls in TimelineController. // Initially populate - mockScope.$watch.calls[0].args[1](mockDomainObject); + fireWatch('domainObject', mockDomainObject); // Verify precondition - no graphs expect(controller.graphs().length).toEqual(0); // Execute the watch function for graph state - tmp = mockScope.$watch.calls[2].args[0](); + tmp = mockScope.$watch.calls[3].args[0](); // Change graph state testConfiguration.graph = { a: true, b: true }; // Verify that this would have triggered a watch - expect(mockScope.$watch.calls[2].args[0]()) + expect(mockScope.$watch.calls[3].args[0]()) .not.toEqual(tmp); // Run the function the watch would have triggered - mockScope.$watch.calls[2].args[1](); + mockScope.$watch.calls[3].args[1](); // Should have some graphs now expect(controller.graphs().length).toEqual(2); @@ -218,7 +220,7 @@ define( mockZoom.duration.andReturn(12345); // Initially populate - mockScope.$watch.calls[0].args[1](mockDomainObject); + fireWatch('domainObject', mockDomainObject); expect(controller.width(mockZoom)).toEqual(54321); // Verify interactions; we took zoom's duration for our start/end, From 3935378b0c1f832bde5e64359443fa500a95dd67 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 11:34:29 -0700 Subject: [PATCH 053/167] Revert "[Timeline] Test mct-representation ordering" This reverts commit 2a4004fd5bcddc8249c8911606d14dad8303d14b. --- .../representation/test/MCTRepresentationSpec.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/platform/representation/test/MCTRepresentationSpec.js b/platform/representation/test/MCTRepresentationSpec.js index 98da386c91..025ab0f14d 100644 --- a/platform/representation/test/MCTRepresentationSpec.js +++ b/platform/representation/test/MCTRepresentationSpec.js @@ -194,21 +194,6 @@ define( .toHaveBeenCalledWith(testViews[1]); }); - it("exposes configuration before changing templates", function () { - var observedConfiguration; - - mockChangeTemplate.andCallFake(function () { - observedConfiguration = mockScope.configuration; - }); - - mockScope.key = "xyz"; - mockScope.domainObject = mockDomainObject; - fireWatch('key', mockScope.key); - fireWatch('domainObject', mockDomainObject); - - expect(observedConfiguration).toBeDefined(); - }); - it("does not load templates until there is an object", function () { mockScope.key = "xyz"; From 463f7ccf65024ea0c3048cdb2b8d8368132ca7a3 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:07:35 -0700 Subject: [PATCH 054/167] [Timeline] Use indexes instead of UUIDs --- .../timeline/src/actions/CompositionColumn.js | 7 +++++-- platform/features/timeline/src/actions/IdColumn.js | 7 ++++--- platform/features/timeline/src/actions/ModeColumn.js | 8 +++++--- .../timeline/src/actions/TimelineColumnizer.js | 12 +++++++++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/platform/features/timeline/src/actions/CompositionColumn.js b/platform/features/timeline/src/actions/CompositionColumn.js index f9bede9983..3fff0bda37 100644 --- a/platform/features/timeline/src/actions/CompositionColumn.js +++ b/platform/features/timeline/src/actions/CompositionColumn.js @@ -30,8 +30,9 @@ define([], function () { * @constructor * @implements {platform/features/timeline.TimelineCSVColumn} */ - function CompositionColumn(index) { + function CompositionColumn(index, idMap) { this.index = index; + this.idMap = idMap; } CompositionColumn.prototype.name = function () { @@ -41,7 +42,9 @@ define([], function () { CompositionColumn.prototype.value = function (domainObject) { var model = domainObject.getModel(), composition = model.composition || []; - return (composition[this.index]) || ""; + + return composition.length > this.index ? + this.idMap[composition[this.index]] : ""; }; return CompositionColumn; diff --git a/platform/features/timeline/src/actions/IdColumn.js b/platform/features/timeline/src/actions/IdColumn.js index 38c8b9264e..b6ff15fe6c 100644 --- a/platform/features/timeline/src/actions/IdColumn.js +++ b/platform/features/timeline/src/actions/IdColumn.js @@ -27,15 +27,16 @@ define([], function () { * @constructor * @implements {platform/features/timeline.TimelineCSVColumn} */ - function IdColumn() { + function IdColumn(idMap) { + this.idMap = idMap; } IdColumn.prototype.name = function () { - return "Identifier"; + return "Index"; }; IdColumn.prototype.value = function (domainObject) { - return domainObject.getId(); + return this.idMap[domainObject.getId()]; }; return IdColumn; diff --git a/platform/features/timeline/src/actions/ModeColumn.js b/platform/features/timeline/src/actions/ModeColumn.js index fe2063566d..26b307cbd0 100644 --- a/platform/features/timeline/src/actions/ModeColumn.js +++ b/platform/features/timeline/src/actions/ModeColumn.js @@ -29,8 +29,9 @@ define([], function () { * element associated with this column * @implements {platform/features/timeline.TimelineCSVColumn} */ - function ModeColumn(index) { + function ModeColumn(index, idMap) { this.index = index; + this.idMap = idMap; } ModeColumn.prototype.name = function () { @@ -39,8 +40,9 @@ define([], function () { ModeColumn.prototype.value = function (domainObject) { var model = domainObject.getModel(), - composition = (model.relationships || {}).modes || []; - return (composition[this.index]) || ""; + modes = (model.relationships || {}).modes || []; + return modes.length > this.index ? + this.idMap[modes[this.index]] : ""; }; return ModeColumn; diff --git a/platform/features/timeline/src/actions/TimelineColumnizer.js b/platform/features/timeline/src/actions/TimelineColumnizer.js index bfbd5e34c2..fb0b80a7f7 100644 --- a/platform/features/timeline/src/actions/TimelineColumnizer.js +++ b/platform/features/timeline/src/actions/TimelineColumnizer.js @@ -74,6 +74,7 @@ define([ columnNames = {}, columns = [], foundTimespan = false, + idMap, i; function addMetadataProperty(property) { @@ -92,7 +93,12 @@ define([ }); } - columns.push(new IdColumn()); + idMap = domainObjects.reduce(function (map, domainObject, index) { + map[domainObject.getId()] = index + 1; + return map; + }, {}); + + columns.push(new IdColumn(idMap)); domainObjects.forEach(function (domainObject) { var model = domainObject.getModel(), @@ -128,11 +134,11 @@ define([ }); for (i = 0; i < maxComposition; i += 1) { - columns.push(new CompositionColumn(i)); + columns.push(new CompositionColumn(i, idMap)); } for (i = 0; i < maxRelationships; i += 1) { - columns.push(new ModeColumn(i)); + columns.push(new ModeColumn(i, idMap)); } this.domainObjects = domainObjects; From 7501f679f7132ab0ebc96f3abb38f2678a4ba8dd Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 25 May 2016 12:10:39 -0700 Subject: [PATCH 055/167] [Style] Fixed style issues introduced by #954 --- platform/commonUI/edit/bundle.js | 4 ++-- .../commonUI/edit/test/creation/CreateActionSpec.js | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index 5107329bfb..a07c5bb230 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -146,7 +146,7 @@ define([ "$timeout", "objectService" ] - }, + } ], "directives": [ { @@ -309,7 +309,7 @@ define([ "uses": [ "action" ] - }, + } ], "components": [ { diff --git a/platform/commonUI/edit/test/creation/CreateActionSpec.js b/platform/commonUI/edit/test/creation/CreateActionSpec.js index b37339fa40..c2d8e64279 100644 --- a/platform/commonUI/edit/test/creation/CreateActionSpec.js +++ b/platform/commonUI/edit/test/creation/CreateActionSpec.js @@ -77,10 +77,10 @@ define( ] ); mockDomainObject.hasCapability.andCallFake(function (name) { - return !!capabilities[name]; + return !!capabilities[name]; }); mockDomainObject.getCapability.andCallFake(function (name) { - return capabilities[name]; + return capabilities[name]; }); mockSaveAction = jasmine.createSpyObj( "saveAction", @@ -165,10 +165,10 @@ define( describe("uses to editor capability", function () { var promise = jasmine.createSpyObj("promise", ["then"]); - beforeEach(function () { - capabilities.action.getActions.andReturn([]); - capabilities.action.perform.andReturn(promise); - }); + beforeEach(function () { + capabilities.action.getActions.andReturn([]); + capabilities.action.perform.andReturn(promise); + }); it("to save the edit if user saves dialog", function () { action.perform(); From 23c71b7218a8c9392bda20c595b4b2e17fc7947d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:12:11 -0700 Subject: [PATCH 056/167] [Timeline] Include units for utilizations --- platform/features/timeline/bundle.js | 3 +-- .../features/timeline/src/actions/UtilizationColumn.js | 10 +++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index b8754f4916..4663a37fae 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -557,8 +557,7 @@ define([ { "key": "comms", "name": "Comms", - "units": "Kbps", - "foo": "Kb" + "units": "Kbps" }, { "key": "battery", diff --git a/platform/features/timeline/src/actions/UtilizationColumn.js b/platform/features/timeline/src/actions/UtilizationColumn.js index e9e88a5896..7da7b6c890 100644 --- a/platform/features/timeline/src/actions/UtilizationColumn.js +++ b/platform/features/timeline/src/actions/UtilizationColumn.js @@ -34,6 +34,14 @@ define([], function () { this.resource = resource; } + UtilizationColumn.prototype.getUnits = function () { + var instantaneousUnits = this.resource.units; + return { + "Kbps": "Kb", + "Watts": "joules", + }[instantaneousUnits] || "unknown units"; + }; + UtilizationColumn.prototype.name = function () { return this.resource.name; }; @@ -57,7 +65,7 @@ define([], function () { return utilizations.map(getCost).reduce(function (a, b) { return a + b; - }, 0); + }, 0) + " (" + this.getUnits() + ")"; } return !domainObject.hasCapability('utilization') ? From a3bcaea7f95efc3a1f1305e994a8d24bfe32c468 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:21:58 -0700 Subject: [PATCH 057/167] [Timeline] Show units in utilization headers --- .../timeline/src/actions/UtilizationColumn.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/platform/features/timeline/src/actions/UtilizationColumn.js b/platform/features/timeline/src/actions/UtilizationColumn.js index 7da7b6c890..e87794237b 100644 --- a/platform/features/timeline/src/actions/UtilizationColumn.js +++ b/platform/features/timeline/src/actions/UtilizationColumn.js @@ -34,16 +34,13 @@ define([], function () { this.resource = resource; } - UtilizationColumn.prototype.getUnits = function () { - var instantaneousUnits = this.resource.units; - return { - "Kbps": "Kb", - "Watts": "joules", - }[instantaneousUnits] || "unknown units"; - }; - UtilizationColumn.prototype.name = function () { - return this.resource.name; + var units = { + "Kbps": "Kb", + "watts": "watt-seconds" + }[this.resource.units] || "unknown units"; + + return this.resource.name + " (" + units + ")"; }; UtilizationColumn.prototype.value = function (domainObject) { @@ -65,7 +62,7 @@ define([], function () { return utilizations.map(getCost).reduce(function (a, b) { return a + b; - }, 0) + " (" + this.getUnits() + ")"; + }, 0); } return !domainObject.hasCapability('utilization') ? From d7f566088f22d4e5e67e4099d45adec756c8e716 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:25:02 -0700 Subject: [PATCH 058/167] [Timeline] Update spec to include logging --- .../actions/ExportTimelineAsCSVActionSpec.js | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/test/actions/ExportTimelineAsCSVActionSpec.js b/platform/features/timeline/test/actions/ExportTimelineAsCSVActionSpec.js index e0f09c3ae6..e31f25b074 100644 --- a/platform/features/timeline/test/actions/ExportTimelineAsCSVActionSpec.js +++ b/platform/features/timeline/test/actions/ExportTimelineAsCSVActionSpec.js @@ -24,7 +24,8 @@ define( ['../../src/actions/ExportTimelineAsCSVAction'], function (ExportTimelineAsCSVAction) { describe("ExportTimelineAsCSVAction", function () { - var mockExportService, + var mockLog, + mockExportService, mockNotificationService, mockNotification, mockDomainObject, @@ -39,6 +40,13 @@ define( ['getId', 'getModel', 'getCapability', 'hasCapability'] ); mockType = jasmine.createSpyObj('type', ['instanceOf']); + + mockLog = jasmine.createSpyObj('$log', [ + 'warn', + 'error', + 'info', + 'debug' + ]); mockExportService = jasmine.createSpyObj( 'exportService', ['exportCSV'] @@ -63,8 +71,10 @@ define( testContext = { domainObject: mockDomainObject }; action = new ExportTimelineAsCSVAction( + mockLog, mockExportService, mockNotificationService, + [], testContext ); }); @@ -129,8 +139,11 @@ define( }); describe("and an error occurs", function () { + var testError; + beforeEach(function () { - testPromise.reject(); + testError = { someProperty: "some value" }; + testPromise.reject(testError); waitsFor(function () { return mockCallback.calls.length > 0; }); @@ -145,6 +158,10 @@ define( expect(mockNotificationService.error) .toHaveBeenCalledWith(jasmine.any(String)); }); + + it("logs the root cause", function () { + expect(mockLog.warn).toHaveBeenCalledWith(testError); + }); }); }); }); From 80f5cb756d017f68165043cf31a88ef623ab5144 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:25:58 -0700 Subject: [PATCH 059/167] [Timeline] Account for new argument in spec --- .../timeline/test/actions/ExportTimelineAsCSVTaskSpec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/features/timeline/test/actions/ExportTimelineAsCSVTaskSpec.js b/platform/features/timeline/test/actions/ExportTimelineAsCSVTaskSpec.js index 0330e86397..4deab99801 100644 --- a/platform/features/timeline/test/actions/ExportTimelineAsCSVTaskSpec.js +++ b/platform/features/timeline/test/actions/ExportTimelineAsCSVTaskSpec.js @@ -52,6 +52,7 @@ define( task = new ExportTimelineAsCSVTask( mockExportService, + [], mockDomainObject ); }); From ba0d9a186b2c38cf89c29a38a61130d2fcd18a9e Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:26:47 -0700 Subject: [PATCH 060/167] [Timeline] Account for new argument in spec --- .../features/timeline/test/actions/TimelineColumnizerSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/timeline/test/actions/TimelineColumnizerSpec.js b/platform/features/timeline/test/actions/TimelineColumnizerSpec.js index d29bb14278..3c9b3de7e6 100644 --- a/platform/features/timeline/test/actions/TimelineColumnizerSpec.js +++ b/platform/features/timeline/test/actions/TimelineColumnizerSpec.js @@ -75,7 +75,7 @@ define( return c === 'metadata' && testMetadata; }); - exporter = new TimelineColumnizer(mockDomainObjects); + exporter = new TimelineColumnizer(mockDomainObjects, []); }); describe("rows", function () { From 73b922facfddf0070ed8e35f24c87df029e3cae7 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:32:44 -0700 Subject: [PATCH 061/167] [Timeline] Update specs for indexes instead of ids --- .../test/actions/CompositionColumnSpec.js | 17 +++++++++++------ .../timeline/test/actions/IdColumnSpec.js | 10 ++++++---- .../timeline/test/actions/ModeColumnSpec.js | 15 +++++++++++---- .../test/actions/TimelineColumnizerSpec.js | 7 ------- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/platform/features/timeline/test/actions/CompositionColumnSpec.js b/platform/features/timeline/test/actions/CompositionColumnSpec.js index 8cf566a080..df52d08db5 100644 --- a/platform/features/timeline/test/actions/CompositionColumnSpec.js +++ b/platform/features/timeline/test/actions/CompositionColumnSpec.js @@ -23,13 +23,20 @@ define( ['../../src/actions/CompositionColumn'], function (CompositionColumn) { + var TEST_IDS = ['a', 'b', 'c', 'd', 'e', 'f']; + describe("CompositionColumn", function () { var testIndex, + testIdMap, column; beforeEach(function () { testIndex = 3; - column = new CompositionColumn(testIndex); + testIdMap = TEST_IDS.reduce(function (map, id, index) { + map[id] = index; + return map; + }, {}); + column = new CompositionColumn(testIndex, testIdMap); }); it("includes a one-based index in its name", function () { @@ -46,15 +53,13 @@ define( 'domainObject', ['getId', 'getModel', 'getCapability'] ); - testModel = { - composition: ['a', 'b', 'c', 'd', 'e', 'f'] - }; + testModel = { composition: TEST_IDS }; mockDomainObject.getModel.andReturn(testModel); }); - it("returns a corresponding identifier", function () { + it("returns a corresponding value from the map", function () { expect(column.value(mockDomainObject)) - .toEqual(testModel.composition[testIndex]); + .toEqual(testIdMap[testModel.composition[testIndex]]); }); it("returns nothing when composition is exceeded", function () { diff --git a/platform/features/timeline/test/actions/IdColumnSpec.js b/platform/features/timeline/test/actions/IdColumnSpec.js index f44d255255..80b84680a4 100644 --- a/platform/features/timeline/test/actions/IdColumnSpec.js +++ b/platform/features/timeline/test/actions/IdColumnSpec.js @@ -24,10 +24,12 @@ define( ['../../src/actions/IdColumn'], function (IdColumn) { describe("IdColumn", function () { - var column; + var testIdMap, + column; beforeEach(function () { - column = new IdColumn(); + testIdMap = { "foo": "bar" }; + column = new IdColumn(testIdMap); }); it("has a name", function () { @@ -47,9 +49,9 @@ define( mockDomainObject.getId.andReturn(testId); }); - it("provides a domain object's identifier", function () { + it("provides a value mapped from domain object's identifier", function () { expect(column.value(mockDomainObject)) - .toEqual(testId); + .toEqual(testIdMap[testId]); }); }); diff --git a/platform/features/timeline/test/actions/ModeColumnSpec.js b/platform/features/timeline/test/actions/ModeColumnSpec.js index 446e3b1030..b828511266 100644 --- a/platform/features/timeline/test/actions/ModeColumnSpec.js +++ b/platform/features/timeline/test/actions/ModeColumnSpec.js @@ -23,13 +23,20 @@ define( ['../../src/actions/ModeColumn'], function (ModeColumn) { + var TEST_IDS = ['a', 'b', 'c', 'd', 'e', 'f'] + describe("ModeColumn", function () { var testIndex, + testIdMap, column; beforeEach(function () { testIndex = 3; - column = new ModeColumn(testIndex); + testIdMap = TEST_IDS.reduce(function (map, id, index) { + map[id] = index; + return map; + }, {}); + column = new ModeColumn(testIndex, testIdMap); }); it("includes a one-based index in its name", function () { @@ -48,15 +55,15 @@ define( ); testModel = { relationships: { - modes: ['a', 'b', 'c', 'd', 'e', 'f'] + modes: TEST_IDS } }; mockDomainObject.getModel.andReturn(testModel); }); - it("returns a corresponding identifier", function () { + it("returns a corresponding value from the map", function () { expect(column.value(mockDomainObject)) - .toEqual(testModel.relationships.modes[testIndex]); + .toEqual(testIdMap[testModel.relationships.modes[testIndex]]); }); it("returns nothing when relationships are exceeded", function () { diff --git a/platform/features/timeline/test/actions/TimelineColumnizerSpec.js b/platform/features/timeline/test/actions/TimelineColumnizerSpec.js index 3c9b3de7e6..980ed1e6c3 100644 --- a/platform/features/timeline/test/actions/TimelineColumnizerSpec.js +++ b/platform/features/timeline/test/actions/TimelineColumnizerSpec.js @@ -94,13 +94,6 @@ define( it("include one row per domain object", function () { expect(rows.length).toEqual(mockDomainObjects.length); }); - - it("includes identifiers for each domain object", function () { - rows.forEach(function (row, index) { - var id = mockDomainObjects[index].getId(); - expect(row.indexOf(id)).not.toEqual(-1); - }); - }); }); describe("headers", function () { From f9fd97230ff902929cbfceb03b703dc3e371375b Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 12:37:03 -0700 Subject: [PATCH 062/167] [Timeline] Satisfy JSHint --- .../features/timeline/src/actions/TimelineColumnizer.js | 8 -------- .../features/timeline/src/actions/UtilizationColumn.js | 3 --- platform/features/timeline/test/actions/ModeColumnSpec.js | 2 +- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/platform/features/timeline/src/actions/TimelineColumnizer.js b/platform/features/timeline/src/actions/TimelineColumnizer.js index fb0b80a7f7..011e87df9e 100644 --- a/platform/features/timeline/src/actions/TimelineColumnizer.js +++ b/platform/features/timeline/src/actions/TimelineColumnizer.js @@ -85,14 +85,6 @@ define([ } } - function addCostProperties(costCapability) { - costCapability.resources().forEach(function (key) { - if (costKeys.indexOf(key) === -1) { - costKeys.push(key); - } - }); - } - idMap = domainObjects.reduce(function (map, domainObject, index) { map[domainObject.getId()] = index + 1; return map; diff --git a/platform/features/timeline/src/actions/UtilizationColumn.js b/platform/features/timeline/src/actions/UtilizationColumn.js index e87794237b..9c9307271e 100644 --- a/platform/features/timeline/src/actions/UtilizationColumn.js +++ b/platform/features/timeline/src/actions/UtilizationColumn.js @@ -19,11 +19,8 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/*global define*/ define([], function () { - "use strict"; - /** * A column showing utilization costs associated with activities. * @constructor diff --git a/platform/features/timeline/test/actions/ModeColumnSpec.js b/platform/features/timeline/test/actions/ModeColumnSpec.js index b828511266..037aa5c34f 100644 --- a/platform/features/timeline/test/actions/ModeColumnSpec.js +++ b/platform/features/timeline/test/actions/ModeColumnSpec.js @@ -23,7 +23,7 @@ define( ['../../src/actions/ModeColumn'], function (ModeColumn) { - var TEST_IDS = ['a', 'b', 'c', 'd', 'e', 'f'] + var TEST_IDS = ['a', 'b', 'c', 'd', 'e', 'f']; describe("ModeColumn", function () { var testIndex, From b520d088183aef3a52a930392a551b9bf0565ecc Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 13:23:19 -0700 Subject: [PATCH 063/167] [Table] Begin work on CSV export #934 --- platform/features/table/res/templates/mct-table.html | 1 + platform/features/table/src/controllers/MCTTableController.js | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/platform/features/table/res/templates/mct-table.html b/platform/features/table/res/templates/mct-table.html index 7a18388455..72be43fe93 100644 --- a/platform/features/table/res/templates/mct-table.html +++ b/platform/features/table/res/templates/mct-table.html @@ -1,4 +1,5 @@
+
Export
diff --git a/platform/features/table/src/controllers/MCTTableController.js b/platform/features/table/src/controllers/MCTTableController.js index e4cfa45b23..25cb83d781 100644 --- a/platform/features/table/src/controllers/MCTTableController.js +++ b/platform/features/table/src/controllers/MCTTableController.js @@ -46,6 +46,10 @@ define( setDefaults($scope); + $scope.exportAsCSV = function () { + window.alert("Export!"); + }; + $scope.toggleSort = function (key) { if (!$scope.enableSort) { return; From f21f22d95c008f3f7939b8e91811b13fc30db426 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 13:43:44 -0700 Subject: [PATCH 064/167] [Table] Tweak appearance of export button --- platform/features/table/res/templates/mct-table.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/features/table/res/templates/mct-table.html b/platform/features/table/res/templates/mct-table.html index 72be43fe93..b2f8c44cbc 100644 --- a/platform/features/table/res/templates/mct-table.html +++ b/platform/features/table/res/templates/mct-table.html @@ -1,5 +1,11 @@
-
Export
+
From 699f6ba45864319b6280f34b3252b5935ef5aedc Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 13:54:10 -0700 Subject: [PATCH 065/167] [Table] Export table contents as CSV --- .../table/src/controllers/MCTTableController.js | 10 ++++++++-- platform/features/table/src/directives/MCTTable.js | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/platform/features/table/src/controllers/MCTTableController.js b/platform/features/table/src/controllers/MCTTableController.js index 25cb83d781..977584a6e2 100644 --- a/platform/features/table/src/controllers/MCTTableController.js +++ b/platform/features/table/src/controllers/MCTTableController.js @@ -12,7 +12,7 @@ define( * @param element * @constructor */ - function MCTTableController($scope, $timeout, element) { + function MCTTableController($scope, $timeout, element, exportService) { var self = this; this.$scope = $scope; @@ -47,7 +47,13 @@ define( setDefaults($scope); $scope.exportAsCSV = function () { - window.alert("Export!"); + var headers = $scope.headers; + exportService.exportCSV($scope.displayRows.map(function (row) { + return headers.reduce(function (r, header) { + r[header] = row[header].text; + return r; + }, {}); + }), { headers: headers }); }; $scope.toggleSort = function (key) { diff --git a/platform/features/table/src/directives/MCTTable.js b/platform/features/table/src/directives/MCTTable.js index 5dd8f9f03f..e7e3a00076 100644 --- a/platform/features/table/src/directives/MCTTable.js +++ b/platform/features/table/src/directives/MCTTable.js @@ -81,7 +81,13 @@ define( return { restrict: "E", template: TableTemplate, - controller: ['$scope', '$timeout', '$element', MCTTableController], + controller: [ + '$scope', + '$timeout', + '$element', + 'exportService', + MCTTableController + ], scope: { headers: "=", rows: "=", From 3eb960cf5a1bd4970df7d3a346cbab31013eab2d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 14:50:06 -0700 Subject: [PATCH 066/167] [Table] Move export button out of scroll --- .../features/table/res/templates/mct-table.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/features/table/res/templates/mct-table.html b/platform/features/table/res/templates/mct-table.html index b2f8c44cbc..5bc5aa4bbd 100644 --- a/platform/features/table/res/templates/mct-table.html +++ b/platform/features/table/res/templates/mct-table.html @@ -1,11 +1,11 @@ +
From 438511c5f7bdaf62ab7c162869c2273e7ee026be Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 15:07:17 -0700 Subject: [PATCH 067/167] [Table] Test CSV Export behavior --- .../src/controllers/MCTTableController.js | 2 +- .../controllers/MCTTableControllerSpec.js | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/platform/features/table/src/controllers/MCTTableController.js b/platform/features/table/src/controllers/MCTTableController.js index 977584a6e2..0acb173274 100644 --- a/platform/features/table/src/controllers/MCTTableController.js +++ b/platform/features/table/src/controllers/MCTTableController.js @@ -47,7 +47,7 @@ define( setDefaults($scope); $scope.exportAsCSV = function () { - var headers = $scope.headers; + var headers = $scope.displayHeaders; exportService.exportCSV($scope.displayRows.map(function (row) { return headers.reduce(function (r, header) { r[header] = row[header].text; diff --git a/platform/features/table/test/controllers/MCTTableControllerSpec.js b/platform/features/table/test/controllers/MCTTableControllerSpec.js index 26578ba244..7eefcb56f7 100644 --- a/platform/features/table/test/controllers/MCTTableControllerSpec.js +++ b/platform/features/table/test/controllers/MCTTableControllerSpec.js @@ -32,7 +32,8 @@ define( mockScope, watches, mockTimeout, - mockElement; + mockElement, + mockExportService; function promise(value) { return { @@ -67,11 +68,20 @@ define( offsetHeight: 1000 }; + mockExportService = jasmine.createSpyObj('exportService', [ + 'exportCSV' + ]); + mockScope.displayHeaders = true; mockTimeout = jasmine.createSpy('$timeout'); mockTimeout.andReturn(promise(undefined)); - controller = new MCTTableController(mockScope, mockTimeout, mockElement); + controller = new MCTTableController( + mockScope, + mockTimeout, + mockElement, + mockExportService + ); spyOn(controller, 'setVisibleRows').andCallThrough(); }); @@ -149,6 +159,22 @@ define( expect(controller.setVisibleRows).toHaveBeenCalled(); }); + it("can be exported as CSV", function () { + controller.setRows(testRows); + controller.setHeaders(Object.keys(testRows[0])); + mockScope.exportAsCSV(); + expect(mockExportService.exportCSV) + .toHaveBeenCalled(); + mockExportService.exportCSV.mostRecentCall.args[0] + .forEach(function (row, i) { + Object.keys(row).forEach(function (k) { + expect(row[k]).toEqual( + mockScope.displayRows[i][k].text + ); + }); + }); + }); + describe('sorting', function () { var sortedRows; From a5b7badb9586e5b0d8c31927babc2d51257154e3 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 25 May 2016 16:08:28 -0700 Subject: [PATCH 068/167] [Timeline] Remove obsolete arguments https://github.com/nasa/openmct/pull/955/files#r64668507 --- platform/features/timeline/res/templates/timeline.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/res/templates/timeline.html b/platform/features/timeline/res/templates/timeline.html index 6e74a8c7b2..0bb53d1196 100644 --- a/platform/features/timeline/res/templates/timeline.html +++ b/platform/features/timeline/res/templates/timeline.html @@ -111,14 +111,14 @@ X Y From bde2bc77099b616021bc54441e246bde71317223 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 25 May 2016 19:28:28 -0700 Subject: [PATCH 069/167] [Frontend] Bottom of holder divs adjusted open #913 --- platform/features/timeline/res/sass/_timelines.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/features/timeline/res/sass/_timelines.scss b/platform/features/timeline/res/sass/_timelines.scss index 251008a64c..006fccfbd9 100644 --- a/platform/features/timeline/res/sass/_timelines.scss +++ b/platform/features/timeline/res/sass/_timelines.scss @@ -52,6 +52,9 @@ // Tree area with item title right: auto; // Set this to auto and uncomment width below when additional tabular columns are added width: $timelineTabularTitleW; + .l-swimlanes-holder { + bottom: $scrollbarTrackSize; + } } &.l-tabular-r { // Start, end, duration, activity modes columns @@ -67,6 +70,7 @@ &.l-timeline-gantt { .l-swimlanes-holder { @include scrollV(scroll); + bottom: $scrollbarTrackSize; } } &.l-timeline-resource-legend { From c557fb6cd5a2c2d0a48df4517445fe93159c623a Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 25 May 2016 19:39:56 -0700 Subject: [PATCH 070/167] [Frontend] Cursor properties modified open #768 --- platform/features/timeline/res/sass/_activities.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/timeline/res/sass/_activities.scss b/platform/features/timeline/res/sass/_activities.scss index 5e729432f7..268c602ae8 100644 --- a/platform/features/timeline/res/sass/_activities.scss +++ b/platform/features/timeline/res/sass/_activities.scss @@ -59,7 +59,7 @@ .handle { cursor: col-resize; &.mid { - cursor: move; + cursor: ew-resize; } } } \ No newline at end of file From 33c208d8fe7cb2589b59f3a1e20bb57809d5730a Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 25 May 2016 20:52:36 -0700 Subject: [PATCH 071/167] [Frontend] Timeline Gantt bar mods to allow small min-width open #965 - CSS adjusted to handle min-width of 2px and better approach to ellipsizing text; - Angular ng-class added to hide icon and title if width less than a value; - Rounded corners on bars removed; --- .../timeline/res/sass/_activities.scss | 18 +++++++++++++++--- .../timeline/res/sass/_timeline-thematic.scss | 10 ---------- .../timeline/res/templates/activity-gantt.html | 1 + 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/platform/features/timeline/res/sass/_activities.scss b/platform/features/timeline/res/sass/_activities.scss index 268c602ae8..cfe69d6d01 100644 --- a/platform/features/timeline/res/sass/_activities.scss +++ b/platform/features/timeline/res/sass/_activities.scss @@ -1,16 +1,22 @@ .l-timeline-gantt { + min-width: 2px; + overflow: hidden; position: absolute; top: $timelineSwimlaneGanttVM; bottom: $timelineSwimlaneGanttVM; .bar { @include ellipsize(); height: $activityBarH; - line-height: $activityBarH + 2; + line-height: $activityBarH; padding: 0 $interiorMargin; span { - display: inline; + $iconW: 20px; + @include absPosDefault(); + display: block; &.s-activity-type { + right: auto; width: $iconW; + text-align: center; &.timeline { &:before { content:"S"; @@ -23,7 +29,9 @@ } } &.s-title { - text-shadow: rgba(black, 0.1) 0 1px 2px; + overflow: hidden; + text-overflow: ellipsis; + left: $iconW; } &.duration { left: auto; @@ -52,6 +60,10 @@ } } } + &.sm .bar span { + // Hide icon and label if width is too small + display: none; + } } .edit-mode .s-timeline-gantt, diff --git a/platform/features/timeline/res/sass/_timeline-thematic.scss b/platform/features/timeline/res/sass/_timeline-thematic.scss index 967a07462f..d4ab58b6e7 100644 --- a/platform/features/timeline/res/sass/_timeline-thematic.scss +++ b/platform/features/timeline/res/sass/_timeline-thematic.scss @@ -32,20 +32,10 @@ } .s-timeline-gantt { - $br: $controlCr; .bar { color: $colorGanttBarFg; @include activityBg($colorGanttBarBg); - border-radius: $br; box-shadow: $shdwGanttBar; - &.expanded { - @include border-top-radius($br); - @include border-bottom-radius(0); - } - &.leaf { - @include border-top-radius(0); - @include border-bottom-radius($br); - } .s-toggle { color: $colorGanttToggle; } diff --git a/platform/features/timeline/res/templates/activity-gantt.html b/platform/features/timeline/res/templates/activity-gantt.html index 69d1d8984a..1615431e91 100644 --- a/platform/features/timeline/res/templates/activity-gantt.html +++ b/platform/features/timeline/res/templates/activity-gantt.html @@ -20,6 +20,7 @@ at runtime from the About dialog for additional information. -->
Date: Thu, 26 May 2016 11:35:56 -0700 Subject: [PATCH 073/167] [Edit Mode] #629 rewriting disabled tests --- .../edit/test/actions/CancelActionSpec.js | 109 +++++++++++++----- .../test/ConductorRepresenterSpec.js | 2 +- 2 files changed, 79 insertions(+), 32 deletions(-) diff --git a/platform/commonUI/edit/test/actions/CancelActionSpec.js b/platform/commonUI/edit/test/actions/CancelActionSpec.js index 411fdb1659..b83fbdab2b 100644 --- a/platform/commonUI/edit/test/actions/CancelActionSpec.js +++ b/platform/commonUI/edit/test/actions/CancelActionSpec.js @@ -24,12 +24,11 @@ define( ["../../src/actions/CancelAction"], function (CancelAction) { - //TODO: Disabled for NEM Beta - xdescribe("The Cancel action", function () { - var mockLocation, - mockDomainObject, - mockEditorCapability, - mockUrlService, + describe("The Cancel action", function () { + var mockDomainObject, + mockParentObject, + capabilities = {}, + parentCapabilities = {}, actionContext, action; @@ -42,61 +41,109 @@ define( } beforeEach(function () { - mockLocation = jasmine.createSpyObj( - "$location", - ["path"] - ); mockDomainObject = jasmine.createSpyObj( "domainObject", - ["getCapability", "hasCapability"] + [ + "getCapability", + "hasCapability", + "getModel" + ] ); - mockEditorCapability = jasmine.createSpyObj( + mockDomainObject.getModel.andReturn({}); + + mockParentObject = jasmine.createSpyObj( + "parentObject", + [ + "getCapability" + ] + ); + mockParentObject.getCapability.andCallFake(function (name) { + return parentCapabilities[name]; + }); + + capabilities.editor = jasmine.createSpyObj( "editor", - ["save", "cancel"] + ["save", "cancel", "isEditContextRoot"] ); - mockUrlService = jasmine.createSpyObj( - "urlService", - ["urlForLocation"] + capabilities.action = jasmine.createSpyObj( + "actionCapability", + [ + "perform" + ] + ); + capabilities.location = jasmine.createSpyObj( + "locationCapability", + [ + "getOriginal" + ] + ); + capabilities.location.getOriginal.andReturn(mockPromise(mockDomainObject)); + capabilities.context = jasmine.createSpyObj( + "contextCapability", + [ + "getParent" + ] + ); + capabilities.context.getParent.andReturn(mockParentObject); + + parentCapabilities.action = jasmine.createSpyObj( + "actionCapability", + [ + "perform" + ] ); actionContext = { domainObject: mockDomainObject }; - mockDomainObject.hasCapability.andReturn(true); - mockDomainObject.getCapability.andReturn(mockEditorCapability); - mockEditorCapability.cancel.andReturn(mockPromise(true)); + mockDomainObject.getCapability.andCallFake(function (name) { + return capabilities[name]; + }); - action = new CancelAction(mockLocation, mockUrlService, actionContext); + mockDomainObject.hasCapability.andCallFake(function (name) { + return !!capabilities[name]; + }); + + capabilities.editor.cancel.andReturn(mockPromise(true)); + + action = new CancelAction(actionContext); }); - it("only applies to domain object with an editor capability", function () { + it("only applies to domain object that is being edited", function () { + capabilities.editor.isEditContextRoot.andReturn(true); expect(CancelAction.appliesTo(actionContext)).toBeTruthy(); expect(mockDomainObject.hasCapability).toHaveBeenCalledWith("editor"); + capabilities.editor.isEditContextRoot.andReturn(false); + expect(CancelAction.appliesTo(actionContext)).toBeFalsy(); + mockDomainObject.hasCapability.andReturn(false); - mockDomainObject.getCapability.andReturn(undefined); expect(CancelAction.appliesTo(actionContext)).toBeFalsy(); }); - it("invokes the editor capability's save functionality when performed", function () { - // Verify precondition - expect(mockEditorCapability.cancel).not.toHaveBeenCalled(); + it("invokes the editor capability's cancel functionality when" + + " performed", function () { action.perform(); // Should have called cancel - expect(mockEditorCapability.cancel).toHaveBeenCalled(); + expect(capabilities.editor.cancel).toHaveBeenCalled(); // Definitely shouldn't call save! - expect(mockEditorCapability.save).not.toHaveBeenCalled(); + expect(capabilities.editor.save).not.toHaveBeenCalled(); }); - it("returns to browse when performed", function () { + it("navigates to object if existing", function () { + mockDomainObject.getModel.andReturn({persisted: 1}); action.perform(); - expect(mockLocation.path).toHaveBeenCalledWith( - mockUrlService.urlForLocation("browse", mockDomainObject) - ); + expect(capabilities.action.perform).toHaveBeenCalledWith("navigate"); + }); + + it("navigates to parent if new", function () { + mockDomainObject.getModel.andReturn({persisted: undefined}); + action.perform(); + expect(parentCapabilities.action.perform).toHaveBeenCalledWith("navigate"); }); }); } diff --git a/platform/features/conductor/test/ConductorRepresenterSpec.js b/platform/features/conductor/test/ConductorRepresenterSpec.js index 83d37fb8a6..bd60b303e1 100644 --- a/platform/features/conductor/test/ConductorRepresenterSpec.js +++ b/platform/features/conductor/test/ConductorRepresenterSpec.js @@ -42,7 +42,7 @@ define( 'parent' ]; - xdescribe("ConductorRepresenter", function () { + describe("ConductorRepresenter", function () { var mockThrottle, mockConductorService, mockCompile, From f30174185261c6adf4515ac3debe4d86e8061ed4 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 26 May 2016 11:42:15 -0700 Subject: [PATCH 074/167] [Edit Mode] #629 restored disabled tests for DropGesture. Removed extraneous argument to broadcast function --- .../src/gestures/DropGesture.js | 3 +-- .../test/gestures/DropGestureSpec.js | 20 +------------------ 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/platform/representation/src/gestures/DropGesture.js b/platform/representation/src/gestures/DropGesture.js index 966618d88c..8da98b38a7 100644 --- a/platform/representation/src/gestures/DropGesture.js +++ b/platform/representation/src/gestures/DropGesture.js @@ -61,8 +61,7 @@ define( { x: event.pageX - rect.left, y: event.pageY - rect.top - }, - domainObject + } ); } } diff --git a/platform/representation/test/gestures/DropGestureSpec.js b/platform/representation/test/gestures/DropGestureSpec.js index 79ed9d1139..f8ed7c80da 100644 --- a/platform/representation/test/gestures/DropGestureSpec.js +++ b/platform/representation/test/gestures/DropGestureSpec.js @@ -34,8 +34,7 @@ define( TEST_ID = "test-id", DROP_ID = "drop-id"; - //TODO: Disabled for NEM Beta - xdescribe("The drop gesture", function () { + describe("The drop gesture", function () { var mockDndService, mockQ, mockElement, @@ -144,23 +143,6 @@ define( expect(mockCompose.perform).toHaveBeenCalled(); }); - - it("does not invoke compose on drop in browse mode for non-folders", function () { - // Set the mockDomainObject to not have the editor capability - mockDomainObject.hasCapability.andReturn(false); - // Set the mockDomainObject to not have a type of folder - mockDomainObject.getModel.andReturn({type: 'notAFolder'}); - - callbacks.dragover(mockEvent); - expect(mockAction.getActions).toHaveBeenCalledWith({ - key: 'compose', - selectedObject: mockDraggedObject - }); - callbacks.drop(mockEvent); - expect(mockCompose.perform).not.toHaveBeenCalled(); - }); - - it("invokes compose on drop in browse mode for folders", function () { // Set the mockDomainObject to not have the editor capability mockDomainObject.hasCapability.andReturn(false); From 165e158f3770a979f5d0818888df3cbb926bacdb Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 26 May 2016 11:44:43 -0700 Subject: [PATCH 075/167] [Edit Mode] #629 Removed redundant test from DomainObjectProviderSpec --- platform/core/test/objects/DomainObjectProviderSpec.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/platform/core/test/objects/DomainObjectProviderSpec.js b/platform/core/test/objects/DomainObjectProviderSpec.js index c8450551f4..4e60f19645 100644 --- a/platform/core/test/objects/DomainObjectProviderSpec.js +++ b/platform/core/test/objects/DomainObjectProviderSpec.js @@ -82,16 +82,6 @@ define( expect(result.a.getModel()).toEqual(model); }); - //TODO: Disabled for NEM Beta - xit("provides a new, fully constituted domain object for a" + - " provided model", function () { - var model = { someKey: "some value"}, - result; - result = provider.newObject("a", model); - expect(result.getId()).toEqual("a"); - expect(result.getModel()).toEqual(model); - }); - }); } ); From 568927995405c3d39d4bc956ddf5eb6931832986 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 26 May 2016 11:53:16 -0700 Subject: [PATCH 076/167] [Timeline] Add JSDoc for idMap https://github.com/nasa/openmct/pull/962#discussion_r64676750 https://github.com/nasa/openmct/pull/962#discussion_r64677198 --- platform/features/timeline/src/actions/CompositionColumn.js | 3 +++ platform/features/timeline/src/actions/IdColumn.js | 5 ++++- platform/features/timeline/src/actions/ModeColumn.js | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/features/timeline/src/actions/CompositionColumn.js b/platform/features/timeline/src/actions/CompositionColumn.js index 3fff0bda37..e33f028f99 100644 --- a/platform/features/timeline/src/actions/CompositionColumn.js +++ b/platform/features/timeline/src/actions/CompositionColumn.js @@ -27,6 +27,9 @@ define([], function () { * in a domain object's composition. * @param {number} index the zero-based index of the composition * element associated with this column + * @param idMap an object containing key value pairs, where keys + * are domain object identifiers and values are whatever + * should appear in CSV output in their place * @constructor * @implements {platform/features/timeline.TimelineCSVColumn} */ diff --git a/platform/features/timeline/src/actions/IdColumn.js b/platform/features/timeline/src/actions/IdColumn.js index b6ff15fe6c..9148ef6a8b 100644 --- a/platform/features/timeline/src/actions/IdColumn.js +++ b/platform/features/timeline/src/actions/IdColumn.js @@ -23,8 +23,11 @@ define([], function () { /** - * A column showing domain object identifiers. + * A column showing identifying domain objects. * @constructor + * @param idMap an object containing key value pairs, where keys + * are domain object identifiers and values are whatever + * should appear in CSV output in their place * @implements {platform/features/timeline.TimelineCSVColumn} */ function IdColumn(idMap) { diff --git a/platform/features/timeline/src/actions/ModeColumn.js b/platform/features/timeline/src/actions/ModeColumn.js index 26b307cbd0..05eec7a30a 100644 --- a/platform/features/timeline/src/actions/ModeColumn.js +++ b/platform/features/timeline/src/actions/ModeColumn.js @@ -27,6 +27,9 @@ define([], function () { * @constructor * @param {number} index the zero-based index of the composition * element associated with this column + * @param idMap an object containing key value pairs, where keys + * are domain object identifiers and values are whatever + * should appear in CSV output in their place * @implements {platform/features/timeline.TimelineCSVColumn} */ function ModeColumn(index, idMap) { From 7fc2fcfa07afbaff5eb1fd7cfb4a7649957f80ed Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 26 May 2016 11:55:13 -0700 Subject: [PATCH 077/167] [Edit Mode] #629 Rewrote obsolete DomainColumn tests --- .../features/table/test/DomainColumnSpec.js | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/platform/features/table/test/DomainColumnSpec.js b/platform/features/table/test/DomainColumnSpec.js index e707c8dd0b..516c32deae 100644 --- a/platform/features/table/test/DomainColumnSpec.js +++ b/platform/features/table/test/DomainColumnSpec.js @@ -30,23 +30,21 @@ define( var TEST_DOMAIN_VALUE = "some formatted domain value"; describe("A domain column", function () { - var mockDataSet, + var mockDatum, testMetadata, mockFormatter, column; beforeEach(function () { - mockDataSet = jasmine.createSpyObj( - "data", - ["getDomainValue"] - ); + mockFormatter = jasmine.createSpyObj( "formatter", ["formatDomainValue", "formatRangeValue"] ); testMetadata = { key: "testKey", - name: "Test Name" + name: "Test Name", + format: "Test Format" }; mockFormatter.formatDomainValue.andReturn(TEST_DOMAIN_VALUE); @@ -57,24 +55,24 @@ define( expect(column.getTitle()).toEqual("Test Name"); }); - xit("looks up data from a data set", function () { - column.getValue(undefined, mockDataSet, 42); - expect(mockDataSet.getDomainValue) - .toHaveBeenCalledWith(42, "testKey"); - }); + describe("when given a datum", function () { + beforeEach(function () { + mockDatum = { + testKey: "testKeyValue" + }; + }); - xit("formats domain values as time", function () { - mockDataSet.getDomainValue.andReturn(402513731000); + it("looks up data from the given datum", function () { + expect(column.getValue(undefined, mockDatum)) + .toEqual({ text: TEST_DOMAIN_VALUE }); + }); - // Should have just given the value the formatter gave - expect(column.getValue(undefined, mockDataSet, 42).text) - .toEqual(TEST_DOMAIN_VALUE); + it("uses formatter to format domain values as requested", function () { + column.getValue(undefined, mockDatum); + expect(mockFormatter.formatDomainValue) + .toHaveBeenCalledWith("testKeyValue", "Test Format"); + }); - // Make sure that service interactions were as expected - expect(mockFormatter.formatDomainValue) - .toHaveBeenCalledWith(402513731000); - expect(mockFormatter.formatRangeValue) - .not.toHaveBeenCalled(); }); }); From e9cac6eff3d88a7524edfddcb864a212aa716440 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 26 May 2016 11:57:07 -0700 Subject: [PATCH 078/167] [Timeline] Add JSDoc for new parameter https://github.com/nasa/openmct/pull/962#discussion_r64677520 --- platform/features/timeline/src/actions/TimelineColumnizer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/features/timeline/src/actions/TimelineColumnizer.js b/platform/features/timeline/src/actions/TimelineColumnizer.js index 011e87df9e..92e54b1860 100644 --- a/platform/features/timeline/src/actions/TimelineColumnizer.js +++ b/platform/features/timeline/src/actions/TimelineColumnizer.js @@ -65,6 +65,7 @@ define([ * * @param {DomainObject[]} domainObjects the objects to include * in the exported data + * @param {Array} resources an array of `resources` extensions * @constructor * @memberof {platform/features/timeline} */ From dade6b2254f85b72b6cf61a5c198885d8c532eb6 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 26 May 2016 11:58:40 -0700 Subject: [PATCH 079/167] [Timeline] Use positive logic for clarity https://github.com/nasa/openmct/pull/962#discussion_r64678013 --- platform/features/timeline/src/actions/UtilizationColumn.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/features/timeline/src/actions/UtilizationColumn.js b/platform/features/timeline/src/actions/UtilizationColumn.js index 9c9307271e..7a92ce668e 100644 --- a/platform/features/timeline/src/actions/UtilizationColumn.js +++ b/platform/features/timeline/src/actions/UtilizationColumn.js @@ -62,10 +62,10 @@ define([], function () { }, 0); } - return !domainObject.hasCapability('utilization') ? - "" : + return domainObject.hasCapability('utilization') ? domainObject.getCapability('utilization').internal() - .then(getUtilizationValue); + .then(getUtilizationValue) : + ""; }; return UtilizationColumn; From 9820f9d9c5b24f0676f400f080d911e3f09f9046 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 26 May 2016 12:45:25 -0700 Subject: [PATCH 080/167] [Frontend] Mod CSS to properly hide nav-to-parent when editing fixes #970 Not sure what problem was, but betting this was due to removal of an ng-class previously in markup; --- platform/commonUI/general/res/sass/user-environ/_layout.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/general/res/sass/user-environ/_layout.scss b/platform/commonUI/general/res/sass/user-environ/_layout.scss index 9e8e9aaae1..8537c85520 100644 --- a/platform/commonUI/general/res/sass/user-environ/_layout.scss +++ b/platform/commonUI/general/res/sass/user-environ/_layout.scss @@ -288,8 +288,9 @@ body.desktop .pane .mini-tab-icon.toggle-pane { .left { padding-right: $interiorMarginLg; - .l-back:not(.s-status-editing) { + .l-back { margin-right: $interiorMarginLg; + &.s-status-editing { display: none; } } } } From d8a097a95a030ad63ce84f8d2ec535cb9b3783fe Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 26 May 2016 16:46:06 -0700 Subject: [PATCH 081/167] [Tables] Added timeouts to yield control to ui thread. Fixes #972 --- platform/features/table/bundle.js | 2 +- .../table/res/templates/historical-table.html | 2 +- .../controllers/HistoricalTableController.js | 58 ++++++++++++++++--- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/platform/features/table/bundle.js b/platform/features/table/bundle.js index cdcb6603d9..f16cda0d8a 100644 --- a/platform/features/table/bundle.js +++ b/platform/features/table/bundle.js @@ -109,7 +109,7 @@ define([ { "key": "HistoricalTableController", "implementation": HistoricalTableController, - "depends": ["$scope", "telemetryHandler", "telemetryFormatter"] + "depends": ["$scope", "telemetryHandler", "telemetryFormatter", "$timeout", "$q"] }, { "key": "RealtimeTableController", diff --git a/platform/features/table/res/templates/historical-table.html b/platform/features/table/res/templates/historical-table.html index 9917c41dcc..603569f1d1 100644 --- a/platform/features/table/res/templates/historical-table.html +++ b/platform/features/table/res/templates/historical-table.html @@ -1,4 +1,4 @@ -
+
Date: Fri, 27 May 2016 15:07:21 -0700 Subject: [PATCH 082/167] Second rewrite --- platform/features/table/bundle.js | 2 +- .../controllers/HistoricalTableController.js | 107 +++++++++++------- .../controllers/TelemetryTableController.js | 12 +- 3 files changed, 80 insertions(+), 41 deletions(-) diff --git a/platform/features/table/bundle.js b/platform/features/table/bundle.js index f16cda0d8a..6d53711c94 100644 --- a/platform/features/table/bundle.js +++ b/platform/features/table/bundle.js @@ -109,7 +109,7 @@ define([ { "key": "HistoricalTableController", "implementation": HistoricalTableController, - "depends": ["$scope", "telemetryHandler", "telemetryFormatter", "$timeout", "$q"] + "depends": ["$scope", "telemetryHandler", "telemetryFormatter", "$timeout"] }, { "key": "RealtimeTableController", diff --git a/platform/features/table/src/controllers/HistoricalTableController.js b/platform/features/table/src/controllers/HistoricalTableController.js index c03a982981..da9b1d41a0 100644 --- a/platform/features/table/src/controllers/HistoricalTableController.js +++ b/platform/features/table/src/controllers/HistoricalTableController.js @@ -25,6 +25,7 @@ define( './TelemetryTableController' ], function (TableController) { + var BATCH_SIZE = 1000; /** * Extends TelemetryTableController and adds real-time streaming @@ -35,11 +36,18 @@ define( * @param telemetryFormatter * @constructor */ - function HistoricalTableController($scope, telemetryHandler, telemetryFormatter, $timeout, $q) { + function HistoricalTableController($scope, telemetryHandler, telemetryFormatter, $timeout) { + var self = this; + this.$timeout = $timeout; - this.$q = $q; + this.timeouts = []; + this.batchSize = BATCH_SIZE; + + $scope.$on("$destroy", function () { + self.cancelAllTimeouts(); + }); + TableController.call(this, $scope, telemetryHandler, telemetryFormatter); - $scope.loading = true; } HistoricalTableController.prototype = Object.create(TableController.prototype); @@ -57,54 +65,77 @@ define( } /** + * Cancels outstanding processing * @private */ - HistoricalTableController.prototype.yieldingLoop = function (index, max, forEach, yieldAfter) { - var self = this; - - if (index < max) { - forEach(index); - if (index % yieldAfter === 0) { - return this.$timeout(function () { - return self.yieldingLoop(++index, max, forEach, yieldAfter); - }); - } else { - return self.yieldingLoop(++index, max, forEach, yieldAfter); - } - } else { - return this.$q.when(undefined); - } + HistoricalTableController.prototype.cancelAllTimeouts = function() { + this.timeouts.forEach(function (timeout) { + clearTimeout(timeout); + }); + this.timeouts = []; }; /** - * Populates historical data on scope when it becomes available from - * the telemetry API + * Will yield execution of a long running process, allowing + * execution of UI and other activities + * @private + * @param callback the function to execute after yielding + * @returns {number} */ + HistoricalTableController.prototype.yield = function(callback) { + return setTimeout(callback, 0); + }; + + /** + * Populates historical data on scope when it becomes available from + * the telemetry API + */ HistoricalTableController.prototype.addHistoricalData = function () { var rowData = [], - self = this; + self = this, + telemetryObjects = this.handle.getTelemetryObjects(); - this.$scope.loading = true; + this.cancelAllTimeouts(); - function processTelemetryObject(telemetryObject) { - var series = self.handle.getSeries(telemetryObject) || {}, - pointCount = series.getPointCount ? series.getPointCount() : 0, - i = 0; + function processTelemetryObject(offset) { + var telemetryObject = telemetryObjects[offset], + series = self.handle.getSeries(telemetryObject) || {}, + pointCount = series.getPointCount ? series.getPointCount() : 0; - return self.yieldingLoop(i, pointCount, function (index) { - rowData.push(self.table.getRowValues(telemetryObject, - self.handle.makeDatum(telemetryObject, series, index))); - }, 1000); + function processBatch(start, end, done) { + var i; + + if (start < pointCount) { + for (i = start; i < end; i++) { + rowData.push(self.table.getRowValues(telemetryObject, + self.handle.makeDatum(telemetryObject, series, i))); + } + self.timeouts.push(self.yield(function () { + processBatch(end, end + self.batchSize, done); + })); + } else { + offset++; + if (offset < telemetryObjects.length) { + processTelemetryObject(offset); + } else { + // Apply digest. Digest may not be necessary here, so + // using $timeout instead of $scope.$apply to avoid + // in progress error + self.$timeout(function () { + self.$scope.loading = false; + self.$scope.rows = rowData; + }); + } + } + } + processBatch(0, self.batchSize); + } + + if (telemetryObjects.length > 0) { + this.$scope.loading = true; + processTelemetryObject(0); } - this.handle.getTelemetryObjects().reduce(function (promise, telemetryObject) { - return promise.then(function () { - return processTelemetryObject(telemetryObject); - }); - }, self.$q.when(undefined)).then(function () { - self.$scope.rows = rowData; - self.$scope.loading = false; - }); }; return HistoricalTableController; diff --git a/platform/features/table/src/controllers/TelemetryTableController.js b/platform/features/table/src/controllers/TelemetryTableController.js index 3f4e69db12..cad24022e9 100644 --- a/platform/features/table/src/controllers/TelemetryTableController.js +++ b/platform/features/table/src/controllers/TelemetryTableController.js @@ -83,16 +83,24 @@ define( * @private */ TelemetryTableController.prototype.registerChangeListeners = function () { + var self=this; this.unregisterChangeListeners(); // When composition changes, re-subscribe to the various // telemetry subscriptions this.changeListeners.push(this.$scope.$watchCollection( - 'domainObject.getModel().composition', this.subscribe.bind(this))); + 'domainObject.getModel().composition', + function (newVal, oldVal) { + if (newVal !== oldVal) { + self.subscribe(); + } + }) + ); //Change of bounds in time conductor this.changeListeners.push(this.$scope.$on('telemetry:display:bounds', - this.subscribe.bind(this))); + this.subscribe.bind(this)) + ); }; /** From 0218f42e2b2d52de72af1d342f946d7291f9cdca Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 27 May 2016 15:25:06 -0700 Subject: [PATCH 083/167] removed redundant code --- .../src/controllers/HistoricalTableController.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/platform/features/table/src/controllers/HistoricalTableController.js b/platform/features/table/src/controllers/HistoricalTableController.js index da9b1d41a0..35f223cbe0 100644 --- a/platform/features/table/src/controllers/HistoricalTableController.js +++ b/platform/features/table/src/controllers/HistoricalTableController.js @@ -52,18 +52,6 @@ define( HistoricalTableController.prototype = Object.create(TableController.prototype); - function fastPromise(value) { - if (value && value.then) { - return value; - } else { - return { - then: function (callback) { - return fastPromise(callback(value)); - } - }; - } - } - /** * Cancels outstanding processing * @private From 01c85cb58d19f6100f0b5ea4822c42f8216b99c0 Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Tue, 31 May 2016 12:02:22 +0100 Subject: [PATCH 084/167] [Table] #972 Further refactoring, tests, style fixes --- .../controllers/HistoricalTableController.js | 61 +++++------- .../controllers/TelemetryTableController.js | 2 +- .../HistoricalTableControllerSpec.js | 93 ++++++++++++++++++- 3 files changed, 115 insertions(+), 41 deletions(-) diff --git a/platform/features/table/src/controllers/HistoricalTableController.js b/platform/features/table/src/controllers/HistoricalTableController.js index 35f223cbe0..ebf9bc5573 100644 --- a/platform/features/table/src/controllers/HistoricalTableController.js +++ b/platform/features/table/src/controllers/HistoricalTableController.js @@ -40,11 +40,11 @@ define( var self = this; this.$timeout = $timeout; - this.timeouts = []; + this.timeoutHandle = undefined; this.batchSize = BATCH_SIZE; $scope.$on("$destroy", function () { - self.cancelAllTimeouts(); + clearTimeout(self.timeoutHandle); }); TableController.call(this, $scope, telemetryHandler, telemetryFormatter); @@ -52,28 +52,6 @@ define( HistoricalTableController.prototype = Object.create(TableController.prototype); - /** - * Cancels outstanding processing - * @private - */ - HistoricalTableController.prototype.cancelAllTimeouts = function() { - this.timeouts.forEach(function (timeout) { - clearTimeout(timeout); - }); - this.timeouts = []; - }; - - /** - * Will yield execution of a long running process, allowing - * execution of UI and other activities - * @private - * @param callback the function to execute after yielding - * @returns {number} - */ - HistoricalTableController.prototype.yield = function(callback) { - return setTimeout(callback, 0); - }; - /** * Populates historical data on scope when it becomes available from * the telemetry API @@ -83,32 +61,39 @@ define( self = this, telemetryObjects = this.handle.getTelemetryObjects(); - this.cancelAllTimeouts(); - function processTelemetryObject(offset) { var telemetryObject = telemetryObjects[offset], series = self.handle.getSeries(telemetryObject) || {}, pointCount = series.getPointCount ? series.getPointCount() : 0; - function processBatch(start, end, done) { + function processBatch(start, end) { var i; + end = Math.min(pointCount, end); - if (start < pointCount) { - for (i = start; i < end; i++) { - rowData.push(self.table.getRowValues(telemetryObject, - self.handle.makeDatum(telemetryObject, series, i))); - } - self.timeouts.push(self.yield(function () { - processBatch(end, end + self.batchSize, done); - })); + clearTimeout(self.timeoutHandle); + delete self.timeoutHandle; + + //The row offset (ie. batch start point) does not exceed the rows available + for (i = start; i < end; i++) { + rowData.push(self.table.getRowValues(telemetryObject, + self.handle.makeDatum(telemetryObject, series, i))); + } + if (end < pointCount) { + //Yield if necessary + self.timeoutHandle = setTimeout(function () { + processBatch(end, end + self.batchSize); + }, 0); } else { + //All rows for this object have been processed, so check if there are more objects to process offset++; if (offset < telemetryObjects.length) { + //More telemetry object to process processTelemetryObject(offset); } else { - // Apply digest. Digest may not be necessary here, so - // using $timeout instead of $scope.$apply to avoid - // in progress error + // No more objects to process. Apply rows to scope + // Apply digest. Digest may be in progress (if batch small + // enough to not require yield), so using $timeout instead + // of $scope.$apply to avoid in progress error self.$timeout(function () { self.$scope.loading = false; self.$scope.rows = rowData; diff --git a/platform/features/table/src/controllers/TelemetryTableController.js b/platform/features/table/src/controllers/TelemetryTableController.js index cad24022e9..34b67c804e 100644 --- a/platform/features/table/src/controllers/TelemetryTableController.js +++ b/platform/features/table/src/controllers/TelemetryTableController.js @@ -83,7 +83,7 @@ define( * @private */ TelemetryTableController.prototype.registerChangeListeners = function () { - var self=this; + var self = this; this.unregisterChangeListeners(); // When composition changes, re-subscribe to the various diff --git a/platform/features/table/test/controllers/HistoricalTableControllerSpec.js b/platform/features/table/test/controllers/HistoricalTableControllerSpec.js index 54c213d5a6..8d9f0f34f9 100644 --- a/platform/features/table/test/controllers/HistoricalTableControllerSpec.js +++ b/platform/features/table/test/controllers/HistoricalTableControllerSpec.js @@ -34,6 +34,7 @@ define( mockDomainObject, mockTable, mockConfiguration, + mockAngularTimeout, watches, controller; @@ -63,6 +64,8 @@ define( watches[expression] = callback; }); + mockAngularTimeout = jasmine.createSpy('$timeout'); + mockConfiguration = { 'range1': true, 'range2': true, @@ -107,7 +110,7 @@ define( ]); mockTelemetryHandler.handle.andReturn(mockTelemetryHandle); - controller = new TableController(mockScope, mockTelemetryHandler, mockTelemetryFormatter); + controller = new TableController(mockScope, mockTelemetryHandler, mockTelemetryFormatter, mockAngularTimeout); controller.table = mockTable; controller.handle = mockTelemetryHandle; }); @@ -163,6 +166,9 @@ define( controller.addHistoricalData(mockDomainObject, mockSeries); + expect(mockAngularTimeout).toHaveBeenCalled(); + mockAngularTimeout.mostRecentCall.args[0](); + expect(controller.$scope.rows.length).toBe(5); expect(controller.$scope.rows[0]).toBe(mockRow); }); @@ -198,7 +204,7 @@ define( ' object composition changes', function () { controller.registerChangeListeners(); expect(watches['domainObject.getModel().composition']).toBeDefined(); - watches['domainObject.getModel().composition'](); + watches['domainObject.getModel().composition']([], []); expect(controller.subscribe).toHaveBeenCalled(); }); @@ -219,6 +225,89 @@ define( }); }); + describe('Yields thread', function () { + var mockSeries, + mockRow, + mockWindowTimeout = {}; + + beforeEach(function () { + mockSeries = { + getPointCount: function () { + return 5; + }, + getDomainValue: function () { + return 'Domain Value'; + }, + getRangeValue: function () { + return 'Range Value'; + } + }; + mockRow = {'domain': 'Domain Value', 'range': 'Range Value'}; + + mockTelemetryHandle.makeDatum.andCallFake(function () { + return mockRow; + }); + mockTable.getRowValues.andReturn(mockRow); + mockTelemetryHandle.getTelemetryObjects.andReturn([mockDomainObject]); + mockTelemetryHandle.getSeries.andReturn(mockSeries); + + jasmine.getGlobal().setTimeout = jasmine.createSpy("setTimeout"); + jasmine.getGlobal().setTimeout.andReturn(mockWindowTimeout); + jasmine.getGlobal().clearTimeout = jasmine.createSpy("clearTimeout"); + + }); + it('only when necessary', function () { + + controller.batchSize = 1000; + controller.addHistoricalData(mockDomainObject, mockSeries); + + expect(mockAngularTimeout).toHaveBeenCalled(); + mockAngularTimeout.mostRecentCall.args[0](); + + expect(controller.$scope.rows.length).toBe(5); + expect(controller.$scope.rows[0]).toBe(mockRow); + + expect(jasmine.getGlobal().setTimeout).not.toHaveBeenCalled(); + + }); + it('when row count exceeds batch size', function () { + controller.batchSize = 3; + controller.addHistoricalData(mockDomainObject, mockSeries); + + expect(jasmine.getGlobal().setTimeout).toHaveBeenCalled(); + jasmine.getGlobal().setTimeout.mostRecentCall.args[0](); + + expect(mockAngularTimeout).toHaveBeenCalled(); + mockAngularTimeout.mostRecentCall.args[0](); + + expect(controller.$scope.rows.length).toBe(5); + expect(controller.$scope.rows[0]).toBe(mockRow); + }); + it('cancelling any outstanding timeouts', function () { + controller.batchSize = 3; + controller.addHistoricalData(mockDomainObject, mockSeries); + + expect(jasmine.getGlobal().setTimeout).toHaveBeenCalled(); + jasmine.getGlobal().setTimeout.mostRecentCall.args[0](); + + controller.addHistoricalData(mockDomainObject, mockSeries); + + expect(jasmine.getGlobal().clearTimeout).toHaveBeenCalledWith(mockWindowTimeout); + }); + it('cancels timeout on scope destruction', function () { + controller.batchSize = 3; + controller.addHistoricalData(mockDomainObject, mockSeries); + + expect(jasmine.getGlobal().setTimeout).toHaveBeenCalled(); + jasmine.getGlobal().setTimeout.mostRecentCall.args[0](); + + //Call destroy function + expect(mockScope.$on).toHaveBeenCalledWith("$destroy", jasmine.any(Function)); + mockScope.$on.mostRecentCall.args[1](); + expect(jasmine.getGlobal().clearTimeout).toHaveBeenCalledWith(mockWindowTimeout); + + }); + }); }); } ); From 661b3d58893a95afa79aa83903e5b3352db2b614 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Tue, 31 May 2016 09:50:12 -0700 Subject: [PATCH 085/167] [Frontend] Styling Export button fixes #973 - In progress: - Added new download symbol to symbols font; - Added export symbol to export button; - Layout/markup/SASS for historical tabular view modified; --- .../icomoon.io-WTD-symbols-project.json | 4565 ++++++++++------- .../general/res/fonts/symbols/wtdsymbols.eot | Bin 13576 -> 13660 bytes .../general/res/fonts/symbols/wtdsymbols.svg | 1 + .../general/res/fonts/symbols/wtdsymbols.ttf | Bin 13400 -> 13484 bytes .../general/res/fonts/symbols/wtdsymbols.woff | Bin 13476 -> 13560 bytes .../general/res/sass/controls/_buttons.scss | 8 + .../general/res/sass/lists/_tabular.scss | 10 + .../table/res/templates/historical-table.html | 3 +- .../table/res/templates/mct-table.html | 12 +- 9 files changed, 2722 insertions(+), 1877 deletions(-) diff --git a/platform/commonUI/general/res/fonts/symbols/icomoon.io-WTD-symbols-project.json b/platform/commonUI/general/res/fonts/symbols/icomoon.io-WTD-symbols-project.json index 8fa89e4475..5997360fe3 100644 --- a/platform/commonUI/general/res/fonts/symbols/icomoon.io-WTD-symbols-project.json +++ b/platform/commonUI/general/res/fonts/symbols/icomoon.io-WTD-symbols-project.json @@ -1,1894 +1,2720 @@ { - "selection": [ - { - "order": 126, - "prevSize": 32, - "name": "icon-tabular-lad-set" - }, - { - "order": 127, - "prevSize": 32, - "name": "icon-tabular-lad" - }, - { - "order": 128, - "prevSize": 32, - "name": "icon-tabular-realtime" - }, - { - "order": 119, - "prevSize": 32, - "name": "icon-bullet" - }, - { - "order": 124, - "prevSize": 32, - "name": "icon-session" - }, - { - "order": 125, - "prevSize": 32, - "name": "icon-topic" - }, - { - "order": 116, - "prevSize": 32, - "name": "icon-eye-open-no-gleam" - }, - { - "order": 115, - "prevSize": 32, - "name": "icon-eye-open" - }, - { - "order": 110, - "prevSize": 32, - "name": "icon-collapse-pane-left" - }, - { - "order": 111, - "prevSize": 32, - "name": "icon-collapse-pane-right" - }, - { - "order": 109, - "prevSize": 32, - "name": "icon-save" - }, - { - "order": 108, - "prevSize": 32, - "name": "icon-dataset" - }, - { - "order": 90, - "prevSize": 32, - "name": "icon-bell" - }, - { - "order": 91, - "prevSize": 32, - "name": "icon-hourglass" - }, - { - "order": 92, - "prevSize": 32, - "codes": [ - 58888, - 58889, - 58890 - ], - "name": "icon-info-v15" - }, - { - "order": 93, - "prevSize": 32, - "name": "icon-x-in-circle" - }, - { - "order": 94, - "prevSize": 32, - "name": "icon-datatable" - }, - { - "order": 95, - "prevSize": 32, - "name": "icon-tabular-scrolling" - }, - { - "order": 96, - "prevSize": 32, - "name": "icon-tabular" - }, - { - "order": 97, - "prevSize": 32, - "name": "icon-calendar" - }, - { - "order": 98, - "prevSize": 32, - "name": "icon-paint-bucket" - }, - { - "order": 99, - "prevSize": 32, - "name": "icon-pointer-left" - }, - { - "order": 100, - "prevSize": 32, - "name": "icon-pointer-right" - }, - { - "order": 101, - "prevSize": 32, - "name": "icon-person" - }, - { - "order": 102, - "prevSize": 32, - "name": "icon-chain-links" - }, - { - "order": 103, - "prevSize": 32, - "name": "icon-database-in-brackets" - }, - { - "order": 104, - "prevSize": 32, - "name": "icon-refresh" - }, - { - "order": 105, - "prevSize": 32, - "name": "icon-lock" - }, - { - "order": 106, - "prevSize": 32, - "name": "icon-box-with-dashed-lines" - }, - { - "order": 10, - "prevSize": 32, - "name": "icon-box-with-arrow-cursor" - }, - { - "order": 11, - "prevSize": 32, - "name": "icon-activity-mode" - }, - { - "order": 12, - "prevSize": 32, - "name": "icon-activity" - }, - { - "order": 87, - "prevSize": 32, - "name": "icon-alert-rect" - }, - { - "order": 14, - "prevSize": 32, - "name": "icon-alert-triangle" - }, - { - "order": 15, - "prevSize": 32, - "name": "icon-arrow-double-down" - }, - { - "order": 16, - "prevSize": 32, - "name": "icon-arrow-double-up" - }, - { - "order": 2, - "prevSize": 32, - "name": "icon-arrow-down" - }, - { - "order": 19, - "prevSize": 32, - "name": "icon-arrow-left" - }, - { - "order": 20, - "prevSize": 32, - "name": "icon-arrow-right" - }, - { - "order": 21, - "prevSize": 32, - "name": "icon-arrow-tall-down" - }, - { - "order": 22, - "prevSize": 32, - "name": "icon-arrow-tall-up" - }, - { - "order": 23, - "prevSize": 32, - "name": "icon-arrow-up" - }, - { - "order": 24, - "prevSize": 32, - "name": "icon-arrows-out" - }, - { - "order": 25, - "prevSize": 32, - "name": "icon-arrows-right-left" - }, - { - "order": 33, - "prevSize": 32, - "name": "icon-arrows-up-down" - }, - { - "order": 26, - "prevSize": 32, - "name": "icon-asterisk" - }, - { - "order": 27, - "prevSize": 32, - "name": "icon-autoflow-tabular" - }, - { - "order": 28, - "prevSize": 32, - "name": "icon-box" - }, - { - "order": 29, - "prevSize": 32, - "name": "icon-check" - }, - { - "order": 30, - "prevSize": 32, - "name": "icon-clock" - }, - { - "order": 31, - "prevSize": 32, - "name": "icon-connectivity" - }, - { - "order": 32, - "prevSize": 32, - "name": "icon-database-query" - }, - { - "order": 17, - "prevSize": 32, - "name": "icon-database" - }, - { - "order": 35, - "prevSize": 32, - "name": "icon-dictionary" - }, - { - "order": 36, - "prevSize": 32, - "name": "icon-duplicate" - }, - { - "order": 37, - "prevSize": 32, - "name": "icon-folder-new" - }, - { - "order": 38, - "prevSize": 32, - "name": "icon-folder" - }, - { - "order": 39, - "prevSize": 32, - "name": "icon-fullscreen-collapse" - }, - { - "order": 40, - "prevSize": 32, - "name": "icon-fullscreen-expand" - }, - { - "order": 41, - "prevSize": 32, - "name": "icon-gear" - }, - { - "order": 49, - "prevSize": 32, - "name": "icon-image" - }, - { - "order": 42, - "prevSize": 32, - "name": "icon-layers" - }, - { - "order": 43, - "prevSize": 32, - "name": "icon-layout" - }, - { - "order": 44, - "prevSize": 32, - "name": "icon-line-horz" - }, - { - "order": 75, - "prevSize": 32, - "name": "icon-link" - }, - { - "order": 46, - "prevSize": 32, - "name": "icon-magnify-in" - }, - { - "order": 47, - "prevSize": 32, - "name": "icon-magnify-out" - }, - { - "order": 48, - "prevSize": 32, - "name": "icon-magnify" - }, - { - "order": 34, - "prevSize": 32, - "name": "icon-menu" - }, - { - "order": 50, - "prevSize": 32, - "name": "icon-move" - }, - { - "order": 51, - "prevSize": 32, - "name": "icon-new-window" - }, - { - "order": 52, - "prevSize": 32, - "name": "icon-object" - }, - { - "order": 73, - "prevSize": 32, - "name": "icon-object-unknown" - }, - { - "order": 53, - "prevSize": 32, - "name": "icon-packet" - }, - { - "order": 54, - "prevSize": 32, - "name": "icon-page" - }, - { - "order": 55, - "prevSize": 32, - "name": "icon-pause" - }, - { - "order": 56, - "prevSize": 32, - "name": "icon-pencil" - }, - { - "order": 65, - "prevSize": 32, - "name": "icon-people" - }, - { - "order": 57, - "prevSize": 32, - "name": "icon-play" - }, - { - "order": 58, - "prevSize": 32, - "name": "icon-plot-resource" - }, - { - "order": 59, - "prevSize": 32, - "name": "icon-plus" - }, - { - "order": 60, - "prevSize": 32, - "name": "icon-minus" - }, - { - "order": 61, - "prevSize": 32, - "name": "icon-sine" - }, - { - "order": 62, - "prevSize": 32, - "name": "icon-T" - }, - { - "order": 63, - "prevSize": 32, - "name": "icon-telemetry-panel" - }, - { - "order": 64, - "prevSize": 32, - "name": "icon-telemetry" - }, - { - "order": 18, - "prevSize": 32, - "name": "icon-thumbs-strip" - }, - { - "order": 67, - "prevSize": 32, - "name": "icon-timeline" - }, - { - "order": 68, - "prevSize": 32, - "name": "icon-timer" - }, - { - "order": 69, - "prevSize": 32, - "name": "icon-trash" - }, - { - "order": 70, - "prevSize": 32, - "name": "icon-two-parts-both" - }, - { - "order": 71, - "prevSize": 32, - "name": "icon-two-parts-one-only" - }, - { - "order": 72, - "prevSize": 32, - "name": "icon-x-heavy" - }, - { - "order": 66, - "prevSize": 32, - "name": "icon-x" - } - ], "metadata": { - "name": "Open MCT Web UI Symbols", - "importSize": { - "width": 512, - "height": 512 - }, - "designer": "Charles Hacskaylo", - "iconsHash": 1484196519 + "name": "Untitled Project", + "lastOpened": 1464711493714, + "created": 1464711419511 }, - "height": 1024, - "prevSize": 32, - "icons": [ + "iconSets": [ { - "paths": [ - "M128 768v-576c-70.606 0.215-127.785 57.394-128 127.979l-0 576.021c0.215 70.606 57.394 127.785 127.979 128l576.021 0c70.606-0.215 127.785-57.394 128-127.979l-576-0.021c-70.606-0.215-127.785-57.394-128-127.979z", - "M896 0h-576c-70.606 0.215-127.785 57.394-128 127.979l-0 576.021c0.215 70.606 57.394 127.785 127.979 128l576.021 0c70.606-0.215 127.785-57.394 128-127.979l0-576.021c-0.215-70.606-57.394-127.785-127.979-128zM256 192h192v128h-192v-128zM256 384h192v192h-192v-192zM320 768c-35.26-0.214-63.786-28.74-64-63.98l-0-64.020h192v128h-128zM512 768v-128h192v128h-192zM960 704c-0.214 35.26-28.74 63.786-63.98 64l-128.020 0v-128h192v64zM960 576h-448v-384h448v384z", - "M832 480c0.002 0 0.005 0 0.007 0 17.673 0 32-14.327 32-32 0-14.055-9.062-25.994-21.662-30.293l-74.345-24.767v-104.94c0-17.673-14.327-32-32-32s-32 14.327-32 32v151.060l117.88 39.3c3.018 1.040 6.495 1.64 10.113 1.64 0.003 0 0.005-0 0.008-0z" - ], - "attrs": [ + "selection": [ { - "fill": "rgb(0, 161, 75)" + "order": 5, + "id": 95, + "prevSize": 32, + "code": 58915, + "name": "icon-download", + "tempChar": "" }, { - "fill": "rgb(0, 161, 75)" + "order": 6, + "prevSize": 32, + "name": "icon-tabular-lad-set", + "id": 1, + "code": 58914, + "tempChar": "" }, { - "fill": "rgb(0, 161, 75)" + "order": 7, + "prevSize": 32, + "name": "icon-tabular-lad", + "id": 2, + "code": 58913, + "tempChar": "" + }, + { + "order": 8, + "prevSize": 32, + "name": "icon-tabular-realtime", + "id": 3, + "code": 58912, + "tempChar": "" + }, + { + "order": 9, + "prevSize": 32, + "name": "icon-bullet", + "id": 4, + "code": 58905, + "tempChar": "" + }, + { + "order": 10, + "prevSize": 32, + "name": "icon-session", + "id": 5, + "code": 58904, + "tempChar": "" + }, + { + "order": 11, + "prevSize": 32, + "name": "icon-topic", + "id": 6, + "code": 58903, + "tempChar": "" + }, + { + "order": 12, + "prevSize": 32, + "name": "icon-eye-open-no-gleam", + "id": 7, + "code": 58902, + "tempChar": "" + }, + { + "order": 13, + "prevSize": 32, + "name": "icon-eye-open", + "id": 8, + "code": 58901, + "tempChar": "" + }, + { + "order": 14, + "prevSize": 32, + "name": "icon-collapse-pane-left", + "id": 9, + "code": 58899, + "tempChar": "" + }, + { + "order": 15, + "prevSize": 32, + "name": "icon-collapse-pane-right", + "id": 10, + "code": 58900, + "tempChar": "" + }, + { + "order": 16, + "prevSize": 32, + "name": "icon-save", + "id": 11, + "code": 58898, + "tempChar": "" + }, + { + "order": 17, + "prevSize": 32, + "name": "icon-dataset", + "id": 12, + "code": 58897, + "tempChar": "" + }, + { + "order": 18, + "prevSize": 32, + "name": "icon-bell", + "id": 13, + "code": 58896, + "tempChar": "" + }, + { + "order": 19, + "prevSize": 32, + "name": "icon-hourglass", + "id": 14, + "code": 58889, + "tempChar": "" + }, + { + "order": 20, + "prevSize": 32, + "codes": [ + 58888, + 58889, + 58890 + ], + "name": "icon-info-v15", + "id": 15, + "code": 58888, + "tempChar": "" + }, + { + "order": 21, + "prevSize": 32, + "name": "icon-x-in-circle", + "id": 16, + "code": 58887, + "tempChar": "" + }, + { + "order": 22, + "prevSize": 32, + "name": "icon-datatable", + "id": 17, + "code": 58881, + "tempChar": "" + }, + { + "order": 23, + "prevSize": 32, + "name": "icon-tabular-scrolling", + "id": 18, + "code": 58882, + "tempChar": "" + }, + { + "order": 24, + "prevSize": 32, + "name": "icon-tabular", + "id": 19, + "code": 58884, + "tempChar": "" + }, + { + "order": 25, + "prevSize": 32, + "name": "icon-calendar", + "id": 20, + "code": 58885, + "tempChar": "" + }, + { + "order": 26, + "prevSize": 32, + "name": "icon-paint-bucket", + "id": 21, + "code": 58886, + "tempChar": "" + }, + { + "order": 27, + "prevSize": 32, + "name": "icon-pointer-left", + "id": 22, + "code": 123, + "tempChar": "" + }, + { + "order": 28, + "prevSize": 32, + "name": "icon-pointer-right", + "id": 23, + "code": 125, + "tempChar": "" + }, + { + "order": 29, + "prevSize": 32, + "name": "icon-person", + "id": 24, + "code": 80, + "tempChar": "" + }, + { + "order": 30, + "prevSize": 32, + "name": "icon-chain-links", + "id": 25, + "code": 232, + "tempChar": "" + }, + { + "order": 31, + "prevSize": 32, + "name": "icon-database-in-brackets", + "id": 26, + "code": 115, + "tempChar": "" + }, + { + "order": 32, + "prevSize": 32, + "name": "icon-refresh", + "id": 27, + "code": 114, + "tempChar": "" + }, + { + "order": 33, + "prevSize": 32, + "name": "icon-lock", + "id": 28, + "code": 108, + "tempChar": "" + }, + { + "order": 34, + "prevSize": 32, + "name": "icon-box-with-dashed-lines", + "id": 29, + "code": 51, + "tempChar": "" + }, + { + "order": 35, + "prevSize": 32, + "name": "icon-box-with-arrow-cursor", + "id": 30, + "code": 58880, + "tempChar": "" + }, + { + "order": 36, + "prevSize": 32, + "name": "icon-activity-mode", + "id": 31, + "code": 65, + "tempChar": "" + }, + { + "order": 37, + "prevSize": 32, + "name": "icon-activity", + "id": 32, + "code": 97, + "tempChar": "" + }, + { + "order": 38, + "prevSize": 32, + "name": "icon-alert-rect", + "id": 33, + "code": 33, + "tempChar": "" + }, + { + "order": 39, + "prevSize": 32, + "name": "icon-alert-triangle", + "id": 34, + "code": 58883, + "tempChar": "" + }, + { + "order": 40, + "prevSize": 32, + "name": "icon-arrow-double-down", + "id": 35, + "code": 238, + "tempChar": "" + }, + { + "order": 41, + "prevSize": 32, + "name": "icon-arrow-double-up", + "id": 36, + "code": 235, + "tempChar": "" + }, + { + "order": 42, + "prevSize": 32, + "name": "icon-arrow-down", + "id": 37, + "code": 118, + "tempChar": "" + }, + { + "order": 43, + "prevSize": 32, + "name": "icon-arrow-left", + "id": 38, + "code": 60, + "tempChar": "" + }, + { + "order": 44, + "prevSize": 32, + "name": "icon-arrow-right", + "id": 39, + "code": 62, + "tempChar": "" + }, + { + "order": 45, + "prevSize": 32, + "name": "icon-arrow-tall-down", + "id": 40, + "code": 236, + "tempChar": "" + }, + { + "order": 46, + "prevSize": 32, + "name": "icon-arrow-tall-up", + "id": 41, + "code": 237, + "tempChar": "" + }, + { + "order": 47, + "prevSize": 32, + "name": "icon-arrow-up", + "id": 42, + "code": 94, + "tempChar": "" + }, + { + "order": 48, + "prevSize": 32, + "name": "icon-arrows-out", + "id": 43, + "code": 73, + "tempChar": "" + }, + { + "order": 49, + "prevSize": 32, + "name": "icon-arrows-right-left", + "id": 44, + "code": 58893, + "tempChar": "" + }, + { + "order": 50, + "prevSize": 32, + "name": "icon-arrows-up-down", + "id": 45, + "code": 53, + "tempChar": "" + }, + { + "order": 51, + "prevSize": 32, + "name": "icon-asterisk", + "id": 46, + "code": 42, + "tempChar": "" + }, + { + "order": 52, + "prevSize": 32, + "name": "icon-autoflow-tabular", + "id": 47, + "code": 72, + "tempChar": "" + }, + { + "order": 53, + "prevSize": 32, + "name": "icon-box", + "id": 48, + "code": 224, + "tempChar": "" + }, + { + "order": 54, + "prevSize": 32, + "name": "icon-check", + "id": 49, + "code": 50, + "tempChar": "" + }, + { + "order": 55, + "prevSize": 32, + "name": "icon-clock", + "id": 50, + "code": 67, + "tempChar": "" + }, + { + "order": 56, + "prevSize": 32, + "name": "icon-connectivity", + "id": 51, + "code": 46, + "tempChar": "" + }, + { + "order": 57, + "prevSize": 32, + "name": "icon-database-query", + "id": 52, + "code": 100, + "tempChar": "" + }, + { + "order": 58, + "prevSize": 32, + "name": "icon-database", + "id": 53, + "code": 68, + "tempChar": "" + }, + { + "order": 59, + "prevSize": 32, + "name": "icon-dictionary", + "id": 54, + "code": 81, + "tempChar": "" + }, + { + "order": 60, + "prevSize": 32, + "name": "icon-duplicate", + "id": 55, + "code": 242, + "tempChar": "" + }, + { + "order": 61, + "prevSize": 32, + "name": "icon-folder-new", + "id": 56, + "code": 102, + "tempChar": "" + }, + { + "order": 62, + "prevSize": 32, + "name": "icon-folder", + "id": 57, + "code": 70, + "tempChar": "" + }, + { + "order": 63, + "prevSize": 32, + "name": "icon-fullscreen-collapse", + "id": 58, + "code": 95, + "tempChar": "" + }, + { + "order": 64, + "prevSize": 32, + "name": "icon-fullscreen-expand", + "id": 59, + "code": 122, + "tempChar": "" + }, + { + "order": 65, + "prevSize": 32, + "name": "icon-gear", + "id": 60, + "code": 71, + "tempChar": "" + }, + { + "order": 66, + "prevSize": 32, + "name": "icon-image", + "id": 61, + "code": 227, + "tempChar": "" + }, + { + "order": 67, + "prevSize": 32, + "name": "icon-layers", + "id": 62, + "code": 225, + "tempChar": "" + }, + { + "order": 68, + "prevSize": 32, + "name": "icon-layout", + "id": 63, + "code": 76, + "tempChar": "" + }, + { + "order": 69, + "prevSize": 32, + "name": "icon-line-horz", + "id": 64, + "code": 226, + "tempChar": "" + }, + { + "order": 70, + "prevSize": 32, + "name": "icon-link", + "id": 65, + "code": 244, + "tempChar": "" + }, + { + "order": 71, + "prevSize": 32, + "name": "icon-magnify-in", + "id": 66, + "code": 88, + "tempChar": "" + }, + { + "order": 72, + "prevSize": 32, + "name": "icon-magnify-out", + "id": 67, + "code": 89, + "tempChar": "" + }, + { + "order": 73, + "prevSize": 32, + "name": "icon-magnify", + "id": 68, + "code": 77, + "tempChar": "" + }, + { + "order": 74, + "prevSize": 32, + "name": "icon-menu", + "id": 69, + "code": 109, + "tempChar": "" + }, + { + "order": 75, + "prevSize": 32, + "name": "icon-move", + "id": 70, + "code": 243, + "tempChar": "" + }, + { + "order": 76, + "prevSize": 32, + "name": "icon-new-window", + "id": 71, + "code": 121, + "tempChar": "" + }, + { + "order": 77, + "prevSize": 32, + "name": "icon-object", + "id": 72, + "code": 111, + "tempChar": "" + }, + { + "order": 78, + "prevSize": 32, + "name": "icon-object-unknown", + "id": 73, + "code": 63, + "tempChar": "" + }, + { + "order": 79, + "prevSize": 32, + "name": "icon-packet", + "id": 74, + "code": 86, + "tempChar": "" + }, + { + "order": 80, + "prevSize": 32, + "name": "icon-page", + "id": 75, + "code": 234, + "tempChar": "" + }, + { + "order": 81, + "prevSize": 32, + "name": "icon-pause", + "id": 76, + "code": 241, + "tempChar": "" + }, + { + "order": 82, + "prevSize": 32, + "name": "icon-pencil", + "id": 77, + "code": 112, + "tempChar": "" + }, + { + "order": 83, + "prevSize": 32, + "name": "icon-people", + "id": 78, + "code": 79, + "tempChar": "" + }, + { + "order": 84, + "prevSize": 32, + "name": "icon-play", + "id": 79, + "code": 239, + "tempChar": "" + }, + { + "order": 85, + "prevSize": 32, + "name": "icon-plot-resource", + "id": 80, + "code": 233, + "tempChar": "" + }, + { + "order": 86, + "prevSize": 32, + "name": "icon-plus", + "id": 81, + "code": 43, + "tempChar": "" + }, + { + "order": 87, + "prevSize": 32, + "name": "icon-minus", + "id": 82, + "code": 45, + "tempChar": "" + }, + { + "order": 88, + "prevSize": 32, + "name": "icon-sine", + "id": 83, + "code": 54, + "tempChar": "" + }, + { + "order": 89, + "prevSize": 32, + "name": "icon-T", + "id": 84, + "code": 228, + "tempChar": "" + }, + { + "order": 90, + "prevSize": 32, + "name": "icon-telemetry-panel", + "id": 85, + "code": 116, + "tempChar": "" + }, + { + "order": 91, + "prevSize": 32, + "name": "icon-telemetry", + "id": 86, + "code": 84, + "tempChar": "" + }, + { + "order": 92, + "prevSize": 32, + "name": "icon-thumbs-strip", + "id": 87, + "code": 246, + "tempChar": "" + }, + { + "order": 93, + "prevSize": 32, + "name": "icon-timeline", + "id": 88, + "code": 83, + "tempChar": "" + }, + { + "order": 94, + "prevSize": 32, + "name": "icon-timer", + "id": 89, + "code": 245, + "tempChar": "" + }, + { + "order": 95, + "prevSize": 32, + "name": "icon-trash", + "id": 90, + "code": 90, + "tempChar": "" + }, + { + "order": 96, + "prevSize": 32, + "name": "icon-two-parts-both", + "id": 91, + "code": 229, + "tempChar": "" + }, + { + "order": 97, + "prevSize": 32, + "name": "icon-two-parts-one-only", + "id": 92, + "code": 231, + "tempChar": "" + }, + { + "order": 98, + "prevSize": 32, + "name": "icon-x-heavy", + "id": 93, + "code": 120, + "tempChar": "" + }, + { + "order": 99, + "prevSize": 32, + "name": "icon-x", + "id": 94, + "code": 58946, + "tempChar": "" } ], - "grid": 0, - "tags": [ - "icon-tabular-lad-set" - ], - "colorPermutations": { - "16161751": [], - "11617516161751": [ - 1, - 1, - 1 - ] + "metadata": { + "name": "Open MCT Web UI Symbols", + "importSize": { + "width": 512, + "height": 512 + }, + "designer": "Charles Hacskaylo", + "iconsHash": 1484196519 }, - "defaultCode": 58914 - }, - { - "paths": [ - "M896 0h-768c-70.606 0.215-127.785 57.394-128 127.979l-0 768.021c0.215 70.606 57.394 127.785 127.979 128l768.021 0c70.606-0.215 127.785-57.394 128-127.979l0-768.021c-0.215-70.606-57.394-127.785-127.979-128zM64 256h256v192h-256v-192zM64 512h256v192h-256v-192zM128 960c-35.26-0.214-63.786-28.74-64-63.98l-0-128.020h256v192h-192zM384 960v-192h256v192h-256zM960 896c-0.214 35.26-28.74 63.786-63.98 64l-192.020 0v-192h256v128zM960 512v192h-576v-192h64v-64h-64v-192h576v192h-64v64h64z", - "M782.32 547.38l-110.32-55.16v-172.22c0-17.673-14.327-32-32-32s-32 14.327-32 32v211.78l145.68 72.84c4.172 2.133 9.1 3.383 14.32 3.383 17.675 0 32.003-14.328 32.003-32.003 0-12.454-7.114-23.247-17.501-28.536z" - ], - "attrs": [ + "height": 1024, + "prevSize": 32, + "icons": [ { - "fill": "rgb(0, 161, 75)" + "id": 95, + "paths": [ + "M832 576v255.66l-0.34 0.34-639.66-0.34v-255.66h-192v256c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-256h-192z", + "M512 640l448-448h-256v-192h-384v192h-256l448 448z" + ], + "attrs": [ + { + "fill": "rgb(0, 161, 75)" + }, + { + "fill": "rgb(0, 161, 75)" + } + ], + "isMulticolor": false, + "grid": 0, + "tags": [ + "icon-download" + ], + "colorPermutations": { + "11617516161751": [ + 1, + 1 + ] + } }, { - "fill": "rgb(0, 161, 75)" + "paths": [ + "M128 768v-576c-70.606 0.215-127.785 57.394-128 127.979l-0 576.021c0.215 70.606 57.394 127.785 127.979 128l576.021 0c70.606-0.215 127.785-57.394 128-127.979l-576-0.021c-70.606-0.215-127.785-57.394-128-127.979z", + "M896 0h-576c-70.606 0.215-127.785 57.394-128 127.979l-0 576.021c0.215 70.606 57.394 127.785 127.979 128l576.021 0c70.606-0.215 127.785-57.394 128-127.979l0-576.021c-0.215-70.606-57.394-127.785-127.979-128zM256 192h192v128h-192v-128zM256 384h192v192h-192v-192zM320 768c-35.26-0.214-63.786-28.74-64-63.98l-0-64.020h192v128h-128zM512 768v-128h192v128h-192zM960 704c-0.214 35.26-28.74 63.786-63.98 64l-128.020 0v-128h192v64zM960 576h-448v-384h448v384z", + "M832 480c0.002 0 0.005 0 0.007 0 17.673 0 32-14.327 32-32 0-14.055-9.062-25.994-21.662-30.293l-74.345-24.767v-104.94c0-17.673-14.327-32-32-32s-32 14.327-32 32v151.060l117.88 39.3c3.018 1.040 6.495 1.64 10.113 1.64 0.003 0 0.005-0 0.008-0z" + ], + "attrs": [ + { + "fill": "rgb(0, 161, 75)" + }, + { + "fill": "rgb(0, 161, 75)" + }, + { + "fill": "rgb(0, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-tabular-lad-set" + ], + "colorPermutations": { + "16161751": [], + "11617516161751": [ + 1, + 1, + 1 + ] + }, + "defaultCode": 58914, + "id": 1 + }, + { + "paths": [ + "M896 0h-768c-70.606 0.215-127.785 57.394-128 127.979l-0 768.021c0.215 70.606 57.394 127.785 127.979 128l768.021 0c70.606-0.215 127.785-57.394 128-127.979l0-768.021c-0.215-70.606-57.394-127.785-127.979-128zM64 256h256v192h-256v-192zM64 512h256v192h-256v-192zM128 960c-35.26-0.214-63.786-28.74-64-63.98l-0-128.020h256v192h-192zM384 960v-192h256v192h-256zM960 896c-0.214 35.26-28.74 63.786-63.98 64l-192.020 0v-192h256v128zM960 512v192h-576v-192h64v-64h-64v-192h576v192h-64v64h64z", + "M782.32 547.38l-110.32-55.16v-172.22c0-17.673-14.327-32-32-32s-32 14.327-32 32v211.78l145.68 72.84c4.172 2.133 9.1 3.383 14.32 3.383 17.675 0 32.003-14.328 32.003-32.003 0-12.454-7.114-23.247-17.501-28.536z" + ], + "attrs": [ + { + "fill": "rgb(0, 161, 75)" + }, + { + "fill": "rgb(0, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-tabular-lad" + ], + "colorPermutations": { + "16161751": [], + "11617516161751": [ + 1, + 1 + ] + }, + "defaultCode": 58913, + "id": 2 + }, + { + "paths": [ + "M896 0h-768c-70.606 0.215-127.785 57.394-128 127.979l-0 768.021c0.215 70.606 57.394 127.785 127.979 128l768.021 0c70.606-0.215 127.785-57.394 128-127.979l0-768.021c-0.215-70.606-57.394-127.785-127.979-128zM448 292l25.060 25.32c7.916 7.922 18.856 12.822 30.94 12.822s23.024-4.9 30.94-12.822l75.5-76.3c29.97-30.338 71.571-49.128 117.56-49.128s87.59 18.79 117.544 49.112l50.456 50.997v152.2c-24.111-8.83-44.678-22.255-61.542-39.342l-75.518-76.318c-7.916-7.922-18.856-12.822-30.94-12.822s-23.024 4.9-30.94 12.822l-75.5 76.3c-29.971 30.343-71.575 49.137-117.568 49.137-20.084 0-39.331-3.584-57.137-10.146l1.145-151.831zM320 960h-192c-35.26-0.214-63.786-28.74-64-63.98l-0-128.020h256v192zM320 704h-256v-192h256v192zM320 448h-256v-192h256v192zM640 960h-256v-192h256v192zM448 636.62v-174.5c1.88 1.74 3.74 3.5 5.56 5.34l75.5 76.3c7.916 7.922 18.856 12.822 30.94 12.822s23.024-4.9 30.94-12.822l75.5-76.3c29.966-30.333 71.56-49.119 117.542-49.119 43.28 0 82.673 16.644 112.128 43.879l-0.11 174.399c-1.88-1.74-3.74-3.5-5.56-5.34l-75.5-76.3c-7.916-7.922-18.856-12.822-30.94-12.822s-23.024 4.9-30.94 12.822l-75.5 76.3c-29.966 30.333-71.56 49.119-117.542 49.119-43.28 0-82.673-16.644-112.128-43.879zM960 896c-0.214 35.26-28.74 63.786-63.98 64l-192.020 0v-192h256v128z" + ], + "attrs": [ + { + "fill": "rgb(0, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-tabular-realtime-v2" + ], + "colorPermutations": { + "16161751": [], + "11617516161751": [ + 1 + ] + }, + "defaultCode": 58912, + "id": 3 + }, + { + "paths": [ + "M832 752c0 44-36 80-80 80h-480c-44 0-80-36-80-80v-480c0-44 36-80 80-80h480c44 0 80 36 80 80v480z" + ], + "grid": 0, + "tags": [ + "icon-bullet" + ], + "defaultCode": 58905, + "id": 4, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M635.6 524.4c6.6 4.2 13.2 8.6 19.2 13.6l120.4 96.4c29.6 23.8 83.8 23.8 113.4 0l135.2-108c0.2-4.8 0.2-9.4 0.2-14.2 0-52.2-7.8-102.4-22.2-149.8l-154.8 123.6c-58.2 46.6-140.2 59.2-211.4 38.4z", + "M248.6 634.2l120.4-96.4c58-46.4 140-59.2 211.2-38.4-6.6-4.2-13.2-8.6-19.2-13.6l-120.4-96.4c-29.6-23.8-83.8-23.8-113.4 0l-120.2 96.6c-40 32-91.4 48-143 48-21.6 0-43-2.8-63.8-8.4 0 0.6 0 1.2 0 1.6 5 3.4 10 6.8 14.6 10.6l120.4 96.4c29.8 23.8 83.8 23.8 113.4 0z", + "M120.6 378.2l120.4-96.4c80.2-64.2 205.6-64.2 285.8 0l120.4 96.4c29.6 23.8 83.8 23.8 113.4 0l181-144.8c-91.2-140.4-249.6-233.4-429.6-233.4-238.6 0-439.2 163.2-496 384.2 30.8 17.6 77.8 15.6 104.6-6z", + "M689 742l-120.4-96.4c-29.6-23.8-83.8-23.8-113.4 0l-120.2 96.4c-40 32-91.4 48-143 48-47.8 0-95.4-13.8-134.2-41.4 85.6 163.6 256.8 275.4 454.2 275.4s368.6-111.8 454.2-275.4c-80.4 57.4-199.8 55.2-277.2-6.6z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-session" + ], + "colorPermutations": { + "16161751": [ + 1, + 1, + 1, + 1 + ], + "11617516161751": [ + 2, + 2, + 2, + 2 + ] + }, + "defaultCode": 58904, + "id": 5 + }, + { + "paths": [ + "M454.36 476.64l86.3-86.3c9.088-8.965 21.577-14.502 35.36-14.502s26.272 5.537 35.366 14.507l86.294 86.294c19.328 19.358 42.832 34.541 69.047 44.082l1.313-171.722-57.64-57.64c-34.407-34.33-81.9-55.558-134.35-55.558s-99.943 21.228-134.354 55.562l-86.296 86.297c-9.088 8.965-21.577 14.502-35.36 14.502s-26.272-5.537-35.366-14.507l-28.674-28.654v172.14c19.045 7.022 41.040 11.084 63.984 11.084 52.463 0 99.966-21.239 134.379-55.587z", + "M505.64 547.36l-86.3 86.3c-9.088 8.965-21.577 14.502-35.36 14.502s-26.272-5.537-35.366-14.507l-86.294-86.294c-2-2-4.2-4-6.36-6v197.36c33.664 30.72 78.65 49.537 128.031 49.537 52.44 0 99.923-21.22 134.333-55.541l86.296-86.296c9.088-8.965 21.577-14.502 35.36-14.502s26.272 5.537 35.366 14.507l86.294 86.294c2 2 4.2 4 6.36 6v-197.36c-33.664-30.72-78.65-49.537-128.031-49.537-52.44 0-99.923 21.22-134.333 55.541z", + "M832 0h-128v192h127.66l0.34 0.34v639.32l-0.34 0.34h-127.66v192h128c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192z", + "M320 832h-127.66l-0.34-0.34v-639.32l0.34-0.34h127.66v-192h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192z" + ], + "grid": 0, + "tags": [ + "icon-topic" + ], + "defaultCode": 58903, + "id": 6, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 64c-261 0-480.6 195.4-512 448 31.4 252.6 251 448 512 448s480.6-195.4 512-448c-31.4-252.6-251-448-512-448zM768.2 734.6c-71.4 62.8-162.8 97.4-257.6 97.4s-186.2-34.6-257.6-97.4c-66.6-58.6-110.6-137.2-125-222.6 0 0 0-0.2 0-0.2 76.8-154 220.8-257.6 384-257.6s307.2 103.8 384 257.6c0 0 0 0.2 0 0.2-14.4 85.4-61.2 164-127.8 222.6z", + "M512 288c-123.8 0-224 100.2-224 224s100.2 224 224 224 224-100.2 224-224-100.2-224-224-224zM576 544c-53 0-96-43-96-96s43-96 96-96 96 43 96 96c0 53-43 96-96 96z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-eye-open-no-gleam" + ], + "colorPermutations": { + "16161751": [ + 1, + 1 + ], + "125525525516161751": [ + 1, + 1 + ], + "11617516161751": [ + 2, + 2 + ] + }, + "defaultCode": 58902, + "id": 7 + }, + { + "paths": [ + "M512 64c-261 0-480.6 195.4-512 448 31.4 252.6 251 448 512 448s480.6-195.4 512-448c-31.4-252.6-251-448-512-448zM768.2 734.6c-71.4 62.8-162.8 97.4-257.6 97.4s-186.2-34.6-257.6-97.4c-66.6-58.6-110.6-137.2-125-222.6 0 0 0-0.2 0-0.2 76.8-154 220.8-257.6 384-257.6s307.2 103.8 384 257.6c0 0 0 0.2 0 0.2-14.4 85.4-61.2 164-127.8 222.6z", + "M512 288c-123.8 0-224 100.2-224 224s100.2 224 224 224 224-100.2 224-224-100.2-224-224-224z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-crosshair" + ], + "colorPermutations": { + "16161751": [ + 1, + 1 + ], + "125525525516161751": [ + 1, + 1 + ], + "11617516161751": [ + 2, + 2 + ] + }, + "defaultCode": 58901, + "id": 8 + }, + { + "paths": [ + "M256 0h-256v1024h256c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192z", + "M512 320l512 320v-640z" + ], + "attrs": [ + { + "fill": "rgb(0, 0, 0)" + }, + { + "fill": "rgb(0, 0, 0)" + } + ], + "grid": 0, + "tags": [ + "icon-collapse-pane-left" + ], + "colorPermutations": { + "16161751": [ + 0, + 0 + ], + "125525525516161751": [ + 0, + 0 + ], + "11617516161751": [ + 0, + 0 + ] + }, + "defaultCode": 58899, + "id": 9 + }, + { + "paths": [ + "M768 0h256v1024h-256c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192z", + "M512 320l-512 320v-640z" + ], + "attrs": [ + { + "fill": "rgb(0, 0, 0)" + }, + { + "fill": "rgb(0, 0, 0)" + } + ], + "grid": 0, + "tags": [ + "icon-collapse-pane-right" + ], + "colorPermutations": { + "16161751": [ + 0, + 0 + ], + "125525525516161751": [ + 0, + 0 + ], + "11617516161751": [ + 0, + 0 + ] + }, + "defaultCode": 58900, + "id": 10 + }, + { + "paths": [ + "M192.2 576c-0.2 0-0.2 0 0 0l-0.2 448h640v-447.8c0 0 0 0-0.2-0.2h-639.6z", + "M978.8 210.8l-165.4-165.4c-25-25-74.2-45.4-109.4-45.4h-576c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128v-448c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v448c70.4 0 128-57.6 128-128v-576c0-35.2-20.4-84.4-45.2-109.2zM704 256c0 35.2-28.8 64-64 64h-448c-35.2 0-64-28.8-64-64v-192h320v192h128v-192h128v192z" + ], + "attrs": [ + { + "fill": "rgb(0, 0, 0)" + }, + { + "fill": "rgb(0, 0, 0)" + } + ], + "grid": 0, + "tags": [ + "icon-save-v2" + ], + "colorPermutations": { + "16161751": [ + 0, + 0 + ], + "125525525516161751": [ + 0, + 0 + ], + "11617516161751": [ + 0, + 0 + ] + }, + "defaultCode": 58898, + "id": 11 + }, + { + "paths": [ + "M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z", + "M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128zM320 896h-128v-320h128v320zM576 896h-128v-320h128v320zM832 896h-128v-320h128v320z" + ], + "grid": 0, + "tags": [ + "icon-dataset" + ], + "defaultCode": 58897, + "id": 12, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 1024c106 0 192-86 192-192h-384c0 106 86 192 192 192z", + "M896 448v-64c0-212-172-384-384-384s-384 172-384 384v64c0 70.6-57.4 128-128 128v128h1024v-128c-70.6 0-128-57.4-128-128z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-bell" + ], + "colorPermutations": { + "16161751": [ + 1, + 1 + ], + "125525525516161751": [ + 1, + 1 + ], + "11617516161751": [ + 2, + 2 + ] + }, + "defaultCode": 58896, + "id": 13 + }, + { + "paths": [ + "M1024 0h-1024c0 282.8 229.2 512 512 512s512-229.2 512-512zM512 384c-102.6 0-199-40-271.6-112.4-41.2-41.2-72-90.2-90.8-143.6h724.6c-18.8 53.4-49.6 102.4-90.8 143.6-72.4 72.4-168.8 112.4-271.4 112.4z", + "M512 512c-282.8 0-512 229.2-512 512h1024c0-282.8-229.2-512-512-512z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-hourglass" + ], + "colorPermutations": { + "16161751": [ + 1, + 1 + ], + "125525525516161751": [ + 1, + 1 + ], + "11617516161751": [ + 2, + 2 + ] + }, + "defaultCode": 58889, + "id": 14 + }, + { + "paths": [ + "M512 0c-282.8 0-512 229.2-512 512s229.2 512 512 512 512-229.2 512-512-229.2-512-512-512zM512 128c70.6 0 128 57.4 128 128s-57.4 128-128 128c-70.6 0-128-57.4-128-128s57.4-128 128-128zM704 832h-384v-128h64v-256h256v256h64v128z" + ], + "attrs": [ + { + "fill": "rgb(0, 0, 0)" + } + ], + "grid": 0, + "tags": [ + "icon-info-v1.5" + ], + "colorPermutations": { + "16161751": [ + 0 + ], + "125525525516161751": [ + 0 + ], + "11617516161751": [ + 0 + ] + }, + "defaultCode": 58888, + "id": 15 + }, + { + "paths": [ + "M512 0c-282.8 0-512 229.2-512 512s229.2 512 512 512 512-229.2 512-512-229.2-512-512-512zM832 704l-128 128-192-192-192 192-128-128 192-192-192-192 128-128 192 192 192-192 128 128-192 192 192 192z" + ], + "grid": 0, + "tags": [ + "icon-x-in-circle" + ], + "defaultCode": 58887, + "id": 16, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 192c0 106.039-229.23 192-512 192s-512-85.961-512-192c0-106.039 229.23-192 512-192s512 85.961 512 192z", + "M512 512c-282.8 0-512-86-512-192v512c0 106 229.2 192 512 192s512-86 512-192v-512c0 106-229.2 192-512 192zM896 575v256c-36.6 15.6-79.8 28.8-128 39.4v-256c48.2-10.6 91.4-23.8 128-39.4zM256 614.4v256c-48.2-10.4-91.4-23.8-128-39.4v-256c36.6 15.6 79.8 28.8 128 39.4zM384 890v-256c41 4 83.8 6 128 6s87-2.2 128-6v256c-41 4-83.8 6-128 6s-87-2.2-128-6z" + ], + "attrs": [ + { + "fill": "rgb(6,161,75)", + "opacity": 1 + }, + { + "fill": "rgb(6,161,75)", + "opacity": 1 + } + ], + "grid": 0, + "tags": [ + "icon-datatable" + ], + "colorPermutations": { + "16161751": [ + 1, + 1 + ], + "125525525516161751": [ + 1, + 1 + ], + "11617516161751": [ + 2, + 2 + ] + }, + "defaultCode": 58881, + "id": 17 + }, + { + "paths": [ + "M64 0c-35.2 0-64 28.8-64 64v192h448v-256h-384z", + "M1024 256v-192c0-35.2-28.8-64-64-64h-384v256h448z", + "M0 384v192c0 35.2 28.8 64 64 64h384v-256h-448z", + "M960 640c35.2 0 64-28.8 64-64v-192h-448v256h384z", + "M512 1024l-256-256h512z" + ], + "attrs": [ + { + "fill": "rgb(6,161,75)", + "opacity": 1 + }, + { + "fill": "rgb(6,161,75)", + "opacity": 1 + }, + { + "fill": "rgb(6,161,75)", + "opacity": 1 + }, + { + "fill": "rgb(6,161,75)", + "opacity": 1 + }, + { + "fill": "rgb(6,161,75)", + "opacity": 1 + } + ], + "grid": 0, + "tags": [ + "icon-tabular-scrolling" + ], + "colorPermutations": { + "16161751": [ + 1, + 1, + 1, + 1, + 1 + ], + "125525525516161751": [ + 1, + 1, + 1, + 1, + 1 + ], + "11617516161751": [ + 2, + 2, + 2, + 2, + 2 + ] + }, + "defaultCode": 58882, + "id": 18 + }, + { + "paths": [ + "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM640 448h-256v-192h256v192zM384 512h256v192h-256v-192zM320 704h-256v-192h256v192zM320 256v192h-256v-192h256zM128 960c-17 0-33-6.6-45.2-18.8s-18.8-28.2-18.8-45.2v-128h256v192h-192zM384 960v-192h256v192h-256zM960 896c0 17-6.6 33-18.8 45.2s-28.2 18.8-45.2 18.8h-192v-192h256v128zM960 704h-256v-192h256v192zM960 448h-256v-192h256v192z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-tabular" + ], + "colorPermutations": { + "16161751": [ + 1 + ], + "11617516161751": [ + 2 + ] + }, + "defaultCode": 58884, + "id": 19 + }, + { + "paths": [ + "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM640 448h-256v-192h256v192zM384 512h256v192h-256v-192zM320 704h-256v-192h256v192zM320 256v192h-256v-192h256zM128 960c-17 0-33-6.6-45.2-18.8s-18.8-28.2-18.8-45.2v-128h256v192h-192zM384 960v-192h256v192h-256zM960 896c0 17-6.6 33-18.8 45.2s-28.2 18.8-45.2 18.8h-192v-192h256v128zM960 704h-256v-192h256v192zM960 448h-256v-192h256v192z" + ], + "attrs": [ + { + "fill": "rgb(6,161,75)", + "opacity": 1 + } + ], + "grid": 0, + "tags": [ + "icon-calendar" + ], + "colorPermutations": { + "16161751": [ + 1 + ], + "125525525516161751": [ + 1 + ], + "11617516161751": [ + 2 + ] + }, + "defaultCode": 58885, + "id": 20 + }, + { + "paths": [ + "M544 224v224c0 88.4-71.6 160-160 160s-160-71.6-160-160v-97.2l-197.4 196.4c-50 50-12.4 215.2 112.4 340s290 162.4 340 112.4l417-423.6-352-352z", + "M896 1024c70.6 0 128-57.4 128-128 0-108.6-128-192-128-192s-128 83.4-128 192c0 70.6 57.4 128 128 128z", + "M384 512c-35.4 0-64-28.6-64-64v-384c0-35.4 28.6-64 64-64s64 28.6 64 64v384c0 35.4-28.6 64-64 64z" + ], + "attrs": [ + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + }, + { + "fill": "rgb(6, 161, 75)" + } + ], + "grid": 0, + "tags": [ + "icon-paint-bucket" + ], + "colorPermutations": { + "16161751": [ + 1, + 1, + 1 + ], + "125525525516161751": [ + 1, + 1, + 1 + ], + "11617516161751": [ + 2, + 2, + 2 + ] + }, + "defaultCode": 58886, + "id": 21 + }, + { + "paths": [ + "M510 1024l-256-512 256-512h-256l-256 512 256 512z" + ], + "width": 512, + "grid": 0, + "tags": [ + "icon-pointer-left" + ], + "defaultCode": 123, + "id": 22, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M-2 0l256 512-256 512h256l256-512-256-512z" + ], + "width": 512, + "grid": 0, + "tags": [ + "icon-pointer-right" + ], + "defaultCode": 125, + "id": 23, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M768 256c0 105.6-86.4 192-192 192h-128c-105.6 0-192-86.4-192-192v-64c0-105.6 86.4-192 192-192h128c105.6 0 192 86.4 192 192v64z", + "M64 1024v-192c0-140.8 115.2-256 256-256h384c140.8 0 256 115.2 256 256v192z" + ], + "grid": 0, + "tags": [ + "icon-person" + ], + "defaultCode": 80, + "id": 24, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M958.4 65.6c-43.8-43.8-101-65.6-158.4-65.6s-114.6 21.8-158.4 65.6l-128 128c-74 74-85.4 187-34 273l-12.8 12.8c-35.4-20.8-75-31.4-114.8-31.4-57.4 0-114.6 21.8-158.4 65.6l-128 128c-87.4 87.4-87.4 229.4 0 316.8 43.8 43.8 101 65.6 158.4 65.6s114.6-21.8 158.4-65.6l128-128c74-74 85.4-187 34-273l12.8-12.8c35.2 21 75 31.6 114.6 31.6 57.4 0 114.6-21.8 158.4-65.6l128-128c87.6-87.6 87.6-229.6 0.2-317zM419.8 739.8l-128 128c-18 18.2-42.2 28.2-67.8 28.2s-49.8-10-67.8-28.2c-37.4-37.4-37.4-98.4 0-135.8l128-128c18.2-18.2 42.2-28.2 67.8-28.2 5.6 0 11.2 0.6 16.8 1.4l-55.6 55.6c-10.4 10.4-16.2 24.2-16.2 38.8s5.8 28.6 16.2 38.8c10.4 10.4 24.2 16.2 38.8 16.2s28.6-5.8 38.8-16.2l55.6-55.6c5.4 30.4-3.6 62.2-26.6 85zM867.8 291.8l-128 128c-18 18.2-42.2 28.2-67.8 28.2-5.6 0-11.2-0.6-16.8-1.4l55.6-55.6c10.4-10.4 16.2-24.2 16.2-38.8s-5.8-28.6-16.2-38.8c-10.4-10.4-24.2-16.2-38.8-16.2s-28.6 5.8-38.8 16.2l-55.6 55.6c-5.2-29.8 3.6-61.6 26.6-84.6l128-128c18-18.4 42.2-28.4 67.8-28.4s49.8 10 67.8 28.2c37.6 37.4 37.6 98.2 0 135.6z" + ], + "grid": 0, + "tags": [ + "icon-chain-links" + ], + "defaultCode": 232, + "id": 25, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M768 352c0 53.019-114.615 96-256 96s-256-42.981-256-96c0-53.019 114.615-96 256-96s256 42.981 256 96z", + "M768 672v-256c0 53-114.6 96-256 96s-256-43-256-96v256c0 53 114.6 96 256 96s256-43 256-96z", + "M832 0h-128v192h127.6c0.2 0 0.2 0.2 0.4 0.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-127.6v192h128c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192z", + "M192 831.6v-639.4c0-0.2 0.2-0.2 0.4-0.4h127.6v-191.8h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192h-127.6c-0.2 0-0.4-0.2-0.4-0.4z" + ], + "grid": 0, + "tags": [ + "icon-database-in-brackets" + ], + "defaultCode": 115, + "id": 26, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1012.8 414.2v-391.6l-127.6 127.4c-96.6-96.8-225.2-150-362-150s-265.2 53.2-362 150c-96.8 96.8-150 225.2-150 362s53.2 265.4 150 362c96.8 96.8 225.2 150 362 150s265.4-53.2 362-150l-136.6-136.6c-124.2 124.2-326.4 124.2-450.8 0-124.2-124.2-124.2-326.4 0-450.8 124.2-124.2 326.4-124.2 450.8 0l-127.4 127.4h391.6z" + ], + "grid": 0, + "tags": [ + "icon-refresh" + ], + "defaultCode": 114, + "id": 27, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M832 384h-32v-96c0-158.8-129.2-288-288-288s-288 129.2-288 288v96h-32c-70.4 0-128 57.6-128 128v384c0 70.4 57.6 128 128 128h640c70.4 0 128-57.6 128-128v-384c0-70.4-57.6-128-128-128zM416 288c0-53 43-96 96-96s96 43 96 96v96h-192v-96z" + ], + "grid": 0, + "tags": [ + "icon-lock" + ], + "defaultCode": 108, + "id": 28, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M640 256h-256c-70.4 0-128 57.6-128 128v256c0 70.4 57.6 128 128 128h256c70.4 0 128-57.6 128-128v-256c0-70.4-57.6-128-128-128z", + "M0 0h192v192h-192v-192z", + "M256 0h192v128h-192v-128z", + "M576 0h192v128h-192v-128z", + "M256 896h192v128h-192v-128z", + "M576 896h192v128h-192v-128z", + "M0 576h128v192h-128v-192z", + "M0 256h128v192h-128v-192z", + "M896 576h128v192h-128v-192z", + "M896 256h128v192h-128v-192z", + "M832 0h192v192h-192v-192z", + "M0 832h192v192h-192v-192z", + "M832 832h192v192h-192v-192z" + ], + "grid": 0, + "tags": [ + "icon-box-with-dashed-lines" + ], + "defaultCode": 51, + "id": 29, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M894-2h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h400c-2.2-3.8-4-7.6-5.8-11.4l-255.2-576.8c-21.4-48.4-10.8-105 26.6-142.4 24.4-24.4 57.2-37.4 90.4-37.4 17.4 0 35.2 3.6 51.8 11l576.6 255.4c4 1.8 7.8 3.8 11.4 5.8v-400.2c0.2-70.4-57.4-128-127.8-128z", + "M958.6 637.4l-576.6-255.4 255.4 576.6 64.6-128.6 192 192 128-128-192-192z" + ], + "attrs": [ + { + "fill": "rgb(0, 0, 0)" + }, + { + "fill": "rgb(0, 0, 0)" + } + ], + "grid": 0, + "tags": [ + "icon-box-with-arrow-cursor" + ], + "colorPermutations": { + "16161751": [ + 0, + 0 + ], + "125525525516161751": [ + 0, + 0 + ], + "11617516161751": [ + 0, + 0 + ] + }, + "defaultCode": 58880, + "id": 30 + }, + { + "paths": [ + "M512 0c-214.866 0-398.786 132.372-474.744 320h90.744c56.86 0 107.938 24.724 143.094 64h240.906l-192-192h256l320 320-320 320h-256l192-192h-240.906c-35.156 39.276-86.234 64-143.094 64h-90.744c75.958 187.628 259.878 320 474.744 320 282.77 0 512-229.23 512-512s-229.23-512-512-512z" + ], + "grid": 0, + "tags": [ + "icon-activity-mode" + ], + "defaultCode": 65, + "id": 31, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M576 64h-256l320 320h-290.256c-44.264-76.516-126.99-128-221.744-128h-128v512h128c94.754 0 177.48-51.484 221.744-128h290.256l-320 320h256l448-448-448-448z" + ], + "grid": 0, + "tags": [ + "icon-activity" + ], + "defaultCode": 97, + "id": 32, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M832 0h-640c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192zM640 832c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-64c0-35.2 28.8-64 64-64h128c35.2 0 64 28.8 64 64v64zM696.062 191.506l-48.124 384.988c-4.366 34.928-36.738 63.506-71.938 63.506h-128c-35.2 0-67.572-28.578-71.938-63.506l-48.124-384.988c-4.366-34.928 20.862-63.506 56.062-63.506h256c35.2 0 60.428 28.578 56.062 63.506z" + ], + "grid": 0, + "tags": [ + "icon-alert-rect" + ], + "defaultCode": 33, + "id": 33, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M998.208 848.864l-422.702-739.728c-34.928-61.124-92.084-61.124-127.012 0l-422.702 739.728c-34.928 61.126-5.906 111.136 64.494 111.136h843.428c70.4 0 99.422-50.010 64.494-111.136zM512 832c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64c0 35.2-28.8 64-64 64zM627.448 382.758l-38.898 194.486c-6.902 34.516-41.35 62.756-76.55 62.756s-69.648-28.24-76.552-62.758l-38.898-194.486c-6.902-34.516 16.25-62.756 51.45-62.756h128c35.2 0 58.352 28.24 51.448 62.758z" + ], + "grid": 0, + "tags": [ + "icon-alert-triangle" + ], + "defaultCode": 58883, + "id": 34, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M510 510l-512-512h1024z", + "M510 1022l-512-512h1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-double-down" + ], + "defaultCode": 238, + "id": 35, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M510 510l512 512h-1024z", + "M510-2l512 512h-1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-double-up" + ], + "defaultCode": 235, + "id": 36, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 768l512-512h-1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-down" + ], + "defaultCode": 118, + "id": 37, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M256 512l512 512v-1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-left" + ], + "defaultCode": 60, + "id": 38, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M768 512l-512-512v1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-right" + ], + "defaultCode": 62, + "id": 39, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 1024l-512-1024h1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-tall-down" + ], + "defaultCode": 236, + "id": 40, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 0l512 1024h-1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-tall-up" + ], + "defaultCode": 237, + "id": 41, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 256l-512 512h1024z" + ], + "grid": 0, + "tags": [ + "icon-arrow-up" + ], + "defaultCode": 94, + "id": 42, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M0 512l256 256v-512z", + "M512 0l-256 256h512z", + "M512 1024l256-256h-512z", + "M768 256v512l256-256z" + ], + "grid": 0, + "tags": [ + "icon-arrows-out" + ], + "defaultCode": 73, + "id": 43, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 512l-448 512v-1024z", + "M448 0l-448 512 448 512z" + ], + "grid": 0, + "tags": [ + "icon-arrows-right-left" + ], + "defaultCode": 58893, + "id": 44, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 0l512 448h-1024z", + "M0 576l512 448 512-448z" + ], + "grid": 0, + "tags": [ + "icon-arrows-up-down" + ], + "defaultCode": 53, + "id": 45, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1004.166 340.458l-97.522-168.916-330.534 229.414 33.414-400.956h-195.048l33.414 400.956-330.534-229.414-97.522 168.916 363.944 171.542-363.944 171.542 97.522 168.916 330.534-229.414-33.414 400.956h195.048l-33.414-400.956 330.534 229.414 97.522-168.916-363.944-171.542z" + ], + "grid": 0, + "tags": [ + "icon-asterisk" + ], + "defaultCode": 42, + "id": 46, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M192 0c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h64v-1024h-64z", + "M384 0h256v1024h-256v-1024z", + "M832 0h-64v704h256v-512c0-105.6-86.4-192-192-192z" + ], + "grid": 0, + "tags": [ + "icon-autoflow-tabular" + ], + "defaultCode": 72, + "id": 47, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M0 0h1024v1024h-1024v-1024z" + ], + "attrs": [ + { + "fill": "rgb(0, 0, 0)" + } + ], + "grid": 0, + "tags": [ + "icon-box-round-corners" + ], + "colorPermutations": { + "16161751": [ + 0 + ], + "125525525516161751": [ + 0 + ], + "11617516161751": [ + 0 + ] + }, + "defaultCode": 224, + "id": 48 + }, + { + "paths": [ + "M1024 0l-640 640-384-384v384l384 384 640-640z" + ], + "grid": 0, + "tags": [ + "icon-check" + ], + "defaultCode": 50, + "id": 49, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM768 576h-256c-35.2 0-64-28.8-64-64v-384c0-35.2 28.8-64 64-64s64 28.8 64 64v320h192c35.2 0 64 28.8 64 64s-28.8 64-64 64z" + ], + "grid": 0, + "tags": [ + "icon-clock" + ], + "defaultCode": 67, + "id": 50, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M704 576c0 70.4-57.6 128-128 128h-128c-70.4 0-128-57.6-128-128v-128c0-70.4 57.6-128 128-128h128c70.4 0 128 57.6 128 128v128z", + "M1024 512l-192-320v640z", + "M0 512l192-320v640z" + ], + "grid": 0, + "tags": [ + "icon-connectivity" + ], + "defaultCode": 46, + "id": 51, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M683.52 819.286c-50.782 28.456-109.284 44.714-171.52 44.714-194.094 0-352-157.906-352-352s157.906-352 352-352 352 157.906 352 352c0 62.236-16.258 120.738-44.714 171.52l191.692 191.692c8.516-13.89 13.022-28.354 13.022-43.212v-640c0-106.038-229.23-192-512-192s-512 85.962-512 192v640c0 106.038 229.23 192 512 192 126.11 0 241.548-17.108 330.776-45.46l-159.256-159.254z", + "M352 512c0 88.224 71.776 160 160 160s160-71.776 160-160-71.776-160-160-160-160 71.776-160 160z" + ], + "grid": 0, + "tags": [ + "icon-database-query" + ], + "defaultCode": 100, + "id": 52, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 192c0 106.039-229.23 192-512 192s-512-85.961-512-192c0-106.039 229.23-192 512-192s512 85.961 512 192z", + "M512 512c-282.77 0-512-85.962-512-192v512c0 106.038 229.23 192 512 192s512-85.962 512-192v-512c0 106.038-229.23 192-512 192z" + ], + "grid": 0, + "tags": [ + "icon-database" + ], + "defaultCode": 68, + "id": 53, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M832 640c105.6 0 192-86.4 192-192v-256c0-105.6-86.4-192-192-192v320l-128-64-128 64v-320h-384c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-192c0 105.6-86.4 192-192 192h-640v-192h640z" + ], + "grid": 0, + "tags": [ + "icon-dictionary" + ], + "defaultCode": 81, + "id": 54, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M640 256v-128c0-70.4-57.6-128-128-128h-384c-70.4 0-128 57.6-128 128v384c0 70.4 57.6 128 128 128h128v-139.6c0-134.8 109.6-244.4 244.4-244.4h139.6z", + "M896 384h-384c-70.4 0-128 57.6-128 128v384c0 70.4 57.6 128 128 128h384c70.4 0 128-57.6 128-128v-384c0-70.4-57.6-128-128-128z" + ], + "grid": 0, + "tags": [ + "icon-duplicate" + ], + "defaultCode": 242, + "id": 55, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z", + "M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128zM704 800h-128v128h-128v-128h-128v-128h128v-128h128v128h128v128z" + ], + "grid": 0, + "tags": [ + "icon-folder-new" + ], + "defaultCode": 102, + "id": 56, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z", + "M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128z" + ], + "grid": 0, + "tags": [ + "icon-folder" + ], + "defaultCode": 70, + "id": 57, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M191.656 832c0.118 0.1 0.244 0.224 0.344 0.344v191.656h192v-192c0-105.6-86.4-192-192-192h-192v192h191.656z", + "M192 191.656c-0.1 0.118-0.224 0.244-0.344 0.344h-191.656v192h192c105.6 0 192-86.4 192-192v-192h-192v191.656z", + "M832 384h192v-192h-191.656c-0.118-0.1-0.244-0.226-0.344-0.344v-191.656h-192v192c0 105.6 86.4 192 192 192z", + "M832 832.344c0.1-0.118 0.224-0.244 0.344-0.344h191.656v-192h-192c-105.6 0-192 86.4-192 192v192h192v-191.656z" + ], + "grid": 0, + "tags": [ + "icon-fullscreen-collapse" + ], + "defaultCode": 95, + "id": 58, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M192.344 832c-0.118-0.1-0.244-0.224-0.344-0.344v-191.656h-192v192c0 105.6 86.4 192 192 192h192v-192h-191.656z", + "M192 192.344c0.1-0.118 0.224-0.244 0.344-0.344h191.656v-192h-192c-105.6 0-192 86.4-192 192v192h192v-191.656z", + "M832 0h-192v192h191.656c0.118 0.1 0.244 0.226 0.344 0.344v191.656h192v-192c0-105.6-86.4-192-192-192z", + "M832 831.656c-0.1 0.118-0.224 0.244-0.344 0.344h-191.656v192h192c105.6 0 192-86.4 192-192v-192h-192v191.656z" + ], + "grid": 0, + "tags": [ + "icon-fullscreen-expand" + ], + "defaultCode": 122, + "id": 59, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 576v-128l-140.976-35.244c-8.784-32.922-21.818-64.106-38.504-92.918l74.774-124.622-90.51-90.51-124.622 74.774c-28.812-16.686-59.996-29.72-92.918-38.504l-35.244-140.976h-128l-35.244 140.976c-32.922 8.784-64.106 21.818-92.918 38.504l-124.622-74.774-90.51 90.51 74.774 124.622c-16.686 28.812-29.72 59.996-38.504 92.918l-140.976 35.244v128l140.976 35.244c8.784 32.922 21.818 64.106 38.504 92.918l-74.774 124.622 90.51 90.51 124.622-74.774c28.812 16.686 59.996 29.72 92.918 38.504l35.244 140.976h128l35.244-140.976c32.922-8.784 64.106-21.818 92.918-38.504l124.622 74.774 90.51-90.51-74.774-124.622c16.686-28.812 29.72-59.996 38.504-92.918l140.976-35.244zM704 512c0 106.038-85.962 192-192 192s-192-85.962-192-192 85.962-192 192-192 192 85.962 192 192z" + ], + "grid": 0, + "tags": [ + "icon-gear" + ], + "defaultCode": 71, + "id": 60, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM896 896h-768v-768h768v768z", + "M320 256l-128 128v448h640v-320l-128-128-128 128z" + ], + "grid": 0, + "tags": [ + "icon-image" + ], + "defaultCode": 227, + "id": 61, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 384l-512-384-512 384 512 384z", + "M512 896l-426.666-320-85.334 64 512 384 512-384-85.334-64z" + ], + "grid": 0, + "tags": [ + "icon-layers" + ], + "defaultCode": 225, + "id": 62, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M448 0h-256c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h256v-1024z", + "M832 0h-256v577.664h448v-385.664c0-105.6-86.4-192-192-192z", + "M576 1024h256c105.6 0 192-86.4 192-192v-129.664h-448v321.664z" + ], + "grid": 0, + "tags": [ + "icon-layout" + ], + "defaultCode": 76, + "id": 63, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M64 576c-35.346 0-64-28.654-64-64s28.654-64 64-64h896c35.346 0 64 28.654 64 64s-28.654 64-64 64h-896z" + ], + "grid": 0, + "tags": [ + "icon-line-horz" + ], + "defaultCode": 226, + "id": 64, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 512l-512-512v307.2l-512 204.8v256h512v256z" + ], + "grid": 0, + "tags": [ + "icon-link" + ], + "defaultCode": 244, + "id": 65, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M640 384h-128v-128h-128v128h-128v128h128v128h128v-128h128z", + "M1024 896l-201.662-201.662c47.922-72.498 73.662-157.434 73.662-246.338 0-119.666-46.6-232.168-131.216-316.784s-197.118-131.216-316.784-131.216c-119.666 0-232.168 46.6-316.784 131.216s-131.216 197.118-131.216 316.784c0 119.666 46.6 232.168 131.216 316.784s197.118 131.216 316.784 131.216c88.904 0 173.84-25.74 246.338-73.662l201.662 201.662 128-128zM448 704c-141.16 0-256-114.842-256-256 0-141.16 114.84-256 256-256 141.158 0 256 114.84 256 256 0 141.158-114.842 256-256 256z" + ], + "grid": 0, + "tags": [ + "icon-magnify-in" + ], + "defaultCode": 88, + "id": 66, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M256 384h384v128h-384v-128z", + "M1024 896l-201.662-201.662c47.922-72.498 73.662-157.434 73.662-246.338 0-119.666-46.6-232.168-131.216-316.784s-197.118-131.216-316.784-131.216c-119.666 0-232.168 46.6-316.784 131.216s-131.216 197.118-131.216 316.784c0 119.666 46.6 232.168 131.216 316.784s197.118 131.216 316.784 131.216c88.904 0 173.84-25.74 246.338-73.662l201.662 201.662 128-128zM448 704c-141.16 0-256-114.842-256-256 0-141.16 114.84-256 256-256 141.158 0 256 114.84 256 256 0 141.158-114.842 256-256 256z" + ], + "grid": 0, + "tags": [ + "icon-magnify-out" + ], + "defaultCode": 89, + "id": 67, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 896l-201.662-201.662c47.922-72.498 73.662-157.434 73.662-246.338 0-119.666-46.6-232.168-131.216-316.784s-197.118-131.216-316.784-131.216-232.168 46.6-316.784 131.216-131.216 197.118-131.216 316.784 46.6 232.168 131.216 316.784 197.118 131.216 316.784 131.216c88.904 0 173.84-25.74 246.338-73.662l201.662 201.662 128-128zM448 704c-141.16 0-256-114.842-256-256 0-141.16 114.84-256 256-256 141.158 0 256 114.84 256 256 0 141.158-114.842 256-256 256z" + ], + "grid": 0, + "tags": [ + "icon-magnify" + ], + "defaultCode": 77, + "id": 68, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M0 0h1024v256h-1024v-256z", + "M0 384h1024v256h-1024v-256z", + "M0 768h1024v256h-1024v-256z" + ], + "grid": 0, + "tags": [ + "icon-menu" + ], + "defaultCode": 109, + "id": 69, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M293.4 512l218.6-218.6 256 256v-421.4c0-70.4-57.6-128-128-128h-512c-70.4 0-128 57.6-128 128v512c0 70.4 57.6 128 128 128h421.4l-256-256z", + "M1024 448h-128v320l-384-384-128 128 384 384h-320v128h576z" + ], + "grid": 0, + "tags": [ + "icon-move" + ], + "defaultCode": 243, + "id": 70, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M448 0v128h320l-384 384 128 128 384-384v320h128v-576z", + "M576 674.274v157.382c-0.1 0.118-0.226 0.244-0.344 0.344h-383.312c-0.118-0.1-0.244-0.226-0.344-0.344v-383.312c0.1-0.118 0.226-0.244 0.344-0.344h157.382l192-192h-349.726c-105.6 0-192 86.4-192 192v384c0 105.6 86.4 192 192 192h384c105.6 0 192-86.4 192-192v-349.726l-192 192z" + ], + "grid": 0, + "tags": [ + "icon-new-window" + ], + "defaultCode": 121, + "id": 71, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M512 1024l512-320v-384l-512.020-320-511.98 320v384l512 320zM512 192l358.4 224-358.4 224-358.4-224 358.4-224z" + ], + "grid": 0, + "tags": [ + "icon-object" + ], + "defaultCode": 111, + "id": 72, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M510-2l-512 320v384l512 320 512-320v-384l-512-320zM585.4 859.2c-21.2 20.8-46 30.8-76 30.8-31.2 0-56.2-9.8-76.2-29.6-20-20-29.6-44.8-29.6-76.2 0-30.4 10.2-55.2 31-76.2s45.2-31.2 74.8-31.2c29.6 0 54.2 10.4 75.6 32s31.8 46.4 31.8 76c-0.2 29-10.8 54-31.4 74.4zM638.2 546.6c-23.6 11.8-37.4 22-43.4 32.4-3.6 6.2-6 14.8-7.4 26.8v41h-161.4v-44.2c0-40.2 4.4-69.8 13-88 8-17.2 22.6-30.2 44.8-40l34.8-15.4c32-14.2 48.2-35.2 48.2-62.8 0-16-6-30.4-17.2-41.8-11.2-11.2-25.6-17.2-41.6-17.2-24 0-54.4 10-62.8 57.4l-2.2 12.2h-147l1.4-16.2c4-44.6 17-82.4 38.8-112.2 19.6-27 45.6-48.6 77-64.6s64.6-24 98.2-24c60.6 0 110.2 19.4 151.4 59.6 41.2 40 61.2 88 61.2 147.2 0 70.8-28.8 121.4-85.8 149.8z" + ], + "grid": 0, + "tags": [ + "icon-object-unknown" + ], + "defaultCode": 63, + "id": 73, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M511.98 0l-511.98 320v512c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-512l-512.020-320zM512 192l358.4 224-358.4 224-358.4-224 358.4-224z" + ], + "grid": 0, + "tags": [ + "icon-packet" + ], + "defaultCode": 86, + "id": 74, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M702 508c-105.6 0-192-86.4-192-192v-320h-320c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-320h-320z", + "M766 380h256l-384-384v256c0 70.4 57.6 128 128 128z" + ], + "grid": 0, + "tags": [ + "icon-page" + ], + "defaultCode": 234, + "id": 75, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M126-2h256v1024h-256v-1024z", + "M638-2h256v1024h-256v-1024z" + ], + "grid": 0, + "tags": [ + "icon-pause" + ], + "defaultCode": 241, + "id": 76, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M922.344 101.68c-38.612-38.596-81.306-69.232-120.304-86.324-68.848-30.25-104.77-9.078-120.194 6.344l-516.228 516.216-3.136 9.152-162.482 476.932 485.998-165.612 6.73-6.806 509.502-509.506c9.882-9.866 21.768-27.77 21.768-56.578 0.002-50.71-38.996-121.148-101.654-183.818zM237.982 855.66l-69.73-69.728 69.25-203.228 18.498-6.704h64v128h128v64l-6.846 18.506-203.172 69.154z" + ], + "grid": 0, + "tags": [ + "icon-pencil" + ], + "defaultCode": 112, + "id": 77, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M704 320h64c70.4 0 128-57.6 128-128v-64c0-70.4-57.6-128-128-128h-64c-70.4 0-128 57.6-128 128v64c0 70.4 57.6 128 128 128z", + "M256 320h64c70.4 0 128-57.6 128-128v-64c0-70.4-57.6-128-128-128h-64c-70.4 0-128 57.6-128 128v64c0 70.4 57.6 128 128 128z", + "M832 384h-192c-34.908 0-67.716 9.448-96 25.904 57.278 33.324 96 95.404 96 166.096v448h384v-448c0-105.6-86.4-192-192-192z", + "M384 384h-192c-105.6 0-192 86.4-192 192v448h576v-448c0-105.6-86.4-192-192-192z" + ], + "grid": 0, + "tags": [ + "icon-people" + ], + "defaultCode": 79, + "id": 78, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1024 512l-1024 512v-1024z" + ], + "grid": 0, + "tags": [ + "icon-play" + ], + "defaultCode": 239, + "id": 79, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M255.884 704c0.040-0.034 0.082-0.074 0.116-0.116v-127.884c0-70.58 57.42-128 128-128h255.884c0.040-0.034 0.082-0.074 0.116-0.116v-127.884c0-70.58 57.42-128 128-128h143.658c-93.832-117.038-237.98-192-399.658-192-282.77 0-512 229.23-512 512 0 67.904 13.25 132.704 37.256 192h218.628z", + "M768.116 320c-0.040 0.034-0.082 0.074-0.116 0.116v127.884c0 70.58-57.42 128-128 128h-255.884c-0.040 0.034-0.082 0.074-0.116 0.116v127.884c0 70.58-57.42 128-128 128h-143.658c93.832 117.038 237.98 192 399.658 192 282.77 0 512-229.23 512-512 0-67.904-13.25-132.704-37.256-192h-218.628z" + ], + "grid": 0, + "tags": [ + "icon-plot-resource" + ], + "defaultCode": 233, + "id": 80, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M960 384h-330v-320c0-35.2-28.8-64-64-64h-108c-35.2 0-64 28.8-64 64v320h-330c-35.2 0-64 28.8-64 64v128c0 35.2 28.8 64 64 64h330v320c0 35.2 28.8 64 64 64h108c35.2 0 64-28.8 64-64v-320h330c35.2 0 64-28.8 64-64v-128c0-35.2-28.8-64-64-64z" + ], + "grid": 0, + "tags": [ + "icon-plus" + ], + "defaultCode": 43, + "id": 81, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M960 640c35.2 0 64-28.8 64-64v-128c0-35.2-28.8-64-64-64h-896c-35.2 0-64 28.8-64 64v128c0 35.2 28.8 64 64 64h896z" + ], + "grid": 0, + "tags": [ + "icon-minus" + ], + "defaultCode": 45, + "id": 82, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M1022.294 512c-1.746-7.196-3.476-14.452-5.186-21.786-20.036-85.992-53.302-208.976-98-306.538-22.42-48.938-45.298-86.556-69.946-115.006-48.454-55.93-98.176-67.67-131.356-67.67s-82.902 11.74-131.356 67.672c-24.648 28.45-47.528 66.068-69.948 115.006-44.696 97.558-77.962 220.544-98 306.538-21.646 92.898-46.444 175.138-71.71 237.836-16.308 40.46-30.222 66.358-40.6 82.604-10.378-16.246-24.292-42.142-40.6-82.604-23.272-57.75-46.144-132.088-66.524-216.052h-197.362c1.746 7.196 3.476 14.452 5.186 21.786 20.036 85.992 53.302 208.976 98 306.538 22.42 48.938 45.298 86.556 69.946 115.006 48.454 55.932 98.176 67.672 131.356 67.672s82.902-11.74 131.356-67.672c24.648-28.45 47.528-66.068 69.948-115.006 44.696-97.558 77.962-220.544 98-306.538 21.646-92.898 46.444-175.138 71.71-237.836 16.308-40.46 30.222-66.358 40.6-82.604 10.378 16.246 24.292 42.142 40.6 82.604 23.274 57.748 46.146 132.086 66.526 216.050h197.36z" + ], + "grid": 0, + "tags": [ + "icon-sine" + ], + "defaultCode": 54, + "id": 83, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M0 0v256h128v-64h256v704h-192v128h640v-128h-192v-704h256v64h128v-256z" + ], + "grid": 0, + "tags": [ + "icon-T" + ], + "defaultCode": 228, + "id": 84, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M169.2 448c14-56.4 33-122 56.6-176.8 15.4-35.8 31.2-63.2 48.2-84 18.4-22.4 49-49.2 91-49.2s72.6 26.8 91 49.2c17 20.6 32.6 48.2 48.2 84 23.6 54.8 42.8 120.4 56.6 176.8h461.2v-256c0-105.6-86.4-192-192-192h-640c-105.6 0-192 86.4-192 192v256h171.2z", + "M718.6 576h-127.2c25 93.4 48.4 144.4 63.6 168.6 15.2-24.2 38.6-75.2 63.6-168.6z", + "M301.4 448h127.2c-25-93.4-48.4-144.4-63.6-168.6-15.2 24.2-38.6 75.2-63.6 168.6z", + "M850.8 576c-14 56.4-33 122-56.6 176.8-15.4 35.8-31.2 63.2-48.2 84-18.4 22.4-49 49.2-91 49.2s-72.6-26.8-91-49.2c-17-20.6-32.6-48.2-48.2-84-23.6-54.8-42.8-120.4-56.6-176.8h-461.2v256c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-256h-171.2z" + ], + "grid": 0, + "tags": [ + "icon-telemetry-panel" + ], + "defaultCode": 116, + "id": 85, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M718.6 576h-127.2c25 93.4 48.4 144.4 63.6 168.6 15.2-24.2 38.6-75.2 63.6-168.6z", + "M794.2 752.8c-15.4 35.8-31.2 63.2-48.2 84-18.4 22.4-49 49.2-91 49.2s-72.6-26.8-91-49.2c-17-20.6-32.6-48.2-48.2-84-23.6-54.8-42.8-120.4-56.6-176.8h-457.2c31.4 252.6 247 448 508 448s476.6-195.4 508-448h-167.2c-14 56.4-33 122-56.6 176.8z", + "M301.4 448h127.2c-25-93.4-48.4-144.4-63.6-168.6-15.2 24.2-38.6 75.2-63.6 168.6z", + "M274 187.2c18.4-22.4 49-49.2 91-49.2s72.6 26.8 91 49.2c17 20.6 32.6 48.2 48.2 84 23.6 54.8 42.8 120.4 56.6 176.8h457.2c-31.4-252.6-246.8-448-508-448s-476.6 195.4-508 448h167.2c14-56.4 33-122 56.6-176.8 15.6-35.8 31.4-63.2 48.2-84z" + ], + "grid": 0, + "tags": [ + "icon-telemetry" + ], + "defaultCode": 84, + "id": 86, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M448 382c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z", + "M1024 382c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z", + "M448 958c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z", + "M1024 958c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z" + ], + "grid": 0, + "tags": [ + "icon-thumbs-strip" + ], + "defaultCode": 246, + "id": 87, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M256 256h384v128h-384v-128z", + "M384 448h384v128h-384v-128z", + "M320 640h384v128h-384v-128z", + "M832 0h-128v192h127.6c0.2 0 0.2 0.2 0.4 0.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-127.6v192h128c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192z", + "M192 831.6v-639.2c0-0.2 0.2-0.2 0.4-0.4h127.6v-192h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192h-127.6c-0.2 0-0.4-0.2-0.4-0.4z" + ], + "grid": 0, + "tags": [ + "icon-timeline" + ], + "defaultCode": 83, + "id": 88, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M638 62c0-35.4-28.6-64-64-64h-128c-35.4 0-64 28.6-64 64s28.6 64 64 64h128c35.4 0 64-28.6 64-64z", + "M510 126c-247.4 0-448 200.6-448 448s200.6 448 448 448 448-200.6 448-448-200.6-448-448-448zM510 574h-336c0-185.2 150.8-336 336-336v336z" + ], + "grid": 0, + "tags": [ + "icon-timer" + ], + "defaultCode": 245, + "id": 89, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M832 128h-192.36v-64c0-35.2-28.8-64-64-64h-128c-35.2 0-64 28.8-64 64v64h-191.64c-105.6 0-192 72-192 160s0 160 0 160h64v384c0 105.6 86.4 192 192 192h512c105.6 0 192-86.4 192-192v-384h64c0 0 0-72 0-160s-86.4-160-192-160zM320 832h-128v-384h128v384zM576 832h-128v-384h128v384zM832 832h-128v-384h128v384z" + ], + "grid": 0, + "tags": [ + "icon-trash" + ], + "defaultCode": 90, + "id": 90, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM128 128h320v768h-320v-768zM896 896h-320v-768h320v768z" + ], + "grid": 0, + "tags": [ + "icon-two-parts-both" + ], + "defaultCode": 229, + "id": 91, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM896 896h-320v-768h320v768z" + ], + "grid": 0, + "tags": [ + "icon-two-parts-one-only" + ], + "defaultCode": 231, + "id": 92, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M384 512l-365.332 365.332c-24.89 24.89-24.89 65.62 0 90.51l37.49 37.49c24.89 24.89 65.62 24.89 90.51 0 0 0 365.332-365.332 365.332-365.332l365.332 365.332c24.89 24.89 65.62 24.89 90.51 0l37.49-37.49c24.89-24.89 24.89-65.62 0-90.51l-365.332-365.332c0 0 365.332-365.332 365.332-365.332 24.89-24.89 24.89-65.62 0-90.51l-37.49-37.49c-24.89-24.89-65.62-24.89-90.51 0 0 0-365.332 365.332-365.332 365.332l-365.332-365.332c-24.89-24.89-65.62-24.89-90.51 0l-37.49 37.49c-24.89 24.89-24.89 65.62 0 90.51 0 0 365.332 365.332 365.332 365.332z" + ], + "grid": 0, + "tags": [ + "icon-x-heavy" + ], + "defaultCode": 120, + "id": 93, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } + }, + { + "paths": [ + "M384 512l-365.332 365.332c-24.89 24.89-24.89 65.62 0 90.51l37.49 37.49c24.89 24.89 65.62 24.89 90.51 0 0 0 365.332-365.332 365.332-365.332l365.332 365.332c24.89 24.89 65.62 24.89 90.51 0l37.49-37.49c24.89-24.89 24.89-65.62 0-90.51l-365.332-365.332c0 0 365.332-365.332 365.332-365.332 24.89-24.89 24.89-65.62 0-90.51l-37.49-37.49c-24.89-24.89-65.62-24.89-90.51 0 0 0-365.332 365.332-365.332 365.332l-365.332-365.332c-24.89-24.89-65.62-24.89-90.51 0l-37.49 37.49c-24.89 24.89-24.89 65.62 0 90.51 0 0 365.332 365.332 365.332 365.332z" + ], + "grid": 0, + "tags": [ + "icon-x" + ], + "defaultCode": 58946, + "id": 94, + "attrs": [], + "colorPermutations": { + "11617516161751": [] + } } ], - "grid": 0, - "tags": [ - "icon-tabular-lad" - ], - "colorPermutations": { - "16161751": [], - "11617516161751": [ - 1, - 1 + "colorThemes": [ + [ + [ + 0, + 0, + 0, + 1 + ], + [ + 0, + 161, + 75, + 1 + ], + [ + 6, + 161, + 75, + 1 + ] ] - }, - "defaultCode": 58913 - }, - { - "paths": [ - "M896 0h-768c-70.606 0.215-127.785 57.394-128 127.979l-0 768.021c0.215 70.606 57.394 127.785 127.979 128l768.021 0c70.606-0.215 127.785-57.394 128-127.979l0-768.021c-0.215-70.606-57.394-127.785-127.979-128zM448 292l25.060 25.32c7.916 7.922 18.856 12.822 30.94 12.822s23.024-4.9 30.94-12.822l75.5-76.3c29.97-30.338 71.571-49.128 117.56-49.128s87.59 18.79 117.544 49.112l50.456 50.997v152.2c-24.111-8.83-44.678-22.255-61.542-39.342l-75.518-76.318c-7.916-7.922-18.856-12.822-30.94-12.822s-23.024 4.9-30.94 12.822l-75.5 76.3c-29.971 30.343-71.575 49.137-117.568 49.137-20.084 0-39.331-3.584-57.137-10.146l1.145-151.831zM320 960h-192c-35.26-0.214-63.786-28.74-64-63.98l-0-128.020h256v192zM320 704h-256v-192h256v192zM320 448h-256v-192h256v192zM640 960h-256v-192h256v192zM448 636.62v-174.5c1.88 1.74 3.74 3.5 5.56 5.34l75.5 76.3c7.916 7.922 18.856 12.822 30.94 12.822s23.024-4.9 30.94-12.822l75.5-76.3c29.966-30.333 71.56-49.119 117.542-49.119 43.28 0 82.673 16.644 112.128 43.879l-0.11 174.399c-1.88-1.74-3.74-3.5-5.56-5.34l-75.5-76.3c-7.916-7.922-18.856-12.822-30.94-12.822s-23.024 4.9-30.94 12.822l-75.5 76.3c-29.966 30.333-71.56 49.119-117.542 49.119-43.28 0-82.673-16.644-112.128-43.879zM960 896c-0.214 35.26-28.74 63.786-63.98 64l-192.020 0v-192h256v128z" ], - "attrs": [ - { - "fill": "rgb(0, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-tabular-realtime-v2" - ], - "colorPermutations": { - "16161751": [], - "11617516161751": [ - 1 - ] - }, - "defaultCode": 58912 - }, - { - "paths": [ - "M832 752c0 44-36 80-80 80h-480c-44 0-80-36-80-80v-480c0-44 36-80 80-80h480c44 0 80 36 80 80v480z" - ], - "grid": 0, - "tags": [ - "icon-bullet" - ], - "defaultCode": 58905 - }, - { - "paths": [ - "M635.6 524.4c6.6 4.2 13.2 8.6 19.2 13.6l120.4 96.4c29.6 23.8 83.8 23.8 113.4 0l135.2-108c0.2-4.8 0.2-9.4 0.2-14.2 0-52.2-7.8-102.4-22.2-149.8l-154.8 123.6c-58.2 46.6-140.2 59.2-211.4 38.4z", - "M248.6 634.2l120.4-96.4c58-46.4 140-59.2 211.2-38.4-6.6-4.2-13.2-8.6-19.2-13.6l-120.4-96.4c-29.6-23.8-83.8-23.8-113.4 0l-120.2 96.6c-40 32-91.4 48-143 48-21.6 0-43-2.8-63.8-8.4 0 0.6 0 1.2 0 1.6 5 3.4 10 6.8 14.6 10.6l120.4 96.4c29.8 23.8 83.8 23.8 113.4 0z", - "M120.6 378.2l120.4-96.4c80.2-64.2 205.6-64.2 285.8 0l120.4 96.4c29.6 23.8 83.8 23.8 113.4 0l181-144.8c-91.2-140.4-249.6-233.4-429.6-233.4-238.6 0-439.2 163.2-496 384.2 30.8 17.6 77.8 15.6 104.6-6z", - "M689 742l-120.4-96.4c-29.6-23.8-83.8-23.8-113.4 0l-120.2 96.4c-40 32-91.4 48-143 48-47.8 0-95.4-13.8-134.2-41.4 85.6 163.6 256.8 275.4 454.2 275.4s368.6-111.8 454.2-275.4c-80.4 57.4-199.8 55.2-277.2-6.6z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" + "colorThemeIdx": 0, + "preferences": { + "showGlyphs": true, + "showQuickUse": true, + "showQuickUse2": true, + "showSVGs": true, + "fontPref": { + "prefix": "", + "metadata": { + "fontFamily": "wtdsymbols", + "majorVersion": 2, + "minorVersion": 0 + }, + "metrics": { + "emSize": 1024, + "baseline": 6.25, + "whitespace": 50 + }, + "resetPoint": 58880, + "showVersion": true, + "showSelector": true, + "selector": "class", + "classSelector": ".ui-symbol", + "showMetrics": true, + "showMetadata": true, + "embed": false }, - { - "fill": "rgb(6, 161, 75)" + "imagePref": { + "prefix": "icon-", + "png": true, + "useClassSelector": true, + "color": 4473924, + "bgColor": 16777215, + "classSelector": ".icon" }, - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-session" - ], - "colorPermutations": { - "16161751": [ - 1, - 1, - 1, - 1 - ] + "historySize": 100, + "showCodes": true, + "gridSize": 16, + "showLiga": false }, - "defaultCode": 58904 - }, - { - "paths": [ - "M454.36 476.64l86.3-86.3c9.088-8.965 21.577-14.502 35.36-14.502s26.272 5.537 35.366 14.507l86.294 86.294c19.328 19.358 42.832 34.541 69.047 44.082l1.313-171.722-57.64-57.64c-34.407-34.33-81.9-55.558-134.35-55.558s-99.943 21.228-134.354 55.562l-86.296 86.297c-9.088 8.965-21.577 14.502-35.36 14.502s-26.272-5.537-35.366-14.507l-28.674-28.654v172.14c19.045 7.022 41.040 11.084 63.984 11.084 52.463 0 99.966-21.239 134.379-55.587z", - "M505.64 547.36l-86.3 86.3c-9.088 8.965-21.577 14.502-35.36 14.502s-26.272-5.537-35.366-14.507l-86.294-86.294c-2-2-4.2-4-6.36-6v197.36c33.664 30.72 78.65 49.537 128.031 49.537 52.44 0 99.923-21.22 134.333-55.541l86.296-86.296c9.088-8.965 21.577-14.502 35.36-14.502s26.272 5.537 35.366 14.507l86.294 86.294c2 2 4.2 4 6.36 6v-197.36c-33.664-30.72-78.65-49.537-128.031-49.537-52.44 0-99.923 21.22-134.333 55.541z", - "M832 0h-128v192h127.66l0.34 0.34v639.32l-0.34 0.34h-127.66v192h128c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192z", - "M320 832h-127.66l-0.34-0.34v-639.32l0.34-0.34h127.66v-192h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192z" - ], - "grid": 0, - "tags": [ - "icon-topic" - ], - "defaultCode": 58903 - }, - { - "paths": [ - "M512 64c-261 0-480.6 195.4-512 448 31.4 252.6 251 448 512 448s480.6-195.4 512-448c-31.4-252.6-251-448-512-448zM768.2 734.6c-71.4 62.8-162.8 97.4-257.6 97.4s-186.2-34.6-257.6-97.4c-66.6-58.6-110.6-137.2-125-222.6 0 0 0-0.2 0-0.2 76.8-154 220.8-257.6 384-257.6s307.2 103.8 384 257.6c0 0 0 0.2 0 0.2-14.4 85.4-61.2 164-127.8 222.6z", - "M512 288c-123.8 0-224 100.2-224 224s100.2 224 224 224 224-100.2 224-224-100.2-224-224-224zM576 544c-53 0-96-43-96-96s43-96 96-96 96 43 96 96c0 53-43 96-96 96z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-eye-open-no-gleam" - ], - "colorPermutations": { - "16161751": [ - 1, - 1 - ], - "125525525516161751": [ - 1, - 1 - ] - }, - "defaultCode": 58902 - }, - { - "paths": [ - "M512 64c-261 0-480.6 195.4-512 448 31.4 252.6 251 448 512 448s480.6-195.4 512-448c-31.4-252.6-251-448-512-448zM768.2 734.6c-71.4 62.8-162.8 97.4-257.6 97.4s-186.2-34.6-257.6-97.4c-66.6-58.6-110.6-137.2-125-222.6 0 0 0-0.2 0-0.2 76.8-154 220.8-257.6 384-257.6s307.2 103.8 384 257.6c0 0 0 0.2 0 0.2-14.4 85.4-61.2 164-127.8 222.6z", - "M512 288c-123.8 0-224 100.2-224 224s100.2 224 224 224 224-100.2 224-224-100.2-224-224-224z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-crosshair" - ], - "colorPermutations": { - "16161751": [ - 1, - 1 - ], - "125525525516161751": [ - 1, - 1 - ] - }, - "defaultCode": 58901 - }, - { - "paths": [ - "M256 0h-256v1024h256c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192z", - "M512 320l512 320v-640z" - ], - "attrs": [ - { - "fill": "rgb(0, 0, 0)" - }, - { - "fill": "rgb(0, 0, 0)" - } - ], - "grid": 0, - "tags": [ - "icon-collapse-pane-left" - ], - "colorPermutations": { - "16161751": [ - 0, - 0 - ], - "125525525516161751": [ - 0, - 0 - ] - }, - "defaultCode": 58899 - }, - { - "paths": [ - "M768 0h256v1024h-256c-105.6 0-192-86.4-192-192v-640c0-105.6 86.4-192 192-192z", - "M512 320l-512 320v-640z" - ], - "attrs": [ - { - "fill": "rgb(0, 0, 0)" - }, - { - "fill": "rgb(0, 0, 0)" - } - ], - "grid": 0, - "tags": [ - "icon-collapse-pane-right" - ], - "colorPermutations": { - "16161751": [ - 0, - 0 - ], - "125525525516161751": [ - 0, - 0 - ] - }, - "defaultCode": 58900 - }, - { - "paths": [ - "M192.2 576c-0.2 0-0.2 0 0 0l-0.2 448h640v-447.8c0 0 0 0-0.2-0.2h-639.6z", - "M978.8 210.8l-165.4-165.4c-25-25-74.2-45.4-109.4-45.4h-576c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128v-448c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v448c70.4 0 128-57.6 128-128v-576c0-35.2-20.4-84.4-45.2-109.2zM704 256c0 35.2-28.8 64-64 64h-448c-35.2 0-64-28.8-64-64v-192h320v192h128v-192h128v192z" - ], - "attrs": [ - { - "fill": "rgb(0, 0, 0)" - }, - { - "fill": "rgb(0, 0, 0)" - } - ], - "grid": 0, - "tags": [ - "icon-save-v2" - ], - "colorPermutations": { - "16161751": [ - 0, - 0 - ], - "125525525516161751": [ - 0, - 0 - ] - }, - "defaultCode": 58898 - }, - { - "paths": [ - "M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z", - "M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128zM320 896h-128v-320h128v320zM576 896h-128v-320h128v320zM832 896h-128v-320h128v320z" - ], - "grid": 0, - "tags": [ - "icon-dataset" - ], - "defaultCode": 58897 - }, - { - "paths": [ - "M512 1024c106 0 192-86 192-192h-384c0 106 86 192 192 192z", - "M896 448v-64c0-212-172-384-384-384s-384 172-384 384v64c0 70.6-57.4 128-128 128v128h1024v-128c-70.6 0-128-57.4-128-128z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-bell" - ], - "colorPermutations": { - "16161751": [ - 1, - 1 - ], - "125525525516161751": [ - 1, - 1 - ] - }, - "defaultCode": 58896 - }, - { - "paths": [ - "M1024 0h-1024c0 282.8 229.2 512 512 512s512-229.2 512-512zM512 384c-102.6 0-199-40-271.6-112.4-41.2-41.2-72-90.2-90.8-143.6h724.6c-18.8 53.4-49.6 102.4-90.8 143.6-72.4 72.4-168.8 112.4-271.4 112.4z", - "M512 512c-282.8 0-512 229.2-512 512h1024c0-282.8-229.2-512-512-512z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-hourglass" - ], - "colorPermutations": { - "16161751": [ - 1, - 1 - ], - "125525525516161751": [ - 1, - 1 - ] - }, - "defaultCode": 58889 - }, - { - "paths": [ - "M512 0c-282.8 0-512 229.2-512 512s229.2 512 512 512 512-229.2 512-512-229.2-512-512-512zM512 128c70.6 0 128 57.4 128 128s-57.4 128-128 128c-70.6 0-128-57.4-128-128s57.4-128 128-128zM704 832h-384v-128h64v-256h256v256h64v128z" - ], - "attrs": [ - { - "fill": "rgb(0, 0, 0)" - } - ], - "grid": 0, - "tags": [ - "icon-info-v1.5" - ], - "colorPermutations": { - "16161751": [ - 0 - ], - "125525525516161751": [ - 0 - ] - }, - "defaultCode": 58888 - }, - { - "paths": [ - "M512 0c-282.8 0-512 229.2-512 512s229.2 512 512 512 512-229.2 512-512-229.2-512-512-512zM832 704l-128 128-192-192-192 192-128-128 192-192-192-192 128-128 192 192 192-192 128 128-192 192 192 192z" - ], - "grid": 0, - "tags": [ - "icon-x-in-circle" - ], - "defaultCode": 58887 - }, - { - "paths": [ - "M1024 192c0 106.039-229.23 192-512 192s-512-85.961-512-192c0-106.039 229.23-192 512-192s512 85.961 512 192z", - "M512 512c-282.8 0-512-86-512-192v512c0 106 229.2 192 512 192s512-86 512-192v-512c0 106-229.2 192-512 192zM896 575v256c-36.6 15.6-79.8 28.8-128 39.4v-256c48.2-10.6 91.4-23.8 128-39.4zM256 614.4v256c-48.2-10.4-91.4-23.8-128-39.4v-256c36.6 15.6 79.8 28.8 128 39.4zM384 890v-256c41 4 83.8 6 128 6s87-2.2 128-6v256c-41 4-83.8 6-128 6s-87-2.2-128-6z" - ], - "attrs": [ - { - "fill": "rgb(6,161,75)", - "opacity": 1 - }, - { - "fill": "rgb(6,161,75)", - "opacity": 1 - } - ], - "grid": 0, - "tags": [ - "icon-datatable" - ], - "colorPermutations": { - "16161751": [ - 1, - 1 - ], - "125525525516161751": [ - 1, - 1 - ] - }, - "defaultCode": 58881 - }, - { - "paths": [ - "M64 0c-35.2 0-64 28.8-64 64v192h448v-256h-384z", - "M1024 256v-192c0-35.2-28.8-64-64-64h-384v256h448z", - "M0 384v192c0 35.2 28.8 64 64 64h384v-256h-448z", - "M960 640c35.2 0 64-28.8 64-64v-192h-448v256h384z", - "M512 1024l-256-256h512z" - ], - "attrs": [ - { - "fill": "rgb(6,161,75)", - "opacity": 1 - }, - { - "fill": "rgb(6,161,75)", - "opacity": 1 - }, - { - "fill": "rgb(6,161,75)", - "opacity": 1 - }, - { - "fill": "rgb(6,161,75)", - "opacity": 1 - }, - { - "fill": "rgb(6,161,75)", - "opacity": 1 - } - ], - "grid": 0, - "tags": [ - "icon-tabular-scrolling" - ], - "colorPermutations": { - "16161751": [ - 1, - 1, - 1, - 1, - 1 - ], - "125525525516161751": [ - 1, - 1, - 1, - 1, - 1 - ] - }, - "defaultCode": 58882 - }, - { - "paths": [ - "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM640 448h-256v-192h256v192zM384 512h256v192h-256v-192zM320 704h-256v-192h256v192zM320 256v192h-256v-192h256zM128 960c-17 0-33-6.6-45.2-18.8s-18.8-28.2-18.8-45.2v-128h256v192h-192zM384 960v-192h256v192h-256zM960 896c0 17-6.6 33-18.8 45.2s-28.2 18.8-45.2 18.8h-192v-192h256v128zM960 704h-256v-192h256v192zM960 448h-256v-192h256v192z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-tabular" - ], - "colorPermutations": { - "16161751": [ - 1 - ] - }, - "defaultCode": 58884 - }, - { - "paths": [ - "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM640 448h-256v-192h256v192zM384 512h256v192h-256v-192zM320 704h-256v-192h256v192zM320 256v192h-256v-192h256zM128 960c-17 0-33-6.6-45.2-18.8s-18.8-28.2-18.8-45.2v-128h256v192h-192zM384 960v-192h256v192h-256zM960 896c0 17-6.6 33-18.8 45.2s-28.2 18.8-45.2 18.8h-192v-192h256v128zM960 704h-256v-192h256v192zM960 448h-256v-192h256v192z" - ], - "attrs": [ - { - "fill": "rgb(6,161,75)", - "opacity": 1 - } - ], - "grid": 0, - "tags": [ - "icon-calendar" - ], - "colorPermutations": { - "16161751": [ - 1 - ], - "125525525516161751": [ - 1 - ] - }, - "defaultCode": 58885 - }, - { - "paths": [ - "M544 224v224c0 88.4-71.6 160-160 160s-160-71.6-160-160v-97.2l-197.4 196.4c-50 50-12.4 215.2 112.4 340s290 162.4 340 112.4l417-423.6-352-352z", - "M896 1024c70.6 0 128-57.4 128-128 0-108.6-128-192-128-192s-128 83.4-128 192c0 70.6 57.4 128 128 128z", - "M384 512c-35.4 0-64-28.6-64-64v-384c0-35.4 28.6-64 64-64s64 28.6 64 64v384c0 35.4-28.6 64-64 64z" - ], - "attrs": [ - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - }, - { - "fill": "rgb(6, 161, 75)" - } - ], - "grid": 0, - "tags": [ - "icon-paint-bucket" - ], - "colorPermutations": { - "16161751": [ - 1, - 1, - 1 - ], - "125525525516161751": [ - 1, - 1, - 1 - ] - }, - "defaultCode": 58886 - }, - { - "paths": [ - "M510 1024l-256-512 256-512h-256l-256 512 256 512z" - ], - "width": 512, - "grid": 0, - "tags": [ - "icon-pointer-left" - ], - "defaultCode": 123 - }, - { - "paths": [ - "M-2 0l256 512-256 512h256l256-512-256-512z" - ], - "width": 512, - "grid": 0, - "tags": [ - "icon-pointer-right" - ], - "defaultCode": 125 - }, - { - "paths": [ - "M768 256c0 105.6-86.4 192-192 192h-128c-105.6 0-192-86.4-192-192v-64c0-105.6 86.4-192 192-192h128c105.6 0 192 86.4 192 192v64z", - "M64 1024v-192c0-140.8 115.2-256 256-256h384c140.8 0 256 115.2 256 256v192z" - ], - "grid": 0, - "tags": [ - "icon-person" - ], - "defaultCode": 80 - }, - { - "paths": [ - "M958.4 65.6c-43.8-43.8-101-65.6-158.4-65.6s-114.6 21.8-158.4 65.6l-128 128c-74 74-85.4 187-34 273l-12.8 12.8c-35.4-20.8-75-31.4-114.8-31.4-57.4 0-114.6 21.8-158.4 65.6l-128 128c-87.4 87.4-87.4 229.4 0 316.8 43.8 43.8 101 65.6 158.4 65.6s114.6-21.8 158.4-65.6l128-128c74-74 85.4-187 34-273l12.8-12.8c35.2 21 75 31.6 114.6 31.6 57.4 0 114.6-21.8 158.4-65.6l128-128c87.6-87.6 87.6-229.6 0.2-317zM419.8 739.8l-128 128c-18 18.2-42.2 28.2-67.8 28.2s-49.8-10-67.8-28.2c-37.4-37.4-37.4-98.4 0-135.8l128-128c18.2-18.2 42.2-28.2 67.8-28.2 5.6 0 11.2 0.6 16.8 1.4l-55.6 55.6c-10.4 10.4-16.2 24.2-16.2 38.8s5.8 28.6 16.2 38.8c10.4 10.4 24.2 16.2 38.8 16.2s28.6-5.8 38.8-16.2l55.6-55.6c5.4 30.4-3.6 62.2-26.6 85zM867.8 291.8l-128 128c-18 18.2-42.2 28.2-67.8 28.2-5.6 0-11.2-0.6-16.8-1.4l55.6-55.6c10.4-10.4 16.2-24.2 16.2-38.8s-5.8-28.6-16.2-38.8c-10.4-10.4-24.2-16.2-38.8-16.2s-28.6 5.8-38.8 16.2l-55.6 55.6c-5.2-29.8 3.6-61.6 26.6-84.6l128-128c18-18.4 42.2-28.4 67.8-28.4s49.8 10 67.8 28.2c37.6 37.4 37.6 98.2 0 135.6z" - ], - "grid": 0, - "tags": [ - "icon-chain-links" - ], - "defaultCode": 232 - }, - { - "paths": [ - "M768 352c0 53.019-114.615 96-256 96s-256-42.981-256-96c0-53.019 114.615-96 256-96s256 42.981 256 96z", - "M768 672v-256c0 53-114.6 96-256 96s-256-43-256-96v256c0 53 114.6 96 256 96s256-43 256-96z", - "M832 0h-128v192h127.6c0.2 0 0.2 0.2 0.4 0.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-127.6v192h128c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192z", - "M192 831.6v-639.4c0-0.2 0.2-0.2 0.4-0.4h127.6v-191.8h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192h-127.6c-0.2 0-0.4-0.2-0.4-0.4z" - ], - "grid": 0, - "tags": [ - "icon-database-in-brackets" - ], - "defaultCode": 115 - }, - { - "paths": [ - "M1012.8 414.2v-391.6l-127.6 127.4c-96.6-96.8-225.2-150-362-150s-265.2 53.2-362 150c-96.8 96.8-150 225.2-150 362s53.2 265.4 150 362c96.8 96.8 225.2 150 362 150s265.4-53.2 362-150l-136.6-136.6c-124.2 124.2-326.4 124.2-450.8 0-124.2-124.2-124.2-326.4 0-450.8 124.2-124.2 326.4-124.2 450.8 0l-127.4 127.4h391.6z" - ], - "grid": 0, - "tags": [ - "icon-refresh" - ], - "defaultCode": 114 - }, - { - "paths": [ - "M832 384h-32v-96c0-158.8-129.2-288-288-288s-288 129.2-288 288v96h-32c-70.4 0-128 57.6-128 128v384c0 70.4 57.6 128 128 128h640c70.4 0 128-57.6 128-128v-384c0-70.4-57.6-128-128-128zM416 288c0-53 43-96 96-96s96 43 96 96v96h-192v-96z" - ], - "grid": 0, - "tags": [ - "icon-lock" - ], - "defaultCode": 108 - }, - { - "paths": [ - "M640 256h-256c-70.4 0-128 57.6-128 128v256c0 70.4 57.6 128 128 128h256c70.4 0 128-57.6 128-128v-256c0-70.4-57.6-128-128-128z", - "M0 0h192v192h-192v-192z", - "M256 0h192v128h-192v-128z", - "M576 0h192v128h-192v-128z", - "M256 896h192v128h-192v-128z", - "M576 896h192v128h-192v-128z", - "M0 576h128v192h-128v-192z", - "M0 256h128v192h-128v-192z", - "M896 576h128v192h-128v-192z", - "M896 256h128v192h-128v-192z", - "M832 0h192v192h-192v-192z", - "M0 832h192v192h-192v-192z", - "M832 832h192v192h-192v-192z" - ], - "grid": 0, - "tags": [ - "icon-box-with-dashed-lines" - ], - "defaultCode": 51 - }, - { - "paths": [ - "M894-2h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h400c-2.2-3.8-4-7.6-5.8-11.4l-255.2-576.8c-21.4-48.4-10.8-105 26.6-142.4 24.4-24.4 57.2-37.4 90.4-37.4 17.4 0 35.2 3.6 51.8 11l576.6 255.4c4 1.8 7.8 3.8 11.4 5.8v-400.2c0.2-70.4-57.4-128-127.8-128z", - "M958.6 637.4l-576.6-255.4 255.4 576.6 64.6-128.6 192 192 128-128-192-192z" - ], - "attrs": [ - { - "fill": "rgb(0, 0, 0)" - }, - { - "fill": "rgb(0, 0, 0)" - } - ], - "grid": 0, - "tags": [ - "icon-box-with-arrow-cursor" - ], - "colorPermutations": { - "16161751": [ - 0, - 0 - ], - "125525525516161751": [ - 0, - 0 - ] - }, - "defaultCode": 58880 - }, - { - "paths": [ - "M512 0c-214.866 0-398.786 132.372-474.744 320h90.744c56.86 0 107.938 24.724 143.094 64h240.906l-192-192h256l320 320-320 320h-256l192-192h-240.906c-35.156 39.276-86.234 64-143.094 64h-90.744c75.958 187.628 259.878 320 474.744 320 282.77 0 512-229.23 512-512s-229.23-512-512-512z" - ], - "grid": 0, - "tags": [ - "icon-activity-mode" - ], - "defaultCode": 65 - }, - { - "paths": [ - "M576 64h-256l320 320h-290.256c-44.264-76.516-126.99-128-221.744-128h-128v512h128c94.754 0 177.48-51.484 221.744-128h290.256l-320 320h256l448-448-448-448z" - ], - "grid": 0, - "tags": [ - "icon-activity" - ], - "defaultCode": 97 - }, - { - "paths": [ - "M832 0h-640c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-640c0-105.6-86.4-192-192-192zM640 832c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-64c0-35.2 28.8-64 64-64h128c35.2 0 64 28.8 64 64v64zM696.062 191.506l-48.124 384.988c-4.366 34.928-36.738 63.506-71.938 63.506h-128c-35.2 0-67.572-28.578-71.938-63.506l-48.124-384.988c-4.366-34.928 20.862-63.506 56.062-63.506h256c35.2 0 60.428 28.578 56.062 63.506z" - ], - "grid": 0, - "tags": [ - "icon-alert-rect" - ], - "defaultCode": 33 - }, - { - "paths": [ - "M998.208 848.864l-422.702-739.728c-34.928-61.124-92.084-61.124-127.012 0l-422.702 739.728c-34.928 61.126-5.906 111.136 64.494 111.136h843.428c70.4 0 99.422-50.010 64.494-111.136zM512 832c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64c0 35.2-28.8 64-64 64zM627.448 382.758l-38.898 194.486c-6.902 34.516-41.35 62.756-76.55 62.756s-69.648-28.24-76.552-62.758l-38.898-194.486c-6.902-34.516 16.25-62.756 51.45-62.756h128c35.2 0 58.352 28.24 51.448 62.758z" - ], - "grid": 0, - "tags": [ - "icon-alert-triangle" - ], - "defaultCode": 58883 - }, - { - "paths": [ - "M510 510l-512-512h1024z", - "M510 1022l-512-512h1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-double-down" - ], - "defaultCode": 238 - }, - { - "paths": [ - "M510 510l512 512h-1024z", - "M510-2l512 512h-1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-double-up" - ], - "defaultCode": 235 - }, - { - "paths": [ - "M512 768l512-512h-1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-down" - ], - "defaultCode": 118 - }, - { - "paths": [ - "M256 512l512 512v-1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-left" - ], - "defaultCode": 60 - }, - { - "paths": [ - "M768 512l-512-512v1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-right" - ], - "defaultCode": 62 - }, - { - "paths": [ - "M512 1024l-512-1024h1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-tall-down" - ], - "defaultCode": 236 - }, - { - "paths": [ - "M512 0l512 1024h-1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-tall-up" - ], - "defaultCode": 237 - }, - { - "paths": [ - "M512 256l-512 512h1024z" - ], - "grid": 0, - "tags": [ - "icon-arrow-up" - ], - "defaultCode": 94 - }, - { - "paths": [ - "M0 512l256 256v-512z", - "M512 0l-256 256h512z", - "M512 1024l256-256h-512z", - "M768 256v512l256-256z" - ], - "grid": 0, - "tags": [ - "icon-arrows-out" - ], - "defaultCode": 73 - }, - { - "paths": [ - "M1024 512l-448 512v-1024z", - "M448 0l-448 512 448 512z" - ], - "grid": 0, - "tags": [ - "icon-arrows-right-left" - ], - "defaultCode": 58893 - }, - { - "paths": [ - "M512 0l512 448h-1024z", - "M0 576l512 448 512-448z" - ], - "grid": 0, - "tags": [ - "icon-arrows-up-down" - ], - "defaultCode": 53 - }, - { - "paths": [ - "M1004.166 340.458l-97.522-168.916-330.534 229.414 33.414-400.956h-195.048l33.414 400.956-330.534-229.414-97.522 168.916 363.944 171.542-363.944 171.542 97.522 168.916 330.534-229.414-33.414 400.956h195.048l-33.414-400.956 330.534 229.414 97.522-168.916-363.944-171.542z" - ], - "grid": 0, - "tags": [ - "icon-asterisk" - ], - "defaultCode": 42 - }, - { - "paths": [ - "M192 0c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h64v-1024h-64z", - "M384 0h256v1024h-256v-1024z", - "M832 0h-64v704h256v-512c0-105.6-86.4-192-192-192z" - ], - "grid": 0, - "tags": [ - "icon-autoflow-tabular" - ], - "defaultCode": 72 - }, - { - "paths": [ - "M0 0h1024v1024h-1024v-1024z" - ], - "attrs": [ - { - "fill": "rgb(0, 0, 0)" - } - ], - "grid": 0, - "tags": [ - "icon-box-round-corners" - ], - "colorPermutations": { - "16161751": [ - 0 - ], - "125525525516161751": [ - 0 - ] - }, - "defaultCode": 224 - }, - { - "paths": [ - "M1024 0l-640 640-384-384v384l384 384 640-640z" - ], - "grid": 0, - "tags": [ - "icon-check" - ], - "defaultCode": 50 - }, - { - "paths": [ - "M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM768 576h-256c-35.2 0-64-28.8-64-64v-384c0-35.2 28.8-64 64-64s64 28.8 64 64v320h192c35.2 0 64 28.8 64 64s-28.8 64-64 64z" - ], - "grid": 0, - "tags": [ - "icon-clock" - ], - "defaultCode": 67 - }, - { - "paths": [ - "M704 576c0 70.4-57.6 128-128 128h-128c-70.4 0-128-57.6-128-128v-128c0-70.4 57.6-128 128-128h128c70.4 0 128 57.6 128 128v128z", - "M1024 512l-192-320v640z", - "M0 512l192-320v640z" - ], - "grid": 0, - "tags": [ - "icon-connectivity" - ], - "defaultCode": 46 - }, - { - "paths": [ - "M683.52 819.286c-50.782 28.456-109.284 44.714-171.52 44.714-194.094 0-352-157.906-352-352s157.906-352 352-352 352 157.906 352 352c0 62.236-16.258 120.738-44.714 171.52l191.692 191.692c8.516-13.89 13.022-28.354 13.022-43.212v-640c0-106.038-229.23-192-512-192s-512 85.962-512 192v640c0 106.038 229.23 192 512 192 126.11 0 241.548-17.108 330.776-45.46l-159.256-159.254z", - "M352 512c0 88.224 71.776 160 160 160s160-71.776 160-160-71.776-160-160-160-160 71.776-160 160z" - ], - "grid": 0, - "tags": [ - "icon-database-query" - ], - "defaultCode": 100 - }, - { - "paths": [ - "M1024 192c0 106.039-229.23 192-512 192s-512-85.961-512-192c0-106.039 229.23-192 512-192s512 85.961 512 192z", - "M512 512c-282.77 0-512-85.962-512-192v512c0 106.038 229.23 192 512 192s512-85.962 512-192v-512c0 106.038-229.23 192-512 192z" - ], - "grid": 0, - "tags": [ - "icon-database" - ], - "defaultCode": 68 - }, - { - "paths": [ - "M832 640c105.6 0 192-86.4 192-192v-256c0-105.6-86.4-192-192-192v320l-128-64-128 64v-320h-384c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-192c0 105.6-86.4 192-192 192h-640v-192h640z" - ], - "grid": 0, - "tags": [ - "icon-dictionary" - ], - "defaultCode": 81 - }, - { - "paths": [ - "M640 256v-128c0-70.4-57.6-128-128-128h-384c-70.4 0-128 57.6-128 128v384c0 70.4 57.6 128 128 128h128v-139.6c0-134.8 109.6-244.4 244.4-244.4h139.6z", - "M896 384h-384c-70.4 0-128 57.6-128 128v384c0 70.4 57.6 128 128 128h384c70.4 0 128-57.6 128-128v-384c0-70.4-57.6-128-128-128z" - ], - "grid": 0, - "tags": [ - "icon-duplicate" - ], - "defaultCode": 242 - }, - { - "paths": [ - "M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z", - "M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128zM704 800h-128v128h-128v-128h-128v-128h128v-128h128v128h128v128z" - ], - "grid": 0, - "tags": [ - "icon-folder-new" - ], - "defaultCode": 102 - }, - { - "paths": [ - "M896 192h-320c-16.4-16.4-96.8-96.8-109.2-109.2l-37.4-37.4c-25-25-74.2-45.4-109.4-45.4h-256c-35.2 0-64 28.8-64 64v384c0-70.4 57.6-128 128-128h768c70.4 0 128 57.6 128 128v-128c0-70.4-57.6-128-128-128z", - "M896 448h-768c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-320c0-70.4-57.6-128-128-128z" - ], - "grid": 0, - "tags": [ - "icon-folder" - ], - "defaultCode": 70 - }, - { - "paths": [ - "M191.656 832c0.118 0.1 0.244 0.224 0.344 0.344v191.656h192v-192c0-105.6-86.4-192-192-192h-192v192h191.656z", - "M192 191.656c-0.1 0.118-0.224 0.244-0.344 0.344h-191.656v192h192c105.6 0 192-86.4 192-192v-192h-192v191.656z", - "M832 384h192v-192h-191.656c-0.118-0.1-0.244-0.226-0.344-0.344v-191.656h-192v192c0 105.6 86.4 192 192 192z", - "M832 832.344c0.1-0.118 0.224-0.244 0.344-0.344h191.656v-192h-192c-105.6 0-192 86.4-192 192v192h192v-191.656z" - ], - "grid": 0, - "tags": [ - "icon-fullscreen-collapse" - ], - "defaultCode": 95 - }, - { - "paths": [ - "M192.344 832c-0.118-0.1-0.244-0.224-0.344-0.344v-191.656h-192v192c0 105.6 86.4 192 192 192h192v-192h-191.656z", - "M192 192.344c0.1-0.118 0.224-0.244 0.344-0.344h191.656v-192h-192c-105.6 0-192 86.4-192 192v192h192v-191.656z", - "M832 0h-192v192h191.656c0.118 0.1 0.244 0.226 0.344 0.344v191.656h192v-192c0-105.6-86.4-192-192-192z", - "M832 831.656c-0.1 0.118-0.224 0.244-0.344 0.344h-191.656v192h192c105.6 0 192-86.4 192-192v-192h-192v191.656z" - ], - "grid": 0, - "tags": [ - "icon-fullscreen-expand" - ], - "defaultCode": 122 - }, - { - "paths": [ - "M1024 576v-128l-140.976-35.244c-8.784-32.922-21.818-64.106-38.504-92.918l74.774-124.622-90.51-90.51-124.622 74.774c-28.812-16.686-59.996-29.72-92.918-38.504l-35.244-140.976h-128l-35.244 140.976c-32.922 8.784-64.106 21.818-92.918 38.504l-124.622-74.774-90.51 90.51 74.774 124.622c-16.686 28.812-29.72 59.996-38.504 92.918l-140.976 35.244v128l140.976 35.244c8.784 32.922 21.818 64.106 38.504 92.918l-74.774 124.622 90.51 90.51 124.622-74.774c28.812 16.686 59.996 29.72 92.918 38.504l35.244 140.976h128l35.244-140.976c32.922-8.784 64.106-21.818 92.918-38.504l124.622 74.774 90.51-90.51-74.774-124.622c16.686-28.812 29.72-59.996 38.504-92.918l140.976-35.244zM704 512c0 106.038-85.962 192-192 192s-192-85.962-192-192 85.962-192 192-192 192 85.962 192 192z" - ], - "grid": 0, - "tags": [ - "icon-gear" - ], - "defaultCode": 71 - }, - { - "paths": [ - "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM896 896h-768v-768h768v768z", - "M320 256l-128 128v448h640v-320l-128-128-128 128z" - ], - "grid": 0, - "tags": [ - "icon-image" - ], - "defaultCode": 227 - }, - { - "paths": [ - "M1024 384l-512-384-512 384 512 384z", - "M512 896l-426.666-320-85.334 64 512 384 512-384-85.334-64z" - ], - "grid": 0, - "tags": [ - "icon-layers" - ], - "defaultCode": 225 - }, - { - "paths": [ - "M448 0h-256c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h256v-1024z", - "M832 0h-256v577.664h448v-385.664c0-105.6-86.4-192-192-192z", - "M576 1024h256c105.6 0 192-86.4 192-192v-129.664h-448v321.664z" - ], - "grid": 0, - "tags": [ - "icon-layout" - ], - "defaultCode": 76 - }, - { - "paths": [ - "M64 576c-35.346 0-64-28.654-64-64s28.654-64 64-64h896c35.346 0 64 28.654 64 64s-28.654 64-64 64h-896z" - ], - "grid": 0, - "tags": [ - "icon-line-horz" - ], - "defaultCode": 226 - }, - { - "paths": [ - "M1024 512l-512-512v307.2l-512 204.8v256h512v256z" - ], - "grid": 0, - "tags": [ - "icon-link" - ], - "defaultCode": 244 - }, - { - "paths": [ - "M640 384h-128v-128h-128v128h-128v128h128v128h128v-128h128z", - "M1024 896l-201.662-201.662c47.922-72.498 73.662-157.434 73.662-246.338 0-119.666-46.6-232.168-131.216-316.784s-197.118-131.216-316.784-131.216c-119.666 0-232.168 46.6-316.784 131.216s-131.216 197.118-131.216 316.784c0 119.666 46.6 232.168 131.216 316.784s197.118 131.216 316.784 131.216c88.904 0 173.84-25.74 246.338-73.662l201.662 201.662 128-128zM448 704c-141.16 0-256-114.842-256-256 0-141.16 114.84-256 256-256 141.158 0 256 114.84 256 256 0 141.158-114.842 256-256 256z" - ], - "grid": 0, - "tags": [ - "icon-magnify-in" - ], - "defaultCode": 88 - }, - { - "paths": [ - "M256 384h384v128h-384v-128z", - "M1024 896l-201.662-201.662c47.922-72.498 73.662-157.434 73.662-246.338 0-119.666-46.6-232.168-131.216-316.784s-197.118-131.216-316.784-131.216c-119.666 0-232.168 46.6-316.784 131.216s-131.216 197.118-131.216 316.784c0 119.666 46.6 232.168 131.216 316.784s197.118 131.216 316.784 131.216c88.904 0 173.84-25.74 246.338-73.662l201.662 201.662 128-128zM448 704c-141.16 0-256-114.842-256-256 0-141.16 114.84-256 256-256 141.158 0 256 114.84 256 256 0 141.158-114.842 256-256 256z" - ], - "grid": 0, - "tags": [ - "icon-magnify-out" - ], - "defaultCode": 89 - }, - { - "paths": [ - "M1024 896l-201.662-201.662c47.922-72.498 73.662-157.434 73.662-246.338 0-119.666-46.6-232.168-131.216-316.784s-197.118-131.216-316.784-131.216-232.168 46.6-316.784 131.216-131.216 197.118-131.216 316.784 46.6 232.168 131.216 316.784 197.118 131.216 316.784 131.216c88.904 0 173.84-25.74 246.338-73.662l201.662 201.662 128-128zM448 704c-141.16 0-256-114.842-256-256 0-141.16 114.84-256 256-256 141.158 0 256 114.84 256 256 0 141.158-114.842 256-256 256z" - ], - "grid": 0, - "tags": [ - "icon-magnify" - ], - "defaultCode": 77 - }, - { - "paths": [ - "M0 0h1024v256h-1024v-256z", - "M0 384h1024v256h-1024v-256z", - "M0 768h1024v256h-1024v-256z" - ], - "grid": 0, - "tags": [ - "icon-menu" - ], - "defaultCode": 109 - }, - { - "paths": [ - "M293.4 512l218.6-218.6 256 256v-421.4c0-70.4-57.6-128-128-128h-512c-70.4 0-128 57.6-128 128v512c0 70.4 57.6 128 128 128h421.4l-256-256z", - "M1024 448h-128v320l-384-384-128 128 384 384h-320v128h576z" - ], - "grid": 0, - "tags": [ - "icon-move" - ], - "defaultCode": 243 - }, - { - "paths": [ - "M448 0v128h320l-384 384 128 128 384-384v320h128v-576z", - "M576 674.274v157.382c-0.1 0.118-0.226 0.244-0.344 0.344h-383.312c-0.118-0.1-0.244-0.226-0.344-0.344v-383.312c0.1-0.118 0.226-0.244 0.344-0.344h157.382l192-192h-349.726c-105.6 0-192 86.4-192 192v384c0 105.6 86.4 192 192 192h384c105.6 0 192-86.4 192-192v-349.726l-192 192z" - ], - "grid": 0, - "tags": [ - "icon-new-window" - ], - "defaultCode": 121 - }, - { - "paths": [ - "M512 1024l512-320v-384l-512.020-320-511.98 320v384l512 320zM512 192l358.4 224-358.4 224-358.4-224 358.4-224z" - ], - "grid": 0, - "tags": [ - "icon-object" - ], - "defaultCode": 111 - }, - { - "paths": [ - "M510-2l-512 320v384l512 320 512-320v-384l-512-320zM585.4 859.2c-21.2 20.8-46 30.8-76 30.8-31.2 0-56.2-9.8-76.2-29.6-20-20-29.6-44.8-29.6-76.2 0-30.4 10.2-55.2 31-76.2s45.2-31.2 74.8-31.2c29.6 0 54.2 10.4 75.6 32s31.8 46.4 31.8 76c-0.2 29-10.8 54-31.4 74.4zM638.2 546.6c-23.6 11.8-37.4 22-43.4 32.4-3.6 6.2-6 14.8-7.4 26.8v41h-161.4v-44.2c0-40.2 4.4-69.8 13-88 8-17.2 22.6-30.2 44.8-40l34.8-15.4c32-14.2 48.2-35.2 48.2-62.8 0-16-6-30.4-17.2-41.8-11.2-11.2-25.6-17.2-41.6-17.2-24 0-54.4 10-62.8 57.4l-2.2 12.2h-147l1.4-16.2c4-44.6 17-82.4 38.8-112.2 19.6-27 45.6-48.6 77-64.6s64.6-24 98.2-24c60.6 0 110.2 19.4 151.4 59.6 41.2 40 61.2 88 61.2 147.2 0 70.8-28.8 121.4-85.8 149.8z" - ], - "grid": 0, - "tags": [ - "icon-object-unknown" - ], - "defaultCode": 63 - }, - { - "paths": [ - "M511.98 0l-511.98 320v512c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-512l-512.020-320zM512 192l358.4 224-358.4 224-358.4-224 358.4-224z" - ], - "grid": 0, - "tags": [ - "icon-packet" - ], - "defaultCode": 86 - }, - { - "paths": [ - "M702 508c-105.6 0-192-86.4-192-192v-320h-320c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-320h-320z", - "M766 380h256l-384-384v256c0 70.4 57.6 128 128 128z" - ], - "grid": 0, - "tags": [ - "icon-page" - ], - "defaultCode": 234 - }, - { - "paths": [ - "M126-2h256v1024h-256v-1024z", - "M638-2h256v1024h-256v-1024z" - ], - "grid": 0, - "tags": [ - "icon-pause" - ], - "defaultCode": 241 - }, - { - "paths": [ - "M922.344 101.68c-38.612-38.596-81.306-69.232-120.304-86.324-68.848-30.25-104.77-9.078-120.194 6.344l-516.228 516.216-3.136 9.152-162.482 476.932 485.998-165.612 6.73-6.806 509.502-509.506c9.882-9.866 21.768-27.77 21.768-56.578 0.002-50.71-38.996-121.148-101.654-183.818zM237.982 855.66l-69.73-69.728 69.25-203.228 18.498-6.704h64v128h128v64l-6.846 18.506-203.172 69.154z" - ], - "grid": 0, - "tags": [ - "icon-pencil" - ], - "defaultCode": 112 - }, - { - "paths": [ - "M704 320h64c70.4 0 128-57.6 128-128v-64c0-70.4-57.6-128-128-128h-64c-70.4 0-128 57.6-128 128v64c0 70.4 57.6 128 128 128z", - "M256 320h64c70.4 0 128-57.6 128-128v-64c0-70.4-57.6-128-128-128h-64c-70.4 0-128 57.6-128 128v64c0 70.4 57.6 128 128 128z", - "M832 384h-192c-34.908 0-67.716 9.448-96 25.904 57.278 33.324 96 95.404 96 166.096v448h384v-448c0-105.6-86.4-192-192-192z", - "M384 384h-192c-105.6 0-192 86.4-192 192v448h576v-448c0-105.6-86.4-192-192-192z" - ], - "grid": 0, - "tags": [ - "icon-people" - ], - "defaultCode": 79 - }, - { - "paths": [ - "M1024 512l-1024 512v-1024z" - ], - "grid": 0, - "tags": [ - "icon-play" - ], - "defaultCode": 239 - }, - { - "paths": [ - "M255.884 704c0.040-0.034 0.082-0.074 0.116-0.116v-127.884c0-70.58 57.42-128 128-128h255.884c0.040-0.034 0.082-0.074 0.116-0.116v-127.884c0-70.58 57.42-128 128-128h143.658c-93.832-117.038-237.98-192-399.658-192-282.77 0-512 229.23-512 512 0 67.904 13.25 132.704 37.256 192h218.628z", - "M768.116 320c-0.040 0.034-0.082 0.074-0.116 0.116v127.884c0 70.58-57.42 128-128 128h-255.884c-0.040 0.034-0.082 0.074-0.116 0.116v127.884c0 70.58-57.42 128-128 128h-143.658c93.832 117.038 237.98 192 399.658 192 282.77 0 512-229.23 512-512 0-67.904-13.25-132.704-37.256-192h-218.628z" - ], - "grid": 0, - "tags": [ - "icon-plot-resource" - ], - "defaultCode": 233 - }, - { - "paths": [ - "M960 384h-330v-320c0-35.2-28.8-64-64-64h-108c-35.2 0-64 28.8-64 64v320h-330c-35.2 0-64 28.8-64 64v128c0 35.2 28.8 64 64 64h330v320c0 35.2 28.8 64 64 64h108c35.2 0 64-28.8 64-64v-320h330c35.2 0 64-28.8 64-64v-128c0-35.2-28.8-64-64-64z" - ], - "grid": 0, - "tags": [ - "icon-plus" - ], - "defaultCode": 43 - }, - { - "paths": [ - "M960 640c35.2 0 64-28.8 64-64v-128c0-35.2-28.8-64-64-64h-896c-35.2 0-64 28.8-64 64v128c0 35.2 28.8 64 64 64h896z" - ], - "grid": 0, - "tags": [ - "icon-minus" - ], - "defaultCode": 45 - }, - { - "paths": [ - "M1022.294 512c-1.746-7.196-3.476-14.452-5.186-21.786-20.036-85.992-53.302-208.976-98-306.538-22.42-48.938-45.298-86.556-69.946-115.006-48.454-55.93-98.176-67.67-131.356-67.67s-82.902 11.74-131.356 67.672c-24.648 28.45-47.528 66.068-69.948 115.006-44.696 97.558-77.962 220.544-98 306.538-21.646 92.898-46.444 175.138-71.71 237.836-16.308 40.46-30.222 66.358-40.6 82.604-10.378-16.246-24.292-42.142-40.6-82.604-23.272-57.75-46.144-132.088-66.524-216.052h-197.362c1.746 7.196 3.476 14.452 5.186 21.786 20.036 85.992 53.302 208.976 98 306.538 22.42 48.938 45.298 86.556 69.946 115.006 48.454 55.932 98.176 67.672 131.356 67.672s82.902-11.74 131.356-67.672c24.648-28.45 47.528-66.068 69.948-115.006 44.696-97.558 77.962-220.544 98-306.538 21.646-92.898 46.444-175.138 71.71-237.836 16.308-40.46 30.222-66.358 40.6-82.604 10.378 16.246 24.292 42.142 40.6 82.604 23.274 57.748 46.146 132.086 66.526 216.050h197.36z" - ], - "grid": 0, - "tags": [ - "icon-sine" - ], - "defaultCode": 54 - }, - { - "paths": [ - "M0 0v256h128v-64h256v704h-192v128h640v-128h-192v-704h256v64h128v-256z" - ], - "grid": 0, - "tags": [ - "icon-T" - ], - "defaultCode": 228 - }, - { - "paths": [ - "M169.2 448c14-56.4 33-122 56.6-176.8 15.4-35.8 31.2-63.2 48.2-84 18.4-22.4 49-49.2 91-49.2s72.6 26.8 91 49.2c17 20.6 32.6 48.2 48.2 84 23.6 54.8 42.8 120.4 56.6 176.8h461.2v-256c0-105.6-86.4-192-192-192h-640c-105.6 0-192 86.4-192 192v256h171.2z", - "M718.6 576h-127.2c25 93.4 48.4 144.4 63.6 168.6 15.2-24.2 38.6-75.2 63.6-168.6z", - "M301.4 448h127.2c-25-93.4-48.4-144.4-63.6-168.6-15.2 24.2-38.6 75.2-63.6 168.6z", - "M850.8 576c-14 56.4-33 122-56.6 176.8-15.4 35.8-31.2 63.2-48.2 84-18.4 22.4-49 49.2-91 49.2s-72.6-26.8-91-49.2c-17-20.6-32.6-48.2-48.2-84-23.6-54.8-42.8-120.4-56.6-176.8h-461.2v256c0 105.6 86.4 192 192 192h640c105.6 0 192-86.4 192-192v-256h-171.2z" - ], - "grid": 0, - "tags": [ - "icon-telemetry-panel" - ], - "defaultCode": 116 - }, - { - "paths": [ - "M718.6 576h-127.2c25 93.4 48.4 144.4 63.6 168.6 15.2-24.2 38.6-75.2 63.6-168.6z", - "M794.2 752.8c-15.4 35.8-31.2 63.2-48.2 84-18.4 22.4-49 49.2-91 49.2s-72.6-26.8-91-49.2c-17-20.6-32.6-48.2-48.2-84-23.6-54.8-42.8-120.4-56.6-176.8h-457.2c31.4 252.6 247 448 508 448s476.6-195.4 508-448h-167.2c-14 56.4-33 122-56.6 176.8z", - "M301.4 448h127.2c-25-93.4-48.4-144.4-63.6-168.6-15.2 24.2-38.6 75.2-63.6 168.6z", - "M274 187.2c18.4-22.4 49-49.2 91-49.2s72.6 26.8 91 49.2c17 20.6 32.6 48.2 48.2 84 23.6 54.8 42.8 120.4 56.6 176.8h457.2c-31.4-252.6-246.8-448-508-448s-476.6 195.4-508 448h167.2c14-56.4 33-122 56.6-176.8 15.6-35.8 31.4-63.2 48.2-84z" - ], - "grid": 0, - "tags": [ - "icon-telemetry" - ], - "defaultCode": 84 - }, - { - "paths": [ - "M448 382c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z", - "M1024 382c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z", - "M448 958c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z", - "M1024 958c0 35.2-28.8 64-64 64h-320c-35.2 0-64-28.8-64-64v-320c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v320z" - ], - "grid": 0, - "tags": [ - "icon-thumbs-strip" - ], - "defaultCode": 246 - }, - { - "paths": [ - "M256 256h384v128h-384v-128z", - "M384 448h384v128h-384v-128z", - "M320 640h384v128h-384v-128z", - "M832 0h-128v192h127.6c0.2 0 0.2 0.2 0.4 0.4v639.4c0 0.2-0.2 0.2-0.4 0.4h-127.6v192h128c105.6 0 192-86.4 192-192v-640.2c0-105.6-86.4-192-192-192z", - "M192 831.6v-639.2c0-0.2 0.2-0.2 0.4-0.4h127.6v-192h-128c-105.6 0-192 86.4-192 192v640c0 105.6 86.4 192 192 192h128v-192h-127.6c-0.2 0-0.4-0.2-0.4-0.4z" - ], - "grid": 0, - "tags": [ - "icon-timeline" - ], - "defaultCode": 83 - }, - { - "paths": [ - "M638 62c0-35.4-28.6-64-64-64h-128c-35.4 0-64 28.6-64 64s28.6 64 64 64h128c35.4 0 64-28.6 64-64z", - "M510 126c-247.4 0-448 200.6-448 448s200.6 448 448 448 448-200.6 448-448-200.6-448-448-448zM510 574h-336c0-185.2 150.8-336 336-336v336z" - ], - "grid": 0, - "tags": [ - "icon-timer" - ], - "defaultCode": 245 - }, - { - "paths": [ - "M832 128h-192.36v-64c0-35.2-28.8-64-64-64h-128c-35.2 0-64 28.8-64 64v64h-191.64c-105.6 0-192 72-192 160s0 160 0 160h64v384c0 105.6 86.4 192 192 192h512c105.6 0 192-86.4 192-192v-384h64c0 0 0-72 0-160s-86.4-160-192-160zM320 832h-128v-384h128v384zM576 832h-128v-384h128v384zM832 832h-128v-384h128v384z" - ], - "grid": 0, - "tags": [ - "icon-trash" - ], - "defaultCode": 90 - }, - { - "paths": [ - "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM128 128h320v768h-320v-768zM896 896h-320v-768h320v768z" - ], - "grid": 0, - "tags": [ - "icon-two-parts-both" - ], - "defaultCode": 229 - }, - { - "paths": [ - "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM896 896h-320v-768h320v768z" - ], - "grid": 0, - "tags": [ - "icon-two-parts-one-only" - ], - "defaultCode": 231 - }, - { - "paths": [ - "M384 512l-365.332 365.332c-24.89 24.89-24.89 65.62 0 90.51l37.49 37.49c24.89 24.89 65.62 24.89 90.51 0 0 0 365.332-365.332 365.332-365.332l365.332 365.332c24.89 24.89 65.62 24.89 90.51 0l37.49-37.49c24.89-24.89 24.89-65.62 0-90.51l-365.332-365.332c0 0 365.332-365.332 365.332-365.332 24.89-24.89 24.89-65.62 0-90.51l-37.49-37.49c-24.89-24.89-65.62-24.89-90.51 0 0 0-365.332 365.332-365.332 365.332l-365.332-365.332c-24.89-24.89-65.62-24.89-90.51 0l-37.49 37.49c-24.89 24.89-24.89 65.62 0 90.51 0 0 365.332 365.332 365.332 365.332z" - ], - "grid": 0, - "tags": [ - "icon-x-heavy" - ], - "defaultCode": 120 - }, - { - "paths": [ - "M384 512l-365.332 365.332c-24.89 24.89-24.89 65.62 0 90.51l37.49 37.49c24.89 24.89 65.62 24.89 90.51 0 0 0 365.332-365.332 365.332-365.332l365.332 365.332c24.89 24.89 65.62 24.89 90.51 0l37.49-37.49c24.89-24.89 24.89-65.62 0-90.51l-365.332-365.332c0 0 365.332-365.332 365.332-365.332 24.89-24.89 24.89-65.62 0-90.51l-37.49-37.49c-24.89-24.89-65.62-24.89-90.51 0 0 0-365.332 365.332-365.332 365.332l-365.332-365.332c-24.89-24.89-65.62-24.89-90.51 0l-37.49 37.49c-24.89 24.89-24.89 65.62 0 90.51 0 0 365.332 365.332 365.332 365.332z" - ], - "grid": 0, - "tags": [ - "icon-x" - ], - "defaultCode": 58946 + "id": 1, + "invisible": false } ], - "colorThemes": [ - [ - [ - 0, - 0, - 0, - 1 - ], - [ - 0, - 161, - 75, - 1 - ], - [ - 6, - 161, - 75, - 1 - ] - ] - ], - "colorThemeIdx": 0, "preferences": { "showGlyphs": true, "showQuickUse": true, @@ -1920,12 +2746,13 @@ "png": true, "useClassSelector": true, "color": 4473924, - "bgColor": 16777215 + "bgColor": 16777215, + "classSelector": ".icon" }, "historySize": 100, "showCodes": true, "gridSize": 16, "showLiga": false }, - "IcoMoonType": "icon-set" + "uid": -1 } \ No newline at end of file diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.eot index 7e81f2863cda8610577c371821bf43c02a101cda..ac6f815eedf4aac84792d5ab8b2c27482891bc21 100755 GIT binary patch delta 359 zcmXwzy-Px26vm(TevlP?Tuf^a@}gsbAE^yNPT^48e;}%hnOD>FqJ%9aEj1XTZ&ORn z(dJydV@6O?V?+NyV-ShjacDR^{GM~pbIy78BdcykfV+koQ@YK1rV-~SCcr#Y>uIx8 z1TYOq7O5khJK8JkT>KJ~zj$M%%-u27;{*aUgQ!Kuh*12*31YvMFISEoN{2W{d9_?2 zY4#pQ*MQ&;^&j(Qr3f2`Ku8dK56paO{@wkxMaCyB+!hO^GGuCDsm3k#!hC#L;;NTC z#ye7?H7DOMY)HUBD3Apv;i5GysB1oL#vRr}(TJupJ)*mGIo_)Z+mNb;-3Jo`^s57~ zVPOEnwhe|j6GHH-*=rx8iK?VS`D|^AHq*xzyJUM delta 281 zcmcbU)se-@VamV|F_G1rMSgn4*@+I5>*E<17-fLiCq1#afPsNQfPsN214whE=TxRS z{_*ky@`2*I0U4=@DV+XaPcty+9{|dmWdH@(53nc$`9FYsm5khyiYgA4iwq0~AoDtM z@{<$)KK@k3z+kupD1R(Bv7&&XfC0!i$^r5f@)C1X<*$gnjROkw05z;C$S*EoU + \ No newline at end of file diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.ttf b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.ttf index bc5aff864e211b45317ab18380fb5c224f05f798..9e1521d16b0b4aae8cb9059e3fce054d5838008c 100755 GIT binary patch delta 343 zcmXwzzfZz&5XIlMC8EY34bq83nlfqx6kHsb41=csf!ZKaA_xtQ!9|IS4j9z_0XQ2s z78lKT6c;r*I663)IGPv@)MIeCynNo>y}MWYs(5M~SO7)1Rti?F3SbhDY}R0*w6|5+ zIQd~_fA+%8Tbm<+NC=4Y4AM3mLqdr$XPIMm*{$yfl_%yB=QT@}oYlJ>UIr51+`lVZ z^(q|f0!hIf-LcB~=@;#Djg2>6xU5!cE@W~Fsck*z;kW8`>)>n+#=;Vk@yjL?ZkcPPuClC{R2RGvkagB`vDeZApZxDuac2lQc=aha*=_-0AyZAPJVLY-^ZWI7#Iwf0OgP6 zCRP+M6fgk!Mma#fLSABSs{9qPw{bv$9-xL*1^LA#49q|&1`~^kJI*sIP3~Zv%qkBQ zVw|kVvTIa9QHUQW!ni#K4>}X>*Q2 iJLBZiak`Vw=_C>k? diff --git a/platform/commonUI/general/res/fonts/symbols/wtdsymbols.woff b/platform/commonUI/general/res/fonts/symbols/wtdsymbols.woff index c9c5d14631c52dc91371b19c9646a1036c705881..296048ff3888d165c7fb9bb89c55c1bcef425632 100755 GIT binary patch delta 374 zcmZ3I`6E-T+~3WOfsp|SOnxwMgXuL4Op^BO53s0YW9Afr)kVR;E2VzDx`Z{|~S*Fdtyx zV-N-E6f{&6R2CEwGgdS*GZkcIR5Vo-Rb+Pf+i;-JpQ*vW@E-%?f&UEu8vZjdf-u8> z2LHlBe?|re#sdcqOwQ9^CX?Ae>32N8%~u9)7NF}G7%mrQpM=qq4Ghc~lQ(A=v@=eA UZFq{aN$dhRgp)V#GkV4d09Gkt_W%F@ delta 310 zcmey7xg=Ap+~3WOfsp|SOqMWkgXstcrpbj&ViR@L>*LcCiwhVSn6>~VIG|V{J*P4a zD7J@zK{o(|9shXwWuzviFfbVK0M(d*FsJ|5(-}ZPpqLAguL8pC2UwIda!V?JVi^n! zj2$3c#ldnhCqEge&hP_J%`p)E`}k8?Zej({UM-^?Kmi3XE?_9jOUzAWU@*D?)VK47?yk;1ChstZ#gh F5di!cPW}J@ diff --git a/platform/commonUI/general/res/sass/controls/_buttons.scss b/platform/commonUI/general/res/sass/controls/_buttons.scss index 7b585f8eec..6ff95634d5 100644 --- a/platform/commonUI/general/res/sass/controls/_buttons.scss +++ b/platform/commonUI/general/res/sass/controls/_buttons.scss @@ -109,6 +109,14 @@ $pad: $interiorMargin * $baseRatio; content: "\000039"; } } + + &.t-export { + &:before { + @extend .ui-symbol; + @extend .icon; + content:'\e623'; + } + } } .s-icon-btn { diff --git a/platform/commonUI/general/res/sass/lists/_tabular.scss b/platform/commonUI/general/res/sass/lists/_tabular.scss index e08f7f191e..748766a5fb 100644 --- a/platform/commonUI/general/res/sass/lists/_tabular.scss +++ b/platform/commonUI/general/res/sass/lists/_tabular.scss @@ -162,4 +162,14 @@ table { min-width: 150px; } } +} + +/********************************************************** SPECIFIC TABULAR VIEWS */ +.t-tabular { + &.t-historical { + $btnExportH: 25px; + .l-view-section { + top: $btnExportH + $interiorMargin; + } + } } \ No newline at end of file diff --git a/platform/features/table/res/templates/historical-table.html b/platform/features/table/res/templates/historical-table.html index 9917c41dcc..2fdee102e1 100644 --- a/platform/features/table/res/templates/historical-table.html +++ b/platform/features/table/res/templates/historical-table.html @@ -3,6 +3,7 @@ headers="headers" rows="rows" enableFilter="true" - enableSort="true"> + enableSort="true" + class="t-tabular t-historical">
\ No newline at end of file diff --git a/platform/features/table/res/templates/mct-table.html b/platform/features/table/res/templates/mct-table.html index 5bc5aa4bbd..d057ff5e1c 100644 --- a/platform/features/table/res/templates/mct-table.html +++ b/platform/features/table/res/templates/mct-table.html @@ -1,10 +1,8 @@ -
+ + Export +
From 8b9c51f3033c68664f74ea3ee02c2ca8a533094e Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Tue, 31 May 2016 11:40:31 -0700 Subject: [PATCH 086/167] [Frontend] Styling Export button fixes #973 - Done; - Styling for Export button and tabular view area in layout frame context; - Export button in frame context now hidden until user hovers over tabular view area in frame, includes animated transition; - Normalized line-height on button and menu elements in frame context; - Layout/markup/SASS for historical and RT tabular view modified; - Converted imagery.html layout to use flexbox; --- .../commonUI/general/res/sass/_mixins.scss | 1 - .../general/res/sass/features/_imagery.scss | 19 ++-------- .../general/res/sass/lists/_tabular.scss | 35 ++++++++++++++++- .../general/res/sass/user-environ/_frame.scss | 3 +- .../imagery/res/templates/imagery.html | 38 +++++++------------ .../table/res/templates/historical-table.html | 2 +- .../table/res/templates/rt-table.html | 1 + 7 files changed, 53 insertions(+), 46 deletions(-) diff --git a/platform/commonUI/general/res/sass/_mixins.scss b/platform/commonUI/general/res/sass/_mixins.scss index d7fa694100..1c04dc18d9 100644 --- a/platform/commonUI/general/res/sass/_mixins.scss +++ b/platform/commonUI/general/res/sass/_mixins.scss @@ -348,7 +348,6 @@ display: inline-block; font-family: 'symbolsfont'; margin-left: $interiorMarginSm; - vertical-align: top; } @mixin nice-textarea($bg: $colorBodyBg, $fg: $colorBodyFg) { diff --git a/platform/commonUI/general/res/sass/features/_imagery.scss b/platform/commonUI/general/res/sass/features/_imagery.scss index c1024d2912..cd04568e02 100644 --- a/platform/commonUI/general/res/sass/features/_imagery.scss +++ b/platform/commonUI/general/res/sass/features/_imagery.scss @@ -1,13 +1,10 @@ .l-image-main-wrapper, -.l-image-main, -.l-image-main-controlbar, .l-image-thumbs-wrapper { @include absPosDefault(0, false); } /*************************************** MAIN LAYOUT */ .l-image-main-wrapper { - //@include test(); @if $enableImageryThumbs == true { bottom: $interiorMargin*2 + $imageThumbsWrapperH; } @@ -15,16 +12,14 @@ min-width: 150px; .l-image-main { background-color: $colorPlotBg; - bottom: $imageMainControlBarH + $interiorMargin; + margin-bottom: $interiorMargin; } .l-image-main-controlbar { - top: auto; - height: $imageMainControlBarH; + &.l-flex-row { @include align-items(center); } } } .l-image-thumbs-wrapper { - //@include test(red); top: auto; height: $imageThumbsWrapperH; } @@ -44,24 +39,17 @@ background-repeat: no-repeat; } -.l-image-main { - //cursor: crosshair; -} - .l-image-main-controlbar { - //@include test(); font-size: 0.8em; - line-height: $imageMainControlBarH; + line-height: inherit; .left, .right { direction: rtl; overflow: hidden; } .left { - //@include test(red); text-align: left; } .right { - //@include test(green); z-index: 2; } .l-date, @@ -71,7 +59,6 @@ .l-mag { direction: ltr; display: inline-block; - //white-space: nowrap; &:before { content: "\000049"; } diff --git a/platform/commonUI/general/res/sass/lists/_tabular.scss b/platform/commonUI/general/res/sass/lists/_tabular.scss index 748766a5fb..b80a855d3d 100644 --- a/platform/commonUI/general/res/sass/lists/_tabular.scss +++ b/platform/commonUI/general/res/sass/lists/_tabular.scss @@ -24,6 +24,10 @@ height: 100%; } +.tabular-holder { + @include absPosDefault(); +} + .tabular, table { box-sizing: border-box; @@ -165,11 +169,38 @@ table { } /********************************************************** SPECIFIC TABULAR VIEWS */ -.t-tabular { - &.t-historical { +.tabular-holder { + &.t-exportable { $btnExportH: 25px; .l-view-section { top: $btnExportH + $interiorMargin; } } +} + +.child-frame { + .tabular-holder { + &.t-exportable { + $btnExportH: $btnFrameH; + .s-btn.t-export { + @include trans-prop-nice(opacity, $dur: 50ms); + opacity: 0; + } + .l-view-section { + @include trans-prop-nice(top, $dur: 150ms, $delay: 50ms); + top: 0; + } + &:hover { + .s-btn.t-export { + @include trans-prop-nice(opacity, 150ms, 100ms); + opacity: 1; + } + .l-view-section { + @include trans-prop-nice(top, $dur: 150ms); + top: $btnExportH + $interiorMargin; + } + } + } + } + } \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/user-environ/_frame.scss b/platform/commonUI/general/res/sass/user-environ/_frame.scss index 64c4dbd69b..b06fcc2c8b 100644 --- a/platform/commonUI/general/res/sass/user-environ/_frame.scss +++ b/platform/commonUI/general/res/sass/user-environ/_frame.scss @@ -54,7 +54,8 @@ height: $ohH; line-height: $ohH; padding: 0 $interiorMargin; - > span { + > span, + &:before { font-size: 0.65rem; } } diff --git a/platform/features/imagery/res/templates/imagery.html b/platform/features/imagery/res/templates/imagery.html index 03ba13083b..5242c1b189 100644 --- a/platform/features/imagery/res/templates/imagery.html +++ b/platform/features/imagery/res/templates/imagery.html @@ -1,23 +1,18 @@
-
+ ng-mouseleave="showLocalControls = false;"> -
+ mct-background-image="imagery.getImageUrl()">
-
+
- + {{imagery.getZone()}} {{imagery.getTime()}} {{imagery.getDate()}}
- + ng-class="{ paused: imagery.paused() }"> + title="Not all of image is visible; click to reset.">
diff --git a/platform/features/table/res/templates/historical-table.html b/platform/features/table/res/templates/historical-table.html index 2fdee102e1..b253737156 100644 --- a/platform/features/table/res/templates/historical-table.html +++ b/platform/features/table/res/templates/historical-table.html @@ -4,6 +4,6 @@ rows="rows" enableFilter="true" enableSort="true" - class="t-tabular t-historical"> + class="tabular-holder t-exportable">
\ No newline at end of file diff --git a/platform/features/table/res/templates/rt-table.html b/platform/features/table/res/templates/rt-table.html index d35015c96c..c5ae6de0dc 100644 --- a/platform/features/table/res/templates/rt-table.html +++ b/platform/features/table/res/templates/rt-table.html @@ -4,6 +4,7 @@ rows="rows" enableFilter="true" enableSort="true" + class="tabular-holder t-exportable" auto-scroll="autoScroll">
\ No newline at end of file From 35d7d9b3803c8722c7331b3fcac2463cfebbc36a Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 31 May 2016 16:05:06 -0700 Subject: [PATCH 087/167] [Timeline] Remove width method ...from TimelineController. Will replace with a more straightforward call to the zoom controller that uses the exposed end time instead, to address #981. --- .../src/controllers/TimelineController.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineController.js b/platform/features/timeline/src/controllers/TimelineController.js index 64900b586c..68ca8c4bc7 100644 --- a/platform/features/timeline/src/controllers/TimelineController.js +++ b/platform/features/timeline/src/controllers/TimelineController.js @@ -79,15 +79,6 @@ define( graphPopulator.populate(swimlanePopulator.get()); } - // Get pixel width for right pane, using zoom controller - function width(zoomController) { - var start = swimlanePopulator.start(), - end = swimlanePopulator.end(); - return zoomController.toPixels(zoomController.duration( - Math.max(end - start, MINIMUM_DURATION) - )); - } - // Refresh resource graphs function refresh() { if (graphPopulator) { @@ -121,10 +112,10 @@ define( // Expose active set of swimlanes return { /** - * Get the width, in pixels, of the timeline area - * @returns {number} width, in pixels + * Get the end of the displayed timeline, in milliseconds. + * @returns {number} the end of the displayed timeline */ - width: width, + end: swimlanePopulator.end.bind(swimlanePopulator), /** * Get the swimlanes which should currently be displayed. * @returns {TimelineSwimlane[]} the swimlanes From 787f3815df1e4606f465d358c61c0e3ead8f604c Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 31 May 2016 16:12:49 -0700 Subject: [PATCH 088/167] [Timeline] Expose width from ZoomController ...and ensure that the width exposed is not excessively large; fixes #981 --- .../timeline/res/templates/timeline.html | 6 ++-- .../src/controllers/TimelineZoomController.js | 29 ++++++------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/platform/features/timeline/res/templates/timeline.html b/platform/features/timeline/res/templates/timeline.html index 0bb53d1196..7582a515c8 100644 --- a/platform/features/timeline/res/templates/timeline.html +++ b/platform/features/timeline/res/templates/timeline.html @@ -128,7 +128,7 @@
+ ng-style="{ width: zoomController.width(timelineController.end()) + 'px' }">
+ ng-style="{ width: zoomController.width(timelineController.end()) + 'px' }">
diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 990a83a5b3..5482891004 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -22,6 +22,7 @@ define( [], function () { + var PADDING = 0.25; /** * Controls the pan-zoom state of a timeline view. @@ -32,17 +33,7 @@ define( var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), tickWidth = ZOOM_CONFIGURATION.width || 200, - bounds = { x: 0, width: tickWidth }, - duration = 86400000; // Default duration in view - - // Round a duration to a larger value, to ensure space for editing - function roundDuration(value) { - // Ensure there's always an extra day or so - var tickCount = bounds.width / tickWidth, - sz = zoomLevels[zoomLevels.length - 1] * tickCount; - value *= 1.25; // Add 25% padding to start - return Math.ceil(value / sz) * sz; - } + bounds = { x: 0, width: tickWidth }; // Default duration in view function toMillis(pixels) { return (pixels / tickWidth) * zoomLevels[zoomIndex]; @@ -124,16 +115,14 @@ define( */ toMillis: toMillis, /** - * Get or set the current displayed duration. If used as a - * setter, this will typically be rounded up to ensure extra - * space is available at the right. - * @returns {number} duration, in milliseconds + * Get the pixel width necessary to fit the specified + * timestamp, expressed as an offset in milliseconds from + * the start of the timeline. + * @param {number} timestamp the time to display */ - duration: function (value) { - if (arguments.length > 0) { - duration = roundDuration(value); - } - return duration; + width: function (timestamp) { + var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); + return Math.max(bounds.width, pixels) } }; } From be9f56107ceb5c302913afe9127749d637e12f9b Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 31 May 2016 16:15:57 -0700 Subject: [PATCH 089/167] [Timeline] Remove obsolete test cases --- .../test/controllers/TimelineControllerSpec.js | 17 ----------------- .../controllers/TimelineZoomControllerSpec.js | 6 ------ 2 files changed, 23 deletions(-) diff --git a/platform/features/timeline/test/controllers/TimelineControllerSpec.js b/platform/features/timeline/test/controllers/TimelineControllerSpec.js index aa88866ebc..7912dba149 100644 --- a/platform/features/timeline/test/controllers/TimelineControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineControllerSpec.js @@ -214,23 +214,6 @@ define( }); - it("reports full scrollable width using zoom controller", function () { - var mockZoom = jasmine.createSpyObj('zoom', ['toPixels', 'duration']); - mockZoom.toPixels.andReturn(54321); - mockZoom.duration.andReturn(12345); - - // Initially populate - fireWatch('domainObject', mockDomainObject); - - expect(controller.width(mockZoom)).toEqual(54321); - // Verify interactions; we took zoom's duration for our start/end, - // and converted it to pixels. - // First, check that we used the start/end (from above) - expect(mockZoom.duration).toHaveBeenCalledWith(12321 - 42); - // Next, verify that the result was passed to toPixels - expect(mockZoom.toPixels).toHaveBeenCalledWith(12345); - }); - it("provides drag handles", function () { // TimelineDragPopulator et al are tested for these, // so just verify that handles are indeed exposed. diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index 47e79fefa8..bf87d17916 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -47,12 +47,6 @@ define( expect(controller.zoom()).toEqual(2000); }); - it("allows duration to be changed", function () { - var initial = controller.duration(); - controller.duration(initial * 3.33); - expect(controller.duration() > initial).toBeTruthy(); - }); - it("handles time-to-pixel conversions", function () { var zoomLevel = controller.zoom(); expect(controller.toPixels(zoomLevel)).toEqual(12321); From 4f0e3fdf852960752439d3b78d49ea2450c43a5e Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 31 May 2016 16:21:40 -0700 Subject: [PATCH 090/167] [Timeline] Test zoom controller's width --- .../controllers/TimelineZoomControllerSpec.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index bf87d17916..9e67eecc3f 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -119,6 +119,27 @@ define( expect(Math.round(controller.toMillis(x2))) .toBeGreaterThan(testEnd); }); + + it("provides a width which is not less than scroll area width", function () { + var testPixel = mockScope.scroll.width / 4, + testMillis = controller.toMillis(testPixel); + expect(controller.width(testMillis)) + .toEqual(mockScope.scroll.width); + }); + + it("provides a width with some margin past timestamp", function () { + var testPixel = mockScope.scroll.width * 4, + testMillis = controller.toMillis(testPixel); + expect(controller.width(testMillis)) + .toBeGreaterThan(controller.toPixels(testMillis)); + }); + + it("provides a width which does not greatly exceed timestamp", function () { + var testPixel = mockScope.scroll.width * 4, + testMillis = controller.toMillis(testPixel); + expect(controller.width(testMillis)) + .toBeLessThan(controller.toPixels(testMillis * 2)); + }); }); }); From 5a2d1a746d629a3fc94c3d3b17576ef301754ed8 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 31 May 2016 16:27:59 -0700 Subject: [PATCH 091/167] [Timeline] Add missing semicolon --- .../features/timeline/src/controllers/TimelineZoomController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 5482891004..3075460428 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -122,7 +122,7 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - return Math.max(bounds.width, pixels) + return Math.max(bounds.width, pixels); } }; } From cc7d0477e8df900db9eec30be4f5c38ceb10c822 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 31 May 2016 16:41:30 -0700 Subject: [PATCH 092/167] [Timeline] Check for existence of timespan ...before attempting to calculate a width based on it. Fixes #978. --- platform/features/timeline/res/templates/activity-gantt.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/features/timeline/res/templates/activity-gantt.html b/platform/features/timeline/res/templates/activity-gantt.html index 1615431e91..8515872352 100644 --- a/platform/features/timeline/res/templates/activity-gantt.html +++ b/platform/features/timeline/res/templates/activity-gantt.html @@ -20,7 +20,7 @@ at runtime from the About dialog for additional information. -->
Date: Wed, 1 Jun 2016 19:18:55 -0700 Subject: [PATCH 094/167] [Frontend] Added transitional animation to Edit mode fixes #709 - When going from browse to edit mode, the wrapper around the object being edited will now transition in from its edges, and the edit controls toolbar will animate its height; - There is no transition applied for going from edit to browse; to do this we'd need to mod the JS on exiting to look for the end of an animation event; - Tested in Chrome, Safari and Firefox; - May not be smooth with very complex objects like Layouts with a large number of components; - Added transitional animations to .l-object-wrapper and .l-edit-controls; - New 'animTo' mixin added to _effects.scss; --- .../commonUI/general/res/sass/_constants.scss | 2 + .../commonUI/general/res/sass/_effects.scss | 25 ++++--- .../res/sass/user-environ/_layout.scss | 71 +++++++++++-------- .../themes/espresso/res/sass/_constants.scss | 2 +- 4 files changed, 59 insertions(+), 41 deletions(-) diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index c36a6cb00a..8c216f0151 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -124,6 +124,8 @@ $dirImgs: $dirCommonRes + 'images/'; /************************** TIMINGS */ $controlFadeMs: 100ms; +$browseToEditAnimMs: 400ms; +$editBorderPulseMs: 500ms; /************************** LIMITS */ $glyphLimit: '\e603'; diff --git a/platform/commonUI/general/res/sass/_effects.scss b/platform/commonUI/general/res/sass/_effects.scss index a048eb75d0..1a13b07d06 100644 --- a/platform/commonUI/general/res/sass/_effects.scss +++ b/platform/commonUI/general/res/sass/_effects.scss @@ -39,15 +39,20 @@ @include pulse($animName: pulse-subtle, $dur: 500ms, $opacity0: 0.7); } -@mixin pulseBorder($c: red, $dur: 500ms, $iteration: infinite, $delay: 0s, $opacity0: 0, $opacity100: 1) { - @include keyframes(pulseBorder) { - 0% { border-color: rgba($c, $opacity0); } - 100% { border-color: rgba($c, $opacity100); } +@mixin animTo($animName, $propName, $propValStart, $propValEnd, $dur: 500ms, $delay: 0) { + @include keyframes($animName) { + from { #{propName}: $propValStart; } + to { #{$propName}: $propValEnd; } } - @include animation-name(pulseBorder); - @include animation-duration($dur); - @include animation-direction(alternate); - @include animation-iteration-count($iteration); - @include animation-timing-function(ease); - @include animation-delay($delay); + @include animToParams($animName, $dur: 500ms, $delay: 0) } + +@mixin animToParams($animName, $dur: 500ms, $delay: 0) { + @include animation-name($animName); + @include animation-duration($dur); + @include animation-delay($delay); + @include animation-fill-mode(both); + @include animation-direction(normal); + @include animation-iteration-count(1); + @include animation-timing-function(ease-in-out); +} \ No newline at end of file diff --git a/platform/commonUI/general/res/sass/user-environ/_layout.scss b/platform/commonUI/general/res/sass/user-environ/_layout.scss index 8537c85520..9ab8e0f65f 100644 --- a/platform/commonUI/general/res/sass/user-environ/_layout.scss +++ b/platform/commonUI/general/res/sass/user-environ/_layout.scss @@ -237,30 +237,10 @@ body.desktop .pane .mini-tab-icon.toggle-pane { top: $ueTopBarH + $interiorMarginLg; } -.l-object-wrapper { - @extend .abs; - - .object-holder-main { - @extend .abs; - } - .l-edit-controls { - //@include trans-prop-nice((opacity, height), 0.25s); - border-bottom: 1px solid $colorInteriorBorder; - line-height: $ueEditToolBarH; - height: 0px; - opacity: 0; - .tool-bar { - right: $interiorMargin; - } - } -} - .l-object-wrapper-inner { @include trans-prop-nice-resize(0.25s); } - - .object-browse-bar .s-btn, .top-bar .buttons-main .s-btn, .top-bar .s-menu-btn, @@ -377,19 +357,50 @@ body.desktop { .s-status-editing { .l-object-wrapper { - @include pulseBorder($colorEditAreaFg, $dur: 1s, $opacity0: 0.3); - border-radius: $controlCr; + $t2Dur: $browseToEditAnimMs; + $t1Dur: $t2Dur / 2; + $pulseDur: $editBorderPulseMs; + $bC0: rgba($colorEditAreaFg, 0.5); + $bC100: rgba($colorEditAreaFg, 1); + background-color: $colorEditAreaBg; - border-color: $colorEditAreaFg; - border-width: 2px; - border-style: dotted; - .l-object-wrapper-inner { - @include absPosDefault(3px, hidden); + border-radius: $controlCr; + border: 1px dotted $bC0; + + // Transition 1 + @include keyframes(wrapperIn) { + from { border: 0px dotted transparent; padding: 0; } + to { border: 1px dotted $bC0; padding: 5px; } } + + // Do last + @include keyframes(pulseNew) { + from { border-color: $bC0; } + to { border-color: $bC100; } + } + + @include animation-name(wrapperIn, pulseNew); + @include animation-duration($t1Dur, $pulseDur); + @include animation-delay(0s, $t1Dur + $t2Dur); + @include animation-direction(normal, alternate); + @include animation-fill-mode(both, none); + @include animation-iteration-count(1, infinite); + @include animation-timing-function(ease-in-out, linear); + + .l-edit-controls { - height: $ueEditToolBarH + $interiorMargin; - margin-bottom: $interiorMargin; - opacity: 1; + height: 0; + border-bottom: 1px solid $colorInteriorBorder; + overflow: hidden; + // Transition 2: reveal edit controls + @include keyframes(editIn) { + from { border-bottom: 0px solid transparent; height: 0; margin-bottom: 0; } + to { border-bottom: 1px solid $colorInteriorBorder; height: $ueEditToolBarH + $interiorMargin; margin-bottom: $interiorMargin; } + } + @include animToParams(editIn, $dur: $t2Dur, $delay: $t1Dur); + .tool-bar { + right: $interiorMargin; + } } } } diff --git a/platform/commonUI/themes/espresso/res/sass/_constants.scss b/platform/commonUI/themes/espresso/res/sass/_constants.scss index bb774fb7a8..1ab6d734f3 100644 --- a/platform/commonUI/themes/espresso/res/sass/_constants.scss +++ b/platform/commonUI/themes/espresso/res/sass/_constants.scss @@ -14,7 +14,7 @@ $colorAHov: #fff; $contrastRatioPercent: 7%; $hoverRatioPercent: 10%; $basicCr: 3px; -$controlCr: 3px; +$controlCr: 2px; $smallCr: 2px; // Buttons and Controls From 76edba10149c9f157f360272842d8642a840c0d4 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Wed, 1 Jun 2016 19:19:58 -0700 Subject: [PATCH 095/167] [Frontend] Mods to Edit button fixes #709 - Changed title and style of main Edit button; - Updated EditItem.js protractor ID accordingly; --- platform/commonUI/edit/bundle.js | 2 +- .../general/res/sass/controls/_buttons.scss | 30 ++++++++----------- protractor/common/EditItem.js | 4 +-- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index b8906107a0..3a9deb649e 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -170,7 +170,7 @@ define([ "navigationService", "$log" ], - "description": "Edit this object.", + "description": "Edit", "category": "view-control", "glyph": "p" }, diff --git a/platform/commonUI/general/res/sass/controls/_buttons.scss b/platform/commonUI/general/res/sass/controls/_buttons.scss index 7b585f8eec..d3cb8091f2 100644 --- a/platform/commonUI/general/res/sass/controls/_buttons.scss +++ b/platform/commonUI/general/res/sass/controls/_buttons.scss @@ -36,15 +36,7 @@ $pad: $interiorMargin * $baseRatio; padding: 0 $pad; font-size: 0.7rem; vertical-align: top; - - .icon { - font-size: 0.8rem; - color: $colorKey; - } - - .title-label { - vertical-align: top; - } + @include btnSubtle($colorBtnBg, $colorBtnBgHov, $colorBtnFg, $colorBtnIcon); &.lg { font-size: 1rem; @@ -58,19 +50,13 @@ $pad: $interiorMargin * $baseRatio; padding: 0 ($pad / $baseRatio) / 2; } - &.major { + &.major, + &.key-edit { $bg: $colorBtnMajorBg; $hc: lighten($bg, 10%); @include btnSubtle($bg, $hc, $colorBtnMajorFg, $colorBtnMajorFg); } - &:not(.major) { - // bg, bgHov, fg, ic - @include btnSubtle($colorBtnBg, $colorBtnBgHov, $colorBtnFg, $colorBtnIcon); - } - &.pause-play { - - } &.t-save:before { content:'\e612'; font-family: symbolsfont; @@ -109,6 +95,15 @@ $pad: $interiorMargin * $baseRatio; content: "\000039"; } } + + .icon { + font-size: 0.8rem; + color: $colorKey; + } + + .title-label { + vertical-align: top; + } } .s-icon-btn { @@ -275,4 +270,3 @@ body.desktop .mini-tab-icon { color: $colorPausedBg !important; } } - diff --git a/protractor/common/EditItem.js b/protractor/common/EditItem.js index fffd8108a9..ceffcdb3ea 100644 --- a/protractor/common/EditItem.js +++ b/protractor/common/EditItem.js @@ -34,8 +34,8 @@ var EditItem = (function () { EditItem.prototype.EditButton = function () { return element.all(by.css('[ng-click="parameters.action.perform()"]')).filter(function (arg) { return arg.getAttribute("title").then(function (title){ - //expect(title).toEqual("Edit this object."); - return title == 'Edit this object.'; + //expect(title).toEqual("Edit"); + return title == 'Edit'; }) }); }; From f167022eea525f4589225d37809ab0b502477978 Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Thu, 2 Jun 2016 10:26:38 +0100 Subject: [PATCH 096/167] Changed logic of persisted check slightly --- .../edit/src/capabilities/TransactionalPersistenceCapability.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js b/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js index 073e5c8fad..9bcf19c002 100644 --- a/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js +++ b/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js @@ -67,7 +67,7 @@ define( } function onCancel() { - if (self.domainObject.getModel().persisted) { + if (self.domainObject.getModel().persisted !== undefined) { //Fetch clean model from persistence return self.persistenceCapability.refresh().then(function (result) { self.persistPending = false; From 214a843dbaf01c28f3b1ccd904d8f1cc549dfbe4 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 2 Jun 2016 11:09:22 -0700 Subject: [PATCH 097/167] [Frontend] New message for copy in-progress dialog fixes #339 --- platform/entanglement/src/actions/CopyAction.js | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/entanglement/src/actions/CopyAction.js b/platform/entanglement/src/actions/CopyAction.js index 2ed9725c41..0c5ab99755 100644 --- a/platform/entanglement/src/actions/CopyAction.js +++ b/platform/entanglement/src/actions/CopyAction.js @@ -81,6 +81,7 @@ define( if (phase.toLowerCase() === 'preparing' && !this.dialog) { this.dialog = this.dialogService.showBlockingMessage({ title: "Preparing to copy objects", + hint: "Do not navigate away from this page or close this browser tab while this message is displayed.", unknownProgress: true, severity: "info" }); From 026ece395631016775a9a05a24a9e13fcb7c6704 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 14:46:50 -0700 Subject: [PATCH 098/167] [Timeline] Provide greater initial width This avoids starting with a scrollable width too small for the initial scroll position that the zoom controller selects. Fixes #817 --- .../features/timeline/src/controllers/TimelineZoomController.js | 2 +- .../timeline/test/controllers/TimelineZoomControllerSpec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 3075460428..6e97f0bd0e 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -122,7 +122,7 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - return Math.max(bounds.width, pixels); + return Math.max(bounds.width * 2, pixels); } }; } diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index 9e67eecc3f..bf2bc03180 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -124,7 +124,7 @@ define( var testPixel = mockScope.scroll.width / 4, testMillis = controller.toMillis(testPixel); expect(controller.width(testMillis)) - .toEqual(mockScope.scroll.width); + .not.toBeLessThan(mockScope.scroll.width); }); it("provides a width with some margin past timestamp", function () { From d02f4041b28460d4f4d21973a249c4385c7ec008 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 15:34:32 -0700 Subject: [PATCH 099/167] [Timeline] Update scroll position on timeout Fixes #817 --- platform/features/timeline/bundle.js | 1 + .../src/controllers/TimelineZoomController.js | 12 ++++++++++-- .../test/controllers/TimelineZoomControllerSpec.js | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index ae7a283fc5..782918e545 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -472,6 +472,7 @@ define([ "implementation": TimelineZoomController, "depends": [ "$scope", + "$timeout", "TIMELINE_ZOOM_CONFIGURATION" ] }, diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 6e97f0bd0e..8e1c440ce3 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -28,11 +28,12 @@ define( * Controls the pan-zoom state of a timeline view. * @constructor */ - function TimelineZoomController($scope, ZOOM_CONFIGURATION) { + function TimelineZoomController($scope, $timeout, ZOOM_CONFIGURATION) { // Prefer to start with the middle index var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), tickWidth = ZOOM_CONFIGURATION.width || 200, + width = tickWidth, bounds = { x: 0, width: tickWidth }; // Default duration in view function toMillis(pixels) { @@ -62,6 +63,12 @@ define( zoomIndex += 1; } bounds.x = toPixels(timespan.getStart()); + + // Physical width may be insufficient for scroll; + // if so, try again on a timeout! + if (bounds.x + bounds.width > width) { + $timeout(initializeZoomFromTimespan.bind(null, timespan)); + } } function initializeZoom() { @@ -122,7 +129,8 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - return Math.max(bounds.width * 2, pixels); + width = Math.max(bounds.width, pixels); + return width; } }; } diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index bf2bc03180..e037c689d4 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -28,6 +28,7 @@ define( describe("The timeline zoom state controller", function () { var testConfiguration, mockScope, + mockTimeout, controller; beforeEach(function () { @@ -37,8 +38,10 @@ define( }; mockScope = jasmine.createSpyObj("$scope", ['$watch']); mockScope.commit = jasmine.createSpy('commit'); + mockTimeout = jasmine.createSpy('$timeout'); controller = new TimelineZoomController( mockScope, + mockTimeout, testConfiguration ); }); From a394b952595169e97aa93f52e28952829e24bde2 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 2 Jun 2016 16:04:26 -0700 Subject: [PATCH 100/167] [Frontend] Tweaks to scrollbar visibility Fixes #913 - Scrollbar now always visible in the right side of the tabular area, in order to avoid column bottom edges not aligning; --- platform/features/timeline/res/sass/_timelines.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/res/sass/_timelines.scss b/platform/features/timeline/res/sass/_timelines.scss index 006fccfbd9..68cc5efdf7 100644 --- a/platform/features/timeline/res/sass/_timelines.scss +++ b/platform/features/timeline/res/sass/_timelines.scss @@ -58,7 +58,7 @@ } &.l-tabular-r { // Start, end, duration, activity modes columns - @include scrollH(); + @include scrollH(scroll); left: $timelineTabularTitleW; .l-width { @include absPosDefault(0, visible); @@ -331,4 +331,4 @@ &:hover { background-color: $colorItemTreeHoverBg; } -} \ No newline at end of file +} From 44d6456de195acd2ba4549c0e59234eb5b6cb3b9 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:00:09 -0700 Subject: [PATCH 101/167] [Timeline] Set scroll on timeout Whenever timeline zoom controller sets scroll, check to see if there may be a width violation that causes scroll to be reset, and retry on a timeout if so. Fixes #936. --- .../src/controllers/TimelineZoomController.js | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 8e1c440ce3..7aeccf662a 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -34,6 +34,7 @@ define( zoomIndex = Math.floor(zoomLevels.length / 2), tickWidth = ZOOM_CONFIGURATION.width || 200, width = tickWidth, + desiredScroll = 0, bounds = { x: 0, width: tickWidth }; // Default duration in view function toMillis(pixels) { @@ -55,6 +56,15 @@ define( } } + function setScroll() { + bounds.x = desiredScroll; + // Physical width may be insufficient for scroll; + // if so, try again on a timeout! + if (bounds.x + bounds.width > width) { + $timeout(setScroll, 0); + } + } + function initializeZoomFromTimespan(timespan) { var timelineDuration = timespan.getDuration(); zoomIndex = 0; @@ -62,13 +72,8 @@ define( zoomIndex < zoomLevels.length - 1) { zoomIndex += 1; } - bounds.x = toPixels(timespan.getStart()); - - // Physical width may be insufficient for scroll; - // if so, try again on a timeout! - if (bounds.x + bounds.width > width) { - $timeout(initializeZoomFromTimespan.bind(null, timespan)); - } + desiredScroll = toPixels(timespan.getStart()); + setScroll(); } function initializeZoom() { @@ -100,7 +105,9 @@ define( if (arguments.length > 0 && !isNaN(amount)) { var center = this.toMillis(bounds.x + bounds.width / 2); setZoomLevel(zoomIndex + amount); - bounds.x = this.toPixels(center) - bounds.width / 2; + desiredScroll = + this.toPixels(center) - bounds.width / 2; + setScroll(); } return zoomLevels[zoomIndex]; }, From 808ccd03766f5106dceb982247284e8029c63b2a Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 2 Jun 2016 16:23:42 -0700 Subject: [PATCH 102/167] [Frontend] Tweaks to splitter Fixes #913 - IN PROGRESS: working on making smaller splitter in Timelines --- .../themes/espresso/res/sass/_constants.scss | 3 ++- .../commonUI/themes/snow/res/sass/_constants.scss | 3 ++- platform/features/timeline/res/sass/_timelines.scss | 12 +++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/platform/commonUI/themes/espresso/res/sass/_constants.scss b/platform/commonUI/themes/espresso/res/sass/_constants.scss index bb774fb7a8..87770c3eef 100644 --- a/platform/commonUI/themes/espresso/res/sass/_constants.scss +++ b/platform/commonUI/themes/espresso/res/sass/_constants.scss @@ -183,8 +183,9 @@ $scrollbarThumbColorOverlay: lighten($colorOvrBg, 10%); $scrollbarThumbColorOverlayHov: lighten($scrollbarThumbColorOverlay, 2%); // Splitter -$splitterD: 25px; // splitterD and HandleD should both be odd, or even +$splitterD: 25px; // splitterD and $splitterHandleD should both be odd, or even $splitterHandleD: 1px; +$splitterDSm: 17px; // Smaller splitter, used inside elements like a Timeline view $colorSplitterBg: rgba(#fff, 0.1); //pullForward($colorBodyBg, 5%); $splitterShdw: rgba(black, 0.4) 0 0 3px; $splitterEndCr: none; diff --git a/platform/commonUI/themes/snow/res/sass/_constants.scss b/platform/commonUI/themes/snow/res/sass/_constants.scss index f85b5c328f..00ec69c139 100644 --- a/platform/commonUI/themes/snow/res/sass/_constants.scss +++ b/platform/commonUI/themes/snow/res/sass/_constants.scss @@ -183,8 +183,9 @@ $scrollbarThumbColorOverlay: darken($colorOvrBg, 50%); $scrollbarThumbColorOverlayHov: $scrollbarThumbColorHov; // Splitter -$splitterD: 24px; +$splitterD: 24px; // splitterD and $splitterHandleD should both be odd, or even $splitterHandleD: 2px; +$splitterDSm: 16px; // Smaller splitter, used inside elements like a Timeline view $colorSplitterBg: pullForward($colorBodyBg, 10%); $splitterShdw: none; $splitterEndCr: none; diff --git a/platform/features/timeline/res/sass/_timelines.scss b/platform/features/timeline/res/sass/_timelines.scss index 68cc5efdf7..8a59aef5f4 100644 --- a/platform/features/timeline/res/sass/_timelines.scss +++ b/platform/features/timeline/res/sass/_timelines.scss @@ -23,6 +23,13 @@ .l-timeline-holder { @include absPosDefault(); + &.split-layout { + >.splitter { + // Top of splitter within Timelines should be 0 + top: 0; + } + } + .l-header { @include user-select(none); cursor: default; @@ -304,11 +311,6 @@ } } - .splitter { - // Top of splitter within Timelines should be 0 - top: 0; - } - // Ticks .l-ticks, .l-subticks { From d52bfed1df7dacbdaffa815fa981717d8ff5fb67 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:36:09 -0700 Subject: [PATCH 103/167] [Timeline] Always set scroll on timeout ...to allow time for width to increase. --- .../src/controllers/TimelineZoomController.js | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 7aeccf662a..8f0422a7a7 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -33,8 +33,8 @@ define( var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), tickWidth = ZOOM_CONFIGURATION.width || 200, - width = tickWidth, desiredScroll = 0, + achievedDesiredScroll, bounds = { x: 0, width: tickWidth }; // Default duration in view function toMillis(pixels) { @@ -56,13 +56,13 @@ define( } } - function setScroll() { - bounds.x = desiredScroll; - // Physical width may be insufficient for scroll; - // if so, try again on a timeout! - if (bounds.x + bounds.width > width) { - $timeout(setScroll, 0); - } + function setScroll(x) { + desiredScroll = x; + achievedDesiredScroll = false; + $timeout(function () { + $scope.scroll.x = desiredScroll; + achievedDesiredScroll = true; + }, 0); } function initializeZoomFromTimespan(timespan) { @@ -72,8 +72,7 @@ define( zoomIndex < zoomLevels.length - 1) { zoomIndex += 1; } - desiredScroll = toPixels(timespan.getStart()); - setScroll(); + setScroll(toPixels(timespan.getStart())); } function initializeZoom() { @@ -103,11 +102,11 @@ define( zoom: function (amount) { // Update the zoom level if called with an argument if (arguments.length > 0 && !isNaN(amount)) { + //var x = achievedDesiredScroll ? + // bounds.x : desiredScroll; var center = this.toMillis(bounds.x + bounds.width / 2); setZoomLevel(zoomIndex + amount); - desiredScroll = - this.toPixels(center) - bounds.width / 2; - setScroll(); + setScroll(this.toPixels(center) - bounds.width / 2); } return zoomLevels[zoomIndex]; }, @@ -136,8 +135,7 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - width = Math.max(bounds.width, pixels); - return width; + return Math.max(bounds.width, pixels); } }; } From 86b31bc0403bcf3376997372601615e0945e24bd Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:38:11 -0700 Subject: [PATCH 104/167] [Timeline] Simplify scroll-setting --- .../timeline/src/controllers/TimelineZoomController.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 8f0422a7a7..9ce55b3d67 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -33,8 +33,6 @@ define( var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), tickWidth = ZOOM_CONFIGURATION.width || 200, - desiredScroll = 0, - achievedDesiredScroll, bounds = { x: 0, width: tickWidth }; // Default duration in view function toMillis(pixels) { @@ -57,11 +55,8 @@ define( } function setScroll(x) { - desiredScroll = x; - achievedDesiredScroll = false; $timeout(function () { - $scope.scroll.x = desiredScroll; - achievedDesiredScroll = true; + $scope.scroll.x = x; }, 0); } From 99590d18f7fece48cf82cb7783e85712b0b6f8b2 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:40:07 -0700 Subject: [PATCH 105/167] [Timeline] Simplify bounds-tracking --- .../src/controllers/TimelineZoomController.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 9ce55b3d67..d326cf7bbb 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -32,8 +32,7 @@ define( // Prefer to start with the middle index var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), - tickWidth = ZOOM_CONFIGURATION.width || 200, - bounds = { x: 0, width: tickWidth }; // Default duration in view + tickWidth = ZOOM_CONFIGURATION.width || 200; function toMillis(pixels) { return (pixels / tickWidth) * zoomLevels[zoomIndex]; @@ -63,7 +62,7 @@ define( function initializeZoomFromTimespan(timespan) { var timelineDuration = timespan.getDuration(); zoomIndex = 0; - while (toMillis(bounds.width) < timelineDuration && + while (toMillis($scope.scroll.width) < timelineDuration && zoomIndex < zoomLevels.length - 1) { zoomIndex += 1; } @@ -77,9 +76,6 @@ define( } } - $scope.$watch("scroll", function (scroll) { - bounds = scroll; - }); $scope.$watch("domainObject", initializeZoom); return { @@ -97,8 +93,7 @@ define( zoom: function (amount) { // Update the zoom level if called with an argument if (arguments.length > 0 && !isNaN(amount)) { - //var x = achievedDesiredScroll ? - // bounds.x : desiredScroll; + var bounds = $scope.scroll; var center = this.toMillis(bounds.x + bounds.width / 2); setZoomLevel(zoomIndex + amount); setScroll(this.toPixels(center) - bounds.width / 2); @@ -130,7 +125,7 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - return Math.max(bounds.width, pixels); + return Math.max($scope.scroll.width, pixels); } }; } From 23b64951f35bdbcd05b5e948dda19d362c7849fe Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:42:09 -0700 Subject: [PATCH 106/167] [Timeline] Update zoom controller spec ...to reflect changes/simplifications for #936. --- .../test/controllers/TimelineZoomControllerSpec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index e037c689d4..40ed8c6c61 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -38,6 +38,7 @@ define( }; mockScope = jasmine.createSpyObj("$scope", ['$watch']); mockScope.commit = jasmine.createSpy('commit'); + mockScope.scroll = { x: 0, width: 1000 }; mockTimeout = jasmine.createSpy('$timeout'); controller = new TimelineZoomController( mockScope, @@ -67,11 +68,6 @@ define( expect(controller.zoom()).toEqual(3500); }); - it("observes scroll bounds", function () { - expect(mockScope.$watch) - .toHaveBeenCalledWith("scroll", jasmine.any(Function)); - }); - describe("when watches have fired", function () { var mockDomainObject, mockPromise, @@ -112,6 +108,10 @@ define( mockScope.$watch.calls.forEach(function (call) { call.args[1](mockScope[call.args[0]]); }); + + mockTimeout.calls.forEach(function (call) { + call.args[0](); + }); }); it("zooms to fit the timeline", function () { From fa6e8fd5f9feb90b90b5ca930a586e794eb616d7 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:49:49 -0700 Subject: [PATCH 107/167] Revert "[Timeline] Update scroll position on timeout" --- platform/features/timeline/bundle.js | 1 - .../src/controllers/TimelineZoomController.js | 12 ++---------- .../test/controllers/TimelineZoomControllerSpec.js | 3 --- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index 782918e545..ae7a283fc5 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -472,7 +472,6 @@ define([ "implementation": TimelineZoomController, "depends": [ "$scope", - "$timeout", "TIMELINE_ZOOM_CONFIGURATION" ] }, diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 8e1c440ce3..6e97f0bd0e 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -28,12 +28,11 @@ define( * Controls the pan-zoom state of a timeline view. * @constructor */ - function TimelineZoomController($scope, $timeout, ZOOM_CONFIGURATION) { + function TimelineZoomController($scope, ZOOM_CONFIGURATION) { // Prefer to start with the middle index var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), tickWidth = ZOOM_CONFIGURATION.width || 200, - width = tickWidth, bounds = { x: 0, width: tickWidth }; // Default duration in view function toMillis(pixels) { @@ -63,12 +62,6 @@ define( zoomIndex += 1; } bounds.x = toPixels(timespan.getStart()); - - // Physical width may be insufficient for scroll; - // if so, try again on a timeout! - if (bounds.x + bounds.width > width) { - $timeout(initializeZoomFromTimespan.bind(null, timespan)); - } } function initializeZoom() { @@ -129,8 +122,7 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - width = Math.max(bounds.width, pixels); - return width; + return Math.max(bounds.width * 2, pixels); } }; } diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index e037c689d4..bf2bc03180 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -28,7 +28,6 @@ define( describe("The timeline zoom state controller", function () { var testConfiguration, mockScope, - mockTimeout, controller; beforeEach(function () { @@ -38,10 +37,8 @@ define( }; mockScope = jasmine.createSpyObj("$scope", ['$watch']); mockScope.commit = jasmine.createSpy('commit'); - mockTimeout = jasmine.createSpy('$timeout'); controller = new TimelineZoomController( mockScope, - mockTimeout, testConfiguration ); }); From 9913fb48f5cf3375f4b096ee7e95cc36a83b2a6d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 2 Jun 2016 16:54:59 -0700 Subject: [PATCH 108/167] Revert "[Timeline] Provide greater initial width" --- .../features/timeline/src/controllers/TimelineZoomController.js | 2 +- .../timeline/test/controllers/TimelineZoomControllerSpec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index 6e97f0bd0e..3075460428 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -122,7 +122,7 @@ define( */ width: function (timestamp) { var pixels = Math.ceil(toPixels(timestamp * (1 + PADDING))); - return Math.max(bounds.width * 2, pixels); + return Math.max(bounds.width, pixels); } }; } diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index bf2bc03180..9e67eecc3f 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -124,7 +124,7 @@ define( var testPixel = mockScope.scroll.width / 4, testMillis = controller.toMillis(testPixel); expect(controller.width(testMillis)) - .not.toBeLessThan(mockScope.scroll.width); + .toEqual(mockScope.scroll.width); }); it("provides a width with some margin past timestamp", function () { From 8e0858bb24b33cbe03f55c31bb2cf631d68b1024 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Fri, 3 Jun 2016 10:00:16 -0700 Subject: [PATCH 109/167] [Frontend] Tweaks to splitter dimensions Fixes #913 - Tightened up splitter height and width; - Added hover color for snow theme; --- platform/commonUI/themes/espresso/res/sass/_constants.scss | 4 ++-- platform/commonUI/themes/snow/res/sass/_constants.scss | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/platform/commonUI/themes/espresso/res/sass/_constants.scss b/platform/commonUI/themes/espresso/res/sass/_constants.scss index 87770c3eef..4d98f1208d 100644 --- a/platform/commonUI/themes/espresso/res/sass/_constants.scss +++ b/platform/commonUI/themes/espresso/res/sass/_constants.scss @@ -183,13 +183,13 @@ $scrollbarThumbColorOverlay: lighten($colorOvrBg, 10%); $scrollbarThumbColorOverlayHov: lighten($scrollbarThumbColorOverlay, 2%); // Splitter -$splitterD: 25px; // splitterD and $splitterHandleD should both be odd, or even +$splitterD: 17px; // splitterD and $splitterHandleD should both be odd, or even $splitterHandleD: 1px; $splitterDSm: 17px; // Smaller splitter, used inside elements like a Timeline view $colorSplitterBg: rgba(#fff, 0.1); //pullForward($colorBodyBg, 5%); $splitterShdw: rgba(black, 0.4) 0 0 3px; $splitterEndCr: none; -$colorSplitterHover: pullForward($colorBodyBg, 15%); +$colorSplitterHover: pullForward($colorBodyBg, 40%); $colorSplitterActive: $colorKey; // Mobile diff --git a/platform/commonUI/themes/snow/res/sass/_constants.scss b/platform/commonUI/themes/snow/res/sass/_constants.scss index 00ec69c139..292358078a 100644 --- a/platform/commonUI/themes/snow/res/sass/_constants.scss +++ b/platform/commonUI/themes/snow/res/sass/_constants.scss @@ -183,13 +183,12 @@ $scrollbarThumbColorOverlay: darken($colorOvrBg, 50%); $scrollbarThumbColorOverlayHov: $scrollbarThumbColorHov; // Splitter -$splitterD: 24px; // splitterD and $splitterHandleD should both be odd, or even +$splitterD: 16px; // splitterD and $splitterHandleD should both be odd, or even $splitterHandleD: 2px; -$splitterDSm: 16px; // Smaller splitter, used inside elements like a Timeline view $colorSplitterBg: pullForward($colorBodyBg, 10%); $splitterShdw: none; $splitterEndCr: none; -$colorSplitterHover: none; +$colorSplitterHover: pullForward($colorBodyBg, 30%); $colorSplitterActive: $colorKey; // Mobile From f9c93ca022b8d1b5c8eca08ab337ed9d506009ae Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 6 Jun 2016 09:49:52 -0700 Subject: [PATCH 110/167] [Build] Remove SNAPSHOT status To close sprint Huxley, https://github.com/nasa/openmct/milestones/Huxley --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eb7afd1f70..00b73fda0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openmct", - "version": "0.10.2-SNAPSHOT", + "version": "0.10.2", "description": "The Open MCT core platform", "dependencies": { "express": "^4.13.1", From b0f06a2195fc760adf2ea2f4d92021f550e5c495 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 6 Jun 2016 09:57:09 -0700 Subject: [PATCH 111/167] [Build] Restore SNAPSHOT status ...to open sprint Kress, https://github.com/nasa/openmct/milestones/Kress --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00b73fda0a..13bfe158dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openmct", - "version": "0.10.2", + "version": "0.10.3-SNAPSHOT", "description": "The Open MCT core platform", "dependencies": { "express": "^4.13.1", From a1b2175801dd7582d7e4bbd268e3ee7cc72cac40 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Tue, 7 Jun 2016 10:02:52 -0700 Subject: [PATCH 112/167] [Timeline] Reduce flicker Reposition scroll bar in Timeline with RAF instead of timeout; this ensures that scroll bar is positioned after the current digest (updating the width) but before the results are rendered (avoiding flicker.) Fixes #997 --- platform/features/timeline/bundle.js | 2 +- .../src/controllers/TimelineZoomController.js | 7 ++++--- .../test/controllers/TimelineZoomControllerSpec.js | 13 ++++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index 782918e545..d8f8729808 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -472,7 +472,7 @@ define([ "implementation": TimelineZoomController, "depends": [ "$scope", - "$timeout", + "$window", "TIMELINE_ZOOM_CONFIGURATION" ] }, diff --git a/platform/features/timeline/src/controllers/TimelineZoomController.js b/platform/features/timeline/src/controllers/TimelineZoomController.js index d326cf7bbb..620e871d11 100644 --- a/platform/features/timeline/src/controllers/TimelineZoomController.js +++ b/platform/features/timeline/src/controllers/TimelineZoomController.js @@ -28,7 +28,7 @@ define( * Controls the pan-zoom state of a timeline view. * @constructor */ - function TimelineZoomController($scope, $timeout, ZOOM_CONFIGURATION) { + function TimelineZoomController($scope, $window, ZOOM_CONFIGURATION) { // Prefer to start with the middle index var zoomLevels = ZOOM_CONFIGURATION.levels || [1000], zoomIndex = Math.floor(zoomLevels.length / 2), @@ -54,9 +54,10 @@ define( } function setScroll(x) { - $timeout(function () { + $window.requestAnimationFrame(function () { $scope.scroll.x = x; - }, 0); + $scope.$apply(); + }); } function initializeZoomFromTimespan(timespan) { diff --git a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js index 40ed8c6c61..18ed911671 100644 --- a/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js +++ b/platform/features/timeline/test/controllers/TimelineZoomControllerSpec.js @@ -28,7 +28,7 @@ define( describe("The timeline zoom state controller", function () { var testConfiguration, mockScope, - mockTimeout, + mockWindow, controller; beforeEach(function () { @@ -36,13 +36,16 @@ define( levels: [1000, 2000, 3500], width: 12321 }; - mockScope = jasmine.createSpyObj("$scope", ['$watch']); + mockScope = + jasmine.createSpyObj("$scope", ['$watch', '$apply']); mockScope.commit = jasmine.createSpy('commit'); mockScope.scroll = { x: 0, width: 1000 }; - mockTimeout = jasmine.createSpy('$timeout'); + mockWindow = { + requestAnimationFrame: jasmine.createSpy('raf') + }; controller = new TimelineZoomController( mockScope, - mockTimeout, + mockWindow, testConfiguration ); }); @@ -109,7 +112,7 @@ define( call.args[1](mockScope[call.args[0]]); }); - mockTimeout.calls.forEach(function (call) { + mockWindow.requestAnimationFrame.calls.forEach(function (call) { call.args[0](); }); }); From 29dd51439da9b7aef1d84be146ca787df24c50f7 Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Wed, 8 Jun 2016 13:32:21 +0100 Subject: [PATCH 113/167] [Date Input] Addressed issues with date selector. Fixes #1000 --- .../res/templates/controls/datetime-field.html | 10 ++++++---- .../src/controllers/DateTimeFieldController.js | 12 +++++++++++- .../general/src/directives/MCTClickElsewhere.js | 4 +++- .../general/test/directives/MCTClickElsewhereSpec.js | 2 ++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index 47551fa25b..5f1705bc98 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -29,10 +29,12 @@ !structure.validate(ngModel[field])), 'picker-icon': structure.format === 'utc' || !structure.format }"> - - + + + +
xMax || y < yMin || y > yMax) { - scope.$eval(attrs.mctClickElsewhere); + scope.$apply(function () { + scope.$eval(attrs.mctClickElsewhere); + }); } } diff --git a/platform/commonUI/general/test/directives/MCTClickElsewhereSpec.js b/platform/commonUI/general/test/directives/MCTClickElsewhereSpec.js index 2e782a1a01..53924b0dd7 100644 --- a/platform/commonUI/general/test/directives/MCTClickElsewhereSpec.js +++ b/platform/commonUI/general/test/directives/MCTClickElsewhereSpec.js @@ -104,6 +104,8 @@ define( }); it("triggers an evaluation of its related Angular expression", function () { + expect(mockScope.$apply).toHaveBeenCalled(); + mockScope.$apply.mostRecentCall.args[0](); expect(mockScope.$eval) .toHaveBeenCalledWith(testAttrs.mctClickElsewhere); }); From acd0fae04048a427f8c5b27cf286bacf261796bf Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Thu, 9 Jun 2016 12:33:09 +0100 Subject: [PATCH 114/167] [Tables] Recalculate column dimensions on resize. Fixes #861 --- platform/features/table/res/templates/mct-table.html | 2 +- .../features/table/src/controllers/MCTTableController.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/features/table/res/templates/mct-table.html b/platform/features/table/res/templates/mct-table.html index 7a18388455..0835b6c48d 100644 --- a/platform/features/table/res/templates/mct-table.html +++ b/platform/features/table/res/templates/mct-table.html @@ -1,4 +1,4 @@ -
+
diff --git a/platform/features/table/src/controllers/MCTTableController.js b/platform/features/table/src/controllers/MCTTableController.js index e4cfa45b23..5ccda6afe1 100644 --- a/platform/features/table/src/controllers/MCTTableController.js +++ b/platform/features/table/src/controllers/MCTTableController.js @@ -76,6 +76,12 @@ define( */ $scope.$on('add:row', this.addRow.bind(this)); $scope.$on('remove:row', this.removeRow.bind(this)); + + /* + * Listen for resize events to trigger recalculation of table width + */ + $scope.resize = this.setElementSizes.bind(this); + } /** From 5152e64895c1065cc6d460dcd5326b7da4e8ed19 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 10 Jun 2016 10:06:05 -0700 Subject: [PATCH 115/167] [Duplicate] Allow copy across spaces Fixes #1007 --- .../src/policies/CrossSpacePolicy.js | 5 +-- .../test/policies/CrossSpacePolicySpec.js | 34 +++++++++---------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/platform/entanglement/src/policies/CrossSpacePolicy.js b/platform/entanglement/src/policies/CrossSpacePolicy.js index 29aab5a484..39d05bd532 100644 --- a/platform/entanglement/src/policies/CrossSpacePolicy.js +++ b/platform/entanglement/src/policies/CrossSpacePolicy.js @@ -24,10 +24,7 @@ define( [], function () { - var DISALLOWED_ACTIONS = [ - "move", - "copy" - ]; + var DISALLOWED_ACTIONS = ["move"]; /** * This policy prevents performing move/copy/link actions across diff --git a/platform/entanglement/test/policies/CrossSpacePolicySpec.js b/platform/entanglement/test/policies/CrossSpacePolicySpec.js index ef09a47619..38bb1f9606 100644 --- a/platform/entanglement/test/policies/CrossSpacePolicySpec.js +++ b/platform/entanglement/test/policies/CrossSpacePolicySpec.js @@ -70,27 +70,25 @@ define( policy = new CrossSpacePolicy(); }); - ['move', 'copy'].forEach(function (key) { - describe("for " + key + " actions", function () { - beforeEach(function () { - testActionMetadata.key = key; - }); + describe("for move actions", function () { + beforeEach(function () { + testActionMetadata.key = 'move'; + }); - it("allows same-space changes", function () { - expect(policy.allow(mockAction, sameSpaceContext)) - .toBe(true); - }); + it("allows same-space changes", function () { + expect(policy.allow(mockAction, sameSpaceContext)) + .toBe(true); + }); - it("disallows cross-space changes", function () { - expect(policy.allow(mockAction, crossSpaceContext)) - .toBe(false); - }); + it("disallows cross-space changes", function () { + expect(policy.allow(mockAction, crossSpaceContext)) + .toBe(false); + }); - it("allows actions with no selectedObject", function () { - expect(policy.allow(mockAction, { - domainObject: makeObject('a') - })).toBe(true); - }); + it("allows actions with no selectedObject", function () { + expect(policy.allow(mockAction, { + domainObject: makeObject('a') + })).toBe(true); }); }); From 1144f818cfe3f57b4ce2db0bd8aee1797ba4486a Mon Sep 17 00:00:00 2001 From: mockingjamie Date: Mon, 13 Jun 2016 21:27:28 -0400 Subject: [PATCH 116/167] Proofread readme.md Made minor grammatical corrections. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dc18671dd3..3aa4ea2d40 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ software. A bundle is a group of software components (including source code, declared as AMD modules, as well as resources such as images and HTML templates) -that are intended to be added or removed as a single unit. A plug-in for +that is intended to be added or removed as a single unit. A plug-in for Open MCT will be expressed as a bundle; platform components are also expressed as bundles. @@ -133,6 +133,6 @@ documentation, may presume an understanding of these terms. it, and it is thereafter considered the _navigated_ object (until the user makes another such choice.) * _space_: A name used to identify a persistence store. Interactions with - persistence with generally involve a `space` parameter in some form, to + persistence will generally involve a `space` parameter in some form, to distinguish multiple persistence stores from one another (for cases where there are multiple valid persistence locations available.) From 2d5824c4ab8c9ddf933ad0082afeaeec4ef591d6 Mon Sep 17 00:00:00 2001 From: Pete Richards Date: Tue, 14 Jun 2016 10:56:54 -0700 Subject: [PATCH 117/167] [Persistence] Use identifier service to get key Retrieve key from identifier service for all persist operations. Fixes https://github.com/nasa/openmct/issues/1013 --- .../src/capabilities/PersistenceCapability.js | 20 ++++++++++++------- .../capabilities/PersistenceCapabilitySpec.js | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/platform/core/src/capabilities/PersistenceCapability.js b/platform/core/src/capabilities/PersistenceCapability.js index 8e1990892d..aacf48f2e1 100644 --- a/platform/core/src/capabilities/PersistenceCapability.js +++ b/platform/core/src/capabilities/PersistenceCapability.js @@ -60,11 +60,6 @@ define( this.$q = $q; } - function getKey(id) { - var parts = id.split(":"); - return parts.length > 1 ? parts.slice(1).join(":") : id; - } - /** * Checks if the value returned is falsey, and if so returns a * rejected promise @@ -131,7 +126,7 @@ define( // ...and persist return persistenceFn.apply(persistenceService, [ this.getSpace(), - getKey(domainObject.getId()), + this.getKey(), domainObject.getModel() ]).then(function (result) { return rejectIfFalsey(result, self.$q); @@ -159,7 +154,7 @@ define( return this.persistenceService.readObject( this.getSpace(), - this.domainObject.getId() + this.getKey() ).then(updateModel); }; @@ -178,6 +173,17 @@ define( return this.identifierService.parse(id).getSpace(); }; + + /** + * Get the key for this domain object in the given space. + * + * @returns {string} the key of the object in it's space. + */ + PersistenceCapability.prototype.getKey = function () { + var id = this.domainObject.getId(); + return this.identifierService.parse(id).getKey(); + }; + return PersistenceCapability; } ); diff --git a/platform/core/test/capabilities/PersistenceCapabilitySpec.js b/platform/core/test/capabilities/PersistenceCapabilitySpec.js index ca37936735..5c826dc602 100644 --- a/platform/core/test/capabilities/PersistenceCapabilitySpec.js +++ b/platform/core/test/capabilities/PersistenceCapabilitySpec.js @@ -101,6 +101,7 @@ define( }); mockIdentifierService.parse.andReturn(mockIdentifier); mockIdentifier.getSpace.andReturn(SPACE); + mockIdentifier.getKey.andReturn(id); persistence = new PersistenceCapability( mockCacheService, mockPersistenceService, From 79406cf1ed5a68c4e1394b3c60cb3fbb0fba7451 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 14 Jun 2016 16:34:07 -0700 Subject: [PATCH 118/167] [Tables] #972 Refactored to simplify code. Fixes #972 --- .../controllers/HistoricalTableController.js | 105 +++++++++--------- .../controllers/RealtimeTableController.js | 1 + .../controllers/TelemetryTableController.js | 1 + .../HistoricalTableControllerSpec.js | 65 ++++++----- 4 files changed, 87 insertions(+), 85 deletions(-) diff --git a/platform/features/table/src/controllers/HistoricalTableController.js b/platform/features/table/src/controllers/HistoricalTableController.js index ebf9bc5573..5441d5587f 100644 --- a/platform/features/table/src/controllers/HistoricalTableController.js +++ b/platform/features/table/src/controllers/HistoricalTableController.js @@ -44,7 +44,9 @@ define( this.batchSize = BATCH_SIZE; $scope.$on("$destroy", function () { - clearTimeout(self.timeoutHandle); + if (self.timeoutHandle) { + self.$timeout.cancel(self.timeoutHandle); + } }); TableController.call(this, $scope, telemetryHandler, telemetryFormatter); @@ -52,63 +54,64 @@ define( HistoricalTableController.prototype = Object.create(TableController.prototype); + /** + * Set provided row data on scope, and cancel loading spinner + * @private + */ + HistoricalTableController.prototype.doneProcessing = function (rowData) { + this.$scope.rows = rowData; + this.$scope.loading = false; + }; + + /** + * Processes an array of objects, formatting the telemetry available + * for them and setting it on scope when done + * @private + */ + HistoricalTableController.prototype.processTelemetryObjects = function (objects, offset, start, rowData) { + var telemetryObject = objects[offset], + series, + i = start, + pointCount, + end; + + //No more objects to process + if (!telemetryObject) { + return this.doneProcessing(rowData); + } + + series = this.handle.getSeries(telemetryObject); + + pointCount = series.getPointCount(); + end = Math.min(start + this.batchSize, pointCount); + + //Process rows in a batch with size not exceeding a maximum length + for (; i < end; i++) { + rowData.push(this.table.getRowValues(telemetryObject, + this.handle.makeDatum(telemetryObject, series, i))); + } + + //Done processing all rows for this object. + if (end >= pointCount) { + offset++; + end = 0; + } + + // Done processing either a batch or an object, yield process + // before continuing processing + this.timeoutHandle = this.$timeout(this.processTelemetryObjects.bind(this, objects, offset, end, rowData)); + }; + /** * Populates historical data on scope when it becomes available from * the telemetry API */ HistoricalTableController.prototype.addHistoricalData = function () { - var rowData = [], - self = this, - telemetryObjects = this.handle.getTelemetryObjects(); - - function processTelemetryObject(offset) { - var telemetryObject = telemetryObjects[offset], - series = self.handle.getSeries(telemetryObject) || {}, - pointCount = series.getPointCount ? series.getPointCount() : 0; - - function processBatch(start, end) { - var i; - end = Math.min(pointCount, end); - - clearTimeout(self.timeoutHandle); - delete self.timeoutHandle; - - //The row offset (ie. batch start point) does not exceed the rows available - for (i = start; i < end; i++) { - rowData.push(self.table.getRowValues(telemetryObject, - self.handle.makeDatum(telemetryObject, series, i))); - } - if (end < pointCount) { - //Yield if necessary - self.timeoutHandle = setTimeout(function () { - processBatch(end, end + self.batchSize); - }, 0); - } else { - //All rows for this object have been processed, so check if there are more objects to process - offset++; - if (offset < telemetryObjects.length) { - //More telemetry object to process - processTelemetryObject(offset); - } else { - // No more objects to process. Apply rows to scope - // Apply digest. Digest may be in progress (if batch small - // enough to not require yield), so using $timeout instead - // of $scope.$apply to avoid in progress error - self.$timeout(function () { - self.$scope.loading = false; - self.$scope.rows = rowData; - }); - } - } - } - processBatch(0, self.batchSize); - } - - if (telemetryObjects.length > 0) { - this.$scope.loading = true; - processTelemetryObject(0); + if (this.timeoutHandle) { + this.$timeout.cancel(this.timeoutHandle); } + this.timeoutHandle = this.$timeout(this.processTelemetryObjects.bind(this, this.handle.getTelemetryObjects(), 0, 0, [])); }; return HistoricalTableController; diff --git a/platform/features/table/src/controllers/RealtimeTableController.js b/platform/features/table/src/controllers/RealtimeTableController.js index d9a3efd559..545367e5b6 100644 --- a/platform/features/table/src/controllers/RealtimeTableController.js +++ b/platform/features/table/src/controllers/RealtimeTableController.js @@ -91,6 +91,7 @@ define( self.$scope.rows.length - 1); } }); + this.$scope.loading = false; }; return RealtimeTableController; diff --git a/platform/features/table/src/controllers/TelemetryTableController.js b/platform/features/table/src/controllers/TelemetryTableController.js index 34b67c804e..459a61c8b0 100644 --- a/platform/features/table/src/controllers/TelemetryTableController.js +++ b/platform/features/table/src/controllers/TelemetryTableController.js @@ -140,6 +140,7 @@ define( if (this.handle) { this.handle.unsubscribe(); } + this.$scope.loading = true; this.handle = this.$scope.domainObject && this.telemetryHandler.handle( this.$scope.domainObject, diff --git a/platform/features/table/test/controllers/HistoricalTableControllerSpec.js b/platform/features/table/test/controllers/HistoricalTableControllerSpec.js index 8d9f0f34f9..4eb2cd44c3 100644 --- a/platform/features/table/test/controllers/HistoricalTableControllerSpec.js +++ b/platform/features/table/test/controllers/HistoricalTableControllerSpec.js @@ -35,6 +35,7 @@ define( mockTable, mockConfiguration, mockAngularTimeout, + mockTimeoutHandle, watches, controller; @@ -64,7 +65,10 @@ define( watches[expression] = callback; }); - mockAngularTimeout = jasmine.createSpy('$timeout'); + mockTimeoutHandle = jasmine.createSpy("timeoutHandle"); + mockAngularTimeout = jasmine.createSpy("$timeout"); + mockAngularTimeout.andReturn(mockTimeoutHandle); + mockAngularTimeout.cancel = jasmine.createSpy("cancelTimeout"); mockConfiguration = { 'range1': true, @@ -166,8 +170,12 @@ define( controller.addHistoricalData(mockDomainObject, mockSeries); + // Angular timeout is called a minumum of twice, regardless + // of batch size used. expect(mockAngularTimeout).toHaveBeenCalled(); mockAngularTimeout.mostRecentCall.args[0](); + expect(mockAngularTimeout.calls.length).toEqual(2); + mockAngularTimeout.mostRecentCall.args[0](); expect(controller.$scope.rows.length).toBe(5); expect(controller.$scope.rows[0]).toBe(mockRow); @@ -227,8 +235,7 @@ define( }); describe('Yields thread', function () { var mockSeries, - mockRow, - mockWindowTimeout = {}; + mockRow; beforeEach(function () { mockSeries = { @@ -250,36 +257,23 @@ define( mockTable.getRowValues.andReturn(mockRow); mockTelemetryHandle.getTelemetryObjects.andReturn([mockDomainObject]); mockTelemetryHandle.getSeries.andReturn(mockSeries); - - jasmine.getGlobal().setTimeout = jasmine.createSpy("setTimeout"); - jasmine.getGlobal().setTimeout.andReturn(mockWindowTimeout); - jasmine.getGlobal().clearTimeout = jasmine.createSpy("clearTimeout"); - - }); - it('only when necessary', function () { - - controller.batchSize = 1000; - controller.addHistoricalData(mockDomainObject, mockSeries); - - expect(mockAngularTimeout).toHaveBeenCalled(); - mockAngularTimeout.mostRecentCall.args[0](); - - expect(controller.$scope.rows.length).toBe(5); - expect(controller.$scope.rows[0]).toBe(mockRow); - - expect(jasmine.getGlobal().setTimeout).not.toHaveBeenCalled(); - }); it('when row count exceeds batch size', function () { controller.batchSize = 3; controller.addHistoricalData(mockDomainObject, mockSeries); - expect(jasmine.getGlobal().setTimeout).toHaveBeenCalled(); - jasmine.getGlobal().setTimeout.mostRecentCall.args[0](); - + //Timeout is called a minimum of two times expect(mockAngularTimeout).toHaveBeenCalled(); mockAngularTimeout.mostRecentCall.args[0](); + expect(mockAngularTimeout.calls.length).toEqual(2); + mockAngularTimeout.mostRecentCall.args[0](); + + //Because it yields, timeout will have been called a + // third time for the batch. + expect(mockAngularTimeout.calls.length).toEqual(3); + mockAngularTimeout.mostRecentCall.args[0](); + expect(controller.$scope.rows.length).toBe(5); expect(controller.$scope.rows[0]).toBe(mockRow); }); @@ -287,24 +281,27 @@ define( controller.batchSize = 3; controller.addHistoricalData(mockDomainObject, mockSeries); - expect(jasmine.getGlobal().setTimeout).toHaveBeenCalled(); - jasmine.getGlobal().setTimeout.mostRecentCall.args[0](); + expect(mockAngularTimeout).toHaveBeenCalled(); + mockAngularTimeout.mostRecentCall.args[0](); controller.addHistoricalData(mockDomainObject, mockSeries); - expect(jasmine.getGlobal().clearTimeout).toHaveBeenCalledWith(mockWindowTimeout); + expect(mockAngularTimeout.cancel).toHaveBeenCalledWith(mockTimeoutHandle); }); it('cancels timeout on scope destruction', function () { controller.batchSize = 3; controller.addHistoricalData(mockDomainObject, mockSeries); - expect(jasmine.getGlobal().setTimeout).toHaveBeenCalled(); - jasmine.getGlobal().setTimeout.mostRecentCall.args[0](); - + //Destroy is used by parent class as well, so multiple + // calls are made to scope.$on + var destroyCalls = mockScope.$on.calls.filter(function (call) { + return call.args[0] === '$destroy'; + }); //Call destroy function - expect(mockScope.$on).toHaveBeenCalledWith("$destroy", jasmine.any(Function)); - mockScope.$on.mostRecentCall.args[1](); - expect(jasmine.getGlobal().clearTimeout).toHaveBeenCalledWith(mockWindowTimeout); + expect(destroyCalls.length).toEqual(2); + + destroyCalls[0].args[1](); + expect(mockAngularTimeout.cancel).toHaveBeenCalledWith(mockTimeoutHandle); }); }); From c00b053aa76508d9c6aa408cdc33b3b47c03c1b5 Mon Sep 17 00:00:00 2001 From: Pete Richards Date: Wed, 15 Jun 2016 10:31:25 -0700 Subject: [PATCH 119/167] [Tests] verify that identifier service provides key Verify that the results of the identifier service are used for persistence calls instead of the domain object id. https://github.com/nasa/openmct/issues/1013 --- .../core/test/capabilities/PersistenceCapabilitySpec.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/core/test/capabilities/PersistenceCapabilitySpec.js b/platform/core/test/capabilities/PersistenceCapabilitySpec.js index 5c826dc602..be8c181cbd 100644 --- a/platform/core/test/capabilities/PersistenceCapabilitySpec.js +++ b/platform/core/test/capabilities/PersistenceCapabilitySpec.js @@ -35,7 +35,8 @@ define( mockNofificationService, mockCacheService, mockQ, - id = "object id", + key = "persistence key", + id = "object identifier", model, SPACE = "some space", persistence, @@ -101,7 +102,7 @@ define( }); mockIdentifierService.parse.andReturn(mockIdentifier); mockIdentifier.getSpace.andReturn(SPACE); - mockIdentifier.getKey.andReturn(id); + mockIdentifier.getKey.andReturn(key); persistence = new PersistenceCapability( mockCacheService, mockPersistenceService, @@ -125,7 +126,7 @@ define( expect(mockPersistenceService.createObject).toHaveBeenCalledWith( SPACE, - id, + key, model ); }); @@ -139,7 +140,7 @@ define( expect(mockPersistenceService.updateObject).toHaveBeenCalledWith( SPACE, - id, + key, model ); }); From c2517c167068ae1d8ef9253f8133c77067d7a85a Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 15 Jun 2016 17:10:29 -0700 Subject: [PATCH 120/167] [Edit Mode] Canceling edit mode with unsaved changes now shows confirmation dialog to user. Fixes #664 --- platform/commonUI/browse/bundle.js | 6 +- .../commonUI/browse/src/BrowseController.js | 33 +++++------ .../browse/src/navigation/NavigateAction.js | 17 +++++- .../browse/test/BrowseControllerSpec.js | 36 ++++++------ .../test/navigation/NavigateActionSpec.js | 55 +++++++++++++++++-- .../commonUI/edit/src/actions/CancelAction.js | 14 +++-- .../edit/test/actions/CancelActionSpec.js | 9 ++- .../src/controllers/TableOptionsController.js | 6 +- 8 files changed, 121 insertions(+), 55 deletions(-) diff --git a/platform/commonUI/browse/bundle.js b/platform/commonUI/browse/bundle.js index eccf3e96d7..9fb7015456 100644 --- a/platform/commonUI/browse/bundle.js +++ b/platform/commonUI/browse/bundle.js @@ -93,11 +93,9 @@ define([ "$scope", "$route", "$location", - "$window", "objectService", "navigationService", "urlService", - "policyService", "DEFAULT_PATH" ] }, @@ -201,7 +199,9 @@ define([ "implementation": NavigateAction, "depends": [ "navigationService", - "$q" + "$q", + "policyService", + "$window" ] }, { diff --git a/platform/commonUI/browse/src/BrowseController.js b/platform/commonUI/browse/src/BrowseController.js index 53ddc14e79..1c00502a6f 100644 --- a/platform/commonUI/browse/src/BrowseController.js +++ b/platform/commonUI/browse/src/BrowseController.js @@ -44,11 +44,9 @@ define( $scope, $route, $location, - $window, objectService, navigationService, urlService, - policyService, defaultPath ) { var path = [ROOT_ID].concat( @@ -75,25 +73,10 @@ define( } - // Callback for updating the in-scope reference to the object - // that is currently navigated-to. - function setNavigation(domainObject) { - var navigationAllowed = true; - - if (domainObject === $scope.navigatedObject) { - //do nothing; - return; - } - - policyService.allow("navigation", $scope.navigatedObject, domainObject, function (message) { - navigationAllowed = $window.confirm(message + "\r\n\r\n" + - " Are you sure you want to continue?"); - }); - + function setScopeObjects(domainObject, navigationAllowed) { if (navigationAllowed) { $scope.navigatedObject = domainObject; $scope.treeModel.selectedObject = domainObject; - navigationService.setNavigation(domainObject); updateRoute(domainObject); } else { //If navigation was unsuccessful (ie. blocked), reset @@ -103,6 +86,20 @@ define( } } + // Callback for updating the in-scope reference to the object + // that is currently navigated-to. + function setNavigation(domainObject) { + if (domainObject === $scope.navigatedObject) { + //do nothing; + return; + } + if (domainObject) { + domainObject.getCapability("action").perform("navigate").then(setScopeObjects.bind(undefined, domainObject)); + } else { + setScopeObjects(domainObject, true); + } + } + function navigateTo(domainObject) { // Check if an object has been navigated-to already... diff --git a/platform/commonUI/browse/src/navigation/NavigateAction.js b/platform/commonUI/browse/src/navigation/NavigateAction.js index e9cc700f93..d1028f754d 100644 --- a/platform/commonUI/browse/src/navigation/NavigateAction.js +++ b/platform/commonUI/browse/src/navigation/NavigateAction.js @@ -33,10 +33,12 @@ define( * @constructor * @implements {Action} */ - function NavigateAction(navigationService, $q, context) { + function NavigateAction(navigationService, $q, policyService, $window, context) { this.domainObject = context.domainObject; this.$q = $q; this.navigationService = navigationService; + this.policyService = policyService; + this.$window = $window; } /** @@ -45,9 +47,20 @@ define( * navigation has been updated */ NavigateAction.prototype.perform = function () { + var self = this, + navigationAllowed = true; + + function allow() { + self.policyService.allow("navigation", self.navigationService.getNavigation(), self.domainObject, function (message) { + navigationAllowed = self.$window.confirm(message + "\r\n\r\n" + + " Are you sure you want to continue?"); + }); + return navigationAllowed; + } + // Set navigation, and wrap like a promise return this.$q.when( - this.navigationService.setNavigation(this.domainObject) + allow() && this.navigationService.setNavigation(this.domainObject) ); }; diff --git a/platform/commonUI/browse/test/BrowseControllerSpec.js b/platform/commonUI/browse/test/BrowseControllerSpec.js index 2c20467185..29d198231b 100644 --- a/platform/commonUI/browse/test/BrowseControllerSpec.js +++ b/platform/commonUI/browse/test/BrowseControllerSpec.js @@ -37,9 +37,8 @@ define( mockUrlService, mockDomainObject, mockNextObject, - mockWindow, - mockPolicyService, testDefaultRoot, + mockActionCapability, controller; function mockPromise(value) { @@ -55,25 +54,14 @@ define( mockScope, mockRoute, mockLocation, - mockWindow, mockObjectService, mockNavigationService, mockUrlService, - mockPolicyService, testDefaultRoot ); } beforeEach(function () { - mockWindow = jasmine.createSpyObj('$window', [ - "confirm" - ]); - mockWindow.confirm.andReturn(true); - - mockPolicyService = jasmine.createSpyObj('policyService', [ - 'allow' - ]); - testDefaultRoot = "some-root-level-domain-object"; mockScope = jasmine.createSpyObj( @@ -128,6 +116,8 @@ define( mockNextObject.getId.andReturn("next"); mockDomainObject.getId.andReturn(testDefaultRoot); + mockActionCapability = jasmine.createSpyObj('actionCapability', ['perform']); + instantiateController(); }); @@ -211,8 +201,13 @@ define( mockContext.getPath.andReturn( [mockRootObject, mockDomainObject, mockNextObject] ); + + //Return true from navigate action + mockActionCapability.perform.andReturn(mockPromise(true)); + mockNextObject.getCapability.andCallFake(function (c) { - return c === 'context' && mockContext; + return (c === 'context' && mockContext) || + (c === 'action' && mockActionCapability); }); mockScope.$on.andReturn(mockUnlisten); // Provide a navigation change @@ -225,6 +220,7 @@ define( mockLocation.path.andReturn("/browse/"); mockNavigationService.setNavigation.andReturn(true); + mockActionCapability.perform.andReturn(mockPromise(true)); // Exercise the Angular workaround mockNavigationService.addListener.mostRecentCall.args[0](); @@ -243,6 +239,9 @@ define( mockScope.navigatedObject = mockDomainObject; mockNavigationService.setNavigation.andReturn(true); + mockActionCapability.perform.andReturn(mockPromise(true)); + mockNextObject.getCapability.andReturn(mockActionCapability); + //Simulate a change in selected tree object mockScope.treeModel = {selectedObject: mockDomainObject}; mockScope.$watch.mostRecentCall.args[1](mockNextObject); @@ -254,11 +253,10 @@ define( it("after failed navigation event resets the selected tree" + " object", function () { mockScope.navigatedObject = mockDomainObject; - mockWindow.confirm.andReturn(false); - mockPolicyService.allow.andCallFake(function (category, object, context, callback) { - callback("unsaved changes"); - return false; - }); + + //Return false from navigation action + mockActionCapability.perform.andReturn(mockPromise(false)); + mockNextObject.getCapability.andReturn(mockActionCapability); //Simulate a change in selected tree object mockScope.treeModel = {selectedObject: mockDomainObject}; diff --git a/platform/commonUI/browse/test/navigation/NavigateActionSpec.js b/platform/commonUI/browse/test/navigation/NavigateActionSpec.js index d872022049..c43d76373c 100644 --- a/platform/commonUI/browse/test/navigation/NavigateActionSpec.js +++ b/platform/commonUI/browse/test/navigation/NavigateActionSpec.js @@ -31,6 +31,8 @@ define( var mockNavigationService, mockQ, mockDomainObject, + mockPolicyService, + mockWindow, action; function mockPromise(value) { @@ -44,25 +46,70 @@ define( beforeEach(function () { mockNavigationService = jasmine.createSpyObj( "navigationService", - ["setNavigation"] + [ + "setNavigation", + "getNavigation" + ] ); + mockNavigationService.getNavigation.andReturn({}); mockQ = { when: mockPromise }; mockDomainObject = jasmine.createSpyObj( "domainObject", ["getId", "getModel", "getCapability"] ); + mockPolicyService = jasmine.createSpyObj("policyService", + [ + "allow" + ]); + mockWindow = jasmine.createSpyObj("$window", + [ + "confirm" + ]); + action = new NavigateAction( mockNavigationService, mockQ, + mockPolicyService, + mockWindow, { domainObject: mockDomainObject } ); }); - it("invokes the navigate service when performed", function () { + it("invokes the policy service to determine if navigation" + + " allowed", function () { action.perform(); - expect(mockNavigationService.setNavigation) - .toHaveBeenCalledWith(mockDomainObject); + expect(mockPolicyService.allow) + .toHaveBeenCalledWith("navigation", jasmine.any(Object), jasmine.any(Object), jasmine.any(Function)); + }); + + it("prompts user if policy rejection", function () { + action.perform(); + expect(mockPolicyService.allow).toHaveBeenCalled(); + mockPolicyService.allow.mostRecentCall.args[3](); + expect(mockWindow.confirm).toHaveBeenCalled(); + }); + + describe("shows a prompt", function () { + beforeEach(function () { + // Ensure the allow callback is called synchronously + mockPolicyService.allow.andCallFake(function () { + return arguments[3](); + }); + }); + it("does not navigate on prompt rejection", function () { + mockWindow.confirm.andReturn(false); + action.perform(); + expect(mockNavigationService.setNavigation) + .not.toHaveBeenCalled(); + }); + + it("does navigate on prompt acceptance", function () { + mockWindow.confirm.andReturn(true); + action.perform(); + expect(mockNavigationService.setNavigation) + .toHaveBeenCalled(); + }); }); it("is only applicable when a domain object is in context", function () { diff --git a/platform/commonUI/edit/src/actions/CancelAction.js b/platform/commonUI/edit/src/actions/CancelAction.js index 9fc02a6121..598daa3f9e 100644 --- a/platform/commonUI/edit/src/actions/CancelAction.js +++ b/platform/commonUI/edit/src/actions/CancelAction.js @@ -50,18 +50,24 @@ define( //If the object existed already, navigate to refresh view // with previous object state. if (domainObject.getModel().persisted) { - domainObject.getCapability("action").perform("navigate"); + return domainObject.getCapability("action").perform("navigate"); } else { //If the object was new, and user has cancelled, then //navigate back to parent because nothing to show. - domainObject.getCapability("location").getOriginal().then(function (original) { + return domainObject.getCapability("location").getOriginal().then(function (original) { parent = original.getCapability("context").getParent(); parent.getCapability("action").perform("navigate"); }); } } - return this.domainObject.getCapability("editor").cancel() - .then(returnToBrowse); + + function cancel(allowed) { + return allowed && domainObject.getCapability("editor").cancel(); + } + + //Do navigation first in order to trigger unsaved changes dialog + return returnToBrowse() + .then(cancel); }; /** diff --git a/platform/commonUI/edit/test/actions/CancelActionSpec.js b/platform/commonUI/edit/test/actions/CancelActionSpec.js index b83fbdab2b..d2cf6ea9fa 100644 --- a/platform/commonUI/edit/test/actions/CancelActionSpec.js +++ b/platform/commonUI/edit/test/actions/CancelActionSpec.js @@ -125,6 +125,9 @@ define( it("invokes the editor capability's cancel functionality when" + " performed", function () { + mockDomainObject.getModel.andReturn({persisted: 1}); + //Return true from navigate action + capabilities.action.perform.andReturn(mockPromise(true)); action.perform(); // Should have called cancel @@ -134,13 +137,15 @@ define( expect(capabilities.editor.save).not.toHaveBeenCalled(); }); - it("navigates to object if existing", function () { + it("navigates to object if existing using navigate action", function () { mockDomainObject.getModel.andReturn({persisted: 1}); + //Return true from navigate action + capabilities.action.perform.andReturn(mockPromise(true)); action.perform(); expect(capabilities.action.perform).toHaveBeenCalledWith("navigate"); }); - it("navigates to parent if new", function () { + it("navigates to parent if new using navigate action", function () { mockDomainObject.getModel.andReturn({persisted: undefined}); action.perform(); expect(parentCapabilities.action.perform).toHaveBeenCalledWith("navigate"); diff --git a/platform/features/table/src/controllers/TableOptionsController.js b/platform/features/table/src/controllers/TableOptionsController.js index 0ca83b088c..b017261615 100644 --- a/platform/features/table/src/controllers/TableOptionsController.js +++ b/platform/features/table/src/controllers/TableOptionsController.js @@ -72,10 +72,10 @@ define( * Maintain a configuration object on scope that stores column * configuration. On change, synchronize with object model. */ - $scope.$watchCollection('configuration.table.columns', function (columns) { - if (columns) { + $scope.$watchCollection('configuration.table.columns', function (newColumns, oldColumns) { + if (newColumns !== oldColumns) { self.domainObject.useCapability('mutation', function (model) { - model.configuration.table.columns = columns; + model.configuration.table.columns = newColumns; }); self.domainObject.getCapability('persistence').persist(); } From c7e7e0c302278bf076e0aa9dbaf429896feb0353 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 16 Jun 2016 17:09:58 -0700 Subject: [PATCH 121/167] [Frontend] Fixes to un-squish plots Fixes #1022 - min-height added to .gl-plot element; - Moved plot value definitions out of _plots-main and into _constants and normalized naming; --- .../commonUI/general/res/sass/_constants.scss | 33 ++++++++++++------- .../general/res/sass/plots/_plots-main.scss | 31 +++++++++-------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index 8c216f0151..2175f11ab1 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -49,7 +49,7 @@ $uePaneMiniTabCollapsedW: 11px; $ueEditLeftPaneW: 75%; $treeSearchInputBarH: 25px; $ueTimeControlH: (33px, 18px, 20px); -// Panes +/*************** Panes */ $ueBrowseLeftPaneTreeMinW: 150px; $ueBrowseLeftPaneTreeMaxW: 35%; $ueBrowseLeftPaneTreeW: 25%; @@ -57,48 +57,59 @@ $ueBrowseRightPaneInspectMinW: 200px; $ueBrowseRightPaneInspectMaxW: 35%; $ueBrowseRightPaneInspectW: 20%; $ueDesktopMinW: 600px; - -// Overlay +/*************** Overlay */ $ovrTopBarH: 45px; $ovrFooterH: 24px; $overlayMargin: 25px; -// Items +/*************** Items */ $ueBrowseGridItemLg: 200px; $ueBrowseGridItemTopBarH: 20px; $ueBrowseGridItemBottomBarH: 30px; $itemPadLR: 5px; -// Tree +/*************** Tree */ $treeVCW: 10px; $treeTypeIconH: 1.4em; // was 16px $treeTypeIconHPx: 16px; $treeTypeIconW: 18px; $treeContextTriggerW: 20px; -// Tabular +/*************** Tabular */ $tabularHeaderH: 22px; //18px $tabularTdPadLR: $itemPadLR; $tabularTdPadTB: 3px; -// Imagery +/*************** Imagery */ $imageMainControlBarH: 25px; $imageThumbsD: 120px; $imageThumbsWrapperH: $imageThumbsD * 1.4; $imageThumbPad: 1px; -// Ticks +/*************** Ticks */ $ticksH: 25px; $tickLblVMargin: 3px; $tickLblH: 15px; $tickLblW: 50px; $tickH: $ticksH - $tickLblVMargin - $tickLblH; $tickW: 1px; -// Bubbles +/*************** Plots */ +$plotYBarW: 60px; +$plotYLabelMinH: 20px; +$plotYLabelW: 10px; +$plotXBarH: 32px; +$plotLegendH: 20px; +$plotSwatchD: 8px; +// 1: Top, 2: right, 3: bottom, 4: left +$plotDisplayArea: ($plotLegendH + $interiorMargin, 0, $plotXBarH + $interiorMargin, $plotYBarW); +/* Based on current implementation of ~ 5 ticks per plot element; +Include legend, plot-display-area and X ticks */ +$plotMinH: $plotLegendH + ($interiorMargin * 2) + ($plotYLabelMinH * 5) + nth($plotDisplayArea,3); +/*************** Bubbles */ $bubbleArwSize: 10px; $bubblePad: $interiorMargin; $bubbleMinW: 100px; $bubbleMaxW: 300px; -// Forms +/*************** Forms */ $reqSymbolW: 15px; $reqSymbolM: $interiorMargin * 2; $reqSymbolFontSize: 0.7em; -// Wait Spinner Defaults +/*************** Wait Spinner Defaults */ $waitSpinnerD: 32px; $waitSpinnerTreeD: 20px; $waitSpinnerBorderW: 5px; diff --git a/platform/commonUI/general/res/sass/plots/_plots-main.scss b/platform/commonUI/general/res/sass/plots/_plots-main.scss index 22e8312087..2af21f1353 100644 --- a/platform/commonUI/general/res/sass/plots/_plots-main.scss +++ b/platform/commonUI/general/res/sass/plots/_plots-main.scss @@ -19,12 +19,10 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -$yBarW: 60px; -$yLabelW: 10px; -$xBarH: 32px; -$legendH: 20px; -$swatchD: 8px; -$plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBarW); // Top, right, bottom, left +.abs.holder-plot { + // Fend off the scrollbar when less than min-height; + right: $interiorMargin; +} .gl-plot { color: $colorPlotFg; @@ -32,6 +30,7 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa position: relative; width: 100%; height: 100%; + min-height: $plotMinH; .gl-plot-local-controls { @include trans-prop-nice(opacity, 150ms); @@ -54,17 +53,17 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa top: auto; right: 0; bottom: $interiorMargin; - left: $yBarW; - height: $xBarH; + left: $plotYBarW; + height: $plotXBarH; width: auto; overflow: hidden; } &.gl-plot-y { - top: $legendH + $interiorMargin; + top: $plotLegendH + $interiorMargin; right: auto; bottom: nth($plotDisplayArea, 3); left: 0; - width: $yBarW; + width: $plotYBarW; } } @@ -146,7 +145,7 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa @include transform(translateY(-50%)); min-width: 150px; // Need this due to enclosure of .select top: 50%; - left: $yLabelW + $interiorMargin * 2; + left: $plotYLabelW + $interiorMargin * 2; } .t-plot-display-controls { @@ -174,7 +173,7 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa right: 0; bottom: auto; left: 0; - height: $legendH; + height: $plotLegendH; overflow-x: hidden; overflow-y: auto; } @@ -236,8 +235,8 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa .color-swatch { border-radius: 2px; display: inline-block; - height: $swatchD; - width: $swatchD; + height: $plotSwatchD; + width: $plotSwatchD; } } } @@ -249,8 +248,8 @@ $plotDisplayArea: ($legendH + $interiorMargin, 0, $xBarH + $interiorMargin, $yBa padding: 0px $itemPadLR; .plot-color-swatch { border: 1px solid $colorBodyBg; - height: $swatchD + 1; - width: $swatchD + 1; + height: $plotSwatchD + 1; + width: $plotSwatchD + 1; } } } From d40c7f182134f98443537a33a876c379f844507a Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 16 Jun 2016 17:46:15 -0700 Subject: [PATCH 122/167] [Frontend] Restore the Add menu to edit Timelines Fixes #1019 - Removed overflow: hidden from .l-edit-controls; --- platform/commonUI/general/res/sass/user-environ/_layout.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/commonUI/general/res/sass/user-environ/_layout.scss b/platform/commonUI/general/res/sass/user-environ/_layout.scss index 9ab8e0f65f..670945a3ab 100644 --- a/platform/commonUI/general/res/sass/user-environ/_layout.scss +++ b/platform/commonUI/general/res/sass/user-environ/_layout.scss @@ -391,7 +391,6 @@ body.desktop { .l-edit-controls { height: 0; border-bottom: 1px solid $colorInteriorBorder; - overflow: hidden; // Transition 2: reveal edit controls @include keyframes(editIn) { from { border-bottom: 0px solid transparent; height: 0; margin-bottom: 0; } From dea94e4e68610a74eeb43f4582fee87d4e009182 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Thu, 16 Jun 2016 17:55:40 -0700 Subject: [PATCH 123/167] [Frontend] Fix button colors in Snow theme Fixes #1014 - Problem was actually application of a color within the .icon class - fix removes that definition; --- platform/commonUI/general/res/sass/controls/_buttons.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/commonUI/general/res/sass/controls/_buttons.scss b/platform/commonUI/general/res/sass/controls/_buttons.scss index 5afad277b2..55e07918e8 100644 --- a/platform/commonUI/general/res/sass/controls/_buttons.scss +++ b/platform/commonUI/general/res/sass/controls/_buttons.scss @@ -106,7 +106,6 @@ $pad: $interiorMargin * $baseRatio; .icon { font-size: 0.8rem; - color: $colorKey; } .title-label { From 8080490e5cce576d1c88773005bea3b2f4a3bdc7 Mon Sep 17 00:00:00 2001 From: Charles Hacskaylo Date: Mon, 20 Jun 2016 16:06:23 -0700 Subject: [PATCH 124/167] [Frontend] Applied emphasis colors to .key-properties fixes #1014 Added .key-properties to .major to color the Edit button as intended; --- platform/commonUI/general/res/sass/controls/_buttons.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/general/res/sass/controls/_buttons.scss b/platform/commonUI/general/res/sass/controls/_buttons.scss index 55e07918e8..09c4598db7 100644 --- a/platform/commonUI/general/res/sass/controls/_buttons.scss +++ b/platform/commonUI/general/res/sass/controls/_buttons.scss @@ -51,7 +51,8 @@ $pad: $interiorMargin * $baseRatio; } &.major, - &.key-edit { + &.key-edit, + &.key-properties { $bg: $colorBtnMajorBg; $hc: lighten($bg, 10%); @include btnSubtle($bg, $hc, $colorBtnMajorFg, $colorBtnMajorFg); From ee7c450e1144147f3d654c0c89b61ef433a78d37 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 20 Jun 2016 16:18:26 -0700 Subject: [PATCH 125/167] [Tables] Enabled auto-scroll by default fixes #1040 --- .../table/res/templates/rt-table.html | 2 +- .../controllers/RealtimeTableController.js | 23 ------------------- .../RealtimeTableControllerSpec.js | 7 ------ 3 files changed, 1 insertion(+), 31 deletions(-) diff --git a/platform/features/table/res/templates/rt-table.html b/platform/features/table/res/templates/rt-table.html index c5ae6de0dc..c6fb0d2422 100644 --- a/platform/features/table/res/templates/rt-table.html +++ b/platform/features/table/res/templates/rt-table.html @@ -5,6 +5,6 @@ enableFilter="true" enableSort="true" class="tabular-holder t-exportable" - auto-scroll="autoScroll"> + auto-scroll="true"> \ No newline at end of file diff --git a/platform/features/table/src/controllers/RealtimeTableController.js b/platform/features/table/src/controllers/RealtimeTableController.js index 545367e5b6..f3d24b30fc 100644 --- a/platform/features/table/src/controllers/RealtimeTableController.js +++ b/platform/features/table/src/controllers/RealtimeTableController.js @@ -38,30 +38,7 @@ define( function RealtimeTableController($scope, telemetryHandler, telemetryFormatter) { TableController.call(this, $scope, telemetryHandler, telemetryFormatter); - $scope.autoScroll = false; this.maxRows = 100000; - - /* - * Determine if auto-scroll should be enabled. Is enabled - * automatically when telemetry type is string - */ - 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'; - }); - } - $scope.$watch('domainObject', function (domainObject) { - //When a domain object becomes available, check whether the - // view should auto-scroll to the bottom. - if (domainObject && hasStringTelemetry(domainObject)) { - $scope.autoScroll = true; - } - }); } RealtimeTableController.prototype = Object.create(TableController.prototype); diff --git a/platform/features/table/test/controllers/RealtimeTableControllerSpec.js b/platform/features/table/test/controllers/RealtimeTableControllerSpec.js index ada85baa3c..b3d7819c26 100644 --- a/platform/features/table/test/controllers/RealtimeTableControllerSpec.js +++ b/platform/features/table/test/controllers/RealtimeTableControllerSpec.js @@ -155,13 +155,6 @@ define( expect(mockScope.rows[0].row).toBe(1); }); }); - - it('enables autoscroll for event telemetry', function () { - controller.subscribe(); - mockScope.$watch.mostRecentCall.args[1](mockDomainObject); - expect(mockScope.autoScroll).toBe(true); - }); - }); } ); From c0311be1921c39578757977020077410317fa8b4 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 20 Jun 2016 15:49:04 -0700 Subject: [PATCH 126/167] [Browse] Inspector shown when object switched to edit mode. Fixes #1031 --- platform/commonUI/browse/bundle.js | 13 +++ .../commonUI/browse/res/templates/browse.html | 2 +- .../browse/src/InspectorPaneController.js | 79 +++++++++++++++ .../test/InspectorPaneControllerSpec.js | 96 +++++++++++++++++++ 4 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 platform/commonUI/browse/src/InspectorPaneController.js create mode 100644 platform/commonUI/browse/test/InspectorPaneControllerSpec.js diff --git a/platform/commonUI/browse/bundle.js b/platform/commonUI/browse/bundle.js index 9fb7015456..8f62473b54 100644 --- a/platform/commonUI/browse/bundle.js +++ b/platform/commonUI/browse/bundle.js @@ -23,6 +23,7 @@ define([ "./src/BrowseController", "./src/PaneController", + "./src/InspectorPaneController", "./src/BrowseObjectController", "./src/MenuArrowController", "./src/navigation/NavigationService", @@ -44,6 +45,7 @@ define([ ], function ( BrowseController, PaneController, + InspectorPaneController, BrowseObjectController, MenuArrowController, NavigationService, @@ -124,6 +126,17 @@ define([ "depends": [ "$scope" ] + }, + { + "key": "InspectorPaneController", + "implementation": InspectorPaneController, + "priority": "preferred", + "depends": [ + "$scope", + "agentService", + "$window", + "navigationService" + ] } ], "representations": [ diff --git a/platform/commonUI/browse/res/templates/browse.html b/platform/commonUI/browse/res/templates/browse.html index 75fcaaeb0a..b5e9561b15 100644 --- a/platform/commonUI/browse/res/templates/browse.html +++ b/platform/commonUI/browse/res/templates/browse.html @@ -57,7 +57,7 @@ ng-class="{ collapsed : !modelPaneTree.visible() }">
diff --git a/platform/commonUI/browse/src/InspectorPaneController.js b/platform/commonUI/browse/src/InspectorPaneController.js new file mode 100644 index 0000000000..ef8e3883f7 --- /dev/null +++ b/platform/commonUI/browse/src/InspectorPaneController.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. + *****************************************************************************/ + + +define( + ["./PaneController"], + function (PaneController) { + + /** + * Pane controller that reveals inspector, if hidden, when object + * switches to edit mode. + * + * @param $scope + * @param agentService + * @param $window + * @param navigationService + * @constructor + */ + function InspectorPaneController($scope, agentService, $window, navigationService) { + PaneController.call(this, $scope, agentService, $window); + + var statusListener, + self = this; + + function showInspector(statuses) { + if (statuses.indexOf('editing') !== -1 && !self.visible()) { + self.toggle(); + } + } + + function attachStatusListener(domainObject) { + // Remove existing status listener if existing + if (statusListener) { + statusListener(); + } + + if (domainObject.hasCapability("status")) { + statusListener = domainObject.getCapability("status").listen(showInspector); + } + return statusListener; + } + + var domainObject = navigationService.getNavigation(); + if (domainObject) { + attachStatusListener(domainObject); + } + + var navigationListener = navigationService.addListener(attachStatusListener); + + $scope.$on("$destroy", function () { + statusListener(); + navigationListener(); + }); + } + + InspectorPaneController.prototype = Object.create(PaneController.prototype); + + return InspectorPaneController; + } +); diff --git a/platform/commonUI/browse/test/InspectorPaneControllerSpec.js b/platform/commonUI/browse/test/InspectorPaneControllerSpec.js new file mode 100644 index 0000000000..635396902b --- /dev/null +++ b/platform/commonUI/browse/test/InspectorPaneControllerSpec.js @@ -0,0 +1,96 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define( + ["../src/InspectorPaneController"], + function (InspectorPaneController) { + + describe("The InspectorPaneController", function () { + var mockScope, + mockAgentService, + mockDomainObject, + mockWindow, + mockStatusCapability, + mockNavigationService, + mockNavigationUnlistener, + mockStatusUnlistener, + controller; + + beforeEach(function () { + mockScope = jasmine.createSpyObj("$scope", ["$on"]); + mockWindow = jasmine.createSpyObj("$window", ["open"]); + mockAgentService = jasmine.createSpyObj( + "agentService", + ["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"] + ); + + mockNavigationUnlistener = jasmine.createSpy("navigationUnlistener"); + mockNavigationService = jasmine.createSpyObj( + "navigationService", + ["getNavigation", "addListener"] + ); + mockNavigationService.addListener.andReturn(mockNavigationUnlistener); + + mockStatusUnlistener = jasmine.createSpy("statusUnlistener"); + mockStatusCapability = jasmine.createSpyObj( + "statusCapability", + ["listen"] + ); + mockStatusCapability.listen.andReturn(mockStatusUnlistener); + + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + [ + 'getId', + 'getModel', + 'getCapability', + 'hasCapability' + ] + ); + mockDomainObject.getId.andReturn("domainObject"); + mockDomainObject.getModel.andReturn({}); + mockDomainObject.hasCapability.andReturn(true); + mockDomainObject.getCapability.andReturn(mockStatusCapability); + + controller = new InspectorPaneController(mockScope, mockAgentService, mockWindow, mockNavigationService); + }); + + it("listens for changes to navigation and attaches a status" + + " listener", function () { + expect(mockNavigationService.addListener).toHaveBeenCalledWith(jasmine.any(Function)); + mockNavigationService.addListener.mostRecentCall.args[0](mockDomainObject); + expect(mockStatusCapability.listen).toHaveBeenCalledWith(jasmine.any(Function)); + }); + + it("if hidden, shows the inspector when domain object switches to" + + " edit mode", function () { + controller.toggle(); + // test pre-condition that inspector is hidden + expect(controller.visible()).toBe(false); + mockNavigationService.addListener.mostRecentCall.args[0](mockDomainObject); + mockStatusCapability.listen.mostRecentCall.args[0](["editing"]); + expect(controller.visible()).toBe(true); + }); + + }); + } +); From 9cb26b73b53cae55a11e039c5b59e9a5b4469b6d Mon Sep 17 00:00:00 2001 From: Sarin Date: Tue, 21 Jun 2016 17:02:40 +0700 Subject: [PATCH 127/167] modified document --- README.md | 90 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index c21888dbc8..b93b9529d1 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,59 @@ Open MCT is a web-based platform for mission operations user interface software. +## Build + +Open MCT is built using [`npm`](http://npmjs.com/) +and [`gulp`](http://gulpjs.com/). + +To build: + +`npm run prepublish` + +This will compile and minify JavaScript sources, as well as copy over assets. +The contents of the `dist` folder will contain a runnable Open MCT +instance (e.g. by starting an HTTP server in that directory), including: + +* A `main.js` file containing Open MCT source code. +* Various assets in the `example` and `platform` directories. +* An `index.html` that runs Open MCT in its default configuration. + +Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). + +### Building Documentation + +Open MCT's documentation is generated by an +[npm](https://www.npmjs.com/)-based build. It has additional dependencies that +may not be available on every platform and thus is not covered in the standard +npm install. Ensure your system has [libcairo](http://cairographics.org/) +installed and then run the following commands: + +* `npm install` +* `npm install canvas nomnoml` +* `npm run docs` + +Documentation will be generated in `target/docs`. + +### Building Open MCT +Once downloaded, Open MCT can be built with the following command: + + npm install + +This will install various dependencies, build CSS from Sass files, run tests, +and lint the source code. + +It's not necessary to do this after every code change, unless you are making +changes to stylesheets, or you are running the minified version of the app +(under `dist`). + +### Running Open MCT + +Once built, Open MCT can be run using the command: + + npm start + +For more information on building and running Open MCT, please see our getting started guide - https://nasa.github.io/openmct/getting-started/ + ## Bundles A bundle is a group of software components (including source code, declared @@ -54,43 +107,6 @@ To run: * `npm install` * `npm run all` -## Build - -Open MCT is built using [`npm`](http://npmjs.com/) -and [`gulp`](http://gulpjs.com/). - -To build: - -`npm run prepublish` - -This will compile and minify JavaScript sources, as well as copy over assets. -The contents of the `dist` folder will contain a runnable Open MCT -instance (e.g. by starting an HTTP server in that directory), including: - -* A `main.js` file containing Open MCT source code. -* Various assets in the `example` and `platform` directories. -* An `index.html` that runs Open MCT in its default configuration. - -Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). - -### Building Documentation - -Open MCT's documentation is generated by an -[npm](https://www.npmjs.com/)-based build. It has additional dependencies that -may not be available on every platform and thus is not covered in the standard -npm install. Ensure your system has [libcairo](http://cairographics.org/) -installed and then run the following commands: - -* `npm install` -* `npm install canvas nomnoml` -* `npm run docs` - -Documentation will be generated in `target/docs`. - -### Run the app - -Please see [tutorial](https://github.com/nasa/openmct/blob/master/docs/src/tutorials/index.md) - # Glossary Certain terms are used throughout Open MCT with consistent meanings From bfc6ed460425329b5848c4dbd7cf36850cb92e90 Mon Sep 17 00:00:00 2001 From: Sarin Date: Tue, 21 Jun 2016 17:09:09 +0700 Subject: [PATCH 128/167] modified README.md for better documentation --- README.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index b93b9529d1..65e1bad53b 100644 --- a/README.md +++ b/README.md @@ -22,21 +22,8 @@ instance (e.g. by starting an HTTP server in that directory), including: Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). -### Building Documentation - -Open MCT's documentation is generated by an -[npm](https://www.npmjs.com/)-based build. It has additional dependencies that -may not be available on every platform and thus is not covered in the standard -npm install. Ensure your system has [libcairo](http://cairographics.org/) -installed and then run the following commands: - -* `npm install` -* `npm install canvas nomnoml` -* `npm run docs` - -Documentation will be generated in `target/docs`. - ### Building Open MCT + Once downloaded, Open MCT can be built with the following command: npm install @@ -56,6 +43,20 @@ Once built, Open MCT can be run using the command: For more information on building and running Open MCT, please see our getting started guide - https://nasa.github.io/openmct/getting-started/ +### Building Documentation + +Open MCT's documentation is generated by an +[npm](https://www.npmjs.com/)-based build. It has additional dependencies that +may not be available on every platform and thus is not covered in the standard +npm install. Ensure your system has [libcairo](http://cairographics.org/) +installed and then run the following commands: + +* `npm install` +* `npm install canvas nomnoml` +* `npm run docs` + +Documentation will be generated in `target/docs`. + ## Bundles A bundle is a group of software components (including source code, declared From 51079b0252deca43d0e40e54fe24e7819990deca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20Pe=CC=81rez?= Date: Tue, 21 Jun 2016 19:43:09 +0200 Subject: [PATCH 129/167] [API] X-Powered-By" Express header disabled. Fixes #1036 To improve the security avoiding a possible fingerprinting attack Ref.: http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header --- app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app.js b/app.js index 8e7bb15ec2..4b7e28906b 100644 --- a/app.js +++ b/app.js @@ -42,6 +42,8 @@ process.exit(0); } + app.disable('x-powered-by'); + // Override bundles.json for HTTP requests app.use('/' + BUNDLE_FILE, function (req, res) { var bundles; From c8f4568bd03eec29e7724504762de81d32292647 Mon Sep 17 00:00:00 2001 From: Pete Richards Date: Wed, 22 Jun 2016 10:51:16 -0700 Subject: [PATCH 130/167] [Plot] Set min height Set the min height for the plot element based on user feedback for minimum plot size that they find useful. Plot ticks may overlap but that is expected to be fixed in a future release. Fixes https://github.com/nasa/openmct/issues/1048 --- platform/commonUI/general/res/sass/_constants.scss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/platform/commonUI/general/res/sass/_constants.scss b/platform/commonUI/general/res/sass/_constants.scss index 2175f11ab1..bdd5120eab 100644 --- a/platform/commonUI/general/res/sass/_constants.scss +++ b/platform/commonUI/general/res/sass/_constants.scss @@ -97,9 +97,8 @@ $plotLegendH: 20px; $plotSwatchD: 8px; // 1: Top, 2: right, 3: bottom, 4: left $plotDisplayArea: ($plotLegendH + $interiorMargin, 0, $plotXBarH + $interiorMargin, $plotYBarW); -/* Based on current implementation of ~ 5 ticks per plot element; -Include legend, plot-display-area and X ticks */ -$plotMinH: $plotLegendH + ($interiorMargin * 2) + ($plotYLabelMinH * 5) + nth($plotDisplayArea,3); +/* min plot height is based on user testing to find minimum useful height */ +$plotMinH: 95px; /*************** Bubbles */ $bubbleArwSize: 10px; $bubblePad: $interiorMargin; From e42b8d22f72a08a17f6fb45044439d2f5787df26 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 22 Jun 2016 15:32:37 -0700 Subject: [PATCH 131/167] [Edit] Undirty objects on refresh Remove domain objects from the active transaction when they are refreshed, and use this from the SaveAsAction to prevent saving unintended changes. Fixes #1046 --- .../commonUI/edit/src/actions/SaveAsAction.js | 22 ++++++++++++++++--- .../TransactionalPersistenceCapability.js | 10 ++++++++- .../edit/src/services/TransactionService.js | 9 ++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/platform/commonUI/edit/src/actions/SaveAsAction.js b/platform/commonUI/edit/src/actions/SaveAsAction.js index cee67ebbfe..d13f723bb8 100644 --- a/platform/commonUI/edit/src/actions/SaveAsAction.js +++ b/platform/commonUI/edit/src/actions/SaveAsAction.js @@ -105,7 +105,8 @@ define( SaveAsAction.prototype.save = function () { var self = this, domainObject = this.domainObject, - copyService = this.copyService; + copyService = this.copyService, + toUndirty = []; function doWizardSave(parent) { var wizard = self.createWizard(parent); @@ -127,14 +128,28 @@ define( } function allowClone(objectToClone) { - return (objectToClone.getId() === domainObject.getId()) || - objectToClone.getCapability('location').isOriginal(); + var allowed = + (objectToClone.getId() === domainObject.getId()) || + objectToClone.getCapability('location').isOriginal(); + if (allowed) { + toUndirty.push(objectToClone); + } + return allowed; } function cloneIntoParent(parent) { return copyService.perform(domainObject, parent, allowClone); } + function undirty(domainObject) { + return domainObject.getCapability('persistence').refresh(); + } + + function undirtyOriginals(object) { + return Promise.all(toUndirty.map(undirty)) + .then(resolveWith(object)); + } + function commitEditingAfterClone(clonedObject) { return domainObject.getCapability("editor").save() .then(resolveWith(clonedObject)); @@ -144,6 +159,7 @@ define( .then(doWizardSave) .then(getParent) .then(cloneIntoParent) + .then(undirtyOriginals) .then(commitEditingAfterClone) .catch(resolveWith(false)); }; diff --git a/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js b/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js index 9bcf19c002..7bb4486b4f 100644 --- a/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js +++ b/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js @@ -49,6 +49,7 @@ define( this.domainObject = domainObject; this.$q = $q; this.persistPending = false; + this.removeFromTransaction = undefined; } /** @@ -75,6 +76,7 @@ define( }); } else { self.persistPending = false; + self.removeFromTransaction = undefined; //Model is undefined in persistence, so return undefined. return self.$q.when(undefined); } @@ -82,7 +84,8 @@ define( if (this.transactionService.isActive()) { if (!this.persistPending) { - this.transactionService.addToTransaction(onCommit, onCancel); + this.removeFromTransaction = this.transactionService + .addToTransaction(onCommit, onCancel); this.persistPending = true; } //Need to return a promise from this function @@ -93,6 +96,11 @@ define( }; TransactionalPersistenceCapability.prototype.refresh = function () { + if (this.persistPending) { + this.persistPending = false; + this.removeFromTransaction(); + this.removeFromTransaction = undefined; + } return this.persistenceCapability.refresh(); }; diff --git a/platform/commonUI/edit/src/services/TransactionService.js b/platform/commonUI/edit/src/services/TransactionService.js index 8d6c465959..59f196cf4b 100644 --- a/platform/commonUI/edit/src/services/TransactionService.js +++ b/platform/commonUI/edit/src/services/TransactionService.js @@ -81,6 +81,15 @@ define( //Log error because this is a programming error if it occurs. this.$log.error("No transaction in progress"); } + + return function () { + this.onCommits = this.onCommits.filter(function (callback) { + return callback !== onCommit; + }); + this.onCancels = this.onCancels.filter(function (callback) { + return callback !== onCancel; + }); + }.bind(this); }; /** From a3a0f003f09fe37409ade270cc23eb509d612410 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 22 Jun 2016 15:40:38 -0700 Subject: [PATCH 132/167] [Edit] Don't refresh unpersisted objects --- platform/core/src/capabilities/PersistenceCapability.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/core/src/capabilities/PersistenceCapability.js b/platform/core/src/capabilities/PersistenceCapability.js index aacf48f2e1..d985d394dc 100644 --- a/platform/core/src/capabilities/PersistenceCapability.js +++ b/platform/core/src/capabilities/PersistenceCapability.js @@ -152,6 +152,10 @@ define( }, modified); } + if (domainObject.getModel().persisted === undefined) { + return this.$q.when(true); + } + return this.persistenceService.readObject( this.getSpace(), this.getKey() From 8244e435bf9d3b26a26acf6c148d94b2497a4477 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 22 Jun 2016 16:13:26 -0700 Subject: [PATCH 133/167] [Edit] Update failing spec --- platform/core/test/capabilities/PersistenceCapabilitySpec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/core/test/capabilities/PersistenceCapabilitySpec.js b/platform/core/test/capabilities/PersistenceCapabilitySpec.js index be8c181cbd..2456e0ba19 100644 --- a/platform/core/test/capabilities/PersistenceCapabilitySpec.js +++ b/platform/core/test/capabilities/PersistenceCapabilitySpec.js @@ -74,7 +74,7 @@ define( ); mockQ = jasmine.createSpyObj( "$q", - ["reject"] + ["reject", "when"] ); mockNofificationService = jasmine.createSpyObj( "notificationService", @@ -103,6 +103,7 @@ define( mockIdentifierService.parse.andReturn(mockIdentifier); mockIdentifier.getSpace.andReturn(SPACE); mockIdentifier.getKey.andReturn(key); + mockQ.when.andCallFake(asPromise); persistence = new PersistenceCapability( mockCacheService, mockPersistenceService, @@ -156,6 +157,7 @@ define( }); it("refreshes the domain object model from persistence", function () { var refreshModel = {someOtherKey: "some other value"}; + model.persisted = 1; mockPersistenceService.readObject.andReturn(asPromise(refreshModel)); persistence.refresh(); expect(model).toEqual(refreshModel); From 48b271b7ca3e7bf4dfd608205fc6252341438cb8 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 22 Jun 2016 16:14:49 -0700 Subject: [PATCH 134/167] [Edit] Unshadow variable name ...to satisfy JSHint --- platform/commonUI/edit/src/actions/SaveAsAction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/commonUI/edit/src/actions/SaveAsAction.js b/platform/commonUI/edit/src/actions/SaveAsAction.js index d13f723bb8..059adbfe57 100644 --- a/platform/commonUI/edit/src/actions/SaveAsAction.js +++ b/platform/commonUI/edit/src/actions/SaveAsAction.js @@ -141,8 +141,8 @@ define( return copyService.perform(domainObject, parent, allowClone); } - function undirty(domainObject) { - return domainObject.getCapability('persistence').refresh(); + function undirty(object) { + return object.getCapability('persistence').refresh(); } function undirtyOriginals(object) { From e8e9598721d3c850f1b57f72b4ad463525ccae82 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 24 Jun 2016 15:37:23 -0700 Subject: [PATCH 135/167] [Build] Remove SNAPSHOT status ...to close sprint Kress, https://github.com/nasa/openmct/milestones/Kress --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 13bfe158dc..e1950d0552 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openmct", - "version": "0.10.3-SNAPSHOT", + "version": "0.10.3", "description": "The Open MCT core platform", "dependencies": { "express": "^4.13.1", From 8bdf1e3072d9caa29ba14e1219ffb76880512704 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 24 Jun 2016 15:42:10 -0700 Subject: [PATCH 136/167] [Build] Bump version number ...and restore SNAPSHOT status, to begin sprint Le Guin, https://github.com/nasa/openmct/milestones/Le%20Guin --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1950d0552..dadce1d35c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openmct", - "version": "0.10.3", + "version": "0.11.0-SNAPSHOT", "description": "The Open MCT core platform", "dependencies": { "express": "^4.13.1", From 24e870a1267e4a13dc8c96397b54acf8925a5967 Mon Sep 17 00:00:00 2001 From: Pete Richards Date: Fri, 24 Jun 2016 18:33:24 -0700 Subject: [PATCH 137/167] [Save] Show blocking dialog Show a blocking dialog while the save action is being performed. Prevents users from pressing save a second time or performing further actions while a save is in progress. Fixes https://github.jpl.nasa.gov/MissionControl/vista/issues/362 --- platform/commonUI/edit/bundle.js | 4 ++- .../commonUI/edit/src/actions/SaveAction.js | 22 +++++++++--- .../commonUI/edit/src/actions/SaveAsAction.js | 34 ++++++++++++++++--- .../edit/src/actions/SaveInProgressDialog.js | 20 +++++++++++ .../edit/test/actions/SaveActionSpec.js | 24 +++++++++++-- .../edit/test/actions/SaveAsActionSpec.js | 17 +++++++++- 6 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 platform/commonUI/edit/src/actions/SaveInProgressDialog.js diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index 3a9deb649e..aac5de49e5 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -206,7 +206,9 @@ define([ "implementation": SaveAction, "name": "Save", "description": "Save changes made to these objects.", - "depends": [], + "depends": [ + "dialogService" + ], "priority": "mandatory" }, { diff --git a/platform/commonUI/edit/src/actions/SaveAction.js b/platform/commonUI/edit/src/actions/SaveAction.js index 8a45913288..58e2fcdcfd 100644 --- a/platform/commonUI/edit/src/actions/SaveAction.js +++ b/platform/commonUI/edit/src/actions/SaveAction.js @@ -21,8 +21,8 @@ *****************************************************************************/ define( - [], - function () { + ['./SaveInProgressDialog'], + function (SaveInProgressDialog) { /** * The "Save" action; the action triggered by clicking Save from @@ -33,9 +33,11 @@ define( * @memberof platform/commonUI/edit */ function SaveAction( + dialogService, context ) { this.domainObject = (context || {}).domainObject; + this.dialogService = dialogService; } /** @@ -46,7 +48,8 @@ define( * @memberof platform/commonUI/edit.SaveAction# */ SaveAction.prototype.perform = function () { - var domainObject = this.domainObject; + var domainObject = this.domainObject, + dialog = new SaveInProgressDialog(this.dialogService); function resolveWith(object) { return function () { @@ -72,8 +75,17 @@ define( return object; } - //return doSave().then(returnToBrowse); - return doSave().then(returnToBrowse); + function hideBlockingDialog(object) { + dialog.hide(); + return object; + } + + dialog.show(); + + return doSave() + .then(hideBlockingDialog) + .then(returnToBrowse) + .catch(hideBlockingDialog); }; /** diff --git a/platform/commonUI/edit/src/actions/SaveAsAction.js b/platform/commonUI/edit/src/actions/SaveAsAction.js index cee67ebbfe..9c34c06c9a 100644 --- a/platform/commonUI/edit/src/actions/SaveAsAction.js +++ b/platform/commonUI/edit/src/actions/SaveAsAction.js @@ -21,9 +21,14 @@ *****************************************************************************/ -define( - ['../creation/CreateWizard'], - function (CreateWizard) { +define([ + '../creation/CreateWizard', + './SaveInProgressDialog' +], + function ( + CreateWizard, + SaveInProgressDialog + ) { /** * The "Save" action; the action triggered by clicking Save from @@ -105,7 +110,8 @@ define( SaveAsAction.prototype.save = function () { var self = this, domainObject = this.domainObject, - copyService = this.copyService; + copyService = this.copyService, + dialog = new SaveInProgressDialog(this.dialogService); function doWizardSave(parent) { var wizard = self.createWizard(parent); @@ -116,6 +122,16 @@ define( ).then(wizard.populateObjectFromInput.bind(wizard)); } + function showBlockingDialog(object) { + dialog.show(); + return object; + } + + function hideBlockingDialog(object) { + dialog.hide(); + return object; + } + function fetchObject(objectId) { return self.getObjectService().getObjects([objectId]).then(function (objects) { return objects[objectId]; @@ -140,14 +156,22 @@ define( .then(resolveWith(clonedObject)); } + function onFailure() { + hideBlockingDialog(); + return false; + } + return getParent(domainObject) .then(doWizardSave) + .then(showBlockingDialog) .then(getParent) .then(cloneIntoParent) .then(commitEditingAfterClone) - .catch(resolveWith(false)); + .then(hideBlockingDialog) + .catch(onFailure); }; + /** * Check if this action is applicable in a given context. * This will ensure that a domain object is present in the context, diff --git a/platform/commonUI/edit/src/actions/SaveInProgressDialog.js b/platform/commonUI/edit/src/actions/SaveInProgressDialog.js new file mode 100644 index 0000000000..c80989b8e0 --- /dev/null +++ b/platform/commonUI/edit/src/actions/SaveInProgressDialog.js @@ -0,0 +1,20 @@ +define([], function () { + function SaveInProgressDialog(dialogService) { + this.dialogService = dialogService; + } + + SaveInProgressDialog.prototype.show = function () { + this.dialogService.showBlockingMessage({ + title: "Saving...", + hint: "Do not navigate away from this page or close this browser tab while this message is displayed.", + unknownProgress: true, + severity: "info" + }); + }; + + SaveInProgressDialog.prototype.hide = function () { + this.dialogService.dismiss(); + }; + + return SaveInProgressDialog; +}); diff --git a/platform/commonUI/edit/test/actions/SaveActionSpec.js b/platform/commonUI/edit/test/actions/SaveActionSpec.js index 2d15b46679..b81da3d7de 100644 --- a/platform/commonUI/edit/test/actions/SaveActionSpec.js +++ b/platform/commonUI/edit/test/actions/SaveActionSpec.js @@ -28,6 +28,7 @@ define( var mockDomainObject, mockEditorCapability, actionContext, + dialogService, mockActionCapability, capabilities = {}, action; @@ -36,6 +37,9 @@ define( return { then: function (callback) { return mockPromise(callback(value)); + }, + catch: function (callback) { + return mockPromise(callback(value)); } }; } @@ -64,6 +68,10 @@ define( actionContext = { domainObject: mockDomainObject }; + dialogService = jasmine.createSpyObj( + "dialogService", + ["showBlockingMessage", "dismiss"] + ); mockDomainObject.hasCapability.andReturn(true); mockDomainObject.getCapability.andCallFake(function (capability) { @@ -73,8 +81,7 @@ define( mockEditorCapability.save.andReturn(mockPromise(true)); mockEditorCapability.isEditContextRoot.andReturn(true); - action = new SaveAction(actionContext); - + action = new SaveAction(dialogService, actionContext); }); it("only applies to domain object with an editor capability", function () { @@ -104,6 +111,19 @@ define( expect(mockActionCapability.perform).toHaveBeenCalledWith("navigate"); }); + it("shows a dialog while saving", function () { + mockEditorCapability.save.andReturn(new Promise(function () {})); + action.perform(); + expect(dialogService.showBlockingMessage).toHaveBeenCalled(); + expect(dialogService.dismiss).not.toHaveBeenCalled(); + }); + + it("hides a dialog when saving is complete", function () { + action.perform(); + expect(dialogService.showBlockingMessage).toHaveBeenCalled(); + expect(dialogService.dismiss).toHaveBeenCalled(); + }); + }); } ); diff --git a/platform/commonUI/edit/test/actions/SaveAsActionSpec.js b/platform/commonUI/edit/test/actions/SaveAsActionSpec.js index 8ea603b623..37e35aa5af 100644 --- a/platform/commonUI/edit/test/actions/SaveAsActionSpec.js +++ b/platform/commonUI/edit/test/actions/SaveAsActionSpec.js @@ -100,7 +100,9 @@ define( mockDialogService = jasmine.createSpyObj( "dialogService", [ - "getUserInput" + "getUserInput", + "showBlockingMessage", + "dismiss" ] ); mockDialogService.getUserInput.andReturn(mockPromise(undefined)); @@ -169,6 +171,19 @@ define( expect(mockDialogService.getUserInput).toHaveBeenCalled(); }); + it("shows a blocking dialog while waiting for save", function () { + mockEditorCapability.save.andReturn(new Promise(function () {})); + action.perform(); + expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockDialogService.dismiss).not.toHaveBeenCalled(); + }); + + it("hides the blocking dialog after saving", function () { + action.perform(); + expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockDialogService.dismiss).toHaveBeenCalled(); + }); + }); } ); From 2339560363d1c9b28f3a4d5ffb5459af6c6aed7d Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Fri, 24 Jun 2016 21:30:03 -0700 Subject: [PATCH 138/167] [Time Conductor] Bounds updated when date selected from date selector. Fixes #1018 --- platform/commonUI/general/bundle.js | 1 + .../src/controllers/TimeRangeController.js | 32 +++++++++++-------- .../controllers/TimeRangeControllerSpec.js | 6 ++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/platform/commonUI/general/bundle.js b/platform/commonUI/general/bundle.js index daadacbc45..a7dccb0326 100644 --- a/platform/commonUI/general/bundle.js +++ b/platform/commonUI/general/bundle.js @@ -204,6 +204,7 @@ define([ "implementation": TimeRangeController, "depends": [ "$scope", + "$timeout", "formatService", "DEFAULT_TIME_FORMAT", "now" diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index 740a253712..9d1087c8a8 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -53,7 +53,7 @@ define([ * format has been otherwise specified * @param {Function} now a function to return current system time */ - function TimeRangeController($scope, formatService, defaultFormat, now) { + function TimeRangeController($scope, $timeout, formatService, defaultFormat, now) { this.$scope = $scope; this.formatService = formatService; this.defaultFormat = defaultFormat; @@ -66,6 +66,7 @@ define([ this.formatter = formatService.getFormat(defaultFormat); this.formStartChanged = false; this.formEndChanged = false; + this.$timeout = $timeout; this.$scope.ticks = []; @@ -259,18 +260,23 @@ define([ }; TimeRangeController.prototype.updateBoundsFromForm = function () { - if (this.formStartChanged) { - this.$scope.ngModel.outer.start = - this.$scope.ngModel.inner.start = - this.$scope.formModel.start; - this.formStartChanged = false; - } - if (this.formEndChanged) { - this.$scope.ngModel.outer.end = - this.$scope.ngModel.inner.end = - this.$scope.formModel.end; - this.formEndChanged = false; - } + var self = this; + + //Allow Angular to trigger watches and determine whether values have changed. + this.$timeout(function () { + if (self.formStartChanged) { + self.$scope.ngModel.outer.start = + self.$scope.ngModel.inner.start = + self.$scope.formModel.start; + self.formStartChanged = false; + } + if (self.formEndChanged) { + self.$scope.ngModel.outer.end = + self.$scope.ngModel.inner.end = + self.$scope.formModel.end; + self.formEndChanged = false; + } + }); }; TimeRangeController.prototype.onFormStartChange = function ( diff --git a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js index 718dd2664f..f7fc1b6f34 100644 --- a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js +++ b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js @@ -33,6 +33,7 @@ define( var mockScope, mockFormatService, testDefaultFormat, + mockTimeout, mockNow, mockFormat, controller; @@ -54,6 +55,10 @@ define( } beforeEach(function () { + mockTimeout = function (fn) { + return fn(); + }; + mockScope = jasmine.createSpyObj( "$scope", ["$apply", "$watch", "$watchCollection"] @@ -78,6 +83,7 @@ define( controller = new TimeRangeController( mockScope, + mockTimeout, mockFormatService, testDefaultFormat, mockNow From b57fc2a0e33c8fa0d84092cc04cc0204088f3115 Mon Sep 17 00:00:00 2001 From: Sarin Date: Mon, 27 Jun 2016 16:09:28 +0700 Subject: [PATCH 139/167] [Documentation] Add getting started section --- README.md | 61 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 65e1bad53b..c1ddb89c4e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,43 @@ # Open MCT -Open MCT is a web-based platform for mission operations user interface -software. +Open MCT is a next-generation mission control framework being developed at the NASA Ames Research Center in Silicon Valley. Web-based, for desktop and mobile. + +##HOW IS NASA USING OPEN MCT? + +Software based on Open MCT is being used for mission planning and operations in the lead up to the [Resource Prospector mission](https://www.nasa.gov/resource-prospector) and at NASA's Jet Propulsion Laboratory to view data from the Curiosity Rover. + +##Features + + - Support planning and operations of any system that produces telemetry + - Support space missions + - Visualize Data + - Streaming Data + - Historical Data + - Imagery + - Timelines + - Procedures + - etc. + +##See Open MCT in Action +[LIVE DEMO](https://openmct-demo.herokuapp.com/) +![Demo](https://nasa.github.io/openmct/static/res/images/Open-MCT.Browse.Layout.Mars-Weather-1.jpg) + +##Getting Started + +1. Download or Clone OpenMCT + `git clone https://github.com/nasa/openmct.git` + +2. Install Development Dependencies + `npm install` + +3. Run on your local machine + `npm start` + +4. Open your web browser and go to http://localhost:8080/ + +5. Wait for splash screen finish then you should be able to play with Open MCT. + +For more information on building and running Open MCT, please see our getting started guide - https://nasa.github.io/openmct/getting-started/ ## Build @@ -22,27 +58,6 @@ instance (e.g. by starting an HTTP server in that directory), including: Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). -### Building Open MCT - -Once downloaded, Open MCT can be built with the following command: - - npm install - -This will install various dependencies, build CSS from Sass files, run tests, -and lint the source code. - -It's not necessary to do this after every code change, unless you are making -changes to stylesheets, or you are running the minified version of the app -(under `dist`). - -### Running Open MCT - -Once built, Open MCT can be run using the command: - - npm start - -For more information on building and running Open MCT, please see our getting started guide - https://nasa.github.io/openmct/getting-started/ - ### Building Documentation Open MCT's documentation is generated by an From 8cf7ffc7cce2f3cbbc8fe8ffd0c82a96b2c0a7fa Mon Sep 17 00:00:00 2001 From: Sarin Date: Mon, 27 Jun 2016 17:11:27 +0700 Subject: [PATCH 140/167] [Documentation] Add How is NASA Using Open MCT?, Features, See Open MCT in Action, Getting Started Sections --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1ddb89c4e..727add5c61 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Open MCT is a next-generation mission control framework being developed at the NASA Ames Research Center in Silicon Valley. Web-based, for desktop and mobile. -##HOW IS NASA USING OPEN MCT? +##How is NASA Using Open MCT? Software based on Open MCT is being used for mission planning and operations in the lead up to the [Resource Prospector mission](https://www.nasa.gov/resource-prospector) and at NASA's Jet Propulsion Laboratory to view data from the Curiosity Rover. From d1c01d3c8681bf335ca6b1ceb1529bc3e389816d Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 27 Jun 2016 09:12:57 -0700 Subject: [PATCH 141/167] Squashed commit of the following: commit 3f199a9f061237a8d1d0dff46b6334ad78356e6a Merge: 27fe4ed 736cba7 Author: Victor Woeltjen Date: Mon Jun 27 09:04:40 2016 -0700 Merge remote-tracking branch 'origin/master' into clear-transactions-1046 Conflicts: platform/commonUI/edit/src/actions/SaveAsAction.js commit 27fe4edb30931c2eed0c0e027e6c335b2eca79db Author: Victor Woeltjen Date: Wed Jun 22 15:04:06 2016 -0700 [Edit] Mark restartTransaction as private API commit 21d1938a0f6c2430e7350c69075f51ea6cb064ac Author: Victor Woeltjen Date: Wed Jun 22 15:03:17 2016 -0700 [Edit] Clarify JSDoc commit 06a83f9fa98b6257c0ec8e937289256edaf918ff Author: Victor Woeltjen Date: Wed Jun 22 15:01:35 2016 -0700 [Edit] Update failing spec commit 1f525160e007c5c436b738833dcd0db3faeedca0 Author: Victor Woeltjen Date: Wed Jun 22 14:52:43 2016 -0700 [Edit] Refer to correct variable ...when clearing transactions after a restartTransaction commit b60e94bce414044ce04b99467a8828be90ea871e Author: Victor Woeltjen Date: Wed Jun 22 14:38:54 2016 -0700 [Edit] Clear transactions on Save As ...such that only persistence calls associated with the saved clones are actually issued. Fixes #1046. --- platform/commonUI/edit/bundle.js | 3 +- .../commonUI/edit/src/actions/SaveAsAction.js | 16 ++++++++++ .../edit/src/services/TransactionService.js | 31 ++++++++++++++++++- .../edit/test/actions/SaveAsActionSpec.js | 18 ++++++++++- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/platform/commonUI/edit/bundle.js b/platform/commonUI/edit/bundle.js index aac5de49e5..4f79d11787 100644 --- a/platform/commonUI/edit/bundle.js +++ b/platform/commonUI/edit/bundle.js @@ -222,7 +222,8 @@ define([ "policyService", "dialogService", "creationService", - "copyService" + "copyService", + "transactionService" ], "priority": "mandatory" }, diff --git a/platform/commonUI/edit/src/actions/SaveAsAction.js b/platform/commonUI/edit/src/actions/SaveAsAction.js index 9c34c06c9a..4c4206b8a6 100644 --- a/platform/commonUI/edit/src/actions/SaveAsAction.js +++ b/platform/commonUI/edit/src/actions/SaveAsAction.js @@ -44,6 +44,7 @@ define([ dialogService, creationService, copyService, + transactionService, context ) { this.domainObject = (context || {}).domainObject; @@ -54,6 +55,7 @@ define([ this.dialogService = dialogService; this.creationService = creationService; this.copyService = copyService; + this.transactionService = transactionService; } /** @@ -111,6 +113,8 @@ define([ var self = this, domainObject = this.domainObject, copyService = this.copyService, + transactionService = this.transactionService, + cancelOldTransaction, dialog = new SaveInProgressDialog(this.dialogService); function doWizardSave(parent) { @@ -156,6 +160,16 @@ define([ .then(resolveWith(clonedObject)); } + function restartTransaction(object) { + cancelOldTransaction = transactionService.restartTransaction(); + return object; + } + + function doCancelOldTransaction(object) { + cancelOldTransaction(); + return object; + } + function onFailure() { hideBlockingDialog(); return false; @@ -165,8 +179,10 @@ define([ .then(doWizardSave) .then(showBlockingDialog) .then(getParent) + .then(restartTransaction) .then(cloneIntoParent) .then(commitEditingAfterClone) + .then(doCancelOldTransaction) .then(hideBlockingDialog) .catch(onFailure); }; diff --git a/platform/commonUI/edit/src/services/TransactionService.js b/platform/commonUI/edit/src/services/TransactionService.js index 8d6c465959..00bc96e1dd 100644 --- a/platform/commonUI/edit/src/services/TransactionService.js +++ b/platform/commonUI/edit/src/services/TransactionService.js @@ -140,9 +140,38 @@ define( }); }; + /** + * Clear and restart the active transaction. + * + * This neither cancels nor commits the active transaction; + * instead, it returns a function that can be used to cancel that + * transaction. + * + * @returns {Function} a function to cancel the prior transaction + * @private + */ + TransactionService.prototype.restartTransaction = function () { + var oldOnCancels = this.onCancels; + + this.onCommits = []; + this.onCancels = []; + + return function () { + while (oldOnCancels.length > 0) { + var onCancel = oldOnCancels.pop(); + try { + onCancel(); + } catch (error) { + this.$log.error("Error cancelling transaction."); + } + } + }; + }; + TransactionService.prototype.size = function () { return this.onCommits.length; }; return TransactionService; - }); + } +); diff --git a/platform/commonUI/edit/test/actions/SaveAsActionSpec.js b/platform/commonUI/edit/test/actions/SaveAsActionSpec.js index 37e35aa5af..850e18ecca 100644 --- a/platform/commonUI/edit/test/actions/SaveAsActionSpec.js +++ b/platform/commonUI/edit/test/actions/SaveAsActionSpec.js @@ -34,6 +34,7 @@ define( mockCopyService, mockParent, mockUrlService, + mockTransactionService, actionContext, capabilities = {}, action; @@ -119,11 +120,26 @@ define( ["urlForLocation"] ); + mockTransactionService = jasmine.createSpyObj( + "transactionService", + ["restartTransaction"] + ); + mockTransactionService.restartTransaction + .andReturn(jasmine.createSpy()); + actionContext = { domainObject: mockDomainObject }; - action = new SaveAsAction(undefined, undefined, mockDialogService, undefined, mockCopyService, actionContext); + action = new SaveAsAction( + undefined, + undefined, + mockDialogService, + undefined, + mockCopyService, + mockTransactionService, + actionContext + ); spyOn(action, "getObjectService"); action.getObjectService.andReturn(mockObjectService); From 8a9edd3705ba1742dc4168affa52c87485af2590 Mon Sep 17 00:00:00 2001 From: pacozaa Date: Tue, 28 Jun 2016 12:51:12 +0700 Subject: [PATCH 142/167] [Documentation] Add Official site --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 727add5c61..491cedc2e0 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Open MCT is a next-generation mission control framework being developed at the NASA Ames Research Center in Silicon Valley. Web-based, for desktop and mobile. +[Official Site](https://nasa.github.io/openmct/) + ##How is NASA Using Open MCT? Software based on Open MCT is being used for mission planning and operations in the lead up to the [Resource Prospector mission](https://www.nasa.gov/resource-prospector) and at NASA's Jet Propulsion Laboratory to view data from the Curiosity Rover. From eef08ccb0b02475e61129c209abce2b64ce10785 Mon Sep 17 00:00:00 2001 From: pacozaa Date: Tue, 28 Jun 2016 13:05:28 +0700 Subject: [PATCH 143/167] [Documentation]Add convince messages --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 491cedc2e0..ec21b6565a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Open MCT is a next-generation mission control framework being developed at the NASA Ames Research Center in Silicon Valley. Web-based, for desktop and mobile. -[Official Site](https://nasa.github.io/openmct/) +Please visit our [Official Site](https://nasa.github.io/openmct/) ##How is NASA Using Open MCT? @@ -21,12 +21,16 @@ Software based on Open MCT is being used for mission planning and operations in - etc. ##See Open MCT in Action + +Do you want to see how Open MCT work? Try our demo. [LIVE DEMO](https://openmct-demo.herokuapp.com/) ![Demo](https://nasa.github.io/openmct/static/res/images/Open-MCT.Browse.Layout.Mars-Weather-1.jpg) ##Getting Started -1. Download or Clone OpenMCT +Here is how to run Open MCT in you local machine. + +1. Download or Clone Open MCT `git clone https://github.com/nasa/openmct.git` 2. Install Development Dependencies From ea1780364b9ff8aeadadbddb4e46d9f0a3fab74d Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 29 Jun 2016 20:09:58 -0700 Subject: [PATCH 144/167] [Dialog Service] Dismiss individual dialogs. Fixes #254 --- .../src/DialogLaunchController.js | 126 ++++++++++-------- platform/commonUI/dialog/src/DialogService.js | 67 +++++----- .../commonUI/dialog/test/DialogServiceSpec.js | 41 +++++- .../edit/src/actions/SaveInProgressDialog.js | 7 +- .../edit/test/actions/SaveActionSpec.js | 33 +++-- .../edit/test/actions/SaveAsActionSpec.js | 33 +++-- .../src/controllers/BannerController.js | 8 +- .../src/NotificationIndicatorController.js | 3 - .../NotificationIndicatorControllerSpec.js | 15 --- .../entanglement/src/actions/CopyAction.js | 13 +- .../test/actions/CopyActionSpec.js | 6 +- 11 files changed, 209 insertions(+), 143 deletions(-) diff --git a/example/notifications/src/DialogLaunchController.js b/example/notifications/src/DialogLaunchController.js index f35d008cd0..e7f867d303 100644 --- a/example/notifications/src/DialogLaunchController.js +++ b/example/notifications/src/DialogLaunchController.js @@ -44,30 +44,31 @@ define( periodically with the progress of an ongoing process. */ $scope.launchProgress = function (knownProgress) { - var model = { - title: "Progress Dialog Example", - progress: 0, - hint: "Do not navigate away from this page or close this browser tab while this operation is in progress.", - actionText: "Calculating...", - unknownProgress: !knownProgress, - unknownDuration: false, - severity: "info", - options: [ - { - label: "Cancel Operation", - callback: function () { - $log.debug("Operation cancelled"); - dialogService.dismiss(); + var dialog, + model = { + title: "Progress Dialog Example", + progress: 0, + hint: "Do not navigate away from this page or close this browser tab while this operation is in progress.", + actionText: "Calculating...", + unknownProgress: !knownProgress, + unknownDuration: false, + severity: "info", + options: [ + { + label: "Cancel Operation", + callback: function () { + $log.debug("Operation cancelled"); + dialog.dismiss(); + } + }, + { + label: "Do something else...", + callback: function () { + $log.debug("Something else pressed"); + } } - }, - { - label: "Do something else...", - callback: function () { - $log.debug("Something else pressed"); - } - } - ] - }; + ] + }; function incrementProgress() { model.progress = Math.min(100, Math.floor(model.progress + Math.random() * 30)); @@ -77,7 +78,9 @@ define( } } - if (dialogService.showBlockingMessage(model)) { + dialog = dialogService.showBlockingMessage(model); + + if (dialog) { //Do processing here model.actionText = "Processing 100 objects..."; if (knownProgress) { @@ -93,29 +96,31 @@ define( Demonstrates launching an error dialog */ $scope.launchError = function () { - var model = { - title: "Error Dialog Example", - actionText: "Something happened, and it was not good.", - severity: "error", - options: [ - { - label: "Try Again", - callback: function () { - $log.debug("Try Again Pressed"); - dialogService.dismiss(); + var dialog, + model = { + title: "Error Dialog Example", + actionText: "Something happened, and it was not good.", + severity: "error", + options: [ + { + label: "Try Again", + callback: function () { + $log.debug("Try Again Pressed"); + dialog.dismiss(); + } + }, + { + label: "Cancel", + callback: function () { + $log.debug("Cancel Pressed"); + dialog.dismiss(); + } } - }, - { - label: "Cancel", - callback: function () { - $log.debug("Cancel Pressed"); - dialogService.dismiss(); - } - } - ] - }; + ] + }; + dialog = dialogService.showBlockingMessage(model); - if (!dialogService.showBlockingMessage(model)) { + if (!dialog) { $log.error("Could not display modal dialog"); } }; @@ -124,22 +129,25 @@ define( Demonstrates launching an error dialog */ $scope.launchInfo = function () { - var model = { - title: "Info Dialog Example", - actionText: "This is an example of a blocking info" + - " dialog. This dialog can be used to draw the user's" + - " attention to an event.", - severity: "info", - primaryOption: { - label: "OK", - callback: function () { - $log.debug("OK Pressed"); - dialogService.dismiss(); + var dialog, + model = { + title: "Info Dialog Example", + actionText: "This is an example of a blocking info" + + " dialog. This dialog can be used to draw the user's" + + " attention to an event.", + severity: "info", + primaryOption: { + label: "OK", + callback: function () { + $log.debug("OK Pressed"); + dialog.dismiss(); + } } - } - }; + }; - if (!dialogService.showBlockingMessage(model)) { + dialog = dialogService.showBlockingMessage(model); + + if (!dialog) { $log.error("Could not display modal dialog"); } }; diff --git a/platform/commonUI/dialog/src/DialogService.js b/platform/commonUI/dialog/src/DialogService.js index 778a172147..f3e888b6e0 100644 --- a/platform/commonUI/dialog/src/DialogService.js +++ b/platform/commonUI/dialog/src/DialogService.js @@ -39,25 +39,28 @@ define( this.overlayService = overlayService; this.$q = $q; this.$log = $log; - this.overlay = undefined; - this.dialogVisible = false; + this.activeOverlay = undefined; } - // Stop showing whatever overlay is currently active - // (e.g. because the user hit cancel) - DialogService.prototype.dismiss = function () { - var overlay = this.overlay; - if (overlay) { - overlay.dismiss(); + /** + * @private + */ + DialogService.prototype.dismissOverlay = function (overlay) { + //Dismiss the overlay + overlay.dismiss(); + + //If dialog is the current active one, dismiss it + if (overlay === this.activeOverlay) { + this.activeOverlay = undefined; } - this.dialogVisible = false; }; DialogService.prototype.getDialogResponse = function (key, model, resultGetter, typeClass) { // We will return this result as a promise, because user // input is asynchronous. var deferred = this.$q.defer(), - self = this; + self = this, + overlay; // Confirm function; this will be passed in to the // overlay-dialog template and associated with a @@ -65,9 +68,7 @@ define( function confirm(value) { // Pass along the result deferred.resolve(resultGetter ? resultGetter() : value); - - // Stop showing the dialog - self.dismiss(); + self.dismissOverlay(overlay); } // Cancel function; this will be passed in to the @@ -75,7 +76,7 @@ define( // Cancel or X button click function cancel() { deferred.reject(); - self.dismiss(); + self.dismissOverlay(overlay); } // Add confirm/cancel callbacks @@ -85,15 +86,11 @@ define( if (this.canShowDialog(model)) { // Add the overlay using the OverlayService, which // will handle actual insertion into the DOM - this.overlay = this.overlayService.createOverlay( + overlay = this.activeOverlay = this.overlayService.createOverlay( key, model, typeClass || "t-dialog" ); - - // Track that a dialog is already visible, to - // avoid spawning multiple dialogs at once. - this.dialogVisible = true; } else { deferred.reject(); } @@ -156,7 +153,7 @@ define( * otherwise */ DialogService.prototype.canShowDialog = function (dialogModel) { - if (this.dialogVisible) { + if (this.activeOverlay) { // Only one dialog should be shown at a time. // The application design should be such that // we never even try to do this. @@ -183,6 +180,11 @@ define( * button is clicked */ + /** + * @typedef DialogHandle + * @property {function} dismiss a function to dismiss the given dialog + */ + /** * A description of the model options that may be passed to the * showBlockingMessage method. Note that the DialogModel desribed @@ -222,21 +224,26 @@ define( * the user can take if necessary * @param {DialogModel} dialogModel defines options for the dialog * @param {typeClass} string tells overlayService that this overlay should use appropriate CSS class - * @returns {boolean} + * @returns {boolean | {DialogHandle}} */ DialogService.prototype.showBlockingMessage = function (dialogModel) { if (this.canShowDialog(dialogModel)) { // Add the overlay using the OverlayService, which // will handle actual insertion into the DOM - this.overlay = this.overlayService.createOverlay( - "overlay-blocking-message", - dialogModel, - "t-dialog-sm" - ); - // Track that a dialog is already visible, to - // avoid spawning multiple dialogs at once. - this.dialogVisible = true; - return true; + var self = this, + overlay = this.overlayService.createOverlay( + "overlay-blocking-message", + dialogModel, + "t-dialog-sm" + ); + + this.activeOverlay = overlay; + + return { + dismiss: function () { + self.dismissOverlay(overlay); + } + }; } else { return false; } diff --git a/platform/commonUI/dialog/test/DialogServiceSpec.js b/platform/commonUI/dialog/test/DialogServiceSpec.js index 2d801eb028..663f9fbeda 100644 --- a/platform/commonUI/dialog/test/DialogServiceSpec.js +++ b/platform/commonUI/dialog/test/DialogServiceSpec.js @@ -122,7 +122,7 @@ define( it("invokes the overlay service with the correct parameters when" + " a blocking dialog is requested", function () { var dialogModel = {}; - expect(dialogService.showBlockingMessage(dialogModel)).toBe(true); + expect(dialogService.showBlockingMessage(dialogModel)).not.toBe(false); expect(mockOverlayService.createOverlay).toHaveBeenCalledWith( "overlay-blocking-message", dialogModel, @@ -130,6 +130,45 @@ define( ); }); + describe("the blocking message dialog", function () { + var dialogModel = {}; + var dialogHandle; + + beforeEach(function () { + dialogHandle = dialogService.showBlockingMessage(dialogModel); + }); + + it("returns a handle to the dialog", function () { + expect(dialogHandle).not.toBe(undefined); + }); + + it("dismissing the dialog dismisses the overlay", function () { + dialogHandle.dismiss(); + expect(mockOverlay.dismiss).toHaveBeenCalled(); + }); + + it("individual dialogs can be dismissed", function () { + var secondDialogHandle, + secondMockOverlay; + + dialogHandle.dismiss(); + + secondMockOverlay = jasmine.createSpyObj( + "overlay", + ["dismiss"] + ); + mockOverlayService.createOverlay.andReturn(secondMockOverlay); + secondDialogHandle = dialogService.showBlockingMessage(dialogModel); + + //Dismiss the first dialog. It should only dismiss if it + // is active + dialogHandle.dismiss(); + expect(secondMockOverlay.dismiss).not.toHaveBeenCalled(); + secondDialogHandle.dismiss(); + expect(secondMockOverlay.dismiss).toHaveBeenCalled(); + }); + }); + }); } ); diff --git a/platform/commonUI/edit/src/actions/SaveInProgressDialog.js b/platform/commonUI/edit/src/actions/SaveInProgressDialog.js index c80989b8e0..56c2c1ad86 100644 --- a/platform/commonUI/edit/src/actions/SaveInProgressDialog.js +++ b/platform/commonUI/edit/src/actions/SaveInProgressDialog.js @@ -1,10 +1,11 @@ define([], function () { function SaveInProgressDialog(dialogService) { this.dialogService = dialogService; + this.dialog = undefined; } SaveInProgressDialog.prototype.show = function () { - this.dialogService.showBlockingMessage({ + this.dialog = this.dialogService.showBlockingMessage({ title: "Saving...", hint: "Do not navigate away from this page or close this browser tab while this message is displayed.", unknownProgress: true, @@ -13,7 +14,9 @@ define([], function () { }; SaveInProgressDialog.prototype.hide = function () { - this.dialogService.dismiss(); + if (this.dialog) { + this.dialog.dismiss(); + } }; return SaveInProgressDialog; diff --git a/platform/commonUI/edit/test/actions/SaveActionSpec.js b/platform/commonUI/edit/test/actions/SaveActionSpec.js index b81da3d7de..a24e3f4587 100644 --- a/platform/commonUI/edit/test/actions/SaveActionSpec.js +++ b/platform/commonUI/edit/test/actions/SaveActionSpec.js @@ -70,7 +70,7 @@ define( }; dialogService = jasmine.createSpyObj( "dialogService", - ["showBlockingMessage", "dismiss"] + ["showBlockingMessage"] ); mockDomainObject.hasCapability.andReturn(true); @@ -111,17 +111,28 @@ define( expect(mockActionCapability.perform).toHaveBeenCalledWith("navigate"); }); - it("shows a dialog while saving", function () { - mockEditorCapability.save.andReturn(new Promise(function () {})); - action.perform(); - expect(dialogService.showBlockingMessage).toHaveBeenCalled(); - expect(dialogService.dismiss).not.toHaveBeenCalled(); - }); + describe("a blocking dialog", function () { + var mockDialogHandle; - it("hides a dialog when saving is complete", function () { - action.perform(); - expect(dialogService.showBlockingMessage).toHaveBeenCalled(); - expect(dialogService.dismiss).toHaveBeenCalled(); + beforeEach(function () { + mockDialogHandle = jasmine.createSpyObj("dialogHandle", ["dismiss"]); + dialogService.showBlockingMessage.andReturn(mockDialogHandle); + }); + + + it("shows a dialog while saving", function () { + mockEditorCapability.save.andReturn(new Promise(function () { + })); + action.perform(); + expect(dialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockDialogHandle.dismiss).not.toHaveBeenCalled(); + }); + + it("hides a dialog when saving is complete", function () { + action.perform(); + expect(dialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockDialogHandle.dismiss).toHaveBeenCalled(); + }); }); }); diff --git a/platform/commonUI/edit/test/actions/SaveAsActionSpec.js b/platform/commonUI/edit/test/actions/SaveAsActionSpec.js index 37e35aa5af..b949f6b447 100644 --- a/platform/commonUI/edit/test/actions/SaveAsActionSpec.js +++ b/platform/commonUI/edit/test/actions/SaveAsActionSpec.js @@ -101,8 +101,7 @@ define( "dialogService", [ "getUserInput", - "showBlockingMessage", - "dismiss" + "showBlockingMessage" ] ); mockDialogService.getUserInput.andReturn(mockPromise(undefined)); @@ -171,17 +170,27 @@ define( expect(mockDialogService.getUserInput).toHaveBeenCalled(); }); - it("shows a blocking dialog while waiting for save", function () { - mockEditorCapability.save.andReturn(new Promise(function () {})); - action.perform(); - expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); - expect(mockDialogService.dismiss).not.toHaveBeenCalled(); - }); + describe("a blocking dialog", function () { + var mockDialogHandle; + + beforeEach(function () { + mockDialogHandle = jasmine.createSpyObj("dialogHandle", ["dismiss"]); + mockDialogService.showBlockingMessage.andReturn(mockDialogHandle); + }); + + it("indicates that a save is taking place", function () { + mockEditorCapability.save.andReturn(new Promise(function () {})); + action.perform(); + expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockDialogHandle.dismiss).not.toHaveBeenCalled(); + }); + + it("is hidden after saving", function () { + action.perform(); + expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); + expect(mockDialogHandle.dismiss).toHaveBeenCalled(); + }); - it("hides the blocking dialog after saving", function () { - action.perform(); - expect(mockDialogService.showBlockingMessage).toHaveBeenCalled(); - expect(mockDialogService.dismiss).toHaveBeenCalled(); }); }); diff --git a/platform/commonUI/general/src/controllers/BannerController.js b/platform/commonUI/general/src/controllers/BannerController.js index 5b0cdd61bc..098bacfa9f 100644 --- a/platform/commonUI/general/src/controllers/BannerController.js +++ b/platform/commonUI/general/src/controllers/BannerController.js @@ -54,17 +54,17 @@ define( }; $scope.maximize = function (notification) { if (notification.model.severity !== "info") { - + var dialog; notification.model.cancel = function () { - dialogService.dismiss(); + dialog.dismiss(); }; //If the notification is dismissed by the user, close // the dialog. notification.onDismiss(function () { - dialogService.dismiss(); + dialog.dismiss(); }); - dialogService.showBlockingMessage(notification.model); + dialog = dialogService.showBlockingMessage(notification.model); } }; } diff --git a/platform/commonUI/notification/src/NotificationIndicatorController.js b/platform/commonUI/notification/src/NotificationIndicatorController.js index 8a1bdbca2a..f5343df46d 100644 --- a/platform/commonUI/notification/src/NotificationIndicatorController.js +++ b/platform/commonUI/notification/src/NotificationIndicatorController.js @@ -49,9 +49,6 @@ define( //Launch the message list dialog with the models // from the notifications messages: notificationService.notifications - }, - cancel: function () { - dialogService.dismiss(); } }); diff --git a/platform/commonUI/notification/test/NotificationIndicatorControllerSpec.js b/platform/commonUI/notification/test/NotificationIndicatorControllerSpec.js index 222c2fc87b..adcc912b60 100644 --- a/platform/commonUI/notification/test/NotificationIndicatorControllerSpec.js +++ b/platform/commonUI/notification/test/NotificationIndicatorControllerSpec.js @@ -54,22 +54,7 @@ define( expect(mockDialogService.getDialogResponse).toHaveBeenCalled(); expect(mockDialogService.getDialogResponse.mostRecentCall.args[0]).toBe('overlay-message-list'); expect(mockDialogService.getDialogResponse.mostRecentCall.args[1].dialog).toBeDefined(); - expect(mockDialogService.getDialogResponse.mostRecentCall.args[1].cancel).toBeDefined(); - //Invoke the cancel callback - mockDialogService.getDialogResponse.mostRecentCall.args[1].cancel(); - expect(mockDialogService.dismiss).toHaveBeenCalled(); }); - - it("provides a means of dismissing the message list", function () { - expect(mockScope.showNotificationsList).toBeDefined(); - mockScope.showNotificationsList(); - expect(mockDialogService.getDialogResponse).toHaveBeenCalled(); - expect(mockDialogService.getDialogResponse.mostRecentCall.args[1].cancel).toBeDefined(); - //Invoke the cancel callback - mockDialogService.getDialogResponse.mostRecentCall.args[1].cancel(); - expect(mockDialogService.dismiss).toHaveBeenCalled(); - }); - }); } ); diff --git a/platform/entanglement/src/actions/CopyAction.js b/platform/entanglement/src/actions/CopyAction.js index 0c5ab99755..ce40f3bbd2 100644 --- a/platform/entanglement/src/actions/CopyAction.js +++ b/platform/entanglement/src/actions/CopyAction.js @@ -86,7 +86,9 @@ define( severity: "info" }); } else if (phase.toLowerCase() === "copying") { - this.dialogService.dismiss(); + if (this.dialog) { + this.dialog.dismiss(); + } if (!this.notification) { this.notification = this.notificationService .notify({ @@ -115,7 +117,8 @@ define( } function error(errorDetails) { - var errorMessage = { + var errorDialog, + errorMessage = { title: "Error copying objects.", severity: "error", hint: errorDetails.message, @@ -123,12 +126,12 @@ define( options: [{ label: "OK", callback: function () { - self.dialogService.dismiss(); + errorDialog.dismiss(); } }] }; - self.dialogService.dismiss(); + self.dialog.dismiss(); if (self.notification) { self.notification.dismiss(); // Clear the progress notification } @@ -136,7 +139,7 @@ define( //Show a minimized notification of error for posterity self.notificationService.notify(errorMessage); //Display a blocking message - self.dialogService.showBlockingMessage(errorMessage); + errorDialog = self.dialogService.showBlockingMessage(errorMessage); } function notification(details) { diff --git a/platform/entanglement/test/actions/CopyActionSpec.js b/platform/entanglement/test/actions/CopyActionSpec.js index 176b5baef8..8d9b6397b6 100644 --- a/platform/entanglement/test/actions/CopyActionSpec.js +++ b/platform/entanglement/test/actions/CopyActionSpec.js @@ -44,6 +44,7 @@ define( notificationService, notification, dialogService, + mockDialog, mockLog, abstractComposePromise, progress = {phase: "copying", totalObjects: 10, processed: 1}; @@ -120,9 +121,12 @@ define( .andReturn(locationServicePromise); dialogService = jasmine.createSpyObj('dialogService', - ['showBlockingMessage', 'dismiss'] + ['showBlockingMessage'] ); + mockDialog = jasmine.createSpyObj("dialog", ["dismiss"]); + dialogService.showBlockingMessage.andReturn(mockDialog); + notification = jasmine.createSpyObj('notification', ['dismiss', 'model'] ); From 59e18b9a798cc47669b41aab243ad1bc75e7f9f4 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 30 Jun 2016 14:44:39 -0700 Subject: [PATCH 145/167] [Search] Amended ClickAwayController to trigger digest via instead of . Fixes #1065 --- platform/commonUI/general/bundle.js | 2 +- .../src/controllers/ClickAwayController.js | 4 ++-- .../test/controllers/ClickAwayControllerSpec.js | 16 +++++++--------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/platform/commonUI/general/bundle.js b/platform/commonUI/general/bundle.js index a7dccb0326..39f7631a55 100644 --- a/platform/commonUI/general/bundle.js +++ b/platform/commonUI/general/bundle.js @@ -259,7 +259,7 @@ define([ "implementation": ClickAwayController, "depends": [ "$document", - "$timeout" + "$scope" ] }, { diff --git a/platform/commonUI/general/src/controllers/ClickAwayController.js b/platform/commonUI/general/src/controllers/ClickAwayController.js index 18d9ca41c5..e8eee318e2 100644 --- a/platform/commonUI/general/src/controllers/ClickAwayController.js +++ b/platform/commonUI/general/src/controllers/ClickAwayController.js @@ -34,7 +34,7 @@ define( * @param $scope the scope in which this controller is active * @param $document the document element, injected by Angular */ - function ClickAwayController($document, $timeout) { + function ClickAwayController($document, $scope) { var self = this; this.state = false; @@ -44,7 +44,7 @@ define( // `clickaway` action occurs after `toggle` if `toggle` is // triggered by a click/mouseup. this.clickaway = function () { - $timeout(function () { + $scope.$apply(function () { self.deactivate(); }); }; diff --git a/platform/commonUI/general/test/controllers/ClickAwayControllerSpec.js b/platform/commonUI/general/test/controllers/ClickAwayControllerSpec.js index e2b9f62c91..bb9209014f 100644 --- a/platform/commonUI/general/test/controllers/ClickAwayControllerSpec.js +++ b/platform/commonUI/general/test/controllers/ClickAwayControllerSpec.js @@ -26,7 +26,7 @@ define( describe("The click-away controller", function () { var mockDocument, - mockTimeout, + mockScope, controller; beforeEach(function () { @@ -34,10 +34,11 @@ define( "$document", ["on", "off"] ); - mockTimeout = jasmine.createSpy('timeout'); + mockScope = jasmine.createSpyObj('$scope', ['$apply']); + controller = new ClickAwayController( mockDocument, - mockTimeout + mockScope ); }); @@ -77,18 +78,15 @@ define( }); it("deactivates and detaches listener on document click", function () { - var callback, timeout; + var callback, apply; controller.setState(true); callback = mockDocument.on.mostRecentCall.args[1]; callback(); - timeout = mockTimeout.mostRecentCall.args[0]; - timeout(); + apply = mockScope.$apply.mostRecentCall.args[0]; + apply(); expect(controller.isActive()).toEqual(false); expect(mockDocument.off).toHaveBeenCalledWith("mouseup", callback); }); - - - }); } ); From 12b554495995838d6477c3d5e775661fd9e3526c Mon Sep 17 00:00:00 2001 From: pacozaa Date: Sat, 9 Jul 2016 20:49:05 +0700 Subject: [PATCH 146/167] [Documentation] Edit as Reqeust in #1044 comment --- README.md | 69 +++++++++++++++---------------------------------------- 1 file changed, 19 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index ec21b6565a..b81e441f13 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,39 @@ # Open MCT -Open MCT is a next-generation mission control framework being developed at the NASA Ames Research Center in Silicon Valley. Web-based, for desktop and mobile. +Open MCT is a next-generation mission control framework for visualization of data on desktop and mobile devices. It is developed at NASA's Ames Research Center, and is being used by NASA for data analysis of spacecraft missions, as well as planning and operation of experimental rover systems. As a generalizable and open source framework, Open MCT could be used as the basis for building applications for planning, operation, and analysis of any systems producing telemetry data. -Please visit our [Official Site](https://nasa.github.io/openmct/) +Please visit our [Official Site](https://nasa.github.io/openmct/) and [Getting Started Guide](https://nasa.github.io/openmct/getting-started/) -##How is NASA Using Open MCT? +## See Open MCT in Action -Software based on Open MCT is being used for mission planning and operations in the lead up to the [Resource Prospector mission](https://www.nasa.gov/resource-prospector) and at NASA's Jet Propulsion Laboratory to view data from the Curiosity Rover. - -##Features - - - Support planning and operations of any system that produces telemetry - - Support space missions - - Visualize Data - - Streaming Data - - Historical Data - - Imagery - - Timelines - - Procedures - - etc. - -##See Open MCT in Action - -Do you want to see how Open MCT work? Try our demo. -[LIVE DEMO](https://openmct-demo.herokuapp.com/) +Try Open MCT now with our [live demo](https://openmct-demo.herokuapp.com/). ![Demo](https://nasa.github.io/openmct/static/res/images/Open-MCT.Browse.Layout.Mars-Weather-1.jpg) -##Getting Started +## Documentation -Here is how to run Open MCT in you local machine. +Check our [Documentation on website](https://nasa.github.io/openmct/documentation/). -1. Download or Clone Open MCT - `git clone https://github.com/nasa/openmct.git` +You can also build it locally. -2. Install Development Dependencies - `npm install` +### Building the Open MCT Documentation locally +Open MCT's documentation is generated by an +[npm](https://www.npmjs.com/)-based build. It has additional dependencies that +may not be available on every platform and thus is not covered in the standard +npm install. Ensure your system has [libcairo](http://cairographics.org/) +installed and then run the following commands: -3. Run on your local machine - `npm start` +* `npm install` +* `npm install canvas nomnoml` +* `npm run docs` -4. Open your web browser and go to http://localhost:8080/ +Documentation will be generated in `target/docs`. -5. Wait for splash screen finish then you should be able to play with Open MCT. - -For more information on building and running Open MCT, please see our getting started guide - https://nasa.github.io/openmct/getting-started/ - -## Build +## Deploying Open MCT Open MCT is built using [`npm`](http://npmjs.com/) and [`gulp`](http://gulpjs.com/). -To build: +To build Open MCT for deployment: `npm run prepublish` @@ -64,20 +47,6 @@ instance (e.g. by starting an HTTP server in that directory), including: Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js). -### Building Documentation - -Open MCT's documentation is generated by an -[npm](https://www.npmjs.com/)-based build. It has additional dependencies that -may not be available on every platform and thus is not covered in the standard -npm install. Ensure your system has [libcairo](http://cairographics.org/) -installed and then run the following commands: - -* `npm install` -* `npm install canvas nomnoml` -* `npm run docs` - -Documentation will be generated in `target/docs`. - ## Bundles A bundle is a group of software components (including source code, declared From c8898ac6aa5a8a3c619b3149fcb5f5f7a2144d9b Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 12 Jul 2016 16:21:58 -0700 Subject: [PATCH 147/167] [Documentation] Updated copyright statement. Fixes #1081 --- LICENSES.md | 8 +++--- build-docs.sh | 6 ++--- docs/gendocs.js | 6 ++--- docs/src/design/planning/APIRefactor.md | 16 ++++++------ docs/src/design/proposals/APIRedesign.md | 26 +++++++++---------- example/README.md | 2 +- example/builtins/bundle.js | 6 ++--- example/builtins/res/templates/example.html | 6 ++--- example/builtins/src/ExampleController.js | 6 ++--- example/builtins/src/ExampleDirective.js | 6 ++--- example/builtins/src/ExampleService.js | 6 ++--- example/composite/bundle.js | 6 ++--- example/composite/src/SomeAggregator.js | 6 ++--- example/composite/src/SomeDecorator.js | 6 ++--- example/composite/src/SomeOtherDecorator.js | 6 ++--- example/composite/src/SomeOtherExample.js | 6 ++--- example/composite/src/SomeOtherProvider.js | 6 ++--- example/composite/src/SomeProvider.js | 6 ++--- example/eventGenerator/bundle.js | 6 ++--- example/eventGenerator/src/EventTelemetry.js | 6 ++--- .../src/EventTelemetryProvider.js | 6 ++--- example/export/ExportTelemetryAsCSVAction.js | 6 ++--- example/export/bundle.js | 6 ++--- example/extensions/bundle.js | 6 ++--- example/extensions/src/SomeExample.js | 6 ++--- example/forms/bundle.js | 6 ++--- example/forms/res/templates/exampleForm.html | 6 ++--- example/forms/src/ExampleFormController.js | 6 ++--- example/generator/bundle.js | 6 ++--- example/generator/src/SinewaveConstants.js | 6 ++--- example/generator/src/SinewaveDeltaFormat.js | 6 ++--- .../generator/src/SinewaveLimitCapability.js | 6 ++--- .../src/SinewaveTelemetryProvider.js | 6 ++--- .../generator/src/SinewaveTelemetrySeries.js | 6 ++--- example/identity/bundle.js | 6 ++--- .../identity/src/ExampleIdentityService.js | 6 ++--- example/imagery/bundle.js | 6 ++--- example/imagery/src/ImageTelemetry.js | 6 ++--- example/imagery/src/ImageTelemetryProvider.js | 6 ++--- example/mobile/bundle.js | 6 ++--- example/mobile/res/sass/mobile-example.scss | 6 ++--- example/msl/bundle.js | 6 ++--- example/msl/src/MSLDataDictionary.js | 6 ++--- example/msl/src/RemsTelemetryInitializer.js | 6 ++--- example/msl/src/RemsTelemetryModelProvider.js | 6 ++--- example/msl/src/RemsTelemetryProvider.js | 6 ++--- example/msl/src/RemsTelemetrySeries.js | 6 ++--- example/msl/src/RemsTelemetryServerAdapter.js | 6 ++--- example/notifications/bundle.js | 6 ++--- .../src/DialogLaunchController.js | 6 ++--- .../src/DialogLaunchIndicator.js | 6 ++--- .../src/NotificationLaunchController.js | 6 ++--- .../src/NotificationLaunchIndicator.js | 6 ++--- example/persistence/bundle.js | 6 ++--- .../src/BrowserPersistenceProvider.js | 6 ++--- example/plotOptions/bundle.js | 6 ++--- example/policy/bundle.js | 6 ++--- example/policy/src/ExamplePolicy.js | 6 ++--- example/profiling/bundle.js | 6 ++--- example/profiling/src/DigestIndicator.js | 6 ++--- example/profiling/src/WatchIndicator.js | 6 ++--- example/scratchpad/bundle.js | 6 ++--- .../src/ScratchPersistenceProvider.js | 6 ++--- example/taxonomy/bundle.js | 6 ++--- .../src/ExampleTaxonomyModelProvider.js | 6 ++--- example/worker/bundle.js | 6 ++--- example/worker/src/FibonacciIndicator.js | 6 ++--- gulpfile.js | 6 ++--- index.html | 6 ++--- karma.conf.js | 6 ++--- main.js | 6 ++--- platform/README.md | 2 +- platform/commonUI/README.md | 2 +- platform/commonUI/about/bundle.js | 8 +++--- .../about/res/templates/about-dialog.html | 12 ++++----- .../about/res/templates/about-logo.html | 6 ++--- .../about/res/templates/app-logo.html | 6 ++--- .../about/res/templates/license-apache.html | 6 ++--- .../about/res/templates/license-mit.html | 6 ++--- .../res/templates/licenses-export-md.html | 8 +++--- .../about/res/templates/licenses.html | 6 ++--- .../about/res/templates/overlay-about.html | 6 ++--- .../commonUI/about/src/AboutController.js | 8 +++--- .../commonUI/about/src/LicenseController.js | 6 ++--- platform/commonUI/about/src/LogoController.js | 6 ++--- .../about/test/AboutControllerSpec.js | 6 ++--- .../about/test/LicenseControllerSpec.js | 6 ++--- .../commonUI/about/test/LogoControllerSpec.js | 6 ++--- platform/commonUI/browse/bundle.js | 6 ++--- .../browse/res/templates/back-arrow.html | 6 ++--- .../browse/res/templates/browse-object.html | 6 ++--- .../commonUI/browse/res/templates/browse.html | 6 ++--- .../templates/browse/inspector-region.html | 6 ++--- .../res/templates/browse/object-header.html | 6 ++--- .../templates/browse/object-properties.html | 6 ++--- .../browse/res/templates/items/grid-item.html | 6 ++--- .../browse/res/templates/items/items.html | 6 ++--- .../browse/res/templates/menu-arrow.html | 6 ++--- .../browse/res/templates/view-object.html | 6 ++--- .../commonUI/browse/src/BrowseController.js | 6 ++--- .../browse/src/BrowseObjectController.js | 6 ++--- .../commonUI/browse/src/InspectorRegion.js | 6 ++--- .../browse/src/MenuArrowController.js | 6 ++--- .../commonUI/browse/src/PaneController.js | 6 ++--- .../browse/src/navigation/NavigateAction.js | 6 ++--- .../src/navigation/NavigationService.js | 6 ++--- .../src/navigation/OrphanNavigationHandler.js | 6 ++--- .../browse/src/windowing/FullscreenAction.js | 6 ++--- .../browse/src/windowing/NewTabAction.js | 6 ++--- .../browse/src/windowing/WindowTitler.js | 6 ++--- .../browse/test/BrowseControllerSpec.js | 6 ++--- .../browse/test/BrowseObjectControllerSpec.js | 6 ++--- .../browse/test/InspectorRegionSpec.js | 6 ++--- .../browse/test/MenuArrowControllerSpec.js | 6 ++--- .../browse/test/PaneControllerSpec.js | 6 ++--- .../test/navigation/NavigateActionSpec.js | 6 ++--- .../test/navigation/NavigationServiceSpec.js | 6 ++--- .../navigation/OrphanNavigationHandlerSpec.js | 6 ++--- .../test/windowing/FullscreenActionSpec.js | 6 ++--- .../browse/test/windowing/NewTabActionSpec.js | 6 ++--- .../browse/test/windowing/WindowTitlerSpec.js | 6 ++--- platform/commonUI/dialog/bundle.js | 6 ++--- .../commonUI/dialog/res/templates/dialog.html | 6 ++--- .../templates/overlay-blocking-message.html | 6 ++--- .../dialog/res/templates/overlay-dialog.html | 6 ++--- .../dialog/res/templates/overlay-options.html | 6 ++--- .../dialog/res/templates/overlay.html | 6 ++--- platform/commonUI/dialog/src/DialogService.js | 6 ++--- .../commonUI/dialog/src/OverlayService.js | 6 ++--- .../commonUI/dialog/test/DialogServiceSpec.js | 6 ++--- .../dialog/test/OverlayServiceSpec.js | 6 ++--- platform/commonUI/edit/bundle.js | 6 ++--- .../res/templates/create/create-button.html | 6 ++--- .../res/templates/create/create-menu.html | 6 ++--- .../edit/res/templates/create/locator.html | 6 ++--- .../res/templates/edit-action-buttons.html | 6 ++--- .../edit/res/templates/edit-object.html | 6 ++--- .../commonUI/edit/res/templates/elements.html | 6 ++--- .../commonUI/edit/res/templates/library.html | 6 ++--- .../edit/res/templates/topbar-edit.html | 6 ++--- .../commonUI/edit/src/actions/CancelAction.js | 6 ++--- .../commonUI/edit/src/actions/EditAction.js | 6 ++--- .../edit/src/actions/EditAndComposeAction.js | 6 ++--- .../edit/src/actions/PropertiesAction.js | 6 ++--- .../edit/src/actions/PropertiesDialog.js | 6 ++--- .../commonUI/edit/src/actions/RemoveAction.js | 6 ++--- .../commonUI/edit/src/actions/SaveAction.js | 6 ++--- .../commonUI/edit/src/actions/SaveAsAction.js | 6 ++--- .../edit/src/capabilities/EditorCapability.js | 6 ++--- .../TransactionCapabilityDecorator.js | 6 ++--- .../TransactionalPersistenceCapability.js | 6 ++--- .../src/controllers/EditActionController.js | 6 ++--- .../src/controllers/EditObjectController.js | 6 ++--- .../src/controllers/EditPanesController.js | 6 ++--- .../src/controllers/ElementsController.js | 6 ++--- .../commonUI/edit/src/creation/AddAction.js | 6 ++--- .../edit/src/creation/AddActionProvider.js | 6 ++--- .../edit/src/creation/CreateAction.js | 6 ++--- .../edit/src/creation/CreateActionProvider.js | 6 ++--- .../edit/src/creation/CreateMenuController.js | 6 ++--- .../edit/src/creation/CreateWizard.js | 6 ++--- .../edit/src/creation/CreationPolicy.js | 6 ++--- .../edit/src/creation/CreationService.js | 6 ++--- .../edit/src/creation/LocatorController.js | 6 ++--- .../edit/src/directives/MCTBeforeUnload.js | 6 ++--- .../edit/src/policies/EditActionPolicy.js | 6 ++--- .../policies/EditContextualActionPolicy.js | 6 ++--- .../edit/src/policies/EditNavigationPolicy.js | 6 ++--- .../edit/src/policies/EditableLinkPolicy.js | 6 ++--- .../edit/src/policies/EditableMovePolicy.js | 6 ++--- .../edit/src/policies/EditableViewPolicy.js | 6 ++--- .../edit/src/representers/EditRepresenter.js | 6 ++--- .../edit/src/representers/EditToolbar.js | 6 ++--- .../representers/EditToolbarRepresenter.js | 6 ++--- .../src/representers/EditToolbarSelection.js | 6 ++--- .../edit/src/services/TransactionService.js | 6 ++--- .../edit/test/actions/CancelActionSpec.js | 6 ++--- .../edit/test/actions/EditActionSpec.js | 6 ++--- .../test/actions/EditAndComposeActionSpec.js | 6 ++--- .../edit/test/actions/PropertiesActionSpec.js | 6 ++--- .../edit/test/actions/PropertiesDialogSpec.js | 6 ++--- .../edit/test/actions/RemoveActionSpec.js | 6 ++--- .../edit/test/actions/SaveActionSpec.js | 6 ++--- .../edit/test/actions/SaveAsActionSpec.js | 6 ++--- .../test/capabilities/EditorCapabilitySpec.js | 6 ++--- .../TransactionCapabilityDecoratorSpec.js | 6 ++--- .../TransactionalPersistenceCapabilitySpec.js | 6 ++--- .../controllers/EditActionControllerSpec.js | 6 ++--- .../test/controllers/EditControllerSpec.js | 6 ++--- .../controllers/EditPanesControllerSpec.js | 6 ++--- .../controllers/ElementsControllerSpec.js | 6 ++--- .../test/creation/AddActionProviderSpec.js | 6 ++--- .../test/creation/CreateActionProviderSpec.js | 6 ++--- .../edit/test/creation/CreateActionSpec.js | 6 ++--- .../test/creation/CreateMenuControllerSpec.js | 6 ++--- .../edit/test/creation/CreateWizardSpec.js | 6 ++--- .../edit/test/creation/CreationPolicySpec.js | 6 ++--- .../edit/test/creation/CreationServiceSpec.js | 6 ++--- .../test/creation/LocatorControllerSpec.js | 6 ++--- .../test/directives/MCTBeforeUnloadSpec.js | 6 ++--- .../test/policies/EditActionPolicySpec.js | 6 ++--- .../EditContextualActionPolicySpec.js | 6 ++--- .../test/policies/EditableViewPolicySpec.js | 6 ++--- .../test/representers/EditRepresenterSpec.js | 6 ++--- .../EditToolbarRepresenterSpec.js | 6 ++--- .../representers/EditToolbarSelectionSpec.js | 6 ++--- .../edit/test/representers/EditToolbarSpec.js | 6 ++--- .../test/services/TransactionServiceSpec.js | 6 ++--- platform/commonUI/formats/bundle.js | 6 ++--- .../commonUI/formats/src/FormatProvider.js | 6 ++--- .../commonUI/formats/src/UTCTimeFormat.js | 6 ++--- .../formats/test/FormatProviderSpec.js | 6 ++--- .../formats/test/UTCTimeFormatSpec.js | 6 ++--- platform/commonUI/general/bundle.js | 6 ++--- .../icomoon.io-WTD-symbols-project.json | 2 +- .../commonUI/general/res/sass/_about.scss | 6 ++--- .../general/res/sass/_archetypes.scss | 6 ++--- .../commonUI/general/res/sass/_autoflow.scss | 6 ++--- .../commonUI/general/res/sass/_badges.scss | 6 ++--- .../commonUI/general/res/sass/_constants.scss | 6 ++--- .../commonUI/general/res/sass/_effects.scss | 6 ++--- .../general/res/sass/_fixed-position.scss | 6 ++--- .../commonUI/general/res/sass/_global.scss | 6 ++--- .../commonUI/general/res/sass/_icons.scss | 6 ++--- .../commonUI/general/res/sass/_iframe.scss | 6 ++--- .../commonUI/general/res/sass/_inspector.scss | 6 ++--- .../general/res/sass/_logo-and-bg.scss | 6 ++--- platform/commonUI/general/res/sass/_main.scss | 6 ++--- .../commonUI/general/res/sass/_mixins.scss | 6 ++--- .../general/res/sass/_object-label.scss | 6 ++--- platform/commonUI/general/res/sass/_text.scss | 6 ++--- .../general/res/sass/controls/_buttons.scss | 6 ++--- .../res/sass/controls/_color-palette.scss | 6 ++--- .../general/res/sass/controls/_controls.scss | 6 ++--- .../general/res/sass/controls/_lists.scss | 6 ++--- .../general/res/sass/controls/_menus.scss | 6 ++--- .../general/res/sass/controls/_messages.scss | 6 ++--- .../general/res/sass/controls/_ticks.scss | 6 ++--- .../general/res/sass/edit/_editor.scss | 6 ++--- .../res/sass/forms/_channel-selector.scss | 6 ++--- .../general/res/sass/forms/_datetime.scss | 6 ++--- .../general/res/sass/forms/_elems.scss | 6 ++--- .../general/res/sass/forms/_filter.scss | 6 ++--- .../general/res/sass/forms/_validation.scss | 6 ++--- .../general/res/sass/helpers/_bubbles.scss | 6 ++--- .../general/res/sass/helpers/_splitter.scss | 6 ++--- .../res/sass/helpers/_wait-spinner.scss | 6 ++--- .../general/res/sass/items/_item.scss | 6 ++--- .../general/res/sass/lists/_tabular.scss | 6 ++--- .../general/res/sass/mobile/_constants.scss | 6 ++--- .../general/res/sass/mobile/_item.scss | 6 ++--- .../general/res/sass/mobile/_layout.scss | 6 ++--- .../general/res/sass/mobile/_mixins.scss | 6 ++--- .../general/res/sass/mobile/_tree.scss | 6 ++--- .../res/sass/mobile/controls/_menus.scss | 6 ++--- .../commonUI/general/res/sass/openmct.scss | 6 ++--- .../general/res/sass/overlay/_overlay.scss | 6 ++--- .../general/res/sass/plots/_plots-main.scss | 6 ++--- .../general/res/sass/search/_search.scss | 6 ++--- .../general/res/sass/startup-base.scss | 6 ++--- .../commonUI/general/res/sass/tree/_tree.scss | 6 ++--- .../general/res/sass/user-environ/_frame.scss | 6 ++--- .../res/sass/user-environ/_layout.scss | 6 ++--- .../res/sass/user-environ/_tool-bar.scss | 6 ++--- .../res/sass/user-environ/_top-bar.scss | 6 ++--- .../general/res/templates/bottombar.html | 6 ++--- .../res/templates/containers/accordion.html | 6 ++--- .../res/templates/controls/action-button.html | 6 ++--- .../res/templates/controls/action-group.html | 6 ++--- .../templates/controls/datetime-field.html | 6 ++--- .../templates/controls/datetime-picker.html | 6 ++--- .../res/templates/controls/input-filter.html | 6 ++--- .../res/templates/controls/selector.html | 6 ++--- .../res/templates/controls/switcher.html | 6 ++--- .../templates/controls/time-controller.html | 6 ++--- .../general/res/templates/indicator.html | 6 ++--- .../commonUI/general/res/templates/label.html | 6 ++--- .../res/templates/menu/context-menu.html | 6 ++--- .../res/templates/object-inspector.html | 6 ++--- .../general/res/templates/subtree.html | 6 ++--- .../general/res/templates/tree-node.html | 6 ++--- .../commonUI/general/res/templates/tree.html | 6 ++--- .../general/res/templates/tree/wait-node.html | 6 ++--- .../general/src/SplashScreenManager.js | 6 ++--- .../commonUI/general/src/StyleSheetLoader.js | 6 ++--- .../src/controllers/ActionGroupController.js | 6 ++--- .../src/controllers/BannerController.js | 6 ++--- .../src/controllers/BottomBarController.js | 6 ++--- .../src/controllers/ClickAwayController.js | 6 ++--- .../src/controllers/ContextMenuController.js | 6 ++--- .../controllers/DateTimeFieldController.js | 6 ++--- .../controllers/DateTimePickerController.js | 6 ++--- .../src/controllers/GetterSetterController.js | 6 ++--- .../controllers/ObjectInspectorController.js | 6 ++--- .../src/controllers/SelectorController.js | 6 ++--- .../src/controllers/TimeRangeController.js | 6 ++--- .../src/controllers/ToggleController.js | 6 ++--- .../src/controllers/TreeNodeController.js | 6 ++--- .../src/controllers/ViewSwitcherController.js | 6 ++--- .../src/directives/MCTClickElsewhere.js | 6 ++--- .../general/src/directives/MCTContainer.js | 6 ++--- .../general/src/directives/MCTDrag.js | 6 ++--- .../general/src/directives/MCTPopup.js | 6 ++--- .../general/src/directives/MCTResize.js | 6 ++--- .../general/src/directives/MCTScroll.js | 6 ++--- .../general/src/directives/MCTSplitPane.js | 6 ++--- .../general/src/directives/MCTSplitter.js | 6 ++--- .../general/src/directives/MCTTree.js | 6 ++--- .../general/src/filters/ReverseFilter.js | 6 ++--- .../commonUI/general/src/services/Popup.js | 6 ++--- .../general/src/services/PopupService.js | 6 ++--- .../general/src/services/UrlService.js | 6 ++--- .../commonUI/general/src/ui/ToggleView.js | 6 ++--- .../commonUI/general/src/ui/TreeLabelView.js | 6 ++--- .../commonUI/general/src/ui/TreeNodeView.js | 6 ++--- platform/commonUI/general/src/ui/TreeView.js | 6 ++--- .../general/test/SplashScreenManagerSpec.js | 6 ++--- .../general/test/StyleSheetLoaderSpec.js | 6 ++--- .../controllers/ActionGroupControllerSpec.js | 6 ++--- .../controllers/BottomBarControllerSpec.js | 6 ++--- .../controllers/ClickAwayControllerSpec.js | 6 ++--- .../controllers/ContextMenuControllerSpec.js | 6 ++--- .../DateTimeFieldControllerSpec.js | 6 ++--- .../DateTimePickerControllerSpec.js | 6 ++--- .../controllers/GetterSetterControllerSpec.js | 6 ++--- .../ObjectInspectorControllerSpec.js | 6 ++--- .../controllers/SelectorControllerSpec.js | 6 ++--- .../controllers/TimeRangeControllerSpec.js | 6 ++--- .../test/controllers/ToggleControllerSpec.js | 6 ++--- .../controllers/TreeNodeControllerSpec.js | 6 ++--- .../controllers/ViewSwitcherControllerSpec.js | 6 ++--- .../test/directives/MCTClickElsewhereSpec.js | 6 ++--- .../test/directives/MCTContainerSpec.js | 6 ++--- .../general/test/directives/MCTDragSpec.js | 6 ++--- .../general/test/directives/MCTPopupSpec.js | 6 ++--- .../general/test/directives/MCTResizeSpec.js | 6 ++--- .../general/test/directives/MCTScrollSpec.js | 6 ++--- .../test/directives/MCTSplitPaneSpec.js | 6 ++--- .../test/directives/MCTSplitterSpec.js | 6 ++--- .../general/test/directives/MCTTreeSpec.js | 6 ++--- .../general/test/filters/ReverseFilterSpec.js | 6 ++--- .../general/test/services/PopupServiceSpec.js | 6 ++--- .../general/test/services/PopupSpec.js | 6 ++--- .../general/test/services/UrlServiceSpec.js | 6 ++--- .../commonUI/general/test/ui/TreeViewSpec.js | 6 ++--- platform/commonUI/inspect/bundle.js | 6 ++--- platform/commonUI/inspect/res/infobubble.html | 6 ++--- .../inspect/res/templates/info-button.html | 6 ++--- .../commonUI/inspect/src/InfoConstants.js | 6 ++--- .../inspect/src/gestures/InfoButtonGesture.js | 6 ++--- .../inspect/src/gestures/InfoGesture.js | 6 ++--- .../inspect/src/services/InfoService.js | 6 ++--- .../test/gestures/InfoButtonGestureSpec.js | 6 ++--- .../inspect/test/gestures/InfoGestureSpec.js | 6 ++--- .../inspect/test/services/InfoServiceSpec.js | 6 ++--- platform/commonUI/mobile/bundle.js | 6 ++--- platform/commonUI/mobile/src/AgentService.js | 6 ++--- .../commonUI/mobile/src/DeviceClassifier.js | 6 ++--- .../commonUI/mobile/src/DeviceMatchers.js | 6 ++--- platform/commonUI/mobile/src/MCTDevice.js | 6 ++--- .../commonUI/mobile/test/AgentServiceSpec.js | 6 ++--- .../mobile/test/DeviceClassifierSpec.js | 6 ++--- .../mobile/test/DeviceMatchersSpec.js | 6 ++--- .../commonUI/mobile/test/MCTDeviceSpec.js | 6 ++--- platform/commonUI/notification/bundle.js | 6 ++--- .../notification/src/NotificationIndicator.js | 6 ++--- .../src/NotificationIndicatorController.js | 6 ++--- .../notification/src/NotificationService.js | 6 ++--- .../NotificationIndicatorControllerSpec.js | 6 ++--- .../test/NotificationServiceSpec.js | 6 ++--- platform/commonUI/regions/bundle.js | 6 ++--- .../regions/src/EditableRegionPolicy.js | 6 ++--- .../regions/src/InspectorController.js | 6 ++--- platform/commonUI/regions/src/Region.js | 6 ++--- .../regions/test/EditableRegionPolicySpec.js | 6 ++--- .../regions/test/InspectorControllerSpec.js | 6 ++--- platform/commonUI/regions/test/RegionSpec.js | 6 ++--- platform/commonUI/themes/espresso/bundle.js | 6 ++--- .../espresso/res/sass/theme-espresso.scss | 6 ++--- platform/commonUI/themes/snow/bundle.js | 6 ++--- .../themes/snow/res/sass/theme-snow.scss | 6 ++--- platform/containment/bundle.js | 6 ++--- platform/containment/src/CapabilityTable.js | 6 ++--- .../containment/src/ComposeActionPolicy.js | 6 ++--- .../src/CompositionMutabilityPolicy.js | 6 ++--- platform/containment/src/CompositionPolicy.js | 6 ++--- platform/containment/src/ContainmentTable.js | 6 ++--- .../containment/test/CapabilityTableSpec.js | 6 ++--- .../test/ComposeActionPolicySpec.js | 6 ++--- .../test/CompositionMutabilityPolicySpec.js | 6 ++--- .../containment/test/CompositionPolicySpec.js | 6 ++--- .../containment/test/ContainmentTableSpec.js | 6 ++--- platform/core/README.md | 2 +- platform/core/bundle.js | 10 +++---- platform/core/src/actions/ActionAggregator.js | 6 ++--- platform/core/src/actions/ActionCapability.js | 6 ++--- platform/core/src/actions/ActionProvider.js | 6 ++--- .../src/actions/LoggingActionDecorator.js | 6 ++--- .../src/capabilities/CompositionCapability.js | 6 ++--- .../src/capabilities/ContextCapability.js | 6 ++--- .../capabilities/ContextualDomainObject.js | 6 ++--- .../capabilities/CoreCapabilityProvider.js | 6 ++--- .../src/capabilities/DelegationCapability.js | 6 ++--- .../capabilities/InstantiationCapability.js | 6 ++--- .../src/capabilities/MutationCapability.js | 6 ++--- .../src/capabilities/PersistenceCapability.js | 6 ++--- .../capabilities/RelationshipCapability.js | 6 ++--- platform/core/src/identifiers/Identifier.js | 6 ++--- .../src/identifiers/IdentifierProvider.js | 6 ++--- .../core/src/models/CachingModelDecorator.js | 6 ++--- .../core/src/models/MissingModelDecorator.js | 6 ++--- platform/core/src/models/ModelAggregator.js | 6 ++--- platform/core/src/models/ModelCacheService.js | 6 ++--- .../core/src/models/PersistedModelProvider.js | 6 ++--- platform/core/src/models/RootModelProvider.js | 6 ++--- .../core/src/models/StaticModelProvider.js | 6 ++--- platform/core/src/objects/DomainObjectImpl.js | 6 ++--- .../core/src/objects/DomainObjectProvider.js | 8 +++--- platform/core/src/services/Contextualize.js | 6 ++--- platform/core/src/services/Instantiate.js | 6 ++--- platform/core/src/services/Now.js | 6 ++--- platform/core/src/services/Throttle.js | 6 ++--- platform/core/src/services/Topic.js | 6 ++--- platform/core/src/types/MergeModels.js | 6 ++--- platform/core/src/types/TypeCapability.js | 6 ++--- platform/core/src/types/TypeImpl.js | 6 ++--- platform/core/src/types/TypeProperty.js | 6 ++--- .../core/src/types/TypePropertyConversion.js | 6 ++--- platform/core/src/types/TypeProvider.js | 8 +++--- platform/core/src/views/ViewCapability.js | 6 ++--- platform/core/src/views/ViewProvider.js | 6 ++--- .../core/test/actions/ActionAggregatorSpec.js | 6 ++--- .../core/test/actions/ActionCapabilitySpec.js | 6 ++--- .../core/test/actions/ActionProviderSpec.js | 6 ++--- .../actions/LoggingActionDecoratorSpec.js | 6 ++--- .../capabilities/CompositionCapabilitySpec.js | 6 ++--- .../capabilities/ContextCapabilitySpec.js | 6 ++--- .../ContextualDomainObjectSpec.js | 6 ++--- .../CoreCapabilityProviderSpec.js | 6 ++--- .../capabilities/DelegationCapabilitySpec.js | 6 ++--- .../InstantiationCapabilitySpec.js | 6 ++--- .../capabilities/MetadataCapabilitySpec.js | 6 ++--- .../capabilities/MutationCapabilitySpec.js | 6 ++--- .../capabilities/PersistenceCapabilitySpec.js | 6 ++--- .../RelationshipCapabilitySpec.js | 6 ++--- .../identifiers/IdentifierProviderSpec.js | 6 ++--- .../core/test/identifiers/IdentifierSpec.js | 6 ++--- .../test/models/CachingModelDecoratorSpec.js | 6 ++--- .../test/models/MissingModelDecoratorSpec.js | 6 ++--- .../core/test/models/ModelAggregatorSpec.js | 6 ++--- .../core/test/models/ModelCacheServiceSpec.js | 6 ++--- .../test/models/PersistedModelProviderSpec.js | 6 ++--- .../core/test/models/RootModelProviderSpec.js | 6 ++--- .../test/models/StaticModelProviderSpec.js | 6 ++--- .../test/objects/DomainObjectProviderSpec.js | 6 ++--- .../core/test/objects/DomainObjectSpec.js | 6 ++--- .../core/test/services/ContextualizeSpec.js | 6 ++--- .../core/test/services/InstantiateSpec.js | 6 ++--- platform/core/test/services/NowSpec.js | 6 ++--- platform/core/test/services/ThrottleSpec.js | 6 ++--- platform/core/test/services/TopicSpec.js | 6 ++--- platform/core/test/types/MergeModelsSpec.js | 6 ++--- .../core/test/types/TypeCapabilitySpec.js | 6 ++--- platform/core/test/types/TypeImplSpec.js | 6 ++--- .../test/types/TypePropertyConversionSpec.js | 6 ++--- platform/core/test/types/TypePropertySpec.js | 6 ++--- platform/core/test/types/TypeProviderSpec.js | 6 ++--- .../core/test/views/ViewCapabilitySpec.js | 6 ++--- platform/core/test/views/ViewProviderSpec.js | 6 ++--- platform/data/README.md | 2 +- platform/entanglement/bundle.js | 6 ++--- .../src/actions/AbstractComposeAction.js | 6 ++--- .../entanglement/src/actions/CopyAction.js | 6 ++--- .../src/actions/GoToOriginalAction.js | 6 ++--- .../entanglement/src/actions/LinkAction.js | 6 ++--- .../entanglement/src/actions/MoveAction.js | 6 ++--- .../src/actions/SetPrimaryLocationAction.js | 6 ++--- .../src/capabilities/LocationCapability.js | 6 ++--- .../entanglement/src/policies/CopyPolicy.js | 6 ++--- .../src/policies/CrossSpacePolicy.js | 6 ++--- .../entanglement/src/policies/MovePolicy.js | 6 ++--- .../entanglement/src/services/CopyService.js | 6 ++--- .../entanglement/src/services/CopyTask.js | 6 ++--- .../entanglement/src/services/LinkService.js | 6 ++--- .../src/services/LocatingCreationDecorator.js | 6 ++--- .../src/services/LocatingObjectDecorator.js | 6 ++--- .../src/services/LocationService.js | 6 ++--- .../entanglement/src/services/MoveService.js | 6 ++--- .../entanglement/test/ControlledPromise.js | 6 ++--- .../entanglement/test/DomainObjectFactory.js | 6 ++--- .../test/actions/AbstractComposeActionSpec.js | 6 ++--- .../test/actions/CopyActionSpec.js | 6 ++--- .../test/actions/GoToOriginalActionSpec.js | 6 ++--- .../test/actions/LinkActionSpec.js | 6 ++--- .../test/actions/MoveActionSpec.js | 6 ++--- .../actions/SetPrimaryLocationActionSpec.js | 6 ++--- .../capabilities/LocationCapabilitySpec.js | 6 ++--- .../test/policies/CopyPolicySpec.js | 6 ++--- .../test/policies/CrossSpacePolicySpec.js | 6 ++--- .../test/policies/MovePolicySpec.js | 6 ++--- .../test/services/CopyServiceSpec.js | 6 ++--- .../test/services/CopyTaskSpec.js | 6 ++--- .../test/services/LinkServiceSpec.js | 6 ++--- .../services/LocatingCreationDecoratorSpec.js | 6 ++--- .../services/LocatingObjectDecoratorSpec.js | 6 ++--- .../test/services/LocationServiceSpec.js | 6 ++--- .../test/services/MockCopyService.js | 6 ++--- .../test/services/MockLinkService.js | 6 ++--- .../test/services/MockMoveService.js | 6 ++--- .../test/services/MoveServiceSpec.js | 6 ++--- platform/execution/bundle.js | 6 ++--- platform/execution/src/WorkerService.js | 6 ++--- platform/execution/test/WorkerServiceSpec.js | 6 ++--- platform/exporters/ExportService.js | 6 ++--- platform/exporters/ExportServiceSpec.js | 6 ++--- platform/exporters/bundle.js | 6 ++--- platform/features/README.md | 2 +- platform/features/clock/bundle.js | 6 ++--- .../features/clock/res/templates/clock.html | 6 ++--- .../features/clock/res/templates/timer.html | 6 ++--- .../src/actions/AbstractStartTimerAction.js | 6 ++--- .../clock/src/actions/RestartTimerAction.js | 6 ++--- .../clock/src/actions/StartTimerAction.js | 6 ++--- .../clock/src/controllers/ClockController.js | 6 ++--- .../src/controllers/RefreshingController.js | 6 ++--- .../clock/src/controllers/TimerController.js | 6 ++--- .../clock/src/controllers/TimerFormatter.js | 6 ++--- .../clock/src/indicators/ClockIndicator.js | 6 ++--- .../clock/src/services/TickerService.js | 6 ++--- .../actions/AbstractStartTimerActionSpec.js | 6 ++--- .../test/actions/RestartTimerActionSpec.js | 6 ++--- .../test/actions/StartTimerActionSpec.js | 6 ++--- .../test/controllers/ClockControllerSpec.js | 6 ++--- .../controllers/RefreshingControllerSpec.js | 6 ++--- .../test/controllers/TimerControllerSpec.js | 6 ++--- .../test/controllers/TimerFormatterSpec.js | 6 ++--- .../test/indicators/ClockIndicatorSpec.js | 6 ++--- .../clock/test/services/TickerServiceSpec.js | 6 ++--- platform/features/conductor/bundle.js | 6 ++--- .../conductor/src/ConductorRepresenter.js | 6 ++--- .../conductor/src/ConductorService.js | 6 ++--- .../src/ConductorTelemetryDecorator.js | 6 ++--- .../features/conductor/src/TimeConductor.js | 6 ++--- .../test/ConductorRepresenterSpec.js | 6 ++--- .../conductor/test/ConductorServiceSpec.js | 6 ++--- .../test/ConductorTelemetryDecoratorSpec.js | 6 ++--- .../conductor/test/TestTimeConductor.js | 6 ++--- .../conductor/test/TimeConductorSpec.js | 6 ++--- platform/features/imagery/bundle.js | 6 ++--- .../src/controllers/ImageryController.js | 6 ++--- .../src/directives/MCTBackgroundImage.js | 6 ++--- .../imagery/src/policies/ImageryViewPolicy.js | 6 ++--- .../test/controllers/ImageryControllerSpec.js | 6 ++--- .../test/directives/MCTBackgroundImageSpec.js | 6 ++--- .../test/policies/ImageryViewPolicySpec.js | 6 ++--- platform/features/layout/bundle.js | 6 ++--- .../layout/res/templates/elements/box.html | 6 ++--- .../layout/res/templates/elements/image.html | 6 ++--- .../layout/res/templates/elements/line.html | 6 ++--- .../res/templates/elements/telemetry.html | 6 ++--- .../layout/res/templates/elements/text.html | 6 ++--- .../features/layout/res/templates/fixed.html | 6 ++--- .../features/layout/res/templates/frame.html | 6 ++--- .../features/layout/res/templates/layout.html | 6 ++--- .../features/layout/src/FixedController.js | 6 ++--- .../features/layout/src/FixedDragHandle.js | 6 ++--- platform/features/layout/src/FixedProxy.js | 6 ++--- .../layout/src/LayoutCompositionPolicy.js | 6 ++--- .../features/layout/src/LayoutController.js | 6 ++--- platform/features/layout/src/LayoutDrag.js | 6 ++--- .../layout/src/elements/AccessorMutator.js | 6 ++--- .../features/layout/src/elements/BoxProxy.js | 6 ++--- .../layout/src/elements/ElementFactory.js | 6 ++--- .../layout/src/elements/ElementProxies.js | 6 ++--- .../layout/src/elements/ElementProxy.js | 6 ++--- .../layout/src/elements/ImageProxy.js | 6 ++--- .../layout/src/elements/LineHandle.js | 6 ++--- .../features/layout/src/elements/LineProxy.js | 6 ++--- .../layout/src/elements/ResizeHandle.js | 6 ++--- .../layout/src/elements/TelemetryProxy.js | 6 ++--- .../features/layout/src/elements/TextProxy.js | 6 ++--- .../layout/test/FixedControllerSpec.js | 6 ++--- .../layout/test/FixedDragHandleSpec.js | 6 ++--- .../features/layout/test/FixedProxySpec.js | 6 ++--- .../test/LayoutCompositionPolicySpec.js | 6 ++--- .../layout/test/LayoutControllerSpec.js | 6 ++--- .../features/layout/test/LayoutDragSpec.js | 6 ++--- .../test/elements/AccessorMutatorSpec.js | 6 ++--- .../layout/test/elements/BoxProxySpec.js | 6 ++--- .../test/elements/ElementFactorySpec.js | 6 ++--- .../test/elements/ElementProxiesSpec.js | 6 ++--- .../layout/test/elements/ElementProxySpec.js | 6 ++--- .../layout/test/elements/ImageProxySpec.js | 6 ++--- .../layout/test/elements/LineHandleSpec.js | 6 ++--- .../layout/test/elements/LineProxySpec.js | 6 ++--- .../layout/test/elements/ResizeHandleSpec.js | 6 ++--- .../test/elements/TelemetryProxySpec.js | 6 ++--- .../layout/test/elements/TextProxySpec.js | 6 ++--- platform/features/pages/bundle.js | 6 ++--- platform/features/pages/res/iframe.html | 6 ++--- .../pages/src/EmbeddedPageController.js | 6 ++--- .../pages/test/EmbeddedPageControllerSpec.js | 6 ++--- platform/features/plot/bundle.js | 6 ++--- .../res/templates/plot-options-browse.html | 6 ++--- .../features/plot/res/templates/plot.html | 6 ++--- platform/features/plot/src/Canvas2DChart.js | 6 ++--- platform/features/plot/src/GLChart.js | 6 ++--- platform/features/plot/src/MCTChart.js | 6 ++--- platform/features/plot/src/PlotController.js | 6 ++--- .../plot/src/PlotOptionsController.js | 6 ++--- platform/features/plot/src/PlotOptionsForm.js | 6 ++--- platform/features/plot/src/SubPlot.js | 6 ++--- platform/features/plot/src/SubPlotFactory.js | 6 ++--- .../features/plot/src/elements/PlotAxis.js | 6 ++--- .../plot/src/elements/PlotLimitTracker.js | 6 ++--- .../features/plot/src/elements/PlotLine.js | 6 ++--- .../plot/src/elements/PlotLineBuffer.js | 6 ++--- .../features/plot/src/elements/PlotPalette.js | 6 ++--- .../plot/src/elements/PlotPanZoomStack.js | 6 ++--- .../src/elements/PlotPanZoomStackGroup.js | 6 ++--- .../plot/src/elements/PlotPosition.js | 6 ++--- .../plot/src/elements/PlotPreparer.js | 6 ++--- .../plot/src/elements/PlotSeriesWindow.js | 6 ++--- .../src/elements/PlotTelemetryFormatter.js | 6 ++--- .../plot/src/elements/PlotTickGenerator.js | 6 ++--- .../features/plot/src/elements/PlotUpdater.js | 6 ++--- .../plot/src/modes/PlotModeOptions.js | 6 ++--- .../plot/src/modes/PlotOverlayMode.js | 6 ++--- .../features/plot/src/modes/PlotStackMode.js | 6 ++--- .../plot/src/policies/PlotViewPolicy.js | 6 ++--- .../features/plot/test/Canvas2DChartSpec.js | 6 ++--- platform/features/plot/test/GLChartSpec.js | 6 ++--- platform/features/plot/test/MCTChartSpec.js | 6 ++--- .../features/plot/test/PlotControllerSpec.js | 6 ++--- .../plot/test/PlotOptionsControllerSpec.js | 6 ++--- .../features/plot/test/PlotOptionsFormSpec.js | 6 ++--- .../features/plot/test/SubPlotFactorySpec.js | 6 ++--- platform/features/plot/test/SubPlotSpec.js | 6 ++--- .../plot/test/elements/PlotAxisSpec.js | 6 ++--- .../test/elements/PlotLimitTrackerSpec.js | 6 ++--- .../plot/test/elements/PlotLineBufferSpec.js | 6 ++--- .../plot/test/elements/PlotLineSpec.js | 6 ++--- .../plot/test/elements/PlotPaletteSpec.js | 6 ++--- .../elements/PlotPanZoomStackGroupSpec.js | 6 ++--- .../test/elements/PlotPanZoomStackSpec.js | 6 ++--- .../plot/test/elements/PlotPositionSpec.js | 6 ++--- .../plot/test/elements/PlotPreparerSpec.js | 6 ++--- .../test/elements/PlotSeriesWindowSpec.js | 6 ++--- .../elements/PlotTelemetryFormatterSpec.js | 6 ++--- .../test/elements/PlotTickGeneratorSpec.js | 6 ++--- .../plot/test/elements/PlotUpdaterSpec.js | 6 ++--- .../plot/test/modes/PlotModeOptionsSpec.js | 6 ++--- .../plot/test/modes/PlotOverlayModeSpec.js | 6 ++--- .../plot/test/modes/PlotStackModeSpec.js | 6 ++--- .../plot/test/policies/PlotViewPolicySpec.js | 6 ++--- platform/features/static-markup/bundle.js | 6 ++--- platform/features/table/bundle.js | 6 ++--- platform/features/table/res/sass/table.scss | 6 ++--- .../res/templates/table-options-edit.html | 6 ++--- platform/features/table/src/DomainColumn.js | 6 ++--- platform/features/table/src/NameColumn.js | 6 ++--- platform/features/table/src/RangeColumn.js | 6 ++--- .../features/table/src/TableConfiguration.js | 6 ++--- .../controllers/HistoricalTableController.js | 6 ++--- .../controllers/RealtimeTableController.js | 6 ++--- .../src/controllers/TableOptionsController.js | 6 ++--- .../controllers/TelemetryTableController.js | 6 ++--- .../features/table/src/directives/MCTTable.js | 6 ++--- .../features/table/test/DomainColumnSpec.js | 6 ++--- .../features/table/test/NameColumnSpec.js | 6 ++--- .../features/table/test/RangeColumnSpec.js | 6 ++--- .../table/test/TableConfigurationSpec.js | 6 ++--- .../HistoricalTableControllerSpec.js | 6 ++--- .../controllers/MCTTableControllerSpec.js | 6 ++--- .../RealtimeTableControllerSpec.js | 6 ++--- .../controllers/TableOptionsControllerSpec.js | 6 ++--- platform/features/timeline/bundle.js | 6 ++--- .../res/sass/_constants-espresso.scss | 6 ++--- .../timeline/res/sass/_constants-snow.scss | 6 ++--- .../timeline/res/sass/_constants.scss | 6 ++--- .../timeline/res/sass/_timeline-thematic.scss | 6 ++--- .../timeline/res/sass/_timelines.scss | 6 ++--- .../timeline/res/sass/timeline-espresso.scss | 6 ++--- .../timeline/res/sass/timeline-snow.scss | 6 ++--- .../features/timeline/res/sass/timeline.scss | 6 ++--- .../res/templates/activity-gantt.html | 6 ++--- .../res/templates/controls/datetime.html | 6 ++--- .../timeline/res/templates/legend-item.html | 6 ++--- .../res/templates/resource-graph-labels.html | 6 ++--- .../res/templates/resource-graphs.html | 6 ++--- .../templates/tabular-swimlane-cols-data.html | 6 ++--- .../templates/tabular-swimlane-cols-tree.html | 6 ++--- .../timeline/res/templates/ticks.html | 6 ++--- .../timeline/res/templates/timeline.html | 6 ++--- .../timeline/res/templates/values.html | 6 ++--- .../timeline/src/TimelineConstants.js | 6 ++--- .../timeline/src/TimelineFormatter.js | 6 ++--- .../timeline/src/actions/CompositionColumn.js | 6 ++--- .../src/actions/ExportTimelineAsCSVAction.js | 6 ++--- .../src/actions/ExportTimelineAsCSVTask.js | 6 ++--- .../features/timeline/src/actions/IdColumn.js | 6 ++--- .../timeline/src/actions/MetadataColumn.js | 6 ++--- .../timeline/src/actions/ModeColumn.js | 6 ++--- .../src/actions/TimelineColumnizer.js | 6 ++--- .../timeline/src/actions/TimelineTraverser.js | 6 ++--- .../timeline/src/actions/TimespanColumn.js | 6 ++--- .../timeline/src/actions/UtilizationColumn.js | 6 ++--- .../src/capabilities/ActivityTimespan.js | 6 ++--- .../ActivityTimespanCapability.js | 6 ++--- .../src/capabilities/ActivityUtilization.js | 6 ++--- .../src/capabilities/CostCapability.js | 6 ++--- .../src/capabilities/CumulativeGraph.js | 6 ++--- .../src/capabilities/GraphCapability.js | 6 ++--- .../src/capabilities/ResourceGraph.js | 6 ++--- .../src/capabilities/TimelineTimespan.js | 6 ++--- .../TimelineTimespanCapability.js | 6 ++--- .../src/capabilities/TimelineUtilization.js | 6 ++--- .../src/capabilities/UtilizationCapability.js | 6 ++--- .../ActivityModeValuesController.js | 6 ++--- .../src/controllers/TimelineController.js | 6 ++--- .../controllers/TimelineDateTimeController.js | 6 ++--- .../controllers/TimelineGanttController.js | 6 ++--- .../controllers/TimelineGraphController.js | 6 ++--- .../controllers/TimelineTableController.js | 6 ++--- .../src/controllers/TimelineTickController.js | 6 ++--- .../src/controllers/TimelineZoomController.js | 6 ++--- .../drag/TimelineDragHandleFactory.js | 6 ++--- .../controllers/drag/TimelineDragHandler.js | 6 ++--- .../controllers/drag/TimelineDragPopulator.js | 6 ++--- .../src/controllers/drag/TimelineEndHandle.js | 6 ++--- .../controllers/drag/TimelineMoveHandle.js | 6 ++--- .../controllers/drag/TimelineSnapHandler.js | 6 ++--- .../controllers/drag/TimelineStartHandle.js | 6 ++--- .../src/controllers/graph/TimelineGraph.js | 6 ++--- .../graph/TimelineGraphPopulator.js | 6 ++--- .../graph/TimelineGraphRenderer.js | 6 ++--- .../swimlane/TimelineColorAssigner.js | 6 ++--- .../src/controllers/swimlane/TimelineProxy.js | 6 ++--- .../controllers/swimlane/TimelineSwimlane.js | 6 ++--- .../swimlane/TimelineSwimlaneDecorator.js | 6 ++--- .../swimlane/TimelineSwimlaneDropHandler.js | 6 ++--- .../swimlane/TimelineSwimlanePopulator.js | 6 ++--- .../src/directives/MCTSwimlaneDrag.js | 6 ++--- .../src/directives/MCTSwimlaneDrop.js | 6 ++--- .../src/directives/SwimlaneDragConstants.js | 6 ++--- .../timeline/src/services/ObjectLoader.js | 6 ++--- .../timeline/test/TimelineConstantsSpec.js | 6 ++--- .../timeline/test/TimelineFormatterSpec.js | 6 ++--- .../test/actions/CompositionColumnSpec.js | 6 ++--- .../actions/ExportTimelineAsCSVActionSpec.js | 6 ++--- .../actions/ExportTimelineAsCSVTaskSpec.js | 6 ++--- .../timeline/test/actions/IdColumnSpec.js | 6 ++--- .../test/actions/MetadataColumnSpec.js | 6 ++--- .../timeline/test/actions/ModeColumnSpec.js | 6 ++--- .../test/actions/TimelineColumnizerSpec.js | 6 ++--- .../test/actions/TimelineTraverserSpec.js | 6 ++--- .../test/actions/TimespanColumnSpec.js | 6 ++--- .../ActivityTimespanCapabilitySpec.js | 6 ++--- .../test/capabilities/ActivityTimespanSpec.js | 6 ++--- .../capabilities/ActivityUtilizationSpec.js | 6 ++--- .../test/capabilities/CostCapabilitySpec.js | 6 ++--- .../test/capabilities/CumulativeGraphSpec.js | 6 ++--- .../test/capabilities/GraphCapabilitySpec.js | 6 ++--- .../test/capabilities/ResourceGraphSpec.js | 6 ++--- .../TimelineTimespanCapabilitySpec.js | 6 ++--- .../test/capabilities/TimelineTimespanSpec.js | 6 ++--- .../capabilities/TimelineUtilizationSpec.js | 6 ++--- .../capabilities/UtilizationCapabilitySpec.js | 6 ++--- .../ActivityModeValuesControllerSpec.js | 6 ++--- .../controllers/TimelineControllerSpec.js | 6 ++--- .../TimelineDateTimeControllerSpec.js | 6 ++--- .../TimelineGanttControllerSpec.js | 6 ++--- .../TimelineGraphControllerSpec.js | 6 ++--- .../TimelineTableControllerSpec.js | 6 ++--- .../controllers/TimelineTickControllerSpec.js | 6 ++--- .../controllers/TimelineZoomControllerSpec.js | 6 ++--- .../drag/TimelineDragHandleFactorySpec.js | 6 ++--- .../drag/TimelineDragHandlerSpec.js | 6 ++--- .../drag/TimelineDragPopulatorSpec.js | 6 ++--- .../controllers/drag/TimelineEndHandleSpec.js | 6 ++--- .../drag/TimelineMoveHandleSpec.js | 6 ++--- .../drag/TimelineSnapHandlerSpec.js | 6 ++--- .../drag/TimelineStartHandleSpec.js | 6 ++--- .../graph/TimelineGraphPopulatorSpec.js | 6 ++--- .../graph/TimelineGraphRendererSpec.js | 6 ++--- .../controllers/graph/TimelineGraphSpec.js | 6 ++--- .../swimlane/TimelineColorAssignerSpec.js | 6 ++--- .../controllers/swimlane/TimelineProxySpec.js | 6 ++--- .../swimlane/TimelineSwimlaneDecoratorSpec.js | 6 ++--- .../TimelineSwimlaneDropHandlerSpec.js | 6 ++--- .../swimlane/TimelineSwimlanePopulatorSpec.js | 6 ++--- .../swimlane/TimelineSwimlaneSpec.js | 6 ++--- .../test/directives/MCTSwimlaneDragSpec.js | 6 ++--- .../test/directives/MCTSwimlaneDropSpec.js | 6 ++--- .../directives/SwimlaneDragConstantsSpec.js | 6 ++--- .../test/services/ObjectLoaderSpec.js | 6 ++--- platform/forms/README.md | 2 +- platform/forms/bundle.js | 6 ++--- .../forms/res/templates/controls/button.html | 6 ++--- .../res/templates/controls/checkbox.html | 6 ++--- .../forms/res/templates/controls/color.html | 6 ++--- .../res/templates/controls/composite.html | 6 ++--- .../res/templates/controls/datetime.html | 6 ++--- .../forms/res/templates/controls/dialog.html | 6 ++--- .../res/templates/controls/menu-button.html | 6 ++--- .../forms/res/templates/controls/radio.html | 6 ++--- .../forms/res/templates/controls/select.html | 6 ++--- .../res/templates/controls/textfield.html | 6 ++--- platform/forms/res/templates/form.html | 6 ++--- platform/forms/res/templates/toolbar.html | 6 ++--- platform/forms/src/MCTControl.js | 6 ++--- platform/forms/src/MCTForm.js | 6 ++--- platform/forms/src/MCTToolbar.js | 6 ++--- .../forms/src/controllers/ColorController.js | 6 ++--- .../src/controllers/CompositeController.js | 6 ++--- .../src/controllers/DateTimeController.js | 6 ++--- .../src/controllers/DialogButtonController.js | 6 ++--- .../forms/src/controllers/FormController.js | 6 ++--- platform/forms/test/MCTControlSpec.js | 6 ++--- platform/forms/test/MCTFormSpec.js | 6 ++--- platform/forms/test/MCTToolbarSpec.js | 6 ++--- .../test/controllers/ColorControllerSpec.js | 6 ++--- .../controllers/CompositeControllerSpec.js | 6 ++--- .../controllers/DateTimeControllerSpec.js | 6 ++--- .../controllers/DialogButtonControllerSpec.js | 6 ++--- .../test/controllers/FormControllerSpec.js | 6 ++--- platform/framework/README.md | 2 +- platform/framework/bundle.js | 10 +++---- platform/framework/src/Constants.js | 6 ++--- .../framework/src/FrameworkInitializer.js | 6 ++--- platform/framework/src/FrameworkLayer.js | 6 ++--- platform/framework/src/LogLevel.js | 6 ++--- platform/framework/src/Main.js | 6 ++--- .../src/bootstrap/ApplicationBootstrapper.js | 6 ++--- platform/framework/src/load/Bundle.js | 6 ++--- platform/framework/src/load/BundleLoader.js | 6 ++--- platform/framework/src/load/Extension.js | 6 ++--- .../src/register/CustomRegistrars.js | 6 ++--- .../src/register/ExtensionRegistrar.js | 6 ++--- .../framework/src/register/ExtensionSorter.js | 6 ++--- .../src/register/PartialConstructor.js | 6 ++--- .../src/register/ServiceCompositor.js | 6 ++--- .../framework/src/resolve/BundleResolver.js | 6 ++--- .../src/resolve/ExtensionResolver.js | 6 ++--- .../src/resolve/ImplementationLoader.js | 6 ++--- .../src/resolve/RequireConfigurator.js | 6 ++--- .../test/FrameworkInitializerSpec.js | 6 ++--- platform/framework/test/LogLevelSpec.js | 6 ++--- .../bootstrap/ApplicationBootstrapperSpec.js | 6 ++--- .../framework/test/load/BundleLoaderSpec.js | 6 ++--- platform/framework/test/load/BundleSpec.js | 6 ++--- platform/framework/test/load/ExtensionSpec.js | 6 ++--- .../test/register/CustomRegistrarsSpec.js | 6 ++--- .../test/register/ExtensionRegistrarSpec.js | 6 ++--- .../test/register/ExtensionSorterSpec.js | 6 ++--- .../test/register/PartialConstructorSpec.js | 6 ++--- .../test/register/ServiceCompositorSpec.js | 6 ++--- .../test/resolve/BundleResolverSpec.js | 6 ++--- .../test/resolve/ExtensionResolverSpec.js | 6 ++--- .../test/resolve/ImplementationLoaderSpec.js | 6 ++--- .../test/resolve/RequireConfiguratorSpec.js | 6 ++--- platform/identity/README.md | 2 +- platform/identity/bundle.js | 6 ++--- platform/identity/src/IdentityAggregator.js | 6 ++--- .../identity/src/IdentityCreationDecorator.js | 6 ++--- platform/identity/src/IdentityIndicator.js | 6 ++--- platform/identity/src/IdentityProvider.js | 6 ++--- .../identity/test/IdentityAggregatorSpec.js | 6 ++--- .../test/IdentityCreationDecoratorSpec.js | 6 ++--- .../identity/test/IdentityIndicatorSpec.js | 6 ++--- .../identity/test/IdentityProviderSpec.js | 6 ++--- platform/persistence/aggregator/bundle.js | 6 ++--- .../aggregator/src/PersistenceAggregator.js | 6 ++--- .../test/PersistenceAggregatorSpec.js | 6 ++--- platform/persistence/couch/README.md | 2 +- platform/persistence/couch/bundle.js | 6 ++--- .../persistence/couch/src/CouchDocument.js | 6 ++--- .../persistence/couch/src/CouchIndicator.js | 6 ++--- .../couch/src/CouchPersistenceProvider.js | 6 ++--- .../couch/test/CouchDocumentSpec.js | 6 ++--- .../couch/test/CouchIndicatorSpec.js | 6 ++--- .../test/CouchPersistenceProviderSpec.js | 6 ++--- platform/persistence/elastic/README.md | 2 +- platform/persistence/elastic/bundle.js | 6 ++--- .../elastic/src/ElasticIndicator.js | 6 ++--- .../elastic/src/ElasticPersistenceProvider.js | 6 ++--- .../elastic/src/ElasticSearchProvider.js | 6 ++--- .../elastic/test/ElasticIndicatorSpec.js | 6 ++--- .../test/ElasticPersistenceProviderSpec.js | 6 ++--- .../elastic/test/ElasticSearchProviderSpec.js | 6 ++--- platform/persistence/local/bundle.js | 6 ++--- .../local/src/LocalStorageIndicator.js | 6 ++--- .../src/LocalStoragePersistenceProvider.js | 6 ++--- .../local/test/LocalStorageIndicatorSpec.js | 6 ++--- .../LocalStoragePersistenceProviderSpec.js | 6 ++--- platform/persistence/queue/bundle.js | 6 ++--- .../templates/persistence-failure-dialog.html | 6 ++--- .../queue/src/PersistenceFailureConstants.js | 6 ++--- .../queue/src/PersistenceFailureController.js | 6 ++--- .../queue/src/PersistenceFailureDialog.js | 6 ++--- .../queue/src/PersistenceFailureHandler.js | 6 ++--- .../persistence/queue/src/PersistenceQueue.js | 6 ++--- .../queue/src/PersistenceQueueHandler.js | 6 ++--- .../queue/src/PersistenceQueueImpl.js | 6 ++--- .../queue/src/QueuingPersistenceCapability.js | 6 ++--- .../QueuingPersistenceCapabilityDecorator.js | 6 ++--- .../test/PersistenceFailureConstantsSpec.js | 6 ++--- .../test/PersistenceFailureControllerSpec.js | 6 ++--- .../test/PersistenceFailureDialogSpec.js | 6 ++--- .../test/PersistenceFailureHandlerSpec.js | 6 ++--- .../queue/test/PersistenceQueueHandlerSpec.js | 6 ++--- .../queue/test/PersistenceQueueImplSpec.js | 6 ++--- .../queue/test/PersistenceQueueSpec.js | 6 ++--- ...euingPersistenceCapabilityDecoratorSpec.js | 6 ++--- .../test/QueuingPersistenceCapabilitySpec.js | 6 ++--- platform/policy/README.md | 2 +- platform/policy/bundle.js | 6 ++--- platform/policy/src/PolicyActionDecorator.js | 6 ++--- platform/policy/src/PolicyProvider.js | 6 ++--- platform/policy/src/PolicyViewDecorator.js | 6 ++--- .../policy/test/PolicyActionDecoratorSpec.js | 6 ++--- platform/policy/test/PolicyProviderSpec.js | 6 ++--- .../policy/test/PolicyViewDecoratorSpec.js | 6 ++--- platform/representation/README.md | 2 +- platform/representation/bundle.js | 6 ++--- platform/representation/src/MCTInclude.js | 6 ++--- .../representation/src/MCTRepresentation.js | 6 ++--- platform/representation/src/TemplateLinker.js | 6 ++--- .../representation/src/TemplatePrefetcher.js | 6 ++--- .../src/actions/ContextMenuAction.js | 6 ++--- .../src/gestures/ContextMenuGesture.js | 6 ++--- .../src/gestures/DragGesture.js | 6 ++--- .../src/gestures/DropGesture.js | 6 ++--- .../src/gestures/GestureConstants.js | 6 ++--- .../src/gestures/GestureProvider.js | 6 ++--- .../src/gestures/GestureRepresenter.js | 6 ++--- .../representation/src/services/DndService.js | 6 ++--- .../representation/test/MCTIncludeSpec.js | 6 ++--- .../test/MCTRepresentationSpec.js | 6 ++--- .../representation/test/TemplateLinkerSpec.js | 6 ++--- .../test/TemplatePrefetcherSpec.js | 6 ++--- .../test/actions/ContextMenuActionSpec.js | 6 ++--- .../test/gestures/ContextMenuGestureSpec.js | 6 ++--- .../test/gestures/DragGestureSpec.js | 6 ++--- .../test/gestures/DropGestureSpec.js | 6 ++--- .../test/gestures/GestureProviderSpec.js | 6 ++--- .../test/gestures/GestureRepresenterSpec.js | 6 ++--- .../test/services/DndServiceSpec.js | 6 ++--- platform/search/bundle.js | 6 ++--- .../search/res/templates/search-item.html | 6 ++--- .../search/res/templates/search-menu.html | 6 ++--- platform/search/res/templates/search.html | 6 ++--- .../src/controllers/SearchController.js | 6 ++--- .../src/controllers/SearchMenuController.js | 6 ++--- .../src/services/GenericSearchProvider.js | 6 ++--- .../src/services/GenericSearchWorker.js | 6 ++--- .../search/src/services/SearchAggregator.js | 6 ++--- .../test/controllers/SearchControllerSpec.js | 6 ++--- .../controllers/SearchMenuControllerSpec.js | 6 ++--- .../services/GenericSearchProviderSpec.js | 6 ++--- .../test/services/GenericSearchWorkerSpec.js | 6 ++--- .../test/services/SearchAggregatorSpec.js | 6 ++--- platform/status/bundle.js | 6 ++--- platform/status/src/StatusCapability.js | 6 ++--- platform/status/src/StatusConstants.js | 6 ++--- platform/status/src/StatusRepresenter.js | 6 ++--- platform/status/src/StatusService.js | 6 ++--- platform/status/test/StatusCapabilitySpec.js | 6 ++--- platform/status/test/StatusRepresenterSpec.js | 6 ++--- platform/status/test/StatusServiceSpec.js | 6 ++--- platform/telemetry/README.md | 2 +- platform/telemetry/bundle.js | 6 ++--- platform/telemetry/src/TelemetryAggregator.js | 6 ++--- platform/telemetry/src/TelemetryCapability.js | 6 ++--- platform/telemetry/src/TelemetryController.js | 6 ++--- platform/telemetry/src/TelemetryDelegator.js | 6 ++--- platform/telemetry/src/TelemetryFormatter.js | 6 ++--- platform/telemetry/src/TelemetryHandle.js | 6 ++--- platform/telemetry/src/TelemetryHandler.js | 6 ++--- platform/telemetry/src/TelemetryQueue.js | 6 ++--- platform/telemetry/src/TelemetrySubscriber.js | 6 ++--- .../telemetry/src/TelemetrySubscription.js | 6 ++--- platform/telemetry/src/TelemetryTable.js | 6 ++--- .../telemetry/test/TelemetryAggregatorSpec.js | 6 ++--- .../telemetry/test/TelemetryCapabilitySpec.js | 6 ++--- .../telemetry/test/TelemetryControllerSpec.js | 6 ++--- .../telemetry/test/TelemetryDelegatorSpec.js | 6 ++--- .../telemetry/test/TelemetryFormatterSpec.js | 6 ++--- .../telemetry/test/TelemetryHandleSpec.js | 6 ++--- .../telemetry/test/TelemetryHandlerSpec.js | 6 ++--- platform/telemetry/test/TelemetryQueueSpec.js | 6 ++--- .../telemetry/test/TelemetrySubscriberSpec.js | 6 ++--- .../test/TelemetrySubscriptionSpec.js | 6 ++--- platform/telemetry/test/TelemetryTableSpec.js | 6 ++--- protractor/UI/DragDrop.js | 6 ++--- protractor/UI/Fullscreen.js | 6 ++--- protractor/UI/InfoBubble.js | 6 ++--- protractor/UI/NewWindow.js | 6 ++--- protractor/UI/RightClick.js | 6 ++--- protractor/common/Buttons.js | 6 ++--- protractor/common/CreateItem.js | 6 ++--- protractor/common/EditItem.js | 6 ++--- protractor/common/Launch.js | 6 ++--- protractor/common/RightMenu.js | 6 ++--- protractor/common/drag.js | 6 ++--- protractor/conf.js | 6 ++--- protractor/create/CreateActivity.js | 6 ++--- protractor/create/CreateActivityMode.js | 6 ++--- protractor/create/CreateButton.js | 6 ++--- protractor/create/CreateClock.js | 6 ++--- protractor/create/CreateDisplay.js | 6 ++--- protractor/create/CreateFolder.js | 6 ++--- protractor/create/CreateSineWave.js | 6 ++--- protractor/create/CreateTelemetry.js | 6 ++--- protractor/create/CreateTimeline.js | 6 ++--- protractor/create/CreateTimer.js | 6 ++--- protractor/create/CreateWebPage.js | 6 ++--- protractor/delete/DeleteActivity.js | 6 ++--- protractor/delete/DeleteActivityMode.js | 6 ++--- protractor/delete/DeleteClock.js | 6 ++--- protractor/delete/DeleteDisplay.js | 6 ++--- protractor/delete/DeleteFolder.js | 6 ++--- protractor/delete/DeleteTelemetry.js | 6 ++--- protractor/delete/DeleteTimeline.js | 6 ++--- protractor/delete/DeleteTimer.js | 6 ++--- protractor/delete/DeleteWebPage.js | 6 ++--- protractor/stressTest/StressTest.js | 6 ++--- protractor/stressTest/StressTestBubble.js | 6 ++--- .../stressTest/StressTestCreateButton.js | 6 ++--- protractor/stressTest/StressTestMenu.js | 6 ++--- protractor/stressTest/StressTestNewPage.js | 6 ++--- protractor/stressTest/StressTestRightClick.js | 6 ++--- scripts/migrate-for-jshint.js | 6 ++--- scripts/migrate-templates.js | 6 ++--- scripts/rebundle-template.txt | 6 ++--- src/BundleRegistry.js | 6 ++--- src/BundleRegistrySpec.js | 6 ++--- src/legacyRegistry.js | 6 ++--- src/legacyRegistrySpec.js | 6 ++--- test-main.js | 6 ++--- 1040 files changed, 3118 insertions(+), 3118 deletions(-) diff --git a/LICENSES.md b/LICENSES.md index b6044d3ac4..483a6e4072 100644 --- a/LICENSES.md +++ b/LICENSES.md @@ -1,12 +1,12 @@ -# Open MCT Web Licenses +# Open MCT Licenses -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, Copyright (c) 2014-2016, 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. +Open MCT is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -Open MCT Web includes source code licensed under additional open source licenses as follows. +Open MCT includes source code licensed under additional open source licenses as follows. ## Software Components Licenses diff --git a/build-docs.sh b/build-docs.sh index 87ada35524..ca7dc97c2e 100755 --- a/build-docs.sh +++ b/build-docs.sh @@ -1,11 +1,11 @@ #!/bin/bash #***************************************************************************** -#* Open MCT Web, Copyright (c) 2014-2015, United States Government +#* Open MCT, Copyright (c) 2014-2016, United States Government #* as represented by the Administrator of the National Aeronautics and Space #* Administration. All rights reserved. #* -#* Open MCT Web is licensed under the Apache License, Version 2.0 (the +#* Open MCT is licensed under the Apache License, Version 2.0 (the #* "License"); you may not use this file except in compliance with the License. #* You may obtain a copy of the License at #* http://www.apache.org/licenses/LICENSE-2.0. @@ -16,7 +16,7 @@ #* License for the specific language governing permissions and limitations #* under the License. #* -#* Open MCT Web includes source code licensed under additional open source +#* Open MCT includes source code licensed under additional open source #* licenses. See the Open Source Licenses file (LICENSES.md) included with #* this source code distribution or the Licensing information page available #* at runtime from the About dialog for additional information. diff --git a/docs/gendocs.js b/docs/gendocs.js index 10facc0ded..8d257625d0 100644 --- a/docs/gendocs.js +++ b/docs/gendocs.js @@ -1,9 +1,9 @@ /***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government + * Open MCT, Copyright (c) 2014-2016, United States Government * as represented by the Administrator of the National Aeronautics and Space * Administration. All rights reserved. * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * Open MCT is licensed under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0. @@ -14,7 +14,7 @@ * License for the specific language governing permissions and limitations * under the License. * - * Open MCT Web includes source code licensed under additional open source + * Open MCT includes source code licensed under additional open source * licenses. See the Open Source Licenses file (LICENSES.md) included with * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. diff --git a/docs/src/design/planning/APIRefactor.md b/docs/src/design/planning/APIRefactor.md index 8f693cb814..ec98a115f4 100644 --- a/docs/src/design/planning/APIRefactor.md +++ b/docs/src/design/planning/APIRefactor.md @@ -1,7 +1,7 @@ # API Refactoring This document summarizes a path toward implementing API changes -from the [API Redesign](../proposals/APIRedesign.md) for Open MCT Web +from the [API Redesign](../proposals/APIRedesign.md) for Open MCT v1.0.0. # Goals @@ -161,7 +161,7 @@ be included in a straightforward fashion. Some goals for this build step: -* Compile (and, preferably, optimize/minify) Open MCT Web +* Compile (and, preferably, optimize/minify) Open MCT sources into a single `.js` file. * It is desirable to do the same for HTML sources, but may wish to defer this until a subsequent refactoring @@ -170,7 +170,7 @@ Some goals for this build step: derivative projects in a straightforward fashion. Should also consider which dependency/packaging manager should -be used by dependent projects to obtain Open MCT Web. Approaches +be used by dependent projects to obtain Open MCT. Approaches include: 1. Plain `npm`. Dependents then declare their dependency with @@ -203,7 +203,7 @@ to use for asset generation/management and compilation/minification/etc. ## Step 3. Separate repositories -Refactor existing applications built on Open MCT Web such that they +Refactor existing applications built on Open MCT such that they are no longer forks, but instead separate projects with a dependency on the built artifacts from Step 2. @@ -211,7 +211,7 @@ Note that this is achievable already using `bower` (see `warp-bower` branch at http://developer.nasa.gov/mct/warp for an example.) However, changes involved in switching to an imperative API and introducing a build process may change (and should simplify) the -approach used to utilize Open MCT Web as a dependency, so these +approach used to utilize Open MCT as a dependency, so these changes should be introduced first. ## Step 4. Design registration API @@ -287,7 +287,7 @@ or separately in parallel) and should involve a tight cycle of: planning should be done to spread out the changes incrementally. By necessity, these changes may break functionality in applications -built using Open MCT Web. On a case-by-case basis, should consider +built using Open MCT. On a case-by-case basis, should consider providing temporary "legacy support" to allow downstream updates to occur as a separate task; the relevant trade here is between waste/effort required to maintain legacy support, versus the @@ -299,11 +299,11 @@ across several repositories. Update bundles to remove any usages of legacy support for bundles (including that used by dependent projects.) Then, remove legacy -support from Open MCT Web. +support from Open MCT. ## Step 8. Release candidacy -Once API changes are complete, Open MCT Web should enter a release +Once API changes are complete, Open MCT should enter a release candidacy cycle. Important things to look at here: * Are changes really complete? diff --git a/docs/src/design/proposals/APIRedesign.md b/docs/src/design/proposals/APIRedesign.md index 479460b457..d14f4ce469 100644 --- a/docs/src/design/proposals/APIRedesign.md +++ b/docs/src/design/proposals/APIRedesign.md @@ -1,6 +1,6 @@ # Overview -The purpose of this document is to review feedback on Open MCT Web's +The purpose of this document is to review feedback on Open MCT's current API and propose improvements to the API, particularly for a 1.0.0 release. @@ -64,7 +64,7 @@ useful, powerful interfaces. ## Developer Intern Feedback This feedback comes from interns who worked closely with -Open MCT Web as their primary task over the Summer of 2015. +Open MCT as their primary task over the Summer of 2015. ### Developer Intern 1 @@ -104,7 +104,7 @@ Worked on bug fixes in the platform and a plugin for search. Worked on platform bug fixes and mobile support. -* No guide for the UI and front end for the HTML/CSS part of Open MCT Web. +* No guide for the UI and front end for the HTML/CSS part of Open MCT. Not sure if this is applicable or needed for developers, however would be helpful to any front end development * Found it difficult to follow the plot controller & subplot @@ -118,11 +118,11 @@ Worked on platform bug fixes and mobile support. ## Plugin Developer Feedback This feedback comes from developers who have worked on plugins for -Open MCT Web, but have not worked on the platform. +Open MCT, but have not worked on the platform. ### Plugin Developer 1 -Used Open MCT Web over the course of several months (on a +Used Open MCT over the course of several months (on a less-than-half-time basis) to develop a spectrum visualization plugin. @@ -138,7 +138,7 @@ spectrum visualization plugin. ### Plugin Developer 2 -Used Open MCT Web over the course of several weeks (on a half-time basis) +Used Open MCT over the course of several weeks (on a half-time basis) to develop a tabular visualization plugin. * Pain points @@ -197,7 +197,7 @@ to develop a tabular visualization plugin. ## Long-term Developer Notes The following notes are from original platform developer, with long -term experience using Open MCT Web. +term experience using Open MCT. * Bundle mechanism allows for grouping related components across concerns, and adding and removing these easily. (e.g. model and view components of @@ -220,7 +220,7 @@ or reducing the Angular dependency. ### Angular's Role -Angular is Open MCT Web's: +Angular is Open MCT's: * Dependency injection framework. * Template rendering. @@ -268,7 +268,7 @@ by experience: * Feedback from new developers is that Angular was a hindrance to training, not a benefit. ("One more thing to learn.") Significant - documentation remains necessary for Open MCT Web. + documentation remains necessary for Open MCT. * Expected enhancements to maintainability will be effectively invalidated by an expected Angular end-of-life. * Data binding and automatic view updates do save development effort, @@ -526,7 +526,7 @@ subset of `$http`'s functionality. ### Detriments -* Increases the number of interfaces in Open MCT Web. (Arguably, +* Increases the number of interfaces in Open MCT. (Arguably, not really, since the same interfaces would exist if exposed by Angular.) @@ -574,7 +574,7 @@ This would also allow for "composite bundles" which serve as proxies for multiple bundles. The `BundleContext` could contain (or later be amended to contain) filtering rules to ignore other bundles and so forth (this has been useful for administering -Open MCT Web in subtly different configurations in the past.) +Open MCT in subtly different configurations in the past.) ### Benefits @@ -827,7 +827,7 @@ This could be resolved by: ## Nomenclature Change -Instead of presenting Open MCT Web as a "framework" or +Instead of presenting Open MCT as a "framework" or "platform", present it as an "extensible application." This is mostly a change for the developer guide. A @@ -1040,7 +1040,7 @@ This is a more specific variant of * Removes a whole category of API (bundle definitions), reducing learning curve associated with the software. * Closer to Angular style, reducing disconnect between learning - Angular and learning Open MCT Web (reducing burden of having + Angular and learning Open MCT (reducing burden of having to learn multiple paradigms.) * Clarifies "what can be found where" (albeit not perfectly) since you can look to module dependencies and follow back from there. diff --git a/example/README.md b/example/README.md index 0e1b29c036..d6f3afaec0 100644 --- a/example/README.md +++ b/example/README.md @@ -1,2 +1,2 @@ This directory is for example bundles, which are intended to illustrate -how to author new software components using Open MCT Web. +how to author new software components using Open MCT. diff --git a/example/builtins/bundle.js b/example/builtins/bundle.js index 9192a19767..ed37336340 100644 --- a/example/builtins/bundle.js +++ b/example/builtins/bundle.js @@ -1,9 +1,9 @@ /***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government + * Open MCT, Copyright (c) 2014-2016, United States Government * as represented by the Administrator of the National Aeronautics and Space * Administration. All rights reserved. * - * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * Open MCT is licensed under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0. @@ -14,7 +14,7 @@ * License for the specific language governing permissions and limitations * under the License. * - * Open MCT Web includes source code licensed under additional open source + * Open MCT includes source code licensed under additional open source * licenses. See the Open Source Licenses file (LICENSES.md) included with * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. diff --git a/example/builtins/res/templates/example.html b/example/builtins/res/templates/example.html index e298489fff..3bd7ac347f 100644 --- a/example/builtins/res/templates/example.html +++ b/example/builtins/res/templates/example.html @@ -1,9 +1,9 @@
-

# Open MCT Web Licenses

+

# Open MCT Licenses

## Apache License

diff --git a/platform/commonUI/about/res/templates/licenses.html b/platform/commonUI/about/res/templates/licenses.html index 28c919198e..65466dbdc2 100644 --- a/platform/commonUI/about/res/templates/licenses.html +++ b/platform/commonUI/about/res/templates/licenses.html @@ -1,9 +1,9 @@