diff --git a/src/api/objects/ObjectAPI.js b/src/api/objects/ObjectAPI.js
index e3c20ee104..297ff14635 100644
--- a/src/api/objects/ObjectAPI.js
+++ b/src/api/objects/ObjectAPI.js
@@ -358,6 +358,20 @@ ObjectAPI.prototype.applyGetInterceptors = function (identifier, domainObject) {
return domainObject;
};
+/**
+ * Return relative url path from a given object path
+ * eg: #/browse/mine/cb56f6bf-c900-43b7-b923-2e3b64b412db/6e89e858-77ce-46e4-a1ad-749240286497/....
+ * @param {Array} objectPath
+ * @returns {string} relative url for object
+ */
+ObjectAPI.prototype.getRelativePath = function (objectPath) {
+ return objectPath
+ .map(p => this.makeKeyString(p.identifier))
+ .reverse()
+ .join('/')
+ ;
+};
+
/**
* Modify a domain object.
* @param {module:openmct.DomainObject} object the object to mutate
diff --git a/src/api/overlays/Overlay.js b/src/api/overlays/Overlay.js
index 46dafa9b4b..efc4ae22e8 100644
--- a/src/api/overlays/Overlay.js
+++ b/src/api/overlays/Overlay.js
@@ -10,28 +10,37 @@ const cssClasses = {
};
class Overlay extends EventEmitter {
- constructor(options) {
+ constructor({
+ buttons,
+ autoHide = true,
+ dismissable = true,
+ element,
+ onDestroy,
+ size
+ } = {}) {
super();
- this.dismissable = options.dismissable !== false;
this.container = document.createElement('div');
- this.container.classList.add('l-overlay-wrapper', cssClasses[options.size]);
+ this.container.classList.add('l-overlay-wrapper', cssClasses[size]);
+
+ this.autoHide = autoHide;
+ this.dismissable = dismissable !== false;
this.component = new Vue({
- provide: {
- dismiss: this.dismiss.bind(this),
- element: options.element,
- buttons: options.buttons,
- dismissable: this.dismissable
- },
components: {
OverlayComponent: OverlayComponent
},
+ provide: {
+ dismiss: this.dismiss.bind(this),
+ element,
+ buttons,
+ dismissable: this.dismissable
+ },
template: ''
});
- if (options.onDestroy) {
- this.once('destroy', options.onDestroy);
+ if (onDestroy) {
+ this.once('destroy', onDestroy);
}
}
diff --git a/src/api/overlays/OverlayAPI.js b/src/api/overlays/OverlayAPI.js
index d4892e30e4..5587df3161 100644
--- a/src/api/overlays/OverlayAPI.js
+++ b/src/api/overlays/OverlayAPI.js
@@ -30,7 +30,10 @@ class OverlayAPI {
*/
showOverlay(overlay) {
if (this.activeOverlays.length) {
- this.activeOverlays[this.activeOverlays.length - 1].container.classList.add('invisible');
+ const previousOverlay = this.activeOverlays[this.activeOverlays.length - 1];
+ if (previousOverlay.autoHide) {
+ previousOverlay.container.classList.add('invisible');
+ }
}
this.activeOverlays.push(overlay);
diff --git a/src/exporters/ImageExporter.js b/src/exporters/ImageExporter.js
index 100904aee6..0236031146 100644
--- a/src/exporters/ImageExporter.js
+++ b/src/exporters/ImageExporter.js
@@ -90,7 +90,7 @@ class ImageExporter {
element.id = oldId;
},
removeContainer: true // Set to false to debug what html2canvas renders
- }).then(function (canvas) {
+ }).then(canvas => {
dialog.dismiss();
return new Promise(function (resolve, reject) {
@@ -105,9 +105,10 @@ class ImageExporter {
return canvas.toBlob(blob => resolve({ blob }), mimeType);
});
- }, function (error) {
- console.log('error capturing image', error);
+ }).catch(error => {
dialog.dismiss();
+
+ console.error('error capturing image', error);
const errorDialog = overlays.dialog({
iconClass: 'error',
message: 'Image was not captured successfully!',
diff --git a/src/plugins/condition/components/inspector/ConditionalStylesView.vue b/src/plugins/condition/components/inspector/ConditionalStylesView.vue
index 3a01dcf3d1..7696efc4e2 100644
--- a/src/plugins/condition/components/inspector/ConditionalStylesView.vue
+++ b/src/plugins/condition/components/inspector/ConditionalStylesView.vue
@@ -273,10 +273,7 @@ export default {
this.openmct.objects.getOriginalPath(this.conditionSetDomainObject.identifier).then(
(objectPath) => {
this.objectPath = objectPath;
- this.navigateToPath = '#/browse/' + this.objectPath
- .map(o => o && this.openmct.objects.makeKeyString(o.identifier))
- .reverse()
- .join('/');
+ this.navigateToPath = '#/browse/' + this.openmct.objects.getRelativePath(this.objectPath);
}
);
},
diff --git a/src/plugins/condition/components/inspector/StylesView.vue b/src/plugins/condition/components/inspector/StylesView.vue
index 818e169aa6..b86477bde0 100644
--- a/src/plugins/condition/components/inspector/StylesView.vue
+++ b/src/plugins/condition/components/inspector/StylesView.vue
@@ -297,10 +297,7 @@ export default {
this.openmct.objects.getOriginalPath(this.conditionSetDomainObject.identifier).then(
(objectPath) => {
this.objectPath = objectPath;
- this.navigateToPath = '#/browse/' + this.objectPath
- .map(o => o && this.openmct.objects.makeKeyString(o.identifier))
- .reverse()
- .join('/');
+ this.navigateToPath = '#/browse/' + this.openmct.objects.getRelativePath(this.objectPath);
}
);
},
diff --git a/src/plugins/notebook/components/Notebook.vue b/src/plugins/notebook/components/Notebook.vue
index d320f18016..fe507dfe36 100644
--- a/src/plugins/notebook/components/Notebook.vue
+++ b/src/plugins/notebook/components/Notebook.vue
@@ -456,12 +456,9 @@ export default {
: undefined;
},
getDefaultNotebookObject() {
- const oldNotebookStorage = getDefaultNotebook();
- if (!oldNotebookStorage) {
- return null;
- }
+ const defaultNotebook = getDefaultNotebook();
- return this.openmct.objects.get(oldNotebookStorage.identifier);
+ return defaultNotebook && this.openmct.objects.get(defaultNotebook.identifier);
},
getLinktoNotebook() {
const objectPath = this.openmct.router.path;
diff --git a/src/plugins/notebook/components/NotebookMenuSwitcher.vue b/src/plugins/notebook/components/NotebookMenuSwitcher.vue
index 25a32850ff..13d3ec1650 100644
--- a/src/plugins/notebook/components/NotebookMenuSwitcher.vue
+++ b/src/plugins/notebook/components/NotebookMenuSwitcher.vue
@@ -17,19 +17,26 @@