mirror of
https://github.com/nasa/openmct.git
synced 2025-01-31 00:23:54 +00:00
Merge branch 'topic-core-refactor' into modal-improvement
This commit is contained in:
commit
360881cf66
@ -23,9 +23,9 @@
|
|||||||
/*global module,process*/
|
/*global module,process*/
|
||||||
|
|
||||||
const devMode = process.env.NODE_ENV !== 'production';
|
const devMode = process.env.NODE_ENV !== 'production';
|
||||||
|
const browsers = [process.env.NODE_ENV === 'debug' ? 'ChromeDebugging' : 'ChromeHeadless'];
|
||||||
|
|
||||||
module.exports = (config) => {
|
module.exports = (config) => {
|
||||||
|
|
||||||
const webpackConfig = require('./webpack.config.js');
|
const webpackConfig = require('./webpack.config.js');
|
||||||
delete webpackConfig.output;
|
delete webpackConfig.output;
|
||||||
|
|
||||||
@ -50,11 +50,17 @@ module.exports = (config) => {
|
|||||||
'coverage',
|
'coverage',
|
||||||
'html'
|
'html'
|
||||||
],
|
],
|
||||||
browsers: ['ChromeHeadless'],
|
browsers: browsers,
|
||||||
|
customLaunchers: {
|
||||||
|
ChromeDebugging: {
|
||||||
|
base: 'Chrome',
|
||||||
|
flags: ['--remote-debugging-port=9222'],
|
||||||
|
debug: true
|
||||||
|
}
|
||||||
|
},
|
||||||
colors: true,
|
colors: true,
|
||||||
logLevel: config.LOG_INFO,
|
logLevel: config.LOG_INFO,
|
||||||
autoWatch: true,
|
autoWatch: true,
|
||||||
|
|
||||||
coverageReporter: {
|
coverageReporter: {
|
||||||
dir: process.env.CIRCLE_ARTIFACTS ?
|
dir: process.env.CIRCLE_ARTIFACTS ?
|
||||||
process.env.CIRCLE_ARTIFACTS + '/coverage' :
|
process.env.CIRCLE_ARTIFACTS + '/coverage' :
|
||||||
@ -66,22 +72,18 @@ module.exports = (config) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// HTML test reporting.
|
// HTML test reporting.
|
||||||
htmlReporter: {
|
htmlReporter: {
|
||||||
outputDir: "dist/reports/tests",
|
outputDir: "dist/reports/tests",
|
||||||
preserveDescribeNesting: true,
|
preserveDescribeNesting: true,
|
||||||
foldAll: false
|
foldAll: false
|
||||||
},
|
},
|
||||||
|
|
||||||
preprocessors: {
|
preprocessors: {
|
||||||
// add webpack as preprocessor
|
// add webpack as preprocessor
|
||||||
'platform/**/*Spec.js': [ 'webpack' ],
|
'platform/**/*Spec.js': [ 'webpack', 'sourcemap' ],
|
||||||
'src/**/*Spec.js': [ 'webpack' ]
|
'src/**/*Spec.js': [ 'webpack', 'sourcemap' ]
|
||||||
},
|
},
|
||||||
|
|
||||||
webpack: webpackConfig,
|
webpack: webpackConfig,
|
||||||
|
|
||||||
webpackMiddleware: {
|
webpackMiddleware: {
|
||||||
stats: 'errors-only',
|
stats: 'errors-only',
|
||||||
logLevel: 'warn'
|
logLevel: 'warn'
|
||||||
@ -89,4 +91,3 @@ module.exports = (config) => {
|
|||||||
singleRun: true
|
singleRun: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global module,BUILD_CONSTANTS*/
|
/*global module*/
|
||||||
|
|
||||||
const matcher = /\/openmct.js$/;
|
const matcher = /\/openmct.js$/;
|
||||||
if (document.currentScript) {
|
if (document.currentScript) {
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
"karma-coverage": "^1.1.2",
|
"karma-coverage": "^1.1.2",
|
||||||
"karma-html-reporter": "^0.2.7",
|
"karma-html-reporter": "^0.2.7",
|
||||||
"karma-jasmine": "^1.1.2",
|
"karma-jasmine": "^1.1.2",
|
||||||
|
"karma-sourcemap-loader": "^0.3.7",
|
||||||
"karma-webpack": "^3.0.0",
|
"karma-webpack": "^3.0.0",
|
||||||
"location-bar": "^3.0.1",
|
"location-bar": "^3.0.1",
|
||||||
"lodash": "^3.10.1",
|
"lodash": "^3.10.1",
|
||||||
@ -79,6 +80,7 @@
|
|||||||
"build:dev": "webpack",
|
"build:dev": "webpack",
|
||||||
"build:watch": "webpack --watch",
|
"build:watch": "webpack --watch",
|
||||||
"test": "karma start --single-run",
|
"test": "karma start --single-run",
|
||||||
|
"test-debug": "NODE_ENV=debug karma start --no-single-run",
|
||||||
"test:watch": "karma start --no-single-run",
|
"test:watch": "karma start --no-single-run",
|
||||||
"verify": "concurrently 'npm:test' 'npm:lint'",
|
"verify": "concurrently 'npm:test' 'npm:lint'",
|
||||||
"jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api",
|
"jsdoc": "jsdoc -c jsdoc.json -R API.md -r -d dist/docs/api",
|
||||||
|
@ -21,12 +21,6 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"./src/BrowseController",
|
|
||||||
"./src/PaneController",
|
|
||||||
"./src/InspectorPaneController",
|
|
||||||
"./src/BrowseObjectController",
|
|
||||||
"./src/MenuArrowController",
|
|
||||||
"./src/ObjectHeaderController",
|
|
||||||
"./src/navigation/NavigationService",
|
"./src/navigation/NavigationService",
|
||||||
"./src/navigation/NavigateAction",
|
"./src/navigation/NavigateAction",
|
||||||
"./src/navigation/OrphanNavigationHandler",
|
"./src/navigation/OrphanNavigationHandler",
|
||||||
@ -41,12 +35,6 @@ define([
|
|||||||
"./res/templates/browse/inspector-region.html",
|
"./res/templates/browse/inspector-region.html",
|
||||||
'legacyRegistry'
|
'legacyRegistry'
|
||||||
], function (
|
], function (
|
||||||
BrowseController,
|
|
||||||
PaneController,
|
|
||||||
InspectorPaneController,
|
|
||||||
BrowseObjectController,
|
|
||||||
MenuArrowController,
|
|
||||||
ObjectHeaderController,
|
|
||||||
NavigationService,
|
NavigationService,
|
||||||
NavigateAction,
|
NavigateAction,
|
||||||
OrphanNavigationHandler,
|
OrphanNavigationHandler,
|
||||||
@ -73,70 +61,6 @@ define([
|
|||||||
"priority": "fallback"
|
"priority": "fallback"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"controllers": [
|
|
||||||
{
|
|
||||||
"key": "BrowseController",
|
|
||||||
"implementation": BrowseController,
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"$route",
|
|
||||||
"$location",
|
|
||||||
"objectService",
|
|
||||||
"navigationService",
|
|
||||||
"urlService",
|
|
||||||
"DEFAULT_PATH"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "PaneController",
|
|
||||||
"implementation": PaneController,
|
|
||||||
"priority": "preferred",
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"agentService",
|
|
||||||
"$window",
|
|
||||||
"$location",
|
|
||||||
"$attrs",
|
|
||||||
"navigationService"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "BrowseObjectController",
|
|
||||||
"implementation": BrowseObjectController,
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"$location",
|
|
||||||
"$route"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "MenuArrowController",
|
|
||||||
"implementation": MenuArrowController,
|
|
||||||
"depends": [
|
|
||||||
"$scope"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "InspectorPaneController",
|
|
||||||
"implementation": InspectorPaneController,
|
|
||||||
"priority": "preferred",
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"agentService",
|
|
||||||
"$window",
|
|
||||||
"navigationService",
|
|
||||||
"$location",
|
|
||||||
"$attrs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "ObjectHeaderController",
|
|
||||||
"implementation": ObjectHeaderController,
|
|
||||||
"depends": [
|
|
||||||
"$scope"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"representations": [
|
"representations": [
|
||||||
{
|
{
|
||||||
"key": "browse-object",
|
"key": "browse-object",
|
||||||
|
@ -1,215 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This bundle implements Browse mode.
|
|
||||||
* @namespace platform/commonUI/browse
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
['lodash'],
|
|
||||||
function (_) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The BrowseController is used to populate the initial scope in Browse
|
|
||||||
* mode. It loads the root object from the objectService and makes it
|
|
||||||
* available in the scope for Angular template's; this is the point at
|
|
||||||
* which Angular templates first have access to the domain object
|
|
||||||
* hierarchy.
|
|
||||||
*
|
|
||||||
* @memberof platform/commonUI/browse
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function BrowseController(
|
|
||||||
$scope,
|
|
||||||
$route,
|
|
||||||
$location,
|
|
||||||
objectService,
|
|
||||||
navigationService,
|
|
||||||
urlService,
|
|
||||||
defaultPath
|
|
||||||
) {
|
|
||||||
window.browseScope = $scope;
|
|
||||||
var initialPath = ($route.current.params.ids || defaultPath).split("/"),
|
|
||||||
currentIds;
|
|
||||||
|
|
||||||
$scope.treeModel = {
|
|
||||||
selectedObject: undefined,
|
|
||||||
onSelection: function (object) {
|
|
||||||
navigationService.setNavigation(object, true);
|
|
||||||
},
|
|
||||||
allowSelection: function (object) {
|
|
||||||
var domainObjectInView = navigationService.getNavigation(),
|
|
||||||
isInEditMode = domainObjectInView.getCapability('status').get('editing');
|
|
||||||
|
|
||||||
if (isInEditMode) {
|
|
||||||
|
|
||||||
var actions = object.getCapability('action'),
|
|
||||||
previewAction = actions.getActions({key: 'mct-preview-action'})[0];
|
|
||||||
|
|
||||||
if (previewAction && previewAction.perform) {
|
|
||||||
previewAction.perform();
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return navigationService.shouldNavigate();
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function idsForObject(domainObject) {
|
|
||||||
return urlService
|
|
||||||
.urlForLocation("", domainObject)
|
|
||||||
.replace('/', '');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find an object in an array of objects.
|
|
||||||
function findObject(domainObjects, id) {
|
|
||||||
var i;
|
|
||||||
for (i = 0; i < domainObjects.length; i += 1) {
|
|
||||||
if (domainObjects[i].getId() === id) {
|
|
||||||
return domainObjects[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// helper, fetch a single object from the object service.
|
|
||||||
function getObject(id) {
|
|
||||||
return objectService.getObjects([id])
|
|
||||||
.then(function (results) {
|
|
||||||
return results[id];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// recursively locate and return an object inside of a container
|
|
||||||
// via a path. If at any point in the recursion it fails to find
|
|
||||||
// the next object, it will return the parent.
|
|
||||||
function findViaComposition(containerObject, path) {
|
|
||||||
var nextId = path.shift();
|
|
||||||
if (!nextId) {
|
|
||||||
return containerObject;
|
|
||||||
}
|
|
||||||
return containerObject.useCapability('composition')
|
|
||||||
.then(function (composees) {
|
|
||||||
var nextObject = findObject(composees, nextId);
|
|
||||||
if (!nextObject) {
|
|
||||||
return containerObject;
|
|
||||||
}
|
|
||||||
if (!nextObject.hasCapability('composition')) {
|
|
||||||
return nextObject;
|
|
||||||
}
|
|
||||||
return findViaComposition(nextObject, path);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function navigateToObject(desiredObject) {
|
|
||||||
$scope.navigatedObject = desiredObject;
|
|
||||||
$scope.treeModel.selectedObject = desiredObject;
|
|
||||||
currentIds = idsForObject(desiredObject);
|
|
||||||
$route.current.pathParams.ids = currentIds;
|
|
||||||
$location.path('/browse/' + currentIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLastChildIfRoot(object) {
|
|
||||||
if (object.getId() !== 'ROOT') {
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
return object.useCapability('composition')
|
|
||||||
.then(function (composees) {
|
|
||||||
return composees[composees.length - 1];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function navigateToPath(path) {
|
|
||||||
return getObject('ROOT')
|
|
||||||
.then(function (root) {
|
|
||||||
return findViaComposition(root, path);
|
|
||||||
})
|
|
||||||
.then(getLastChildIfRoot)
|
|
||||||
.then(function (object) {
|
|
||||||
navigationService.setNavigation(object);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getObject('ROOT')
|
|
||||||
.then(function (root) {
|
|
||||||
$scope.domainObject = root;
|
|
||||||
navigateToPath(initialPath);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Handle navigation events from view service. Only navigates
|
|
||||||
// if path has changed.
|
|
||||||
function navigateDirectlyToModel(domainObject) {
|
|
||||||
var newIds = idsForObject(domainObject);
|
|
||||||
if (currentIds !== newIds) {
|
|
||||||
currentIds = newIds;
|
|
||||||
navigateToObject(domainObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Listen for changes in navigation state.
|
|
||||||
navigationService.addListener(navigateDirectlyToModel);
|
|
||||||
|
|
||||||
// Listen for route changes which are caused by browser events
|
|
||||||
// (e.g. bookmarks to pages in OpenMCT) and prevent them. Instead,
|
|
||||||
// navigate to the path ourselves, which results in it being
|
|
||||||
// properly set.
|
|
||||||
$scope.$on('$routeChangeStart', function (event, route, oldRoute) {
|
|
||||||
if (route.$$route === $route.current.$$route) {
|
|
||||||
if (route.pathParams.ids &&
|
|
||||||
route.pathParams.ids !== $route.current.pathParams.ids) {
|
|
||||||
|
|
||||||
var otherParams = _.omit(route.params, 'ids');
|
|
||||||
var oldOtherParams = _.omit(oldRoute.params, 'ids');
|
|
||||||
var deletedParams = _.omit(oldOtherParams, _.keys(otherParams));
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
navigateToPath(route.pathParams.ids.split('/'))
|
|
||||||
.then(function () {
|
|
||||||
if (!_.isEqual(otherParams, oldOtherParams)) {
|
|
||||||
_.forEach(otherParams, function (v, k) {
|
|
||||||
$location.search(k, v);
|
|
||||||
});
|
|
||||||
_.forEach(deletedParams, function (k) {
|
|
||||||
$location.search(k, null);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
navigateToPath([]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Clean up when the scope is destroyed
|
|
||||||
$scope.$on("$destroy", function () {
|
|
||||||
navigationService.removeListener(navigateDirectlyToModel);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return BrowseController;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller for the `browse-object` representation of a domain
|
|
||||||
* object (the right-hand side of Browse mode.)
|
|
||||||
* @memberof platform/commonUI/browse
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function BrowseObjectController($scope, $location, $route) {
|
|
||||||
function setViewForDomainObject(domainObject) {
|
|
||||||
|
|
||||||
var locationViewKey = $location.search().view;
|
|
||||||
|
|
||||||
function selectViewIfMatching(view) {
|
|
||||||
if (view.key === locationViewKey) {
|
|
||||||
$scope.representation = $scope.representation || {};
|
|
||||||
$scope.representation.selected = view;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (locationViewKey) {
|
|
||||||
((domainObject && domainObject.useCapability('view')) || [])
|
|
||||||
.forEach(selectViewIfMatching);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateQueryParam(viewKey) {
|
|
||||||
if (viewKey && $location.search().view !== viewKey) {
|
|
||||||
$location.search('view', viewKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.$watch('domainObject', setViewForDomainObject);
|
|
||||||
$scope.$watch('representation.selected.key', updateQueryParam);
|
|
||||||
$scope.$on('$locationChangeSuccess', function () {
|
|
||||||
setViewForDomainObject($scope.domainObject);
|
|
||||||
});
|
|
||||||
|
|
||||||
$scope.doAction = function (action) {
|
|
||||||
return $scope[action] && $scope[action]();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return BrowseObjectController;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
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, $location, $attrs) {
|
|
||||||
PaneController.call(this, $scope, agentService, $window, $location, $attrs);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
navigationService.addListener(attachStatusListener);
|
|
||||||
|
|
||||||
$scope.$on("$destroy", function () {
|
|
||||||
statusListener();
|
|
||||||
navigationService.removeListener(attachStatusListener);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
InspectorPaneController.prototype = Object.create(PaneController.prototype);
|
|
||||||
|
|
||||||
return InspectorPaneController;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,92 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller to provide the ability to inline edit an object name.
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
* @memberof platform/commonUI/browse
|
|
||||||
*/
|
|
||||||
function ObjectHeaderController($scope) {
|
|
||||||
this.$scope = $scope;
|
|
||||||
this.domainObject = $scope.domainObject;
|
|
||||||
this.editable = this.allowEdit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the object name on blur and enter keypress events.
|
|
||||||
*
|
|
||||||
* @param event the mouse event
|
|
||||||
*/
|
|
||||||
ObjectHeaderController.prototype.updateName = function (event) {
|
|
||||||
if (!event || !event.currentTarget) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.type === 'blur') {
|
|
||||||
this.updateModel(event);
|
|
||||||
} else if (event.which === 13) {
|
|
||||||
this.updateModel(event);
|
|
||||||
event.currentTarget.blur();
|
|
||||||
window.getSelection().removeAllRanges();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the model.
|
|
||||||
*
|
|
||||||
* @param event the mouse event
|
|
||||||
* @param private
|
|
||||||
*/
|
|
||||||
ObjectHeaderController.prototype.updateModel = function (event) {
|
|
||||||
var name = event.currentTarget.textContent.replace(/\n/g, ' ');
|
|
||||||
|
|
||||||
if (name.length === 0) {
|
|
||||||
name = "Unnamed " + this.domainObject.getCapability("type").typeDef.name;
|
|
||||||
event.currentTarget.textContent = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name !== this.domainObject.getModel().name) {
|
|
||||||
this.domainObject.getCapability('mutation').mutate(function (model) {
|
|
||||||
model.name = name;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the domain object is editable.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @return true if object is editable
|
|
||||||
*/
|
|
||||||
ObjectHeaderController.prototype.allowEdit = function () {
|
|
||||||
var type = this.domainObject && this.domainObject.getCapability('type');
|
|
||||||
return !!(type && type.hasFeature('creation'));
|
|
||||||
};
|
|
||||||
|
|
||||||
return ObjectHeaderController;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,88 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
var navigationListenerAdded = false;
|
|
||||||
/**
|
|
||||||
* Controller to provide the ability to show/hide the tree in
|
|
||||||
* Browse mode.
|
|
||||||
* @constructor
|
|
||||||
* @memberof platform/commonUI/browse
|
|
||||||
*/
|
|
||||||
function PaneController($scope, agentService, $window, $location, $attrs, navigationService) {
|
|
||||||
var self = this;
|
|
||||||
this.agentService = agentService;
|
|
||||||
var hideParameterPresent = $location.search().hasOwnProperty($attrs.hideParameter);
|
|
||||||
|
|
||||||
if ($attrs.hideParameter && hideParameterPresent) {
|
|
||||||
this.state = false;
|
|
||||||
$location.search($attrs.hideParameter, undefined);
|
|
||||||
} else {
|
|
||||||
this.state = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback to invoke when any selection occurs in the tree.
|
|
||||||
* This controller can be passed in as the `parameters` object
|
|
||||||
* to the tree representation.
|
|
||||||
*
|
|
||||||
* @property {Function} callback
|
|
||||||
* @memberof platform/commonUI/browse.PaneController#
|
|
||||||
*/
|
|
||||||
this.callback = function () {
|
|
||||||
// Note that, since this is a callback to pass, this is not
|
|
||||||
// declared as a method but as a property which happens to
|
|
||||||
// be a function.
|
|
||||||
if (agentService.isPhone() && agentService.isPortrait()) {
|
|
||||||
// On phones, trees should collapse in portrait mode
|
|
||||||
// when something is navigated-to.
|
|
||||||
self.state = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (navigationService && navigationService.addListener && !navigationListenerAdded) {
|
|
||||||
navigationService.addListener(this.callback);
|
|
||||||
navigationListenerAdded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggle the visibility of the pane.
|
|
||||||
*/
|
|
||||||
PaneController.prototype.toggle = function () {
|
|
||||||
this.state = !this.state;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the desired visibility state of the pane.
|
|
||||||
* @returns {boolean} true when visible
|
|
||||||
*/
|
|
||||||
PaneController.prototype.visible = function () {
|
|
||||||
return !!this.state;
|
|
||||||
};
|
|
||||||
|
|
||||||
return PaneController;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,266 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global console*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
[
|
|
||||||
"../src/BrowseController",
|
|
||||||
"../src/navigation/NavigationService"
|
|
||||||
],
|
|
||||||
function (
|
|
||||||
BrowseController,
|
|
||||||
NavigationService
|
|
||||||
) {
|
|
||||||
|
|
||||||
describe("The browse controller", function () {
|
|
||||||
var mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService,
|
|
||||||
mockRootObject,
|
|
||||||
mockUrlService,
|
|
||||||
mockDefaultRootObject,
|
|
||||||
mockOtherDomainObject,
|
|
||||||
mockNextObject,
|
|
||||||
testDefaultRoot,
|
|
||||||
controller;
|
|
||||||
|
|
||||||
function waitsForNavigation() {
|
|
||||||
return new Promise(function (resolve) {
|
|
||||||
mockNavigationService.setNavigation.and.callFake(function (obj) {
|
|
||||||
var returnValue;
|
|
||||||
try {
|
|
||||||
returnValue = NavigationService.prototype.setNavigation.call(mockNavigationService, obj);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
//Not rejecting because 'setNavigation' has been called, which is what's being tested here.
|
|
||||||
//Rejecting will fail tests.
|
|
||||||
}
|
|
||||||
resolve();
|
|
||||||
return returnValue;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function instantiateController() {
|
|
||||||
controller = new BrowseController(
|
|
||||||
mockScope,
|
|
||||||
mockRoute,
|
|
||||||
mockLocation,
|
|
||||||
mockObjectService,
|
|
||||||
mockNavigationService,
|
|
||||||
mockUrlService,
|
|
||||||
testDefaultRoot
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
testDefaultRoot = "some-root-level-domain-object";
|
|
||||||
|
|
||||||
mockScope = jasmine.createSpyObj(
|
|
||||||
"$scope",
|
|
||||||
["$on", "$watch"]
|
|
||||||
);
|
|
||||||
mockRoute = { current: { params: {}, pathParams: {} } };
|
|
||||||
mockUrlService = jasmine.createSpyObj(
|
|
||||||
"urlService",
|
|
||||||
["urlForLocation"]
|
|
||||||
);
|
|
||||||
mockUrlService.urlForLocation.and.callFake(function (mode, object) {
|
|
||||||
if (object === mockDefaultRootObject) {
|
|
||||||
return [mode, testDefaultRoot].join('/');
|
|
||||||
}
|
|
||||||
if (object === mockOtherDomainObject) {
|
|
||||||
return [mode, 'other'].join('/');
|
|
||||||
}
|
|
||||||
if (object === mockNextObject) {
|
|
||||||
return [mode, testDefaultRoot, 'next'].join('/');
|
|
||||||
}
|
|
||||||
throw new Error('Tried to get url for unexpected object');
|
|
||||||
});
|
|
||||||
mockLocation = jasmine.createSpyObj(
|
|
||||||
"$location",
|
|
||||||
["path"]
|
|
||||||
);
|
|
||||||
mockObjectService = jasmine.createSpyObj(
|
|
||||||
"objectService",
|
|
||||||
["getObjects"]
|
|
||||||
);
|
|
||||||
mockNavigationService = new NavigationService({});
|
|
||||||
[
|
|
||||||
"getNavigation",
|
|
||||||
"setNavigation",
|
|
||||||
"addListener",
|
|
||||||
"removeListener"
|
|
||||||
].forEach(function (method) {
|
|
||||||
spyOn(mockNavigationService, method)
|
|
||||||
.and.callThrough();
|
|
||||||
});
|
|
||||||
mockRootObject = jasmine.createSpyObj(
|
|
||||||
"rootObjectContainer",
|
|
||||||
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
|
|
||||||
);
|
|
||||||
mockDefaultRootObject = jasmine.createSpyObj(
|
|
||||||
"defaultRootObject",
|
|
||||||
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
|
|
||||||
);
|
|
||||||
mockOtherDomainObject = jasmine.createSpyObj(
|
|
||||||
"otherDomainObject",
|
|
||||||
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
|
|
||||||
);
|
|
||||||
mockNextObject = jasmine.createSpyObj(
|
|
||||||
"nestedDomainObject",
|
|
||||||
["getId", "getCapability", "getModel", "useCapability", "hasCapability"]
|
|
||||||
);
|
|
||||||
mockObjectService.getObjects.and.returnValue(Promise.resolve({
|
|
||||||
ROOT: mockRootObject
|
|
||||||
}));
|
|
||||||
mockRootObject.useCapability.and.returnValue(Promise.resolve([
|
|
||||||
mockOtherDomainObject,
|
|
||||||
mockDefaultRootObject
|
|
||||||
]));
|
|
||||||
mockRootObject.hasCapability.and.returnValue(true);
|
|
||||||
mockDefaultRootObject.useCapability.and.returnValue(Promise.resolve([
|
|
||||||
mockNextObject
|
|
||||||
]));
|
|
||||||
mockDefaultRootObject.hasCapability.and.returnValue(true);
|
|
||||||
mockOtherDomainObject.hasCapability.and.returnValue(false);
|
|
||||||
mockNextObject.useCapability.and.returnValue(undefined);
|
|
||||||
mockNextObject.hasCapability.and.returnValue(false);
|
|
||||||
mockNextObject.getId.and.returnValue("next");
|
|
||||||
mockDefaultRootObject.getId.and.returnValue(testDefaultRoot);
|
|
||||||
|
|
||||||
instantiateController();
|
|
||||||
return waitsForNavigation();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("uses composition to set the navigated object, if there is none", function () {
|
|
||||||
instantiateController();
|
|
||||||
return waitsForNavigation().then(function () {
|
|
||||||
expect(mockNavigationService.setNavigation)
|
|
||||||
.toHaveBeenCalledWith(mockDefaultRootObject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("navigates to a root-level object, even when default path is not found", function () {
|
|
||||||
mockDefaultRootObject.getId
|
|
||||||
.and.returnValue("something-other-than-the-" + testDefaultRoot);
|
|
||||||
instantiateController();
|
|
||||||
|
|
||||||
return waitsForNavigation().then(function () {
|
|
||||||
expect(mockNavigationService.setNavigation)
|
|
||||||
.toHaveBeenCalledWith(mockDefaultRootObject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not try to override navigation", function () {
|
|
||||||
mockNavigationService.getNavigation.and.returnValue(mockDefaultRootObject);
|
|
||||||
instantiateController();
|
|
||||||
return waitsForNavigation().then(function () {
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockDefaultRootObject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("updates scope when navigated object changes", function () {
|
|
||||||
// Should have registered a listener - call it
|
|
||||||
mockNavigationService.addListener.calls.mostRecent().args[0](
|
|
||||||
mockOtherDomainObject
|
|
||||||
);
|
|
||||||
expect(mockScope.navigatedObject).toEqual(mockOtherDomainObject);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it("releases its navigation listener when its scope is destroyed", function () {
|
|
||||||
expect(mockScope.$on).toHaveBeenCalledWith(
|
|
||||||
"$destroy",
|
|
||||||
jasmine.any(Function)
|
|
||||||
);
|
|
||||||
mockScope.$on.calls.mostRecent().args[1]();
|
|
||||||
|
|
||||||
// Should remove the listener it added earlier
|
|
||||||
expect(mockNavigationService.removeListener).toHaveBeenCalledWith(
|
|
||||||
mockNavigationService.addListener.calls.mostRecent().args[0]
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("uses route parameters to choose initially-navigated object", function () {
|
|
||||||
mockRoute.current.params.ids = testDefaultRoot + "/next";
|
|
||||||
instantiateController();
|
|
||||||
return waitsForNavigation().then(function () {
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockNextObject);
|
|
||||||
expect(mockNavigationService.setNavigation)
|
|
||||||
.toHaveBeenCalledWith(mockNextObject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("handles invalid IDs by going as far as possible", function () {
|
|
||||||
// Idea here is that if we get a bad path of IDs,
|
|
||||||
// browse controller should traverse down it until
|
|
||||||
// it hits an invalid ID.
|
|
||||||
mockRoute.current.params.ids = testDefaultRoot + "/junk";
|
|
||||||
instantiateController();
|
|
||||||
return waitsForNavigation().then(function () {
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockDefaultRootObject);
|
|
||||||
expect(mockNavigationService.setNavigation)
|
|
||||||
.toHaveBeenCalledWith(mockDefaultRootObject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("handles compositionless objects by going as far as possible", function () {
|
|
||||||
// Idea here is that if we get a path which passes
|
|
||||||
// through an object without a composition, browse controller
|
|
||||||
// should stop at it since remaining IDs cannot be loaded.
|
|
||||||
mockRoute.current.params.ids = testDefaultRoot + "/next/junk";
|
|
||||||
instantiateController();
|
|
||||||
return waitsForNavigation().then(function () {
|
|
||||||
expect(mockScope.navigatedObject).toBe(mockNextObject);
|
|
||||||
expect(mockNavigationService.setNavigation)
|
|
||||||
.toHaveBeenCalledWith(mockNextObject);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("updates the displayed route to reflect current navigation", function () {
|
|
||||||
// In order to trigger a route update and not a route change,
|
|
||||||
// the current route must be updated before location.path is
|
|
||||||
// called.
|
|
||||||
expect(mockRoute.current.pathParams.ids)
|
|
||||||
.not
|
|
||||||
.toBe(testDefaultRoot + '/next');
|
|
||||||
mockLocation.path.and.callFake(function () {
|
|
||||||
expect(mockRoute.current.pathParams.ids)
|
|
||||||
.toBe(testDefaultRoot + '/next');
|
|
||||||
});
|
|
||||||
mockNavigationService.addListener.calls.mostRecent().args[0](
|
|
||||||
mockNextObject
|
|
||||||
);
|
|
||||||
expect(mockLocation.path).toHaveBeenCalledWith(
|
|
||||||
'/browse/' + testDefaultRoot + '/next'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,93 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
["../src/BrowseObjectController"],
|
|
||||||
function (BrowseObjectController) {
|
|
||||||
|
|
||||||
describe("The browse object controller", function () {
|
|
||||||
var mockScope,
|
|
||||||
mockLocation,
|
|
||||||
mockRoute,
|
|
||||||
controller;
|
|
||||||
|
|
||||||
// Utility function; look for a $watch on scope and fire it
|
|
||||||
function fireWatch(expr, value) {
|
|
||||||
mockScope.$watch.calls.all().forEach(function (call) {
|
|
||||||
if (call.args[0] === expr) {
|
|
||||||
call.args[1](value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockScope = jasmine.createSpyObj(
|
|
||||||
"$scope",
|
|
||||||
["$on", "$watch"]
|
|
||||||
);
|
|
||||||
mockRoute = { current: { params: {} } };
|
|
||||||
mockLocation = jasmine.createSpyObj(
|
|
||||||
"$location",
|
|
||||||
["path", "search"]
|
|
||||||
);
|
|
||||||
mockLocation.search.and.returnValue({});
|
|
||||||
|
|
||||||
controller = new BrowseObjectController(
|
|
||||||
mockScope,
|
|
||||||
mockLocation,
|
|
||||||
mockRoute
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("updates query parameters when selected view changes", function () {
|
|
||||||
fireWatch("representation.selected.key", "xyz");
|
|
||||||
expect(mockLocation.search).toHaveBeenCalledWith('view', "xyz");
|
|
||||||
|
|
||||||
// Allows the path index to be checked
|
|
||||||
// prior to setting $route.current
|
|
||||||
mockLocation.path.and.returnValue("/browse/");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets the active view from query parameters", function () {
|
|
||||||
var mockDomainObject = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
['getId', 'getModel', 'getCapability', 'useCapability']
|
|
||||||
),
|
|
||||||
testViews = [
|
|
||||||
{ key: 'abc' },
|
|
||||||
{ key: 'def', someKey: 'some value' },
|
|
||||||
{ key: 'xyz' }
|
|
||||||
];
|
|
||||||
|
|
||||||
mockDomainObject.useCapability.and.callFake(function (c) {
|
|
||||||
return (c === 'view') && testViews;
|
|
||||||
});
|
|
||||||
mockLocation.search.and.returnValue({ view: 'def' });
|
|
||||||
|
|
||||||
fireWatch('domainObject', mockDomainObject);
|
|
||||||
expect(mockScope.representation.selected)
|
|
||||||
.toEqual(testViews[1]);
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,103 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
["../src/InspectorPaneController"],
|
|
||||||
function (InspectorPaneController) {
|
|
||||||
|
|
||||||
describe("The InspectorPaneController", function () {
|
|
||||||
var mockScope,
|
|
||||||
mockAgentService,
|
|
||||||
mockDomainObject,
|
|
||||||
mockWindow,
|
|
||||||
mockStatusCapability,
|
|
||||||
mockNavigationService,
|
|
||||||
mockNavigationUnlistener,
|
|
||||||
mockStatusUnlistener,
|
|
||||||
controller,
|
|
||||||
mockLocation,
|
|
||||||
mockAttrs;
|
|
||||||
|
|
||||||
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.and.returnValue(mockNavigationUnlistener);
|
|
||||||
|
|
||||||
mockStatusUnlistener = jasmine.createSpy("statusUnlistener");
|
|
||||||
mockStatusCapability = jasmine.createSpyObj(
|
|
||||||
"statusCapability",
|
|
||||||
["listen"]
|
|
||||||
);
|
|
||||||
mockStatusCapability.listen.and.returnValue(mockStatusUnlistener);
|
|
||||||
|
|
||||||
mockDomainObject = jasmine.createSpyObj(
|
|
||||||
'domainObject',
|
|
||||||
[
|
|
||||||
'getId',
|
|
||||||
'getModel',
|
|
||||||
'getCapability',
|
|
||||||
'hasCapability'
|
|
||||||
]
|
|
||||||
);
|
|
||||||
mockDomainObject.getId.and.returnValue("domainObject");
|
|
||||||
mockDomainObject.getModel.and.returnValue({});
|
|
||||||
mockDomainObject.hasCapability.and.returnValue(true);
|
|
||||||
mockDomainObject.getCapability.and.returnValue(mockStatusCapability);
|
|
||||||
|
|
||||||
mockLocation = jasmine.createSpyObj('location', ['search']);
|
|
||||||
mockLocation.search.and.returnValue({});
|
|
||||||
|
|
||||||
mockAttrs = {};
|
|
||||||
|
|
||||||
controller = new InspectorPaneController(mockScope, mockAgentService, mockWindow, mockNavigationService, mockLocation, mockAttrs);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("listens for changes to navigation and attaches a status" +
|
|
||||||
" listener", function () {
|
|
||||||
expect(mockNavigationService.addListener).toHaveBeenCalledWith(jasmine.any(Function));
|
|
||||||
mockNavigationService.addListener.calls.mostRecent().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.calls.mostRecent().args[0](mockDomainObject);
|
|
||||||
mockStatusCapability.listen.calls.mostRecent().args[0](["editing"]);
|
|
||||||
expect(controller.visible()).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,79 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MenuArrowControllerSpec. Created by shale on 07/02/2015.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
["../src/MenuArrowController"],
|
|
||||||
function (MenuArrowController) {
|
|
||||||
|
|
||||||
describe("The menu arrow controller ", function () {
|
|
||||||
var mockScope,
|
|
||||||
mockDomainObject,
|
|
||||||
mockEvent,
|
|
||||||
mockContextMenuAction,
|
|
||||||
mockActionContext,
|
|
||||||
controller;
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockScope = jasmine.createSpyObj(
|
|
||||||
"$scope",
|
|
||||||
[""]
|
|
||||||
);
|
|
||||||
mockDomainObject = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
["getCapability"]
|
|
||||||
);
|
|
||||||
mockEvent = jasmine.createSpyObj(
|
|
||||||
"event",
|
|
||||||
["preventDefault"]
|
|
||||||
);
|
|
||||||
mockContextMenuAction = jasmine.createSpyObj(
|
|
||||||
"action",
|
|
||||||
["perform", "getActions"]
|
|
||||||
);
|
|
||||||
mockActionContext = jasmine.createSpyObj(
|
|
||||||
"actionContext",
|
|
||||||
[""]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockActionContext.domainObject = mockDomainObject;
|
|
||||||
mockActionContext.event = mockEvent;
|
|
||||||
mockScope.domainObject = mockDomainObject;
|
|
||||||
mockDomainObject.getCapability.and.returnValue(mockContextMenuAction);
|
|
||||||
mockContextMenuAction.perform.and.returnValue(jasmine.any(Function));
|
|
||||||
|
|
||||||
controller = new MenuArrowController(mockScope);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("calls the context menu action when clicked", function () {
|
|
||||||
// Simulate a click on the menu arrow
|
|
||||||
controller.showMenu(mockEvent);
|
|
||||||
|
|
||||||
// Expect the menu action to be performed
|
|
||||||
expect(mockDomainObject.getCapability).toHaveBeenCalledWith('action');
|
|
||||||
expect(mockContextMenuAction.perform).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,137 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
["../src/ObjectHeaderController"],
|
|
||||||
function (ObjectHeaderController) {
|
|
||||||
|
|
||||||
describe("The object header controller", function () {
|
|
||||||
var mockScope,
|
|
||||||
mockDomainObject,
|
|
||||||
mockCapabilities,
|
|
||||||
mockMutationCapability,
|
|
||||||
mockTypeCapability,
|
|
||||||
mockEvent,
|
|
||||||
mockCurrentTarget,
|
|
||||||
model,
|
|
||||||
controller;
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockMutationCapability = jasmine.createSpyObj("mutation", ["mutate"]);
|
|
||||||
mockTypeCapability = jasmine.createSpyObj("type", ["typeDef", "hasFeature"]);
|
|
||||||
mockTypeCapability.typeDef = { name: ""};
|
|
||||||
mockTypeCapability.hasFeature.and.callFake(function (feature) {
|
|
||||||
return feature === 'creation';
|
|
||||||
});
|
|
||||||
|
|
||||||
mockCapabilities = {
|
|
||||||
mutation: mockMutationCapability,
|
|
||||||
type: mockTypeCapability
|
|
||||||
};
|
|
||||||
|
|
||||||
model = {
|
|
||||||
name: "Test name"
|
|
||||||
};
|
|
||||||
mockDomainObject = jasmine.createSpyObj("domainObject", ["getCapability", "getModel"]);
|
|
||||||
mockDomainObject.getModel.and.returnValue(model);
|
|
||||||
mockDomainObject.getCapability.and.callFake(function (key) {
|
|
||||||
return mockCapabilities[key];
|
|
||||||
});
|
|
||||||
|
|
||||||
mockScope = {
|
|
||||||
domainObject: mockDomainObject
|
|
||||||
};
|
|
||||||
|
|
||||||
mockCurrentTarget = jasmine.createSpyObj("currentTarget", ["blur", "textContent"]);
|
|
||||||
mockCurrentTarget.blur.and.returnValue(mockCurrentTarget);
|
|
||||||
|
|
||||||
mockEvent = {
|
|
||||||
which: {},
|
|
||||||
type: {},
|
|
||||||
currentTarget: mockCurrentTarget
|
|
||||||
};
|
|
||||||
|
|
||||||
controller = new ObjectHeaderController(mockScope);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("updates the model with new name on blur", function () {
|
|
||||||
mockEvent.type = "blur";
|
|
||||||
mockCurrentTarget.textContent = "New name";
|
|
||||||
controller.updateName(mockEvent);
|
|
||||||
|
|
||||||
expect(mockMutationCapability.mutate).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("updates the model with a default for blank names", function () {
|
|
||||||
mockEvent.type = "blur";
|
|
||||||
mockCurrentTarget.textContent = "";
|
|
||||||
controller.updateName(mockEvent);
|
|
||||||
|
|
||||||
expect(mockCurrentTarget.textContent.length).not.toEqual(0);
|
|
||||||
expect(mockMutationCapability.mutate).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not update the model if the same name", function () {
|
|
||||||
mockEvent.type = "blur";
|
|
||||||
mockCurrentTarget.textContent = mockDomainObject.getModel().name;
|
|
||||||
controller.updateName(mockEvent);
|
|
||||||
|
|
||||||
expect(mockMutationCapability.mutate).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("updates the model on enter keypress event only", function () {
|
|
||||||
mockCurrentTarget.textContent = "New name";
|
|
||||||
controller.updateName(mockEvent);
|
|
||||||
|
|
||||||
expect(mockMutationCapability.mutate).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
mockEvent.which = 13;
|
|
||||||
controller.updateName(mockEvent);
|
|
||||||
|
|
||||||
expect(mockMutationCapability.mutate).toHaveBeenCalledWith(jasmine.any(Function));
|
|
||||||
|
|
||||||
mockMutationCapability.mutate.calls.mostRecent().args[0](model);
|
|
||||||
|
|
||||||
expect(mockDomainObject.getModel().name).toBe("New name");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("blurs the field on enter key press", function () {
|
|
||||||
mockCurrentTarget.textContent = "New name";
|
|
||||||
mockEvent.which = 13;
|
|
||||||
controller.updateName(mockEvent);
|
|
||||||
|
|
||||||
expect(mockEvent.currentTarget.blur).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("allows editting name when object is creatable", function () {
|
|
||||||
expect(controller.allowEdit()).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("disallows editting name when object is non-creatable", function () {
|
|
||||||
mockTypeCapability.hasFeature.and.returnValue(false);
|
|
||||||
|
|
||||||
expect(controller.allowEdit()).toBe(false);
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,106 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
["../src/PaneController"],
|
|
||||||
function (PaneController) {
|
|
||||||
|
|
||||||
describe("The PaneController", function () {
|
|
||||||
var mockScope,
|
|
||||||
mockAgentService,
|
|
||||||
mockWindow,
|
|
||||||
controller,
|
|
||||||
mockLocation,
|
|
||||||
mockAttrs;
|
|
||||||
|
|
||||||
// We want to reinstantiate for each test case
|
|
||||||
// because device state can influence constructor-time behavior
|
|
||||||
function instantiateController() {
|
|
||||||
return new PaneController(
|
|
||||||
mockScope,
|
|
||||||
mockAgentService,
|
|
||||||
mockWindow,
|
|
||||||
mockLocation,
|
|
||||||
mockAttrs
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockScope = jasmine.createSpyObj("$scope", ["$on"]);
|
|
||||||
mockAgentService = jasmine.createSpyObj(
|
|
||||||
"agentService",
|
|
||||||
["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"]
|
|
||||||
);
|
|
||||||
mockWindow = jasmine.createSpyObj("$window", ["open"]);
|
|
||||||
|
|
||||||
mockLocation = jasmine.createSpyObj('location', ['search']);
|
|
||||||
mockLocation.search.and.returnValue({});
|
|
||||||
|
|
||||||
mockAttrs = {};
|
|
||||||
});
|
|
||||||
|
|
||||||
it("is initially visible", function () {
|
|
||||||
expect(instantiateController().visible()).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("allows visibility to be toggled", function () {
|
|
||||||
controller = instantiateController();
|
|
||||||
controller.toggle();
|
|
||||||
expect(controller.visible()).toBeFalsy();
|
|
||||||
controller.toggle();
|
|
||||||
expect(controller.visible()).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("collapses on navigation changes on portrait-oriented phones", function () {
|
|
||||||
mockAgentService.isMobile.and.returnValue(true);
|
|
||||||
mockAgentService.isPhone.and.returnValue(true);
|
|
||||||
mockAgentService.isPortrait.and.returnValue(true);
|
|
||||||
controller = instantiateController();
|
|
||||||
expect(controller.visible()).toBeTruthy();
|
|
||||||
|
|
||||||
// Simulate a change from the tree by invoking controller's
|
|
||||||
controller.callback();
|
|
||||||
|
|
||||||
// Tree should have collapsed
|
|
||||||
expect(controller.visible()).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("specifying hideParameter", function () {
|
|
||||||
beforeEach(function () {
|
|
||||||
mockAttrs = {hideParameter: 'hideTree'};
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets pane state to false when in location.search", function () {
|
|
||||||
mockLocation.search.and.returnValue({'hideTree': true});
|
|
||||||
expect(instantiateController().visible()).toBe(false);
|
|
||||||
expect(mockLocation.search).toHaveBeenCalledWith('hideTree', undefined);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets state to true when not found in location.search", function () {
|
|
||||||
mockLocation.search.and.returnValue({});
|
|
||||||
expect(instantiateController().visible()).toBe(true);
|
|
||||||
expect(mockLocation.search).not.toHaveBeenCalledWith('hideTree', undefined);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -27,7 +27,6 @@ define([
|
|||||||
"./src/actions/EditAndComposeAction",
|
"./src/actions/EditAndComposeAction",
|
||||||
"./src/actions/EditAction",
|
"./src/actions/EditAction",
|
||||||
"./src/actions/PropertiesAction",
|
"./src/actions/PropertiesAction",
|
||||||
"./src/actions/RemoveAction",
|
|
||||||
"./src/actions/SaveAction",
|
"./src/actions/SaveAction",
|
||||||
"./src/actions/SaveAndStopEditingAction",
|
"./src/actions/SaveAndStopEditingAction",
|
||||||
"./src/actions/SaveAsAction",
|
"./src/actions/SaveAsAction",
|
||||||
@ -58,7 +57,6 @@ define([
|
|||||||
EditAndComposeAction,
|
EditAndComposeAction,
|
||||||
EditAction,
|
EditAction,
|
||||||
PropertiesAction,
|
PropertiesAction,
|
||||||
RemoveAction,
|
|
||||||
SaveAction,
|
SaveAction,
|
||||||
SaveAndStopEditingAction,
|
SaveAndStopEditingAction,
|
||||||
SaveAsAction,
|
SaveAsAction,
|
||||||
@ -158,18 +156,6 @@ define([
|
|||||||
"dialogService"
|
"dialogService"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"key": "remove",
|
|
||||||
"category": "legacy",
|
|
||||||
"implementation": RemoveAction,
|
|
||||||
"cssClass": "icon-trash",
|
|
||||||
"name": "Remove",
|
|
||||||
"description": "Remove this object from its containing object.",
|
|
||||||
"depends": [
|
|
||||||
"openmct",
|
|
||||||
"navigationService"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"key": "save-and-stop-editing",
|
"key": "save-and-stop-editing",
|
||||||
"category": "save",
|
"category": "save",
|
||||||
|
@ -1,131 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module defining RemoveAction. Created by vwoeltje on 11/17/14.
|
|
||||||
*/
|
|
||||||
define([], function () {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct an action which will remove the provided object manifestation.
|
|
||||||
* The object will be removed from its parent's composition; the parent
|
|
||||||
* is looked up via the "context" capability (so this will be the
|
|
||||||
* immediate ancestor by which this specific object was reached.)
|
|
||||||
*
|
|
||||||
* @param {DialogService} dialogService a service which will show the dialog
|
|
||||||
* @param {NavigationService} navigationService a service that maintains the current navigation state
|
|
||||||
* @param {ActionContext} context the context in which this action is performed
|
|
||||||
* @memberof platform/commonUI/edit
|
|
||||||
* @constructor
|
|
||||||
* @implements {Action}
|
|
||||||
*/
|
|
||||||
function RemoveAction(openmct, navigationService, context) {
|
|
||||||
this.domainObject = (context || {}).domainObject;
|
|
||||||
this.openmct = openmct;
|
|
||||||
this.navigationService = navigationService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform this action.
|
|
||||||
*/
|
|
||||||
RemoveAction.prototype.perform = function () {
|
|
||||||
var dialog,
|
|
||||||
domainObject = this.domainObject,
|
|
||||||
navigationService = this.navigationService;
|
|
||||||
/*
|
|
||||||
* Check whether an object ID matches the ID of the object being
|
|
||||||
* removed (used to filter a parent's composition to handle the
|
|
||||||
* removal.)
|
|
||||||
*/
|
|
||||||
function isNotObject(otherObjectId) {
|
|
||||||
return otherObjectId !== domainObject.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mutate a parent object such that it no longer contains the object
|
|
||||||
* which is being removed.
|
|
||||||
*/
|
|
||||||
function doMutate(model) {
|
|
||||||
model.composition = model.composition.filter(isNotObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks current object and ascendants of current
|
|
||||||
* object with object being removed, if the current
|
|
||||||
* object or any in the current object's path is being removed,
|
|
||||||
* navigate back to parent of removed object.
|
|
||||||
*/
|
|
||||||
function checkObjectNavigation(object, parentObject) {
|
|
||||||
// Traverse object starts at current location
|
|
||||||
var traverseObject = (navigationService).getNavigation(),
|
|
||||||
context;
|
|
||||||
|
|
||||||
// Stop when object is not defined (above ROOT)
|
|
||||||
while (traverseObject) {
|
|
||||||
// If object currently traversed to is object being removed
|
|
||||||
// navigate to parent of current object and then exit loop
|
|
||||||
if (traverseObject.getId() === object.getId()) {
|
|
||||||
navigationService.setNavigation(parentObject);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Traverses to parent of current object, moving
|
|
||||||
// up the ascendant path
|
|
||||||
context = traverseObject.getCapability('context');
|
|
||||||
traverseObject = context && context.getParent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove the object from its parent, as identified by its context
|
|
||||||
* capability. Based on object's location and selected object's location
|
|
||||||
* user may be navigated to existing parent object
|
|
||||||
*/
|
|
||||||
function removeFromContext() {
|
|
||||||
var contextCapability = domainObject.getCapability('context'),
|
|
||||||
parent = contextCapability.getParent();
|
|
||||||
|
|
||||||
// If currently within path of removed object(s),
|
|
||||||
// navigates to existing object up tree
|
|
||||||
checkObjectNavigation(domainObject, parent);
|
|
||||||
|
|
||||||
return parent.useCapability('mutation', doMutate);
|
|
||||||
}
|
|
||||||
|
|
||||||
removeFromContext();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Object needs to have a parent for Remove to be applicable
|
|
||||||
RemoveAction.appliesTo = function (context) {
|
|
||||||
var object = (context || {}).domainObject,
|
|
||||||
contextCapability = object && object.getCapability("context"),
|
|
||||||
parent = contextCapability && contextCapability.getParent(),
|
|
||||||
parentType = parent && parent.getCapability('type'),
|
|
||||||
parentCreatable = parentType && parentType.hasFeature('creation');
|
|
||||||
|
|
||||||
// Only creatable types should be modifiable
|
|
||||||
return parent !== undefined &&
|
|
||||||
Array.isArray(parent.getModel().composition) &&
|
|
||||||
parentCreatable;
|
|
||||||
};
|
|
||||||
|
|
||||||
return RemoveAction;
|
|
||||||
});
|
|
@ -1,255 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
* Open MCT includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
define(
|
|
||||||
["../../src/actions/RemoveAction"],
|
|
||||||
function (RemoveAction) {
|
|
||||||
|
|
||||||
describe("The Remove action", function () {
|
|
||||||
var action,
|
|
||||||
actionContext,
|
|
||||||
capabilities,
|
|
||||||
mockContext,
|
|
||||||
mockOverlayAPI,
|
|
||||||
mockDomainObject,
|
|
||||||
mockMutation,
|
|
||||||
mockNavigationService,
|
|
||||||
mockParent,
|
|
||||||
mockType,
|
|
||||||
model;
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockDomainObject = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
["getId", "getCapability", "getModel"]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockMutation = jasmine.createSpyObj("mutation", ["invoke"]);
|
|
||||||
mockType = jasmine.createSpyObj("type", ["hasFeature"]);
|
|
||||||
mockType.hasFeature.and.returnValue(true);
|
|
||||||
|
|
||||||
capabilities = {
|
|
||||||
mutation: mockMutation,
|
|
||||||
type: mockType
|
|
||||||
};
|
|
||||||
|
|
||||||
model = {
|
|
||||||
composition: ["a", "test", "b"]
|
|
||||||
};
|
|
||||||
|
|
||||||
mockParent = {
|
|
||||||
getModel: function () {
|
|
||||||
return model;
|
|
||||||
},
|
|
||||||
getCapability: function (k) {
|
|
||||||
return capabilities[k];
|
|
||||||
},
|
|
||||||
useCapability: function (k, v) {
|
|
||||||
return capabilities[k].invoke(v);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mockOverlayAPI = jasmine.createSpyObj(
|
|
||||||
"overlayAPI",
|
|
||||||
["dialog"]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockNavigationService = jasmine.createSpyObj(
|
|
||||||
"navigationService",
|
|
||||||
[
|
|
||||||
"getNavigation",
|
|
||||||
"setNavigation",
|
|
||||||
"addListener",
|
|
||||||
"removeListener"
|
|
||||||
]
|
|
||||||
);
|
|
||||||
mockNavigationService.getNavigation.and.returnValue(mockDomainObject);
|
|
||||||
|
|
||||||
mockContext = jasmine.createSpyObj("context", ["getParent"]);
|
|
||||||
mockContext.getParent.and.returnValue(mockParent);
|
|
||||||
|
|
||||||
mockDomainObject.getId.and.returnValue("test");
|
|
||||||
mockDomainObject.getCapability.and.returnValue(mockContext);
|
|
||||||
mockDomainObject.getModel.and.returnValue({name: 'test object'});
|
|
||||||
|
|
||||||
mockContext.getParent.and.returnValue(mockParent);
|
|
||||||
mockType.hasFeature.and.returnValue(true);
|
|
||||||
|
|
||||||
actionContext = { domainObject: mockDomainObject };
|
|
||||||
|
|
||||||
action = new RemoveAction({overlays: mockOverlayAPI}, mockNavigationService, actionContext);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("only applies to objects with parents", function () {
|
|
||||||
expect(RemoveAction.appliesTo(actionContext)).toBeTruthy();
|
|
||||||
|
|
||||||
mockContext.getParent.and.returnValue(undefined);
|
|
||||||
|
|
||||||
expect(RemoveAction.appliesTo(actionContext)).toBeFalsy();
|
|
||||||
|
|
||||||
// Also verify that creatability was checked
|
|
||||||
expect(mockType.hasFeature).toHaveBeenCalledWith('creation');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("shows a blocking message dialog", function () {
|
|
||||||
mockParent = jasmine.createSpyObj(
|
|
||||||
"parent",
|
|
||||||
["getModel", "getCapability", "useCapability"]
|
|
||||||
);
|
|
||||||
|
|
||||||
action.perform();
|
|
||||||
|
|
||||||
expect(mockOverlayAPI.dialog).toHaveBeenCalled();
|
|
||||||
|
|
||||||
// Also check that no mutation happens at this point
|
|
||||||
expect(mockParent.useCapability).not.toHaveBeenCalledWith("mutation", jasmine.any(Function));
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("after the remove callback is triggered", function () {
|
|
||||||
var mockChildContext,
|
|
||||||
mockChildObject,
|
|
||||||
mockDialogHandle,
|
|
||||||
mockGrandchildContext,
|
|
||||||
mockGrandchildObject,
|
|
||||||
mockRootContext,
|
|
||||||
mockRootObject;
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockChildObject = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
["getId", "getCapability"]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockDialogHandle = jasmine.createSpyObj(
|
|
||||||
"dialogHandle",
|
|
||||||
["dismiss"]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockGrandchildObject = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
["getId", "getCapability"]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockRootObject = jasmine.createSpyObj(
|
|
||||||
"domainObject",
|
|
||||||
["getId", "getCapability"]
|
|
||||||
);
|
|
||||||
|
|
||||||
mockChildContext = jasmine.createSpyObj("context", ["getParent"]);
|
|
||||||
mockGrandchildContext = jasmine.createSpyObj("context", ["getParent"]);
|
|
||||||
mockRootContext = jasmine.createSpyObj("context", ["getParent"]);
|
|
||||||
|
|
||||||
mockOverlayAPI.dialog.and.returnValue(mockDialogHandle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("mutates the parent when performed", function () {
|
|
||||||
action.perform();
|
|
||||||
mockOverlayAPI.dialog.calls.mostRecent().args[0]
|
|
||||||
.buttons[0].callback();
|
|
||||||
|
|
||||||
expect(mockMutation.invoke)
|
|
||||||
.toHaveBeenCalledWith(jasmine.any(Function));
|
|
||||||
});
|
|
||||||
|
|
||||||
it("changes composition from its mutation function", function () {
|
|
||||||
var mutator, result;
|
|
||||||
|
|
||||||
action.perform();
|
|
||||||
mockOverlayAPI.dialog.calls.mostRecent().args[0]
|
|
||||||
.buttons[0].callback();
|
|
||||||
|
|
||||||
mutator = mockMutation.invoke.calls.mostRecent().args[0];
|
|
||||||
result = mutator(model);
|
|
||||||
|
|
||||||
// Should not have cancelled the mutation
|
|
||||||
expect(result).not.toBe(false);
|
|
||||||
|
|
||||||
// Simulate mutate's behavior (remove can either return a
|
|
||||||
// new model or modify this one in-place)
|
|
||||||
result = result || model;
|
|
||||||
|
|
||||||
// Should have removed "test" - that was our
|
|
||||||
// mock domain object's id.
|
|
||||||
expect(result.composition).toEqual(["a", "b"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("removes parent of object currently navigated to", function () {
|
|
||||||
// Navigates to child object
|
|
||||||
mockNavigationService.getNavigation.and.returnValue(mockChildObject);
|
|
||||||
|
|
||||||
// Test is id of object being removed
|
|
||||||
// Child object has different id
|
|
||||||
mockDomainObject.getId.and.returnValue("test");
|
|
||||||
mockChildObject.getId.and.returnValue("not test");
|
|
||||||
|
|
||||||
// Sets context for the child and domainObject
|
|
||||||
mockDomainObject.getCapability.and.returnValue(mockContext);
|
|
||||||
mockChildObject.getCapability.and.returnValue(mockChildContext);
|
|
||||||
|
|
||||||
// Parents of child and domainObject are set
|
|
||||||
mockContext.getParent.and.returnValue(mockParent);
|
|
||||||
mockChildContext.getParent.and.returnValue(mockDomainObject);
|
|
||||||
|
|
||||||
mockType.hasFeature.and.returnValue(true);
|
|
||||||
|
|
||||||
action.perform();
|
|
||||||
mockOverlayAPI.dialog.calls.mostRecent().args[0]
|
|
||||||
.buttons[0].callback();
|
|
||||||
|
|
||||||
// Expects navigation to parent of domainObject (removed object)
|
|
||||||
expect(mockNavigationService.setNavigation).toHaveBeenCalledWith(mockParent);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("checks if removing object not in ascendent path (reaches ROOT)", function () {
|
|
||||||
// Navigates to grandchild of ROOT
|
|
||||||
mockNavigationService.getNavigation.and.returnValue(mockGrandchildObject);
|
|
||||||
|
|
||||||
// domainObject (grandparent) is set as ROOT, child and grandchild
|
|
||||||
// are set objects not being removed
|
|
||||||
mockDomainObject.getId.and.returnValue("test 1");
|
|
||||||
mockRootObject.getId.and.returnValue("ROOT");
|
|
||||||
mockChildObject.getId.and.returnValue("not test 2");
|
|
||||||
mockGrandchildObject.getId.and.returnValue("not test 3");
|
|
||||||
|
|
||||||
// Sets context for the grandchild, child, and domainObject
|
|
||||||
mockRootObject.getCapability.and.returnValue(mockRootContext);
|
|
||||||
mockChildObject.getCapability.and.returnValue(mockChildContext);
|
|
||||||
mockGrandchildObject.getCapability.and.returnValue(mockGrandchildContext);
|
|
||||||
|
|
||||||
// Parents of grandchild and child are set
|
|
||||||
mockChildContext.getParent.and.returnValue(mockRootObject);
|
|
||||||
mockGrandchildContext.getParent.and.returnValue(mockChildObject);
|
|
||||||
|
|
||||||
mockType.hasFeature.and.returnValue(true);
|
|
||||||
|
|
||||||
action.perform();
|
|
||||||
mockOverlayAPI.dialog.calls.mostRecent().args[0]
|
|
||||||
.buttons[0].callback();
|
|
||||||
|
|
||||||
// Expects no navigation to occur
|
|
||||||
expect(mockNavigationService.setNavigation).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
|
@ -25,7 +25,7 @@ define(
|
|||||||
["../../src/actions/SaveAsAction"],
|
["../../src/actions/SaveAsAction"],
|
||||||
function (SaveAsAction) {
|
function (SaveAsAction) {
|
||||||
|
|
||||||
describe("The Save As action", function () {
|
xdescribe("The Save As action", function () {
|
||||||
var mockDomainObject,
|
var mockDomainObject,
|
||||||
mockClonedObject,
|
mockClonedObject,
|
||||||
mockEditorCapability,
|
mockEditorCapability,
|
||||||
|
@ -24,7 +24,7 @@ define(
|
|||||||
["../../src/capabilities/EditorCapability"],
|
["../../src/capabilities/EditorCapability"],
|
||||||
function (EditorCapability) {
|
function (EditorCapability) {
|
||||||
|
|
||||||
describe("The editor capability", function () {
|
xdescribe("The editor capability", function () {
|
||||||
var mockDomainObject,
|
var mockDomainObject,
|
||||||
capabilities,
|
capabilities,
|
||||||
mockParentObject,
|
mockParentObject,
|
||||||
|
@ -27,7 +27,7 @@ define(
|
|||||||
["../../src/creation/CreateAction"],
|
["../../src/creation/CreateAction"],
|
||||||
function (CreateAction) {
|
function (CreateAction) {
|
||||||
|
|
||||||
describe("The create action", function () {
|
xdescribe("The create action", function () {
|
||||||
var mockType,
|
var mockType,
|
||||||
mockParent,
|
mockParent,
|
||||||
mockContext,
|
mockContext,
|
||||||
|
@ -27,7 +27,7 @@ define(
|
|||||||
["../../src/creation/CreateWizard"],
|
["../../src/creation/CreateWizard"],
|
||||||
function (CreateWizard) {
|
function (CreateWizard) {
|
||||||
|
|
||||||
describe("The create wizard", function () {
|
xdescribe("The create wizard", function () {
|
||||||
var mockType,
|
var mockType,
|
||||||
mockParent,
|
mockParent,
|
||||||
mockProperties,
|
mockProperties,
|
||||||
|
@ -26,7 +26,7 @@ define([
|
|||||||
'zepto'
|
'zepto'
|
||||||
], function (TreeView, $) {
|
], function (TreeView, $) {
|
||||||
|
|
||||||
describe("TreeView", function () {
|
xdescribe("TreeView", function () {
|
||||||
var mockGestureService,
|
var mockGestureService,
|
||||||
mockGestureHandle,
|
mockGestureHandle,
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
|
@ -24,7 +24,7 @@ define(
|
|||||||
['../src/NotificationIndicatorController'],
|
['../src/NotificationIndicatorController'],
|
||||||
function (NotificationIndicatorController) {
|
function (NotificationIndicatorController) {
|
||||||
|
|
||||||
describe("The notification indicator controller ", function () {
|
xdescribe("The notification indicator controller ", function () {
|
||||||
var mockNotificationService,
|
var mockNotificationService,
|
||||||
mockScope,
|
mockScope,
|
||||||
mockDialogService,
|
mockDialogService,
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
define(
|
define(
|
||||||
["../src/ComposeActionPolicy"],
|
["../src/ComposeActionPolicy"],
|
||||||
function (ComposeActionPolicy) {
|
function (ComposeActionPolicy) {
|
||||||
describe("The compose action policy", function () {
|
xdescribe("The compose action policy", function () {
|
||||||
var mockInjector,
|
var mockInjector,
|
||||||
mockPolicyService,
|
mockPolicyService,
|
||||||
mockTypes,
|
mockTypes,
|
||||||
|
@ -42,7 +42,7 @@ define(
|
|||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("CopyService", function () {
|
xdescribe("CopyService", function () {
|
||||||
var policyService;
|
var policyService;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
|
@ -29,7 +29,7 @@ define(
|
|||||||
],
|
],
|
||||||
function (LinkService, domainObjectFactory, ControlledPromise) {
|
function (LinkService, domainObjectFactory, ControlledPromise) {
|
||||||
|
|
||||||
describe("LinkService", function () {
|
xdescribe("LinkService", function () {
|
||||||
|
|
||||||
var linkService,
|
var linkService,
|
||||||
mockPolicyService;
|
mockPolicyService;
|
||||||
|
@ -34,7 +34,7 @@ define(
|
|||||||
ControlledPromise
|
ControlledPromise
|
||||||
) {
|
) {
|
||||||
|
|
||||||
describe("MoveService", function () {
|
xdescribe("MoveService", function () {
|
||||||
|
|
||||||
var moveService,
|
var moveService,
|
||||||
policyService,
|
policyService,
|
||||||
|
@ -31,7 +31,7 @@ define([
|
|||||||
MCT,
|
MCT,
|
||||||
$
|
$
|
||||||
) {
|
) {
|
||||||
describe("The timer-following indicator", function () {
|
xdescribe("The timer-following indicator", function () {
|
||||||
var timerService;
|
var timerService;
|
||||||
var openmct;
|
var openmct;
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ define(
|
|||||||
var MOCK_ELEMENT_TEMPLATE =
|
var MOCK_ELEMENT_TEMPLATE =
|
||||||
'<div class="l-image-thumbs-wrapper"></div>';
|
'<div class="l-image-thumbs-wrapper"></div>';
|
||||||
|
|
||||||
describe("The Imagery controller", function () {
|
xdescribe("The Imagery controller", function () {
|
||||||
var $scope,
|
var $scope,
|
||||||
openmct,
|
openmct,
|
||||||
oldDomainObject,
|
oldDomainObject,
|
||||||
|
@ -24,7 +24,7 @@ define(
|
|||||||
["../src/MCTFileInput"],
|
["../src/MCTFileInput"],
|
||||||
function (MCTFileInput) {
|
function (MCTFileInput) {
|
||||||
|
|
||||||
describe("The mct-file-input directive", function () {
|
xdescribe("The mct-file-input directive", function () {
|
||||||
|
|
||||||
var mockScope,
|
var mockScope,
|
||||||
mockFileInputService,
|
mockFileInputService,
|
||||||
|
@ -55,13 +55,13 @@ define([
|
|||||||
|
|
||||||
FrameworkLayer.prototype.initializeApplication = function (
|
FrameworkLayer.prototype.initializeApplication = function (
|
||||||
angular,
|
angular,
|
||||||
legacyRegistry,
|
openmct,
|
||||||
logLevel
|
logLevel
|
||||||
) {
|
) {
|
||||||
var $http = this.$http,
|
var $http = this.$http,
|
||||||
$log = this.$log,
|
$log = this.$log,
|
||||||
app = angular.module(Constants.MODULE_NAME, ["ngRoute"]),
|
app = angular.module(Constants.MODULE_NAME, ["ngRoute"]),
|
||||||
loader = new BundleLoader($http, $log, legacyRegistry),
|
loader = new BundleLoader($http, $log, openmct.legacyRegistry),
|
||||||
resolver = new BundleResolver(
|
resolver = new BundleResolver(
|
||||||
new ExtensionResolver(
|
new ExtensionResolver(
|
||||||
new ImplementationLoader({}),
|
new ImplementationLoader({}),
|
||||||
@ -77,7 +77,7 @@ define([
|
|||||||
),
|
),
|
||||||
bootstrapper = new ApplicationBootstrapper(
|
bootstrapper = new ApplicationBootstrapper(
|
||||||
angular,
|
angular,
|
||||||
window.document,
|
openmct.element,
|
||||||
$log
|
$log
|
||||||
),
|
),
|
||||||
initializer = new FrameworkInitializer(
|
initializer = new FrameworkInitializer(
|
||||||
|
@ -41,7 +41,7 @@ define(
|
|||||||
function Main() {
|
function Main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Main.prototype.run = function (legacyRegistry) {
|
Main.prototype.run = function (openmct) {
|
||||||
// Get a reference to Angular's injector, so we can get $http and $log
|
// Get a reference to Angular's injector, so we can get $http and $log
|
||||||
// services, which are useful to the framework layer.
|
// services, which are useful to the framework layer.
|
||||||
var injector = angular.injector(['ng']);
|
var injector = angular.injector(['ng']);
|
||||||
@ -53,7 +53,7 @@ define(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return injector.instantiate(['$http', '$log', FrameworkLayer])
|
return injector.instantiate(['$http', '$log', FrameworkLayer])
|
||||||
.initializeApplication(angular, legacyRegistry, logLevel());
|
.initializeApplication(angular, openmct, logLevel());
|
||||||
};
|
};
|
||||||
|
|
||||||
return Main;
|
return Main;
|
||||||
|
@ -72,7 +72,6 @@ define([
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
openmct.legacyRegistry.enable('platform/import-export');
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -29,7 +29,7 @@ define(
|
|||||||
],
|
],
|
||||||
function (ExportAsJSONAction, domainObjectFactory, MCT, AdapterCapability) {
|
function (ExportAsJSONAction, domainObjectFactory, MCT, AdapterCapability) {
|
||||||
|
|
||||||
describe("The export JSON action", function () {
|
xdescribe("The export JSON action", function () {
|
||||||
|
|
||||||
var context,
|
var context,
|
||||||
action,
|
action,
|
||||||
|
@ -27,7 +27,7 @@ define(
|
|||||||
],
|
],
|
||||||
function (ImportAsJSONAction, domainObjectFactory) {
|
function (ImportAsJSONAction, domainObjectFactory) {
|
||||||
|
|
||||||
describe("The import JSON action", function () {
|
xdescribe("The import JSON action", function () {
|
||||||
|
|
||||||
var context = {};
|
var context = {};
|
||||||
var action,
|
var action,
|
||||||
|
@ -24,7 +24,7 @@ define(
|
|||||||
["../src/CouchIndicator"],
|
["../src/CouchIndicator"],
|
||||||
function (CouchIndicator) {
|
function (CouchIndicator) {
|
||||||
|
|
||||||
describe("The CouchDB status indicator", function () {
|
xdescribe("The CouchDB status indicator", function () {
|
||||||
var mockHttp,
|
var mockHttp,
|
||||||
mockInterval,
|
mockInterval,
|
||||||
testPath,
|
testPath,
|
||||||
|
@ -24,7 +24,7 @@ define(
|
|||||||
["../src/ElasticIndicator"],
|
["../src/ElasticIndicator"],
|
||||||
function (ElasticIndicator) {
|
function (ElasticIndicator) {
|
||||||
|
|
||||||
describe("The ElasticSearch status indicator", function () {
|
xdescribe("The ElasticSearch status indicator", function () {
|
||||||
var mockHttp,
|
var mockHttp,
|
||||||
mockInterval,
|
mockInterval,
|
||||||
testPath,
|
testPath,
|
||||||
|
@ -24,7 +24,7 @@ define(
|
|||||||
["../src/LocalStorageIndicator"],
|
["../src/LocalStorageIndicator"],
|
||||||
function (LocalStorageIndicator) {
|
function (LocalStorageIndicator) {
|
||||||
|
|
||||||
describe("The local storage status indicator", function () {
|
xdescribe("The local storage status indicator", function () {
|
||||||
var indicator;
|
var indicator;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
|
@ -32,14 +32,6 @@ define(
|
|||||||
mockPromise,
|
mockPromise,
|
||||||
handler;
|
handler;
|
||||||
|
|
||||||
function asPromise(value) {
|
|
||||||
return (value || {}).then ? value : {
|
|
||||||
then: function (callback) {
|
|
||||||
return asPromise(callback(value));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeMockFailure(id, index) {
|
function makeMockFailure(id, index) {
|
||||||
var mockFailure = jasmine.createSpyObj(
|
var mockFailure = jasmine.createSpyObj(
|
||||||
'failure-' + id,
|
'failure-' + id,
|
||||||
|
@ -29,6 +29,7 @@ define([
|
|||||||
"./res/templates/search.html",
|
"./res/templates/search.html",
|
||||||
"./res/templates/search-menu.html",
|
"./res/templates/search-menu.html",
|
||||||
"raw-loader!./src/services/GenericSearchWorker.js",
|
"raw-loader!./src/services/GenericSearchWorker.js",
|
||||||
|
"raw-loader!./src/services/BareBonesSearchWorker.js",
|
||||||
'legacyRegistry'
|
'legacyRegistry'
|
||||||
], function (
|
], function (
|
||||||
SearchController,
|
SearchController,
|
||||||
@ -39,6 +40,7 @@ define([
|
|||||||
searchTemplate,
|
searchTemplate,
|
||||||
searchMenuTemplate,
|
searchMenuTemplate,
|
||||||
searchWorkerText,
|
searchWorkerText,
|
||||||
|
BareBonesSearchWorkerText,
|
||||||
legacyRegistry
|
legacyRegistry
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@ -53,6 +55,11 @@ define([
|
|||||||
"ROOT"
|
"ROOT"
|
||||||
],
|
],
|
||||||
"priority": "fallback"
|
"priority": "fallback"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "USE_LEGACY_INDEXER",
|
||||||
|
"value": false,
|
||||||
|
"priority": 2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"controllers": [
|
"controllers": [
|
||||||
@ -101,6 +108,7 @@ define([
|
|||||||
"workerService",
|
"workerService",
|
||||||
"topic",
|
"topic",
|
||||||
"GENERIC_SEARCH_ROOTS",
|
"GENERIC_SEARCH_ROOTS",
|
||||||
|
"USE_LEGACY_INDEXER",
|
||||||
"openmct"
|
"openmct"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -115,6 +123,10 @@ define([
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"workers": [
|
"workers": [
|
||||||
|
{
|
||||||
|
"key": "bareBonesSearchWorker",
|
||||||
|
"scriptText": BareBonesSearchWorkerText
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"key": "genericSearchWorker",
|
"key": "genericSearchWorker",
|
||||||
"scriptText": searchWorkerText
|
"scriptText": searchWorkerText
|
||||||
|
80
platform/search/src/services/BareBonesSearchWorker.js
Normal file
80
platform/search/src/services/BareBonesSearchWorker.js
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2018, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*global self*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining BareBonesSearchWorker. Created by deeptailor on 10/03/2019.
|
||||||
|
*/
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
// An array of objects composed of domain object IDs and names
|
||||||
|
// {id: domainObject's ID, name: domainObject's name}
|
||||||
|
var indexedItems = [];
|
||||||
|
|
||||||
|
function indexItem(id, model) {
|
||||||
|
indexedItems.push({
|
||||||
|
id: id,
|
||||||
|
name: model.name.toLowerCase()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets search results from the indexedItems based on provided search
|
||||||
|
* input. Returns matching results from indexedItems
|
||||||
|
*
|
||||||
|
* @param data An object which contains:
|
||||||
|
* * input: The original string which we are searching with
|
||||||
|
* * maxResults: The maximum number of search results desired
|
||||||
|
* * queryId: an id identifying this query, will be returned.
|
||||||
|
*/
|
||||||
|
function search(data) {
|
||||||
|
// This results dictionary will have domain object ID keys which
|
||||||
|
// point to the value the domain object's score.
|
||||||
|
var results,
|
||||||
|
input = data.input.trim().toLowerCase(),
|
||||||
|
message = {
|
||||||
|
request: 'search',
|
||||||
|
results: {},
|
||||||
|
total: 0,
|
||||||
|
queryId: data.queryId
|
||||||
|
};
|
||||||
|
|
||||||
|
results = indexedItems.filter((indexedItem) => {
|
||||||
|
return indexedItem.name.includes(input);
|
||||||
|
});
|
||||||
|
|
||||||
|
message.total = results.length;
|
||||||
|
message.results = results
|
||||||
|
.slice(0, data.maxResults);
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.onmessage = function (event) {
|
||||||
|
if (event.data.request === 'index') {
|
||||||
|
indexItem(event.data.id, event.data.model);
|
||||||
|
} else if (event.data.request === 'search') {
|
||||||
|
self.postMessage(search(event.data));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}());
|
@ -44,7 +44,7 @@ define([
|
|||||||
* @param {TopicService} topic the topic service.
|
* @param {TopicService} topic the topic service.
|
||||||
* @param {Array} ROOTS An array of object Ids to begin indexing.
|
* @param {Array} ROOTS An array of object Ids to begin indexing.
|
||||||
*/
|
*/
|
||||||
function GenericSearchProvider($q, $log, modelService, workerService, topic, ROOTS, openmct) {
|
function GenericSearchProvider($q, $log, modelService, workerService, topic, ROOTS, USE_LEGACY_INDEXER, openmct) {
|
||||||
var provider = this;
|
var provider = this;
|
||||||
this.$q = $q;
|
this.$q = $q;
|
||||||
this.$log = $log;
|
this.$log = $log;
|
||||||
@ -58,6 +58,8 @@ define([
|
|||||||
|
|
||||||
this.pendingQueries = {};
|
this.pendingQueries = {};
|
||||||
|
|
||||||
|
this.USE_LEGACY_INDEXER = USE_LEGACY_INDEXER;
|
||||||
|
|
||||||
this.worker = this.startWorker(workerService);
|
this.worker = this.startWorker(workerService);
|
||||||
this.indexOnMutation(topic);
|
this.indexOnMutation(topic);
|
||||||
|
|
||||||
@ -101,8 +103,14 @@ define([
|
|||||||
* @returns worker the created search worker.
|
* @returns worker the created search worker.
|
||||||
*/
|
*/
|
||||||
GenericSearchProvider.prototype.startWorker = function (workerService) {
|
GenericSearchProvider.prototype.startWorker = function (workerService) {
|
||||||
var worker = workerService.run('genericSearchWorker'),
|
var provider = this,
|
||||||
provider = this;
|
worker;
|
||||||
|
|
||||||
|
if (this.USE_LEGACY_INDEXER) {
|
||||||
|
worker = workerService.run('genericSearchWorker');
|
||||||
|
} else {
|
||||||
|
worker = workerService.run('bareBonesSearchWorker');
|
||||||
|
}
|
||||||
|
|
||||||
worker.addEventListener('message', function (messageEvent) {
|
worker.addEventListener('message', function (messageEvent) {
|
||||||
provider.onWorkerMessage(messageEvent);
|
provider.onWorkerMessage(messageEvent);
|
||||||
@ -242,18 +250,34 @@ define([
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pendingQuery = this.pendingQueries[event.data.queryId],
|
var pendingQuery,
|
||||||
|
modelResults;
|
||||||
|
|
||||||
|
if (this.USE_LEGACY_INDEXER) {
|
||||||
|
pendingQuery = this.pendingQueries[event.data.queryId];
|
||||||
modelResults = {
|
modelResults = {
|
||||||
total: event.data.total
|
total: event.data.total
|
||||||
};
|
};
|
||||||
|
|
||||||
modelResults.hits = event.data.results.map(function (hit) {
|
modelResults.hits = event.data.results.map(function (hit) {
|
||||||
return {
|
return {
|
||||||
id: hit.item.id,
|
id: hit.item.id,
|
||||||
model: hit.item.model,
|
model: hit.item.model,
|
||||||
score: hit.matchCount
|
score: hit.matchCount
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
pendingQuery = this.pendingQueries[event.data.queryId];
|
||||||
|
modelResults = {
|
||||||
|
total: event.data.total
|
||||||
};
|
};
|
||||||
});
|
|
||||||
|
modelResults.hits = event.data.results.map(function (hit) {
|
||||||
|
return {
|
||||||
|
id: hit.id
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pendingQuery.resolve(modelResults);
|
pendingQuery.resolve(modelResults);
|
||||||
delete this.pendingQueries[event.data.queryId];
|
delete this.pendingQueries[event.data.queryId];
|
||||||
|
@ -29,7 +29,7 @@ define([
|
|||||||
GenericSearchProvider
|
GenericSearchProvider
|
||||||
) {
|
) {
|
||||||
|
|
||||||
describe('GenericSearchProvider', function () {
|
xdescribe('GenericSearchProvider', function () {
|
||||||
var $q,
|
var $q,
|
||||||
$log,
|
$log,
|
||||||
modelService,
|
modelService,
|
||||||
|
12
src/MCT.js
12
src/MCT.js
@ -95,12 +95,15 @@ define([
|
|||||||
*/
|
*/
|
||||||
function MCT() {
|
function MCT() {
|
||||||
EventEmitter.call(this);
|
EventEmitter.call(this);
|
||||||
|
/* eslint-disable no-undef */
|
||||||
this.buildInfo = {
|
this.buildInfo = {
|
||||||
version: __OPENMCT_VERSION__,
|
version: __OPENMCT_VERSION__,
|
||||||
buildDate: __OPENMCT_BUILD_DATE__,
|
buildDate: __OPENMCT_BUILD_DATE__,
|
||||||
revision: __OPENMCT_REVISION__,
|
revision: __OPENMCT_REVISION__,
|
||||||
branch: __OPENMCT_BUILD_BRANCH__
|
branch: __OPENMCT_BUILD_BRANCH__
|
||||||
};
|
};
|
||||||
|
/* eslint-enable no-undef */
|
||||||
|
|
||||||
|
|
||||||
this.legacyBundle = { extensions: {
|
this.legacyBundle = { extensions: {
|
||||||
services: [
|
services: [
|
||||||
@ -260,10 +263,6 @@ define([
|
|||||||
this.install(this.plugins.Tabs());
|
this.install(this.plugins.Tabs());
|
||||||
this.install(this.plugins.FlexibleLayout());
|
this.install(this.plugins.FlexibleLayout());
|
||||||
this.install(this.plugins.GoToOriginalAction());
|
this.install(this.plugins.GoToOriginalAction());
|
||||||
|
|
||||||
if (typeof BUILD_CONSTANTS !== 'undefined') {
|
|
||||||
this.install(buildInfoPlugin(BUILD_CONSTANTS));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MCT.prototype = Object.create(EventEmitter.prototype);
|
MCT.prototype = Object.create(EventEmitter.prototype);
|
||||||
@ -344,6 +343,8 @@ define([
|
|||||||
domElement = document.body;
|
domElement = document.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.element = domElement;
|
||||||
|
|
||||||
this.legacyExtension('runs', {
|
this.legacyExtension('runs', {
|
||||||
depends: ['navigationService'],
|
depends: ['navigationService'],
|
||||||
implementation: function (navigationService) {
|
implementation: function (navigationService) {
|
||||||
@ -373,7 +374,8 @@ define([
|
|||||||
* @event start
|
* @event start
|
||||||
* @memberof module:openmct.MCT~
|
* @memberof module:openmct.MCT~
|
||||||
*/
|
*/
|
||||||
var startPromise = new Main().run(this.legacyRegistry)
|
const startPromise = new Main()
|
||||||
|
startPromise.run(this)
|
||||||
.then(function (angular) {
|
.then(function (angular) {
|
||||||
this.$angular = angular;
|
this.$angular = angular;
|
||||||
// OpenMCT Object provider doesn't operate properly unless
|
// OpenMCT Object provider doesn't operate properly unless
|
||||||
|
@ -25,7 +25,7 @@ define([
|
|||||||
'./plugins/plugins',
|
'./plugins/plugins',
|
||||||
'legacyRegistry'
|
'legacyRegistry'
|
||||||
], function (MCT, plugins, legacyRegistry) {
|
], function (MCT, plugins, legacyRegistry) {
|
||||||
describe("MCT", function () {
|
xdescribe("MCT", function () {
|
||||||
var openmct;
|
var openmct;
|
||||||
var mockPlugin;
|
var mockPlugin;
|
||||||
var mockPlugin2;
|
var mockPlugin2;
|
||||||
|
@ -37,7 +37,7 @@ define(
|
|||||||
var legacyExtensionFunction = MCT.prototype.legacyExtension;
|
var legacyExtensionFunction = MCT.prototype.legacyExtension;
|
||||||
var legacyIndicatorsRunsFunction;
|
var legacyIndicatorsRunsFunction;
|
||||||
|
|
||||||
describe('The legacy indicators plugin', function () {
|
xdescribe('The legacy indicators plugin', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
mockLegacyExtensionFunction();
|
mockLegacyExtensionFunction();
|
||||||
|
|
||||||
|
@ -21,13 +21,13 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
export default function legacyCompositionPolicyAdapter(openmct) {
|
export default function legacyCompositionPolicyAdapter(openmct) {
|
||||||
const instantiate = this.openmct.$injector.get('instantiate');
|
const instantiate = openmct.$injector.get('instantiate');
|
||||||
const policyService = this.openmct.$injector.get('policyService');
|
const policyService = openmct.$injector.get('policyService');
|
||||||
|
|
||||||
openmct.composition.addPolicy((parent, child) => {
|
openmct.composition.addPolicy((parent, child) => {
|
||||||
|
|
||||||
let parentId = this.openmct.objects.makeKeyString(parent.identifier);
|
let parentId = openmct.objects.makeKeyString(parent.identifier);
|
||||||
let childId = this.openmct.objects.makeKeyString(child.identifier);
|
let childId = openmct.objects.makeKeyString(child.identifier);
|
||||||
|
|
||||||
let legacyParent = instantiate(parent, parentId);
|
let legacyParent = instantiate(parent, parentId);
|
||||||
let legacyChild = instantiate(child, childId);
|
let legacyChild = instantiate(child, childId);
|
||||||
|
@ -3,17 +3,6 @@ define([
|
|||||||
], function (
|
], function (
|
||||||
|
|
||||||
) {
|
) {
|
||||||
const DEFAULT_VIEW_PRIORITY = 100;
|
|
||||||
|
|
||||||
const PRIORITY_LEVELS = {
|
|
||||||
"fallback": Number.NEGATIVE_INFINITY,
|
|
||||||
"default": -100,
|
|
||||||
"none": 0,
|
|
||||||
"optional": DEFAULT_VIEW_PRIORITY,
|
|
||||||
"preferred": 1000,
|
|
||||||
"mandatory": Number.POSITIVE_INFINITY
|
|
||||||
};
|
|
||||||
|
|
||||||
function TypeInspectorViewProvider(typeDefinition, openmct, convertToLegacyObject) {
|
function TypeInspectorViewProvider(typeDefinition, openmct, convertToLegacyObject) {
|
||||||
console.warn(`DEPRECATION WARNING: Migrate ${typeDefinition.key} from ${typeDefinition.bundle.path} to use the new Inspector View APIs. Legacy Inspector view support will be removed soon.`);
|
console.warn(`DEPRECATION WARNING: Migrate ${typeDefinition.key} from ${typeDefinition.bundle.path} to use the new Inspector View APIs. Legacy Inspector view support will be removed soon.`);
|
||||||
let representation = openmct.$injector.get('representations[]')
|
let representation = openmct.$injector.get('representations[]')
|
||||||
|
@ -29,7 +29,7 @@ define(
|
|||||||
MCT,
|
MCT,
|
||||||
MCTIndicators
|
MCTIndicators
|
||||||
) {
|
) {
|
||||||
describe("The Indicator API", function () {
|
xdescribe("The Indicator API", function () {
|
||||||
var openmct;
|
var openmct;
|
||||||
var directive;
|
var directive;
|
||||||
var holderElement;
|
var holderElement;
|
||||||
|
@ -25,7 +25,7 @@ define([
|
|||||||
], function (
|
], function (
|
||||||
TelemetryAPI
|
TelemetryAPI
|
||||||
) {
|
) {
|
||||||
describe('Telemetry API', function () {
|
xdescribe('Telemetry API', function () {
|
||||||
var openmct;
|
var openmct;
|
||||||
var telemetryAPI;
|
var telemetryAPI;
|
||||||
var mockTypeService;
|
var mockTypeService;
|
||||||
|
@ -38,7 +38,7 @@ define([
|
|||||||
canEdit: function (domainObject) {
|
canEdit: function (domainObject) {
|
||||||
return domainObject.type === 'LadTableSet';
|
return domainObject.type === 'LadTableSet';
|
||||||
},
|
},
|
||||||
view: function (domainObject, isEditing, objectPath) {
|
view: function (domainObject, objectPath) {
|
||||||
let component;
|
let component;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -38,7 +38,7 @@ define([
|
|||||||
canEdit: function (domainObject) {
|
canEdit: function (domainObject) {
|
||||||
return domainObject.type === 'LadTable';
|
return domainObject.type === 'LadTable';
|
||||||
},
|
},
|
||||||
view: function (domainObject, isEditing, objectPath) {
|
view: function (domainObject, objectPath) {
|
||||||
let component;
|
let component;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
* Open MCT, Copyright (c) 2014-2019, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@ -35,7 +35,7 @@ define(
|
|||||||
) {
|
) {
|
||||||
var defaultAjaxFunction = $.ajax;
|
var defaultAjaxFunction = $.ajax;
|
||||||
|
|
||||||
describe("The URLIndicator", function () {
|
xdescribe("The URLIndicator", function () {
|
||||||
var openmct;
|
var openmct;
|
||||||
var indicatorElement;
|
var indicatorElement;
|
||||||
var pluginOptions;
|
var pluginOptions;
|
||||||
|
@ -27,7 +27,7 @@ define([
|
|||||||
'zepto',
|
'zepto',
|
||||||
'./dom-observer'
|
'./dom-observer'
|
||||||
], function (AutoflowTabularPlugin, AutoflowTabularConstants, MCT, $, DOMObserver) {
|
], function (AutoflowTabularPlugin, AutoflowTabularConstants, MCT, $, DOMObserver) {
|
||||||
describe("AutoflowTabularPlugin", function () {
|
xdescribe("AutoflowTabularPlugin", function () {
|
||||||
var testType;
|
var testType;
|
||||||
var testObject;
|
var testObject;
|
||||||
var mockmct;
|
var mockmct;
|
||||||
|
@ -46,7 +46,7 @@ define([
|
|||||||
|
|
||||||
return selection.every(isTelemetryObject);
|
return selection.every(isTelemetryObject);
|
||||||
},
|
},
|
||||||
view: function (domainObject, isEditing, objectPath) {
|
view: function (domainObject, objectPath) {
|
||||||
let component;
|
let component;
|
||||||
return {
|
return {
|
||||||
show: function (element) {
|
show: function (element) {
|
||||||
|
@ -20,8 +20,7 @@
|
|||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
define([], function () {
|
define(['lodash'], function (_) {
|
||||||
|
|
||||||
function DisplayLayoutToolbar(openmct) {
|
function DisplayLayoutToolbar(openmct) {
|
||||||
return {
|
return {
|
||||||
name: "Display Layout Toolbar",
|
name: "Display Layout Toolbar",
|
||||||
@ -40,7 +39,7 @@ define([], function () {
|
|||||||
return (selectedParent && selectedParent.context.item && selectedParent.context.item.type === 'layout') ||
|
return (selectedParent && selectedParent.context.item && selectedParent.context.item.type === 'layout') ||
|
||||||
(selectedObject.context.item && selectedObject.context.item.type === 'layout');
|
(selectedObject.context.item && selectedObject.context.item.type === 'layout');
|
||||||
},
|
},
|
||||||
toolbar: function (selection) {
|
toolbar: function (selectedObjects) {
|
||||||
const DIALOG_FORM = {
|
const DIALOG_FORM = {
|
||||||
'text': {
|
'text': {
|
||||||
name: "Text Element Properties",
|
name: "Text Element Properties",
|
||||||
@ -222,7 +221,7 @@ define([], function () {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
method: function (option) {
|
method: function (option) {
|
||||||
selectionPath[1].context.orderItem(option.value, getAllTypes(selection));
|
selectionPath[1].context.orderItem(option.value, getAllTypes(selectedObjects));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -441,11 +440,11 @@ define([], function () {
|
|||||||
return {
|
return {
|
||||||
control: "select-menu",
|
control: "select-menu",
|
||||||
domainObject: selectionPath[1].context.item,
|
domainObject: selectionPath[1].context.item,
|
||||||
applicableSelectedItems: selection.filter(selectionPath => {
|
applicableSelectedItems: selection.filter(path => {
|
||||||
return selectionPath[0].context.layoutItem.type === 'telemetry-view';
|
return path[0].context.layoutItem.type === 'telemetry-view';
|
||||||
}),
|
}),
|
||||||
property: function (selectionPath) {
|
property: function (path) {
|
||||||
return getPath(selectionPath) + ".value";
|
return getPath(path) + ".value";
|
||||||
},
|
},
|
||||||
title: "Set value",
|
title: "Set value",
|
||||||
options: openmct.telemetry.getMetadata(selectionPath[0].context.item).values().map(value => {
|
options: openmct.telemetry.getMetadata(selectionPath[0].context.item).values().map(value => {
|
||||||
@ -500,8 +499,8 @@ define([], function () {
|
|||||||
!selectionPath[0].context.layoutItem;
|
!selectionPath[0].context.layoutItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMainLayoutSelected(selection[0])) {
|
if (isMainLayoutSelected(selectedObjects[0])) {
|
||||||
return [getAddButton(selection)];
|
return [getAddButton(selectedObjects)];
|
||||||
}
|
}
|
||||||
|
|
||||||
let toolbar = {
|
let toolbar = {
|
||||||
@ -517,145 +516,145 @@ define([], function () {
|
|||||||
'remove': []
|
'remove': []
|
||||||
};
|
};
|
||||||
|
|
||||||
selection.forEach(selectionPath => {
|
selectedObjects.forEach(selectionPath => {
|
||||||
let selectedParent = selectionPath[1].context.item;
|
let selectedParent = selectionPath[1].context.item;
|
||||||
let layoutItem = selectionPath[0].context.layoutItem;
|
let layoutItem = selectionPath[0].context.layoutItem;
|
||||||
|
|
||||||
if (layoutItem.type === 'subobject-view') {
|
if (layoutItem.type === 'subobject-view') {
|
||||||
if (toolbar['add-menu'].length === 0 && selectionPath[0].context.item.type === 'layout') {
|
if (toolbar['add-menu'].length === 0 && selectionPath[0].context.item.type === 'layout') {
|
||||||
toolbar['add-menu'] = [getAddButton(selection, selectionPath)];
|
toolbar['add-menu'] = [getAddButton(selectedObjects, selectionPath)];
|
||||||
}
|
}
|
||||||
if (toolbar['toggle-frame'].length === 0) {
|
if (toolbar['toggle-frame'].length === 0) {
|
||||||
toolbar['toggle-frame'] = [getToggleFrameButton(selectedParent, selection)];
|
toolbar['toggle-frame'] = [getToggleFrameButton(selectedParent, selectedObjects)];
|
||||||
}
|
}
|
||||||
if (toolbar.position.length === 0) {
|
if (toolbar.position.length === 0) {
|
||||||
toolbar.position = [
|
toolbar.position = [
|
||||||
getStackOrder(selectedParent, selectionPath),
|
getStackOrder(selectedParent, selectionPath),
|
||||||
getXInput(selectedParent, selection),
|
getXInput(selectedParent, selectedObjects),
|
||||||
getYInput(selectedParent, selection),
|
getYInput(selectedParent, selectedObjects),
|
||||||
getHeightInput(selectedParent, selection),
|
getHeightInput(selectedParent, selectedObjects),
|
||||||
getWidthInput(selectedParent, selection)
|
getWidthInput(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.remove.length === 0) {
|
if (toolbar.remove.length === 0) {
|
||||||
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selection)];
|
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
} else if (layoutItem.type === 'telemetry-view') {
|
} else if (layoutItem.type === 'telemetry-view') {
|
||||||
if (toolbar['display-mode'].length === 0) {
|
if (toolbar['display-mode'].length === 0) {
|
||||||
toolbar['display-mode'] = [getDisplayModeMenu(selectedParent, selection)];
|
toolbar['display-mode'] = [getDisplayModeMenu(selectedParent, selectedObjects)];
|
||||||
}
|
}
|
||||||
if (toolbar['telemetry-value'].length === 0) {
|
if (toolbar['telemetry-value'].length === 0) {
|
||||||
toolbar['telemetry-value'] = [getTelemetryValueMenu(selectionPath, selection)];
|
toolbar['telemetry-value'] = [getTelemetryValueMenu(selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
if (toolbar.style.length < 2) {
|
if (toolbar.style.length < 2) {
|
||||||
toolbar.style = [
|
toolbar.style = [
|
||||||
getFillMenu(selectedParent, selection),
|
getFillMenu(selectedParent, selectedObjects),
|
||||||
getStrokeMenu(selectedParent, selection)
|
getStrokeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar['text-style'].length === 0) {
|
if (toolbar['text-style'].length === 0) {
|
||||||
toolbar['text-style'] = [
|
toolbar['text-style'] = [
|
||||||
getTextColorMenu(selectedParent, selection),
|
getTextColorMenu(selectedParent, selectedObjects),
|
||||||
getTextSizeMenu(selectedParent, selection)
|
getTextSizeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.position.length === 0) {
|
if (toolbar.position.length === 0) {
|
||||||
toolbar.position = [
|
toolbar.position = [
|
||||||
getStackOrder(selectedParent, selectionPath),
|
getStackOrder(selectedParent, selectionPath),
|
||||||
getXInput(selectedParent, selection),
|
getXInput(selectedParent, selectedObjects),
|
||||||
getYInput(selectedParent, selection),
|
getYInput(selectedParent, selectedObjects),
|
||||||
getHeightInput(selectedParent, selection),
|
getHeightInput(selectedParent, selectedObjects),
|
||||||
getWidthInput(selectedParent, selection)
|
getWidthInput(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.remove.length === 0) {
|
if (toolbar.remove.length === 0) {
|
||||||
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selection)];
|
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
} else if (layoutItem.type === 'text-view') {
|
} else if (layoutItem.type === 'text-view') {
|
||||||
if (toolbar.style.length < 2) {
|
if (toolbar.style.length < 2) {
|
||||||
toolbar.style = [
|
toolbar.style = [
|
||||||
getFillMenu(selectedParent, selection),
|
getFillMenu(selectedParent, selectedObjects),
|
||||||
getStrokeMenu(selectedParent, selection)
|
getStrokeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar['text-style'].length === 0) {
|
if (toolbar['text-style'].length === 0) {
|
||||||
toolbar['text-style'] = [
|
toolbar['text-style'] = [
|
||||||
getTextColorMenu(selectedParent, selection),
|
getTextColorMenu(selectedParent, selectedObjects),
|
||||||
getTextSizeMenu(selectedParent, selection)
|
getTextSizeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.position.length === 0) {
|
if (toolbar.position.length === 0) {
|
||||||
toolbar.position = [
|
toolbar.position = [
|
||||||
getStackOrder(selectedParent, selectionPath),
|
getStackOrder(selectedParent, selectionPath),
|
||||||
getXInput(selectedParent, selection),
|
getXInput(selectedParent, selectedObjects),
|
||||||
getYInput(selectedParent, selection),
|
getYInput(selectedParent, selectedObjects),
|
||||||
getHeightInput(selectedParent, selection),
|
getHeightInput(selectedParent, selectedObjects),
|
||||||
getWidthInput(selectedParent, selection)
|
getWidthInput(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.text.length === 0) {
|
if (toolbar.text.length === 0) {
|
||||||
toolbar.text = [getTextButton(selectedParent, selection)];
|
toolbar.text = [getTextButton(selectedParent, selectedObjects)];
|
||||||
}
|
}
|
||||||
if (toolbar.remove.length === 0) {
|
if (toolbar.remove.length === 0) {
|
||||||
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selection)];
|
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
} else if (layoutItem.type === 'box-view') {
|
} else if (layoutItem.type === 'box-view') {
|
||||||
if (toolbar.style.length < 2) {
|
if (toolbar.style.length < 2) {
|
||||||
toolbar.style = [
|
toolbar.style = [
|
||||||
getFillMenu(selectedParent, selection),
|
getFillMenu(selectedParent, selectedObjects),
|
||||||
getStrokeMenu(selectedParent, selection)
|
getStrokeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.position.length === 0) {
|
if (toolbar.position.length === 0) {
|
||||||
toolbar.position = [
|
toolbar.position = [
|
||||||
getStackOrder(selectedParent, selectionPath),
|
getStackOrder(selectedParent, selectionPath),
|
||||||
getXInput(selectedParent, selection),
|
getXInput(selectedParent, selectedObjects),
|
||||||
getYInput(selectedParent, selection),
|
getYInput(selectedParent, selectedObjects),
|
||||||
getHeightInput(selectedParent, selection),
|
getHeightInput(selectedParent, selectedObjects),
|
||||||
getWidthInput(selectedParent, selection)
|
getWidthInput(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.remove.length === 0) {
|
if (toolbar.remove.length === 0) {
|
||||||
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selection)];
|
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
} else if (layoutItem.type === 'image-view') {
|
} else if (layoutItem.type === 'image-view') {
|
||||||
if (toolbar.style.length === 0) {
|
if (toolbar.style.length === 0) {
|
||||||
toolbar.style = [
|
toolbar.style = [
|
||||||
getStrokeMenu(selectedParent, selection)
|
getStrokeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.position.length === 0) {
|
if (toolbar.position.length === 0) {
|
||||||
toolbar.position = [
|
toolbar.position = [
|
||||||
getStackOrder(selectedParent, selectionPath),
|
getStackOrder(selectedParent, selectionPath),
|
||||||
getXInput(selectedParent, selection),
|
getXInput(selectedParent, selectedObjects),
|
||||||
getYInput(selectedParent, selection),
|
getYInput(selectedParent, selectedObjects),
|
||||||
getHeightInput(selectedParent, selection),
|
getHeightInput(selectedParent, selectedObjects),
|
||||||
getWidthInput(selectedParent, selection)
|
getWidthInput(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.url.length === 0) {
|
if (toolbar.url.length === 0) {
|
||||||
toolbar.url = [getURLButton(selectedParent, selection)];
|
toolbar.url = [getURLButton(selectedParent, selectedObjects)];
|
||||||
}
|
}
|
||||||
if (toolbar.remove.length === 0) {
|
if (toolbar.remove.length === 0) {
|
||||||
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selection)];
|
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
} else if (layoutItem.type === 'line-view') {
|
} else if (layoutItem.type === 'line-view') {
|
||||||
if (toolbar.style.length === 0) {
|
if (toolbar.style.length === 0) {
|
||||||
toolbar.style = [
|
toolbar.style = [
|
||||||
getStrokeMenu(selectedParent, selection)
|
getStrokeMenu(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.position.length === 0) {
|
if (toolbar.position.length === 0) {
|
||||||
toolbar.position = [
|
toolbar.position = [
|
||||||
getStackOrder(selectedParent, selectionPath),
|
getStackOrder(selectedParent, selectionPath),
|
||||||
getXInput(selectedParent, selection),
|
getXInput(selectedParent, selectedObjects),
|
||||||
getYInput(selectedParent, selection),
|
getYInput(selectedParent, selectedObjects),
|
||||||
getX2Input(selectedParent, selection),
|
getX2Input(selectedParent, selectedObjects),
|
||||||
getY2Input(selectedParent, selection)
|
getY2Input(selectedParent, selectedObjects)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
if (toolbar.remove.length === 0) {
|
if (toolbar.remove.length === 0) {
|
||||||
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selection)];
|
toolbar.remove = [getRemoveButton(selectedParent, selectionPath, selectedObjects)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -37,7 +37,7 @@ export default function DisplayLayoutPlugin(options) {
|
|||||||
canEdit: function (domainObject) {
|
canEdit: function (domainObject) {
|
||||||
return domainObject.type === 'layout';
|
return domainObject.type === 'layout';
|
||||||
},
|
},
|
||||||
view: function (domainObject, isEditing, objectPath) {
|
view: function (domainObject, objectPath) {
|
||||||
let component;
|
let component;
|
||||||
return {
|
return {
|
||||||
show(container) {
|
show(container) {
|
||||||
|
@ -83,7 +83,7 @@ function (
|
|||||||
mounted: self.focusOnEntry
|
mounted: self.focusOnEntry
|
||||||
};
|
};
|
||||||
|
|
||||||
var notebookVue = Vue.extend({
|
var NotebookVue = Vue.extend({
|
||||||
template: NotebookTemplate,
|
template: NotebookTemplate,
|
||||||
provide: {openmct: self.openmct, domainObject: self.domainObject},
|
provide: {openmct: self.openmct, domainObject: self.domainObject},
|
||||||
components: {
|
components: {
|
||||||
@ -114,7 +114,7 @@ function (
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.NotebookVue = new notebookVue();
|
this.NotebookVue = new NotebookVue();
|
||||||
container.appendChild(this.NotebookVue.$mount().$el);
|
container.appendChild(this.NotebookVue.$mount().$el);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -63,10 +63,10 @@ define([
|
|||||||
|
|
||||||
Object.keys(panels).forEach(key => {
|
Object.keys(panels).forEach(key => {
|
||||||
let panel = panels[key];
|
let panel = panels[key];
|
||||||
let domainObject = childObjects[key];
|
let childDomainObject = childObjects[key];
|
||||||
let identifier = undefined;
|
let identifier = undefined;
|
||||||
|
|
||||||
if (isTelemetry(domainObject)) {
|
if (isTelemetry(childDomainObject)) {
|
||||||
// If object is a telemetry point, convert it to a plot and
|
// If object is a telemetry point, convert it to a plot and
|
||||||
// replace the object in migratedObject composition with the plot.
|
// replace the object in migratedObject composition with the plot.
|
||||||
identifier = {
|
identifier = {
|
||||||
@ -75,19 +75,19 @@ define([
|
|||||||
};
|
};
|
||||||
let plotObject = {
|
let plotObject = {
|
||||||
identifier: identifier,
|
identifier: identifier,
|
||||||
location: domainObject.location,
|
location: childDomainObject.location,
|
||||||
name: domainObject.name,
|
name: childDomainObject.name,
|
||||||
type: "telemetry.plot.overlay"
|
type: "telemetry.plot.overlay"
|
||||||
};
|
};
|
||||||
let plotType = openmct.types.get('telemetry.plot.overlay');
|
let plotType = openmct.types.get('telemetry.plot.overlay');
|
||||||
plotType.definition.initialize(plotObject);
|
plotType.definition.initialize(plotObject);
|
||||||
plotObject.composition.push(domainObject.identifier);
|
plotObject.composition.push(childDomainObject.identifier);
|
||||||
openmct.objects.mutate(plotObject, 'persisted', Date.now());
|
openmct.objects.mutate(plotObject, 'persisted', Date.now());
|
||||||
|
|
||||||
let keyString = openmct.objects.makeKeyString(domainObject.identifier);
|
let keyString = openmct.objects.makeKeyString(childDomainObject.identifier);
|
||||||
let clonedComposition = Object.assign([], migratedObject.composition);
|
let clonedComposition = Object.assign([], migratedObject.composition);
|
||||||
clonedComposition.forEach((identifier, index) => {
|
clonedComposition.forEach((objIdentifier, index) => {
|
||||||
if (openmct.objects.makeKeyString(identifier) === keyString) {
|
if (openmct.objects.makeKeyString(objIdentifier) === keyString) {
|
||||||
migratedObject.composition[index] = plotObject.identifier;
|
migratedObject.composition[index] = plotObject.identifier;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -98,7 +98,7 @@ define([
|
|||||||
height: panel.dimensions[1],
|
height: panel.dimensions[1],
|
||||||
x: panel.position[0],
|
x: panel.position[0],
|
||||||
y: panel.position[1],
|
y: panel.position[1],
|
||||||
identifier: identifier || domainObject.identifier,
|
identifier: identifier || childDomainObject.identifier,
|
||||||
id: uuid(),
|
id: uuid(),
|
||||||
type: 'subobject-view',
|
type: 'subobject-view',
|
||||||
hasFrame: panel.hasFrame
|
hasFrame: panel.hasFrame
|
||||||
|
@ -20,94 +20,97 @@
|
|||||||
at runtime from the About dialog for additional information.
|
at runtime from the About dialog for additional information.
|
||||||
-->
|
-->
|
||||||
<div class="gl-plot plot-legend-{{legend.get('position')}} {{legend.get('expanded')? 'plot-legend-expanded' : 'plot-legend-collapsed'}}">
|
<div class="gl-plot plot-legend-{{legend.get('position')}} {{legend.get('expanded')? 'plot-legend-expanded' : 'plot-legend-collapsed'}}">
|
||||||
<div class="gl-plot-legend"
|
<div class="c-plot-legend gl-plot-legend"
|
||||||
ng-class="{ 'hover-on-plot': !!highlights.length }"
|
ng-class="{ 'hover-on-plot': !!highlights.length }"
|
||||||
ng-show="legend.get('position') !== 'hidden'">
|
ng-show="legend.get('position') !== 'hidden'">
|
||||||
<div class="gl-plot-legend__view-control c-disclosure-triangle is-enabled"
|
<div class="c-plot-legend__view-control gl-plot-legend__view-control c-disclosure-triangle is-enabled"
|
||||||
ng-class="{ 'c-disclosure-triangle--expanded': legend.get('expanded') }"
|
ng-class="{ 'c-disclosure-triangle--expanded': legend.get('expanded') }"
|
||||||
ng-click="legend.set('expanded', !legend.get('expanded'));">
|
ng-click="legend.set('expanded', !legend.get('expanded'));">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- COLLAPSED PLOT LEGEND -->
|
<div class="c-plot-legend__wrapper">
|
||||||
<div class="plot-wrapper-collapsed-legend"
|
|
||||||
ng-class="{'icon-cursor-lock': !!lockHighlightPoint}">
|
|
||||||
<div class="plot-legend-item"
|
|
||||||
ng-repeat="series in series track by $index">
|
|
||||||
<div class="plot-series-swatch-and-name">
|
|
||||||
<span class="plot-series-color-swatch"
|
|
||||||
ng-style="{ 'background-color': series.get('color').asHexString() }">
|
|
||||||
</span>
|
|
||||||
<span class="plot-series-name">{{ series.get('name') }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="plot-series-value hover-value-enabled value-to-display-{{ legend.get('valueToShowWhenCollapsed') }} {{ series.closest.mctLimitState.cssClass }}"
|
|
||||||
ng-class="{ 'cursor-hover': (legend.get('valueToShowWhenCollapsed').indexOf('nearest') != -1) }"
|
|
||||||
ng-show="!!highlights.length && legend.get('valueToShowWhenCollapsed') !== 'none'">
|
|
||||||
{{ legend.get('valueToShowWhenCollapsed') === 'nearestValue' ?
|
|
||||||
series.formatY(series.closest) :
|
|
||||||
legend.get('valueToShowWhenCollapsed') === 'nearestTimestamp' ?
|
|
||||||
series.closest && series.formatX(series.closest) :
|
|
||||||
series.formatY(series.get('stats')[legend.get('valueToShowWhenCollapsed') + 'Point']);
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- EXPANDED PLOT LEGEND -->
|
<!-- COLLAPSED PLOT LEGEND -->
|
||||||
<div class="plot-wrapper-expanded-legend">
|
<div class="plot-wrapper-collapsed-legend"
|
||||||
<table>
|
ng-class="{'icon-cursor-lock': !!lockHighlightPoint}">
|
||||||
<thead>
|
<div class="plot-legend-item"
|
||||||
<tr>
|
ng-repeat="series in series track by $index">
|
||||||
<th>Name</th>
|
<div class="plot-series-swatch-and-name">
|
||||||
<th ng-if="legend.get('showTimestampWhenExpanded')">
|
|
||||||
Timestamp
|
|
||||||
</th>
|
|
||||||
<th ng-if="legend.get('showValueWhenExpanded')">
|
|
||||||
Value
|
|
||||||
</th>
|
|
||||||
<th ng-if="legend.get('showMinimumWhenExpanded')"
|
|
||||||
class="mobile-hide">
|
|
||||||
Min
|
|
||||||
</th>
|
|
||||||
<th ng-if="legend.get('showMaximumWhenExpanded')"
|
|
||||||
class="mobile-hide">
|
|
||||||
Max
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tr ng-repeat="series in series" class="plot-legend-item">
|
|
||||||
<td class="plot-series-swatch-and-name"
|
|
||||||
ng-class="{'icon-cursor-lock': !!lockHighlightPoint}">
|
|
||||||
<span class="plot-series-color-swatch"
|
<span class="plot-series-color-swatch"
|
||||||
ng-style="{ 'background-color': series.get('color').asHexString() }">
|
ng-style="{ 'background-color': series.get('color').asHexString() }">
|
||||||
</span>
|
</span>
|
||||||
<span class="plot-series-name">{{ series.get('name') }}</span>
|
<span class="plot-series-name">{{ series.get('name') }}</span>
|
||||||
</td>
|
</div>
|
||||||
|
<div class="plot-series-value hover-value-enabled value-to-display-{{ legend.get('valueToShowWhenCollapsed') }} {{ series.closest.mctLimitState.cssClass }}"
|
||||||
|
ng-class="{ 'cursor-hover': (legend.get('valueToShowWhenCollapsed').indexOf('nearest') != -1) }"
|
||||||
|
ng-show="!!highlights.length && legend.get('valueToShowWhenCollapsed') !== 'none'">
|
||||||
|
{{ legend.get('valueToShowWhenCollapsed') === 'nearestValue' ?
|
||||||
|
series.formatY(series.closest) :
|
||||||
|
legend.get('valueToShowWhenCollapsed') === 'nearestTimestamp' ?
|
||||||
|
series.closest && series.formatX(series.closest) :
|
||||||
|
series.formatY(series.get('stats')[legend.get('valueToShowWhenCollapsed') + 'Point']);
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<td ng-if="legend.get('showTimestampWhenExpanded')">
|
<!-- EXPANDED PLOT LEGEND -->
|
||||||
<span class="plot-series-value cursor-hover hover-value-enabled">
|
<div class="plot-wrapper-expanded-legend">
|
||||||
{{ series.closest && series.formatX(series.closest) }}
|
<table>
|
||||||
</span>
|
<thead>
|
||||||
</td>
|
<tr>
|
||||||
<td ng-if="legend.get('showValueWhenExpanded')">
|
<th>Name</th>
|
||||||
<span class="plot-series-value cursor-hover hover-value-enabled"
|
<th ng-if="legend.get('showTimestampWhenExpanded')">
|
||||||
ng-class="series.closest.mctLimitState.cssClass">
|
Timestamp
|
||||||
{{ series.formatY(series.closest) }}
|
</th>
|
||||||
</span>
|
<th ng-if="legend.get('showValueWhenExpanded')">
|
||||||
</td>
|
Value
|
||||||
<td ng-if="legend.get('showMinimumWhenExpanded')"
|
</th>
|
||||||
class="mobile-hide">
|
<th ng-if="legend.get('showMinimumWhenExpanded')"
|
||||||
<span class="plot-series-value">
|
class="mobile-hide">
|
||||||
{{ series.formatY(series.get('stats').minPoint) }}
|
Min
|
||||||
</span>
|
</th>
|
||||||
</td>
|
<th ng-if="legend.get('showMaximumWhenExpanded')"
|
||||||
<td ng-if="legend.get('showMaximumWhenExpanded')"
|
class="mobile-hide">
|
||||||
class="mobile-hide">
|
Max
|
||||||
<span class="plot-series-value">
|
</th>
|
||||||
{{ series.formatY(series.get('stats').maxPoint) }}
|
</tr>
|
||||||
</span>
|
</thead>
|
||||||
</td>
|
<tr ng-repeat="series in series" class="plot-legend-item">
|
||||||
</tr>
|
<td class="plot-series-swatch-and-name"
|
||||||
</table>
|
ng-class="{'icon-cursor-lock': !!lockHighlightPoint}">
|
||||||
|
<span class="plot-series-color-swatch"
|
||||||
|
ng-style="{ 'background-color': series.get('color').asHexString() }">
|
||||||
|
</span>
|
||||||
|
<span class="plot-series-name">{{ series.get('name') }}</span>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td ng-if="legend.get('showTimestampWhenExpanded')">
|
||||||
|
<span class="plot-series-value cursor-hover hover-value-enabled">
|
||||||
|
{{ series.closest && series.formatX(series.closest) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td ng-if="legend.get('showValueWhenExpanded')">
|
||||||
|
<span class="plot-series-value cursor-hover hover-value-enabled"
|
||||||
|
ng-class="series.closest.mctLimitState.cssClass">
|
||||||
|
{{ series.formatY(series.closest) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td ng-if="legend.get('showMinimumWhenExpanded')"
|
||||||
|
class="mobile-hide">
|
||||||
|
<span class="plot-series-value">
|
||||||
|
{{ series.formatY(series.get('stats').minPoint) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td ng-if="legend.get('showMaximumWhenExpanded')"
|
||||||
|
class="mobile-hide">
|
||||||
|
<span class="plot-series-value">
|
||||||
|
{{ series.formatY(series.get('stats').maxPoint) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -214,11 +217,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="gl-plot-axis-area gl-plot-x"
|
<div class="gl-plot-axis-area gl-plot-x">
|
||||||
ng-style="{
|
|
||||||
left: (tickWidth - 30) + 'px'
|
|
||||||
}">
|
|
||||||
|
|
||||||
<mct-ticks axis="xAxis">
|
<mct-ticks axis="xAxis">
|
||||||
<div ng-repeat="tick in ticks track by tick.value"
|
<div ng-repeat="tick in ticks track by tick.value"
|
||||||
class="gl-plot-tick gl-plot-x-tick-label"
|
class="gl-plot-tick gl-plot-x-tick-label"
|
||||||
|
@ -140,7 +140,8 @@ define([
|
|||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
fetch: function (options) {
|
fetch: function (options) {
|
||||||
options = _.extend({}, {size: 1000, strategy: 'minmax', filters: this.filters}, options || {});
|
const strategy = options.shouldUseMinMax ? 'minMax' : undefined;
|
||||||
|
options = _.extend({}, { size: 1000, strategy, filters: this.filters }, options || {});
|
||||||
if (!this.unsubscribe) {
|
if (!this.unsubscribe) {
|
||||||
this.unsubscribe = this.openmct
|
this.unsubscribe = this.openmct
|
||||||
.telemetry
|
.telemetry
|
||||||
|
@ -31,6 +31,7 @@ define([
|
|||||||
var XAxisModel = Model.extend({
|
var XAxisModel = Model.extend({
|
||||||
initialize: function (options) {
|
initialize: function (options) {
|
||||||
this.plot = options.plot;
|
this.plot = options.plot;
|
||||||
|
this.set('label', options.model.name || '');
|
||||||
this.on('change:range', function (newValue, oldValue, model) {
|
this.on('change:range', function (newValue, oldValue, model) {
|
||||||
if (!model.get('frozen')) {
|
if (!model.get('frozen')) {
|
||||||
model.set('displayRange', newValue);
|
model.set('displayRange', newValue);
|
||||||
|
@ -102,7 +102,8 @@ define([
|
|||||||
this.startLoading();
|
this.startLoading();
|
||||||
var options = {
|
var options = {
|
||||||
size: this.$element[0].offsetWidth,
|
size: this.$element[0].offsetWidth,
|
||||||
domain: this.config.xAxis.get('key')
|
domain: this.config.xAxis.get('key'),
|
||||||
|
shouldUseMinMax: this.shouldUseMinMax(series)
|
||||||
};
|
};
|
||||||
|
|
||||||
series.load(options)
|
series.load(options)
|
||||||
@ -133,6 +134,11 @@ define([
|
|||||||
this.listenTo(series, 'change:yKey', function () {
|
this.listenTo(series, 'change:yKey', function () {
|
||||||
this.loadSeriesData(series);
|
this.loadSeriesData(series);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
|
this.listenTo(series, 'change:interpolate', function () {
|
||||||
|
this.loadSeriesData(series);
|
||||||
|
}, this);
|
||||||
|
|
||||||
this.loadSeriesData(series);
|
this.loadSeriesData(series);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -155,6 +161,10 @@ define([
|
|||||||
return config;
|
return config;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PlotController.prototype.shouldUseMinMax = function (series) {
|
||||||
|
return series.model.interpolate !== 'none';
|
||||||
|
};
|
||||||
|
|
||||||
PlotController.prototype.onTimeSystemChange = function (timeSystem) {
|
PlotController.prototype.onTimeSystemChange = function (timeSystem) {
|
||||||
this.config.xAxis.set('key', timeSystem.key);
|
this.config.xAxis.set('key', timeSystem.key);
|
||||||
};
|
};
|
||||||
|
@ -215,9 +215,7 @@ define([
|
|||||||
* Update the widget's appearance from the configuration of the active rule
|
* Update the widget's appearance from the configuration of the active rule
|
||||||
*/
|
*/
|
||||||
SummaryWidget.prototype.updateWidget = function () {
|
SummaryWidget.prototype.updateWidget = function () {
|
||||||
const WIDGET_CLASS = 'c-sw js-sw',
|
const WIDGET_ICON_CLASS = 'c-sw__icon js-sw__icon';
|
||||||
WIDGET_LABEL_CLASS = 'c-sw__label js-sw__label',
|
|
||||||
WIDGET_ICON_CLASS = 'c-sw__icon js-sw__icon';
|
|
||||||
var activeRule = this.rulesById[this.activeId];
|
var activeRule = this.rulesById[this.activeId];
|
||||||
this.applyStyle($('#widget', this.domElement), activeRule.getProperty('style'));
|
this.applyStyle($('#widget', this.domElement), activeRule.getProperty('style'));
|
||||||
$('#widget', this.domElement).prop('title', activeRule.getProperty('message'));
|
$('#widget', this.domElement).prop('title', activeRule.getProperty('message'));
|
||||||
|
@ -1,10 +1,32 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2019, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
define([
|
define([
|
||||||
'./SummaryWidgetTelemetryProvider'
|
'./SummaryWidgetTelemetryProvider'
|
||||||
], function (
|
], function (
|
||||||
SummaryWidgetTelemetryProvider
|
SummaryWidgetTelemetryProvider
|
||||||
) {
|
) {
|
||||||
|
|
||||||
describe('SummaryWidgetTelemetryProvider', function () {
|
xdescribe('SummaryWidgetTelemetryProvider', function () {
|
||||||
var telemObjectA;
|
var telemObjectA;
|
||||||
var telemObjectB;
|
var telemObjectB;
|
||||||
var summaryWidgetObject;
|
var summaryWidgetObject;
|
||||||
|
@ -1,5 +1,27 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2019, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
define(['../src/ConditionManager'], function (ConditionManager) {
|
define(['../src/ConditionManager'], function (ConditionManager) {
|
||||||
describe('A Summary Widget Condition Manager', function () {
|
xdescribe('A Summary Widget Condition Manager', function () {
|
||||||
var conditionManager,
|
var conditionManager,
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
mockCompObject1,
|
mockCompObject1,
|
||||||
|
@ -1,5 +1,27 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2019, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
define(['../src/Condition', 'zepto'], function (Condition, $) {
|
define(['../src/Condition', 'zepto'], function (Condition, $) {
|
||||||
describe('A summary widget condition', function () {
|
xdescribe('A summary widget condition', function () {
|
||||||
var testCondition,
|
var testCondition,
|
||||||
mockConfig,
|
mockConfig,
|
||||||
mockConditionManager,
|
mockConditionManager,
|
||||||
|
@ -1,5 +1,27 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2019, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
define(['../src/SummaryWidget', 'zepto'], function (SummaryWidget, $) {
|
define(['../src/SummaryWidget', 'zepto'], function (SummaryWidget, $) {
|
||||||
describe('The Summary Widget', function () {
|
xdescribe('The Summary Widget', function () {
|
||||||
var summaryWidget,
|
var summaryWidget,
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
mockOldDomainObject,
|
mockOldDomainObject,
|
||||||
|
@ -48,7 +48,7 @@ define([
|
|||||||
canEdit(domainObject) {
|
canEdit(domainObject) {
|
||||||
return domainObject.type === 'table';
|
return domainObject.type === 'table';
|
||||||
},
|
},
|
||||||
view(domainObject, isEditing, objectPath) {
|
view(domainObject, objectPath) {
|
||||||
let table = new TelemetryTable(domainObject, openmct);
|
let table = new TelemetryTable(domainObject, openmct);
|
||||||
let component;
|
let component;
|
||||||
return {
|
return {
|
||||||
|
@ -86,15 +86,18 @@ define(
|
|||||||
*/
|
*/
|
||||||
matchesFilters(row) {
|
matchesFilters(row) {
|
||||||
let doesMatchFilters = true;
|
let doesMatchFilters = true;
|
||||||
for (const key in this.columnFilters) {
|
Object.keys(this.columnFilters).forEach((key) => {
|
||||||
if (!this.rowHasColumn(row, key)) {
|
if (!doesMatchFilters || !this.rowHasColumn(row, key)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
|
||||||
let formattedValue = row.getFormattedValue(key).toLowerCase();
|
|
||||||
doesMatchFilters = doesMatchFilters &&
|
|
||||||
formattedValue.indexOf(this.columnFilters[key]) !== -1;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
let formattedValue = row.getFormattedValue(key);
|
||||||
|
if (formattedValue === undefined) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
doesMatchFilters = formattedValue.toLowerCase().indexOf(this.columnFilters[key]) !== -1;
|
||||||
|
});
|
||||||
return doesMatchFilters;
|
return doesMatchFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ export default {
|
|||||||
rowOffset: 'calculateRowTop',
|
rowOffset: 'calculateRowTop',
|
||||||
row: {
|
row: {
|
||||||
handler: 'formatRow',
|
handler: 'formatRow',
|
||||||
deep: false
|
deep: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
|
@ -166,6 +166,17 @@ define(
|
|||||||
return this.selected.some(selectionPath => _.isEqual(selectionPath[1], selectable[1]));
|
return this.selected.some(selectionPath => _.isEqual(selectionPath[1], selectable[1]));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
Selection.prototype.isSelectable = function (element) {
|
||||||
|
if (!element) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !!element.closest('[data-selectable]');
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
@ -207,12 +218,18 @@ define(
|
|||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
Selection.prototype.selectable = function (element, context, select) {
|
Selection.prototype.selectable = function (element, context, select) {
|
||||||
|
if (!this.isSelectable(element)) {
|
||||||
|
return () => {};
|
||||||
|
}
|
||||||
|
|
||||||
let selectable = {
|
let selectable = {
|
||||||
context: context,
|
context: context,
|
||||||
element: element
|
element: element
|
||||||
};
|
};
|
||||||
|
|
||||||
var capture = this.capture.bind(this, selectable);
|
var capture = this.capture.bind(this, selectable);
|
||||||
var selectCapture = this.selectCapture.bind(this, selectable);
|
var selectCapture = this.selectCapture.bind(this, selectable);
|
||||||
|
|
||||||
element.addEventListener('click', capture, true);
|
element.addEventListener('click', capture, true);
|
||||||
element.addEventListener('click', selectCapture);
|
element.addEventListener('click', selectCapture);
|
||||||
|
|
||||||
|
@ -339,6 +339,7 @@ $stylePlotHash: dashed;
|
|||||||
$colorPlotAreaBorder: $colorInteriorBorder;
|
$colorPlotAreaBorder: $colorInteriorBorder;
|
||||||
$colorPlotLabelFg: pushBack($colorPlotFg, 20%);
|
$colorPlotLabelFg: pushBack($colorPlotFg, 20%);
|
||||||
$legendHoverValueBg: rgba($colorBodyFg, 0.2);
|
$legendHoverValueBg: rgba($colorBodyFg, 0.2);
|
||||||
|
$legendTableHeadBg: rgba($colorBodyFg, 0.15);
|
||||||
|
|
||||||
// Tree
|
// Tree
|
||||||
$colorTreeBg: transparent;
|
$colorTreeBg: transparent;
|
||||||
|
@ -343,6 +343,7 @@ $stylePlotHash: dashed;
|
|||||||
$colorPlotAreaBorder: $colorInteriorBorder;
|
$colorPlotAreaBorder: $colorInteriorBorder;
|
||||||
$colorPlotLabelFg: pushBack($colorPlotFg, 20%);
|
$colorPlotLabelFg: pushBack($colorPlotFg, 20%);
|
||||||
$legendHoverValueBg: rgba($colorBodyFg, 0.2);
|
$legendHoverValueBg: rgba($colorBodyFg, 0.2);
|
||||||
|
$legendTableHeadBg: rgba($colorBodyFg, 0.15);
|
||||||
|
|
||||||
// Tree
|
// Tree
|
||||||
$colorTreeBg: transparent;
|
$colorTreeBg: transparent;
|
||||||
|
@ -339,6 +339,7 @@ $stylePlotHash: dashed;
|
|||||||
$colorPlotAreaBorder: $colorInteriorBorder;
|
$colorPlotAreaBorder: $colorInteriorBorder;
|
||||||
$colorPlotLabelFg: pushBack($colorPlotFg, 20%);
|
$colorPlotLabelFg: pushBack($colorPlotFg, 20%);
|
||||||
$legendHoverValueBg: rgba($colorBodyFg, 0.2);
|
$legendHoverValueBg: rgba($colorBodyFg, 0.2);
|
||||||
|
$legendTableHeadBg: rgba($colorBodyFg, 0.15);
|
||||||
|
|
||||||
// Tree
|
// Tree
|
||||||
$colorTreeBg: transparent;
|
$colorTreeBg: transparent;
|
||||||
|
@ -56,9 +56,11 @@ $tabularTdPadTB: 2px;
|
|||||||
$plotYBarW: 60px;
|
$plotYBarW: 60px;
|
||||||
$plotYLabelMinH: 20px;
|
$plotYLabelMinH: 20px;
|
||||||
$plotYLabelW: 10px;
|
$plotYLabelW: 10px;
|
||||||
$plotXBarH: 20px;
|
$plotXBarH: 35px;
|
||||||
$plotLegendH: 20px;
|
$plotLegendH: 20px;
|
||||||
$plotSwatchD: 8px;
|
$plotLegendWidthCollapsed: 20%;
|
||||||
|
$plotLegendWidthExpanded: 50%;
|
||||||
|
$plotSwatchD: 10px;
|
||||||
$plotDisplayArea: (0, 0, $plotXBarH, $plotYBarW); // 1: Top, 2: right, 3: bottom, 4: left
|
$plotDisplayArea: (0, 0, $plotXBarH, $plotYBarW); // 1: Top, 2: right, 3: bottom, 4: left
|
||||||
$plotMinH: 95px;
|
$plotMinH: 95px;
|
||||||
$controlBarH: 25px;
|
$controlBarH: 25px;
|
||||||
@ -230,6 +232,9 @@ $glyph-icon-flexible-layout: '\eb20';
|
|||||||
$glyph-icon-generator-telemetry: '\eb21';
|
$glyph-icon-generator-telemetry: '\eb21';
|
||||||
$glyph-icon-generator-events: '\eb22';
|
$glyph-icon-generator-events: '\eb22';
|
||||||
$glyph-icon-gauge: '\eb23';
|
$glyph-icon-gauge: '\eb23';
|
||||||
|
$glyph-icon-spectra: '\eb24';
|
||||||
|
$glyph-icon-spectra-telemetry: '\eb25';
|
||||||
|
$glyph-icon-command: '\eb26';
|
||||||
|
|
||||||
/************************** GLYPHS AS DATA URI */
|
/************************** GLYPHS AS DATA URI */
|
||||||
// Only objects have been converted, for use in Create menu and folder views
|
// Only objects have been converted, for use in Create menu and folder views
|
||||||
@ -276,3 +281,6 @@ $bg-icon-flexible-layout: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='ht
|
|||||||
$bg-icon-generator-telemetry: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M76 236.9c5.4-2.1 20.4-17.8 34.9-54.7C126.8 141.5 154.5 93 196 93c19.7 0 38 10.9 54.6 32.5 14 18.2 24.4 40.8 30.5 56.7 14.5 36.9 29.5 52.6 34.9 54.7 5.4-2.1 20.4-17.8 34.9-54.7S388 104.5 421.7 95A192 192 0 0 0 256 0C150 0 64 86 64 192a197.2 197.2 0 0 0 3.7 37.9c3.6 4 6.5 6.3 8.3 7zM442.3 238.5A192.9 192.9 0 0 0 448 192a197.2 197.2 0 0 0-3.7-37.9c-3.6-4-6.5-6.3-8.3-7-5.4 2.1-20.4 17.8-34.9 54.7-10.9 27.9-27.3 59.5-50 76.6z'/%3e%3cpath d='M256 320l67.5-29.5a60.3 60.3 0 0 1-7.5.5c-19.7 0-38-10.9-54.6-32.5-14-18.2-24.4-40.8-30.5-56.7-14.5-36.9-29.5-52.6-34.9-54.7-5.4 2.1-20.4 17.8-34.9 54.7-8.2 21.1-19.6 44.2-34.4 61.6z'/%3e%3cpath d='M512 240L256 352 0 240v160l256 112 256-112V240z'/%3e%3c/svg%3e");
|
$bg-icon-generator-telemetry: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M76 236.9c5.4-2.1 20.4-17.8 34.9-54.7C126.8 141.5 154.5 93 196 93c19.7 0 38 10.9 54.6 32.5 14 18.2 24.4 40.8 30.5 56.7 14.5 36.9 29.5 52.6 34.9 54.7 5.4-2.1 20.4-17.8 34.9-54.7S388 104.5 421.7 95A192 192 0 0 0 256 0C150 0 64 86 64 192a197.2 197.2 0 0 0 3.7 37.9c3.6 4 6.5 6.3 8.3 7zM442.3 238.5A192.9 192.9 0 0 0 448 192a197.2 197.2 0 0 0-3.7-37.9c-3.6-4-6.5-6.3-8.3-7-5.4 2.1-20.4 17.8-34.9 54.7-10.9 27.9-27.3 59.5-50 76.6z'/%3e%3cpath d='M256 320l67.5-29.5a60.3 60.3 0 0 1-7.5.5c-19.7 0-38-10.9-54.6-32.5-14-18.2-24.4-40.8-30.5-56.7-14.5-36.9-29.5-52.6-34.9-54.7-5.4 2.1-20.4 17.8-34.9 54.7-8.2 21.1-19.6 44.2-34.4 61.6z'/%3e%3cpath d='M512 240L256 352 0 240v160l256 112 256-112V240z'/%3e%3c/svg%3e");
|
||||||
$bg-icon-generator-events: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M160 96h192v32H160zM160 224h192v32H160zM160 160h160v32H160z'/%3e%3cpath d='M128 64.1h256V264l64-28V64a64.2 64.2 0 0 0-64-64H128a64.2 64.2 0 0 0-64 64v172l64 28zM329.1 288H182.9l73.1 32 73.1-32z'/%3e%3cpath d='M256 352L0 240v160l256 112 256-112V240L256 352z'/%3e%3c/svg%3e");
|
$bg-icon-generator-events: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M160 96h192v32H160zM160 224h192v32H160zM160 160h160v32H160z'/%3e%3cpath d='M128 64.1h256V264l64-28V64a64.2 64.2 0 0 0-64-64H128a64.2 64.2 0 0 0-64 64v172l64 28zM329.1 288H182.9l73.1 32 73.1-32z'/%3e%3cpath d='M256 352L0 240v160l256 112 256-112V240L256 352z'/%3e%3c/svg%3e");
|
||||||
$bg-icon-gauge: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath d='M256 0C114.6 0 0 114.6 0 256c0 113.2 73.5 209.2 175.3 243L304 256v251.5C422.4 485 512 381 512 256 512 114.6 397.4 0 256 0zm121.4 263.9a159.8 159.8 0 0 0-242.8 0l-73-62.5c4.3-5 8.7-9.8 13.4-14.4a255.9 255.9 0 0 1 362 0c4.7 4.6 9.1 9.4 13.4 14.4z'/%3e%3c/svg%3e");
|
$bg-icon-gauge: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath d='M256 0C114.6 0 0 114.6 0 256c0 113.2 73.5 209.2 175.3 243L304 256v251.5C422.4 485 512 381 512 256 512 114.6 397.4 0 256 0zm121.4 263.9a159.8 159.8 0 0 0-242.8 0l-73-62.5c4.3-5 8.7-9.8 13.4-14.4a255.9 255.9 0 0 1 362 0c4.7 4.6 9.1 9.4 13.4 14.4z'/%3e%3c/svg%3e");
|
||||||
|
$bg-icon-spectra: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M384 352H128l51.2-89.6L0 288v127c0 53.3 43.7 97 97 97h318c53.4 0 97-43.7 97-97v-31l-162.9-93.1zM415 0H97C43.7 0 0 43.6 0 97v159l200-30.1 56-97.9 54.9 96H512V97a97.2 97.2 0 00-97-97zM512 320v-32l-192-32 192 64z'/%3e%3c/svg%3e");
|
||||||
|
$bg-icon-spectra-telemetry: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M256 128l54.9 96H510C494.3 97.7 386.5 0 256 0 114.6 0 0 114.6 0 256l200-30.1zM384 352H128l51.2-89.6L2 287.7C17.6 414.1 125.4 512 256 512c100.8 0 188-58.3 229.8-143l-136.7-78.1zM320 256l192 64v-32l-192-32z'/%3e%3c/svg%3e");
|
||||||
|
$bg-icon-command: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3e%3cpath fill='%23000000' d='M185.1 229.7a96.5 96.5 0 0015.8 11.7A68.5 68.5 0 01192 208c0-19.8 8.9-38.8 25.1-53.7 18.5-17 43.7-26.3 70.9-26.3 20.1 0 39.1 5.1 55.1 14.6a81.3 81.3 0 00-16.2-20.3C308.4 105.3 283.2 96 256 96s-52.4 9.3-70.9 26.3C168.9 137.2 160 156.2 160 176s8.9 38.8 25.1 53.7z'/%3e%3cpath d='M442.7 134.8C422.4 57.5 346.5 0 256 0S89.6 57.5 69.3 134.8C26.3 174.8 0 228.7 0 288c0 123.7 114.6 224 256 224s256-100.3 256-224c0-59.3-26.3-113.2-69.3-153.2zM256 64c70.6 0 128 50.2 128 112s-57.4 112-128 112-128-50.2-128-112S185.4 64 256 64zm0 352c-87.7 0-159.2-63.9-160-142.7 34.4 47.4 93.2 78.7 160 78.7s125.6-31.3 160-78.7c-.8 78.8-72.3 142.7-160 142.7z'/%3e%3c/svg%3e");
|
||||||
|
@ -166,6 +166,9 @@
|
|||||||
.icon-generator-telemetry { @include glyphBefore($glyph-icon-generator-telemetry); }
|
.icon-generator-telemetry { @include glyphBefore($glyph-icon-generator-telemetry); }
|
||||||
.icon-generator-events { @include glyphBefore($glyph-icon-generator-events); }
|
.icon-generator-events { @include glyphBefore($glyph-icon-generator-events); }
|
||||||
.icon-gauge { @include glyphBefore($glyph-icon-gauge); }
|
.icon-gauge { @include glyphBefore($glyph-icon-gauge); }
|
||||||
|
.icon-spectra { @include glyphBefore($glyph-icon-spectra); }
|
||||||
|
.icon-spectra-telemetry { @include glyphBefore($glyph-icon-spectra-telemetry); }
|
||||||
|
.icon-command { @include glyphBefore($glyph-icon-command); }
|
||||||
|
|
||||||
/************************** 12 PX CLASSES */
|
/************************** 12 PX CLASSES */
|
||||||
// TODO: sync with 16px redo as of 10/25/18
|
// TODO: sync with 16px redo as of 10/25/18
|
||||||
@ -220,3 +223,6 @@
|
|||||||
.bg-icon-generator-telemetry { @include glyphBg($bg-icon-generator-telemetry); }
|
.bg-icon-generator-telemetry { @include glyphBg($bg-icon-generator-telemetry); }
|
||||||
.bg-icon-generator-events { @include glyphBg($bg-icon-generator-events); }
|
.bg-icon-generator-events { @include glyphBg($bg-icon-generator-events); }
|
||||||
.bg-icon-gauge { @include glyphBg($bg-icon-gauge); }
|
.bg-icon-gauge { @include glyphBg($bg-icon-gauge); }
|
||||||
|
.bg-icon-spectra { @include glyphBg($bg-icon-spectra); }
|
||||||
|
.bg-icon-spectra-telemetry { @include glyphBg($bg-icon-spectra-telemetry); }
|
||||||
|
.bg-icon-command { @include glyphBg($bg-icon-command); }
|
||||||
|
@ -78,7 +78,6 @@ mct-plot {
|
|||||||
|
|
||||||
/*********************** AXIS AND DISPLAY AREA */
|
/*********************** AXIS AND DISPLAY AREA */
|
||||||
.plot-wrapper-axis-and-display-area {
|
.plot-wrapper-axis-and-display-area {
|
||||||
margin-top: $interiorMargin; // Keep the top tick label from getting clipped
|
|
||||||
position: relative;
|
position: relative;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
|
|
||||||
@ -395,15 +394,28 @@ mct-plot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************** _LEGEND.SCSS */
|
/****************** _LEGEND.SCSS */
|
||||||
.gl-plot-legend {
|
.gl-plot-legend,
|
||||||
display: flex;
|
.c-plot-legend {
|
||||||
align-items: flex-start;
|
&__wrapper {
|
||||||
|
// Holds view-control and both collapsed and expanded legends
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
&__view-control {
|
&__view-control {
|
||||||
padding-top: 2px;
|
padding-top: 2px;
|
||||||
margin-right: $interiorMarginSm;
|
margin-right: $interiorMarginSm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&__header {
|
||||||
|
@include propertiesHeader();
|
||||||
|
margin-bottom: $interiorMarginSm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-plot-legend {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
table {
|
table {
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
th,
|
th,
|
||||||
@ -412,7 +424,9 @@ mct-plot {
|
|||||||
padding: 1px 3px; // Tighter than standard tabular padding
|
padding: 1px 3px; // Tighter than standard tabular padding
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*[class*="-legend"] {
|
||||||
&.hover-on-plot {
|
&.hover-on-plot {
|
||||||
// User is hovering over the plot to get a value at a point
|
// User is hovering over the plot to get a value at a point
|
||||||
.hover-value-enabled {
|
.hover-value-enabled {
|
||||||
@ -460,13 +474,14 @@ mct-plot {
|
|||||||
&.plot-legend-collapsed .icon-cursor-lock::before { padding-right: 5px; }
|
&.plot-legend-collapsed .icon-cursor-lock::before { padding-right: 5px; }
|
||||||
&.plot-legend-expanded .icon-cursor-lock::before { padding-right: 5px; }
|
&.plot-legend-expanded .icon-cursor-lock::before { padding-right: 5px; }
|
||||||
|
|
||||||
|
&.plot-legend-top .gl-plot-legend { margin-bottom: $interiorMargin; }
|
||||||
|
&.plot-legend-bottom .gl-plot-legend { margin-top: $interiorMargin; }
|
||||||
|
&.plot-legend-right .gl-plot-legend { margin-left: $interiorMargin; }
|
||||||
|
&.plot-legend-left .gl-plot-legend { margin-right: $interiorMargin; }
|
||||||
|
|
||||||
/***************** GENERAL STYLES, COLLAPSED */
|
/***************** GENERAL STYLES, COLLAPSED */
|
||||||
&.plot-legend-collapsed {
|
&.plot-legend-collapsed {
|
||||||
// .plot-legend-item is a span of spans.
|
// .plot-legend-item is a span of spans.
|
||||||
&.plot-legend-top .gl-plot-legend { margin-bottom: $interiorMargin; }
|
|
||||||
&.plot-legend-bottom .gl-plot-legend { margin-top: $interiorMargin; }
|
|
||||||
&.plot-legend-right .gl-plot-legend { margin-left: $interiorMargin; }
|
|
||||||
&.plot-legend-left .gl-plot-legend { margin-right: $interiorMargin; }
|
|
||||||
|
|
||||||
.plot-legend-item {
|
.plot-legend-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -494,11 +509,12 @@ mct-plot {
|
|||||||
/***************** GENERAL STYLES, EXPANDED */
|
/***************** GENERAL STYLES, EXPANDED */
|
||||||
&.plot-legend-expanded {
|
&.plot-legend-expanded {
|
||||||
.gl-plot-legend {
|
.gl-plot-legend {
|
||||||
max-height: 70%;
|
// max-height: 70%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.plot-wrapper-expanded-legend {
|
.plot-wrapper-expanded-legend {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
table thead th { background: $legendTableHeadBg; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,21 +534,27 @@ mct-plot {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************** EITHER SIDE */
|
/***************** LEFT OR RIGHT */
|
||||||
&.plot-legend-left,
|
&.plot-legend-left,
|
||||||
&.plot-legend-right {
|
&.plot-legend-right {
|
||||||
// If the legend is expanded, use flex-col instead so that the legend gets the width it needs.
|
// General styles when legend is on left or right
|
||||||
|
.gl-plot-legend {
|
||||||
|
max-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
&.plot-legend-expanded {
|
&.plot-legend-expanded {
|
||||||
// EXPANDED, ON EITHER SIDE
|
// EXPANDED, ON EITHER SIDE
|
||||||
flex-direction: column;
|
.gl-plot-legend {
|
||||||
|
width: $plotLegendWidthExpanded;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.plot-legend-collapsed {
|
&.plot-legend-collapsed {
|
||||||
// COLLAPSED, ON EITHER SIDE
|
// COLLAPSED, ON EITHER SIDE
|
||||||
.gl-plot-legend {
|
.gl-plot-legend {
|
||||||
max-height: inherit;
|
width: $plotLegendWidthCollapsed;
|
||||||
width: 25%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.plot-wrapper-collapsed-legend {
|
.plot-wrapper-collapsed-legend {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: column nowrap;
|
flex-flow: column nowrap;
|
||||||
@ -557,7 +579,7 @@ mct-plot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/***************** ON BOTTOM OR RIGHT */
|
/***************** ON BOTTOM OR RIGHT */
|
||||||
&.plot-legend-right:not(.plot-legend-expanded),
|
&.plot-legend-right,
|
||||||
&.plot-legend-bottom {
|
&.plot-legend-bottom {
|
||||||
.gl-plot-legend {
|
.gl-plot-legend {
|
||||||
order: 2;
|
order: 2;
|
||||||
|
@ -231,7 +231,6 @@
|
|||||||
background-color: $colorInspectorSectionHeaderBg;
|
background-color: $colorInspectorSectionHeaderBg;
|
||||||
color: $colorInspectorSectionHeaderFg;
|
color: $colorInspectorSectionHeaderFg;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin: $interiorMarginSm 0;
|
|
||||||
padding: $interiorMarginSm $interiorMargin;
|
padding: $interiorMarginSm $interiorMargin;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
@ -33,4 +33,5 @@
|
|||||||
@import "table";
|
@import "table";
|
||||||
@import "legacy";
|
@import "legacy";
|
||||||
@import "legacy-plots";
|
@import "legacy-plots";
|
||||||
|
@import "plotly";
|
||||||
@import "legacy-messages";
|
@import "legacy-messages";
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"metadata": {
|
"metadata": {
|
||||||
"name": "Open MCT Symbols 16px",
|
"name": "Open MCT Symbols 16px",
|
||||||
"lastOpened": 0,
|
"lastOpened": 0,
|
||||||
"created": 1567791159617
|
"created": 1572989474120
|
||||||
},
|
},
|
||||||
"iconSets": [
|
"iconSets": [
|
||||||
{
|
{
|
||||||
@ -1022,13 +1022,37 @@
|
|||||||
"prevSize": 24,
|
"prevSize": 24,
|
||||||
"code": 60195,
|
"code": 60195,
|
||||||
"tempChar": ""
|
"tempChar": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"order": 170,
|
||||||
|
"id": 148,
|
||||||
|
"name": "icon-spectra",
|
||||||
|
"prevSize": 24,
|
||||||
|
"code": 60196,
|
||||||
|
"tempChar": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"order": 171,
|
||||||
|
"id": 147,
|
||||||
|
"name": "icon-telemetry-spectra",
|
||||||
|
"prevSize": 24,
|
||||||
|
"code": 60197,
|
||||||
|
"tempChar": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"order": 172,
|
||||||
|
"id": 146,
|
||||||
|
"name": "icon-pushbutton",
|
||||||
|
"prevSize": 24,
|
||||||
|
"code": 60198,
|
||||||
|
"tempChar": ""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"id": 0,
|
"id": 0,
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"name": "Open MCT Symbols 16px",
|
"name": "Open MCT Symbols 16px",
|
||||||
"importSize": {
|
"importSize": {
|
||||||
"width": 384,
|
"width": 512,
|
||||||
"height": 512
|
"height": 512
|
||||||
},
|
},
|
||||||
"designer": "Charles Hacskaylo"
|
"designer": "Charles Hacskaylo"
|
||||||
@ -2667,6 +2691,61 @@
|
|||||||
"tags": [
|
"tags": [
|
||||||
"icon-gauge-v2"
|
"icon-gauge-v2"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 148,
|
||||||
|
"paths": [
|
||||||
|
"M768 704h-512l102.4-179.2-358.4 51.2v254c0 106.6 87.4 194 194 194h636c106.8 0 194-87.4 194-194v-62l-325.8-186.2z",
|
||||||
|
"M830 0h-636c-106.6 0-194 87.2-194 194v318l400-60.2 112-195.8 109.8 192h402.2v-254c-0.227-107.052-86.948-193.773-193.978-194l-0.022-0z",
|
||||||
|
"M1024 640v-64l-384-64 384 128z"
|
||||||
|
],
|
||||||
|
"attrs": [
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
"isMulticolor": false,
|
||||||
|
"isMulticolor2": false,
|
||||||
|
"grid": 16,
|
||||||
|
"tags": [
|
||||||
|
"icon-spectra"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 147,
|
||||||
|
"paths": [
|
||||||
|
"M512 256l109.8 192h398.2c-31.4-252.6-247-448-508-448-282.8 0-512 229.2-512 512l400-60.2z",
|
||||||
|
"M768 704h-512l102.4-179.2-354.4 50.6c31.2 252.8 246.8 448.6 508 448.6 201.6 0 376-116.6 459.6-286l-273.4-156.2z",
|
||||||
|
"M640 512l384 128v-64l-384-64z"
|
||||||
|
],
|
||||||
|
"attrs": [
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
"isMulticolor": false,
|
||||||
|
"isMulticolor2": false,
|
||||||
|
"grid": 16,
|
||||||
|
"tags": [
|
||||||
|
"icon-telemetry-spectra"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 146,
|
||||||
|
"paths": [
|
||||||
|
"M370.2 459.4c9.326 8.53 19.666 16.261 30.729 22.914l0.871 0.486c-11.077-19.209-17.664-42.221-17.8-66.76l-0-0.040c0-39.6 17.8-77.6 50.2-107.4 37-34 87.4-52.6 141.8-52.6 40.2 0 78.2 10.2 110.2 29.2-8.918-15.653-19.693-29.040-32.268-40.482l-0.132-0.118c-37-34-87.4-52.6-141.8-52.6s-104.8 18.6-141.8 52.6c-32.4 29.8-50.2 67.8-50.2 107.4s17.8 77.6 50.2 107.4z",
|
||||||
|
"M885.4 269.6c-40.6-154.6-192.4-269.6-373.4-269.6s-332.8 115-373.4 269.6c-86 80-138.6 187.8-138.6 306.4 0 247.4 229.2 448 512 448s512-200.6 512-448c0-118.6-52.6-226.4-138.6-306.4zM512 128c141.2 0 256 100.4 256 224s-114.8 224-256 224-256-100.4-256-224 114.8-224 256-224zM512 832c-175.4 0-318.4-127.8-320-285.4 68.8 94.8 186.4 157.4 320 157.4s251.2-62.6 320-157.4c-1.6 157.6-144.6 285.4-320 285.4z"
|
||||||
|
],
|
||||||
|
"attrs": [
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
"isMulticolor": false,
|
||||||
|
"isMulticolor2": false,
|
||||||
|
"grid": 16,
|
||||||
|
"tags": [
|
||||||
|
"icon-pushbutton"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"invisible": false,
|
"invisible": false,
|
||||||
|
3
src/styles/fonts/Open-MCT-Symbols-16px.svg
Normal file → Executable file
3
src/styles/fonts/Open-MCT-Symbols-16px.svg
Normal file → Executable file
@ -134,4 +134,7 @@
|
|||||||
<glyph unicode="" glyph-name="icon-generator-sine" d="M152 358.2c10.8 4.2 40.8 35.6 69.8 109.4 31.8 81.4 87.2 178.4 170.2 178.4 39.4 0 76-21.8 109.2-65 28-36.4 48.8-81.6 61-113.4 29-73.8 59-105.2 69.8-109.4 10.8 4.2 40.8 35.6 69.8 109.4s74.2 155.4 141.6 174.4c-67.89 114.467-190.82 190-331.391 190-0.003 0-0.007 0-0.010 0h0.001c-212 0-384-172-384-384 0.017-26.829 2.71-53.018 7.827-78.329l-0.427 2.529c7.2-8 13-12.6 16.6-14zM884.6 355c7.235 27.919 11.392 59.972 11.4 92.995v0.005c-0.017 26.829-2.71 53.018-7.827 78.329l0.427-2.529c-7.2 8-13 12.6-16.6 14-10.8-4.2-40.8-35.6-69.8-109.4-21.8-55.8-54.6-119-100-153.2zM512 192l135 59c-4.485-0.614-9.689-0.977-14.972-1h-0.028c-39.4 0-76 21.8-109.2 65-28 36.4-48.8 81.6-61 113.4-29 73.8-59 105.2-69.8 109.4-10.8-4.2-40.8-35.6-69.8-109.4-16.4-42.2-39.2-88.4-68.8-123.2zM1024 352l-512-224-512 224v-320l512-224 512 224v320z" />
|
<glyph unicode="" glyph-name="icon-generator-sine" d="M152 358.2c10.8 4.2 40.8 35.6 69.8 109.4 31.8 81.4 87.2 178.4 170.2 178.4 39.4 0 76-21.8 109.2-65 28-36.4 48.8-81.6 61-113.4 29-73.8 59-105.2 69.8-109.4 10.8 4.2 40.8 35.6 69.8 109.4s74.2 155.4 141.6 174.4c-67.89 114.467-190.82 190-331.391 190-0.003 0-0.007 0-0.010 0h0.001c-212 0-384-172-384-384 0.017-26.829 2.71-53.018 7.827-78.329l-0.427 2.529c7.2-8 13-12.6 16.6-14zM884.6 355c7.235 27.919 11.392 59.972 11.4 92.995v0.005c-0.017 26.829-2.71 53.018-7.827 78.329l0.427-2.529c-7.2 8-13 12.6-16.6 14-10.8-4.2-40.8-35.6-69.8-109.4-21.8-55.8-54.6-119-100-153.2zM512 192l135 59c-4.485-0.614-9.689-0.977-14.972-1h-0.028c-39.4 0-76 21.8-109.2 65-28 36.4-48.8 81.6-61 113.4-29 73.8-59 105.2-69.8 109.4-10.8-4.2-40.8-35.6-69.8-109.4-16.4-42.2-39.2-88.4-68.8-123.2zM1024 352l-512-224-512 224v-320l512-224 512 224v320z" />
|
||||||
<glyph unicode="" glyph-name="icon-generator-event" d="M320 640h384v-64h-384v64zM320 384h384v-64h-384v64zM320 512h320v-64h-320v64zM256 703.8h512v-399.8l128 56v344c-0.227 70.601-57.399 127.773-127.978 128h-512.022c-70.601-0.227-127.773-57.399-128-127.978v-344.022l128-56zM658.2 256h-292.4l146.2-64 146.2 64zM512 128l-512 224v-320l512-224 512 224v320l-512-224z" />
|
<glyph unicode="" glyph-name="icon-generator-event" d="M320 640h384v-64h-384v64zM320 384h384v-64h-384v64zM320 512h320v-64h-320v64zM256 703.8h512v-399.8l128 56v344c-0.227 70.601-57.399 127.773-127.978 128h-512.022c-70.601-0.227-127.773-57.399-128-127.978v-344.022l128-56zM658.2 256h-292.4l146.2-64 146.2 64zM512 128l-512 224v-320l512-224 512 224v320l-512-224z" />
|
||||||
<glyph unicode="" glyph-name="icon-gauge-v2" d="M512 832c-282.8 0-512-229.2-512-512 0-226.4 147-418.4 350.6-486l257.4 486v-503c236.8 45 416 253 416 503 0 282.8-229.2 512-512 512zM754.8 304.2c-58.967 68.597-145.842 111.772-242.8 111.772s-183.833-43.176-242.445-111.35l-0.355-0.422-146 125c8.6 10 17.4 19.6 26.8 28.8 92.628 92.679 220.619 150.006 362 150.006s269.372-57.326 361.997-150.003l0.003-0.003c9.4-9.2 18.2-18.8 26.8-28.8z" />
|
<glyph unicode="" glyph-name="icon-gauge-v2" d="M512 832c-282.8 0-512-229.2-512-512 0-226.4 147-418.4 350.6-486l257.4 486v-503c236.8 45 416 253 416 503 0 282.8-229.2 512-512 512zM754.8 304.2c-58.967 68.597-145.842 111.772-242.8 111.772s-183.833-43.176-242.445-111.35l-0.355-0.422-146 125c8.6 10 17.4 19.6 26.8 28.8 92.628 92.679 220.619 150.006 362 150.006s269.372-57.326 361.997-150.003l0.003-0.003c9.4-9.2 18.2-18.8 26.8-28.8z" />
|
||||||
|
<glyph unicode="" glyph-name="icon-spectra" d="M768 128h-512l102.4 179.2-358.4-51.2v-254c0-106.6 87.4-194 194-194h636c106.8 0 194 87.4 194 194v62l-325.8 186.2zM830 832h-636c-106.6 0-194-87.2-194-194v-318l400 60.2 112 195.8 109.8-192h402.2v254c-0.227 107.052-86.948 193.773-193.978 194h-0.022zM1024 192v64l-384 64 384-128z" />
|
||||||
|
<glyph unicode="" glyph-name="icon-telemetry-spectra" d="M512 576l109.8-192h398.2c-31.4 252.6-247 448-508 448-282.8 0-512-229.2-512-512l400 60.2zM768 128h-512l102.4 179.2-354.4-50.6c31.2-252.8 246.8-448.6 508-448.6 201.6 0 376 116.6 459.6 286l-273.4 156.2zM640 320l384-128v64l-384 64z" />
|
||||||
|
<glyph unicode="" glyph-name="icon-pushbutton" d="M370.2 372.6c9.326-8.53 19.666-16.261 30.729-22.914l0.871-0.486c-11.077 19.209-17.664 42.221-17.8 66.76v0.040c0 39.6 17.8 77.6 50.2 107.4 37 34 87.4 52.6 141.8 52.6 40.2 0 78.2-10.2 110.2-29.2-8.918 15.653-19.693 29.040-32.268 40.482l-0.132 0.118c-37 34-87.4 52.6-141.8 52.6s-104.8-18.6-141.8-52.6c-32.4-29.8-50.2-67.8-50.2-107.4s17.8-77.6 50.2-107.4zM885.4 562.4c-40.6 154.6-192.4 269.6-373.4 269.6s-332.8-115-373.4-269.6c-86-80-138.6-187.8-138.6-306.4 0-247.4 229.2-448 512-448s512 200.6 512 448c0 118.6-52.6 226.4-138.6 306.4zM512 704c141.2 0 256-100.4 256-224s-114.8-224-256-224-256 100.4-256 224 114.8 224 256 224zM512 0c-175.4 0-318.4 127.8-320 285.4 68.8-94.8 186.4-157.4 320-157.4s251.2 62.6 320 157.4c-1.6-157.6-144.6-285.4-320-285.4z" />
|
||||||
</font></defs></svg>
|
</font></defs></svg>
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 50 KiB |
BIN
src/styles/fonts/Open-MCT-Symbols-16px.ttf
Normal file → Executable file
BIN
src/styles/fonts/Open-MCT-Symbols-16px.ttf
Normal file → Executable file
Binary file not shown.
BIN
src/styles/fonts/Open-MCT-Symbols-16px.woff
Normal file → Executable file
BIN
src/styles/fonts/Open-MCT-Symbols-16px.woff
Normal file → Executable file
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT, Copyright (c) 2014-2018, United States Government
|
* Open MCT, Copyright (c) 2014-2019, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
@ -20,40 +20,32 @@
|
|||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/**
|
/***************** PLOTLY OVERRIDES */
|
||||||
* Module defining MenuArrowController. Created by shale on 06/30/2015.
|
.plot-container.plotly {
|
||||||
*/
|
.bglayer .bg {
|
||||||
define(
|
fill: $colorPlotBg !important;
|
||||||
[],
|
fill-opacity: 1 !important;
|
||||||
function () {
|
stroke: $colorInteriorBorder;
|
||||||
|
stroke-width: 1 !important;
|
||||||
/**
|
|
||||||
* A left-click on the menu arrow should display a
|
|
||||||
* context menu. This controller launches the context
|
|
||||||
* menu.
|
|
||||||
* @memberof platform/commonUI/browse
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function MenuArrowController($scope) {
|
|
||||||
this.$scope = $scope;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show a context menu for the domain object in this scope.
|
|
||||||
*
|
|
||||||
* @param event the browser event which caused this (used to
|
|
||||||
* position the menu)
|
|
||||||
*/
|
|
||||||
MenuArrowController.prototype.showMenu = function (event) {
|
|
||||||
var actionContext = {
|
|
||||||
key: 'menu',
|
|
||||||
domainObject: this.$scope.domainObject,
|
|
||||||
event: event
|
|
||||||
};
|
|
||||||
|
|
||||||
this.$scope.domainObject.getCapability('action').perform(actionContext);
|
|
||||||
};
|
|
||||||
|
|
||||||
return MenuArrowController;
|
|
||||||
}
|
}
|
||||||
);
|
|
||||||
|
.cartesianlayer .gridlayer {
|
||||||
|
.x,
|
||||||
|
.y {
|
||||||
|
path {
|
||||||
|
opacity: $opacityPlotHash;
|
||||||
|
stroke: $colorPlotHash !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.xtick,
|
||||||
|
.ytick,
|
||||||
|
.g-xtitle,
|
||||||
|
.g-ytitle {
|
||||||
|
text {
|
||||||
|
fill: $colorPlotFg !important;
|
||||||
|
font-size: 12px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -77,7 +77,7 @@ export default {
|
|||||||
if (!this.currentObject) {
|
if (!this.currentObject) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.composition = this.openmct.composition.get(this.currentObject);
|
this.composition = this.openmct.composition.get(this.currentObject);
|
||||||
if (this.composition) {
|
if (this.composition) {
|
||||||
this.composition._synchronize();
|
this.composition._synchronize();
|
||||||
@ -98,13 +98,13 @@ export default {
|
|||||||
if (this.openmct.editor.isEditing()) {
|
if (this.openmct.editor.isEditing()) {
|
||||||
this.currentView = provider.edit(this.currentObject, true, objectPath);
|
this.currentView = provider.edit(this.currentObject, true, objectPath);
|
||||||
} else {
|
} else {
|
||||||
this.currentView = provider.view(this.currentObject, false, objectPath);
|
this.currentView = provider.view(this.currentObject, objectPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.openmct.editor.on('isEditing', this.toggleEditView);
|
this.openmct.editor.on('isEditing', this.toggleEditView);
|
||||||
this.releaseEditModeHandler = () => this.openmct.editor.off('isEditing', this.toggleEditView);
|
this.releaseEditModeHandler = () => this.openmct.editor.off('isEditing', this.toggleEditView);
|
||||||
} else {
|
} else {
|
||||||
this.currentView = provider.view(this.currentObject, this.openmct.editor.isEditing(), objectPath);
|
this.currentView = provider.view(this.currentObject, objectPath);
|
||||||
|
|
||||||
if (this.currentView.onEditModeChange) {
|
if (this.currentView.onEditModeChange) {
|
||||||
this.openmct.editor.on('isEditing', this.invokeEditModeHandler);
|
this.openmct.editor.on('isEditing', this.invokeEditModeHandler);
|
||||||
@ -186,7 +186,7 @@ export default {
|
|||||||
},
|
},
|
||||||
editIfEditable(event) {
|
editIfEditable(event) {
|
||||||
let provider = this.getViewProvider();
|
let provider = this.getViewProvider();
|
||||||
if (provider &&
|
if (provider &&
|
||||||
provider.canEdit &&
|
provider.canEdit &&
|
||||||
provider.canEdit(this.currentObject) &&
|
provider.canEdit(this.currentObject) &&
|
||||||
!this.openmct.editor.isEditing()) {
|
!this.openmct.editor.isEditing()) {
|
||||||
@ -204,7 +204,7 @@ export default {
|
|||||||
if (domainObject) {
|
if (domainObject) {
|
||||||
let clearKeyString = this.openmct.objects.makeKeyString(domainObject.identifier),
|
let clearKeyString = this.openmct.objects.makeKeyString(domainObject.identifier),
|
||||||
currentObjectKeyString = this.openmct.objects.makeKeyString(this.currentObject.identifier);
|
currentObjectKeyString = this.openmct.objects.makeKeyString(this.currentObject.identifier);
|
||||||
|
|
||||||
if (clearKeyString === currentObjectKeyString) {
|
if (clearKeyString === currentObjectKeyString) {
|
||||||
if (this.currentView.onClearData) {
|
if (this.currentView.onClearData) {
|
||||||
this.currentView.onClearData();
|
this.currentView.onClearData();
|
||||||
|
@ -96,10 +96,10 @@
|
|||||||
// 2. Get legacy type from legacy api
|
// 2. Get legacy type from legacy api
|
||||||
// 3. Instantiate create action with type, parent, context
|
// 3. Instantiate create action with type, parent, context
|
||||||
// 4. perform action.
|
// 4. perform action.
|
||||||
return this.openmct.objects.get(openmct.router.path[0].identifier)
|
return this.openmct.objects.get(this.openmct.router.path[0].identifier)
|
||||||
.then((currentObject) => {
|
.then((currentObject) => {
|
||||||
let legacyContextualParent = this.convertToLegacy(currentObject);
|
let legacyContextualParent = this.convertToLegacy(currentObject);
|
||||||
let legacyType = openmct.$injector.get('typeService').getType(item.key);
|
let legacyType = this.openmct.$injector.get('typeService').getType(item.key);
|
||||||
let context = {
|
let context = {
|
||||||
key: "create",
|
key: "create",
|
||||||
domainObject: legacyContextualParent // should be same as parent object.
|
domainObject: legacyContextualParent // should be same as parent object.
|
||||||
@ -116,7 +116,7 @@
|
|||||||
convertToLegacy (domainObject) {
|
convertToLegacy (domainObject) {
|
||||||
let keyString = objectUtils.makeKeyString(domainObject.identifier);
|
let keyString = objectUtils.makeKeyString(domainObject.identifier);
|
||||||
let oldModel = objectUtils.toOldFormat(domainObject);
|
let oldModel = objectUtils.toOldFormat(domainObject);
|
||||||
return openmct.$injector.get('instantiate')(oldModel, keyString);
|
return this.openmct.$injector.get('instantiate')(oldModel, keyString);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
destroyed () {
|
destroyed () {
|
||||||
@ -126,7 +126,7 @@
|
|||||||
let items = [];
|
let items = [];
|
||||||
|
|
||||||
this.openmct.types.listKeys().forEach(key => {
|
this.openmct.types.listKeys().forEach(key => {
|
||||||
let menuItem = openmct.types.get(key).definition;
|
let menuItem = this.openmct.types.get(key).definition;
|
||||||
|
|
||||||
if (menuItem.creatable) {
|
if (menuItem.creatable) {
|
||||||
let menuItemTemplate = {
|
let menuItemTemplate = {
|
||||||
|
@ -39,7 +39,9 @@
|
|||||||
<toolbar v-if="toolbar" class="l-shell__toolbar"></toolbar>
|
<toolbar v-if="toolbar" class="l-shell__toolbar"></toolbar>
|
||||||
<object-view class="l-shell__main-container"
|
<object-view class="l-shell__main-container"
|
||||||
ref="browseObject"
|
ref="browseObject"
|
||||||
:showEditView="true">
|
:showEditView="true"
|
||||||
|
data-selectable
|
||||||
|
>
|
||||||
</object-view>
|
</object-view>
|
||||||
<component class="l-shell__time-conductor"
|
<component class="l-shell__time-conductor"
|
||||||
:is="conductorComponent">
|
:is="conductorComponent">
|
||||||
|
@ -13,16 +13,31 @@
|
|||||||
v-if="isLoading"></div>
|
v-if="isLoading"></div>
|
||||||
<!-- end loading -->
|
<!-- end loading -->
|
||||||
|
|
||||||
<div class="c-tree-and-search__no-results" v-if="treeItems.length === 0">
|
<div class="c-tree-and-search__no-results"
|
||||||
|
v-if="(allTreeItems.length === 0) || (searchValue && filteredTreeItems.length === 0)">
|
||||||
No results found
|
No results found
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- main tree -->
|
||||||
<ul class="c-tree-and-search__tree c-tree"
|
<ul class="c-tree-and-search__tree c-tree"
|
||||||
v-if="!isLoading">
|
v-if="!isLoading"
|
||||||
<tree-item v-for="treeItem in treeItems"
|
v-show="!searchValue">
|
||||||
|
<tree-item v-for="treeItem in allTreeItems"
|
||||||
:key="treeItem.id"
|
:key="treeItem.id"
|
||||||
:node="treeItem">
|
:node="treeItem">
|
||||||
</tree-item>
|
</tree-item>
|
||||||
</ul>
|
</ul>
|
||||||
|
<!-- end main tree -->
|
||||||
|
|
||||||
|
<!-- search tree -->
|
||||||
|
<ul class="c-tree-and-search__tree c-tree"
|
||||||
|
v-if="searchValue">
|
||||||
|
<tree-item v-for="treeItem in filteredTreeItems"
|
||||||
|
:key="treeItem.id"
|
||||||
|
:node="treeItem">
|
||||||
|
</tree-item>
|
||||||
|
</ul>
|
||||||
|
<!-- end search tree -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -188,15 +203,6 @@
|
|||||||
isLoading: false
|
isLoading: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
|
||||||
treeItems() {
|
|
||||||
if (this.searchValue === '') {
|
|
||||||
return this.allTreeItems;
|
|
||||||
} else {
|
|
||||||
return this.filteredTreeItems;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
getAllChildren() {
|
getAllChildren() {
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
|
@ -235,7 +235,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
openmct.notifications.on('notification', this.showNotification);
|
this.openmct.notifications.on('notification', this.showNotification);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,8 @@
|
|||||||
let removeListener = this.openmct.objects.observe(this.domainObject, '*', (newObject) => {
|
let removeListener = this.openmct.objects.observe(this.domainObject, '*', (newObject) => {
|
||||||
this.domainObject = newObject;
|
this.domainObject = newObject;
|
||||||
});
|
});
|
||||||
this.$once('hook:destroyed', removeListener);
|
|
||||||
|
|
||||||
|
this.$once('hook:destroyed', removeListener);
|
||||||
if (this.openmct.composition.get(this.node.object)) {
|
if (this.openmct.composition.get(this.node.object)) {
|
||||||
this.hasChildren = true;
|
this.hasChildren = true;
|
||||||
}
|
}
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
@setView="setView">
|
@setView="setView">
|
||||||
</view-switcher>
|
</view-switcher>
|
||||||
<button v-if="notebookEnabled"
|
<button v-if="notebookEnabled"
|
||||||
class="l-browse-bar__actions__edit c-button icon-notebook"
|
class="l-browse-bar__actions__edit c-button icon-notebook"
|
||||||
title="New Notebook entry"
|
title="New Notebook entry"
|
||||||
@click="snapshot">
|
@click="snapshot">
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -123,13 +123,13 @@
|
|||||||
},
|
},
|
||||||
setView(view) {
|
setView(view) {
|
||||||
this.clear();
|
this.clear();
|
||||||
|
|
||||||
this.viewKey = view.key;
|
this.viewKey = view.key;
|
||||||
this.viewContainer = document.createElement('div');
|
this.viewContainer = document.createElement('div');
|
||||||
this.viewContainer.classList.add('c-object-view','u-contents');
|
this.viewContainer.classList.add('c-object-view','u-contents');
|
||||||
this.$refs.objectView.append(this.viewContainer);
|
this.$refs.objectView.append(this.viewContainer);
|
||||||
|
|
||||||
this.view = this.currentView.view(this.domainObject, false, this.objectPath);
|
this.view = this.currentView.view(this.domainObject, this.objectPath);
|
||||||
this.view.show(this.viewContainer, false);
|
this.view.show(this.viewContainer, false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -225,7 +225,6 @@ define(['EventEmitter'], function (EventEmitter) {
|
|||||||
*
|
*
|
||||||
* When called by Open MCT, the following arguments will be passed to it:
|
* When called by Open MCT, the following arguments will be passed to it:
|
||||||
* @param {object} domainObject - the domainObject that the view is provided for
|
* @param {object} domainObject - the domainObject that the view is provided for
|
||||||
* @param {boolean} isEditing - A boolean value indicating wether openmct is in a global edit mode
|
|
||||||
* @param {array} objectPath - The current contextual object path of the view object
|
* @param {array} objectPath - The current contextual object path of the view object
|
||||||
* eg current domainObject is located under MyItems which is under Root
|
* eg current domainObject is located under MyItems which is under Root
|
||||||
*
|
*
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
Application router -- must
|
Application router -- must
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
/*global _,module*/
|
||||||
|
|
||||||
const LocationBar = require('location-bar');
|
const LocationBar = require('location-bar');
|
||||||
const EventEmitter = require('EventEmitter');
|
const EventEmitter = require('EventEmitter');
|
||||||
@ -117,7 +118,7 @@ class ApplicationRouter extends EventEmitter {
|
|||||||
changedParams[key] = value;
|
changedParams[key] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let [key, value] of Object.entries(oldParams)) {
|
for (let key of Object.keys(oldParams)) {
|
||||||
if (!newParams.hasOwnProperty(key)) {
|
if (!newParams.hasOwnProperty(key)) {
|
||||||
changedParams[key] = undefined;
|
changedParams[key] = undefined;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user