indexeddb implementation, #15

This commit is contained in:
Mo Bitar
2017-01-11 17:50:47 -06:00
parent 7459df9b5a
commit 3ffc9ee667
9 changed files with 600 additions and 281 deletions

View File

@@ -1,6 +1,11 @@
class BaseCtrl {
constructor($rootScope, modelManager, apiController) {
constructor($rootScope, modelManager, apiController, dbManager) {
apiController.getCurrentUser(function(){});
dbManager.openDatabase(null, function(){
// new database, delete syncToken so that items can be refetched entirely from server
apiController.clearSyncToken();
apiController.sync();
})
}
}

View File

@@ -2,18 +2,21 @@ angular.module('app.frontend')
.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {
$rootScope.bodyClass = "app-body-class";
apiController.loadLocalItems();
apiController.loadLocalItems(function(items){
$scope.$apply();
apiController.sync(null);
// refresh every 30s
setInterval(function () {
apiController.sync(null);
}, 30000);
});
$scope.allTag = new Tag({all: true});
$scope.allTag.title = "All";
$scope.tags = modelManager.tags;
$scope.allTag.notes = modelManager.notes;
apiController.sync(null);
// refresh every 30s
setInterval(function () {
apiController.sync(null);
}, 30000);
/*
Tags Ctrl Callbacks
*/

View File

@@ -20,11 +20,11 @@ angular.module('app.frontend')
}
this.$get = function($rootScope, Restangular, modelManager, ngDialog) {
return new ApiController($rootScope, Restangular, modelManager, ngDialog);
this.$get = function($rootScope, Restangular, modelManager, ngDialog, dbManager) {
return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);
}
function ApiController($rootScope, Restangular, modelManager, ngDialog) {
function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {
this.user = {};
this.syncToken = localStorage.getItem("syncToken");
@@ -213,44 +213,62 @@ angular.module('app.frontend')
}
this.syncWithOptions = function(callback, options = {}) {
var dirtyItems = modelManager.getDirtyItems();
this.writeItemsToLocalStorage(dirtyItems, function(responseItems){
if(!this.isUserSignedIn()) {
// delete anything needing to be deleted
dirtyItems.forEach(function(item){
if(item.deleted) {
modelManager.removeItemLocally(item);
}
}.bind(this))
modelManager.clearDirtyItems();
if(callback) {
callback();
}
}
}.bind(this))
if(!this.isUserSignedIn()) {
if(this.syncOpInProgress) {
// will perform anoter sync after current completes
this.repeatSync = true;
return;
}
this.syncOpInProgress = true;
var allDirtyItems = modelManager.getDirtyItems();
let submitLimit = 100;
var dirtyItems = allDirtyItems.slice(0, submitLimit);
if(dirtyItems.length < allDirtyItems.length) {
// more items left to be synced, repeat
this.repeatSync = true;
} else {
this.repeatSync = false;
}
if(!this.isUserSignedIn()) {
this.writeItemsToLocalStorage(dirtyItems, function(responseItems){
// delete anything needing to be deleted
dirtyItems.forEach(function(item){
if(item.deleted) {
modelManager.removeItemLocally(item);
}
}.bind(this))
modelManager.clearDirtyItems(dirtyItems);
if(callback) {
callback();
}
}.bind(this))
return;
}
var request = Restangular.one("items/sync");
request.limit = 150;
request.sync_token = this.syncToken;
request.cursor_token = this.cursorToken;
request.items = _.map(dirtyItems, function(item){
return this.createRequestParamsForItem(item, options.additionalFields);
}.bind(this));
// console.log("syncing items", request.items);
if(this.syncToken) {
request.sync_token = this.syncToken;
}
request.post().then(function(response) {
modelManager.clearDirtyItems();
modelManager.clearDirtyItems(dirtyItems);
// handle sync token
this.setSyncToken(response.sync_token);
$rootScope.$broadcast("sync:updated_token", this.syncToken);
// handle cursor token (more results waiting, perform another sync)
this.cursorToken = response.cursor_token;
var retrieved = this.handleItemsResponse(response.retrieved_items, null);
// merge only metadata for saved items
var omitFields = ["content", "enc_item_key", "auth_hash"];
@@ -261,9 +279,16 @@ angular.module('app.frontend')
this.writeItemsToLocalStorage(saved, null);
this.writeItemsToLocalStorage(retrieved, null);
if(callback) {
callback(response);
this.syncOpInProgress = false;
if(this.cursorToken || this.repeatSync == true) {
this.syncWithOptions(callback, options);
} else {
if(callback) {
callback(response);
}
}
}.bind(this))
.catch(function(response){
console.log("Sync error: ", response);
@@ -388,6 +413,11 @@ angular.module('app.frontend')
Import
*/
this.clearSyncToken = function() {
this.syncToken = null;
localStorage.removeItem("syncToken");
}
this.importJSONData = function(data, password, callback) {
console.log("Importing data", data);
@@ -488,27 +518,20 @@ angular.module('app.frontend')
}
this.writeItemsToLocalStorage = function(items, callback) {
for(var item of items) {
var params = this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false)
localStorage.setItem("item-" + item.uuid, JSON.stringify(params));
}
if(callback) {
callback(items);
}
var params = items.map(function(item) {
return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false)
}.bind(this));
dbManager.saveItems(params, callback);
}
this.loadLocalItems = function() {
var itemsParams = [];
for (var i = 0; i < localStorage.length; i++){
var key = localStorage.key(i);
if(key.startsWith("item-")) {
var item = localStorage.getItem(key);
itemsParams.push(JSON.parse(item));
}
}
this.loadLocalItems = function(callback) {
var params = dbManager.getAllItems(function(items){
var items = this.handleItemsResponse(items, null);
Item.sortItemsByDate(items);
callback(items);
}.bind(this))
var items = this.handleItemsResponse(itemsParams, null);
Item.sortItemsByDate(items);
}
/*

View File

@@ -0,0 +1,120 @@
class DBManager {
openDatabase(callback, onUgradeNeeded) {
var request = window.indexedDB.open("standardnotes", 1);
request.onerror = function(event) {
alert("Please enable permissions for Standard Notes to use IndexedDB for offline mode.");
if(callback) {
callback(null);
}
};
request.onsuccess = (event) => {
// console.log("Successfully opened database", event.target.result);
var db = event.target.result;
db.onerror = function(errorEvent) {
console.log("Database error: " + errorEvent.target.errorCode);
}
if(callback) {
callback(db);
}
};
request.onupgradeneeded = (event) => {
var db = event.target.result;
if(db.version === 1) {
if(onUgradeNeeded) {
onUgradeNeeded();
}
}
// Create an objectStore for this database
var objectStore = db.createObjectStore("items", { keyPath: "uuid" });
objectStore.createIndex("title", "title", { unique: false });
objectStore.createIndex("uuid", "uuid", { unique: true });
objectStore.transaction.oncomplete = function(event) {
// Ready to store values in the newly created objectStore.
};
};
}
getAllItems(callback) {
this.openDatabase((db) => {
var objectStore = db.transaction("items").objectStore("items");
var items = [];
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
items.push(cursor.value);
cursor.continue();
}
else {
callback(items);
}
};
}, null)
}
saveItem(item) {
saveItems([item]);
}
saveItems(items, callback) {
if(items.length == 0) {
if(callback) {
callback();
}
return;
}
this.openDatabase((db) => {
var transaction = db.transaction("items", "readwrite");
transaction.oncomplete = function(event) {
};
transaction.onerror = function(event) {
console.log("Transaction error:", event.target.errorCode);
};
var itemObjectStore = transaction.objectStore("items");
var i = 0;
putNext();
function putNext() {
if (i < items.length) {
var item = items[i];
itemObjectStore.put(item).onsuccess = putNext;
++i;
} else {
if(callback){
callback();
}
}
}
}, null)
}
deleteItem(item) {
this.openDatabase((db) => {
var request = db.transaction("items", "readwrite").objectStore("items").delete(item.uuid);
request.onsuccess = function(event) {
console.log("Successfully deleted item", item.uuid);
};
}, null)
}
getItemByUUID(uuid, callback) {
this.openDatabase((db) => {
var request = db.transaction("items", "readonly").objectStore("items").get(uuid);
request.onsuccess = function(event) {
callback(event.result);
};
}, null);
}
}
angular.module('app.frontend').service('dbManager', DBManager);

View File

@@ -189,10 +189,14 @@ class ModelManager {
return this.items.filter(function(item){return item.dirty == true && !item.dummy})
}
clearDirtyItems() {
this.getDirtyItems().forEach(function(item){
clearDirtyItems(items) {
for(var item of items) {
item.setDirty(false);
})
}
}
clearAllDirtyItems() {
this.clearDirtyItems(this.getDirtyItems());
}
setItemToBeDeleted(item) {

View File

@@ -2,11 +2,10 @@
.app-container
.app
%tags-section{"save" => "tagsSave", "add-new" => "tagsAddNew", "will-select" => "tagsWillMakeSelection", "selection-made" => "tagsSelectionMade", "all-tag" => "allTag",
"tags" => "tags", "user" => "defaultUser", "update-note-tag" => "tagsUpdateNoteTag"}
"tags" => "tags", "update-note-tag" => "tagsUpdateNoteTag"}
%notes-section{"remove-tag" => "notesRemoveTag", "user" => "defaultUser", "add-new" => "notesAddNew", "selection-made" => "notesSelectionMade",
%notes-section{"remove-tag" => "notesRemoveTag", "add-new" => "notesAddNew", "selection-made" => "notesSelectionMade",
"tag" => "selectedTag", "remove" => "deleteNote"}
%editor-section{"ng-if" => "selectedNote", "note" => "selectedNote", "remove" => "deleteNote",
"user" => "defaultUser", "save" => "saveNote"}
%editor-section{"ng-if" => "selectedNote", "note" => "selectedNote", "remove" => "deleteNote", "save" => "saveNote"}
%header{"user" => "defaultUser"}

View File

@@ -29,7 +29,7 @@
<meta name="og:description" content="Standard Notes is a basic notes app that delivers only the essentials in note taking. Because of its simplicity and resistance to growth, users can count on durability and convenience."/>
<% if Rails.env.development? %>
<%= javascript_include_tag "compiled.min.js", debug: true %>
<%= javascript_include_tag "compiled.js", debug: true %>
<% else %>
<%= javascript_include_tag "compiled.min.js", debug: false %>
<% end %>

View File

@@ -425,10 +425,15 @@ angular.module('app.frontend', ['ui.router', 'restangular', 'ngDialog']).config(
$locationProvider.html5Mode(true);
});
;
var BaseCtrl = function BaseCtrl($rootScope, modelManager, apiController) {
var BaseCtrl = function BaseCtrl($rootScope, modelManager, apiController, dbManager) {
_classCallCheck(this, BaseCtrl);
apiController.getCurrentUser(function () {});
dbManager.openDatabase(null, function () {
// new database, delete syncToken so that items can be refetched entirely from server
apiController.clearSyncToken();
apiController.sync();
});
};
angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
@@ -945,18 +950,21 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl);
;angular.module('app.frontend').controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {
$rootScope.bodyClass = "app-body-class";
apiController.loadLocalItems();
apiController.loadLocalItems(function (items) {
$scope.$apply();
apiController.sync(null);
// refresh every 30s
setInterval(function () {
apiController.sync(null);
}, 30000);
});
$scope.allTag = new Tag({ all: true });
$scope.allTag.title = "All";
$scope.tags = modelManager.tags;
$scope.allTag.notes = modelManager.notes;
apiController.sync(null);
// refresh every 30s
setInterval(function () {
apiController.sync(null);
}, 30000);
/*
Tags Ctrl Callbacks
*/
@@ -1921,11 +1929,11 @@ var Tag = function (_Item3) {
return url;
};
this.$get = function ($rootScope, Restangular, modelManager, ngDialog) {
return new ApiController($rootScope, Restangular, modelManager, ngDialog);
this.$get = function ($rootScope, Restangular, modelManager, ngDialog, dbManager) {
return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);
};
function ApiController($rootScope, Restangular, modelManager, ngDialog) {
function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {
this.user = {};
this.syncToken = localStorage.getItem("syncToken");
@@ -2109,43 +2117,62 @@ var Tag = function (_Item3) {
this.syncWithOptions = function (callback) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var dirtyItems = modelManager.getDirtyItems();
this.writeItemsToLocalStorage(dirtyItems, function (responseItems) {
if (!this.isUserSignedIn()) {
if (this.syncOpInProgress) {
// will perform anoter sync after current completes
this.repeatSync = true;
return;
}
this.syncOpInProgress = true;
var allDirtyItems = modelManager.getDirtyItems();
var submitLimit = 100;
var dirtyItems = allDirtyItems.slice(0, submitLimit);
if (dirtyItems.length < allDirtyItems.length) {
// more items left to be synced, repeat
this.repeatSync = true;
} else {
this.repeatSync = false;
}
if (!this.isUserSignedIn()) {
this.writeItemsToLocalStorage(dirtyItems, function (responseItems) {
// delete anything needing to be deleted
dirtyItems.forEach(function (item) {
if (item.deleted) {
modelManager.removeItemLocally(item);
}
}.bind(this));
modelManager.clearDirtyItems();
modelManager.clearDirtyItems(dirtyItems);
if (callback) {
callback();
}
}
}.bind(this));
}.bind(this));
if (!this.isUserSignedIn()) {
return;
}
var request = Restangular.one("items/sync");
request.limit = 150;
request.sync_token = this.syncToken;
request.cursor_token = this.cursorToken;
request.items = _.map(dirtyItems, function (item) {
return this.createRequestParamsForItem(item, options.additionalFields);
}.bind(this));
// console.log("syncing items", request.items);
if (this.syncToken) {
request.sync_token = this.syncToken;
}
request.post().then(function (response) {
modelManager.clearDirtyItems();
modelManager.clearDirtyItems(dirtyItems);
// handle sync token
this.setSyncToken(response.sync_token);
$rootScope.$broadcast("sync:updated_token", this.syncToken);
// handle cursor token (more results waiting, perform another sync)
this.cursorToken = response.cursor_token;
var retrieved = this.handleItemsResponse(response.retrieved_items, null);
// merge only metadata for saved items
var omitFields = ["content", "enc_item_key", "auth_hash"];
@@ -2156,8 +2183,14 @@ var Tag = function (_Item3) {
this.writeItemsToLocalStorage(saved, null);
this.writeItemsToLocalStorage(retrieved, null);
if (callback) {
callback(response);
this.syncOpInProgress = false;
if (this.cursorToken || this.repeatSync == true) {
this.syncWithOptions(callback, options);
} else {
if (callback) {
callback(response);
}
}
}.bind(this)).catch(function (response) {
console.log("Sync error: ", response);
@@ -2302,6 +2335,11 @@ var Tag = function (_Item3) {
Import
*/
this.clearSyncToken = function () {
this.syncToken = null;
localStorage.removeItem("syncToken");
};
this.importJSONData = function (data, password, callback) {
console.log("Importing data", data);
@@ -2398,49 +2436,19 @@ var Tag = function (_Item3) {
};
this.writeItemsToLocalStorage = function (items, callback) {
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
var params = items.map(function (item) {
return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false);
}.bind(this));
try {
for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var item = _step5.value;
var params = this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false);
localStorage.setItem("item-" + item.uuid, JSON.stringify(params));
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
if (callback) {
callback(items);
}
dbManager.saveItems(params, callback);
};
this.loadLocalItems = function () {
var itemsParams = [];
for (var i = 0; i < localStorage.length; i++) {
var key = localStorage.key(i);
if (key.startsWith("item-")) {
var item = localStorage.getItem(key);
itemsParams.push(JSON.parse(item));
}
}
var items = this.handleItemsResponse(itemsParams, null);
Item.sortItemsByDate(items);
this.loadLocalItems = function (callback) {
var params = dbManager.getAllItems(function (items) {
var items = this.handleItemsResponse(items, null);
Item.sortItemsByDate(items);
callback(items);
}.bind(this));
};
/*
@@ -2523,13 +2531,13 @@ var Tag = function (_Item3) {
};
this.decryptItemsWithKey = function (items, key) {
var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator6 = items[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var item = _step6.value;
for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var item = _step5.value;
if (item.deleted == true) {
continue;
@@ -2546,16 +2554,16 @@ var Tag = function (_Item3) {
}
}
} catch (err) {
_didIteratorError6 = true;
_iteratorError6 = err;
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator6.return();
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError6) {
throw _iteratorError6;
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
@@ -2578,6 +2586,137 @@ var Tag = function (_Item3) {
};
}
});
;
var DBManager = function () {
function DBManager() {
_classCallCheck(this, DBManager);
}
_createClass(DBManager, [{
key: 'openDatabase',
value: function openDatabase(callback, onUgradeNeeded) {
var request = window.indexedDB.open("standardnotes", 1);
request.onerror = function (event) {
alert("Please enable permissions for Standard Notes to use IndexedDB for offline mode.");
if (callback) {
callback(null);
}
};
request.onsuccess = function (event) {
// console.log("Successfully opened database", event.target.result);
var db = event.target.result;
db.onerror = function (errorEvent) {
console.log("Database error: " + errorEvent.target.errorCode);
};
if (callback) {
callback(db);
}
};
request.onupgradeneeded = function (event) {
var db = event.target.result;
if (db.version === 1) {
if (onUgradeNeeded) {
onUgradeNeeded();
}
}
// Create an objectStore for this database
var objectStore = db.createObjectStore("items", { keyPath: "uuid" });
objectStore.createIndex("title", "title", { unique: false });
objectStore.createIndex("uuid", "uuid", { unique: true });
objectStore.transaction.oncomplete = function (event) {
// Ready to store values in the newly created objectStore.
};
};
}
}, {
key: 'getAllItems',
value: function getAllItems(callback) {
this.openDatabase(function (db) {
var objectStore = db.transaction("items").objectStore("items");
var items = [];
objectStore.openCursor().onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
items.push(cursor.value);
cursor.continue();
} else {
callback(items);
}
};
}, null);
}
}, {
key: 'saveItem',
value: function saveItem(item) {
saveItems([item]);
}
}, {
key: 'saveItems',
value: function saveItems(items, callback) {
if (items.length == 0) {
if (callback) {
callback();
}
return;
}
this.openDatabase(function (db) {
var transaction = db.transaction("items", "readwrite");
transaction.oncomplete = function (event) {};
transaction.onerror = function (event) {
console.log("Transaction error:", event.target.errorCode);
};
var itemObjectStore = transaction.objectStore("items");
var i = 0;
putNext();
function putNext() {
if (i < items.length) {
var item = items[i];
itemObjectStore.put(item).onsuccess = putNext;
++i;
} else {
if (callback) {
callback();
}
}
}
}, null);
}
}, {
key: 'deleteItem',
value: function deleteItem(item) {
this.openDatabase(function (db) {
var request = db.transaction("items", "readwrite").objectStore("items").delete(item.uuid);
request.onsuccess = function (event) {
console.log("Successfully deleted item", item.uuid);
};
}, null);
}
}, {
key: 'getItemByUUID',
value: function getItemByUUID(uuid, callback) {
this.openDatabase(function (db) {
var request = db.transaction("items", "readonly").objectStore("items").get(uuid);
request.onsuccess = function (event) {
callback(event.result);
};
}, null);
}
}]);
return DBManager;
}();
angular.module('app.frontend').service('dbManager', DBManager);
;angular.module('app.frontend').directive('mbAutofocus', ['$timeout', function ($timeout) {
return {
restrict: 'A',
@@ -2770,55 +2909,55 @@ var ExtensionManager = function () {
this.decryptedExtensions = JSON.parse(localStorage.getItem("decryptedExtensions")) || [];
modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) {
var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false;
var _iteratorError7 = undefined;
var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
try {
for (var _iterator7 = items[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var ext = _step7.value;
for (var _iterator6 = items[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var ext = _step6.value;
ext.encrypted = this.extensionUsesEncryptedData(ext);
var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false;
var _iteratorError8 = undefined;
var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false;
var _iteratorError7 = undefined;
try {
for (var _iterator8 = ext.actions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var action = _step8.value;
for (var _iterator7 = ext.actions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var action = _step7.value;
if (this.enabledRepeatActionUrls.includes(action.url)) {
this.enableRepeatAction(action, ext);
}
}
} catch (err) {
_didIteratorError8 = true;
_iteratorError8 = err;
_didIteratorError7 = true;
_iteratorError7 = err;
} finally {
try {
if (!_iteratorNormalCompletion8 && _iterator8.return) {
_iterator8.return();
if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator7.return();
}
} finally {
if (_didIteratorError8) {
throw _iteratorError8;
if (_didIteratorError7) {
throw _iteratorError7;
}
}
}
}
} catch (err) {
_didIteratorError7 = true;
_iteratorError7 = err;
_didIteratorError6 = true;
_iteratorError6 = err;
} finally {
try {
if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator7.return();
if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator6.return();
}
} finally {
if (_didIteratorError7) {
throw _iteratorError7;
if (_didIteratorError6) {
throw _iteratorError6;
}
}
}
@@ -2835,27 +2974,27 @@ var ExtensionManager = function () {
}, {
key: 'actionWithURL',
value: function actionWithURL(url) {
var _iteratorNormalCompletion9 = true;
var _didIteratorError9 = false;
var _iteratorError9 = undefined;
var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false;
var _iteratorError8 = undefined;
try {
for (var _iterator9 = this.extensions[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
var extension = _step9.value;
for (var _iterator8 = this.extensions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var extension = _step8.value;
return _.find(extension.actions, { url: url });
}
} catch (err) {
_didIteratorError9 = true;
_iteratorError9 = err;
_didIteratorError8 = true;
_iteratorError8 = err;
} finally {
try {
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
if (!_iteratorNormalCompletion8 && _iterator8.return) {
_iterator8.return();
}
} finally {
if (_didIteratorError9) {
throw _iteratorError9;
if (_didIteratorError8) {
throw _iteratorError8;
}
}
}
@@ -2886,13 +3025,13 @@ var ExtensionManager = function () {
}, {
key: 'deleteExtension',
value: function deleteExtension(extension) {
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
var _iteratorNormalCompletion9 = true;
var _didIteratorError9 = false;
var _iteratorError9 = undefined;
try {
for (var _iterator10 = extension.actions[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var action = _step10.value;
for (var _iterator9 = extension.actions[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
var action = _step9.value;
_.pull(this.decryptedExtensions, extension);
if (action.repeat_mode) {
@@ -2902,16 +3041,16 @@ var ExtensionManager = function () {
}
}
} catch (err) {
_didIteratorError10 = true;
_iteratorError10 = err;
_didIteratorError9 = true;
_iteratorError9 = err;
} finally {
try {
if (!_iteratorNormalCompletion10 && _iterator10.return) {
_iterator10.return();
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
}
} finally {
if (_didIteratorError10) {
throw _iteratorError10;
if (_didIteratorError9) {
throw _iteratorError9;
}
}
}
@@ -2951,19 +3090,46 @@ var ExtensionManager = function () {
}, {
key: 'refreshExtensionsFromServer',
value: function refreshExtensionsFromServer() {
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
try {
for (var _iterator11 = this.enabledRepeatActionUrls[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var url = _step11.value;
for (var _iterator10 = this.enabledRepeatActionUrls[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var url = _step10.value;
var action = this.actionWithURL(url);
if (action) {
this.disableRepeatAction(action);
}
}
} catch (err) {
_didIteratorError10 = true;
_iteratorError10 = err;
} finally {
try {
if (!_iteratorNormalCompletion10 && _iterator10.return) {
_iterator10.return();
}
} finally {
if (_didIteratorError10) {
throw _iteratorError10;
}
}
}
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
try {
for (var _iterator11 = this.extensions[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var ext = _step11.value;
this.retrieveExtensionFromServer(ext.url, function (extension) {
extension.setDirty(true);
});
}
} catch (err) {
_didIteratorError11 = true;
_iteratorError11 = err;
@@ -2978,33 +3144,6 @@ var ExtensionManager = function () {
}
}
}
var _iteratorNormalCompletion12 = true;
var _didIteratorError12 = false;
var _iteratorError12 = undefined;
try {
for (var _iterator12 = this.extensions[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
var ext = _step12.value;
this.retrieveExtensionFromServer(ext.url, function (extension) {
extension.setDirty(true);
});
}
} catch (err) {
_didIteratorError12 = true;
_iteratorError12 = err;
} finally {
try {
if (!_iteratorNormalCompletion12 && _iterator12.return) {
_iterator12.return();
}
} finally {
if (_didIteratorError12) {
throw _iteratorError12;
}
}
}
}
}, {
key: 'executeAction',
@@ -3245,13 +3384,13 @@ var ModelManager = function () {
key: 'mapResponseItemsToLocalModelsOmittingFields',
value: function mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {
var models = [];
var _iteratorNormalCompletion13 = true;
var _didIteratorError13 = false;
var _iteratorError13 = undefined;
var _iteratorNormalCompletion12 = true;
var _didIteratorError12 = false;
var _iteratorError12 = undefined;
try {
for (var _iterator13 = items[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
var json_obj = _step13.value;
for (var _iterator12 = items[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
var json_obj = _step12.value;
json_obj = _.omit(json_obj, omitFields || []);
var item = this.findItem(json_obj["uuid"]);
@@ -3278,6 +3417,44 @@ var ModelManager = function () {
models.push(item);
}
} catch (err) {
_didIteratorError12 = true;
_iteratorError12 = err;
} finally {
try {
if (!_iteratorNormalCompletion12 && _iterator12.return) {
_iterator12.return();
}
} finally {
if (_didIteratorError12) {
throw _iteratorError12;
}
}
}
this.notifySyncObserversOfModels(models);
this.sortItems();
return models;
}
}, {
key: 'notifySyncObserversOfModels',
value: function notifySyncObserversOfModels(models) {
var _iteratorNormalCompletion13 = true;
var _didIteratorError13 = false;
var _iteratorError13 = undefined;
try {
for (var _iterator13 = this.itemSyncObservers[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
var observer = _step13.value;
var relevantItems = models.filter(function (item) {
return item.content_type == observer.type;
});
if (relevantItems.length > 0) {
observer.callback(relevantItems);
}
}
} catch (err) {
_didIteratorError13 = true;
_iteratorError13 = err;
@@ -3292,26 +3469,22 @@ var ModelManager = function () {
}
}
}
this.notifySyncObserversOfModels(models);
this.sortItems();
return models;
}
}, {
key: 'notifySyncObserversOfModels',
value: function notifySyncObserversOfModels(models) {
key: 'notifyItemChangeObserversOfModels',
value: function notifyItemChangeObserversOfModels(models) {
var _iteratorNormalCompletion14 = true;
var _didIteratorError14 = false;
var _iteratorError14 = undefined;
try {
for (var _iterator14 = this.itemSyncObservers[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {
for (var _iterator14 = this.itemChangeObservers[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {
var observer = _step14.value;
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) {
observer.callback(relevantItems);
}
@@ -3331,40 +3504,6 @@ var ModelManager = function () {
}
}
}
}, {
key: 'notifyItemChangeObserversOfModels',
value: function notifyItemChangeObserversOfModels(models) {
var _iteratorNormalCompletion15 = true;
var _didIteratorError15 = false;
var _iteratorError15 = undefined;
try {
for (var _iterator15 = this.itemChangeObservers[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) {
var observer = _step15.value;
var relevantItems = models.filter(function (item) {
return observer.content_types.includes(item.content_type) || observer.content_types.includes("*");
});
if (relevantItems.length > 0) {
observer.callback(relevantItems);
}
}
} catch (err) {
_didIteratorError15 = true;
_iteratorError15 = err;
} finally {
try {
if (!_iteratorNormalCompletion15 && _iterator15.return) {
_iterator15.return();
}
} finally {
if (_didIteratorError15) {
throw _iteratorError15;
}
}
}
}
}, {
key: 'createItem',
value: function createItem(json_obj) {
@@ -3426,13 +3565,13 @@ var ModelManager = function () {
return;
}
var _iteratorNormalCompletion16 = true;
var _didIteratorError16 = false;
var _iteratorError16 = undefined;
var _iteratorNormalCompletion15 = true;
var _didIteratorError15 = false;
var _iteratorError15 = undefined;
try {
for (var _iterator16 = contentObject.references[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) {
var reference = _step16.value;
for (var _iterator15 = contentObject.references[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) {
var reference = _step15.value;
var referencedItem = this.findItem(reference.uuid);
if (referencedItem) {
@@ -3443,16 +3582,16 @@ var ModelManager = function () {
}
}
} catch (err) {
_didIteratorError16 = true;
_iteratorError16 = err;
_didIteratorError15 = true;
_iteratorError15 = err;
} finally {
try {
if (!_iteratorNormalCompletion16 && _iterator16.return) {
_iterator16.return();
if (!_iteratorNormalCompletion15 && _iterator15.return) {
_iterator15.return();
}
} finally {
if (_didIteratorError16) {
throw _iteratorError16;
if (_didIteratorError15) {
throw _iteratorError15;
}
}
}
@@ -3495,10 +3634,36 @@ var ModelManager = function () {
}
}, {
key: 'clearDirtyItems',
value: function clearDirtyItems() {
this.getDirtyItems().forEach(function (item) {
item.setDirty(false);
});
value: function clearDirtyItems(items) {
var _iteratorNormalCompletion16 = true;
var _didIteratorError16 = false;
var _iteratorError16 = undefined;
try {
for (var _iterator16 = items[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) {
var item = _step16.value;
item.setDirty(false);
}
} catch (err) {
_didIteratorError16 = true;
_iteratorError16 = err;
} finally {
try {
if (!_iteratorNormalCompletion16 && _iterator16.return) {
_iterator16.return();
}
} finally {
if (_didIteratorError16) {
throw _iteratorError16;
}
}
}
}
}, {
key: 'clearAllDirtyItems',
value: function clearAllDirtyItems() {
this.clearDirtyItems(this.getDirtyItems());
}
}, {
key: 'setItemToBeDeleted',

File diff suppressed because one or more lines are too long