all extension type

This commit is contained in:
Mo Bitar
2017-01-05 19:22:34 -06:00
parent 54ac4ffd15
commit 6306f2a316
16 changed files with 508 additions and 272 deletions

View File

@@ -207,7 +207,7 @@ angular.module('app.frontend')
var original = this.note.presentation_name; var original = this.note.presentation_name;
this.note.presentation_name = this.url.token; this.note.presentation_name = this.url.token;
this.note.dirty = true; this.note.setDirty(true);
apiController.sync(function(response){ apiController.sync(function(response){
if(!response) { if(!response) {

View File

@@ -48,7 +48,9 @@ angular.module('app.frontend')
} }
this.selectedAction = function(action, extension) { this.selectedAction = function(action, extension) {
action.running = true;
extensionManager.executeAction(action, extension, function(response){ extensionManager.executeAction(action, extension, function(response){
action.running = false;
apiController.sync(null); apiController.sync(null);
}) })
} }

View File

@@ -54,7 +54,7 @@ angular.module('app.frontend')
} }
$scope.tagsSave = function(tag, callback) { $scope.tagsSave = function(tag, callback) {
tag.dirty = true; tag.setDirty(true);
apiController.sync(callback); apiController.sync(callback);
} }
@@ -111,7 +111,7 @@ angular.module('app.frontend')
*/ */
$scope.saveNote = function(note, callback) { $scope.saveNote = function(note, callback) {
note.dirty = true; note.setDirty(true);
apiController.sync(function(){ apiController.sync(function(){
note.hasChanges = false; note.hasChanges = false;

View File

@@ -25,7 +25,7 @@ angular.module('app.frontend')
} }
} }
}) })
.controller('NotesCtrl', function (apiController, $timeout, $rootScope) { .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {
$rootScope.$on("editorFocused", function(){ $rootScope.$on("editorFocused", function(){
this.showMenu = false; this.showMenu = false;
@@ -110,7 +110,7 @@ angular.module('app.frontend')
this.createNewNote = function() { this.createNewNote = function() {
var title = "New Note" + (this.tag.notes ? (" " + (this.tag.notes.length + 1)) : ""); var title = "New Note" + (this.tag.notes ? (" " + (this.tag.notes.length + 1)) : "");
this.newNote = new Note({dummy: true, text: ""}); this.newNote = modelManager.createItem({content_type: "Note", dummy: true, text: ""});
this.newNote.title = title; this.newNote.title = title;
this.selectNote(this.newNote); this.selectNote(this.newNote);
this.addNew()(this.newNote); this.addNew()(this.newNote);

View File

@@ -33,7 +33,7 @@ angular.module('app.frontend')
} }
} }
}) })
.controller('TagsCtrl', function () { .controller('TagsCtrl', function (modelManager) {
var initialLoad = true; var initialLoad = true;
@@ -63,7 +63,7 @@ angular.module('app.frontend')
return; return;
} }
this.newTag = new Tag({}); this.newTag = modelManager.createItem({content_type: "Tag"});
this.selectedTag = this.newTag; this.selectedTag = this.newTag;
this.editingTag = this.newTag; this.editingTag = this.newTag;
this.addNew()(this.newTag); this.addNew()(this.newTag);

View File

@@ -4,6 +4,8 @@ class Item {
this.updateFromJSON(json_obj); this.updateFromJSON(json_obj);
this.observers = [];
if(!this.uuid) { if(!this.uuid) {
this.uuid = Neeto.crypto.generateUUID(); this.uuid = Neeto.crypto.generateUUID();
} }
@@ -44,6 +46,30 @@ class Item {
} }
} }
setDirty(dirty) {
this.dirty = dirty;
if(dirty) {
this.notifyObserversOfChange();
}
}
addObserver(observer, callback) {
if(!_.find(this.observers, observer)) {
this.observers.push({observer: observer, callback: callback});
}
}
removeObserver(observer) {
_.remove(this.observers, {observer: observer})
}
notifyObserversOfChange() {
for(var observer of this.observers) {
observer.callback(this);
}
}
mapContentToLocalProperties(contentObj) { mapContentToLocalProperties(contentObj) {
} }

View File

@@ -2,11 +2,16 @@ class Action {
constructor(json) { constructor(json) {
_.merge(this, json); _.merge(this, json);
this.actionVerb = this.type;
var comps = this.type.split(":"); var comps = this.type.split(":");
if(comps.length > 0) { if(comps.length > 1) {
this.repeatable = true;
this.repeatType = comps[0]; // 'watch' or 'poll' this.actionType = comps[0]; // 'watch', 'poll', or 'all'
this.repeatVerb = comps[1]; // http verb this.repeatable = this.actionType == "watch" || this.actionType == "poll";
this.actionVerb = comps[1]; // http verb : "get", "post", "show"
this.repeatFrequency = comps[2]; this.repeatFrequency = comps[2];
} }
} }

View File

@@ -51,7 +51,7 @@ class Note extends Item {
removeAllRelationships() { removeAllRelationships() {
this.tags.forEach(function(tag){ this.tags.forEach(function(tag){
_.pull(tag.notes, this); _.pull(tag.notes, this);
tag.dirty = true; tag.setDirty(true);
}.bind(this)) }.bind(this))
this.tags = []; this.tags = [];
} }

View File

@@ -49,7 +49,7 @@ class Tag extends Item {
removeAllRelationships() { removeAllRelationships() {
this.notes.forEach(function(note){ this.notes.forEach(function(note){
_.pull(note.tags, this); _.pull(note.tags, this);
note.dirty = true; note.setDirty(true);
}.bind(this)) }.bind(this))
this.notes = []; this.notes = [];

View File

@@ -312,7 +312,7 @@ angular.module('app.frontend')
item.presentation_name = "_auto_"; item.presentation_name = "_auto_";
var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);
needsUpdate.forEach(function(needingUpdate){ needsUpdate.forEach(function(needingUpdate){
needingUpdate.dirty = true; needingUpdate.setDirty(true);
}) })
this.sync(); this.sync();
}.bind(this) }.bind(this)
@@ -339,7 +339,7 @@ angular.module('app.frontend')
item.presentation_name = null; item.presentation_name = null;
var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);
needsUpdate.forEach(function(needingUpdate){ needsUpdate.forEach(function(needingUpdate){
needingUpdate.dirty = true; needingUpdate.setDirty(true);
}) })
this.sync(null); this.sync(null);
} }
@@ -352,7 +352,7 @@ angular.module('app.frontend')
var data = JSON.parse(jsonString); var data = JSON.parse(jsonString);
modelManager.mapResponseItemsToLocalModels(data.items); modelManager.mapResponseItemsToLocalModels(data.items);
modelManager.items.forEach(function(item){ modelManager.items.forEach(function(item){
item.dirty = true; item.setDirty(true);
}) })
this.syncWithOptions(callback, {additionalFields: ["created_at", "updated_at"]}); this.syncWithOptions(callback, {additionalFields: ["created_at", "updated_at"]});
} }
@@ -459,7 +459,8 @@ angular.module('app.frontend')
if(!draftString || draftString == 'undefined') { if(!draftString || draftString == 'undefined') {
return null; return null;
} }
return new Note(JSON.parse(draftString)); var jsonObj = _.merge({content_type: "Note"}, JSON.parse(draftString));
return modelManager.createItem(jsonObj);
} }

View File

@@ -34,7 +34,6 @@ class ExtensionManager {
retrieveExtensionFromServer(url, callback) { retrieveExtensionFromServer(url, callback) {
console.log("Registering URL", url); console.log("Registering URL", url);
this.Restangular.oneUrl(url, url).get().then(function(response){ this.Restangular.oneUrl(url, url).get().then(function(response){
console.log("get response", response.plain());
var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain()); var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());
if(callback) { if(callback) {
callback(ext); callback(ext);
@@ -49,12 +48,10 @@ class ExtensionManager {
var extension = _.find(this.extensions, {url: url}); var extension = _.find(this.extensions, {url: url});
if(extension) { if(extension) {
extension.updateFromExternalResponseItem(externalResponseItem); extension.updateFromExternalResponseItem(externalResponseItem);
console.log("updated existing ext", extension);
} else { } else {
console.log("creating new ext", externalResponseItem);
extension = new Extension(externalResponseItem); extension = new Extension(externalResponseItem);
extension.url = url; extension.url = url;
extension.dirty = true; extension.setDirty(true);
this.modelManager.addItem(extension); this.modelManager.addItem(extension);
this.apiController.sync(null); this.apiController.sync(null);
} }
@@ -70,12 +67,13 @@ class ExtensionManager {
for(var ext of this.extensions) { for(var ext of this.extensions) {
this.retrieveExtensionFromServer(ext.url, function(extension){ this.retrieveExtensionFromServer(ext.url, function(extension){
extension.dirty = true; extension.setDirty(true);
}); });
} }
} }
executeAction(action, extension, callback) { executeAction(action, extension, callback) {
if(action.type == "get") { if(action.type == "get") {
this.Restangular.oneUrl(action.url, action.url).get().then(function(response){ this.Restangular.oneUrl(action.url, action.url).get().then(function(response){
console.log("Execute action response", response); console.log("Execute action response", response);
@@ -84,6 +82,21 @@ class ExtensionManager {
callback(items); callback(items);
}.bind(this)) }.bind(this))
} }
else if(action.type == "show") {
var win = window.open(action.url, '_blank');
win.focus();
callback();
}
else if(action.actionType == "all") {
var allItems = this.modelManager.allItems();
this.performPost(action, allItems, function(items){
callback(items);
});
}
action.lastExecuted = new Date();
} }
isRepeatActionEnabled(action) { isRepeatActionEnabled(action) {
@@ -93,7 +106,7 @@ class ExtensionManager {
disableRepeatAction(action, extension) { disableRepeatAction(action, extension) {
console.log("Disabling action", action); console.log("Disabling action", action);
_.pull(this.enabledRepeatActionUrls, action.url); _.pull(this.enabledRepeatActionUrls, action.url);
this.modelManager.removeItemSyncObserver(action.url); this.modelManager.removeItemChangeObserver(action.url);
console.assert(this.isRepeatActionEnabled(action) == false); console.assert(this.isRepeatActionEnabled(action) == false);
} }
@@ -107,7 +120,7 @@ class ExtensionManager {
if(action.repeatType == "watch") { if(action.repeatType == "watch") {
for(var structure of action.structures) { for(var structure of action.structures) {
this.modelManager.addItemSyncObserver(action.url, structure.type, function(changedItems){ this.modelManager.addItemChangeObserver(action.url, structure.type, function(changedItems){
this.triggerWatchAction(action, changedItems); this.triggerWatchAction(action, changedItems);
}.bind(this)) }.bind(this))
} }
@@ -117,12 +130,9 @@ class ExtensionManager {
queueAction(action, delay, changedItems) { queueAction(action, delay, changedItems) {
this.actionQueue = this.actionQueue || []; this.actionQueue = this.actionQueue || [];
if(_.find(this.actionQueue, action)) { if(_.find(this.actionQueue, action)) {
// console.log("Action already queued, skipping.")
return; return;
} }
// console.log("Adding action to queue", action);
this.actionQueue.push(action); this.actionQueue.push(action);
setTimeout(function () { setTimeout(function () {
@@ -132,6 +142,10 @@ class ExtensionManager {
}.bind(this), delay * 1000); }.bind(this), delay * 1000);
} }
outgoingParamsForItem(item) {
return this.apiController.paramsForItem(item, false, null, true);
}
triggerWatchAction(action, changedItems) { triggerWatchAction(action, changedItems) {
// console.log("Watch action triggered", action, changedItems); // console.log("Watch action triggered", action, changedItems);
if(action.repeatFrequency > 0) { if(action.repeatFrequency > 0) {
@@ -147,21 +161,29 @@ class ExtensionManager {
} }
console.log("Performing action immediately", action); console.log("Performing action immediately", action);
action.lastExecuted = new Date(); action.lastExecuted = new Date();
// console.log("setting last exectured", action.lastExecuted)
if(action.repeatVerb == "post") { if(action.repeatVerb == "post") {
var request = this.Restangular.oneUrl(action.url, action.url); this.performPost(action, changedItems, null);
request.items = changedItems.map(function(item){
var params = {uuid: item.uuid, content_type: item.content_type, content: item.createContentJSONFromProperties()};
return params;
})
request.post().then(function(response){
// console.log("watch action response", response);
})
} }
} }
performPost(action, items, callback) {
var request = this.Restangular.oneUrl(action.url, action.url);
request.items = items.map(function(item){
var params = this.outgoingParamsForItem(item);
return params;
}.bind(this))
request.post().then(function(response){
// console.log("watch action response", response);
if(callback) {
callback(response.plain());
}
})
}
} }
angular.module('app.frontend').service('extensionManager', ExtensionManager); angular.module('app.frontend').service('extensionManager', ExtensionManager);

View File

@@ -4,10 +4,15 @@ class ModelManager {
this.notes = []; this.notes = [];
this.tags = []; this.tags = [];
this.itemSyncObservers = []; this.itemSyncObservers = [];
this.itemChangeObservers = [];
this.items = []; this.items = [];
this.extensions = []; this.extensions = [];
} }
allItems() {
return this.items.filter(function(item){return !item.dummy})
}
findItem(itemId) { findItem(itemId) {
return _.find(this.items, {uuid: itemId}); return _.find(this.items, {uuid: itemId});
} }
@@ -45,27 +50,47 @@ class ModelManager {
models.push(item) models.push(item)
} }
this.notifySyncObserversOfModels(models);
this.sortItems();
return models;
}
notifySyncObserversOfModels(models) {
for(var observer of this.itemSyncObservers) { for(var observer of this.itemSyncObservers) {
var relevantItems = models.filter(function(item){return item.content_type == observer.type}); var relevantItems = models.filter(function(item){return item.content_type == observer.type});
if(relevantItems.length > 0) { if(relevantItems.length > 0) {
observer.callback(relevantItems); observer.callback(relevantItems);
} }
} }
}
this.sortItems(); notifyItemChangeObserversOfModels(models) {
return models; for(var observer of this.itemChangeObservers) {
var relevantItems = models.filter(function(item){return item.content_type == observer.type});
if(relevantItems.length > 0) {
observer.callback(relevantItems);
}
}
} }
createItem(json_obj) { createItem(json_obj) {
var item;
if(json_obj.content_type == "Note") { if(json_obj.content_type == "Note") {
return new Note(json_obj); item = new Note(json_obj);
} else if(json_obj.content_type == "Tag") { } else if(json_obj.content_type == "Tag") {
return new Tag(json_obj); item = new Tag(json_obj);
} else if(json_obj.content_type == "Extension") { } else if(json_obj.content_type == "Extension") {
return new Extension(json_obj); item = new Extension(json_obj);
} else { } else {
return new Item(json_obj); item = new Item(json_obj);
} }
item.addObserver(this, function(changedItem){
this.notifyItemChangeObserversOfModels([changedItem]);
}.bind(this));
return item;
} }
addItems(items) { addItems(items) {
@@ -131,6 +156,14 @@ class ModelManager {
_.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id})); _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));
} }
addItemChangeObserver(id, type, callback) {
this.itemChangeObservers.push({id: id, type: type, callback: callback});
}
removeItemChangeObserver(id) {
_.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));
}
get filteredNotes() { get filteredNotes() {
return Note.filterDummyNotes(this.notes); return Note.filterDummyNotes(this.notes);
} }
@@ -141,13 +174,13 @@ class ModelManager {
clearDirtyItems() { clearDirtyItems() {
this.getDirtyItems().forEach(function(item){ this.getDirtyItems().forEach(function(item){
item.dirty = false; item.setDirty(false);
}) })
} }
setItemToBeDeleted(item) { setItemToBeDeleted(item) {
item.deleted = true; item.deleted = true;
item.dirty = true; item.setDirty(true);
item.removeAllRelationships(); item.removeAllRelationships();
} }
@@ -171,16 +204,16 @@ class ModelManager {
itemOne.addItemAsRelationship(itemTwo); itemOne.addItemAsRelationship(itemTwo);
itemTwo.addItemAsRelationship(itemOne); itemTwo.addItemAsRelationship(itemOne);
itemOne.dirty = true; itemOne.setDirty(true);
itemTwo.dirty = true; itemTwo.setDirty(true);
} }
removeRelationshipBetweenItems(itemOne, itemTwo) { removeRelationshipBetweenItems(itemOne, itemTwo) {
itemOne.removeItemAsRelationship(itemTwo); itemOne.removeItemAsRelationship(itemTwo);
itemTwo.removeItemAsRelationship(itemOne); itemTwo.removeItemAsRelationship(itemOne);
itemOne.dirty = true; itemOne.setDirty(true);
itemTwo.dirty = true; itemTwo.setDirty(true);
} }
} }

View File

@@ -320,7 +320,7 @@ Extensions
> .execute { > .execute {
font-weight: bold; font-weight: bold;
margin-bottom: 3px; margin-bottom: 0px;
font-size: 12px; font-size: 12px;
} }

View File

@@ -98,21 +98,26 @@
.desc{"style" => "font-style: italic;"} {{action.desc}} .desc{"style" => "font-style: italic;"} {{action.desc}}
.execute-type{"ng-if" => "action.repeatable"} .execute-type{"ng-if" => "action.repeatable"}
Repeats at most once every {{action.repeatFrequency}} seconds Repeats at most once every {{action.repeatFrequency}} seconds
.last-run{"ng-if" => "action.lastExecuted"}
Last executed {{action.lastExecuted | appDate}}
.permissions .permissions
%a{"ng-click" => "action.showPermissions = !action.showPermissions"} {{action.showPermissions ? "Hide permissions" : "Show permissions"}} %a{"ng-click" => "action.showPermissions = !action.showPermissions"} {{action.showPermissions ? "Hide permissions" : "Show permissions"}}
.permission-model{"ng-if" => "action.showPermissions", "ng-repeat" => "structure in action.structures"} .permission-model{"ng-if" => "action.showPermissions", "ng-repeat" => "structure in action.structures"}
%span{"style" => "font-weight: bold;"} {{structure.type}}s: %span{"style" => "font-weight: bold;"} {{structure.type}}s:
%span{"ng-repeat" => "field in structure.fields"} %span{"ng-if" => "action.actionType == 'all'"} all {{" | "}}
{{field.name}} ({{field.modifies ? "readwrite" : "read"}}) %span{"ng-if" => "action.actionType == 'watch'"} changes {{" | "}}
%span {{structure.mode}}
%span {{" | "}}
%span {{structure.decrypted ? "decrypted" : "encrypted"}}
.execute .execute
%a{"ng-click" => "ctrl.selectedAction(action, extension)"} %a{"ng-click" => "ctrl.selectedAction(action, extension)"}
%span{"ng-if" => "action.repeatable"} %span{"ng-if" => "action.repeatable"}
%span{"ng-if" => "ctrl.extensionManager.isRepeatActionEnabled(action)", "ng-click" => "ctrl.extensionManager.disableRepeatAction(action, extension)"} Disable %span{"ng-if" => "ctrl.extensionManager.isRepeatActionEnabled(action)", "ng-click" => "ctrl.extensionManager.disableRepeatAction(action, extension)"} Disable
%span{"ng-if" => "!ctrl.extensionManager.isRepeatActionEnabled(action)", "ng-click" => "ctrl.extensionManager.enableRepeatAction(action, extension)"} Enable %span{"ng-if" => "!ctrl.extensionManager.isRepeatActionEnabled(action)", "ng-click" => "ctrl.extensionManager.enableRepeatAction(action, extension)"} Enable
%span{"ng-if" => "!action.repeatable"} %span{"ng-if" => "!action.repeatable && !action.running"}
Perform Action Run
%span{"ng-if" => "action.running"}
.spinner{"style" => "margin-top: 3px;"}
.last-run{"ng-if" => "action.lastExecuted && !action.running"}
Last executed {{action.lastExecuted | appDateTime}}
.extension-link .extension-link
%a{"ng-click" => "ctrl.toggleExtensionForm()"} Add new extension %a{"ng-click" => "ctrl.toggleExtensionForm()"} Add new extension

View File

@@ -656,7 +656,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
var original = this.note.presentation_name; var original = this.note.presentation_name;
this.note.presentation_name = this.url.token; this.note.presentation_name = this.url.token;
this.note.dirty = true; this.note.setDirty(true);
apiController.sync(function (response) { apiController.sync(function (response) {
if (!response) { if (!response) {
@@ -760,7 +760,9 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
}; };
this.selectedAction = function (action, extension) { this.selectedAction = function (action, extension) {
action.running = true;
extensionManager.executeAction(action, extension, function (response) { extensionManager.executeAction(action, extension, function (response) {
action.running = false;
apiController.sync(null); apiController.sync(null);
}); });
}; };
@@ -973,7 +975,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
}; };
$scope.tagsSave = function (tag, callback) { $scope.tagsSave = function (tag, callback) {
tag.dirty = true; tag.setDirty(true);
apiController.sync(callback); apiController.sync(callback);
}; };
@@ -1030,7 +1032,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
*/ */
$scope.saveNote = function (note, callback) { $scope.saveNote = function (note, callback) {
note.dirty = true; note.setDirty(true);
apiController.sync(function () { apiController.sync(function () {
note.hasChanges = false; note.hasChanges = false;
@@ -1091,7 +1093,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
}); });
} }
}; };
}).controller('NotesCtrl', function (apiController, $timeout, $rootScope) { }).controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {
$rootScope.$on("editorFocused", function () { $rootScope.$on("editorFocused", function () {
this.showMenu = false; this.showMenu = false;
@@ -1174,7 +1176,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
this.createNewNote = function () { this.createNewNote = function () {
var title = "New Note" + (this.tag.notes ? " " + (this.tag.notes.length + 1) : ""); var title = "New Note" + (this.tag.notes ? " " + (this.tag.notes.length + 1) : "");
this.newNote = new Note({ dummy: true, text: "" }); this.newNote = modelManager.createItem({ content_type: "Note", dummy: true, text: "" });
this.newNote.title = title; this.newNote.title = title;
this.selectNote(this.newNote); this.selectNote(this.newNote);
this.addNew()(this.newNote); this.addNew()(this.newNote);
@@ -1232,7 +1234,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
}); });
} }
}; };
}).controller('TagsCtrl', function () { }).controller('TagsCtrl', function (modelManager) {
var initialLoad = true; var initialLoad = true;
@@ -1262,7 +1264,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
return; return;
} }
this.newTag = new Tag({}); this.newTag = modelManager.createItem({ content_type: "Tag" });
this.selectedTag = this.newTag; this.selectedTag = this.newTag;
this.editingTag = this.newTag; this.editingTag = this.newTag;
this.addNew()(this.newTag); this.addNew()(this.newTag);
@@ -1325,6 +1327,8 @@ var Item = function () {
this.updateFromJSON(json_obj); this.updateFromJSON(json_obj);
this.observers = [];
if (!this.uuid) { if (!this.uuid) {
this.uuid = Neeto.crypto.generateUUID(); this.uuid = Neeto.crypto.generateUUID();
} }
@@ -1346,6 +1350,55 @@ var Item = function () {
this.mapContentToLocalProperties(this.contentObject); this.mapContentToLocalProperties(this.contentObject);
} }
} }
}, {
key: 'setDirty',
value: function setDirty(dirty) {
this.dirty = dirty;
if (dirty) {
this.notifyObserversOfChange();
}
}
}, {
key: 'addObserver',
value: function addObserver(observer, callback) {
if (!_.find(this.observers, observer)) {
this.observers.push({ observer: observer, callback: callback });
}
}
}, {
key: 'removeObserver',
value: function removeObserver(observer) {
_.remove(this.observers, { observer: observer });
}
}, {
key: 'notifyObserversOfChange',
value: function notifyObserversOfChange() {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = this.observers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var observer = _step.value;
observer.callback(this);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
}, { }, {
key: 'mapContentToLocalProperties', key: 'mapContentToLocalProperties',
value: function mapContentToLocalProperties(contentObj) {} value: function mapContentToLocalProperties(contentObj) {}
@@ -1443,11 +1496,16 @@ var Action = function Action(json) {
_.merge(this, json); _.merge(this, json);
this.actionVerb = this.type;
var comps = this.type.split(":"); var comps = this.type.split(":");
if (comps.length > 0) { if (comps.length > 1) {
this.repeatable = true;
this.repeatType = comps[0]; // 'watch' or 'poll' this.actionType = comps[0]; // 'watch', 'poll', or 'all'
this.repeatVerb = comps[1]; // http verb this.repeatable = this.actionType == "watch" || this.actionType == "poll";
this.actionVerb = comps[1]; // http verb : "get", "post", "show"
this.repeatFrequency = comps[2]; this.repeatFrequency = comps[2];
} }
}; };
@@ -1571,7 +1629,7 @@ var Note = function (_Item2) {
value: function removeAllRelationships() { value: function removeAllRelationships() {
this.tags.forEach(function (tag) { this.tags.forEach(function (tag) {
_.pull(tag.notes, this); _.pull(tag.notes, this);
tag.dirty = true; tag.setDirty(true);
}.bind(this)); }.bind(this));
this.tags = []; this.tags = [];
} }
@@ -1608,29 +1666,29 @@ var Note = function (_Item2) {
}, { }, {
key: 'hasOnePublicTag', key: 'hasOnePublicTag',
get: function get() { get: function get() {
var _iteratorNormalCompletion = true; var _iteratorNormalCompletion2 = true;
var _didIteratorError = false; var _didIteratorError2 = false;
var _iteratorError = undefined; var _iteratorError2 = undefined;
try { try {
for (var _iterator = this.tags[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { for (var _iterator2 = this.tags[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var tag = _step.value; var tag = _step2.value;
if (tag.isPublic()) { if (tag.isPublic()) {
return true; return true;
} }
} }
} catch (err) { } catch (err) {
_didIteratorError = true; _didIteratorError2 = true;
_iteratorError = err; _iteratorError2 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion && _iterator.return) { if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator.return(); _iterator2.return();
} }
} finally { } finally {
if (_didIteratorError) { if (_didIteratorError2) {
throw _iteratorError; throw _iteratorError2;
} }
} }
} }
@@ -1718,7 +1776,7 @@ var Tag = function (_Item3) {
value: function removeAllRelationships() { value: function removeAllRelationships() {
this.notes.forEach(function (note) { this.notes.forEach(function (note) {
_.pull(note.tags, this); _.pull(note.tags, this);
note.dirty = true; note.setDirty(true);
}.bind(this)); }.bind(this));
this.notes = []; this.notes = [];
@@ -2049,7 +2107,7 @@ var User = function User(json_obj) {
item.presentation_name = "_auto_"; item.presentation_name = "_auto_";
var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);
needsUpdate.forEach(function (needingUpdate) { needsUpdate.forEach(function (needingUpdate) {
needingUpdate.dirty = true; needingUpdate.setDirty(true);
}); });
this.sync(); this.sync();
}.bind(this); }.bind(this);
@@ -2078,7 +2136,7 @@ var User = function User(json_obj) {
item.presentation_name = null; item.presentation_name = null;
var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);
needsUpdate.forEach(function (needingUpdate) { needsUpdate.forEach(function (needingUpdate) {
needingUpdate.dirty = true; needingUpdate.setDirty(true);
}); });
this.sync(null); this.sync(null);
}; };
@@ -2091,7 +2149,7 @@ var User = function User(json_obj) {
var data = JSON.parse(jsonString); var data = JSON.parse(jsonString);
modelManager.mapResponseItemsToLocalModels(data.items); modelManager.mapResponseItemsToLocalModels(data.items);
modelManager.items.forEach(function (item) { modelManager.items.forEach(function (item) {
item.dirty = true; item.setDirty(true);
}); });
this.syncWithOptions(callback, { additionalFields: ["created_at", "updated_at"] }); this.syncWithOptions(callback, { additionalFields: ["created_at", "updated_at"] });
}; };
@@ -2193,7 +2251,8 @@ var User = function User(json_obj) {
if (!draftString || draftString == 'undefined') { if (!draftString || draftString == 'undefined') {
return null; return null;
} }
return new Note(JSON.parse(draftString)); var jsonObj = _.merge({ content_type: "Note" }, JSON.parse(draftString));
return modelManager.createItem(jsonObj);
}; };
/* /*
@@ -2252,13 +2311,13 @@ var User = function User(json_obj) {
this.decryptItems = function (items) { this.decryptItems = function (items) {
var masterKey = this.retrieveMk(); var masterKey = this.retrieveMk();
var _iteratorNormalCompletion2 = true; var _iteratorNormalCompletion3 = true;
var _didIteratorError2 = false; var _didIteratorError3 = false;
var _iteratorError2 = undefined; var _iteratorError3 = undefined;
try { try {
for (var _iterator2 = items[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { for (var _iterator3 = items[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var item = _step2.value; var item = _step3.value;
if (item.deleted == true) { if (item.deleted == true) {
continue; continue;
@@ -2273,16 +2332,16 @@ var User = function User(json_obj) {
} }
} }
} catch (err) { } catch (err) {
_didIteratorError2 = true; _didIteratorError3 = true;
_iteratorError2 = err; _iteratorError3 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion2 && _iterator2.return) { if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator2.return(); _iterator3.return();
} }
} finally { } finally {
if (_didIteratorError2) { if (_didIteratorError3) {
throw _iteratorError2; throw _iteratorError3;
} }
} }
} }
@@ -2657,51 +2716,51 @@ var ExtensionManager = function () {
this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem("enabledRepeatActionUrls")) || []; this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem("enabledRepeatActionUrls")) || [];
modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) { modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) {
var _iteratorNormalCompletion3 = true; var _iteratorNormalCompletion4 = true;
var _didIteratorError3 = false; var _didIteratorError4 = false;
var _iteratorError3 = undefined; var _iteratorError4 = undefined;
try { try {
for (var _iterator3 = items[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { for (var _iterator4 = items[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var ext = _step3.value; var ext = _step4.value;
var _iteratorNormalCompletion4 = true; var _iteratorNormalCompletion5 = true;
var _didIteratorError4 = false; var _didIteratorError5 = false;
var _iteratorError4 = undefined; var _iteratorError5 = undefined;
try { try {
for (var _iterator4 = ext.actions[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { for (var _iterator5 = ext.actions[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var action = _step4.value; var action = _step5.value;
if (this.enabledRepeatActionUrls.includes(action.url)) { if (this.enabledRepeatActionUrls.includes(action.url)) {
this.enableRepeatAction(action, ext); this.enableRepeatAction(action, ext);
} }
} }
} catch (err) { } catch (err) {
_didIteratorError4 = true; _didIteratorError5 = true;
_iteratorError4 = err; _iteratorError5 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion4 && _iterator4.return) { if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator4.return(); _iterator5.return();
} }
} finally { } finally {
if (_didIteratorError4) { if (_didIteratorError5) {
throw _iteratorError4; throw _iteratorError5;
} }
} }
} }
} }
} catch (err) { } catch (err) {
_didIteratorError3 = true; _didIteratorError4 = true;
_iteratorError3 = err; _iteratorError4 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion3 && _iterator3.return) { if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator3.return(); _iterator4.return();
} }
} finally { } finally {
if (_didIteratorError3) { if (_didIteratorError4) {
throw _iteratorError3; throw _iteratorError4;
} }
} }
} }
@@ -2711,81 +2770,15 @@ var ExtensionManager = function () {
_createClass(ExtensionManager, [{ _createClass(ExtensionManager, [{
key: 'actionWithURL', key: 'actionWithURL',
value: function actionWithURL(url) { value: function actionWithURL(url) {
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator5 = this.extensions[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var extension = _step5.value;
return _.find(extension.actions, { url: url });
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
}
}, {
key: 'addExtension',
value: function addExtension(url) {
this.retrieveExtensionFromServer(url, null);
}
}, {
key: 'retrieveExtensionFromServer',
value: function retrieveExtensionFromServer(url, callback) {
console.log("Registering URL", url);
this.Restangular.oneUrl(url, url).get().then(function (response) {
console.log("get response", response.plain());
var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());
if (callback) {
callback(ext);
}
}.bind(this)).catch(function (response) {
console.log("Error registering extension", response);
});
}
}, {
key: 'handleExtensionLoadExternalResponseItem',
value: function handleExtensionLoadExternalResponseItem(url, externalResponseItem) {
var extension = _.find(this.extensions, { url: url });
if (extension) {
extension.updateFromExternalResponseItem(externalResponseItem);
console.log("updated existing ext", extension);
} else {
console.log("creating new ext", externalResponseItem);
extension = new Extension(externalResponseItem);
extension.url = url;
extension.dirty = true;
this.modelManager.addItem(extension);
this.apiController.sync(null);
}
return extension;
}
}, {
key: 'refreshExtensionsFromServer',
value: function refreshExtensionsFromServer() {
var _iteratorNormalCompletion6 = true; var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false; var _didIteratorError6 = false;
var _iteratorError6 = undefined; var _iteratorError6 = undefined;
try { try {
for (var _iterator6 = this.enabledRepeatActionUrls[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { for (var _iterator6 = this.extensions[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var url = _step6.value; var extension = _step6.value;
var action = this.actionWithURL(url); return _.find(extension.actions, { url: url });
this.disableRepeatAction(action);
} }
} catch (err) { } catch (err) {
_didIteratorError6 = true; _didIteratorError6 = true;
@@ -2801,18 +2794,54 @@ var ExtensionManager = function () {
} }
} }
} }
}
}, {
key: 'addExtension',
value: function addExtension(url) {
this.retrieveExtensionFromServer(url, null);
}
}, {
key: 'retrieveExtensionFromServer',
value: function retrieveExtensionFromServer(url, callback) {
console.log("Registering URL", url);
this.Restangular.oneUrl(url, url).get().then(function (response) {
var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());
if (callback) {
callback(ext);
}
}.bind(this)).catch(function (response) {
console.log("Error registering extension", response);
});
}
}, {
key: 'handleExtensionLoadExternalResponseItem',
value: function handleExtensionLoadExternalResponseItem(url, externalResponseItem) {
var extension = _.find(this.extensions, { url: url });
if (extension) {
extension.updateFromExternalResponseItem(externalResponseItem);
} else {
extension = new Extension(externalResponseItem);
extension.url = url;
extension.setDirty(true);
this.modelManager.addItem(extension);
this.apiController.sync(null);
}
return extension;
}
}, {
key: 'refreshExtensionsFromServer',
value: function refreshExtensionsFromServer() {
var _iteratorNormalCompletion7 = true; var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false; var _didIteratorError7 = false;
var _iteratorError7 = undefined; var _iteratorError7 = undefined;
try { try {
for (var _iterator7 = this.extensions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { for (var _iterator7 = this.enabledRepeatActionUrls[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var ext = _step7.value; var url = _step7.value;
this.retrieveExtensionFromServer(ext.url, function (extension) { var action = this.actionWithURL(url);
extension.dirty = true; this.disableRepeatAction(action);
});
} }
} catch (err) { } catch (err) {
_didIteratorError7 = true; _didIteratorError7 = true;
@@ -2828,10 +2857,38 @@ var ExtensionManager = function () {
} }
} }
} }
var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false;
var _iteratorError8 = undefined;
try {
for (var _iterator8 = this.extensions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var ext = _step8.value;
this.retrieveExtensionFromServer(ext.url, function (extension) {
extension.setDirty(true);
});
}
} catch (err) {
_didIteratorError8 = true;
_iteratorError8 = err;
} finally {
try {
if (!_iteratorNormalCompletion8 && _iterator8.return) {
_iterator8.return();
}
} finally {
if (_didIteratorError8) {
throw _iteratorError8;
}
}
}
} }
}, { }, {
key: 'executeAction', key: 'executeAction',
value: function executeAction(action, extension, callback) { value: function executeAction(action, extension, callback) {
if (action.type == "get") { if (action.type == "get") {
this.Restangular.oneUrl(action.url, action.url).get().then(function (response) { this.Restangular.oneUrl(action.url, action.url).get().then(function (response) {
console.log("Execute action response", response); console.log("Execute action response", response);
@@ -2839,7 +2896,18 @@ var ExtensionManager = function () {
this.modelManager.mapResponseItemsToLocalModels(items); this.modelManager.mapResponseItemsToLocalModels(items);
callback(items); callback(items);
}.bind(this)); }.bind(this));
} else if (action.type == "show") {
var win = window.open(action.url, '_blank');
win.focus();
callback();
} else if (action.actionType == "all") {
var allItems = this.modelManager.allItems();
this.performPost(action, allItems, function (items) {
callback(items);
});
} }
action.lastExecuted = new Date();
} }
}, { }, {
key: 'isRepeatActionEnabled', key: 'isRepeatActionEnabled',
@@ -2851,7 +2919,7 @@ var ExtensionManager = function () {
value: function disableRepeatAction(action, extension) { value: function disableRepeatAction(action, extension) {
console.log("Disabling action", action); console.log("Disabling action", action);
_.pull(this.enabledRepeatActionUrls, action.url); _.pull(this.enabledRepeatActionUrls, action.url);
this.modelManager.removeItemSyncObserver(action.url); this.modelManager.removeItemChangeObserver(action.url);
console.assert(this.isRepeatActionEnabled(action) == false); console.assert(this.isRepeatActionEnabled(action) == false);
} }
}, { }, {
@@ -2865,29 +2933,29 @@ var ExtensionManager = function () {
} }
if (action.repeatType == "watch") { if (action.repeatType == "watch") {
var _iteratorNormalCompletion8 = true; var _iteratorNormalCompletion9 = true;
var _didIteratorError8 = false; var _didIteratorError9 = false;
var _iteratorError8 = undefined; var _iteratorError9 = undefined;
try { try {
for (var _iterator8 = action.structures[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { for (var _iterator9 = action.structures[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
var structure = _step8.value; var structure = _step9.value;
this.modelManager.addItemSyncObserver(action.url, structure.type, function (changedItems) { this.modelManager.addItemChangeObserver(action.url, structure.type, function (changedItems) {
this.triggerWatchAction(action, changedItems); this.triggerWatchAction(action, changedItems);
}.bind(this)); }.bind(this));
} }
} catch (err) { } catch (err) {
_didIteratorError8 = true; _didIteratorError9 = true;
_iteratorError8 = err; _iteratorError9 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion8 && _iterator8.return) { if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator8.return(); _iterator9.return();
} }
} finally { } finally {
if (_didIteratorError8) { if (_didIteratorError9) {
throw _iteratorError8; throw _iteratorError9;
} }
} }
} }
@@ -2898,12 +2966,9 @@ var ExtensionManager = function () {
value: function queueAction(action, delay, changedItems) { value: function queueAction(action, delay, changedItems) {
this.actionQueue = this.actionQueue || []; this.actionQueue = this.actionQueue || [];
if (_.find(this.actionQueue, action)) { if (_.find(this.actionQueue, action)) {
// console.log("Action already queued, skipping.")
return; return;
} }
// console.log("Adding action to queue", action);
this.actionQueue.push(action); this.actionQueue.push(action);
setTimeout(function () { setTimeout(function () {
@@ -2912,6 +2977,11 @@ var ExtensionManager = function () {
_.pull(this.actionQueue, action); _.pull(this.actionQueue, action);
}.bind(this), delay * 1000); }.bind(this), delay * 1000);
} }
}, {
key: 'outgoingParamsForItem',
value: function outgoingParamsForItem(item) {
return this.apiController.paramsForItem(item, false, null, true);
}
}, { }, {
key: 'triggerWatchAction', key: 'triggerWatchAction',
value: function triggerWatchAction(action, changedItems) { value: function triggerWatchAction(action, changedItems) {
@@ -2929,20 +2999,29 @@ var ExtensionManager = function () {
} }
console.log("Performing action immediately", action); console.log("Performing action immediately", action);
action.lastExecuted = new Date(); action.lastExecuted = new Date();
// console.log("setting last exectured", action.lastExecuted)
if (action.repeatVerb == "post") { if (action.repeatVerb == "post") {
var request = this.Restangular.oneUrl(action.url, action.url); this.performPost(action, changedItems, null);
request.items = changedItems.map(function (item) {
var params = { uuid: item.uuid, content_type: item.content_type, content: item.createContentJSONFromProperties() };
return params;
});
request.post().then(function (response) {
// console.log("watch action response", response);
});
} }
} }
}, {
key: 'performPost',
value: function performPost(action, items, callback) {
var request = this.Restangular.oneUrl(action.url, action.url);
request.items = items.map(function (item) {
var params = this.outgoingParamsForItem(item);
return params;
}.bind(this));
request.post().then(function (response) {
// console.log("watch action response", response);
if (callback) {
callback(response.plain());
}
});
}
}, { }, {
key: 'extensions', key: 'extensions',
get: function get() { get: function get() {
@@ -2989,11 +3068,19 @@ var ModelManager = function () {
this.notes = []; this.notes = [];
this.tags = []; this.tags = [];
this.itemSyncObservers = []; this.itemSyncObservers = [];
this.itemChangeObservers = [];
this.items = []; this.items = [];
this.extensions = []; this.extensions = [];
} }
_createClass(ModelManager, [{ _createClass(ModelManager, [{
key: 'allItems',
value: function allItems() {
return this.items.filter(function (item) {
return !item.dummy;
});
}
}, {
key: 'findItem', key: 'findItem',
value: function findItem(itemId) { value: function findItem(itemId) {
return _.find(this.items, { uuid: itemId }); return _.find(this.items, { uuid: itemId });
@@ -3007,13 +3094,13 @@ var ModelManager = function () {
key: 'mapResponseItemsToLocalModelsOmittingFields', key: 'mapResponseItemsToLocalModelsOmittingFields',
value: function mapResponseItemsToLocalModelsOmittingFields(items, omitFields) { value: function mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {
var models = []; var models = [];
var _iteratorNormalCompletion9 = true; var _iteratorNormalCompletion10 = true;
var _didIteratorError9 = false; var _didIteratorError10 = false;
var _iteratorError9 = undefined; var _iteratorError10 = undefined;
try { try {
for (var _iterator9 = items[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { for (var _iterator10 = items[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var json_obj = _step9.value; var json_obj = _step10.value;
json_obj = _.omit(json_obj, omitFields || []); json_obj = _.omit(json_obj, omitFields || []);
var item = this.findItem(json_obj["uuid"]); var item = this.findItem(json_obj["uuid"]);
@@ -3040,36 +3127,6 @@ var ModelManager = function () {
models.push(item); models.push(item);
} }
} catch (err) {
_didIteratorError9 = true;
_iteratorError9 = err;
} finally {
try {
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
}
} finally {
if (_didIteratorError9) {
throw _iteratorError9;
}
}
}
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
try {
for (var _iterator10 = this.itemSyncObservers[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var observer = _step10.value;
var relevantItems = models.filter(function (item) {
return item.content_type == observer.type;
});
if (relevantItems.length > 0) {
observer.callback(relevantItems);
}
}
} catch (err) { } catch (err) {
_didIteratorError10 = true; _didIteratorError10 = true;
_iteratorError10 = err; _iteratorError10 = err;
@@ -3085,21 +3142,96 @@ var ModelManager = function () {
} }
} }
this.notifySyncObserversOfModels(models);
this.sortItems(); this.sortItems();
return models; return models;
} }
}, {
key: 'notifySyncObserversOfModels',
value: function notifySyncObserversOfModels(models) {
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
try {
for (var _iterator11 = this.itemSyncObservers[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var observer = _step11.value;
var relevantItems = models.filter(function (item) {
return item.content_type == observer.type;
});
if (relevantItems.length > 0) {
observer.callback(relevantItems);
}
}
} catch (err) {
_didIteratorError11 = true;
_iteratorError11 = err;
} finally {
try {
if (!_iteratorNormalCompletion11 && _iterator11.return) {
_iterator11.return();
}
} finally {
if (_didIteratorError11) {
throw _iteratorError11;
}
}
}
}
}, {
key: 'notifyItemChangeObserversOfModels',
value: function notifyItemChangeObserversOfModels(models) {
var _iteratorNormalCompletion12 = true;
var _didIteratorError12 = false;
var _iteratorError12 = undefined;
try {
for (var _iterator12 = this.itemChangeObservers[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
var observer = _step12.value;
var relevantItems = models.filter(function (item) {
return item.content_type == observer.type;
});
if (relevantItems.length > 0) {
observer.callback(relevantItems);
}
}
} catch (err) {
_didIteratorError12 = true;
_iteratorError12 = err;
} finally {
try {
if (!_iteratorNormalCompletion12 && _iterator12.return) {
_iterator12.return();
}
} finally {
if (_didIteratorError12) {
throw _iteratorError12;
}
}
}
}
}, { }, {
key: 'createItem', key: 'createItem',
value: function createItem(json_obj) { value: function createItem(json_obj) {
var item;
if (json_obj.content_type == "Note") { if (json_obj.content_type == "Note") {
return new Note(json_obj); item = new Note(json_obj);
} else if (json_obj.content_type == "Tag") { } else if (json_obj.content_type == "Tag") {
return new Tag(json_obj); item = new Tag(json_obj);
} else if (json_obj.content_type == "Extension") { } else if (json_obj.content_type == "Extension") {
return new Extension(json_obj); item = new Extension(json_obj);
} else { } else {
return new Item(json_obj); item = new Item(json_obj);
} }
item.addObserver(this, function (changedItem) {
this.notifyItemChangeObserversOfModels([changedItem]);
}.bind(this));
return item;
} }
}, { }, {
key: 'addItems', key: 'addItems',
@@ -3142,13 +3274,13 @@ var ModelManager = function () {
return; return;
} }
var _iteratorNormalCompletion11 = true; var _iteratorNormalCompletion13 = true;
var _didIteratorError11 = false; var _didIteratorError13 = false;
var _iteratorError11 = undefined; var _iteratorError13 = undefined;
try { try {
for (var _iterator11 = contentObject.references[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { for (var _iterator13 = contentObject.references[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
var reference = _step11.value; var reference = _step13.value;
var referencedItem = this.findItem(reference.uuid); var referencedItem = this.findItem(reference.uuid);
if (referencedItem) { if (referencedItem) {
@@ -3159,16 +3291,16 @@ var ModelManager = function () {
} }
} }
} catch (err) { } catch (err) {
_didIteratorError11 = true; _didIteratorError13 = true;
_iteratorError11 = err; _iteratorError13 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion11 && _iterator11.return) { if (!_iteratorNormalCompletion13 && _iterator13.return) {
_iterator11.return(); _iterator13.return();
} }
} finally { } finally {
if (_didIteratorError11) { if (_didIteratorError13) {
throw _iteratorError11; throw _iteratorError13;
} }
} }
} }
@@ -3192,6 +3324,16 @@ var ModelManager = function () {
value: function removeItemSyncObserver(id) { value: function removeItemSyncObserver(id) {
_.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, { id: id })); _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, { id: id }));
} }
}, {
key: 'addItemChangeObserver',
value: function addItemChangeObserver(id, type, callback) {
this.itemChangeObservers.push({ id: id, type: type, callback: callback });
}
}, {
key: 'removeItemChangeObserver',
value: function removeItemChangeObserver(id) {
_.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, { id: id }));
}
}, { }, {
key: 'getDirtyItems', key: 'getDirtyItems',
value: function getDirtyItems() { value: function getDirtyItems() {
@@ -3203,14 +3345,14 @@ var ModelManager = function () {
key: 'clearDirtyItems', key: 'clearDirtyItems',
value: function clearDirtyItems() { value: function clearDirtyItems() {
this.getDirtyItems().forEach(function (item) { this.getDirtyItems().forEach(function (item) {
item.dirty = false; item.setDirty(false);
}); });
} }
}, { }, {
key: 'setItemToBeDeleted', key: 'setItemToBeDeleted',
value: function setItemToBeDeleted(item) { value: function setItemToBeDeleted(item) {
item.deleted = true; item.deleted = true;
item.dirty = true; item.setDirty(true);
item.removeAllRelationships(); item.removeAllRelationships();
} }
}, { }, {
@@ -3237,8 +3379,8 @@ var ModelManager = function () {
itemOne.addItemAsRelationship(itemTwo); itemOne.addItemAsRelationship(itemTwo);
itemTwo.addItemAsRelationship(itemOne); itemTwo.addItemAsRelationship(itemOne);
itemOne.dirty = true; itemOne.setDirty(true);
itemTwo.dirty = true; itemTwo.setDirty(true);
} }
}, { }, {
key: 'removeRelationshipBetweenItems', key: 'removeRelationshipBetweenItems',
@@ -3246,8 +3388,8 @@ var ModelManager = function () {
itemOne.removeItemAsRelationship(itemTwo); itemOne.removeItemAsRelationship(itemTwo);
itemTwo.removeItemAsRelationship(itemOne); itemTwo.removeItemAsRelationship(itemOne);
itemOne.dirty = true; itemOne.setDirty(true);
itemTwo.dirty = true; itemTwo.setDirty(true);
} }
}, { }, {
key: 'filteredNotes', key: 'filteredNotes',

File diff suppressed because one or more lines are too long