updated ext format

This commit is contained in:
Mo Bitar
2017-01-06 00:19:08 -06:00
parent d99d3919de
commit 1a2bcb39ca
9 changed files with 424 additions and 236 deletions

View File

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

View File

@@ -1,25 +1,45 @@
class Action { class Action {
constructor(json) { constructor(json) {
_.merge(this, json); _.merge(this, json);
this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory
this.actionVerb = this.type; }
var comps = this.type.split(":"); get permissionsString() {
if(comps.length > 1) { if(!this.permissions) {
return "";
this.actionType = comps[0]; // 'watch', 'poll', or 'all' }
this.repeatable = this.actionType == "watch" || this.actionType == "poll"; var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter
this.actionVerb = comps[1]; // http verb : "get", "post", "show" permission += ": ";
this.repeatFrequency = comps[2]; for(var contentType of this.content_types) {
if(contentType == "*") {
permission += "All items";
} else {
permission += contentType;
} }
permission += " ";
}
return permission;
} }
structureContentTypes() { get encryptionModeString() {
return this.structures.map(function(structure){ if(this.verb != "post") {
return structure.type; return null;
}) }
var encryptionMode = "This action accepts data ";
if(this.accepts_encrypted && this.accepts_decrypted) {
encryptionMode += "encrypted or decrypted.";
} else {
if(this.accepts_encrypted) {
encryptionMode += "encrypted.";
} else {
encryptionMode += "decrypted.";
}
}
return encryptionMode;
} }
} }
class Extension extends Item { class Extension extends Item {
@@ -30,6 +50,12 @@ class Extension extends Item {
this.content_type = "Extension"; this.content_type = "Extension";
} }
actionsInGlobalContext() {
return this.actions.filter(function(action){
return action.context == "global";
})
}
mapContentToLocalProperties(contentObject) { mapContentToLocalProperties(contentObject) {
super.mapContentToLocalProperties(contentObject) super.mapContentToLocalProperties(contentObject)
this.name = contentObject.name; this.name = contentObject.name;

View File

@@ -234,6 +234,8 @@ angular.module('app.frontend')
return this.createRequestParamsForItem(item, options.additionalFields); return this.createRequestParamsForItem(item, options.additionalFields);
}.bind(this)); }.bind(this));
console.log("syncing items", request.items);
if(this.syncToken) { if(this.syncToken) {
request.sync_token = this.syncToken; request.sync_token = this.syncToken;
} }
@@ -271,10 +273,14 @@ angular.module('app.frontend')
return this.paramsForItem(item, !item.isPublic(), additionalFields, false); return this.paramsForItem(item, !item.isPublic(), additionalFields, false);
} }
this.paramsForExternalUse = function(item) { this.paramsForExportFile = function(item) {
return _.omit(this.paramsForItem(item, false, ["created_at", "updated_at"], true), ["deleted"]); return _.omit(this.paramsForItem(item, false, ["created_at", "updated_at"], true), ["deleted"]);
} }
this.paramsForExtension = function(item, encrypted) {
return _.omit(this.paramsForItem(item, encrypted, ["created_at", "updated_at"], true), ["deleted"]);
}
this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) { this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {
var itemCopy = _.cloneDeep(item); var itemCopy = _.cloneDeep(item);
@@ -381,7 +387,7 @@ angular.module('app.frontend')
}.bind(this); }.bind(this);
var items = _.map(modelManager.allItemsMatchingTypes(["Tag", "Note"]), function(item){ var items = _.map(modelManager.allItemsMatchingTypes(["Tag", "Note"]), function(item){
return this.paramsForExternalUse(item); return this.paramsForExportFile(item);
}.bind(this)); }.bind(this));
var data = { var data = {

View File

@@ -5,9 +5,13 @@ class ExtensionManager {
this.modelManager = modelManager; this.modelManager = modelManager;
this.apiController = apiController; this.apiController = apiController;
this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem("enabledRepeatActionUrls")) || []; this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem("enabledRepeatActionUrls")) || [];
this.decryptedExtensions = JSON.parse(localStorage.getItem("decryptedExtensions")) || [];
modelManager.addItemSyncObserver("extensionManager", "Extension", function(items){ modelManager.addItemSyncObserver("extensionManager", "Extension", function(items){
for (var ext of items) { for (var ext of items) {
ext.encrypted = this.extensionUsesEncryptedData(ext);
for (var action of ext.actions) { for (var action of ext.actions) {
if(this.enabledRepeatActionUrls.includes(action.url)) { if(this.enabledRepeatActionUrls.includes(action.url)) {
this.enableRepeatAction(action, ext); this.enableRepeatAction(action, ext);
@@ -27,6 +31,24 @@ class ExtensionManager {
} }
} }
extensionUsesEncryptedData(extension) {
return !this.decryptedExtensions.includes(extension.url);
}
changeExtensionEncryptionFormat(encrypted, extension) {
if(encrypted) {
_.pull(this.decryptedExtensions, extension.url);
} else {
this.decryptedExtensions.push(extension.url);
}
localStorage.setItem("decryptedExtensions", JSON.stringify(this.decryptedExtensions))
extension.encrypted = this.extensionUsesEncryptedData(extension);
console.log("ext with dec", this.decryptedExtensions);
}
addExtension(url) { addExtension(url) {
this.retrieveExtensionFromServer(url, null); this.retrieveExtensionFromServer(url, null);
} }
@@ -72,28 +94,42 @@ class ExtensionManager {
} }
} }
executeAction(action, extension, callback) { executeAction(action, extension, item, callback) {
if(action.type == "get") { switch (action.verb) {
this.Restangular.oneUrl(action.url, action.url).get().then(function(response){ case "get": {
console.log("Execute action response", response); this.Restangular.oneUrl(action.url, action.url).get().then(function(response){
var items = response.items; console.log("Execute action response", response);
this.modelManager.mapResponseItemsToLocalModels(items); var items = response.items;
callback(items); this.modelManager.mapResponseItemsToLocalModels(items);
}.bind(this)) callback(items);
} }.bind(this))
else if(action.type == "show") { break;
var win = window.open(action.url, '_blank'); }
win.focus();
callback();
}
else if(action.actionType == "all") { case "show": {
var allItems = this.modelManager.allItemsMatchingTypes(action.structureContentTypes()); var win = window.open(action.url, '_blank');
this.performPost(action, allItems, function(items){ win.focus();
callback(items); callback();
}); }
case "post": {
var items;
if(action.all) {
items = this.modelManager.allItemsMatchingTypes(action.content_types);
} else {
items = [item];
}
this.performPost(action, extension, items, function(items){
callback(items);
});
}
default: {
}
} }
action.lastExecuted = new Date(); action.lastExecuted = new Date();
@@ -105,8 +141,10 @@ 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.removeItemChangeObserver(action.url); this.modelManager.removeItemChangeObserver(action.url);
console.assert(this.isRepeatActionEnabled(action) == false); console.assert(this.isRepeatActionEnabled(action) == false);
} }
@@ -118,16 +156,22 @@ class ExtensionManager {
localStorage.setItem("enabledRepeatActionUrls", JSON.stringify(this.enabledRepeatActionUrls)); localStorage.setItem("enabledRepeatActionUrls", JSON.stringify(this.enabledRepeatActionUrls));
} }
if(action.repeatType == "watch") { if(action.repeat_mode) {
for(var structure of action.structures) {
this.modelManager.addItemChangeObserver(action.url, structure.type, function(changedItems){ if(action.repeat_mode == "watch") {
this.triggerWatchAction(action, changedItems); this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){
this.triggerWatchAction(action, extension, changedItems);
}.bind(this)) }.bind(this))
} }
if(action.repeat_mode == "loop") {
// todo
}
} }
} }
queueAction(action, delay, changedItems) { queueAction(action, extension, delay, changedItems) {
this.actionQueue = this.actionQueue || []; this.actionQueue = this.actionQueue || [];
if(_.find(this.actionQueue, action)) { if(_.find(this.actionQueue, action)) {
return; return;
@@ -137,23 +181,19 @@ class ExtensionManager {
setTimeout(function () { setTimeout(function () {
console.log("Performing queued action", action); console.log("Performing queued action", action);
this.triggerWatchAction(action, changedItems); this.triggerWatchAction(action, extension, changedItems);
_.pull(this.actionQueue, action); _.pull(this.actionQueue, action);
}.bind(this), delay * 1000); }.bind(this), delay * 1000);
} }
outgoingParamsForItem(item) { triggerWatchAction(action, extension, changedItems) {
return this.apiController.paramsForExternalUse(item);
}
triggerWatchAction(action, changedItems) {
// console.log("Watch action triggered", action, changedItems); // console.log("Watch action triggered", action, changedItems);
if(action.repeatFrequency > 0) { if(action.repeat_timeout > 0) {
var lastExecuted = action.lastExecuted; var lastExecuted = action.lastExecuted;
var diffInSeconds = (new Date() - lastExecuted)/1000; var diffInSeconds = (new Date() - lastExecuted)/1000;
console.log("last executed", action.lastExecuted, "diff", diffInSeconds, "repeatFreq", action.repeatFrequency); console.log("last executed", action.lastExecuted, "diff", diffInSeconds, "repeatFreq", action.repeatFrequency);
if(diffInSeconds < action.repeatFrequency) { if(diffInSeconds < action.repeat_timeout) {
var delay = action.repeatFrequency - diffInSeconds; var delay = action.repeat_timeout - diffInSeconds;
console.log("delaying action by", delay); console.log("delaying action by", delay);
this.queueAction(action, delay, changedItems); this.queueAction(action, delay, changedItems);
return; return;
@@ -164,15 +204,21 @@ class ExtensionManager {
action.lastExecuted = new Date(); action.lastExecuted = new Date();
if(action.repeatVerb == "post") { if(action.verb == "post") {
this.performPost(action, changedItems, null); this.performPost(action, extension, changedItems, null);
} else {
// todo
} }
} }
performPost(action, items, callback) { outgoingParamsForItem(item, extension) {
return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));
}
performPost(action, extension, items, callback) {
var request = this.Restangular.oneUrl(action.url, action.url); var request = this.Restangular.oneUrl(action.url, action.url);
request.items = items.map(function(item){ request.items = items.map(function(item){
var params = this.outgoingParamsForItem(item); var params = this.outgoingParamsForItem(item, extension);
return params; return params;
}.bind(this)) }.bind(this))

View File

@@ -10,7 +10,9 @@ class ModelManager {
} }
allItemsMatchingTypes(contentTypes) { allItemsMatchingTypes(contentTypes) {
return this.items.filter(function(item){return contentTypes.includes(item.content_type) && !item.dummy}) return this.items.filter(function(item){
return (contentTypes.includes(item.content_type) || contentTypes.includes("*")) && !item.dummy;
})
} }
findItem(itemId) { findItem(itemId) {
@@ -67,7 +69,10 @@ class ModelManager {
notifyItemChangeObserversOfModels(models) { notifyItemChangeObserversOfModels(models) {
for(var observer of this.itemChangeObservers) { for(var observer of this.itemChangeObservers) {
var relevantItems = models.filter(function(item){return item.content_type == observer.type}); var relevantItems = models.filter(function(item){
return observer.content_types.includes(item.content_type) || observer.content_types.includes("*");
});
if(relevantItems.length > 0) { if(relevantItems.length > 0) {
observer.callback(relevantItems); observer.callback(relevantItems);
} }
@@ -156,8 +161,8 @@ class ModelManager {
_.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id})); _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));
} }
addItemChangeObserver(id, type, callback) { addItemChangeObserver(id, content_types, callback) {
this.itemChangeObservers.push({id: id, type: type, callback: callback}); this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});
} }
removeItemChangeObserver(id) { removeItemChangeObserver(id) {

View File

@@ -302,6 +302,17 @@ Extensions
margin-bottom: 2px; margin-bottom: 2px;
} }
.encryption-format {
margin-top: 4px;
font-size: 12px;
> .title {
font-size: 13px;
font-weight: bold;
margin-bottom: 2px;
}
}
> .subtitle { > .subtitle {
font-size: 14px; font-size: 14px;
margin-bottom: 10px; margin-bottom: 10px;

View File

@@ -91,28 +91,34 @@
.registered-extensions{"ng-if" => "ctrl.extensionManager.extensions.length"} .registered-extensions{"ng-if" => "ctrl.extensionManager.extensions.length"}
.extension{"ng-repeat" => "extension in ctrl.extensionManager.extensions"} .extension{"ng-repeat" => "extension in ctrl.extensionManager.extensions"}
.name {{extension.name}} .name {{extension.name}}
.subtitle Available Actions .encryption-format
.title Send data
%label
%input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "true", "ng-change" => "ctrl.extensionManager.changeExtensionEncryptionFormat(true, extension)"}
Encrypted
%label
%input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "false", "ng-change" => "ctrl.extensionManager.changeExtensionEncryptionFormat(false, extension)"}
Decrypted
.actions .actions
.action{"ng-repeat" => "action in extension.actions"} .action{"ng-repeat" => "action in extension.actionsInGlobalContext()"}
.name {{action.label}} .name {{action.label}}
.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.repeat_mode == 'watch'"}
Repeats at most once every {{action.repeatFrequency}} seconds Repeats when a change is made to your items.
.execute-type{"ng-if" => "action.repeat_mode == 'loop'"}
Repeats at most once every {{action.repeat_timeout}} seconds
.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"} %div{"ng-if" => "action.showPermissions"}
%span{"style" => "font-weight: bold;"} {{structure.type}}s: {{action.permissionsString}}
%span{"ng-if" => "action.actionType == 'all'"} all {{" | "}} .encryption-type
%span{"ng-if" => "action.actionType == 'watch'"} changes {{" | "}} %span {{action.encryptionModeString}}
%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.repeat_mode"}
%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 && !action.running"} %span{"ng-if" => "!action.repeat_mode && !action.running"}
Run Run
%span{"ng-if" => "action.running"} %span{"ng-if" => "action.running"}
.spinner{"style" => "margin-top: 3px;"} .spinner{"style" => "margin-top: 3px;"}

View File

@@ -761,7 +761,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
this.selectedAction = function (action, extension) { this.selectedAction = function (action, extension) {
action.running = true; action.running = true;
extensionManager.executeAction(action, extension, function (response) { extensionManager.executeAction(action, extension, null, function (response) {
action.running = false; action.running = false;
apiController.sync(null); apiController.sync(null);
}); });
@@ -1496,26 +1496,67 @@ var Action = function () {
_classCallCheck(this, Action); _classCallCheck(this, Action);
_.merge(this, json); _.merge(this, json);
this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory
this.actionVerb = this.type;
var comps = this.type.split(":");
if (comps.length > 1) {
this.actionType = comps[0]; // 'watch', 'poll', or 'all'
this.repeatable = this.actionType == "watch" || this.actionType == "poll";
this.actionVerb = comps[1]; // http verb : "get", "post", "show"
this.repeatFrequency = comps[2];
}
} }
_createClass(Action, [{ _createClass(Action, [{
key: 'structureContentTypes', key: 'permissionsString',
value: function structureContentTypes() { get: function get() {
return this.structures.map(function (structure) { if (!this.permissions) {
return structure.type; return "";
}); }
var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter
permission += ": ";
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = this.content_types[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var contentType = _step2.value;
if (contentType == "*") {
permission += "All items";
} else {
permission += contentType;
}
permission += " ";
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return permission;
}
}, {
key: 'encryptionModeString',
get: function get() {
if (this.verb != "post") {
return null;
}
var encryptionMode = "This action accepts data ";
if (this.accepts_encrypted && this.accepts_decrypted) {
encryptionMode += "encrypted or decrypted.";
} else {
if (this.accepts_encrypted) {
encryptionMode += "encrypted.";
} else {
encryptionMode += "decrypted.";
}
}
return encryptionMode;
} }
}]); }]);
@@ -1537,6 +1578,13 @@ var Extension = function (_Item) {
} }
_createClass(Extension, [{ _createClass(Extension, [{
key: 'actionsInGlobalContext',
value: function actionsInGlobalContext() {
return this.actions.filter(function (action) {
return action.context == "global";
});
}
}, {
key: 'mapContentToLocalProperties', key: 'mapContentToLocalProperties',
value: function mapContentToLocalProperties(contentObject) { value: function mapContentToLocalProperties(contentObject) {
_get(Extension.prototype.__proto__ || Object.getPrototypeOf(Extension.prototype), 'mapContentToLocalProperties', this).call(this, contentObject); _get(Extension.prototype.__proto__ || Object.getPrototypeOf(Extension.prototype), 'mapContentToLocalProperties', this).call(this, contentObject);
@@ -1678,29 +1726,29 @@ var Note = function (_Item2) {
}, { }, {
key: 'hasOnePublicTag', key: 'hasOnePublicTag',
get: function get() { get: function get() {
var _iteratorNormalCompletion2 = true; var _iteratorNormalCompletion3 = true;
var _didIteratorError2 = false; var _didIteratorError3 = false;
var _iteratorError2 = undefined; var _iteratorError3 = undefined;
try { try {
for (var _iterator2 = this.tags[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { for (var _iterator3 = this.tags[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var tag = _step2.value; var tag = _step3.value;
if (tag.isPublic()) { if (tag.isPublic()) {
return true; return true;
} }
} }
} 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;
} }
} }
} }
@@ -2043,6 +2091,8 @@ var User = function User(json_obj) {
return this.createRequestParamsForItem(item, options.additionalFields); return this.createRequestParamsForItem(item, options.additionalFields);
}.bind(this)); }.bind(this));
console.log("syncing items", request.items);
if (this.syncToken) { if (this.syncToken) {
request.sync_token = this.syncToken; request.sync_token = this.syncToken;
} }
@@ -2079,10 +2129,14 @@ var User = function User(json_obj) {
return this.paramsForItem(item, !item.isPublic(), additionalFields, false); return this.paramsForItem(item, !item.isPublic(), additionalFields, false);
}; };
this.paramsForExternalUse = function (item) { this.paramsForExportFile = function (item) {
return _.omit(this.paramsForItem(item, false, ["created_at", "updated_at"], true), ["deleted"]); return _.omit(this.paramsForItem(item, false, ["created_at", "updated_at"], true), ["deleted"]);
}; };
this.paramsForExtension = function (item, encrypted) {
return _.omit(this.paramsForItem(item, encrypted, ["created_at", "updated_at"], true), ["deleted"]);
};
this.paramsForItem = function (item, encrypted, additionalFields, forExportFile) { this.paramsForItem = function (item, encrypted, additionalFields, forExportFile) {
var itemCopy = _.cloneDeep(item); var itemCopy = _.cloneDeep(item);
@@ -2190,7 +2244,7 @@ var User = function User(json_obj) {
}.bind(this); }.bind(this);
var items = _.map(modelManager.allItemsMatchingTypes(["Tag", "Note"]), function (item) { var items = _.map(modelManager.allItemsMatchingTypes(["Tag", "Note"]), function (item) {
return this.paramsForExternalUse(item); return this.paramsForExportFile(item);
}.bind(this)); }.bind(this));
var data = { var data = {
@@ -2325,13 +2379,13 @@ var User = function User(json_obj) {
this.decryptItems = function (items) { this.decryptItems = function (items) {
var masterKey = this.retrieveMk(); var masterKey = this.retrieveMk();
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 item = _step3.value; var item = _step4.value;
if (item.deleted == true) { if (item.deleted == true) {
continue; continue;
@@ -2346,16 +2400,16 @@ var User = function User(json_obj) {
} }
} }
} 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;
} }
} }
} }
@@ -2728,53 +2782,58 @@ var ExtensionManager = function () {
this.modelManager = modelManager; this.modelManager = modelManager;
this.apiController = apiController; this.apiController = apiController;
this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem("enabledRepeatActionUrls")) || []; this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem("enabledRepeatActionUrls")) || [];
this.decryptedExtensions = JSON.parse(localStorage.getItem("decryptedExtensions")) || [];
modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) { modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) {
var _iteratorNormalCompletion4 = true; var _iteratorNormalCompletion5 = true;
var _didIteratorError4 = false; var _didIteratorError5 = false;
var _iteratorError4 = undefined; var _iteratorError5 = undefined;
try { try {
for (var _iterator4 = items[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var ext = _step4.value; var ext = _step5.value;
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined; ext.encrypted = this.extensionUsesEncryptedData(ext);
var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
try { try {
for (var _iterator5 = ext.actions[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { for (var _iterator6 = ext.actions[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var action = _step5.value; var action = _step6.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) {
_didIteratorError5 = true; _didIteratorError6 = true;
_iteratorError5 = err; _iteratorError6 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion5 && _iterator5.return) { if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator5.return(); _iterator6.return();
} }
} finally { } finally {
if (_didIteratorError5) { if (_didIteratorError6) {
throw _iteratorError5; throw _iteratorError6;
} }
} }
} }
} }
} 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;
} }
} }
} }
@@ -2784,31 +2843,51 @@ var ExtensionManager = function () {
_createClass(ExtensionManager, [{ _createClass(ExtensionManager, [{
key: 'actionWithURL', key: 'actionWithURL',
value: function actionWithURL(url) { value: function actionWithURL(url) {
var _iteratorNormalCompletion6 = true; var _iteratorNormalCompletion7 = true;
var _didIteratorError6 = false; var _didIteratorError7 = false;
var _iteratorError6 = undefined; var _iteratorError7 = undefined;
try { try {
for (var _iterator6 = this.extensions[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { for (var _iterator7 = this.extensions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var extension = _step6.value; var extension = _step7.value;
return _.find(extension.actions, { url: url }); return _.find(extension.actions, { url: url });
} }
} catch (err) { } catch (err) {
_didIteratorError6 = true; _didIteratorError7 = true;
_iteratorError6 = err; _iteratorError7 = err;
} finally { } finally {
try { try {
if (!_iteratorNormalCompletion6 && _iterator6.return) { if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator6.return(); _iterator7.return();
} }
} finally { } finally {
if (_didIteratorError6) { if (_didIteratorError7) {
throw _iteratorError6; throw _iteratorError7;
} }
} }
} }
} }
}, {
key: 'extensionUsesEncryptedData',
value: function extensionUsesEncryptedData(extension) {
return !this.decryptedExtensions.includes(extension.url);
}
}, {
key: 'changeExtensionEncryptionFormat',
value: function changeExtensionEncryptionFormat(encrypted, extension) {
if (encrypted) {
_.pull(this.decryptedExtensions, extension.url);
} else {
this.decryptedExtensions.push(extension.url);
}
localStorage.setItem("decryptedExtensions", JSON.stringify(this.decryptedExtensions));
extension.encrypted = this.extensionUsesEncryptedData(extension);
console.log("ext with dec", this.decryptedExtensions);
}
}, { }, {
key: 'addExtension', key: 'addExtension',
value: function addExtension(url) { value: function addExtension(url) {
@@ -2846,43 +2925,16 @@ var ExtensionManager = function () {
}, { }, {
key: 'refreshExtensionsFromServer', key: 'refreshExtensionsFromServer',
value: function refreshExtensionsFromServer() { value: function refreshExtensionsFromServer() {
var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false;
var _iteratorError7 = undefined;
try {
for (var _iterator7 = this.enabledRepeatActionUrls[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var url = _step7.value;
var action = this.actionWithURL(url);
this.disableRepeatAction(action);
}
} catch (err) {
_didIteratorError7 = true;
_iteratorError7 = err;
} finally {
try {
if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator7.return();
}
} finally {
if (_didIteratorError7) {
throw _iteratorError7;
}
}
}
var _iteratorNormalCompletion8 = true; var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false; var _didIteratorError8 = false;
var _iteratorError8 = undefined; var _iteratorError8 = undefined;
try { try {
for (var _iterator8 = this.extensions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { for (var _iterator8 = this.enabledRepeatActionUrls[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var ext = _step8.value; var url = _step8.value;
this.retrieveExtensionFromServer(ext.url, function (extension) { var action = this.actionWithURL(url);
extension.setDirty(true); this.disableRepeatAction(action);
});
} }
} catch (err) { } catch (err) {
_didIteratorError8 = true; _didIteratorError8 = true;
@@ -2898,27 +2950,74 @@ var ExtensionManager = function () {
} }
} }
} }
var _iteratorNormalCompletion9 = true;
var _didIteratorError9 = false;
var _iteratorError9 = undefined;
try {
for (var _iterator9 = this.extensions[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
var ext = _step9.value;
this.retrieveExtensionFromServer(ext.url, function (extension) {
extension.setDirty(true);
});
}
} catch (err) {
_didIteratorError9 = true;
_iteratorError9 = err;
} finally {
try {
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
}
} finally {
if (_didIteratorError9) {
throw _iteratorError9;
}
}
}
} }
}, { }, {
key: 'executeAction', key: 'executeAction',
value: function executeAction(action, extension, callback) { value: function executeAction(action, extension, item, callback) {
if (action.type == "get") { switch (action.verb) {
this.Restangular.oneUrl(action.url, action.url).get().then(function (response) { case "get":
console.log("Execute action response", response); {
var items = response.items; this.Restangular.oneUrl(action.url, action.url).get().then(function (response) {
this.modelManager.mapResponseItemsToLocalModels(items); console.log("Execute action response", response);
callback(items); var items = response.items;
}.bind(this)); this.modelManager.mapResponseItemsToLocalModels(items);
} else if (action.type == "show") { callback(items);
var win = window.open(action.url, '_blank'); }.bind(this));
win.focus();
callback(); break;
} else if (action.actionType == "all") { }
var allItems = this.modelManager.allItemsMatchingTypes(action.structureContentTypes());
this.performPost(action, allItems, function (items) { case "show":
callback(items); {
}); var win = window.open(action.url, '_blank');
win.focus();
callback();
}
case "post":
{
var items;
if (action.all) {
items = this.modelManager.allItemsMatchingTypes(action.content_types);
} else {
items = [item];
}
this.performPost(action, extension, items, function (items) {
callback(items);
});
}
default:
{}
} }
action.lastExecuted = new Date(); action.lastExecuted = new Date();
@@ -2932,8 +3031,10 @@ var ExtensionManager = function () {
key: 'disableRepeatAction', key: 'disableRepeatAction',
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.removeItemChangeObserver(action.url); this.modelManager.removeItemChangeObserver(action.url);
console.assert(this.isRepeatActionEnabled(action) == false); console.assert(this.isRepeatActionEnabled(action) == false);
} }
}, { }, {
@@ -2946,38 +3047,22 @@ var ExtensionManager = function () {
localStorage.setItem("enabledRepeatActionUrls", JSON.stringify(this.enabledRepeatActionUrls)); localStorage.setItem("enabledRepeatActionUrls", JSON.stringify(this.enabledRepeatActionUrls));
} }
if (action.repeatType == "watch") { if (action.repeat_mode) {
var _iteratorNormalCompletion9 = true;
var _didIteratorError9 = false;
var _iteratorError9 = undefined;
try { if (action.repeat_mode == "watch") {
for (var _iterator9 = action.structures[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { this.modelManager.addItemChangeObserver(action.url, action.content_types, function (changedItems) {
var structure = _step9.value; this.triggerWatchAction(action, extension, changedItems);
}.bind(this));
}
this.modelManager.addItemChangeObserver(action.url, structure.type, function (changedItems) { if (action.repeat_mode == "loop") {
this.triggerWatchAction(action, changedItems); // todo
}.bind(this));
}
} catch (err) {
_didIteratorError9 = true;
_iteratorError9 = err;
} finally {
try {
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
}
} finally {
if (_didIteratorError9) {
throw _iteratorError9;
}
}
} }
} }
} }
}, { }, {
key: 'queueAction', key: 'queueAction',
value: function queueAction(action, delay, changedItems) { value: function queueAction(action, extension, delay, changedItems) {
this.actionQueue = this.actionQueue || []; this.actionQueue = this.actionQueue || [];
if (_.find(this.actionQueue, action)) { if (_.find(this.actionQueue, action)) {
return; return;
@@ -2987,25 +3072,20 @@ var ExtensionManager = function () {
setTimeout(function () { setTimeout(function () {
console.log("Performing queued action", action); console.log("Performing queued action", action);
this.triggerWatchAction(action, changedItems); this.triggerWatchAction(action, extension, changedItems);
_.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.paramsForExternalUse(item);
}
}, { }, {
key: 'triggerWatchAction', key: 'triggerWatchAction',
value: function triggerWatchAction(action, changedItems) { value: function triggerWatchAction(action, extension, changedItems) {
// console.log("Watch action triggered", action, changedItems); // console.log("Watch action triggered", action, changedItems);
if (action.repeatFrequency > 0) { if (action.repeat_timeout > 0) {
var lastExecuted = action.lastExecuted; var lastExecuted = action.lastExecuted;
var diffInSeconds = (new Date() - lastExecuted) / 1000; var diffInSeconds = (new Date() - lastExecuted) / 1000;
console.log("last executed", action.lastExecuted, "diff", diffInSeconds, "repeatFreq", action.repeatFrequency); console.log("last executed", action.lastExecuted, "diff", diffInSeconds, "repeatFreq", action.repeatFrequency);
if (diffInSeconds < action.repeatFrequency) { if (diffInSeconds < action.repeat_timeout) {
var delay = action.repeatFrequency - diffInSeconds; var delay = action.repeat_timeout - diffInSeconds;
console.log("delaying action by", delay); console.log("delaying action by", delay);
this.queueAction(action, delay, changedItems); this.queueAction(action, delay, changedItems);
return; return;
@@ -3016,16 +3096,23 @@ var ExtensionManager = function () {
action.lastExecuted = new Date(); action.lastExecuted = new Date();
if (action.repeatVerb == "post") { if (action.verb == "post") {
this.performPost(action, changedItems, null); this.performPost(action, extension, changedItems, null);
} else {
// todo
} }
} }
}, {
key: 'outgoingParamsForItem',
value: function outgoingParamsForItem(item, extension) {
return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));
}
}, { }, {
key: 'performPost', key: 'performPost',
value: function performPost(action, items, callback) { value: function performPost(action, extension, items, callback) {
var request = this.Restangular.oneUrl(action.url, action.url); var request = this.Restangular.oneUrl(action.url, action.url);
request.items = items.map(function (item) { request.items = items.map(function (item) {
var params = this.outgoingParamsForItem(item); var params = this.outgoingParamsForItem(item, extension);
return params; return params;
}.bind(this)); }.bind(this));
@@ -3091,7 +3178,7 @@ var ModelManager = function () {
key: 'allItemsMatchingTypes', key: 'allItemsMatchingTypes',
value: function allItemsMatchingTypes(contentTypes) { value: function allItemsMatchingTypes(contentTypes) {
return this.items.filter(function (item) { return this.items.filter(function (item) {
return contentTypes.includes(item.content_type) && !item.dummy; return (contentTypes.includes(item.content_type) || contentTypes.includes("*")) && !item.dummy;
}); });
} }
}, { }, {
@@ -3206,8 +3293,9 @@ var ModelManager = function () {
var observer = _step12.value; var observer = _step12.value;
var relevantItems = models.filter(function (item) { var relevantItems = models.filter(function (item) {
return item.content_type == observer.type; return observer.content_types.includes(item.content_type) || observer.content_types.includes("*");
}); });
if (relevantItems.length > 0) { if (relevantItems.length > 0) {
observer.callback(relevantItems); observer.callback(relevantItems);
} }
@@ -3340,8 +3428,8 @@ var ModelManager = function () {
} }
}, { }, {
key: 'addItemChangeObserver', key: 'addItemChangeObserver',
value: function addItemChangeObserver(id, type, callback) { value: function addItemChangeObserver(id, content_types, callback) {
this.itemChangeObservers.push({ id: id, type: type, callback: callback }); this.itemChangeObservers.push({ id: id, content_types: content_types, callback: callback });
} }
}, { }, {
key: 'removeItemChangeObserver', key: 'removeItemChangeObserver',

File diff suppressed because one or more lines are too long