Use editors for revision preview
This commit is contained in:
@@ -158,17 +158,7 @@ angular.module('app')
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.editorForNote = function(note) {
|
this.editorForNote = function(note) {
|
||||||
let editors = componentManager.componentsForArea("editor-editor");
|
return componentManager.editorForNote(note);
|
||||||
for(var editor of editors) {
|
|
||||||
if(editor.isExplicitlyEnabledForItem(note)) {
|
|
||||||
return editor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// No editor found for note. Use default editor, if note does not prefer system editor
|
|
||||||
if(!note.getAppDataItem("prefersPlainEditor")) {
|
|
||||||
return editors.filter((e) => {return e.isDefaultEditor()})[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.closeAllMenus = function() {
|
this.closeAllMenus = function() {
|
||||||
|
|||||||
@@ -10,15 +10,51 @@ class RevisionPreviewModal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
link($scope, el, attrs) {
|
link($scope, el, attrs) {
|
||||||
|
$scope.el = el;
|
||||||
$scope.dismiss = function() {
|
|
||||||
el.remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
controller($scope, modelManager, syncManager) {
|
controller($scope, modelManager, syncManager, componentManager) {
|
||||||
'ngInject';
|
'ngInject';
|
||||||
|
|
||||||
|
$scope.dismiss = function() {
|
||||||
|
$scope.el.remove();
|
||||||
|
$scope.$destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.$on("$destroy", function() {
|
||||||
|
componentManager.deregisterHandler($scope.identifier);
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.note = new SFItem({content: $scope.content, content_type: "Note"});
|
||||||
|
// Set UUID to editoForNote can find proper editor,
|
||||||
|
// but then generate new uuid for note as not to save changes to original, if editor makes changes.
|
||||||
|
$scope.note.uuid = $scope.uuid;
|
||||||
|
let editor = componentManager.editorForNote($scope.note);
|
||||||
|
$scope.note.uuid = SFJS.crypto.generateUUIDSync();
|
||||||
|
|
||||||
|
if(editor) {
|
||||||
|
// Create temporary copy, as a lot of componentManager is uuid based,
|
||||||
|
// so might interfere with active editor. Be sure to copy only the content, as the
|
||||||
|
// top level editor object has non-copyable properties like .window, which cannot be transfered
|
||||||
|
$scope.editor = new SNComponent({content: editor.content});
|
||||||
|
$scope.editor.readonly = true;
|
||||||
|
$scope.identifier = $scope.editor.uuid;
|
||||||
|
|
||||||
|
componentManager.registerHandler({identifier: $scope.identifier, areas: ["editor-editor"],
|
||||||
|
contextRequestHandler: (component) => {
|
||||||
|
if(component == $scope.editor) {
|
||||||
|
return $scope.note;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
componentForSessionKeyHandler: (key) => {
|
||||||
|
if(key == $scope.editor.sessionKey) {
|
||||||
|
return $scope.editor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$scope.restore = function(asCopy) {
|
$scope.restore = function(asCopy) {
|
||||||
if(!asCopy && !confirm("Are you sure you want to replace the current note's contents with what you see in this preview?")) {
|
if(!asCopy && !confirm("Are you sure you want to replace the current note's contents with what you see in this preview?")) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -294,7 +294,15 @@ class ComponentManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentForSessionKey(key) {
|
componentForSessionKey(key) {
|
||||||
return _.find(this.components, {sessionKey: key});
|
let component = _.find(this.components, {sessionKey: key});
|
||||||
|
if(!component) {
|
||||||
|
for(let handler of this.handlers) {
|
||||||
|
if(handler.componentForSessionKeyHandler) {
|
||||||
|
component = handler.componentForSessionKeyHandler(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return component;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMessage(component, message) {
|
handleMessage(component, message) {
|
||||||
@@ -350,7 +358,7 @@ class ComponentManager {
|
|||||||
|
|
||||||
// Notify observers
|
// Notify observers
|
||||||
for(let handler of this.handlers) {
|
for(let handler of this.handlers) {
|
||||||
if(handler.areas.includes(component.area) || handler.areas.includes("*")) {
|
if(handler.actionHandler && (handler.areas.includes(component.area) || handler.areas.includes("*"))) {
|
||||||
this.timeout(function(){
|
this.timeout(function(){
|
||||||
handler.actionHandler(component, message.action, message.data);
|
handler.actionHandler(component, message.action, message.data);
|
||||||
})
|
})
|
||||||
@@ -465,6 +473,13 @@ class ComponentManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleSaveItemsMessage(component, message) {
|
handleSaveItemsMessage(component, message) {
|
||||||
|
if(component.readonly) {
|
||||||
|
// A component can be marked readonly if changes should not be saved.
|
||||||
|
// Particullary used for revision preview windows where the notes should not be savable.
|
||||||
|
alert(`The extension ${component.name} is trying to save, but it is in a locked state and cannot accept changes.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var responseItems = message.data.items;
|
var responseItems = message.data.items;
|
||||||
var requiredPermissions;
|
var requiredPermissions;
|
||||||
|
|
||||||
@@ -798,6 +813,10 @@ class ComponentManager {
|
|||||||
|
|
||||||
deregisterHandler(identifier) {
|
deregisterHandler(identifier) {
|
||||||
var handler = _.find(this.handlers, {identifier: identifier});
|
var handler = _.find(this.handlers, {identifier: identifier});
|
||||||
|
if(!handler) {
|
||||||
|
console.log("Attempting to deregister non-existing handler");
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.handlers.splice(this.handlers.indexOf(handler), 1);
|
this.handlers.splice(this.handlers.indexOf(handler), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1021,6 +1040,20 @@ class ComponentManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editorForNote(note) {
|
||||||
|
let editors = this.componentsForArea("editor-editor");
|
||||||
|
for(var editor of editors) {
|
||||||
|
if(editor.isExplicitlyEnabledForItem(note)) {
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No editor found for note. Use default editor, if note does not prefer system editor
|
||||||
|
if(!note.getAppDataItem("prefersPlainEditor")) {
|
||||||
|
return editors.filter((e) => {return e.isDefaultEditor()})[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
%a.sk-a.info.close-button{"ng-click" => "restore(false)"} Restore
|
%a.sk-a.info.close-button{"ng-click" => "restore(false)"} Restore
|
||||||
%a.sk-a.info.close-button{"ng-click" => "restore(true)"} Restore as copy
|
%a.sk-a.info.close-button{"ng-click" => "restore(true)"} Restore as copy
|
||||||
%a.sk-a.info.close-button{"ng-click" => "dismiss(); $event.stopPropagation()"} Close
|
%a.sk-a.info.close-button{"ng-click" => "dismiss(); $event.stopPropagation()"} Close
|
||||||
.sk-panel-content.selectable
|
.sk-panel-content.selectable{"ng-if" => "!editor"}
|
||||||
.sk-h2 {{content.title}}
|
.sk-h2 {{content.title}}
|
||||||
%p.normal.sk-p{"style" => "white-space: pre-wrap; font-size: 16px;"} {{content.text}}
|
%p.normal.sk-p{"style" => "white-space: pre-wrap; font-size: 16px;"} {{content.text}}
|
||||||
|
|
||||||
|
%component-view.component-view{"ng-if" => "editor", "component" => "editor"}
|
||||||
|
|||||||
Reference in New Issue
Block a user