mirror of
https://github.com/nasa/openmct.git
synced 2025-06-25 18:50:11 +00:00
Compare commits
13 Commits
plotly-and
...
notebook-v
Author | SHA1 | Date | |
---|---|---|---|
d663788e77 | |||
100c9af72d | |||
ccc5969b28 | |||
748b4bf4d1 | |||
755f0ac126 | |||
0173c3cfab | |||
9ca6ef428e | |||
5842bbc821 | |||
a2f499abf6 | |||
634aaefb48 | |||
80368b38b5 | |||
17c60d1d4d | |||
5bca13aeff |
@ -70,6 +70,7 @@
|
|||||||
}));
|
}));
|
||||||
openmct.install(openmct.plugins.SummaryWidget());
|
openmct.install(openmct.plugins.SummaryWidget());
|
||||||
openmct.install(openmct.plugins.Notebook());
|
openmct.install(openmct.plugins.Notebook());
|
||||||
|
openmct.install(openmct.plugins.NotebookV2());
|
||||||
openmct.time.clock('local', {start: -THIRTY_MINUTES, end: 0});
|
openmct.time.clock('local', {start: -THIRTY_MINUTES, end: 0});
|
||||||
openmct.time.timeSystem('utc');
|
openmct.time.timeSystem('utc');
|
||||||
openmct.start();
|
openmct.start();
|
||||||
|
@ -48,247 +48,247 @@ define([
|
|||||||
"description": "Create and save timestamped notes with embedded object snapshots.",
|
"description": "Create and save timestamped notes with embedded object snapshots.",
|
||||||
"extensions":
|
"extensions":
|
||||||
{
|
{
|
||||||
"types": [
|
// "types": [
|
||||||
{
|
// {
|
||||||
"key": "notebook",
|
// "key": "notebook",
|
||||||
"name": "Notebook",
|
// "name": "Notebook",
|
||||||
"cssClass": "icon-notebook",
|
// "cssClass": "icon-notebook",
|
||||||
"description": "Create and save timestamped notes with embedded object snapshots.",
|
// "description": "Create and save timestamped notes with embedded object snapshots.",
|
||||||
"features": ["creation"],
|
// "features": ["creation"],
|
||||||
"model": {
|
// "model": {
|
||||||
"entries": [],
|
// "entries": [],
|
||||||
"composition": [],
|
// "composition": [],
|
||||||
"entryTypes": [],
|
// "entryTypes": [],
|
||||||
"defaultSort": "-createdOn"
|
// "defaultSort": "-createdOn"
|
||||||
},
|
// },
|
||||||
"properties": [
|
// "properties": [
|
||||||
{
|
// {
|
||||||
"key": "defaultSort",
|
// "key": "defaultSort",
|
||||||
"name": "Default Sort",
|
// "name": "Default Sort",
|
||||||
"control": "select",
|
// "control": "select",
|
||||||
"options": [
|
// "options": [
|
||||||
{
|
// {
|
||||||
"name": "Newest First",
|
// "name": "Newest First",
|
||||||
"value": "-createdOn"
|
// "value": "-createdOn"
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"name": "Oldest First",
|
// "name": "Oldest First",
|
||||||
"value": "createdOn"
|
// "value": "createdOn"
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"cssClass": "l-inline"
|
// "cssClass": "l-inline"
|
||||||
}
|
// }
|
||||||
]
|
// ]
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"views": [
|
// "views": [
|
||||||
{
|
// {
|
||||||
"key": "notebook.view",
|
// "key": "notebook.view",
|
||||||
"type": "notebook",
|
// "type": "notebook",
|
||||||
"cssClass": "icon-notebook",
|
// "cssClass": "icon-notebook",
|
||||||
"name": "notebook",
|
// "name": "notebook",
|
||||||
"template": notebookTemplate,
|
// "template": notebookTemplate,
|
||||||
"editable": false,
|
// "editable": false,
|
||||||
"uses": [
|
// "uses": [
|
||||||
"composition",
|
// "composition",
|
||||||
"action"
|
// "action"
|
||||||
],
|
// ],
|
||||||
"gestures": [
|
// "gestures": [
|
||||||
"drop"
|
// "drop"
|
||||||
]
|
// ]
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"controllers": [
|
// "controllers": [
|
||||||
{
|
// {
|
||||||
"key": "NotebookController",
|
// "key": "NotebookController",
|
||||||
"implementation": NotebookController,
|
// "implementation": NotebookController,
|
||||||
"depends": [
|
// "depends": [
|
||||||
"$scope",
|
// "$scope",
|
||||||
"dialogService",
|
// "dialogService",
|
||||||
"popupService",
|
// "popupService",
|
||||||
"agentService",
|
// "agentService",
|
||||||
"objectService",
|
// "objectService",
|
||||||
"navigationService",
|
// "navigationService",
|
||||||
"now",
|
// "now",
|
||||||
"actionService",
|
// "actionService",
|
||||||
"$timeout",
|
// "$timeout",
|
||||||
"$element",
|
// "$element",
|
||||||
"$sce"
|
// "$sce"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "NewEntryController",
|
// "key": "NewEntryController",
|
||||||
"implementation": NewEntryController,
|
// "implementation": NewEntryController,
|
||||||
"depends": ["$scope",
|
// "depends": ["$scope",
|
||||||
"$rootScope"
|
// "$rootScope"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "selectSnapshotController",
|
// "key": "selectSnapshotController",
|
||||||
"implementation": SelectSnapshotController,
|
// "implementation": SelectSnapshotController,
|
||||||
"depends": ["$scope",
|
// "depends": ["$scope",
|
||||||
"$rootScope"
|
// "$rootScope"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "LayoutNotebookController",
|
// "key": "LayoutNotebookController",
|
||||||
"implementation": LayoutNotebookController,
|
// "implementation": LayoutNotebookController,
|
||||||
"depends": ["$scope"]
|
// "depends": ["$scope"]
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"representations": [
|
// "representations": [
|
||||||
{
|
// {
|
||||||
"key": "draggedEntry",
|
// "key": "draggedEntry",
|
||||||
"template": entryTemplate
|
// "template": entryTemplate
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "frameLayoutNotebook",
|
// "key": "frameLayoutNotebook",
|
||||||
"template": frameTemplate
|
// "template": frameTemplate
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"templates": [
|
// "templates": [
|
||||||
{
|
// {
|
||||||
"key": "annotate-snapshot",
|
// "key": "annotate-snapshot",
|
||||||
"template": annotationTemplate
|
// "template": annotationTemplate
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "notificationTemplate",
|
// "key": "notificationTemplate",
|
||||||
"template": notificationsTemplate
|
// "template": notificationsTemplate
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"directives": [
|
// "directives": [
|
||||||
{
|
// {
|
||||||
"key": "mctSnapshot",
|
// "key": "mctSnapshot",
|
||||||
"implementation": MCTSnapshot,
|
// "implementation": MCTSnapshot,
|
||||||
"depends": [
|
// "depends": [
|
||||||
"$rootScope",
|
// "$rootScope",
|
||||||
"$document",
|
// "$document",
|
||||||
"exportImageService",
|
// "exportImageService",
|
||||||
"dialogService",
|
// "dialogService",
|
||||||
"notificationService"
|
// "notificationService"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "mctEntryDnd",
|
// "key": "mctEntryDnd",
|
||||||
"implementation": MCTEntryDnd,
|
// "implementation": MCTEntryDnd,
|
||||||
"depends": [
|
// "depends": [
|
||||||
"$rootScope",
|
// "$rootScope",
|
||||||
"$compile",
|
// "$compile",
|
||||||
"dndService",
|
// "dndService",
|
||||||
"typeService",
|
// "typeService",
|
||||||
"notificationService"
|
// "notificationService"
|
||||||
]
|
// ]
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"actions": [
|
// "actions": [
|
||||||
{
|
// {
|
||||||
"key": "view-snapshot",
|
// "key": "view-snapshot",
|
||||||
"implementation": ViewSnapshotAction,
|
// "implementation": ViewSnapshotAction,
|
||||||
"name": "View Snapshot",
|
// "name": "View Snapshot",
|
||||||
"description": "View the large image in a modal",
|
// "description": "View the large image in a modal",
|
||||||
"category": "embed",
|
// "category": "embed",
|
||||||
"depends": [
|
// "depends": [
|
||||||
"$compile"
|
// "$compile"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "annotate-snapshot",
|
// "key": "annotate-snapshot",
|
||||||
"implementation": AnnotateSnapshotAction,
|
// "implementation": AnnotateSnapshotAction,
|
||||||
"name": "Annotate Snapshot",
|
// "name": "Annotate Snapshot",
|
||||||
"cssClass": "icon-pencil labeled",
|
// "cssClass": "icon-pencil labeled",
|
||||||
"description": "Annotate embed's snapshot",
|
// "description": "Annotate embed's snapshot",
|
||||||
"category": "embed",
|
// "category": "embed",
|
||||||
"depends": [
|
// "depends": [
|
||||||
"dialogService",
|
// "dialogService",
|
||||||
"dndService",
|
// "dndService",
|
||||||
"$rootScope"
|
// "$rootScope"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
|
|
||||||
{
|
// {
|
||||||
"key": "remove-embed",
|
// "key": "remove-embed",
|
||||||
"implementation": RemoveEmbedAction,
|
// "implementation": RemoveEmbedAction,
|
||||||
"name": "Remove...",
|
// "name": "Remove...",
|
||||||
"cssClass": "icon-trash labeled",
|
// "cssClass": "icon-trash labeled",
|
||||||
"description": "Remove this embed",
|
// "description": "Remove this embed",
|
||||||
"category": [
|
// "category": [
|
||||||
"embed",
|
// "embed",
|
||||||
"embed-no-snap"
|
// "embed-no-snap"
|
||||||
],
|
// ],
|
||||||
"depends": [
|
// "depends": [
|
||||||
"dialogService"
|
// "dialogService"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "remove-snapshot",
|
// "key": "remove-snapshot",
|
||||||
"implementation": RemoveSnapshotAction,
|
// "implementation": RemoveSnapshotAction,
|
||||||
"name": "Remove Snapshot",
|
// "name": "Remove Snapshot",
|
||||||
"cssClass": "icon-trash labeled",
|
// "cssClass": "icon-trash labeled",
|
||||||
"description": "Remove Snapshot of the embed",
|
// "description": "Remove Snapshot of the embed",
|
||||||
"category": "embed",
|
// "category": "embed",
|
||||||
"depends": [
|
// "depends": [
|
||||||
"dialogService"
|
// "dialogService"
|
||||||
]
|
// ]
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "notebook-new-entry",
|
// "key": "notebook-new-entry",
|
||||||
"implementation": newEntryAction,
|
// "implementation": newEntryAction,
|
||||||
"name": "New Notebook Entry",
|
// "name": "New Notebook Entry",
|
||||||
"cssClass": "icon-notebook labeled",
|
// "cssClass": "icon-notebook labeled",
|
||||||
"description": "Add a new Notebook entry",
|
// "description": "Add a new Notebook entry",
|
||||||
"category": [
|
// "category": [
|
||||||
"view-control"
|
// "view-control"
|
||||||
],
|
// ],
|
||||||
"depends": [
|
// "depends": [
|
||||||
"$compile",
|
// "$compile",
|
||||||
"$rootScope",
|
// "$rootScope",
|
||||||
"dialogService",
|
// "dialogService",
|
||||||
"notificationService",
|
// "notificationService",
|
||||||
"linkService"
|
// "linkService"
|
||||||
],
|
// ],
|
||||||
"priority": "preferred"
|
// "priority": "preferred"
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"licenses": [
|
// "licenses": [
|
||||||
{
|
// {
|
||||||
"name": "painterro",
|
// "name": "painterro",
|
||||||
"version": "0.2.65",
|
// "version": "0.2.65",
|
||||||
"author": "Ivan Borshchov",
|
// "author": "Ivan Borshchov",
|
||||||
"description": "Painterro is JavaScript paint widget which allows editing images directly in a browser.",
|
// "description": "Painterro is JavaScript paint widget which allows editing images directly in a browser.",
|
||||||
"website": "https://github.com/ivictbor/painterro",
|
// "website": "https://github.com/ivictbor/painterro",
|
||||||
"copyright": "Copyright 2017 Ivan Borshchov",
|
// "copyright": "Copyright 2017 Ivan Borshchov",
|
||||||
"license": "MIT",
|
// "license": "MIT",
|
||||||
"link": "https://github.com/ivictbor/painterro/blob/master/LICENSE"
|
// "link": "https://github.com/ivictbor/painterro/blob/master/LICENSE"
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"capabilities": [
|
// "capabilities": [
|
||||||
{
|
// {
|
||||||
"key": "notebook",
|
// "key": "notebook",
|
||||||
"name": "Notebook Capability",
|
// "name": "Notebook Capability",
|
||||||
"description": "Provides a capability for looking for a notebook domain object",
|
// "description": "Provides a capability for looking for a notebook domain object",
|
||||||
"implementation": NotebookCapability,
|
// "implementation": NotebookCapability,
|
||||||
"depends": [
|
// "depends": [
|
||||||
"typeService"
|
// "typeService"
|
||||||
]
|
// ]
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"policies": [
|
// "policies": [
|
||||||
{
|
// {
|
||||||
"category": "composition",
|
// "category": "composition",
|
||||||
"implementation": CompositionPolicy,
|
// "implementation": CompositionPolicy,
|
||||||
"message": "Objects of this type cannot contain objects of that type."
|
// "message": "Objects of this type cannot contain objects of that type."
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"controls": [
|
// "controls": [
|
||||||
{
|
// {
|
||||||
"key": "embed-control",
|
// "key": "embed-control",
|
||||||
"template": embedControlTemplate
|
// "template": embedControlTemplate
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
"key": "snapshot-select",
|
// "key": "snapshot-select",
|
||||||
"template": snapSelectTemplate
|
// "template": snapSelectTemplate
|
||||||
}
|
// }
|
||||||
],
|
// ],
|
||||||
"stylesheets": [
|
"stylesheets": [
|
||||||
{
|
{
|
||||||
"stylesheetUrl": "css/notebook.css"
|
"stylesheetUrl": "css/notebook.css"
|
||||||
|
@ -147,7 +147,7 @@ define(
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.textFocus = function ($event, entryId) {
|
$scope.textFocus = function ($event) {
|
||||||
if ($event.srcElement) {
|
if ($event.srcElement) {
|
||||||
$scope.currentEntryValue = $event.srcElement.innerText;
|
$scope.currentEntryValue = $event.srcElement.innerText;
|
||||||
} else {
|
} else {
|
||||||
|
215
src/plugins/NotebookV2/plugin.js
Normal file
215
src/plugins/NotebookV2/plugin.js
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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/controllers/NotebookController",
|
||||||
|
"./src/controllers/NewEntryController",
|
||||||
|
"./src/controllers/SelectSnapshotController",
|
||||||
|
"./src/actions/NewEntryContextual",
|
||||||
|
"./src/actions/AnnotateSnapshot",
|
||||||
|
"./src/directives/MCTSnapshot",
|
||||||
|
"./src/directives/EntryDnd",
|
||||||
|
"text!./res/templates/controls/snapSelect.html",
|
||||||
|
"text!./res/templates/controls/embedControl.html",
|
||||||
|
"text!./res/templates/annotation.html",
|
||||||
|
"text!./res/templates/draggedEntry.html"
|
||||||
|
], function (
|
||||||
|
NotebookController,
|
||||||
|
NewEntryController,
|
||||||
|
SelectSnapshotController,
|
||||||
|
newEntryAction,
|
||||||
|
AnnotateSnapshotAction,
|
||||||
|
MCTSnapshotDirective,
|
||||||
|
EntryDndDirective,
|
||||||
|
snapSelectTemplate,
|
||||||
|
embedControlTemplate,
|
||||||
|
annotationTemplate,
|
||||||
|
draggedEntryTemplate
|
||||||
|
) {
|
||||||
|
var installed = false;
|
||||||
|
|
||||||
|
function NotebookV2Plugin() {
|
||||||
|
return function install(openmct) {
|
||||||
|
if (installed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
installed = true;
|
||||||
|
|
||||||
|
openmct.legacyRegistry.register('notebookV2', {
|
||||||
|
name: 'Notebook Plugin',
|
||||||
|
extensions: {
|
||||||
|
types: [
|
||||||
|
{
|
||||||
|
key: 'notebookV2',
|
||||||
|
name: 'NotebookV2',
|
||||||
|
cssClass: 'icon-notebook',
|
||||||
|
description: 'Create and save timestamped notes with embedded object snapshots.',
|
||||||
|
features: 'creation',
|
||||||
|
model: {
|
||||||
|
entries: [],
|
||||||
|
composition: [],
|
||||||
|
entryTypes: [],
|
||||||
|
defaultSort: '-createdOn'
|
||||||
|
},
|
||||||
|
properties: [
|
||||||
|
{
|
||||||
|
key: 'defaultSort',
|
||||||
|
name: 'Default Sort',
|
||||||
|
control: 'select',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Newest First',
|
||||||
|
value: "-createdOn",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Oldest First',
|
||||||
|
value: "createdOn"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
cssClass: 'l-inline'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
"key": "notebook-new-entry",
|
||||||
|
"implementation": newEntryAction,
|
||||||
|
"name": "New Notebook Entry",
|
||||||
|
"cssClass": "icon-notebook labeled",
|
||||||
|
"description": "Add a new Notebook entry",
|
||||||
|
"category": [
|
||||||
|
"view-control"
|
||||||
|
],
|
||||||
|
"depends": [
|
||||||
|
"$compile",
|
||||||
|
"$rootScope",
|
||||||
|
"dialogService",
|
||||||
|
"notificationService",
|
||||||
|
"linkService"
|
||||||
|
],
|
||||||
|
"priority": "preferred"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "annotate-snapshot",
|
||||||
|
"implementation": AnnotateSnapshotAction,
|
||||||
|
"name": "Annotate Snapshot",
|
||||||
|
"cssClass": "icon-pencil labeled",
|
||||||
|
"description": "Annotate embed's snapshot",
|
||||||
|
"category": "embed",
|
||||||
|
"depends": [
|
||||||
|
"dialogService",
|
||||||
|
"dndService",
|
||||||
|
"$rootScope"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
controllers: [
|
||||||
|
{
|
||||||
|
"key": "NewEntryController",
|
||||||
|
"implementation": NewEntryController,
|
||||||
|
"depends": ["$scope",
|
||||||
|
"$rootScope"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "selectSnapshotController",
|
||||||
|
"implementation": SelectSnapshotController,
|
||||||
|
"depends": ["$scope",
|
||||||
|
"$rootScope"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
controls: [
|
||||||
|
{
|
||||||
|
"key": "snapshot-select",
|
||||||
|
"template": snapSelectTemplate
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "embed-control",
|
||||||
|
"template": embedControlTemplate
|
||||||
|
}
|
||||||
|
],
|
||||||
|
templates: [
|
||||||
|
{
|
||||||
|
"key": "annotate-snapshot",
|
||||||
|
"template": annotationTemplate
|
||||||
|
}
|
||||||
|
],
|
||||||
|
directives: [
|
||||||
|
{
|
||||||
|
"key": "mctSnapshot",
|
||||||
|
"implementation": MCTSnapshotDirective,
|
||||||
|
"depends": [
|
||||||
|
"$rootScope",
|
||||||
|
"$document",
|
||||||
|
"exportImageService",
|
||||||
|
"dialogService",
|
||||||
|
"notificationService"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "mctEntryDnd",
|
||||||
|
"implementation": EntryDndDirective,
|
||||||
|
"depends": [
|
||||||
|
"$rootScope",
|
||||||
|
"$compile",
|
||||||
|
"dndService",
|
||||||
|
"typeService",
|
||||||
|
"notificationService"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
representations: [
|
||||||
|
{
|
||||||
|
"key": "draggedEntry",
|
||||||
|
"template": draggedEntryTemplate
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
openmct.legacyRegistry.enable('notebookV2');
|
||||||
|
|
||||||
|
openmct.objectViews.addProvider({
|
||||||
|
key: 'notebook-vue',
|
||||||
|
name: 'Notebook View',
|
||||||
|
cssClass: 'icon-notebook',
|
||||||
|
canView: function (domainObject) {
|
||||||
|
return domainObject.type === 'notebookV2';
|
||||||
|
},
|
||||||
|
view: function (domainObject) {
|
||||||
|
var controller = new NotebookController (openmct, domainObject);
|
||||||
|
|
||||||
|
return {
|
||||||
|
show: controller.show,
|
||||||
|
destroy: controller.destroy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return NotebookV2Plugin;
|
||||||
|
});
|
294
src/plugins/NotebookV2/res/sass/_notebook-base.scss
Normal file
294
src/plugins/NotebookV2/res/sass/_notebook-base.scss
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2016, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
.w-notebook {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
overflow: hidden;
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
right: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
left: 0px;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notebook-view-controls.l-flex-row {
|
||||||
|
> * {
|
||||||
|
// filter and sort selects
|
||||||
|
&:not(:first-child) { margin-left: $interiorMargin; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-notebook-drag-area {
|
||||||
|
padding: 10px;
|
||||||
|
font-style: italic;
|
||||||
|
cursor: pointer;
|
||||||
|
&:before { margin-right: 7px !important; }
|
||||||
|
.label {
|
||||||
|
@include ellipsize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.frame {
|
||||||
|
.icon-notebook {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay.l-dialog .title{
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.w-notebook-entries {
|
||||||
|
padding-right: $interiorMarginSm;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: scroll;
|
||||||
|
.t-entries-list {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-notebook-entry {
|
||||||
|
$p: $interiorMarginSm;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-bottom: $p;
|
||||||
|
padding: $p $interiorMargin;
|
||||||
|
|
||||||
|
.s-notebook-entry-time,
|
||||||
|
.s-notebook-entry-text,
|
||||||
|
.notebook-entry-delete {
|
||||||
|
padding-top: $p;
|
||||||
|
padding-bottom: $p;
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-notebook-entry-time {
|
||||||
|
border: 1px solid transparent; // Needed to maintain vertical alignment with s-notebook-entry-text
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-notebook-entry-content{
|
||||||
|
.s-notebook-entry-text {
|
||||||
|
// Contenteditable div that holds text
|
||||||
|
min-height: 24px; // Needed in Firefox when field is blank
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
.entry-embeds{
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.snap-thumb {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-entry-embed {
|
||||||
|
$m: $interiorMarginSm;
|
||||||
|
position: relative;
|
||||||
|
margin: $m $m 0 0;
|
||||||
|
padding: $interiorMarginSm;
|
||||||
|
|
||||||
|
&.has-snapshot {
|
||||||
|
&:before {
|
||||||
|
position: absolute;
|
||||||
|
text-shadow: rgba(black, 0.7) 0 1px 5px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.snap-thumb {
|
||||||
|
$d: 50px;
|
||||||
|
width: $d;
|
||||||
|
height: $d;
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
img {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.embed-info {
|
||||||
|
margin-left: $interiorMargin;
|
||||||
|
.embed-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.t-contents,
|
||||||
|
.snap-annotation {
|
||||||
|
// Todo: don't write this to t-contents, add a l- class
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notebook-filters {
|
||||||
|
.select {
|
||||||
|
margin-left: $interiorMargin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-status-taking-snapshot,
|
||||||
|
.overlay.snapshot {
|
||||||
|
// Handle overflow-y issues with tables and html2canvas
|
||||||
|
.l-sticky-headers .l-tabular-body { overflow: auto; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************* MOBILE */
|
||||||
|
body.mobile {
|
||||||
|
// Hide the start entry area, and disable ability to edit or delete an entry in mobile context
|
||||||
|
.l-notebook-drag-area {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-notebook-entry {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.phone.portrait {
|
||||||
|
.w-notebook-entry-time-and-content {
|
||||||
|
flex-direction: column !important;
|
||||||
|
}
|
||||||
|
.s-notebook-entry-time,
|
||||||
|
.notebook-entry-delete {
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.phone.portrait {
|
||||||
|
.l-notebook-head.l-flex-row {
|
||||||
|
flex-direction: column !important;
|
||||||
|
> * {
|
||||||
|
&:not(:first-child) { margin-top: $interiorMargin; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************* PAINTERRO OVERRIDES */
|
||||||
|
.annotation-dialog .abs.editor {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#snap-annotation {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: absolute;
|
||||||
|
top: 0; right: 0; bottom: 0; left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#snap-annotation-wrapper,
|
||||||
|
#snap-annotation-bar {
|
||||||
|
position: relative;
|
||||||
|
top: auto; right: auto; bottom: auto; left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#snap-annotation-wrapper {
|
||||||
|
order: 2;
|
||||||
|
flex: 10 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#snap-annotation-bar {
|
||||||
|
order: 1;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
height: auto;
|
||||||
|
background-color: transparent !important;
|
||||||
|
margin-bottom: $interiorMargin;
|
||||||
|
|
||||||
|
> div,
|
||||||
|
> div > span,
|
||||||
|
.ptro-icon-btn,
|
||||||
|
.ptro-named-btn,
|
||||||
|
.ptro-color-btn,
|
||||||
|
.ptro-bordered-btn,
|
||||||
|
.ptro-tool-ctl-name,
|
||||||
|
.ptro-color-btn,
|
||||||
|
.tool-controls,
|
||||||
|
.ptro-input {
|
||||||
|
// Lot of resets for crappy CSS in Painterro
|
||||||
|
&:first-child {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
}
|
||||||
|
$h: $btnToolbarH;
|
||||||
|
display: inline-block;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: auto;
|
||||||
|
height: $h !important;
|
||||||
|
margin: 0 0 0 5px;
|
||||||
|
position: relative;
|
||||||
|
width: auto !important;
|
||||||
|
line-height: $h !important;
|
||||||
|
top: auto;
|
||||||
|
right: auto;
|
||||||
|
bottom: auto;
|
||||||
|
left: auto;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ptro-tool-ctl-name {
|
||||||
|
border-radius: 0;
|
||||||
|
background: none;
|
||||||
|
top: auto;
|
||||||
|
font-family: inherit;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ptro-color-btn {
|
||||||
|
width: $btnToolbarH !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ptro-icon-btn,
|
||||||
|
.ptro-named-btn {
|
||||||
|
// .s-button class is added via JS in AnnotateSnapshot.js
|
||||||
|
// TODO: redo this so that we don't need to use Zepto and JS
|
||||||
|
i {
|
||||||
|
font-size: 1.25em !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tool-controls {
|
||||||
|
font-size: 0.8rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ptro-info,
|
||||||
|
.ptro-btn-color-checkers-bar,
|
||||||
|
*[title="Font name"],
|
||||||
|
*[title="Stroke color"],
|
||||||
|
*[title="Stroke width"],
|
||||||
|
*[data-id="fontName"],
|
||||||
|
*[data-id="fontStrokeSize"],
|
||||||
|
*[data-id="stroke"] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************* NO IDEA WHAT THERE ARE APPLYING TO */
|
||||||
|
.context-available {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-element.menu-view{
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay.l-dialog .abs.editor {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
94
src/plugins/NotebookV2/res/sass/_notebook-thematic.scss
Normal file
94
src/plugins/NotebookV2/res/sass/_notebook-thematic.scss
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
.l-notebook-drag-area {
|
||||||
|
border: 1px dashed rgba($colorKey, 0.7);
|
||||||
|
border-radius: $controlCr;
|
||||||
|
color: rgba($colorBodyFg, 0.7);
|
||||||
|
&:hover {
|
||||||
|
background: rgba($colorKey, 0.2);
|
||||||
|
color: $colorBodyFg;
|
||||||
|
}
|
||||||
|
&.drag-active{
|
||||||
|
border-color: $colorKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-notebook-entry {
|
||||||
|
transition: background-color 500ms ease-out;
|
||||||
|
background-color: rgba($colorBodyFg, 0.1);
|
||||||
|
border-radius: $basicCr;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transition: background-color 50ms ease-in;
|
||||||
|
background-color: rgba($colorBodyFg, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-notebook-entry-time {
|
||||||
|
color: rgba($colorBodyFg, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-entry-embed {
|
||||||
|
border-radius: $controlCr;
|
||||||
|
background-color: rgba($colorBodyFg, 0.1);
|
||||||
|
&.has-snapshot {
|
||||||
|
&:before {
|
||||||
|
color: $colorBodyFg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-snapshot-datetime {
|
||||||
|
color: rgba($colorBodyFg, 0.4);
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.snap-thumb {
|
||||||
|
border: 1px solid $colorInteriorBorder;
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-status-taking-snapshot,
|
||||||
|
.overlay.snapshot {
|
||||||
|
// Applied to an object view when it's in the process of being snapshotted
|
||||||
|
background: $colorBodyBg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************* PAINTERRO OVERRIDES */
|
||||||
|
.ptro-wrapper {
|
||||||
|
background: rgba($colorBodyBg, 0.3) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#snap-annotation-bar {
|
||||||
|
.tool-controls {
|
||||||
|
color: $colorBodyFg !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-button.ptro-color-active-control {
|
||||||
|
background: $colorBtnMajorBg !important;
|
||||||
|
color: $colorBtnMajorFg !important;
|
||||||
|
&:hover {
|
||||||
|
background: $colorBtnMajorBgHov !important;
|
||||||
|
color: $colorBtnMajorFgHov !important;
|
||||||
|
}
|
||||||
|
}
|
30
src/plugins/NotebookV2/res/sass/notebook-espresso.scss
Normal file
30
src/plugins/NotebookV2/res/sass/notebook-espresso.scss
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
$output-bourbon-deprecation-warnings: false;
|
||||||
|
@import "bourbon";
|
||||||
|
|
||||||
|
@import "../../../../commonUI/general/res/sass/constants";
|
||||||
|
@import "../../../../commonUI/general/res/sass/mixins";
|
||||||
|
@import "../../../../commonUI/general/res/sass/glyphs";
|
||||||
|
@import "../../../../commonUI/themes/espresso/res/sass/constants";
|
||||||
|
@import "../../../../commonUI/themes/espresso/res/sass/mixins";
|
||||||
|
@import "notebook-thematic";
|
30
src/plugins/NotebookV2/res/sass/notebook-snow.scss
Normal file
30
src/plugins/NotebookV2/res/sass/notebook-snow.scss
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
$output-bourbon-deprecation-warnings: false;
|
||||||
|
@import "bourbon";
|
||||||
|
|
||||||
|
@import "../../../../commonUI/general/res/sass/constants";
|
||||||
|
@import "../../../../commonUI/general/res/sass/mixins";
|
||||||
|
@import "../../../../commonUI/general/res/sass/glyphs";
|
||||||
|
@import "../../../../commonUI/themes/snow/res/sass/constants";
|
||||||
|
@import "../../../../commonUI/themes/snow/res/sass/mixins";
|
||||||
|
@import "notebook-thematic";
|
28
src/plugins/NotebookV2/res/sass/notebook.scss
Normal file
28
src/plugins/NotebookV2/res/sass/notebook.scss
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2015, 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.
|
||||||
|
*****************************************************************************/
|
||||||
|
$output-bourbon-deprecation-warnings: false;
|
||||||
|
@import "bourbon";
|
||||||
|
@import "../../../../commonUI/general/res/sass/constants";
|
||||||
|
@import "../../../../commonUI/general/res/sass/mixins";
|
||||||
|
@import "../../../../commonUI/general/res/sass/mobile/constants";
|
||||||
|
@import "../../../../commonUI/general/res/sass/mobile/mixins";
|
||||||
|
@import "notebook-base";
|
2
src/plugins/NotebookV2/res/templates/annotation.html
Normal file
2
src/plugins/NotebookV2/res/templates/annotation.html
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<div class="snap-annotation" id="snap-annotation" ng-controller="ngModel.controller">
|
||||||
|
</div>
|
@ -0,0 +1,51 @@
|
|||||||
|
<!--
|
||||||
|
Open MCT, Copyright (c) 2009-2016, United States Government
|
||||||
|
as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
Administration. All rights reserved.
|
||||||
|
|
||||||
|
Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Open MCT includes source code licensed under additional open source
|
||||||
|
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
this source code distribution or the Licensing information page available
|
||||||
|
at runtime from the About dialog for additional information.
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
This element appears in the overlay dialog when initiating a new Notebook Entry from a view's Notebook button -->
|
||||||
|
<div class='form-control'>
|
||||||
|
<ng-form name="mctControl">
|
||||||
|
<div class='fields' ng-controller="NewEntryController">
|
||||||
|
<div class="l-flex-row new-notebook-entry-embed l-entry-embed {{cssClass}}"
|
||||||
|
ng-class="{ 'has-snapshot' : snapToggle }">
|
||||||
|
<div class="holder flex-elem snap-thumb"
|
||||||
|
ng-if="snapToggle">
|
||||||
|
<img ng-src="{{snapshot.src}}" alt="{{snapshot.modified}}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="holder flex-elem embed-info">
|
||||||
|
<div class="embed-title">{{objectName}}</div>
|
||||||
|
<div class="embed-date"
|
||||||
|
ng-if="snapToggle">{{snapshot.modified| date:'yyyy-MM-dd HH:mm:ss'}}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="holder flex-elem annotate-new"
|
||||||
|
ng-if="snapToggle">
|
||||||
|
<a class="s-button flex-elem icon-pencil "
|
||||||
|
title="Annotate this snapshot"
|
||||||
|
ng-click="annotateSnapshot()">
|
||||||
|
<span class="title-label">Annotate</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ng-form>
|
||||||
|
</div>
|
@ -0,0 +1,29 @@
|
|||||||
|
<!--
|
||||||
|
Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
Administration. All rights reserved.
|
||||||
|
|
||||||
|
Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Open MCT includes source code licensed under additional open source
|
||||||
|
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
this source code distribution or the Licensing information page available
|
||||||
|
at runtime from the About dialog for additional information.
|
||||||
|
-->
|
||||||
|
<div class='form-control select' ng-controller="selectSnapshotController">
|
||||||
|
<select
|
||||||
|
ng-model="selectModel"
|
||||||
|
ng-options="opt.value as opt.name for opt in options"
|
||||||
|
ng-required="ngRequired"
|
||||||
|
name="mctControl">
|
||||||
|
</select>
|
||||||
|
</div>
|
38
src/plugins/NotebookV2/res/templates/draggedEntry.html
Normal file
38
src/plugins/NotebookV2/res/templates/draggedEntry.html
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<!--
|
||||||
|
Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
Administration. All rights reserved.
|
||||||
|
|
||||||
|
Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Open MCT includes source code licensed under additional open source
|
||||||
|
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
this source code distribution or the Licensing information page available
|
||||||
|
at runtime from the About dialog for additional information.
|
||||||
|
-->
|
||||||
|
<div class="frame snap-frame frame-template t-frame-inner abs t-object-type-{{ representation.selected.key }}">
|
||||||
|
<div class="abs object-browse-bar l-flex-row">
|
||||||
|
<div class="btn-bar right l-flex-row flex-elem flex-justify-end flex-fixed">
|
||||||
|
<mct-representation
|
||||||
|
key="'switcher'"
|
||||||
|
ng-model="representation"
|
||||||
|
mct-object="domainObject">
|
||||||
|
</mct-representation>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="abs object-holder" data-entry = "{{parameters.entry}}" data-embed = "{{parameters.embed}}" mct-snapshot ng-if="representation.selected.key">
|
||||||
|
<mct-representation
|
||||||
|
key="representation.selected.key"
|
||||||
|
mct-object="representation.selected.key && domainObject">
|
||||||
|
</mct-representation>
|
||||||
|
</div>
|
||||||
|
</div>
|
36
src/plugins/NotebookV2/res/templates/embed.html
Normal file
36
src/plugins/NotebookV2/res/templates/embed.html
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<div
|
||||||
|
class="l-flex-row l-entry-embed"
|
||||||
|
v-bind:class="[embed.cssClass]">
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="snap-thumb"
|
||||||
|
v-if="embed.snapshot"
|
||||||
|
v-on:click="openSnapshot">
|
||||||
|
<img v-bind:src="embed.snapshot.src">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="embed-info l-flex-col">
|
||||||
|
<div class="embed-title object-header">
|
||||||
|
<a v-on:click="navigate(embed.type)">{{embed.name}}</a>
|
||||||
|
<a class='context-available' v-on:click="toggleActionMenu"></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hide-menu hidden">
|
||||||
|
<div class="menu-element context-menu-wrapper mobile-disable-select">
|
||||||
|
<div class="menu context-menu">
|
||||||
|
<ul>
|
||||||
|
<li v-for="(action) in actions"
|
||||||
|
v-bind:class="[action.cssClass]"
|
||||||
|
v-on:click="action.perform(embed, entry)">
|
||||||
|
{{ action.name }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="embed-date" v-if="embed.snapshot">
|
||||||
|
{{formatTime(embed.createdOn, 'YYYY-MM-DD HH:mm:ss')}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
35
src/plugins/NotebookV2/res/templates/entry.html
Normal file
35
src/plugins/NotebookV2/res/templates/entry.html
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<li class="l-flex-row has-local-controls l-notebook-entry s-notebook-entry"
|
||||||
|
v-on:drop="dropOnEntry(entry.id)"
|
||||||
|
v-on:dragover="dragoverOnEntry"
|
||||||
|
>
|
||||||
|
|
||||||
|
<div class="holder flex-elem l-flex-row grows w-notebook-entry-time-and-content">
|
||||||
|
<div class="holder flex-elem s-notebook-entry-time">
|
||||||
|
<span>{{formatTime(entry.createdOn, 'YYYY-MM-DD')}}</span>
|
||||||
|
<span>{{formatTime(entry.createdOn, 'HH:mm:ss')}}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="holder flex-elem l-flex-col grows l-notebook-entry-content">
|
||||||
|
<div class="flex-elem s-input-inline t-notebook-entry-input s-notebook-entry-text"
|
||||||
|
contenteditable="true"
|
||||||
|
ref="contenteditable"
|
||||||
|
v-on:blur="textBlur($event, entry.id)"
|
||||||
|
v-on:focus="textFocus($event, entry.id)"
|
||||||
|
v-bind:key="entry.id"
|
||||||
|
v-html="entry.text">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex-elem entry-embeds l-flex-row">
|
||||||
|
<notebook-embed
|
||||||
|
v-for="(embed, index) in entry.embeds"
|
||||||
|
v-bind:embed="embed"
|
||||||
|
v-bind:entry="entry"
|
||||||
|
></notebook-embed>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="holder flex-elem local-control local-controls-hidden notebook-entry-delete">
|
||||||
|
<a class="s-icon-button icon-trash" title="Delete Entry" v-on:click="deleteEntry"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
46
src/plugins/NotebookV2/res/templates/notebook.html
Normal file
46
src/plugins/NotebookV2/res/templates/notebook.html
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<div class="mct-notebook w-notebook l-flex-col">
|
||||||
|
<div class="l-notebook-head holder l-flex-row flex-elem">
|
||||||
|
<div class="c-search flex-elem holder grows">
|
||||||
|
<input class="c-search__search-input"
|
||||||
|
type="text" tabindex="10000"
|
||||||
|
v-model="entrySearch"
|
||||||
|
v-on:keyup="search($event)"/>
|
||||||
|
<a class="c-search__clear-input clear-icon icon-x-in-circle"
|
||||||
|
v-bind:class="[entrySearch ? 'show': '']"
|
||||||
|
v-on:click="entrySearch = ''; search($event)"></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="notebook-view-controls l-flex-row flex-elem holder">
|
||||||
|
<div class="select notebook-view-controls__filter-time">
|
||||||
|
<select v-model="showTime">
|
||||||
|
<option value="0" selected="selected">Show all</option>
|
||||||
|
<option value="1">Last hour</option>
|
||||||
|
<option value="8">Last 8 hours</option>
|
||||||
|
<option value="24">Last 24 hours</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="select notebook-view-controls__sort">
|
||||||
|
<select v-model="sortEntries">
|
||||||
|
<option value="-createdOn" selected="selected">Newest first</option>
|
||||||
|
<option value="createdOn">Oldest first</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- drag area -->
|
||||||
|
<div class="holder flex-elem l-flex-row icon-plus labeled l-notebook-drag-area" v-on:click="newEntry($event)"
|
||||||
|
id="newEntry" mct-entry-dnd>
|
||||||
|
<span class="label">To start a new entry, click here or drag and drop any object</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- entries -->
|
||||||
|
<div class="holder flex-elem grows w-notebook-entries t-entries-list" ng-mouseover="handleActive()">
|
||||||
|
<ul>
|
||||||
|
<notebook-entry
|
||||||
|
v-for="entry in filterBySearch(entries, entrySearch)"
|
||||||
|
v-bind:entry="entry"
|
||||||
|
></notebook-entry>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
50
src/plugins/NotebookV2/res/templates/viewSnapshot.html
Normal file
50
src/plugins/NotebookV2/res/templates/viewSnapshot.html
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<div class="abs overlay l-large-view">
|
||||||
|
<div class="abs blocker" v-on:click="close"></div>
|
||||||
|
|
||||||
|
<div class="abs outer-holder">
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="close icon-x-in-circle"
|
||||||
|
v-on:click="close">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="abs inner-holder l-flex-col">
|
||||||
|
<div class="t-contents flex-elem holder grows">
|
||||||
|
|
||||||
|
<div class="t-snapshot abs l-view-header">
|
||||||
|
<div class="abs object-browse-bar l-flex-row">
|
||||||
|
<div class="left flex-elem l-flex-row grows">
|
||||||
|
<div class="object-header flex-elem l-flex-row grows">
|
||||||
|
<div class="type-icon flex-elem embed-icon holder" v-bind:class="embed.cssClass"></div>
|
||||||
|
<div class="title-label flex-elem holder flex-can-shrink">{{embed.name}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="btn-bar right l-flex-row flex-elem flex-justify-end flex-fixed">
|
||||||
|
<div class="flex-elem holder flex-can-shrink s-snapshot-datetime">
|
||||||
|
SNAPSHOT {{formatTime(embed.createdOn, 'YYYY-MM-DD HH:mm:ss')}}
|
||||||
|
</div>
|
||||||
|
<a class="s-button icon-pencil" title="Annotate">
|
||||||
|
<span class="title-label">Annotate</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="abs object-holder t-image-holder s-image-holder">
|
||||||
|
<div
|
||||||
|
class="image-main s-image-main"
|
||||||
|
v-bind:style="{ backgroundImage: 'url(' + embed.snapshot.src + ')' }">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="bottom-bar flex-elem holder"
|
||||||
|
v-on:click="close">
|
||||||
|
|
||||||
|
<a class="t-done s-button major">Done</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
165
src/plugins/NotebookV2/src/actions/AnnotateSnapshot.js
Normal file
165
src/plugins/NotebookV2/src/actions/AnnotateSnapshot.js
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining viewSnapshot (Originally NewWindowAction). Created by vwoeltje on 11/18/14.
|
||||||
|
*/
|
||||||
|
define(
|
||||||
|
["painterro", "zepto"],
|
||||||
|
function (Painterro, $) {
|
||||||
|
|
||||||
|
var annotationStruct = {
|
||||||
|
title: "Annotate Snapshot",
|
||||||
|
template: "annotate-snapshot",
|
||||||
|
options: [{
|
||||||
|
name: "OK",
|
||||||
|
key: "ok",
|
||||||
|
description: "save annotation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Cancel",
|
||||||
|
key: "cancel",
|
||||||
|
description: "cancel editing"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
function AnnotateSnapshot(dialogService, dndService, $rootScope, context) {
|
||||||
|
context = context || {};
|
||||||
|
|
||||||
|
// Choose the object to be opened into a new tab
|
||||||
|
this.domainObject = context.selectedObject || context.domainObject;
|
||||||
|
this.dialogService = dialogService;
|
||||||
|
this.dndService = dndService;
|
||||||
|
this.$rootScope = $rootScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
AnnotateSnapshot.prototype.perform = function ($event, snapshot, embedId, entryId) {
|
||||||
|
|
||||||
|
var DOMAIN_OBJECT = this.domainObject;
|
||||||
|
var ROOTSCOPE = this.$rootScope;
|
||||||
|
var painterro;
|
||||||
|
var save = false;
|
||||||
|
|
||||||
|
var controller = ['$scope', '$timeout', function PainterroController($scope, $timeout) {
|
||||||
|
$(document.body).find('.l-dialog .outer-holder').addClass('annotation-dialog');
|
||||||
|
|
||||||
|
// Timeout is necessary because Painterro uses document.getElementById, and mct-include
|
||||||
|
// hasn't added the dialog to the DOM yet.
|
||||||
|
$timeout(function () {
|
||||||
|
painterro = Painterro({
|
||||||
|
id: 'snap-annotation',
|
||||||
|
activeColor: '#ff0000',
|
||||||
|
activeColorAlpha: 1.0,
|
||||||
|
activeFillColor: '#fff',
|
||||||
|
activeFillColorAlpha: 0.0,
|
||||||
|
backgroundFillColor: '#000',
|
||||||
|
backgroundFillColorAlpha: 0.0,
|
||||||
|
defaultFontSize: 16,
|
||||||
|
defaultLineWidth: 2,
|
||||||
|
defaultTool: 'ellipse',
|
||||||
|
hiddenTools: ['save', 'open', 'close', 'eraser', 'pixelize', 'rotate', 'settings', 'resize'],
|
||||||
|
translation: {
|
||||||
|
name: 'en',
|
||||||
|
strings: {
|
||||||
|
lineColor: 'Line',
|
||||||
|
fillColor: 'Fill',
|
||||||
|
lineWidth: 'Size',
|
||||||
|
textColor: 'Color',
|
||||||
|
fontSize: 'Size',
|
||||||
|
fontStyle: 'Style'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
saveHandler: function (image, done) {
|
||||||
|
if (save) {
|
||||||
|
if (entryId && embedId) {
|
||||||
|
var elementPos = DOMAIN_OBJECT.model.entries.map(function (x) {
|
||||||
|
return x.createdOn;
|
||||||
|
}).indexOf(entryId);
|
||||||
|
var entryEmbeds = DOMAIN_OBJECT.model.entries[elementPos].embeds;
|
||||||
|
var embedPos = entryEmbeds.map(function (x) {
|
||||||
|
return x.id;
|
||||||
|
}).indexOf(embedId);
|
||||||
|
|
||||||
|
saveSnap(image.asBlob(), embedPos, elementPos, DOMAIN_OBJECT);
|
||||||
|
}else {
|
||||||
|
ROOTSCOPE.snapshot = {'src': image.asDataURL('image/png'),
|
||||||
|
'modified': Date.now()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done(true);
|
||||||
|
}
|
||||||
|
}).show(snapshot);
|
||||||
|
|
||||||
|
$(document.body).find('.ptro-icon-btn').addClass('s-button');
|
||||||
|
$(document.body).find('.ptro-input').addClass('s-button');
|
||||||
|
});
|
||||||
|
}];
|
||||||
|
|
||||||
|
annotationStruct.model = {'controller': controller};
|
||||||
|
|
||||||
|
function saveNotes(param) {
|
||||||
|
if (param === 'ok') {
|
||||||
|
save = true;
|
||||||
|
}else {
|
||||||
|
save = false;
|
||||||
|
ROOTSCOPE.snapshot = "annotationCancelled";
|
||||||
|
}
|
||||||
|
painterro.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
function rejectNotes() {
|
||||||
|
save = false;
|
||||||
|
ROOTSCOPE.snapshot = "annotationCancelled";
|
||||||
|
painterro.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveSnap(url, embedPos, entryPos, domainObject) {
|
||||||
|
var snap = false;
|
||||||
|
|
||||||
|
if (embedPos !== -1 && entryPos !== -1) {
|
||||||
|
var reader = new window.FileReader();
|
||||||
|
reader.readAsDataURL(url);
|
||||||
|
reader.onloadend = function () {
|
||||||
|
snap = reader.result;
|
||||||
|
domainObject.useCapability('mutation', function (model) {
|
||||||
|
if (model.entries[entryPos]) {
|
||||||
|
model.entries[entryPos].embeds[embedPos].snapshot = {
|
||||||
|
'src': snap,
|
||||||
|
'type': url.type,
|
||||||
|
'size': url.size,
|
||||||
|
'modified': Date.now()
|
||||||
|
};
|
||||||
|
model.entries[entryPos].embeds[embedPos].id = Date.now();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dialogService.getUserChoice(annotationStruct)
|
||||||
|
.then(saveNotes, rejectNotes);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return AnnotateSnapshot;
|
||||||
|
}
|
||||||
|
);
|
204
src/plugins/NotebookV2/src/actions/NewEntryContextual.js
Normal file
204
src/plugins/NotebookV2/src/actions/NewEntryContextual.js
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
define(
|
||||||
|
[],
|
||||||
|
function () {
|
||||||
|
|
||||||
|
var SNAPSHOT_TEMPLATE = '<mct-representation key="\'draggedEntry\'"' +
|
||||||
|
'class="t-rep-frame holder"' +
|
||||||
|
'mct-object="selObj">' +
|
||||||
|
'</mct-representation>';
|
||||||
|
|
||||||
|
var NEW_TASK_FORM = {
|
||||||
|
name: "Create a Notebook Entry",
|
||||||
|
hint: "Please select one Notebook",
|
||||||
|
sections: [{
|
||||||
|
rows: [{
|
||||||
|
name: 'Entry',
|
||||||
|
key: 'entry',
|
||||||
|
control: 'textarea',
|
||||||
|
required: false,
|
||||||
|
"cssClass": "l-textarea-sm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Embed Type',
|
||||||
|
key: 'withSnapshot',
|
||||||
|
control: 'snapshot-select',
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"name": "Link and Snapshot",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Link only",
|
||||||
|
"value": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Embed',
|
||||||
|
key: 'embedObject',
|
||||||
|
control: 'embed-control'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Save in Notebook',
|
||||||
|
key: 'saveNotebook',
|
||||||
|
control: 'locator',
|
||||||
|
validate: validateLocation
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
function NewEntryContextual($compile, $rootScope, dialogService, notificationService, linkService, context) {
|
||||||
|
context = context || {};
|
||||||
|
this.domainObject = context.selectedObject || context.domainObject;
|
||||||
|
this.dialogService = dialogService;
|
||||||
|
this.notificationService = notificationService;
|
||||||
|
this.linkService = linkService;
|
||||||
|
this.$rootScope = $rootScope;
|
||||||
|
this.$compile = $compile;
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateLocation(newParentObj) {
|
||||||
|
return newParentObj.model.type === 'notebookV2';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NewEntryContextual.prototype.perform = function () {
|
||||||
|
var self = this;
|
||||||
|
var domainObj = this.domainObject;
|
||||||
|
var notification = this.notificationService;
|
||||||
|
var dialogService = this.dialogService;
|
||||||
|
var rootScope = this.$rootScope;
|
||||||
|
rootScope.newEntryText = '';
|
||||||
|
// // Create the overlay element and add it to the document's body
|
||||||
|
this.$rootScope.selObj = domainObj;
|
||||||
|
this.$rootScope.selValue = "";
|
||||||
|
var newScope = rootScope.$new();
|
||||||
|
newScope.selObj = domainObj;
|
||||||
|
newScope.selValue = "";
|
||||||
|
this.$compile(SNAPSHOT_TEMPLATE)(newScope);
|
||||||
|
|
||||||
|
this.$rootScope.$watch("snapshot", setSnapshot);
|
||||||
|
|
||||||
|
function setSnapshot(value) {
|
||||||
|
if (value === "annotationCancelled") {
|
||||||
|
rootScope.snapshot = rootScope.lastValue;
|
||||||
|
rootScope.lastValue = '';
|
||||||
|
|
||||||
|
} else if (value && value !== rootScope.lastValue) {
|
||||||
|
var overlayModel = {
|
||||||
|
title: NEW_TASK_FORM.name,
|
||||||
|
message: NEW_TASK_FORM.message,
|
||||||
|
structure: NEW_TASK_FORM,
|
||||||
|
value: {'entry': rootScope.newEntryText || ""}
|
||||||
|
};
|
||||||
|
|
||||||
|
rootScope.currentDialog = overlayModel;
|
||||||
|
|
||||||
|
dialogService.getDialogResponse(
|
||||||
|
"overlay-dialog",
|
||||||
|
overlayModel,
|
||||||
|
function () {
|
||||||
|
return overlayModel.value;
|
||||||
|
}
|
||||||
|
).then(addNewEntry);
|
||||||
|
|
||||||
|
rootScope.lastValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addNewEntry(options) {
|
||||||
|
options.selectedModel = options.embedObject.getModel();
|
||||||
|
options.cssClass = options.embedObject.getCapability('type').typeDef.cssClass;
|
||||||
|
if (self.$rootScope.snapshot) {
|
||||||
|
options.snapshot = self.$rootScope.snapshot;
|
||||||
|
self.$rootScope.snapshot = undefined;
|
||||||
|
}else {
|
||||||
|
options.snapshot = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.withSnapshot) {
|
||||||
|
options.snapshot = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
createSnap(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSnap(options) {
|
||||||
|
options.saveNotebook.useCapability('mutation', function (model) {
|
||||||
|
var entries = model.entries;
|
||||||
|
var lastEntry = entries[entries.length - 1];
|
||||||
|
var date = Date.now();
|
||||||
|
|
||||||
|
if (lastEntry === undefined || lastEntry.text || lastEntry.embeds) {
|
||||||
|
model.entries.push({
|
||||||
|
'id': date,
|
||||||
|
'createdOn': date,
|
||||||
|
'text': options.entry,
|
||||||
|
'embeds': [{'type': options.embedObject.getId(),
|
||||||
|
'id': '' + date,
|
||||||
|
'cssClass': options.cssClass,
|
||||||
|
'name': options.selectedModel.name,
|
||||||
|
'snapshot': options.snapshot
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
}else {
|
||||||
|
model.entries[entries.length - 1] = {
|
||||||
|
'id': date,
|
||||||
|
'createdOn': date,
|
||||||
|
'text': options.entry,
|
||||||
|
'embeds': [{'type': options.embedObject.getId(),
|
||||||
|
'id': '' + date,
|
||||||
|
'cssClass': options.cssClass,
|
||||||
|
'name': options.selectedModel.name,
|
||||||
|
'snapshot': options.snapshot
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
notification.info({
|
||||||
|
title: "Notebook Entry created"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
NewEntryContextual.appliesTo = function (context) {
|
||||||
|
var domainObject = context.domainObject;
|
||||||
|
|
||||||
|
if (domainObject) {
|
||||||
|
if (domainObject.getModel().type === 'notebookV2') {
|
||||||
|
// do not allow in context of a notebook
|
||||||
|
return false;
|
||||||
|
} else if (domainObject.getModel().type.includes('imagery')) {
|
||||||
|
// do not allow in the context of an object with imagery
|
||||||
|
// (because of cross domain issue with snapshot)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
return NewEntryContextual;
|
||||||
|
}
|
||||||
|
);
|
130
src/plugins/NotebookV2/src/actions/snapshotAction.js
Normal file
130
src/plugins/NotebookV2/src/actions/snapshotAction.js
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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(
|
||||||
|
['zepto'],
|
||||||
|
function ($) {
|
||||||
|
|
||||||
|
function SnapshotAction (exportImageService, dialogService, context) {
|
||||||
|
this.exportImageService = exportImageService;
|
||||||
|
this.dialogService = dialogService;
|
||||||
|
this.domainObject = context.domainObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
SnapshotAction.prototype.perform = function () {
|
||||||
|
var elementToSnapshot =
|
||||||
|
$(document.body).find(".overlay .object-holder")[0] ||
|
||||||
|
$(document.body).find("[key='representation.selected.key']")[0];
|
||||||
|
|
||||||
|
$(elementToSnapshot).addClass("s-status-taking-snapshot");
|
||||||
|
|
||||||
|
this.exportImageService.exportPNGtoSRC(elementToSnapshot).then(function (blob) {
|
||||||
|
$(elementToSnapshot).removeClass("s-status-taking-snapshot");
|
||||||
|
|
||||||
|
if (blob) {
|
||||||
|
var reader = new window.FileReader();
|
||||||
|
reader.readAsDataURL(blob);
|
||||||
|
reader.onloadend = function () {
|
||||||
|
this.saveSnapshot(reader.result, blob.type, blob.size);
|
||||||
|
}.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
SnapshotAction.prototype.saveSnapshot = function (imageURL, imageType, imageSize) {
|
||||||
|
var taskForm = this.generateTaskForm(),
|
||||||
|
domainObject = this.domainObject,
|
||||||
|
domainObjectId = domainObject.getId(),
|
||||||
|
cssClass = domainObject.getCapability('type').typeDef.cssClass,
|
||||||
|
name = domainObject.model.name;
|
||||||
|
|
||||||
|
this.dialogService.getDialogResponse(
|
||||||
|
'overlay-dialog',
|
||||||
|
taskForm,
|
||||||
|
function() {
|
||||||
|
return taskForm.value;
|
||||||
|
}
|
||||||
|
).then(function (options) {
|
||||||
|
var snapshotObject = {
|
||||||
|
src: imageURL,
|
||||||
|
type: imageType,
|
||||||
|
size: imageSize
|
||||||
|
};
|
||||||
|
|
||||||
|
options.notebook.useCapability('mutation', function (model) {
|
||||||
|
var date = Date.now();
|
||||||
|
|
||||||
|
model.entries.push({
|
||||||
|
id: 'entry-' + date,
|
||||||
|
createdOn: date,
|
||||||
|
text: options.entry,
|
||||||
|
embeds: [{
|
||||||
|
name: name,
|
||||||
|
cssClass: cssClass,
|
||||||
|
type: domainObjectId,
|
||||||
|
id: 'embed-' + date,
|
||||||
|
createdOn: date,
|
||||||
|
snapshot: snapshotObject
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
SnapshotAction.prototype.generateTaskForm = function () {
|
||||||
|
var taskForm = {
|
||||||
|
name: "Create a Notebook Entry",
|
||||||
|
hint: "Please select a Notebook",
|
||||||
|
sections: [{
|
||||||
|
rows: [{
|
||||||
|
name: 'Entry',
|
||||||
|
key: 'entry',
|
||||||
|
control: 'textarea',
|
||||||
|
required: false,
|
||||||
|
"cssClass": "l-textarea-sm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Save in Notebook',
|
||||||
|
key: 'notebook',
|
||||||
|
control: 'locator',
|
||||||
|
validate: validateLocation
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
var overlayModel = {
|
||||||
|
title: taskForm.name,
|
||||||
|
message: 'AHAHAH',
|
||||||
|
structure: taskForm,
|
||||||
|
value: {'entry': ""}
|
||||||
|
};
|
||||||
|
|
||||||
|
function validateLocation (newParentObj) {
|
||||||
|
return newParentObj.model.type === 'notebookV2';
|
||||||
|
}
|
||||||
|
|
||||||
|
return overlayModel;
|
||||||
|
};
|
||||||
|
|
||||||
|
return SnapshotAction;
|
||||||
|
}
|
||||||
|
);
|
198
src/plugins/NotebookV2/src/controllers/EmbedController.js
Normal file
198
src/plugins/NotebookV2/src/controllers/EmbedController.js
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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([
|
||||||
|
'moment',
|
||||||
|
'zepto',
|
||||||
|
'../utils/SnapshotOverlay',
|
||||||
|
],
|
||||||
|
function (
|
||||||
|
Moment,
|
||||||
|
$,
|
||||||
|
SnapshotOverlay
|
||||||
|
) {
|
||||||
|
function EmbedController (openmct, domainObject) {
|
||||||
|
this.openmct = openmct;
|
||||||
|
this.domainObject = domainObject;
|
||||||
|
this.objectService = openmct.$injector.get('objectService');
|
||||||
|
this.navigationService = openmct.$injector.get('navigationService');
|
||||||
|
this.popupService = openmct.$injector.get('popupService');
|
||||||
|
this.agentService = openmct.$injector.get('agentService');
|
||||||
|
this.dialogService = openmct.$injector.get('dialogService');
|
||||||
|
|
||||||
|
|
||||||
|
this.navigate = this.navigate.bind(this);
|
||||||
|
this.exposedData = this.exposedData.bind(this);
|
||||||
|
this.exposedMethods = this.exposedMethods.bind(this);
|
||||||
|
this.toggleActionMenu = this.toggleActionMenu.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
EmbedController.prototype.navigate = function (embedType) {
|
||||||
|
this.objectService.getObjects([embedType]).then(function (objects) {
|
||||||
|
this.navigationService.setNavigation(objects[embedType]);
|
||||||
|
}.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.openSnapshot = function () {
|
||||||
|
if (!this.snapshotOverlay) {
|
||||||
|
this.snapShotOverlay = new SnapshotOverlay(this.embed, this.formatTime);
|
||||||
|
} else {
|
||||||
|
this.snapShotOverlay = undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.formatTime = function (unixTime, timeFormat) {
|
||||||
|
return Moment(unixTime).format(timeFormat);
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.findInArray = function (array, id) {
|
||||||
|
var foundId = -1;
|
||||||
|
|
||||||
|
array.forEach(function (element, index) {
|
||||||
|
if (element.id === id) {
|
||||||
|
foundId = index;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return foundId;
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.actionToMenuDecorator = function (action) {
|
||||||
|
return {
|
||||||
|
name: action.getMetadata().name,
|
||||||
|
cssClass: action.getMetadata().cssClass,
|
||||||
|
perform: action.perform
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.populateActionMenu = function (objectService, actionService) {
|
||||||
|
return function () {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
objectService.getObjects([self.embed.type]).then(function (resp) {
|
||||||
|
var domainObject = resp[self.embed.type],
|
||||||
|
previewAction = actionService.getActions({key: 'mct-preview-action', domainObject: domainObject})[0];
|
||||||
|
|
||||||
|
self.actions.push(self.actionToMenuDecorator(previewAction));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.removeEmbedAction = function () {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: 'Remove Embed',
|
||||||
|
cssClass: 'icon-trash',
|
||||||
|
perform: function (embed, entry) {
|
||||||
|
var entryPosition = self.findInArray(self.domainObject.entries, entry.id),
|
||||||
|
embedPosition = self.findInArray(entry.embeds, embed.id);
|
||||||
|
|
||||||
|
var warningDialog = self.dialogService.showBlockingMessage({
|
||||||
|
severity: "error",
|
||||||
|
title: "This action will permanently delete this embed. Do you wish to continue?",
|
||||||
|
options: [{
|
||||||
|
label: "OK",
|
||||||
|
callback: function () {
|
||||||
|
entry.embeds.splice(embedPosition, 1);
|
||||||
|
var dirString = 'entries[' + entryPosition + '].embeds';
|
||||||
|
|
||||||
|
self.openmct.objects.mutate(self.domainObject, dirString, entry.embeds);
|
||||||
|
|
||||||
|
warningDialog.dismiss();
|
||||||
|
}
|
||||||
|
},{
|
||||||
|
label: "Cancel",
|
||||||
|
callback: function () {
|
||||||
|
warningDialog.dismiss();
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.toggleActionMenu = function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var body = $(document.body),
|
||||||
|
container = $(event.target.parentElement.parentElement),
|
||||||
|
initiatingEvent = this.agentService.isMobile() ?
|
||||||
|
'touchstart' : 'mousedown',
|
||||||
|
menu = container.find('.menu-element'),
|
||||||
|
dismissExistingMenu;
|
||||||
|
|
||||||
|
// Remove the context menu
|
||||||
|
function dismiss() {
|
||||||
|
container.find('.hide-menu').append(menu);
|
||||||
|
body.off(initiatingEvent, dismiss);
|
||||||
|
menu.off(initiatingEvent, menuClickHandler);
|
||||||
|
dismissExistingMenu = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function menuClickHandler(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
window.setTimeout(dismiss, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dismiss any menu which was already showing
|
||||||
|
if (dismissExistingMenu) {
|
||||||
|
dismissExistingMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...and record the presence of this menu.
|
||||||
|
dismissExistingMenu = dismiss;
|
||||||
|
|
||||||
|
this.popupService.display(menu, [event.pageX,event.pageY], {
|
||||||
|
marginX: 0,
|
||||||
|
marginY: -50
|
||||||
|
});
|
||||||
|
|
||||||
|
// Stop propagation so that clicks or touches on the menu do not close the menu
|
||||||
|
menu.on(initiatingEvent, menuClickHandler);
|
||||||
|
|
||||||
|
body.on(initiatingEvent, dismiss);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.exposedData = function () {
|
||||||
|
return {
|
||||||
|
actions: [this.removeEmbedAction()],
|
||||||
|
showActionMenu: false
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
EmbedController.prototype.exposedMethods = function () {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
return {
|
||||||
|
navigate: self.navigate,
|
||||||
|
openSnapshot: self.openSnapshot,
|
||||||
|
formatTime: self.formatTime,
|
||||||
|
toggleActionMenu: self.toggleActionMenu,
|
||||||
|
actionToMenuDecorator: self.actionToMenuDecorator
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
return EmbedController;
|
||||||
|
});
|
150
src/plugins/NotebookV2/src/controllers/EntryController.js
Normal file
150
src/plugins/NotebookV2/src/controllers/EntryController.js
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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([
|
||||||
|
'moment'
|
||||||
|
],
|
||||||
|
function (
|
||||||
|
Moment
|
||||||
|
) {
|
||||||
|
|
||||||
|
function EntryController (openmct, domainObject) {
|
||||||
|
this.openmct = openmct;
|
||||||
|
this.domainObject = domainObject;
|
||||||
|
this.dndService = this.openmct.$injector.get('dndService');
|
||||||
|
this.dialogService = this.openmct.$injector.get('dialogService');
|
||||||
|
|
||||||
|
this.currentEntryValue = '';
|
||||||
|
|
||||||
|
this.exposedMethods = this.exposedMethods.bind(this);
|
||||||
|
this.exposedData = this.exposedData.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
EntryController.prototype.entryPosById = function (entryId) {
|
||||||
|
var foundId = -1;
|
||||||
|
|
||||||
|
this.domainObject.entries.forEach(function (element, index) {
|
||||||
|
if (element.id === entryId) {
|
||||||
|
foundId = index;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return foundId;
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.textFocus = function ($event) {
|
||||||
|
if ($event.target) {
|
||||||
|
this.currentEntryValue = $event.target.innerText;
|
||||||
|
} else {
|
||||||
|
$event.target.innerText = '';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.textBlur = function ($event, entryId) {
|
||||||
|
if ($event.target) {
|
||||||
|
var entryPos = this.entryPosById(entryId);
|
||||||
|
|
||||||
|
if (this.currentEntryValue !== $event.target.innerText) {
|
||||||
|
this.openmct.objects.mutate(this.domainObject, 'entries[' + entryPos + '].text', $event.target.innerText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.formatTime = function (unixTime, timeFormat) {
|
||||||
|
return Moment(unixTime).format(timeFormat);
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.deleteEntry = function () {
|
||||||
|
var entryPos = this.entryPosById(this.entry.id),
|
||||||
|
domainObject = this.domainObject,
|
||||||
|
openmct = this.openmct;
|
||||||
|
|
||||||
|
if (entryPos !== -1) {
|
||||||
|
|
||||||
|
var errorDialog = this.dialogService.showBlockingMessage({
|
||||||
|
severity: "error",
|
||||||
|
title: "This action will permanently delete this Notebook entry. Do you wish to continue?",
|
||||||
|
options: [{
|
||||||
|
label: "OK",
|
||||||
|
callback: function () {
|
||||||
|
domainObject.entries.splice(entryPos, 1);
|
||||||
|
openmct.objects.mutate(domainObject, 'entries', domainObject.entries);
|
||||||
|
|
||||||
|
errorDialog.dismiss();
|
||||||
|
}
|
||||||
|
},{
|
||||||
|
label: "Cancel",
|
||||||
|
callback: function () {
|
||||||
|
errorDialog.dismiss();
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.dropOnEntry = function (entryId) {
|
||||||
|
var selectedObject = this.dndService.getData('mct-domain-object'),
|
||||||
|
selectedObjectId = selectedObject.getId(),
|
||||||
|
selectedModel = selectedObject.getModel(),
|
||||||
|
cssClass = selectedObject.getCapability('type').typeDef.cssClass,
|
||||||
|
entryPos = this.entryPosById(entryId),
|
||||||
|
currentEntryEmbeds = this.domainObject.entries[entryPos].embeds,
|
||||||
|
newEmbed = {
|
||||||
|
type: selectedObjectId,
|
||||||
|
id: '' + Date.now(),
|
||||||
|
cssClass: cssClass,
|
||||||
|
name: selectedModel.name,
|
||||||
|
snapshot: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
currentEntryEmbeds.push(newEmbed);
|
||||||
|
this.openmct.objects.mutate(this.domainObject, 'entries[' + entryPos + '].embeds', currentEntryEmbeds);
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.dragoverOnEntry = function () {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.exposedData = function () {
|
||||||
|
return {
|
||||||
|
openmct: this.openmct,
|
||||||
|
domainObject: this.domainObject,
|
||||||
|
dndService: this.dndService,
|
||||||
|
dialogService: this.dialogService,
|
||||||
|
currentEntryValue: this.currentEntryValue
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryController.prototype.exposedMethods = function () {
|
||||||
|
return {
|
||||||
|
entryPosById: this.entryPosById,
|
||||||
|
textFocus: this.textFocus,
|
||||||
|
textBlur: this.textBlur,
|
||||||
|
formatTime: this.formatTime,
|
||||||
|
deleteEntry: this.deleteEntry,
|
||||||
|
dropOnEntry: this.dropOnEntry,
|
||||||
|
dragoverOnEntry: this.dragoverOnEntry
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return EntryController;
|
||||||
|
});
|
65
src/plugins/NotebookV2/src/controllers/NewEntryController.js
Normal file
65
src/plugins/NotebookV2/src/controllers/NewEntryController.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining NewEntryController. */
|
||||||
|
define(
|
||||||
|
[],
|
||||||
|
function () {
|
||||||
|
|
||||||
|
function NewEntryController($scope,$rootScope) {
|
||||||
|
|
||||||
|
$scope.snapshot = undefined;
|
||||||
|
$scope.snapToggle = true;
|
||||||
|
$scope.entryText = '';
|
||||||
|
var annotateAction = $rootScope.selObj.getCapability('action').getActions({key: 'annotate-snapshot'})[0];
|
||||||
|
|
||||||
|
$scope.$parent.$parent.ngModel[$scope.$parent.$parent.field] = $rootScope.selObj;
|
||||||
|
$scope.objectName = $rootScope.selObj.getModel().name;
|
||||||
|
$scope.cssClass = $rootScope.selObj.getCapability('type').typeDef.cssClass;
|
||||||
|
|
||||||
|
$scope.annotateSnapshot = function ($event) {
|
||||||
|
if ($rootScope.currentDialog.value) {
|
||||||
|
$rootScope.newEntryText = $scope.$parent.$parent.ngModel.entry;
|
||||||
|
$rootScope.currentDialog.cancel();
|
||||||
|
annotateAction.perform($event, $rootScope.snapshot.src);
|
||||||
|
$rootScope.currentDialog = undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function updateSnapshot(img) {
|
||||||
|
$scope.snapshot = img;
|
||||||
|
}
|
||||||
|
// Update set of actions whenever the action capability
|
||||||
|
// changes or becomes available.
|
||||||
|
$rootScope.$watch("snapshot", updateSnapshot);
|
||||||
|
|
||||||
|
$rootScope.$watch("selValue", toggleEmbed);
|
||||||
|
|
||||||
|
function toggleEmbed(value) {
|
||||||
|
$scope.snapToggle = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntryController;
|
||||||
|
}
|
||||||
|
);
|
174
src/plugins/NotebookV2/src/controllers/NotebookController.js
Normal file
174
src/plugins/NotebookV2/src/controllers/NotebookController.js
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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([
|
||||||
|
'vue',
|
||||||
|
'./EntryController',
|
||||||
|
'./EmbedController',
|
||||||
|
'text!../../res/templates/notebook.html',
|
||||||
|
'text!../../res/templates/entry.html',
|
||||||
|
'text!../../res/templates/embed.html'
|
||||||
|
],
|
||||||
|
function (
|
||||||
|
Vue,
|
||||||
|
EntryController,
|
||||||
|
EmbedController,
|
||||||
|
NotebookTemplate,
|
||||||
|
EntryTemplate,
|
||||||
|
EmbedTemplate
|
||||||
|
) {
|
||||||
|
|
||||||
|
function NotebookController(openmct, domainObject) {
|
||||||
|
this.openmct = openmct;
|
||||||
|
this.domainObject = domainObject;
|
||||||
|
this.entrySearch = '';
|
||||||
|
this.objectService = openmct.$injector.get('objectService');
|
||||||
|
this.actionService = openmct.$injector.get('actionService');
|
||||||
|
|
||||||
|
this.show = this.show.bind(this);
|
||||||
|
this.destroy = this.destroy.bind(this);
|
||||||
|
this.newEntry = this.newEntry.bind(this);
|
||||||
|
this.entryPosById = this.entryPosById.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
NotebookController.prototype.initializeVue = function (container){
|
||||||
|
var self = this,
|
||||||
|
entryController = new EntryController(this.openmct, this.domainObject),
|
||||||
|
embedController = new EmbedController(this.openmct, this.domainObject);
|
||||||
|
|
||||||
|
this.container = container;
|
||||||
|
|
||||||
|
var notebookEmbed = {
|
||||||
|
props:['embed', 'entry'],
|
||||||
|
template: EmbedTemplate,
|
||||||
|
data: embedController.exposedData,
|
||||||
|
methods: embedController.exposedMethods(),
|
||||||
|
beforeMount: embedController.populateActionMenu(self.objectService, self.actionService)
|
||||||
|
};
|
||||||
|
|
||||||
|
var entryComponent = {
|
||||||
|
props:['entry'],
|
||||||
|
template: EntryTemplate,
|
||||||
|
components: {
|
||||||
|
'notebook-embed': notebookEmbed
|
||||||
|
},
|
||||||
|
data: entryController.exposedData,
|
||||||
|
methods: entryController.exposedMethods(),
|
||||||
|
mounted: self.focusOnEntry
|
||||||
|
};
|
||||||
|
|
||||||
|
var notebookVue = Vue.extend({
|
||||||
|
template: NotebookTemplate,
|
||||||
|
components: {
|
||||||
|
'notebook-entry': entryComponent
|
||||||
|
},
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
entrySearch: self.entrySearch,
|
||||||
|
showTime: '0',
|
||||||
|
sortEntries: '-createdOn',
|
||||||
|
entries: self.domainObject.entries,
|
||||||
|
currentEntryValue: ''
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
search: function (event) {
|
||||||
|
if (event.target.value) {
|
||||||
|
this.entrySearch = event.target.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
newEntry: self.newEntry,
|
||||||
|
filterBySearch: self.filterBySearch
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.NotebookVue = new notebookVue();
|
||||||
|
container.appendChild(this.NotebookVue.$mount().$el);
|
||||||
|
};
|
||||||
|
|
||||||
|
NotebookController.prototype.newEntry = function (event) {
|
||||||
|
|
||||||
|
var entries = this.domainObject.entries,
|
||||||
|
lastEntryIndex = entries.length - 1,
|
||||||
|
lastEntry = entries[lastEntryIndex],
|
||||||
|
date = Date.now();
|
||||||
|
|
||||||
|
if (lastEntry === undefined || lastEntry.text || lastEntry.embeds.length) {
|
||||||
|
var createdEntry = {'id': 'entry-' + date, 'createdOn': date, 'embeds':[]};
|
||||||
|
|
||||||
|
entries.push(createdEntry);
|
||||||
|
this.openmct.objects.mutate(this.domainObject, 'entries', entries);
|
||||||
|
} else {
|
||||||
|
lastEntry.createdOn = date;
|
||||||
|
|
||||||
|
this.openmct.objects.mutate(this.domainObject, 'entries[entries.length-1]', lastEntry);
|
||||||
|
this.focusOnEntry.bind(this.NotebookVue.$children[lastEntryIndex])();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.entrySearch = '';
|
||||||
|
};
|
||||||
|
|
||||||
|
NotebookController.prototype.entryPosById = function (entryId) {
|
||||||
|
var foundId = -1;
|
||||||
|
|
||||||
|
this.domainObject.entries.forEach(function (element, index) {
|
||||||
|
if (element.id === entryId) {
|
||||||
|
foundId = index;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return foundId;
|
||||||
|
};
|
||||||
|
|
||||||
|
NotebookController.prototype.focusOnEntry = function () {
|
||||||
|
if (!this.entry.text) {
|
||||||
|
this.$refs.contenteditable.focus();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
NotebookController.prototype.filterBySearch = function (entryArray, filterString) {
|
||||||
|
if (filterString) {
|
||||||
|
var lowerCaseFilterString = filterString.toLowerCase();
|
||||||
|
|
||||||
|
return entryArray.filter(function (entry) {
|
||||||
|
if (entry.text) {
|
||||||
|
return entry.text.toLowerCase().includes(lowerCaseFilterString);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return entryArray;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
NotebookController.prototype.show = function (container) {
|
||||||
|
this.initializeVue(container);
|
||||||
|
};
|
||||||
|
|
||||||
|
NotebookController.prototype.destroy = function (container) {
|
||||||
|
this.NotebookVue.$destroy(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
return NotebookController;
|
||||||
|
});
|
@ -0,0 +1,44 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2017, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module defining SelectSnapshotController. */
|
||||||
|
define(
|
||||||
|
[],
|
||||||
|
function () {
|
||||||
|
|
||||||
|
function SelectSnapshotController($scope,$rootScope) {
|
||||||
|
|
||||||
|
$scope.selectModel = true;
|
||||||
|
|
||||||
|
function selectprint(value) {
|
||||||
|
$rootScope.selValue = value;
|
||||||
|
$scope.$parent.$parent.ngModel[$scope.$parent.$parent.field] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.$watch("selectModel", selectprint);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return SelectSnapshotController;
|
||||||
|
}
|
||||||
|
);
|
126
src/plugins/NotebookV2/src/directives/EntryDnd.js
Normal file
126
src/plugins/NotebookV2/src/directives/EntryDnd.js
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2016, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
define(['zepto'], function ($) {
|
||||||
|
|
||||||
|
function EntryDnd($rootScope,$compile,dndService,typeService,notificationService) {
|
||||||
|
|
||||||
|
function link($scope, $element) {
|
||||||
|
|
||||||
|
function drop(e) {
|
||||||
|
var selectedObject = dndService.getData('mct-domain-object');
|
||||||
|
var selectedModel = selectedObject.getModel();
|
||||||
|
var cssClass = selectedObject.getCapability('type').typeDef.cssClass;
|
||||||
|
var entryId = -1;
|
||||||
|
var embedId = -1;
|
||||||
|
$scope.clearSearch();
|
||||||
|
if ($element[0].id === 'newEntry') {
|
||||||
|
entryId = $scope.domainObject.model.entries.length;
|
||||||
|
embedId = 0;
|
||||||
|
var lastEntry = $scope.domainObject.model.entries[entryId - 1];
|
||||||
|
if (lastEntry === undefined || lastEntry.text || lastEntry.embeds) {
|
||||||
|
$scope.domainObject.useCapability('mutation', function (model) {
|
||||||
|
model.entries.push({'createdOn': +Date.now(),
|
||||||
|
'id': +Date.now(),
|
||||||
|
'embeds': [{'type': selectedObject.getId(),
|
||||||
|
'id': '' + Date.now(),
|
||||||
|
'cssClass': cssClass,
|
||||||
|
'name': selectedModel.name,
|
||||||
|
'snapshot': ''
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}else {
|
||||||
|
$scope.domainObject.useCapability('mutation', function (model) {
|
||||||
|
model.entries[entryId - 1] =
|
||||||
|
{'createdOn': +Date.now(),
|
||||||
|
'embeds': [{'type': selectedObject.getId(),
|
||||||
|
'id': '' + Date.now(),
|
||||||
|
'cssClass': cssClass,
|
||||||
|
'name': selectedModel.name,
|
||||||
|
'snapshot': ''
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.scrollToTop();
|
||||||
|
notificationService.info({
|
||||||
|
title: "Notebook Entry created"
|
||||||
|
});
|
||||||
|
|
||||||
|
}else {
|
||||||
|
entryId = $scope.findEntryPositionById(Number($element[0].id.replace('entry_', '')));
|
||||||
|
|
||||||
|
if (!$scope.domainObject.model.entries[entryId].embeds) {
|
||||||
|
$scope.domainObject.model.entries[entryId].embeds = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.domainObject.useCapability('mutation', function (model) {
|
||||||
|
model.entries[entryId].embeds.push({'type': selectedObject.getId(),
|
||||||
|
'id': '' + Date.now(),
|
||||||
|
'cssClass': cssClass,
|
||||||
|
'name': selectedModel.name,
|
||||||
|
'snapshot': ''
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
embedId = $scope.domainObject.model.entries[entryId].embeds.length - 1;
|
||||||
|
|
||||||
|
if (selectedObject) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(e.currentTarget).hasClass('drag-active')) {
|
||||||
|
$(e.currentTarget).removeClass('drag-active');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function dragover(e) {
|
||||||
|
if (!$(e.currentTarget).hasClass('drag-active')) {
|
||||||
|
$(e.currentTarget).addClass('drag-active');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen for the drop itself
|
||||||
|
$element.on('dragover', dragover);
|
||||||
|
$element.on('drop', drop);
|
||||||
|
|
||||||
|
|
||||||
|
$scope.$on('$destroy', function () {
|
||||||
|
$element.off('dragover', dragover);
|
||||||
|
$element.off('drop', drop);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
restrict: 'A',
|
||||||
|
link: link
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return EntryDnd;
|
||||||
|
|
||||||
|
});
|
86
src/plugins/NotebookV2/src/directives/MCTSnapshot.js
Normal file
86
src/plugins/NotebookV2/src/directives/MCTSnapshot.js
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2016, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
define(['zepto'], function ($) {
|
||||||
|
function MCTSnapshot($rootScope, $document, exportImageService, dialogService, notificationService) {
|
||||||
|
var document = $document[0];
|
||||||
|
|
||||||
|
function link($scope, $element, $attrs) {
|
||||||
|
var objectElement = $(document.body).find(".overlay .object-holder")[0] || $(document.body).find("[key='representation.selected.key']")[0],
|
||||||
|
takeSnapshot,
|
||||||
|
makeImg,
|
||||||
|
saveImg;
|
||||||
|
|
||||||
|
$(objectElement).addClass("s-status-taking-snapshot");
|
||||||
|
|
||||||
|
saveImg = function (url, entryId, embedId) {
|
||||||
|
$scope.$parent.$parent.$parent.saveSnap(url, embedId, entryId);
|
||||||
|
};
|
||||||
|
|
||||||
|
makeImg = function (el) {
|
||||||
|
var scope = $scope;
|
||||||
|
|
||||||
|
exportImageService.exportPNGtoSRC(el).then(function (img) {
|
||||||
|
|
||||||
|
$(objectElement).removeClass("s-status-taking-snapshot");
|
||||||
|
|
||||||
|
if (img) {
|
||||||
|
if ($element[0].dataset.entry && $element[0].dataset.embed) {
|
||||||
|
saveImg(img, +$element[0].dataset.entry, +$element[0].dataset.embed);
|
||||||
|
} else {
|
||||||
|
var reader = new window.FileReader();
|
||||||
|
reader.readAsDataURL(img);
|
||||||
|
reader.onloadend = function () {
|
||||||
|
$($element[0]).attr("data-snapshot", reader.result);
|
||||||
|
$rootScope.snapshot = {
|
||||||
|
'src': reader.result,
|
||||||
|
'type': img.type,
|
||||||
|
'size': img.size,
|
||||||
|
'modified': Date.now()
|
||||||
|
};
|
||||||
|
scope.$destroy();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
takeSnapshot = function () {
|
||||||
|
makeImg(objectElement);
|
||||||
|
};
|
||||||
|
|
||||||
|
takeSnapshot();
|
||||||
|
|
||||||
|
$scope.$on('$destroy', function () {
|
||||||
|
$element.remove();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
restrict: 'A',
|
||||||
|
link: link
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return MCTSnapshot;
|
||||||
|
|
||||||
|
});
|
67
src/plugins/NotebookV2/src/utils/SnapshotOverlay.js
Normal file
67
src/plugins/NotebookV2/src/utils/SnapshotOverlay.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* 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([
|
||||||
|
'vue',
|
||||||
|
'text!../../res/templates/viewSnapshot.html'
|
||||||
|
], function (
|
||||||
|
Vue,
|
||||||
|
snapshotOverlayTemplate
|
||||||
|
) {
|
||||||
|
function SnapshotOverlay (embedObject, formatTime) {
|
||||||
|
this.embedObject = embedObject;
|
||||||
|
|
||||||
|
this.snapshotOverlayVue = new Vue({
|
||||||
|
template: snapshotOverlayTemplate,
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
embed: embedObject
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
close: this.close.bind(this),
|
||||||
|
formatTime: formatTime
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
SnapshotOverlay.prototype.open = function () {
|
||||||
|
|
||||||
|
this.overlay = document.createElement('div');
|
||||||
|
this.overlay.id = 'snapshot';
|
||||||
|
|
||||||
|
document.body.appendChild(this.overlay);
|
||||||
|
|
||||||
|
this.overlay.appendChild(this.snapshotOverlayVue.$mount().$el);
|
||||||
|
};
|
||||||
|
|
||||||
|
SnapshotOverlay.prototype.close = function (event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
this.snapshotOverlayVue.$destroy();
|
||||||
|
this.overlay.parentNode.removeChild(this.overlay);
|
||||||
|
};
|
||||||
|
|
||||||
|
return SnapshotOverlay;
|
||||||
|
});
|
@ -33,7 +33,8 @@ define([
|
|||||||
'./URLIndicatorPlugin/URLIndicatorPlugin',
|
'./URLIndicatorPlugin/URLIndicatorPlugin',
|
||||||
'./telemetryMean/plugin',
|
'./telemetryMean/plugin',
|
||||||
'./plot/plugin',
|
'./plot/plugin',
|
||||||
'./staticRootPlugin/plugin'
|
'./staticRootPlugin/plugin',
|
||||||
|
'./NotebookV2/plugin'
|
||||||
], function (
|
], function (
|
||||||
_,
|
_,
|
||||||
UTCTimeSystem,
|
UTCTimeSystem,
|
||||||
@ -47,7 +48,8 @@ define([
|
|||||||
URLIndicatorPlugin,
|
URLIndicatorPlugin,
|
||||||
TelemetryMean,
|
TelemetryMean,
|
||||||
PlotPlugin,
|
PlotPlugin,
|
||||||
StaticRootPlugin
|
StaticRootPlugin,
|
||||||
|
NotebookV2
|
||||||
) {
|
) {
|
||||||
var bundleMap = {
|
var bundleMap = {
|
||||||
CouchDB: 'platform/persistence/couch',
|
CouchDB: 'platform/persistence/couch',
|
||||||
@ -140,6 +142,7 @@ define([
|
|||||||
plugins.SummaryWidget = SummaryWidget;
|
plugins.SummaryWidget = SummaryWidget;
|
||||||
plugins.TelemetryMean = TelemetryMean;
|
plugins.TelemetryMean = TelemetryMean;
|
||||||
plugins.URLIndicator = URLIndicatorPlugin;
|
plugins.URLIndicator = URLIndicatorPlugin;
|
||||||
|
plugins.NotebookV2 = NotebookV2;
|
||||||
|
|
||||||
return plugins;
|
return plugins;
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user